Documentation

Assumptions & Methodology

How the Quidoku retirement cash-flow engine works: default assumptions, calculation sequence, and known simplifications. Intended for review alongside a specific scenario run.

1. Purpose and scope

The engine projects a two-person household year by year: portfolio balances by account type, Social Security, earned income, RMDs, optional Roth conversions, approximate federal tax and IRMAA, and withdrawals needed to fund a spending target. It reports ending balances, taxes, and any shortfall.

It is a deterministic scenario workbench, not a stochastic probability-of-success tool and not a full tax-return simulator. Results depend entirely on the inputs and the rules below.

2. Annual calculation sequence

For each calendar year in the projection horizon, the engine roughly follows this order:

  1. Ages and spend target — Person ages advance one year; real spend is scaled by the path (Smile or Flat) and inflated to nominal dollars.
  2. Social Security — Months of benefits for the year × COLA-adjusted monthly amount at the chosen claim age.
  3. Earned income — Optional gross earnings for that year (inputs for the first 10 projection years).
  4. Portfolio growth — Each account balance grows by the year’s return (default or override).
  5. RMDs — Owner RMDs from traditional IRAs (from RMD age) and inherited-IRA distributions (stretch or 10-year rule).
  6. Roth conversions — Optional conversions from traditional to Roth, capped by max conversion and (when enabled) an IRMAA-aware MAGI ceiling.
  7. Cash need — Nominal spend + IRMAA − (SS + RMDs + earned − estimated tax on that base).
  8. Additional withdrawals — Fill remaining need from taxable (approx. after-tax), then traditional, then Roth.
  9. Final tax & MAGI — Recompute ordinary income, taxable SS, AGI, federal tax, and a simple LTCG layer on taxable withdrawals; record MAGI for IRMAA lag.
  10. Ending balances — Store year results; shortfall is any unmet cash need after all withdrawals.
Withdrawal order is fixed: taxable brokerage first, then traditional IRAs, then Roth. RMDs are taken before discretionary withdrawals and conversions.

3. Social Security

Inputs

Full Retirement Age

FRA is derived from birth year: age 66 for birth years ≤ 1954; stepped months for 1955–1959; age 67 thereafter — matching the statutory schedule.

Early / delayed claiming

COLA

The claiming-age monthly benefit is inflated by a constant SS COLA rate (default 2.5% per year) for each year measured from the projection start year. The first projection year uses the real (today’s-dollar) claiming-age amount with no COLA yet applied.

There is no automatic COLA from “today” to start year. When that gap is small it is usually negligible; a future option is to inflate from an explicit valuation date to start year.

Partial first year

Benefits begin in the claim year/month. Months paid in that calendar year are 12 − claim_month + 1; later years pay 12 months; earlier years pay 0.

Plan start / ages

Retirement start year and month is the first month income is needed (shared by both people). If start month > 1, year-1 spending is prorated by remaining months in the calendar year. The plan end year runs through December 31. Ages used for RMDs, the smile path, and conversion stop are year-end ages derived from birth year/month.

4. Accounts, growth, and withdrawals

Each person has up to four buckets: taxable brokerage, traditional IRA, Roth IRA, and inherited IRA. Growth is applied to ending balances from the prior step using that year’s portfolio return (single rate across all accounts unless overridden by year).

Funding spend beyond SS, RMDs, and earnings

  1. Taxable — Grossed up assuming ~8% effective drag (withdraw need / 0.92), modeling a rough blend of basis recovery and tax on gains.
  2. Traditional — Grossed up assuming ~25% marginal ordinary rate (need / 0.75) for extra withdrawals beyond RMDs.
  3. Roth — Dollar-for-dollar (no tax haircut in the model).

These haircuts are planning approximations, not a full basis/gain or bracket-by-bracket withdrawal optimizer.

5. Required minimum distributions

Owner traditional IRAs

RMDs begin at age 73 using the Uniform Lifetime Table factors embedded in the engine (e.g. 26.5 at 73, declining with age). Annual RMD = prior traditional balance ÷ factor. (The model does not currently switch the start age for later birth cohorts under SECURE 2.0’s age-75 path.)

Inherited IRAs

Inherited RMDs reduce the inherited balance and count as ordinary income like owner RMDs.

6. Roth conversions and IRMAA

Conversions

When enabled, the engine may convert traditional → Roth up to max conversion per year, stopping when the older spouse reaches the configured stop age. Conversions are taken from Person 1’s traditional first, then Person 2’s, and count as ordinary income in that year.

IRMAA-aware cap

If IRMAA modeling is on and either person will be 65+ within two years, the conversion amount can be limited so projected MAGI stays below the next IRMAA tier threshold (minus a small buffer). IRMAA itself uses MAGI from two years prior (standard Medicare lag), with tier brackets inflated annually by an IRMAA inflation factor (default 3%).

Part B and Part D surcharges in the default tier table are monthly amounts × 12 × number of Medicare enrollees in the household (ages ≥ 65).

7. Federal tax approximation

No state income tax, NIIT, AMT, qualified dividends detail, cost-basis tracking, or credit modeling. Brackets and deductions are illustrative defaults (aligned to recent MFJ levels in the UI) and should be updated when tax law or the planning year changes.

8. Spending path

Base spending is entered in today’s dollars. Each year it is multiplied by a path factor, then inflated by the general inflation rate from the start year.

Per-year spend mult overrides and return overrides replace the path/default for specific calendar years (including the built-in stress-test preset).

9. Default parameters

Values shipped in the UI / engine config (editable unless noted as hard-coded in code).

ParameterDefaultNotes
Portfolio return6.0% / yrSingle rate; per-year overrides allowed
Inflation3.2% / yrSpend and general nominal growth
SS COLA2.5% / yrHard-coded default in engine config from UI path
Bracket inflation2.8% / yrTax brackets, std. deduction, LTCG threshold
IRMAA tier inflation3.0% / yrApplied to IRMAA MAGI thresholds
Owner RMD startAge 73Uniform Lifetime factors in code
Max Roth conversion$50,000 / yrUI default; IRMAA may reduce
Stop conversionsOlder age 72UI default
Smile Go-Go1.10 to P1 age 72Editable
Smile Slow-Go0.85 to P1 age 82Editable
Smile No-Go1.15 afterEditable
Taxable withdrawal haircut~8% (÷0.92)Planning approximation
Trad. extra withdrawal haircut~25% (÷0.75)Planning approximation

Federal ordinary brackets, standard deduction, LTCG 0% threshold, and IRMAA Part B/D surcharge tiers are embedded as starting tables and inflated as described above. They should be treated as planning-year snapshots, not automatically current IRS/CMS figures for every future year.

10. Scenario files (JSON) and Excel export

Inputs can be saved and reloaded as local JSON files. Projection results can be exported as Excel (.xlsx). User scenario files stay on your device; the shipped base case is a static file on the site.

Site default inputs

Save / load inputs (JSON)

Excel export

11. Known limits and non-goals

Disclaimer

This engine and documentation are for education, illustration, and discussion only. They are not financial, tax, legal, or investment advice. Tax law, Medicare IRMAA brackets, RMD ages, and Social Security rules change; defaults may lag current law. Always verify material decisions with qualified professionals and primary sources (SSA, IRS, CMS, and your advisors).

No warranty is made as to accuracy or completeness. You are solely responsible for how you use the outputs.