Skip to content

Add 2015-2023 Medicare IRMAA brackets and 2015-2020 Part B premiums - #10112

Open
MaxGhenis wants to merge 1 commit into
mainfrom
irmaa-historical-brackets
Open

MaxGhenis wants to merge 1 commit into
mainfrom
irmaa-historical-brackets

Conversation

@MaxGhenis

@MaxGhenis MaxGhenis commented Oct 11, 2026 •

Copy link
Copy Markdown
Contributor

Problem

The Medicare IRMAA schedules (gov.hhs.medicare.part_b.irmaa.* and gov.hhs.medicare.part_d.irmaa.*) had values only for 2024–2026. CountryTaxBenefitSystem backdates every parameter's earliest value to 2015 (FIRST_MODELED_YEAR), so benefit years 2015–2023 used the 2024 schedule. The standard Part B premium (part_b.base_premium) started in 2021, so 2015–2020 used $148.50. As a result:

  • Thresholds. A 2015 single filer had no IRMAA until $103,001, at 2024 amounts (top Part B adjustment $419.30). The real 2015 schedule started above $85,000, had four tiers, and topped out at $230.80.
  • Tier count. The 85% tier, which the Bipartisan Budget Act of 2018 added for 2019, applied to every year.
  • Married filing separately. The 2015–2017 schedule (65% tier above $85,000, 80% above $129,000) and the 2018 single-tier schedule (80% above $85,000) were both replaced by 2024's.

Change

Adds each year's schedule for 2015–2023 to all ten IRMAA files (Part B and Part D × single, joint, head of household, surviving spouse, separate), and the 2015–2020 standard Part B premium. 2024–2026 values are unchanged. Every year has a source:

Years Part B thresholds, adjustments, standard premium Part D adjustments
2015–2023 Federal Register "Medicare Part B Monthly Actuarial Rates, Premium Rate(s), and Annual Deductible" notices (79 FR 61314 … 87 FR 59080), with the file page of each table —
2015–2019 — CMS "Annual Release of Part D National Average Bid Amount" memos, page 4 (separate-return table on page 5 from 2017)
2020–2021 — CMS Office of the Actuary "Part D Income-Related Monthly Premium Adjustment" memos
2022–2023 — CMS Parts A & B / Part D IRMAA fact sheets
all Trustees Report 2026 Table V.E3 Trustees Report 2026 Table V.E4

Schedule history the values follow (42 U.S.C. 1395r(i)):

  • 2015–2017: thresholds frozen at the 2010 amounts ($85,000 / $107,000 / $160,000 / $214,000) under (i)(6).
  • 2018: the MACRA table, (i)(3)(C)(i)(II).
  • 2019: the BBA 2018 table with the 85% tier "at least $500,000" ($750,000 joint).
  • From 2020: CPI-U indexing under (i)(5).

Encoding.

  • Thresholds keep the existing convention: X + 1 for "more than $X", and X for the 85% tier's "at least $X".
  • A tier that did not exist yet has threshold .inf, following the Frederick County scales. Its amount repeats the 80% tier's, so the schedule stays non-decreasing. This covers the 85% bracket before 2019 and the separate schedule's second bracket in 2018.
  • Comments in the files cite the statute for each change in tier structure.
  • The separate (lived-with-spouse) schedule follows (i)(3)(C)(iii): each individual dollar amount is reduced by the $85,000 threshold. In 2015–2017 that leaves a 65% tier and an 80% tier. In 2018 the 65% tier's upper bound becomes $75,000, below the threshold, so only the 80% tier applies above $85,000.

Verification

Every value was transcribed once into a canonical table, ~/reviews/irmaa-history-2015-2023/scripts/canonical.py, and then checked four ways (scripts in the same folder):

  1. verify_sources.py checks each value against:

    • the Federal Register notice texts (FR API raw text);
    • archived SSA POMS HI 01101.020 tables for 2015–2023, row by row (Part B totals and Part D amounts);
    • Trustees Report 2026 Tables V.E3 and V.E4;
    • the statutory joint and separate-return derivations.

    All pass.

  2. verify_cms_part_d.py checks every Part D amount and threshold on the cited pages of the CMS memos. All pass.

  3. An independent compilation by a separate agent, working only from CMS press releases, fact sheets, job aids and the Part D memos (no Federal Register, POMS or Trustees data), differs in 0 values across 9 years × 3 schedules × Parts B and D.

  4. verify_loaded.py loads the parameter tree and compares every year's scale with the canonical table. It matches.

The 2024 and 2025 Federal Register PDFs also confirm the existing 2024–2026 values. One source disagreement: Trustees Table V.E3 shows 2025's 50% and 65% tiers as $184.90 and $295.80. The governing 2025 notice (89 FR 90002) and CMS's totals give $185.00 and $295.90, which the model already uses.

Tests

  • YAML (gross_medicare_part_b_premium.yaml is new; the Part D and base-premium files are extended):
    • 72 household cases cover every tier boundary in 2015–2023: all five filing statuses in 2016, 2019 and 2021, and single, joint and separate in the other years.
    • They include MAGI of $2,000,000 before 2019, which must land in the 80% tier.
    • They also include the 2018 separate filer and the 2015–2020 standard premiums.
    • Each case gives medicare_irmaa_magi_two_years_prior directly.
    • 72 of the 87 cases fail on main.
  • Property tests (test_irmaa_schedule_properties.py, 560 cases, Hypothesis): the invariants below. 85 of them fail on main.

Invariants

For every year 2015–2035, both parts and every filing status:

  • each schedule starts at zero;
  • thresholds rise strictly until any +inf brackets, which come last;
  • amounts never fall from one tier to the next;
  • head-of-household and surviving-spouse schedules equal the single schedule;
  • Part D thresholds equal Part B's.

For the published years (2015–2026):

  • joint thresholds are twice the individual ones, except the $500,000 amount, which is 150% ((i)(3)(C)(ii));
  • the separate schedule charges, above the individual threshold T, what the single schedule charges at MAGI + T ((i)(3)(C)(iii)). This is checked at every boundary ±1 and on Hypothesis-drawn integer MAGIs;
  • each Part B adjustment is (p − 25)/25 × the standard premium within $0.25 ((i)(3)(A) with (a)(3) and (a)(6));
  • Part D adjustments are proportional to (p − 25.5) within $0.10 (1395w-113(a)(7)(B));
  • before 2019, MAGI of $1 billion pays the 80% amount.

Impact

Only simulations of 2015–2023 change. The diff adds dates before 2024 and touches no 2024+ value, and the default microdata year is 2024. Examples (annual amounts, from this branch versus main):

Year Filing status MAGI Part B premium Part D IRMAA
2015 single 90,000 1,782.00 → 1,762.80 0 → 147.60
2016 single 250,000 6,393.60 → 4,677.60 890.40 → 874.80
2018 separate 100,000 1,782.00 → 5,143.20 0 → 897.60
2019 single 600,000 6,813.60 → 5,526.00 972.00 → 928.80
2021 joint 200,000 1,782.00 → 2,494.80 0 → 147.60
2023 head of household 120,000 2,817.60 → 2,769.60 154.80 → 146.40

The Part B premium feeds medical-expense deductions, SPM medical out-of-pocket spending, MSP benefit values and several state LIHEAP income tests. Those move for 2015–2023 households with Medicare enrollees.

Unchanged and not modeled here: the hold-harmless provision. Under it, most enrollees paid less than the standard premium in 2016 and 2017. In 2016 the majority could pay no increase over 2015 (80 FR 70811). In 2017 about 70% were held harmless and about 30% paid $134.00 (81 FR 80063). The model charges every enrollee the standard premium, as before. Enrollees who owe IRMAA are never held harmless, so their amounts are exact.

Related

axiom: TheAxiomFoundation/rulespec-us#1677 queued. The blockers are that rulespec-us pins us-rulespec-2026-08-08-obbb-alien-snap, which predates the corpus's Medicare statute rows, and that the 2015–2025 annual CMS notices are not ingested. Signed encoder runs also need approval.

🤖 Generated with Claude Code

The Part B and Part D income-related monthly adjustment schedules started in
2024, so the backdating floor applied 2024 thresholds and amounts to benefit
years 2015-2023, and the standard Part B premium applied its 2021 value to
2015-2020. Encode each year's schedule from the Federal Register Part B
premium notices and CMS's Part D income-related adjustment releases: thresholds
frozen through 2017, the MACRA brackets for 2018, the 85% tier from 2019 and
CPI-U indexing from 2020, with the shorter married-filing-separately schedule
(a single tier in 2018).

Add YAML tests for every tier boundary in 2015-2023 and property tests for the
statutory structure (ordering, joint and separate schedules, Part B
adjustments relative to the standard premium, Part D tier proportions).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant