FAILURE MAP
← Case archive

FA-63606 / Actuarial life tables / Open access

Central death rate to mortality rate conversion: Negative deaths are accepted · case 01

Corrupt negative death counts produce negative rates.

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

ROOT CAUSE

Deaths are not validated.

VERIFIED REPAIR

Reject negative deaths for every method.

Unsuccessful approach: Validating only the UDD branch leaves the other methods exposed.

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: 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 rejected[-0.01, -0.01005025]invalidFailed
negative deaths actuarial[-0.02, -0.02040816]invalidFailed
zero exposure rejectedinvalidinvalidPassed
unknown methodunknown methodunknown methodPassed

SHA-256 / e6af9489931dcc749614edec4a741ea2e394fdfd0824a2b37c72e39804ff8b69

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 and x['method']=='udd': 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 actuarial[-0.02, -0.02040816]invalidFailed
zero exposure rejectedinvalidinvalidPassed
unknown methodunknown methodunknown methodPassed

SHA-256 / a4521a03d730f72a91c5fda67d38282c18835b077728bb76da6d105fcc822e4e

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

Case digest / f211275619b1e2048a50d8af7677977881c39000a7b32375e0ad752af0150c9f