Repository navigation
Conversation
…ans-tested transfer Adds statutory eligibility for the Part D low-income subsidy (Extra Help): countable income below 150% of the poverty guideline for the family size, countable resources within the CPI-indexed limit plus the burial funds exclusion, and deemed eligibility for Medicaid enrollees, SSI recipients and Medicare Savings Program enrollees. The subsidy is valued at the Medicare Trustees' average payment per subsidy enrollee (Table IV.B9), as CBO assigns it, and joins gov.household.cbo_means_tested_transfers. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
YAML tests for every new variable, households computed from their inputs (Medicare Savings Program deeming, the subsidy's own tests, the pre-2024 partial range, take-up), and the CBO means-tested list. Python invariants: IV.B9 transcription, IV.B10 conservation, agreement with the per-enrollee series cbo_medicare_benefit subtracts, the CPI rule behind the resource limits, Hypothesis bounds, restated eligibility rules over a seeded sample with income, interest and asset variants, and a differential test against msp_countable_income. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This was referenced Oct 11, 2026
…idy average Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
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.
Stacked on #10118 (which is stacked on #10111 and #10107). Retargets to
mainonce those merge.Summary
#10118 makes the default CBO household income count Medicare the way CBO does: net of premiums, and without the Part D low-income subsidy (LIS, "Extra Help"). CBO counts the LIS as a means-tested transfer instead. pe-us had no LIS variable, so after #10118, CBO income after transfers lacked the LIS: about $18 billion in 2026, which #10118 removes from Medicare at $255.86 per enrollee.
This PR models the LIS and adds it to
gov.household.cbo_means_tested_transfers:part_d_lis_eligiblecovers Medicare enrollees in the 50 states and DC who either are deemed eligible or pass the income and resource tests. Deemed means Medicaid enrollees, SSI recipients, and people eligible for a Medicare Savings Program.part_d_lisgives each enrollee the Medicare Trustees' average subsidy per LIS enrollee, which is CBO's measure. That is $1,254 in 2026.gov.hhs.medicare.part_d.low_income_subsidy, one calibration series, aprograms.yamlentry, and a take-up flag.The LIS is added to CBO's means-tested list only.
household_benefits,household_net_incomeandhealthcare_benefit_valueare unchanged.medicare_costalready includes the LIS inside Medicare spending per enrollee.Why an average, not a computed benefit
Most of the LIS is the cost-sharing subsidy. That depends on each enrollee's drug use, and pe-us has no Part D claims. The premium subsidy depends on the region's benchmark premium and the plan chosen. CBO values the LIS the same way for everyone:
This PR keeps CBO's average but takes eligibility from the law, not from CBO's pool. The Trustees publish the average directly: Table IV.B9's "Subsidy amount" per LIS enrollee (2026 report, file page 158; the 2025 report for 2015). Enrollment times the amount reproduces Table IV.B10's payments, for example 14.4 million × $1,254 = $18.1 billion in 2026.
Institutionalized enrollees. CBO removes institutionalized LIS recipients and their benefits (Habib 2018, file page 52). Its adjusted totals (file page 51) are:
CBO's 2016 benefits come from its own baseline. Its recipient counts are 88–90% of the Trustees'. So the adjustment shows up mostly as fewer recipients, which the model's noninstitutional microdata already reflects.
Eligibility (law read this session)
defined_for = "medicare_enrolled"; Part D enrollment is folded into take-uppart_d_lis_income_eligiblepart_d_lis_family_size: marital unit plus the tax unit's dependents for heads and spousespart_d_lis_countable_income(uses_apply_ssi_exclusions)limit/individual.yaml,limit/couple.yamlburial_exclusion.yamlsources.yaml: bank, stock and bond assets, the only inputs pe-us haspart_d_lis_deemed_eligibleineligible_jurisdictions.yamlBefore 2024, income from 135% to 150% of the guideline, or resources between the lower (D) and the higher (E) limit, gave a partial subsidy. The Inflation Reduction Act (§ 11404) made all of it a full subsidy from 2024. The model uses the outer bound in every year, because CBO and this PR give every recipient the same average.
Enrollment. CMS enrolls Medicaid enrollees and SSI recipients in a plan with the subsidy without an application (423.773(c)(2); 423.34). So
part_d_lis_enrolledis automatic formedicaid_enrolledorssi > 0. Everyone else eligible needstakes_up_part_d_lis_if_eligible, which defaults to True. pe-us models Medicare Savings Program eligibility, not enrollment, so MSP-deemed people go through the flag too. Microcosm does not seed the flag yet, so in the microsimulation everyone eligible takes it up. See Impact.Values
gov.bls.cpi.cpi_uholds seasonally adjusted values from 2024, so it does not reproduce 2025–2026. That is filed separately.2025 is the first year of the IRA Part D redesign, which moved spending from the LIS to the direct subsidy (2026 report, file page 119). From 2036 the series grows with
calibration.gov.hhs.medicare.per_capita_cost, like the per-enrollee series beside it.Impact
Pending: a 2026 microsimulation of this branch on the default dataset is queued on the shared heavy lock (24th in line when queued). The base is #10118's head (3d8bb6d), whose output #10118's own run produces.
Invariants and tests
YAML: 47 cases across 9 files in
tests/policy/baseline/gov/hhs/medicare/part_d/low_income_subsidy/. They include:cbo_household_income.yamlgains a case where the LIS is the only means-tested transfer, and its list test now includespart_d_lis(andmsp, which does not count).Python,
tests/core/test_part_d_lis.py(73 cases, 27 s locally):part_d_lis_countable_incomeequals 12 ×msp_countable_income, a separate implementation of the same SSI exclusions (single and both-Medicare-eligible couples).The sample reaches every branch: 197 deemed, 100 eligible through the tests alone, 46 eligible but not enrolled, 103 failing only the resource test and 88 failing only the income test. Four mutations were each caught: income limit 1.45, interest counted,
<=at the income limit, and one burial exclusion per couple.Local runs: the Medicare and CBO YAML directories (271 cases), plus
test_programs_registry.py,test_aggregate_list_integrity.py,test_spm_integration_contract.py,test_cbo_medicare_benefit_series.pyand this file: 1,056 passed.Not modeled and follow-ups
axiom: TheAxiomFoundation/rulespec-us#1681 queued (42 U.S.C. 1395w-114(a)(3) and 42 CFR 423.772–773; corpus has both, but the rulespec pin predates them; 20 CFR 418 ingestion is TheAxiomFoundation/axiom-corpus#818)
Sources
ffa56b91…8fa8)1b3de7a4…4d95)🤖 Generated with Claude Code