Calculation catalog › Optimizer and comparisons

SWR rule result lifetime taxes and penalties

Total taxes and penalties paid under a displayed safe-withdrawal rule.

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

Appears in: solver-page (withdrawal rule lifetime tax and penalties)

Calculation records

  • Swr rule lifetime taxes and penalties Composition record, justified by derivation

    Purpose: Republish the rule run's combined lifetime taxes and penalties.

    Statement: decisions/swrComparator.ts#compareSwrRules republishes the rule run's nominal ProjectionSummary.lifetimeTaxesAndPenalties as the taxes-and-penalties result for that constant-real spending rule, without another aggregation.

    Formula: SwrRuleResult.lifetimeTaxesAndPenalties = summary.lifetimeTaxesAndPenalties

    • summary.lifetimeTaxesAndPenalties: Rule-run lifetime taxes and penalties from the upstream summary (unit: nominal USD) (domain: finite)

    Timing: one completed rule run

    Rounding: none; copies the supplied summary value

    Limits:

    • The upstream summary already sums all annual taxes and penalties, so publishing tax alone, or adding the separately displayed penalty amount to the already combined figure, changes the published quantity. The worksheet's annual tax and penalty rows are supplied as a ProjectionResult literal at the simulate seam; the summary aggregation and the comparator's publication are the real functions.

    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: swr-rule-lifetime-taxes-and-penalties.md Mutation receipt: swr-rule-lifetime-taxes-and-penalties.mutation.md

    Evidence tests: swrComparator.evidence.test.ts

    Implemented in: swrComparator.ts

    Is the number of: swr-rule-result-lifetime-taxes-and-penalties

Records that feed this number

  • Projection summary lifetime taxes and penalties Composition record, justified by derivation

    Purpose: Sum annual tax and annual penalties over the whole projection.

    Statement: projection/compare.ts#summarizeProjection sums nominal YearResult.tax + YearResult.penalties across every projection year to publish lifetime taxes and penalties, with no stated rounding.

    Formula: L = sum over years y of (tax_y + penalties_y)

    • tax_y: Year y published tax (unit: nominal USD) (domain: nonnegative)
    • penalties_y: Year y published penalties, separate from tax (unit: nominal USD) (domain: nonnegative)

    Timing: every projection year

    Rounding: none stated

    Limits:

    • Penalties are a separate ledger field from tax, so summing taxes only, or adding penalties in the final year alone, understates the published figure. The valid domain is a finite projection-year sequence with finite annual dollar fields.

    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: projection-summary-lifetime-taxes-and-penalties.md Mutation receipt: projection-summary-lifetime-taxes-and-penalties.mutation.md

    Evidence tests: compareSummary.evidence.test.ts

    Implemented in: compare.ts

    Is the number of: projection-summary-lifetime-taxes-and-penalties

    Feeds: swr-rule-result-lifetime-taxes-and-penalties, scenario-comparison-cell

  • Swr rule rate and initial spend Model record, justified by derivation

    Purpose: Set initial spending from three published withdrawal-rate parameterizations.

    Statement: decisions/swrComparator.ts#compareSwrRules assigns Bengen 4.7%, Morningstar 3.9%, or ERN 1.75%+0.5(100/CAPE) and multiplies that percent by starting investable dollars to set constant-real initial annual spending before a same-plan ledger comparison.

    Formula: rates = (4.7,3.9,1.75+0.5*(100/CAPE)); initialSpend = startingInvestable * rate/100

    • CAPE: Cyclically adjusted price/earnings ratio (unit: 1) (domain: positive)
    • startingInvestable: Initial investable portfolio (unit: today USD) (domain: nonnegative)

    Timing: initial constant-real annual spending, before ledger comparison

    Rounding: none

    Limits:

    • Published rule parameterizations are planning lenses, not household safety guarantees. The worksheet pins rates and initial spending only; depletion, horizon, estate, and taxes come from the downstream ledger and are feeds.

    Provenance: derived by codex, implemented by codex.

    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: swr-rule-rate-and-initial-spend.md Mutation receipt: swr-rule-rate-and-initial-spend.mutation.md

    Evidence tests: swrComparator.evidence.test.ts

    Implemented in: swrComparator.ts

    Is the number of: swr-rule-result-initial-rate-pct, swr-rule-result-initial-annual-spend

    Feeds: swr-rule-result-depletion-year, swr-rule-result-end-year, swr-rule-result-ending-after-tax-estate, swr-rule-result-lifetime-taxes-and-penalties

Engine source: engine/src/decisions/swrComparator.ts (SwrRuleResult.lifetimeTaxesAndPenalties)

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.