Calculation catalog › Optimizer and comparisons
SWR rule result initial annual spend
First-year spending supported by a displayed safe-withdrawal rule.
Field: initialAnnualSpend Unit: US dollars Basis: nominal dollars Computed by: Engine Status: Complete chain
Appears in: solver-page (withdrawal rule initial annual spend)
Calculation records
-
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
-
Records that feed this number
-
Starting investable: sum of listed account balances Formula record, justified by derivation
Purpose: The dollar base the risk-based guardrail fractions and SWR initial spend apply to.
Statement: Sum current balances of accounts whose type is taxable, equityComp, traditional, Roth, HSA, or cash. Property (home) and other noninvestable types are excluded, including when they carry a value rather than a balance. For taxable $100,000, cash $20,000 and home/property $300,000 the sum is $120,000. Units: dollars. Rounding: none. Exact dollars.
Formula:
B = sum { balance(a) : type(a) in {taxable, equityComp, traditional, roth, hsa, cash} }-
a: A plan account (unit: account) (domain: finite nonnegative balances) -
B: Starting investable (unit: usd) (domain: >= 0)
Timing: once at the start of a solve, on today's balances
Rounding: none
Limits:
- The listed investable set is the same dollar base market paths can fund; property is excluded by type and because it stores value rather than balance
- Basis fields are not added; only the balance field of an investable account contributes
Provenance: derived by
codex, implemented bygrok.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: risk-based-starting-investable.md Mutation receipt: risk-based-starting-investable.mutation.md
Evidence tests: riskBasedGuardrails.evidence.test.ts
Implemented in: riskBasedGuardrails.ts
Feeds: display-guardrail-balance-thresholds, monte-carlo-success-rate, swr-rule-result-initial-annual-spend
-
Engine source: engine/src/decisions/swrComparator.ts
(SwrRuleResult.initialAnnualSpend)
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.