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:
Ages and spend target — Person ages advance one year; real spend is scaled by the path (Smile or Flat) and inflated to nominal dollars.
Social Security — Months of benefits for the year × COLA-adjusted monthly amount at the chosen claim age.
Earned income — Optional gross earnings for that year (inputs for the first 10 projection years).
Portfolio growth — Each account balance grows by the year’s return (default or override).
RMDs — Owner RMDs from traditional IRAs (from RMD age) and inherited-IRA distributions (stretch or 10-year rule).
Roth conversions — Optional conversions from traditional to Roth, capped by max conversion and (when enabled) an IRMAA-aware MAGI ceiling.
Cash need — Nominal spend + IRMAA − (SS + RMDs + earned − estimated tax on that base).
Additional withdrawals — Fill remaining need from taxable (approx. after-tax), then traditional, then Roth.
Final tax & MAGI — Recompute ordinary income, taxable SS, AGI, federal tax, and a simple LTCG layer on taxable withdrawals; record MAGI for IRMAA lag.
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
Monthly FRA benefit in today’s dollars (as provided by SSA estimators / statements in current dollars).
Birth year and month per person (also used for FRA and ages elsewhere).
Claim year and month per person — claim age is derived (shown in the UI as years + months).
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
Early: 5/9 of 1% per month for the first 36 months before FRA; 5/12 of 1% per month thereafter.
Delayed: 2/3 of 1% per month after FRA, through age 70.
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
Taxable — Grossed up assuming ~8% effective drag (withdraw need / 0.92), modeling a rough blend of basis recovery and tax on gains.
Traditional — Grossed up assuming ~25% marginal ordinary rate (need / 0.75) for extra withdrawals beyond RMDs.
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
Pre-SECURE (stretch): Life-expectancy style divisor starting from a base factor (default 30.6 in the year after inheritance), declining by 1 each year.
Post-SECURE (10-year): Remaining balance is spread over the years left through year 10 after inheritance (simplified equal remaining-year draw; not a full “no RMD until year 10” eligible-designated-beneficiary ruleset).
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
Ordinary income — RMDs + conversions + extra traditional withdrawals + earned income.
Taxable Social Security — Standard combined-income formula (up to 50% / 85% inclusion) using base thresholds consistent with married-filing-jointly planning defaults in the UI.
AGI — Ordinary + taxable SS + a portion of taxable-account withdrawals treated as gain.
Standard deduction — Starting value inflated each year by bracket inflation.
Ordinary tax — Applied to taxable income through a MFJ-style bracket schedule that is inflated annually.
LTCG layer — Simplified: a fraction of taxable withdrawals is taxed at 15% if AGI is above the 0% LTCG threshold (also inflated).
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.
Flat — multiplier 1.0 every year.
Smile — Go-Go / Slow-Go / No-Go multipliers by Person 1’s age (defaults: 1.10 through age 72, 0.85 through 82, 1.15 thereafter). Age cutoffs and multipliers are editable.
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).
Parameter
Default
Notes
Portfolio return
6.0% / yr
Single rate; per-year overrides allowed
Inflation
3.2% / yr
Spend and general nominal growth
SS COLA
2.5% / yr
Hard-coded default in engine config from UI path
Bracket inflation
2.8% / yr
Tax brackets, std. deduction, LTCG threshold
IRMAA tier inflation
3.0% / yr
Applied to IRMAA MAGI thresholds
Owner RMD start
Age 73
Uniform Lifetime factors in code
Max Roth conversion
$50,000 / yr
UI default; IRMAA may reduce
Stop conversions
Older age 72
UI default
Smile Go-Go
1.10 to P1 age 72
Editable
Smile Slow-Go
0.85 to P1 age 82
Editable
Smile No-Go
1.15 after
Editable
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
On first load, the engine fetches default_inputs.json (same schema as Save/Load) and applies it before the first projection run.
If that file is missing or invalid, the page falls back to values embedded in the HTML form.
To change the shipped base case, edit or replace default_inputs.json (e.g. with a file from Save inputs) — no HTML edit required.
Save / load inputs (JSON)
Save inputs downloads a versioned JSON file containing all form fields that affect a run (horizon, accounts, economics, SS, conversions, earned income, and overrides).
Load inputs reads a file you choose, restores those fields, and automatically re-runs the projection.
You must save a file first (or receive one from someone else) before load is useful for a custom scenario — the site does not store user scenarios in the browser or in the cloud.
Files declare format: "quidoku_retirement_inputs" and version: 1. Wrong format or unsupported version is rejected. Extra unknown keys inside a valid file are ignored so older and newer builds can interoperate when fields are added later.
Filenames follow: {prefix}_inputs_{start}_{end}_{yyyy-mm-dd_hh-mm-ss}.json (same file prefix control as Excel).
Excel export
Exports a workbook with two sheets: Summary (the on-screen year-by-year table) and Detail (full engine fields: SS by person, withdrawal sources, tax components, per-account ending balances, shortfall, net cash, return and spend multipliers).
No state tax, NIIT, AMT, or detailed capital-gain lot tracking.
No Social Security taxation nuances beyond the standard combined-income inclusion formula.
No survivor benefits, spousal SS claiming strategies, or pension modules.
Inherited IRA post-SECURE handling is simplified (not a full eligible-designated-beneficiary rules engine).
Owner RMD age is fixed at 73 in code (no automatic shift to 75 for later cohorts).
One portfolio return rate per year across all accounts (no asset-class mix).
No Monte Carlo / sequence-of-returns probability of success (stress overrides are deterministic).
Computation runs in the browser; this documentation does not make the model “advice” or a substitute for professional planning software.
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.