FAILURE MAP
← Case archive

FA-63601 / Actuarial life tables / Open access

Central death rate to mortality rate conversion: A rate of exactly one is rejected · case 01

A group where everyone dies returns an error.

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

ROOT CAUSE

The unity check is inclusive.

VERIFIED REPAIR

Reject only q>1.

Unsuccessful approach: Testing m instead of q rejects valid high rates between 1 and 2 central.

Case contract

Input deaths, exposure [num, den] central person-years, method udd|cfm|actuarial. m = deaths/exposure. UDD q=m/(1+m/2); constant force q=1-exp(-m); actuarial q=deaths/(exposure+deaths). exposure<=0 or deaths<0 -> 'invalid'; q>1 -> 'rate exceeds unity'; other method -> 'unknown method'. Return [m, q] 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):
    d=x['deaths']; E=Fraction(*x['exposure'])
    if E<=0 or d<0: return 'invalid'
    m=Fraction(d)/E
    if x['method']=='udd':
        q=m/(1+m/2)
    elif x['method']=='cfm':
        q=Fraction(1-math.exp(-float(m)))
    elif x['method']=='actuarial':
        q=Fraction(d)/(E+d)
    else:
        return 'unknown method'
    if q>=1: return 'rate exceeds unity'
    return [round(float(m),8),round(float(q),8)]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['udd typical', {'deaths': 34, 'exposure': [3917, 1], 'method': 'udd'}, [0.00868011, 0.0086426]], ['cfm typical', {'deaths': 22, 'exposure': [1748, 1], 'method': 'cfm'}, [0.01258581, 0.01250694]], ['actuarial typical', {'deaths': 54, 'exposure': [3265, 1], 'method': 'actuarial'}, [0.01653905, 0.01626996]], ['udd high rate', {'deaths': 31, 'exposure': [40, 1], 'method': 'udd'}, [0.775, 0.55855856]], ['udd rate exactly one', {'deaths': 2, 'exposure': [1, 1], 'method': 'udd'}, [2.0, 1.0]], ['udd rate above one', {'deaths': 5, 'exposure': [2, 1], 'method': 'udd'}, 'rate exceeds unity'], ['negative deaths rejected', {'deaths': -1, 'exposure': [100, 1], 'method': 'udd'}, 'invalid'], ['negative deaths actuarial', {'deaths': -2, 'exposure': [100, 1], 'method': 'actuarial'}, 'invalid'], ['zero exposure rejected', {'deaths': 1, 'exposure': [0, 1], 'method': 'cfm'}, 'invalid'], ['unknown method', {'deaths': 1, 'exposure': [10, 1], 'method': 'balducci'}, 'unknown method']], [['udd typical', {'deaths': 6, 'exposure': [842, 2], 'method': 'udd'}, [0.01425178, 0.01415094]], ['cfm typical', {'deaths': 59, 'exposure': [2784, 1], 'method': 'cfm'}, [0.02119253, 0.02096955]], ['actuarial typical', {'deaths': 20, 'exposure': [2966, 2], 'method': 'actuarial'}, [0.01348618, 0.01330672]], ['udd high rate', {'deaths': 32, 'exposure': [40, 1], 'method': 'udd'}, [0.8, 0.57142857]], ['udd rate exactly one', {'deaths': 4, 'exposure': [2, 1], 'method': 'udd'}, [2.0, 1.0]], ['udd rate above one', {'deaths': 10, 'exposure': [4, 1], 'method': 'udd'}, 'rate exceeds unity'], ['negative deaths rejected', {'deaths': -1, 'exposure': [100, 1], 'method': 'udd'}, 'invalid'], ['negative deaths actuarial', {'deaths': -2, 'exposure': [100, 1], 'method': 'actuarial'}, 'invalid'], ['zero exposure rejected', {'deaths': 1, 'exposure': [0, 1], 'method': 'cfm'}, 'invalid'], ['unknown method', {'deaths': 1, 'exposure': [10, 1], 'method': 'balducci'}, 'unknown method']], [['udd typical', {'deaths': 24, 'exposure': [4705, 1], 'method': 'udd'}, [0.00510096, 0.00508798]], ['cfm typical', {'deaths': 30, 'exposure': [3205, 4], 'method': 'cfm'}, [0.0374415, 0.03674923]], ['actuarial typical', {'deaths': 31, 'exposure': [2250, 1], 'method': 'actuarial'}, [0.01377778, 0.01359053]], ['udd high rate', {'deaths': 33, 'exposure': [40, 1], 'method': 'udd'}, [0.825, 0.5840708]], ['udd rate exactly one', {'deaths': 6, 'exposure': [3, 1], 'method': 'udd'}, [2.0, 1.0]], ['udd rate above one', {'deaths': 15, 'exposure': [6, 1], 'method': 'udd'}, 'rate exceeds unity'], ['negative deaths rejected', {'deaths': -1, 'exposure': [100, 1], 'method': 'udd'}, 'invalid'], ['negative deaths actuarial', {'deaths': -2, 'exposure': [100, 1], 'method': 'actuarial'}, 'invalid'], ['zero exposure rejected', {'deaths': 1, 'exposure': [0, 1], 'method': 'cfm'}, 'invalid'], ['unknown method', {'deaths': 1, 'exposure': [10, 1], 'method': 'balducci'}, 'unknown method']], [['udd typical', {'deaths': 49, 'exposure': [2311, 4], 'method': 'udd'}, [0.08481177, 0.08136156]], ['cfm typical', {'deaths': 58, 'exposure': [2503, 4], 'method': 'cfm'}, [0.09268877, 0.08852287]], ['actuarial typical', {'deaths': 40, 'exposure': [4345, 1], 'method': 'actuarial'}, [0.00920598, 0.00912201]], ['udd high rate', {'deaths': 34, 'exposure': [40, 1], 'method': 'udd'}, [0.85, 0.59649123]], ['udd rate exactly one', {'deaths': 8, 'exposure': [4, 1], 'method': 'udd'}, [2.0, 1.0]], ['udd rate above one', {'deaths': 20, 'exposure': [8, 1], 'method': 'udd'}, 'rate exceeds unity'], ['negative deaths rejected', {'deaths': -1, 'exposure': [100, 1], 'method': 'udd'}, 'invalid'], ['negative deaths actuarial', {'deaths': -2, 'exposure': [100, 1], 'method': 'actuarial'}, 'invalid'], ['zero exposure rejected', {'deaths': 1, 'exposure': [0, 1], 'method': 'cfm'}, 'invalid'], ['unknown method', {'deaths': 1, 'exposure': [10, 1], 'method': 'balducci'}, 'unknown method']], [['udd typical', {'deaths': 43, 'exposure': [1418, 4], 'method': 'udd'}, [0.1212976, 0.1143617]], ['cfm typical', {'deaths': 51, 'exposure': [2058, 4], 'method': 'cfm'}, [0.09912536, 0.09437083]], ['actuarial typical', {'deaths': 36, 'exposure': [959, 4], 'method': 'actuarial'}, [0.15015641, 0.13055304]], ['udd high rate', {'deaths': 35, 'exposure': [40, 1], 'method': 'udd'}, [0.875, 0.60869565]], ['udd rate exactly one', {'deaths': 10, 'exposure': [5, 1], 'method': 'udd'}, [2.0, 1.0]], ['udd rate above one', {'deaths': 25, 'exposure': [10, 1], 'method': 'udd'}, 'rate exceeds unity'], ['negative deaths rejected', {'deaths': -1, 'exposure': [100, 1], 'method': 'udd'}, 'invalid'], ['negative deaths actuarial', {'deaths': -2, 'exposure': [100, 1], 'method': 'actuarial'}, 'invalid'], ['zero exposure rejected', {'deaths': 1, 'exposure': [0, 1], 'method': 'cfm'}, 'invalid'], ['unknown method', {'deaths': 1, 'exposure': [10, 1], 'method': 'balducci'}, 'unknown method']]]
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
udd typical[0.00868011, 0.0086426][0.00868011, 0.0086426]Passed
cfm typical[0.01258581, 0.01250694][0.01258581, 0.01250694]Passed
actuarial typical[0.01653905, 0.01626996][0.01653905, 0.01626996]Passed
udd high rate[0.775, 0.55855856][0.775, 0.55855856]Passed
udd rate exactly onerate exceeds unity[2.0, 1.0]Failed
udd rate above onerate exceeds unityrate exceeds unityPassed
negative deaths rejectedinvalidinvalidPassed
negative deaths actuarialinvalidinvalidPassed
zero exposure rejectedinvalidinvalidPassed
unknown methodunknown methodunknown methodPassed

SHA-256 / 47a017e9c5a96c8d101cc6a08dbd5cb464d2a2e6fddb9474d0b8c7349c1c7d20

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):
    d=x['deaths']; E=Fraction(*x['exposure'])
    if E<=0 or d<0: return 'invalid'
    m=Fraction(d)/E
    if x['method']=='udd':
        q=m/(1+m/2)
    elif x['method']=='cfm':
        q=Fraction(1-math.exp(-float(m)))
    elif x['method']=='actuarial':
        q=Fraction(d)/(E+d)
    else:
        return 'unknown method'
    if m>1: return 'rate exceeds unity'
    return [round(float(m),8),round(float(q),8)]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['udd typical', {'deaths': 34, 'exposure': [3917, 1], 'method': 'udd'}, [0.00868011, 0.0086426]], ['cfm typical', {'deaths': 22, 'exposure': [1748, 1], 'method': 'cfm'}, [0.01258581, 0.01250694]], ['actuarial typical', {'deaths': 54, 'exposure': [3265, 1], 'method': 'actuarial'}, [0.01653905, 0.01626996]], ['udd high rate', {'deaths': 31, 'exposure': [40, 1], 'method': 'udd'}, [0.775, 0.55855856]], ['udd rate exactly one', {'deaths': 2, 'exposure': [1, 1], 'method': 'udd'}, [2.0, 1.0]], ['udd rate above one', {'deaths': 5, 'exposure': [2, 1], 'method': 'udd'}, 'rate exceeds unity'], ['negative deaths rejected', {'deaths': -1, 'exposure': [100, 1], 'method': 'udd'}, 'invalid'], ['negative deaths actuarial', {'deaths': -2, 'exposure': [100, 1], 'method': 'actuarial'}, 'invalid'], ['zero exposure rejected', {'deaths': 1, 'exposure': [0, 1], 'method': 'cfm'}, 'invalid'], ['unknown method', {'deaths': 1, 'exposure': [10, 1], 'method': 'balducci'}, 'unknown method']], [['udd typical', {'deaths': 6, 'exposure': [842, 2], 'method': 'udd'}, [0.01425178, 0.01415094]], ['cfm typical', {'deaths': 59, 'exposure': [2784, 1], 'method': 'cfm'}, [0.02119253, 0.02096955]], ['actuarial typical', {'deaths': 20, 'exposure': [2966, 2], 'method': 'actuarial'}, [0.01348618, 0.01330672]], ['udd high rate', {'deaths': 32, 'exposure': [40, 1], 'method': 'udd'}, [0.8, 0.57142857]], ['udd rate exactly one', {'deaths': 4, 'exposure': [2, 1], 'method': 'udd'}, [2.0, 1.0]], ['udd rate above one', {'deaths': 10, 'exposure': [4, 1], 'method': 'udd'}, 'rate exceeds unity'], ['negative deaths rejected', {'deaths': -1, 'exposure': [100, 1], 'method': 'udd'}, 'invalid'], ['negative deaths actuarial', {'deaths': -2, 'exposure': [100, 1], 'method': 'actuarial'}, 'invalid'], ['zero exposure rejected', {'deaths': 1, 'exposure': [0, 1], 'method': 'cfm'}, 'invalid'], ['unknown method', {'deaths': 1, 'exposure': [10, 1], 'method': 'balducci'}, 'unknown method']], [['udd typical', {'deaths': 24, 'exposure': [4705, 1], 'method': 'udd'}, [0.00510096, 0.00508798]], ['cfm typical', {'deaths': 30, 'exposure': [3205, 4], 'method': 'cfm'}, [0.0374415, 0.03674923]], ['actuarial typical', {'deaths': 31, 'exposure': [2250, 1], 'method': 'actuarial'}, [0.01377778, 0.01359053]], ['udd high rate', {'deaths': 33, 'exposure': [40, 1], 'method': 'udd'}, [0.825, 0.5840708]], ['udd rate exactly one', {'deaths': 6, 'exposure': [3, 1], 'method': 'udd'}, [2.0, 1.0]], ['udd rate above one', {'deaths': 15, 'exposure': [6, 1], 'method': 'udd'}, 'rate exceeds unity'], ['negative deaths rejected', {'deaths': -1, 'exposure': [100, 1], 'method': 'udd'}, 'invalid'], ['negative deaths actuarial', {'deaths': -2, 'exposure': [100, 1], 'method': 'actuarial'}, 'invalid'], ['zero exposure rejected', {'deaths': 1, 'exposure': [0, 1], 'method': 'cfm'}, 'invalid'], ['unknown method', {'deaths': 1, 'exposure': [10, 1], 'method': 'balducci'}, 'unknown method']], [['udd typical', {'deaths': 49, 'exposure': [2311, 4], 'method': 'udd'}, [0.08481177, 0.08136156]], ['cfm typical', {'deaths': 58, 'exposure': [2503, 4], 'method': 'cfm'}, [0.09268877, 0.08852287]], ['actuarial typical', {'deaths': 40, 'exposure': [4345, 1], 'method': 'actuarial'}, [0.00920598, 0.00912201]], ['udd high rate', {'deaths': 34, 'exposure': [40, 1], 'method': 'udd'}, [0.85, 0.59649123]], ['udd rate exactly one', {'deaths': 8, 'exposure': [4, 1], 'method': 'udd'}, [2.0, 1.0]], ['udd rate above one', {'deaths': 20, 'exposure': [8, 1], 'method': 'udd'}, 'rate exceeds unity'], ['negative deaths rejected', {'deaths': -1, 'exposure': [100, 1], 'method': 'udd'}, 'invalid'], ['negative deaths actuarial', {'deaths': -2, 'exposure': [100, 1], 'method': 'actuarial'}, 'invalid'], ['zero exposure rejected', {'deaths': 1, 'exposure': [0, 1], 'method': 'cfm'}, 'invalid'], ['unknown method', {'deaths': 1, 'exposure': [10, 1], 'method': 'balducci'}, 'unknown method']], [['udd typical', {'deaths': 43, 'exposure': [1418, 4], 'method': 'udd'}, [0.1212976, 0.1143617]], ['cfm typical', {'deaths': 51, 'exposure': [2058, 4], 'method': 'cfm'}, [0.09912536, 0.09437083]], ['actuarial typical', {'deaths': 36, 'exposure': [959, 4], 'method': 'actuarial'}, [0.15015641, 0.13055304]], ['udd high rate', {'deaths': 35, 'exposure': [40, 1], 'method': 'udd'}, [0.875, 0.60869565]], ['udd rate exactly one', {'deaths': 10, 'exposure': [5, 1], 'method': 'udd'}, [2.0, 1.0]], ['udd rate above one', {'deaths': 25, 'exposure': [10, 1], 'method': 'udd'}, 'rate exceeds unity'], ['negative deaths rejected', {'deaths': -1, 'exposure': [100, 1], 'method': 'udd'}, 'invalid'], ['negative deaths actuarial', {'deaths': -2, 'exposure': [100, 1], 'method': 'actuarial'}, 'invalid'], ['zero exposure rejected', {'deaths': 1, 'exposure': [0, 1], 'method': 'cfm'}, 'invalid'], ['unknown method', {'deaths': 1, 'exposure': [10, 1], 'method': 'balducci'}, 'unknown method']]]
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
udd typical[0.00868011, 0.0086426][0.00868011, 0.0086426]Passed
cfm typical[0.01258581, 0.01250694][0.01258581, 0.01250694]Passed
actuarial typical[0.01653905, 0.01626996][0.01653905, 0.01626996]Passed
udd high rate[0.775, 0.55855856][0.775, 0.55855856]Passed
udd rate exactly onerate exceeds unity[2.0, 1.0]Failed
udd rate above onerate exceeds unityrate exceeds unityPassed
negative deaths rejectedinvalidinvalidPassed
negative deaths actuarialinvalidinvalidPassed
zero exposure rejectedinvalidinvalidPassed
unknown methodunknown methodunknown methodPassed

SHA-256 / e81395fa7542749bc8220f8634ab74bb8c9a8f7172a383afc16ac9f8792e35bc

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):
    d=x['deaths']; E=Fraction(*x['exposure'])
    if E<=0 or d<0: return 'invalid'
    m=Fraction(d)/E
    if x['method']=='udd':
        q=m/(1+m/2)
    elif x['method']=='cfm':
        q=Fraction(1-math.exp(-float(m)))
    elif x['method']=='actuarial':
        q=Fraction(d)/(E+d)
    else:
        return 'unknown method'
    if q>1: return 'rate exceeds unity'
    return [round(float(m),8),round(float(q),8)]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['udd typical', {'deaths': 34, 'exposure': [3917, 1], 'method': 'udd'}, [0.00868011, 0.0086426]], ['cfm typical', {'deaths': 22, 'exposure': [1748, 1], 'method': 'cfm'}, [0.01258581, 0.01250694]], ['actuarial typical', {'deaths': 54, 'exposure': [3265, 1], 'method': 'actuarial'}, [0.01653905, 0.01626996]], ['udd high rate', {'deaths': 31, 'exposure': [40, 1], 'method': 'udd'}, [0.775, 0.55855856]], ['udd rate exactly one', {'deaths': 2, 'exposure': [1, 1], 'method': 'udd'}, [2.0, 1.0]], ['udd rate above one', {'deaths': 5, 'exposure': [2, 1], 'method': 'udd'}, 'rate exceeds unity'], ['negative deaths rejected', {'deaths': -1, 'exposure': [100, 1], 'method': 'udd'}, 'invalid'], ['negative deaths actuarial', {'deaths': -2, 'exposure': [100, 1], 'method': 'actuarial'}, 'invalid'], ['zero exposure rejected', {'deaths': 1, 'exposure': [0, 1], 'method': 'cfm'}, 'invalid'], ['unknown method', {'deaths': 1, 'exposure': [10, 1], 'method': 'balducci'}, 'unknown method']], [['udd typical', {'deaths': 6, 'exposure': [842, 2], 'method': 'udd'}, [0.01425178, 0.01415094]], ['cfm typical', {'deaths': 59, 'exposure': [2784, 1], 'method': 'cfm'}, [0.02119253, 0.02096955]], ['actuarial typical', {'deaths': 20, 'exposure': [2966, 2], 'method': 'actuarial'}, [0.01348618, 0.01330672]], ['udd high rate', {'deaths': 32, 'exposure': [40, 1], 'method': 'udd'}, [0.8, 0.57142857]], ['udd rate exactly one', {'deaths': 4, 'exposure': [2, 1], 'method': 'udd'}, [2.0, 1.0]], ['udd rate above one', {'deaths': 10, 'exposure': [4, 1], 'method': 'udd'}, 'rate exceeds unity'], ['negative deaths rejected', {'deaths': -1, 'exposure': [100, 1], 'method': 'udd'}, 'invalid'], ['negative deaths actuarial', {'deaths': -2, 'exposure': [100, 1], 'method': 'actuarial'}, 'invalid'], ['zero exposure rejected', {'deaths': 1, 'exposure': [0, 1], 'method': 'cfm'}, 'invalid'], ['unknown method', {'deaths': 1, 'exposure': [10, 1], 'method': 'balducci'}, 'unknown method']], [['udd typical', {'deaths': 24, 'exposure': [4705, 1], 'method': 'udd'}, [0.00510096, 0.00508798]], ['cfm typical', {'deaths': 30, 'exposure': [3205, 4], 'method': 'cfm'}, [0.0374415, 0.03674923]], ['actuarial typical', {'deaths': 31, 'exposure': [2250, 1], 'method': 'actuarial'}, [0.01377778, 0.01359053]], ['udd high rate', {'deaths': 33, 'exposure': [40, 1], 'method': 'udd'}, [0.825, 0.5840708]], ['udd rate exactly one', {'deaths': 6, 'exposure': [3, 1], 'method': 'udd'}, [2.0, 1.0]], ['udd rate above one', {'deaths': 15, 'exposure': [6, 1], 'method': 'udd'}, 'rate exceeds unity'], ['negative deaths rejected', {'deaths': -1, 'exposure': [100, 1], 'method': 'udd'}, 'invalid'], ['negative deaths actuarial', {'deaths': -2, 'exposure': [100, 1], 'method': 'actuarial'}, 'invalid'], ['zero exposure rejected', {'deaths': 1, 'exposure': [0, 1], 'method': 'cfm'}, 'invalid'], ['unknown method', {'deaths': 1, 'exposure': [10, 1], 'method': 'balducci'}, 'unknown method']], [['udd typical', {'deaths': 49, 'exposure': [2311, 4], 'method': 'udd'}, [0.08481177, 0.08136156]], ['cfm typical', {'deaths': 58, 'exposure': [2503, 4], 'method': 'cfm'}, [0.09268877, 0.08852287]], ['actuarial typical', {'deaths': 40, 'exposure': [4345, 1], 'method': 'actuarial'}, [0.00920598, 0.00912201]], ['udd high rate', {'deaths': 34, 'exposure': [40, 1], 'method': 'udd'}, [0.85, 0.59649123]], ['udd rate exactly one', {'deaths': 8, 'exposure': [4, 1], 'method': 'udd'}, [2.0, 1.0]], ['udd rate above one', {'deaths': 20, 'exposure': [8, 1], 'method': 'udd'}, 'rate exceeds unity'], ['negative deaths rejected', {'deaths': -1, 'exposure': [100, 1], 'method': 'udd'}, 'invalid'], ['negative deaths actuarial', {'deaths': -2, 'exposure': [100, 1], 'method': 'actuarial'}, 'invalid'], ['zero exposure rejected', {'deaths': 1, 'exposure': [0, 1], 'method': 'cfm'}, 'invalid'], ['unknown method', {'deaths': 1, 'exposure': [10, 1], 'method': 'balducci'}, 'unknown method']], [['udd typical', {'deaths': 43, 'exposure': [1418, 4], 'method': 'udd'}, [0.1212976, 0.1143617]], ['cfm typical', {'deaths': 51, 'exposure': [2058, 4], 'method': 'cfm'}, [0.09912536, 0.09437083]], ['actuarial typical', {'deaths': 36, 'exposure': [959, 4], 'method': 'actuarial'}, [0.15015641, 0.13055304]], ['udd high rate', {'deaths': 35, 'exposure': [40, 1], 'method': 'udd'}, [0.875, 0.60869565]], ['udd rate exactly one', {'deaths': 10, 'exposure': [5, 1], 'method': 'udd'}, [2.0, 1.0]], ['udd rate above one', {'deaths': 25, 'exposure': [10, 1], 'method': 'udd'}, 'rate exceeds unity'], ['negative deaths rejected', {'deaths': -1, 'exposure': [100, 1], 'method': 'udd'}, 'invalid'], ['negative deaths actuarial', {'deaths': -2, 'exposure': [100, 1], 'method': 'actuarial'}, 'invalid'], ['zero exposure rejected', {'deaths': 1, 'exposure': [0, 1], 'method': 'cfm'}, 'invalid'], ['unknown method', {'deaths': 1, 'exposure': [10, 1], 'method': 'balducci'}, 'unknown method']]]
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
udd typical[0.00868011, 0.0086426][0.00868011, 0.0086426]Passed
cfm typical[0.01258581, 0.01250694][0.01258581, 0.01250694]Passed
actuarial typical[0.01653905, 0.01626996][0.01653905, 0.01626996]Passed
udd high rate[0.775, 0.55855856][0.775, 0.55855856]Passed
udd rate exactly one[2.0, 1.0][2.0, 1.0]Passed
udd rate above onerate exceeds unityrate exceeds unityPassed
negative deaths rejectedinvalidinvalidPassed
negative deaths actuarialinvalidinvalidPassed
zero exposure rejectedinvalidinvalidPassed
unknown methodunknown methodunknown methodPassed

SHA-256 / e2163f5bcf8b86268fe265cd55cc3e49cadeb165e2732605d4a2a2b0b2b9f8b5

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

Case digest / ad92b587cb4a0d09486f7efd8ff3735fb404e488356486e2efa23f850279cdfc