FA-63651 / Actuarial life tables / Open access
Gompertz-Makeham survival: Makeham constant is not multiplied by duration · case 01
Accident-hazard contribution does not grow with duration.
ROOT CAUSE
The Makeham constant is added once.
VERIFIED REPAIR
Integrate A over the duration: A t.
Unsuccessful approach: Multiplying by age uses the wrong variable.
Case contract
Input A, B, c, age, t (floats). B<0, c<1 or A<=-B -> 'invalid parameters'. Cumulative hazard H = A t + B c^x (c^t-1)/ln c (c=1: (A+B) t). Return [exp(-H), mu at x+t = A + B c^(x+t)] rounded to 8.
Why this case matters
Life-table arithmetic compounds across ages, so one misplaced index or assumption shifts every downstream value.
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):
A=x['A']; B=x['B']; c=x['c']; a=x['age']; t=x['t']
if B<0 or c<1 or A<=-B: return 'invalid parameters'
if c==1: H=(A+B)*t
else: H=A+B*c**a*(c**t-1)/math.log(c)
mu=A+B*c**(a+t)
return [round(math.exp(-H),8),round(mu,8)]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['makeham 0', {'A': 0.001, 'B': 3e-05, 'c': 1.12, 'age': 76, 't': 2.5}, [0.61903389, 0.22014725]], ['makeham 1', {'A': 0.001, 'B': 5e-05, 'c': 1.08, 'age': 44, 't': 10}, [0.96826103, 0.00419046]], ['makeham 2', {'A': 0.001, 'B': 0.0001, 'c': 1.12, 'age': 42, 't': 10}, [0.7970066, 0.03725243]], ['makeham 3', {'A': 0.0005, 'B': 5e-05, 'c': 1.12, 'age': 61, 't': 10}, [0.39101048, 0.15661679]], ['gompertz only', {'A': 0.0, 'B': 4e-05, 'c': 1.1, 'age': 51, 't': 3}, [0.98222186, 0.00687488]], ['constant force degenerate', {'A': 0.002, 'B': 0.001, 'c': 1.0, 'age': 40, 't': 4}, [0.98807171, 0.003]], ['c below one rejected', {'A': 0.001, 'B': 0.0001, 'c': 0.95, 'age': 40, 't': 1}, 'invalid parameters'], ['negative total force rejected', {'A': -0.01, 'B': 0.001, 'c': 1.1, 'age': 40, 't': 1}, 'invalid parameters']], [['makeham 0', {'A': 0.001, 'B': 3e-05, 'c': 1.08, 'age': 35, 't': 2.5}, [0.99628416, 0.00153767]], ['makeham 1', {'A': 0.001, 'B': 3e-05, 'c': 1.1, 'age': 78, 't': 10}, [0.42348454, 0.13272783]], ['makeham 2', {'A': 0.0007, 'B': 0.0001, 'c': 1.08, 'age': 34, 't': 5}, [0.98822133, 0.00271153]], ['makeham 3', {'A': 0.0005, 'B': 3e-05, 'c': 1.08, 'age': 32, 't': 1}, [0.99913436, 0.00088028]], ['gompertz only', {'A': 0.0, 'B': 4e-05, 'c': 1.1, 'age': 52, 't': 3}, [0.98046153, 0.00756237]], ['constant force degenerate', {'A': 0.002, 'B': 0.002, 'c': 1.0, 'age': 40, 't': 4}, [0.98412732, 0.004]], ['c below one rejected', {'A': 0.001, 'B': 0.0001, 'c': 0.95, 'age': 40, 't': 1}, 'invalid parameters'], ['negative total force rejected', {'A': -0.01, 'B': 0.001, 'c': 1.1, 'age': 40, 't': 1}, 'invalid parameters']], [['makeham 0', {'A': 0.0005, 'B': 0.0001, 'c': 1.12, 'age': 44, 't': 2.5}, [0.95736913, 0.01993739]], ['makeham 1', {'A': 0.0005, 'B': 5e-05, 'c': 1.08, 'age': 40, 't': 5}, [0.99091741, 0.00209602]], ['makeham 2', {'A': 0.0007, 'B': 3e-05, 'c': 1.08, 'age': 42, 't': 2.5}, [0.99616179, 0.00162146]], ['makeham 3', {'A': 0.0005, 'B': 5e-05, 'c': 1.1, 'age': 58, 't': 5}, [0.92026523, 0.02076325]], ['gompertz only', {'A': 0.0, 'B': 4e-05, 'c': 1.1, 'age': 53, 't': 3}, [0.9785288, 0.0083186]], ['constant force degenerate', {'A': 0.002, 'B': 0.003, 'c': 1.0, 'age': 40, 't': 4}, [0.98019867, 0.005]], ['c below one rejected', {'A': 0.001, 'B': 0.0001, 'c': 0.95, 'age': 40, 't': 1}, 'invalid parameters'], ['negative total force rejected', {'A': -0.01, 'B': 0.001, 'c': 1.1, 'age': 40, 't': 1}, 'invalid parameters']], [['makeham 0', {'A': 0.0007, 'B': 3e-05, 'c': 1.1, 'age': 36, 't': 1}, [0.99832839, 0.00172012]], ['makeham 1', {'A': 0.0007, 'B': 5e-05, 'c': 1.1, 'age': 45, 't': 10}, [0.93431427, 0.01015296]], ['makeham 2', {'A': 0.0005, 'B': 0.0001, 'c': 1.1, 'age': 76, 't': 10}, [0.0958952, 0.36338659]], ['makeham 3', {'A': 0.0005, 'B': 5e-05, 'c': 1.1, 'age': 53, 't': 5}, [0.94881434, 0.01308189]], ['gompertz only', {'A': 0.0, 'B': 4e-05, 'c': 1.1, 'age': 54, 't': 3}, [0.9764072, 0.00915046]], ['constant force degenerate', {'A': 0.002, 'B': 0.004, 'c': 1.0, 'age': 40, 't': 4}, [0.97628571, 0.006]], ['c below one rejected', {'A': 0.001, 'B': 0.0001, 'c': 0.95, 'age': 40, 't': 1}, 'invalid parameters'], ['negative total force rejected', {'A': -0.01, 'B': 0.001, 'c': 1.1, 'age': 40, 't': 1}, 'invalid parameters']], [['makeham 0', {'A': 0.0005, 'B': 3e-05, 'c': 1.08, 'age': 65, 't': 10}, [0.93033322, 0.01013614]], ['makeham 1', {'A': 0.0005, 'B': 5e-05, 'c': 1.08, 'age': 49, 't': 2.5}, [0.9927903, 0.00313205]], ['makeham 2', {'A': 0.0005, 'B': 5e-05, 'c': 1.12, 'age': 76, 't': 10}, [0.00599143, 0.85501552]], ['makeham 3', {'A': 0.0005, 'B': 3e-05, 'c': 1.12, 'age': 54, 't': 10}, [0.77220735, 0.04287158]], ['gompertz only', {'A': 0.0, 'B': 4e-05, 'c': 1.1, 'age': 55, 't': 3}, [0.97407875, 0.01006551]], ['constant force degenerate', {'A': 0.002, 'B': 0.005, 'c': 1.0, 'age': 40, 't': 4}, [0.97238837, 0.007]], ['c below one rejected', {'A': 0.001, 'B': 0.0001, 'c': 0.95, 'age': 40, 't': 1}, 'invalid parameters'], ['negative total force rejected', {'A': -0.01, 'B': 0.001, 'c': 1.1, 'age': 40, 't': 1}, 'invalid parameters']]]
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 |
|---|---|---|---|
| makeham 0 | [0.61996314, 0.22014725] | [0.61903389, 0.22014725] | Failed |
| makeham 1 | [0.97701471, 0.00419046] | [0.96826103, 0.00419046] | Failed |
| makeham 2 | [0.80421204, 0.03725243] | [0.7970066, 0.03725243] | Failed |
| makeham 3 | [0.39277399, 0.15661679] | [0.39101048, 0.15661679] | Failed |
| gompertz only | [0.98222186, 0.00687488] | [0.98222186, 0.00687488] | Passed |
| constant force degenerate | [0.98807171, 0.003] | [0.98807171, 0.003] | Passed |
| c below one rejected | invalid parameters | invalid parameters | Passed |
| negative total force rejected | invalid parameters | invalid parameters | Passed |
SHA-256 / 7ffa6b8f257a12a1c64aed9bd60d57fb86c6119c085c4405b8699eb4e4c74c7c
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):
A=x['A']; B=x['B']; c=x['c']; a=x['age']; t=x['t']
if B<0 or c<1 or A<=-B: return 'invalid parameters'
if c==1: H=(A+B)*t
else: H=A*a+B*c**a*(c**t-1)/math.log(c)
mu=A+B*c**(a+t)
return [round(math.exp(-H),8),round(mu,8)]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['makeham 0', {'A': 0.001, 'B': 3e-05, 'c': 1.12, 'age': 76, 't': 2.5}, [0.61903389, 0.22014725]], ['makeham 1', {'A': 0.001, 'B': 5e-05, 'c': 1.08, 'age': 44, 't': 10}, [0.96826103, 0.00419046]], ['makeham 2', {'A': 0.001, 'B': 0.0001, 'c': 1.12, 'age': 42, 't': 10}, [0.7970066, 0.03725243]], ['makeham 3', {'A': 0.0005, 'B': 5e-05, 'c': 1.12, 'age': 61, 't': 10}, [0.39101048, 0.15661679]], ['gompertz only', {'A': 0.0, 'B': 4e-05, 'c': 1.1, 'age': 51, 't': 3}, [0.98222186, 0.00687488]], ['constant force degenerate', {'A': 0.002, 'B': 0.001, 'c': 1.0, 'age': 40, 't': 4}, [0.98807171, 0.003]], ['c below one rejected', {'A': 0.001, 'B': 0.0001, 'c': 0.95, 'age': 40, 't': 1}, 'invalid parameters'], ['negative total force rejected', {'A': -0.01, 'B': 0.001, 'c': 1.1, 'age': 40, 't': 1}, 'invalid parameters']], [['makeham 0', {'A': 0.001, 'B': 3e-05, 'c': 1.08, 'age': 35, 't': 2.5}, [0.99628416, 0.00153767]], ['makeham 1', {'A': 0.001, 'B': 3e-05, 'c': 1.1, 'age': 78, 't': 10}, [0.42348454, 0.13272783]], ['makeham 2', {'A': 0.0007, 'B': 0.0001, 'c': 1.08, 'age': 34, 't': 5}, [0.98822133, 0.00271153]], ['makeham 3', {'A': 0.0005, 'B': 3e-05, 'c': 1.08, 'age': 32, 't': 1}, [0.99913436, 0.00088028]], ['gompertz only', {'A': 0.0, 'B': 4e-05, 'c': 1.1, 'age': 52, 't': 3}, [0.98046153, 0.00756237]], ['constant force degenerate', {'A': 0.002, 'B': 0.002, 'c': 1.0, 'age': 40, 't': 4}, [0.98412732, 0.004]], ['c below one rejected', {'A': 0.001, 'B': 0.0001, 'c': 0.95, 'age': 40, 't': 1}, 'invalid parameters'], ['negative total force rejected', {'A': -0.01, 'B': 0.001, 'c': 1.1, 'age': 40, 't': 1}, 'invalid parameters']], [['makeham 0', {'A': 0.0005, 'B': 0.0001, 'c': 1.12, 'age': 44, 't': 2.5}, [0.95736913, 0.01993739]], ['makeham 1', {'A': 0.0005, 'B': 5e-05, 'c': 1.08, 'age': 40, 't': 5}, [0.99091741, 0.00209602]], ['makeham 2', {'A': 0.0007, 'B': 3e-05, 'c': 1.08, 'age': 42, 't': 2.5}, [0.99616179, 0.00162146]], ['makeham 3', {'A': 0.0005, 'B': 5e-05, 'c': 1.1, 'age': 58, 't': 5}, [0.92026523, 0.02076325]], ['gompertz only', {'A': 0.0, 'B': 4e-05, 'c': 1.1, 'age': 53, 't': 3}, [0.9785288, 0.0083186]], ['constant force degenerate', {'A': 0.002, 'B': 0.003, 'c': 1.0, 'age': 40, 't': 4}, [0.98019867, 0.005]], ['c below one rejected', {'A': 0.001, 'B': 0.0001, 'c': 0.95, 'age': 40, 't': 1}, 'invalid parameters'], ['negative total force rejected', {'A': -0.01, 'B': 0.001, 'c': 1.1, 'age': 40, 't': 1}, 'invalid parameters']], [['makeham 0', {'A': 0.0007, 'B': 3e-05, 'c': 1.1, 'age': 36, 't': 1}, [0.99832839, 0.00172012]], ['makeham 1', {'A': 0.0007, 'B': 5e-05, 'c': 1.1, 'age': 45, 't': 10}, [0.93431427, 0.01015296]], ['makeham 2', {'A': 0.0005, 'B': 0.0001, 'c': 1.1, 'age': 76, 't': 10}, [0.0958952, 0.36338659]], ['makeham 3', {'A': 0.0005, 'B': 5e-05, 'c': 1.1, 'age': 53, 't': 5}, [0.94881434, 0.01308189]], ['gompertz only', {'A': 0.0, 'B': 4e-05, 'c': 1.1, 'age': 54, 't': 3}, [0.9764072, 0.00915046]], ['constant force degenerate', {'A': 0.002, 'B': 0.004, 'c': 1.0, 'age': 40, 't': 4}, [0.97628571, 0.006]], ['c below one rejected', {'A': 0.001, 'B': 0.0001, 'c': 0.95, 'age': 40, 't': 1}, 'invalid parameters'], ['negative total force rejected', {'A': -0.01, 'B': 0.001, 'c': 1.1, 'age': 40, 't': 1}, 'invalid parameters']], [['makeham 0', {'A': 0.0005, 'B': 3e-05, 'c': 1.08, 'age': 65, 't': 10}, [0.93033322, 0.01013614]], ['makeham 1', {'A': 0.0005, 'B': 5e-05, 'c': 1.08, 'age': 49, 't': 2.5}, [0.9927903, 0.00313205]], ['makeham 2', {'A': 0.0005, 'B': 5e-05, 'c': 1.12, 'age': 76, 't': 10}, [0.00599143, 0.85501552]], ['makeham 3', {'A': 0.0005, 'B': 3e-05, 'c': 1.12, 'age': 54, 't': 10}, [0.77220735, 0.04287158]], ['gompertz only', {'A': 0.0, 'B': 4e-05, 'c': 1.1, 'age': 55, 't': 3}, [0.97407875, 0.01006551]], ['constant force degenerate', {'A': 0.002, 'B': 0.005, 'c': 1.0, 'age': 40, 't': 4}, [0.97238837, 0.007]], ['c below one rejected', {'A': 0.001, 'B': 0.0001, 'c': 0.95, 'age': 40, 't': 1}, 'invalid parameters'], ['negative total force rejected', {'A': -0.01, 'B': 0.001, 'c': 1.1, 'age': 40, 't': 1}, 'invalid parameters']]]
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 |
|---|---|---|---|
| makeham 0 | [0.57516676, 0.22014725] | [0.61903389, 0.22014725] | Failed |
| makeham 1 | [0.93589352, 0.00419046] | [0.96826103, 0.00419046] | Failed |
| makeham 2 | [0.77190614, 0.03725243] | [0.7970066, 0.03725243] | Failed |
| makeham 3 | [0.38116577, 0.15661679] | [0.39101048, 0.15661679] | Failed |
| gompertz only | [0.98222186, 0.00687488] | [0.98222186, 0.00687488] | Passed |
| constant force degenerate | [0.98807171, 0.003] | [0.98807171, 0.003] | Passed |
| c below one rejected | invalid parameters | invalid parameters | Passed |
| negative total force rejected | invalid parameters | invalid parameters | Passed |
SHA-256 / 5c2c6466528433aa50bdcd91b5a390fc9bebe7a6d2bcfd8176a660c5e67d729f
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):
A=x['A']; B=x['B']; c=x['c']; a=x['age']; t=x['t']
if B<0 or c<1 or A<=-B: return 'invalid parameters'
if c==1: H=(A+B)*t
else: H=A*t+B*c**a*(c**t-1)/math.log(c)
mu=A+B*c**(a+t)
return [round(math.exp(-H),8),round(mu,8)]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['makeham 0', {'A': 0.001, 'B': 3e-05, 'c': 1.12, 'age': 76, 't': 2.5}, [0.61903389, 0.22014725]], ['makeham 1', {'A': 0.001, 'B': 5e-05, 'c': 1.08, 'age': 44, 't': 10}, [0.96826103, 0.00419046]], ['makeham 2', {'A': 0.001, 'B': 0.0001, 'c': 1.12, 'age': 42, 't': 10}, [0.7970066, 0.03725243]], ['makeham 3', {'A': 0.0005, 'B': 5e-05, 'c': 1.12, 'age': 61, 't': 10}, [0.39101048, 0.15661679]], ['gompertz only', {'A': 0.0, 'B': 4e-05, 'c': 1.1, 'age': 51, 't': 3}, [0.98222186, 0.00687488]], ['constant force degenerate', {'A': 0.002, 'B': 0.001, 'c': 1.0, 'age': 40, 't': 4}, [0.98807171, 0.003]], ['c below one rejected', {'A': 0.001, 'B': 0.0001, 'c': 0.95, 'age': 40, 't': 1}, 'invalid parameters'], ['negative total force rejected', {'A': -0.01, 'B': 0.001, 'c': 1.1, 'age': 40, 't': 1}, 'invalid parameters']], [['makeham 0', {'A': 0.001, 'B': 3e-05, 'c': 1.08, 'age': 35, 't': 2.5}, [0.99628416, 0.00153767]], ['makeham 1', {'A': 0.001, 'B': 3e-05, 'c': 1.1, 'age': 78, 't': 10}, [0.42348454, 0.13272783]], ['makeham 2', {'A': 0.0007, 'B': 0.0001, 'c': 1.08, 'age': 34, 't': 5}, [0.98822133, 0.00271153]], ['makeham 3', {'A': 0.0005, 'B': 3e-05, 'c': 1.08, 'age': 32, 't': 1}, [0.99913436, 0.00088028]], ['gompertz only', {'A': 0.0, 'B': 4e-05, 'c': 1.1, 'age': 52, 't': 3}, [0.98046153, 0.00756237]], ['constant force degenerate', {'A': 0.002, 'B': 0.002, 'c': 1.0, 'age': 40, 't': 4}, [0.98412732, 0.004]], ['c below one rejected', {'A': 0.001, 'B': 0.0001, 'c': 0.95, 'age': 40, 't': 1}, 'invalid parameters'], ['negative total force rejected', {'A': -0.01, 'B': 0.001, 'c': 1.1, 'age': 40, 't': 1}, 'invalid parameters']], [['makeham 0', {'A': 0.0005, 'B': 0.0001, 'c': 1.12, 'age': 44, 't': 2.5}, [0.95736913, 0.01993739]], ['makeham 1', {'A': 0.0005, 'B': 5e-05, 'c': 1.08, 'age': 40, 't': 5}, [0.99091741, 0.00209602]], ['makeham 2', {'A': 0.0007, 'B': 3e-05, 'c': 1.08, 'age': 42, 't': 2.5}, [0.99616179, 0.00162146]], ['makeham 3', {'A': 0.0005, 'B': 5e-05, 'c': 1.1, 'age': 58, 't': 5}, [0.92026523, 0.02076325]], ['gompertz only', {'A': 0.0, 'B': 4e-05, 'c': 1.1, 'age': 53, 't': 3}, [0.9785288, 0.0083186]], ['constant force degenerate', {'A': 0.002, 'B': 0.003, 'c': 1.0, 'age': 40, 't': 4}, [0.98019867, 0.005]], ['c below one rejected', {'A': 0.001, 'B': 0.0001, 'c': 0.95, 'age': 40, 't': 1}, 'invalid parameters'], ['negative total force rejected', {'A': -0.01, 'B': 0.001, 'c': 1.1, 'age': 40, 't': 1}, 'invalid parameters']], [['makeham 0', {'A': 0.0007, 'B': 3e-05, 'c': 1.1, 'age': 36, 't': 1}, [0.99832839, 0.00172012]], ['makeham 1', {'A': 0.0007, 'B': 5e-05, 'c': 1.1, 'age': 45, 't': 10}, [0.93431427, 0.01015296]], ['makeham 2', {'A': 0.0005, 'B': 0.0001, 'c': 1.1, 'age': 76, 't': 10}, [0.0958952, 0.36338659]], ['makeham 3', {'A': 0.0005, 'B': 5e-05, 'c': 1.1, 'age': 53, 't': 5}, [0.94881434, 0.01308189]], ['gompertz only', {'A': 0.0, 'B': 4e-05, 'c': 1.1, 'age': 54, 't': 3}, [0.9764072, 0.00915046]], ['constant force degenerate', {'A': 0.002, 'B': 0.004, 'c': 1.0, 'age': 40, 't': 4}, [0.97628571, 0.006]], ['c below one rejected', {'A': 0.001, 'B': 0.0001, 'c': 0.95, 'age': 40, 't': 1}, 'invalid parameters'], ['negative total force rejected', {'A': -0.01, 'B': 0.001, 'c': 1.1, 'age': 40, 't': 1}, 'invalid parameters']], [['makeham 0', {'A': 0.0005, 'B': 3e-05, 'c': 1.08, 'age': 65, 't': 10}, [0.93033322, 0.01013614]], ['makeham 1', {'A': 0.0005, 'B': 5e-05, 'c': 1.08, 'age': 49, 't': 2.5}, [0.9927903, 0.00313205]], ['makeham 2', {'A': 0.0005, 'B': 5e-05, 'c': 1.12, 'age': 76, 't': 10}, [0.00599143, 0.85501552]], ['makeham 3', {'A': 0.0005, 'B': 3e-05, 'c': 1.12, 'age': 54, 't': 10}, [0.77220735, 0.04287158]], ['gompertz only', {'A': 0.0, 'B': 4e-05, 'c': 1.1, 'age': 55, 't': 3}, [0.97407875, 0.01006551]], ['constant force degenerate', {'A': 0.002, 'B': 0.005, 'c': 1.0, 'age': 40, 't': 4}, [0.97238837, 0.007]], ['c below one rejected', {'A': 0.001, 'B': 0.0001, 'c': 0.95, 'age': 40, 't': 1}, 'invalid parameters'], ['negative total force rejected', {'A': -0.01, 'B': 0.001, 'c': 1.1, 'age': 40, 't': 1}, 'invalid parameters']]]
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 |
|---|---|---|---|
| makeham 0 | [0.61903389, 0.22014725] | [0.61903389, 0.22014725] | Passed |
| makeham 1 | [0.96826103, 0.00419046] | [0.96826103, 0.00419046] | Passed |
| makeham 2 | [0.7970066, 0.03725243] | [0.7970066, 0.03725243] | Passed |
| makeham 3 | [0.39101048, 0.15661679] | [0.39101048, 0.15661679] | Passed |
| gompertz only | [0.98222186, 0.00687488] | [0.98222186, 0.00687488] | Passed |
| constant force degenerate | [0.98807171, 0.003] | [0.98807171, 0.003] | Passed |
| c below one rejected | invalid parameters | invalid parameters | Passed |
| negative total force rejected | invalid parameters | invalid parameters | Passed |
SHA-256 / a5a4e9e0edf40a7786be0c11fd933d9dc8d82aafc34ed2321c8531510c7879c7
Verification & scope
A deterministic bounded teaching model of a stipulated toy actuarial contract. Rates are small synthetic tables, exact rationals are used where practical and floats are rounded at the output; it makes no claim of conformance with any published table, standard of practice or regulation. 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:16.434651+00:00.
Case digest / 04f86dec480ae847c701ae8d719b6795f5c87367efa0eecc35b4efcc497e7d77