Calculation catalog › Cash flow and summary
Income wages annual
Employment wages modeled for a projection year.
Field: Wages Unit: US dollars Basis: nominal dollars Computed by: Engine Status: Complete chain
Appears in: chart (wages); csv (wages); scenarios-page (Lifetime income "Wages"); cash-flow-drilldown (wages source line)
Calculation records
-
Annual wage income for one stream Formula record, justified by derivation
Purpose: What a wage stream pays in a projection year, after real raises and inflation.
Statement: projection/internal/wageIncomeStreams.ts#wageIncomeStreams emits one row per wage stream that pays this year, in plan.incomes order, with amount = annualGross x (1 + realGrowthPct/100)^(year - startYear) x inflFactor, computed in that operand order; annualIncomeSetup folds those rows into the published projection/internal/types/result.ts#YearResult.incomes.wages. A stream is skipped when its owner is not alive, or when the owner has attained the stream's stop age: endAge when the stream names one, else the person's retirementAge, and neither when both are null. Wages run before Social Security because pass 3's earnings test reads the per-person wage totals. Units: nominal USD per year. Rounding: none.
Formula:
wages = annualGross * (1 + realGrowthPct/100)^(year - startYear) * inflFactor-
annualGross: Gross wage at the projection start year (unit: usd/year) (domain: nonnegative) -
realGrowthPct: Annual real raise, in percent (unit: percent/year) (domain: absent reads as 0) -
year - startYear: Elapsed projection years, computed operand for operand at the phase (unit: years) (domain: integer at or above 0) -
inflFactor: Cumulative general-inflation factor from the projection start year (unit: 1) (domain: positive) -
stopAge: endAge when present, else the person's retirementAge (unit: attained age) (domain: either may be null; attaining it stops the row)
Timing: income pass 1, once per projection year, before Social Security
Rounding: none
Limits:
- Asserted on a real simulatePlan run over 2028-2030. Plan assumptions beyond the worksheet's inputs: a single person filing single in KY with a zero state rate, no accounts, and the worksheet's 1.08 cumulative inflation factor supplied as a per-year inflation path of 8 percent in the first projection year and 0 afterwards, because a single constant rate cannot give a two-year cumulative factor of exactly 1.08
- The stop age is attained-age based: a stream with endAge 65 pays at attained age 64 and stops at 65, so the worksheet's paying year is the last one before the stop
- The engine preserves plan order across wage rows rather than pre-summing them, so the last binary digit of a multi-row wage total depends on that order; the test asserts a single row
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: income-wages-annual.md Mutation receipt: income-wages-annual.mutation.md
Evidence tests: wageIncomeStreams.evidence.test.ts
Implemented in: wageIncomeStreams.ts; result.ts
Is the number of: income-wages-annual
-
Engine source: engine/src/projection/internal/types/result.ts
(YearResult.incomes.wages)
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.