Repository navigation
Conversation
employer_sponsored_insurance_premiums uprated by CBO employment income (per capita after the per-capita conversion), and pre_tax_health_insurance_premiums by CMS out-of-pocket spending per capita, which by CMS's own definition excludes premiums. Both are shares of employer plan premiums, so both now follow CMS NHE Table 17's employer-sponsored insurance spending per enrollee (2013-2034, 2025-2034 projections release), extended past 2034 at the 2033-2034 growth rate. The per-capita classifier now treats per_enrollee paths as per-person rates, like per_capita ones, so they are neither divided by population nor rejected as unclassified. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…fier - Split the ESI tests: parameter and property checks stay in tests/core; the Simulation and dataset-extension checks move to tests/microsimulation (fewer Hypothesis examples, one vectorized simulation each). - Assert the 22 published Table 17 values exactly, keeping the spending-over-enrollment consistency check. - Per-person markers count only in a path's last segment, so a marker in an ancestor folder no longer hides a national total. - Cite the methodology paper's file page 29 in the href, the ZIP as the Table 17 source, and the 2035-2100 extension endpoint. - Describe the index as a premium-growth proxy at fixed coverage per policy and roughly constant employer share. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
health_insurance_premiums_without_medicare_part_b and other_health_insurance_premiums follow CMS ESI premium per enrollee, like pre_tax_health_insurance_premiums; health_insurance_premiums follows a new CMS direct purchase premium per enrollee series (NHE projections Table 17). CMS out-of-pocket spending excludes premiums by definition. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…rality Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
No dataset fills long_term_health_insurance_premiums and no CMS series measures long-term care insurance premiums; 26 U.S.C. 213(d)(10)(B) indexes the deductible limits on them by the medical care CPI. Adds gov.bls.cpi.cpi_u_medical_care: BLS annual means to 2022, CBO's February 2026 calendar-year series for 2023-2036, extended at its 2035-2036 rate. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Adds calibration.gov.hhs.cms.medicare_part_b_premium_per_enrollee: the standard monthly premium for 2013-2026 (2026 Trustees Report Table III.C2) and the Trustees' intermediate estimates for 2027-2035 (Table V.E2), extended at the 2034-2035 rate. A premium with any income-related adjustment is a fixed multiple of the standard premium (42 U.S.C. 1395r(i)(3)). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Core tests cover transcription, the Part B statutory components, agreement with the model's Part B premium, Hypothesis bounds and extension rules for each index; the microsimulation test covers all five inputs. The SPM methodology page says which inputs follow which premium series. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…uprating # Conflicts: # docs-quarto/methodology/spm-poverty.qmd # policyengine_us/parameters/uprating_extensions.py # policyengine_us/tests/core/test_per_capita_uprating.py # policyengine_us/tests/core/test_uprating_series.py # policyengine_us/tests/policy/baseline/parameters/test_uprating_extensions.py
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The Part B standard premium, Part A premiums and deductible, and the Part B and Part D income-related adjustment amounts and thresholds held their 2026 values in every later year. - Part B standard premium and Part B IRMAA amounts uprate by the Trustees' projected standard premium (calibration series from #10085), rounded to 10 cents (42 U.S.C. 1395r(c)). - Part A full and reduced premiums uprate by the Trustees' projected Part A premium (Table V.E1), rounded to $1; the Part A deductible gains its 2026 value ($1,736) and uprates by the Trustees' projected deductible, rounded to $4 (1395e(b)(1)). - IRMAA thresholds (Parts B and D) follow 1395r(i)(5)'s CPI-U schedule, computed from the statutory amounts; the $500,000 tier is indexed from 2028. - Part D IRMAA amounts follow 1395w-113(a)(7)(B) applied to the Trustees' projected base beneficiary premium, with the (a)(9) percent of 20% from 2030; this reproduces Trustees Table V.E4 for 2027-2035. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Property tests (Hypothesis) for statutory rounding, proportionality, monotonicity and threshold structure in every projected year; differential tests against the 2026 Trustees Report Tables V.E1-V.E4 and CMS's published 2020-2026 IRMAA thresholds; a precedence test showing a CMS amount added to the YAML replaces only its own year; and YAML household cases for 2027-2034. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Coordination note from #10112, which adds the 2015–2023 IRMAA schedules and the 2015–2020 standard Part B premium.
|
|
Heads-up from #10117, which adds the 2015–2020 Part A premiums and the 2015–2023 and 2026 Part A deductibles to the same three files.
|
|
Picking this up for the US hub. I'll post a hand-off comment here when it's ready. Generated by Claude Code |
The branch was stacked on #10085, which has since merged to main in revised form, so its shared lines take main's version. The Part A premium and deductible files keep the 2015-2023 Federal Register references #10117 added on main; this branch adds only the uprating metadata there. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The Part D base beneficiary premium series and percent each listed the report twice, with hrefs that differed only by #page=. CLAUDE.md asks for one entry per source with the cited pages in its title. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
CMS announced the 2027 base beneficiary premium, $41.33, on July 28, 2026; it equals the Trustees' estimate, so the value is unchanged. The 2030 jump comes from the (a)(9) percent, which the Trustees expect at its 20 percent floor; the statute does not itself set 20 percent. The unsubsidized Part B premium in 1395r(i)(3)(A) adds 4 times the (a)(6) increase, and $311 is 0.08 percent above $310.75, not 0.04 percent. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Uprating CMS's 2026 reduced premium ($311, which CMS rounded up from $310.75) on its own carried that 0.08 percent excess into every projected year, so from 2038 it sat $1 to $7 a month above the full premium less 45 percent that 42 U.S.C. 1395i-2(d)(4) sets. extend_medicare_part_a_premiums now projects the full premium from the Trustees series and sets the reduced premium at 55 percent of it, each rounded to the nearest dollar with 50-cent amounts rounded up, as 1395i-2(d)(2) requires; core's nearest rounding sends ties to even. CMS's published reduced premiums follow the same rule in every year from 2015 to 2026, and 2027-2035 still equal Trustees Table V.E1. Also reword the 2030 Part D base premium jump: it comes from the end of the (a)(8) 6 percent cap, with the (a)(9) percent's 20 percent floor binding. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Hub review in progress Finished. The final review is posted at #10103 (comment) (VERDICT: REQUEST_CHANGES). Generated by Claude Code |
|
Ready for hub review The head hasn't moved since the hand-off. The projections are right: every value I computed by hand from the statutory rule matches the model. But the PR leaves three CI jobs red. Tests already on FindingsP1. CI fails: three suites pin the 2027 Part B premium at $202.90 a monthThe Pull request run at this head (run 41719868265) ends (a) NH FAP YAML (states-shard-4, 8 cases). I reproduced it at this head, one file per process: Core stops at a case's first mismatch, so I patched scratch copies and reran until they passed. The full set of replacements is below. With them, all 88 + 36 + 30 cases pass, and no band or eligibility outcome changes:
The comments that compute "202.90 * 12 = 2,434.80" need the same change: (b) Replacement: (c) # The reference main predates the Medicare premium projection, so the Part B
# premium after 2026 legitimately differs; the medicare_irmaa_magi requests
# still pin the IRMAA ingress path.
CHANGED_SINCE_REFERENCE = {"medicare_part_b_premium@2027"}
...
for request in main[route]:
if request in CHANGED_SINCE_REFERENCE:
continue
np.testing.assert_array_equal(...)The P2. The 2027 projections depend on CPI-U months the model doesn't have, and CMS announces 2027 soon
P3. Smaller items
Judgment calls
Checked and sound
What I couldn't check
Generated by Claude Code |
|
Picking this up for the US hub. I'll post a hand-off comment here when it's ready. Generated by Claude Code |
The 2027 Part B premium is now projected at $209.50 a month instead of the frozen 2026 $202.90, so the three NH FAP suites that pinned 12 x 202.90 = 2,434.80 failed. Pin 12 x 209.50 = 2,514 and recompute the countable income each case derives from it. No band or eligibility outcome changes. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LwQq6Kdz5jWLbAMmyYu3CF
The COLA invariance fixture now expects 12 x (209.50 + 460.80) = 8,043.60 for the 80% IRMAA tier in 2027. The Social Security ingress differential compares against a main that predates the premium projection, so skip medicare_part_b_premium@2027 there; the IRMAA MAGI requests still pin the ingress path, and the route keys are still compared. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LwQq6Kdz5jWLbAMmyYu3CF
The joint top is 150 percent of the indexed unmarried top, not of the fixed $500,000. The separate-top test took its range from the constant under test, so moving that constant silently dropped 2027; use a fixed range(2025, 2028). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LwQq6Kdz5jWLbAMmyYu3CF
|
Ready for hub review Round 1 fix round: the P1 from the review, plus P3-1 and P3-2. The branch hadn't moved since Commits
Items
Tests at
|
| File | Result |
|---|---|
nh_fap.yaml |
88 passed |
nh_fap_countable_income.yaml |
36 passed |
nh_fap_eligible.yaml |
30 passed |
medicare_part_b_premium.yaml |
16 passed |
test_ss_cola_default_invariance.py |
14 passed |
test_medicare_premium_projection.py |
162 passed |
The first attempt at the two Python files failed to collect because hypothesis wasn't installed. I ran uv sync --extra dev and reran both. That was a local environment gap, not a test failure.
Mutant
I set MEDICARE_IRMAA_TOP_FIRST_INDEXED_YEAR = 2027 in its own process, then restored the file and confirmed git status was clean. The result was 162 passed, so the mutant survived. That's expected: the review's point is that the mutant is equivalent, because the August 2026 window is the base period, so the 2027 top is 500,000 either way. Before this change, the same mutant gave 161 passed, because it removed the 2027 case. Now the count stays 162: test_separate_top_threshold_falls_until_2028[2027] still runs and passes, so 2027 stays checked.
CI
Pull request run 41958440318 passed all 36 jobs at 368314616c695c6fc2839e7e0420596ad3345483. The run concluded success. Python tests / Full Suite - Microsimulation: success, so the CHANGED_SINCE_REFERENCE skip resolves P1(c). Baseline (states-shard-4) and Rest (Python shard 1), which failed at 01cc340a38, also pass. I added this sentence to the body, after the test-run paragraph.
Every job's conclusion:
- PR validation (lock, guard tests, lint, changelog): success
- Quick Feedback (Selective Tests + Coverage): success
- Household API Partners: success
- Package and compatibility: success
- Python tests / Full Suite - Microsimulation: success
- Baseline tests / Full Suite - Baseline (contrib-hhs): success
- Baseline tests / Full Suite - Baseline (ssa-usda): success
- Baseline tests / Full Suite - Baseline (states-shard-2): success
- Python tests / Plan Rest Python shards: success
- Baseline tests / Full Suite - Baseline (rest-b): success
- Baseline tests / Full Suite - Baseline (irs): success
- Baseline tests / Full Suite - Baseline (reform): success
- Baseline tests / Full Suite - Baseline (states-shard-1): success
- Baseline tests / Full Suite - Baseline (states-shard-4): success
- Baseline tests / Full Suite - Baseline (rest-a): success
- Baseline tests / Full Suite - Baseline (household): success
- Baseline tests / Full Suite - Baseline (states-shard-3): success
- Python tests / Full Suite - Rest (Python shard 7): success
- Python tests / Full Suite - Rest (Python shard 8): success
- Python tests / Full Suite - Rest (Python shard 9): success
- Python tests / Full Suite - Rest (Python shard 5): success
- Python tests / Full Suite - Rest (Python shard 6): success
- Python tests / Full Suite - Rest (Python shard 1): success
- Python tests / Full Suite - Rest (Python shard 2): success
- Python tests / Full Suite - Rest (Python shard 4): success
- Python tests / Full Suite - Rest (Python shard 3): success
- Python tests / Check Rest Python shards: success
- Contrib tests / Full Suite - Contrib (other-shard-1): success
- Contrib tests / Full Suite - Contrib (states-shard-3): success
- Contrib tests / Full Suite - Contrib (states-shard-2): success
- Contrib tests / Full Suite - Contrib (congress): success
- Contrib tests / Full Suite - Contrib (other-shard-2a): success
- Contrib tests / Full Suite - Contrib (other-shard-3): success
- Contrib tests / Full Suite - Contrib (states-shard-4): success
- Contrib tests / Full Suite - Contrib (other-shard-2b): success
- Contrib tests / Full Suite - Contrib (states-shard-1): success
Body readback (after the final PATCH, identical to what I sent)
Full body
Draft. On `main`, `gov.hhs.medicare.part_b.base_premium`, the Part A premiums, the Part A deductible, and the Part B and D IRMAA amounts and thresholds stop at their last CMS-announced year and carry no uprating. So every year from 2027 on holds the 2026 values: $202.90 a month for Part B, and the same IRMAA brackets. This PR projects each of them past the last announced year. CMS values in the YAML still take precedence for their own years.
## What changes
| Parameter | Projection after the last announced year | Rounding | Where |
|---|---|---|---|
| Part B standard premium (`part_b.base_premium`) | Uprated by the Trustees' projected standard premium, `calibration.gov.hhs.cms.medicare_part_b_premium_per_enrollee` (on `main` since #10085) | Nearest 10 cents | `uprating:` metadata |
| Part B IRMAA amounts, all five filing statuses | Uprated by the same series, so each keeps its 2026 multiple of the standard premium | Nearest 10 cents | `uprating:` metadata on each bracket amount |
| Part A full premium | Last published premium × the growth of the new Trustees standard-premium series (Table V.E1) | Nearest $1, 50 cents rounded up | `extend_medicare_part_a_premiums` |
| Part A reduced premium | 55% of the full premium (the full premium less 45%) | Nearest $1, 50 cents rounded up | `extend_medicare_part_a_premiums` |
| Part A deductible | Uprated by the new Trustees deductible series (Table V.E1) | Nearest $4 | `uprating:` metadata |
| IRMAA thresholds, Parts B and D | Statutory dollar amounts × CPI-U for the 12 months ending August of the prior year over the base period: August 2018 for the four lower amounts, and August 2026 for the $500,000 amount from 2028 | Nearest $1,000 | `extend_medicare_irmaa_thresholds` |
| Part D IRMAA amounts | Base beneficiary premium × (applicable percentage − base percent) / base percent, on the new Trustees base-premium series (Table V.E2). The base percent is 25.5%, then 20% from 2030 (the Trustees' expectation) | Nearest 10 cents | `extend_medicare_part_d_irmaa_amounts` |
New parameters:
- `calibration.gov.hhs.cms.medicare_part_a_premium_per_enrollee`, `medicare_part_a_deductible` and `medicare_part_d_base_beneficiary_premium_per_enrollee`: Trustees Tables V.E1 and V.E2 for 2015–2035. They grow at their 2034–2035 rate to 2100 and hold after that. The 2027 Part D base premium ($41.33) is also the CMS-announced value.
- `gov.hhs.medicare.part_d.base_beneficiary_premium_percent`: 25.5% from 2006, and 20% from 2030.
The threshold rules follow each filing status's published 2024–2026 scales. Joint thresholds are twice the unmarried ones, and the joint top tier is 1.5 × the unmarried top. Married filing separately has two tiers, starting $1 above the unmarried threshold amount and at the top amount less that threshold.
### Projected values (hand-checked)
| Year | Part B premium | Part A full / reduced | Deductible | Single thresholds | Part D IRMAA, single |
|---|---:|---:|---:|---|---|
| 2026 (published) | $202.90 | $565 / $311 | $1,736 | 109,001 / 137,001 / 171,001 / 205,001 / 500,000 | 14.50 / 37.50 / 60.40 / 83.30 / 91.00 |
| 2027 | $209.50 | $600 / $330 | $1,788 | 112,001 / 141,001 / 176,001 / 211,001 / 500,000 | 15.40 / 39.70 / 64.00 / 88.30 / 96.40 |
| 2028 | $224.50 | $629 / $346 | $1,844 | 116,001 / 146,001 / 182,001 / 218,001 / 517,000 | 16.30 / 42.10 / 67.90 / 93.60 / 102.20 |
| 2030 | $255.50 | $694 / $382 | $1,960 | 121,001 / 153,001 / 191,001 / 229,001 / 541,000 | 51.70 / 103.40 / 155.10 / 206.80 / 224.00 |
| 2036 | $384.10 | $940 / $517 | $2,368 | 139,001 / 175,001 / 218,001 / 261,001 / 619,000 | 60.20 / 120.30 / 180.50 / 240.60 / 260.70 |
Examples:
- **2027 single thresholds.** 85,000 × 329.001 / 249.280 = 112,184, which rounds to $112,000. The 12-month CPI-U averages ending August 2026 and August 2018 come from the model's CPI-U series and its shared helper.
- **2027 Part D tiers.** 41.33 × (0.35 − 0.255) / 0.255 = 15.397, which rounds to $15.40.
- **2030 Part D tiers.** 68.93 × (0.35 − 0.20) / 0.20 = 51.70.
- **2036 Part A premium.** 900 × 900 / 862 = 939.67, which rounds to $940. The reduced premium is 0.55 × 940 = 517.
- **2036 deductible.** 2,296 × 2,296 / 2,228 = 2,366.08, which rounds to the nearest $4 at $2,368.
## Sources
- 42 U.S.C. [1395r](https://www.law.cornell.edu/uscode/text/42/1395r#i): Part B premium and IRMAA, including the (i)(5) CPI-U adjustment.
- 42 U.S.C. [1395w-113](https://www.law.cornell.edu/uscode/text/42/1395w-113#a): Part D IRMAA and the base beneficiary premium percent.
- 42 U.S.C. [1395i-2(d)](https://www.law.cornell.edu/uscode/text/42/1395i-2#d): Part A premium and its rounding.
- 42 U.S.C. [1395e(b)](https://www.law.cornell.edu/uscode/text/42/1395e#b_1): Part A deductible.
- [2026 Medicare Trustees Report](https://www.cms.gov/oact/tr/2026#page=212): Tables V.E1 (file page 212) and V.E2 (file page 213), plus the Part D premium discussion (file pages 113 and 154).
- CMS, [Medicare Part D 2027 national average monthly bid amount](https://www.cms.gov/newsroom/fact-sheets/medicare-part-d-2027-national-average-monthly-bid-amount-information): the 2027 base beneficiary premium.
## Invariants
These are tested in `policyengine_us/tests/core/test_medicare_premium_projection.py`, with 162 cases, some of them Hypothesis properties:
1. **Source agreement.** Projections match Trustees Tables V.E1–V.E4 for 2027–2035, to within cents for the Part B IRMAA amounts.
2. **Transcription.** The new series equal the published table cells.
3. **Rounding.** Every projected amount sits on its statutory or published grid.
4. **Proportionality.** Each Part B IRMAA amount keeps its multiple of the standard premium. Each Part D amount equals the (a)(7)(B) formula. The reduced Part A premium is 55% of the full premium, rounded half up.
5. **Monotonicity.** Premiums and thresholds never fall, and the tiers rise with income.
6. **Filing-status rules.** Rebuilding each published scale from its unmarried amounts reproduces every status's 2024–2026 thresholds.
7. **Indexing.** The CPI-U schedule reproduces CMS's published thresholds exactly through 2024, and within one $1,000 step in 2025–2026. From 2024 the model's CPI-U is seasonally adjusted, while CMS averages the published index. Each projected unmarried threshold equals its statutory amount indexed from its statutory base year.
8. **Precedence.** A CMS value added to the YAML replaces the projection for that year only.
9. **Extension.** The new series grow at their last Trustees rate to 2100 and then hold.
YAML cases in `base_part_a_premium`, `base_part_b_premium`, `income_adjusted_part_d_premium_surcharge`, `medicare_part_b_premium` and `msp_part_b_premium_coverage` cover the household effects in projected years.
Tests already on `main` that pinned the 2027 Part B premium at the frozen $202.90 now expect the projected $209.50 (12 × 209.50 = $2,514 a year):
- `nh_fap.yaml`, `nh_fap_countable_income.yaml` and `nh_fap_eligible.yaml` (New Hampshire FAP): the 2027 premium and the countable income derived from it, for example 18,000 − 2,514 = 15,486. No band or eligibility outcome changes.
- `policyengine_us/tests/unit/test_ss_cola_default_invariance.py`: the 80% IRMAA tier's 2027 premium is 12 × (209.50 + 460.80) = $8,043.60.
- `policyengine_us/tests/microsimulation/test_social_security_current_law.py`: the ingress differential compares against a `main` that predates this projection, so it skips `medicare_part_b_premium@2027`. The `medicare_irmaa_magi` requests still pin the IRMAA ingress path.
Run one file per process at this head: `nh_fap.yaml` 88 passed, `nh_fap_countable_income.yaml` 36, `nh_fap_eligible.yaml` 30, `medicare_part_b_premium.yaml` 16, `test_ss_cola_default_invariance.py` 14 and `test_medicare_premium_projection.py` 162. CI's Microsimulation job runs `test_social_security_current_law.py`.
Pull request run [41958440318](https://github.com/PolicyEngine/policyengine-us/actions/runs/41958440318) passed all 36 jobs at `368314616c695c6fc2839e7e0420596ad3345483`.
## Interactions
- #10111 (`medicare_cost` Part D premium) merges cleanly with this PR, and both test sets pass on the merged tree. Its projected-year `medicare_cost` cases take the Part B premium and Part D IRMAA as inputs.
- #10112 (2015–2023 IRMAA schedules) conflicts in the six Part B parameter files (`part_b/base_premium.yaml` and the five `part_b/irmaa/*.yaml`) and in two test YAMLs (`base_part_b_premium.yaml`, `income_adjusted_part_d_premium_surcharge.yaml`). This PR moves each Part B IRMAA amount under a `values:` key, so whichever PR lands second moves #10112's earlier dates under that key.
impact: the hub will measure
axiom: (hub files pe-parity before landing)
https://claude.ai/code/session_01LwQq6GEuvw3bKC1dT7mUe2Judgment calls
- I updated the derived comment arithmetic in Cases 29, 30, 32 and 36 and the Case 86 percentage, beyond the four comments the review listed. Otherwise those comments would contradict the new expected values.
- I didn't edit the merge commit's message. It names my local branch, and amending it would have meant rewriting commits before the push.
Proposed follow-up
None beyond the review's own CPI-U label follow-up ("Correct the year labels on CPI-U projection points").
Generated by Claude Code
|
Hub review in progress Round 2 review of head Findings so far:
Test runs, more mutants and the #10111 merged-tree runs are still going. Generated by Claude Code |
|
Ready for hub review Round 2 review. The head hasn't moved since METHODOLOGY_CHOICE stays FindingsP3-1. The body's 2027 threshold example is off by $1 before roundingBody, "Examples": "85,000 × 329.001 / 249.280 = 112,184". It's 112,183.4, whether you use the rounded indices or the full averages: The rounded result ($112,000) is unaffected. Replacement: P3-2. The body's "Interactions" section leaves out #10634, which now conflicts
P3-3.
|
| Year | Part B | Part A | Deductible | Single thresholds | 80% tier | Joint top | Separate top |
|---|---|---|---|---|---|---|---|
| 2027 | 209.5 | 600 / 330 | 1,788 | 112,001 / 141,001 / 176,001 / 211,001 / 500,000 | 460.8 | 750,000 | 388,000 |
| 2028 | 224.5 | 629 / 346 | 1,844 | 116,001 / 146,001 / 182,001 / 218,001 / 517,000 | 493.8 | 775,500 | 401,000 |
| 2030 | 255.5 | 694 / 382 | 1,960 | 121,001 / 153,001 / 191,001 / 229,001 / 541,000 | 562.0 | 811,500 | 420,000 |
Hand values, computed before reading the code.
- The 12-month CPI-U averages ending August, from
cpi_u.yaml. August 2018 is 249.28017. August 2026 is 329.00125: October 2025 carries September's 324.245 (the file notes BLS cancelled that release), and July–August carry June's 332.568. - The 2027 unmarried amounts are 112,183.4 / 141,219.2 / 176,194.0 / 211,168.8, which round to 112,000 / 141,000 / 176,000 / 211,000. The 2028 top is 500,000 × 340.3 / 329.00125 = 517,171, which rounds to 517,000. Then joint 1.5 × 517,000 = 775,500, and separate 517,000 − 116,000 = 401,000.
- The Part B premium is 202.90 × 209.5 / 202.9 = 209.50, from the Trustees series in
medicare_part_b_premium_per_enrollee.yaml(2026: 202.9, 2027: 209.5). The 80% tier is 446.30 × 209.5 / 202.9 = 460.82, which rounds to 460.80. - The model matches every value.
Round 1's P1: the old premium in tests. I grepped policyengine_us/tests for 2_434\.8|2434\.8|7790\.4|7_790|202\.90|202\.9\b and found 242 hits. A script assigned each hit to its YAML case and read that case's period:. 231 hits are 2026 and 8 are 2026-01. The other three:
medicare_part_b_premium.yaml:235(2027) and:254(2034), this PR's own projection comments ($487 × 209.50 / 202.90 and 338.50 / 202.90);test_premium_input_uprating.py:325, the Trustees series.
No 2027-or-later case still expects $202.90. The partner hits under tests/policy/baseline/partners/ are all 2026 cases, and this PR doesn't touch them. A second pass loaded each test YAML and listed every case dated 2027 or later whose outputs include a premium reader. They are only this PR's own cases and the three NH FAP files. The Python tests that touch IRMAA in 2027 or later (test_irmaa_first_modeled_year.py, test_irmaa_lookback_and_switch.py) check against the parameter tree, not fixed numbers.
New Hampshire arithmetic. Each changed value and comment:
- Case 86: 28,000 − 2,514 = 25,486, which is 159.7% of 15,960 (1.59687). That's above 23,940 (150%) and below 27,930 (175%), so it stays in band E, and
nh_fapstays 1,100. - Case 28: 18,000 − 2,514 = 15,486.
- Case 29: 24,000 − 2,000 − 2,514 = 19,486.
- Case 30: 24,000 − 23,000 − 2,514 < 0, which floors at 0.
- Case 31: 24,000 − 2,514 = 21,486.
- Case 32: 42,000 − 2 × 2,514 = 36,972, and unit 2 stays 12,000.
- Case 36: min(2,514, 1,200) = 1,200, so it stays 30,000.
nh_fap_eligibleCase 26: 50,000 − 2,514 = 47,486 ≤ 48,713, so it stays eligible.
No band or eligibility outcome moves.
test_ss_cola_default_invariance.py. The irmaa_control fixture is a single 2027 filer with MAGI two years prior of $463,100.31. That falls between 211,001 and 500,000, the 80% tier, so the premium is 12 × (209.50 + 460.80) = 8,043.60, as the test now expects (rtol=0, atol=0.01).
CHANGED_SINCE_REFERENCE. Requests are keyed f"{variable}@{period}" (:126). The skip matches the single exact key medicare_part_b_premium@2027, so medicare_part_b_premium@2024 and @2026, and every medicare_irmaa_* request at every period, are still compared. assert current[route].keys() == main[route].keys() runs before the skipped loop over the full key sets, so a missing request still fails. The Microsimulation job's log (job 127018966157 in run 41958440318) runs this file in its own step, pytest policyengine_us/tests/microsimulation/test_social_security_current_law.py ..., and ends 82 passed in 529.41s. The 82 cases include all 74 test_legacy_public_ingress_matches_unmodified_main[...] routes, each PASSED.
Round 1's P3s. The new comment in get_medicare_irmaa_thresholds (uprating_extensions.py:871-874) matches the code below it. The joint scale uses 1.5 * top, where top comes from get_medicare_irmaa_unmarried_amounts: the fixed $500,000 before 2028 and the indexed amount from 2028. It isn't passed through round_medicare_irmaa_amount, as the comment says. test_separate_top_threshold_falls_until_2028 now uses range(2025, 2028). With -k separate_top_threshold -v, it runs [2025], [2026] and [2027], all PASSED, both at the head and with the hub's mutant applied.
Tests at the head, one file per process:
| File | Result |
|---|---|
nh_fap.yaml |
88 passed |
nh_fap_countable_income.yaml |
36 passed |
nh_fap_eligible.yaml |
30 passed |
medicare_part_b_premium.yaml |
16 passed |
base_part_a_premium.yaml |
24 passed |
base_part_b_premium.yaml |
7 passed |
income_adjusted_part_d_premium_surcharge.yaml |
14 passed |
msp_part_b_premium_coverage.yaml |
4 passed |
test_ss_cola_default_invariance.py |
14 passed |
test_medicare_premium_projection.py |
162 passed |
These agree with the body's counts.
Mutants. Each ran in its own process in a scratch worktree, against test_medicare_premium_projection.py. I restored the file after each, and git status was clean.
| Mutant | Result | Killed by |
|---|---|---|
MEDICARE_IRMAA_TOP_FIRST_INDEXED_YEAR = 2027 (hub) |
survived, 162 passed | equivalent |
Joint top rounded to $1,000, round_medicare_irmaa_amount(1.5 * top) (mine; the competing reading of (i)(3)(C)(ii)) |
1 failed, 161 passed | test_thresholds_follow_the_filing_status_rules |
Part D amounts truncated (ROUND_DOWN) in place of ROUND_HALF_UP (mine) |
31 failed | test_part_d_formula_reproduces_cms_published_amounts[2024-2026], test_part_d_irmaa_is_the_trustees_projection[...] |
| Part A scale taken from the year before the last published one (mine) | 1 failed | test_published_part_a_premiums_take_precedence_and_later_years_grow_from_them |
The hub's mutant is equivalent by construction. For 2027, adjust divides the window ending August 2026 by the base period, also the window ending August 2026. The factor is exactly 1, so the top stays $500,000 whichever year the constant names. The model gives the same answer whether 1395r(i)(5)(C) begins indexing in 2027 or 2028. What does matter is that the base is August 2026 (MEDICARE_IRMAA_TOP_CPI_BASE_YEAR), and round 1's "top CPI base 2026 → 2025" mutant kills a change to that. I couldn't read the statute itself to confirm that (5)(C) names August 2026 (see below).
Subtract the expected Part D premium from medicare_cost #10111 on the merged tree. git merge-tree --write-tree pr-10103 pr-10111 exits 0 with tree 870195a54d. A local merge in a scratch worktree reproduces that tree. On it, one file per process:
| File | Result |
|---|---|
medicare_cost.yaml |
12 passed |
medicare_part_b_premium.yaml |
16 passed |
base_part_a_premium.yaml |
24 passed |
base_part_b_premium.yaml |
7 passed |
income_adjusted_part_d_premium_surcharge.yaml |
14 passed |
msp_part_b_premium_coverage.yaml |
4 passed |
nh_fap.yaml |
88 passed |
nh_fap_countable_income.yaml |
36 passed |
nh_fap_eligible.yaml |
30 passed |
test_medicare_premium_projection.py |
162 passed |
test_medicare_cost_part_d_premium.py |
85 passed |
test_medicare_per_capita_cost.py |
223 passed |
test_part_b_msp_offset.py |
14 passed |
test_ss_cola_default_invariance.py |
14 passed |
That's 729 passed and none failed.
The body's claim that "Subtract the expected Part D premium from medicare_cost #10111 merges cleanly with this PR, and both test sets pass on the merged tree" holds at both current heads.
Other open work. The search for open PRs on the changed file names found:
- Subtract the expected Part D premium from medicare_cost #10111 (
uprating_extensions.py): clean, as above. - Add 2015-2023 Medicare IRMAA brackets and 2015-2020 Part B premiums #10112: still conflicts in exactly the eight files the body names (six Part B parameter files and two test YAMLs), by
git merge-tree. - Charge the Medicare Part B premium only to people who pay it #10634: conflicts (P3-2).
- Add California LIHEAP regular heating assistance #10607, Add Connecticut CEAP regular heating assistance #10611, Add Delaware LIHEAP regular heating assistance #10612 and Add Idaho LIHEAP regular heating assistance #10613 (new LIHEAP programs) and Count only filer-paid premiums in Schedule A medical expenses #10270 read
medicare_part_b_premium. Their added tests pin $2,434.80 only inperiod: 2026cases, or set the premium as an input, so this PR doesn't break them. - Count Medicare net of premiums in CBO household income #10118 changes
medicare_cost.yaml, but its 2027 and 2030 cases setgross_medicare_part_b_premiumand the Part D surcharge as inputs.
CI. Pull request run 41958440318 is the only run at this head. It concluded success, attempt 1, and all 36 jobs concluded success, none cancelled or skipped. That includes Python tests / Full Suite - Microsimulation, Baseline (states-shard-4) and Rest (Python shard 1), the three jobs that failed at 01cc340a38.
Body. It no longer opens with "Draft.". Its projected-values rows for 2026, 2027, 2028 and 2030 match the parameter tree. The CI sentence, the test-run counts and the three files it names under "Tests already on main" all hold. The impact: and axiom: lines are present. Apart from P3-1 and P3-2, the new commits made no body statement stale.
Baseline impact. The diff moves outputs in every year from 2027 and none before. The population check round 1 proposed still applies, 2027–2035:
- aggregate
medicare_part_b_premiumagainst Trustees SMI premium income; medicare_cost;- SPM poverty at 65 and over;
- the medical expense deduction.
The new commits change only tests and a comment, so they add nothing to it.
Scope. Nothing under .github/ or policyengine_us/tests/policy/baseline/partners/ is in the PR's file list. The changelog fragment changelog.d/medicare-part-b-premium-uprating.fixed.md is top-level.
What I couldn't check
- Primary law. This VM couldn't reach www.govinfo.gov (DNS refused), uscode.house.gov, www.law.cornell.edu, www.ecfr.gov or www.ssa.gov. I couldn't read 42 U.S.C. 1395r(i)(3)(C) or (i)(5) to confirm the August 2026 base for the top amount, or the 150% joint rule. My reading of the top-year mutant therefore rests on the model's arithmetic, which is equivalent under either start year, not on the statute's text. The other legal points rest on round 1 and the PR's own citations.
- Whether CMS has announced the 2027 Part B premium and IRMAA thresholds. cms.gov is unreachable from here. Round 1's P2 still stands: the 2027 values stay provisional until CMS publishes, and the hub said it would check before landing.
test_social_security_current_law.pylocally. It builds microsimulations, so I relied on the CI log above.- Population-level impact. That needs data this VM doesn't have.
Generated by Claude Code
Keep the 2015-2023 IRMAA dates and references from main and the uprating and Trustees values from this branch. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
PR Review: Project Medicare premiums and IRMAA past the last announced yearSummaryThe PR replaces the 2026 freeze with projections: Medicare premiums, the Part A deductible, and the Part B and D IRMAA amounts and thresholds now move after CMS's last announced year. I checked each rule against the statute and found the projection logic follows it:
I checked every Trustees cell the PR copies against the 2026 Trustees Report PDF (sha256 CMS had not announced the 2027 Part A and Part B amounts or the 2027 IRMAA brackets as of 2026-11-07:
So 2027 is still a projection. The exception is the 2027 Part D base beneficiary premium of $41.33, which CMS announced on 2026-07-28 and which the PR uses. CI is green at the head (36/36). The PR is 36 commits behind main. The tree merged with main has a conflict in Critical (must fix)None. Should address1. Three new projected-year cases fail on the tree merged with main (merge blocker)
Suggestions1. CMS's 2027 announcement is about a week away.
2. The deductible's tie-breaking rule.
3. Untested guards in
4. Long-run growth after 2035.
5. Optional exit condition. The self-review proposed an exit condition for Verified correctThe law, checked against the statute text (LII):
Transcription.
References.
Order of operations. Projected values (local probe of the merged tree).
These agree with the PR body's table. Hand-checks (15).
Self-review claims.
Tests, scope and conventions.
Axiom line assessmentThe line is valid:
Status. Both issues are OPEN and labelled Dispatch-readiness. The 2026-11-05 extension comments on both issues have:
Blocker. Each issue records it:
Match with the head. Both extensions cite head The n/a part. It is a valid reason for what it covers:
None of these sets a statutory amount, and #1677's comment excludes them explicitly. CI status
Branch statusPosition. The PR is 24 commits ahead of main and 36 behind (main at Merge result.
What main changed since the merge base.
Related PRs.
Verdict: REQUEST_CHANGES |
DTrim99
left a comment
There was a problem hiding this comment.
Requesting changes per the review above: 0 critical, 1 should (merge conflict with #10634 in medicare_part_b_premium.yaml; after resolving it the 3 new projected cases fail because #10634's SSI buy-in nets the premium — add ssi: 0 to each), 5 suggestions. The law, Trustees values and hand-checks all check out.
|
Picking this up for the US hub. I'll post a hand-off comment here when it's ready. Generated by Claude Code |
Two files conflicted, and both keep both sides. - uprating_extensions.py: this branch's Medicare projection functions and main's long_range_growth_rate (#10119) were added at the same place. - medicare_part_b_premium.yaml: this branch's three projected-year cases and main's Part B payer cases (#10634) were appended at the same place. On the merged tree the three projected-year cases fail, because #10634 nets a state's Part B buy-in for SSI recipients out of the premium. The next commit fixes them. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
#10634 made medicare_part_b_premium net out medicaid_part_b_buy_in_premium_coverage. In the Section 1634 and SSI-criteria states that buy-in pays the standard premium for every month a person receives SSI. The three projected-year cases give income only for the IRMAA lookback year, so the model found each person an SSI recipient and the buy-in paid the standard premium. Setting ssi to 0, as #10634 did for the file's other cases, restores the premiums the cases test: 5,028, 8,547.60 and 10,560. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
42 U.S.C. 1395e(b)(1) rounds the Part A deductible to the nearest $4 and sends an amount midway between two multiples to the higher one. The deductible's uprating metadata used core's nearest rounding, which calls Python's round and sends a midpoint to the even multiple. extend_medicare_part_a_deductible now projects it with round_half_up, like the Part A premiums. No year from 2015 to 2124 changes, because no projected deductible lands on a midpoint; a small-series test pins the rule. Two more small-tree tests pin guards that no test reached. A falling CPI-U path leaves the IRMAA amounts at their statutory values, the "(if any)" in 1395r(i)(5)(A) and (C)(ii). A 2027 announcement of only one Part A premium keeps it, and the other premium is projected from its own last published year. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The Social Security ingress test skips medicare_part_b_premium@2027 because its reference main predates the projection. The comment now says to remove the entry once REVIEWED_MAIN_SHA includes the projection, so the skip doesn't outlive its reason. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Ready for hub review This round merges main and resolves DTrim99's review 5813327763 (comment 6709160341) at 1. Main
2. Findings
3. Source conflictsNo finding turns on two sources that disagree, so I added no
Rulings for the hub: none. No change reverses a reading in the body, 4. Axiom lineThe review found the line valid, and I kept it unchanged. Optional comment for rulespec-us#1679, if the hub wants the extension to cite the new head:
5. MutantsM0 is the merged-tree run from section 1. M1 to M3 ran one process each on the projection test file, restoring the code after each (
Suggestion 5 is a comment, so no mutant applies. M1 changes no real year, so only the small-series test can catch it, and it does. 6. Tests at
|
| File | Result |
|---|---|
medicare_part_b_premium.yaml |
22 passed |
base_part_a_premium.yaml |
24 passed |
base_part_b_premium.yaml |
13 passed |
income_adjusted_part_d_premium_surcharge.yaml |
47 passed |
msp_part_b_premium_coverage.yaml |
4 passed |
nh_fap.yaml |
88 passed |
nh_fap_countable_income.yaml |
36 passed |
nh_fap_eligible.yaml |
30 passed |
test_medicare_premium_projection.py |
165 passed |
test_source_conflicts.py |
103 passed |
test_trustees_2026_economic_assumptions.py (whole file, readers test included) |
120 passed |
test_ss_cola_default_invariance.py |
14 passed |
Main's test_long_range_health_growth.py |
23 passed |
Main's test_uprating_extensions.py |
166 passed |
Main's test_medicaid_home_equity_limit_indexing.py |
22 passed |
Main's test_cms_moop_uprating.py |
59 passed |
Main's test_esi_premium_uprating.py |
50 passed |
Main's test_premium_input_uprating.py |
155 passed |
I didn't run test_social_security_current_law.py: it's a microsimulation test, and this round only edits its comment. I ran no full suites and no microsimulations.
CI: Pull request run 42641736699 at c48ef5fb25 is in progress. I didn't wait for it, so I can't yet say whether it skipped or cancelled any job.
7. Body
Every section now matches this head:
- What changes: the deductible row names the function and the midpoint rule.
- Examples: the 2036 deductible example gains the statute quote and the unchanged-years check.
- Invariants: 165 cases, and items 3, 7 and 8 describe the new tests.
- Tests: counts at this head and the CI line.
- Interactions: rewritten as above.
- impact:
impact: the hub will measurebecameimpact: pending a comparison at the final head. - axiom: unchanged.
- Session URL: I removed it, since it's an internal id.
Judgment calls
- Suggestion 2: code, not wording. The cheaper option was rewording the comment. I fixed the code because the departure is from the statute, and Fix inaccurate NY supplemental tax calculations #1679's extension already requires midpoint-up rounding. Dropping the
uprating:metadata means core no longer projects the deductible. The function writes 2027-2100 and holds the 2100 value after it, as core did. - Suggestion 3: Python, not YAML. The pins are Python tests, because no year's real data reaches either guard. CLAUDE.md allows Python for behavior YAML can't reach.
- The (if any) test's tolerance. The floor test checks each amount stays within $1,000 above its statutory value, rather than pinning $134,000 for $133,500. Whether a zero increase still triggers (5)(B)'s rounding is moot until CPI-U falls.
- Scratch work. The checks against Glide the Medicare Part B premium and spending per enrollee upraters to the Trustees' long-range rates #10657 ran on a throwaway merge, and nothing from it is in this branch.
Follow-up issue proposed
- Add CMS's 2027 Parts A and B amounts and IRMAA brackets when CMS publishes them. Move
LAST_ANNOUNCED_YEARto 2027 and update the 2028-2035 Trustees rows intest_medicare_premium_projection.py. Check the 2027 thresholds against CMS's, since three sit near a rounding step.
DISMISSAL MAP
- Critical: none in the review.
- Should 1 (merge conflict; three cases fail on the merged tree; body Interactions): fixed.
40875f112amerges main;fca23cd2d0addsssi: 0atmedicare_part_b_premium.yaml:226,:244and:265. Interactions names Glide the Medicare Part B premium and spending per enrollee upraters to the Trustees' long-range rates #10657 and drops the Add 2015-2023 Medicare IRMAA brackets and 2015-2020 Part B premiums #10112 and Charge the Medicare Part B premium only to people who pay it #10634 notes. - Suggestion 1 (CMS's 2027 amounts): skipped; CMS hasn't published them (fact sheet 404 and no Federal Register notice on 2026-11-09). Proposed follow-up above.
- Suggestion 2 (deductible tie-breaking): fixed in code at
uprating_extensions.py:925-950and:1674, with the comment atpart_a/deductible.yaml:6-11. Pinned bytest_medicare_premium_projection.py:408; M1 dies. - Suggestion 3 (untested guards): tests added at
test_medicare_premium_projection.py:581(the "(if any)" floor, M2 dies) and:728(the reduced premium's own last year, M3 dies). - Suggestion 4 (long-run growth after 2035): no change here. Glide the Medicare Part B premium and spending per enrollee upraters to the Trustees' long-range rates #10657 glides the series, and on a scratch merge it lowers every base premium after 2035 and leaves 2035 and earlier unchanged.
- Suggestion 5 (exit condition): fixed at
test_social_security_current_law.py:68-69.
Generated by Claude Code
PR Review (round 2): Project Medicare premiums and IRMAA past the last announced yearSummaryRound 1 (head
CI is green at the head (36/36). The branch merges cleanly with current main. I found no new critical or should-address issue. Prior findings
New findingsCritical: none. Should address: none. Suggestions
VerifiedHand-resolved block 1: Hand-resolved block 2:
Hand-checks of every new or changed expectation.
New tests: conventions and cost.
Law. I checked the 1395e(b)(1) text in round 1: an amount "midway between two multiples of $4, to the next higher multiple of $4". The new code now matches it. The parameter comment and the No regressions in the fix commits.
AxiomThe line is unchanged and still valid:
CI
BranchPosition. The PR is 28 commits ahead of main and 6 behind (main at Merge result. Main's six new commits. They are:
They overlap the PR only in Siblings.
Verdict: APPROVE |
DTrim99
left a comment
There was a problem hiding this comment.
Round 2: the #10634 merge keeps both blocks and the three projected cases now set ssi: 0 (22/22 pass); the uprating merge resolution is correct; the deductible midpoint and both guards are pinned; CI is green. CMS hasn't announced 2027 yet. Three optional suggestions remain.
test_social_security_current_law.py conflicted, and the result keeps both sides. It keeps this branch's CHANGED_SINCE_REFERENCE skip for the 2027 Part B premium in both loops of the ingress comparison, and main's INCOME_TAX_CHANGE_2027 pins from Rev. Proc. 2026-35 (#10683), which the second loop checks after that skip. The two cover different requests, so each check runs as before. uprating_extensions.py merged without a conflict. It keeps this branch's Medicare projection functions and calls and main's 2027 ACA benchmark extension (#10682), each once. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
On
main,gov.hhs.medicare.part_b.base_premium, the Part A premiums, the Part A deductible, and the Part B and D IRMAA amounts and thresholds stop at their last CMS-announced year and carry no uprating. So every year from 2027 on holds the 2026 values: $202.90 a month for Part B, and the same IRMAA brackets. This PR projects each of them past the last announced year. CMS values in the YAML still take precedence for their own years.What changes
part_b.base_premium)calibration.gov.hhs.cms.medicare_part_b_premium_per_enrollee(onmainsince #10085)uprating:metadatauprating:metadata on each bracket amountextend_medicare_part_a_premiumsextend_medicare_part_a_premiumsextend_medicare_part_a_deductibleextend_medicare_irmaa_thresholdsextend_medicare_part_d_irmaa_amountsNew parameters:
calibration.gov.hhs.cms.medicare_part_a_premium_per_enrollee,medicare_part_a_deductibleandmedicare_part_d_base_beneficiary_premium_per_enrollee: Trustees Tables V.E1 and V.E2 for 2015–2035. They grow at their 2034–2035 rate to 2100 and hold after that. The 2027 Part D base premium ($41.33) is also the CMS-announced value.gov.hhs.medicare.part_d.base_beneficiary_premium_percent: 25.5% from 2006, and 20% from 2030.The threshold rules follow each filing status's published 2024–2026 scales. Joint thresholds are twice the unmarried ones, and the joint top tier is 1.5 × the unmarried top. Married filing separately has two tiers, starting $1 above the unmarried threshold amount and at the top amount less that threshold.
Projected values (hand-checked)
Examples:
nearestuprating rounding sends it to the even multiple, so the deductible is projected in code. No year from 2015 to 2124 changes, since none lands on a midpoint.Sources
Invariants
These are tested in
policyengine_us/tests/core/test_medicare_premium_projection.py, with 165 cases, some of them Hypothesis properties:YAML cases in
base_part_a_premium,base_part_b_premium,income_adjusted_part_d_premium_surcharge,medicare_part_b_premiumandmsp_part_b_premium_coveragecover the household effects in projected years.Tests already on
mainthat pinned the 2027 Part B premium at the frozen $202.90 now expect the projected $209.50 (12 × 209.50 = $2,514 a year):nh_fap.yaml,nh_fap_countable_income.yamlandnh_fap_eligible.yaml(New Hampshire FAP): the 2027 premium and the countable income derived from it, for example 18,000 − 2,514 = 15,486. No band or eligibility outcome changes.policyengine_us/tests/unit/test_ss_cola_default_invariance.py: the 80% IRMAA tier's 2027 premium is 12 × (209.50 + 460.80) = $8,043.60.policyengine_us/tests/microsimulation/test_social_security_current_law.py: the ingress differential compares against amainthat predates this projection, so it skipsmedicare_part_b_premium@2027. Themedicare_irmaa_magirequests still pin the IRMAA ingress path. A comment says to remove the skip onceREVIEWED_MAIN_SHAincludes the projection.Run one file per process at this head (
c48ef5fb25):medicare_part_b_premium.yaml22 passed,base_part_a_premium.yaml24,base_part_b_premium.yaml13,income_adjusted_part_d_premium_surcharge.yaml47,msp_part_b_premium_coverage.yaml4,nh_fap.yaml88,nh_fap_countable_income.yaml36,nh_fap_eligible.yaml30,test_medicare_premium_projection.py165,test_ss_cola_default_invariance.py14,test_trustees_2026_economic_assumptions.py120 andtest_source_conflicts.py103. CI's Microsimulation job runstest_social_security_current_law.py.CI: the Pull request run at
c48ef5fb25, 42641736699, is pending.Interactions
part_b.base_premiumfollows here. It merges cleanly with this head. On a scratch merge, every base premium through 2035 is unchanged, and later ones are lower: $751.30 against $931.20 in 2050, and $4,612.50 against $21,998.00 in 2100.test_medicare_premium_projection.py(165) andtest_long_range_health_growth.py(37) pass on that merge.medicare_costPart D premium) and Count Medicare net of premiums in CBO household income #10118 (Medicare net of premiums in CBO household income) merge cleanly with this head. Subtract the expected Part D premium from medicare_cost #10111's projected-yearmedicare_costcases take the Part B premium and Part D IRMAA as inputs.medicare_part_b_premium.yamlsetssi: 0, as Charge the Medicare Part B premium only to people who pay it #10634 did for the file's other cases, so the state buy-in it added doesn't pay their premiums.impact: pending a comparison at the final head.
axiom: TheAxiomFoundation/rulespec-us#1677 queued, extended with a comment (IRMAA indexing and formulas, and Part B premium rounding); TheAxiomFoundation/rulespec-us#1679 queued, extended with a comment (Part A premium and deductible rules). Both await corpus re-pin and approved encoder dispatch. n/a: announced data, forecast amounts, calibration assumptions and extrapolation.
🤖 Generated with Claude Code