Calculation catalog › Cash flow and summary

Projection result ending investable

Investable assets remaining at the end of the projection.

Field: endingInvestable Unit: US dollars Basis: nominal dollars Computed by: Engine Status: Complete chain

Appears in: compare-page (ending investable assets); report (headline-results block endingInvestable); scenarios-page (Headline "Ending investable assets")

Calculation records

  • Projection-result ending investable balance Composition record, justified by derivation

    Purpose: The terminal investable figure the whole-run result republishes from the last year row.

    Statement: projection/simulate.ts#simulatePlan publishes projection/internal/types/result.ts#ProjectionResult.endingInvestable as the last year row's investableTotal, or exactly 0 when the projection has no rows. It is a terminal copy: no asset the annual investable total excludes can enter through it, and no earlier row contributes. Units: nominal USD. Rounding: none.

    Formula: endingInvestable = years[years.length - 1].investableTotal, or 0 when years is empty

    • years: Ordered projection year rows (unit: rows) (domain: possibly empty)
    • investableTotal: That row's year-end investable total (unit: usd) (domain: nonnegative)

    Timing: once per projection, at the horizon

    Rounding: none

    Limits:

    • Asserted on a real two-year simulatePlan run whose 2030 row closes at the worksheet's $510,000 and whose 2031 row closes at the worksheet's $487,250.125. Plan assumptions beyond the worksheet's inputs: a single 55-year-old filing single in KY with a zero state rate, zero inflation, zero account return, no healthcare charge (the person is under 65, with a zero pre-65 premium), a single cash account, and one uninflated 2031 one-time goal sized to spend the difference between the two rows
    • The empty-row case cannot be reached through simulatePlan, which always produces at least one row for a living household; it is the publishing site's fallback as the field comment states it and a contract statement, not executed evidence

    Provenance: derived by codex, implemented by claude.

    Independent review: cursor

    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: projection-result-ending-investable.md Mutation receipt: projection-result-ending-investable.mutation.md

    Evidence tests: simulate.evidence.test.ts

    Implemented in: simulate.ts; result.ts

    Is the number of: projection-result-ending-investable

Records that feed this number

  • Annual investable total Composition record, justified by derivation

    Purpose: The year-end balance a plan can actually spend from, and what is deliberately left out.

    Statement: projection/internal/annualSnapshot.ts#annualSnapshot opens the investable fold at unassignedCash and adds every investable balance in simulator order (cash, taxable, equity-compensation, traditional, Roth and HSA accounts), publishing the sum as projection/internal/types/result.ts#YearResult.investableTotal. Property values, ordinary debts, HECM loans and permanent-life cash values are folded into their own separate totals and are not members; the TIPS ladder value is computed outside the snapshot and is likewise not a member. netWorth adds those channels. Units: nominal USD at year end. Rounding: none; the additions are left in their original loop order because regrouping binary floats can move the last bit.

    Formula: investableTotal = unassignedCash + sum over investable balances of balance

    • unassignedCash: Cash with no modeled account to land in; opens the fold (unit: usd) (domain: nonnegative)
    • balance: One investable account's year-end balance (unit: usd) (domain: nonnegative)
    • insuranceCashValueTotal, propertyTotal, debtTotal, ladderValue: Separate channels, excluded here (unit: usd) (domain: nonnegative; members of netWorth only)

    Timing: once per projection year, at the end-of-pass snapshot

    Rounding: none

    Limits:

    • The worksheet's case is asserted at annualSnapshot, the function that computes the field, because unassigned cash and a cash or taxable account cannot coexist in a real plan: simulatePlan only tracks cash as unassigned when there is no cash or taxable account for surplus to land in, so the worksheet's $2,000 of unassigned cash alongside $15,000 of cash accounts and $120,000 of taxable accounts is not a state a plan produces
    • The member list is separately asserted on a real simulatePlan run carrying the worksheet's six account balances plus a permanent-life policy: the published investableTotal is the six balances and excludes the policy cash value and the property, both of which the same row publishes
    • Equity compensation is a member whether or not it has vested; the vesting mode gates spending, not the balance total

    Provenance: derived by codex, implemented by claude.

    Independent review: cursor

    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: accounts-investable-total-annual.md Mutation receipt: accounts-investable-total-annual.mutation.md

    Evidence tests: annualSnapshot.evidence.test.ts

    Implemented in: annualSnapshot.ts; result.ts

    Is the number of: accounts-investable-total-annual

    Feeds: accounts-net-worth-annual, projection-result-ending-investable

Engine source: engine/src/projection/internal/types/result.ts (ProjectionResult.endingInvestable)

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.