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.
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 fixture | Actual | Expected | Outcome |
|---|---|---|---|
| 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 rejected | invalid | invalid | Passed |
| 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 fixture | Actual | Expected | Outcome |
|---|---|---|---|
| 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 rejected | invalid | invalid | Passed |
| 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 fixture | Actual | Expected | Outcome |
|---|---|---|---|
| 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 rejected | invalid | invalid | Passed |
| 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