Calculation catalog › Cash flow and summary
Spending care cost gross annual
Gross long-term-care cost incurred during the projection year before insurance benefits.
Field: careCost Unit: US dollars Basis: nominal dollars Computed by: Engine Status: Complete chain
Appears in: csv (careCost)
Calculation records
-
Annual gross care cost and the LTC benefit against it Model record, justified by derivation
Purpose: The two published sides of one long-term-care year: what care costs, and what a policy pays.
Statement: projection/internal/types/yearLedger.ts#YearExpenses.careCost and #YearExpenses.ltcBenefit, planned by projection/internal/annualDebtAndLongTermCare.ts#annualLongTermCarePlan, publish the two sides of one rule. An active episode (the person is alive and 0 <= ageAttained - startAge < durationYears) contributes annualCost x the health-inflation factor to gross care cost. Each LTC policy the same person owns pays min(remaining cost, cap), where cap = benefitMonthly x 12 x (1 + riderPct/100)^(year - startYear), multiplied in the episode's first year by max(0, 1 - eliminationPeriodDays/365); a policy whose benefitPeriodYears are already used pays nothing. Units: nominal USD per year. Rounding: none.
Formula:
careCost = sum_e cost_e f_h; cap_p = 12 b_p (1 + q_p)^(y - y0) [x (1 - d_p/365) in the first episode year]; ltcBenefit = sum of min(remaining, cap_p)-
cost_e: Episode annual cost, today dollars (unit: usd/year) (domain: nonnegative) -
f_h: Cumulative health-inflation factor (unit: 1) (domain: positive) -
b_p: Policy monthly benefit base (unit: usd/month) (domain: nonnegative) -
q_p: Inflation rider (unit: 1) (domain: inflationRiderPct / 100) -
d_p: Elimination period (unit: days) (domain: 0..365)
Timing: once per projection year, per episode then per owned policy in plan order
Rounding: none
Limits:
- Asserted at the exported phase helper with the worksheet's episode, both policies, the years-used map, the health-inflation factor and the start and current years verbatim. Plan assumptions beyond the worksheet's inputs: both policies are paid-up (premium 0), which this plan does not read, and the person resolver reports the stated attained age and alive
- The benefit is published gross of the expense fold; expenses.total subtracts it, so the same dollars are never counted twice
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-care-cost-gross-and-ltc-benefit-annual.md Mutation receipt: spending-care-cost-gross-and-ltc-benefit-annual.mutation.md
Evidence tests: annualDebtAndLongTermCare.evidence.test.ts
Implemented in: yearLedger.ts; annualDebtAndLongTermCare.ts
Is the number of: spending-care-cost-gross-annual, long-term-care-benefit-annual
Feeds: spending-total-annual
-
Records that feed this number
-
Per-person paid-care episode draw Model record, justified by derivation
Purpose: Zero or one late-life care event per person on a Monte Carlo path, so existing care-event offsets apply.
Statement: For each person, draw one uniform U in [0, 1). If U >= incidence, emit no event for that person. If U < incidence, onset age is max(currentAge, minOnsetAge + nextInt(span + 1)) with span = max(0, maxOnsetAge − minOnsetAge), duration is drawn from the weighted discrete table, and annualCost is the configured today's-dollar cost. At most one episode per person. The worksheet case incidence = 0.5, U = 0.75 emits the empty list. Units: a care-event list. Rounding: onset is an integer age.
Formula:
if U >= incidence then no event; else onset = max(currentAge, minOnset + nextInt(span + 1)), duration ~ weighted table, cost = annualCost-
incidence: Probability a person has a paid-care episode (unit: 1) (domain: [0, 1]) -
U: First uniform draw for that person (unit: 1) (domain: [0, 1)) -
annualCost: Today's-dollar annual care cost of a sampled episode (unit: usd/year) (domain: >= 0)
Timing: once per person per path, before the path ledger runs
Rounding: onset age is an integer; cost is not rounded
Limits:
- Defaults are planning approximations (HHS/ASPE incidence, Genworth-range cost) and do not predict individual need, local cost, or insurance eligibility
- Onset is clamped no earlier than current age so the spike lands in the future
- The comparison is U >= incidence (no event); reversing it to U > incidence is the worksheet's first wrong reading
- One draw per person, not one household draw per path
Provenance: derived by
codex, implemented bygrok.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: long-term-care-shock-sampling.md Mutation receipt: long-term-care-shock-sampling.mutation.md
Evidence tests: ltcShock.evidence.test.ts
Implemented in: ltcShock.ts
Feeds: spending-care-cost-gross-annual, long-term-care-benefit-annual, monte-carlo-success-rate, monte-carlo-ending-investable-histogram
-
Engine source: engine/src/projection/internal/types/result.ts
(YearResult.expenses.careCost)
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.