Calculation catalog › Insights
Insight spending headroom rough annual
Ending after-tax estate deflated to today, minus the bequest target, divided by the years remaining in the projection.
Field: Rough annual spending headroom Unit: US dollars Basis: today's dollars (real) Computed by: Engine Status: Complete chain
Appears in: insights (spending-headroom card rationale "end with roughly $X" and impact "≈ $Y/yr of rough headroom")
Calculation records
-
Rough real annual spending headroom from excess terminal estate Model record, justified by derivation
Purpose: A first-pass lifestyle amount: excess after-tax estate in today's dollars, spread across the remaining projection years.
Statement: For a nondepleting, non-ABW plan: endingEstateToday = deflate(endYear, endingAfterTaxEstate); excess = endingEstateToday − bequestTarget; roughHeadroom = excess / yearsRemaining. The card screens only when excess >= $250,000 and roughHeadroom >= $2,000. N = max(1, endYear − startYear) is the number of year boundaries between the projection start and end years (9 for 2026 through 2035), not the inclusive row count. Units: today's dollars per year. Rounding: the card publishes both figures as whole dollars (formatWholeUsd, Math.round); the quotient itself is not published.
Formula:
headroom = (deflate(endYear, endingAfterTaxEstate) − bequestTarget) / N-
endingAfterTaxEstate: Nominal ending after-tax estate at the horizon (unit: usd) (domain: finite) -
bequestTarget: Bequest target in today's dollars (0 when unset) (unit: usd) (domain: >= 0) -
N: Year boundaries between the start and end years, max(1, endYear − startYear) (unit: years) (domain: integer N >= 1)
Timing: straight-line over the remaining modeled years, before the full-projection solver
Rounding: the card publishes whole-dollar strings (formatWholeUsd, Math.round) and the evidence asserts the published figure; the quotient itself is not published
Limits:
- A cheap first-pass, not a claim that withdrawing this amount every year is sustainable
- The first derivation guessed an inclusive row count (10 for 2026 through 2035) because the comment stated no convention; the comment now states N = max(1, endYear − startYear) and the worksheet was re-derived on it (44,444.44, shown as $44,444)
Provenance: derived by
codex, implemented bygrok.Independent review:
cursorGates (6 of 6 pass): fixture registers a test: pass; pins resolve: pass; families exist: pass; worksheet exists: pass; mutation receipt exists: pass; provenance independent: pass
Worksheet: insight-spending-headroom-rough-annual.md Mutation receipt: insight-spending-headroom-rough-annual.mutation.md
Evidence tests: spendingHeadroom.evidence.test.ts
Implemented in: spendingHeadroom.ts
Is the number of: insight-spending-headroom-rough-annual
-
Records that feed this number
-
Projection summary ending after tax estate Composition record, justified by derivation
Purpose: Net the horizon estate of charity carve-outs and assumed heir income tax.
Statement: projection/compare.ts#summarizeProjection computes nominal ending after-tax estate as horizon net worth minus the amount passing to charity and minus the total assumed heir income tax on inherited pre-tax balances: endingAfterTaxEstate = endingNetWorth - endingEstateToCharity - endingEstateHeirTax.
Formula:
endingAfterTaxEstate = endingNetWorth - endingEstateToCharity - endingEstateHeirTax-
endingNetWorth: Horizon net worth (unit: nominal USD) (domain: finite) -
endingEstateToCharity: Amount passing to charity, untaxed (unit: nominal USD) (domain: nonnegative) -
endingEstateHeirTax: Assumed heir income tax on inherited pre-tax balances (unit: nominal USD) (domain: nonnegative)
Timing: projection horizon
Rounding: none stated
Limits:
- Charity carve-outs pass untaxed rather than remaining in the heirs' estate, so they are subtracted here even though they are also reported separately in endingEstateToCharity; with no charity destination the identity collapses to net worth minus heir tax. Ignoring charity, adding heir tax instead of subtracting it, or subtracting charity a second time through the heir tax each name a different quantity. The figure is assumed terminal exposure at the horizon, not a death-year return.
Provenance: derived by
codex, implemented byclaude.Independent review:
cursorGates (6 of 6 pass): fixture registers a test: pass; pins resolve: pass; families exist: pass; worksheet exists: pass; mutation receipt exists: pass; provenance independent: pass
Worksheet: projection-summary-ending-after-tax-estate.md Mutation receipt: projection-summary-ending-after-tax-estate.mutation.md
Evidence tests: compareSummary.evidence.test.ts
Implemented in: compare.ts
Is the number of: projection-summary-ending-after-tax-estate
Feeds: swr-rule-result-ending-after-tax-estate, scenario-comparison-cell, insight-spending-headroom-rough-annual
-
Engine source: engine/src/insights/detectors/spendingHeadroom.ts
(spendingHeadroom.screen (roughHeadroomPerYear, endingEstateToday))
The evidence links on this page (each record's worksheet, mutation receipt, evidence tests
and implementation, and the source links) are pinned to engine commit
2624dbdba9fd, committed 2026-10-11.
The live calculation index and
output-family census links point at the repository's main
branch, so you can check this snapshot against them.