Skip to content

Decide NM Premium Assistance's income edges on the exact FPL ratio - #10328

Draft
MaxGhenis wants to merge 1 commit into
mainfrom
nm-premium-assistance-exact-fpl-ratio
Draft

MaxGhenis wants to merge 1 commit into
mainfrom
nm-premium-assistance-exact-fpl-ratio

Conversation

@MaxGhenis

@MaxGhenis MaxGhenis commented Oct 20, 2026 •

Copy link
Copy Markdown
Contributor

Draft. Done: the fix and YAML cases. Pending: full-file impact, Axiom parity line, GPT-6.1 Sol review.

Bug

New Mexico Premium Assistance compared the truncated aca_magi_fraction (np.floor(100 * magi / fpg) / 100) with three income edges:

Edge Source Comparison on main Defect
Base program ceiling PY2026 MAP manual, p.6: "consumers with household income over 400% of the FPL do not qualify" <= 4.0 admits 400.00%-400.99% (the federal gate, which ends at 400%, hid it under current law)
Middle Income Household floor Addendum 1, Section I.A(3): "Have a household income above 400% of the FPL." > 4.0 excludes 400.00%-400.99%
PY2026 10% benchmark gross-up PY2026 MAP manual, p.5: "For eligible individuals up to 200% FPL"; the ungrossed formula covers "individuals between 200.01-400% FPL" <= 2.0 grosses up 200.00%-200.99%

So an income from 400.003% to 400.994% of the poverty line got neither component: federally ineligible (no base program) and not "above" 4.00 (no MIH). NMSA 1978 § 59A-23F-12(A)(2), as amended by HB 2 (2025 1st S.S.), qualifies residents who either have income "below four hundred percent" and qualify for APTC, or "meet all eligibility criteria for the advanced premium tax credit ... except for household income requirements", so the statute leaves the split at exactly 400% to HCA, whose manual keeps it in the base program. No source prescribes truncating the percentage; "200.01" labels the next range rather than setting a rounding rule. The PY2027 gross-up ("under 200%") is strict, so truncation already got it right.

Executed on main (645fcd3; these files are unchanged at 740e1eb), single filer in New Mexico, 2026, 2025 one-person guideline $15,650:

Income Exact % of FPL aca_magi_fraction Main Here
$31,300 200.000% 2.00 gross-up gross-up
$31,300.47 200.003% 2.00 gross-up none
$31,455.56 200.994% 2.00 gross-up none
$62,600 400.000% 4.00 base (gate alone), not MIH base, not MIH
$62,600.47 400.003% 4.00 neither (base gate alone: yes) MIH
$62,700 400.639% 4.00 $0, neither MIH, $2,670.50 on an $8,000 benchmark

Fix

All three edges read the exact ratio max(aca_magi, 0) / tax_unit_fpg(period.last_year), the pattern of #10305. The target-contribution schedule still interpolates on aca_magi_fraction; only the eligibility and gross-up edges move. benchmark_gross_up.boundary_inclusive keeps PY2026 inclusive at exactly 200% and PY2027 strict. The fpl_limit comment says both components compare the exact ratio.

Invariants

For every input, r = max(MAGI, 0) / FPG(prior year):

  1. Partition. No tax unit is eligible for both the base program and MIH (base needs r <= 4, MIH r > 4). A premium-paying, non-MFS filer that is federally income-eligible at r <= 4 is base-eligible, and every such filer with r > 4 is MIH-eligible, so no income above 100% falls between them.
  2. Gross-up = manual. For base-eligible units the 10% gross-up applies exactly when r <= 2 (PY2026) or r < 2 (PY2027).
  3. Where results move. MIH eligibility is gained for r in (4.00, 4.01). The PY2026 gross-up is lost for r in (2.00, 2.01). Base eligibility is lost for r in (4.00, 4.01), which is federally ineligible under current law. Nothing else changes for consistent inputs.

No Hypothesis test is added: the YAML cases hit each edge exactly and 0.003 and 0.994 points above it with the real guideline, and the existing cases cover the bands' interiors. The repo's test-design rules keep such cases in YAML.

Tests

  • Every case in the NM YAML files that supplied aca_magi_fraction without aca_magi now supplies aca_magi against a prior-year tax_unit_fpg of $10,000.
  • Case 24 expected $0 for a $62,700 filer, with the comment "MIH-ineligible (not > 4.0)" and "May move when Federal ACA PTC income gate zeroes the credit at [400%, 401%) FPL (truncation boundary vs Form 8962) #9264 lands". $62,700 is 400.64% of $15,650, above 400%: it now expects MIH eligibility and $2,670.50 (8_000 - 0.085 * 62_700).
  • About twenty cases supplied a fraction that disagreed with their own aca_magi, found by re-deriving each fraction from its MAGI (for example "400% FPL" with $60,000, which is 383% of $15,650). With the gate reading MAGI, each would have judged eligibility and the target percentage on different incomes.
    • Where the case's arithmetic assumed another guideline, mostly $15,000, the prior-year tax_unit_fpg is pinned to that guideline and every expected value stands (Cases 4, 5, 6, 8, 10, 15, 19, 20; Scenarios 1, 4, 9, 10).
    • Otherwise the income moves to the stated percentage of the real guideline and the expected amount is recomputed by hand: Case 3 $2,988 → $2,987.42; Case 16 $4,887.25 → $4,665.70; Case 17 and Scenario 11 $6,390 → $4,449.45 (a couple: 420% of $21,150 is $88,830); Case 22 $2,050 → $2,013.875; Case 23 $5,495 → $5,493.6875. Cases 9, 11, 13, 14 and 21 and Scenarios 8 and 14 keep their $0 or unchanged amounts.
  • Case 18 (negative MAGI, base band) keeps a supplied 3.00 fraction so its target percentage is nonzero and the clamp matters. Its exact ratio is 0, inside the PY2026 gross-up, so it expects $5,900 rather than $5,000. Case 29 (negative MAGI, MIH) now supplies MIH eligibility to reach the clamp.
  • New cases with the real guideline: base eligibility at $62,600 / $62,600.47 / $62,755.56; MIH eligibility at the same three incomes; the gross-up at $31,300 / $31,300.47 / $31,455.56 (PY2026) and $31,919 / $31,920 (PY2027, 2026 guideline $15,960).
  • Mutation check: main's three variables fail exactly the six new above-edge cases, Case 24 and Case 18.
  • Local differential sweep (a script, not committed, per the repo's test-design rules): 256 tax units per year, 60% with income in cents within $2 of an edge and the rest uniform, guidelines $10,000-$80,000 including $20 multiples, comparing the base and MIH gates (2026, and MIH 2027) with an exact-rational reading of the source on the float32 values the model receives. 0 mismatches here; on main the same draws give 81 (base) and 83 / 93 (MIH, 2026 / 2027) mismatches, all in the truncation sliver.
  • Local run: the NM Premium Assistance YAML folder, 101 passed.

Impact

Pending: full-file microsimulation via the US hub impact queue, 2026 and 2027.

Coordination

#10041 (draft) edits nm_premium_assistance.yaml and nm_premium_assistance_mih_eligible.yaml and changes aca_magi_fraction's denominator to a new aca_fpg; if it lands, these exact ratios should use the same denominator. #10312 makes exactly 400% federally eligible, which reaches the base program's inclusive ceiling. Part of the aca_magi_fraction audit (table: #10329) begun with #10305.

axiom: pending

🤖 Generated with Claude Code

New Mexico's base program excludes "consumers with household income over
400% of the FPL", Addendum 1 covers Middle Income Households with income
"above 400% of the FPL", and the PY2026 manual grosses up the benchmark
"up to 200% FPL" (the next range starts at "200.01"). All three compared
the truncated aca_magi_fraction, which maps 400.00%-400.99% to 4.00 and
200.00%-200.99% to 2.00. So incomes just above 400% were in neither
component (the federal gate ends the base program at 400%, and MIH needed
a fraction above 4.00), and the PY2026 gross-up reached 200.99%. Test the
exact ratio of nonnegative ACA MAGI to the prior-year guideline instead.

Case 24 expected $0 for a $62,700 filer (400.64%) because of the gap; it
now expects the $2,670.50 MIH amount. About twenty cases supplied a
fraction that disagreed with their own MAGI. Where the case's arithmetic
assumed another guideline (often $15,000), its prior-year tax_unit_fpg is
pinned to that guideline; otherwise the income and expected amount are
recomputed. Case 29 now supplies MIH eligibility to reach the negative-
income clamp.

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