FAILURE MAP
← Case archive

FA-58701 / Loan amortization schedules / Open access

Accelerated biweekly schedule: biweekly payment derivation · case 01

Odd-cent monthly payments produce a biweekly payment a half cent short.

Verified by executionVariant 1 · 7 checks per implementationDownload source bundle ↓JSON ↗

ROOT CAUSE

Half the monthly payment is truncated.

VERIFIED REPAIR

Round half of the monthly payment half-up.

Unsuccessful approach: Spreading twelve monthly payments over 26 periods removes the acceleration entirely.

Case contract

x = {'principal', 'rate_bp', 'months'}. The monthly payment is the exact annuity rounded half-up; the biweekly payment is round_half_up(monthly/2), paid 26 times a year. Periodic interest is round_half_up(balance*bp/260000). When balance + interest <= payment the loan pays off with that amount. Return {'payment', 'periods', 'final_payment', 'total_interest'}.

Why this case matters

Amortization engines drive borrower statements, payoff quotes and investor remittances; a misplaced rounding step, boundary or ordering rule compounds across hundreds of periods.

1 / The failure

Exit 1
"""Failure Map reference implementation. Python standard library only."""
import json
import math
from fractions import Fraction
N = 1
observations = []
def solve(x):
    def rnd(n, d):
        q, r = divmod(n, d)
        return q + (1 if 2 * r >= d else 0)
    def level(P, n):
        if n <= 0 or P <= 0:
            return 0
        if bp == 0:
            exact = Fraction(P, n)
        else:
            r = Fraction(bp, 120000)
            exact = P * r / (1 - (1 + r) ** -n)
        return math.floor(exact + Fraction(1, 2))
    bp = x['rate_bp']
    P = x['principal']
    monthly = level(P, x['months'])
    pay = monthly // 2
    bal = P
    k = 0
    total = 0
    final = 0
    while bal > 0 and k < 26 * x['months']:
        k += 1
        interest = rnd(bal * bp, 260000)
        total += interest
        if bal + interest <= pay:
            final = bal + interest
            bal = 0
        else:
            bal -= pay - interest
    return {'payment': pay, 'periods': k, 'final_payment': final, 'total_interest': total}
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['regression: biweekly payment derivation', {'principal': 5000, 'rate_bp': 725, 'months': 36}, {'payment': 78, 'periods': 71, 'final_payment': 58, 'total_interest': 518}], ['control 1', {'principal': 5000, 'rate_bp': 1200, 'months': 12}, {'payment': 222, 'periods': 24, 'final_payment': 187, 'total_interest': 293}], ['control 2', {'principal': 250000, 'rate_bp': 0, 'months': 7}, {'payment': 17857, 'periods': 15, 'final_payment': 2, 'total_interest': 0}], ['control 3', {'principal': 1000000, 'rate_bp': 725, 'months': 7}, {'payment': 73165, 'periods': 14, 'final_payment': 69832, 'total_interest': 20977}], ['control 4', {'principal': 250000, 'rate_bp': 0, 'months': 36}, {'payment': 3472, 'periods': 73, 'final_payment': 16, 'total_interest': 0}], ['control 5', {'principal': 1000000, 'rate_bp': 0, 'months': 36}, {'payment': 13889, 'periods': 72, 'final_payment': 13881, 'total_interest': 0}], ['control 6', {'principal': 5000, 'rate_bp': 0, 'months': 7}, {'payment': 357, 'periods': 15, 'final_payment': 2, 'total_interest': 0}]], [['regression: biweekly payment derivation', {'principal': 100000, 'rate_bp': 1200, 'months': 36}, {'payment': 1661, 'periods': 71, 'final_payment': 1165, 'total_interest': 17435}], ['control 1', {'principal': 250000, 'rate_bp': 725, 'months': 36}, {'payment': 3874, 'periods': 72, 'final_payment': 951, 'total_interest': 26005}], ['control 2', {'principal': 100000, 'rate_bp': 725, 'months': 12}, {'payment': 4332, 'periods': 24, 'final_payment': 3874, 'total_interest': 3510}], ['control 3', {'principal': 100000, 'rate_bp': 0, 'months': 7}, {'payment': 7143, 'periods': 14, 'final_payment': 7141, 'total_interest': 0}], ['control 4', {'principal': 100000, 'rate_bp': 0, 'months': 36}, {'payment': 1389, 'periods': 72, 'final_payment': 1381, 'total_interest': 0}], ['control 5', {'principal': 100000, 'rate_bp': 600, 'months': 36}, {'payment': 1521, 'periods': 72, 'final_payment': 590, 'total_interest': 8581}], ['control 6', {'principal': 1000000, 'rate_bp': 725, 'months': 7}, {'payment': 73165, 'periods': 14, 'final_payment': 69832, 'total_interest': 20977}]], [['regression: biweekly payment derivation', {'principal': 250000, 'rate_bp': 1200, 'months': 7}, {'payment': 18579, 'periods': 14, 'final_payment': 17172, 'total_interest': 8699}], ['control 1', {'principal': 100000, 'rate_bp': 600, 'months': 36}, {'payment': 1521, 'periods': 72, 'final_payment': 590, 'total_interest': 8581}], ['control 2', {'principal': 1000000, 'rate_bp': 725, 'months': 12}, {'payment': 43321, 'periods': 24, 'final_payment': 38698, 'total_interest': 35081}], ['control 3', {'principal': 100000, 'rate_bp': 0, 'months': 36}, {'payment': 1389, 'periods': 72, 'final_payment': 1381, 'total_interest': 0}], ['control 4', {'principal': 5000, 'rate_bp': 600, 'months': 12}, {'payment': 215, 'periods': 24, 'final_payment': 199, 'total_interest': 144}], ['control 5', {'principal': 5000, 'rate_bp': 725, 'months': 60}, {'payment': 50, 'periods': 118, 'final_payment': 21, 'total_interest': 871}], ['control 6', {'principal': 250000, 'rate_bp': 600, 'months': 7}, {'payment': 18216, 'periods': 14, 'final_payment': 17530, 'total_interest': 4338}]], [['regression: biweekly payment derivation', {'principal': 250000, 'rate_bp': 600, 'months': 60}, {'payment': 2417, 'periods': 119, 'final_payment': 764, 'total_interest': 35970}], ['control 1', {'principal': 5000, 'rate_bp': 1200, 'months': 36}, {'payment': 83, 'periods': 71, 'final_payment': 64, 'total_interest': 874}], ['control 2', {'principal': 250000, 'rate_bp': 725, 'months': 60}, {'payment': 2490, 'periods': 118, 'final_payment': 2377, 'total_interest': 43707}], ['control 3', {'principal': 100000, 'rate_bp': 0, 'months': 7}, {'payment': 7143, 'periods': 14, 'final_payment': 7141, 'total_interest': 0}], ['control 4', {'principal': 1000000, 'rate_bp': 1200, 'months': 60}, {'payment': 11122, 'periods': 117, 'final_payment': 4717, 'total_interest': 294869}], ['control 5', {'principal': 5000, 'rate_bp': 1200, 'months': 12}, {'payment': 222, 'periods': 24, 'final_payment': 187, 'total_interest': 293}], ['control 6', {'principal': 1000000, 'rate_bp': 0, 'months': 36}, {'payment': 13889, 'periods': 72, 'final_payment': 13881, 'total_interest': 0}]], [['regression: biweekly payment derivation', {'principal': 5000, 'rate_bp': 0, 'months': 36}, {'payment': 70, 'periods': 72, 'final_payment': 30, 'total_interest': 0}], ['control 1', {'principal': 5000, 'rate_bp': 725, 'months': 60}, {'payment': 50, 'periods': 118, 'final_payment': 21, 'total_interest': 871}], ['control 2', {'principal': 100000, 'rate_bp': 0, 'months': 7}, {'payment': 7143, 'periods': 14, 'final_payment': 7141, 'total_interest': 0}], ['control 3', {'principal': 100000, 'rate_bp': 0, 'months': 36}, {'payment': 1389, 'periods': 72, 'final_payment': 1381, 'total_interest': 0}], ['control 4', {'principal': 100000, 'rate_bp': 1200, 'months': 60}, {'payment': 1112, 'periods': 117, 'final_payment': 503, 'total_interest': 29495}], ['control 5', {'principal': 250000, 'rate_bp': 1200, 'months': 36}, {'payment': 4152, 'periods': 71, 'final_payment': 2947, 'total_interest': 43587}], ['control 6', {'principal': 1000000, 'rate_bp': 725, 'months': 36}, {'payment': 15496, 'periods': 72, 'final_payment': 3794, 'total_interest': 104010}]]]
for label, args, expected in fixtures[N-1]:
    try:
        actual = solve(args)
    except Exception as exc:
        actual = 'raised ' + type(exc).__name__
    check(label, actual, expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
Boundary fixtureActualExpectedOutcome
regression: biweekly payment derivation{'final_payment': 58, 'payment': 77, 'periods': 72, 'total_interest': 525}{'final_payment': 58, 'payment': 78, 'periods': 71, 'total_interest': 518}Failed
control 1{'final_payment': 187, 'payment': 222, 'periods': 24, 'total_interest': 293}{'final_payment': 187, 'payment': 222, 'periods': 24, 'total_interest': 293}Passed
control 2{'final_payment': 2, 'payment': 17857, 'periods': 15, 'total_interest': 0}{'final_payment': 2, 'payment': 17857, 'periods': 15, 'total_interest': 0}Passed
control 3{'final_payment': 69832, 'payment': 73165, 'periods': 14, 'total_interest': 20977}{'final_payment': 69832, 'payment': 73165, 'periods': 14, 'total_interest': 20977}Passed
control 4{'final_payment': 16, 'payment': 3472, 'periods': 73, 'total_interest': 0}{'final_payment': 16, 'payment': 3472, 'periods': 73, 'total_interest': 0}Passed
control 5{'final_payment': 13881, 'payment': 13889, 'periods': 72, 'total_interest': 0}{'final_payment': 13881, 'payment': 13889, 'periods': 72, 'total_interest': 0}Passed
control 6{'final_payment': 2, 'payment': 357, 'periods': 15, 'total_interest': 0}{'final_payment': 2, 'payment': 357, 'periods': 15, 'total_interest': 0}Passed

SHA-256 / 26c74fec1e09aa42f48a348d4ffb8e09c2f7f894fca5914020887f326b03a40c

2 / The unsuccessful fix

Exit 1
"""Failure Map reference implementation. Python standard library only."""
import json
import math
from fractions import Fraction
N = 1
observations = []
def solve(x):
    def rnd(n, d):
        q, r = divmod(n, d)
        return q + (1 if 2 * r >= d else 0)
    def level(P, n):
        if n <= 0 or P <= 0:
            return 0
        if bp == 0:
            exact = Fraction(P, n)
        else:
            r = Fraction(bp, 120000)
            exact = P * r / (1 - (1 + r) ** -n)
        return math.floor(exact + Fraction(1, 2))
    bp = x['rate_bp']
    P = x['principal']
    monthly = level(P, x['months'])
    pay = rnd(monthly * 12, 26)
    bal = P
    k = 0
    total = 0
    final = 0
    while bal > 0 and k < 26 * x['months']:
        k += 1
        interest = rnd(bal * bp, 260000)
        total += interest
        if bal + interest <= pay:
            final = bal + interest
            bal = 0
        else:
            bal -= pay - interest
    return {'payment': pay, 'periods': k, 'final_payment': final, 'total_interest': total}
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['regression: biweekly payment derivation', {'principal': 5000, 'rate_bp': 725, 'months': 36}, {'payment': 78, 'periods': 71, 'final_payment': 58, 'total_interest': 518}], ['control 1', {'principal': 5000, 'rate_bp': 1200, 'months': 12}, {'payment': 222, 'periods': 24, 'final_payment': 187, 'total_interest': 293}], ['control 2', {'principal': 250000, 'rate_bp': 0, 'months': 7}, {'payment': 17857, 'periods': 15, 'final_payment': 2, 'total_interest': 0}], ['control 3', {'principal': 1000000, 'rate_bp': 725, 'months': 7}, {'payment': 73165, 'periods': 14, 'final_payment': 69832, 'total_interest': 20977}], ['control 4', {'principal': 250000, 'rate_bp': 0, 'months': 36}, {'payment': 3472, 'periods': 73, 'final_payment': 16, 'total_interest': 0}], ['control 5', {'principal': 1000000, 'rate_bp': 0, 'months': 36}, {'payment': 13889, 'periods': 72, 'final_payment': 13881, 'total_interest': 0}], ['control 6', {'principal': 5000, 'rate_bp': 0, 'months': 7}, {'payment': 357, 'periods': 15, 'final_payment': 2, 'total_interest': 0}]], [['regression: biweekly payment derivation', {'principal': 100000, 'rate_bp': 1200, 'months': 36}, {'payment': 1661, 'periods': 71, 'final_payment': 1165, 'total_interest': 17435}], ['control 1', {'principal': 250000, 'rate_bp': 725, 'months': 36}, {'payment': 3874, 'periods': 72, 'final_payment': 951, 'total_interest': 26005}], ['control 2', {'principal': 100000, 'rate_bp': 725, 'months': 12}, {'payment': 4332, 'periods': 24, 'final_payment': 3874, 'total_interest': 3510}], ['control 3', {'principal': 100000, 'rate_bp': 0, 'months': 7}, {'payment': 7143, 'periods': 14, 'final_payment': 7141, 'total_interest': 0}], ['control 4', {'principal': 100000, 'rate_bp': 0, 'months': 36}, {'payment': 1389, 'periods': 72, 'final_payment': 1381, 'total_interest': 0}], ['control 5', {'principal': 100000, 'rate_bp': 600, 'months': 36}, {'payment': 1521, 'periods': 72, 'final_payment': 590, 'total_interest': 8581}], ['control 6', {'principal': 1000000, 'rate_bp': 725, 'months': 7}, {'payment': 73165, 'periods': 14, 'final_payment': 69832, 'total_interest': 20977}]], [['regression: biweekly payment derivation', {'principal': 250000, 'rate_bp': 1200, 'months': 7}, {'payment': 18579, 'periods': 14, 'final_payment': 17172, 'total_interest': 8699}], ['control 1', {'principal': 100000, 'rate_bp': 600, 'months': 36}, {'payment': 1521, 'periods': 72, 'final_payment': 590, 'total_interest': 8581}], ['control 2', {'principal': 1000000, 'rate_bp': 725, 'months': 12}, {'payment': 43321, 'periods': 24, 'final_payment': 38698, 'total_interest': 35081}], ['control 3', {'principal': 100000, 'rate_bp': 0, 'months': 36}, {'payment': 1389, 'periods': 72, 'final_payment': 1381, 'total_interest': 0}], ['control 4', {'principal': 5000, 'rate_bp': 600, 'months': 12}, {'payment': 215, 'periods': 24, 'final_payment': 199, 'total_interest': 144}], ['control 5', {'principal': 5000, 'rate_bp': 725, 'months': 60}, {'payment': 50, 'periods': 118, 'final_payment': 21, 'total_interest': 871}], ['control 6', {'principal': 250000, 'rate_bp': 600, 'months': 7}, {'payment': 18216, 'periods': 14, 'final_payment': 17530, 'total_interest': 4338}]], [['regression: biweekly payment derivation', {'principal': 250000, 'rate_bp': 600, 'months': 60}, {'payment': 2417, 'periods': 119, 'final_payment': 764, 'total_interest': 35970}], ['control 1', {'principal': 5000, 'rate_bp': 1200, 'months': 36}, {'payment': 83, 'periods': 71, 'final_payment': 64, 'total_interest': 874}], ['control 2', {'principal': 250000, 'rate_bp': 725, 'months': 60}, {'payment': 2490, 'periods': 118, 'final_payment': 2377, 'total_interest': 43707}], ['control 3', {'principal': 100000, 'rate_bp': 0, 'months': 7}, {'payment': 7143, 'periods': 14, 'final_payment': 7141, 'total_interest': 0}], ['control 4', {'principal': 1000000, 'rate_bp': 1200, 'months': 60}, {'payment': 11122, 'periods': 117, 'final_payment': 4717, 'total_interest': 294869}], ['control 5', {'principal': 5000, 'rate_bp': 1200, 'months': 12}, {'payment': 222, 'periods': 24, 'final_payment': 187, 'total_interest': 293}], ['control 6', {'principal': 1000000, 'rate_bp': 0, 'months': 36}, {'payment': 13889, 'periods': 72, 'final_payment': 13881, 'total_interest': 0}]], [['regression: biweekly payment derivation', {'principal': 5000, 'rate_bp': 0, 'months': 36}, {'payment': 70, 'periods': 72, 'final_payment': 30, 'total_interest': 0}], ['control 1', {'principal': 5000, 'rate_bp': 725, 'months': 60}, {'payment': 50, 'periods': 118, 'final_payment': 21, 'total_interest': 871}], ['control 2', {'principal': 100000, 'rate_bp': 0, 'months': 7}, {'payment': 7143, 'periods': 14, 'final_payment': 7141, 'total_interest': 0}], ['control 3', {'principal': 100000, 'rate_bp': 0, 'months': 36}, {'payment': 1389, 'periods': 72, 'final_payment': 1381, 'total_interest': 0}], ['control 4', {'principal': 100000, 'rate_bp': 1200, 'months': 60}, {'payment': 1112, 'periods': 117, 'final_payment': 503, 'total_interest': 29495}], ['control 5', {'principal': 250000, 'rate_bp': 1200, 'months': 36}, {'payment': 4152, 'periods': 71, 'final_payment': 2947, 'total_interest': 43587}], ['control 6', {'principal': 1000000, 'rate_bp': 725, 'months': 36}, {'payment': 15496, 'periods': 72, 'final_payment': 3794, 'total_interest': 104010}]]]
for label, args, expected in fixtures[N-1]:
    try:
        actual = solve(args)
    except Exception as exc:
        actual = 'raised ' + type(exc).__name__
    check(label, actual, expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
Boundary fixtureActualExpectedOutcome
regression: biweekly payment derivation{'final_payment': 20, 'payment': 72, 'periods': 78, 'total_interest': 564}{'final_payment': 58, 'payment': 78, 'periods': 71, 'total_interest': 518}Failed
control 1{'final_payment': 193, 'payment': 205, 'periods': 26, 'total_interest': 318}{'final_payment': 187, 'payment': 222, 'periods': 24, 'total_interest': 293}Failed
control 2{'final_payment': 2755, 'payment': 16483, 'periods': 16, 'total_interest': 0}{'final_payment': 2, 'payment': 17857, 'periods': 15, 'total_interest': 0}Failed
control 3{'final_payment': 9610, 'payment': 67537, 'periods': 16, 'total_interest': 22665}{'final_payment': 69832, 'payment': 73165, 'periods': 14, 'total_interest': 20977}Failed
control 4{'final_payment': 10, 'payment': 3205, 'periods': 79, 'total_interest': 0}{'final_payment': 16, 'payment': 3472, 'periods': 73, 'total_interest': 0}Failed
control 5{'final_payment': 12783, 'payment': 12821, 'periods': 78, 'total_interest': 0}{'final_payment': 13881, 'payment': 13889, 'periods': 72, 'total_interest': 0}Failed
control 6{'final_payment': 50, 'payment': 330, 'periods': 16, 'total_interest': 0}{'final_payment': 2, 'payment': 357, 'periods': 15, 'total_interest': 0}Failed

SHA-256 / a6203994faedd6155decda091472dcb9710c8c8465b372a16cf068e3908d95ad

3 / The verified repair

Exit 0
"""Failure Map reference implementation. Python standard library only."""
import json
import math
from fractions import Fraction
N = 1
observations = []
def solve(x):
    def rnd(n, d):
        q, r = divmod(n, d)
        return q + (1 if 2 * r >= d else 0)
    def level(P, n):
        if n <= 0 or P <= 0:
            return 0
        if bp == 0:
            exact = Fraction(P, n)
        else:
            r = Fraction(bp, 120000)
            exact = P * r / (1 - (1 + r) ** -n)
        return math.floor(exact + Fraction(1, 2))
    bp = x['rate_bp']
    P = x['principal']
    monthly = level(P, x['months'])
    pay = rnd(monthly, 2)
    bal = P
    k = 0
    total = 0
    final = 0
    while bal > 0 and k < 26 * x['months']:
        k += 1
        interest = rnd(bal * bp, 260000)
        total += interest
        if bal + interest <= pay:
            final = bal + interest
            bal = 0
        else:
            bal -= pay - interest
    return {'payment': pay, 'periods': k, 'final_payment': final, 'total_interest': total}
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['regression: biweekly payment derivation', {'principal': 5000, 'rate_bp': 725, 'months': 36}, {'payment': 78, 'periods': 71, 'final_payment': 58, 'total_interest': 518}], ['control 1', {'principal': 5000, 'rate_bp': 1200, 'months': 12}, {'payment': 222, 'periods': 24, 'final_payment': 187, 'total_interest': 293}], ['control 2', {'principal': 250000, 'rate_bp': 0, 'months': 7}, {'payment': 17857, 'periods': 15, 'final_payment': 2, 'total_interest': 0}], ['control 3', {'principal': 1000000, 'rate_bp': 725, 'months': 7}, {'payment': 73165, 'periods': 14, 'final_payment': 69832, 'total_interest': 20977}], ['control 4', {'principal': 250000, 'rate_bp': 0, 'months': 36}, {'payment': 3472, 'periods': 73, 'final_payment': 16, 'total_interest': 0}], ['control 5', {'principal': 1000000, 'rate_bp': 0, 'months': 36}, {'payment': 13889, 'periods': 72, 'final_payment': 13881, 'total_interest': 0}], ['control 6', {'principal': 5000, 'rate_bp': 0, 'months': 7}, {'payment': 357, 'periods': 15, 'final_payment': 2, 'total_interest': 0}]], [['regression: biweekly payment derivation', {'principal': 100000, 'rate_bp': 1200, 'months': 36}, {'payment': 1661, 'periods': 71, 'final_payment': 1165, 'total_interest': 17435}], ['control 1', {'principal': 250000, 'rate_bp': 725, 'months': 36}, {'payment': 3874, 'periods': 72, 'final_payment': 951, 'total_interest': 26005}], ['control 2', {'principal': 100000, 'rate_bp': 725, 'months': 12}, {'payment': 4332, 'periods': 24, 'final_payment': 3874, 'total_interest': 3510}], ['control 3', {'principal': 100000, 'rate_bp': 0, 'months': 7}, {'payment': 7143, 'periods': 14, 'final_payment': 7141, 'total_interest': 0}], ['control 4', {'principal': 100000, 'rate_bp': 0, 'months': 36}, {'payment': 1389, 'periods': 72, 'final_payment': 1381, 'total_interest': 0}], ['control 5', {'principal': 100000, 'rate_bp': 600, 'months': 36}, {'payment': 1521, 'periods': 72, 'final_payment': 590, 'total_interest': 8581}], ['control 6', {'principal': 1000000, 'rate_bp': 725, 'months': 7}, {'payment': 73165, 'periods': 14, 'final_payment': 69832, 'total_interest': 20977}]], [['regression: biweekly payment derivation', {'principal': 250000, 'rate_bp': 1200, 'months': 7}, {'payment': 18579, 'periods': 14, 'final_payment': 17172, 'total_interest': 8699}], ['control 1', {'principal': 100000, 'rate_bp': 600, 'months': 36}, {'payment': 1521, 'periods': 72, 'final_payment': 590, 'total_interest': 8581}], ['control 2', {'principal': 1000000, 'rate_bp': 725, 'months': 12}, {'payment': 43321, 'periods': 24, 'final_payment': 38698, 'total_interest': 35081}], ['control 3', {'principal': 100000, 'rate_bp': 0, 'months': 36}, {'payment': 1389, 'periods': 72, 'final_payment': 1381, 'total_interest': 0}], ['control 4', {'principal': 5000, 'rate_bp': 600, 'months': 12}, {'payment': 215, 'periods': 24, 'final_payment': 199, 'total_interest': 144}], ['control 5', {'principal': 5000, 'rate_bp': 725, 'months': 60}, {'payment': 50, 'periods': 118, 'final_payment': 21, 'total_interest': 871}], ['control 6', {'principal': 250000, 'rate_bp': 600, 'months': 7}, {'payment': 18216, 'periods': 14, 'final_payment': 17530, 'total_interest': 4338}]], [['regression: biweekly payment derivation', {'principal': 250000, 'rate_bp': 600, 'months': 60}, {'payment': 2417, 'periods': 119, 'final_payment': 764, 'total_interest': 35970}], ['control 1', {'principal': 5000, 'rate_bp': 1200, 'months': 36}, {'payment': 83, 'periods': 71, 'final_payment': 64, 'total_interest': 874}], ['control 2', {'principal': 250000, 'rate_bp': 725, 'months': 60}, {'payment': 2490, 'periods': 118, 'final_payment': 2377, 'total_interest': 43707}], ['control 3', {'principal': 100000, 'rate_bp': 0, 'months': 7}, {'payment': 7143, 'periods': 14, 'final_payment': 7141, 'total_interest': 0}], ['control 4', {'principal': 1000000, 'rate_bp': 1200, 'months': 60}, {'payment': 11122, 'periods': 117, 'final_payment': 4717, 'total_interest': 294869}], ['control 5', {'principal': 5000, 'rate_bp': 1200, 'months': 12}, {'payment': 222, 'periods': 24, 'final_payment': 187, 'total_interest': 293}], ['control 6', {'principal': 1000000, 'rate_bp': 0, 'months': 36}, {'payment': 13889, 'periods': 72, 'final_payment': 13881, 'total_interest': 0}]], [['regression: biweekly payment derivation', {'principal': 5000, 'rate_bp': 0, 'months': 36}, {'payment': 70, 'periods': 72, 'final_payment': 30, 'total_interest': 0}], ['control 1', {'principal': 5000, 'rate_bp': 725, 'months': 60}, {'payment': 50, 'periods': 118, 'final_payment': 21, 'total_interest': 871}], ['control 2', {'principal': 100000, 'rate_bp': 0, 'months': 7}, {'payment': 7143, 'periods': 14, 'final_payment': 7141, 'total_interest': 0}], ['control 3', {'principal': 100000, 'rate_bp': 0, 'months': 36}, {'payment': 1389, 'periods': 72, 'final_payment': 1381, 'total_interest': 0}], ['control 4', {'principal': 100000, 'rate_bp': 1200, 'months': 60}, {'payment': 1112, 'periods': 117, 'final_payment': 503, 'total_interest': 29495}], ['control 5', {'principal': 250000, 'rate_bp': 1200, 'months': 36}, {'payment': 4152, 'periods': 71, 'final_payment': 2947, 'total_interest': 43587}], ['control 6', {'principal': 1000000, 'rate_bp': 725, 'months': 36}, {'payment': 15496, 'periods': 72, 'final_payment': 3794, 'total_interest': 104010}]]]
for label, args, expected in fixtures[N-1]:
    try:
        actual = solve(args)
    except Exception as exc:
        actual = 'raised ' + type(exc).__name__
    check(label, actual, expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
Boundary fixtureActualExpectedOutcome
regression: biweekly payment derivation{'final_payment': 58, 'payment': 78, 'periods': 71, 'total_interest': 518}{'final_payment': 58, 'payment': 78, 'periods': 71, 'total_interest': 518}Passed
control 1{'final_payment': 187, 'payment': 222, 'periods': 24, 'total_interest': 293}{'final_payment': 187, 'payment': 222, 'periods': 24, 'total_interest': 293}Passed
control 2{'final_payment': 2, 'payment': 17857, 'periods': 15, 'total_interest': 0}{'final_payment': 2, 'payment': 17857, 'periods': 15, 'total_interest': 0}Passed
control 3{'final_payment': 69832, 'payment': 73165, 'periods': 14, 'total_interest': 20977}{'final_payment': 69832, 'payment': 73165, 'periods': 14, 'total_interest': 20977}Passed
control 4{'final_payment': 16, 'payment': 3472, 'periods': 73, 'total_interest': 0}{'final_payment': 16, 'payment': 3472, 'periods': 73, 'total_interest': 0}Passed
control 5{'final_payment': 13881, 'payment': 13889, 'periods': 72, 'total_interest': 0}{'final_payment': 13881, 'payment': 13889, 'periods': 72, 'total_interest': 0}Passed
control 6{'final_payment': 2, 'payment': 357, 'periods': 15, 'total_interest': 0}{'final_payment': 2, 'payment': 357, 'periods': 15, 'total_interest': 0}Passed

SHA-256 / b6135fb25bf3efb1caa837290e40bcda34add3a7b494e949c53def1c3c498e66

Verification & scope

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.

Observations recorded using Python 3.12.14 at 2026-09-29T14:46:29.151501+00:00.

Case digest / 59472632072ea8285e4ee514e01a27800fa77a9ba197b40f9a8e2efc45fb747c