Calculation catalog › Cash flow and summary

Spending required requested annual

Essential spending floor requested for the projection year.

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

Appears in: csv (requiredSpending); results-table (Required column (layered spending))

Calculation records

  • Annual required-layer requested spending Composition record, justified by derivation

    Purpose: The must-fund layer a guardrail policy never cuts below, including goals it skipped.

    Statement: projection/internal/annualExpenseSummary.ts#annualExpenseSummary publishes YearExpenses.requiredSpending as requiredSpendingBase + skippedRequiredNominal, where requiredSpendingBase = systemRequired + requiredLifestyle + requiredGoalsFunded. systemRequired is the five system-computed costs the caller has already folded: debt service, property costs, healthcare, insurance premiums and net long-term care, the last being gross care cost less the LTC policy benefit. A required-classified goal the flexible-goal scheduler skipped stays in this layer as intended spending that never happened. Units: nominal USD per year. Rounding: none.

    Formula: requiredSpending = (systemRequired + requiredLifestyle + requiredGoalsFunded) + skippedRequiredNominal; systemRequired = debtService + propertyCosts + healthcare + insurancePremiums + careCost - ltcBenefit

    • systemRequired: The five system-computed costs, net of the LTC benefit (unit: usd/year) (domain: nonnegative in practice)
    • requiredLifestyle: Required-floor lifestyle layer (unit: usd/year) (domain: nonnegative)
    • requiredGoalsFunded: Required-classified goals funded this year (unit: usd/year) (domain: nonnegative)
    • skippedRequiredNominal: Nominal amount of required-classified goals the scheduler skipped (unit: usd/year) (domain: nonnegative; 0 outside guardrails)

    Timing: once per projection year, at the expense summary

    Rounding: none

    Limits:

    • Asserted at the annualExpenseSummary seam, which is the function that computes the field, because the worksheet states its inputs as already-folded year-row components: a real plan cannot present a chosen debt service, property cost, healthcare charge, care cost, LTC benefit and skipped-goal amount simultaneously at those exact values. The five system costs enter the seam as the systemRequired scalar the caller folds, so the test folds them the way the caller does and asserts the published field against the worksheet
    • The net-LTC term is gross care cost less the benefit; adding the gross without the offset is one of the worksheet's wrong readings
    • The layer summaries are not additional members of expenses.total; this figure describes how baseSpending was built

    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: spending-required-requested-annual.md Mutation receipt: spending-required-requested-annual.mutation.md

    Evidence tests: annualExpenseSummary.evidence.test.ts

    Implemented in: annualExpenseSummary.ts

    Is the number of: spending-required-requested-annual

    Feeds: spending-required-shortfall-annual

Records that feed this number

  • Lifestyle required discretionary split Formula record, justified by derivation

    Purpose: Partition lifestyle spending into a clamped required floor and discretionary remainder.

    Statement: spending/layers.ts#splitLifestyle splits nominal annual lifestyle spending B into required R = min(max(required,0),max(B,0)) and discretionary D = max(B,0)-R, preserving dollars and clamping the floor to the target; no rounding is stated.

    Formula: R = min(max(required,0), max(B,0)); D = max(B,0) - R

    • B: Lifestyle target (unit: nominal USD/year) (domain: finite >= 0)
    • required: Requested required floor (unit: nominal USD/year) (domain: finite)

    Timing: annual lifestyle partition

    Rounding: none

    Limits:

    • The lifestyle-only partition feeds projection/internal/annualLifestyleLayers.ts; published requested spending also includes system costs and goals, so neither requested family is this helper alone.

    Provenance: derived by codex, implemented by codex.

    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: lifestyle-required-discretionary-split.md Mutation receipt: lifestyle-required-discretionary-split.mutation.md

    Evidence tests: layers.evidence.test.ts

    Implemented in: layers.ts

    Feeds: spending-required-requested-annual, spending-target-requested-annual

Engine source: engine/src/projection/internal/types/result.ts (YearResult.expenses.requiredSpending)

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.