(Measured 2026-09-24. No engine version: this study reads a data series, not a plan.)
Five tools in this repository project Medicare premiums and IRMAA surcharges forward, and each one grows them a different way. Nobody decided that; it accumulated.
| tool | how it grows Medicare dollars | rate on defaults |
|---|---|---|
retirement_optimizer.html (via optimizer_core.js) |
cpi + inflation, compounded yearly |
5.8% |
Retirement_Projection.html |
TAXData.IRMAA.ANNUAL_INCREASE, its only live reader |
5.6% |
standalone/IncomeTaxPlanner.html |
its own slider, applied alone | 2.5% |
standalone/FutureCost.html |
its own two sliders, inflation + extra |
5.0% |
standalone/irmaa_and_rmds.html |
passes 1, deliberately no growth | none |
This report answers three questions, in the order they have to be answered:
Harness:
medicare_escalation_harness.js.
It loads neither the engine nor a household; the only repository file it reads is the CPI series
that the Monte Carlo tab already ships.
Everything below is written in these codes. None of them appear before this point.
g is the growth rate of the Part B standard premium in a year. cpi is the CPI-U rate. Each model
has one free parameter or none, so no model wins on flexibility.
| code | form | what it assumes | who computes it today |
|---|---|---|---|
| M1 | g = a |
premiums grow at a constant rate, unrelated to prices | ANNUAL_INCREASE; IncomeTaxPlanner |
| M2 | g = cpi + b |
premiums grow a constant amount faster than prices | Optimizer cpi + inflation; FutureCost |
| M3 | g = k * cpi |
premiums are a fixed multiple of price growth | nobody; included as the third shape |
| M4 | g = 0 |
premiums do not grow | irmaa_and_rmds, on purpose |
| TP | g(t) = gLong + (g0 - gLong) * d^t |
a near-term ramp converging on a long-run rate | nobody yet; this report’s recommendation |
M2 is the same model whether it is written as “a fixed rate above inflation” or as “cpi plus
inflation”. Both compute cpi + b. They differ only in where b comes from, so there are three
distinct shapes among the tools, not four.
| code | what it is |
|---|---|
| fit window | the trailing 5, 10 or 20 years of actual premiums, used to fit each model |
| RMSE(rate) | root mean squared error of predicted against actual annual growth. Answers “does this model describe the past?” |
| benchmark | the forward series each model is scored against: the Trustees’ own published premium path for 2027 to 2035, then their long-run Part B assumption of 3.8% out to 2056 |
| 30y total | total premium dollars one person pays over 30 years under the model, against the same total under the benchmark. Answers “does this model get a retirement right?” |
| RMSE(path) | root mean squared relative error of the yearly premium level against the benchmark |
RMSE(rate) and 30y total are different questions and they have different answers. A retirement projection does not need to reproduce 2016. It needs the dollars.
The premium for year t is announced in the autumn of t-1, and the hold-harmless cap is that year’s Social Security COLA, computed from CPI-W through the third quarter of t-1. So growth in year t is paired with CPI(t-1) throughout. Pairing it with CPI(t) would test a relationship that cannot exist.
All verified 2026-09-24.
| series | source |
|---|---|
| Part B standard premium, 2003 to 2026 | SSA POMS HI 01001.014, the “Base” row |
| Part B premium projected, 2027 to 2035 | 2026 Medicare Trustees Report, Table V.E2 |
| Part B long-run per-capita growth | 2026 Trustees: GDP per capita plus 0.1 to 0.3 points, about 3.8% |
| Part B aggregate spending, 2026 to 2030 | 2026 Trustees: 8.5% a year (CRFB analysis) |
| CPI-U, December over December | montecarlo/historical_returns.js, the repository’s own BLS series |
Twenty-three years of Part B standard premium growth beside the CPI that set it:
| year | premium | growth | CPI(t-1) | year | premium | growth | CPI(t-1) |
|---|---|---|---|---|---|---|---|
| 2004 | 66.60 | 13.46% | 1.90% | 2016 | 121.80 | 16.11% | 0.70% |
| 2005 | 78.20 | 17.42% | 3.30% | 2017 | 134.00 | 10.02% | 2.10% |
| 2006 | 88.50 | 13.17% | 3.40% | 2018 | 134.00 | 0.00% | 2.10% |
| 2007 | 93.50 | 5.65% | 2.50% | 2019 | 135.50 | 1.12% | 1.90% |
| 2008 | 96.40 | 3.10% | 4.10% | 2020 | 144.60 | 6.72% | 2.30% |
| 2009 | 96.40 | 0.00% | 0.10% | 2021 | 148.50 | 2.70% | 1.40% |
| 2010 | 110.50 | 14.63% | 2.70% | 2022 | 170.10 | 14.55% | 7.00% |
| 2011 | 115.40 | 4.43% | 1.50% | 2023 | 164.90 | -3.06% | 6.50% |
| 2012 | 99.90 | -13.43% | 3.00% | 2024 | 174.70 | 5.94% | 3.40% |
| 2013 | 104.90 | 5.01% | 1.70% | 2025 | 185.00 | 5.90% | 2.90% |
| 2014 | 104.90 | 0.00% | 1.50% | 2026 | 202.90 | 9.68% | 2.70% |
| 2015 | 104.90 | 0.00% | 0.80% |
| window | M1 fixed | M2 CPI + excess | M3 multiple | M4 flat |
|---|---|---|---|---|
| 5 years, 2021 to 2026 | 5.78% | 6.17% | 6.42% | 8.77% |
| 10 years, 2016 to 2026 | 5.02% | 5.06% | 5.32% | 7.34% |
| 20 years, 2006 to 2026 | 6.64% | 6.75% | 6.96% | 8.00% |
M1 wins all three, and by almost nothing at ten years (5.02 against 5.06). Two things matter more than the ranking.
The fitted value depends entirely on the window. Fitted a is 6.60%, 5.36% and 4.45% over five,
ten and twenty years; the realized CAGRs are 6.44%, 5.24% and 4.24%. There is no such thing as “the”
historical rate, and a shorter window gives a higher one. Anyone quoting a single historical figure
is quoting their choice of window.
No model fits the path. RMSE of 5 to 7 percentage points, on a series whose mean growth is about 5%, means every model is only estimating a level. The year-to-year movement is policy, not economics.
Regressing g = alpha + beta * cpi(t-1). M2 assumes beta = 1; M1 assumes beta = 0.
| window | beta | standard error | t | R-squared |
|---|---|---|---|---|
| 5 years | -0.18 | 1.79 | -0.10 | 0.003 |
| 10 years | 0.44 | 0.95 | 0.46 | 0.026 |
| 20 years | 0.24 | 0.93 | 0.26 | 0.004 |
beta = 1 is not supported in any window. beta = 0 is never rejected in any window. Over five
years the point estimate is negative.
The mechanism explains the sign, and it runs backwards from what M2 assumes. Hold harmless caps a beneficiary’s premium increase at their Social Security COLA. When the COLA is small, most beneficiaries are protected, so the entire cost increase must be recovered from the minority who are not, and the standard premium rises steeply. Low CPI produces a high standard premium increase.
This is not noise around a positive relationship. It is a negative mechanical link that a CPI-plus-
excess model has the wrong sign on. That the Optimizer’s cpi + inflation lands near a defensible
number is a coincidence of its default inputs, not a model that holds.
The 2026 Trustees Report projects aggregate Part B spending to grow 8.5% a year from 2026 to
Over that same window, the Trustees’ own premium path grows 5.93%. The gap of 2.57 points a year is enrollment growth plus the general-revenue share of Part B financing. A retiree pays neither.
| what | rate | window |
|---|---|---|
| aggregate Part B spending | 8.50% | 2026 to 2030 |
| standard premium | 5.93% | 2026 to 2030 |
| standard premium | 6.60% | 2026 to 2035 |
| standard premium | 7.02% | 2027 to 2035, excluding the unusually flat 2027 |
Used as a premium escalator, 8.5% reaches $2,345 a month by 2056 and overstates the 30-year premium bill by 92%. Any future pass tempted to “correct” a premium rate toward a published cost growth figure should read this section first.
Every model fitted on 20 years of history and projected to 2035 undershoots the Trustees badly: M1 reaches $300 against their $360.60, which is -16.7%. To match them you need 6.60%, above even the five-year record.
Scored on the benchmark, one person, 2027 to 2056:
| model | 2035 | error | 2056 | error | 30y total | error | RMSE(path) |
|---|---|---|---|---|---|---|---|
| TP, 6.6% to 3.8%, d = 0.90 | $334 | -7.3% | $803 | +1.7% | $169,210 | -0.8% | 3.0% |
| TP, d = 0.92 | $339 | -6.1% | $845 | +7.0% | $174,736 | +2.5% | 4.0% |
| flat 4.84%, the 2010 to 2035 blend | $310 | -13.9% | $838 | +6.2% | $165,008 | -3.2% | 7.2% |
| flat 5.24%, the 10-year record | $321 | -10.9% | $939 | +19.0% | $177,427 | +4.1% | 8.6% |
| CPI + 2.13% excess | $302 | -16.2% | $766 | -2.9% | $156,060 | -8.5% | 9.9% |
flat 5.60%, ANNUAL_INCREASE today |
$331 | -8.1% | $1,040 | +31.8% | $189,514 | +11.1% | 13.9% |
| flat 4.24%, the 20-year record | $295 | -18.2% | $705 | -10.6% | $148,189 | -13.1% | 13.4% |
| flat 5.80%, the Optimizer’s default | $337 | -6.5% | $1,101 | +39.5% | $196,627 | +15.3% | 17.6% |
| flat 6.60%, fits 2035 exactly | $361 | 0.0% | $1,380 | +74.9% | $228,217 | +33.8% | 35.1% |
| flat 2.50%, IncomeTaxPlanner today | $253 | -29.7% | $426 | -46.1% | $109,567 | -35.7% | 34.1% |
| flat 8.50%, aggregate spending | $423 | +17.3% | $2,345 | +197.2% | $328,145 | +92.4% | 93.2% |
A flat rate fitted to the near term overshoots 2056 by 75%. A flat rate fitted to the long run undershoots the next decade, which is where a conversion decision is actually made.
The best possible flat rate is still twice as wrong as the two-phase. Solving for the single rate
that fits the benchmark best gives 5.02% to match the 30-year total exactly, or 4.95% to
minimize path error, and that best case still carries RMSE(path) 6.94% against 2.96% for the
two-phase at its own optimum of d = 0.903. The two-phase does not win because a lucky decay was
picked; it wins because it has the right shape.
Objection: the benchmark is itself two-phase, so of course a two-phase model wins.
Answer: the benchmark is not invented. Its first nine years are the Trustees’ published projections and its tail is the Trustees’ published long-run assumption. If the officially projected future has two phases, then a one-phase model is wrong at one end or the other, and the size of that error is what the table measures. The asymmetry is the finding, not an artifact of it.
Section 3 scores models against a benchmark whose tail is an assumption. If the ranking only holds at 3.8%, it is worthless. It does not depend on it.
30-year total error as the long-run assumption moves:
| model | tail 3.0% | 3.8% | 4.5% | 5.0% | 5.6% |
|---|---|---|---|---|---|
| TP, d = 0.90 | -1.2% | -0.8% | -0.5% | -0.3% | -0.1% |
| TP, d = 0.92 | +2.9% | +2.5% | +2.0% | +1.6% | +1.1% |
| flat 4.84% | +4.5% | -3.2% | -9.7% | -14.2% | -19.4% |
| flat 5.24% | +12.4% | +4.1% | -2.9% | -7.7% | -13.3% |
| flat 5.60% | +20.1% | +11.1% | +3.7% | -1.5% | -7.4% |
| flat 5.80% | +24.6% | +15.3% | +7.6% | +2.2% | -3.9% |
| flat 6.60% | +44.6% | +33.8% | +24.8% | +18.7% | +11.5% |
| CPI + 1.91% | -4.9% | -12.0% | -17.9% | -22.0% | -26.7% |
The two-phase model stays within 1.2% across the whole range. Every flat rate swings 25 points or more, and each one is only right at the single tail value that happens to suit it: 4.84% needs a 3.4% tail, 5.60% needs 4.8%, 5.80% needs 5.2%.
This robustness is structural, not empirical, and that is the point. A two-phase model takes the long-run rate as a parameter, so it converges on whatever is assumed and the assumption becomes a visible input instead of being baked invisibly into a single number. A flat rate has to be the ramp and the tail at once, and cannot be both.
The number is worth changing, not only the plumbing. An earlier read of this question concluded that 5.6% and 5.8% were defensible and the work was unification. That was right about the historical windows, where both sit inside the range, and wrong about the forward bill: both overstate the 30-year premium stream by 11% to 15% and the 2056 premium by 32% to 40%, because a flat rate cannot decay. The two claims are about different questions and only the second one governs a projection.
| finding | consequence |
|---|---|
| CPI carries no signal, and hold harmless gives it the wrong sign | cpi + inflation is not a model. Keep it as the Optimizer’s default for continuity if saved plans require it, but do not describe it as one. |
| the shape is two-phase | the shared constant should be gLong + (g0 - gLong) * d^t, with gLong the exposed knob |
g0 = 6.6%, d = 0.90, gLong = 3.8% |
published 2026 to 2035 CAGR; decay fitted to the benchmark at 0.903; Trustees’ long-run assumption |
| if one flat rate must be kept | 5.02%, not 5.6% and not 5.8% |
| IncomeTaxPlanner’s 2.5% | understates the 30-year bill by 35.7%. It is also applied alone while its own label promises “bracket inflation plus this rate”. |
| 8.5% is aggregate spending | never a premium escalator, in code or in a comment |
All five tools now share medicare_costs.js, with g0 = 6.6%, gLong = 3.8% and decay = 0.90.
| tool | before | after |
|---|---|---|
retirement_optimizer.html |
cpi + inflation, 5.8% on defaults |
the model, plus a gated three-field override |
Retirement_Projection.html |
ANNUAL_INCREASE, 5.6% flat |
the model |
standalone/IncomeTaxPlanner.html |
a slider applied alone, 2.5% | the model; the slider is gone |
standalone/irmaa_and_rmds.html |
no growth at all | the model, with an optional current age |
standalone/FutureCost.html |
its own two sliders | unchanged; it cites the model beside them |
TAXData.IRMAA.ANNUAL_INCREASE is deleted, and calcIRMAA’s medicareRate now defaults to the
identity rather than silently applying a year of growth to a caller that omits it.
What it cost the plan bank, from .test_harnesses/medicare_delta_harness.js: 17 of 19
households moved on IRMAA, between -17.9% and +5.0%, and ending wealth by -3.9% to +2.0%.
IRMAA falls on most and rises on some, because the model starts ABOVE the flat rates those
households used and ends well below them, so the direction depends on how much of a household’s
Medicare life is early. One household funds a different number of years.
Two things the implementation found that this report had not. The Optimizer seeded its growth
factor from new Date().getFullYear() while the premiums it scaled were stated in 2026 dollars, so
a plan starting in a later year charged 2026 premiums with no catch-up. And in irmaa_and_rmds,
ageing a threshold while leaving calcIRMAA’s cpiRate at 1 looks right and is not: the ladder is
then un-indexed, and an aged Tier 1 threshold sails past the un-indexed Tier 2 floor, so the row
labelled Tier 1 charges Tier 2’s surcharge. Both axes have to be aged together.
d is not measured against data. No published year-by-year premium path exists past 2035, so
the decay constant is fitted to a benchmark that is itself part projection and part assumption
beyond that year. What is measured is that the shape matters more than the constant: every
reasonable d from 0.85 to 0.95 beats every flat rate on path error.calcIRMAA for that reason.