Skip to content

Add New Mexico premium assistance (BeWell NM state subsidy) - #9232

Draft
DTrim99 wants to merge 4 commits into
mainfrom
nm-premium-assistance
Draft

Add New Mexico premium assistance (BeWell NM state subsidy)#9232
DTrim99 wants to merge 4 commits into
mainfrom
nm-premium-assistance

Conversation

@DTrim99

@DTrim99 DTrim99 commented Aug 5, 2026

Copy link
Copy Markdown
Collaborator

Implement New Mexico Premium Assistance (NMPA + MIH)

Summary

Implements the New Mexico Premium Assistance program (NMPA), the premium top-up component of New Mexico's Health Insurance Marketplace Affordability Program (MAP), funded by the Health Care Affordability Fund (HCAF) and administered by the NM Health Care Authority (HCA) via the BeWell Marketplace.

Two components, combined in a single output variable nm_premium_assistance:

  • Base NMPA (≤400% FPL): a sliding-scale state top-up to the federal Premium Tax Credit that caps the household's benchmark (SLCSP) premium contribution at 0%–8.5% of ACA MAGI, with a 10% benchmark gross-up for enrollees at or below 200% FPL.
  • MIH (>400% FPL): the Marketplace Affordability Program for Middle Income Households, which caps the SLCSP cost at a flat 8.5% of income for households above 400% FPL — New Mexico's state backstop for the expired enhanced federal credits.

The implementation covers plan years 2026–2027 (PY2026 authoritative values carried forward to PY2027), integrates into healthcare_benefit_value, and adds a programs.yaml registry entry. All 75 tests across 6 test files pass.

Closes #9219

Regulatory Authority

Source Role
PY2026 MAP Policy & Procedures Manual (HCA, May 8, 2025) Primary: eligibility, Table 1 sliding scale, calculation formulas, $0 floor
PY2026 MAP Addendum #1: Middle Income Households (HCA, Nov 18, 2025) Primary: MIH eligibility, 8.5% cap, effective dates, sunset clause (formula on p.3)
SB 317 (2021), Laws 2021 Ch. 136 Enabling statute: HCAF creation (Sec. 4(B), p.7); Sec. 5(A)(2) ties state income eligibility to APTC-eligible income (p.9)
LFC Program Evaluation 25-01: The Health Care Affordability Fund (June 25, 2025) Cross-check: PY2025 scale (Table 8) — identical to PY2026
OSI/Checkbook APTC analysis (Oct 22, 2025) Cross-check: side-by-side scale (Table 1, p.3), FPL year lag (p.3), rating areas (Table 2, p.4), >400% examples (p.11)

Page anchors are file pages of each PDF, verified against extracted text.

Eligibility

Base NMPA (≤400% FPL)nm_premium_assistance_eligible (Manual p.4):

  1. Eligible to purchase a QHP on the BeWell Marketplace, on-exchange only (proxied through pays_aca_premium inside is_aca_ptc_eligible).
  2. Qualifies for the federal Premium Tax Credit — any tax-unit member is_aca_ptc_eligible (Manual p.4; SB 317 Sec. 5(A)(2), p.9).
  3. Household income at or below 400% FPL (aca_magi_fraction <= 4.0); "consumers with household income over 400% of the FPL do not qualify" for base NMPA (Manual p.6).

MIH (>400% FPL)nm_mih_eligible (Addendum p.2):

  1. Eligible to purchase a QHP on the Marketplace.
  2. Meets all federal PTC eligibility criteria except the household-income requirement. Because is_aca_ptc_eligible embeds the ≤400% income test (which fails above 400% in 2026), the formula uses its non-income internals directly: pays_aca_premium and the married-filing-separately exclusion.
  3. Household income above 400% FPL (aca_magi_fraction > 4.0, sharing the same fpl_limit parameter so the band boundary is defined once).

Both variables use defined_for = StateCode.NM and are gated by their respective in_effect parameters.

Benefit Calculation

Target contribution schedule (Table 1, PY2026) — the household's expected benchmark-premium contribution as a share of ACA MAGI, linearly interpolated within brackets (Manual p.4p.5):

FPL band Target contribution
Up to 150% 0%
150–200% 0%
200–250% 0% → 2% (interpolated)
250–300% 2% → 5% (interpolated)
300–400% 5% → 8.5% (interpolated)
Over 400% Flat 8.5% (MIH, no interpolation)

Encoded as target_contribution_percentage/{threshold, initial, final}.yaml (thresholds [0, 1.5, 2.0, 2.5, 3.0, 4.0]), mirroring the federal gov/aca/required_contribution_percentage structure, with nm_premium_assistance_target_contribution_percentage performing the bracket interpolation over aca_magi_fraction.

Benchmark gross-up (≤200% FPL): for enrollees at or below 200% FPL, the NMPA benchmark is 110% of the SLCSP ("the benchmark plan used to calculate the New Mexico Premium Assistance amount will be 10% above the price of the second lowest cost Silver plan"; Manual p.5). The gross-up affects only the state calculation, never the federal APTC. This is not a no-op even though the target percentage is 0% below 200% FPL — it adds 10% of the SLCSP on top of the SLCSP − APTC residual, which is why the implementation uses the manual's direct-residual formulas rather than Maryland's contribution-gap form. Parameters: benchmark_gross_up/{rate, fpl_limit}.yaml (0.1, 2.0).

Formulas (annualized; the manual states them monthly, dividing annual income by 12; Manual p.5; Addendum p.3):

  • Under 200% FPL: NMPA = max(0, 1.1 × SLCSP − APTC − target% × ACA MAGI)
  • 200.01–400% FPL: NMPA = max(0, SLCSP − APTC − target% × ACA MAGI)
  • Over 400% FPL (MIH): NMPA = max(0, SLCSP − APTC − 8.5% × ACA MAGI) — the Addendum formula has no APTC term because federal APTC is $0 above 400% FPL in the 2026 baseline; subtracting aca_ptc anyway is a no-op in baseline and keeps the formula robust under reform scenarios. Rate parameter: mih/rate.yaml (0.085).

slcsp is a MONTH-period variable, annualized via add(tax_unit, period, ["slcsp"]). ACA MAGI is clamped at zero (max_(aca_magi, 0)) so negative income cannot inflate the top-up. The $0 floor applies in every band: the consumer's net premium cannot fall below $0 (Manual p.6). The manual's selected-plan premium cap is approximated by the SLCSP-based residual, since the selected plan is unknown in the model (the same simplification as Maryland Premium Assistance).

Requirements Coverage

20 of 30 extracted requirements are in scope; all 20 are implemented and tested (see Not Modeled for the rest).

REQ Description Parameter Variable Test
REQ-001 QHP-eligible on BeWell, on-exchange only is_aca_ptc_eligible / pays_aca_premium gates in both eligibility variables eligible.yaml C1, C4
REQ-002 Must qualify for federal PTC (any member) nm_premium_assistance_eligible (tax_unit.any) eligible.yaml C4, C8
REQ-003 Income ≤400% FPL for base NMPA fpl_limit.yaml (4.0) nm_premium_assistance_eligible eligible.yaml C2, C3, C10, C12
REQ-006 MIH: PTC criteria except income, >400% FPL fpl_limit.yaml, mih/in_effect.yaml nm_mih_eligible nm_mih_eligible.yaml (8 cases); amount C7, C9, C16, C17; integration S5, S6, S11
REQ-007 MIH sunset clause (federal cap not extended) mih/in_effect.yaml (clause documented) nm_mih_eligible MIH 2026 cases
REQ-009 Income = ACA MAGI (45 CFR 155.305(f)(i)) aca_magi in nm_premium_assistance all amount tests
REQ-010 Plan year uses prior calendar year FPL aca_magi_fraction (reused) all schedule/eligibility tests
REQ-011 Benchmark = SLCSP, annualized add(tax_unit, period, ["slcsp"]) all amount tests
REQ-012 Table 1 interpolated sliding scale target_contribution_percentage/{threshold,initial,final}.yaml nm_premium_assistance_target_contribution_percentage 18 schedule tests
REQ-013 SLCSP × 1.1 gross-up at ≤200% FPL benchmark_gross_up/{rate,fpl_limit}.yaml nm_premium_assistance amount C1–C3; integration S1, S2
REQ-014 Under-200% formula (1.1×SLCSP − APTC − pct×income) (REQ-013 params) nm_premium_assistance amount C1, C2, C12
REQ-015 200.01–400% formula (SLCSP − APTC − pct×income) nm_premium_assistance amount C3–C5; integration S3, S4
REQ-016 MIH formula (SLCSP − 8.5%×income) mih/rate.yaml (0.085) nm_premium_assistance amount C7, C8; integration S5, S6
REQ-017 $0 floor / premium cap max_(0, ...) in nm_premium_assistance amount C6, C8; integration S6
REQ-019 Base NMPA effective Jan 1, 2026 in_effect.yaml both eligibility variables eligible C6, C7, C11; amount C11, C19
REQ-020 MIH coverage PY2026 mih/in_effect.yaml nm_mih_eligible MIH 2026 cases
REQ-022 SB 317 Sec. 5(A)(2): income tied to APTC eligibility embedded in is_aca_ptc_eligible gate eligible C4
REQ-028 healthcare_benefit_value integration adds entry in healthcare_benefit_value healthcare_benefit_value.yaml Case 7
REQ-029 programs.yaml registry entry programs.yaml (id nm_premium_assistance, agency HCA, prefix gov.states.nm.hca.premium_assistance, verified_years 2026–2027)
REQ-030 Changelog fragment + formatting changelog.d/nm-premium-assistance.added.md ruff format verified

Test totals: 75 passing across 6 files (eligible 12, MIH eligible 8, target percentage 18, amount 19, integration 11, healthcare_benefit_value 7).

Not Modeled

Documented per the scope decision; excluded from the model:

  • REQ-004 — Metal-tier selection (any tier except Catastrophic): benefit is computed off the SLCSP benchmark, not the selected plan.
  • REQ-005 — ICHRA acceptance disqualifies from APTC/NMPA: no ICHRA input variable exists in the model.
  • REQ-008 — MIH enrollment window (Nov 1, 2025 – Jan 15, 2026; SEP after): enrollment mechanics are out of model scope.
  • REQ-018 — QSEHRA offset reducing NMPA to a $0 net premium: no QSEHRA input variable exists.
  • REQ-021 — Funding horizon (FY26 budget; press cites assistance through June 30, 2027): a mid-year end date cannot be represented in a YEAR-period program; handled via the in_effect window instead.
  • REQ-023 — Appropriation caps (~$68M base, $17.3M MIH): discretionary funding limits, not per-household rules.
  • REQ-024 — No consumer year-end reconciliation of NMPA: administrative payment mechanics, no simulation effect.
  • REQ-025 — Native American Premium Assistance (NAPA): requires tribal membership and issuer-level lowest-cost-plan data the model lacks.
  • REQ-026 — State Out-of-Pocket Assistance (SOPA): a cost-sharing (actuarial-value) program, not premium assistance.
  • REQ-027 — MAP Addendum Run black formatting on docs #2 "Puente" program: separate program, out of scope.

Historical Notes

  • PY2025 scale is identical to PY2026: LFC Program Evaluation 25-01 Table 8 (p.14) shows the same 0% / 0% / 0–2% / 2–5% / 5–8.5% schedule for PY2025 (2024 FPL). This PR does not backdate to 2025 (in_effect starts 2026-01-01); backdating would be a follow-up.
  • MIH enactment and conditional effective date: HB2 (2025 regular session, signed Oct 3, 2025) authorized assistance above 400% FPL, funded by a $17.3M HCAF appropriation through HB1 (Addendum p.2). The Addendum contains a conditional clause: it would not take effect if the federal government extended the 8.5% >400% premium cap before January 1, 2026. Congress did not extend the enhanced federal credits, so MIH is live for PY2026. mih/in_effect.yaml encodes this directly (true from 2026-01-01) with the clause documented in its description, rather than deriving it from federal parameters.
  • Carry-forward assumption: PY2026 authoritative values are carried through PY2027 (in_effect true 2026-01-01, false 2028-01-01), matching the Maryland Premium Assistance approach, pending official PY2027 parameters. The carry-forward is documented in the parameter descriptions.

Files Added

changelog.d/
└── nm-premium-assistance.added.md                                  (new)

policyengine_us/parameters/gov/states/nm/hca/premium_assistance/
├── in_effect.yaml                                                  (new)
├── fpl_limit.yaml                                                  (new)
├── benchmark_gross_up/
│   ├── fpl_limit.yaml                                              (new)
│   └── rate.yaml                                                   (new)
├── mih/
│   ├── in_effect.yaml                                              (new)
│   └── rate.yaml                                                   (new)
└── target_contribution_percentage/
    ├── threshold.yaml                                              (new)
    ├── initial.yaml                                                (new)
    └── final.yaml                                                  (new)

policyengine_us/variables/gov/states/nm/hca/premium_assistance/
├── nm_premium_assistance.py                                        (new)
├── nm_premium_assistance_eligible.py                               (new)
├── nm_mih_eligible.py                                              (new)
└── nm_premium_assistance_target_contribution_percentage.py         (new)

policyengine_us/tests/policy/baseline/gov/states/nm/hca/premium_assistance/
├── nm_premium_assistance.yaml                                      (new, 19 cases)
├── nm_premium_assistance_eligible.yaml                             (new, 12 cases)
├── nm_mih_eligible.yaml                                            (new, 8 cases)
├── nm_premium_assistance_target_contribution_percentage.yaml       (new, 18 cases)
└── integration.yaml                                                (new, 11 cases)

Modified:
├── policyengine_us/variables/household/healthcare_benefit_value.py (adds nm_premium_assistance)
├── policyengine_us/tests/policy/baseline/household/healthcare_benefit_value.yaml (NM Case 7)
└── policyengine_us/programs.yaml                                   (registry entry)

DTrim99 and others added 3 commits August 5, 2026 08:57
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@codecov

codecov Bot commented Aug 5, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 100.00%. Comparing base (63bcfc5) to head (61957da).
⚠️ Report is 2 commits behind head on main.

Additional details and impacted files
@@            Coverage Diff            @@
##              main     #9232   +/-   ##
=========================================
  Coverage   100.00%   100.00%           
=========================================
  Files           12         5    -7     
  Lines          192        93   -99     
=========================================
- Hits           192        93   -99     
Flag Coverage Δ
unittests 100.00% <100.00%> (ø)

Flags with carried forward coverage won't be shown. Click here to find out more.

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

- Use add(...) > 0 instead of tax_unit.any(members(...)) in
  nm_premium_assistance_eligible.py and nm_mih_eligible.py (house idiom;
  behavior-identical)
- benchmark_gross_up/rate.yaml: approved-verb description
- nm_premium_assistance.py: strengthen the MIH -aca_ptc comment (intentional,
  inert in the PY2026 baseline where federal APTC is $0 above 400% FPL,
  retained for reform-robustness); comment the searchsorted interpolation
- in_effect.yaml: document the PY2027 carry-forward / 2028-sunset assumption
- Tests: 2028 amount-level sunset (base + MIH), 2028 nm_mih_eligible, a
  MIH case with non-zero APTC exercising the -aca_ptc term, a mid-bracket
  interpolation case, and a derived-from-raw-income integration scenario
  asserting a genuine $2,549.86 top-up (81/81 NM tests passing)

No parameter values or formula logic changed.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@DTrim99

DTrim99 commented Aug 6, 2026

Copy link
Copy Markdown
Collaborator Author

Review fixes applied (/review-program/fix-pr)

Ran a full multi-agent review pass (regulatory, references, code patterns, test coverage, and PDF value audit against the PY2026 MAP Manual + Addendum + OSI analysis). 0 critical, 0 value mismatches — the base sliding scale, the <200% SLCSP×1.1 gross-up, the >400% MIH cap, the $0 floor, and every #page anchor verified against source. Applied all should-address items and suggestions:

Code / docs

  • .any()add(...) > 0 house idiom in nm_premium_assistance_eligible.py and nm_mih_eligible.py (behavior-identical member aggregation).
  • benchmark_gross_up/rate.yaml: reworded the description to an approved verb.
  • MIH - aca_ptc term (nm_premium_assistance.py): strengthened the comment documenting it is intentional and inert in the PY2026 baseline (federal APTC is $0 above 400% FPL, so it reproduces the Addendum formula exactly) and retained so the state subsidy nets any APTC a future reform restores above 400% FPL. The audit confirmed this is not a value defect.
  • Added an explanatory comment above the hand-rolled searchsorted within-bracket interpolation.
  • in_effect.yaml: documented that PY2027 carry-forward and the 2028 sunset are modeling assumptions (the MAP Manual covers PY2026 only).

Tests (81/81 NM cases passing)

  • 2028 sunset at the amount level (base band → 0, MIH band → 0), and nm_mih_eligible → false in 2028 (closing the in-effect window on both sides).
  • A MIH case with a non-zero injected aca_ptc exercising the - aca_ptc term (documents the reform-scenario behavior).
  • A mid-bracket interpolation case (275% FPL → 3.5% target).
  • A derived-from-raw-income integration scenario: aca_magi_fraction, aca_ptc, and is_aca_ptc_eligible all derive from raw employment_income, asserting a genuine $2,549.86 state top-up — so a future change to the federal ACA chain would be caught, not silently pass.

No parameter values or formula logic changed. CI green.

🤖 Generated with Claude Code

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.

Model New Mexico Premium Assistance (full ARPA-schedule backfill incl. >400% FPL 8.5% cap)

1 participant