Skip to content

Treat income exactly at 400% FPL as premium tax credit eligible - #10312

Draft
MaxGhenis wants to merge 1 commit into
mainfrom
aca-ptc-400-percent-inclusive
Draft

MaxGhenis wants to merge 1 commit into
mainfrom
aca-ptc-400-percent-inclusive

Conversation

@MaxGhenis

@MaxGhenis MaxGhenis commented Oct 20, 2026 •

Copy link
Copy Markdown
Contributor

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

Bug

26 U.S.C. 36B(c)(1)(A) makes an applicable taxpayer one whose household income "equals or exceeds 100 percent but does not exceed 400 percent" of the poverty line. Form 8962 Worksheet 2 asks "Is the amount on line 1 more than the amount on line 3?" (income against 4 x the poverty line, in dollars) and only then drops the decimals for line 5. The 2020 edition, the last year the cap applied, has the same worksheet.

gov.aca.ptc_income_eligibility is a single_amount scale whose 400% bracket (false from 2026) starts at 4.00, evaluated on the truncated aca_magi_fraction. So a household exactly at 400% fell into the ineligible bracket. Above 400% the truncation does no harm here: 400.003% truncates to 4.00, which is already ineligible.

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

Income Exact % of FPL aca_magi_fraction Eligible on main Eligible here
$62,599 399.994% 3.99 yes yes
$62,600 400.000% 4.00 no yes
$62,600.47 400.003% 4.00 no no
$62,755.56 400.994% 4.00 no no

aca_ptc at $62,600 goes from $0 to $5,765.04 on a $12,000 benchmark (9.96% applicable percentage).

Fix

  • New aca_ptc_income_eligible (tax unit, bool) carries the income test. It evaluates the scale on the truncated fraction, as before, and additionally right-closed when the exact ratio max(aca_magi, 0) / tax_unit_fpg(prior year) does not exceed the truncated fraction (truncation dropped nothing). That reproduces Worksheet 2: a ceiling ("does not exceed") keeps income exactly at it; the floor ("equals or exceeds") already did.
  • is_aca_ptc_eligible and the Basic Health Program payment (basic_health_program, which reused the scale) read the new variable. pays_aca_premium's coverage-gap test reads only below the 100% floor, where nothing changes, so it is untouched.
  • Contributed reforms (aca_ptc_700_fpl_cliff, aca_ptc_additional_bracket, aca_ptc_simplified_bracket) replace is_aca_ptc_eligible with their own scales and are untouched.

A supplied aca_magi_fraction with no income is read as a whole percentage, so tests that supply only the fraction keep their results, except a supplied fraction exactly at 4.00, which is now eligible.

Invariants

For every input (exact arithmetic on the float32 values the model receives):

  1. Statute. aca_ptc_income_eligible holds if and only if 1 <= r <= 4 (2026, 2027) or r >= 1 (2025, 36B(c)(1)(E)), where r = max(MAGI, 0) / prior-year guideline. Tested by a Hypothesis differential test against a fractions.Fraction reading of the statute (bounds transcribed from the statute, not the parameters), with incomes in cents within $2 of each edge.
  2. Only the ceiling point changes. The scale's thresholds are whole percentages, so for a ratio that is not exactly a threshold the right-closed and left-closed lookups agree; the result differs from main only at exactly 400% of the guideline, 2026 and later. Deduced from the construction; the impact run is the check.
  3. Monotone. Eligibility is main's result OR an extra term, so no household loses eligibility.

Tests

  • aca_ptc_income_eligible.yaml (new): 99.994%, 100%, 399.994%, 400%, 400.003%, 400.994% and 401% in 2026; 400% and 400.003% in 2027; 400.003% in 2025 (no cap); a two-person unit at $84,600 (400% of $21,150) and $84,601; supplied fractions 3.99 and 4.01.
  • is_aca_ptc_eligible.yaml, aca_ptc.yaml: end-to-end cases at $62,600 (eligible, $5,765.04 credit) and $62,600.47 (ineligible, $0).
  • tests/unit/test_aca_ptc_income_eligible_properties.py: the scale matches the statute, and the model matches the statute's exact band for 60 generated batches of 64 tax units per year (2025-2027), one reused simulation per year. Local cost (macOS arm64, not CI): 6 tests in 5.2 s after a ~16 s model import that the Rest Python remaining group already pays; 1.14 GB peak resident memory.
  • Mutation checks: main's left-closed lookup fails exactly the five at-400% cases and the 2026 and 2027 property tests; dropping the dollar comparison (right-closed lookup on the truncated fraction alone) fails the four 400.003%/400.994%/$84,601 cases and both end-to-end 400.003% cases.
  • Local runs: the four touched YAML files plus pays_aca_premium.yaml, 73 passed; the property test, 6 passed.

Impact

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

Coordination

#10041 (draft) moves is_aca_ptc_eligible's income test into a new is_aca_ptc_eligible_before_premium and changes the fraction's denominator to aca_fpg. Whichever lands second should point is_aca_ptc_eligible_before_premium at aca_ptc_income_eligible and give aca_ptc_income_eligible's exact ratio the same denominator as aca_magi_fraction. The conflict is three lines in is_aca_ptc_eligible.py.

Part of an audit of every gate that compares the truncated aca_magi_fraction with an income limit, which began with #10305 (California); the table and the sibling PRs are in #10329.

Resolves #9264 with a corrected scope. That issue proposes moving the threshold to 4.01 on the premise that a household at 400.x% is eligible under Form 8962. Worksheet 2 enters 401 for any income "more than" 4 x the poverty line, so 400.x% is ineligible and main already got it right; only exactly 400% was misclassified, which this PR fixes.

axiom: pending

🤖 Generated with Claude Code

26 U.S.C. 36B(c)(1)(A) covers household income that "does not exceed 400
percent" of the poverty line, and Form 8962 Worksheet 2 compares income
with four times the poverty line in dollars before truncating the
percentage. The income scale's 400% bracket starts at 4.00, so evaluating
it on the truncated aca_magi_fraction excluded a household at exactly
400%. aca_ptc_income_eligible keeps such income on the eligible side and
is read by is_aca_ptc_eligible and the Basic Health Program payment.

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.

Federal ACA PTC income gate zeroes the credit at [400%, 401%) FPL (truncation boundary vs Form 8962)

1 participant