@retiregolden/engine 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +661 -0
- package/README.md +79 -0
- package/dist/allocation/assetClasses.d.ts +94 -0
- package/dist/allocation/assetClasses.js +215 -0
- package/dist/decisions/annuitization.d.ts +72 -0
- package/dist/decisions/annuitization.js +184 -0
- package/dist/decisions/decisionFixtures.d.ts +48 -0
- package/dist/decisions/decisionFixtures.js +253 -0
- package/dist/decisions/evaluateCandidate.d.ts +61 -0
- package/dist/decisions/evaluateCandidate.js +193 -0
- package/dist/decisions/generators.d.ts +110 -0
- package/dist/decisions/generators.js +667 -0
- package/dist/decisions/index.d.ts +17 -0
- package/dist/decisions/index.js +17 -0
- package/dist/decisions/insightsAdapter.d.ts +27 -0
- package/dist/decisions/insightsAdapter.js +51 -0
- package/dist/decisions/objectives.d.ts +96 -0
- package/dist/decisions/objectives.js +319 -0
- package/dist/decisions/pensionElection.d.ts +112 -0
- package/dist/decisions/pensionElection.js +239 -0
- package/dist/decisions/search.d.ts +51 -0
- package/dist/decisions/search.js +110 -0
- package/dist/decisions/spendingSolver.d.ts +70 -0
- package/dist/decisions/spendingSolver.js +180 -0
- package/dist/decisions/spiaQuotes.d.ts +21 -0
- package/dist/decisions/spiaQuotes.js +43 -0
- package/dist/decisions/stochastic.d.ts +11 -0
- package/dist/decisions/stochastic.js +66 -0
- package/dist/decisions/swrComparator.d.ts +54 -0
- package/dist/decisions/swrComparator.js +89 -0
- package/dist/decisions/tournament.d.ts +53 -0
- package/dist/decisions/tournament.js +104 -0
- package/dist/decisions/types.d.ts +125 -0
- package/dist/decisions/types.js +12 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.js +12 -0
- package/dist/insights/detectors/annuitizationHeadroom.d.ts +11 -0
- package/dist/insights/detectors/annuitizationHeadroom.js +77 -0
- package/dist/insights/detectors/assetLocation.d.ts +9 -0
- package/dist/insights/detectors/assetLocation.js +86 -0
- package/dist/insights/detectors/hecmBufferCandidate.d.ts +12 -0
- package/dist/insights/detectors/hecmBufferCandidate.js +76 -0
- package/dist/insights/detectors/incomeFloorFunded.d.ts +8 -0
- package/dist/insights/detectors/incomeFloorFunded.js +52 -0
- package/dist/insights/detectors/irmaaTierEdge.d.ts +2 -0
- package/dist/insights/detectors/irmaaTierEdge.js +102 -0
- package/dist/insights/detectors/pensionElectionPending.d.ts +11 -0
- package/dist/insights/detectors/pensionElectionPending.js +62 -0
- package/dist/insights/detectors/qcdEfficiency.d.ts +2 -0
- package/dist/insights/detectors/qcdEfficiency.js +62 -0
- package/dist/insights/detectors/rothBridgeHeadroom.d.ts +2 -0
- package/dist/insights/detectors/rothBridgeHeadroom.js +77 -0
- package/dist/insights/detectors/spendingGuardrails.d.ts +2 -0
- package/dist/insights/detectors/spendingGuardrails.js +77 -0
- package/dist/insights/detectors/spendingHeadroom.d.ts +12 -0
- package/dist/insights/detectors/spendingHeadroom.js +92 -0
- package/dist/insights/detectors/ssBridgeGap.d.ts +9 -0
- package/dist/insights/detectors/ssBridgeGap.js +92 -0
- package/dist/insights/detectors/stateRelocation.d.ts +12 -0
- package/dist/insights/detectors/stateRelocation.js +99 -0
- package/dist/insights/detectors/widowsPenalty.d.ts +12 -0
- package/dist/insights/detectors/widowsPenalty.js +145 -0
- package/dist/insights/registry.d.ts +4 -0
- package/dist/insights/registry.js +62 -0
- package/dist/insights/runInsights.d.ts +6 -0
- package/dist/insights/runInsights.js +15 -0
- package/dist/insights/types.d.ts +70 -0
- package/dist/insights/types.js +1 -0
- package/dist/ladder/bridge.d.ts +72 -0
- package/dist/ladder/bridge.js +59 -0
- package/dist/ladder/fedInvest.d.ts +55 -0
- package/dist/ladder/fedInvest.js +77 -0
- package/dist/ladder/fundedRatio.d.ts +41 -0
- package/dist/ladder/fundedRatio.js +46 -0
- package/dist/ladder/ladderMath.d.ts +88 -0
- package/dist/ladder/ladderMath.js +140 -0
- package/dist/longevity/ssaPeriod2022.d.ts +10 -0
- package/dist/longevity/ssaPeriod2022.js +51 -0
- package/dist/longevity/types.d.ts +39 -0
- package/dist/longevity/types.js +1 -0
- package/dist/model/migrations.d.ts +20 -0
- package/dist/model/migrations.js +67 -0
- package/dist/model/plan.d.ts +3108 -0
- package/dist/model/plan.js +1514 -0
- package/dist/montecarlo/frontiers.d.ts +22 -0
- package/dist/montecarlo/frontiers.js +61 -0
- package/dist/montecarlo/historicalReturns.d.ts +27 -0
- package/dist/montecarlo/historicalReturns.js +124 -0
- package/dist/montecarlo/historicalSuites.d.ts +45 -0
- package/dist/montecarlo/historicalSuites.js +102 -0
- package/dist/montecarlo/ltcShock.d.ts +42 -0
- package/dist/montecarlo/ltcShock.js +62 -0
- package/dist/montecarlo/marketModels.d.ts +248 -0
- package/dist/montecarlo/marketModels.js +672 -0
- package/dist/montecarlo/mortality.d.ts +31 -0
- package/dist/montecarlo/mortality.js +61 -0
- package/dist/montecarlo/riskBasedGuardrails.d.ts +93 -0
- package/dist/montecarlo/riskBasedGuardrails.js +200 -0
- package/dist/montecarlo/rng.d.ts +18 -0
- package/dist/montecarlo/rng.js +44 -0
- package/dist/montecarlo/run.d.ts +210 -0
- package/dist/montecarlo/run.js +353 -0
- package/dist/montecarlo/sharedPaths.d.ts +43 -0
- package/dist/montecarlo/sharedPaths.js +28 -0
- package/dist/montecarlo/survival.d.ts +49 -0
- package/dist/montecarlo/survival.js +126 -0
- package/dist/params/data/realYieldCurve2026.d.ts +17 -0
- package/dist/params/data/realYieldCurve2026.js +26 -0
- package/dist/params/data/year2026.d.ts +14 -0
- package/dist/params/data/year2026.js +199 -0
- package/dist/params/index.d.ts +63 -0
- package/dist/params/index.js +134 -0
- package/dist/params/provenance.d.ts +29 -0
- package/dist/params/provenance.js +123 -0
- package/dist/params/state/data/year2026.d.ts +18 -0
- package/dist/params/state/data/year2026.js +581 -0
- package/dist/params/state/index.d.ts +13 -0
- package/dist/params/state/index.js +26 -0
- package/dist/params/state/types.d.ts +73 -0
- package/dist/params/state/types.js +10 -0
- package/dist/params/types.d.ts +201 -0
- package/dist/params/types.js +7 -0
- package/dist/projection/annuityForms.d.ts +62 -0
- package/dist/projection/annuityForms.js +87 -0
- package/dist/projection/compare.d.ts +96 -0
- package/dist/projection/compare.js +216 -0
- package/dist/projection/flatTax.d.ts +7 -0
- package/dist/projection/flatTax.js +14 -0
- package/dist/projection/optimizePlan.d.ts +328 -0
- package/dist/projection/optimizePlan.js +1039 -0
- package/dist/projection/relocation.d.ts +149 -0
- package/dist/projection/relocation.js +317 -0
- package/dist/projection/simulate.d.ts +61 -0
- package/dist/projection/simulate.js +2754 -0
- package/dist/projection/types.d.ts +381 -0
- package/dist/projection/types.js +9 -0
- package/dist/rmd/jointLifeTable.d.ts +8 -0
- package/dist/rmd/jointLifeTable.js +663 -0
- package/dist/rmd/rmd.d.ts +29 -0
- package/dist/rmd/rmd.js +34 -0
- package/dist/scenarios/scenarios.d.ts +70 -0
- package/dist/scenarios/scenarios.js +130 -0
- package/dist/socialSecurity/benefitFactor.d.ts +13 -0
- package/dist/socialSecurity/benefitFactor.js +40 -0
- package/dist/socialSecurity/claimFactor.d.ts +33 -0
- package/dist/socialSecurity/claimFactor.js +58 -0
- package/dist/socialSecurity/disability.d.ts +36 -0
- package/dist/socialSecurity/disability.js +42 -0
- package/dist/socialSecurity/familyMaximum.d.ts +38 -0
- package/dist/socialSecurity/familyMaximum.js +48 -0
- package/dist/socialSecurity/maritalBenefits.d.ts +57 -0
- package/dist/socialSecurity/maritalBenefits.js +87 -0
- package/dist/socialSecurity/nra.d.ts +30 -0
- package/dist/socialSecurity/nra.js +83 -0
- package/dist/socialSecurity/piaFromEarnings.d.ts +100 -0
- package/dist/socialSecurity/piaFromEarnings.js +202 -0
- package/dist/socialSecurity/ssaWageData.d.ts +68 -0
- package/dist/socialSecurity/ssaWageData.js +306 -0
- package/dist/socialSecurity/survivorBenefit.d.ts +61 -0
- package/dist/socialSecurity/survivorBenefit.js +61 -0
- package/dist/spending/abw.d.ts +57 -0
- package/dist/spending/abw.js +80 -0
- package/dist/spending/flexibleGoals.d.ts +62 -0
- package/dist/spending/flexibleGoals.js +136 -0
- package/dist/spending/guardrails.d.ts +78 -0
- package/dist/spending/guardrails.js +100 -0
- package/dist/spending/layers.d.ts +81 -0
- package/dist/spending/layers.js +67 -0
- package/dist/spending/shapePresets.d.ts +42 -0
- package/dist/spending/shapePresets.js +77 -0
- package/dist/strategies/accountEligibility.d.ts +81 -0
- package/dist/strategies/accountEligibility.js +98 -0
- package/dist/strategies/inheritedIra.d.ts +45 -0
- package/dist/strategies/inheritedIra.js +43 -0
- package/dist/strategies/iraBasis.d.ts +48 -0
- package/dist/strategies/iraBasis.js +46 -0
- package/dist/strategies/optimizer.d.ts +307 -0
- package/dist/strategies/optimizer.js +551 -0
- package/dist/strategies/rothBasis.d.ts +67 -0
- package/dist/strategies/rothBasis.js +83 -0
- package/dist/strategies/rothConversion.d.ts +55 -0
- package/dist/strategies/rothConversion.js +83 -0
- package/dist/strategies/sepp.d.ts +38 -0
- package/dist/strategies/sepp.js +53 -0
- package/dist/tax/aca.d.ts +40 -0
- package/dist/tax/aca.js +82 -0
- package/dist/tax/federalTax.d.ts +110 -0
- package/dist/tax/federalTax.js +249 -0
- package/dist/tax/medicare.d.ts +20 -0
- package/dist/tax/medicare.js +36 -0
- package/dist/tax/propertySale.d.ts +46 -0
- package/dist/tax/propertySale.js +35 -0
- package/dist/tax/stateTax.d.ts +66 -0
- package/dist/tax/stateTax.js +198 -0
- package/dist/testing/money.d.ts +7 -0
- package/dist/testing/money.js +17 -0
- package/dist/testing/planFixtures.d.ts +29 -0
- package/dist/testing/planFixtures.js +141 -0
- package/package.json +75 -0
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tax year 2026 parameter pack (post-OBBBA current law).
|
|
3
|
+
*
|
|
4
|
+
* Sources (verified June 2026) — see DOCS/domain/domain-rules-reference.md:
|
|
5
|
+
* - Brackets/deductions/AMT: IRS inflation adjustments; Tax Foundation 2026 tables
|
|
6
|
+
* - Capital gains/NIIT: IRS; Kiplinger 2026 LTCG thresholds
|
|
7
|
+
* - Limits: IRS IR news release (401(k) $24,500; IRA $7,500)
|
|
8
|
+
* - RMD: IRS Pub 590-B Uniform Lifetime Table (2022+); QCD $111,000 (2026)
|
|
9
|
+
* - Medicare: CMS 2026 ($202.90 standard Part B); IRMAA tiers per statute
|
|
10
|
+
* - Social Security: SSA 2026 COLA fact sheet
|
|
11
|
+
* - FPL: HHS 2025 guidelines (apply to 2026 ACA coverage year)
|
|
12
|
+
*/
|
|
13
|
+
export const year2026 = {
|
|
14
|
+
year: 2026,
|
|
15
|
+
federalTax: {
|
|
16
|
+
brackets: {
|
|
17
|
+
single: [
|
|
18
|
+
{ lowerBound: 0, ratePct: 10 },
|
|
19
|
+
{ lowerBound: 12_400, ratePct: 12 },
|
|
20
|
+
{ lowerBound: 50_400, ratePct: 22 },
|
|
21
|
+
{ lowerBound: 105_700, ratePct: 24 },
|
|
22
|
+
{ lowerBound: 201_775, ratePct: 32 },
|
|
23
|
+
{ lowerBound: 256_225, ratePct: 35 },
|
|
24
|
+
{ lowerBound: 640_600, ratePct: 37 },
|
|
25
|
+
],
|
|
26
|
+
marriedFilingJointly: [
|
|
27
|
+
{ lowerBound: 0, ratePct: 10 },
|
|
28
|
+
{ lowerBound: 24_800, ratePct: 12 },
|
|
29
|
+
{ lowerBound: 100_800, ratePct: 22 },
|
|
30
|
+
{ lowerBound: 211_400, ratePct: 24 },
|
|
31
|
+
{ lowerBound: 403_550, ratePct: 32 },
|
|
32
|
+
{ lowerBound: 512_450, ratePct: 35 },
|
|
33
|
+
{ lowerBound: 768_700, ratePct: 37 },
|
|
34
|
+
],
|
|
35
|
+
},
|
|
36
|
+
standardDeduction: { single: 16_100, marriedFilingJointly: 32_200 },
|
|
37
|
+
age65Addition: { single: 2_050, marriedFilingJointly: 1_650 },
|
|
38
|
+
// OBBBA SALT cap: $40,000 for 2025, +1%/yr → $40,400 for 2026.
|
|
39
|
+
saltCap: 40_400,
|
|
40
|
+
// Net capital loss deductible against ordinary income (IRC §1211(b)); fixed
|
|
41
|
+
// at $3,000 since 1978, never indexed.
|
|
42
|
+
capitalLossOrdinaryOffsetLimit: 3_000,
|
|
43
|
+
// IRC §121 home-sale gain exclusion; statutory since 1997, never indexed.
|
|
44
|
+
section121Exclusion: { single: 250_000, marriedFilingJointly: 500_000 },
|
|
45
|
+
seniorDeduction: {
|
|
46
|
+
amountPerPerson: 6_000,
|
|
47
|
+
magiPhaseOutStart: { single: 75_000, marriedFilingJointly: 150_000 },
|
|
48
|
+
phaseOutRatePct: 6,
|
|
49
|
+
lastApplicableYear: 2028,
|
|
50
|
+
},
|
|
51
|
+
amt: {
|
|
52
|
+
exemption: { single: 90_100, marriedFilingJointly: 140_200 },
|
|
53
|
+
exemptionPhaseOutStart: { single: 500_000, marriedFilingJointly: 1_000_000 },
|
|
54
|
+
exemptionPhaseOutRatePct: 50,
|
|
55
|
+
rate28StartsAbove: 244_500,
|
|
56
|
+
rate26Pct: 26,
|
|
57
|
+
rate28Pct: 28,
|
|
58
|
+
},
|
|
59
|
+
},
|
|
60
|
+
capitalGains: {
|
|
61
|
+
rate15StartsAbove: { single: 49_450, marriedFilingJointly: 98_900 },
|
|
62
|
+
rate20StartsAbove: { single: 545_500, marriedFilingJointly: 613_700 },
|
|
63
|
+
},
|
|
64
|
+
niit: {
|
|
65
|
+
ratePct: 3.8,
|
|
66
|
+
magiThreshold: { single: 200_000, marriedFilingJointly: 250_000 },
|
|
67
|
+
},
|
|
68
|
+
ssBenefitTaxation: {
|
|
69
|
+
tier50Start: { single: 25_000, marriedFilingJointly: 32_000 },
|
|
70
|
+
tier85Start: { single: 34_000, marriedFilingJointly: 44_000 },
|
|
71
|
+
},
|
|
72
|
+
contributionLimits: {
|
|
73
|
+
employee401k: 24_500,
|
|
74
|
+
catchUp50: 8_000,
|
|
75
|
+
superCatchUp60to63: 11_250,
|
|
76
|
+
rothCatchUpWageThreshold: 150_000,
|
|
77
|
+
ira: 7_500,
|
|
78
|
+
iraCatchUp50: 1_100,
|
|
79
|
+
hsaSelfOnly: 4_400,
|
|
80
|
+
hsaFamily: 8_750,
|
|
81
|
+
hsaCatchUp55: 1_000,
|
|
82
|
+
section415cLimit: 72_000,
|
|
83
|
+
},
|
|
84
|
+
rmd: {
|
|
85
|
+
uniformLifetimeTable: {
|
|
86
|
+
72: 27.4, 73: 26.5, 74: 25.5, 75: 24.6, 76: 23.7, 77: 22.9, 78: 22.0,
|
|
87
|
+
79: 21.1, 80: 20.2, 81: 19.4, 82: 18.5, 83: 17.7, 84: 16.8, 85: 16.0,
|
|
88
|
+
86: 15.2, 87: 14.4, 88: 13.7, 89: 12.9, 90: 12.2, 91: 11.5, 92: 10.8,
|
|
89
|
+
93: 10.1, 94: 9.5, 95: 8.9, 96: 8.4, 97: 7.8, 98: 7.3, 99: 6.8,
|
|
90
|
+
100: 6.4, 101: 6.0, 102: 5.6, 103: 5.2, 104: 4.9, 105: 4.6, 106: 4.3,
|
|
91
|
+
107: 4.1, 108: 3.9, 109: 3.7, 110: 3.5, 111: 3.4, 112: 3.3, 113: 3.1,
|
|
92
|
+
114: 3.0, 115: 2.9, 116: 2.8, 117: 2.7, 118: 2.5, 119: 2.3, 120: 2.0,
|
|
93
|
+
},
|
|
94
|
+
qcdAnnualLimit: 111_000,
|
|
95
|
+
},
|
|
96
|
+
annuities: {
|
|
97
|
+
// SECURE 2.0 QLAC dollar cap: $200,000 (2024), indexed to $210,000 (2025).
|
|
98
|
+
// The 2026 figure is not yet published; the last-confirmed 2025 cap stands
|
|
99
|
+
// in (projected forward by inflation past the pack year like other indexed
|
|
100
|
+
// limits). Source: IRS Notice / SECURE 2.0 Act §202.
|
|
101
|
+
qlacPremiumCap: 210_000,
|
|
102
|
+
// IRS Pub 939 Table V — Ordinary Life Annuities, One Life — expected-return
|
|
103
|
+
// multiples (remaining life expectancy in years) by age at the annuity
|
|
104
|
+
// starting date. Drives the non-qualified exclusion ratio (Pub 939 General
|
|
105
|
+
// Rule). Source: IRS Publication 939, Table V.
|
|
106
|
+
expectedReturnMultiples: {
|
|
107
|
+
50: 33.1, 51: 32.2, 52: 31.3, 53: 30.4, 54: 29.5, 55: 28.6, 56: 27.7,
|
|
108
|
+
57: 26.8, 58: 25.9, 59: 25.0, 60: 24.2, 61: 23.3, 62: 22.5, 63: 21.6,
|
|
109
|
+
64: 20.8, 65: 20.0, 66: 19.2, 67: 18.4, 68: 17.6, 69: 16.8, 70: 16.0,
|
|
110
|
+
71: 15.3, 72: 14.6, 73: 13.9, 74: 13.2, 75: 12.5, 76: 11.9, 77: 11.2,
|
|
111
|
+
78: 10.6, 79: 10.0, 80: 9.5, 81: 8.9, 82: 8.4, 83: 7.9, 84: 7.4,
|
|
112
|
+
85: 6.9, 86: 6.5, 87: 6.1, 88: 5.7, 89: 5.3, 90: 5.0, 91: 4.7, 92: 4.4,
|
|
113
|
+
93: 4.1, 94: 3.9, 95: 3.7,
|
|
114
|
+
},
|
|
115
|
+
},
|
|
116
|
+
hecm: {
|
|
117
|
+
// HUD HECM principal-limit factors at a 5.875% expected rate, as published
|
|
118
|
+
// for 2026 (percent of home value available as the initial principal
|
|
119
|
+
// limit, by age of the youngest borrower). Planning default only — the UI
|
|
120
|
+
// asks for the lender-quoted line size first. Primary authority: HUD's
|
|
121
|
+
// HECM PLF tables (https://www.hud.gov/hud-partners/single-family-home-equity-conversion-mortgages,
|
|
122
|
+
// published as spreadsheets by age × expected rate); values here are the
|
|
123
|
+
// 2026 chart summarized at https://reverse.mortgage/age-requirements
|
|
124
|
+
// (net of nothing — upfront costs are modeled separately via
|
|
125
|
+
// upfrontCostPct). On refresh, prefer reading the HUD tables directly.
|
|
126
|
+
principalLimitFactorPctByAge: {
|
|
127
|
+
62: 35.1, 65: 37.2, 70: 40.9, 75: 43.8, 80: 48.2, 85: 54.4, 90: 61.4,
|
|
128
|
+
},
|
|
129
|
+
plfExpectedRatePct: 5.875,
|
|
130
|
+
// Note rate near the 2026 expected rate + 0.5% annual MIP — the "~7–8%
|
|
131
|
+
// growth at 2026 rates" planning figure (Pfau's buffer-asset articles).
|
|
132
|
+
defaultGrowthRatePct: 7.5,
|
|
133
|
+
},
|
|
134
|
+
medicare: {
|
|
135
|
+
partBStandardMonthly: 202.9,
|
|
136
|
+
irmaaTiers: [
|
|
137
|
+
// CMS 2026 Part D IRMAA surcharges by income tier.
|
|
138
|
+
{
|
|
139
|
+
magiOver: { single: 109_000, marriedFilingJointly: 218_000 },
|
|
140
|
+
applicablePct: 35,
|
|
141
|
+
partDSurchargeMonthly: 14.5,
|
|
142
|
+
},
|
|
143
|
+
{
|
|
144
|
+
magiOver: { single: 137_000, marriedFilingJointly: 274_000 },
|
|
145
|
+
applicablePct: 50,
|
|
146
|
+
partDSurchargeMonthly: 37.5,
|
|
147
|
+
},
|
|
148
|
+
{
|
|
149
|
+
magiOver: { single: 171_000, marriedFilingJointly: 342_000 },
|
|
150
|
+
applicablePct: 65,
|
|
151
|
+
partDSurchargeMonthly: 60.4,
|
|
152
|
+
},
|
|
153
|
+
{
|
|
154
|
+
magiOver: { single: 205_000, marriedFilingJointly: 410_000 },
|
|
155
|
+
applicablePct: 80,
|
|
156
|
+
partDSurchargeMonthly: 83.3,
|
|
157
|
+
},
|
|
158
|
+
{
|
|
159
|
+
magiOver: { single: 500_000, marriedFilingJointly: 750_000 },
|
|
160
|
+
applicablePct: 85,
|
|
161
|
+
partDSurchargeMonthly: 91.0,
|
|
162
|
+
},
|
|
163
|
+
],
|
|
164
|
+
},
|
|
165
|
+
socialSecurity: {
|
|
166
|
+
colaPct: 2.8,
|
|
167
|
+
taxableWageBase: 184_500,
|
|
168
|
+
earningsTestBelowFraAnnual: 24_480,
|
|
169
|
+
earningsTestFraYearAnnual: 65_160,
|
|
170
|
+
// SSDI Substantial Gainful Activity (non-blind), 2026. Source: SSA SGA.
|
|
171
|
+
sgaMonthlyNonBlind: 1_620,
|
|
172
|
+
// Employee-side OASDI payroll tax rate (statutory since 1990). Source: SSA.
|
|
173
|
+
oasdiEmployeeRatePct: 6.2,
|
|
174
|
+
},
|
|
175
|
+
federalPovertyLine: {
|
|
176
|
+
firstPerson: 15_650,
|
|
177
|
+
perAdditionalPerson: 5_500,
|
|
178
|
+
},
|
|
179
|
+
aca: {
|
|
180
|
+
// Indexed schedule for 2026 (enhanced credits expired 12/31/2025; cliff
|
|
181
|
+
// restored). Verified against Rev. Proc. 2025-25 §3.01 (Applicable
|
|
182
|
+
// Percentage Table for 2026): 2.10% below 133% FPL, then 3.14→4.19 (133–150),
|
|
183
|
+
// 4.19→6.60 (150–200), 6.60→8.44 (200–250), 8.44→9.96 (250–300), 9.96 flat
|
|
184
|
+
// through 400%.
|
|
185
|
+
applicablePctBreakpoints: [
|
|
186
|
+
// Flat 2.1% through 133% FPL, stepping to the 133–150 band (the step is
|
|
187
|
+
// encoded as a 1-point ramp because the engine interpolates linearly).
|
|
188
|
+
{ fplPct: 0, applicablePct: 2.1 },
|
|
189
|
+
{ fplPct: 133, applicablePct: 2.1 },
|
|
190
|
+
{ fplPct: 134, applicablePct: 3.14 },
|
|
191
|
+
{ fplPct: 150, applicablePct: 4.19 },
|
|
192
|
+
{ fplPct: 200, applicablePct: 6.6 },
|
|
193
|
+
{ fplPct: 250, applicablePct: 8.44 },
|
|
194
|
+
{ fplPct: 300, applicablePct: 9.96 },
|
|
195
|
+
{ fplPct: 400, applicablePct: 9.96 },
|
|
196
|
+
],
|
|
197
|
+
maxFplPctForCredit: 400,
|
|
198
|
+
},
|
|
199
|
+
};
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Typed access to annual parameter packs.
|
|
3
|
+
*
|
|
4
|
+
* Future years resolve to the latest published pack with `isStandIn: true`
|
|
5
|
+
* (same pattern as v1's ssaWageData "latest published" fallback) — projections
|
|
6
|
+
* inflate from the latest pack rather than failing on unpublished years.
|
|
7
|
+
*/
|
|
8
|
+
import type { FilingStatus, ParameterPack } from './types.js';
|
|
9
|
+
export { PARAMETER_PROVENANCE } from './provenance.js';
|
|
10
|
+
export type { ParameterSource } from './provenance.js';
|
|
11
|
+
export { REAL_YIELD_CURVE_2026 as EMBEDDED_REAL_YIELD_CURVE } from './data/realYieldCurve2026.js';
|
|
12
|
+
export type { RealYieldCurve, RealYieldCurvePoint } from './types.js';
|
|
13
|
+
export declare const EARLIEST_PACK_YEAR: number;
|
|
14
|
+
export declare const LATEST_PACK_YEAR: number;
|
|
15
|
+
/**
|
|
16
|
+
* When the tax/limit figures in the parameter packs were last compiled, and the
|
|
17
|
+
* published rules they reflect. Surfaced in the disclaimer so users know the
|
|
18
|
+
* data's vintage. Bump on each annual refresh.
|
|
19
|
+
*/
|
|
20
|
+
export declare const PARAMETER_DATA_AS_OF = "June 2026";
|
|
21
|
+
export declare const PARAMETER_DATA_BASIS = "2025 published federal and state rules";
|
|
22
|
+
/**
|
|
23
|
+
* Default Social Security trust-fund haircut per the OASDI Trustees Report:
|
|
24
|
+
* the 2026 report projects combined depletion in Q3 2034 with 83% of benefits
|
|
25
|
+
* payable (a 17% cut). (OASI alone depletes 2032 at 78% payable — RetireGolden's
|
|
26
|
+
* default follows the combined convention, domain rules §4.)
|
|
27
|
+
* Single source for the toggle default in Assumptions, the scenario chip, and
|
|
28
|
+
* example plans; revisit per DOCS/maintenance-schedule.md when the Trustees
|
|
29
|
+
* projection moves.
|
|
30
|
+
*/
|
|
31
|
+
export declare const TRUSTEES_DEFAULT_SS_HAIRCUT: {
|
|
32
|
+
readonly fromYear: 2034;
|
|
33
|
+
readonly cutPct: 17;
|
|
34
|
+
};
|
|
35
|
+
export interface PackLookup {
|
|
36
|
+
pack: ParameterPack;
|
|
37
|
+
/** True when `year` has no published pack and a neighboring year is standing in. */
|
|
38
|
+
isStandIn: boolean;
|
|
39
|
+
}
|
|
40
|
+
export declare function packForYear(year: number): PackLookup;
|
|
41
|
+
/** RMD start age per SECURE 2.0. Pre-1951 cohorts already started under older rules. */
|
|
42
|
+
export declare function rmdStartAgeForBirthYear(birthYear: number): number;
|
|
43
|
+
export declare function uniformLifetimeDivisor(pack: ParameterPack, age: number): number | undefined;
|
|
44
|
+
/**
|
|
45
|
+
* Expected-return multiple (remaining life expectancy in years) for a
|
|
46
|
+
* single-life ordinary annuity starting at `ageAtStart`, from IRS Pub 939
|
|
47
|
+
* Table V. Linear interpolation between whole-age entries; clamped to the
|
|
48
|
+
* table's endpoints outside its range. Drives the non-qualified exclusion
|
|
49
|
+
* ratio: exclusion ratio = investment-in-contract ÷ (annual payment × multiple).
|
|
50
|
+
*/
|
|
51
|
+
export declare function annuityExpectedReturnMultiple(pack: ParameterPack, ageAtStart: number): number;
|
|
52
|
+
/**
|
|
53
|
+
* Planning-default HECM principal-limit factor (percent of home value) for the
|
|
54
|
+
* youngest borrower's age at open, from the pack's published factor table
|
|
55
|
+
* (compiled at the pack's expected rate — a lender quote at the actual rate
|
|
56
|
+
* always wins; this is the fallback approximation). Linear interpolation
|
|
57
|
+
* between published ages; clamped to the endpoints outside the table.
|
|
58
|
+
*/
|
|
59
|
+
export declare function hecmPrincipalLimitFactorPct(pack: ParameterPack, ageAtOpen: number): number;
|
|
60
|
+
export declare function irmaaTierForMagi(pack: ParameterPack, magiTwoYearsPrior: number, filingStatus: FilingStatus, thresholdScale?: number): number;
|
|
61
|
+
/** Total monthly Part B premium for a MAGI (2-year-lookback) and filing status. */
|
|
62
|
+
export declare function partBMonthlyPremium(pack: ParameterPack, magiTwoYearsPrior: number, filingStatus: FilingStatus): number;
|
|
63
|
+
export declare function standardDeduction(pack: ParameterPack, filingStatus: FilingStatus, peopleAged65Plus: number): number;
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Typed access to annual parameter packs.
|
|
3
|
+
*
|
|
4
|
+
* Future years resolve to the latest published pack with `isStandIn: true`
|
|
5
|
+
* (same pattern as v1's ssaWageData "latest published" fallback) — projections
|
|
6
|
+
* inflate from the latest pack rather than failing on unpublished years.
|
|
7
|
+
*/
|
|
8
|
+
import { year2026 } from './data/year2026.js';
|
|
9
|
+
export { PARAMETER_PROVENANCE } from './provenance.js';
|
|
10
|
+
export { REAL_YIELD_CURVE_2026 as EMBEDDED_REAL_YIELD_CURVE } from './data/realYieldCurve2026.js';
|
|
11
|
+
const packs = [year2026];
|
|
12
|
+
// Keep sorted ascending by year as packs are added each fall.
|
|
13
|
+
export const EARLIEST_PACK_YEAR = packs[0].year;
|
|
14
|
+
export const LATEST_PACK_YEAR = packs[packs.length - 1].year;
|
|
15
|
+
/**
|
|
16
|
+
* When the tax/limit figures in the parameter packs were last compiled, and the
|
|
17
|
+
* published rules they reflect. Surfaced in the disclaimer so users know the
|
|
18
|
+
* data's vintage. Bump on each annual refresh.
|
|
19
|
+
*/
|
|
20
|
+
export const PARAMETER_DATA_AS_OF = 'June 2026';
|
|
21
|
+
export const PARAMETER_DATA_BASIS = '2025 published federal and state rules';
|
|
22
|
+
/**
|
|
23
|
+
* Default Social Security trust-fund haircut per the OASDI Trustees Report:
|
|
24
|
+
* the 2026 report projects combined depletion in Q3 2034 with 83% of benefits
|
|
25
|
+
* payable (a 17% cut). (OASI alone depletes 2032 at 78% payable — RetireGolden's
|
|
26
|
+
* default follows the combined convention, domain rules §4.)
|
|
27
|
+
* Single source for the toggle default in Assumptions, the scenario chip, and
|
|
28
|
+
* example plans; revisit per DOCS/maintenance-schedule.md when the Trustees
|
|
29
|
+
* projection moves.
|
|
30
|
+
*/
|
|
31
|
+
export const TRUSTEES_DEFAULT_SS_HAIRCUT = { fromYear: 2034, cutPct: 17 };
|
|
32
|
+
export function packForYear(year) {
|
|
33
|
+
const exact = packs.find((p) => p.year === year);
|
|
34
|
+
if (exact)
|
|
35
|
+
return { pack: exact, isStandIn: false };
|
|
36
|
+
if (year > LATEST_PACK_YEAR)
|
|
37
|
+
return { pack: packs[packs.length - 1], isStandIn: true };
|
|
38
|
+
return { pack: packs[0], isStandIn: true };
|
|
39
|
+
}
|
|
40
|
+
/** RMD start age per SECURE 2.0. Pre-1951 cohorts already started under older rules. */
|
|
41
|
+
export function rmdStartAgeForBirthYear(birthYear) {
|
|
42
|
+
if (birthYear <= 1950)
|
|
43
|
+
return 72;
|
|
44
|
+
if (birthYear <= 1959)
|
|
45
|
+
return 73;
|
|
46
|
+
return 75;
|
|
47
|
+
}
|
|
48
|
+
export function uniformLifetimeDivisor(pack, age) {
|
|
49
|
+
if (age > 120)
|
|
50
|
+
return pack.rmd.uniformLifetimeTable[120];
|
|
51
|
+
return pack.rmd.uniformLifetimeTable[age];
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Expected-return multiple (remaining life expectancy in years) for a
|
|
55
|
+
* single-life ordinary annuity starting at `ageAtStart`, from IRS Pub 939
|
|
56
|
+
* Table V. Linear interpolation between whole-age entries; clamped to the
|
|
57
|
+
* table's endpoints outside its range. Drives the non-qualified exclusion
|
|
58
|
+
* ratio: exclusion ratio = investment-in-contract ÷ (annual payment × multiple).
|
|
59
|
+
*/
|
|
60
|
+
export function annuityExpectedReturnMultiple(pack, ageAtStart) {
|
|
61
|
+
const table = pack.annuities.expectedReturnMultiples;
|
|
62
|
+
const ages = Object.keys(table)
|
|
63
|
+
.map(Number)
|
|
64
|
+
.sort((a, b) => a - b);
|
|
65
|
+
if (ages.length === 0)
|
|
66
|
+
return 0;
|
|
67
|
+
const lo = ages[0];
|
|
68
|
+
const hi = ages[ages.length - 1];
|
|
69
|
+
if (ageAtStart <= lo)
|
|
70
|
+
return table[lo];
|
|
71
|
+
if (ageAtStart >= hi)
|
|
72
|
+
return table[hi];
|
|
73
|
+
const whole = Math.floor(ageAtStart);
|
|
74
|
+
const lower = table[whole];
|
|
75
|
+
const upper = table[whole + 1];
|
|
76
|
+
if (lower === undefined)
|
|
77
|
+
return table[hi];
|
|
78
|
+
if (upper === undefined || ageAtStart === whole)
|
|
79
|
+
return lower;
|
|
80
|
+
return lower + (upper - lower) * (ageAtStart - whole);
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Planning-default HECM principal-limit factor (percent of home value) for the
|
|
84
|
+
* youngest borrower's age at open, from the pack's published factor table
|
|
85
|
+
* (compiled at the pack's expected rate — a lender quote at the actual rate
|
|
86
|
+
* always wins; this is the fallback approximation). Linear interpolation
|
|
87
|
+
* between published ages; clamped to the endpoints outside the table.
|
|
88
|
+
*/
|
|
89
|
+
export function hecmPrincipalLimitFactorPct(pack, ageAtOpen) {
|
|
90
|
+
const table = pack.hecm.principalLimitFactorPctByAge;
|
|
91
|
+
const ages = Object.keys(table)
|
|
92
|
+
.map(Number)
|
|
93
|
+
.sort((a, b) => a - b);
|
|
94
|
+
if (ages.length === 0)
|
|
95
|
+
return 0;
|
|
96
|
+
if (ageAtOpen <= ages[0])
|
|
97
|
+
return table[ages[0]];
|
|
98
|
+
if (ageAtOpen >= ages[ages.length - 1])
|
|
99
|
+
return table[ages[ages.length - 1]];
|
|
100
|
+
for (let i = 0; i < ages.length - 1; i++) {
|
|
101
|
+
const lo = ages[i];
|
|
102
|
+
const hi = ages[i + 1];
|
|
103
|
+
if (ageAtOpen >= lo && ageAtOpen <= hi) {
|
|
104
|
+
return table[lo] + ((table[hi] - table[lo]) * (ageAtOpen - lo)) / (hi - lo);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
return table[ages[ages.length - 1]];
|
|
108
|
+
}
|
|
109
|
+
export function irmaaTierForMagi(pack, magiTwoYearsPrior, filingStatus, thresholdScale = 1) {
|
|
110
|
+
let tier = 0;
|
|
111
|
+
for (let i = 0; i < pack.medicare.irmaaTiers.length; i++) {
|
|
112
|
+
const threshold = pack.medicare.irmaaTiers[i].magiOver[filingStatus] * thresholdScale;
|
|
113
|
+
const isTopTier = i === pack.medicare.irmaaTiers.length - 1;
|
|
114
|
+
// CMS publishes lower tiers as "greater than" the floor; the final tier is inclusive.
|
|
115
|
+
if (isTopTier ? magiTwoYearsPrior >= threshold : magiTwoYearsPrior > threshold)
|
|
116
|
+
tier = i + 1;
|
|
117
|
+
}
|
|
118
|
+
return tier;
|
|
119
|
+
}
|
|
120
|
+
/** Total monthly Part B premium for a MAGI (2-year-lookback) and filing status. */
|
|
121
|
+
export function partBMonthlyPremium(pack, magiTwoYearsPrior, filingStatus) {
|
|
122
|
+
const base = pack.medicare.partBStandardMonthly;
|
|
123
|
+
let applicablePct = 25;
|
|
124
|
+
const tier = irmaaTierForMagi(pack, magiTwoYearsPrior, filingStatus);
|
|
125
|
+
if (tier > 0)
|
|
126
|
+
applicablePct = pack.medicare.irmaaTiers[tier - 1].applicablePct;
|
|
127
|
+
// Standard premium is 25% of program cost; IRMAA tiers pay a higher share.
|
|
128
|
+
return Math.round(base * (applicablePct / 25) * 100) / 100;
|
|
129
|
+
}
|
|
130
|
+
export function standardDeduction(pack, filingStatus, peopleAged65Plus) {
|
|
131
|
+
const base = pack.federalTax.standardDeduction[filingStatus];
|
|
132
|
+
const addition = pack.federalTax.age65Addition[filingStatus] * peopleAged65Plus;
|
|
133
|
+
return base + addition;
|
|
134
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Provenance for the parameter-pack defaults: the source and key figures behind
|
|
3
|
+
* every tax/limit/benefit number the engine applies. Surfaced in the UI so a
|
|
4
|
+
* user can see where the assumptions come from and verify any that matter.
|
|
5
|
+
*
|
|
6
|
+
* This is a human-maintained summary that travels with the data pack — refresh
|
|
7
|
+
* it in the same annual data-only PR that bumps `data/year<YYYY>.ts`. The
|
|
8
|
+
* concise `figures` strings should track the current pack's values.
|
|
9
|
+
*
|
|
10
|
+
* Full per-figure detail and additional citations: DOCS/domain/domain-rules-reference.md.
|
|
11
|
+
*/
|
|
12
|
+
export interface ParameterSource {
|
|
13
|
+
/** Stable id (kebab-case), unique within the list. */
|
|
14
|
+
id: string;
|
|
15
|
+
/** Short group name shown in the first column, sentence case. */
|
|
16
|
+
label: string;
|
|
17
|
+
/** One-line summary of the key figures this group contributes. */
|
|
18
|
+
figures: string;
|
|
19
|
+
/** Publisher / primary authority the figures are drawn from. */
|
|
20
|
+
publisher: string;
|
|
21
|
+
/** Link to a citable source for the figures. */
|
|
22
|
+
url: string;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* One entry per logical assumption group. Order is roughly the order figures
|
|
26
|
+
* appear in a projection (income tax → gains → SS → limits → RMDs → Medicare →
|
|
27
|
+
* SS benefits → ACA → state).
|
|
28
|
+
*/
|
|
29
|
+
export declare const PARAMETER_PROVENANCE: ParameterSource[];
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Provenance for the parameter-pack defaults: the source and key figures behind
|
|
3
|
+
* every tax/limit/benefit number the engine applies. Surfaced in the UI so a
|
|
4
|
+
* user can see where the assumptions come from and verify any that matter.
|
|
5
|
+
*
|
|
6
|
+
* This is a human-maintained summary that travels with the data pack — refresh
|
|
7
|
+
* it in the same annual data-only PR that bumps `data/year<YYYY>.ts`. The
|
|
8
|
+
* concise `figures` strings should track the current pack's values.
|
|
9
|
+
*
|
|
10
|
+
* Full per-figure detail and additional citations: DOCS/domain/domain-rules-reference.md.
|
|
11
|
+
*/
|
|
12
|
+
/**
|
|
13
|
+
* One entry per logical assumption group. Order is roughly the order figures
|
|
14
|
+
* appear in a projection (income tax → gains → SS → limits → RMDs → Medicare →
|
|
15
|
+
* SS benefits → ACA → state).
|
|
16
|
+
*/
|
|
17
|
+
export const PARAMETER_PROVENANCE = [
|
|
18
|
+
{
|
|
19
|
+
id: 'federal-brackets',
|
|
20
|
+
label: 'Federal income tax brackets & standard deduction',
|
|
21
|
+
figures: 'Seven brackets, 10%–37%. Standard deduction $16,100 single / $32,200 joint; +$2,050 / $1,650 each at 65+.',
|
|
22
|
+
publisher: 'IRS / Tax Foundation',
|
|
23
|
+
url: 'https://taxfoundation.org/data/all/federal/2026-tax-brackets/',
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
id: 'senior-deduction',
|
|
27
|
+
label: 'Senior bonus deduction (OBBBA)',
|
|
28
|
+
figures: '$6,000 per person 65+, phasing out above $75,000 / $150,000 MAGI; temporary, expires after 2028.',
|
|
29
|
+
publisher: 'Bipartisan Policy Center / IRS',
|
|
30
|
+
url: 'https://bipartisanpolicy.org/explainer/2026-federal-income-tax-brackets-and-interactive-calculator/',
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
id: 'capital-gains-niit',
|
|
34
|
+
label: 'Long-term capital gains & NIIT',
|
|
35
|
+
figures: '0 / 15 / 20% gains (15% above $49,450 / $98,900; 20% above $545,500 / $613,700). 3.8% NIIT above $200,000 / $250,000 MAGI.',
|
|
36
|
+
publisher: 'Kiplinger / IRS',
|
|
37
|
+
url: 'https://www.kiplinger.com/taxes/irs-updates-capital-gains-tax-thresholds',
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
id: 'section-121-exclusion',
|
|
41
|
+
label: 'Home-sale gain exclusion (§121)',
|
|
42
|
+
figures: '$250,000 single / $500,000 joint of primary-residence gain excluded on sale (statutory since 1997, never indexed); depreciation after May 6, 1997 is not excludable.',
|
|
43
|
+
publisher: 'IRS Topic 701 / Publication 523',
|
|
44
|
+
url: 'https://www.irs.gov/taxtopics/tc701',
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
id: 'ss-benefit-taxation',
|
|
48
|
+
label: 'Social Security benefit taxation',
|
|
49
|
+
figures: 'Provisional-income thresholds: up to 50% taxable above $25,000 / $32,000, up to 85% above $34,000 / $44,000 (fixed by statute, never indexed).',
|
|
50
|
+
publisher: 'IRS Publication 915',
|
|
51
|
+
url: 'https://www.irs.gov/forms-pubs/about-publication-915',
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
id: 'contribution-limits',
|
|
55
|
+
label: 'Contribution limits',
|
|
56
|
+
figures: '401(k) $24,500 (+$8,000 at 50+, $11,250 ages 60–63); IRA $7,500 (+$1,100); HSA $4,400 self / $8,750 family (+$1,000 at 55+).',
|
|
57
|
+
publisher: 'IRS',
|
|
58
|
+
url: 'https://www.irs.gov/newsroom/401k-limit-increases-to-24500-for-2026-ira-limit-increases-to-7500',
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
id: 'rmd-qcd',
|
|
62
|
+
label: 'Required minimum distributions & QCD',
|
|
63
|
+
figures: 'IRS Uniform Lifetime Table (Pub 590-B, 2022+); RMDs begin at age 73–75 per SECURE 2.0; QCD exclusion limit $111,000.',
|
|
64
|
+
publisher: 'IRS Publication 590-B',
|
|
65
|
+
url: 'https://www.irs.gov/retirement-plans/retirement-plan-and-ira-required-minimum-distributions-faqs',
|
|
66
|
+
},
|
|
67
|
+
{
|
|
68
|
+
id: 'annuity-purchase',
|
|
69
|
+
label: 'Annuity purchase (exclusion ratio & QLAC)',
|
|
70
|
+
figures: 'Non-qualified exclusion ratio from IRS Pub 939 Table V expected-return multiples (life expectancy by age); QLAC premium cap $210,000 excluded from RMD balances (SECURE 2.0).',
|
|
71
|
+
publisher: 'IRS Publication 939 / SECURE 2.0 Act §202',
|
|
72
|
+
url: 'https://www.irs.gov/forms-pubs/about-publication-939',
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
id: 'hecm-plf',
|
|
76
|
+
label: 'HECM reverse-mortgage principal limit',
|
|
77
|
+
figures: 'Principal-limit factors at a 5.875% expected rate: 35.1% of home value at 62 rising to 61.4% at 90 (planning default — a lender quote always wins); line/loan growth default 7.5%/yr (rate + 0.5% MIP).',
|
|
78
|
+
publisher: 'HUD HECM PLF tables (as summarized for 2026)',
|
|
79
|
+
url: 'https://reverse.mortgage/age-requirements',
|
|
80
|
+
},
|
|
81
|
+
{
|
|
82
|
+
id: 'medicare-irmaa',
|
|
83
|
+
label: 'Medicare Part B & IRMAA',
|
|
84
|
+
figures: 'Standard Part B $202.90/mo; five IRMAA tiers starting at $109,000 / $218,000 MAGI; Part D IRMAA surcharges $14.50-$91.00/mo.',
|
|
85
|
+
publisher: 'CMS',
|
|
86
|
+
url: 'https://www.cms.gov/newsroom/fact-sheets/2026-medicare-parts-b-premiums-deductibles',
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
id: 'social-security',
|
|
90
|
+
label: 'Social Security COLA & wage base',
|
|
91
|
+
figures: '2.8% COLA; taxable wage base $184,500; earnings-test exempt amounts $24,480 (pre-FRA) / $65,160 (FRA year); SSDI SGA $1,620/mo (non-blind); OASDI payroll tax 6.2% (employee).',
|
|
92
|
+
publisher: 'SSA',
|
|
93
|
+
url: 'https://www.ssa.gov/news/en/cola/factsheets/2026.html',
|
|
94
|
+
},
|
|
95
|
+
{
|
|
96
|
+
id: 'federal-poverty-line',
|
|
97
|
+
label: 'Federal poverty guideline (ACA)',
|
|
98
|
+
figures: '2025 HHS guideline — $15,650 first person, +$5,500 each additional — applied to the 2026 ACA coverage year.',
|
|
99
|
+
publisher: 'HHS',
|
|
100
|
+
url: 'https://aspe.hhs.gov/topics/poverty-economic-mobility/poverty-guidelines',
|
|
101
|
+
},
|
|
102
|
+
{
|
|
103
|
+
id: 'aca-ptc',
|
|
104
|
+
label: 'ACA premium tax credit',
|
|
105
|
+
figures: 'Applicable-percentage schedule per Rev. Proc. 2025-25 (2.10% under 133% FPL up to 9.96% at 300–400%), with the 400% FPL subsidy cliff restored (enhanced credits expired 12/31/2025).',
|
|
106
|
+
publisher: 'IRS',
|
|
107
|
+
url: 'https://www.irs.gov/pub/irs-drop/rp-25-25.pdf',
|
|
108
|
+
},
|
|
109
|
+
{
|
|
110
|
+
id: 'real-yield-curve',
|
|
111
|
+
label: 'TIPS real-yield curve (income floor & bridge)',
|
|
112
|
+
figures: 'Par real yields as of 2026-06-30: 1.85% (5y), 2.05% (7y), 2.25% (10y), 2.55% (20y), 2.70% (30y). Prices TIPS-ladder quotes and the funded-ratio discounting; refreshed annually with the parameter packs.',
|
|
113
|
+
publisher: 'U.S. Treasury',
|
|
114
|
+
url: 'https://home.treasury.gov/resource-center/data-chart-center/interest-rates',
|
|
115
|
+
},
|
|
116
|
+
{
|
|
117
|
+
id: 'state-income-tax',
|
|
118
|
+
label: 'State income tax',
|
|
119
|
+
figures: 'Brackets, standard deduction, Social Security treatment, and major retirement-income exclusions for all 50 states + DC, from each state revenue department.',
|
|
120
|
+
publisher: 'Tax Foundation / state revenue departments',
|
|
121
|
+
url: 'https://taxfoundation.org/data/all/state/state-income-tax-rates/',
|
|
122
|
+
},
|
|
123
|
+
];
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* State income tax pack — all 50 states + DC ("big levers", V5 PR B).
|
|
3
|
+
*
|
|
4
|
+
* Transcribed from the cited per-state research docs in
|
|
5
|
+
* DOCS/domain/state-tax-research/ (see each <CODE>.md for sources and the
|
|
6
|
+
* simplifications each state's mapping makes). Values are latest-published
|
|
7
|
+
* (≈2025) individual-income-tax figures; like the federal pack, nominal
|
|
8
|
+
* brackets are carried forward for future years (bracket creep modeled).
|
|
9
|
+
*
|
|
10
|
+
* State taxable income in the engine starts from gross ordinary income (plus
|
|
11
|
+
* gains, plus the federally taxable SS amount where the state taxes SS), minus
|
|
12
|
+
* the retirement exclusion and the standard deduction below. For states that
|
|
13
|
+
* tax *federal taxable income* and have no separate deduction (e.g. CO), the
|
|
14
|
+
* standard deduction is set to the federal-equivalent so the gross→taxable
|
|
15
|
+
* conversion matches; noted inline.
|
|
16
|
+
*/
|
|
17
|
+
import type { StateTaxPack } from '../types.js';
|
|
18
|
+
export declare const stateYear2026: StateTaxPack;
|