FAILURE MAP
← Case archive

FA-58751 / Loan amortization schedules / Open access

Mortgage insurance termination: midpoint precedence · case 01

Loans that reach 78 percent late keep insurance past the midpoint.

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

ROOT CAUSE

The midpoint applies only when the threshold is never reached.

VERIFIED REPAIR

Take the earlier of the threshold month and the midpoint.

Unsuccessful approach: Taking the later month delays every termination to at least the midpoint.

Case contract

x = {'principal', 'rate_bp', 'months' n, 'orig_value', 'prepay': {'k': extra}}. Level payment is the exact annuity half-up; interest round_half_up(balance*bp/120000). The scheduled balance ignores prepayments; the actual balance applies each extra after payment k (capped at the balance). The request month is the first k with actual*100 <= 80*orig_value; the automatic month is the first k with scheduled*100 <= 78*orig_value, but never later than the midpoint month n//2 + 1. Return {'request', 'automatic'}.

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']
    n = x['months']
    pay = level(P, n)
    sched = actual = P
    auto = request = None
    for k in range(1, n + 1):
        sched -= pay - rnd(sched * bp, 120000)
        if actual > 0:
            actual -= pay - rnd(actual * bp, 120000)
            actual -= min(x['prepay'].get(str(k), 0), max(actual, 0))
        if request is None and actual * 100 <= 80 * x['orig_value']:
            request = k
        if auto is None and sched * 100 <= 78 * x['orig_value']:
            auto = k
    mid = n // 2 + 1
    auto = mid if auto is None else auto
    return {'request': request, 'automatic': auto}
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['regression: midpoint precedence', {'principal': 200000, 'rate_bp': 1200, 'months': 360, 'orig_value': 200000, 'prepay': {'23': 5000}}, {'request': 156, 'automatic': 181}], ['control 1', {'principal': 180000, 'rate_bp': 1200, 'months': 360, 'orig_value': 250000, 'prepay': {'21': 5000}}, {'request': 1, 'automatic': 1}], ['control 2', {'principal': 200000, 'rate_bp': 1200, 'months': 120, 'orig_value': 220000, 'prepay': {'11': 5000, '18': 40000}}, {'request': 18, 'automatic': 29}], ['control 3', {'principal': 190000, 'rate_bp': 1500, 'months': 24, 'orig_value': 200000, 'prepay': {'6': 20000, '5': 5000}}, {'request': 5, 'automatic': 5}], ['control 4', {'principal': 200000, 'rate_bp': 1200, 'months': 24, 'orig_value': 220000, 'prepay': {}}, {'request': 4, 'automatic': 4}], ['control 5', {'principal': 215000, 'rate_bp': 0, 'months': 120, 'orig_value': 220000, 'prepay': {}}, {'request': 22, 'automatic': 25}], ['control 6', {'principal': 160000, 'rate_bp': 600, 'months': 36, 'orig_value': 205000, 'prepay': {'8': 40000}}, {'request': 1, 'automatic': 1}]], [['regression: midpoint precedence', {'principal': 200000, 'rate_bp': 1500, 'months': 360, 'orig_value': 205000, 'prepay': {'24': 5000, '2': 20000}}, {'request': 33, 'automatic': 181}], ['control 1', {'principal': 200000, 'rate_bp': 0, 'months': 24, 'orig_value': 205000, 'prepay': {'5': 20000}}, {'request': 5, 'automatic': 5}], ['control 2', {'principal': 160000, 'rate_bp': 1200, 'months': 48, 'orig_value': 205000, 'prepay': {'7': 40000}}, {'request': 1, 'automatic': 1}], ['control 3', {'principal': 215000, 'rate_bp': 600, 'months': 24, 'orig_value': 200000, 'prepay': {'21': 20000}}, {'request': 7, 'automatic': 7}], ['control 4', {'principal': 190000, 'rate_bp': 0, 'months': 360, 'orig_value': 220000, 'prepay': {'12': 5000}}, {'request': 18, 'automatic': 35}], ['control 5', {'principal': 199000, 'rate_bp': 600, 'months': 36, 'orig_value': 205000, 'prepay': {'8': 40000, '21': 5000}}, {'request': 7, 'automatic': 8}], ['control 6', {'principal': 180000, 'rate_bp': 600, 'months': 60, 'orig_value': 200000, 'prepay': {'17': 40000, '6': 5000}}, {'request': 6, 'automatic': 10}]], [['regression: midpoint precedence', {'principal': 190000, 'rate_bp': 1500, 'months': 360, 'orig_value': 220000, 'prepay': {'22': 20000}}, {'request': 22, 'automatic': 181}], ['control 1', {'principal': 180000, 'rate_bp': 1200, 'months': 60, 'orig_value': 220000, 'prepay': {}}, {'request': 2, 'automatic': 4}], ['control 2', {'principal': 200000, 'rate_bp': 0, 'months': 48, 'orig_value': 220000, 'prepay': {}}, {'request': 6, 'automatic': 7}], ['control 3', {'principal': 160000, 'rate_bp': 1200, 'months': 360, 'orig_value': 250000, 'prepay': {'5': 40000}}, {'request': 1, 'automatic': 1}], ['control 4', {'principal': 215000, 'rate_bp': 1200, 'months': 24, 'orig_value': 205000, 'prepay': {'2': 5000}}, {'request': 6, 'automatic': 7}], ['control 5', {'principal': 215000, 'rate_bp': 600, 'months': 36, 'orig_value': 250000, 'prepay': {}}, {'request': 3, 'automatic': 4}], ['control 6', {'principal': 190000, 'rate_bp': 600, 'months': 48, 'orig_value': 200000, 'prepay': {'6': 20000}}, {'request': 6, 'automatic': 10}]], [['regression: midpoint precedence', {'principal': 190000, 'rate_bp': 1200, 'months': 360, 'orig_value': 205000, 'prepay': {'17': 20000}}, {'request': 35, 'automatic': 181}], ['control 1', {'principal': 200000, 'rate_bp': 0, 'months': 120, 'orig_value': 250000, 'prepay': {}}, {'request': 1, 'automatic': 3}], ['control 2', {'principal': 190000, 'rate_bp': 1500, 'months': 36, 'orig_value': 250000, 'prepay': {}}, {'request': 1, 'automatic': 1}], ['control 3', {'principal': 199000, 'rate_bp': 1500, 'months': 120, 'orig_value': 200000, 'prepay': {'22': 20000}}, {'request': 23, 'automatic': 45}], ['control 4', {'principal': 200000, 'rate_bp': 600, 'months': 360, 'orig_value': 205000, 'prepay': {'17': 20000}}, {'request': 54, 'automatic': 140}], ['control 5', {'principal': 199000, 'rate_bp': 1200, 'months': 48, 'orig_value': 200000, 'prepay': {'1': 5000}}, {'request': 10, 'automatic': 13}], ['control 6', {'principal': 180000, 'rate_bp': 1500, 'months': 24, 'orig_value': 220000, 'prepay': {}}, {'request': 1, 'automatic': 2}]], [['regression: midpoint precedence', {'principal': 199000, 'rate_bp': 1500, 'months': 360, 'orig_value': 220000, 'prepay': {}}, {'request': 194, 'automatic': 181}], ['control 1', {'principal': 199000, 'rate_bp': 600, 'months': 360, 'orig_value': 200000, 'prepay': {'22': 5000}}, {'request': 116, 'automatic': 148}], ['control 2', {'principal': 190000, 'rate_bp': 1500, 'months': 24, 'orig_value': 220000, 'prepay': {'6': 20000}}, {'request': 3, 'automatic': 3}], ['control 3', {'principal': 200000, 'rate_bp': 0, 'months': 36, 'orig_value': 250000, 'prepay': {}}, {'request': 1, 'automatic': 1}], ['control 4', {'principal': 190000, 'rate_bp': 600, 'months': 24, 'orig_value': 200000, 'prepay': {'9': 40000}}, {'request': 4, 'automatic': 5}], ['control 5', {'principal': 180000, 'rate_bp': 0, 'months': 360, 'orig_value': 220000, 'prepay': {'11': 20000}}, {'request': 8, 'automatic': 17}], ['control 6', {'principal': 180000, 'rate_bp': 1200, 'months': 36, 'orig_value': 250000, 'prepay': {'5': 40000}}, {'request': 1, 'automatic': 1}]]]
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: midpoint precedence{'automatic': 218, 'request': 156}{'automatic': 181, 'request': 156}Failed
control 1{'automatic': 1, 'request': 1}{'automatic': 1, 'request': 1}Passed
control 2{'automatic': 29, 'request': 18}{'automatic': 29, 'request': 18}Passed
control 3{'automatic': 5, 'request': 5}{'automatic': 5, 'request': 5}Passed
control 4{'automatic': 4, 'request': 4}{'automatic': 4, 'request': 4}Passed
control 5{'automatic': 25, 'request': 22}{'automatic': 25, 'request': 22}Passed
control 6{'automatic': 1, 'request': 1}{'automatic': 1, 'request': 1}Passed

SHA-256 / d541cf9dd5731605c53eece980464e2ecfdfce31394d6baa650c0823ab9a37dd

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']
    n = x['months']
    pay = level(P, n)
    sched = actual = P
    auto = request = None
    for k in range(1, n + 1):
        sched -= pay - rnd(sched * bp, 120000)
        if actual > 0:
            actual -= pay - rnd(actual * bp, 120000)
            actual -= min(x['prepay'].get(str(k), 0), max(actual, 0))
        if request is None and actual * 100 <= 80 * x['orig_value']:
            request = k
        if auto is None and sched * 100 <= 78 * x['orig_value']:
            auto = k
    mid = n // 2 + 1
    auto = mid if auto is None else max(auto, mid)
    return {'request': request, 'automatic': auto}
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['regression: midpoint precedence', {'principal': 200000, 'rate_bp': 1200, 'months': 360, 'orig_value': 200000, 'prepay': {'23': 5000}}, {'request': 156, 'automatic': 181}], ['control 1', {'principal': 180000, 'rate_bp': 1200, 'months': 360, 'orig_value': 250000, 'prepay': {'21': 5000}}, {'request': 1, 'automatic': 1}], ['control 2', {'principal': 200000, 'rate_bp': 1200, 'months': 120, 'orig_value': 220000, 'prepay': {'11': 5000, '18': 40000}}, {'request': 18, 'automatic': 29}], ['control 3', {'principal': 190000, 'rate_bp': 1500, 'months': 24, 'orig_value': 200000, 'prepay': {'6': 20000, '5': 5000}}, {'request': 5, 'automatic': 5}], ['control 4', {'principal': 200000, 'rate_bp': 1200, 'months': 24, 'orig_value': 220000, 'prepay': {}}, {'request': 4, 'automatic': 4}], ['control 5', {'principal': 215000, 'rate_bp': 0, 'months': 120, 'orig_value': 220000, 'prepay': {}}, {'request': 22, 'automatic': 25}], ['control 6', {'principal': 160000, 'rate_bp': 600, 'months': 36, 'orig_value': 205000, 'prepay': {'8': 40000}}, {'request': 1, 'automatic': 1}]], [['regression: midpoint precedence', {'principal': 200000, 'rate_bp': 1500, 'months': 360, 'orig_value': 205000, 'prepay': {'24': 5000, '2': 20000}}, {'request': 33, 'automatic': 181}], ['control 1', {'principal': 200000, 'rate_bp': 0, 'months': 24, 'orig_value': 205000, 'prepay': {'5': 20000}}, {'request': 5, 'automatic': 5}], ['control 2', {'principal': 160000, 'rate_bp': 1200, 'months': 48, 'orig_value': 205000, 'prepay': {'7': 40000}}, {'request': 1, 'automatic': 1}], ['control 3', {'principal': 215000, 'rate_bp': 600, 'months': 24, 'orig_value': 200000, 'prepay': {'21': 20000}}, {'request': 7, 'automatic': 7}], ['control 4', {'principal': 190000, 'rate_bp': 0, 'months': 360, 'orig_value': 220000, 'prepay': {'12': 5000}}, {'request': 18, 'automatic': 35}], ['control 5', {'principal': 199000, 'rate_bp': 600, 'months': 36, 'orig_value': 205000, 'prepay': {'8': 40000, '21': 5000}}, {'request': 7, 'automatic': 8}], ['control 6', {'principal': 180000, 'rate_bp': 600, 'months': 60, 'orig_value': 200000, 'prepay': {'17': 40000, '6': 5000}}, {'request': 6, 'automatic': 10}]], [['regression: midpoint precedence', {'principal': 190000, 'rate_bp': 1500, 'months': 360, 'orig_value': 220000, 'prepay': {'22': 20000}}, {'request': 22, 'automatic': 181}], ['control 1', {'principal': 180000, 'rate_bp': 1200, 'months': 60, 'orig_value': 220000, 'prepay': {}}, {'request': 2, 'automatic': 4}], ['control 2', {'principal': 200000, 'rate_bp': 0, 'months': 48, 'orig_value': 220000, 'prepay': {}}, {'request': 6, 'automatic': 7}], ['control 3', {'principal': 160000, 'rate_bp': 1200, 'months': 360, 'orig_value': 250000, 'prepay': {'5': 40000}}, {'request': 1, 'automatic': 1}], ['control 4', {'principal': 215000, 'rate_bp': 1200, 'months': 24, 'orig_value': 205000, 'prepay': {'2': 5000}}, {'request': 6, 'automatic': 7}], ['control 5', {'principal': 215000, 'rate_bp': 600, 'months': 36, 'orig_value': 250000, 'prepay': {}}, {'request': 3, 'automatic': 4}], ['control 6', {'principal': 190000, 'rate_bp': 600, 'months': 48, 'orig_value': 200000, 'prepay': {'6': 20000}}, {'request': 6, 'automatic': 10}]], [['regression: midpoint precedence', {'principal': 190000, 'rate_bp': 1200, 'months': 360, 'orig_value': 205000, 'prepay': {'17': 20000}}, {'request': 35, 'automatic': 181}], ['control 1', {'principal': 200000, 'rate_bp': 0, 'months': 120, 'orig_value': 250000, 'prepay': {}}, {'request': 1, 'automatic': 3}], ['control 2', {'principal': 190000, 'rate_bp': 1500, 'months': 36, 'orig_value': 250000, 'prepay': {}}, {'request': 1, 'automatic': 1}], ['control 3', {'principal': 199000, 'rate_bp': 1500, 'months': 120, 'orig_value': 200000, 'prepay': {'22': 20000}}, {'request': 23, 'automatic': 45}], ['control 4', {'principal': 200000, 'rate_bp': 600, 'months': 360, 'orig_value': 205000, 'prepay': {'17': 20000}}, {'request': 54, 'automatic': 140}], ['control 5', {'principal': 199000, 'rate_bp': 1200, 'months': 48, 'orig_value': 200000, 'prepay': {'1': 5000}}, {'request': 10, 'automatic': 13}], ['control 6', {'principal': 180000, 'rate_bp': 1500, 'months': 24, 'orig_value': 220000, 'prepay': {}}, {'request': 1, 'automatic': 2}]], [['regression: midpoint precedence', {'principal': 199000, 'rate_bp': 1500, 'months': 360, 'orig_value': 220000, 'prepay': {}}, {'request': 194, 'automatic': 181}], ['control 1', {'principal': 199000, 'rate_bp': 600, 'months': 360, 'orig_value': 200000, 'prepay': {'22': 5000}}, {'request': 116, 'automatic': 148}], ['control 2', {'principal': 190000, 'rate_bp': 1500, 'months': 24, 'orig_value': 220000, 'prepay': {'6': 20000}}, {'request': 3, 'automatic': 3}], ['control 3', {'principal': 200000, 'rate_bp': 0, 'months': 36, 'orig_value': 250000, 'prepay': {}}, {'request': 1, 'automatic': 1}], ['control 4', {'principal': 190000, 'rate_bp': 600, 'months': 24, 'orig_value': 200000, 'prepay': {'9': 40000}}, {'request': 4, 'automatic': 5}], ['control 5', {'principal': 180000, 'rate_bp': 0, 'months': 360, 'orig_value': 220000, 'prepay': {'11': 20000}}, {'request': 8, 'automatic': 17}], ['control 6', {'principal': 180000, 'rate_bp': 1200, 'months': 36, 'orig_value': 250000, 'prepay': {'5': 40000}}, {'request': 1, 'automatic': 1}]]]
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: midpoint precedence{'automatic': 218, 'request': 156}{'automatic': 181, 'request': 156}Failed
control 1{'automatic': 181, 'request': 1}{'automatic': 1, 'request': 1}Failed
control 2{'automatic': 61, 'request': 18}{'automatic': 29, 'request': 18}Failed
control 3{'automatic': 13, 'request': 5}{'automatic': 5, 'request': 5}Failed
control 4{'automatic': 13, 'request': 4}{'automatic': 4, 'request': 4}Failed
control 5{'automatic': 61, 'request': 22}{'automatic': 25, 'request': 22}Failed
control 6{'automatic': 19, 'request': 1}{'automatic': 1, 'request': 1}Failed

SHA-256 / 1bd1eab039df3ab1430a8f36be84a3076fcff1ca1aa4989e403f99efc6f7e0f0

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']
    n = x['months']
    pay = level(P, n)
    sched = actual = P
    auto = request = None
    for k in range(1, n + 1):
        sched -= pay - rnd(sched * bp, 120000)
        if actual > 0:
            actual -= pay - rnd(actual * bp, 120000)
            actual -= min(x['prepay'].get(str(k), 0), max(actual, 0))
        if request is None and actual * 100 <= 80 * x['orig_value']:
            request = k
        if auto is None and sched * 100 <= 78 * x['orig_value']:
            auto = k
    mid = n // 2 + 1
    auto = mid if auto is None else min(auto, mid)
    return {'request': request, 'automatic': auto}
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['regression: midpoint precedence', {'principal': 200000, 'rate_bp': 1200, 'months': 360, 'orig_value': 200000, 'prepay': {'23': 5000}}, {'request': 156, 'automatic': 181}], ['control 1', {'principal': 180000, 'rate_bp': 1200, 'months': 360, 'orig_value': 250000, 'prepay': {'21': 5000}}, {'request': 1, 'automatic': 1}], ['control 2', {'principal': 200000, 'rate_bp': 1200, 'months': 120, 'orig_value': 220000, 'prepay': {'11': 5000, '18': 40000}}, {'request': 18, 'automatic': 29}], ['control 3', {'principal': 190000, 'rate_bp': 1500, 'months': 24, 'orig_value': 200000, 'prepay': {'6': 20000, '5': 5000}}, {'request': 5, 'automatic': 5}], ['control 4', {'principal': 200000, 'rate_bp': 1200, 'months': 24, 'orig_value': 220000, 'prepay': {}}, {'request': 4, 'automatic': 4}], ['control 5', {'principal': 215000, 'rate_bp': 0, 'months': 120, 'orig_value': 220000, 'prepay': {}}, {'request': 22, 'automatic': 25}], ['control 6', {'principal': 160000, 'rate_bp': 600, 'months': 36, 'orig_value': 205000, 'prepay': {'8': 40000}}, {'request': 1, 'automatic': 1}]], [['regression: midpoint precedence', {'principal': 200000, 'rate_bp': 1500, 'months': 360, 'orig_value': 205000, 'prepay': {'24': 5000, '2': 20000}}, {'request': 33, 'automatic': 181}], ['control 1', {'principal': 200000, 'rate_bp': 0, 'months': 24, 'orig_value': 205000, 'prepay': {'5': 20000}}, {'request': 5, 'automatic': 5}], ['control 2', {'principal': 160000, 'rate_bp': 1200, 'months': 48, 'orig_value': 205000, 'prepay': {'7': 40000}}, {'request': 1, 'automatic': 1}], ['control 3', {'principal': 215000, 'rate_bp': 600, 'months': 24, 'orig_value': 200000, 'prepay': {'21': 20000}}, {'request': 7, 'automatic': 7}], ['control 4', {'principal': 190000, 'rate_bp': 0, 'months': 360, 'orig_value': 220000, 'prepay': {'12': 5000}}, {'request': 18, 'automatic': 35}], ['control 5', {'principal': 199000, 'rate_bp': 600, 'months': 36, 'orig_value': 205000, 'prepay': {'8': 40000, '21': 5000}}, {'request': 7, 'automatic': 8}], ['control 6', {'principal': 180000, 'rate_bp': 600, 'months': 60, 'orig_value': 200000, 'prepay': {'17': 40000, '6': 5000}}, {'request': 6, 'automatic': 10}]], [['regression: midpoint precedence', {'principal': 190000, 'rate_bp': 1500, 'months': 360, 'orig_value': 220000, 'prepay': {'22': 20000}}, {'request': 22, 'automatic': 181}], ['control 1', {'principal': 180000, 'rate_bp': 1200, 'months': 60, 'orig_value': 220000, 'prepay': {}}, {'request': 2, 'automatic': 4}], ['control 2', {'principal': 200000, 'rate_bp': 0, 'months': 48, 'orig_value': 220000, 'prepay': {}}, {'request': 6, 'automatic': 7}], ['control 3', {'principal': 160000, 'rate_bp': 1200, 'months': 360, 'orig_value': 250000, 'prepay': {'5': 40000}}, {'request': 1, 'automatic': 1}], ['control 4', {'principal': 215000, 'rate_bp': 1200, 'months': 24, 'orig_value': 205000, 'prepay': {'2': 5000}}, {'request': 6, 'automatic': 7}], ['control 5', {'principal': 215000, 'rate_bp': 600, 'months': 36, 'orig_value': 250000, 'prepay': {}}, {'request': 3, 'automatic': 4}], ['control 6', {'principal': 190000, 'rate_bp': 600, 'months': 48, 'orig_value': 200000, 'prepay': {'6': 20000}}, {'request': 6, 'automatic': 10}]], [['regression: midpoint precedence', {'principal': 190000, 'rate_bp': 1200, 'months': 360, 'orig_value': 205000, 'prepay': {'17': 20000}}, {'request': 35, 'automatic': 181}], ['control 1', {'principal': 200000, 'rate_bp': 0, 'months': 120, 'orig_value': 250000, 'prepay': {}}, {'request': 1, 'automatic': 3}], ['control 2', {'principal': 190000, 'rate_bp': 1500, 'months': 36, 'orig_value': 250000, 'prepay': {}}, {'request': 1, 'automatic': 1}], ['control 3', {'principal': 199000, 'rate_bp': 1500, 'months': 120, 'orig_value': 200000, 'prepay': {'22': 20000}}, {'request': 23, 'automatic': 45}], ['control 4', {'principal': 200000, 'rate_bp': 600, 'months': 360, 'orig_value': 205000, 'prepay': {'17': 20000}}, {'request': 54, 'automatic': 140}], ['control 5', {'principal': 199000, 'rate_bp': 1200, 'months': 48, 'orig_value': 200000, 'prepay': {'1': 5000}}, {'request': 10, 'automatic': 13}], ['control 6', {'principal': 180000, 'rate_bp': 1500, 'months': 24, 'orig_value': 220000, 'prepay': {}}, {'request': 1, 'automatic': 2}]], [['regression: midpoint precedence', {'principal': 199000, 'rate_bp': 1500, 'months': 360, 'orig_value': 220000, 'prepay': {}}, {'request': 194, 'automatic': 181}], ['control 1', {'principal': 199000, 'rate_bp': 600, 'months': 360, 'orig_value': 200000, 'prepay': {'22': 5000}}, {'request': 116, 'automatic': 148}], ['control 2', {'principal': 190000, 'rate_bp': 1500, 'months': 24, 'orig_value': 220000, 'prepay': {'6': 20000}}, {'request': 3, 'automatic': 3}], ['control 3', {'principal': 200000, 'rate_bp': 0, 'months': 36, 'orig_value': 250000, 'prepay': {}}, {'request': 1, 'automatic': 1}], ['control 4', {'principal': 190000, 'rate_bp': 600, 'months': 24, 'orig_value': 200000, 'prepay': {'9': 40000}}, {'request': 4, 'automatic': 5}], ['control 5', {'principal': 180000, 'rate_bp': 0, 'months': 360, 'orig_value': 220000, 'prepay': {'11': 20000}}, {'request': 8, 'automatic': 17}], ['control 6', {'principal': 180000, 'rate_bp': 1200, 'months': 36, 'orig_value': 250000, 'prepay': {'5': 40000}}, {'request': 1, 'automatic': 1}]]]
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: midpoint precedence{'automatic': 181, 'request': 156}{'automatic': 181, 'request': 156}Passed
control 1{'automatic': 1, 'request': 1}{'automatic': 1, 'request': 1}Passed
control 2{'automatic': 29, 'request': 18}{'automatic': 29, 'request': 18}Passed
control 3{'automatic': 5, 'request': 5}{'automatic': 5, 'request': 5}Passed
control 4{'automatic': 4, 'request': 4}{'automatic': 4, 'request': 4}Passed
control 5{'automatic': 25, 'request': 22}{'automatic': 25, 'request': 22}Passed
control 6{'automatic': 1, 'request': 1}{'automatic': 1, 'request': 1}Passed

SHA-256 / 38fb571fb0d127f487db8165f4adb270d50a40ad9a7bedbe07812881bb595a08

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.604227+00:00.

Case digest / 29021ef002b2535d5c72a9e4c742bb8a0b311166834ef2e4f3fed66348f9747d