FAILURE MAP
← Case archive

FA-63471 / Actuarial life tables / Open access

Term insurance net single premium: Survival is updated before the death term · case 01

Claims in each year are weighted by survival through that same year.

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

ROOT CAUSE

kp is advanced before the claim for year k is added.

VERIFIED REPAIR

Add v^(k+1)*kp*q_k before updating kp.

Unsuccessful approach: Dropping kp ignores survival to the start of each year.

Case contract

Input q (per 100000 from the issue age), n, i (per mille), benefit (cents), timing eoy|immediate. n > table length -> 'table too short'. A = sum_{k<n} v^(k+1) kp q_k with exact rationals; immediate payment multiplies benefit*A by i/ln(1+i). Return the premium in cents rounded half-up.

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):
    qs=[Fraction(q,100000) for q in x['q']]
    n=x['n']
    if n>len(qs): return 'table too short'
    i=Fraction(x['i'],1000); v=1/(1+i)
    A=Fraction(0); kp=Fraction(1)
    for k in range(n):
        kp*=1-qs[k]
        A+=v**(k+1)*kp*qs[k]
    val=x['benefit']*A
    if x['timing']=='immediate':
        val=float(val)*float(i)/math.log(1+float(i))
    return math.floor(val+Fraction(1,2)) if not isinstance(val,float) else math.floor(val+0.5)
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['five-year term year-end', {'q': [1120, 1440, 1834, 2319, 2899, 3653, 4570, 5749, 7212, 9035], 'n': 5, 'i': 30, 'benefit': 297462334, 'timing': 'eoy'}, 24907301], ['ten-year term immediate', {'q': [1229, 1536, 1954, 2473, 3129, 3926, 4951, 6230, 7798, 9775], 'n': 10, 'i': 30, 'benefit': 684088327, 'timing': 'immediate'}, 203032132], ['term equals table length', {'q': [1992, 2493, 3139, 3954, 4989, 6283, 7890, 9875, 12347, 15472], 'n': 10, 'i': 45, 'benefit': 756656210, 'timing': 'eoy'}, 290009324], ['term longer than table', {'q': [1731, 2169, 2759, 3498, 4390, 5528, 6955, 8697, 10895, 13668], 'n': 11, 'i': 30, 'benefit': 613954502, 'timing': 'eoy'}, 'table too short'], ['zero-year term', {'q': [1687, 2109, 2681, 3387, 4278, 5370, 6761, 8476, 10642, 13344], 'n': 0, 'i': 60, 'benefit': 884542546, 'timing': 'eoy'}, 0], ['one-year term', {'q': [1075, 1358, 1730, 2192, 2777, 3500, 4397, 5544, 6939, 8709], 'n': 1, 'i': 30, 'benefit': 1000000007, 'timing': 'eoy'}, 10436893], ['large face amount', {'q': [1332, 1682, 2121, 2652, 3332, 4208, 5307, 6656, 8328, 10452], 'n': 7, 'i': 30, 'benefit': 7043659579, 'timing': 'eoy'}, 1160570167], ['immediate short term', {'q': [1485, 1888, 2378, 2991, 3778, 4731, 5935, 7422, 9291, 11653], 'n': 3, 'i': 50, 'benefit': 365125009, 'timing': 'immediate'}, 19033810]], [['five-year term year-end', {'q': [2116, 2656, 3333, 4187, 5233, 6563, 8245, 10342, 12947, 16215], 'n': 5, 'i': 30, 'benefit': 276975028, 'timing': 'eoy'}, 41051826], ['ten-year term immediate', {'q': [1811, 2303, 2910, 3645, 4586, 5762, 7212, 9047, 11354, 14214], 'n': 10, 'i': 60, 'benefit': 378515675, 'timing': 'immediate'}, 127823658], ['term equals table length', {'q': [2118, 2677, 3391, 4262, 5345, 6725, 8419, 10545, 13184, 16505], 'n': 10, 'i': 45, 'benefit': 692594078, 'timing': 'eoy'}, 278847031], ['term longer than table', {'q': [896, 1152, 1459, 1856, 2366, 3001, 3800, 4800, 6029, 7549], 'n': 11, 'i': 60, 'benefit': 734220350, 'timing': 'eoy'}, 'table too short'], ['zero-year term', {'q': [1067, 1347, 1702, 2149, 2735, 3424, 4300, 5419, 6795, 8513], 'n': 0, 'i': 45, 'benefit': 573820538, 'timing': 'eoy'}, 0], ['one-year term', {'q': [1384, 1780, 2238, 2803, 3516, 4419, 5557, 6972, 8758, 10991], 'n': 1, 'i': 30, 'benefit': 1000000014, 'timing': 'eoy'}, 13436893], ['large face amount', {'q': [2149, 2700, 3375, 4238, 5308, 6659, 8372, 10480, 13113, 16421], 'n': 8, 'i': 45, 'benefit': 8475119998, 'timing': 'eoy'}, 2426184535], ['immediate short term', {'q': [1930, 2425, 3075, 3847, 4814, 6063, 7606, 9533, 11922, 14937], 'n': 3, 'i': 50, 'benefit': 708486332, 'timing': 'immediate'}, 47462561]], [['five-year term year-end', {'q': [1799, 2257, 2859, 3588, 4485, 5615, 7030, 8808, 11037, 13815], 'n': 5, 'i': 60, 'benefit': 167620781, 'timing': 'eoy'}, 19505270], ['ten-year term immediate', {'q': [2195, 2744, 3480, 4385, 5523, 6927, 8702, 10910, 13687, 17121], 'n': 10, 'i': 60, 'benefit': 668677245, 'timing': 'immediate'}, 259300273], ['term equals table length', {'q': [1956, 2493, 3138, 3967, 5005, 6257, 7823, 9787, 12266, 15359], 'n': 10, 'i': 45, 'benefit': 282702347, 'timing': 'eoy'}, 107920351], ['term longer than table', {'q': [2134, 2688, 3394, 4247, 5345, 6699, 8380, 10517, 13186, 16496], 'n': 11, 'i': 45, 'benefit': 136081264, 'timing': 'eoy'}, 'table too short'], ['zero-year term', {'q': [1138, 1426, 1819, 2273, 2872, 3634, 4574, 5753, 7197, 9042], 'n': 0, 'i': 30, 'benefit': 668817925, 'timing': 'eoy'}, 0], ['one-year term', {'q': [2207, 2761, 3485, 4400, 5510, 6912, 8685, 10885, 13650, 17091], 'n': 1, 'i': 60, 'benefit': 1000000021, 'timing': 'eoy'}, 20820755], ['large face amount', {'q': [1675, 2113, 2648, 3323, 4166, 5241, 6590, 8244, 10352, 12961], 'n': 8, 'i': 45, 'benefit': 5179542771, 'timing': 'eoy'}, 1207339201], ['immediate short term', {'q': [2261, 2837, 3571, 4509, 5663, 7114, 8900, 11135, 13947, 17461], 'n': 3, 'i': 50, 'benefit': 148092738, 'timing': 'immediate'}, 11530914]], [['five-year term year-end', {'q': [1372, 1750, 2200, 2793, 3528, 4456, 5617, 7060, 8864, 11121], 'n': 5, 'i': 60, 'benefit': 671460915, 'timing': 'eoy'}, 61409725], ['ten-year term immediate', {'q': [1483, 1891, 2391, 3003, 3797, 4757, 5974, 7507, 9411, 11782], 'n': 10, 'i': 45, 'benefit': 110078003, 'timing': 'immediate'}, 34888554], ['term equals table length', {'q': [2202, 2760, 3467, 4334, 5421, 6813, 8558, 10718, 13399, 16772], 'n': 10, 'i': 30, 'benefit': 761103905, 'timing': 'eoy'}, 340778826], ['term longer than table', {'q': [895, 1146, 1437, 1841, 2324, 2934, 3673, 4605, 5775, 7226], 'n': 11, 'i': 60, 'benefit': 612398678, 'timing': 'eoy'}, 'table too short'], ['zero-year term', {'q': [2071, 2616, 3274, 4106, 5164, 6501, 8167, 10248, 12843, 16103], 'n': 0, 'i': 30, 'benefit': 615700164, 'timing': 'eoy'}, 0], ['one-year term', {'q': [1630, 2082, 2630, 3305, 4153, 5203, 6508, 8173, 10245, 12826], 'n': 1, 'i': 60, 'benefit': 1000000028, 'timing': 'eoy'}, 15377359], ['large face amount', {'q': [1055, 1320, 1681, 2105, 2671, 3374, 4252, 5326, 6705, 8431], 'n': 8, 'i': 45, 'benefit': 6631603996, 'timing': 'eoy'}, 1038053345], ['immediate short term', {'q': [1585, 2009, 2540, 3175, 3980, 4989, 6278, 7848, 9822, 12302], 'n': 3, 'i': 50, 'benefit': 128139603, 'timing': 'immediate'}, 7115877]], [['five-year term year-end', {'q': [1585, 2015, 2541, 3196, 4029, 5069, 6349, 7942, 9963, 12472], 'n': 5, 'i': 30, 'benefit': 501144892, 'timing': 'eoy'}, 57536772], ['ten-year term immediate', {'q': [1239, 1548, 1962, 2463, 3080, 3877, 4882, 6122, 7676, 9611], 'n': 10, 'i': 60, 'benefit': 778238927, 'timing': 'immediate'}, 191663547], ['term equals table length', {'q': [1964, 2482, 3120, 3944, 4977, 6261, 7873, 9861, 12344, 15433], 'n': 10, 'i': 60, 'benefit': 912336104, 'timing': 'eoy'}, 318422653], ['term longer than table', {'q': [1113, 1425, 1788, 2240, 2841, 3583, 4528, 5705, 7149, 8939], 'n': 11, 'i': 60, 'benefit': 546287061, 'timing': 'eoy'}, 'table too short'], ['zero-year term', {'q': [1052, 1329, 1686, 2145, 2692, 3399, 4294, 5409, 6806, 8522], 'n': 0, 'i': 45, 'benefit': 558349824, 'timing': 'eoy'}, 0], ['one-year term', {'q': [1695, 2147, 2715, 3434, 4318, 5402, 6762, 8454, 10583, 13270], 'n': 1, 'i': 30, 'benefit': 1000000035, 'timing': 'eoy'}, 16456311], ['large face amount', {'q': [2159, 2724, 3446, 4334, 5433, 6813, 8566, 10749, 13458, 16871], 'n': 8, 'i': 60, 'benefit': 6554802467, 'timing': 'eoy'}, 1774398066], ['immediate short term', {'q': [1616, 2039, 2564, 3251, 4064, 5090, 6396, 8010, 10020, 12534], 'n': 3, 'i': 50, 'benefit': 976296817, 'timing': 'immediate'}, 54960278]]]
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
five-year term year-end2438685524907301Failed
ten-year term immediate191874864203032132Failed
term equals table length266133726290009324Failed
term longer than tabletable too shorttable too shortPassed
zero-year term00Passed
one-year term1032469710436893Failed
large face amount11211366081160570167Failed
immediate short term1865937419033810Failed

SHA-256 / 205dfa332c6eac8e033e862980cceed2c58bdabad177bad79bd1c4bf82a99a00

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):
    qs=[Fraction(q,100000) for q in x['q']]
    n=x['n']
    if n>len(qs): return 'table too short'
    i=Fraction(x['i'],1000); v=1/(1+i)
    A=Fraction(0); kp=Fraction(1)
    for k in range(n):
        A+=v**(k+1)*qs[k]
        kp*=1-qs[k]
    val=x['benefit']*A
    if x['timing']=='immediate':
        val=float(val)*float(i)/math.log(1+float(i))
    return math.floor(val+Fraction(1,2)) if not isinstance(val,float) else math.floor(val+0.5)
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['five-year term year-end', {'q': [1120, 1440, 1834, 2319, 2899, 3653, 4570, 5749, 7212, 9035], 'n': 5, 'i': 30, 'benefit': 297462334, 'timing': 'eoy'}, 24907301], ['ten-year term immediate', {'q': [1229, 1536, 1954, 2473, 3129, 3926, 4951, 6230, 7798, 9775], 'n': 10, 'i': 30, 'benefit': 684088327, 'timing': 'immediate'}, 203032132], ['term equals table length', {'q': [1992, 2493, 3139, 3954, 4989, 6283, 7890, 9875, 12347, 15472], 'n': 10, 'i': 45, 'benefit': 756656210, 'timing': 'eoy'}, 290009324], ['term longer than table', {'q': [1731, 2169, 2759, 3498, 4390, 5528, 6955, 8697, 10895, 13668], 'n': 11, 'i': 30, 'benefit': 613954502, 'timing': 'eoy'}, 'table too short'], ['zero-year term', {'q': [1687, 2109, 2681, 3387, 4278, 5370, 6761, 8476, 10642, 13344], 'n': 0, 'i': 60, 'benefit': 884542546, 'timing': 'eoy'}, 0], ['one-year term', {'q': [1075, 1358, 1730, 2192, 2777, 3500, 4397, 5544, 6939, 8709], 'n': 1, 'i': 30, 'benefit': 1000000007, 'timing': 'eoy'}, 10436893], ['large face amount', {'q': [1332, 1682, 2121, 2652, 3332, 4208, 5307, 6656, 8328, 10452], 'n': 7, 'i': 30, 'benefit': 7043659579, 'timing': 'eoy'}, 1160570167], ['immediate short term', {'q': [1485, 1888, 2378, 2991, 3778, 4731, 5935, 7422, 9291, 11653], 'n': 3, 'i': 50, 'benefit': 365125009, 'timing': 'immediate'}, 19033810]], [['five-year term year-end', {'q': [2116, 2656, 3333, 4187, 5233, 6563, 8245, 10342, 12947, 16215], 'n': 5, 'i': 30, 'benefit': 276975028, 'timing': 'eoy'}, 41051826], ['ten-year term immediate', {'q': [1811, 2303, 2910, 3645, 4586, 5762, 7212, 9047, 11354, 14214], 'n': 10, 'i': 60, 'benefit': 378515675, 'timing': 'immediate'}, 127823658], ['term equals table length', {'q': [2118, 2677, 3391, 4262, 5345, 6725, 8419, 10545, 13184, 16505], 'n': 10, 'i': 45, 'benefit': 692594078, 'timing': 'eoy'}, 278847031], ['term longer than table', {'q': [896, 1152, 1459, 1856, 2366, 3001, 3800, 4800, 6029, 7549], 'n': 11, 'i': 60, 'benefit': 734220350, 'timing': 'eoy'}, 'table too short'], ['zero-year term', {'q': [1067, 1347, 1702, 2149, 2735, 3424, 4300, 5419, 6795, 8513], 'n': 0, 'i': 45, 'benefit': 573820538, 'timing': 'eoy'}, 0], ['one-year term', {'q': [1384, 1780, 2238, 2803, 3516, 4419, 5557, 6972, 8758, 10991], 'n': 1, 'i': 30, 'benefit': 1000000014, 'timing': 'eoy'}, 13436893], ['large face amount', {'q': [2149, 2700, 3375, 4238, 5308, 6659, 8372, 10480, 13113, 16421], 'n': 8, 'i': 45, 'benefit': 8475119998, 'timing': 'eoy'}, 2426184535], ['immediate short term', {'q': [1930, 2425, 3075, 3847, 4814, 6063, 7606, 9533, 11922, 14937], 'n': 3, 'i': 50, 'benefit': 708486332, 'timing': 'immediate'}, 47462561]], [['five-year term year-end', {'q': [1799, 2257, 2859, 3588, 4485, 5615, 7030, 8808, 11037, 13815], 'n': 5, 'i': 60, 'benefit': 167620781, 'timing': 'eoy'}, 19505270], ['ten-year term immediate', {'q': [2195, 2744, 3480, 4385, 5523, 6927, 8702, 10910, 13687, 17121], 'n': 10, 'i': 60, 'benefit': 668677245, 'timing': 'immediate'}, 259300273], ['term equals table length', {'q': [1956, 2493, 3138, 3967, 5005, 6257, 7823, 9787, 12266, 15359], 'n': 10, 'i': 45, 'benefit': 282702347, 'timing': 'eoy'}, 107920351], ['term longer than table', {'q': [2134, 2688, 3394, 4247, 5345, 6699, 8380, 10517, 13186, 16496], 'n': 11, 'i': 45, 'benefit': 136081264, 'timing': 'eoy'}, 'table too short'], ['zero-year term', {'q': [1138, 1426, 1819, 2273, 2872, 3634, 4574, 5753, 7197, 9042], 'n': 0, 'i': 30, 'benefit': 668817925, 'timing': 'eoy'}, 0], ['one-year term', {'q': [2207, 2761, 3485, 4400, 5510, 6912, 8685, 10885, 13650, 17091], 'n': 1, 'i': 60, 'benefit': 1000000021, 'timing': 'eoy'}, 20820755], ['large face amount', {'q': [1675, 2113, 2648, 3323, 4166, 5241, 6590, 8244, 10352, 12961], 'n': 8, 'i': 45, 'benefit': 5179542771, 'timing': 'eoy'}, 1207339201], ['immediate short term', {'q': [2261, 2837, 3571, 4509, 5663, 7114, 8900, 11135, 13947, 17461], 'n': 3, 'i': 50, 'benefit': 148092738, 'timing': 'immediate'}, 11530914]], [['five-year term year-end', {'q': [1372, 1750, 2200, 2793, 3528, 4456, 5617, 7060, 8864, 11121], 'n': 5, 'i': 60, 'benefit': 671460915, 'timing': 'eoy'}, 61409725], ['ten-year term immediate', {'q': [1483, 1891, 2391, 3003, 3797, 4757, 5974, 7507, 9411, 11782], 'n': 10, 'i': 45, 'benefit': 110078003, 'timing': 'immediate'}, 34888554], ['term equals table length', {'q': [2202, 2760, 3467, 4334, 5421, 6813, 8558, 10718, 13399, 16772], 'n': 10, 'i': 30, 'benefit': 761103905, 'timing': 'eoy'}, 340778826], ['term longer than table', {'q': [895, 1146, 1437, 1841, 2324, 2934, 3673, 4605, 5775, 7226], 'n': 11, 'i': 60, 'benefit': 612398678, 'timing': 'eoy'}, 'table too short'], ['zero-year term', {'q': [2071, 2616, 3274, 4106, 5164, 6501, 8167, 10248, 12843, 16103], 'n': 0, 'i': 30, 'benefit': 615700164, 'timing': 'eoy'}, 0], ['one-year term', {'q': [1630, 2082, 2630, 3305, 4153, 5203, 6508, 8173, 10245, 12826], 'n': 1, 'i': 60, 'benefit': 1000000028, 'timing': 'eoy'}, 15377359], ['large face amount', {'q': [1055, 1320, 1681, 2105, 2671, 3374, 4252, 5326, 6705, 8431], 'n': 8, 'i': 45, 'benefit': 6631603996, 'timing': 'eoy'}, 1038053345], ['immediate short term', {'q': [1585, 2009, 2540, 3175, 3980, 4989, 6278, 7848, 9822, 12302], 'n': 3, 'i': 50, 'benefit': 128139603, 'timing': 'immediate'}, 7115877]], [['five-year term year-end', {'q': [1585, 2015, 2541, 3196, 4029, 5069, 6349, 7942, 9963, 12472], 'n': 5, 'i': 30, 'benefit': 501144892, 'timing': 'eoy'}, 57536772], ['ten-year term immediate', {'q': [1239, 1548, 1962, 2463, 3080, 3877, 4882, 6122, 7676, 9611], 'n': 10, 'i': 60, 'benefit': 778238927, 'timing': 'immediate'}, 191663547], ['term equals table length', {'q': [1964, 2482, 3120, 3944, 4977, 6261, 7873, 9861, 12344, 15433], 'n': 10, 'i': 60, 'benefit': 912336104, 'timing': 'eoy'}, 318422653], ['term longer than table', {'q': [1113, 1425, 1788, 2240, 2841, 3583, 4528, 5705, 7149, 8939], 'n': 11, 'i': 60, 'benefit': 546287061, 'timing': 'eoy'}, 'table too short'], ['zero-year term', {'q': [1052, 1329, 1686, 2145, 2692, 3399, 4294, 5409, 6806, 8522], 'n': 0, 'i': 45, 'benefit': 558349824, 'timing': 'eoy'}, 0], ['one-year term', {'q': [1695, 2147, 2715, 3434, 4318, 5402, 6762, 8454, 10583, 13270], 'n': 1, 'i': 30, 'benefit': 1000000035, 'timing': 'eoy'}, 16456311], ['large face amount', {'q': [2159, 2724, 3446, 4334, 5433, 6813, 8566, 10749, 13458, 16871], 'n': 8, 'i': 60, 'benefit': 6554802467, 'timing': 'eoy'}, 1774398066], ['immediate short term', {'q': [1616, 2039, 2564, 3251, 4064, 5090, 6396, 8010, 10020, 12534], 'n': 3, 'i': 50, 'benefit': 976296817, 'timing': 'immediate'}, 54960278]]]
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
five-year term year-end2583219724907301Failed
ten-year term immediate241665964203032132Failed
term equals table length379058796290009324Failed
term longer than tabletable too shorttable too shortPassed
zero-year term00Passed
one-year term1043689310436893Passed
large face amount12600653511160570167Failed
immediate short term1938607219033810Failed

SHA-256 / 35d8583b326b9f53e754a6340001e918dc7443517ac8a7ff18aab18faabfbf65

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):
    qs=[Fraction(q,100000) for q in x['q']]
    n=x['n']
    if n>len(qs): return 'table too short'
    i=Fraction(x['i'],1000); v=1/(1+i)
    A=Fraction(0); kp=Fraction(1)
    for k in range(n):
        A+=v**(k+1)*kp*qs[k]
        kp*=1-qs[k]
    val=x['benefit']*A
    if x['timing']=='immediate':
        val=float(val)*float(i)/math.log(1+float(i))
    return math.floor(val+Fraction(1,2)) if not isinstance(val,float) else math.floor(val+0.5)
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['five-year term year-end', {'q': [1120, 1440, 1834, 2319, 2899, 3653, 4570, 5749, 7212, 9035], 'n': 5, 'i': 30, 'benefit': 297462334, 'timing': 'eoy'}, 24907301], ['ten-year term immediate', {'q': [1229, 1536, 1954, 2473, 3129, 3926, 4951, 6230, 7798, 9775], 'n': 10, 'i': 30, 'benefit': 684088327, 'timing': 'immediate'}, 203032132], ['term equals table length', {'q': [1992, 2493, 3139, 3954, 4989, 6283, 7890, 9875, 12347, 15472], 'n': 10, 'i': 45, 'benefit': 756656210, 'timing': 'eoy'}, 290009324], ['term longer than table', {'q': [1731, 2169, 2759, 3498, 4390, 5528, 6955, 8697, 10895, 13668], 'n': 11, 'i': 30, 'benefit': 613954502, 'timing': 'eoy'}, 'table too short'], ['zero-year term', {'q': [1687, 2109, 2681, 3387, 4278, 5370, 6761, 8476, 10642, 13344], 'n': 0, 'i': 60, 'benefit': 884542546, 'timing': 'eoy'}, 0], ['one-year term', {'q': [1075, 1358, 1730, 2192, 2777, 3500, 4397, 5544, 6939, 8709], 'n': 1, 'i': 30, 'benefit': 1000000007, 'timing': 'eoy'}, 10436893], ['large face amount', {'q': [1332, 1682, 2121, 2652, 3332, 4208, 5307, 6656, 8328, 10452], 'n': 7, 'i': 30, 'benefit': 7043659579, 'timing': 'eoy'}, 1160570167], ['immediate short term', {'q': [1485, 1888, 2378, 2991, 3778, 4731, 5935, 7422, 9291, 11653], 'n': 3, 'i': 50, 'benefit': 365125009, 'timing': 'immediate'}, 19033810]], [['five-year term year-end', {'q': [2116, 2656, 3333, 4187, 5233, 6563, 8245, 10342, 12947, 16215], 'n': 5, 'i': 30, 'benefit': 276975028, 'timing': 'eoy'}, 41051826], ['ten-year term immediate', {'q': [1811, 2303, 2910, 3645, 4586, 5762, 7212, 9047, 11354, 14214], 'n': 10, 'i': 60, 'benefit': 378515675, 'timing': 'immediate'}, 127823658], ['term equals table length', {'q': [2118, 2677, 3391, 4262, 5345, 6725, 8419, 10545, 13184, 16505], 'n': 10, 'i': 45, 'benefit': 692594078, 'timing': 'eoy'}, 278847031], ['term longer than table', {'q': [896, 1152, 1459, 1856, 2366, 3001, 3800, 4800, 6029, 7549], 'n': 11, 'i': 60, 'benefit': 734220350, 'timing': 'eoy'}, 'table too short'], ['zero-year term', {'q': [1067, 1347, 1702, 2149, 2735, 3424, 4300, 5419, 6795, 8513], 'n': 0, 'i': 45, 'benefit': 573820538, 'timing': 'eoy'}, 0], ['one-year term', {'q': [1384, 1780, 2238, 2803, 3516, 4419, 5557, 6972, 8758, 10991], 'n': 1, 'i': 30, 'benefit': 1000000014, 'timing': 'eoy'}, 13436893], ['large face amount', {'q': [2149, 2700, 3375, 4238, 5308, 6659, 8372, 10480, 13113, 16421], 'n': 8, 'i': 45, 'benefit': 8475119998, 'timing': 'eoy'}, 2426184535], ['immediate short term', {'q': [1930, 2425, 3075, 3847, 4814, 6063, 7606, 9533, 11922, 14937], 'n': 3, 'i': 50, 'benefit': 708486332, 'timing': 'immediate'}, 47462561]], [['five-year term year-end', {'q': [1799, 2257, 2859, 3588, 4485, 5615, 7030, 8808, 11037, 13815], 'n': 5, 'i': 60, 'benefit': 167620781, 'timing': 'eoy'}, 19505270], ['ten-year term immediate', {'q': [2195, 2744, 3480, 4385, 5523, 6927, 8702, 10910, 13687, 17121], 'n': 10, 'i': 60, 'benefit': 668677245, 'timing': 'immediate'}, 259300273], ['term equals table length', {'q': [1956, 2493, 3138, 3967, 5005, 6257, 7823, 9787, 12266, 15359], 'n': 10, 'i': 45, 'benefit': 282702347, 'timing': 'eoy'}, 107920351], ['term longer than table', {'q': [2134, 2688, 3394, 4247, 5345, 6699, 8380, 10517, 13186, 16496], 'n': 11, 'i': 45, 'benefit': 136081264, 'timing': 'eoy'}, 'table too short'], ['zero-year term', {'q': [1138, 1426, 1819, 2273, 2872, 3634, 4574, 5753, 7197, 9042], 'n': 0, 'i': 30, 'benefit': 668817925, 'timing': 'eoy'}, 0], ['one-year term', {'q': [2207, 2761, 3485, 4400, 5510, 6912, 8685, 10885, 13650, 17091], 'n': 1, 'i': 60, 'benefit': 1000000021, 'timing': 'eoy'}, 20820755], ['large face amount', {'q': [1675, 2113, 2648, 3323, 4166, 5241, 6590, 8244, 10352, 12961], 'n': 8, 'i': 45, 'benefit': 5179542771, 'timing': 'eoy'}, 1207339201], ['immediate short term', {'q': [2261, 2837, 3571, 4509, 5663, 7114, 8900, 11135, 13947, 17461], 'n': 3, 'i': 50, 'benefit': 148092738, 'timing': 'immediate'}, 11530914]], [['five-year term year-end', {'q': [1372, 1750, 2200, 2793, 3528, 4456, 5617, 7060, 8864, 11121], 'n': 5, 'i': 60, 'benefit': 671460915, 'timing': 'eoy'}, 61409725], ['ten-year term immediate', {'q': [1483, 1891, 2391, 3003, 3797, 4757, 5974, 7507, 9411, 11782], 'n': 10, 'i': 45, 'benefit': 110078003, 'timing': 'immediate'}, 34888554], ['term equals table length', {'q': [2202, 2760, 3467, 4334, 5421, 6813, 8558, 10718, 13399, 16772], 'n': 10, 'i': 30, 'benefit': 761103905, 'timing': 'eoy'}, 340778826], ['term longer than table', {'q': [895, 1146, 1437, 1841, 2324, 2934, 3673, 4605, 5775, 7226], 'n': 11, 'i': 60, 'benefit': 612398678, 'timing': 'eoy'}, 'table too short'], ['zero-year term', {'q': [2071, 2616, 3274, 4106, 5164, 6501, 8167, 10248, 12843, 16103], 'n': 0, 'i': 30, 'benefit': 615700164, 'timing': 'eoy'}, 0], ['one-year term', {'q': [1630, 2082, 2630, 3305, 4153, 5203, 6508, 8173, 10245, 12826], 'n': 1, 'i': 60, 'benefit': 1000000028, 'timing': 'eoy'}, 15377359], ['large face amount', {'q': [1055, 1320, 1681, 2105, 2671, 3374, 4252, 5326, 6705, 8431], 'n': 8, 'i': 45, 'benefit': 6631603996, 'timing': 'eoy'}, 1038053345], ['immediate short term', {'q': [1585, 2009, 2540, 3175, 3980, 4989, 6278, 7848, 9822, 12302], 'n': 3, 'i': 50, 'benefit': 128139603, 'timing': 'immediate'}, 7115877]], [['five-year term year-end', {'q': [1585, 2015, 2541, 3196, 4029, 5069, 6349, 7942, 9963, 12472], 'n': 5, 'i': 30, 'benefit': 501144892, 'timing': 'eoy'}, 57536772], ['ten-year term immediate', {'q': [1239, 1548, 1962, 2463, 3080, 3877, 4882, 6122, 7676, 9611], 'n': 10, 'i': 60, 'benefit': 778238927, 'timing': 'immediate'}, 191663547], ['term equals table length', {'q': [1964, 2482, 3120, 3944, 4977, 6261, 7873, 9861, 12344, 15433], 'n': 10, 'i': 60, 'benefit': 912336104, 'timing': 'eoy'}, 318422653], ['term longer than table', {'q': [1113, 1425, 1788, 2240, 2841, 3583, 4528, 5705, 7149, 8939], 'n': 11, 'i': 60, 'benefit': 546287061, 'timing': 'eoy'}, 'table too short'], ['zero-year term', {'q': [1052, 1329, 1686, 2145, 2692, 3399, 4294, 5409, 6806, 8522], 'n': 0, 'i': 45, 'benefit': 558349824, 'timing': 'eoy'}, 0], ['one-year term', {'q': [1695, 2147, 2715, 3434, 4318, 5402, 6762, 8454, 10583, 13270], 'n': 1, 'i': 30, 'benefit': 1000000035, 'timing': 'eoy'}, 16456311], ['large face amount', {'q': [2159, 2724, 3446, 4334, 5433, 6813, 8566, 10749, 13458, 16871], 'n': 8, 'i': 60, 'benefit': 6554802467, 'timing': 'eoy'}, 1774398066], ['immediate short term', {'q': [1616, 2039, 2564, 3251, 4064, 5090, 6396, 8010, 10020, 12534], 'n': 3, 'i': 50, 'benefit': 976296817, 'timing': 'immediate'}, 54960278]]]
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
five-year term year-end2490730124907301Passed
ten-year term immediate203032132203032132Passed
term equals table length290009324290009324Passed
term longer than tabletable too shorttable too shortPassed
zero-year term00Passed
one-year term1043689310436893Passed
large face amount11605701671160570167Passed
immediate short term1903381019033810Passed

SHA-256 / 10a051e4757c69fe439867d486dfd5f5cc8102523238375bfa1dfca20ea8e826

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

Case digest / efc633e24e5e6981c8fc351362bcb959b60e060735781960e928e63da714d420