FAILURE MAP
← Case archive

FA-63641 / Actuarial life tables / Open access

Gompertz-Makeham survival: Gompertz integral omits the log of c · case 01

Survival probabilities are far too high.

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

ROOT CAUSE

The integral of c^s is missing the 1/ln c factor.

VERIFIED REPAIR

Divide by ln c.

Unsuccessful approach: Multiplying by ln c inverts the correction.

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*t+B*c**a*(c**t-1)
    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 fixtureActualExpectedOutcome
makeham 0[0.94500168, 0.22014725][0.61903389, 0.22014725]Failed
makeham 1[0.98835567, 0.00419046][0.96826103, 0.00419046]Failed
makeham 2[0.96601094, 0.03725243][0.7970066, 0.03725243]Failed
makeham 3[0.89507178, 0.15661679][0.39101048, 0.15661679]Failed
gompertz only[0.99829178, 0.00687488][0.98222186, 0.00687488]Failed
constant force degenerate[0.98807171, 0.003][0.98807171, 0.003]Passed
c below one rejectedinvalid parametersinvalid parametersPassed
negative total force rejectedinvalid parametersinvalid parametersPassed

SHA-256 / ce71349faef8b99d82f192669f879362ed820d5889d3db856a56b635abecff7a

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*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 fixtureActualExpectedOutcome
makeham 0[0.99140959, 0.22014725][0.61903389, 0.22014725]Failed
makeham 1[0.98991935, 0.00419046][0.96826103, 0.00419046]Failed
makeham 2[0.98729576, 0.03725243][0.7970066, 0.03725243]Failed
makeham 3[0.98314762, 0.15661679][0.39101048, 0.15661679]Failed
gompertz only[0.99983706, 0.00687488][0.98222186, 0.00687488]Failed
constant force degenerate[0.98807171, 0.003][0.98807171, 0.003]Passed
c below one rejectedinvalid parametersinvalid parametersPassed
negative total force rejectedinvalid parametersinvalid parametersPassed

SHA-256 / 57321c594e5d6447bf87886b942c950b38c95429006cb429ba4696f54eb6fe41

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 fixtureActualExpectedOutcome
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 rejectedinvalid parametersinvalid parametersPassed
negative total force rejectedinvalid parametersinvalid parametersPassed

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.431551+00:00.

Case digest / 39b80ad49b8f9b591332eefe717b0f9c75b26a648b5c350d98fc80fe4cd7a7e3