{"abstract":"The level payment is too large and the final payment turns out smaller than the rest.","category":"Loan amortization schedules","checks":7,"contract":"x = {'principal', 'rate_bp' (annual, monthly rate = bp/120000), 'months', 'round': 'nearest'|'up'}. The exact annuity payment P*r/(1-(1+r)^-n) (P/n at zero rate) is rounded half-up ('nearest') or up to the cent. Monthly interest is round_half_up(balance*bp/120000); months 1..n-1 pay the level payment and month n pays balance + interest. Return {'payment', 'final_payment', 'total_interest'}.","evaluation_group":"w2-loan-amortization-schedules-level-payment-and-final-adjustment","failed_approach":"Using n+1 periods understates the payment and leaves a large final payment.","family":"w2-loan-amortization-schedules-level-payment-and-final-adjustment-annuity-discount-exponent","id":"FA-58346","implementations":{"attempt":{"sha256":"038ee2a874d5d7a6a9ef87f499305e20c2a2327882c016c35bc3d60d36cc040c","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nimport math\nfrom fractions import Fraction\nN = 1\nobservations = []\ndef solve(x):\n    P = x['principal']\n    n = x['months']\n    bp = x['rate_bp']\n    if bp == 0:\n        exact = Fraction(P, n)\n    else:\n        r = Fraction(bp, 120000)\n        exact = P * r / (1 - (1 + r) ** -(n + 1))\n    if x['round'] == 'up':\n        pay = math.ceil(exact)\n    else:\n        pay = math.floor(exact + Fraction(1, 2))\n    bal = P\n    total_int = 0\n    last = 0\n    for k in range(1, n + 1):\n        q, rem = divmod(bal * bp, 120000)\n        interest = q + (1 if 2 * rem >= 120000 else 0)\n        total_int += interest\n        if k == n:\n            last = bal + interest\n        else:\n            bal = bal + interest - pay\n    return {'payment': pay, 'final_payment': last, 'total_interest': total_int}\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['regression: annuity discount exponent', {'principal': 1000000, 'rate_bp': 13, 'months': 36, 'round': 'up'}, {'payment': 27834, 'final_payment': 27808, 'total_interest': 1998}], ['control 1', {'principal': 7, 'rate_bp': 725, 'months': 360, 'round': 'up'}, {'payment': 1, 'final_payment': -1123, 'total_interest': -771}], ['control 2', {'principal': 999999, 'rate_bp': 0, 'months': 60, 'round': 'nearest'}, {'payment': 16667, 'final_payment': 16646, 'total_interest': 0}], ['control 3', {'principal': 30000000, 'rate_bp': 0, 'months': 36, 'round': 'up'}, {'payment': 833334, 'final_payment': 833310, 'total_interest': 0}], ['control 4', {'principal': 1000000, 'rate_bp': 0, 'months': 3, 'round': 'nearest'}, {'payment': 333333, 'final_payment': 333334, 'total_interest': 0}], ['control 5', {'principal': 100000, 'rate_bp': 0, 'months': 360, 'round': 'up'}, {'payment': 278, 'final_payment': 198, 'total_interest': 0}], ['control 6', {'principal': 500, 'rate_bp': 1999, 'months': 36, 'round': 'up'}, {'payment': 19, 'final_payment': -2, 'total_interest': 163}]], [['regression: annuity discount exponent', {'principal': 500, 'rate_bp': 13, 'months': 3, 'round': 'up'}, {'payment': 167, 'final_payment': 166, 'total_interest': 0}], ['control 1', {'principal': 7, 'rate_bp': 0, 'months': 60, 'round': 'nearest'}, {'payment': 0, 'final_payment': 7, 'total_interest': 0}], ['control 2', {'principal': 999999, 'rate_bp': 0, 'months': 3, 'round': 'nearest'}, {'payment': 333333, 'final_payment': 333333, 'total_interest': 0}], ['control 3', {'principal': 999999, 'rate_bp': 0, 'months': 36, 'round': 'nearest'}, {'payment': 27778, 'final_payment': 27769, 'total_interest': 0}], ['control 4', {'principal': 30000000, 'rate_bp': 0, 'months': 7, 'round': 'nearest'}, {'payment': 4285714, 'final_payment': 4285716, 'total_interest': 0}], ['control 5', {'principal': 100000, 'rate_bp': 0, 'months': 360, 'round': 'up'}, {'payment': 278, 'final_payment': 198, 'total_interest': 0}], ['control 6', {'principal': 500, 'rate_bp': 13, 'months': 360, 'round': 'up'}, {'payment': 2, 'final_payment': -218, 'total_interest': 0}]], [['regression: annuity discount exponent', {'principal': 100000, 'rate_bp': 1999, 'months': 3, 'round': 'nearest'}, {'payment': 34450, 'final_payment': 34450, 'total_interest': 3350}], ['control 1', {'principal': 999999, 'rate_bp': 0, 'months': 12, 'round': 'nearest'}, {'payment': 83333, 'final_payment': 83336, 'total_interest': 0}], ['control 2', {'principal': 12345, 'rate_bp': 0, 'months': 12, 'round': 'up'}, {'payment': 1029, 'final_payment': 1026, 'total_interest': 0}], ['control 3', {'principal': 1000000, 'rate_bp': 0, 'months': 360, 'round': 'up'}, {'payment': 2778, 'final_payment': 2698, 'total_interest': 0}], ['control 4', {'principal': 500, 'rate_bp': 0, 'months': 7, 'round': 'nearest'}, {'payment': 71, 'final_payment': 74, 'total_interest': 0}], ['control 5', {'principal': 999999, 'rate_bp': 0, 'months': 12, 'round': 'up'}, {'payment': 83334, 'final_payment': 83325, 'total_interest': 0}], ['control 6', {'principal': 7, 'rate_bp': 0, 'months': 3, 'round': 'up'}, {'payment': 3, 'final_payment': 1, 'total_interest': 0}]], [['regression: annuity discount exponent', {'principal': 1000000, 'rate_bp': 13, 'months': 60, 'round': 'up'}, {'payment': 16722, 'final_payment': 16710, 'total_interest': 3308}], ['control 1', {'principal': 7, 'rate_bp': 13, 'months': 12, 'round': 'up'}, {'payment': 1, 'final_payment': -4, 'total_interest': 0}], ['control 2', {'principal': 7, 'rate_bp': 725, 'months': 7, 'round': 'up'}, {'payment': 2, 'final_payment': -5, 'total_interest': 0}], ['control 3', {'principal': 7, 'rate_bp': 1999, 'months': 7, 'round': 'nearest'}, {'payment': 1, 'final_payment': 1, 'total_interest': 0}], ['control 4', {'principal': 30000000, 'rate_bp': 0, 'months': 360, 'round': 'nearest'}, {'payment': 83333, 'final_payment': 83453, 'total_interest': 0}], ['control 5', {'principal': 1000000, 'rate_bp': 0, 'months': 60, 'round': 'up'}, {'payment': 16667, 'final_payment': 16647, 'total_interest': 0}], ['control 6', {'principal': 30000000, 'rate_bp': 0, 'months': 12, 'round': 'up'}, {'payment': 2500000, 'final_payment': 2500000, 'total_interest': 0}]], [['regression: annuity discount exponent', {'principal': 30000000, 'rate_bp': 499, 'months': 2, 'round': 'nearest'}, {'payment': 15093627, 'final_payment': 15093627, 'total_interest': 187254}], ['control 1', {'principal': 999999, 'rate_bp': 0, 'months': 3, 'round': 'nearest'}, {'payment': 333333, 'final_payment': 333333, 'total_interest': 0}], ['control 2', {'principal': 500, 'rate_bp': 0, 'months': 2, 'round': 'up'}, {'payment': 250, 'final_payment': 250, 'total_interest': 0}], ['control 3', {'principal': 7, 'rate_bp': 600, 'months': 360, 'round': 'up'}, {'payment': 1, 'final_payment': -876, 'total_interest': -524}], ['control 4', {'principal': 7, 'rate_bp': 600, 'months': 60, 'round': 'nearest'}, {'payment': 0, 'final_payment': 7, 'total_interest': 0}], ['control 5', {'principal': 500, 'rate_bp': 13, 'months': 360, 'round': 'up'}, {'payment': 2, 'final_payment': -218, 'total_interest': 0}], ['control 6', {'principal': 500, 'rate_bp': 0, 'months': 12, 'round': 'up'}, {'payment': 42, 'final_payment': 38, 'total_interest': 0}]]]\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":"7b8951136b6e2bf683b9e67c5e59004caf0477f79b0d6a22dda7e868adfffdc6","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nimport math\nfrom fractions import Fraction\nN = 1\nobservations = []\ndef solve(x):\n    P = x['principal']\n    n = x['months']\n    bp = x['rate_bp']\n    if bp == 0:\n        exact = Fraction(P, n)\n    else:\n        r = Fraction(bp, 120000)\n        exact = P * r / (1 - (1 + r) ** -(n - 1))\n    if x['round'] == 'up':\n        pay = math.ceil(exact)\n    else:\n        pay = math.floor(exact + Fraction(1, 2))\n    bal = P\n    total_int = 0\n    last = 0\n    for k in range(1, n + 1):\n        q, rem = divmod(bal * bp, 120000)\n        interest = q + (1 if 2 * rem >= 120000 else 0)\n        total_int += interest\n        if k == n:\n            last = bal + interest\n        else:\n            bal = bal + interest - pay\n    return {'payment': pay, 'final_payment': last, 'total_interest': total_int}\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['regression: annuity discount exponent', {'principal': 1000000, 'rate_bp': 13, 'months': 36, 'round': 'up'}, {'payment': 27834, 'final_payment': 27808, 'total_interest': 1998}], ['control 1', {'principal': 7, 'rate_bp': 725, 'months': 360, 'round': 'up'}, {'payment': 1, 'final_payment': -1123, 'total_interest': -771}], ['control 2', {'principal': 999999, 'rate_bp': 0, 'months': 60, 'round': 'nearest'}, {'payment': 16667, 'final_payment': 16646, 'total_interest': 0}], ['control 3', {'principal': 30000000, 'rate_bp': 0, 'months': 36, 'round': 'up'}, {'payment': 833334, 'final_payment': 833310, 'total_interest': 0}], ['control 4', {'principal': 1000000, 'rate_bp': 0, 'months': 3, 'round': 'nearest'}, {'payment': 333333, 'final_payment': 333334, 'total_interest': 0}], ['control 5', {'principal': 100000, 'rate_bp': 0, 'months': 360, 'round': 'up'}, {'payment': 278, 'final_payment': 198, 'total_interest': 0}], ['control 6', {'principal': 500, 'rate_bp': 1999, 'months': 36, 'round': 'up'}, {'payment': 19, 'final_payment': -2, 'total_interest': 163}]], [['regression: annuity discount exponent', {'principal': 500, 'rate_bp': 13, 'months': 3, 'round': 'up'}, {'payment': 167, 'final_payment': 166, 'total_interest': 0}], ['control 1', {'principal': 7, 'rate_bp': 0, 'months': 60, 'round': 'nearest'}, {'payment': 0, 'final_payment': 7, 'total_interest': 0}], ['control 2', {'principal': 999999, 'rate_bp': 0, 'months': 3, 'round': 'nearest'}, {'payment': 333333, 'final_payment': 333333, 'total_interest': 0}], ['control 3', {'principal': 999999, 'rate_bp': 0, 'months': 36, 'round': 'nearest'}, {'payment': 27778, 'final_payment': 27769, 'total_interest': 0}], ['control 4', {'principal': 30000000, 'rate_bp': 0, 'months': 7, 'round': 'nearest'}, {'payment': 4285714, 'final_payment': 4285716, 'total_interest': 0}], ['control 5', {'principal': 100000, 'rate_bp': 0, 'months': 360, 'round': 'up'}, {'payment': 278, 'final_payment': 198, 'total_interest': 0}], ['control 6', {'principal': 500, 'rate_bp': 13, 'months': 360, 'round': 'up'}, {'payment': 2, 'final_payment': -218, 'total_interest': 0}]], [['regression: annuity discount exponent', {'principal': 100000, 'rate_bp': 1999, 'months': 3, 'round': 'nearest'}, {'payment': 34450, 'final_payment': 34450, 'total_interest': 3350}], ['control 1', {'principal': 999999, 'rate_bp': 0, 'months': 12, 'round': 'nearest'}, {'payment': 83333, 'final_payment': 83336, 'total_interest': 0}], ['control 2', {'principal': 12345, 'rate_bp': 0, 'months': 12, 'round': 'up'}, {'payment': 1029, 'final_payment': 1026, 'total_interest': 0}], ['control 3', {'principal': 1000000, 'rate_bp': 0, 'months': 360, 'round': 'up'}, {'payment': 2778, 'final_payment': 2698, 'total_interest': 0}], ['control 4', {'principal': 500, 'rate_bp': 0, 'months': 7, 'round': 'nearest'}, {'payment': 71, 'final_payment': 74, 'total_interest': 0}], ['control 5', {'principal': 999999, 'rate_bp': 0, 'months': 12, 'round': 'up'}, {'payment': 83334, 'final_payment': 83325, 'total_interest': 0}], ['control 6', {'principal': 7, 'rate_bp': 0, 'months': 3, 'round': 'up'}, {'payment': 3, 'final_payment': 1, 'total_interest': 0}]], [['regression: annuity discount exponent', {'principal': 1000000, 'rate_bp': 13, 'months': 60, 'round': 'up'}, {'payment': 16722, 'final_payment': 16710, 'total_interest': 3308}], ['control 1', {'principal': 7, 'rate_bp': 13, 'months': 12, 'round': 'up'}, {'payment': 1, 'final_payment': -4, 'total_interest': 0}], ['control 2', {'principal': 7, 'rate_bp': 725, 'months': 7, 'round': 'up'}, {'payment': 2, 'final_payment': -5, 'total_interest': 0}], ['control 3', {'principal': 7, 'rate_bp': 1999, 'months': 7, 'round': 'nearest'}, {'payment': 1, 'final_payment': 1, 'total_interest': 0}], ['control 4', {'principal': 30000000, 'rate_bp': 0, 'months': 360, 'round': 'nearest'}, {'payment': 83333, 'final_payment': 83453, 'total_interest': 0}], ['control 5', {'principal': 1000000, 'rate_bp': 0, 'months': 60, 'round': 'up'}, {'payment': 16667, 'final_payment': 16647, 'total_interest': 0}], ['control 6', {'principal': 30000000, 'rate_bp': 0, 'months': 12, 'round': 'up'}, {'payment': 2500000, 'final_payment': 2500000, 'total_interest': 0}]], [['regression: annuity discount exponent', {'principal': 30000000, 'rate_bp': 499, 'months': 2, 'round': 'nearest'}, {'payment': 15093627, 'final_payment': 15093627, 'total_interest': 187254}], ['control 1', {'principal': 999999, 'rate_bp': 0, 'months': 3, 'round': 'nearest'}, {'payment': 333333, 'final_payment': 333333, 'total_interest': 0}], ['control 2', {'principal': 500, 'rate_bp': 0, 'months': 2, 'round': 'up'}, {'payment': 250, 'final_payment': 250, 'total_interest': 0}], ['control 3', {'principal': 7, 'rate_bp': 600, 'months': 360, 'round': 'up'}, {'payment': 1, 'final_payment': -876, 'total_interest': -524}], ['control 4', {'principal': 7, 'rate_bp': 600, 'months': 60, 'round': 'nearest'}, {'payment': 0, 'final_payment': 7, 'total_interest': 0}], ['control 5', {'principal': 500, 'rate_bp': 13, 'months': 360, 'round': 'up'}, {'payment': 2, 'final_payment': -218, 'total_interest': 0}], ['control 6', {'principal': 500, 'rate_bp': 0, 'months': 12, 'round': 'up'}, {'payment': 42, 'final_payment': 38, 'total_interest': 0}]]]\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":"e0cc80cafce6cfb1a7c15f4636cf05c373255527f69ba68385b0960d7fd691f3","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nimport math\nfrom fractions import Fraction\nN = 1\nobservations = []\ndef solve(x):\n    P = x['principal']\n    n = x['months']\n    bp = x['rate_bp']\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    if x['round'] == 'up':\n        pay = math.ceil(exact)\n    else:\n        pay = math.floor(exact + Fraction(1, 2))\n    bal = P\n    total_int = 0\n    last = 0\n    for k in range(1, n + 1):\n        q, rem = divmod(bal * bp, 120000)\n        interest = q + (1 if 2 * rem >= 120000 else 0)\n        total_int += interest\n        if k == n:\n            last = bal + interest\n        else:\n            bal = bal + interest - pay\n    return {'payment': pay, 'final_payment': last, 'total_interest': total_int}\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['regression: annuity discount exponent', {'principal': 1000000, 'rate_bp': 13, 'months': 36, 'round': 'up'}, {'payment': 27834, 'final_payment': 27808, 'total_interest': 1998}], ['control 1', {'principal': 7, 'rate_bp': 725, 'months': 360, 'round': 'up'}, {'payment': 1, 'final_payment': -1123, 'total_interest': -771}], ['control 2', {'principal': 999999, 'rate_bp': 0, 'months': 60, 'round': 'nearest'}, {'payment': 16667, 'final_payment': 16646, 'total_interest': 0}], ['control 3', {'principal': 30000000, 'rate_bp': 0, 'months': 36, 'round': 'up'}, {'payment': 833334, 'final_payment': 833310, 'total_interest': 0}], ['control 4', {'principal': 1000000, 'rate_bp': 0, 'months': 3, 'round': 'nearest'}, {'payment': 333333, 'final_payment': 333334, 'total_interest': 0}], ['control 5', {'principal': 100000, 'rate_bp': 0, 'months': 360, 'round': 'up'}, {'payment': 278, 'final_payment': 198, 'total_interest': 0}], ['control 6', {'principal': 500, 'rate_bp': 1999, 'months': 36, 'round': 'up'}, {'payment': 19, 'final_payment': -2, 'total_interest': 163}]], [['regression: annuity discount exponent', {'principal': 500, 'rate_bp': 13, 'months': 3, 'round': 'up'}, {'payment': 167, 'final_payment': 166, 'total_interest': 0}], ['control 1', {'principal': 7, 'rate_bp': 0, 'months': 60, 'round': 'nearest'}, {'payment': 0, 'final_payment': 7, 'total_interest': 0}], ['control 2', {'principal': 999999, 'rate_bp': 0, 'months': 3, 'round': 'nearest'}, {'payment': 333333, 'final_payment': 333333, 'total_interest': 0}], ['control 3', {'principal': 999999, 'rate_bp': 0, 'months': 36, 'round': 'nearest'}, {'payment': 27778, 'final_payment': 27769, 'total_interest': 0}], ['control 4', {'principal': 30000000, 'rate_bp': 0, 'months': 7, 'round': 'nearest'}, {'payment': 4285714, 'final_payment': 4285716, 'total_interest': 0}], ['control 5', {'principal': 100000, 'rate_bp': 0, 'months': 360, 'round': 'up'}, {'payment': 278, 'final_payment': 198, 'total_interest': 0}], ['control 6', {'principal': 500, 'rate_bp': 13, 'months': 360, 'round': 'up'}, {'payment': 2, 'final_payment': -218, 'total_interest': 0}]], [['regression: annuity discount exponent', {'principal': 100000, 'rate_bp': 1999, 'months': 3, 'round': 'nearest'}, {'payment': 34450, 'final_payment': 34450, 'total_interest': 3350}], ['control 1', {'principal': 999999, 'rate_bp': 0, 'months': 12, 'round': 'nearest'}, {'payment': 83333, 'final_payment': 83336, 'total_interest': 0}], ['control 2', {'principal': 12345, 'rate_bp': 0, 'months': 12, 'round': 'up'}, {'payment': 1029, 'final_payment': 1026, 'total_interest': 0}], ['control 3', {'principal': 1000000, 'rate_bp': 0, 'months': 360, 'round': 'up'}, {'payment': 2778, 'final_payment': 2698, 'total_interest': 0}], ['control 4', {'principal': 500, 'rate_bp': 0, 'months': 7, 'round': 'nearest'}, {'payment': 71, 'final_payment': 74, 'total_interest': 0}], ['control 5', {'principal': 999999, 'rate_bp': 0, 'months': 12, 'round': 'up'}, {'payment': 83334, 'final_payment': 83325, 'total_interest': 0}], ['control 6', {'principal': 7, 'rate_bp': 0, 'months': 3, 'round': 'up'}, {'payment': 3, 'final_payment': 1, 'total_interest': 0}]], [['regression: annuity discount exponent', {'principal': 1000000, 'rate_bp': 13, 'months': 60, 'round': 'up'}, {'payment': 16722, 'final_payment': 16710, 'total_interest': 3308}], ['control 1', {'principal': 7, 'rate_bp': 13, 'months': 12, 'round': 'up'}, {'payment': 1, 'final_payment': -4, 'total_interest': 0}], ['control 2', {'principal': 7, 'rate_bp': 725, 'months': 7, 'round': 'up'}, {'payment': 2, 'final_payment': -5, 'total_interest': 0}], ['control 3', {'principal': 7, 'rate_bp': 1999, 'months': 7, 'round': 'nearest'}, {'payment': 1, 'final_payment': 1, 'total_interest': 0}], ['control 4', {'principal': 30000000, 'rate_bp': 0, 'months': 360, 'round': 'nearest'}, {'payment': 83333, 'final_payment': 83453, 'total_interest': 0}], ['control 5', {'principal': 1000000, 'rate_bp': 0, 'months': 60, 'round': 'up'}, {'payment': 16667, 'final_payment': 16647, 'total_interest': 0}], ['control 6', {'principal': 30000000, 'rate_bp': 0, 'months': 12, 'round': 'up'}, {'payment': 2500000, 'final_payment': 2500000, 'total_interest': 0}]], [['regression: annuity discount exponent', {'principal': 30000000, 'rate_bp': 499, 'months': 2, 'round': 'nearest'}, {'payment': 15093627, 'final_payment': 15093627, 'total_interest': 187254}], ['control 1', {'principal': 999999, 'rate_bp': 0, 'months': 3, 'round': 'nearest'}, {'payment': 333333, 'final_payment': 333333, 'total_interest': 0}], ['control 2', {'principal': 500, 'rate_bp': 0, 'months': 2, 'round': 'up'}, {'payment': 250, 'final_payment': 250, 'total_interest': 0}], ['control 3', {'principal': 7, 'rate_bp': 600, 'months': 360, 'round': 'up'}, {'payment': 1, 'final_payment': -876, 'total_interest': -524}], ['control 4', {'principal': 7, 'rate_bp': 600, 'months': 60, 'round': 'nearest'}, {'payment': 0, 'final_payment': 7, 'total_interest': 0}], ['control 5', {'principal': 500, 'rate_bp': 13, 'months': 360, 'round': 'up'}, {'payment': 2, 'final_payment': -218, 'total_interest': 0}], ['control 6', {'principal': 500, 'rate_bp': 0, 'months': 12, 'round': 'up'}, {'payment': 42, 'final_payment': 38, 'total_interest': 0}]]]\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-level-payment-and-final-adjustment-annuity-discount-exponent","generated_at":"2026-09-29T14:46:25.830715+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":"Discount over exactly n periods.","root_cause":"The discount factor uses n-1 periods.","sha256":"70bcc0b4bef1f337a25d65ef90d196467d1b7e5eea534b1cf8037cb3e9d037b6","title":"Level payment with final adjustment: annuity discount exponent · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":43.853,"exit_code":1,"observations":[{"actual":{"final_payment":54152,"payment":27083,"total_interest":2057},"check":"regression: annuity discount exponent","expected":{"final_payment":27808,"payment":27834,"total_interest":1998},"passed":false},{"actual":{"final_payment":-1123,"payment":1,"total_interest":-771},"check":"control 1","expected":{"final_payment":-1123,"payment":1,"total_interest":-771},"passed":true},{"actual":{"final_payment":16646,"payment":16667,"total_interest":0},"check":"control 2","expected":{"final_payment":16646,"payment":16667,"total_interest":0},"passed":true},{"actual":{"final_payment":833310,"payment":833334,"total_interest":0},"check":"control 3","expected":{"final_payment":833310,"payment":833334,"total_interest":0},"passed":true},{"actual":{"final_payment":333334,"payment":333333,"total_interest":0},"check":"control 4","expected":{"final_payment":333334,"payment":333333,"total_interest":0},"passed":true},{"actual":{"final_payment":198,"payment":278,"total_interest":0},"check":"control 5","expected":{"final_payment":198,"payment":278,"total_interest":0},"passed":true},{"actual":{"final_payment":-2,"payment":19,"total_interest":163},"check":"control 6","expected":{"final_payment":-2,"payment":19,"total_interest":163},"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression: annuity discount exponent\", \"actual\": {\"payment\": 27083, \"final_payment\": 54152, \"total_interest\": 2057}, \"expected\": {\"payment\": 27834, \"final_payment\": 27808, \"total_interest\": 1998}, \"passed\": false}, {\"check\": \"control 1\", \"actual\": {\"payment\": 1, \"final_payment\": -1123, \"total_interest\": -771}, \"expected\": {\"payment\": 1, \"final_payment\": -1123, \"total_interest\": -771}, \"passed\": true}, {\"check\": \"control 2\", \"actual\": {\"payment\": 16667, \"final_payment\": 16646, \"total_interest\": 0}, \"expected\": {\"payment\": 16667, \"final_payment\": 16646, \"total_interest\": 0}, \"passed\": true}, {\"check\": \"control 3\", \"actual\": {\"payment\": 833334, \"final_payment\": 833310, \"total_interest\": 0}, \"expected\": {\"payment\": 833334, \"final_payment\": 833310, \"total_interest\": 0}, \"passed\": true}, {\"check\": \"control 4\", \"actual\": {\"payment\": 333333, \"final_payment\": 333334, \"total_interest\": 0}, \"expected\": {\"payment\": 333333, \"final_payment\": 333334, \"total_interest\": 0}, \"passed\": true}, {\"check\": \"control 5\", \"actual\": {\"payment\": 278, \"final_payment\": 198, \"total_interest\": 0}, \"expected\": {\"payment\": 278, \"final_payment\": 198, \"total_interest\": 0}, \"passed\": true}, {\"check\": \"control 6\", \"actual\": {\"payment\": 19, \"final_payment\": -2, \"total_interest\": 163}, \"expected\": {\"payment\": 19, \"final_payment\": -2, \"total_interest\": 163}, \"passed\": true}], \"passed\": false}\n"},"broken":{"elapsed_ms":41.348,"exit_code":1,"observations":[{"actual":{"final_payment":-30,"payment":28628,"total_interest":1950},"check":"regression: annuity discount exponent","expected":{"final_payment":27808,"payment":27834,"total_interest":1998},"passed":false},{"actual":{"final_payment":-1123,"payment":1,"total_interest":-771},"check":"control 1","expected":{"final_payment":-1123,"payment":1,"total_interest":-771},"passed":true},{"actual":{"final_payment":16646,"payment":16667,"total_interest":0},"check":"control 2","expected":{"final_payment":16646,"payment":16667,"total_interest":0},"passed":true},{"actual":{"final_payment":833310,"payment":833334,"total_interest":0},"check":"control 3","expected":{"final_payment":833310,"payment":833334,"total_interest":0},"passed":true},{"actual":{"final_payment":333334,"payment":333333,"total_interest":0},"check":"control 4","expected":{"final_payment":333334,"payment":333333,"total_interest":0},"passed":true},{"actual":{"final_payment":198,"payment":278,"total_interest":0},"check":"control 5","expected":{"final_payment":198,"payment":278,"total_interest":0},"passed":true},{"actual":{"final_payment":-2,"payment":19,"total_interest":163},"check":"control 6","expected":{"final_payment":-2,"payment":19,"total_interest":163},"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression: annuity discount exponent\", \"actual\": {\"payment\": 28628, \"final_payment\": -30, \"total_interest\": 1950}, \"expected\": {\"payment\": 27834, \"final_payment\": 27808, \"total_interest\": 1998}, \"passed\": false}, {\"check\": \"control 1\", \"actual\": {\"payment\": 1, \"final_payment\": -1123, \"total_interest\": -771}, \"expected\": {\"payment\": 1, \"final_payment\": -1123, \"total_interest\": -771}, \"passed\": true}, {\"check\": \"control 2\", \"actual\": {\"payment\": 16667, \"final_payment\": 16646, \"total_interest\": 0}, \"expected\": {\"payment\": 16667, \"final_payment\": 16646, \"total_interest\": 0}, \"passed\": true}, {\"check\": \"control 3\", \"actual\": {\"payment\": 833334, \"final_payment\": 833310, \"total_interest\": 0}, \"expected\": {\"payment\": 833334, \"final_payment\": 833310, \"total_interest\": 0}, \"passed\": true}, {\"check\": \"control 4\", \"actual\": {\"payment\": 333333, \"final_payment\": 333334, \"total_interest\": 0}, \"expected\": {\"payment\": 333333, \"final_payment\": 333334, \"total_interest\": 0}, \"passed\": true}, {\"check\": \"control 5\", \"actual\": {\"payment\": 278, \"final_payment\": 198, \"total_interest\": 0}, \"expected\": {\"payment\": 278, \"final_payment\": 198, \"total_interest\": 0}, \"passed\": true}, {\"check\": \"control 6\", \"actual\": {\"payment\": 19, \"final_payment\": -2, \"total_interest\": 163}, \"expected\": {\"payment\": 19, \"final_payment\": -2, \"total_interest\": 163}, \"passed\": true}], \"passed\": false}\n"},"fixed":{"elapsed_ms":43.218,"exit_code":0,"observations":[{"actual":{"final_payment":27808,"payment":27834,"total_interest":1998},"check":"regression: annuity discount exponent","expected":{"final_payment":27808,"payment":27834,"total_interest":1998},"passed":true},{"actual":{"final_payment":-1123,"payment":1,"total_interest":-771},"check":"control 1","expected":{"final_payment":-1123,"payment":1,"total_interest":-771},"passed":true},{"actual":{"final_payment":16646,"payment":16667,"total_interest":0},"check":"control 2","expected":{"final_payment":16646,"payment":16667,"total_interest":0},"passed":true},{"actual":{"final_payment":833310,"payment":833334,"total_interest":0},"check":"control 3","expected":{"final_payment":833310,"payment":833334,"total_interest":0},"passed":true},{"actual":{"final_payment":333334,"payment":333333,"total_interest":0},"check":"control 4","expected":{"final_payment":333334,"payment":333333,"total_interest":0},"passed":true},{"actual":{"final_payment":198,"payment":278,"total_interest":0},"check":"control 5","expected":{"final_payment":198,"payment":278,"total_interest":0},"passed":true},{"actual":{"final_payment":-2,"payment":19,"total_interest":163},"check":"control 6","expected":{"final_payment":-2,"payment":19,"total_interest":163},"passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression: annuity discount exponent\", \"actual\": {\"payment\": 27834, \"final_payment\": 27808, \"total_interest\": 1998}, \"expected\": {\"payment\": 27834, \"final_payment\": 27808, \"total_interest\": 1998}, \"passed\": true}, {\"check\": \"control 1\", \"actual\": {\"payment\": 1, \"final_payment\": -1123, \"total_interest\": -771}, \"expected\": {\"payment\": 1, \"final_payment\": -1123, \"total_interest\": -771}, \"passed\": true}, {\"check\": \"control 2\", \"actual\": {\"payment\": 16667, \"final_payment\": 16646, \"total_interest\": 0}, \"expected\": {\"payment\": 16667, \"final_payment\": 16646, \"total_interest\": 0}, \"passed\": true}, {\"check\": \"control 3\", \"actual\": {\"payment\": 833334, \"final_payment\": 833310, \"total_interest\": 0}, \"expected\": {\"payment\": 833334, \"final_payment\": 833310, \"total_interest\": 0}, \"passed\": true}, {\"check\": \"control 4\", \"actual\": {\"payment\": 333333, \"final_payment\": 333334, \"total_interest\": 0}, \"expected\": {\"payment\": 333333, \"final_payment\": 333334, \"total_interest\": 0}, \"passed\": true}, {\"check\": \"control 5\", \"actual\": {\"payment\": 278, \"final_payment\": 198, \"total_interest\": 0}, \"expected\": {\"payment\": 278, \"final_payment\": 198, \"total_interest\": 0}, \"passed\": true}, {\"check\": \"control 6\", \"actual\": {\"payment\": 19, \"final_payment\": -2, \"total_interest\": 163}, \"expected\": {\"payment\": 19, \"final_payment\": -2, \"total_interest\": 163}, \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}