← Back to RetIQ · Features · Manual · Security

RetIQ Financial Validation Report

Independent verification of all financial calculations against authoritative sources

100.0%

pass rate

675
Total Tests
675
Passed
0
Failed
79
Categories

Methodology

Every financial calculation in RetIQ's projection engine is tested against authoritative sources: IRS publications and revenue procedures, Social Security Administration actuarial tables, CMS Medicare data, HHS Federal Poverty Level guidelines, ACA Premium Tax Credit tables, and enacted legislation (SECURE 2.0, OBBB Act, ARPA/IRA enhanced subsidies). Tests use exact bracket boundaries, known-answer scenarios from IRS worksheets, and complete lookup tables verified entry-by-entry. Tolerance is $1 for rounding unless otherwise noted.

Authoritative Sources

Federal Income Tax Brackets (2026)

Internal Revenue Service
Source →

Standard Deduction & Senior Additions (2025)

Internal Revenue Service
Source →

Social Security Benefit Taxation (IRS Section 86)

Internal Revenue Service
Source →

Social Security PIA & Benefit Calculation

Social Security Administration
Source →

Required Minimum Distributions

Internal Revenue Service
Source →

Long-Term Capital Gains Tax Rates

Internal Revenue Service
Source →

Medicare IRMAA Surcharges (2025)

Centers for Medicare & Medicaid Services
Source →

Retirement Contribution Limits (2025)

Internal Revenue Service
Source →

ACA Premium Tax Credit

IRS / HHS / CMS
Source →

Pension Enhancements (v2.0)

RetIQ Engine

Test Results by Category

Federal Tax (MFJ) 10/10

Formula
Taxable Income (TI) = Gross Income − Standard Deduction
Tax = Σ [ min(TI, bracket_top) − bracket_bottom ] × rate
    for each bracket where TI > bracket_bottom
IRC §1 • IRS Rev. Proc. 2025-32, §4.01 • OBBB Act P.L. 119-21 §101 • IRS source →
Authority: Internal Revenue Service
Documents:
• IRS Revenue Procedure 2025-32, Section 4.01 — Tax Rate Tables
• One Big Beautiful Bill Act (P.L. 119-21), signed July 4, 2025 — Permanent extension of TCJA brackets
Method: Seven marginal tax brackets verified at exact boundary amounts for both MFJ and Single filing status. Cumulative tax computed manually at each bracket top and compared against engine output.
TestExpectedActualResult
Top of 10% bracket ($24,800)2,4802,480
Top of 12% bracket ($100,800)11,60011,600
Top of 22% bracket ($211,400)35,93235,932
Top of 24% bracket ($403,550)82,04882,048
Top of 32% bracket ($512,450)116,896116,896
Top of 35% bracket ($768,700)206,584206,584
In 37% bracket ($1,000,000)292,165292,165
Zero income00
Mid-bracket $50,0005,5045,504
Mid-bracket $150,00022,42422,424

Federal Tax (Single) 6/6

Formula
Taxable Income (TI) = Gross Income − Standard Deduction
Tax = Σ [ min(TI, bracket_top) − bracket_bottom ] × rate
    for each bracket where TI > bracket_bottom
IRC §1 • IRS Rev. Proc. 2025-32, §4.01 • OBBB Act P.L. 119-21 §101 • IRS source →
Authority: Internal Revenue Service
Documents:
• IRS Revenue Procedure 2025-32, Section 4.01 — Tax Rate Tables
• One Big Beautiful Bill Act (P.L. 119-21), signed July 4, 2025 — Permanent extension of TCJA brackets
Method: Seven marginal tax brackets verified at exact boundary amounts for both MFJ and Single filing status. Cumulative tax computed manually at each bracket top and compared against engine output.
TestExpectedActualResult
Top of 10% bracket ($12,400)1,2401,240
Top of 12% bracket ($50,400)5,8005,800
Top of 22% bracket ($105,700)17,96617,966
Top of 24% bracket ($201,775)41,02441,024
Mid-bracket $75,00011,21211,212
$200,000 income40,59840,598

Standard Deduction 8/8

Formula
Deduction = Base + Senior Addition + OBBB Senior Deduction
OBBB = min($6,000/person, $6,000 − 0.06 × max(0, MAGI − threshold))
Threshold: $150,000 MFJ / $75,000 Single • Phases out at 6% per $1,000
IRC §63(c) • IRS Rev. Proc. 2024-40, §3.01 • OBBB Act P.L. 119-21 §102 • IRS source →
Authority: Internal Revenue Service
Documents:
• IRS Revenue Procedure 2024-40, Section 3.01 — Standard Deduction
• One Big Beautiful Bill Act (P.L. 119-21) Section 102 — Additional Senior Deduction
• IRS Fact Sheet FS-2025-03 — Tax deductions for working Americans and seniors
Method: Base standard deduction ($31,500 MFJ / $15,750 Single), existing senior additions ($1,600/$2,000), and new OBBB senior bonus deduction ($6,000/person with 6% phaseout above $150K MFJ / $75K Single).
TestExpectedActualResult
MFJ base deduction32,20032,200
Single base deduction16,10016,100
Senior additional — MFJ (per person)1,6501,650
Senior additional — Single2,0502,050
OBBB Senior Deduction: $6,000 per person6,0006,000
OBBB phaseout threshold — MFJ150,000150,000
OBBB phaseout threshold — Single75,00075,000
OBBB phaseout rate: 6% ($60 per $1,000 over threshold)0.060.06

SS Taxation (MFJ) 6/6

Formula
Provisional Income (PI) = AGI + Tax-Exempt Interest + 0.5 × SS Gross
If PI ≤ $32,000 MFJ ($25,000 Single): 0% of SS taxable
If PI between thresholds: min(0.50 × (PI − lower), 0.50 × SS Gross)
If PI > $44,000 MFJ ($34,000 Single): min(0.85 × (PI − upper) + 0.50 × $12,000, 0.85 × SS Gross)
IRC §86 • IRS Pub. 915, Worksheet 1 • IRS Pub. 915 →
Authority: Internal Revenue Service
Documents:
• IRC Section 86 — Social Security and Tier 1 Railroad Retirement Benefits
• IRS Publication 915 (2024) — Social Security and Equivalent Railroad Retirement Benefits
• IRS Publication 915, Worksheet 1 — Figuring Your Taxable Benefits
Method: Three-tier taxation: 0% when combined income below base threshold ($32K MFJ / $25K Single), up to 50% between thresholds, up to 85% above upper threshold ($44K MFJ / $34K Single). Verified with hand calculations matching Pub 915 Worksheet 1.
TestExpectedActualResult
Below base threshold: $20K SS, $10K other → 0% taxable00
At base threshold: $24K SS, $20K other → 0% taxable00
Between thresholds: $30K SS, $25K other → partial4,0004,000
Above upper: $30K SS, $60K other → 85% rule25,50025,500
Very high income: $40K SS, $200K other → 85% cap34,00034,000
Zero SS benefit → zero taxable00

SS Taxation (Single) 3/3

Formula
Provisional Income (PI) = AGI + Tax-Exempt Interest + 0.5 × SS Gross
If PI ≤ $32,000 MFJ ($25,000 Single): 0% of SS taxable
If PI between thresholds: min(0.50 × (PI − lower), 0.50 × SS Gross)
If PI > $44,000 MFJ ($34,000 Single): min(0.85 × (PI − upper) + 0.50 × $12,000, 0.85 × SS Gross)
IRC §86 • IRS Pub. 915, Worksheet 1 • IRS Pub. 915 →
Authority: Internal Revenue Service
Documents:
• IRC Section 86 — Social Security and Tier 1 Railroad Retirement Benefits
• IRS Publication 915 (2024) — Social Security and Equivalent Railroad Retirement Benefits
• IRS Publication 915, Worksheet 1 — Figuring Your Taxable Benefits
Method: Three-tier taxation: 0% when combined income below base threshold ($32K MFJ / $25K Single), up to 50% between thresholds, up to 85% above upper threshold ($44K MFJ / $34K Single). Verified with hand calculations matching Pub 915 Worksheet 1.
TestExpectedActualResult
Below base: $20K SS, $10K other → 0%00
Between thresholds: $24K SS, $20K other → partial3,5003,500
Above upper: $30K SS, $40K other → 85% rule22,35022,350

SS PIA 4/4

Formula
PIA = 90% × min(AIME, $1,226) + 32% × min(AIME − $1,226, $6,165) + 15% × max(0, AIME − $7,391)
AIME = Average Indexed Monthly Earnings (capped at wage base: $176,100 for 2025)
42 U.S.C. §415 • SSA OACT 2025 Bend Points • SSA POMS RS 00605.900 • SSA source →
Authority: Social Security Administration
Documents:
• SSA 2025 Bend Points — Office of the Chief Actuary (OACT)
• SSA POMS RS 00615.003 — Full Retirement Age
• SSA POMS RS 00615.301-304 — Early/Late Claiming Adjustments
• SSA 2025 Contribution and Benefit Base — $176,100
Method: PIA bend points ($1,226 / $7,391 for 2025), replacement rates (90%/32%/15%), wage base cap, FRA table for all birth years 1937-1960+, early claiming reduction (5/9% per month first 36, 5/12% beyond), and delayed retirement credits (8%/year capped at 70).
TestExpectedActualResult
Low earner AIME=$1,000 → PIA=$900900900
Mid earner AIME=$5,000 → PIA≈$2,3112,3112,311
Max earner AIME=$15,375 → PIA≈$4,2694,273.74,273
Income above wage cap ($200K) capped at $184,5004,2734,273

FRA 16/16

Formula (Full Retirement Age by birth year)
1943-1954: FRA = 66
1955-1959: FRA = 66 + (birthYear - 1954) * 2 months
1960+: FRA = 67
42 U.S.C. §416(l) • SSA full retirement age table
Sources: 42 U.S.C. §416(l) (definition of full retirement age); SSA full retirement age table by year of birth. Applies to both retirement benefits and the earnings test.
TestExpectedActualResult
Born 1937 → FRA 65y 0m780780
Born 1938 → FRA 65y 2m782782
Born 1939 → FRA 65y 4m784784
Born 1940 → FRA 65y 6m786786
Born 1941 → FRA 65y 8m788788
Born 1942 → FRA 65y 10m790790
Born 1943 → FRA 66y 0m792792
Born 1954 → FRA 66y 0m792792
Born 1955 → FRA 66y 2m794794
Born 1956 → FRA 66y 4m796796
Born 1957 → FRA 66y 6m798798
Born 1958 → FRA 66y 8m800800
Born 1959 → FRA 66y 10m802802
Born 1960+ → FRA 67y 0m804804
Born 1975 → FRA 67y 0m804804
Born 1990 → FRA 67y 0m804804

SS Claiming 7/7

Formula (claiming-age adjustments to PIA)
Before FRA: benefit reduced 5/9% per month for first 36 months, then 5/12% per month beyond
After FRA: benefit increased 2/3% per month (8%/year) of delayed retirement credits
Delayed retirement credits stop accruing at age 70.
42 U.S.C. §402(q) (reduction) • §402(w) (delayed credits) • SSA POMS RS 00615
Sources: 42 U.S.C. §402(q) (early-claiming reduction); §402(w) (delayed retirement credits); SSA POMS RS 00615. Engine applies the appropriate adjustment based on claim age relative to FRA.
TestExpectedActualResult
Claim at FRA (67) → 100% of PIA2,0002,000
Claim at 62 (60 months early) → 70% of PIA1,4001,400
Claim at 64 (36 months early) → 80% of PIA1,6001,600
Claim at 65 (24 months early) → ~86.7% of PIA1,7331,733
Claim at 70 (36 months late) → 124% of PIA2,4802,480
Claim at 68 (12 months late) → 108% of PIA2,1602,160
Claim at 72 → same as 70 (DRC capped)2,4802,480

SS Reverse 5/5

TestExpectedActualResult
PIA $3000 → claim 70 → reverse recovers ~$30003,0003,000
PIA $2500 → claim 62 → reverse recovers ~$25002,5002,500
PIA $2000 → claim 67 (FRA) → reverse recovers $2000 exactly2,0002,000
PIA $4000 → claim 65 → reverse recovers ~$40004,0003,999
Zero current monthly returns 000

RMD Table 34/34

Formula
RMD = Prior Year-End Account Balance ÷ Distribution Period (age-based divisor)
Divisors from IRS Uniform Lifetime Table III: age 72 → 27.4, age 80 → 20.2, age 90 → 12.2 …
IRC §401(a)(9) • IRS Pub. 590-B, Table III (Uniform Lifetime Table) • SECURE 2.0 Act §107 • IRS Pub. 590-B →
Authority: Internal Revenue Service
Documents:
• IRS Publication 590-B — Distributions from IRAs
• IRS Uniform Lifetime Table (Table III) — updated effective 2022
• SECURE 2.0 Act of 2022, Section 107 — RMD Start Age Changes
Method: All 34 divisors from the Uniform Lifetime Table (ages 72-105) verified to exact decimal. SECURE 2.0 RMD start ages confirmed: 72 (born <=1950), 73 (1951-1959), 75 (1960+).
TestExpectedActualResult
Age 72 divisor = 27.427.427.4
Age 73 divisor = 26.526.526.5
Age 74 divisor = 25.525.525.5
Age 75 divisor = 24.624.624.6
Age 76 divisor = 23.723.723.7
Age 77 divisor = 22.922.922.9
Age 78 divisor = 222222
Age 79 divisor = 21.121.121.1
Age 80 divisor = 20.220.220.2
Age 81 divisor = 19.419.419.4
Age 82 divisor = 18.518.518.5
Age 83 divisor = 17.717.717.7
Age 84 divisor = 16.816.816.8
Age 85 divisor = 161616
Age 86 divisor = 15.215.215.2
Age 87 divisor = 14.414.414.4
Age 88 divisor = 13.713.713.7
Age 89 divisor = 12.912.912.9
Age 90 divisor = 12.212.212.2
Age 91 divisor = 11.511.511.5
Age 92 divisor = 10.810.810.8
Age 93 divisor = 10.110.110.1
Age 94 divisor = 9.59.59.5
Age 95 divisor = 8.98.98.9
Age 96 divisor = 8.48.48.4
Age 97 divisor = 7.87.87.8
Age 98 divisor = 7.37.37.3
Age 99 divisor = 6.86.86.8
Age 100 divisor = 6.46.46.4
Age 101 divisor = 666
Age 102 divisor = 5.65.65.6
Age 103 divisor = 5.25.25.2
Age 104 divisor = 4.94.94.9
Age 105 divisor = 4.64.64.6

RMD Calc 4/4

Formula
RMD = Balance(Dec 31, prior year) ÷ Distribution Period(current age)
Example: $1,000,000 ÷ 26.5 (age 73) = $37,736
IRC §401(a)(9) • IRS Pub. 590-B, Table III • IRS Pub. 590-B →
Authority: Internal Revenue Service
Documents:
• IRS Publication 590-B — Distributions from IRAs
• IRS Uniform Lifetime Table (Table III) — updated effective 2022
• SECURE 2.0 Act of 2022, Section 107 — RMD Start Age Changes
Method: All 34 divisors from the Uniform Lifetime Table (ages 72-105) verified to exact decimal. SECURE 2.0 RMD start ages confirmed: 72 (born <=1950), 73 (1951-1959), 75 (1960+).
TestExpectedActualResult
Age 73, $1M balance → $37,73637,73637,736
Age 80, $1M balance → $49,50549,50549,505
Age 90, $1M balance → $81,96781,96781,967
Age 100, $500K balance → $78,12578,12578,125

RMD Joint Life 13/13

Formula (Joint Life and Last Survivor Expectancy)
Eligibility: ownerAge − spouseAge > 10 AND spouse is sole beneficiary (re-evaluated yearly)
RMD = Prior Year-End Balance ÷ JOINT_LIFE_TABLE[ownerAge][spouseAge]
Fallback: if ineligible (gap ≤ 10, flag off, or spouse deceased), use Uniform Lifetime (Table III)
IRC §401(a)(9) • IRS Pub 590-B Appendix B, Table II • Treas. Reg. §1.401(a)(9)-9(d) • IRS Pub 590-B PDF →
Authority: Internal Revenue Service
Documents:
• IRS Publication 590-B, Appendix B, Table II — Joint and Last Survivor Life Expectancy
• Treasury Regulation §1.401(a)(9)-9(d) — post-2022 divisor tables
• IRC §401(a)(9) — RMD rules
Method: 5 anchor divisors from Pub 590-B Table II verified to exact decimal, including the IRS worked example (owner 75 / spouse 64 = 25.3) and the user-reported 24-year-gap scenario (75 / 51 = 35.8). Boundary cases at exactly 10 years and 11 years verified. Eligibility helper tested for sole-beneficiary flag, spouse age null/zero, and spouse older than owner. 3,234 cells total in the engine; owner ages 72–120, spouse ages 20 through (owner − 11).
TestExpectedActualResult
Table II: owner 75 / spouse 64 = 25.3 (IRS worked example)25.325.3
Table II: owner 73 / spouse 62 = 27.2 (11-yr gap boundary)27.227.2
Table II: owner 75 / spouse 51 = 35.8 (24-yr gap)35.835.8
Table II: owner 100 / spouse 89 = 6.8 (oldest at 11-yr gap)6.86.8
Table II: owner 120 / spouse 109 = 2.0 (table minimum)22
calcRMD uses Table II for 75/51 + sole beneficiary flag27,93327,933
Exactly 10-year gap falls back to Uniform Lifetime40,65040,650
Flag off → Uniform Lifetime even at 24-yr gap40,65040,650
Missing Table II cell falls back to Uniform Lifetime40,65040,650
usesJointLifeTable(75, 51, true) → true (24-yr gap + flag)11
usesJointLifeTable(75, 65, true) → false (exactly 10-yr gap)00
usesJointLifeTable(75, 51, false) → false (flag off)00
usesJointLifeTable(75, 80, true) → false (spouse older)00

RMD Start 5/5

Formula
RMD Start Age = 72 (born ≤ 1950) | 73 (born 1951–1959) | 75 (born ≥ 1960)
SECURE Act of 2019 §114 (age 72) • SECURE 2.0 Act of 2022 §107 (ages 73 and 75) • IRS source →
Authority: Internal Revenue Service
Documents:
• IRS Publication 590-B — Distributions from IRAs
• IRS Uniform Lifetime Table (Table III) — updated effective 2022
• SECURE 2.0 Act of 2022, Section 107 — RMD Start Age Changes
Method: All 34 divisors from the Uniform Lifetime Table (ages 72-105) verified to exact decimal. SECURE 2.0 RMD start ages confirmed: 72 (born <=1950), 73 (1951-1959), 75 (1960+).
TestExpectedActualResult
Born 1950 → RMD starts at 727272
Born 1951 → RMD starts at 737373
Born 1959 → RMD starts at 737373
Born 1960 → RMD starts at 757575
Born 1980 → RMD starts at 757575

NIIT 1/1

Formula (Net Investment Income Tax)
NIIT = 3.8% × min(net_investment_income, MAGI − threshold)
Thresholds (not inflation-adjusted): ,000 MFJ / ,000 Single
Investment income includes capital gains, dividends, interest, royalties, rental.
IRC §1411 • IRS Form 8960
Sources: IRC §1411 (NIIT); IRS Form 8960 (computation). Thresholds are fixed by statute (not indexed). Engine applies NIIT on top of ordinary + CG tax when MAGI exceeds threshold.
TestExpectedActualResult
Tax rate = 3.8%11

IRMAA (MFJ) 12/12

Formula
Surcharge = f(MAGI from 2 years prior, filing status) → 6-tier lookup table
Total Part B Premium = $185.00/mo (base) + IRMAA Part B surcharge
Total Part D Premium = Plan premium + IRMAA Part D surcharge
42 U.S.C. §1395r • CMS 2025 IRMAA Tables • CMS Pub. 100-02, Ch. 15 §40 • CMS source →
Authority: Centers for Medicare & Medicaid Services
Documents:
• CMS 2025 Medicare Parts B and D Income-Related Monthly Adjustment Amounts
• CMS Standard Part B Premium: $185.00/month (2025)
Method: All six IRMAA tiers verified for both MFJ and Single filing status. Part B premiums, Part D surcharges, and MAGI thresholds at each tier. Two-year MAGI lookback implemented.
TestExpectedActualResult
Tier 0: below $218K — Part B annual2,4352,435
Tier 0: below $218K — Part D annual00
Tier 1: $218K–$274K — Part B annual3,4093,409
Tier 1: $218K–$274K — Part D annual174174
Tier 2: $274K–$342K — Part B annual4,8704,870
Tier 2: $274K–$342K — Part D annual462462
Tier 3: $342K–$410K — Part B annual6,3316,331
Tier 3: $342K–$410K — Part D annual746746
Tier 4: $410K–$750K — Part B annual7,7927,792
Tier 4: $410K–$750K — Part D annual1,0311,031
Tier 5: above $750K — Part B annual8,2798,279
Tier 5: above $750K — Part D annual1,0921,092

IRMAA (Single) 3/3

Formula
Surcharge = f(MAGI from 2 years prior, filing status) → 6-tier lookup table
Total Part B Premium = $185.00/mo (base) + IRMAA Part B surcharge
Total Part D Premium = Plan premium + IRMAA Part D surcharge
42 U.S.C. §1395r • CMS 2025 IRMAA Tables • CMS Pub. 100-02, Ch. 15 §40 • CMS source →
Authority: Centers for Medicare & Medicaid Services
Documents:
• CMS 2025 Medicare Parts B and D Income-Related Monthly Adjustment Amounts
• CMS Standard Part B Premium: $185.00/month (2025)
Method: All six IRMAA tiers verified for both MFJ and Single filing status. Part B premiums, Part D surcharges, and MAGI thresholds at each tier. Two-year MAGI lookback implemented.
TestExpectedActualResult
Tier 0: below $109K — Part B annual2,4352,435
Tier 1: $109K–$137K — Part B annual3,4093,409
Tier 5: above $500K — Part B annual8,2798,279

IRMAA 1/1

Formula
Surcharge = f(MAGI from 2 years prior, filing status) → 6-tier lookup table
Total Part B Premium = $185.00/mo (base) + IRMAA Part B surcharge
Total Part D Premium = Plan premium + IRMAA Part D surcharge
42 U.S.C. §1395r • CMS 2025 IRMAA Tables • CMS Pub. 100-02, Ch. 15 §40 • CMS source →
Authority: Centers for Medicare & Medicaid Services
Documents:
• CMS 2025 Medicare Parts B and D Income-Related Monthly Adjustment Amounts
• CMS Standard Part B Premium: $185.00/month (2025)
Method: All six IRMAA tiers verified for both MFJ and Single filing status. Part B premiums, Part D surcharges, and MAGI thresholds at each tier. Two-year MAGI lookback implemented.
TestExpectedActualResult
Base Part B premium = $202.90/month ($2,434.80/year)2,4352,435

Year Object 10/10

TestExpectedActualResult
Couple plan: spAge at year 0 = configured spouseAge6262
Couple plan: spAge increments by year offset6767
Couple plan: primaryDead/spouseDead false while both alive11
Single plan: spAge is null11
Spouse-dies plan: spAge numeric while spouse alive (primary 72)6969
Spouse-dies plan: spAge null after spouse death (primary 75)11
Spouse-dies plan: primaryDead stays false post spouse death11
Primary-dies plan: primaryDead true post primary death11
Primary-dies plan: spAge still numeric (survivor age) post primary death7272
Primary-dies plan: spouseDead stays false while spouse alive11

IRMAA Per-Enrollee 3/3

TestExpectedActualResult
Couple both 65+ in MFJ Tier 1 → IRMAA = 2× per-person surcharge2,2962,296
Couple, only primary 65+ → IRMAA = 1× per-person surcharge1,1481,148
Single filer 65+ in single Tier 1 → IRMAA = 1× per-person surcharge1,1481,148

Medicare cash flow 3/3

TestExpectedActualResult
Couple both 65+: y.expenses includes Medicare cost (post-65 > pre-65 expenses)11
Single 65+: y.expenses includes 1× Medicare cost11
Pre-65: medicareCost is 0 (no Medicare in expenses)00

State Tax 50/50

Formula
State Tax = Σ [ min(TI_state, bracket_top) − bracket_bottom ] × rate (same marginal structure as federal)
TI_state = Federal AGI − state-specific exemptions (SS, pension, retirement income) subject to age/income gates
State DOR publications (50 states + DC) • IRC §86 state conformity rules • State-specific retirement income exclusions
Sources: State DOR publications — progressive brackets, SS exemptions with age/income gates, retirement income exclusions. IRC §86 state conformity.
TestExpectedActualResult
Florida — no income tax00
Texas — no income tax00
California — progressive brackets on $100K3,2463,246
New York — progressive brackets on $100K (2026 rates)5,0685,068
Maryland — progressive brackets on $100K4,6984,698
Illinois — flat 4.95% on $100K4,9504,950
Pennsylvania — flat 3.07% on $100K3,0703,070
Nevada — no income tax00
Washington — no income tax00
No state selected — zero tax00
FL: SS+IRA income, no tax00
TX: $200K income, no tax00
WA: any income, no tax00
NH: IRA distribution, no tax00
none: federal only, no state tax00
IL: SS+IRA both fully exempt00
IL: earned income taxable (4.95%)4,9504,950
IL: mixed — wages taxable, IRA exempt2,4752,475
PA: IRA exempt age 60+00
PA: IRA taxable age 58 (3.07%)1,5351,535
PA: SS always exempt (all ages)00
CA: MFJ $80K — progressive brackets2,0462,046
CA: SS exempt, IRA taxable804804
CA: single filer pays more than MFJ same income11
NY: MFJ $100K with $20K pension exclusion3,9883,988
NY: SS exempt from state tax11
KS: SS exempt under $75K AGI11
KS: SS taxable above $75K AGI11
CT: SS exempt under $150K MFJ AGI11
RI: SS exempt under $114,900 AGI11
Invalid state code returns $000
Zero income returns $000
PA age gate: $40K IRA age 58 taxable1,2281,228
PA age gate: $40K IRA age 60 exempt00
NC: flat 3.99% on $100K3,9903,990
IN: flat 2.95% on $100K2,9502,950
KY: flat 3.5% on $100K3,5003,500
MS: flat 4.0% on $100K4,0004,000
ID: flat 5.3% on $100K5,3005,300
GA: flat 5.19% on $100K5,1905,190
CO: flat 4.4% on $100K4,4004,400
UT: flat 4.5% on $100K4,5004,500
OH: $100K MFJ — 2.75% above $26,0502,0342,034
OH: $20K income — below $26,050 threshold, $0 tax00
MT: $60K MFJ — all at 4.7% (below $95K threshold)2,8202,820
MT: $120K MFJ — split bracket5,8785,878
MT: single $60K pays more than MFJ $60K (lower threshold)11
NE: $100K MFJ — three brackets (top rate 4.55%)4,2844,284
OK: $20K MFJ — four-bracket structure (HB2764)471471
SC: $100K MFJ — 2026 brackets (top rate 6.0%)5,3445,344

Contrib Limits 5/5

Formula (2025 contribution limits)
401(k)/403(b)/457(b) employee deferral: ,500 + ,500 catch-up (50+) + ,250 super catch-up (60-63)
IRA (Traditional/Roth): ,000 + ,000 catch-up (50+)
HSA: ,300 self / ,550 family + ,000 catch-up (55+)
IRC §402(g), §414(v), §219, §223 • SECURE 2.0 §109 (super catch-up) • IRS Notice 2024-80
Sources: IRC §402(g) (401(k)); §414(v) (age 50 catch-up); SECURE 2.0 §109 (ages 60-63 enhanced catch-up); §219 (IRA); §223 (HSA); IRS Notice 2024-80 (2025 limits). Engine enforces per-account limits during the contribution phase.
TestExpectedActualResult
401(k) elective deferral: $24,50024,50024,500
IRA contribution limit: $7,5007,5007,500
401(k) catch-up (50–59, 64+): $8,0008,0008,000
SECURE 2.0 enhanced catch-up (60–63): $11,25011,25011,250
IRA catch-up (50+): $1,0001,0001,000

QCD 1/1

Formula (Qualified Charitable Distribution)
QCD = direct transfer from IRA to qualified charity, up to ,000/year (2025)
Counts toward RMD; excluded from AGI/MAGI (vs. itemized charitable deduction which reduces taxable income but keeps MAGI intact).
Eligible at age 70½; inflation-adjusted starting 2024.
IRC §408(d)(8) • SECURE 2.0 Act §307 (indexing) • IRS Rev. Proc. 2024-40
Sources: IRC §408(d)(8) (QCD exclusion); SECURE 2.0 Act §307 (indexed starting 2024); IRS Rev. Proc. 2024-40 (2025 limit K). Engine: QCD reduces RMD-driven taxable withdrawals and MAGI in the same year.
TestExpectedActualResult
Annual limit: $110,000 (2026)110,000110,000

Integration 26/26

TestExpectedActualResult
Projection covers 46 years (age 50–95)4646
Net worth stays positive (no bust)11
Pre-retirement savings accumulate11
RMDs start at age 75 (born 1976)7575
Tax computed for retirement year11
SS benefits start at claim age 676767
Account balances sum to net worth395,753395,753
Higher income → higher lifetime tax11
Roth conversion increases tax in conversion year11
Roth-first order depletes Roth faster11
California adds state tax vs no-state11
primaryEarned field present in year output11
spouseEarned field present in year output11
primaryEarned + spouseEarned === earned (invariant)180,000180,000
FICA field present in pre-retirement year11
Pre-retirement FICA ≈ 7.65% of gross wages (below SS cap)9,1809,180
Retirement-year FICA = 0 (no wages)00
Non-working spouse: total SS = primary own + spousal floor ($54K)54,00054,000
Low-earning spouse ($700/mo own): total SS top-up to floor ($43,200/yr)43,20043,200
High-earning spouse ($1,200/mo own > floor): no spousal top-up, total $38,40038,40038,400
Spousal benefit = $0 before primary files (primary age 67, files at 70)00
Spousal benefit activates when primary files at 7060,24060,240
spousalTopUp field exists in projection year output11
spousalTopUp value is correct ($18,000 for non-working spouse)18,00018,000
No spousal benefit when spouse not enabled24,00024,000
Spousal benefit stable year-over-year with zero COLA11

Edge Case 6/6

TestExpectedActualResult
RMD on $0 balance = $000
RMD at age 110 (beyond table) uses fallback11
SS estimate with $0 income → $0 benefit00
calcTax on negative income → $011
IRMAA at exact $218K MFJ threshold → Tier 111
State tax with invalid code → $000

SS Earnings Test 13/13

Formula (retirement earnings test)
Before FRA year: $1 withheld per $2 earned above annual limit ($23,400 in 2025)
Year of FRA (months before): $1 withheld per $3 earned above higher limit ($62,160 in 2025)
Starting FRA month: no withholding regardless of earnings.
42 U.S.C. §403 • SSA POMS RS 02501.021 • SSA 2025 exempt amounts
Sources: 42 U.S.C. §403 (earnings test); SSA POMS RS 02501.021 (application); SSA 2025 exempt amounts ($23,400 / $62,160). Engine: earnings test logic in src/engine/08-ss-engine.js applies withholding during pre-FRA claiming years.
TestExpectedActualResult
Under FRA: $20K earnings (below $23,400 limit) → $000
Under FRA: $50K earnings → $13,300 withheld13,30013,300
Under FRA: $100K earnings, $16,800 benefit → capped at $16,80016,80016,800
At FRA (age 67, born 1960+): $200K earnings → $000
After FRA (age 70): $200K earnings → $000
Zero earnings → $000
FRA year (66.5): $70K earnings → $2,6132,6132,613
SSDI: exempt from earnings test00
Zero SS benefit → $000
Earnings at exact $23,400 limit → $000
Inflation indexing: 2030 under-FRA limit11,83211,832
Integration: age 62 (working + SS) has withholding11
Integration: age 67 (FRA, retired) no withholding00

ACA FPL 5/5

Formula
FPL(size) = $15,650 + $5,500 × (size − 1) for household size ≥ 2
FPL% = MAGI ÷ FPL(household size) × 100
42 U.S.C. §9902(2) • HHS 2025 Poverty Guidelines (48 contiguous states + DC) • HHS source →
Authority: U.S. Department of Health and Human Services
Documents:
• HHS 2025 Federal Poverty Level Guidelines — 48 contiguous states + DC
Method: Base FPL for household sizes 1–4 verified against published guidelines ($15,650 / $21,150 / $26,650 / $32,150). Size 5+ uses incremental $5,500 per additional person. Annual 2% FPL inflation applied for projection years.
TestExpectedActualResult
Household of 1 base FPL = $15,96015,96015,960
Household of 2 base FPL = $21,64021,64021,640
Household of 3 base FPL = $27,32027,32027,320
Household of 4 base FPL = $33,00033,00033,000
Household of 5 base FPL = $38,68038,68038,680

ACA Subsidy 11/11

Formula
Max Contribution = MAGI × Applicable Percentage (AP)
PTC = max(0, Benchmark Premium − Max Contribution)
AP = f(FPL%) via 6-tier table; interpolated within tiers. No cliff through 2025 (ARPA/IRA enhanced rules)
IRC §36B • 26 CFR §1.36B-3 • IRS Rev. Proc. 2024-35 (enhanced 2025) • IRS Rev. Proc. 2025-25 (original 2026+) • IRS source →
Authority: Internal Revenue Service
Documents:
• IRS Rev. Proc. 2024-35 — Enhanced Applicable Percentage Table (2021–2025)
• IRS Rev. Proc. 2025-25 — Original ACA Applicable Percentages (2026+)
• ARPA/IRA — Enhanced PTC removes 400% FPL cliff through 2025
• ACA Section 36B — Premium Tax Credit eligibility (100–400% FPL under original rules)
Method: Applicable percentage verified at each FPL tier boundary under both enhanced (2025) and original (2026+) rules. Linear interpolation within tiers confirmed. Subsidy = benchmark premium minus expected contribution (MAGI × applicable %). Cliff behavior at 400% FPL tested for both rule sets.
TestExpectedActualResult
150% FPL enhanced (2025) → 0% contribution, full subsidy00
200% FPL enhanced (2025) → 2% applicable22
300% FPL enhanced (2025) → 6% applicable66
400% FPL enhanced (2025) → 8.5% applicable8.58.5
500% FPL enhanced (2025) → still eligible (no cliff)11
Below 100% FPL → not eligible for subsidy00
400%+ FPL original (2026) → no subsidy (cliff)00
300% FPL original (2026) → 9.83% applicable9.839.83
130% FPL original (2026) → 2% applicable22
Full subsidy at 150% FPL enhanced = benchmark premium20,00020,000
175% FPL enhanced → 1.0% applicable (interpolation)11

ACA SLCSP 2/2

Formula (Estimator)
SLCSP ≈ $7,500 (age-40 base) × 1.04^(age − 40) × 1.05^(years from 2025)
Couple ≈ 1.9× single. Users can override with actual local marketplace quotes.
CMS Marketplace benchmark premium data • Planning estimate only — actual premiums vary by state and plan • CMS source →
Authority: RetIQ Estimator (national average)
Documents:
• CMS Marketplace average benchmark premium data
Method: Second Lowest Cost Silver Plan (SLCSP) estimated from national average ($7,500 base at age 40) with 4% per year age adjustment and 5% annual medical inflation. Couple rate ~1.9× single. Values are planning estimates; users can override with actual local quotes.
TestExpectedActualResult
Age 55 single base → ~$9,0009,0009,000
Age 60 couple > age 55 single11

Pension 15/15

Formula
Annual Pension = Base × (1 + COLA)^years_since_start × taxable_pct (for tax purposes)
Survivor Benefit = Pension × survivor_fraction (50% / 75% / 100%) after primary death
IRC §72 (annuity taxation) • Pension COLA and survivor election terms set by plan document — no single federal statute
Authority: RetIQ Engine v2.0
Features:
• Per-pension COLA (independent rate per pension)
• Survivor benefits: single life, joint & 50/75/100%
• Taxable percentage (military disability, after-tax contributions)
Method: Verify pension income starts at correct age, COLA compounds correctly, survivor benefits pay the correct fraction after primary death, taxable percentage reduces tax liability appropriately. Mortality scenarios test single-life (pension stops) vs joint-and-survivor (pension continues at reduced rate).
TestExpectedActualResult
Pension starts at age 65 with $24,000/yr24,00024,000
Pension COLA: $24K at 2% after 5yr ≈ $26,49726,49726,498
Taxable 100%: pensionTaxable = pension24,00024,000
Taxable 60%: pensionTaxable ≈ 60% of pension14,40014,400
Taxable 0%: pensionTaxable = 0 (fully exempt)00
Single-life: pension = 0 after pensioner dies00
Joint & 50%: survivor gets 50% of pension12,00012,000
Joint & 75%: survivor gets 75% of pension18,00018,000
Joint & 100%: survivor gets 100% of pension24,00024,000
J&50% + 60% taxable: survivor taxable = 50%*60%*24000 = 72007,2007,200
Migration shim: legacy pension scalar produces correct income18,00018,000
Two primary pensions sum: 12000 + 18000 = 3000030,00030,000
Staggered start ages: only first pension active at age 6612,00012,000
Staggered start ages: both active at age 6730,00030,000
Mixed-owner two pensions: primary 12000 + spouse 8000 = 2000020,00020,000

Pension Partial Year 11/11

TestExpectedActualResult
Integer startAge=65, cola=0 → full $24K at age 65 (regression)24,00024,000
Integer startAge=65, cola=0 → full $24K at age 70 (regression)24,00024,000
startAge=65.5 → 50% prorated ($12K) at age 6512,00012,000
startAge=65.5 → full $24K at age 6624,00024,000
startAge=65.25 → 75% prorated ($18K) at age 6518,00018,000
startAge=65.75 → 25% prorated ($6K) at age 656,0006,000
startAge=65.5 → $0 at age 64 (before activation)00
Lifetime total: fractional pension = integer total - half-year12,00012,000
Spouse startAge=65.5 → 50% prorated ($6K) at spouse age 656,0006,000
COLA compounds with fractional penYrs (age 70, startAge 65.5, 2% COLA)26,23726,237
taxablePercent applies post-proration (60% of $12K = $7,200)7,2007,200

Additional Income 21/21

TestExpectedActualResult
Other income shows in projection at age 6530,00030,000
$30K additional income increases lifetime tax11
Tax increase is meaningful (>$10K lifetime)11
Default window: other income at retirement age30,00030,000
Default window: other income at end age30,00030,000
Late start (70): no other income at 6500
Late start (70): no other income at 6900
Late start (70): other income begins at 7030,00030,000
Early end (72): other income at 7230,00030,000
Early end (72): no other income at 7300
Pre-retirement start (60): other income while working30,00030,000
Window end (75): last year of other income30,00030,000
After window (76): no other income00
$100K additional income raises IRMAA surcharges11
FillBracket: $50K other income reduces Roth conversion amount11
FillBracket: conversion reduced by ~$50K with other income10
SmartFill: $50K other income reduces Roth conversion11
TargetMAGI: $50K other income reduces Roth conversion11
Stuck state: empty incomeStreams + legacy additionalIncome → other = 000
Legacy plan: incomeStreams undefined + additionalIncome → other = 50005,0005,000
Populated incomeStreams: additionalIncome ignored, other = stream amount12,00012,000

Life Insurance 12/12

Formula
Death Benefit: excluded from gross income; deposited to brokerage at death_age
Term: benefit paid only if death_age < expires_age. Permanent: benefit paid at any death_age.
Premiums: deducted from cash flow while policy is active; stop at death or term expiry.
IRC §101(a) (death benefit exclusion from gross income) • IRC §101 →
Sources: IRC §101 (death benefit exclusion from gross income); engine logic: premium collection, term expiry, death benefit payout to taxable account
TestExpectedActualResult
Term premiums active before expiry (age 74)2,4002,400
Term premiums stop at expiresAge (age 75)00
Term: no benefit if insured outlives term (death 80, expires 75)00
Term: benefit pays when death before expiry (death 72, expires 75)500,000500,000
Permanent: premiums active before death (age 84)5,0005,000
Permanent: premiums stop at death (age 85)00
Permanent: benefit pays at death age 85500,000500,000
Death benefit does NOT inflate MAGI by benefit amount (IRC §101)11
Death benefit increases brokerage balance11
No benefit when no death age configured00
Multiple policies: both pay out at death750,000750,000
Spouse policy: benefit triggers at spouse death300,000300,000

REGS 13/13

Schema validation
REGS = { version, federal, ss, irmaa, aca, retirement_accounts }
federal.brackets_mfj.length === 7, federal.brackets_single.length === 7
irmaa.brackets_mfj.length === 6, aca.pct_enhanced.length === 6
Engine regulatory constants structure (v4.0 schema)
Sources: Engine regulatory constants structure (src/engine/07-regulatory.js). Validates that the aliases (TAX_BRACKETS_MFJ, IRMAA_BRACKETS_MFJ, ACA_PCT_ENHANCED) reference the same underlying REGS objects, preventing silent schema drift after KV updates.
TestExpectedActualResult
REGS object exists11
REGS.version is 202511
REGS has 5 data sections55
federal.brackets_mfj has 7 brackets77
federal.brackets_single has 7 brackets77
irmaa.brackets_mfj has 6 tiers66
aca.pct_enhanced has 6 tiers66
TAX_BRACKETS_MFJ === REGS.federal.brackets_mfj11
IRMAA_BRACKETS_MFJ === REGS.irmaa.brackets_mfj11
ACA_PCT_ENHANCED === REGS.aca.pct_enhanced11
SS_WAGE_BASE matches REGS184,500184,500
CONTRIB_401K matches REGS24,50024,500
STD_DEDUCTION matches REGS32,20032,200

HSA 15/15

Formula
Contribution limit (2025): $4,300 self / $8,550 family + $1,000 catch-up (55+)
Qualified medical withdrawals: tax-free. Non-medical withdrawals after 65: ordinary income (no penalty).
Contributions: above-the-line deduction, reduce AGI. Growth: tax-free.
IRC §223 • IRS Rev. Proc. 2024-25 • IRS Pub 969
Sources: IRC §223 (HSA rules); IRS Rev. Proc. 2024-25 (2025 limits $4,300/$8,550); IRS Pub 969 (HSA treatment, medical withdrawal fraction, age 65 rule). Engine: src/engine/09-engine.js HSA contribution/growth/withdrawal logic.
TestExpectedActualResult
HSA contribution reduces federal taxable income11
HSA contribution does NOT reduce CA state income6,6976,697
HSA contribution DOES reduce OR state income11
HSA balance grows at configured rate tax-free53,00053,000
HSA medical withdrawal at age 60: tax-free00
HSA non-medical withdrawal at age 60: taxed + 20% penalty11
HSA withdrawal at age 67 (100% medical): tax-free00
HSA medical withdrawal at 67: zero MAGI impact00
HSA withdrawal at age 67 (50% medical): 50% taxed16,21816,218
HSA: no RMD generated at any age00
Contribution limits enforced: self, age 56 = $5,400 max5,4005,400
Contribution limits enforced: family, age 58 = $9,750 max9,7509,750
Contributions stop at hsaContributionStopAge11
ACA MAGI reduced by HSA contribution11
Net worth includes HSA balance195,000195,000

Inherited IRA 16/16

Formula (post-2019 SECURE 10-year rule)
Forced annual distribution = remaining_balance ÷ years_remaining_in_window
10-year clock starts year of original owner's death; balance must reach zero by year 10.
Excluded from Roth conversion and Tax-Aware Drawdown. Traditional: ordinary income. Roth: tax-free.
SECURE Act 2019 • SECURE 2.0 Act §401 • IRS Pub 590-B
Sources: SECURE Act 2019 — 10-year distribution requirement for non-spouse beneficiaries; IRS Pub 590-B (distribution rules); SECURE 2.0 §401 (final regulations 2024). Engine: pooled post-2019 distribution logic in src/engine/09-engine.js.
TestExpectedActualResult
$0 balance returns null (truthy check)11
$1M at 0% return, 22% bracket → net ~$780K780,000780,000
Balance fully depleted after 10 years00
Year 1 dist at 0% return = balance/10100,000100,000
Higher bracket (24%) yields less net than 22%11
7% growth: total distributed > initial balance11
Post-2019: $100K, 10 yrs left → $10,00010,00010,000
Post-2019: $100K, 1 yr left → full balance100,000100,000
Post-2019: $0 balance → $000
Post-2019: $250K, 5 yrs left → $50,00050,00050,000
Pre-2020 stretch: age 50 yr 1, $1M → $27,62427,624.30927,624
Pre-2020 stretch: age 50 yr 5 (divisor 32.2), $1M → $31,05631,055.90131,056
Pre-2020 stretch: age 65 yr 1, $500K → $21,83421,834.06121,834
Pre-2020 stretch: divisor floor at 1.0 (divisor would go negative)500,000500,000
Distribution never exceeds balance1,0001,000
Unknown regime returns 000

Inherited Acct 13/13

Formula (inherited account integration with plan)
Forced distributions flow through ordinary income → SS taxation, MAGI, IRMAA, NIIT calculations
Balance continues to grow at nominal return between distributions.
Explicitly excluded from Roth conversion math (not eligible for conversion under SECURE).
SECURE Act • IRC §86 (SS taxation) • 42 U.S.C. §1395r (IRMAA)
Sources: SECURE Act (10-year rule); IRC §86 (SS taxation interaction); 42 U.S.C. §1395r (IRMAA MAGI). Engine: inherited distributions integrated with tax and MAGI pipelines in src/engine/09-engine.js.
TestExpectedActualResult
Year 0: regular pretax balance = 500K (untouched)500,000500,000
Year 0: inherited pretax = 450K after first distribution450,000450,000
Year 0: inherited distribution = 50K50,00050,000
Year 9 (age 69): inherited balance = 0 (fully distributed)00
Year 10 (age 70): inherited dist = 0 (nothing left)00
Net worth = sum of all buckets including inherited1,266,1801,266,180
Inherited pretax distributions increase lifetime taxes11
Inherited distributions preserve pretax (less drawdown needed)11
Roth conversion pulls from pretax only (not inherited)460,000460,000
Inherited balance unchanged by Roth conversion (still 450K)450,000450,000
No standard RMD when only inherited pretax exists00
Inherited Roth has lower lifetime tax than inherited traditional11
Inherited Roth depleted by year 900

Inherited Stretch 8/8

Formula (pre-2020 grandfathered stretch + EDB exceptions)
RMD = balance ÷ Single Life Expectancy divisor (IRS Pub 590-B Table I)
Subtract-1 method: divisoryear_n = initial_divisor − (n − 1)
Four regimes: pre-2020 stretch, EDB-disabled, EDB-chronically-ill, EDB-not-more-than-10-yr-younger
SECURE Act §401(a)(9)(H)(ii) (EDB exceptions) • IRC §72(m)(7) • IRC §7702B(c)(2) • IRS Pub 590-B Table I
Sources: SECURE Act §401(a)(9)(H)(ii) (Eligible Designated Beneficiary exceptions to 10-year rule); IRC §72(m)(7) (disabled); IRC §7702B(c)(2) (chronically ill); IRS Pub 590-B Table I (Single Life Expectancy divisors). Engine: per-account stretch IRA logic in src/engine/09-engine.js.
TestExpectedActualResult
Yr 1: age 55, $500K → ~$15,82315,82315,823
Stretch balance adds to netWorth yr 111
Inherited Roth stretch: tax-free distributions never raise tax11
Traditional stretch yr 1 inheritedDist recorded12,65812,658
No regime field: v5.4 pooled behavior preserved9,0919,091
Mixed stretch + post-2019: both distribute29,25229,252
Stretch balance decreases year-over-year at 0% return11
EDB Disabled: yr 1 uses stretch math (100K / 31.6 age 55)3,1653,165

CG Harvesting 4/4

Formula (0% capital gains harvesting)
If ordinary_income + projected_gains ≤ 0% CG threshold (2025: $96,700 MFJ / $48,350 single):
  harvest = min(remaining_room, unrealized_gains)
Basis steps up by harvested amount. IRMAA-aware: capped at next Medicare surcharge threshold.
IRC §1(h) (CG brackets) • IRS Rev. Proc. 2024-40 (2025 thresholds)
Sources: IRC §1(h) (preferential capital gains brackets); IRS Rev. Proc. 2024-40 (2025 0% CG threshold). Engine: CG harvesting logic in src/engine/09-engine.js, IRMAA-aware via same logic as Roth Smart Fill.
TestExpectedActualResult
Disabled: zero harvested11
Enabled with basis: harvests in low-income year11
No unrealized gains: zero harvested10
Harvested amount ≤ unrealized gains11

TLH 4/4

Formula (tax-loss harvesting)
Realized losses first offset realized capital gains dollar-for-dollar.
Excess losses offset up to $3,000/year of ordinary income (IRC §1211(b)).
Remaining unused losses carry forward indefinitely (IRC §1212(b)).
IRC §1211 • IRC §1212 • IRS Schedule D
Sources: IRC §1211 (loss limitation); IRC §1212(b) (capital loss carryover); IRS Schedule D (Form 1040). Engine: TLH offset and carry-forward in src/engine/09-engine.js.
TestExpectedActualResult
Disabled: zero offset11
$5K losses: offset applied11
$3K ordinary offset when minimal CG10
Carry-forward accumulates across years11

Itemized Deductions 4/4

Formula (itemized vs standard)
Itemized total = SALT (OBBB cap: $40K 2025-2029 phasing down above $500K MAGI, $10K from 2030) + medical above 7.5% AGI + non-QCD charity (≤60% AGI)
Engine uses max(standard + senior + OBBB, itemized) each year.
Senior additions and OBBB senior deduction apply to the standard deduction only.
IRC §63 • IRC §164(b)(6) as amended by OBBB Act P.L. 119-21 • IRC §213 (medical) • IRC §170 (charity) • OBBB Act §102
Sources: IRC §63 (standard vs itemized); IRC §164(b)(6) as amended by OBBB Act P.L. 119-21 (2025); IRC §213 (medical, 7.5% AGI floor); IRC §170 (charitable, 60% AGI cap). Engine: deduction comparison logic in src/engine/09-engine.js.
TestExpectedActualResult
Disabled: uses standard deduction11
SALT $10K + charity $25K beats standard for single filer10
Low SALT, no charity: standard wins for MFJ senior11
Medical 7.5% AGI floor applied correctly11

SALT Cap (OBBB) 6/6

Formula (OBBB SALT cap, year-aware)
2025 base cap = $40,000 (MFJ/Single). Grows 1% per year 2026-2029.
Phase-down: cap reduced by 30% of MAGI excess above $500,000 threshold (also grows 1%/yr).
Floor: cap cannot drop below $10,000 in any year. Reverts to $10,000 flat in 2030+.
OBBB Act P.L. 119-21 (2025) amending IRC §164(b)(6)
Sources: One Big Beautiful Bill Act, P.L. 119-21, enacted July 4, 2025, amending IRC §164(b)(6). Effective 2025-2029 with annual growth, phase-down above $500K MAGI, floor $10K; reverts to TCJA $10K baseline in 2030. Engine: saltCapFor(year, magi) helper in src/engine/07-regulatory.js, called from three sites in src/engine/09-engine.js (main itemized flow, Smart Fill bracket-room calc, and Tax-Aware Drawdown scenario).
TestExpectedActualResult
2025 base cap $40,000 MFJ/Single40,00040,000
2026 cap with 1% growth: $40,40040,40040,400
2030 reversion to $10,000 TCJA baseline10,00010,000
2025 phase-down at MAGI $550K: cap $25,00025,00025,000
2025 phase-down floor at MAGI $700K: cap $10,00010,00010,000
2026 phase-down threshold also grows: MAGI $505K → full cap40,40040,400

DAF Bunching 4/4

Formula (charitable bunching)
Bunch N years of charitable giving into one year (typically 2–3).
In bunch year: itemized deduction dominates standard; claim full bunched amount.
In off years: standard deduction applies; charitable = 0. Total giving unchanged.
IRC §170 (charitable contributions) • DAF regulations (IRS Notice 2006-109)
Sources: IRC §170 (charitable contribution deduction); IRS Notice 2006-109 (DAF rules); IRC §63 (standard vs itemized comparison). Engine: bunching logic in src/engine/09-engine.js routes charitable giving by year.
TestExpectedActualResult
Disabled: charity same every year11
Every-2yr: bunch year has 2x charity11
Every-2yr: off year has zero charity11
Lifetime charity total unchanged vs no bunching11

QLAC 6/6

Formula (Qualified Longevity Annuity Contract)
Purchase from pre-tax account; excluded from RMD base until payments begin.
Max purchase (2026): $210,000 (SECURE 2.0 §202; IRS Notice 2025-67).
Payments begin by age 85; taxed as ordinary income when received.
SECURE 2.0 Act §202 • Treas. Reg. §1.401(a)(9)-6
Sources: SECURE 2.0 Act §202 ($200K cap effective 2024, inflation-adjusted to $210K for 2026 per IRS Notice 2025-67); Treas. Reg. §1.401(a)(9)-6 (QLAC exclusion from RMD base). Engine: QLAC purchase and payment logic in src/engine/09-engine.js.
TestExpectedActualResult
Disabled: no QLAC payout or balance11
Purchase reduces pre-tax balance at purchase age11
RMD lower with QLAC than without11
Payout starts at payoutStartAge as ordinary income11
2026 QLAC limit: $210,000210,000210,000
Engine caps purchase at QLAC_LIMIT when user requests more210,000210,000

Roth Conversion Gate 12/12

Formula
preTax = preTaxConvertible + Σ(preTaxGatedTranches[].balance)
Conversion cap = preTaxConvertible   // never the full preTax pool
At year start: for each tranche, if age ≥ unlockAge then convertible ←← tranche (and tranche removed)
Unlock age (primary frame): primaryRetires→retirementAge; spouseRetires→spouseRetirementAge + (currentAge - spouseAge); specificAge→conversionGateAge
Engine: src/engine/09-engine.js (v5.7). Per-account field: account.conversionGate. Spouse-gated coerces to always when spouseEnabled is false.
Sources: Engine logic in src/engine/09-engine.js — split-pool model ensures employer plans without in-service in-plan Roth rollover (IRR) are excluded from conversions until the account's gate opens. RMDs, QCDs, QLAC, and regular withdrawals continue to act on the full pre-tax pool (reducing gated tranches proportionally) — the gate restricts conversions only. Backward compatible: absent conversionGate defaults to 'always'.
TestExpectedActualResult
Before primary retires: conversion caps at IRA (convertible) balance only50,00050,000
After convertible pool drained, conversions stop even with gated balance remaining00
At primaryRetires age, gated 401k unlocks and permits conversion again11
Without gate, conversions continue at age 62 from full pretax pool100,000100,000
Absent conversionGate field = always convertible (backward compat)100,000100,000
Spouse-gated account: still locked when spouse < spouseRetirementAge00
Spouse-gated account: unlocks when spouse reaches spouseRetirementAge11
spouseRetires gate with spouseEnabled=false coerces to always-convertible50,00050,000
specificAge gate: still locked before the specified age00
specificAge gate: unlocks at the specified primary age11
Account identity holds with gated tranches in pool00
RMDs draw proportionally from full pool including gated tranches11

Dual-Owner RMD 9/9

TestExpectedActualResult
Spouse RMD fires at spAge 73 (projection yr 4)11
Primary RMD = 0 at primary age 69 (below RMD start)00
Total rmd = rmdSpouse when only spouse at RMD age22,48722,487
Spouse RMD amount ≈ balance ÷ 26.5 at age 7322,48722,487
Primary RMD fires at primary age 75 (projection yr 10)11
Spouse RMD still firing at spAge 79 (yr 10)11
Total rmd = rmdPrimary + rmdSpouse when both at RMD age61,81461,814
Invariant: preTax = preTaxPrimary + preTaxSpouse every year11
Opt-out: no owner:spouse account → preTaxSpouse stays 011

Dual-Owner Growth 2/2

TestExpectedActualResult
Primary bucket grows at 5% (per-owner rate)638,141638,141
Spouse bucket grows at 7% (per-owner rate)701,276701,276

Dual-Owner Rollover 2/2

TestExpectedActualResult
Primary death → spouse absorbs pool (preTaxPrimary = 0)00
Spouse death → primary absorbs pool (preTaxSpouse = 0)00

Debt Amortization 11/11

TestExpectedActualResult
Year 1 interest: $200K @ 6% / $1,199.10/mo11,93311,933
Year 1 principal: $200K @ 6% / $1,199.10/mo2,4562,456
Year 1 ending balance: $200K @ 6% / $1,199.10/mo197,544197,544
Year 1 total paid: 12 × $1,199.10/mo14,38914,389
$200K @ 6% / $1,199.10/mo pays off in 30 years3031
Zero-rate loan: $12K @ 0% / $1,000/mo — no interest00
Zero-rate loan: $12K @ 0% / $1,000/mo — paid off in year 111
Zero balance: no payment, no interest00
Payment < monthly interest: balance unchanged200,000200,000
Engine integration: year-1 interest matches helper11,93311,933
Engine integration: year-1 payments matches helper14,38914,389

Relocation Scenario 7/7

TestExpectedActualResult
No relocation params: CA tax non-zero pre-retirement (age 60)11
Move at 70: pre-move year (age 65) uses original state11
Move at 70: post-move year (age 75) uses target state00
Move at 70: cutover year (age 70 itself) uses target state00
Move at currentAge: target state for entire projection00
Move beyond endAge: original state for entire projection11
Pre-retirement move at 55: working year (age 60) uses target state00

Roth Multi-Phase 6/6

TestExpectedActualResult
Empty phases array: identical to absent phases (regression)9,4199,419
Single phase = single-target (full-window 12% phase)00
Two-phase: 24% phase produces larger conv than 12% phase11
Gap year (age 68): zero conversion00
Phase boundary: endAge is inclusive (age 67 is in phase 1)11
Outer rc.startAge gates phases: age 60 outside outer window → 000

Account Canon 13/13

TestExpectedActualResult
Legacy type:cash → type:taxable11
Legacy type:cash → subtype:cash11
Legacy type:cash preserves balance65,00065,000
Legacy type:cash preserves returnRate4.54.5
Canonical taxable (no subtype) unchanged11
Type pretax passes through unchanged11
Type roth passes through unchanged11
Type hsa passes through unchanged11
Type inherited-pretax passes through unchanged11
Type inherited-roth passes through unchanged11
canonicalizeAccount is idempotent11
Legacy type:cash without returnRate → default 444
Legacy cash account → engine cash bucket > 0 in year 011

Optimizer Blend 8/8

TestExpectedActualResult
Pre-tax overridden to nominalReturn77
Roth overridden to nominalReturn77
Taxable-investment overridden77
Cash subtype keeps its rate4.54.5
HSA overridden to nominalReturn77
Input array not mutated55
blendedAccountsForOptimizer is idempotent77
Integration: real Roth 10% > blended Roth 7% by year 3011

Divergence 8/8

TestExpectedActualResult
pre-tax 5% vs Roth 9% → shouldWarn:true11
pre-tax 5% vs Roth 9% → divergence == 444
pre-tax 6% vs Roth 7.5% (1.5pp) → shouldWarn:false00
Exactly 2.0pp → shouldWarn:true11
Roth < $10K → shouldWarn:false00
No Roth → shouldWarn:false00
Multi-account pre-tax: weighted avg 5.4%5.45.4
Multi-account divergence 2.6pp → shouldWarn:true11

Tax Payment v6.8 11/11

TestExpectedActualResult
Single retiree FL: tax > 0 in year 111
Single retiree FL: withdrawal exceeds raw expense gap11
Couple MFJ GA: state tax > 0 with $50K taxable pension11
Couple MFJ GA: withdrawal covers fed+state tax bill11
Stable-income retiree: iteration converges from year 1+ (warm-start)11
Year record exposes taxConvergenceFlag as boolean11
NIIT triggers for high-MAGI single via iteration11
SS taxation propagates through iteration (couple MFJ)11
wdOrder honored: roth untouched when earlier sources suffice11
Pre-retirement: taxConvergenceFlag stays false (no iteration)11
Pre-retirement: withdrawal stays 0 (no fillGap path)11

Roth 5-year 7/7

TestExpectedActualResult
Age 58 (yr 3 post-conv): $5K Roth wd → ~$500 penalty (iter cascade adds slight overshoot)530556
Age 60: Roth wd → no penalty (age >59.5 exemption)00
Age 61: Roth wd → no penalty (age + 5-yr both clear)00
Two conversions, $15K wd at age 54 → penalty oldest-first ≈ $1500-$17001,6001,611
Age 56 ($5K wd, 1yr post-conv) → ~$500 penalty530500
Age 60 ($10K wd, 5yr post-conv but >59.5) → no penalty00
No conversions, age 55 Roth wd → no penalty (empty tranches)00

Inherited Roth Backload 7/7

TestExpectedActualResult
Default even-spread: year 2026 has non-zero inherited Roth dist11
Back-load: zero distribution in 2026 (year 4 of 10)11
Back-load: zero distribution in 2032 (year 9 of 10)11
Back-load: full balance distributed in deadline year 203311
Back-load total distributions > even-spread total (extra compounding)11
Back-load: inherited Roth balance = 0 after year 1011
Back-load: lifetime federal tax not increased by inherited Roth timing11

Brokerage Dividend Yield 9/9

TestExpectedActualResult
4% × $1M brokerage = $40K dividend income (year 0)40,00040,000
$40K brokerage QD reflected in MAGI11
Ordinary dividend yield produces higher fed tax than qualified11
Account without dividendYield: zero dividend income00
Multi-account: dividends sum correctly40,00040,000
Mixed qualified + ordinary: brokerageDividendIncome sums both40,00040,000
Untouched brokerage: dividend income grows with balance over 10 years11
Drained brokerage: dividend income shrinks as balance is withdrawn11
No brokerage accounts: zero div income, no NaN11

QD Pipeline Regression 4/4

TestExpectedActualResult
$50K QD stream raises lifetime fed tax11
$50K QD stream reflected in MAGI11
High-MAGI single filer: NIIT > 0 on QD11
$30K QD alone < $48,350 single 0% LTCG threshold → $0 fed tax00

Monte Carlo Envelopes 6/6

TestExpectedActualResult
p10/median/p90 returned and equal-length11
p10 <= median <= p90 at EVERY age (the fan-chart property)11
Envelope entry has age/year/retired/netWorth fields11
Final-year p10 < final-year p90 (non-degenerate)11
Final-year envelope spread > year-0 spread (variance grows)11
successRate is integer 0-10011

FICA 10/10

Authority: IRC §3101(a) (OASDI 6.2%); IRC §3101(b) (Medicare 1.45%); IRC §3101(b)(2) (Additional Medicare 0.9% above household threshold); IRS Pub 15.
Method: Per-person calcFICA on W-2 wages; SS portion capped at annual wage base ($184,500 in 2026); Medicare uncapped; Additional Medicare 0.9% on combined household wages above $250,000 MFJ / $200,000 single.
TestExpectedActualResult
SS portion = wages × 6.2%6,2006,200
Medicare portion = wages × 1.45%1,4501,450
Total = SS + Medicare, no Addl Med here7,6507,650
SS portion at cap = cap × 6.2%11,43911,439
Medicare at cap = cap × 1.45% (no cap on Medicare)2,6752,675
SS portion caps at wage base × 6.2%11,43911,439
Medicare continues on full wage amount3,6253,625
Zero wages → all zero00
SS portion limited to remaining base5,2395,239
Medicare still on full wages2,1752,175

Pre-tax 401(k) fix 2/2

Authority: IRC §3121(a) (FICA wage base includes 401(k) deferrals); IRC §62(a)(2) (above-the-line treatment for federal income tax).
Method: Verifies that 401(k) pre-tax deferrals reduce ordinary income for federal tax computation but NOT for the FICA wage base.
TestExpectedActualResult
Having a pre-tax account reduces pre-retirement federal tax11
FICA unchanged by pre-tax 401(k) choice9,1809,180

Phase resolver 6/6

Method: Income phase resolver tests confirming phase-level overrides take priority for ages they cover, age-outside-phase falls back to base config, per-phase incomeBreakdown propagates to FICA correctly, per-phase selfEmployed propagates to SE tax.
TestExpectedActualResult
No phases → base income at year 0120,000120,000
Phase income overrides base during covered years150,000150,000
Age outside phases uses base income120,000120,000
Phase-level incomeBreakdown reduces FICA base by §125 + payrollHSA10,09810,098
Phase SE does not pollute FICA (separate channels)00
W-2 + SE in same phase: FICA on W-2 only (unchanged by SE)7,6507,650

SE Tax 10/10

Authority: IRC §1401 (OASDI 12.4% / Medicare 2.9%); IRC §1402(a)(12) (92.35% multiplier); IRC §1402(b)(2) (wage base shared with W-2); IRC §1402(b) ($400 SECA-base floor); IRC §164(f) (half-of-SE-tax above-the-line deduction); IRS Schedule SE Instructions; IRS Pub 334.
Method: calcSETax computes SECA base = netSE × 0.9235; SS portion = min(SECA, ssWageBaseRemaining) × 12.4%; Medicare = SECA × 2.9%; halfDeduction = total / 2 reduces AGI.
TestExpectedActualResult
$50K net SE: secaBase = $46,17546,17546,175
$50K net SE: SS portion = $5,7265,7265,726
$50K net SE: Medicare = $1,3391,3391,339
$50K net SE: total = $7,0657,0657,065
$50K net SE: halfDeduction ≈ $3,5333,5333,533
Negative SE: zero SE tax00
Negative SE: zero half-deduction00
$400 net SE: under SECA floor → zero SE tax00
Wage base sharing: SS portion limited4,2784,278
Wage base sharing: Medicare uncapped2,1432,143

SE Tax Integration 10/10

Method: End-to-end runProjection() integration tests verifying SE tax flows through engine pipeline: AGI/MAGI propagation via the `other` accumulator, year-output field surface (seTax / seNetEarnings / seHalfDeduction), wage base sharing with W-2 income, business loss handling (negative net SE → no SE tax, AGI reduction only), spouse SE independence.
TestExpectedActualResult
SE tax in year output ≈ $11,30411,30411,304
seNetEarnings = $80K80,00080,000
seHalfDeduction ≈ $5,6525,6525,652
SE loss: zero SE tax00
SE loss: seNetEarnings = -$20K-20,000-20,000
SE loss: seHalfDeduction = 000
SE loss reduces MAGI vs baseline11
W-2 + SE: SE tax respects wage base sharing6,4216,421
Working-age SE: seTax > 011
Spouse SE: seTax > 011

QBI 10/10

Authority: IRC §199A(a)-(d), §199A(i); Treas. Reg. §1.199A-3(b)(1)(vi); IRS Rev. Proc. 2025-32 §4.26 (post-OBBBA §70105).
Method: Per-business 20% deduction with SSTB phaseout, household taxable-income cap (20% × (taxable − net cap gain)), W-2 wage limit (sole-prop assumption: $0), OBBBA $400 floor for ≥$1,000 QBI from a qualified trade or business. 2026 thresholds: $403,500 / $553,500 MFJ; $201,750 / $276,750 single (post-OBBBA $150K / $75K phase-in extension).
TestExpectedActualResult
Below threshold MFJ: full 20% deduction20,00020,000
SSTB above upper MFJ: $0 deduction00
Non-SSTB above upper MFJ no W-2: $400 floor400400
SSTB phase-in midpoint MFJ: half deduction10,00010,000
Taxable income limit MFJ: capped at 20% × (taxable − net capgain)10,00010,000
QBI below $1,000: no deduction00
Single below threshold: full 20% deduction10,00010,000
Single SSTB above upper: $0 deduction00
Two-business household MFJ: combined deduction16,00016,000
Mixed SSTB/non-SSTB above upper: $400 floor via non-SSTB400400

QBI Integration 6/6

Method: End-to-end runProjection() tests verifying QBI deduction flows correctly through engine: per-baseline computation across actual / no-conversion / conversion-only scenarios for accurate Roth conversion delta math, surface in year output (qbiDeduction field), interaction with TLH-ordinary-offset and capital-gains stacking. v6.14.1 added TLH-ordinary-offset symmetry across all three baselines.
TestExpectedActualResult
W-2 + SE: qbiDeduction > 011
W-2 + SE $100K: qbiDeduction ≈ 20% × (netSE − halfSE)18,93218,932
Pure SE $100K: deduction capped by household taxable income limit11
SSTB in phase-in range: deduction reduced vs full11
SSTB conversion: conversionTax > 011
TLH + QBI: deduction computed (no asymmetry crash)11

Solo 401k 17/17

Authority: IRC §401(c) (self-employed plan participation); IRC §401(c)(2)(A)(v) (positive-earned-income gating); IRC §402(g) + §414(v) (elective deferral limit + age-based catch-up); SECURE 2.0 §109 (enhanced catch-up ages 60-63); IRC §415(c) (annual addition cap); IRC §404(a)(8)(C) (20% sole-prop employer limit on net SE − half-SE-tax); SECURE 2.0 §604 (Roth employer profit-share); IRS Notice 2025-67 (2026 contribution limits).
Method: Solo 401(k) employee elective deferral (Traditional or Roth) and employer profit-share for sole prop / SMLLC / partnership entities. §402(g) capacity aggregates with any W-2 401(k) deferral target. §415(c) caps combined employee + employer at $72,000 (2026). Manual override for both employee dollar amount and employer percentage; auto-max default.
TestExpectedActualResult
$100K netSE age 45 auto-max: employee = $24,50024,50024,500
$100K netSE age 45 auto-max: employer ≈ $18,58718,58718,587
Traditional employee classification24,50024,500
Roth employee classification00
Age 62 SECURE 2.0 catch-up: employee = $35,75035,75035,750
§415(c) binds: employer + employee = annual addition limit72,00072,000
§415(c) clamp produces employer = $47,50047,50047,500
§402(g) aggregation: Solo limited by W-2 deferral target4,5004,500
Auto employer respects §415(c)18,58718,587
Roth employee: tradEmployee = 000
Roth employee: rothEmployee tracks amount24,50024,500
Roth employer: rothEmployerAmt > 018,58718,587
Roth employer: tradEmployer = 000
Manual deferral $10K respected10,00010,000
Manual employer 10% = $9,2949,2949,294
Negative SE: zero employee deferral00
Negative SE: zero employer profit-share00

Solo 401k Integration 9/9

Authority: Treas. Reg. §1.199A-3(b)(1)(vi) (retirement plan deductions reduce QBI); IRS Notice 2024-2 Q&A L9 (Roth employer profit-share treatment).
Method: End-to-end runProjection() integration tests verifying Solo 401(k) flows correctly: contribution amounts surface in year output (solo401kEmployee / solo401kEmployer fields); traditional contributions reduce AGI/MAGI; Roth employee preserves AGI; traditional employee + traditional employer + Roth employer all reduce QBI input; Roth employee preserves QBI input; spousal Solo 401(k) read independently via spouseSelfEmployed.
TestExpectedActualResult
solo401kEmployee surfaces in year output24,50024,500
solo401kEmployer ≈ $18,58718,58718,587
Traditional Solo reduces MAGI11
Roth employee preserves AGI11
Traditional Solo: qbiDeduction not larger than without Solo11
Roth employee preserves QBI deduction11
Roth employer: same QBI input as traditional employer (W-2+SE)11
Roth employer: higher MAGI than traditional employer11
Spouse Solo 401(k): contributions > 011

Pre-flight 3/3

TestExpectedActualResult
calcSpousalBenefit existsfunctionfunction
calcSpousalBenefit has 4 parameters (not old 2-param version)44
ssReverseAdjustPIA existstruetrue

Spousal SS 13/13

TestExpectedActualResult
Spouse at FRA (67), no own record → 50% of worker PIA12,00012,000
Worker PIA = $3,000/mo, spouse at FRA → $18,000/yr floor18,00018,000
Spouse own = $9,600/yr (< $12K floor) → top-up = $2,4002,4002,400
Spouse own = $600/mo ($7,200/yr) → top-up = $4,8004,8004,800
Spouse own = $12,000/yr (= floor) → top-up = $000
Spouse own = $13,200/yr (> floor) → top-up = $000
Spouse claims at 62 (60mo early), no own record → 35% of worker PIA8,4008,400
Spouse claims at 65 (24mo early) → ~43.3% of worker PIA annual10,40010,400
FRA=66, claims at 62 (48mo early) → 37.5% of worker PIA9,0009,000
Spouse claims at 70 (past FRA) → same as FRA, no DRC increase12,00012,000
Spouse claims at 68 (past FRA) → same as FRA12,00012,000
Worker PIA = $0 → top-up = $000
Spouse own = $0, worker PIA = $0 → $000

COLA 2/2

TestExpectedActualResult
Spousal benefit grows with COLA at age 68 vs 6711
Spousal top-up at 68 ≈ $18,360 (18,000 × 1.02)18,36018,360

UI Wording 4/4

TestExpectedActualResult
"Spousal SS Benefit" Plan Health lever title exists in HTML11
Lever says benefit is "already included in your projection"11
Lever links to SS tab (inputTab=ss)11
Old 2-param calcSpousalBenefit signature is NOT present11

Reverse round-trip 16/16

TestExpectedActualResult
PIA $1500 claim 62 → adj $1050 → reverse $15001,5001,500
PIA $1500 claim 65 → adj $1300 → reverse $15001,5001,500
PIA $1500 claim 67 → adj $1500 → reverse $15001,5001,500
PIA $1500 claim 68 → adj $1620 → reverse $15001,5001,500
PIA $1500 claim 70 → adj $1860 → reverse $15001,5001,500
PIA $2500 claim 62 → adj $1750 → reverse $25002,5002,500
PIA $2500 claim 65 → adj $2166 → reverse $24992,5002,499
PIA $2500 claim 67 → adj $2500 → reverse $25002,5002,500
PIA $2500 claim 68 → adj $2700 → reverse $25002,5002,500
PIA $2500 claim 70 → adj $3100 → reverse $25002,5002,500
PIA $3500 claim 62 → adj $2450 → reverse $35003,5003,500
PIA $3500 claim 65 → adj $3033 → reverse $35003,5003,500
PIA $3500 claim 67 → adj $3500 → reverse $35003,5003,500
PIA $3500 claim 68 → adj $3780 → reverse $35003,5003,500
PIA $3500 claim 70 → adj $4340 → reverse $35003,5003,500
Zero current monthly returns 000

Primary already-collecting 4/4

TestExpectedActualResult
Age 75: ss = current monthly × 12 (COLA 0%)50,40050,400
Age 80: ss still 50400 (COLA 0%)50,40050,400
Age 75 with COLA 2%: ss = 50400 (zero COLA years)50,40050,400
Age 80 with COLA 2%: ss ≈ 50400 × 1.02^5 ≈ 5564855,64855,646

Spousal floor 1/1

TestExpectedActualResult
Already-collecting primary supplies recovered PIA for spousal floor54,00054,000

Spouse already-collecting 2/2

TestExpectedActualResult
Primary not yet filed, spouse already collecting → ss > 011
Spouse benefit constant when primary still not filed (COLA 0%)11

Both already-collecting 2/2

TestExpectedActualResult
Year 0 (age 73): combined ss ≈ (3500+1800) × 12 = 6360063,60063,600
Five years later (age 78): combined ss ≈ 63600 × 1.02^5 ≈ 7022170,22170,219

Backwards compat 1/1

TestExpectedActualResult
Non-working spouse with ssAlreadyCollecting:false → $54K at FRA54,00054,000