Calculation catalog › Cash flow and summary

Spending insurance premiums annual

Insurance premiums charged as expenses during the projection year.

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

Appears in: csv (insurancePremiums); chart (Spending by category "Insurance premiums"); cash-flow-drilldown (insurancePremium use line)

Calculation records

  • Annual level insurance premiums Formula record, justified by derivation

    Purpose: Which insurance policies are charged this year, and at what level nominal premium.

    Statement: projection/internal/types/yearLedger.ts#YearExpenses.insurancePremiums, selected by projection/internal/annualInsurancePremiumRows.ts#annualInsurancePremiumRows, sums the fixed-nominal annualPremium of every policy whose subject is alive: lifetime charges every year, paidUp charges nothing, and untilAge charges only while the subject's attained age is below premiumEndAge, so nothing is charged in the year the subject attains premiumEndAge or afterward. No inflation factor is applied. Units: nominal USD per year. Rounding: none.

    Formula: insurancePremiums = sum over charged policies of annualPremium

    • annualPremium: Level contractual premium (unit: usd/year) (domain: nonnegative)
    • premiumMode: lifetime | paidUp | untilAge (unit: mode) (domain: closed enum)
    • premiumEndAge: Subject age at which untilAge premiums stop (unit: years) (domain: required for untilAge)

    Timing: once per projection year, per policy occurrence in plan order

    Rounding: none

    Limits:

    • Asserted at the exported phase function with the worksheet's five policies (the primary case's four and the boundary case's Life E), their modes, premiums, subject ages and end ages verbatim; the subject resolver supplies the stated ages and alive flags. Plan assumptions beyond the worksheet's inputs: each policy carries zero benefit fields, which the premium selection does not read
    • The first derivation read untilAge as charging through and including premiumEndAge, charged its Life C at attained age 65 against an end age of 65, and expected 1,800; that derivation was corrected on 2026-09-18 under decision D-PREMIUM-END-AGE. The worksheet now states the strict stop age production holds: a policy is skipped once subject.ageAttained >= policy.premiumEndAge, so its primary case totals 1,200 with Life C not charged, and its boundary case charges Life E 600 at attained age 64, one year below the same end age. Both are asserted, the 1,800 through-the-end-age reading is asserted as a wrong reading, and no production-versus-worksheet discrepancy remains. Decision D-PREMIUM-END-AGE (2026-09-25) kept this rule, since premiumEndAge is the field a user fills as the age premiums stop; the premiumModeSchema comment, which once read "charge annualPremium through premiumEndAge", now states the same stop age

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

    Evidence tests: annualInsurancePremiumRows.evidence.test.ts

    Implemented in: yearLedger.ts; annualInsurancePremiumRows.ts

    Is the number of: spending-insurance-premiums-annual

    Feeds: spending-total-annual

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

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.