Calculation catalog › Social Security
Survivor scenario row estate delta
Change in ending after-tax estate, for one death timing, from adding Roth conversions that fill the 12% bracket on top of the plan's own from the start year through the year of the first death; nominal at the timing's last year.
Field: Convert-early lever: after-tax estate change Unit: US dollars Basis: nominal dollars Computed by: UI-native Status: Complete chain
Appears in: survivor-page (Convert-early lever cell "±$X" after-tax estate, "in YEAR dollars", with its reason when the lever adds nothing)
Calculation records
-
Survivor convert-early lever Model record, justified by derivation
Purpose: Price, for one death timing, adding Roth conversions that fill the 12% bracket to the plan's own conversions through the year of the first death.
Statement: projection/survivorTransition.ts#survivorTransitionAnalysis runs each death timing twice through projection/simulate.ts#simulatePlan with the same death override and the plan's own SSA-44 setting: the base run, and the lever run with SimulateOptions.additionalBracketFill { bracketPct: 12, startYear: the start year, endYear: the death year }. In each window year the lever run's aggregate conversion target (projection/internal/annualAggregateRothConversionTargetPlan.ts#annualAggregateRothConversionTargetPlan) is the larger of the plan's own target and a fill of taxable income to the top of the 12% bracket for the year's filing status, both sized on the same state of the year, the fill capped first at the convertible traditional balance; outside the window, and in a year a named conversion action suppresses the aggregate strategy, the plan's own strategy runs unchanged. It publishes estateDelta, the lever run's ending after-tax estate minus the base run's, and lifetimeTaxDelta, the lever run's lifetime taxes and penalties minus the base run's, and, from the lever run's window rows (#leverYears), each window year's reason read from executed dollars (the ledger's rothConversion) against own (the plan's own target capped at the convertible balance) and the capped fill, in this order: named-conversions when a named conversion action suppressed the aggregate strategy, raised when it converted more than own, covered when it converted something and at least the fill, short when it converted less than the fill, and with no fill asked no-balance (no convertible balance), fill-limited (the fill's own sizing cut it to nothing) or no-room; with each year the ledger's own words (AdditionalBracketFillYear.fillNotes on a fill-limited year, and on any year ledgerNotes, the messages the ledger raised when it converted less than the year's target asked). raisedYears and coveredYears are the raised and covered years. Units: nominal dollars of the timing's last year (endYear) for the estate, an undiscounted sum of nominal dollars for the tax. Rounding: none.
Formula:
target(y) = max(own(y), min(fill12(y), convertible(y))) for y in [start, death year], own(y) otherwise; executed(y) = the lever run's rothConversion(y), which falls short of target(y) when the ledger cannot execute it; estateDelta = estate(lever) - estate(base); lifetimeTaxDelta = tax(lever) - tax(base)-
target(y): The lever run's aggregate conversion target for year y, what the lever asks for (unit: nominal USD) (domain: nonnegative) -
executed(y): The conversion the lever run's ledger executed in year y (YearResult.rothConversion): short of target(y) when a share cannot land, for instance 0 when the traditional balance's owner has no Roth account (worksheet case L-B, Roth IRA is Sam's) (unit: nominal USD) (domain: nonnegative) -
own(y): The plan's own aggregate conversion target for year y (its schedule amount, its own fill, or 0) (unit: nominal USD) (domain: nonnegative) -
fill12(y): The conversion that brings federal taxable income to the top of the 12% bracket for the year's filing status, sized on the same state of the year (unit: nominal USD) (domain: nonnegative) -
convertible(y): The traditional balance convertible in year y (unit: nominal USD) (domain: nonnegative) -
estate, tax: ProjectionSummary.endingAfterTaxEstate and .lifetimeTaxesAndPenalties of each run (unit: nominal USD) (domain: finite)
Timing: annual, the window from the start year through the year of the first death
Rounding: none
Limits:
- The window ends in the death year, the last joint return (26 U.S.C. 6013(a)(2)); a surviving spouse with a dependent child keeps joint rates for two more years (26 U.S.C. 2(a)), which the window does not extend into
- A year with a named conversion action converts only that action, so the lever adds nothing in it
- Marketplace years are priced as the ledger prices them: the added income moves a priced credit, and an unpriced year stays unpriced
- The estate change is in dollars of the timing's last year, which differs between the two people's tables; the tax change is an undiscounted sum of nominal dollars and carries every later year's knock-on (required distributions, IRMAA, the survivor's single brackets), not only the added conversions' tax
- The widows-penalty insight keeps its replacement patch (a 12% fill instead of the plan's strategy) because it fires only on plans that convert nothing, where replacing and adding coincide
- A fill the ledger cannot execute is reported, not repaired: when an owner of the traditional balance has no Roth account (a conversion lands only in the same person's own Roth), the owner's share of every conversion is skipped and the year reads short with the ledger's message; on example-couple Sam has no Roth account, so when Alex dies at 90 the lever is short in 2033 to 2041 and adds nothing, and opening a Roth IRA for Sam is the change that would let it convert
Provenance: derived by
claude, implemented byclaude.Independent review:
codexGates (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: survivor-convert-early-lever.md Mutation receipt: survivor-convert-early-lever.mutation.md
Evidence tests: survivorTransition.lever.evidence.test.ts
Implemented in: survivorTransition.ts; annualAggregateRothConversionTargetPlan.ts; annualAggregateRothConversionPhase.ts; simulate.ts
Is the number of: survivor-scenario-row-estate-delta, survivor-scenario-row-lifetime-tax-delta
-
Transformations
- projection/survivorTransition.ts#survivorTransitionAnalysis: estateDelta = the lever run's ProjectionSummary.endingAfterTaxEstate − the base run's, both with the timing's death override and the plan's own SSA-44 setting; the lever run is the plan as entered with SimulateOptions.additionalBracketFill { 12%, start year, death year }, which converts max(the plan's own target, a 12% fill capped at the convertible balance) in each window year.
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.