Calculation catalog › Cash flow and summary

Long term care benefit annual

Long-term-care insurance benefit received during the projection year.

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

Appears in: csv (ltcBenefit)

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 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-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 by grok.

    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: 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.ltcBenefit)

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.