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 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: 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
-
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 bycodex.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: 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.