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