FA-62876 / Insurance premium rating / Open access
Workers compensation experience modification: Excess credibility weight is applied to the wrong term · case 01
Mods overreact to excess losses and the expected-excess ballast is mostly discarded.
ROOT CAUSE
The weights W and 1-W are swapped between actual and expected excess losses.
VERIFIED REPAIR
Weight actual excess by W and expected excess by 1-W.
Unsuccessful approach: Using the full expected excess with W-weighted actuals double counts stabilising expected losses.
Case contract
Input expected (cents, >0 else 'invalid expected'), split, weight W (per mille), primary_ratio (per mille of expected that is primary), ballast B, claims [[amount, 'ind'|'med']]. Medical-only claims count at 30%. Each claim splits into primary min(v,split) and excess. mod=(Ap+W*Ae+(1-W)*Ee+B)/(E+B), returned in hundredths rounded half-up.
Why this case matters
Experience rating multiplies manual premium, so a wrong split, weight or reduction shifts an employer's premium.
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):
E=x['expected']
if E<=0: return 'invalid expected'
S=x['split']; W=Fraction(x['weight'],1000)
vals=[Fraction(amt)*Fraction(30,100) if kind=='med' else Fraction(amt) for amt,kind in x['claims']]
ap=sum(min(v,S) for v in vals)
ae=sum(vals)-ap
ep=Fraction(E*x['primary_ratio'],1000); ee=E-ep
B=x['ballast']
mod=(ap+(1-W)*ae+W*ee+B)/(E+B)
return int(mod*100+Fraction(1,2))
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['mixed claim history 0', {'expected': 311400, 'split': 17000, 'weight': 150, 'primary_ratio': 400, 'ballast': 80000, 'claims': [[33740, 'ind'], [37448, 'ind'], [55230, 'ind'], [10817, 'med']]}, 78], ['mixed claim history 1', {'expected': 767200, 'split': 17000, 'weight': 150, 'primary_ratio': 300, 'ballast': 80000, 'claims': [[42590, 'med'], [38435, 'med'], [27276, 'ind'], [26563, 'med'], [15138, 'ind'], [4744, 'ind'], [87257, 'ind'], [10244, 'med']]}, 75], ['mixed claim history 2', {'expected': 858400, 'split': 17000, 'weight': 150, 'primary_ratio': 400, 'ballast': 80000, 'claims': [[54743, 'med'], [57687, 'ind'], [5771, 'med'], [32069, 'ind'], [9463, 'med']]}, 62], ['mixed claim history 3', {'expected': 677800, 'split': 17000, 'weight': 250, 'primary_ratio': 350, 'ballast': 80000, 'claims': [[20283, 'ind'], [10778, 'ind'], [6643, 'med'], [45395, 'med'], [59048, 'ind'], [5648, 'med']]}, 64], ['mixed claim history 4', {'expected': 650900, 'split': 17000, 'weight': 200, 'primary_ratio': 400, 'ballast': 80000, 'claims': [[37467, 'ind'], [13425, 'med'], [17798, 'ind'], [25433, 'ind'], [13608, 'med']]}, 63], ['mixed claim history 5', {'expected': 447400, 'split': 17000, 'weight': 200, 'primary_ratio': 300, 'ballast': 80000, 'claims': [[41535, 'ind'], [48038, 'ind'], [32890, 'ind'], [5200, 'med']]}, 75], ['large medical-only claim', {'expected': 323600, 'split': 17000, 'weight': 250, 'primary_ratio': 350, 'ballast': 50000, 'claims': [[101990, 'med'], [5314, 'ind']]}, 62], ['claim free risk', {'expected': 867900, 'split': 17000, 'weight': 250, 'primary_ratio': 400, 'ballast': 50000, 'claims': []}, 48], ['invalid expected losses', {'expected': 0, 'split': 17000, 'weight': 150, 'primary_ratio': 400, 'ballast': 80000, 'claims': [[1000, 'ind']]}, 'invalid expected'], ['mod rounding near half point', {'expected': 797000, 'split': 17000, 'weight': 150, 'primary_ratio': 350, 'ballast': 80000, 'claims': [[11195, 'ind'], [36197, 'ind']]}, 63]], [['mixed claim history 0', {'expected': 316700, 'split': 17000, 'weight': 250, 'primary_ratio': 400, 'ballast': 80000, 'claims': [[10286, 'med'], [40310, 'med'], [26393, 'ind'], [5424, 'med']]}, 65], ['mixed claim history 1', {'expected': 859500, 'split': 17000, 'weight': 200, 'primary_ratio': 300, 'ballast': 80000, 'claims': [[23316, 'med'], [15025, 'ind'], [57735, 'ind'], [16008, 'ind'], [45146, 'ind'], [11487, 'med'], [60418, 'ind'], [6233, 'med']]}, 72], ['mixed claim history 2', {'expected': 896000, 'split': 17000, 'weight': 200, 'primary_ratio': 300, 'ballast': 50000, 'claims': [[21038, 'ind'], [5062, 'ind'], [14527, 'med'], [1264, 'med'], [4935, 'med'], [56017, 'ind'], [59572, 'ind'], [6562, 'med']]}, 67], ['mixed claim history 3', {'expected': 779700, 'split': 17000, 'weight': 250, 'primary_ratio': 400, 'ballast': 80000, 'claims': [[57322, 'ind'], [16107, 'med'], [20840, 'med'], [82520, 'ind'], [5448, 'med']]}, 59], ['mixed claim history 4', {'expected': 827000, 'split': 17000, 'weight': 200, 'primary_ratio': 300, 'ballast': 80000, 'claims': [[31790, 'ind'], [13488, 'ind'], [71208, 'ind'], [13222, 'med']]}, 67], ['mixed claim history 5', {'expected': 464000, 'split': 17000, 'weight': 150, 'primary_ratio': 300, 'ballast': 80000, 'claims': [[17834, 'ind'], [18093, 'med'], [30643, 'med'], [29993, 'med'], [55402, 'med'], [31809, 'ind'], [13749, 'med']]}, 80], ['large medical-only claim', {'expected': 469100, 'split': 17000, 'weight': 200, 'primary_ratio': 300, 'ballast': 50000, 'claims': [[101036, 'med'], [5613, 'ind']]}, 65], ['claim free risk', {'expected': 687800, 'split': 17000, 'weight': 200, 'primary_ratio': 400, 'ballast': 80000, 'claims': []}, 53], ['invalid expected losses', {'expected': 0, 'split': 17000, 'weight': 200, 'primary_ratio': 400, 'ballast': 80000, 'claims': [[1000, 'ind']]}, 'invalid expected'], ['mod rounding near half point', {'expected': 721000, 'split': 17000, 'weight': 250, 'primary_ratio': 350, 'ballast': 50000, 'claims': [[15423, 'ind'], [31956, 'ind']]}, 57]], [['mixed claim history 0', {'expected': 610400, 'split': 17000, 'weight': 150, 'primary_ratio': 400, 'ballast': 80000, 'claims': [[53344, 'ind'], [48923, 'ind'], [52350, 'ind'], [50819, 'ind'], [10135, 'ind'], [12464, 'ind'], [67060, 'ind'], [12311, 'med']]}, 77], ['mixed claim history 1', {'expected': 402300, 'split': 17000, 'weight': 250, 'primary_ratio': 400, 'ballast': 50000, 'claims': [[17334, 'ind'], [22438, 'ind'], [22151, 'med'], [26026, 'ind'], [7894, 'med']]}, 65], ['mixed claim history 2', {'expected': 498400, 'split': 17000, 'weight': 150, 'primary_ratio': 350, 'ballast': 50000, 'claims': [[48132, 'ind'], [8715, 'ind'], [59441, 'ind'], [20248, 'med'], [17905, 'ind'], [58937, 'med'], [80627, 'ind'], [7990, 'med']]}, 82], ['mixed claim history 3', {'expected': 464700, 'split': 17000, 'weight': 250, 'primary_ratio': 300, 'ballast': 50000, 'claims': [[13610, 'ind'], [3088, 'ind'], [43730, 'ind'], [8434, 'med']]}, 65], ['mixed claim history 4', {'expected': 879300, 'split': 17000, 'weight': 200, 'primary_ratio': 350, 'ballast': 50000, 'claims': [[13389, 'ind'], [32420, 'med'], [20542, 'ind'], [47517, 'ind'], [16287, 'ind'], [82017, 'ind'], [9410, 'med']]}, 67], ['mixed claim history 5', {'expected': 652900, 'split': 17000, 'weight': 200, 'primary_ratio': 350, 'ballast': 80000, 'claims': [[22810, 'ind'], [40463, 'ind'], [74251, 'ind'], [9218, 'med']]}, 67], ['large medical-only claim', {'expected': 703800, 'split': 17000, 'weight': 200, 'primary_ratio': 300, 'ballast': 50000, 'claims': [[84297, 'med'], [2962, 'ind']]}, 62], ['claim free risk', {'expected': 479000, 'split': 17000, 'weight': 250, 'primary_ratio': 300, 'ballast': 80000, 'claims': []}, 59], ['invalid expected losses', {'expected': 0, 'split': 17000, 'weight': 150, 'primary_ratio': 400, 'ballast': 80000, 'claims': [[1000, 'ind']]}, 'invalid expected'], ['mod rounding near half point', {'expected': 447500, 'split': 17000, 'weight': 150, 'primary_ratio': 350, 'ballast': 50000, 'claims': [[11462, 'ind'], [38751, 'ind']]}, 66]], [['mixed claim history 0', {'expected': 688800, 'split': 17000, 'weight': 200, 'primary_ratio': 400, 'ballast': 50000, 'claims': [[56711, 'ind'], [12536, 'med'], [30221, 'ind'], [51849, 'ind'], [13637, 'med']]}, 62], ['mixed claim history 1', {'expected': 402400, 'split': 17000, 'weight': 150, 'primary_ratio': 350, 'ballast': 80000, 'claims': [[14109, 'med'], [42085, 'ind'], [59677, 'ind'], [55680, 'ind'], [6934, 'med']]}, 78], ['mixed claim history 2', {'expected': 773600, 'split': 17000, 'weight': 200, 'primary_ratio': 300, 'ballast': 80000, 'claims': [[11209, 'med'], [26799, 'ind'], [10934, 'med'], [16129, 'ind'], [11873, 'ind'], [52155, 'ind'], [10727, 'med']]}, 70], ['mixed claim history 3', {'expected': 741200, 'split': 17000, 'weight': 250, 'primary_ratio': 300, 'ballast': 50000, 'claims': [[53124, 'ind'], [16325, 'ind'], [4833, 'ind'], [21033, 'ind'], [6837, 'ind'], [38580, 'ind'], [55554, 'ind'], [13784, 'med']]}, 71], ['mixed claim history 4', {'expected': 331500, 'split': 17000, 'weight': 250, 'primary_ratio': 300, 'ballast': 50000, 'claims': [[10786, 'ind'], [17213, 'med'], [39824, 'med'], [24282, 'ind'], [51513, 'ind'], [63075, 'ind'], [10156, 'med']]}, 86], ['mixed claim history 5', {'expected': 409600, 'split': 17000, 'weight': 200, 'primary_ratio': 300, 'ballast': 80000, 'claims': [[54286, 'ind'], [35703, 'ind'], [30503, 'med'], [59058, 'ind'], [56149, 'med'], [41950, 'ind'], [41088, 'ind'], [8047, 'med']]}, 92], ['large medical-only claim', {'expected': 831400, 'split': 17000, 'weight': 200, 'primary_ratio': 400, 'ballast': 50000, 'claims': [[107249, 'med'], [3434, 'ind']]}, 54], ['claim free risk', {'expected': 597500, 'split': 17000, 'weight': 250, 'primary_ratio': 350, 'ballast': 80000, 'claims': []}, 55], ['invalid expected losses', {'expected': 0, 'split': 17000, 'weight': 200, 'primary_ratio': 300, 'ballast': 50000, 'claims': [[1000, 'ind']]}, 'invalid expected'], ['mod rounding near half point', {'expected': 770300, 'split': 17000, 'weight': 200, 'primary_ratio': 400, 'ballast': 50000, 'claims': [[13951, 'ind'], [35547, 'ind']]}, 55]], [['mixed claim history 0', {'expected': 303600, 'split': 17000, 'weight': 150, 'primary_ratio': 350, 'ballast': 80000, 'claims': [[20599, 'ind'], [56506, 'ind'], [28670, 'ind'], [70657, 'ind'], [13633, 'med']]}, 88], ['mixed claim history 1', {'expected': 729600, 'split': 17000, 'weight': 250, 'primary_ratio': 400, 'ballast': 50000, 'claims': [[14990, 'med'], [18865, 'ind'], [35152, 'ind'], [37220, 'med'], [45354, 'ind'], [6673, 'med']]}, 59], ['mixed claim history 2', {'expected': 697600, 'split': 17000, 'weight': 200, 'primary_ratio': 350, 'ballast': 80000, 'claims': [[36216, 'ind'], [18993, 'ind'], [14909, 'ind'], [50234, 'med'], [88465, 'ind'], [7853, 'med']]}, 70], ['mixed claim history 3', {'expected': 334500, 'split': 17000, 'weight': 150, 'primary_ratio': 300, 'ballast': 80000, 'claims': [[8211, 'ind'], [19267, 'med'], [4256, 'med'], [47071, 'ind'], [74176, 'ind'], [8958, 'med']]}, 83], ['mixed claim history 4', {'expected': 758400, 'split': 17000, 'weight': 150, 'primary_ratio': 350, 'ballast': 80000, 'claims': [[24450, 'med'], [45271, 'ind'], [32248, 'med'], [53086, 'ind'], [11516, 'med']]}, 67], ['mixed claim history 5', {'expected': 883600, 'split': 17000, 'weight': 200, 'primary_ratio': 400, 'ballast': 80000, 'claims': [[42495, 'ind'], [9679, 'ind'], [36464, 'ind'], [26823, 'ind'], [63484, 'ind'], [12267, 'med']]}, 63], ['large medical-only claim', {'expected': 318100, 'split': 17000, 'weight': 150, 'primary_ratio': 350, 'ballast': 50000, 'claims': [[102133, 'med'], [5058, 'ind']]}, 68], ['claim free risk', {'expected': 634700, 'split': 17000, 'weight': 150, 'primary_ratio': 350, 'ballast': 80000, 'claims': []}, 60], ['invalid expected losses', {'expected': 0, 'split': 17000, 'weight': 250, 'primary_ratio': 350, 'ballast': 80000, 'claims': [[1000, 'ind']]}, 'invalid expected'], ['mod rounding near half point', {'expected': 457400, 'split': 17000, 'weight': 200, 'primary_ratio': 350, 'ballast': 80000, 'claims': [[12750, 'ind'], [32633, 'ind']]}, 65]]]
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 |
|---|---|---|---|
| mixed claim history 0 | 58 | 78 | Failed |
| mixed claim history 1 | 38 | 75 | Failed |
| mixed claim history 2 | 28 | 62 | Failed |
| mixed claim history 3 | 38 | 64 | Failed |
| mixed claim history 4 | 33 | 63 | Failed |
| mixed claim history 5 | 48 | 75 | Failed |
| large medical-only claim | 36 | 62 | Failed |
| claim free risk | 20 | 48 | Failed |
| invalid expected losses | invalid expected | invalid expected | Passed |
| mod rounding near half point | 23 | 63 | Failed |
SHA-256 / 81a3894d752ee9b339a7b8efd4ff697f97a571736335e6a6acb96919e8b5ce51
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):
E=x['expected']
if E<=0: return 'invalid expected'
S=x['split']; W=Fraction(x['weight'],1000)
vals=[Fraction(amt)*Fraction(30,100) if kind=='med' else Fraction(amt) for amt,kind in x['claims']]
ap=sum(min(v,S) for v in vals)
ae=sum(vals)-ap
ep=Fraction(E*x['primary_ratio'],1000); ee=E-ep
B=x['ballast']
mod=(ap+W*ae+ee+B)/(E+B)
return int(mod*100+Fraction(1,2))
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['mixed claim history 0', {'expected': 311400, 'split': 17000, 'weight': 150, 'primary_ratio': 400, 'ballast': 80000, 'claims': [[33740, 'ind'], [37448, 'ind'], [55230, 'ind'], [10817, 'med']]}, 78], ['mixed claim history 1', {'expected': 767200, 'split': 17000, 'weight': 150, 'primary_ratio': 300, 'ballast': 80000, 'claims': [[42590, 'med'], [38435, 'med'], [27276, 'ind'], [26563, 'med'], [15138, 'ind'], [4744, 'ind'], [87257, 'ind'], [10244, 'med']]}, 75], ['mixed claim history 2', {'expected': 858400, 'split': 17000, 'weight': 150, 'primary_ratio': 400, 'ballast': 80000, 'claims': [[54743, 'med'], [57687, 'ind'], [5771, 'med'], [32069, 'ind'], [9463, 'med']]}, 62], ['mixed claim history 3', {'expected': 677800, 'split': 17000, 'weight': 250, 'primary_ratio': 350, 'ballast': 80000, 'claims': [[20283, 'ind'], [10778, 'ind'], [6643, 'med'], [45395, 'med'], [59048, 'ind'], [5648, 'med']]}, 64], ['mixed claim history 4', {'expected': 650900, 'split': 17000, 'weight': 200, 'primary_ratio': 400, 'ballast': 80000, 'claims': [[37467, 'ind'], [13425, 'med'], [17798, 'ind'], [25433, 'ind'], [13608, 'med']]}, 63], ['mixed claim history 5', {'expected': 447400, 'split': 17000, 'weight': 200, 'primary_ratio': 300, 'ballast': 80000, 'claims': [[41535, 'ind'], [48038, 'ind'], [32890, 'ind'], [5200, 'med']]}, 75], ['large medical-only claim', {'expected': 323600, 'split': 17000, 'weight': 250, 'primary_ratio': 350, 'ballast': 50000, 'claims': [[101990, 'med'], [5314, 'ind']]}, 62], ['claim free risk', {'expected': 867900, 'split': 17000, 'weight': 250, 'primary_ratio': 400, 'ballast': 50000, 'claims': []}, 48], ['invalid expected losses', {'expected': 0, 'split': 17000, 'weight': 150, 'primary_ratio': 400, 'ballast': 80000, 'claims': [[1000, 'ind']]}, 'invalid expected'], ['mod rounding near half point', {'expected': 797000, 'split': 17000, 'weight': 150, 'primary_ratio': 350, 'ballast': 80000, 'claims': [[11195, 'ind'], [36197, 'ind']]}, 63]], [['mixed claim history 0', {'expected': 316700, 'split': 17000, 'weight': 250, 'primary_ratio': 400, 'ballast': 80000, 'claims': [[10286, 'med'], [40310, 'med'], [26393, 'ind'], [5424, 'med']]}, 65], ['mixed claim history 1', {'expected': 859500, 'split': 17000, 'weight': 200, 'primary_ratio': 300, 'ballast': 80000, 'claims': [[23316, 'med'], [15025, 'ind'], [57735, 'ind'], [16008, 'ind'], [45146, 'ind'], [11487, 'med'], [60418, 'ind'], [6233, 'med']]}, 72], ['mixed claim history 2', {'expected': 896000, 'split': 17000, 'weight': 200, 'primary_ratio': 300, 'ballast': 50000, 'claims': [[21038, 'ind'], [5062, 'ind'], [14527, 'med'], [1264, 'med'], [4935, 'med'], [56017, 'ind'], [59572, 'ind'], [6562, 'med']]}, 67], ['mixed claim history 3', {'expected': 779700, 'split': 17000, 'weight': 250, 'primary_ratio': 400, 'ballast': 80000, 'claims': [[57322, 'ind'], [16107, 'med'], [20840, 'med'], [82520, 'ind'], [5448, 'med']]}, 59], ['mixed claim history 4', {'expected': 827000, 'split': 17000, 'weight': 200, 'primary_ratio': 300, 'ballast': 80000, 'claims': [[31790, 'ind'], [13488, 'ind'], [71208, 'ind'], [13222, 'med']]}, 67], ['mixed claim history 5', {'expected': 464000, 'split': 17000, 'weight': 150, 'primary_ratio': 300, 'ballast': 80000, 'claims': [[17834, 'ind'], [18093, 'med'], [30643, 'med'], [29993, 'med'], [55402, 'med'], [31809, 'ind'], [13749, 'med']]}, 80], ['large medical-only claim', {'expected': 469100, 'split': 17000, 'weight': 200, 'primary_ratio': 300, 'ballast': 50000, 'claims': [[101036, 'med'], [5613, 'ind']]}, 65], ['claim free risk', {'expected': 687800, 'split': 17000, 'weight': 200, 'primary_ratio': 400, 'ballast': 80000, 'claims': []}, 53], ['invalid expected losses', {'expected': 0, 'split': 17000, 'weight': 200, 'primary_ratio': 400, 'ballast': 80000, 'claims': [[1000, 'ind']]}, 'invalid expected'], ['mod rounding near half point', {'expected': 721000, 'split': 17000, 'weight': 250, 'primary_ratio': 350, 'ballast': 50000, 'claims': [[15423, 'ind'], [31956, 'ind']]}, 57]], [['mixed claim history 0', {'expected': 610400, 'split': 17000, 'weight': 150, 'primary_ratio': 400, 'ballast': 80000, 'claims': [[53344, 'ind'], [48923, 'ind'], [52350, 'ind'], [50819, 'ind'], [10135, 'ind'], [12464, 'ind'], [67060, 'ind'], [12311, 'med']]}, 77], ['mixed claim history 1', {'expected': 402300, 'split': 17000, 'weight': 250, 'primary_ratio': 400, 'ballast': 50000, 'claims': [[17334, 'ind'], [22438, 'ind'], [22151, 'med'], [26026, 'ind'], [7894, 'med']]}, 65], ['mixed claim history 2', {'expected': 498400, 'split': 17000, 'weight': 150, 'primary_ratio': 350, 'ballast': 50000, 'claims': [[48132, 'ind'], [8715, 'ind'], [59441, 'ind'], [20248, 'med'], [17905, 'ind'], [58937, 'med'], [80627, 'ind'], [7990, 'med']]}, 82], ['mixed claim history 3', {'expected': 464700, 'split': 17000, 'weight': 250, 'primary_ratio': 300, 'ballast': 50000, 'claims': [[13610, 'ind'], [3088, 'ind'], [43730, 'ind'], [8434, 'med']]}, 65], ['mixed claim history 4', {'expected': 879300, 'split': 17000, 'weight': 200, 'primary_ratio': 350, 'ballast': 50000, 'claims': [[13389, 'ind'], [32420, 'med'], [20542, 'ind'], [47517, 'ind'], [16287, 'ind'], [82017, 'ind'], [9410, 'med']]}, 67], ['mixed claim history 5', {'expected': 652900, 'split': 17000, 'weight': 200, 'primary_ratio': 350, 'ballast': 80000, 'claims': [[22810, 'ind'], [40463, 'ind'], [74251, 'ind'], [9218, 'med']]}, 67], ['large medical-only claim', {'expected': 703800, 'split': 17000, 'weight': 200, 'primary_ratio': 300, 'ballast': 50000, 'claims': [[84297, 'med'], [2962, 'ind']]}, 62], ['claim free risk', {'expected': 479000, 'split': 17000, 'weight': 250, 'primary_ratio': 300, 'ballast': 80000, 'claims': []}, 59], ['invalid expected losses', {'expected': 0, 'split': 17000, 'weight': 150, 'primary_ratio': 400, 'ballast': 80000, 'claims': [[1000, 'ind']]}, 'invalid expected'], ['mod rounding near half point', {'expected': 447500, 'split': 17000, 'weight': 150, 'primary_ratio': 350, 'ballast': 50000, 'claims': [[11462, 'ind'], [38751, 'ind']]}, 66]], [['mixed claim history 0', {'expected': 688800, 'split': 17000, 'weight': 200, 'primary_ratio': 400, 'ballast': 50000, 'claims': [[56711, 'ind'], [12536, 'med'], [30221, 'ind'], [51849, 'ind'], [13637, 'med']]}, 62], ['mixed claim history 1', {'expected': 402400, 'split': 17000, 'weight': 150, 'primary_ratio': 350, 'ballast': 80000, 'claims': [[14109, 'med'], [42085, 'ind'], [59677, 'ind'], [55680, 'ind'], [6934, 'med']]}, 78], ['mixed claim history 2', {'expected': 773600, 'split': 17000, 'weight': 200, 'primary_ratio': 300, 'ballast': 80000, 'claims': [[11209, 'med'], [26799, 'ind'], [10934, 'med'], [16129, 'ind'], [11873, 'ind'], [52155, 'ind'], [10727, 'med']]}, 70], ['mixed claim history 3', {'expected': 741200, 'split': 17000, 'weight': 250, 'primary_ratio': 300, 'ballast': 50000, 'claims': [[53124, 'ind'], [16325, 'ind'], [4833, 'ind'], [21033, 'ind'], [6837, 'ind'], [38580, 'ind'], [55554, 'ind'], [13784, 'med']]}, 71], ['mixed claim history 4', {'expected': 331500, 'split': 17000, 'weight': 250, 'primary_ratio': 300, 'ballast': 50000, 'claims': [[10786, 'ind'], [17213, 'med'], [39824, 'med'], [24282, 'ind'], [51513, 'ind'], [63075, 'ind'], [10156, 'med']]}, 86], ['mixed claim history 5', {'expected': 409600, 'split': 17000, 'weight': 200, 'primary_ratio': 300, 'ballast': 80000, 'claims': [[54286, 'ind'], [35703, 'ind'], [30503, 'med'], [59058, 'ind'], [56149, 'med'], [41950, 'ind'], [41088, 'ind'], [8047, 'med']]}, 92], ['large medical-only claim', {'expected': 831400, 'split': 17000, 'weight': 200, 'primary_ratio': 400, 'ballast': 50000, 'claims': [[107249, 'med'], [3434, 'ind']]}, 54], ['claim free risk', {'expected': 597500, 'split': 17000, 'weight': 250, 'primary_ratio': 350, 'ballast': 80000, 'claims': []}, 55], ['invalid expected losses', {'expected': 0, 'split': 17000, 'weight': 200, 'primary_ratio': 300, 'ballast': 50000, 'claims': [[1000, 'ind']]}, 'invalid expected'], ['mod rounding near half point', {'expected': 770300, 'split': 17000, 'weight': 200, 'primary_ratio': 400, 'ballast': 50000, 'claims': [[13951, 'ind'], [35547, 'ind']]}, 55]], [['mixed claim history 0', {'expected': 303600, 'split': 17000, 'weight': 150, 'primary_ratio': 350, 'ballast': 80000, 'claims': [[20599, 'ind'], [56506, 'ind'], [28670, 'ind'], [70657, 'ind'], [13633, 'med']]}, 88], ['mixed claim history 1', {'expected': 729600, 'split': 17000, 'weight': 250, 'primary_ratio': 400, 'ballast': 50000, 'claims': [[14990, 'med'], [18865, 'ind'], [35152, 'ind'], [37220, 'med'], [45354, 'ind'], [6673, 'med']]}, 59], ['mixed claim history 2', {'expected': 697600, 'split': 17000, 'weight': 200, 'primary_ratio': 350, 'ballast': 80000, 'claims': [[36216, 'ind'], [18993, 'ind'], [14909, 'ind'], [50234, 'med'], [88465, 'ind'], [7853, 'med']]}, 70], ['mixed claim history 3', {'expected': 334500, 'split': 17000, 'weight': 150, 'primary_ratio': 300, 'ballast': 80000, 'claims': [[8211, 'ind'], [19267, 'med'], [4256, 'med'], [47071, 'ind'], [74176, 'ind'], [8958, 'med']]}, 83], ['mixed claim history 4', {'expected': 758400, 'split': 17000, 'weight': 150, 'primary_ratio': 350, 'ballast': 80000, 'claims': [[24450, 'med'], [45271, 'ind'], [32248, 'med'], [53086, 'ind'], [11516, 'med']]}, 67], ['mixed claim history 5', {'expected': 883600, 'split': 17000, 'weight': 200, 'primary_ratio': 400, 'ballast': 80000, 'claims': [[42495, 'ind'], [9679, 'ind'], [36464, 'ind'], [26823, 'ind'], [63484, 'ind'], [12267, 'med']]}, 63], ['large medical-only claim', {'expected': 318100, 'split': 17000, 'weight': 150, 'primary_ratio': 350, 'ballast': 50000, 'claims': [[102133, 'med'], [5058, 'ind']]}, 68], ['claim free risk', {'expected': 634700, 'split': 17000, 'weight': 150, 'primary_ratio': 350, 'ballast': 80000, 'claims': []}, 60], ['invalid expected losses', {'expected': 0, 'split': 17000, 'weight': 250, 'primary_ratio': 350, 'ballast': 80000, 'claims': [[1000, 'ind']]}, 'invalid expected'], ['mod rounding near half point', {'expected': 457400, 'split': 17000, 'weight': 200, 'primary_ratio': 350, 'ballast': 80000, 'claims': [[12750, 'ind'], [32633, 'ind']]}, 65]]]
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 |
|---|---|---|---|
| mixed claim history 0 | 85 | 78 | Failed |
| mixed claim history 1 | 85 | 75 | Failed |
| mixed claim history 2 | 70 | 62 | Failed |
| mixed claim history 3 | 78 | 64 | Failed |
| mixed claim history 4 | 73 | 63 | Failed |
| mixed claim history 5 | 87 | 75 | Failed |
| large medical-only claim | 77 | 62 | Failed |
| claim free risk | 62 | 48 | Failed |
| invalid expected losses | invalid expected | invalid expected | Passed |
| mod rounding near half point | 72 | 63 | Failed |
SHA-256 / d51281400f32648b785f87cc1e3dd675427bc9c2b43049ac1090a5d8285d9463
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):
E=x['expected']
if E<=0: return 'invalid expected'
S=x['split']; W=Fraction(x['weight'],1000)
vals=[Fraction(amt)*Fraction(30,100) if kind=='med' else Fraction(amt) for amt,kind in x['claims']]
ap=sum(min(v,S) for v in vals)
ae=sum(vals)-ap
ep=Fraction(E*x['primary_ratio'],1000); ee=E-ep
B=x['ballast']
mod=(ap+W*ae+(1-W)*ee+B)/(E+B)
return int(mod*100+Fraction(1,2))
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['mixed claim history 0', {'expected': 311400, 'split': 17000, 'weight': 150, 'primary_ratio': 400, 'ballast': 80000, 'claims': [[33740, 'ind'], [37448, 'ind'], [55230, 'ind'], [10817, 'med']]}, 78], ['mixed claim history 1', {'expected': 767200, 'split': 17000, 'weight': 150, 'primary_ratio': 300, 'ballast': 80000, 'claims': [[42590, 'med'], [38435, 'med'], [27276, 'ind'], [26563, 'med'], [15138, 'ind'], [4744, 'ind'], [87257, 'ind'], [10244, 'med']]}, 75], ['mixed claim history 2', {'expected': 858400, 'split': 17000, 'weight': 150, 'primary_ratio': 400, 'ballast': 80000, 'claims': [[54743, 'med'], [57687, 'ind'], [5771, 'med'], [32069, 'ind'], [9463, 'med']]}, 62], ['mixed claim history 3', {'expected': 677800, 'split': 17000, 'weight': 250, 'primary_ratio': 350, 'ballast': 80000, 'claims': [[20283, 'ind'], [10778, 'ind'], [6643, 'med'], [45395, 'med'], [59048, 'ind'], [5648, 'med']]}, 64], ['mixed claim history 4', {'expected': 650900, 'split': 17000, 'weight': 200, 'primary_ratio': 400, 'ballast': 80000, 'claims': [[37467, 'ind'], [13425, 'med'], [17798, 'ind'], [25433, 'ind'], [13608, 'med']]}, 63], ['mixed claim history 5', {'expected': 447400, 'split': 17000, 'weight': 200, 'primary_ratio': 300, 'ballast': 80000, 'claims': [[41535, 'ind'], [48038, 'ind'], [32890, 'ind'], [5200, 'med']]}, 75], ['large medical-only claim', {'expected': 323600, 'split': 17000, 'weight': 250, 'primary_ratio': 350, 'ballast': 50000, 'claims': [[101990, 'med'], [5314, 'ind']]}, 62], ['claim free risk', {'expected': 867900, 'split': 17000, 'weight': 250, 'primary_ratio': 400, 'ballast': 50000, 'claims': []}, 48], ['invalid expected losses', {'expected': 0, 'split': 17000, 'weight': 150, 'primary_ratio': 400, 'ballast': 80000, 'claims': [[1000, 'ind']]}, 'invalid expected'], ['mod rounding near half point', {'expected': 797000, 'split': 17000, 'weight': 150, 'primary_ratio': 350, 'ballast': 80000, 'claims': [[11195, 'ind'], [36197, 'ind']]}, 63]], [['mixed claim history 0', {'expected': 316700, 'split': 17000, 'weight': 250, 'primary_ratio': 400, 'ballast': 80000, 'claims': [[10286, 'med'], [40310, 'med'], [26393, 'ind'], [5424, 'med']]}, 65], ['mixed claim history 1', {'expected': 859500, 'split': 17000, 'weight': 200, 'primary_ratio': 300, 'ballast': 80000, 'claims': [[23316, 'med'], [15025, 'ind'], [57735, 'ind'], [16008, 'ind'], [45146, 'ind'], [11487, 'med'], [60418, 'ind'], [6233, 'med']]}, 72], ['mixed claim history 2', {'expected': 896000, 'split': 17000, 'weight': 200, 'primary_ratio': 300, 'ballast': 50000, 'claims': [[21038, 'ind'], [5062, 'ind'], [14527, 'med'], [1264, 'med'], [4935, 'med'], [56017, 'ind'], [59572, 'ind'], [6562, 'med']]}, 67], ['mixed claim history 3', {'expected': 779700, 'split': 17000, 'weight': 250, 'primary_ratio': 400, 'ballast': 80000, 'claims': [[57322, 'ind'], [16107, 'med'], [20840, 'med'], [82520, 'ind'], [5448, 'med']]}, 59], ['mixed claim history 4', {'expected': 827000, 'split': 17000, 'weight': 200, 'primary_ratio': 300, 'ballast': 80000, 'claims': [[31790, 'ind'], [13488, 'ind'], [71208, 'ind'], [13222, 'med']]}, 67], ['mixed claim history 5', {'expected': 464000, 'split': 17000, 'weight': 150, 'primary_ratio': 300, 'ballast': 80000, 'claims': [[17834, 'ind'], [18093, 'med'], [30643, 'med'], [29993, 'med'], [55402, 'med'], [31809, 'ind'], [13749, 'med']]}, 80], ['large medical-only claim', {'expected': 469100, 'split': 17000, 'weight': 200, 'primary_ratio': 300, 'ballast': 50000, 'claims': [[101036, 'med'], [5613, 'ind']]}, 65], ['claim free risk', {'expected': 687800, 'split': 17000, 'weight': 200, 'primary_ratio': 400, 'ballast': 80000, 'claims': []}, 53], ['invalid expected losses', {'expected': 0, 'split': 17000, 'weight': 200, 'primary_ratio': 400, 'ballast': 80000, 'claims': [[1000, 'ind']]}, 'invalid expected'], ['mod rounding near half point', {'expected': 721000, 'split': 17000, 'weight': 250, 'primary_ratio': 350, 'ballast': 50000, 'claims': [[15423, 'ind'], [31956, 'ind']]}, 57]], [['mixed claim history 0', {'expected': 610400, 'split': 17000, 'weight': 150, 'primary_ratio': 400, 'ballast': 80000, 'claims': [[53344, 'ind'], [48923, 'ind'], [52350, 'ind'], [50819, 'ind'], [10135, 'ind'], [12464, 'ind'], [67060, 'ind'], [12311, 'med']]}, 77], ['mixed claim history 1', {'expected': 402300, 'split': 17000, 'weight': 250, 'primary_ratio': 400, 'ballast': 50000, 'claims': [[17334, 'ind'], [22438, 'ind'], [22151, 'med'], [26026, 'ind'], [7894, 'med']]}, 65], ['mixed claim history 2', {'expected': 498400, 'split': 17000, 'weight': 150, 'primary_ratio': 350, 'ballast': 50000, 'claims': [[48132, 'ind'], [8715, 'ind'], [59441, 'ind'], [20248, 'med'], [17905, 'ind'], [58937, 'med'], [80627, 'ind'], [7990, 'med']]}, 82], ['mixed claim history 3', {'expected': 464700, 'split': 17000, 'weight': 250, 'primary_ratio': 300, 'ballast': 50000, 'claims': [[13610, 'ind'], [3088, 'ind'], [43730, 'ind'], [8434, 'med']]}, 65], ['mixed claim history 4', {'expected': 879300, 'split': 17000, 'weight': 200, 'primary_ratio': 350, 'ballast': 50000, 'claims': [[13389, 'ind'], [32420, 'med'], [20542, 'ind'], [47517, 'ind'], [16287, 'ind'], [82017, 'ind'], [9410, 'med']]}, 67], ['mixed claim history 5', {'expected': 652900, 'split': 17000, 'weight': 200, 'primary_ratio': 350, 'ballast': 80000, 'claims': [[22810, 'ind'], [40463, 'ind'], [74251, 'ind'], [9218, 'med']]}, 67], ['large medical-only claim', {'expected': 703800, 'split': 17000, 'weight': 200, 'primary_ratio': 300, 'ballast': 50000, 'claims': [[84297, 'med'], [2962, 'ind']]}, 62], ['claim free risk', {'expected': 479000, 'split': 17000, 'weight': 250, 'primary_ratio': 300, 'ballast': 80000, 'claims': []}, 59], ['invalid expected losses', {'expected': 0, 'split': 17000, 'weight': 150, 'primary_ratio': 400, 'ballast': 80000, 'claims': [[1000, 'ind']]}, 'invalid expected'], ['mod rounding near half point', {'expected': 447500, 'split': 17000, 'weight': 150, 'primary_ratio': 350, 'ballast': 50000, 'claims': [[11462, 'ind'], [38751, 'ind']]}, 66]], [['mixed claim history 0', {'expected': 688800, 'split': 17000, 'weight': 200, 'primary_ratio': 400, 'ballast': 50000, 'claims': [[56711, 'ind'], [12536, 'med'], [30221, 'ind'], [51849, 'ind'], [13637, 'med']]}, 62], ['mixed claim history 1', {'expected': 402400, 'split': 17000, 'weight': 150, 'primary_ratio': 350, 'ballast': 80000, 'claims': [[14109, 'med'], [42085, 'ind'], [59677, 'ind'], [55680, 'ind'], [6934, 'med']]}, 78], ['mixed claim history 2', {'expected': 773600, 'split': 17000, 'weight': 200, 'primary_ratio': 300, 'ballast': 80000, 'claims': [[11209, 'med'], [26799, 'ind'], [10934, 'med'], [16129, 'ind'], [11873, 'ind'], [52155, 'ind'], [10727, 'med']]}, 70], ['mixed claim history 3', {'expected': 741200, 'split': 17000, 'weight': 250, 'primary_ratio': 300, 'ballast': 50000, 'claims': [[53124, 'ind'], [16325, 'ind'], [4833, 'ind'], [21033, 'ind'], [6837, 'ind'], [38580, 'ind'], [55554, 'ind'], [13784, 'med']]}, 71], ['mixed claim history 4', {'expected': 331500, 'split': 17000, 'weight': 250, 'primary_ratio': 300, 'ballast': 50000, 'claims': [[10786, 'ind'], [17213, 'med'], [39824, 'med'], [24282, 'ind'], [51513, 'ind'], [63075, 'ind'], [10156, 'med']]}, 86], ['mixed claim history 5', {'expected': 409600, 'split': 17000, 'weight': 200, 'primary_ratio': 300, 'ballast': 80000, 'claims': [[54286, 'ind'], [35703, 'ind'], [30503, 'med'], [59058, 'ind'], [56149, 'med'], [41950, 'ind'], [41088, 'ind'], [8047, 'med']]}, 92], ['large medical-only claim', {'expected': 831400, 'split': 17000, 'weight': 200, 'primary_ratio': 400, 'ballast': 50000, 'claims': [[107249, 'med'], [3434, 'ind']]}, 54], ['claim free risk', {'expected': 597500, 'split': 17000, 'weight': 250, 'primary_ratio': 350, 'ballast': 80000, 'claims': []}, 55], ['invalid expected losses', {'expected': 0, 'split': 17000, 'weight': 200, 'primary_ratio': 300, 'ballast': 50000, 'claims': [[1000, 'ind']]}, 'invalid expected'], ['mod rounding near half point', {'expected': 770300, 'split': 17000, 'weight': 200, 'primary_ratio': 400, 'ballast': 50000, 'claims': [[13951, 'ind'], [35547, 'ind']]}, 55]], [['mixed claim history 0', {'expected': 303600, 'split': 17000, 'weight': 150, 'primary_ratio': 350, 'ballast': 80000, 'claims': [[20599, 'ind'], [56506, 'ind'], [28670, 'ind'], [70657, 'ind'], [13633, 'med']]}, 88], ['mixed claim history 1', {'expected': 729600, 'split': 17000, 'weight': 250, 'primary_ratio': 400, 'ballast': 50000, 'claims': [[14990, 'med'], [18865, 'ind'], [35152, 'ind'], [37220, 'med'], [45354, 'ind'], [6673, 'med']]}, 59], ['mixed claim history 2', {'expected': 697600, 'split': 17000, 'weight': 200, 'primary_ratio': 350, 'ballast': 80000, 'claims': [[36216, 'ind'], [18993, 'ind'], [14909, 'ind'], [50234, 'med'], [88465, 'ind'], [7853, 'med']]}, 70], ['mixed claim history 3', {'expected': 334500, 'split': 17000, 'weight': 150, 'primary_ratio': 300, 'ballast': 80000, 'claims': [[8211, 'ind'], [19267, 'med'], [4256, 'med'], [47071, 'ind'], [74176, 'ind'], [8958, 'med']]}, 83], ['mixed claim history 4', {'expected': 758400, 'split': 17000, 'weight': 150, 'primary_ratio': 350, 'ballast': 80000, 'claims': [[24450, 'med'], [45271, 'ind'], [32248, 'med'], [53086, 'ind'], [11516, 'med']]}, 67], ['mixed claim history 5', {'expected': 883600, 'split': 17000, 'weight': 200, 'primary_ratio': 400, 'ballast': 80000, 'claims': [[42495, 'ind'], [9679, 'ind'], [36464, 'ind'], [26823, 'ind'], [63484, 'ind'], [12267, 'med']]}, 63], ['large medical-only claim', {'expected': 318100, 'split': 17000, 'weight': 150, 'primary_ratio': 350, 'ballast': 50000, 'claims': [[102133, 'med'], [5058, 'ind']]}, 68], ['claim free risk', {'expected': 634700, 'split': 17000, 'weight': 150, 'primary_ratio': 350, 'ballast': 80000, 'claims': []}, 60], ['invalid expected losses', {'expected': 0, 'split': 17000, 'weight': 250, 'primary_ratio': 350, 'ballast': 80000, 'claims': [[1000, 'ind']]}, 'invalid expected'], ['mod rounding near half point', {'expected': 457400, 'split': 17000, 'weight': 200, 'primary_ratio': 350, 'ballast': 80000, 'claims': [[12750, 'ind'], [32633, 'ind']]}, 65]]]
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 |
|---|---|---|---|
| mixed claim history 0 | 78 | 78 | Passed |
| mixed claim history 1 | 75 | 75 | Passed |
| mixed claim history 2 | 62 | 62 | Passed |
| mixed claim history 3 | 64 | 64 | Passed |
| mixed claim history 4 | 63 | 63 | Passed |
| mixed claim history 5 | 75 | 75 | Passed |
| large medical-only claim | 62 | 62 | Passed |
| claim free risk | 48 | 48 | Passed |
| invalid expected losses | invalid expected | invalid expected | Passed |
| mod rounding near half point | 63 | 63 | Passed |
SHA-256 / 1cfbef2e2cbf37158f0eda0836fcac0551b9ba9cd55c9cf8a95469548fa5871f
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:08.799762+00:00.
Case digest / f6bb8cd139ee351d693080a428df85d6536c94af528c3b944abff65fac800791