Trust · Methodology
This is the inspection hatch for the projection engine. It is written for people who read prospectuses — DIY investors doing their own diligence, and the advisors they check with. The most important thing to know is this: the AI is the interface, not the calculator. The assistant reads your situation and calls typed tools; a deterministic engine does the math. The rule of this page is simple — no claim without a number or a source — and where the engine stops, we say so, in the Limitations section at the end.
How it works
The assistant never does the arithmetic. It reads your situation, calls typed tools, and reports what they return. Every number on your screen comes out of a deterministic engine — the same inputs always produce the same outputs.
The whole household — people, accounts (401(k), IRA, Roth, HSA, 529, taxable, and more), income streams, expenses, goals, and liabilities — is a single plain-JSON state document that you own and can export at any time. Facts live there; the engine reads them.
Every projection echoes the assumptions it used — returns, volatility, inflation, tax year, marginal rates — in the same response as the result. Any number can be traced back to the inputs that produced it, and a follow-up question is one changed parameter away.
Projected numbers are always re-derived from inputs, never cached and served back. The state document holds facts, snapshots are immutable point-in-time records, and scenarios hold hypothetical deltas — none of them store a computed outcome that could go stale.
The return model
The default engine is closed-form — an analytical solution that reads percentiles straight off a lognormal return distribution, no simulation required. Monte Carlo is available for cases the analytical path can't express.
Returns are lognormal in both engines. The closed-form path uses the Kan & Zhou methodology to compute analytical percentiles directly — fully deterministic, with no randomness to seed. The Monte Carlo path draws monthly return factors from a lognormal distribution using a seeded pseudorandom generator, so a given seed reproduces the same set of simulated paths exactly. It runs 1,000 paths by default and reports the 10th / 25th / 50th / 75th / 90th percentiles; selection is nearest-path, so every reported value is an actually-simulated outcome, not an interpolation.
Inflation defaults to 2.5%, and every result is reported in both nominal (face-value future dollars) and real (constant purchasing power) terms. Real values are deflated with the Fisher relation, and the same inflation assumption is applied consistently across returns, contributions, and fees — so a real projection is internally coherent, not a nominal number with a rough haircut.
A balance is not what you get to spend. Projections can be converted to after-tax spendable values by account type: a pre-tax 401(k)/IRA is reduced by your marginal ordinary rate; Roth, HSA, and 529 balances pass through untaxed; a taxable brokerage is reduced by long-term capital-gains tax on its gain only — and because cost basis is fixed while the balance grows, the taxed gain fraction rises over time, exactly as it does in reality.
A full plan projects each account under its own allocation — a 401(k) and a cash savings account grow differently — and feeds the household's net monthly surplus (income minus expenses) back in as contributions. Accounts are then aggregated by summing matching percentiles: a perfectly-correlated (comonotonic) assumption that is deliberately conservative on the downside, and is stated in every response rather than buried.
Taxes
The federal engine is built from the IRS source tables for the current tax year and computes the whole return, not just a marginal rate. State tax is a deliberate, single-state depth-first choice — one state correctly rather than fifty approximately.
AGI, then deductions (standard, or itemized: SALT with its cap and phase-down, mortgage interest under the acquisition-debt cap for the loan's origination year, charitable, medical, casualty), then ordinary brackets, then preferential-rate stacking for long-term gains and qualified dividends, then NIIT, Additional Medicare, and AMT. Every component comes back — marginal rate, effective rate, and each line — not a single total. All five filing statuses. FICA is modeled too: Social Security 6.2% on the wage base, Medicare 1.45%, the 0.9% Additional Medicare Tax, and the 3.8% Net Investment Income Tax.
ISO exercises (the bargain element as an AMT preference when exercised and held, ordinary income on a disqualifying disposition), NQSO exercises, and RSU vests (FICA-subject supplemental W-2 income) are modeled explicitly — the cases that quietly break generic calculators.
Roth conversion analysis (the marginal cost of the converted slice, filling to a target bracket, the resulting RMD reduction, and a convert-now vs leave-in break-even), safe-harbor and underpayment estimation with suggested quarterly payments, and withdrawal tax by account type.
SECURE 2.0 start ages by birth year, the Uniform Lifetime and single-life tables, multi-IRA aggregation, the shortfall penalty, and multi-year projected RMD schedules.
New York only — New York State, New York City, and Yonkers, on full progressive brackets. For any other state the engine returns an explicit unsupported result rather than a silent zero. (See Limitations.)
Social Security
Benefits are computed from the actual PIA formula, with the claiming-age adjustments and household benefit types the SSA applies.
Scenarios
A scenario is a named, validated set of typed overrides against a base plan — retire at 60, save $500 more a month, assume different returns — not a re-typed spreadsheet.
The change you make is one of a fixed set of typed deltas — retirement age, monthly contribution, return or inflation assumption, tax rate, income or expense change, account balance, goal target — validated against the base plan. A change that points at nothing, or does nothing, surfaces as a warning rather than being silently dropped.
Comparing scenarios re-projects each entire plan server-side — never arithmetic on stale outputs. You get back an input diff (exactly what changed), an outcome diff (the percentile deltas against the base), and per-goal outcome deltas.
Each scenario carries a content hash of the base plan it was authored against, so a comparison run after the underlying plan has changed is caught and flagged — not reported as if it were still current.
Capital-market
assumptions
These are the built-in per-asset-class return and volatility assumptions. They are starting points — long-run historical averages, not a house forecast — and every one is a parameter you can replace with your own capital-market assumptions per projection.
Goals & the
household
A plan is more than a return curve. These pieces model the parts that decide whether the curve actually reaches the things you're saving for.
Validation
Tax figures are not typed from a blog post. Each year's brackets carry the IRS Revenue Procedure they came from, with the date they were verified against it — and the tests assert those citations are present.
Limitations
A projection tool that hides its edges is worse than useless. Here is what FinPlan does not model, or models with a known caveat. Read this section as carefully as the rest.
The only state module is New York — state, New York City, and Yonkers, for the current tax year. For any other state the engine returns an explicit "unsupported" result rather than a fake zero: the state line comes back unmodeled, not silently wrong. The federal numbers still hold.
The AMT engine (Form 6251, 26%/28% tiers, phased-out exemption, Form 8801 credit carryforward) folds long-term capital gains into the AMT base at ordinary rates rather than preserving their preferential treatment (Form 6251 Part III). In years with large long-term gains this overstates AMT — treat AMT output on gain-heavy years as an upper bound.
When household spending exceeds income, the engine funds the deficit as a proportional drawdown across accounts by balance, and does not tax that drawdown or apply a tax-aware withdrawal order (e.g. taxable before pre-tax before Roth). Contributions and terminal balances are taxed correctly; the deficit-funding path is the one place withdrawal tax is not yet applied.
The engine models income, payroll, and capital-gains tax during your lifetime. It does not model estate tax, gift tax, the step-up in basis at death, or any wealth-transfer planning.
The engine is built for the current tax year and its published tables. Projections that run past the last legislated year hold that year's law fixed in real terms — they do not predict future legislation. Social Security's forward bend points are the SSA's projected values, not yet-final figures.