FA-63111 / Insurance premium rating / Open access
Premium installment schedule: Level installments are rounded up · case 01
Level installments exceed the balance share and the last installment is reduced.
ROOT CAUSE
The level installment uses ceiling division.
THE FAILURE
The level installment uses ceiling division.
Unsuccessful approach: Nearest rounding still rounds up whenever the remainder exceeds half the divisor.
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[-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, 59193, 59193, 59193, 59193, 59190] | [58532, 59192, 59192, 59192, 59192, 59194] | Failed |
| 10-pay plan | [46743, 26407, 26407, 26407, 26407, 26407, 26407, 26407, 26407, 26399] | [46743, 26406, 26406, 26406, 26406, 26406, 26406, 26406, 26406, 26407] | Failed |
| 12-pay plan | [17107, 8558, 8558, 8558, 8558, 8558, 8558, 8558, 8558, 8558, 8558, 8552] | [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, 8983, 8983, 8983, 8983, 8978] | [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 / ef70788e100e7fc992ee094087d2a0dfd184e5765859d06a7e3575768bf1196f
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=round(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, 8983, 8983, 8983, 8983, 8983, 8983, 8983, 8983, 8983, 8983, 8978] | [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 / b43c018c60ac78425ed3b35ac1700e39f64370c725e1176a047c10fd58c837f8
HELD IN THE MEMBER ARCHIVE
The verified repair and its recorded checks are member-only.
This mechanism has 9 recorded checks per implementation. The open-access tier publishes the failure and the unsuccessful fix; the repaired source that passes every check, and the observations that prove it, are available to members.
Every case sharing this mechanism uses the same contract and the same repair, so this one record is held back for all of them.
Member access is invitation-based. Sign in with your invited account to inspect the repair.
Sign in to the archive ↗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:11.165175+00:00.
Case digest / ee73aa44faa0ec15ae9ed5993e24368aae642f1b78d43e50e96ca87203eaf1fa