{"abstract":"Capitalized forbearance payments jump because the term was not extended.","category":"Loan amortization schedules","checks":7,"contract":"x = {'principal', 'rate_bp', 'months' n, 'forbear': [start_month, count], 'mode': 'capitalize'|'defer'}. Months before start_month are paid with the level payment (exact annuity, half-up, interest round_half_up(balance*bp/120000)). During the count forbearance months interest accrues on the unchanged balance, rounded monthly, without compounding. The remaining payment count n - (start - 1) is preserved (term extended). capitalize: accrued interest is added to the balance and the payment re-leveled over the remaining count; defer: accrued interest goes to a non-interest bucket and the payment is unchanged. Return {'balance', 'deferred', 'payment'}.","evaluation_group":"w2-loan-amortization-schedules-forbearance-capitalize-or-defer","failed_approach":"n - start drops one remaining payment.","family":"w2-loan-amortization-schedules-forbearance-capitalize-or-defer-extended-remaining-term","id":"FA-58721","implementations":{"attempt":{"sha256":"a202e4e7e56055aca93f61f4d09cfae94efedbe0521e834fdc9adde39d9ebebe","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    P = x['principal']\n    pay = level(P, n)\n    bal = P\n    start, count = x['forbear']\n    for k in range(1, start):\n        interest = rnd(bal * bp, 120000)\n        bal -= pay - interest\n    acc = 0\n    for k in range(count):\n        acc += rnd(bal * bp, 120000)\n    remaining = n - start\n    if x['mode'] == 'capitalize':\n        bal += acc\n        new_pay = level(bal, remaining)\n        deferred = 0\n    else:\n        deferred = acc\n        new_pay = pay\n    return {'balance': bal, 'deferred': deferred, 'payment': new_pay}\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['regression: extended remaining term', {'principal': 100000, 'rate_bp': 1200, 'months': 24, 'forbear': [2, 6], 'mode': 'capitalize'}, {'balance': 102071, 'deferred': 0, 'payment': 4990}], ['control 1', {'principal': 100000, 'rate_bp': 0, 'months': 24, 'forbear': [1, 3], 'mode': 'defer'}, {'balance': 100000, 'deferred': 0, 'payment': 4167}], ['control 2', {'principal': 250000, 'rate_bp': 1200, 'months': 12, 'forbear': [2, 6], 'mode': 'defer'}, {'balance': 230288, 'deferred': 13818, 'payment': 22212}], ['control 3', {'principal': 100000, 'rate_bp': 1200, 'months': 12, 'forbear': [2, 1], 'mode': 'defer'}, {'balance': 92115, 'deferred': 921, 'payment': 8885}], ['control 4', {'principal': 250000, 'rate_bp': 0, 'months': 24, 'forbear': [6, 6], 'mode': 'defer'}, {'balance': 197915, 'deferred': 0, 'payment': 10417}], ['control 5', {'principal': 100000, 'rate_bp': 0, 'months': 12, 'forbear': [12, 3], 'mode': 'defer'}, {'balance': 8337, 'deferred': 0, 'payment': 8333}], ['control 6', {'principal': 1000000, 'rate_bp': 600, 'months': 60, 'forbear': [12, 6], 'mode': 'defer'}, {'balance': 838336, 'deferred': 25152, 'payment': 19333}]], [['regression: extended remaining term', {'principal': 250000, 'rate_bp': 1200, 'months': 12, 'forbear': [12, 6], 'mode': 'capitalize'}, {'balance': 23316, 'deferred': 0, 'payment': 23549}], ['control 1', {'principal': 1000000, 'rate_bp': 600, 'months': 24, 'forbear': [6, 6], 'mode': 'defer'}, {'balance': 801419, 'deferred': 24042, 'payment': 44321}], ['control 2', {'principal': 100000, 'rate_bp': 0, 'months': 60, 'forbear': [1, 1], 'mode': 'defer'}, {'balance': 100000, 'deferred': 0, 'payment': 1667}], ['control 3', {'principal': 250000, 'rate_bp': 600, 'months': 12, 'forbear': [12, 1], 'mode': 'defer'}, {'balance': 21406, 'deferred': 107, 'payment': 21517}], ['control 4', {'principal': 100000, 'rate_bp': 0, 'months': 60, 'forbear': [6, 6], 'mode': 'defer'}, {'balance': 91665, 'deferred': 0, 'payment': 1667}], ['control 5', {'principal': 250000, 'rate_bp': 600, 'months': 60, 'forbear': [6, 1], 'mode': 'defer'}, {'balance': 231905, 'deferred': 1160, 'payment': 4833}], ['control 6', {'principal': 250000, 'rate_bp': 600, 'months': 24, 'forbear': [2, 3], 'mode': 'defer'}, {'balance': 240170, 'deferred': 3603, 'payment': 11080}]], [['regression: extended remaining term', {'principal': 1000000, 'rate_bp': 600, 'months': 24, 'forbear': [2, 3], 'mode': 'capitalize'}, {'balance': 975088, 'deferred': 0, 'payment': 44985}], ['control 1', {'principal': 100000, 'rate_bp': 0, 'months': 60, 'forbear': [1, 6], 'mode': 'defer'}, {'balance': 100000, 'deferred': 0, 'payment': 1667}], ['control 2', {'principal': 250000, 'rate_bp': 1200, 'months': 24, 'forbear': [12, 3], 'mode': 'defer'}, {'balance': 142798, 'deferred': 4284, 'payment': 11768}], ['control 3', {'principal': 1000000, 'rate_bp': 600, 'months': 24, 'forbear': [6, 1], 'mode': 'defer'}, {'balance': 801419, 'deferred': 4007, 'payment': 44321}], ['control 4', {'principal': 1000000, 'rate_bp': 600, 'months': 12, 'forbear': [12, 3], 'mode': 'defer'}, {'balance': 85642, 'deferred': 1284, 'payment': 86066}], ['control 5', {'principal': 250000, 'rate_bp': 0, 'months': 24, 'forbear': [2, 3], 'mode': 'defer'}, {'balance': 239583, 'deferred': 0, 'payment': 10417}], ['control 6', {'principal': 250000, 'rate_bp': 1200, 'months': 60, 'forbear': [1, 6], 'mode': 'defer'}, {'balance': 250000, 'deferred': 15000, 'payment': 5561}]], [['regression: extended remaining term', {'principal': 250000, 'rate_bp': 600, 'months': 60, 'forbear': [6, 3], 'mode': 'capitalize'}, {'balance': 235385, 'deferred': 0, 'payment': 4906}], ['control 1', {'principal': 250000, 'rate_bp': 600, 'months': 12, 'forbear': [1, 1], 'mode': 'defer'}, {'balance': 250000, 'deferred': 1250, 'payment': 21517}], ['control 2', {'principal': 1000000, 'rate_bp': 1200, 'months': 24, 'forbear': [2, 6], 'mode': 'defer'}, {'balance': 962927, 'deferred': 57774, 'payment': 47073}], ['control 3', {'principal': 100000, 'rate_bp': 0, 'months': 12, 'forbear': [12, 6], 'mode': 'defer'}, {'balance': 8337, 'deferred': 0, 'payment': 8333}], ['control 4', {'principal': 100000, 'rate_bp': 600, 'months': 60, 'forbear': [12, 3], 'mode': 'defer'}, {'balance': 83837, 'deferred': 1257, 'payment': 1933}], ['control 5', {'principal': 1000000, 'rate_bp': 600, 'months': 60, 'forbear': [6, 1], 'mode': 'defer'}, {'balance': 927614, 'deferred': 4638, 'payment': 19333}], ['control 6', {'principal': 100000, 'rate_bp': 600, 'months': 24, 'forbear': [2, 1], 'mode': 'defer'}, {'balance': 96068, 'deferred': 480, 'payment': 4432}]], [['regression: extended remaining term', {'principal': 100000, 'rate_bp': 0, 'months': 60, 'forbear': [2, 3], 'mode': 'capitalize'}, {'balance': 98333, 'deferred': 0, 'payment': 1667}], ['control 1', {'principal': 1000000, 'rate_bp': 0, 'months': 60, 'forbear': [1, 6], 'mode': 'defer'}, {'balance': 1000000, 'deferred': 0, 'payment': 16667}], ['control 2', {'principal': 100000, 'rate_bp': 600, 'months': 60, 'forbear': [12, 3], 'mode': 'defer'}, {'balance': 83837, 'deferred': 1257, 'payment': 1933}], ['control 3', {'principal': 100000, 'rate_bp': 600, 'months': 12, 'forbear': [6, 3], 'mode': 'defer'}, {'balance': 59058, 'deferred': 885, 'payment': 8607}], ['control 4', {'principal': 1000000, 'rate_bp': 600, 'months': 12, 'forbear': [2, 1], 'mode': 'defer'}, {'balance': 918934, 'deferred': 4595, 'payment': 86066}], ['control 5', {'principal': 100000, 'rate_bp': 600, 'months': 12, 'forbear': [12, 1], 'mode': 'defer'}, {'balance': 8560, 'deferred': 43, 'payment': 8607}], ['control 6', {'principal': 250000, 'rate_bp': 1200, 'months': 12, 'forbear': [12, 3], 'mode': 'defer'}, {'balance': 21996, 'deferred': 660, 'payment': 22212}]]]\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":"ab4122decc69c3b12dd31999acd5c5135a54a91cfaf0a2302e4b62a5675920fc","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    P = x['principal']\n    pay = level(P, n)\n    bal = P\n    start, count = x['forbear']\n    for k in range(1, start):\n        interest = rnd(bal * bp, 120000)\n        bal -= pay - interest\n    acc = 0\n    for k in range(count):\n        acc += rnd(bal * bp, 120000)\n    remaining = n - (start - 1) - count\n    if x['mode'] == 'capitalize':\n        bal += acc\n        new_pay = level(bal, remaining)\n        deferred = 0\n    else:\n        deferred = acc\n        new_pay = pay\n    return {'balance': bal, 'deferred': deferred, 'payment': new_pay}\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['regression: extended remaining term', {'principal': 100000, 'rate_bp': 1200, 'months': 24, 'forbear': [2, 6], 'mode': 'capitalize'}, {'balance': 102071, 'deferred': 0, 'payment': 4990}], ['control 1', {'principal': 100000, 'rate_bp': 0, 'months': 24, 'forbear': [1, 3], 'mode': 'defer'}, {'balance': 100000, 'deferred': 0, 'payment': 4167}], ['control 2', {'principal': 250000, 'rate_bp': 1200, 'months': 12, 'forbear': [2, 6], 'mode': 'defer'}, {'balance': 230288, 'deferred': 13818, 'payment': 22212}], ['control 3', {'principal': 100000, 'rate_bp': 1200, 'months': 12, 'forbear': [2, 1], 'mode': 'defer'}, {'balance': 92115, 'deferred': 921, 'payment': 8885}], ['control 4', {'principal': 250000, 'rate_bp': 0, 'months': 24, 'forbear': [6, 6], 'mode': 'defer'}, {'balance': 197915, 'deferred': 0, 'payment': 10417}], ['control 5', {'principal': 100000, 'rate_bp': 0, 'months': 12, 'forbear': [12, 3], 'mode': 'defer'}, {'balance': 8337, 'deferred': 0, 'payment': 8333}], ['control 6', {'principal': 1000000, 'rate_bp': 600, 'months': 60, 'forbear': [12, 6], 'mode': 'defer'}, {'balance': 838336, 'deferred': 25152, 'payment': 19333}]], [['regression: extended remaining term', {'principal': 250000, 'rate_bp': 1200, 'months': 12, 'forbear': [12, 6], 'mode': 'capitalize'}, {'balance': 23316, 'deferred': 0, 'payment': 23549}], ['control 1', {'principal': 1000000, 'rate_bp': 600, 'months': 24, 'forbear': [6, 6], 'mode': 'defer'}, {'balance': 801419, 'deferred': 24042, 'payment': 44321}], ['control 2', {'principal': 100000, 'rate_bp': 0, 'months': 60, 'forbear': [1, 1], 'mode': 'defer'}, {'balance': 100000, 'deferred': 0, 'payment': 1667}], ['control 3', {'principal': 250000, 'rate_bp': 600, 'months': 12, 'forbear': [12, 1], 'mode': 'defer'}, {'balance': 21406, 'deferred': 107, 'payment': 21517}], ['control 4', {'principal': 100000, 'rate_bp': 0, 'months': 60, 'forbear': [6, 6], 'mode': 'defer'}, {'balance': 91665, 'deferred': 0, 'payment': 1667}], ['control 5', {'principal': 250000, 'rate_bp': 600, 'months': 60, 'forbear': [6, 1], 'mode': 'defer'}, {'balance': 231905, 'deferred': 1160, 'payment': 4833}], ['control 6', {'principal': 250000, 'rate_bp': 600, 'months': 24, 'forbear': [2, 3], 'mode': 'defer'}, {'balance': 240170, 'deferred': 3603, 'payment': 11080}]], [['regression: extended remaining term', {'principal': 1000000, 'rate_bp': 600, 'months': 24, 'forbear': [2, 3], 'mode': 'capitalize'}, {'balance': 975088, 'deferred': 0, 'payment': 44985}], ['control 1', {'principal': 100000, 'rate_bp': 0, 'months': 60, 'forbear': [1, 6], 'mode': 'defer'}, {'balance': 100000, 'deferred': 0, 'payment': 1667}], ['control 2', {'principal': 250000, 'rate_bp': 1200, 'months': 24, 'forbear': [12, 3], 'mode': 'defer'}, {'balance': 142798, 'deferred': 4284, 'payment': 11768}], ['control 3', {'principal': 1000000, 'rate_bp': 600, 'months': 24, 'forbear': [6, 1], 'mode': 'defer'}, {'balance': 801419, 'deferred': 4007, 'payment': 44321}], ['control 4', {'principal': 1000000, 'rate_bp': 600, 'months': 12, 'forbear': [12, 3], 'mode': 'defer'}, {'balance': 85642, 'deferred': 1284, 'payment': 86066}], ['control 5', {'principal': 250000, 'rate_bp': 0, 'months': 24, 'forbear': [2, 3], 'mode': 'defer'}, {'balance': 239583, 'deferred': 0, 'payment': 10417}], ['control 6', {'principal': 250000, 'rate_bp': 1200, 'months': 60, 'forbear': [1, 6], 'mode': 'defer'}, {'balance': 250000, 'deferred': 15000, 'payment': 5561}]], [['regression: extended remaining term', {'principal': 250000, 'rate_bp': 600, 'months': 60, 'forbear': [6, 3], 'mode': 'capitalize'}, {'balance': 235385, 'deferred': 0, 'payment': 4906}], ['control 1', {'principal': 250000, 'rate_bp': 600, 'months': 12, 'forbear': [1, 1], 'mode': 'defer'}, {'balance': 250000, 'deferred': 1250, 'payment': 21517}], ['control 2', {'principal': 1000000, 'rate_bp': 1200, 'months': 24, 'forbear': [2, 6], 'mode': 'defer'}, {'balance': 962927, 'deferred': 57774, 'payment': 47073}], ['control 3', {'principal': 100000, 'rate_bp': 0, 'months': 12, 'forbear': [12, 6], 'mode': 'defer'}, {'balance': 8337, 'deferred': 0, 'payment': 8333}], ['control 4', {'principal': 100000, 'rate_bp': 600, 'months': 60, 'forbear': [12, 3], 'mode': 'defer'}, {'balance': 83837, 'deferred': 1257, 'payment': 1933}], ['control 5', {'principal': 1000000, 'rate_bp': 600, 'months': 60, 'forbear': [6, 1], 'mode': 'defer'}, {'balance': 927614, 'deferred': 4638, 'payment': 19333}], ['control 6', {'principal': 100000, 'rate_bp': 600, 'months': 24, 'forbear': [2, 1], 'mode': 'defer'}, {'balance': 96068, 'deferred': 480, 'payment': 4432}]], [['regression: extended remaining term', {'principal': 100000, 'rate_bp': 0, 'months': 60, 'forbear': [2, 3], 'mode': 'capitalize'}, {'balance': 98333, 'deferred': 0, 'payment': 1667}], ['control 1', {'principal': 1000000, 'rate_bp': 0, 'months': 60, 'forbear': [1, 6], 'mode': 'defer'}, {'balance': 1000000, 'deferred': 0, 'payment': 16667}], ['control 2', {'principal': 100000, 'rate_bp': 600, 'months': 60, 'forbear': [12, 3], 'mode': 'defer'}, {'balance': 83837, 'deferred': 1257, 'payment': 1933}], ['control 3', {'principal': 100000, 'rate_bp': 600, 'months': 12, 'forbear': [6, 3], 'mode': 'defer'}, {'balance': 59058, 'deferred': 885, 'payment': 8607}], ['control 4', {'principal': 1000000, 'rate_bp': 600, 'months': 12, 'forbear': [2, 1], 'mode': 'defer'}, {'balance': 918934, 'deferred': 4595, 'payment': 86066}], ['control 5', {'principal': 100000, 'rate_bp': 600, 'months': 12, 'forbear': [12, 1], 'mode': 'defer'}, {'balance': 8560, 'deferred': 43, 'payment': 8607}], ['control 6', {'principal': 250000, 'rate_bp': 1200, 'months': 12, 'forbear': [12, 3], 'mode': 'defer'}, {'balance': 21996, 'deferred': 660, 'payment': 22212}]]]\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":"34a0634bd599e34fecec42e35d457bffacaad3260e58c866c5ea1b1fa743f746","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    P = x['principal']\n    pay = level(P, n)\n    bal = P\n    start, count = x['forbear']\n    for k in range(1, start):\n        interest = rnd(bal * bp, 120000)\n        bal -= pay - interest\n    acc = 0\n    for k in range(count):\n        acc += rnd(bal * bp, 120000)\n    remaining = n - (start - 1)\n    if x['mode'] == 'capitalize':\n        bal += acc\n        new_pay = level(bal, remaining)\n        deferred = 0\n    else:\n        deferred = acc\n        new_pay = pay\n    return {'balance': bal, 'deferred': deferred, 'payment': new_pay}\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['regression: extended remaining term', {'principal': 100000, 'rate_bp': 1200, 'months': 24, 'forbear': [2, 6], 'mode': 'capitalize'}, {'balance': 102071, 'deferred': 0, 'payment': 4990}], ['control 1', {'principal': 100000, 'rate_bp': 0, 'months': 24, 'forbear': [1, 3], 'mode': 'defer'}, {'balance': 100000, 'deferred': 0, 'payment': 4167}], ['control 2', {'principal': 250000, 'rate_bp': 1200, 'months': 12, 'forbear': [2, 6], 'mode': 'defer'}, {'balance': 230288, 'deferred': 13818, 'payment': 22212}], ['control 3', {'principal': 100000, 'rate_bp': 1200, 'months': 12, 'forbear': [2, 1], 'mode': 'defer'}, {'balance': 92115, 'deferred': 921, 'payment': 8885}], ['control 4', {'principal': 250000, 'rate_bp': 0, 'months': 24, 'forbear': [6, 6], 'mode': 'defer'}, {'balance': 197915, 'deferred': 0, 'payment': 10417}], ['control 5', {'principal': 100000, 'rate_bp': 0, 'months': 12, 'forbear': [12, 3], 'mode': 'defer'}, {'balance': 8337, 'deferred': 0, 'payment': 8333}], ['control 6', {'principal': 1000000, 'rate_bp': 600, 'months': 60, 'forbear': [12, 6], 'mode': 'defer'}, {'balance': 838336, 'deferred': 25152, 'payment': 19333}]], [['regression: extended remaining term', {'principal': 250000, 'rate_bp': 1200, 'months': 12, 'forbear': [12, 6], 'mode': 'capitalize'}, {'balance': 23316, 'deferred': 0, 'payment': 23549}], ['control 1', {'principal': 1000000, 'rate_bp': 600, 'months': 24, 'forbear': [6, 6], 'mode': 'defer'}, {'balance': 801419, 'deferred': 24042, 'payment': 44321}], ['control 2', {'principal': 100000, 'rate_bp': 0, 'months': 60, 'forbear': [1, 1], 'mode': 'defer'}, {'balance': 100000, 'deferred': 0, 'payment': 1667}], ['control 3', {'principal': 250000, 'rate_bp': 600, 'months': 12, 'forbear': [12, 1], 'mode': 'defer'}, {'balance': 21406, 'deferred': 107, 'payment': 21517}], ['control 4', {'principal': 100000, 'rate_bp': 0, 'months': 60, 'forbear': [6, 6], 'mode': 'defer'}, {'balance': 91665, 'deferred': 0, 'payment': 1667}], ['control 5', {'principal': 250000, 'rate_bp': 600, 'months': 60, 'forbear': [6, 1], 'mode': 'defer'}, {'balance': 231905, 'deferred': 1160, 'payment': 4833}], ['control 6', {'principal': 250000, 'rate_bp': 600, 'months': 24, 'forbear': [2, 3], 'mode': 'defer'}, {'balance': 240170, 'deferred': 3603, 'payment': 11080}]], [['regression: extended remaining term', {'principal': 1000000, 'rate_bp': 600, 'months': 24, 'forbear': [2, 3], 'mode': 'capitalize'}, {'balance': 975088, 'deferred': 0, 'payment': 44985}], ['control 1', {'principal': 100000, 'rate_bp': 0, 'months': 60, 'forbear': [1, 6], 'mode': 'defer'}, {'balance': 100000, 'deferred': 0, 'payment': 1667}], ['control 2', {'principal': 250000, 'rate_bp': 1200, 'months': 24, 'forbear': [12, 3], 'mode': 'defer'}, {'balance': 142798, 'deferred': 4284, 'payment': 11768}], ['control 3', {'principal': 1000000, 'rate_bp': 600, 'months': 24, 'forbear': [6, 1], 'mode': 'defer'}, {'balance': 801419, 'deferred': 4007, 'payment': 44321}], ['control 4', {'principal': 1000000, 'rate_bp': 600, 'months': 12, 'forbear': [12, 3], 'mode': 'defer'}, {'balance': 85642, 'deferred': 1284, 'payment': 86066}], ['control 5', {'principal': 250000, 'rate_bp': 0, 'months': 24, 'forbear': [2, 3], 'mode': 'defer'}, {'balance': 239583, 'deferred': 0, 'payment': 10417}], ['control 6', {'principal': 250000, 'rate_bp': 1200, 'months': 60, 'forbear': [1, 6], 'mode': 'defer'}, {'balance': 250000, 'deferred': 15000, 'payment': 5561}]], [['regression: extended remaining term', {'principal': 250000, 'rate_bp': 600, 'months': 60, 'forbear': [6, 3], 'mode': 'capitalize'}, {'balance': 235385, 'deferred': 0, 'payment': 4906}], ['control 1', {'principal': 250000, 'rate_bp': 600, 'months': 12, 'forbear': [1, 1], 'mode': 'defer'}, {'balance': 250000, 'deferred': 1250, 'payment': 21517}], ['control 2', {'principal': 1000000, 'rate_bp': 1200, 'months': 24, 'forbear': [2, 6], 'mode': 'defer'}, {'balance': 962927, 'deferred': 57774, 'payment': 47073}], ['control 3', {'principal': 100000, 'rate_bp': 0, 'months': 12, 'forbear': [12, 6], 'mode': 'defer'}, {'balance': 8337, 'deferred': 0, 'payment': 8333}], ['control 4', {'principal': 100000, 'rate_bp': 600, 'months': 60, 'forbear': [12, 3], 'mode': 'defer'}, {'balance': 83837, 'deferred': 1257, 'payment': 1933}], ['control 5', {'principal': 1000000, 'rate_bp': 600, 'months': 60, 'forbear': [6, 1], 'mode': 'defer'}, {'balance': 927614, 'deferred': 4638, 'payment': 19333}], ['control 6', {'principal': 100000, 'rate_bp': 600, 'months': 24, 'forbear': [2, 1], 'mode': 'defer'}, {'balance': 96068, 'deferred': 480, 'payment': 4432}]], [['regression: extended remaining term', {'principal': 100000, 'rate_bp': 0, 'months': 60, 'forbear': [2, 3], 'mode': 'capitalize'}, {'balance': 98333, 'deferred': 0, 'payment': 1667}], ['control 1', {'principal': 1000000, 'rate_bp': 0, 'months': 60, 'forbear': [1, 6], 'mode': 'defer'}, {'balance': 1000000, 'deferred': 0, 'payment': 16667}], ['control 2', {'principal': 100000, 'rate_bp': 600, 'months': 60, 'forbear': [12, 3], 'mode': 'defer'}, {'balance': 83837, 'deferred': 1257, 'payment': 1933}], ['control 3', {'principal': 100000, 'rate_bp': 600, 'months': 12, 'forbear': [6, 3], 'mode': 'defer'}, {'balance': 59058, 'deferred': 885, 'payment': 8607}], ['control 4', {'principal': 1000000, 'rate_bp': 600, 'months': 12, 'forbear': [2, 1], 'mode': 'defer'}, {'balance': 918934, 'deferred': 4595, 'payment': 86066}], ['control 5', {'principal': 100000, 'rate_bp': 600, 'months': 12, 'forbear': [12, 1], 'mode': 'defer'}, {'balance': 8560, 'deferred': 43, 'payment': 8607}], ['control 6', {'principal': 250000, 'rate_bp': 1200, 'months': 12, 'forbear': [12, 3], 'mode': 'defer'}, {'balance': 21996, 'deferred': 660, 'payment': 22212}]]]\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-forbearance-capitalize-or-defer-extended-remaining-term","generated_at":"2026-09-29T14:46:29.398125+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":"Preserve the n - (start - 1) remaining payments.","root_cause":"Forbearance months are subtracted from the remaining payment count.","sha256":"3b90479ec447f3af4ccdd612ff7bb7f1cd443c2a11af2d8ac4c22b28769cfa27","title":"Forbearance capitalization or deferral: extended remaining term · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":44.965,"exit_code":1,"observations":[{"actual":{"balance":102071,"deferred":0,"payment":5192},"check":"regression: extended remaining term","expected":{"balance":102071,"deferred":0,"payment":4990},"passed":false},{"actual":{"balance":100000,"deferred":0,"payment":4167},"check":"control 1","expected":{"balance":100000,"deferred":0,"payment":4167},"passed":true},{"actual":{"balance":230288,"deferred":13818,"payment":22212},"check":"control 2","expected":{"balance":230288,"deferred":13818,"payment":22212},"passed":true},{"actual":{"balance":92115,"deferred":921,"payment":8885},"check":"control 3","expected":{"balance":92115,"deferred":921,"payment":8885},"passed":true},{"actual":{"balance":197915,"deferred":0,"payment":10417},"check":"control 4","expected":{"balance":197915,"deferred":0,"payment":10417},"passed":true},{"actual":{"balance":8337,"deferred":0,"payment":8333},"check":"control 5","expected":{"balance":8337,"deferred":0,"payment":8333},"passed":true},{"actual":{"balance":838336,"deferred":25152,"payment":19333},"check":"control 6","expected":{"balance":838336,"deferred":25152,"payment":19333},"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression: extended remaining term\", \"actual\": {\"balance\": 102071, \"deferred\": 0, \"payment\": 5192}, \"expected\": {\"balance\": 102071, \"deferred\": 0, \"payment\": 4990}, \"passed\": false}, {\"check\": \"control 1\", \"actual\": {\"balance\": 100000, \"deferred\": 0, \"payment\": 4167}, \"expected\": {\"balance\": 100000, \"deferred\": 0, \"payment\": 4167}, \"passed\": true}, {\"check\": \"control 2\", \"actual\": {\"balance\": 230288, \"deferred\": 13818, \"payment\": 22212}, \"expected\": {\"balance\": 230288, \"deferred\": 13818, \"payment\": 22212}, \"passed\": true}, {\"check\": \"control 3\", \"actual\": {\"balance\": 92115, \"deferred\": 921, \"payment\": 8885}, \"expected\": {\"balance\": 92115, \"deferred\": 921, \"payment\": 8885}, \"passed\": true}, {\"check\": \"control 4\", \"actual\": {\"balance\": 197915, \"deferred\": 0, \"payment\": 10417}, \"expected\": {\"balance\": 197915, \"deferred\": 0, \"payment\": 10417}, \"passed\": true}, {\"check\": \"control 5\", \"actual\": {\"balance\": 8337, \"deferred\": 0, \"payment\": 8333}, \"expected\": {\"balance\": 8337, \"deferred\": 0, \"payment\": 8333}, \"passed\": true}, {\"check\": \"control 6\", \"actual\": {\"balance\": 838336, \"deferred\": 25152, \"payment\": 19333}, \"expected\": {\"balance\": 838336, \"deferred\": 25152, \"payment\": 19333}, \"passed\": true}], \"passed\": false}\n"},"broken":{"elapsed_ms":43.077,"exit_code":1,"observations":[{"actual":{"balance":102071,"deferred":0,"payment":6559},"check":"regression: extended remaining term","expected":{"balance":102071,"deferred":0,"payment":4990},"passed":false},{"actual":{"balance":100000,"deferred":0,"payment":4167},"check":"control 1","expected":{"balance":100000,"deferred":0,"payment":4167},"passed":true},{"actual":{"balance":230288,"deferred":13818,"payment":22212},"check":"control 2","expected":{"balance":230288,"deferred":13818,"payment":22212},"passed":true},{"actual":{"balance":92115,"deferred":921,"payment":8885},"check":"control 3","expected":{"balance":92115,"deferred":921,"payment":8885},"passed":true},{"actual":{"balance":197915,"deferred":0,"payment":10417},"check":"control 4","expected":{"balance":197915,"deferred":0,"payment":10417},"passed":true},{"actual":{"balance":8337,"deferred":0,"payment":8333},"check":"control 5","expected":{"balance":8337,"deferred":0,"payment":8333},"passed":true},{"actual":{"balance":838336,"deferred":25152,"payment":19333},"check":"control 6","expected":{"balance":838336,"deferred":25152,"payment":19333},"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression: extended remaining term\", \"actual\": {\"balance\": 102071, \"deferred\": 0, \"payment\": 6559}, \"expected\": {\"balance\": 102071, \"deferred\": 0, \"payment\": 4990}, \"passed\": false}, {\"check\": \"control 1\", \"actual\": {\"balance\": 100000, \"deferred\": 0, \"payment\": 4167}, \"expected\": {\"balance\": 100000, \"deferred\": 0, \"payment\": 4167}, \"passed\": true}, {\"check\": \"control 2\", \"actual\": {\"balance\": 230288, \"deferred\": 13818, \"payment\": 22212}, \"expected\": {\"balance\": 230288, \"deferred\": 13818, \"payment\": 22212}, \"passed\": true}, {\"check\": \"control 3\", \"actual\": {\"balance\": 92115, \"deferred\": 921, \"payment\": 8885}, \"expected\": {\"balance\": 92115, \"deferred\": 921, \"payment\": 8885}, \"passed\": true}, {\"check\": \"control 4\", \"actual\": {\"balance\": 197915, \"deferred\": 0, \"payment\": 10417}, \"expected\": {\"balance\": 197915, \"deferred\": 0, \"payment\": 10417}, \"passed\": true}, {\"check\": \"control 5\", \"actual\": {\"balance\": 8337, \"deferred\": 0, \"payment\": 8333}, \"expected\": {\"balance\": 8337, \"deferred\": 0, \"payment\": 8333}, \"passed\": true}, {\"check\": \"control 6\", \"actual\": {\"balance\": 838336, \"deferred\": 25152, \"payment\": 19333}, \"expected\": {\"balance\": 838336, \"deferred\": 25152, \"payment\": 19333}, \"passed\": true}], \"passed\": false}\n"},"fixed":{"elapsed_ms":45.313,"exit_code":0,"observations":[{"actual":{"balance":102071,"deferred":0,"payment":4990},"check":"regression: extended remaining term","expected":{"balance":102071,"deferred":0,"payment":4990},"passed":true},{"actual":{"balance":100000,"deferred":0,"payment":4167},"check":"control 1","expected":{"balance":100000,"deferred":0,"payment":4167},"passed":true},{"actual":{"balance":230288,"deferred":13818,"payment":22212},"check":"control 2","expected":{"balance":230288,"deferred":13818,"payment":22212},"passed":true},{"actual":{"balance":92115,"deferred":921,"payment":8885},"check":"control 3","expected":{"balance":92115,"deferred":921,"payment":8885},"passed":true},{"actual":{"balance":197915,"deferred":0,"payment":10417},"check":"control 4","expected":{"balance":197915,"deferred":0,"payment":10417},"passed":true},{"actual":{"balance":8337,"deferred":0,"payment":8333},"check":"control 5","expected":{"balance":8337,"deferred":0,"payment":8333},"passed":true},{"actual":{"balance":838336,"deferred":25152,"payment":19333},"check":"control 6","expected":{"balance":838336,"deferred":25152,"payment":19333},"passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression: extended remaining term\", \"actual\": {\"balance\": 102071, \"deferred\": 0, \"payment\": 4990}, \"expected\": {\"balance\": 102071, \"deferred\": 0, \"payment\": 4990}, \"passed\": true}, {\"check\": \"control 1\", \"actual\": {\"balance\": 100000, \"deferred\": 0, \"payment\": 4167}, \"expected\": {\"balance\": 100000, \"deferred\": 0, \"payment\": 4167}, \"passed\": true}, {\"check\": \"control 2\", \"actual\": {\"balance\": 230288, \"deferred\": 13818, \"payment\": 22212}, \"expected\": {\"balance\": 230288, \"deferred\": 13818, \"payment\": 22212}, \"passed\": true}, {\"check\": \"control 3\", \"actual\": {\"balance\": 92115, \"deferred\": 921, \"payment\": 8885}, \"expected\": {\"balance\": 92115, \"deferred\": 921, \"payment\": 8885}, \"passed\": true}, {\"check\": \"control 4\", \"actual\": {\"balance\": 197915, \"deferred\": 0, \"payment\": 10417}, \"expected\": {\"balance\": 197915, \"deferred\": 0, \"payment\": 10417}, \"passed\": true}, {\"check\": \"control 5\", \"actual\": {\"balance\": 8337, \"deferred\": 0, \"payment\": 8333}, \"expected\": {\"balance\": 8337, \"deferred\": 0, \"payment\": 8333}, \"passed\": true}, {\"check\": \"control 6\", \"actual\": {\"balance\": 838336, \"deferred\": 25152, \"payment\": 19333}, \"expected\": {\"balance\": 838336, \"deferred\": 25152, \"payment\": 19333}, \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}