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