{"abstract":"A loan whose balance plus interest equals the payment reports a zero final payment.","category":"Loan amortization schedules","checks":7,"contract":"x = {'principal', 'rate_bp', 'months', 'prepay': {'k': extra cents after payment k}, 'mode': 'shorten'|'recast'}. The level payment is the exact annuity rounded half-up. Each month: interest = round_half_up(balance*bp/120000); if balance + interest <= payment or it is month n, pay balance + interest and stop. Otherwise reduce the balance by payment - interest, then apply the extra (capped at the balance). In recast mode a nonzero extra that leaves a balance re-levels the payment over the n - k remaining months. An extra that clears the balance ends the loan with final payment = payment + extra. Return {'months_paid', 'total_interest', 'final_payment', 'payments': payment history}.","evaluation_group":"w2-loan-amortization-schedules-curtailment-recast-or-shorten","failed_approach":"Folding a small next-month remainder into the current payment pays the loan off a month early.","family":"w2-loan-amortization-schedules-curtailment-recast-or-shorten-payoff-month-test","id":"FA-58416","implementations":{"attempt":{"sha256":"43799faf6df28f5b46418a09a143a929841dcae4a0011f367d80ff34eaa15a72","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    def level(P, n):\n        if n <= 0 or P <= 0:\n            return 0\n        if bp == 0:\n            exact = Fraction(P, n)\n        else:\n            r = Fraction(bp, 120000)\n            exact = P * r / (1 - (1 + r) ** -n)\n        return math.floor(exact + Fraction(1, 2))\n    bp = x['rate_bp']\n    n = x['months']\n    bal = x['principal']\n    pay = level(bal, n)\n    history = [pay]\n    total = 0\n    k = 0\n    final = 0\n    while bal > 0 and k < n:\n        k += 1\n        interest = rnd(bal * bp, 120000)\n        total += interest\n        if bal + interest - pay < pay or k == n:\n            final = bal + interest\n            bal = 0\n            break\n        bal -= pay - interest\n        extra = min(x['prepay'].get(str(k), 0), bal)\n        if extra:\n            bal -= extra\n            if x['mode'] == 'recast' and bal > 0:\n                pay = level(bal, n - k)\n                history.append(pay)\n            if bal == 0:\n                final = pay + extra\n    return {'months_paid': k, 'total_interest': total, 'final_payment': final, 'payments': history}\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['regression: balance plus interest exactly one payment', {'principal': 60000, 'rate_bp': 0, 'months': 6, 'prepay': {'1': 30000}, 'mode': 'shorten'}, {'months_paid': 3, 'total_interest': 0, 'final_payment': 10000, 'payments': [10000]}], ['regression: payoff month test', {'principal': 60000, 'rate_bp': 0, 'months': 24, 'prepay': {'18': 200000, '14': 20000}, 'mode': 'shorten'}, {'months_paid': 16, 'total_interest': 0, 'final_payment': 2500, 'payments': [2500]}], ['regression: payoff month test, partial-repair probe', {'principal': 60000, 'rate_bp': 1200, 'months': 24, 'prepay': {'16': 5000, '9': 1000}, 'mode': 'recast'}, {'months_paid': 24, 'total_interest': 7480, 'final_payment': 2100, 'payments': [2824, 2753, 2099]}], ['control 1', {'principal': 60000, 'rate_bp': 0, 'months': 36, 'prepay': {'21': 5000, '12': 200000, '35': 2000000}, 'mode': 'recast'}, {'months_paid': 12, 'total_interest': 0, 'final_payment': 41663, 'payments': [1667]}], ['control 2', {'principal': 60000, 'rate_bp': 600, 'months': 12, 'prepay': {'8': 200000, '7': 20000}, 'mode': 'recast'}, {'months_paid': 8, 'total_interest': 1612, 'final_payment': 5464, 'payments': [5164, 1104]}], ['control 3', {'principal': 60000, 'rate_bp': 1200, 'months': 36, 'prepay': {'31': 200000, '10': 20000, '20': 1000}, 'mode': 'recast'}, {'months_paid': 31, 'total_interest': 8690, 'final_payment': 6130, 'payments': [1993, 1115, 1048]}], ['control 4', {'principal': 60000, 'rate_bp': 0, 'months': 36, 'prepay': {'26': 20000, '10': 5000, '3': 2000000}, 'mode': 'shorten'}, {'months_paid': 3, 'total_interest': 0, 'final_payment': 56666, 'payments': [1667]}]], [['regression: balance plus interest exactly one payment', {'principal': 60000, 'rate_bp': 0, 'months': 6, 'prepay': {'1': 30000}, 'mode': 'shorten'}, {'months_paid': 3, 'total_interest': 0, 'final_payment': 10000, 'payments': [10000]}], ['regression: payoff month test, partial-repair probe', {'principal': 250000, 'rate_bp': 0, 'months': 24, 'prepay': {'24': 200000}, 'mode': 'recast'}, {'months_paid': 24, 'total_interest': 0, 'final_payment': 10409, 'payments': [10417]}], ['control 1', {'principal': 250000, 'rate_bp': 0, 'months': 6, 'prepay': {}, 'mode': 'recast'}, {'months_paid': 6, 'total_interest': 0, 'final_payment': 41665, 'payments': [41667]}], ['control 2', {'principal': 100000, 'rate_bp': 1200, 'months': 24, 'prepay': {'10': 5000}, 'mode': 'recast'}, {'months_paid': 24, 'total_interest': 12595, 'final_payment': 4326, 'payments': [4707, 4323]}], ['control 3', {'principal': 60000, 'rate_bp': 0, 'months': 12, 'prepay': {}, 'mode': 'recast'}, {'months_paid': 12, 'total_interest': 0, 'final_payment': 5000, 'payments': [5000]}], ['control 4', {'principal': 100000, 'rate_bp': 0, 'months': 24, 'prepay': {}, 'mode': 'recast'}, {'months_paid': 24, 'total_interest': 0, 'final_payment': 4159, 'payments': [4167]}], ['control 5', {'principal': 100000, 'rate_bp': 1200, 'months': 24, 'prepay': {}, 'mode': 'shorten'}, {'months_paid': 24, 'total_interest': 12979, 'final_payment': 4718, 'payments': [4707]}]], [['regression: balance plus interest exactly one payment', {'principal': 60000, 'rate_bp': 0, 'months': 6, 'prepay': {'1': 30000}, 'mode': 'shorten'}, {'months_paid': 3, 'total_interest': 0, 'final_payment': 10000, 'payments': [10000]}], ['regression: payoff month test', {'principal': 60000, 'rate_bp': 0, 'months': 12, 'prepay': {'3': 5000, '11': 1000}, 'mode': 'shorten'}, {'months_paid': 11, 'total_interest': 0, 'final_payment': 5000, 'payments': [5000]}], ['regression: payoff month test, partial-repair probe', {'principal': 100000, 'rate_bp': 600, 'months': 12, 'prepay': {'10': 1000}, 'mode': 'recast'}, {'months_paid': 12, 'total_interest': 3272, 'final_payment': 8101, 'payments': [8607, 8101]}], ['control 1', {'principal': 100000, 'rate_bp': 600, 'months': 6, 'prepay': {'5': 1000, '3': 20000}, 'mode': 'recast'}, {'months_paid': 6, 'total_interest': 1552, 'final_payment': 9220, 'payments': [16960, 10226, 9220]}], ['control 2', {'principal': 100000, 'rate_bp': 1200, 'months': 24, 'prepay': {'12': 5000, '20': 20000, '4': 1000}, 'mode': 'shorten'}, {'months_paid': 20, 'total_interest': 11928, 'final_payment': 16495, 'payments': [4707]}], ['control 3', {'principal': 60000, 'rate_bp': 0, 'months': 36, 'prepay': {'23': 1000, '10': 1000, '33': 200000}, 'mode': 'recast'}, {'months_paid': 33, 'total_interest': 0, 'final_payment': 6207, 'payments': [1667, 1628, 1551]}], ['control 4', {'principal': 60000, 'rate_bp': 600, 'months': 24, 'prepay': {'15': 20000, '5': 1000}, 'mode': 'recast'}, {'months_paid': 24, 'total_interest': 3267, 'final_payment': 324, 'payments': [2659, 2604, 326]}]], [['regression: balance plus interest exactly one payment', {'principal': 60000, 'rate_bp': 0, 'months': 6, 'prepay': {'1': 30000}, 'mode': 'shorten'}, {'months_paid': 3, 'total_interest': 0, 'final_payment': 10000, 'payments': [10000]}], ['regression: payoff month test', {'principal': 60000, 'rate_bp': 0, 'months': 24, 'prepay': {'9': 5000, '24': 5000}, 'mode': 'shorten'}, {'months_paid': 22, 'total_interest': 0, 'final_payment': 2500, 'payments': [2500]}], ['regression: payoff month test, partial-repair probe', {'principal': 100000, 'rate_bp': 600, 'months': 36, 'prepay': {}, 'mode': 'shorten'}, {'months_paid': 36, 'total_interest': 9520, 'final_payment': 3050, 'payments': [3042]}], ['control 1', {'principal': 250000, 'rate_bp': 0, 'months': 12, 'prepay': {'7': 200000, '3': 5000}, 'mode': 'shorten'}, {'months_paid': 7, 'total_interest': 0, 'final_payment': 120002, 'payments': [20833]}], ['control 2', {'principal': 60000, 'rate_bp': 0, 'months': 24, 'prepay': {}, 'mode': 'recast'}, {'months_paid': 24, 'total_interest': 0, 'final_payment': 2500, 'payments': [2500]}], ['control 3', {'principal': 60000, 'rate_bp': 600, 'months': 36, 'prepay': {'24': 2000000, '33': 1000, '12': 2000000}, 'mode': 'shorten'}, {'months_paid': 12, 'total_interest': 3088, 'final_payment': 43013, 'payments': [1825]}], ['control 4', {'principal': 100000, 'rate_bp': 1200, 'months': 24, 'prepay': {'20': 5000, '18': 2000000, '15': 1000}, 'mode': 'recast'}, {'months_paid': 18, 'total_interest': 11987, 'final_payment': 31200, 'payments': [4707, 4591]}]], [['regression: balance plus interest exactly one payment', {'principal': 60000, 'rate_bp': 0, 'months': 6, 'prepay': {'1': 30000}, 'mode': 'shorten'}, {'months_paid': 3, 'total_interest': 0, 'final_payment': 10000, 'payments': [10000]}], ['regression: payoff month test', {'principal': 60000, 'rate_bp': 0, 'months': 12, 'prepay': {'10': 5000}, 'mode': 'shorten'}, {'months_paid': 11, 'total_interest': 0, 'final_payment': 5000, 'payments': [5000]}], ['regression: payoff month test, partial-repair probe', {'principal': 60000, 'rate_bp': 0, 'months': 6, 'prepay': {'4': 1000}, 'mode': 'shorten'}, {'months_paid': 6, 'total_interest': 0, 'final_payment': 9000, 'payments': [10000]}], ['control 1', {'principal': 250000, 'rate_bp': 600, 'months': 12, 'prepay': {'8': 200000}, 'mode': 'shorten'}, {'months_paid': 8, 'total_interest': 7134, 'final_payment': 106515, 'payments': [21517]}], ['control 2', {'principal': 250000, 'rate_bp': 1200, 'months': 24, 'prepay': {}, 'mode': 'shorten'}, {'months_paid': 24, 'total_interest': 32442, 'final_payment': 11778, 'payments': [11768]}], ['control 3', {'principal': 60000, 'rate_bp': 0, 'months': 6, 'prepay': {'4': 200000, '1': 1000, '6': 200000}, 'mode': 'shorten'}, {'months_paid': 4, 'total_interest': 0, 'final_payment': 29000, 'payments': [10000]}], ['control 4', {'principal': 100000, 'rate_bp': 0, 'months': 6, 'prepay': {'3': 1000}, 'mode': 'recast'}, {'months_paid': 6, 'total_interest': 0, 'final_payment': 16333, 'payments': [16667, 16333]}]]]\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":"a55e18493f3ab18d3460815296aaa696bc6039b1245078eb772ad83964cc67a7","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    def level(P, n):\n        if n <= 0 or P <= 0:\n            return 0\n        if bp == 0:\n            exact = Fraction(P, n)\n        else:\n            r = Fraction(bp, 120000)\n            exact = P * r / (1 - (1 + r) ** -n)\n        return math.floor(exact + Fraction(1, 2))\n    bp = x['rate_bp']\n    n = x['months']\n    bal = x['principal']\n    pay = level(bal, n)\n    history = [pay]\n    total = 0\n    k = 0\n    final = 0\n    while bal > 0 and k < n:\n        k += 1\n        interest = rnd(bal * bp, 120000)\n        total += interest\n        if bal + interest < pay or k == n:\n            final = bal + interest\n            bal = 0\n            break\n        bal -= pay - interest\n        extra = min(x['prepay'].get(str(k), 0), bal)\n        if extra:\n            bal -= extra\n            if x['mode'] == 'recast' and bal > 0:\n                pay = level(bal, n - k)\n                history.append(pay)\n            if bal == 0:\n                final = pay + extra\n    return {'months_paid': k, 'total_interest': total, 'final_payment': final, 'payments': history}\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['regression: balance plus interest exactly one payment', {'principal': 60000, 'rate_bp': 0, 'months': 6, 'prepay': {'1': 30000}, 'mode': 'shorten'}, {'months_paid': 3, 'total_interest': 0, 'final_payment': 10000, 'payments': [10000]}], ['regression: payoff month test', {'principal': 60000, 'rate_bp': 0, 'months': 24, 'prepay': {'18': 200000, '14': 20000}, 'mode': 'shorten'}, {'months_paid': 16, 'total_interest': 0, 'final_payment': 2500, 'payments': [2500]}], ['regression: payoff month test, partial-repair probe', {'principal': 60000, 'rate_bp': 1200, 'months': 24, 'prepay': {'16': 5000, '9': 1000}, 'mode': 'recast'}, {'months_paid': 24, 'total_interest': 7480, 'final_payment': 2100, 'payments': [2824, 2753, 2099]}], ['control 1', {'principal': 60000, 'rate_bp': 0, 'months': 36, 'prepay': {'21': 5000, '12': 200000, '35': 2000000}, 'mode': 'recast'}, {'months_paid': 12, 'total_interest': 0, 'final_payment': 41663, 'payments': [1667]}], ['control 2', {'principal': 60000, 'rate_bp': 600, 'months': 12, 'prepay': {'8': 200000, '7': 20000}, 'mode': 'recast'}, {'months_paid': 8, 'total_interest': 1612, 'final_payment': 5464, 'payments': [5164, 1104]}], ['control 3', {'principal': 60000, 'rate_bp': 1200, 'months': 36, 'prepay': {'31': 200000, '10': 20000, '20': 1000}, 'mode': 'recast'}, {'months_paid': 31, 'total_interest': 8690, 'final_payment': 6130, 'payments': [1993, 1115, 1048]}], ['control 4', {'principal': 60000, 'rate_bp': 0, 'months': 36, 'prepay': {'26': 20000, '10': 5000, '3': 2000000}, 'mode': 'shorten'}, {'months_paid': 3, 'total_interest': 0, 'final_payment': 56666, 'payments': [1667]}]], [['regression: balance plus interest exactly one payment', {'principal': 60000, 'rate_bp': 0, 'months': 6, 'prepay': {'1': 30000}, 'mode': 'shorten'}, {'months_paid': 3, 'total_interest': 0, 'final_payment': 10000, 'payments': [10000]}], ['regression: payoff month test, partial-repair probe', {'principal': 250000, 'rate_bp': 0, 'months': 24, 'prepay': {'24': 200000}, 'mode': 'recast'}, {'months_paid': 24, 'total_interest': 0, 'final_payment': 10409, 'payments': [10417]}], ['control 1', {'principal': 250000, 'rate_bp': 0, 'months': 6, 'prepay': {}, 'mode': 'recast'}, {'months_paid': 6, 'total_interest': 0, 'final_payment': 41665, 'payments': [41667]}], ['control 2', {'principal': 100000, 'rate_bp': 1200, 'months': 24, 'prepay': {'10': 5000}, 'mode': 'recast'}, {'months_paid': 24, 'total_interest': 12595, 'final_payment': 4326, 'payments': [4707, 4323]}], ['control 3', {'principal': 60000, 'rate_bp': 0, 'months': 12, 'prepay': {}, 'mode': 'recast'}, {'months_paid': 12, 'total_interest': 0, 'final_payment': 5000, 'payments': [5000]}], ['control 4', {'principal': 100000, 'rate_bp': 0, 'months': 24, 'prepay': {}, 'mode': 'recast'}, {'months_paid': 24, 'total_interest': 0, 'final_payment': 4159, 'payments': [4167]}], ['control 5', {'principal': 100000, 'rate_bp': 1200, 'months': 24, 'prepay': {}, 'mode': 'shorten'}, {'months_paid': 24, 'total_interest': 12979, 'final_payment': 4718, 'payments': [4707]}]], [['regression: balance plus interest exactly one payment', {'principal': 60000, 'rate_bp': 0, 'months': 6, 'prepay': {'1': 30000}, 'mode': 'shorten'}, {'months_paid': 3, 'total_interest': 0, 'final_payment': 10000, 'payments': [10000]}], ['regression: payoff month test', {'principal': 60000, 'rate_bp': 0, 'months': 12, 'prepay': {'3': 5000, '11': 1000}, 'mode': 'shorten'}, {'months_paid': 11, 'total_interest': 0, 'final_payment': 5000, 'payments': [5000]}], ['regression: payoff month test, partial-repair probe', {'principal': 100000, 'rate_bp': 600, 'months': 12, 'prepay': {'10': 1000}, 'mode': 'recast'}, {'months_paid': 12, 'total_interest': 3272, 'final_payment': 8101, 'payments': [8607, 8101]}], ['control 1', {'principal': 100000, 'rate_bp': 600, 'months': 6, 'prepay': {'5': 1000, '3': 20000}, 'mode': 'recast'}, {'months_paid': 6, 'total_interest': 1552, 'final_payment': 9220, 'payments': [16960, 10226, 9220]}], ['control 2', {'principal': 100000, 'rate_bp': 1200, 'months': 24, 'prepay': {'12': 5000, '20': 20000, '4': 1000}, 'mode': 'shorten'}, {'months_paid': 20, 'total_interest': 11928, 'final_payment': 16495, 'payments': [4707]}], ['control 3', {'principal': 60000, 'rate_bp': 0, 'months': 36, 'prepay': {'23': 1000, '10': 1000, '33': 200000}, 'mode': 'recast'}, {'months_paid': 33, 'total_interest': 0, 'final_payment': 6207, 'payments': [1667, 1628, 1551]}], ['control 4', {'principal': 60000, 'rate_bp': 600, 'months': 24, 'prepay': {'15': 20000, '5': 1000}, 'mode': 'recast'}, {'months_paid': 24, 'total_interest': 3267, 'final_payment': 324, 'payments': [2659, 2604, 326]}]], [['regression: balance plus interest exactly one payment', {'principal': 60000, 'rate_bp': 0, 'months': 6, 'prepay': {'1': 30000}, 'mode': 'shorten'}, {'months_paid': 3, 'total_interest': 0, 'final_payment': 10000, 'payments': [10000]}], ['regression: payoff month test', {'principal': 60000, 'rate_bp': 0, 'months': 24, 'prepay': {'9': 5000, '24': 5000}, 'mode': 'shorten'}, {'months_paid': 22, 'total_interest': 0, 'final_payment': 2500, 'payments': [2500]}], ['regression: payoff month test, partial-repair probe', {'principal': 100000, 'rate_bp': 600, 'months': 36, 'prepay': {}, 'mode': 'shorten'}, {'months_paid': 36, 'total_interest': 9520, 'final_payment': 3050, 'payments': [3042]}], ['control 1', {'principal': 250000, 'rate_bp': 0, 'months': 12, 'prepay': {'7': 200000, '3': 5000}, 'mode': 'shorten'}, {'months_paid': 7, 'total_interest': 0, 'final_payment': 120002, 'payments': [20833]}], ['control 2', {'principal': 60000, 'rate_bp': 0, 'months': 24, 'prepay': {}, 'mode': 'recast'}, {'months_paid': 24, 'total_interest': 0, 'final_payment': 2500, 'payments': [2500]}], ['control 3', {'principal': 60000, 'rate_bp': 600, 'months': 36, 'prepay': {'24': 2000000, '33': 1000, '12': 2000000}, 'mode': 'shorten'}, {'months_paid': 12, 'total_interest': 3088, 'final_payment': 43013, 'payments': [1825]}], ['control 4', {'principal': 100000, 'rate_bp': 1200, 'months': 24, 'prepay': {'20': 5000, '18': 2000000, '15': 1000}, 'mode': 'recast'}, {'months_paid': 18, 'total_interest': 11987, 'final_payment': 31200, 'payments': [4707, 4591]}]], [['regression: balance plus interest exactly one payment', {'principal': 60000, 'rate_bp': 0, 'months': 6, 'prepay': {'1': 30000}, 'mode': 'shorten'}, {'months_paid': 3, 'total_interest': 0, 'final_payment': 10000, 'payments': [10000]}], ['regression: payoff month test', {'principal': 60000, 'rate_bp': 0, 'months': 12, 'prepay': {'10': 5000}, 'mode': 'shorten'}, {'months_paid': 11, 'total_interest': 0, 'final_payment': 5000, 'payments': [5000]}], ['regression: payoff month test, partial-repair probe', {'principal': 60000, 'rate_bp': 0, 'months': 6, 'prepay': {'4': 1000}, 'mode': 'shorten'}, {'months_paid': 6, 'total_interest': 0, 'final_payment': 9000, 'payments': [10000]}], ['control 1', {'principal': 250000, 'rate_bp': 600, 'months': 12, 'prepay': {'8': 200000}, 'mode': 'shorten'}, {'months_paid': 8, 'total_interest': 7134, 'final_payment': 106515, 'payments': [21517]}], ['control 2', {'principal': 250000, 'rate_bp': 1200, 'months': 24, 'prepay': {}, 'mode': 'shorten'}, {'months_paid': 24, 'total_interest': 32442, 'final_payment': 11778, 'payments': [11768]}], ['control 3', {'principal': 60000, 'rate_bp': 0, 'months': 6, 'prepay': {'4': 200000, '1': 1000, '6': 200000}, 'mode': 'shorten'}, {'months_paid': 4, 'total_interest': 0, 'final_payment': 29000, 'payments': [10000]}], ['control 4', {'principal': 100000, 'rate_bp': 0, 'months': 6, 'prepay': {'3': 1000}, 'mode': 'recast'}, {'months_paid': 6, 'total_interest': 0, 'final_payment': 16333, 'payments': [16667, 16333]}]]]\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":"58f859cfd9ef6a86c29667ae5f6bfb42f236a2f7bed87d797ec9d1731a405607","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    def level(P, n):\n        if n <= 0 or P <= 0:\n            return 0\n        if bp == 0:\n            exact = Fraction(P, n)\n        else:\n            r = Fraction(bp, 120000)\n            exact = P * r / (1 - (1 + r) ** -n)\n        return math.floor(exact + Fraction(1, 2))\n    bp = x['rate_bp']\n    n = x['months']\n    bal = x['principal']\n    pay = level(bal, n)\n    history = [pay]\n    total = 0\n    k = 0\n    final = 0\n    while bal > 0 and k < n:\n        k += 1\n        interest = rnd(bal * bp, 120000)\n        total += interest\n        if bal + interest <= pay or k == n:\n            final = bal + interest\n            bal = 0\n            break\n        bal -= pay - interest\n        extra = min(x['prepay'].get(str(k), 0), bal)\n        if extra:\n            bal -= extra\n            if x['mode'] == 'recast' and bal > 0:\n                pay = level(bal, n - k)\n                history.append(pay)\n            if bal == 0:\n                final = pay + extra\n    return {'months_paid': k, 'total_interest': total, 'final_payment': final, 'payments': history}\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['regression: balance plus interest exactly one payment', {'principal': 60000, 'rate_bp': 0, 'months': 6, 'prepay': {'1': 30000}, 'mode': 'shorten'}, {'months_paid': 3, 'total_interest': 0, 'final_payment': 10000, 'payments': [10000]}], ['regression: payoff month test', {'principal': 60000, 'rate_bp': 0, 'months': 24, 'prepay': {'18': 200000, '14': 20000}, 'mode': 'shorten'}, {'months_paid': 16, 'total_interest': 0, 'final_payment': 2500, 'payments': [2500]}], ['regression: payoff month test, partial-repair probe', {'principal': 60000, 'rate_bp': 1200, 'months': 24, 'prepay': {'16': 5000, '9': 1000}, 'mode': 'recast'}, {'months_paid': 24, 'total_interest': 7480, 'final_payment': 2100, 'payments': [2824, 2753, 2099]}], ['control 1', {'principal': 60000, 'rate_bp': 0, 'months': 36, 'prepay': {'21': 5000, '12': 200000, '35': 2000000}, 'mode': 'recast'}, {'months_paid': 12, 'total_interest': 0, 'final_payment': 41663, 'payments': [1667]}], ['control 2', {'principal': 60000, 'rate_bp': 600, 'months': 12, 'prepay': {'8': 200000, '7': 20000}, 'mode': 'recast'}, {'months_paid': 8, 'total_interest': 1612, 'final_payment': 5464, 'payments': [5164, 1104]}], ['control 3', {'principal': 60000, 'rate_bp': 1200, 'months': 36, 'prepay': {'31': 200000, '10': 20000, '20': 1000}, 'mode': 'recast'}, {'months_paid': 31, 'total_interest': 8690, 'final_payment': 6130, 'payments': [1993, 1115, 1048]}], ['control 4', {'principal': 60000, 'rate_bp': 0, 'months': 36, 'prepay': {'26': 20000, '10': 5000, '3': 2000000}, 'mode': 'shorten'}, {'months_paid': 3, 'total_interest': 0, 'final_payment': 56666, 'payments': [1667]}]], [['regression: balance plus interest exactly one payment', {'principal': 60000, 'rate_bp': 0, 'months': 6, 'prepay': {'1': 30000}, 'mode': 'shorten'}, {'months_paid': 3, 'total_interest': 0, 'final_payment': 10000, 'payments': [10000]}], ['regression: payoff month test, partial-repair probe', {'principal': 250000, 'rate_bp': 0, 'months': 24, 'prepay': {'24': 200000}, 'mode': 'recast'}, {'months_paid': 24, 'total_interest': 0, 'final_payment': 10409, 'payments': [10417]}], ['control 1', {'principal': 250000, 'rate_bp': 0, 'months': 6, 'prepay': {}, 'mode': 'recast'}, {'months_paid': 6, 'total_interest': 0, 'final_payment': 41665, 'payments': [41667]}], ['control 2', {'principal': 100000, 'rate_bp': 1200, 'months': 24, 'prepay': {'10': 5000}, 'mode': 'recast'}, {'months_paid': 24, 'total_interest': 12595, 'final_payment': 4326, 'payments': [4707, 4323]}], ['control 3', {'principal': 60000, 'rate_bp': 0, 'months': 12, 'prepay': {}, 'mode': 'recast'}, {'months_paid': 12, 'total_interest': 0, 'final_payment': 5000, 'payments': [5000]}], ['control 4', {'principal': 100000, 'rate_bp': 0, 'months': 24, 'prepay': {}, 'mode': 'recast'}, {'months_paid': 24, 'total_interest': 0, 'final_payment': 4159, 'payments': [4167]}], ['control 5', {'principal': 100000, 'rate_bp': 1200, 'months': 24, 'prepay': {}, 'mode': 'shorten'}, {'months_paid': 24, 'total_interest': 12979, 'final_payment': 4718, 'payments': [4707]}]], [['regression: balance plus interest exactly one payment', {'principal': 60000, 'rate_bp': 0, 'months': 6, 'prepay': {'1': 30000}, 'mode': 'shorten'}, {'months_paid': 3, 'total_interest': 0, 'final_payment': 10000, 'payments': [10000]}], ['regression: payoff month test', {'principal': 60000, 'rate_bp': 0, 'months': 12, 'prepay': {'3': 5000, '11': 1000}, 'mode': 'shorten'}, {'months_paid': 11, 'total_interest': 0, 'final_payment': 5000, 'payments': [5000]}], ['regression: payoff month test, partial-repair probe', {'principal': 100000, 'rate_bp': 600, 'months': 12, 'prepay': {'10': 1000}, 'mode': 'recast'}, {'months_paid': 12, 'total_interest': 3272, 'final_payment': 8101, 'payments': [8607, 8101]}], ['control 1', {'principal': 100000, 'rate_bp': 600, 'months': 6, 'prepay': {'5': 1000, '3': 20000}, 'mode': 'recast'}, {'months_paid': 6, 'total_interest': 1552, 'final_payment': 9220, 'payments': [16960, 10226, 9220]}], ['control 2', {'principal': 100000, 'rate_bp': 1200, 'months': 24, 'prepay': {'12': 5000, '20': 20000, '4': 1000}, 'mode': 'shorten'}, {'months_paid': 20, 'total_interest': 11928, 'final_payment': 16495, 'payments': [4707]}], ['control 3', {'principal': 60000, 'rate_bp': 0, 'months': 36, 'prepay': {'23': 1000, '10': 1000, '33': 200000}, 'mode': 'recast'}, {'months_paid': 33, 'total_interest': 0, 'final_payment': 6207, 'payments': [1667, 1628, 1551]}], ['control 4', {'principal': 60000, 'rate_bp': 600, 'months': 24, 'prepay': {'15': 20000, '5': 1000}, 'mode': 'recast'}, {'months_paid': 24, 'total_interest': 3267, 'final_payment': 324, 'payments': [2659, 2604, 326]}]], [['regression: balance plus interest exactly one payment', {'principal': 60000, 'rate_bp': 0, 'months': 6, 'prepay': {'1': 30000}, 'mode': 'shorten'}, {'months_paid': 3, 'total_interest': 0, 'final_payment': 10000, 'payments': [10000]}], ['regression: payoff month test', {'principal': 60000, 'rate_bp': 0, 'months': 24, 'prepay': {'9': 5000, '24': 5000}, 'mode': 'shorten'}, {'months_paid': 22, 'total_interest': 0, 'final_payment': 2500, 'payments': [2500]}], ['regression: payoff month test, partial-repair probe', {'principal': 100000, 'rate_bp': 600, 'months': 36, 'prepay': {}, 'mode': 'shorten'}, {'months_paid': 36, 'total_interest': 9520, 'final_payment': 3050, 'payments': [3042]}], ['control 1', {'principal': 250000, 'rate_bp': 0, 'months': 12, 'prepay': {'7': 200000, '3': 5000}, 'mode': 'shorten'}, {'months_paid': 7, 'total_interest': 0, 'final_payment': 120002, 'payments': [20833]}], ['control 2', {'principal': 60000, 'rate_bp': 0, 'months': 24, 'prepay': {}, 'mode': 'recast'}, {'months_paid': 24, 'total_interest': 0, 'final_payment': 2500, 'payments': [2500]}], ['control 3', {'principal': 60000, 'rate_bp': 600, 'months': 36, 'prepay': {'24': 2000000, '33': 1000, '12': 2000000}, 'mode': 'shorten'}, {'months_paid': 12, 'total_interest': 3088, 'final_payment': 43013, 'payments': [1825]}], ['control 4', {'principal': 100000, 'rate_bp': 1200, 'months': 24, 'prepay': {'20': 5000, '18': 2000000, '15': 1000}, 'mode': 'recast'}, {'months_paid': 18, 'total_interest': 11987, 'final_payment': 31200, 'payments': [4707, 4591]}]], [['regression: balance plus interest exactly one payment', {'principal': 60000, 'rate_bp': 0, 'months': 6, 'prepay': {'1': 30000}, 'mode': 'shorten'}, {'months_paid': 3, 'total_interest': 0, 'final_payment': 10000, 'payments': [10000]}], ['regression: payoff month test', {'principal': 60000, 'rate_bp': 0, 'months': 12, 'prepay': {'10': 5000}, 'mode': 'shorten'}, {'months_paid': 11, 'total_interest': 0, 'final_payment': 5000, 'payments': [5000]}], ['regression: payoff month test, partial-repair probe', {'principal': 60000, 'rate_bp': 0, 'months': 6, 'prepay': {'4': 1000}, 'mode': 'shorten'}, {'months_paid': 6, 'total_interest': 0, 'final_payment': 9000, 'payments': [10000]}], ['control 1', {'principal': 250000, 'rate_bp': 600, 'months': 12, 'prepay': {'8': 200000}, 'mode': 'shorten'}, {'months_paid': 8, 'total_interest': 7134, 'final_payment': 106515, 'payments': [21517]}], ['control 2', {'principal': 250000, 'rate_bp': 1200, 'months': 24, 'prepay': {}, 'mode': 'shorten'}, {'months_paid': 24, 'total_interest': 32442, 'final_payment': 11778, 'payments': [11768]}], ['control 3', {'principal': 60000, 'rate_bp': 0, 'months': 6, 'prepay': {'4': 200000, '1': 1000, '6': 200000}, 'mode': 'shorten'}, {'months_paid': 4, 'total_interest': 0, 'final_payment': 29000, 'payments': [10000]}], ['control 4', {'principal': 100000, 'rate_bp': 0, 'months': 6, 'prepay': {'3': 1000}, 'mode': 'recast'}, {'months_paid': 6, 'total_interest': 0, 'final_payment': 16333, 'payments': [16667, 16333]}]]]\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-curtailment-recast-or-shorten-payoff-month-test","generated_at":"2026-09-29T14:46:26.526215+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":"Treat balance + interest <= payment as the payoff month.","root_cause":"The early payoff test is strict, so an exact final payment is taken as a regular one.","sha256":"80534cac14d63c5c855805a009d81960f85b75675854edbdd38dbbe6d19ea340","title":"Principal curtailment with recast or term shortening: payoff month test · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":44.711,"exit_code":1,"observations":[{"actual":{"final_payment":10000,"months_paid":3,"payments":[10000],"total_interest":0},"check":"regression: balance plus interest exactly one payment","expected":{"final_payment":10000,"months_paid":3,"payments":[10000],"total_interest":0},"passed":true},{"actual":{"final_payment":2500,"months_paid":16,"payments":[2500],"total_interest":0},"check":"regression: payoff month test","expected":{"final_payment":2500,"months_paid":16,"payments":[2500],"total_interest":0},"passed":true},{"actual":{"final_payment":4178,"months_paid":23,"payments":[2824,2753,2099],"total_interest":7459},"check":"regression: payoff month test, partial-repair probe","expected":{"final_payment":2100,"months_paid":24,"payments":[2824,2753,2099],"total_interest":7480},"passed":false},{"actual":{"final_payment":41663,"months_paid":12,"payments":[1667],"total_interest":0},"check":"control 1","expected":{"final_payment":41663,"months_paid":12,"payments":[1667],"total_interest":0},"passed":true},{"actual":{"final_payment":5464,"months_paid":8,"payments":[5164,1104],"total_interest":1612},"check":"control 2","expected":{"final_payment":5464,"months_paid":8,"payments":[5164,1104],"total_interest":1612},"passed":true},{"actual":{"final_payment":6130,"months_paid":31,"payments":[1993,1115,1048],"total_interest":8690},"check":"control 3","expected":{"final_payment":6130,"months_paid":31,"payments":[1993,1115,1048],"total_interest":8690},"passed":true},{"actual":{"final_payment":56666,"months_paid":3,"payments":[1667],"total_interest":0},"check":"control 4","expected":{"final_payment":56666,"months_paid":3,"payments":[1667],"total_interest":0},"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression: balance plus interest exactly one payment\", \"actual\": {\"months_paid\": 3, \"total_interest\": 0, \"final_payment\": 10000, \"payments\": [10000]}, \"expected\": {\"months_paid\": 3, \"total_interest\": 0, \"final_payment\": 10000, \"payments\": [10000]}, \"passed\": true}, {\"check\": \"regression: payoff month test\", \"actual\": {\"months_paid\": 16, \"total_interest\": 0, \"final_payment\": 2500, \"payments\": [2500]}, \"expected\": {\"months_paid\": 16, \"total_interest\": 0, \"final_payment\": 2500, \"payments\": [2500]}, \"passed\": true}, {\"check\": \"regression: payoff month test, partial-repair probe\", \"actual\": {\"months_paid\": 23, \"total_interest\": 7459, \"final_payment\": 4178, \"payments\": [2824, 2753, 2099]}, \"expected\": {\"months_paid\": 24, \"total_interest\": 7480, \"final_payment\": 2100, \"payments\": [2824, 2753, 2099]}, \"passed\": false}, {\"check\": \"control 1\", \"actual\": {\"months_paid\": 12, \"total_interest\": 0, \"final_payment\": 41663, \"payments\": [1667]}, \"expected\": {\"months_paid\": 12, \"total_interest\": 0, \"final_payment\": 41663, \"payments\": [1667]}, \"passed\": true}, {\"check\": \"control 2\", \"actual\": {\"months_paid\": 8, \"total_interest\": 1612, \"final_payment\": 5464, \"payments\": [5164, 1104]}, \"expected\": {\"months_paid\": 8, \"total_interest\": 1612, \"final_payment\": 5464, \"payments\": [5164, 1104]}, \"passed\": true}, {\"check\": \"control 3\", \"actual\": {\"months_paid\": 31, \"total_interest\": 8690, \"final_payment\": 6130, \"payments\": [1993, 1115, 1048]}, \"expected\": {\"months_paid\": 31, \"total_interest\": 8690, \"final_payment\": 6130, \"payments\": [1993, 1115, 1048]}, \"passed\": true}, {\"check\": \"control 4\", \"actual\": {\"months_paid\": 3, \"total_interest\": 0, \"final_payment\": 56666, \"payments\": [1667]}, \"expected\": {\"months_paid\": 3, \"total_interest\": 0, \"final_payment\": 56666, \"payments\": [1667]}, \"passed\": true}], \"passed\": false}\n"},"broken":{"elapsed_ms":47.974,"exit_code":1,"observations":[{"actual":{"final_payment":0,"months_paid":3,"payments":[10000],"total_interest":0},"check":"regression: balance plus interest exactly one payment","expected":{"final_payment":10000,"months_paid":3,"payments":[10000],"total_interest":0},"passed":false},{"actual":{"final_payment":0,"months_paid":16,"payments":[2500],"total_interest":0},"check":"regression: payoff month test","expected":{"final_payment":2500,"months_paid":16,"payments":[2500],"total_interest":0},"passed":false},{"actual":{"final_payment":2100,"months_paid":24,"payments":[2824,2753,2099],"total_interest":7480},"check":"regression: payoff month test, partial-repair probe","expected":{"final_payment":2100,"months_paid":24,"payments":[2824,2753,2099],"total_interest":7480},"passed":true},{"actual":{"final_payment":41663,"months_paid":12,"payments":[1667],"total_interest":0},"check":"control 1","expected":{"final_payment":41663,"months_paid":12,"payments":[1667],"total_interest":0},"passed":true},{"actual":{"final_payment":5464,"months_paid":8,"payments":[5164,1104],"total_interest":1612},"check":"control 2","expected":{"final_payment":5464,"months_paid":8,"payments":[5164,1104],"total_interest":1612},"passed":true},{"actual":{"final_payment":6130,"months_paid":31,"payments":[1993,1115,1048],"total_interest":8690},"check":"control 3","expected":{"final_payment":6130,"months_paid":31,"payments":[1993,1115,1048],"total_interest":8690},"passed":true},{"actual":{"final_payment":56666,"months_paid":3,"payments":[1667],"total_interest":0},"check":"control 4","expected":{"final_payment":56666,"months_paid":3,"payments":[1667],"total_interest":0},"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression: balance plus interest exactly one payment\", \"actual\": {\"months_paid\": 3, \"total_interest\": 0, \"final_payment\": 0, \"payments\": [10000]}, \"expected\": {\"months_paid\": 3, \"total_interest\": 0, \"final_payment\": 10000, \"payments\": [10000]}, \"passed\": false}, {\"check\": \"regression: payoff month test\", \"actual\": {\"months_paid\": 16, \"total_interest\": 0, \"final_payment\": 0, \"payments\": [2500]}, \"expected\": {\"months_paid\": 16, \"total_interest\": 0, \"final_payment\": 2500, \"payments\": [2500]}, \"passed\": false}, {\"check\": \"regression: payoff month test, partial-repair probe\", \"actual\": {\"months_paid\": 24, \"total_interest\": 7480, \"final_payment\": 2100, \"payments\": [2824, 2753, 2099]}, \"expected\": {\"months_paid\": 24, \"total_interest\": 7480, \"final_payment\": 2100, \"payments\": [2824, 2753, 2099]}, \"passed\": true}, {\"check\": \"control 1\", \"actual\": {\"months_paid\": 12, \"total_interest\": 0, \"final_payment\": 41663, \"payments\": [1667]}, \"expected\": {\"months_paid\": 12, \"total_interest\": 0, \"final_payment\": 41663, \"payments\": [1667]}, \"passed\": true}, {\"check\": \"control 2\", \"actual\": {\"months_paid\": 8, \"total_interest\": 1612, \"final_payment\": 5464, \"payments\": [5164, 1104]}, \"expected\": {\"months_paid\": 8, \"total_interest\": 1612, \"final_payment\": 5464, \"payments\": [5164, 1104]}, \"passed\": true}, {\"check\": \"control 3\", \"actual\": {\"months_paid\": 31, \"total_interest\": 8690, \"final_payment\": 6130, \"payments\": [1993, 1115, 1048]}, \"expected\": {\"months_paid\": 31, \"total_interest\": 8690, \"final_payment\": 6130, \"payments\": [1993, 1115, 1048]}, \"passed\": true}, {\"check\": \"control 4\", \"actual\": {\"months_paid\": 3, \"total_interest\": 0, \"final_payment\": 56666, \"payments\": [1667]}, \"expected\": {\"months_paid\": 3, \"total_interest\": 0, \"final_payment\": 56666, \"payments\": [1667]}, \"passed\": true}], \"passed\": false}\n"},"fixed":{"elapsed_ms":46.253,"exit_code":0,"observations":[{"actual":{"final_payment":10000,"months_paid":3,"payments":[10000],"total_interest":0},"check":"regression: balance plus interest exactly one payment","expected":{"final_payment":10000,"months_paid":3,"payments":[10000],"total_interest":0},"passed":true},{"actual":{"final_payment":2500,"months_paid":16,"payments":[2500],"total_interest":0},"check":"regression: payoff month test","expected":{"final_payment":2500,"months_paid":16,"payments":[2500],"total_interest":0},"passed":true},{"actual":{"final_payment":2100,"months_paid":24,"payments":[2824,2753,2099],"total_interest":7480},"check":"regression: payoff month test, partial-repair probe","expected":{"final_payment":2100,"months_paid":24,"payments":[2824,2753,2099],"total_interest":7480},"passed":true},{"actual":{"final_payment":41663,"months_paid":12,"payments":[1667],"total_interest":0},"check":"control 1","expected":{"final_payment":41663,"months_paid":12,"payments":[1667],"total_interest":0},"passed":true},{"actual":{"final_payment":5464,"months_paid":8,"payments":[5164,1104],"total_interest":1612},"check":"control 2","expected":{"final_payment":5464,"months_paid":8,"payments":[5164,1104],"total_interest":1612},"passed":true},{"actual":{"final_payment":6130,"months_paid":31,"payments":[1993,1115,1048],"total_interest":8690},"check":"control 3","expected":{"final_payment":6130,"months_paid":31,"payments":[1993,1115,1048],"total_interest":8690},"passed":true},{"actual":{"final_payment":56666,"months_paid":3,"payments":[1667],"total_interest":0},"check":"control 4","expected":{"final_payment":56666,"months_paid":3,"payments":[1667],"total_interest":0},"passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression: balance plus interest exactly one payment\", \"actual\": {\"months_paid\": 3, \"total_interest\": 0, \"final_payment\": 10000, \"payments\": [10000]}, \"expected\": {\"months_paid\": 3, \"total_interest\": 0, \"final_payment\": 10000, \"payments\": [10000]}, \"passed\": true}, {\"check\": \"regression: payoff month test\", \"actual\": {\"months_paid\": 16, \"total_interest\": 0, \"final_payment\": 2500, \"payments\": [2500]}, \"expected\": {\"months_paid\": 16, \"total_interest\": 0, \"final_payment\": 2500, \"payments\": [2500]}, \"passed\": true}, {\"check\": \"regression: payoff month test, partial-repair probe\", \"actual\": {\"months_paid\": 24, \"total_interest\": 7480, \"final_payment\": 2100, \"payments\": [2824, 2753, 2099]}, \"expected\": {\"months_paid\": 24, \"total_interest\": 7480, \"final_payment\": 2100, \"payments\": [2824, 2753, 2099]}, \"passed\": true}, {\"check\": \"control 1\", \"actual\": {\"months_paid\": 12, \"total_interest\": 0, \"final_payment\": 41663, \"payments\": [1667]}, \"expected\": {\"months_paid\": 12, \"total_interest\": 0, \"final_payment\": 41663, \"payments\": [1667]}, \"passed\": true}, {\"check\": \"control 2\", \"actual\": {\"months_paid\": 8, \"total_interest\": 1612, \"final_payment\": 5464, \"payments\": [5164, 1104]}, \"expected\": {\"months_paid\": 8, \"total_interest\": 1612, \"final_payment\": 5464, \"payments\": [5164, 1104]}, \"passed\": true}, {\"check\": \"control 3\", \"actual\": {\"months_paid\": 31, \"total_interest\": 8690, \"final_payment\": 6130, \"payments\": [1993, 1115, 1048]}, \"expected\": {\"months_paid\": 31, \"total_interest\": 8690, \"final_payment\": 6130, \"payments\": [1993, 1115, 1048]}, \"passed\": true}, {\"check\": \"control 4\", \"actual\": {\"months_paid\": 3, \"total_interest\": 0, \"final_payment\": 56666, \"payments\": [1667]}, \"expected\": {\"months_paid\": 3, \"total_interest\": 0, \"final_payment\": 56666, \"payments\": [1667]}, \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}