Calculation catalog › Cash flow and summary

Spending property costs annual

Property taxes, maintenance, and other modeled property costs paid during the projection year.

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

Appears in: csv (propertyCosts); chart (Spending by category "Property tax + insurance"); cash-flow-drilldown (propertyCosts use line)

Calculation records

  • Annual property carrying costs on owned properties Formula record, justified by derivation

    Purpose: Property tax and homeowner insurance on every property still owned this year.

    Statement: projection/internal/types/yearLedger.ts#YearExpenses.propertyCosts, produced by projection/internal/annualPropertyCarryingCosts.ts#annualPropertyCarryingCosts, is the sum over property accounts that the household still owns of (propertyTaxAnnual + insuranceAnnual) x the cumulative general-inflation factor. A property contributes nothing from the year the ledger sells it onward: its planned sale year, or the projection start year when the planned year is earlier (projection/propertySaleYear.ts#effectivePropertySaleYear), the same year the sale itself runs. The charge continues after any mortgage is paid off, and no row is produced at all when nobody in the household is alive. Units: nominal USD per year. Rounding: none.

    Formula: propertyCosts = sum over owned p of (tax_p + insurance_p) x f

    • tax_p: Annual property tax, today dollars (unit: usd/year) (domain: nonnegative; absent = 0)
    • insurance_p: Annual homeowner insurance, today dollars (unit: usd/year) (domain: nonnegative; absent = 0)
    • f: Cumulative general-inflation factor to this year (unit: 1) (domain: positive)

    Timing: once per projection year, while the property is owned

    Rounding: none

    Limits:

    • Asserted at the exported phase helper with the worksheet's two properties, current year, inflation factor and alive flag verbatim; the helper receives the caller's already-resolved inflation factor, so the 1.10 is supplied rather than compounded from plan assumptions. Plan assumptions beyond the worksheet's inputs: each property carries a 400,000 value and no HECM, neither of which the carrying-cost formula reads
    • Ownership is decided by the effective sale year alone (the planned sale year, or the start year when that is earlier); a property with no sale year is owned for the whole horizon
    • Restated 2026-09-29 under decision D-2027-ROLLOVER (review H1). No source governs a sale date that has passed; the decision reads a property still on the plan with a past sale year as a sale not yet reflected, so the ledger sells it in the first year (when it has a value; a property at $0 is not sold) and the carrying costs stop from that same year. Before, the costs stopped from the planned year while the sale ran only in a year equal to it, which a later start never reaches: the reviewer's case (the example couple's $420,000 home, $6,000 of property tax and $1,800 of insurance, sale dated 2026, run from 2027) kept the home to the end and dropped its costs, adding $1,017,839 to ending net worth. The projection names the sale (projection/preStartEvents.ts#preStartEvents; for a property at $0 it says only that the costs stop) and the editor notes the field

    Provenance: derived by codex, implemented by claude.

    Independent review: grok

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

    Evidence tests: annualPropertyCarryingCosts.evidence.test.ts

    Implemented in: yearLedger.ts; annualPropertyCarryingCosts.ts; propertySaleYear.ts

    Is the number of: spending-property-costs-annual

    Feeds: spending-total-annual

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

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.