FAILURE MAP
← Case archive

FA-63091 / Insurance premium rating / Open access

Premium installment schedule: Rounding remainder lands on the first installment · case 01

The first installment is larger than the rest instead of the final one.

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

ROOT CAUSE

The leftover cents are added to the first scheduled installment.

VERIFIED REPAIR

Add rest - each*k to the last installment.

Unsuccessful approach: Spreading the leftover cents one by one over the earliest installments still moves them off the last payment.

Case contract

Input premium, n total payments including the down payment (n<1 -> 'invalid'; n==1 -> [premium], no fee), down (per mille), fee per installment. Down = premium*down/1000 rounded half-up; the rest splits over n-1 installments by floor division with the remainder added to the last installment; each installment after the down payment carries the fee.

Why this case matters

Installment billing must collect exactly the premium plus disclosed fees, with remainders placed where the plan says.

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):
    p=x['premium']; n=x['n']
    if n<1: return 'invalid'
    if n==1: return [p]
    down=math.floor(Fraction(p*x['down'],1000)+Fraction(1,2))
    rest=p-down
    k=n-1
    each=rest//k
    pays=[each]*k
    pays[0]+=rest-each*k
    return [down]+[v+x['fee'] for v in pays]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['4-pay plan', {'premium': 200651, 'n': 4, 'down': 167, 'fee': 800}, [33509, 56514, 56514, 56514]], ['6-pay plan', {'premium': 350494, 'n': 6, 'down': 167, 'fee': 800}, [58532, 59192, 59192, 59192, 59192, 59194]], ['10-pay plan', {'premium': 279898, 'n': 10, 'down': 167, 'fee': 500}, [46743, 26406, 26406, 26406, 26406, 26406, 26406, 26406, 26406, 26407]], ['12-pay plan', {'premium': 102439, 'n': 12, 'down': 167, 'fee': 800}, [17107, 8557, 8557, 8557, 8557, 8557, 8557, 8557, 8557, 8557, 8557, 8562]], ['paid in full', {'premium': 307291, 'n': 1, 'down': 167, 'fee': 800}, [307291]], ['two-pay plan', {'premium': 207937, 'n': 2, 'down': 200, 'fee': 300}, [41587, 166650]], ['remainder near divisor', {'premium': 120011, 'n': 12, 'down': 250, 'fee': 800}, [30003, 8982, 8982, 8982, 8982, 8982, 8982, 8982, 8982, 8982, 8982, 8988]], ['zero payments rejected', {'premium': 268868, 'n': 0, 'down': 167, 'fee': 800}, 'invalid'], ['uneven split', {'premium': 196615, 'n': 3, 'down': 333, 'fee': 500}, [65473, 66071, 66071]]], [['4-pay plan', {'premium': 278629, 'n': 4, 'down': 200, 'fee': 500}, [55726, 74801, 74801, 74801]], ['6-pay plan', {'premium': 140214, 'n': 6, 'down': 167, 'fee': 800}, [23416, 24159, 24159, 24159, 24159, 24162]], ['10-pay plan', {'premium': 288301, 'n': 10, 'down': 200, 'fee': 300}, [57660, 25926, 25926, 25926, 25926, 25926, 25926, 25926, 25926, 25933]], ['12-pay plan', {'premium': 203291, 'n': 12, 'down': 167, 'fee': 300}, [33950, 15694, 15694, 15694, 15694, 15694, 15694, 15694, 15694, 15694, 15694, 15701]], ['paid in full', {'premium': 290219, 'n': 1, 'down': 200, 'fee': 500}, [290219]], ['two-pay plan', {'premium': 327447, 'n': 2, 'down': 167, 'fee': 800}, [54684, 273563]], ['remainder near divisor', {'premium': 240010, 'n': 12, 'down': 250, 'fee': 500}, [60003, 16864, 16864, 16864, 16864, 16864, 16864, 16864, 16864, 16864, 16864, 16867]], ['zero payments rejected', {'premium': 110809, 'n': 0, 'down': 200, 'fee': 500}, 'invalid'], ['uneven split', {'premium': 194859, 'n': 3, 'down': 333, 'fee': 500}, [64888, 65485, 65486]]], [['4-pay plan', {'premium': 99003, 'n': 4, 'down': 250, 'fee': 800}, [24751, 25550, 25550, 25552]], ['6-pay plan', {'premium': 189567, 'n': 6, 'down': 200, 'fee': 300}, [37913, 30630, 30630, 30630, 30630, 30634]], ['10-pay plan', {'premium': 125451, 'n': 10, 'down': 250, 'fee': 300}, [31363, 10754, 10754, 10754, 10754, 10754, 10754, 10754, 10754, 10756]], ['12-pay plan', {'premium': 268137, 'n': 12, 'down': 167, 'fee': 300}, [44779, 20605, 20605, 20605, 20605, 20605, 20605, 20605, 20605, 20605, 20605, 20608]], ['paid in full', {'premium': 154367, 'n': 1, 'down': 167, 'fee': 300}, [154367]], ['two-pay plan', {'premium': 232264, 'n': 2, 'down': 250, 'fee': 300}, [58066, 174498]], ['remainder near divisor', {'premium': 360009, 'n': 12, 'down': 250, 'fee': 300}, [90002, 24846, 24846, 24846, 24846, 24846, 24846, 24846, 24846, 24846, 24846, 24847]], ['zero payments rejected', {'premium': 340488, 'n': 0, 'down': 250, 'fee': 800}, 'invalid'], ['uneven split', {'premium': 186247, 'n': 3, 'down': 333, 'fee': 300}, [62020, 62413, 62414]]], [['4-pay plan', {'premium': 244184, 'n': 4, 'down': 250, 'fee': 500}, [61046, 61546, 61546, 61546]], ['6-pay plan', {'premium': 208899, 'n': 6, 'down': 250, 'fee': 300}, [52225, 31634, 31634, 31634, 31634, 31638]], ['10-pay plan', {'premium': 356410, 'n': 10, 'down': 167, 'fee': 500}, [59520, 33487, 33487, 33487, 33487, 33487, 33487, 33487, 33487, 33494]], ['12-pay plan', {'premium': 259663, 'n': 12, 'down': 167, 'fee': 300}, [43364, 19963, 19963, 19963, 19963, 19963, 19963, 19963, 19963, 19963, 19963, 19969]], ['paid in full', {'premium': 141455, 'n': 1, 'down': 200, 'fee': 500}, [141455]], ['two-pay plan', {'premium': 363430, 'n': 2, 'down': 167, 'fee': 300}, [60693, 303037]], ['remainder near divisor', {'premium': 480011, 'n': 12, 'down': 250, 'fee': 500}, [120003, 33228, 33228, 33228, 33228, 33228, 33228, 33228, 33228, 33228, 33228, 33228]], ['zero payments rejected', {'premium': 319176, 'n': 0, 'down': 250, 'fee': 300}, 'invalid'], ['uneven split', {'premium': 168985, 'n': 3, 'down': 333, 'fee': 500}, [56272, 56856, 56857]]], [['4-pay plan', {'premium': 198200, 'n': 4, 'down': 250, 'fee': 500}, [49550, 50050, 50050, 50050]], ['6-pay plan', {'premium': 321940, 'n': 6, 'down': 167, 'fee': 800}, [53764, 54435, 54435, 54435, 54435, 54436]], ['10-pay plan', {'premium': 145512, 'n': 10, 'down': 250, 'fee': 800}, [36378, 12926, 12926, 12926, 12926, 12926, 12926, 12926, 12926, 12926]], ['12-pay plan', {'premium': 277547, 'n': 12, 'down': 167, 'fee': 300}, [46350, 21317, 21317, 21317, 21317, 21317, 21317, 21317, 21317, 21317, 21317, 21327]], ['paid in full', {'premium': 169996, 'n': 1, 'down': 250, 'fee': 500}, [169996]], ['two-pay plan', {'premium': 85146, 'n': 2, 'down': 250, 'fee': 300}, [21287, 64159]], ['remainder near divisor', {'premium': 600010, 'n': 12, 'down': 250, 'fee': 300}, [150003, 41209, 41209, 41209, 41209, 41209, 41209, 41209, 41209, 41209, 41209, 41217]], ['zero payments rejected', {'premium': 285765, 'n': 0, 'down': 200, 'fee': 500}, 'invalid'], ['uneven split', {'premium': 136733, 'n': 3, 'down': 333, 'fee': 300}, [45532, 45900, 45901]]]]
for label, args, expected in fixtures[N-1]:
    check(label, solve(args), 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
4-pay plan[33509, 56514, 56514, 56514][33509, 56514, 56514, 56514]Passed
6-pay plan[58532, 59194, 59192, 59192, 59192, 59192][58532, 59192, 59192, 59192, 59192, 59194]Failed
10-pay plan[46743, 26407, 26406, 26406, 26406, 26406, 26406, 26406, 26406, 26406][46743, 26406, 26406, 26406, 26406, 26406, 26406, 26406, 26406, 26407]Failed
12-pay plan[17107, 8562, 8557, 8557, 8557, 8557, 8557, 8557, 8557, 8557, 8557, 8557][17107, 8557, 8557, 8557, 8557, 8557, 8557, 8557, 8557, 8557, 8557, 8562]Failed
paid in full[307291][307291]Passed
two-pay plan[41587, 166650][41587, 166650]Passed
remainder near divisor[30003, 8988, 8982, 8982, 8982, 8982, 8982, 8982, 8982, 8982, 8982, 8982][30003, 8982, 8982, 8982, 8982, 8982, 8982, 8982, 8982, 8982, 8982, 8988]Failed
zero payments rejectedinvalidinvalidPassed
uneven split[65473, 66071, 66071][65473, 66071, 66071]Passed

SHA-256 / 2a61769eb937940f087e15eccb6d2b44f6752aeb20dc4f8392e9d871fd461f13

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):
    p=x['premium']; n=x['n']
    if n<1: return 'invalid'
    if n==1: return [p]
    down=math.floor(Fraction(p*x['down'],1000)+Fraction(1,2))
    rest=p-down
    k=n-1
    each=rest//k
    pays=[each]*k
    for j in range(rest-each*k): pays[j]+=1
    return [down]+[v+x['fee'] for v in pays]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['4-pay plan', {'premium': 200651, 'n': 4, 'down': 167, 'fee': 800}, [33509, 56514, 56514, 56514]], ['6-pay plan', {'premium': 350494, 'n': 6, 'down': 167, 'fee': 800}, [58532, 59192, 59192, 59192, 59192, 59194]], ['10-pay plan', {'premium': 279898, 'n': 10, 'down': 167, 'fee': 500}, [46743, 26406, 26406, 26406, 26406, 26406, 26406, 26406, 26406, 26407]], ['12-pay plan', {'premium': 102439, 'n': 12, 'down': 167, 'fee': 800}, [17107, 8557, 8557, 8557, 8557, 8557, 8557, 8557, 8557, 8557, 8557, 8562]], ['paid in full', {'premium': 307291, 'n': 1, 'down': 167, 'fee': 800}, [307291]], ['two-pay plan', {'premium': 207937, 'n': 2, 'down': 200, 'fee': 300}, [41587, 166650]], ['remainder near divisor', {'premium': 120011, 'n': 12, 'down': 250, 'fee': 800}, [30003, 8982, 8982, 8982, 8982, 8982, 8982, 8982, 8982, 8982, 8982, 8988]], ['zero payments rejected', {'premium': 268868, 'n': 0, 'down': 167, 'fee': 800}, 'invalid'], ['uneven split', {'premium': 196615, 'n': 3, 'down': 333, 'fee': 500}, [65473, 66071, 66071]]], [['4-pay plan', {'premium': 278629, 'n': 4, 'down': 200, 'fee': 500}, [55726, 74801, 74801, 74801]], ['6-pay plan', {'premium': 140214, 'n': 6, 'down': 167, 'fee': 800}, [23416, 24159, 24159, 24159, 24159, 24162]], ['10-pay plan', {'premium': 288301, 'n': 10, 'down': 200, 'fee': 300}, [57660, 25926, 25926, 25926, 25926, 25926, 25926, 25926, 25926, 25933]], ['12-pay plan', {'premium': 203291, 'n': 12, 'down': 167, 'fee': 300}, [33950, 15694, 15694, 15694, 15694, 15694, 15694, 15694, 15694, 15694, 15694, 15701]], ['paid in full', {'premium': 290219, 'n': 1, 'down': 200, 'fee': 500}, [290219]], ['two-pay plan', {'premium': 327447, 'n': 2, 'down': 167, 'fee': 800}, [54684, 273563]], ['remainder near divisor', {'premium': 240010, 'n': 12, 'down': 250, 'fee': 500}, [60003, 16864, 16864, 16864, 16864, 16864, 16864, 16864, 16864, 16864, 16864, 16867]], ['zero payments rejected', {'premium': 110809, 'n': 0, 'down': 200, 'fee': 500}, 'invalid'], ['uneven split', {'premium': 194859, 'n': 3, 'down': 333, 'fee': 500}, [64888, 65485, 65486]]], [['4-pay plan', {'premium': 99003, 'n': 4, 'down': 250, 'fee': 800}, [24751, 25550, 25550, 25552]], ['6-pay plan', {'premium': 189567, 'n': 6, 'down': 200, 'fee': 300}, [37913, 30630, 30630, 30630, 30630, 30634]], ['10-pay plan', {'premium': 125451, 'n': 10, 'down': 250, 'fee': 300}, [31363, 10754, 10754, 10754, 10754, 10754, 10754, 10754, 10754, 10756]], ['12-pay plan', {'premium': 268137, 'n': 12, 'down': 167, 'fee': 300}, [44779, 20605, 20605, 20605, 20605, 20605, 20605, 20605, 20605, 20605, 20605, 20608]], ['paid in full', {'premium': 154367, 'n': 1, 'down': 167, 'fee': 300}, [154367]], ['two-pay plan', {'premium': 232264, 'n': 2, 'down': 250, 'fee': 300}, [58066, 174498]], ['remainder near divisor', {'premium': 360009, 'n': 12, 'down': 250, 'fee': 300}, [90002, 24846, 24846, 24846, 24846, 24846, 24846, 24846, 24846, 24846, 24846, 24847]], ['zero payments rejected', {'premium': 340488, 'n': 0, 'down': 250, 'fee': 800}, 'invalid'], ['uneven split', {'premium': 186247, 'n': 3, 'down': 333, 'fee': 300}, [62020, 62413, 62414]]], [['4-pay plan', {'premium': 244184, 'n': 4, 'down': 250, 'fee': 500}, [61046, 61546, 61546, 61546]], ['6-pay plan', {'premium': 208899, 'n': 6, 'down': 250, 'fee': 300}, [52225, 31634, 31634, 31634, 31634, 31638]], ['10-pay plan', {'premium': 356410, 'n': 10, 'down': 167, 'fee': 500}, [59520, 33487, 33487, 33487, 33487, 33487, 33487, 33487, 33487, 33494]], ['12-pay plan', {'premium': 259663, 'n': 12, 'down': 167, 'fee': 300}, [43364, 19963, 19963, 19963, 19963, 19963, 19963, 19963, 19963, 19963, 19963, 19969]], ['paid in full', {'premium': 141455, 'n': 1, 'down': 200, 'fee': 500}, [141455]], ['two-pay plan', {'premium': 363430, 'n': 2, 'down': 167, 'fee': 300}, [60693, 303037]], ['remainder near divisor', {'premium': 480011, 'n': 12, 'down': 250, 'fee': 500}, [120003, 33228, 33228, 33228, 33228, 33228, 33228, 33228, 33228, 33228, 33228, 33228]], ['zero payments rejected', {'premium': 319176, 'n': 0, 'down': 250, 'fee': 300}, 'invalid'], ['uneven split', {'premium': 168985, 'n': 3, 'down': 333, 'fee': 500}, [56272, 56856, 56857]]], [['4-pay plan', {'premium': 198200, 'n': 4, 'down': 250, 'fee': 500}, [49550, 50050, 50050, 50050]], ['6-pay plan', {'premium': 321940, 'n': 6, 'down': 167, 'fee': 800}, [53764, 54435, 54435, 54435, 54435, 54436]], ['10-pay plan', {'premium': 145512, 'n': 10, 'down': 250, 'fee': 800}, [36378, 12926, 12926, 12926, 12926, 12926, 12926, 12926, 12926, 12926]], ['12-pay plan', {'premium': 277547, 'n': 12, 'down': 167, 'fee': 300}, [46350, 21317, 21317, 21317, 21317, 21317, 21317, 21317, 21317, 21317, 21317, 21327]], ['paid in full', {'premium': 169996, 'n': 1, 'down': 250, 'fee': 500}, [169996]], ['two-pay plan', {'premium': 85146, 'n': 2, 'down': 250, 'fee': 300}, [21287, 64159]], ['remainder near divisor', {'premium': 600010, 'n': 12, 'down': 250, 'fee': 300}, [150003, 41209, 41209, 41209, 41209, 41209, 41209, 41209, 41209, 41209, 41209, 41217]], ['zero payments rejected', {'premium': 285765, 'n': 0, 'down': 200, 'fee': 500}, 'invalid'], ['uneven split', {'premium': 136733, 'n': 3, 'down': 333, 'fee': 300}, [45532, 45900, 45901]]]]
for label, args, expected in fixtures[N-1]:
    check(label, solve(args), 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
4-pay plan[33509, 56514, 56514, 56514][33509, 56514, 56514, 56514]Passed
6-pay plan[58532, 59193, 59193, 59192, 59192, 59192][58532, 59192, 59192, 59192, 59192, 59194]Failed
10-pay plan[46743, 26407, 26406, 26406, 26406, 26406, 26406, 26406, 26406, 26406][46743, 26406, 26406, 26406, 26406, 26406, 26406, 26406, 26406, 26407]Failed
12-pay plan[17107, 8558, 8558, 8558, 8558, 8558, 8557, 8557, 8557, 8557, 8557, 8557][17107, 8557, 8557, 8557, 8557, 8557, 8557, 8557, 8557, 8557, 8557, 8562]Failed
paid in full[307291][307291]Passed
two-pay plan[41587, 166650][41587, 166650]Passed
remainder near divisor[30003, 8983, 8983, 8983, 8983, 8983, 8983, 8982, 8982, 8982, 8982, 8982][30003, 8982, 8982, 8982, 8982, 8982, 8982, 8982, 8982, 8982, 8982, 8988]Failed
zero payments rejectedinvalidinvalidPassed
uneven split[65473, 66071, 66071][65473, 66071, 66071]Passed

SHA-256 / c6f6b3e4e1ffcab04d32c82bf0437e249ec92aeaa9b617a28287fc9ca3f86927

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):
    p=x['premium']; n=x['n']
    if n<1: return 'invalid'
    if n==1: return [p]
    down=math.floor(Fraction(p*x['down'],1000)+Fraction(1,2))
    rest=p-down
    k=n-1
    each=rest//k
    pays=[each]*k
    pays[-1]+=rest-each*k
    return [down]+[v+x['fee'] for v in pays]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['4-pay plan', {'premium': 200651, 'n': 4, 'down': 167, 'fee': 800}, [33509, 56514, 56514, 56514]], ['6-pay plan', {'premium': 350494, 'n': 6, 'down': 167, 'fee': 800}, [58532, 59192, 59192, 59192, 59192, 59194]], ['10-pay plan', {'premium': 279898, 'n': 10, 'down': 167, 'fee': 500}, [46743, 26406, 26406, 26406, 26406, 26406, 26406, 26406, 26406, 26407]], ['12-pay plan', {'premium': 102439, 'n': 12, 'down': 167, 'fee': 800}, [17107, 8557, 8557, 8557, 8557, 8557, 8557, 8557, 8557, 8557, 8557, 8562]], ['paid in full', {'premium': 307291, 'n': 1, 'down': 167, 'fee': 800}, [307291]], ['two-pay plan', {'premium': 207937, 'n': 2, 'down': 200, 'fee': 300}, [41587, 166650]], ['remainder near divisor', {'premium': 120011, 'n': 12, 'down': 250, 'fee': 800}, [30003, 8982, 8982, 8982, 8982, 8982, 8982, 8982, 8982, 8982, 8982, 8988]], ['zero payments rejected', {'premium': 268868, 'n': 0, 'down': 167, 'fee': 800}, 'invalid'], ['uneven split', {'premium': 196615, 'n': 3, 'down': 333, 'fee': 500}, [65473, 66071, 66071]]], [['4-pay plan', {'premium': 278629, 'n': 4, 'down': 200, 'fee': 500}, [55726, 74801, 74801, 74801]], ['6-pay plan', {'premium': 140214, 'n': 6, 'down': 167, 'fee': 800}, [23416, 24159, 24159, 24159, 24159, 24162]], ['10-pay plan', {'premium': 288301, 'n': 10, 'down': 200, 'fee': 300}, [57660, 25926, 25926, 25926, 25926, 25926, 25926, 25926, 25926, 25933]], ['12-pay plan', {'premium': 203291, 'n': 12, 'down': 167, 'fee': 300}, [33950, 15694, 15694, 15694, 15694, 15694, 15694, 15694, 15694, 15694, 15694, 15701]], ['paid in full', {'premium': 290219, 'n': 1, 'down': 200, 'fee': 500}, [290219]], ['two-pay plan', {'premium': 327447, 'n': 2, 'down': 167, 'fee': 800}, [54684, 273563]], ['remainder near divisor', {'premium': 240010, 'n': 12, 'down': 250, 'fee': 500}, [60003, 16864, 16864, 16864, 16864, 16864, 16864, 16864, 16864, 16864, 16864, 16867]], ['zero payments rejected', {'premium': 110809, 'n': 0, 'down': 200, 'fee': 500}, 'invalid'], ['uneven split', {'premium': 194859, 'n': 3, 'down': 333, 'fee': 500}, [64888, 65485, 65486]]], [['4-pay plan', {'premium': 99003, 'n': 4, 'down': 250, 'fee': 800}, [24751, 25550, 25550, 25552]], ['6-pay plan', {'premium': 189567, 'n': 6, 'down': 200, 'fee': 300}, [37913, 30630, 30630, 30630, 30630, 30634]], ['10-pay plan', {'premium': 125451, 'n': 10, 'down': 250, 'fee': 300}, [31363, 10754, 10754, 10754, 10754, 10754, 10754, 10754, 10754, 10756]], ['12-pay plan', {'premium': 268137, 'n': 12, 'down': 167, 'fee': 300}, [44779, 20605, 20605, 20605, 20605, 20605, 20605, 20605, 20605, 20605, 20605, 20608]], ['paid in full', {'premium': 154367, 'n': 1, 'down': 167, 'fee': 300}, [154367]], ['two-pay plan', {'premium': 232264, 'n': 2, 'down': 250, 'fee': 300}, [58066, 174498]], ['remainder near divisor', {'premium': 360009, 'n': 12, 'down': 250, 'fee': 300}, [90002, 24846, 24846, 24846, 24846, 24846, 24846, 24846, 24846, 24846, 24846, 24847]], ['zero payments rejected', {'premium': 340488, 'n': 0, 'down': 250, 'fee': 800}, 'invalid'], ['uneven split', {'premium': 186247, 'n': 3, 'down': 333, 'fee': 300}, [62020, 62413, 62414]]], [['4-pay plan', {'premium': 244184, 'n': 4, 'down': 250, 'fee': 500}, [61046, 61546, 61546, 61546]], ['6-pay plan', {'premium': 208899, 'n': 6, 'down': 250, 'fee': 300}, [52225, 31634, 31634, 31634, 31634, 31638]], ['10-pay plan', {'premium': 356410, 'n': 10, 'down': 167, 'fee': 500}, [59520, 33487, 33487, 33487, 33487, 33487, 33487, 33487, 33487, 33494]], ['12-pay plan', {'premium': 259663, 'n': 12, 'down': 167, 'fee': 300}, [43364, 19963, 19963, 19963, 19963, 19963, 19963, 19963, 19963, 19963, 19963, 19969]], ['paid in full', {'premium': 141455, 'n': 1, 'down': 200, 'fee': 500}, [141455]], ['two-pay plan', {'premium': 363430, 'n': 2, 'down': 167, 'fee': 300}, [60693, 303037]], ['remainder near divisor', {'premium': 480011, 'n': 12, 'down': 250, 'fee': 500}, [120003, 33228, 33228, 33228, 33228, 33228, 33228, 33228, 33228, 33228, 33228, 33228]], ['zero payments rejected', {'premium': 319176, 'n': 0, 'down': 250, 'fee': 300}, 'invalid'], ['uneven split', {'premium': 168985, 'n': 3, 'down': 333, 'fee': 500}, [56272, 56856, 56857]]], [['4-pay plan', {'premium': 198200, 'n': 4, 'down': 250, 'fee': 500}, [49550, 50050, 50050, 50050]], ['6-pay plan', {'premium': 321940, 'n': 6, 'down': 167, 'fee': 800}, [53764, 54435, 54435, 54435, 54435, 54436]], ['10-pay plan', {'premium': 145512, 'n': 10, 'down': 250, 'fee': 800}, [36378, 12926, 12926, 12926, 12926, 12926, 12926, 12926, 12926, 12926]], ['12-pay plan', {'premium': 277547, 'n': 12, 'down': 167, 'fee': 300}, [46350, 21317, 21317, 21317, 21317, 21317, 21317, 21317, 21317, 21317, 21317, 21327]], ['paid in full', {'premium': 169996, 'n': 1, 'down': 250, 'fee': 500}, [169996]], ['two-pay plan', {'premium': 85146, 'n': 2, 'down': 250, 'fee': 300}, [21287, 64159]], ['remainder near divisor', {'premium': 600010, 'n': 12, 'down': 250, 'fee': 300}, [150003, 41209, 41209, 41209, 41209, 41209, 41209, 41209, 41209, 41209, 41209, 41217]], ['zero payments rejected', {'premium': 285765, 'n': 0, 'down': 200, 'fee': 500}, 'invalid'], ['uneven split', {'premium': 136733, 'n': 3, 'down': 333, 'fee': 300}, [45532, 45900, 45901]]]]
for label, args, expected in fixtures[N-1]:
    check(label, solve(args), 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
4-pay plan[33509, 56514, 56514, 56514][33509, 56514, 56514, 56514]Passed
6-pay plan[58532, 59192, 59192, 59192, 59192, 59194][58532, 59192, 59192, 59192, 59192, 59194]Passed
10-pay plan[46743, 26406, 26406, 26406, 26406, 26406, 26406, 26406, 26406, 26407][46743, 26406, 26406, 26406, 26406, 26406, 26406, 26406, 26406, 26407]Passed
12-pay plan[17107, 8557, 8557, 8557, 8557, 8557, 8557, 8557, 8557, 8557, 8557, 8562][17107, 8557, 8557, 8557, 8557, 8557, 8557, 8557, 8557, 8557, 8557, 8562]Passed
paid in full[307291][307291]Passed
two-pay plan[41587, 166650][41587, 166650]Passed
remainder near divisor[30003, 8982, 8982, 8982, 8982, 8982, 8982, 8982, 8982, 8982, 8982, 8988][30003, 8982, 8982, 8982, 8982, 8982, 8982, 8982, 8982, 8982, 8982, 8988]Passed
zero payments rejectedinvalidinvalidPassed
uneven split[65473, 66071, 66071][65473, 66071, 66071]Passed

SHA-256 / e702a40e6f03e6c74a03c2e3634e86537fdb0068820ecd4ea464560b2f061b8f

Verification & scope

A deterministic bounded teaching model of a stipulated toy rating contract. Amounts are integer cents and factors exact rationals; it makes no claim of conformance with any filed rating plan, bureau manual or jurisdiction. 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:47:10.898891+00:00.

Case digest / fd4ac45e651919738642d67cf4cfeb2f2dfe3635e69023529e0698850951b307