Calculation catalog › Cash flow and summary

Display dollar basis conversion

Conversion of a nominal year amount to today's dollars, or back to nominal dollars for a chart.

Field: Today's-dollar display conversion Unit: US dollars Basis: nominal or real, as displayed Computed by: UI transformation Status: Complete chain

Appears in: results-table (today dollars toggle); results-headline (KpiBar and ResultsPage "in today's dollars" ending net worth, and the depletion sentence's floor-year income and uncovered gap); solver-page (Evidence ending after-tax estate today's dollars (deflator) and SWR rows); relocation-page (Ending after-tax estate (today's $) column, read from the engine row (RelocationCandidateRow.endingAfterTaxEstateTodayDollars)); cash-flow-drilldown (displayAmount applied to every line, node and reconciliation total); insights (DetectorProjection.deflate handed to each Insight for today's-dollar figures); chart (Every Results chart series through the DollarAdjuster); income-floor (FundedRatioReadout hands the basis to computeFundedRatio)

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 by claude-subagent.

    Independent review: codex

    Gates (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

Transformations

  • Divide a nominal year amount by the ledger's own YearResult.inflationScale for that year (today's dollars), or multiply a start-year amount by it (nominal dollars), through projection/dollarBasis.ts; the relocation page, which holds no projection rows, uses planDollarBasis, the same recurrence. The spending page's rule rows and evidence estate arrive converted by their own runs (SwrRuleResult.endingAfterTaxEstateTodayDollars; runSpendingSolveRequest).

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.