Repository navigation
Conversation
This was referenced Nov 4, 2026
The Secretary of Health and Human Services sets the Part B standard premium to cover about 25 percent of average expenditures for beneficiaries aged 65 and over (42 U.S.C. 1395r(a); 2026 Medicare Trustees Report, file page 97), so the premium uprater glides from its 2034-2035 growth to the Trustees' long-range growth in Part B spending per enrollee. CMS Medicare spending per enrollee keeps its 2031-2032 growth rate, which skips the end of sequestration in 2033, and glides from 2034 to the Trustees' long-range growth in Medicare spending per enrollee. Tests check growth_years with long_range_growth in closed form and against an independent implementation, start the Trustees-consistency test from the 2034 anchor, compare the Part B premium with Table II.D1, and scan set_all_uprating_parameters so every glided series appears in WIRED_SERIES. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
long_range_growth_rate rejects NaN, infinite and at-or-below -1 rates, extend_parameter_values rejects growth_years other than consecutive years ending by the last projected year, and MappingProxyType keeps importers from changing the knots. The per capita comment now quotes the Trustees' file page 176 reason for applying that rate to non-Medicare series. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
MaxGhenis
force-pushed
the
medicare-long-range-glide
branch
from
November 7, 2026 18:22
8d29632 to
189dde2
Compare
MaxGhenis
marked this pull request as ready for review
November 7, 2026 18:35
This branch has not been deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
The Medicare Part B premium and Medicare spending per enrollee upraters now glide to the 2026 Medicare Trustees' long-range rates through #10119's
long_range_growth=. On main, each repeats a single projected year's growth through 2100.#10111 adds the Part D premiums per enrollee series that #10656 also covers, and a follow-up PR will glide it once #10111 merges.
Changes
calibration.gov.hhs.cms.medicare_part_b_premium_per_enrolleeglides after 2035 from its 2034–2035 growth of 6.529% toMEDICARE_PART_B_PER_ENROLLEE_LONG_RANGE_GROWTH. The Secretary of Health and Human Services sets the standard premium to cover about 25 percent of average expenditures for beneficiaries aged 65 and over (42 U.S.C. 1395r(a); 2026 Medicare Trustees Report, file page 97). So the premium grows with Part B spending per enrollee.calibration.gov.hhs.medicare.per_capita_costkeepsgrowth_years=(2031, 2032)and glides after 2034 from that 5.428% rate toMEDICARE_PER_ENROLLEE_LONG_RANGE_GROWTH.long_range_growth_raterejects a NaN or infinite rate and any rate at or below −1, andextend_parameter_valuesrejectsgrowth_yearsother than consecutive years ending by the last projected year.MappingProxyTypekeeps importers from changing the knots. No current caller trips a check, so no value moves.The Part B premium keeps every value through 2035 and Medicare spending per enrollee every value through 2034. Years after 2100 hold the new 2100 value.
Readers
On main, only
medicare_part_b_premiums_reportedreads the Part B series.medicare_gross_cost,medicare_costandqmb_cost_sharingread Medicare spending per enrollee, and through them CBO household income and Medicare Savings Program costs move.#10103 makes
gov.hhs.medicare.part_b.base_premiumfollow the Part B series after 2026. Once both PRs merge, the projected Part B standard premium falls from #10103's $931.20 to $751.30 a month in 2050 and from $21,998.00 to $4,612.50 in 2100. On a trial merge of #10103's head 7cc881c with this branch, #10103'stest_medicare_premium_projection.py(162 tests) and this PR's changed tests pass. The two branches conflict inuprating_extensions.py'stypingimport and where both add functions, and keeping both sides resolves each.Long-run microsimulation
We age Microcosm's 2024 dataset a year at a time to 2050 and 2100 and estimate these nominal totals on main (67d4dde) and on this branch:
medicare_gross_cost)msp_cost)medicare_gross_costassigns each enrollee the year's Medicare spending per enrollee, so the total falls with that series, by 13.1% in 2050 and 63.0% in 2100.medicare_costfalls by the same dollars. Medicare Savings Program costs fall by less, 10.3% and 61.9%, because only QMB cost sharing reads the series. Their premium coverage,msp_benefit_value, readsbase_premiumand the Part A premiums, which keep their 2026 values on main. CBO household income falls by the change in Medicare spending, 1.0% and 9.6%, while household net income stays put, sinceinclude_health_benefits_in_net_incomedefaults to false.healthcare_benefit_valueandhousehold_net_income_including_health_benefitsfall by the MSP change, within float32 rounding.medicare_part_b_premiums_reportedholds zero for every person on both branches: Microcosm's dataset stores reported Part B premiums undermedicare_part_b_premiums, a name no policyengine-us variable defines. So none of these totals moves with the Part B series.#10119's review items
Numbers refer to the hand-off table and the round-1 review.
extend_parameter_valuesdocstringgrowth_yearslimits.growth_years=withlong_range_growth=test_growth_years_set_the_rate_the_glide_starts_fromandtest_growth_years_extension_matches_an_independent_implementation.P3-2 and P3-6 asked for edits to #10119's PR body.
Invariants
tests/core/test_long_range_health_growth.pychecks these with Hypothesis and an independentnp.interp/np.prodimplementation:growth_years.growth_years, the glide starts from the measured rate at the last projected year, whatever the growth after the measured pair.set_all_uprating_parametersglides appears inWIRED_SERIES.long_range_growth_raterejects any rate that would make a growth factor zero, negative or not finite. Before it changes any value,extend_parameter_valuesrejectsgrowth_yearsthat skip a year, run backward or end after the last projected year. The knots reject assignment.Plan
axiom: n/a: uprating extension of calibration series only (no policy rule)
🤖 Generated with Claude Code