{"abstract":"The last schedule row drives the balance negative.","category":"Loan amortization schedules","checks":7,"contract":"x = {'principal', 'rate_bp', 'payment', 'max_months'}. For months 1..max_months while the balance is positive: interest = round_half_up(balance*bp/120000); if payment <= interest return {'error': 'negative_amortization', 'month': k}; principal paid = min(payment - interest, balance); append [k, interest, principal, balance after]. Return {'rows', 'balloon': remaining principal}.","evaluation_group":"w2-loan-amortization-schedules-schedule-from-fixed-payment","failed_approach":"Capping the whole payment ignores the interest share and over-applies principal.","family":"w2-loan-amortization-schedules-schedule-from-fixed-payment-final-principal-clamp","id":"FA-58381","implementations":{"attempt":{"sha256":"3289c3db19ae7845bf6997bd56a8ac1645d8cc0978bb9a31b265265c5a518171","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nimport math\nfrom fractions import Fraction\nN = 1\nobservations = []\ndef solve(x):\n    def rnd(n, d):\n        q, r = divmod(n, d)\n        return q + (1 if 2 * r >= d else 0)\n    bal = x['principal']\n    rows = []\n    for k in range(1, x['max_months'] + 1):\n        if bal == 0:\n            break\n        interest = rnd(bal * x['rate_bp'], 120000)\n        pay = x['payment']\n        if pay <= interest:\n            return {'error': 'negative_amortization', 'month': k}\n        princ = min(pay, bal)\n        bal -= princ\n        rows.append([k, interest, princ, bal])\n    return {'rows': rows, 'balloon': bal}\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['regression: final principal clamp', {'principal': 100000, 'rate_bp': 2400, 'payment': 20007, 'max_months': 12}, {'rows': [[1, 2000, 18007, 81993], [2, 1640, 18367, 63626], [3, 1273, 18734, 44892], [4, 898, 19109, 25783], [5, 516, 19491, 6292], [6, 126, 6292, 0]], 'balloon': 0}], ['control 1', {'principal': 250000, 'rate_bp': 1999, 'payment': 5000, 'max_months': 24}, {'rows': [[1, 4165, 835, 249165], [2, 4151, 849, 248316], [3, 4137, 863, 247453], [4, 4122, 878, 246575], [5, 4108, 892, 245683], [6, 4093, 907, 244776], [7, 4078, 922, 243854], [8, 4062, 938, 242916], [9, 4047, 953, 241963], [10, 4031, 969, 240994], [11, 4015, 985, 240009], [12, 3998, 1002, 239007], [13, 3981, 1019, 237988], [14, 3964, 1036, 236952], [15, 3947, 1053, 235899], [16, 3930, 1070, 234829], [17, 3912, 1088, 233741], [18, 3894, 1106, 232635], [19, 3875, 1125, 231510], [20, 3857, 1143, 230367], [21, 3838, 1162, 229205], [22, 3818, 1182, 228023], [23, 3798, 1202, 226821], [24, 3778, 1222, 225599]], 'balloon': 225599}], ['control 2', {'principal': 250000, 'rate_bp': 0, 'payment': 500, 'max_months': 1}, {'rows': [[1, 0, 500, 249500]], 'balloon': 249500}], ['control 3', {'principal': 250000, 'rate_bp': 1999, 'payment': 500, 'max_months': 24}, {'error': 'negative_amortization', 'month': 1}], ['control 4', {'principal': 100000, 'rate_bp': 1999, 'payment': 1000, 'max_months': 0}, {'rows': [], 'balloon': 100000}], ['control 5', {'principal': 250000, 'rate_bp': 1200, 'payment': 5000, 'max_months': 24}, {'rows': [[1, 2500, 2500, 247500], [2, 2475, 2525, 244975], [3, 2450, 2550, 242425], [4, 2424, 2576, 239849], [5, 2398, 2602, 237247], [6, 2372, 2628, 234619], [7, 2346, 2654, 231965], [8, 2320, 2680, 229285], [9, 2293, 2707, 226578], [10, 2266, 2734, 223844], [11, 2238, 2762, 221082], [12, 2211, 2789, 218293], [13, 2183, 2817, 215476], [14, 2155, 2845, 212631], [15, 2126, 2874, 209757], [16, 2098, 2902, 206855], [17, 2069, 2931, 203924], [18, 2039, 2961, 200963], [19, 2010, 2990, 197973], [20, 1980, 3020, 194953], [21, 1950, 3050, 191903], [22, 1919, 3081, 188822], [23, 1888, 3112, 185710], [24, 1857, 3143, 182567]], 'balloon': 182567}], ['control 6', {'principal': 1000, 'rate_bp': 600, 'payment': 83, 'max_months': 6}, {'rows': [[1, 5, 78, 922], [2, 5, 78, 844], [3, 4, 79, 765], [4, 4, 79, 686], [5, 3, 80, 606], [6, 3, 80, 526]], 'balloon': 526}]], [['regression: final principal clamp', {'principal': 50000, 'rate_bp': 0, 'payment': 16666, 'max_months': 24}, {'rows': [[1, 0, 16666, 33334], [2, 0, 16666, 16668], [3, 0, 16666, 2], [4, 0, 2, 0]], 'balloon': 0}], ['regression: final principal clamp, partial-repair probe', {'principal': 100000, 'rate_bp': 600, 'payment': 20007, 'max_months': 1}, {'rows': [[1, 500, 19507, 80493]], 'balloon': 80493}], ['control 1', {'principal': 12345, 'rate_bp': 600, 'payment': 500, 'max_months': 24}, {'rows': [[1, 62, 438, 11907], [2, 60, 440, 11467], [3, 57, 443, 11024], [4, 55, 445, 10579], [5, 53, 447, 10132], [6, 51, 449, 9683], [7, 48, 452, 9231], [8, 46, 454, 8777], [9, 44, 456, 8321], [10, 42, 458, 7863], [11, 39, 461, 7402], [12, 37, 463, 6939], [13, 35, 465, 6474], [14, 32, 468, 6006], [15, 30, 470, 5536], [16, 28, 472, 5064], [17, 25, 475, 4589], [18, 23, 477, 4112], [19, 21, 479, 3633], [20, 18, 482, 3151], [21, 16, 484, 2667], [22, 13, 487, 2180], [23, 11, 489, 1691], [24, 8, 492, 1199]], 'balloon': 1199}], ['control 2', {'principal': 100000, 'rate_bp': 0, 'payment': 20007, 'max_months': 3}, {'rows': [[1, 0, 20007, 79993], [2, 0, 20007, 59986], [3, 0, 20007, 39979]], 'balloon': 39979}], ['control 3', {'principal': 100000, 'rate_bp': 1200, 'payment': 5000, 'max_months': 6}, {'rows': [[1, 1000, 4000, 96000], [2, 960, 4040, 91960], [3, 920, 4080, 87880], [4, 879, 4121, 83759], [5, 838, 4162, 79597], [6, 796, 4204, 75393]], 'balloon': 75393}], ['control 4', {'principal': 1000, 'rate_bp': 0, 'payment': 1000, 'max_months': 0}, {'rows': [], 'balloon': 1000}], ['control 5', {'principal': 50000, 'rate_bp': 0, 'payment': 1000, 'max_months': 3}, {'rows': [[1, 0, 1000, 49000], [2, 0, 1000, 48000], [3, 0, 1000, 47000]], 'balloon': 47000}]], [['regression: final principal clamp', {'principal': 50000, 'rate_bp': 1200, 'payment': 5000, 'max_months': 24}, {'rows': [[1, 500, 4500, 45500], [2, 455, 4545, 40955], [3, 410, 4590, 36365], [4, 364, 4636, 31729], [5, 317, 4683, 27046], [6, 270, 4730, 22316], [7, 223, 4777, 17539], [8, 175, 4825, 12714], [9, 127, 4873, 7841], [10, 78, 4922, 2919], [11, 29, 2919, 0]], 'balloon': 0}], ['control 1', {'principal': 50000, 'rate_bp': 2400, 'payment': 5000, 'max_months': 3}, {'rows': [[1, 1000, 4000, 46000], [2, 920, 4080, 41920], [3, 838, 4162, 37758]], 'balloon': 37758}], ['control 2', {'principal': 12345, 'rate_bp': 0, 'payment': 4115, 'max_months': 24}, {'rows': [[1, 0, 4115, 8230], [2, 0, 4115, 4115], [3, 0, 4115, 0]], 'balloon': 0}], ['control 3', {'principal': 12345, 'rate_bp': 0, 'payment': 4115, 'max_months': 1}, {'rows': [[1, 0, 4115, 8230]], 'balloon': 8230}], ['control 4', {'principal': 250000, 'rate_bp': 600, 'payment': 20833, 'max_months': 1}, {'rows': [[1, 1250, 19583, 230417]], 'balloon': 230417}], ['control 5', {'principal': 1000, 'rate_bp': 2400, 'payment': 1050, 'max_months': 0}, {'rows': [], 'balloon': 1000}], ['control 6', {'principal': 250000, 'rate_bp': 1999, 'payment': 83333, 'max_months': 0}, {'rows': [], 'balloon': 250000}]], [['regression: final principal clamp', {'principal': 12345, 'rate_bp': 1200, 'payment': 5000, 'max_months': 3}, {'rows': [[1, 123, 4877, 7468], [2, 75, 4925, 2543], [3, 25, 2543, 0]], 'balloon': 0}], ['control 1', {'principal': 12345, 'rate_bp': 2400, 'payment': 500, 'max_months': 6}, {'rows': [[1, 247, 253, 12092], [2, 242, 258, 11834], [3, 237, 263, 11571], [4, 231, 269, 11302], [5, 226, 274, 11028], [6, 221, 279, 10749]], 'balloon': 10749}], ['control 2', {'principal': 250000, 'rate_bp': 600, 'payment': 500, 'max_months': 0}, {'rows': [], 'balloon': 250000}], ['control 3', {'principal': 50000, 'rate_bp': 600, 'payment': 1200, 'max_months': 24}, {'rows': [[1, 250, 950, 49050], [2, 245, 955, 48095], [3, 240, 960, 47135], [4, 236, 964, 46171], [5, 231, 969, 45202], [6, 226, 974, 44228], [7, 221, 979, 43249], [8, 216, 984, 42265], [9, 211, 989, 41276], [10, 206, 994, 40282], [11, 201, 999, 39283], [12, 196, 1004, 38279], [13, 191, 1009, 37270], [14, 186, 1014, 36256], [15, 181, 1019, 35237], [16, 176, 1024, 34213], [17, 171, 1029, 33184], [18, 166, 1034, 32150], [19, 161, 1039, 31111], [20, 156, 1044, 30067], [21, 150, 1050, 29017], [22, 145, 1055, 27962], [23, 140, 1060, 26902], [24, 135, 1065, 25837]], 'balloon': 25837}], ['control 4', {'principal': 50000, 'rate_bp': 1200, 'payment': 5000, 'max_months': 1}, {'rows': [[1, 500, 4500, 45500]], 'balloon': 45500}], ['control 5', {'principal': 250000, 'rate_bp': 1200, 'payment': 500, 'max_months': 6}, {'error': 'negative_amortization', 'month': 1}], ['control 6', {'principal': 1000, 'rate_bp': 0, 'payment': 1000, 'max_months': 1}, {'rows': [[1, 0, 1000, 0]], 'balloon': 0}]], [['regression: final principal clamp', {'principal': 1000, 'rate_bp': 2400, 'payment': 500, 'max_months': 3}, {'rows': [[1, 20, 480, 520], [2, 10, 490, 30], [3, 1, 30, 0]], 'balloon': 0}], ['control 1', {'principal': 12345, 'rate_bp': 2400, 'payment': 2476, 'max_months': 0}, {'rows': [], 'balloon': 12345}], ['control 2', {'principal': 250000, 'rate_bp': 2400, 'payment': 20833, 'max_months': 0}, {'rows': [], 'balloon': 250000}], ['control 3', {'principal': 50000, 'rate_bp': 600, 'payment': 1000, 'max_months': 0}, {'rows': [], 'balloon': 50000}], ['control 4', {'principal': 100000, 'rate_bp': 1200, 'payment': 1200, 'max_months': 1}, {'rows': [[1, 1000, 200, 99800]], 'balloon': 99800}], ['control 5', {'principal': 50000, 'rate_bp': 2400, 'payment': 4166, 'max_months': 0}, {'rows': [], 'balloon': 50000}], ['control 6', {'principal': 250000, 'rate_bp': 600, 'payment': 250050, 'max_months': 1}, {'rows': [[1, 1250, 248800, 1200]], 'balloon': 1200}]]]\nfor label, args, expected in fixtures[N-1]:\n    try:\n        actual = solve(args)\n    except Exception as exc:\n        actual = 'raised ' + type(exc).__name__\n    check(label, actual, expected)\nprint(json.dumps({\"observations\": observations, \"passed\": all(x[\"passed\"] for x in observations)}, ensure_ascii=False))\nraise SystemExit(0 if all(x[\"passed\"] for x in observations) else 1)\n"},"broken":{"sha256":"bb4d1ff7892e4810274d29b6009c5241390528d0c690aba25c671fc12e293794","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nimport math\nfrom fractions import Fraction\nN = 1\nobservations = []\ndef solve(x):\n    def rnd(n, d):\n        q, r = divmod(n, d)\n        return q + (1 if 2 * r >= d else 0)\n    bal = x['principal']\n    rows = []\n    for k in range(1, x['max_months'] + 1):\n        if bal == 0:\n            break\n        interest = rnd(bal * x['rate_bp'], 120000)\n        pay = x['payment']\n        if pay <= interest:\n            return {'error': 'negative_amortization', 'month': k}\n        princ = pay - interest\n        bal -= princ\n        rows.append([k, interest, princ, bal])\n    return {'rows': rows, 'balloon': bal}\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['regression: final principal clamp', {'principal': 100000, 'rate_bp': 2400, 'payment': 20007, 'max_months': 12}, {'rows': [[1, 2000, 18007, 81993], [2, 1640, 18367, 63626], [3, 1273, 18734, 44892], [4, 898, 19109, 25783], [5, 516, 19491, 6292], [6, 126, 6292, 0]], 'balloon': 0}], ['control 1', {'principal': 250000, 'rate_bp': 1999, 'payment': 5000, 'max_months': 24}, {'rows': [[1, 4165, 835, 249165], [2, 4151, 849, 248316], [3, 4137, 863, 247453], [4, 4122, 878, 246575], [5, 4108, 892, 245683], [6, 4093, 907, 244776], [7, 4078, 922, 243854], [8, 4062, 938, 242916], [9, 4047, 953, 241963], [10, 4031, 969, 240994], [11, 4015, 985, 240009], [12, 3998, 1002, 239007], [13, 3981, 1019, 237988], [14, 3964, 1036, 236952], [15, 3947, 1053, 235899], [16, 3930, 1070, 234829], [17, 3912, 1088, 233741], [18, 3894, 1106, 232635], [19, 3875, 1125, 231510], [20, 3857, 1143, 230367], [21, 3838, 1162, 229205], [22, 3818, 1182, 228023], [23, 3798, 1202, 226821], [24, 3778, 1222, 225599]], 'balloon': 225599}], ['control 2', {'principal': 250000, 'rate_bp': 0, 'payment': 500, 'max_months': 1}, {'rows': [[1, 0, 500, 249500]], 'balloon': 249500}], ['control 3', {'principal': 250000, 'rate_bp': 1999, 'payment': 500, 'max_months': 24}, {'error': 'negative_amortization', 'month': 1}], ['control 4', {'principal': 100000, 'rate_bp': 1999, 'payment': 1000, 'max_months': 0}, {'rows': [], 'balloon': 100000}], ['control 5', {'principal': 250000, 'rate_bp': 1200, 'payment': 5000, 'max_months': 24}, {'rows': [[1, 2500, 2500, 247500], [2, 2475, 2525, 244975], [3, 2450, 2550, 242425], [4, 2424, 2576, 239849], [5, 2398, 2602, 237247], [6, 2372, 2628, 234619], [7, 2346, 2654, 231965], [8, 2320, 2680, 229285], [9, 2293, 2707, 226578], [10, 2266, 2734, 223844], [11, 2238, 2762, 221082], [12, 2211, 2789, 218293], [13, 2183, 2817, 215476], [14, 2155, 2845, 212631], [15, 2126, 2874, 209757], [16, 2098, 2902, 206855], [17, 2069, 2931, 203924], [18, 2039, 2961, 200963], [19, 2010, 2990, 197973], [20, 1980, 3020, 194953], [21, 1950, 3050, 191903], [22, 1919, 3081, 188822], [23, 1888, 3112, 185710], [24, 1857, 3143, 182567]], 'balloon': 182567}], ['control 6', {'principal': 1000, 'rate_bp': 600, 'payment': 83, 'max_months': 6}, {'rows': [[1, 5, 78, 922], [2, 5, 78, 844], [3, 4, 79, 765], [4, 4, 79, 686], [5, 3, 80, 606], [6, 3, 80, 526]], 'balloon': 526}]], [['regression: final principal clamp', {'principal': 50000, 'rate_bp': 0, 'payment': 16666, 'max_months': 24}, {'rows': [[1, 0, 16666, 33334], [2, 0, 16666, 16668], [3, 0, 16666, 2], [4, 0, 2, 0]], 'balloon': 0}], ['regression: final principal clamp, partial-repair probe', {'principal': 100000, 'rate_bp': 600, 'payment': 20007, 'max_months': 1}, {'rows': [[1, 500, 19507, 80493]], 'balloon': 80493}], ['control 1', {'principal': 12345, 'rate_bp': 600, 'payment': 500, 'max_months': 24}, {'rows': [[1, 62, 438, 11907], [2, 60, 440, 11467], [3, 57, 443, 11024], [4, 55, 445, 10579], [5, 53, 447, 10132], [6, 51, 449, 9683], [7, 48, 452, 9231], [8, 46, 454, 8777], [9, 44, 456, 8321], [10, 42, 458, 7863], [11, 39, 461, 7402], [12, 37, 463, 6939], [13, 35, 465, 6474], [14, 32, 468, 6006], [15, 30, 470, 5536], [16, 28, 472, 5064], [17, 25, 475, 4589], [18, 23, 477, 4112], [19, 21, 479, 3633], [20, 18, 482, 3151], [21, 16, 484, 2667], [22, 13, 487, 2180], [23, 11, 489, 1691], [24, 8, 492, 1199]], 'balloon': 1199}], ['control 2', {'principal': 100000, 'rate_bp': 0, 'payment': 20007, 'max_months': 3}, {'rows': [[1, 0, 20007, 79993], [2, 0, 20007, 59986], [3, 0, 20007, 39979]], 'balloon': 39979}], ['control 3', {'principal': 100000, 'rate_bp': 1200, 'payment': 5000, 'max_months': 6}, {'rows': [[1, 1000, 4000, 96000], [2, 960, 4040, 91960], [3, 920, 4080, 87880], [4, 879, 4121, 83759], [5, 838, 4162, 79597], [6, 796, 4204, 75393]], 'balloon': 75393}], ['control 4', {'principal': 1000, 'rate_bp': 0, 'payment': 1000, 'max_months': 0}, {'rows': [], 'balloon': 1000}], ['control 5', {'principal': 50000, 'rate_bp': 0, 'payment': 1000, 'max_months': 3}, {'rows': [[1, 0, 1000, 49000], [2, 0, 1000, 48000], [3, 0, 1000, 47000]], 'balloon': 47000}]], [['regression: final principal clamp', {'principal': 50000, 'rate_bp': 1200, 'payment': 5000, 'max_months': 24}, {'rows': [[1, 500, 4500, 45500], [2, 455, 4545, 40955], [3, 410, 4590, 36365], [4, 364, 4636, 31729], [5, 317, 4683, 27046], [6, 270, 4730, 22316], [7, 223, 4777, 17539], [8, 175, 4825, 12714], [9, 127, 4873, 7841], [10, 78, 4922, 2919], [11, 29, 2919, 0]], 'balloon': 0}], ['control 1', {'principal': 50000, 'rate_bp': 2400, 'payment': 5000, 'max_months': 3}, {'rows': [[1, 1000, 4000, 46000], [2, 920, 4080, 41920], [3, 838, 4162, 37758]], 'balloon': 37758}], ['control 2', {'principal': 12345, 'rate_bp': 0, 'payment': 4115, 'max_months': 24}, {'rows': [[1, 0, 4115, 8230], [2, 0, 4115, 4115], [3, 0, 4115, 0]], 'balloon': 0}], ['control 3', {'principal': 12345, 'rate_bp': 0, 'payment': 4115, 'max_months': 1}, {'rows': [[1, 0, 4115, 8230]], 'balloon': 8230}], ['control 4', {'principal': 250000, 'rate_bp': 600, 'payment': 20833, 'max_months': 1}, {'rows': [[1, 1250, 19583, 230417]], 'balloon': 230417}], ['control 5', {'principal': 1000, 'rate_bp': 2400, 'payment': 1050, 'max_months': 0}, {'rows': [], 'balloon': 1000}], ['control 6', {'principal': 250000, 'rate_bp': 1999, 'payment': 83333, 'max_months': 0}, {'rows': [], 'balloon': 250000}]], [['regression: final principal clamp', {'principal': 12345, 'rate_bp': 1200, 'payment': 5000, 'max_months': 3}, {'rows': [[1, 123, 4877, 7468], [2, 75, 4925, 2543], [3, 25, 2543, 0]], 'balloon': 0}], ['control 1', {'principal': 12345, 'rate_bp': 2400, 'payment': 500, 'max_months': 6}, {'rows': [[1, 247, 253, 12092], [2, 242, 258, 11834], [3, 237, 263, 11571], [4, 231, 269, 11302], [5, 226, 274, 11028], [6, 221, 279, 10749]], 'balloon': 10749}], ['control 2', {'principal': 250000, 'rate_bp': 600, 'payment': 500, 'max_months': 0}, {'rows': [], 'balloon': 250000}], ['control 3', {'principal': 50000, 'rate_bp': 600, 'payment': 1200, 'max_months': 24}, {'rows': [[1, 250, 950, 49050], [2, 245, 955, 48095], [3, 240, 960, 47135], [4, 236, 964, 46171], [5, 231, 969, 45202], [6, 226, 974, 44228], [7, 221, 979, 43249], [8, 216, 984, 42265], [9, 211, 989, 41276], [10, 206, 994, 40282], [11, 201, 999, 39283], [12, 196, 1004, 38279], [13, 191, 1009, 37270], [14, 186, 1014, 36256], [15, 181, 1019, 35237], [16, 176, 1024, 34213], [17, 171, 1029, 33184], [18, 166, 1034, 32150], [19, 161, 1039, 31111], [20, 156, 1044, 30067], [21, 150, 1050, 29017], [22, 145, 1055, 27962], [23, 140, 1060, 26902], [24, 135, 1065, 25837]], 'balloon': 25837}], ['control 4', {'principal': 50000, 'rate_bp': 1200, 'payment': 5000, 'max_months': 1}, {'rows': [[1, 500, 4500, 45500]], 'balloon': 45500}], ['control 5', {'principal': 250000, 'rate_bp': 1200, 'payment': 500, 'max_months': 6}, {'error': 'negative_amortization', 'month': 1}], ['control 6', {'principal': 1000, 'rate_bp': 0, 'payment': 1000, 'max_months': 1}, {'rows': [[1, 0, 1000, 0]], 'balloon': 0}]], [['regression: final principal clamp', {'principal': 1000, 'rate_bp': 2400, 'payment': 500, 'max_months': 3}, {'rows': [[1, 20, 480, 520], [2, 10, 490, 30], [3, 1, 30, 0]], 'balloon': 0}], ['control 1', {'principal': 12345, 'rate_bp': 2400, 'payment': 2476, 'max_months': 0}, {'rows': [], 'balloon': 12345}], ['control 2', {'principal': 250000, 'rate_bp': 2400, 'payment': 20833, 'max_months': 0}, {'rows': [], 'balloon': 250000}], ['control 3', {'principal': 50000, 'rate_bp': 600, 'payment': 1000, 'max_months': 0}, {'rows': [], 'balloon': 50000}], ['control 4', {'principal': 100000, 'rate_bp': 1200, 'payment': 1200, 'max_months': 1}, {'rows': [[1, 1000, 200, 99800]], 'balloon': 99800}], ['control 5', {'principal': 50000, 'rate_bp': 2400, 'payment': 4166, 'max_months': 0}, {'rows': [], 'balloon': 50000}], ['control 6', {'principal': 250000, 'rate_bp': 600, 'payment': 250050, 'max_months': 1}, {'rows': [[1, 1250, 248800, 1200]], 'balloon': 1200}]]]\nfor label, args, expected in fixtures[N-1]:\n    try:\n        actual = solve(args)\n    except Exception as exc:\n        actual = 'raised ' + type(exc).__name__\n    check(label, actual, expected)\nprint(json.dumps({\"observations\": observations, \"passed\": all(x[\"passed\"] for x in observations)}, ensure_ascii=False))\nraise SystemExit(0 if all(x[\"passed\"] for x in observations) else 1)\n"},"fixed":{"sha256":"3081d67ac9fbff1f37503b9232088182cc4720a994b25aaf73e6369d4e45a358","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nimport math\nfrom fractions import Fraction\nN = 1\nobservations = []\ndef solve(x):\n    def rnd(n, d):\n        q, r = divmod(n, d)\n        return q + (1 if 2 * r >= d else 0)\n    bal = x['principal']\n    rows = []\n    for k in range(1, x['max_months'] + 1):\n        if bal == 0:\n            break\n        interest = rnd(bal * x['rate_bp'], 120000)\n        pay = x['payment']\n        if pay <= interest:\n            return {'error': 'negative_amortization', 'month': k}\n        princ = min(pay - interest, bal)\n        bal -= princ\n        rows.append([k, interest, princ, bal])\n    return {'rows': rows, 'balloon': bal}\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['regression: final principal clamp', {'principal': 100000, 'rate_bp': 2400, 'payment': 20007, 'max_months': 12}, {'rows': [[1, 2000, 18007, 81993], [2, 1640, 18367, 63626], [3, 1273, 18734, 44892], [4, 898, 19109, 25783], [5, 516, 19491, 6292], [6, 126, 6292, 0]], 'balloon': 0}], ['control 1', {'principal': 250000, 'rate_bp': 1999, 'payment': 5000, 'max_months': 24}, {'rows': [[1, 4165, 835, 249165], [2, 4151, 849, 248316], [3, 4137, 863, 247453], [4, 4122, 878, 246575], [5, 4108, 892, 245683], [6, 4093, 907, 244776], [7, 4078, 922, 243854], [8, 4062, 938, 242916], [9, 4047, 953, 241963], [10, 4031, 969, 240994], [11, 4015, 985, 240009], [12, 3998, 1002, 239007], [13, 3981, 1019, 237988], [14, 3964, 1036, 236952], [15, 3947, 1053, 235899], [16, 3930, 1070, 234829], [17, 3912, 1088, 233741], [18, 3894, 1106, 232635], [19, 3875, 1125, 231510], [20, 3857, 1143, 230367], [21, 3838, 1162, 229205], [22, 3818, 1182, 228023], [23, 3798, 1202, 226821], [24, 3778, 1222, 225599]], 'balloon': 225599}], ['control 2', {'principal': 250000, 'rate_bp': 0, 'payment': 500, 'max_months': 1}, {'rows': [[1, 0, 500, 249500]], 'balloon': 249500}], ['control 3', {'principal': 250000, 'rate_bp': 1999, 'payment': 500, 'max_months': 24}, {'error': 'negative_amortization', 'month': 1}], ['control 4', {'principal': 100000, 'rate_bp': 1999, 'payment': 1000, 'max_months': 0}, {'rows': [], 'balloon': 100000}], ['control 5', {'principal': 250000, 'rate_bp': 1200, 'payment': 5000, 'max_months': 24}, {'rows': [[1, 2500, 2500, 247500], [2, 2475, 2525, 244975], [3, 2450, 2550, 242425], [4, 2424, 2576, 239849], [5, 2398, 2602, 237247], [6, 2372, 2628, 234619], [7, 2346, 2654, 231965], [8, 2320, 2680, 229285], [9, 2293, 2707, 226578], [10, 2266, 2734, 223844], [11, 2238, 2762, 221082], [12, 2211, 2789, 218293], [13, 2183, 2817, 215476], [14, 2155, 2845, 212631], [15, 2126, 2874, 209757], [16, 2098, 2902, 206855], [17, 2069, 2931, 203924], [18, 2039, 2961, 200963], [19, 2010, 2990, 197973], [20, 1980, 3020, 194953], [21, 1950, 3050, 191903], [22, 1919, 3081, 188822], [23, 1888, 3112, 185710], [24, 1857, 3143, 182567]], 'balloon': 182567}], ['control 6', {'principal': 1000, 'rate_bp': 600, 'payment': 83, 'max_months': 6}, {'rows': [[1, 5, 78, 922], [2, 5, 78, 844], [3, 4, 79, 765], [4, 4, 79, 686], [5, 3, 80, 606], [6, 3, 80, 526]], 'balloon': 526}]], [['regression: final principal clamp', {'principal': 50000, 'rate_bp': 0, 'payment': 16666, 'max_months': 24}, {'rows': [[1, 0, 16666, 33334], [2, 0, 16666, 16668], [3, 0, 16666, 2], [4, 0, 2, 0]], 'balloon': 0}], ['regression: final principal clamp, partial-repair probe', {'principal': 100000, 'rate_bp': 600, 'payment': 20007, 'max_months': 1}, {'rows': [[1, 500, 19507, 80493]], 'balloon': 80493}], ['control 1', {'principal': 12345, 'rate_bp': 600, 'payment': 500, 'max_months': 24}, {'rows': [[1, 62, 438, 11907], [2, 60, 440, 11467], [3, 57, 443, 11024], [4, 55, 445, 10579], [5, 53, 447, 10132], [6, 51, 449, 9683], [7, 48, 452, 9231], [8, 46, 454, 8777], [9, 44, 456, 8321], [10, 42, 458, 7863], [11, 39, 461, 7402], [12, 37, 463, 6939], [13, 35, 465, 6474], [14, 32, 468, 6006], [15, 30, 470, 5536], [16, 28, 472, 5064], [17, 25, 475, 4589], [18, 23, 477, 4112], [19, 21, 479, 3633], [20, 18, 482, 3151], [21, 16, 484, 2667], [22, 13, 487, 2180], [23, 11, 489, 1691], [24, 8, 492, 1199]], 'balloon': 1199}], ['control 2', {'principal': 100000, 'rate_bp': 0, 'payment': 20007, 'max_months': 3}, {'rows': [[1, 0, 20007, 79993], [2, 0, 20007, 59986], [3, 0, 20007, 39979]], 'balloon': 39979}], ['control 3', {'principal': 100000, 'rate_bp': 1200, 'payment': 5000, 'max_months': 6}, {'rows': [[1, 1000, 4000, 96000], [2, 960, 4040, 91960], [3, 920, 4080, 87880], [4, 879, 4121, 83759], [5, 838, 4162, 79597], [6, 796, 4204, 75393]], 'balloon': 75393}], ['control 4', {'principal': 1000, 'rate_bp': 0, 'payment': 1000, 'max_months': 0}, {'rows': [], 'balloon': 1000}], ['control 5', {'principal': 50000, 'rate_bp': 0, 'payment': 1000, 'max_months': 3}, {'rows': [[1, 0, 1000, 49000], [2, 0, 1000, 48000], [3, 0, 1000, 47000]], 'balloon': 47000}]], [['regression: final principal clamp', {'principal': 50000, 'rate_bp': 1200, 'payment': 5000, 'max_months': 24}, {'rows': [[1, 500, 4500, 45500], [2, 455, 4545, 40955], [3, 410, 4590, 36365], [4, 364, 4636, 31729], [5, 317, 4683, 27046], [6, 270, 4730, 22316], [7, 223, 4777, 17539], [8, 175, 4825, 12714], [9, 127, 4873, 7841], [10, 78, 4922, 2919], [11, 29, 2919, 0]], 'balloon': 0}], ['control 1', {'principal': 50000, 'rate_bp': 2400, 'payment': 5000, 'max_months': 3}, {'rows': [[1, 1000, 4000, 46000], [2, 920, 4080, 41920], [3, 838, 4162, 37758]], 'balloon': 37758}], ['control 2', {'principal': 12345, 'rate_bp': 0, 'payment': 4115, 'max_months': 24}, {'rows': [[1, 0, 4115, 8230], [2, 0, 4115, 4115], [3, 0, 4115, 0]], 'balloon': 0}], ['control 3', {'principal': 12345, 'rate_bp': 0, 'payment': 4115, 'max_months': 1}, {'rows': [[1, 0, 4115, 8230]], 'balloon': 8230}], ['control 4', {'principal': 250000, 'rate_bp': 600, 'payment': 20833, 'max_months': 1}, {'rows': [[1, 1250, 19583, 230417]], 'balloon': 230417}], ['control 5', {'principal': 1000, 'rate_bp': 2400, 'payment': 1050, 'max_months': 0}, {'rows': [], 'balloon': 1000}], ['control 6', {'principal': 250000, 'rate_bp': 1999, 'payment': 83333, 'max_months': 0}, {'rows': [], 'balloon': 250000}]], [['regression: final principal clamp', {'principal': 12345, 'rate_bp': 1200, 'payment': 5000, 'max_months': 3}, {'rows': [[1, 123, 4877, 7468], [2, 75, 4925, 2543], [3, 25, 2543, 0]], 'balloon': 0}], ['control 1', {'principal': 12345, 'rate_bp': 2400, 'payment': 500, 'max_months': 6}, {'rows': [[1, 247, 253, 12092], [2, 242, 258, 11834], [3, 237, 263, 11571], [4, 231, 269, 11302], [5, 226, 274, 11028], [6, 221, 279, 10749]], 'balloon': 10749}], ['control 2', {'principal': 250000, 'rate_bp': 600, 'payment': 500, 'max_months': 0}, {'rows': [], 'balloon': 250000}], ['control 3', {'principal': 50000, 'rate_bp': 600, 'payment': 1200, 'max_months': 24}, {'rows': [[1, 250, 950, 49050], [2, 245, 955, 48095], [3, 240, 960, 47135], [4, 236, 964, 46171], [5, 231, 969, 45202], [6, 226, 974, 44228], [7, 221, 979, 43249], [8, 216, 984, 42265], [9, 211, 989, 41276], [10, 206, 994, 40282], [11, 201, 999, 39283], [12, 196, 1004, 38279], [13, 191, 1009, 37270], [14, 186, 1014, 36256], [15, 181, 1019, 35237], [16, 176, 1024, 34213], [17, 171, 1029, 33184], [18, 166, 1034, 32150], [19, 161, 1039, 31111], [20, 156, 1044, 30067], [21, 150, 1050, 29017], [22, 145, 1055, 27962], [23, 140, 1060, 26902], [24, 135, 1065, 25837]], 'balloon': 25837}], ['control 4', {'principal': 50000, 'rate_bp': 1200, 'payment': 5000, 'max_months': 1}, {'rows': [[1, 500, 4500, 45500]], 'balloon': 45500}], ['control 5', {'principal': 250000, 'rate_bp': 1200, 'payment': 500, 'max_months': 6}, {'error': 'negative_amortization', 'month': 1}], ['control 6', {'principal': 1000, 'rate_bp': 0, 'payment': 1000, 'max_months': 1}, {'rows': [[1, 0, 1000, 0]], 'balloon': 0}]], [['regression: final principal clamp', {'principal': 1000, 'rate_bp': 2400, 'payment': 500, 'max_months': 3}, {'rows': [[1, 20, 480, 520], [2, 10, 490, 30], [3, 1, 30, 0]], 'balloon': 0}], ['control 1', {'principal': 12345, 'rate_bp': 2400, 'payment': 2476, 'max_months': 0}, {'rows': [], 'balloon': 12345}], ['control 2', {'principal': 250000, 'rate_bp': 2400, 'payment': 20833, 'max_months': 0}, {'rows': [], 'balloon': 250000}], ['control 3', {'principal': 50000, 'rate_bp': 600, 'payment': 1000, 'max_months': 0}, {'rows': [], 'balloon': 50000}], ['control 4', {'principal': 100000, 'rate_bp': 1200, 'payment': 1200, 'max_months': 1}, {'rows': [[1, 1000, 200, 99800]], 'balloon': 99800}], ['control 5', {'principal': 50000, 'rate_bp': 2400, 'payment': 4166, 'max_months': 0}, {'rows': [], 'balloon': 50000}], ['control 6', {'principal': 250000, 'rate_bp': 600, 'payment': 250050, 'max_months': 1}, {'rows': [[1, 1250, 248800, 1200]], 'balloon': 1200}]]]\nfor label, args, expected in fixtures[N-1]:\n    try:\n        actual = solve(args)\n    except Exception as exc:\n        actual = 'raised ' + type(exc).__name__\n    check(label, actual, expected)\nprint(json.dumps({\"observations\": observations, \"passed\": all(x[\"passed\"] for x in observations)}, ensure_ascii=False))\nraise SystemExit(0 if all(x[\"passed\"] for x in observations) else 1)\n"}},"limitations":"A deterministic bounded teaching model with stipulated toy lending rules stated in the contract; money is integer cents and rates are basis points; it makes no claim of conformance to any regulation, servicing standard or product. This reproducer isolates one failure mechanism. Results cover the supplied fixtures. Variants within a family share a test contract and should remain grouped when constructing evaluation splits. Related mechanisms with a shared evaluation_group must also remain together; these controlled models are not independent production incidents.","method":"Deterministic executable model with adversarial boundary fixtures.","provenance":{"created_by":"Failure Map","dependencies":"Python standard library","family":"w2-loan-amortization-schedules-schedule-from-fixed-payment-final-principal-clamp","generated_at":"2026-09-29T14:46:26.123313+00:00","license":"CC0-1.0","python":"3.12.14","seed":1,"split":"open-access"},"relevance":"Amortization engines drive borrower statements, payoff quotes and investor remittances; a misplaced rounding step, boundary or ordering rule compounds across hundreds of periods.","repair":"Apply at most the remaining balance as principal.","root_cause":"Principal applied is not limited to the remaining balance.","sha256":"aca61c90772bb1eb3d636f3132d757e7215e91f45507e0c65c1d8540bb50ea88","title":"Schedule rows from a fixed payment: final principal clamp · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":43.368,"exit_code":1,"observations":[{"actual":{"balloon":0,"rows":[[1,2000,20007,79993],[2,1600,20007,59986],[3,1200,20007,39979],[4,800,20007,19972],[5,399,19972,0]]},"check":"regression: final principal clamp","expected":{"balloon":0,"rows":[[1,2000,18007,81993],[2,1640,18367,63626],[3,1273,18734,44892],[4,898,19109,25783],[5,516,19491,6292],[6,126,6292,0]]},"passed":false},{"actual":{"balloon":130000,"rows":[[1,4165,5000,245000],[2,4081,5000,240000],[3,3998,5000,235000],[4,3915,5000,230000],[5,3831,5000,225000],[6,3748,5000,220000],[7,3665,5000,215000],[8,3582,5000,210000],[9,3498,5000,205000],[10,3415,5000,200000],[11,3332,5000,195000],[12,3248,5000,190000],[13,3165,5000,185000],[14,3082,5000,180000],[15,2999,5000,175000],[16,2915,5000,170000],[17,2832,5000,165000],[18,2749,5000,160000],[19,2665,5000,155000],[20,2582,5000,150000],[21,2499,5000,145000],[22,2415,5000,140000],[23,2332,5000,135000],[24,2249,5000,130000]]},"check":"control 1","expected":{"balloon":225599,"rows":[[1,4165,835,249165],[2,4151,849,248316],[3,4137,863,247453],[4,4122,878,246575],[5,4108,892,245683],[6,4093,907,244776],[7,4078,922,243854],[8,4062,938,242916],[9,4047,953,241963],[10,4031,969,240994],[11,4015,985,240009],[12,3998,1002,239007],[13,3981,1019,237988],[14,3964,1036,236952],[15,3947,1053,235899],[16,3930,1070,234829],[17,3912,1088,233741],[18,3894,1106,232635],[19,3875,1125,231510],[20,3857,1143,230367],[21,3838,1162,229205],[22,3818,1182,228023],[23,3798,1202,226821],[24,3778,1222,225599]]},"passed":false},{"actual":{"balloon":249500,"rows":[[1,0,500,249500]]},"check":"control 2","expected":{"balloon":249500,"rows":[[1,0,500,249500]]},"passed":true},{"actual":{"error":"negative_amortization","month":1},"check":"control 3","expected":{"error":"negative_amortization","month":1},"passed":true},{"actual":{"balloon":100000,"rows":[]},"check":"control 4","expected":{"balloon":100000,"rows":[]},"passed":true},{"actual":{"balloon":130000,"rows":[[1,2500,5000,245000],[2,2450,5000,240000],[3,2400,5000,235000],[4,2350,5000,230000],[5,2300,5000,225000],[6,2250,5000,220000],[7,2200,5000,215000],[8,2150,5000,210000],[9,2100,5000,205000],[10,2050,5000,200000],[11,2000,5000,195000],[12,1950,5000,190000],[13,1900,5000,185000],[14,1850,5000,180000],[15,1800,5000,175000],[16,1750,5000,170000],[17,1700,5000,165000],[18,1650,5000,160000],[19,1600,5000,155000],[20,1550,5000,150000],[21,1500,5000,145000],[22,1450,5000,140000],[23,1400,5000,135000],[24,1350,5000,130000]]},"check":"control 5","expected":{"balloon":182567,"rows":[[1,2500,2500,247500],[2,2475,2525,244975],[3,2450,2550,242425],[4,2424,2576,239849],[5,2398,2602,237247],[6,2372,2628,234619],[7,2346,2654,231965],[8,2320,2680,229285],[9,2293,2707,226578],[10,2266,2734,223844],[11,2238,2762,221082],[12,2211,2789,218293],[13,2183,2817,215476],[14,2155,2845,212631],[15,2126,2874,209757],[16,2098,2902,206855],[17,2069,2931,203924],[18,2039,2961,200963],[19,2010,2990,197973],[20,1980,3020,194953],[21,1950,3050,191903],[22,1919,3081,188822],[23,1888,3112,185710],[24,1857,3143,182567]]},"passed":false},{"actual":{"balloon":502,"rows":[[1,5,83,917],[2,5,83,834],[3,4,83,751],[4,4,83,668],[5,3,83,585],[6,3,83,502]]},"check":"control 6","expected":{"balloon":526,"rows":[[1,5,78,922],[2,5,78,844],[3,4,79,765],[4,4,79,686],[5,3,80,606],[6,3,80,526]]},"passed":false}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression: final principal clamp\", \"actual\": {\"rows\": [[1, 2000, 20007, 79993], [2, 1600, 20007, 59986], [3, 1200, 20007, 39979], [4, 800, 20007, 19972], [5, 399, 19972, 0]], \"balloon\": 0}, \"expected\": {\"rows\": [[1, 2000, 18007, 81993], [2, 1640, 18367, 63626], [3, 1273, 18734, 44892], [4, 898, 19109, 25783], [5, 516, 19491, 6292], [6, 126, 6292, 0]], \"balloon\": 0}, \"passed\": false}, {\"check\": \"control 1\", \"actual\": {\"rows\": [[1, 4165, 5000, 245000], [2, 4081, 5000, 240000], [3, 3998, 5000, 235000], [4, 3915, 5000, 230000], [5, 3831, 5000, 225000], [6, 3748, 5000, 220000], [7, 3665, 5000, 215000], [8, 3582, 5000, 210000], [9, 3498, 5000, 205000], [10, 3415, 5000, 200000], [11, 3332, 5000, 195000], [12, 3248, 5000, 190000], [13, 3165, 5000, 185000], [14, 3082, 5000, 180000], [15, 2999, 5000, 175000], [16, 2915, 5000, 170000], [17, 2832, 5000, 165000], [18, 2749, 5000, 160000], [19, 2665, 5000, 155000], [20, 2582, 5000, 150000], [21, 2499, 5000, 145000], [22, 2415, 5000, 140000], [23, 2332, 5000, 135000], [24, 2249, 5000, 130000]], \"balloon\": 130000}, \"expected\": {\"rows\": [[1, 4165, 835, 249165], [2, 4151, 849, 248316], [3, 4137, 863, 247453], [4, 4122, 878, 246575], [5, 4108, 892, 245683], [6, 4093, 907, 244776], [7, 4078, 922, 243854], [8, 4062, 938, 242916], [9, 4047, 953, 241963], [10, 4031, 969, 240994], [11, 4015, 985, 240009], [12, 3998, 1002, 239007], [13, 3981, 1019, 237988], [14, 3964, 1036, 236952], [15, 3947, 1053, 235899], [16, 3930, 1070, 234829], [17, 3912, 1088, 233741], [18, 3894, 1106, 232635], [19, 3875, 1125, 231510], [20, 3857, 1143, 230367], [21, 3838, 1162, 229205], [22, 3818, 1182, 228023], [23, 3798, 1202, 226821], [24, 3778, 1222, 225599]], \"balloon\": 225599}, \"passed\": false}, {\"check\": \"control 2\", \"actual\": {\"rows\": [[1, 0, 500, 249500]], \"balloon\": 249500}, \"expected\": {\"rows\": [[1, 0, 500, 249500]], \"balloon\": 249500}, \"passed\": true}, {\"check\": \"control 3\", \"actual\": {\"error\": \"negative_amortization\", \"month\": 1}, \"expected\": {\"error\": \"negative_amortization\", \"month\": 1}, \"passed\": true}, {\"check\": \"control 4\", \"actual\": {\"rows\": [], \"balloon\": 100000}, \"expected\": {\"rows\": [], \"balloon\": 100000}, \"passed\": true}, {\"check\": \"control 5\", \"actual\": {\"rows\": [[1, 2500, 5000, 245000], [2, 2450, 5000, 240000], [3, 2400, 5000, 235000], [4, 2350, 5000, 230000], [5, 2300, 5000, 225000], [6, 2250, 5000, 220000], [7, 2200, 5000, 215000], [8, 2150, 5000, 210000], [9, 2100, 5000, 205000], [10, 2050, 5000, 200000], [11, 2000, 5000, 195000], [12, 1950, 5000, 190000], [13, 1900, 5000, 185000], [14, 1850, 5000, 180000], [15, 1800, 5000, 175000], [16, 1750, 5000, 170000], [17, 1700, 5000, 165000], [18, 1650, 5000, 160000], [19, 1600, 5000, 155000], [20, 1550, 5000, 150000], [21, 1500, 5000, 145000], [22, 1450, 5000, 140000], [23, 1400, 5000, 135000], [24, 1350, 5000, 130000]], \"balloon\": 130000}, \"expected\": {\"rows\": [[1, 2500, 2500, 247500], [2, 2475, 2525, 244975], [3, 2450, 2550, 242425], [4, 2424, 2576, 239849], [5, 2398, 2602, 237247], [6, 2372, 2628, 234619], [7, 2346, 2654, 231965], [8, 2320, 2680, 229285], [9, 2293, 2707, 226578], [10, 2266, 2734, 223844], [11, 2238, 2762, 221082], [12, 2211, 2789, 218293], [13, 2183, 2817, 215476], [14, 2155, 2845, 212631], [15, 2126, 2874, 209757], [16, 2098, 2902, 206855], [17, 2069, 2931, 203924], [18, 2039, 2961, 200963], [19, 2010, 2990, 197973], [20, 1980, 3020, 194953], [21, 1950, 3050, 191903], [22, 1919, 3081, 188822], [23, 1888, 3112, 185710], [24, 1857, 3143, 182567]], \"balloon\": 182567}, \"passed\": false}, {\"check\": \"control 6\", \"actual\": {\"rows\": [[1, 5, 83, 917], [2, 5, 83, 834], [3, 4, 83, 751], [4, 4, 83, 668], [5, 3, 83, 585], [6, 3, 83, 502]], \"balloon\": 502}, \"expected\": {\"rows\": [[1, 5, 78, 922], [2, 5, 78, 844], [3, 4, 79, 765], [4, 4, 79, 686], [5, 3, 80, 606], [6, 3, 80, 526]], \"balloon\": 526}, \"passed\": false}], \"passed\": false}\n"},"broken":{"elapsed_ms":42.922,"exit_code":1,"observations":[{"actual":{"balloon":-141509,"rows":[[1,2000,18007,81993],[2,1640,18367,63626],[3,1273,18734,44892],[4,898,19109,25783],[5,516,19491,6292],[6,126,19881,-13589],[7,-272,20279,-33868],[8,-677,20684,-54552],[9,-1091,21098,-75650],[10,-1513,21520,-97170],[11,-1943,21950,-119120],[12,-2382,22389,-141509]]},"check":"regression: final principal clamp","expected":{"balloon":0,"rows":[[1,2000,18007,81993],[2,1640,18367,63626],[3,1273,18734,44892],[4,898,19109,25783],[5,516,19491,6292],[6,126,6292,0]]},"passed":false},{"actual":{"balloon":225599,"rows":[[1,4165,835,249165],[2,4151,849,248316],[3,4137,863,247453],[4,4122,878,246575],[5,4108,892,245683],[6,4093,907,244776],[7,4078,922,243854],[8,4062,938,242916],[9,4047,953,241963],[10,4031,969,240994],[11,4015,985,240009],[12,3998,1002,239007],[13,3981,1019,237988],[14,3964,1036,236952],[15,3947,1053,235899],[16,3930,1070,234829],[17,3912,1088,233741],[18,3894,1106,232635],[19,3875,1125,231510],[20,3857,1143,230367],[21,3838,1162,229205],[22,3818,1182,228023],[23,3798,1202,226821],[24,3778,1222,225599]]},"check":"control 1","expected":{"balloon":225599,"rows":[[1,4165,835,249165],[2,4151,849,248316],[3,4137,863,247453],[4,4122,878,246575],[5,4108,892,245683],[6,4093,907,244776],[7,4078,922,243854],[8,4062,938,242916],[9,4047,953,241963],[10,4031,969,240994],[11,4015,985,240009],[12,3998,1002,239007],[13,3981,1019,237988],[14,3964,1036,236952],[15,3947,1053,235899],[16,3930,1070,234829],[17,3912,1088,233741],[18,3894,1106,232635],[19,3875,1125,231510],[20,3857,1143,230367],[21,3838,1162,229205],[22,3818,1182,228023],[23,3798,1202,226821],[24,3778,1222,225599]]},"passed":true},{"actual":{"balloon":249500,"rows":[[1,0,500,249500]]},"check":"control 2","expected":{"balloon":249500,"rows":[[1,0,500,249500]]},"passed":true},{"actual":{"error":"negative_amortization","month":1},"check":"control 3","expected":{"error":"negative_amortization","month":1},"passed":true},{"actual":{"balloon":100000,"rows":[]},"check":"control 4","expected":{"balloon":100000,"rows":[]},"passed":true},{"actual":{"balloon":182567,"rows":[[1,2500,2500,247500],[2,2475,2525,244975],[3,2450,2550,242425],[4,2424,2576,239849],[5,2398,2602,237247],[6,2372,2628,234619],[7,2346,2654,231965],[8,2320,2680,229285],[9,2293,2707,226578],[10,2266,2734,223844],[11,2238,2762,221082],[12,2211,2789,218293],[13,2183,2817,215476],[14,2155,2845,212631],[15,2126,2874,209757],[16,2098,2902,206855],[17,2069,2931,203924],[18,2039,2961,200963],[19,2010,2990,197973],[20,1980,3020,194953],[21,1950,3050,191903],[22,1919,3081,188822],[23,1888,3112,185710],[24,1857,3143,182567]]},"check":"control 5","expected":{"balloon":182567,"rows":[[1,2500,2500,247500],[2,2475,2525,244975],[3,2450,2550,242425],[4,2424,2576,239849],[5,2398,2602,237247],[6,2372,2628,234619],[7,2346,2654,231965],[8,2320,2680,229285],[9,2293,2707,226578],[10,2266,2734,223844],[11,2238,2762,221082],[12,2211,2789,218293],[13,2183,2817,215476],[14,2155,2845,212631],[15,2126,2874,209757],[16,2098,2902,206855],[17,2069,2931,203924],[18,2039,2961,200963],[19,2010,2990,197973],[20,1980,3020,194953],[21,1950,3050,191903],[22,1919,3081,188822],[23,1888,3112,185710],[24,1857,3143,182567]]},"passed":true},{"actual":{"balloon":526,"rows":[[1,5,78,922],[2,5,78,844],[3,4,79,765],[4,4,79,686],[5,3,80,606],[6,3,80,526]]},"check":"control 6","expected":{"balloon":526,"rows":[[1,5,78,922],[2,5,78,844],[3,4,79,765],[4,4,79,686],[5,3,80,606],[6,3,80,526]]},"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression: final principal clamp\", \"actual\": {\"rows\": [[1, 2000, 18007, 81993], [2, 1640, 18367, 63626], [3, 1273, 18734, 44892], [4, 898, 19109, 25783], [5, 516, 19491, 6292], [6, 126, 19881, -13589], [7, -272, 20279, -33868], [8, -677, 20684, -54552], [9, -1091, 21098, -75650], [10, -1513, 21520, -97170], [11, -1943, 21950, -119120], [12, -2382, 22389, -141509]], \"balloon\": -141509}, \"expected\": {\"rows\": [[1, 2000, 18007, 81993], [2, 1640, 18367, 63626], [3, 1273, 18734, 44892], [4, 898, 19109, 25783], [5, 516, 19491, 6292], [6, 126, 6292, 0]], \"balloon\": 0}, \"passed\": false}, {\"check\": \"control 1\", \"actual\": {\"rows\": [[1, 4165, 835, 249165], [2, 4151, 849, 248316], [3, 4137, 863, 247453], [4, 4122, 878, 246575], [5, 4108, 892, 245683], [6, 4093, 907, 244776], [7, 4078, 922, 243854], [8, 4062, 938, 242916], [9, 4047, 953, 241963], [10, 4031, 969, 240994], [11, 4015, 985, 240009], [12, 3998, 1002, 239007], [13, 3981, 1019, 237988], [14, 3964, 1036, 236952], [15, 3947, 1053, 235899], [16, 3930, 1070, 234829], [17, 3912, 1088, 233741], [18, 3894, 1106, 232635], [19, 3875, 1125, 231510], [20, 3857, 1143, 230367], [21, 3838, 1162, 229205], [22, 3818, 1182, 228023], [23, 3798, 1202, 226821], [24, 3778, 1222, 225599]], \"balloon\": 225599}, \"expected\": {\"rows\": [[1, 4165, 835, 249165], [2, 4151, 849, 248316], [3, 4137, 863, 247453], [4, 4122, 878, 246575], [5, 4108, 892, 245683], [6, 4093, 907, 244776], [7, 4078, 922, 243854], [8, 4062, 938, 242916], [9, 4047, 953, 241963], [10, 4031, 969, 240994], [11, 4015, 985, 240009], [12, 3998, 1002, 239007], [13, 3981, 1019, 237988], [14, 3964, 1036, 236952], [15, 3947, 1053, 235899], [16, 3930, 1070, 234829], [17, 3912, 1088, 233741], [18, 3894, 1106, 232635], [19, 3875, 1125, 231510], [20, 3857, 1143, 230367], [21, 3838, 1162, 229205], [22, 3818, 1182, 228023], [23, 3798, 1202, 226821], [24, 3778, 1222, 225599]], \"balloon\": 225599}, \"passed\": true}, {\"check\": \"control 2\", \"actual\": {\"rows\": [[1, 0, 500, 249500]], \"balloon\": 249500}, \"expected\": {\"rows\": [[1, 0, 500, 249500]], \"balloon\": 249500}, \"passed\": true}, {\"check\": \"control 3\", \"actual\": {\"error\": \"negative_amortization\", \"month\": 1}, \"expected\": {\"error\": \"negative_amortization\", \"month\": 1}, \"passed\": true}, {\"check\": \"control 4\", \"actual\": {\"rows\": [], \"balloon\": 100000}, \"expected\": {\"rows\": [], \"balloon\": 100000}, \"passed\": true}, {\"check\": \"control 5\", \"actual\": {\"rows\": [[1, 2500, 2500, 247500], [2, 2475, 2525, 244975], [3, 2450, 2550, 242425], [4, 2424, 2576, 239849], [5, 2398, 2602, 237247], [6, 2372, 2628, 234619], [7, 2346, 2654, 231965], [8, 2320, 2680, 229285], [9, 2293, 2707, 226578], [10, 2266, 2734, 223844], [11, 2238, 2762, 221082], [12, 2211, 2789, 218293], [13, 2183, 2817, 215476], [14, 2155, 2845, 212631], [15, 2126, 2874, 209757], [16, 2098, 2902, 206855], [17, 2069, 2931, 203924], [18, 2039, 2961, 200963], [19, 2010, 2990, 197973], [20, 1980, 3020, 194953], [21, 1950, 3050, 191903], [22, 1919, 3081, 188822], [23, 1888, 3112, 185710], [24, 1857, 3143, 182567]], \"balloon\": 182567}, \"expected\": {\"rows\": [[1, 2500, 2500, 247500], [2, 2475, 2525, 244975], [3, 2450, 2550, 242425], [4, 2424, 2576, 239849], [5, 2398, 2602, 237247], [6, 2372, 2628, 234619], [7, 2346, 2654, 231965], [8, 2320, 2680, 229285], [9, 2293, 2707, 226578], [10, 2266, 2734, 223844], [11, 2238, 2762, 221082], [12, 2211, 2789, 218293], [13, 2183, 2817, 215476], [14, 2155, 2845, 212631], [15, 2126, 2874, 209757], [16, 2098, 2902, 206855], [17, 2069, 2931, 203924], [18, 2039, 2961, 200963], [19, 2010, 2990, 197973], [20, 1980, 3020, 194953], [21, 1950, 3050, 191903], [22, 1919, 3081, 188822], [23, 1888, 3112, 185710], [24, 1857, 3143, 182567]], \"balloon\": 182567}, \"passed\": true}, {\"check\": \"control 6\", \"actual\": {\"rows\": [[1, 5, 78, 922], [2, 5, 78, 844], [3, 4, 79, 765], [4, 4, 79, 686], [5, 3, 80, 606], [6, 3, 80, 526]], \"balloon\": 526}, \"expected\": {\"rows\": [[1, 5, 78, 922], [2, 5, 78, 844], [3, 4, 79, 765], [4, 4, 79, 686], [5, 3, 80, 606], [6, 3, 80, 526]], \"balloon\": 526}, \"passed\": true}], \"passed\": false}\n"},"fixed":{"elapsed_ms":43.856,"exit_code":0,"observations":[{"actual":{"balloon":0,"rows":[[1,2000,18007,81993],[2,1640,18367,63626],[3,1273,18734,44892],[4,898,19109,25783],[5,516,19491,6292],[6,126,6292,0]]},"check":"regression: final principal clamp","expected":{"balloon":0,"rows":[[1,2000,18007,81993],[2,1640,18367,63626],[3,1273,18734,44892],[4,898,19109,25783],[5,516,19491,6292],[6,126,6292,0]]},"passed":true},{"actual":{"balloon":225599,"rows":[[1,4165,835,249165],[2,4151,849,248316],[3,4137,863,247453],[4,4122,878,246575],[5,4108,892,245683],[6,4093,907,244776],[7,4078,922,243854],[8,4062,938,242916],[9,4047,953,241963],[10,4031,969,240994],[11,4015,985,240009],[12,3998,1002,239007],[13,3981,1019,237988],[14,3964,1036,236952],[15,3947,1053,235899],[16,3930,1070,234829],[17,3912,1088,233741],[18,3894,1106,232635],[19,3875,1125,231510],[20,3857,1143,230367],[21,3838,1162,229205],[22,3818,1182,228023],[23,3798,1202,226821],[24,3778,1222,225599]]},"check":"control 1","expected":{"balloon":225599,"rows":[[1,4165,835,249165],[2,4151,849,248316],[3,4137,863,247453],[4,4122,878,246575],[5,4108,892,245683],[6,4093,907,244776],[7,4078,922,243854],[8,4062,938,242916],[9,4047,953,241963],[10,4031,969,240994],[11,4015,985,240009],[12,3998,1002,239007],[13,3981,1019,237988],[14,3964,1036,236952],[15,3947,1053,235899],[16,3930,1070,234829],[17,3912,1088,233741],[18,3894,1106,232635],[19,3875,1125,231510],[20,3857,1143,230367],[21,3838,1162,229205],[22,3818,1182,228023],[23,3798,1202,226821],[24,3778,1222,225599]]},"passed":true},{"actual":{"balloon":249500,"rows":[[1,0,500,249500]]},"check":"control 2","expected":{"balloon":249500,"rows":[[1,0,500,249500]]},"passed":true},{"actual":{"error":"negative_amortization","month":1},"check":"control 3","expected":{"error":"negative_amortization","month":1},"passed":true},{"actual":{"balloon":100000,"rows":[]},"check":"control 4","expected":{"balloon":100000,"rows":[]},"passed":true},{"actual":{"balloon":182567,"rows":[[1,2500,2500,247500],[2,2475,2525,244975],[3,2450,2550,242425],[4,2424,2576,239849],[5,2398,2602,237247],[6,2372,2628,234619],[7,2346,2654,231965],[8,2320,2680,229285],[9,2293,2707,226578],[10,2266,2734,223844],[11,2238,2762,221082],[12,2211,2789,218293],[13,2183,2817,215476],[14,2155,2845,212631],[15,2126,2874,209757],[16,2098,2902,206855],[17,2069,2931,203924],[18,2039,2961,200963],[19,2010,2990,197973],[20,1980,3020,194953],[21,1950,3050,191903],[22,1919,3081,188822],[23,1888,3112,185710],[24,1857,3143,182567]]},"check":"control 5","expected":{"balloon":182567,"rows":[[1,2500,2500,247500],[2,2475,2525,244975],[3,2450,2550,242425],[4,2424,2576,239849],[5,2398,2602,237247],[6,2372,2628,234619],[7,2346,2654,231965],[8,2320,2680,229285],[9,2293,2707,226578],[10,2266,2734,223844],[11,2238,2762,221082],[12,2211,2789,218293],[13,2183,2817,215476],[14,2155,2845,212631],[15,2126,2874,209757],[16,2098,2902,206855],[17,2069,2931,203924],[18,2039,2961,200963],[19,2010,2990,197973],[20,1980,3020,194953],[21,1950,3050,191903],[22,1919,3081,188822],[23,1888,3112,185710],[24,1857,3143,182567]]},"passed":true},{"actual":{"balloon":526,"rows":[[1,5,78,922],[2,5,78,844],[3,4,79,765],[4,4,79,686],[5,3,80,606],[6,3,80,526]]},"check":"control 6","expected":{"balloon":526,"rows":[[1,5,78,922],[2,5,78,844],[3,4,79,765],[4,4,79,686],[5,3,80,606],[6,3,80,526]]},"passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression: final principal clamp\", \"actual\": {\"rows\": [[1, 2000, 18007, 81993], [2, 1640, 18367, 63626], [3, 1273, 18734, 44892], [4, 898, 19109, 25783], [5, 516, 19491, 6292], [6, 126, 6292, 0]], \"balloon\": 0}, \"expected\": {\"rows\": [[1, 2000, 18007, 81993], [2, 1640, 18367, 63626], [3, 1273, 18734, 44892], [4, 898, 19109, 25783], [5, 516, 19491, 6292], [6, 126, 6292, 0]], \"balloon\": 0}, \"passed\": true}, {\"check\": \"control 1\", \"actual\": {\"rows\": [[1, 4165, 835, 249165], [2, 4151, 849, 248316], [3, 4137, 863, 247453], [4, 4122, 878, 246575], [5, 4108, 892, 245683], [6, 4093, 907, 244776], [7, 4078, 922, 243854], [8, 4062, 938, 242916], [9, 4047, 953, 241963], [10, 4031, 969, 240994], [11, 4015, 985, 240009], [12, 3998, 1002, 239007], [13, 3981, 1019, 237988], [14, 3964, 1036, 236952], [15, 3947, 1053, 235899], [16, 3930, 1070, 234829], [17, 3912, 1088, 233741], [18, 3894, 1106, 232635], [19, 3875, 1125, 231510], [20, 3857, 1143, 230367], [21, 3838, 1162, 229205], [22, 3818, 1182, 228023], [23, 3798, 1202, 226821], [24, 3778, 1222, 225599]], \"balloon\": 225599}, \"expected\": {\"rows\": [[1, 4165, 835, 249165], [2, 4151, 849, 248316], [3, 4137, 863, 247453], [4, 4122, 878, 246575], [5, 4108, 892, 245683], [6, 4093, 907, 244776], [7, 4078, 922, 243854], [8, 4062, 938, 242916], [9, 4047, 953, 241963], [10, 4031, 969, 240994], [11, 4015, 985, 240009], [12, 3998, 1002, 239007], [13, 3981, 1019, 237988], [14, 3964, 1036, 236952], [15, 3947, 1053, 235899], [16, 3930, 1070, 234829], [17, 3912, 1088, 233741], [18, 3894, 1106, 232635], [19, 3875, 1125, 231510], [20, 3857, 1143, 230367], [21, 3838, 1162, 229205], [22, 3818, 1182, 228023], [23, 3798, 1202, 226821], [24, 3778, 1222, 225599]], \"balloon\": 225599}, \"passed\": true}, {\"check\": \"control 2\", \"actual\": {\"rows\": [[1, 0, 500, 249500]], \"balloon\": 249500}, \"expected\": {\"rows\": [[1, 0, 500, 249500]], \"balloon\": 249500}, \"passed\": true}, {\"check\": \"control 3\", \"actual\": {\"error\": \"negative_amortization\", \"month\": 1}, \"expected\": {\"error\": \"negative_amortization\", \"month\": 1}, \"passed\": true}, {\"check\": \"control 4\", \"actual\": {\"rows\": [], \"balloon\": 100000}, \"expected\": {\"rows\": [], \"balloon\": 100000}, \"passed\": true}, {\"check\": \"control 5\", \"actual\": {\"rows\": [[1, 2500, 2500, 247500], [2, 2475, 2525, 244975], [3, 2450, 2550, 242425], [4, 2424, 2576, 239849], [5, 2398, 2602, 237247], [6, 2372, 2628, 234619], [7, 2346, 2654, 231965], [8, 2320, 2680, 229285], [9, 2293, 2707, 226578], [10, 2266, 2734, 223844], [11, 2238, 2762, 221082], [12, 2211, 2789, 218293], [13, 2183, 2817, 215476], [14, 2155, 2845, 212631], [15, 2126, 2874, 209757], [16, 2098, 2902, 206855], [17, 2069, 2931, 203924], [18, 2039, 2961, 200963], [19, 2010, 2990, 197973], [20, 1980, 3020, 194953], [21, 1950, 3050, 191903], [22, 1919, 3081, 188822], [23, 1888, 3112, 185710], [24, 1857, 3143, 182567]], \"balloon\": 182567}, \"expected\": {\"rows\": [[1, 2500, 2500, 247500], [2, 2475, 2525, 244975], [3, 2450, 2550, 242425], [4, 2424, 2576, 239849], [5, 2398, 2602, 237247], [6, 2372, 2628, 234619], [7, 2346, 2654, 231965], [8, 2320, 2680, 229285], [9, 2293, 2707, 226578], [10, 2266, 2734, 223844], [11, 2238, 2762, 221082], [12, 2211, 2789, 218293], [13, 2183, 2817, 215476], [14, 2155, 2845, 212631], [15, 2126, 2874, 209757], [16, 2098, 2902, 206855], [17, 2069, 2931, 203924], [18, 2039, 2961, 200963], [19, 2010, 2990, 197973], [20, 1980, 3020, 194953], [21, 1950, 3050, 191903], [22, 1919, 3081, 188822], [23, 1888, 3112, 185710], [24, 1857, 3143, 182567]], \"balloon\": 182567}, \"passed\": true}, {\"check\": \"control 6\", \"actual\": {\"rows\": [[1, 5, 78, 922], [2, 5, 78, 844], [3, 4, 79, 765], [4, 4, 79, 686], [5, 3, 80, 606], [6, 3, 80, 526]], \"balloon\": 526}, \"expected\": {\"rows\": [[1, 5, 78, 922], [2, 5, 78, 844], [3, 4, 79, 765], [4, 4, 79, 686], [5, 3, 80, 606], [6, 3, 80, 526]], \"balloon\": 526}, \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}