Calculation catalog › Social Security

Survivor scenario row lifetime tax delta

Lifetime taxes and penalties (undiscounted nominal sum) with the convert-early lever minus without it, for one death timing; the lever adds a 12%-bracket fill to the plan's own conversions through the year of the first death.

Field: Convert-early lifetime tax delta Unit: US dollars Basis: nominal dollars Computed by: UI-native Status: Complete chain

Appears in: survivor-page (Convert-early lever cell "(±$X lifetime tax)")

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 by claude.

    Independent review: codex

    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: 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: lifetimeTaxDelta = the lever run's ProjectionSummary.lifetimeTaxesAndPenalties − the base run's (the lever as for survivor-scenario-row-estate-delta); the sum carries every later year's knock-on, not only the added conversions' tax.

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.