Calculation catalog › Cash flow and summary
Display FI target annual
Financial-independence portfolio target plotted in the same year and dollar basis as account balances.
Field: Displayed FI target Unit: US dollars Basis: as displayed Computed by: UI transformation Status: Complete chain
Appears in: chart (fiTarget)
Calculation records
-
Today's dollars by the ledger's own inflation factor Formula record, justified by derivation
Purpose: How a year's nominal amount becomes start-year dollars on every page, and how a start-year figure such as the FI target is placed in a year's dollars.
Statement: projection/dollarBasis.ts converts a nominal amount x of projection year y to start-year dollars as x / f(y), and a start-year amount to year-y dollars as x * f(y), where f(y) is the ledger's published YearResult.inflationScale: the left-to-right product of (1 + inflationPct/100) taken y - startYear times from 1, exactly 1 in the start year. projectionDollarBasis reads the factors from a projection's rows; planDollarBasis runs the same recurrence for a page that holds no projection rows and is bit-identical to a deterministic run's factors. nominalForDisplay shows a nominal amount in the page's mode (converted in today's-dollar mode, unchanged in nominal mode) and todayForDisplay shows a start-year amount (unchanged in today's-dollar mode, times f(y) in nominal mode), so the FI target line is fiNumber itself in today's-dollar mode and fiNumber * f(y) in nominal mode. A year outside the projection, or a fractional year, is refused. Units: USD. Rounding: none.
Formula:
f(s) = 1; f(y) = f(y - 1) * (1 + i/100); today(y, x) = x / f(y); nominal(y, x) = x * f(y); FI target in year y = fiNumber (today mode) or fiNumber * f(y) (nominal mode)-
i: General inflation rate, plan.assumptions.inflationPct (unit: percent per year) (domain: finite, above -100) -
s: Projection start year, the first ledger row (unit: calendar year) (domain: integer) -
y: Year of the amount (unit: calendar year) (domain: integer in [s, endYear]) -
x: Amount converted (unit: usd) (domain: finite) -
f(y): Cumulative general-inflation factor, YearResult.inflationScale (unit: ratio) (domain: f(s) = 1)
Timing: annual; one factor per calendar year, applied to every amount of that year
Rounding: none
Limits:
- planDollarBasis is the plan's assumed rate and matches only a deterministic run: a Monte Carlo path grows by its own inflation series, so its rows are converted with projectionDollarBasis on that path's own result
- Start-year dollars in whole-year steps: an amount paid in December and one paid in January of the same year carry the same factor
- General inflation only: the healthcare inflation premium and the Social Security cost-of-living adjustment are separate assumptions and are never the basis
- Years outside the projection are refused, never extrapolated; a projection whose horizon ends before its start year has an empty basis in which every year is refused
- Owner decision R19 (2026-09-25): the planner pages used to compound the plan's rate with Math.pow from the page's start year. The ledger's factor is a product built one year at a time, which differs from the power in the last binary digit in some years (21 of 41 years at 2.5 percent, one unit each), so a whole-dollar figure can change only on an exact half-dollar tie; the FI target in today's-dollar mode becomes exactly fiNumber instead of fiNumber * f / f
- The FI target is recorded here rather than in a record of its own: it is projection-summary-fi-number placed in a year through todayForDisplay
- Since B2-P1 slice 2 the spending page converts nothing itself: each published withdrawal rule's ending estate is converted by that rule's own run (decisions/swrComparator.ts#compareSwrRules publishes endingAfterTaxEstateTodayDollars), and the solver's evidence estate by the answer run's own factors; planDollarBasis remains for the relocation page
Provenance: derived by
claude, implemented byclaude-subagent.Independent review:
codexGates (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: display-dollar-basis-conversion.md Mutation receipt: display-dollar-basis-conversion.mutation.md
Evidence tests: swrComparator.evidence.test.ts; dollarBasis.evidence.test.ts
Implemented in: dollarBasis.ts; detectorProjection.ts; result.ts; swrComparator.ts
Is the number of: display-dollar-basis-conversion, display-fi-target-annual
Feeds: display-balance-by-category-annual, display-net-care-cost-annual, display-tax-free-gains-room-annual, display-tax-plus-penalties-annual, display-total-spending-annual, display-upside-shortfall-annual, display-upside-spending-annual
-
Records that feed this number
-
Projection summary fi number Composition record, justified by derivation
Purpose: Price one selected year of gross outflows against the safe-withdrawal-rate lens.
Statement: projection/compare.ts#summarizeProjection publishes the FI number in projection-start-year dollars as one selected year's nominal funded expenses plus tax and penalties, discretely deflated by general inflation, divided by the safe-withdrawal-rate decimal; an empty ledger instead divides base annual lifestyle spending alone by that rate. The year is the household's later retirement, and when the plan converts to Roth in any year that year's figures come from the plan run without its conversions (projection-summary-fi-spending-base).
Formula:
fiNumber = ((expenses.total + tax + penalties) / (1 + inflationPct/100)^(spendingYear - startYear)) / (safeWithdrawalRatePct / 100); empty ledger: baseAnnual / (safeWithdrawalRatePct / 100)-
spendingYear: max(startYear, the household's later retirement year), else the first ledger year (unit: calendar year) (domain: integer) -
expenses.total: Published funded spending after guardrails (unit: nominal USD) (domain: nonnegative) -
safeWithdrawalRatePct: Safe-withdrawal-rate lens, default 4 (unit: percent/year) (domain: positive)
Timing: one selected calendar year, deflated to the projection start year
Rounding: none; no intermediate rounding or floor
Limits:
- Gross outflows, not net portfolio need: guaranteed income is not subtracted, and published funded expenses.total is used rather than intended spending, so guardrail cuts are already in the base. Deflation is discrete annual general inflation, never the healthcare extra rate. The empty-ledger path is base lifestyle only, with no tax, penalties or deflation, and a horizon that ends before retirement prices the first ledger row rather than interpolating a retirement-year spend. The rate is a lens; the ledger does not spend at it.
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-fi-number.md Mutation receipt: projection-summary-fi-number.mutation.md
Evidence tests: compareSummary.evidence.test.ts
Implemented in: compare.ts
Is the number of: projection-summary-fi-number
Feeds: projection-summary-fi-age, projection-summary-coast-fire-number, display-fi-target-annual
-
Transformations
- In nominal mode, fiNumber times the ledger's inflation factor for the year; in today's-dollar mode, fiNumber unchanged (projection/dollarBasis.ts#todayForDisplay).
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.