FA-63521 / Actuarial life tables / Open access
Deferred annuity with guaranteed period: Guaranteed payments ignore deferral survival · case 01
Guaranteed payments are valued as certain from issue.
ROOT CAUSE
The guarantee branch uses probability 1.
VERIFIED REPAIR
Guaranteed payments need survival to the end of deferral only.
Unsuccessful approach: Using survival to each payment removes the guarantee entirely.
Case contract
Input l (from issue age), defer n, guarantee g, term (None = to end of table), i. Payments at times n..end-1; the first g payments are certain once the annuitant survives the deferral (probability l_n/l_0), later payments need survival to k. PV = sum v^k * probability, rounded to 6. l_0=0 or negative n/g -> 'invalid'.
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):
l=x['l']; n=x['defer']; g=x['guarantee']
if l[0]==0 or n<0 or g<0: return 'invalid'
v=1/(1+Fraction(x['i'],1000))
end=len(l) if x['term'] is None else n+x['term']
pv=Fraction(0)
for k in range(n,end):
if k-n<g: p=Fraction(1)
elif k<len(l): p=Fraction(l[k],l[0])
else: p=Fraction(0)
pv+=v**k*p
return round(float(pv),6)
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['deferred life annuity', {'l': [100000, 99425, 98729, 97949, 97087, 96107, 95028, 93784, 92377, 90810, 89083, 0], 'defer': 2, 'guarantee': 0, 'term': None, 'i': 30}, 7.165092], ['deferred with guarantee', {'l': [100000, 99601, 99126, 98552, 97886, 97134, 96271, 95279, 94142, 92851, 91413, 0], 'defer': 2, 'guarantee': 3, 'term': None, 'i': 40}, 6.88609], ['temporary payout', {'l': [100000, 99494, 98894, 98222, 97442, 96531, 95492, 94358, 93079, 91645, 90025, 0], 'defer': 3, 'guarantee': 0, 'term': 4, 'i': 50}, 3.119058], ['guarantee and temporary', {'l': [100000, 99742, 99421, 99023, 98573, 98051, 97453, 96723, 95899, 94945, 93900, 0], 'defer': 2, 'guarantee': 2, 'term': 5, 'i': 30}, 4.38474], ['immediate start with guarantee', {'l': [100000, 99473, 98853, 98163, 97396, 96503, 95471, 94337, 93076, 91640, 90021, 0], 'defer': 0, 'guarantee': 4, 'term': None, 'i': 30}, 9.199942], ['guarantee beyond table', {'l': [100000, 99732, 99382, 98953, 98453, 97891, 97269, 96569, 95775, 94887, 93901, 0], 'defer': 9, 'guarantee': 5, 'term': 5, 'i': 40}, 3.086582], ['negative deferral rejected', {'l': [100000, 99743, 99467, 99108, 98688, 98191, 97622, 96977, 96250, 95440, 94526, 0], 'defer': -1, 'guarantee': 0, 'term': None, 'i': 50}, 'invalid'], ['long guarantee', {'l': [100000, 99500, 98941, 98284, 97559, 96739, 95786, 94750, 93541, 92187, 90659, 0], 'defer': 1, 'guarantee': 6, 'term': 8, 'i': 50}, 6.356806]], [['deferred life annuity', {'l': [100000, 99639, 99241, 98781, 98223, 97589, 96861, 96051, 95098, 94027, 92805, 0], 'defer': 3, 'guarantee': 0, 'term': None, 'i': 30}, 6.372582], ['deferred with guarantee', {'l': [100000, 99452, 98797, 98029, 97159, 96187, 95047, 93797, 92387, 90778, 89023, 0], 'defer': 4, 'guarantee': 3, 'term': None, 'i': 30}, 5.365158], ['temporary payout', {'l': [100000, 99529, 99014, 98422, 97729, 96926, 96021, 95022, 93865, 92546, 91035, 0], 'defer': 3, 'guarantee': 0, 'term': 4, 'i': 50}, 3.130189], ['guarantee and temporary', {'l': [100000, 99670, 99256, 98821, 98313, 97716, 97019, 96223, 95312, 94288, 93140, 0], 'defer': 2, 'guarantee': 2, 'term': 5, 'i': 40}, 4.210353], ['immediate start with guarantee', {'l': [100000, 99636, 99214, 98737, 98202, 97601, 96899, 96082, 95137, 94084, 92887, 0], 'defer': 0, 'guarantee': 4, 'term': None, 'i': 30}, 9.299049], ['guarantee beyond table', {'l': [100000, 99642, 99238, 98780, 98243, 97614, 96891, 96080, 95192, 94166, 92986, 0], 'defer': 9, 'guarantee': 5, 'term': 5, 'i': 40}, 3.063129], ['negative deferral rejected', {'l': [100000, 99479, 98876, 98201, 97410, 96494, 95459, 94308, 92981, 91500, 89852, 0], 'defer': -1, 'guarantee': 0, 'term': None, 'i': 50}, 'invalid'], ['long guarantee', {'l': [100000, 99390, 98668, 97867, 96967, 95943, 94769, 93439, 91943, 90256, 88419, 0], 'defer': 1, 'guarantee': 6, 'term': 8, 'i': 40}, 6.592038]], [['deferred life annuity', {'l': [100000, 99543, 99004, 98363, 97657, 96846, 95934, 94889, 93723, 92371, 90872, 0], 'defer': 2, 'guarantee': 0, 'term': None, 'i': 30}, 7.235385], ['deferred with guarantee', {'l': [100000, 99391, 98670, 97831, 96888, 95814, 94642, 93297, 91819, 90158, 88344, 0], 'defer': 4, 'guarantee': 3, 'term': None, 'i': 30}, 5.339789], ['temporary payout', {'l': [100000, 99445, 98763, 97986, 97117, 96158, 95058, 93783, 92374, 90793, 89065, 0], 'defer': 3, 'guarantee': 0, 'term': 4, 'i': 30}, 3.385146], ['guarantee and temporary', {'l': [100000, 99506, 98921, 98262, 97494, 96628, 95644, 94555, 93326, 91970, 90459, 0], 'defer': 2, 'guarantee': 2, 'term': 5, 'i': 40}, 4.177467], ['immediate start with guarantee', {'l': [100000, 99400, 98704, 97934, 97051, 96039, 94912, 93626, 92187, 90563, 88738, 0], 'defer': 0, 'guarantee': 4, 'term': None, 'i': 40}, 8.765009], ['guarantee beyond table', {'l': [100000, 99605, 99143, 98601, 97974, 97220, 96340, 95361, 94272, 93011, 91588, 0], 'defer': 9, 'guarantee': 5, 'term': 5, 'i': 30}, 3.362592], ['negative deferral rejected', {'l': [100000, 99538, 99023, 98427, 97731, 96898, 95975, 94913, 93762, 92450, 90990, 0], 'defer': -1, 'guarantee': 0, 'term': None, 'i': 40}, 'invalid'], ['long guarantee', {'l': [100000, 99742, 99431, 99074, 98681, 98184, 97623, 96993, 96245, 95379, 94421, 0], 'defer': 1, 'guarantee': 6, 'term': 8, 'i': 30}, 6.951624]], [['deferred life annuity', {'l': [100000, 99552, 99040, 98449, 97784, 96996, 96124, 95119, 93959, 92653, 91175, 0], 'defer': 2, 'guarantee': 0, 'term': None, 'i': 30}, 7.248674], ['deferred with guarantee', {'l': [100000, 99650, 99233, 98753, 98217, 97625, 96914, 96124, 95227, 94238, 93109, 0], 'defer': 4, 'guarantee': 3, 'term': None, 'i': 50}, 4.817244], ['temporary payout', {'l': [100000, 99541, 99004, 98381, 97651, 96805, 95855, 94767, 93546, 92171, 90658, 0], 'defer': 3, 'guarantee': 0, 'term': 4, 'i': 30}, 3.405761], ['guarantee and temporary', {'l': [100000, 99684, 99314, 98871, 98367, 97784, 97091, 96342, 95503, 94566, 93530, 0], 'defer': 2, 'guarantee': 2, 'term': 5, 'i': 40}, 4.212994], ['immediate start with guarantee', {'l': [100000, 99629, 99188, 98678, 98073, 97409, 96662, 95781, 94808, 93739, 92513, 0], 'defer': 0, 'guarantee': 4, 'term': None, 'i': 50}, 8.509224], ['guarantee beyond table', {'l': [100000, 99526, 98971, 98341, 97641, 96828, 95872, 94821, 93645, 92330, 90850, 0], 'defer': 9, 'guarantee': 5, 'term': 5, 'i': 50}, 2.705602], ['negative deferral rejected', {'l': [100000, 99514, 98941, 98308, 97591, 96770, 95833, 94741, 93537, 92173, 90635, 0], 'defer': -1, 'guarantee': 0, 'term': None, 'i': 40}, 'invalid'], ['long guarantee', {'l': [100000, 99471, 98835, 98117, 97316, 96411, 95386, 94204, 92904, 91431, 89771, 0], 'defer': 1, 'guarantee': 6, 'term': 8, 'i': 30}, 6.887892]], [['deferred life annuity', {'l': [100000, 99548, 99032, 98423, 97743, 96931, 96031, 94996, 93863, 92586, 91170, 0], 'defer': 2, 'guarantee': 0, 'term': None, 'i': 30}, 7.244348], ['deferred with guarantee', {'l': [100000, 99713, 99355, 98955, 98497, 97963, 97377, 96683, 95909, 95036, 94075, 0], 'defer': 3, 'guarantee': 3, 'term': None, 'i': 30}, 6.425506], ['temporary payout', {'l': [100000, 99462, 98822, 98056, 97174, 96153, 95018, 93750, 92286, 90640, 88808, 0], 'defer': 3, 'guarantee': 0, 'term': 4, 'i': 50}, 3.10892], ['guarantee and temporary', {'l': [100000, 99608, 99126, 98560, 97876, 97091, 96184, 95175, 94017, 92717, 91254, 0], 'defer': 2, 'guarantee': 2, 'term': 5, 'i': 40}, 4.192524], ['immediate start with guarantee', {'l': [100000, 99596, 99155, 98629, 97982, 97235, 96414, 95466, 94413, 93234, 91907, 0], 'defer': 0, 'guarantee': 4, 'term': None, 'i': 50}, 8.493373], ['guarantee beyond table', {'l': [100000, 99386, 98696, 97939, 97062, 96051, 94927, 93629, 92182, 90560, 88773, 0], 'defer': 9, 'guarantee': 5, 'term': 5, 'i': 40}, 2.945829], ['negative deferral rejected', {'l': [100000, 99409, 98713, 97891, 96950, 95872, 94685, 93348, 91853, 90211, 88349, 0], 'defer': -1, 'guarantee': 0, 'term': None, 'i': 30}, 'invalid'], ['long guarantee', {'l': [100000, 99625, 99173, 98672, 98103, 97425, 96665, 95806, 94813, 93715, 92493, 0], 'defer': 1, 'guarantee': 6, 'term': 8, 'i': 40}, 6.643315]]]
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 |
|---|---|---|---|
| deferred life annuity | 7.165092 | 7.165092 | Passed |
| deferred with guarantee | 6.909412 | 6.88609 | Failed |
| temporary payout | 3.119058 | 3.119058 | Passed |
| guarantee and temporary | 4.395496 | 4.38474 | Failed |
| immediate start with guarantee | 9.199942 | 9.199942 | Passed |
| guarantee beyond table | 3.252903 | 3.086582 | Failed |
| negative deferral rejected | invalid | invalid | Passed |
| long guarantee | 6.382185 | 6.356806 | Failed |
SHA-256 / adf2e11597f345d2b4c6a39c5e0f6071c095a410f8b8e4c119904a3f6f76091f
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):
l=x['l']; n=x['defer']; g=x['guarantee']
if l[0]==0 or n<0 or g<0: return 'invalid'
v=1/(1+Fraction(x['i'],1000))
end=len(l) if x['term'] is None else n+x['term']
pv=Fraction(0)
for k in range(n,end):
if k-n<g: p=Fraction(l[k],l[0]) if k<len(l) else Fraction(0)
elif k<len(l): p=Fraction(l[k],l[0])
else: p=Fraction(0)
pv+=v**k*p
return round(float(pv),6)
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['deferred life annuity', {'l': [100000, 99425, 98729, 97949, 97087, 96107, 95028, 93784, 92377, 90810, 89083, 0], 'defer': 2, 'guarantee': 0, 'term': None, 'i': 30}, 7.165092], ['deferred with guarantee', {'l': [100000, 99601, 99126, 98552, 97886, 97134, 96271, 95279, 94142, 92851, 91413, 0], 'defer': 2, 'guarantee': 3, 'term': None, 'i': 40}, 6.88609], ['temporary payout', {'l': [100000, 99494, 98894, 98222, 97442, 96531, 95492, 94358, 93079, 91645, 90025, 0], 'defer': 3, 'guarantee': 0, 'term': 4, 'i': 50}, 3.119058], ['guarantee and temporary', {'l': [100000, 99742, 99421, 99023, 98573, 98051, 97453, 96723, 95899, 94945, 93900, 0], 'defer': 2, 'guarantee': 2, 'term': 5, 'i': 30}, 4.38474], ['immediate start with guarantee', {'l': [100000, 99473, 98853, 98163, 97396, 96503, 95471, 94337, 93076, 91640, 90021, 0], 'defer': 0, 'guarantee': 4, 'term': None, 'i': 30}, 9.199942], ['guarantee beyond table', {'l': [100000, 99732, 99382, 98953, 98453, 97891, 97269, 96569, 95775, 94887, 93901, 0], 'defer': 9, 'guarantee': 5, 'term': 5, 'i': 40}, 3.086582], ['negative deferral rejected', {'l': [100000, 99743, 99467, 99108, 98688, 98191, 97622, 96977, 96250, 95440, 94526, 0], 'defer': -1, 'guarantee': 0, 'term': None, 'i': 50}, 'invalid'], ['long guarantee', {'l': [100000, 99500, 98941, 98284, 97559, 96739, 95786, 94750, 93541, 92187, 90659, 0], 'defer': 1, 'guarantee': 6, 'term': 8, 'i': 50}, 6.356806]], [['deferred life annuity', {'l': [100000, 99639, 99241, 98781, 98223, 97589, 96861, 96051, 95098, 94027, 92805, 0], 'defer': 3, 'guarantee': 0, 'term': None, 'i': 30}, 6.372582], ['deferred with guarantee', {'l': [100000, 99452, 98797, 98029, 97159, 96187, 95047, 93797, 92387, 90778, 89023, 0], 'defer': 4, 'guarantee': 3, 'term': None, 'i': 30}, 5.365158], ['temporary payout', {'l': [100000, 99529, 99014, 98422, 97729, 96926, 96021, 95022, 93865, 92546, 91035, 0], 'defer': 3, 'guarantee': 0, 'term': 4, 'i': 50}, 3.130189], ['guarantee and temporary', {'l': [100000, 99670, 99256, 98821, 98313, 97716, 97019, 96223, 95312, 94288, 93140, 0], 'defer': 2, 'guarantee': 2, 'term': 5, 'i': 40}, 4.210353], ['immediate start with guarantee', {'l': [100000, 99636, 99214, 98737, 98202, 97601, 96899, 96082, 95137, 94084, 92887, 0], 'defer': 0, 'guarantee': 4, 'term': None, 'i': 30}, 9.299049], ['guarantee beyond table', {'l': [100000, 99642, 99238, 98780, 98243, 97614, 96891, 96080, 95192, 94166, 92986, 0], 'defer': 9, 'guarantee': 5, 'term': 5, 'i': 40}, 3.063129], ['negative deferral rejected', {'l': [100000, 99479, 98876, 98201, 97410, 96494, 95459, 94308, 92981, 91500, 89852, 0], 'defer': -1, 'guarantee': 0, 'term': None, 'i': 50}, 'invalid'], ['long guarantee', {'l': [100000, 99390, 98668, 97867, 96967, 95943, 94769, 93439, 91943, 90256, 88419, 0], 'defer': 1, 'guarantee': 6, 'term': 8, 'i': 40}, 6.592038]], [['deferred life annuity', {'l': [100000, 99543, 99004, 98363, 97657, 96846, 95934, 94889, 93723, 92371, 90872, 0], 'defer': 2, 'guarantee': 0, 'term': None, 'i': 30}, 7.235385], ['deferred with guarantee', {'l': [100000, 99391, 98670, 97831, 96888, 95814, 94642, 93297, 91819, 90158, 88344, 0], 'defer': 4, 'guarantee': 3, 'term': None, 'i': 30}, 5.339789], ['temporary payout', {'l': [100000, 99445, 98763, 97986, 97117, 96158, 95058, 93783, 92374, 90793, 89065, 0], 'defer': 3, 'guarantee': 0, 'term': 4, 'i': 30}, 3.385146], ['guarantee and temporary', {'l': [100000, 99506, 98921, 98262, 97494, 96628, 95644, 94555, 93326, 91970, 90459, 0], 'defer': 2, 'guarantee': 2, 'term': 5, 'i': 40}, 4.177467], ['immediate start with guarantee', {'l': [100000, 99400, 98704, 97934, 97051, 96039, 94912, 93626, 92187, 90563, 88738, 0], 'defer': 0, 'guarantee': 4, 'term': None, 'i': 40}, 8.765009], ['guarantee beyond table', {'l': [100000, 99605, 99143, 98601, 97974, 97220, 96340, 95361, 94272, 93011, 91588, 0], 'defer': 9, 'guarantee': 5, 'term': 5, 'i': 30}, 3.362592], ['negative deferral rejected', {'l': [100000, 99538, 99023, 98427, 97731, 96898, 95975, 94913, 93762, 92450, 90990, 0], 'defer': -1, 'guarantee': 0, 'term': None, 'i': 40}, 'invalid'], ['long guarantee', {'l': [100000, 99742, 99431, 99074, 98681, 98184, 97623, 96993, 96245, 95379, 94421, 0], 'defer': 1, 'guarantee': 6, 'term': 8, 'i': 30}, 6.951624]], [['deferred life annuity', {'l': [100000, 99552, 99040, 98449, 97784, 96996, 96124, 95119, 93959, 92653, 91175, 0], 'defer': 2, 'guarantee': 0, 'term': None, 'i': 30}, 7.248674], ['deferred with guarantee', {'l': [100000, 99650, 99233, 98753, 98217, 97625, 96914, 96124, 95227, 94238, 93109, 0], 'defer': 4, 'guarantee': 3, 'term': None, 'i': 50}, 4.817244], ['temporary payout', {'l': [100000, 99541, 99004, 98381, 97651, 96805, 95855, 94767, 93546, 92171, 90658, 0], 'defer': 3, 'guarantee': 0, 'term': 4, 'i': 30}, 3.405761], ['guarantee and temporary', {'l': [100000, 99684, 99314, 98871, 98367, 97784, 97091, 96342, 95503, 94566, 93530, 0], 'defer': 2, 'guarantee': 2, 'term': 5, 'i': 40}, 4.212994], ['immediate start with guarantee', {'l': [100000, 99629, 99188, 98678, 98073, 97409, 96662, 95781, 94808, 93739, 92513, 0], 'defer': 0, 'guarantee': 4, 'term': None, 'i': 50}, 8.509224], ['guarantee beyond table', {'l': [100000, 99526, 98971, 98341, 97641, 96828, 95872, 94821, 93645, 92330, 90850, 0], 'defer': 9, 'guarantee': 5, 'term': 5, 'i': 50}, 2.705602], ['negative deferral rejected', {'l': [100000, 99514, 98941, 98308, 97591, 96770, 95833, 94741, 93537, 92173, 90635, 0], 'defer': -1, 'guarantee': 0, 'term': None, 'i': 40}, 'invalid'], ['long guarantee', {'l': [100000, 99471, 98835, 98117, 97316, 96411, 95386, 94204, 92904, 91431, 89771, 0], 'defer': 1, 'guarantee': 6, 'term': 8, 'i': 30}, 6.887892]], [['deferred life annuity', {'l': [100000, 99548, 99032, 98423, 97743, 96931, 96031, 94996, 93863, 92586, 91170, 0], 'defer': 2, 'guarantee': 0, 'term': None, 'i': 30}, 7.244348], ['deferred with guarantee', {'l': [100000, 99713, 99355, 98955, 98497, 97963, 97377, 96683, 95909, 95036, 94075, 0], 'defer': 3, 'guarantee': 3, 'term': None, 'i': 30}, 6.425506], ['temporary payout', {'l': [100000, 99462, 98822, 98056, 97174, 96153, 95018, 93750, 92286, 90640, 88808, 0], 'defer': 3, 'guarantee': 0, 'term': 4, 'i': 50}, 3.10892], ['guarantee and temporary', {'l': [100000, 99608, 99126, 98560, 97876, 97091, 96184, 95175, 94017, 92717, 91254, 0], 'defer': 2, 'guarantee': 2, 'term': 5, 'i': 40}, 4.192524], ['immediate start with guarantee', {'l': [100000, 99596, 99155, 98629, 97982, 97235, 96414, 95466, 94413, 93234, 91907, 0], 'defer': 0, 'guarantee': 4, 'term': None, 'i': 50}, 8.493373], ['guarantee beyond table', {'l': [100000, 99386, 98696, 97939, 97062, 96051, 94927, 93629, 92182, 90560, 88773, 0], 'defer': 9, 'guarantee': 5, 'term': 5, 'i': 40}, 2.945829], ['negative deferral rejected', {'l': [100000, 99409, 98713, 97891, 96950, 95872, 94685, 93348, 91853, 90211, 88349, 0], 'defer': -1, 'guarantee': 0, 'term': None, 'i': 30}, 'invalid'], ['long guarantee', {'l': [100000, 99625, 99173, 98672, 98103, 97425, 96665, 95806, 94813, 93715, 92493, 0], 'defer': 1, 'guarantee': 6, 'term': 8, 'i': 40}, 6.643315]]]
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 |
|---|---|---|---|
| deferred life annuity | 7.165092 | 7.165092 | Passed |
| deferred with guarantee | 6.870388 | 6.88609 | Failed |
| temporary payout | 3.119058 | 3.119058 | Passed |
| guarantee and temporary | 4.381097 | 4.38474 | Failed |
| immediate start with guarantee | 9.167203 | 9.199942 | Failed |
| guarantee beyond table | 1.301025 | 3.086582 | Failed |
| negative deferral rejected | invalid | invalid | Passed |
| long guarantee | 6.275916 | 6.356806 | Failed |
SHA-256 / dc1cee7b0b115123ba157ae8d587532629890ac1185155d103c6f373cad80d14
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):
l=x['l']; n=x['defer']; g=x['guarantee']
if l[0]==0 or n<0 or g<0: return 'invalid'
v=1/(1+Fraction(x['i'],1000))
end=len(l) if x['term'] is None else n+x['term']
pv=Fraction(0)
for k in range(n,end):
if k-n<g: p=Fraction(l[n],l[0]) if n<len(l) else Fraction(0)
elif k<len(l): p=Fraction(l[k],l[0])
else: p=Fraction(0)
pv+=v**k*p
return round(float(pv),6)
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['deferred life annuity', {'l': [100000, 99425, 98729, 97949, 97087, 96107, 95028, 93784, 92377, 90810, 89083, 0], 'defer': 2, 'guarantee': 0, 'term': None, 'i': 30}, 7.165092], ['deferred with guarantee', {'l': [100000, 99601, 99126, 98552, 97886, 97134, 96271, 95279, 94142, 92851, 91413, 0], 'defer': 2, 'guarantee': 3, 'term': None, 'i': 40}, 6.88609], ['temporary payout', {'l': [100000, 99494, 98894, 98222, 97442, 96531, 95492, 94358, 93079, 91645, 90025, 0], 'defer': 3, 'guarantee': 0, 'term': 4, 'i': 50}, 3.119058], ['guarantee and temporary', {'l': [100000, 99742, 99421, 99023, 98573, 98051, 97453, 96723, 95899, 94945, 93900, 0], 'defer': 2, 'guarantee': 2, 'term': 5, 'i': 30}, 4.38474], ['immediate start with guarantee', {'l': [100000, 99473, 98853, 98163, 97396, 96503, 95471, 94337, 93076, 91640, 90021, 0], 'defer': 0, 'guarantee': 4, 'term': None, 'i': 30}, 9.199942], ['guarantee beyond table', {'l': [100000, 99732, 99382, 98953, 98453, 97891, 97269, 96569, 95775, 94887, 93901, 0], 'defer': 9, 'guarantee': 5, 'term': 5, 'i': 40}, 3.086582], ['negative deferral rejected', {'l': [100000, 99743, 99467, 99108, 98688, 98191, 97622, 96977, 96250, 95440, 94526, 0], 'defer': -1, 'guarantee': 0, 'term': None, 'i': 50}, 'invalid'], ['long guarantee', {'l': [100000, 99500, 98941, 98284, 97559, 96739, 95786, 94750, 93541, 92187, 90659, 0], 'defer': 1, 'guarantee': 6, 'term': 8, 'i': 50}, 6.356806]], [['deferred life annuity', {'l': [100000, 99639, 99241, 98781, 98223, 97589, 96861, 96051, 95098, 94027, 92805, 0], 'defer': 3, 'guarantee': 0, 'term': None, 'i': 30}, 6.372582], ['deferred with guarantee', {'l': [100000, 99452, 98797, 98029, 97159, 96187, 95047, 93797, 92387, 90778, 89023, 0], 'defer': 4, 'guarantee': 3, 'term': None, 'i': 30}, 5.365158], ['temporary payout', {'l': [100000, 99529, 99014, 98422, 97729, 96926, 96021, 95022, 93865, 92546, 91035, 0], 'defer': 3, 'guarantee': 0, 'term': 4, 'i': 50}, 3.130189], ['guarantee and temporary', {'l': [100000, 99670, 99256, 98821, 98313, 97716, 97019, 96223, 95312, 94288, 93140, 0], 'defer': 2, 'guarantee': 2, 'term': 5, 'i': 40}, 4.210353], ['immediate start with guarantee', {'l': [100000, 99636, 99214, 98737, 98202, 97601, 96899, 96082, 95137, 94084, 92887, 0], 'defer': 0, 'guarantee': 4, 'term': None, 'i': 30}, 9.299049], ['guarantee beyond table', {'l': [100000, 99642, 99238, 98780, 98243, 97614, 96891, 96080, 95192, 94166, 92986, 0], 'defer': 9, 'guarantee': 5, 'term': 5, 'i': 40}, 3.063129], ['negative deferral rejected', {'l': [100000, 99479, 98876, 98201, 97410, 96494, 95459, 94308, 92981, 91500, 89852, 0], 'defer': -1, 'guarantee': 0, 'term': None, 'i': 50}, 'invalid'], ['long guarantee', {'l': [100000, 99390, 98668, 97867, 96967, 95943, 94769, 93439, 91943, 90256, 88419, 0], 'defer': 1, 'guarantee': 6, 'term': 8, 'i': 40}, 6.592038]], [['deferred life annuity', {'l': [100000, 99543, 99004, 98363, 97657, 96846, 95934, 94889, 93723, 92371, 90872, 0], 'defer': 2, 'guarantee': 0, 'term': None, 'i': 30}, 7.235385], ['deferred with guarantee', {'l': [100000, 99391, 98670, 97831, 96888, 95814, 94642, 93297, 91819, 90158, 88344, 0], 'defer': 4, 'guarantee': 3, 'term': None, 'i': 30}, 5.339789], ['temporary payout', {'l': [100000, 99445, 98763, 97986, 97117, 96158, 95058, 93783, 92374, 90793, 89065, 0], 'defer': 3, 'guarantee': 0, 'term': 4, 'i': 30}, 3.385146], ['guarantee and temporary', {'l': [100000, 99506, 98921, 98262, 97494, 96628, 95644, 94555, 93326, 91970, 90459, 0], 'defer': 2, 'guarantee': 2, 'term': 5, 'i': 40}, 4.177467], ['immediate start with guarantee', {'l': [100000, 99400, 98704, 97934, 97051, 96039, 94912, 93626, 92187, 90563, 88738, 0], 'defer': 0, 'guarantee': 4, 'term': None, 'i': 40}, 8.765009], ['guarantee beyond table', {'l': [100000, 99605, 99143, 98601, 97974, 97220, 96340, 95361, 94272, 93011, 91588, 0], 'defer': 9, 'guarantee': 5, 'term': 5, 'i': 30}, 3.362592], ['negative deferral rejected', {'l': [100000, 99538, 99023, 98427, 97731, 96898, 95975, 94913, 93762, 92450, 90990, 0], 'defer': -1, 'guarantee': 0, 'term': None, 'i': 40}, 'invalid'], ['long guarantee', {'l': [100000, 99742, 99431, 99074, 98681, 98184, 97623, 96993, 96245, 95379, 94421, 0], 'defer': 1, 'guarantee': 6, 'term': 8, 'i': 30}, 6.951624]], [['deferred life annuity', {'l': [100000, 99552, 99040, 98449, 97784, 96996, 96124, 95119, 93959, 92653, 91175, 0], 'defer': 2, 'guarantee': 0, 'term': None, 'i': 30}, 7.248674], ['deferred with guarantee', {'l': [100000, 99650, 99233, 98753, 98217, 97625, 96914, 96124, 95227, 94238, 93109, 0], 'defer': 4, 'guarantee': 3, 'term': None, 'i': 50}, 4.817244], ['temporary payout', {'l': [100000, 99541, 99004, 98381, 97651, 96805, 95855, 94767, 93546, 92171, 90658, 0], 'defer': 3, 'guarantee': 0, 'term': 4, 'i': 30}, 3.405761], ['guarantee and temporary', {'l': [100000, 99684, 99314, 98871, 98367, 97784, 97091, 96342, 95503, 94566, 93530, 0], 'defer': 2, 'guarantee': 2, 'term': 5, 'i': 40}, 4.212994], ['immediate start with guarantee', {'l': [100000, 99629, 99188, 98678, 98073, 97409, 96662, 95781, 94808, 93739, 92513, 0], 'defer': 0, 'guarantee': 4, 'term': None, 'i': 50}, 8.509224], ['guarantee beyond table', {'l': [100000, 99526, 98971, 98341, 97641, 96828, 95872, 94821, 93645, 92330, 90850, 0], 'defer': 9, 'guarantee': 5, 'term': 5, 'i': 50}, 2.705602], ['negative deferral rejected', {'l': [100000, 99514, 98941, 98308, 97591, 96770, 95833, 94741, 93537, 92173, 90635, 0], 'defer': -1, 'guarantee': 0, 'term': None, 'i': 40}, 'invalid'], ['long guarantee', {'l': [100000, 99471, 98835, 98117, 97316, 96411, 95386, 94204, 92904, 91431, 89771, 0], 'defer': 1, 'guarantee': 6, 'term': 8, 'i': 30}, 6.887892]], [['deferred life annuity', {'l': [100000, 99548, 99032, 98423, 97743, 96931, 96031, 94996, 93863, 92586, 91170, 0], 'defer': 2, 'guarantee': 0, 'term': None, 'i': 30}, 7.244348], ['deferred with guarantee', {'l': [100000, 99713, 99355, 98955, 98497, 97963, 97377, 96683, 95909, 95036, 94075, 0], 'defer': 3, 'guarantee': 3, 'term': None, 'i': 30}, 6.425506], ['temporary payout', {'l': [100000, 99462, 98822, 98056, 97174, 96153, 95018, 93750, 92286, 90640, 88808, 0], 'defer': 3, 'guarantee': 0, 'term': 4, 'i': 50}, 3.10892], ['guarantee and temporary', {'l': [100000, 99608, 99126, 98560, 97876, 97091, 96184, 95175, 94017, 92717, 91254, 0], 'defer': 2, 'guarantee': 2, 'term': 5, 'i': 40}, 4.192524], ['immediate start with guarantee', {'l': [100000, 99596, 99155, 98629, 97982, 97235, 96414, 95466, 94413, 93234, 91907, 0], 'defer': 0, 'guarantee': 4, 'term': None, 'i': 50}, 8.493373], ['guarantee beyond table', {'l': [100000, 99386, 98696, 97939, 97062, 96051, 94927, 93629, 92182, 90560, 88773, 0], 'defer': 9, 'guarantee': 5, 'term': 5, 'i': 40}, 2.945829], ['negative deferral rejected', {'l': [100000, 99409, 98713, 97891, 96950, 95872, 94685, 93348, 91853, 90211, 88349, 0], 'defer': -1, 'guarantee': 0, 'term': None, 'i': 30}, 'invalid'], ['long guarantee', {'l': [100000, 99625, 99173, 98672, 98103, 97425, 96665, 95806, 94813, 93715, 92493, 0], 'defer': 1, 'guarantee': 6, 'term': 8, 'i': 40}, 6.643315]]]
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 |
|---|---|---|---|
| deferred life annuity | 7.165092 | 7.165092 | Passed |
| deferred with guarantee | 6.88609 | 6.88609 | Passed |
| temporary payout | 3.119058 | 3.119058 | Passed |
| guarantee and temporary | 4.38474 | 4.38474 | Passed |
| immediate start with guarantee | 9.199942 | 9.199942 | Passed |
| guarantee beyond table | 3.086582 | 3.086582 | Passed |
| negative deferral rejected | invalid | invalid | Passed |
| long guarantee | 6.356806 | 6.356806 | Passed |
SHA-256 / 3858c958c95cef0d4156fe38cf5a2cf030a1128a6c95e4fe5119fab63dddb2bb
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.127066+00:00.
Case digest / 9e3c52450363540c6056ba32392f1cdff9a35472221eb49e7ce42ea2718036a6