Repository navigation
Conversation
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 was referenced Oct 20, 2026
Open
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.
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_eligibilityis asingle_amountscale whose 400% bracket (false from 2026) starts at 4.00, evaluated on the truncatedaca_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:aca_magi_fractionaca_ptcat $62,600 goes from $0 to $5,765.04 on a $12,000 benchmark (9.96% applicable percentage).Fix
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 ratiomax(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_eligibleand 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.aca_ptc_700_fpl_cliff,aca_ptc_additional_bracket,aca_ptc_simplified_bracket) replaceis_aca_ptc_eligiblewith their own scales and are untouched.A supplied
aca_magi_fractionwith 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):
aca_ptc_income_eligibleholds if and only if1 <= r <= 4(2026, 2027) orr >= 1(2025, 36B(c)(1)(E)), wherer = max(MAGI, 0) / prior-year guideline. Tested by a Hypothesis differential test against afractions.Fractionreading of the statute (bounds transcribed from the statute, not the parameters), with incomes in cents within $2 of each edge.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 Pythonremaininggroup already pays; 1.14 GB peak resident memory.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 newis_aca_ptc_eligible_before_premiumand changes the fraction's denominator toaca_fpg. Whichever lands second should pointis_aca_ptc_eligible_before_premiumataca_ptc_income_eligibleand giveaca_ptc_income_eligible's exact ratio the same denominator asaca_magi_fraction. The conflict is three lines inis_aca_ptc_eligible.py.Part of an audit of every gate that compares the truncated
aca_magi_fractionwith 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