Repository navigation
Add the 2027 ACA premium tax credit applicable percentage table - #10443
Merged
Merged
Conversation
Rev. Proc. 2026-26 section 3.01 sets the premium tax credit applicable percentage table for taxable years beginning in 2027. Before this, initial.yaml and final.yaml stopped at 2026, so 2027 reused the 2026 table (6.60% instead of 6.78% at 200% FPL). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
YAML cases pin aca_required_contribution_percentage at every 2027 band edge and at interior points, and derive aca_ptc in 2027 from the table, including two cases that derive the poverty-line fraction from income and the 2026 HHS guideline. Expected values come from Rev. Proc. 2026-26 section 3.01. The Hypothesis test checks every year's table from 2018 through 2027: the percentage equals the table at each edge, stays within and is continuous in each tier, never decreases with income, and the required contribution never decreases with income. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
26 CFR 1.36B-3(g)(1) rounds the interpolated applicable percentage to the nearest hundredth of a percent. The pairwise slope bound now allows one rounding step (0.0001), so the test stays valid if the model adopts that rounding. The contribution test also keeps four fixed incomes in distinct tiers, so no example compares only equal incomes. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…come Replace the pairwise step bound with a pointwise one: at each drawn income the percentage is within half a rounding step (0.00005) of the tier's straight line. That is the regulation's statement, interpolation then rounding to the nearest hundredth of a percent, and it implies the pairwise bound. A bow of up to 0.00008 that keeps endpoints and order passed the pairwise bound and fails this one; rounding still passes. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Contributor
Author
|
Merged at head
🤖 Generated with Claude Code |
This was referenced Oct 25, 2026
Merged
MaxGhenis
added a commit
that referenced
this pull request
Oct 26, 2026
Main now carries the federal 2027 applicable percentage table (#10443, Rev. Proc. 2026-26), which gives 6.78% at exactly 200% FPL. Case 19 no longer supplies aca_ptc; it derives it and pins the federal credit, 8,256 - 0.0678 * 31,920 = 6,091.824, as an output. The state subsidy stays 478.80. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
MaxGhenis
added a commit
that referenced
this pull request
Oct 26, 2026
…t the Final 2027 design (#10305) * Follow the adopted CA Premium Subsidy design at the 150% FPL boundary Gov. Code 100800(c) delegates the state premium subsidy design to the Covered California Board. The adopted 2026 Program Design runs its bands "100% up to 150%" (0%) and "Above 150% up to 165%"; the 2026 Policy Explainer labels the upper band "150% - At or Below 165%". The model now puts a fraction equal to a threshold in the lower band (searchsorted side="left"), keeping the existing whole-percentage FPL truncation. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Tidy CA premium subsidy tests and pin the FPL truncation (review r1) Review r1 P3s: searchsorted comments now say side="left"; Case 13 explains the continuous rate at 165% in 2027; Case 2b tests 1.505 instead of duplicating Case 7; a new case derives 150.49% from wages and shows the truncated fraction pays 0%; the threshold comment notes the truncation is the federal form's gap-fill; the eligibility test header matches the formula's FPL-band description. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Pin truncation, not rounding, in the CA 150% income case (review r2) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Select California premium subsidy bands from exact income * Document exact California subsidy boundaries and lookup rounding * Decide CA Premium Subsidy eligibility on the exact FPL ratio ca_premium_subsidy_eligible compared the truncated aca_magi_fraction with <= 1.65, so every PY2026 income from 165.003% to 165.994% of FPL passed an "at or below 165 percent" test (Program Design (d)(7)). Compare the exact ratio of nonnegative ACA MAGI to prior-year FPG instead, as FTB 3849 Table 1-2 does for the predecessor program's band edges. The PY2027 limit was 1.99 on the truncated fraction, which equals "under 200 percent" only under truncation. Express it as 2.0 with a new fpl_limit_inclusive parameter (true in PY2026, false in PY2027), the same pattern as NM's benchmark_gross_up.boundary_inclusive. Tests: boundary cases from derived income at $25,822.50 / $25,823 / $25,978 / $25,979 (PY2026) and $26,335 / $31,919 / $31,920 (PY2027); supplied cases now set aca_magi and prior-year FPG instead of the fraction; a Hypothesis differential test against an exact-rational reading of (d)(7). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Add 100% floor cases from derived income; merge duplicate reference Cases 1b and 2b test the PY2026 floor at $15,649 (99.994%, ineligible) and $15,650 (exactly 100%, eligible) of the 2025 one-person FPG, so the PE tests mirror the companion cases added to rulespec-us#1832. The two 2026 Program Design references differed only by #page=, so they become one entry per the repo's reference rules. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Divide in float64; make the property test cache-safe The model stores MAGI and FPG as float32. A float32 quotient can round a ratio a fraction of a cent above 165% of a fractional guideline down to 1.65 (e.g. $18,711.599609375 over $11,340.36328125), so the gate now divides in float64. On float32 inputs that classifies every ratio exactly against 1.00, 1.65 and 2.00. The property test built one simulation per year and reused it, deleting only the output array, so derived intermediates could stay cached across Hypothesis examples. It now builds a fresh simulation per example. Its reference reads (d)(7) on the stored float32 values, the generator adds fractional guidelines and incomes a few float32 steps from each edge, and explicit examples cover the float32 counterexamples and a 72-person household at exactly 166% that main's float32 truncation misrounds to 165.99%. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Address California premium subsidy reviews and record the 150 percent source conflict * Move PY2027 to the Final 2027 California Premium Subsidy Program Design The Final 2027 Program Design replaces the V4 schedule this model carried: (d)(4) has one paying band, "Above 150% up to 200%", from 2.8% to 5.28% (V4: 2.69%-3.41% to 165%, then 3.41%-5.1%), and (d)(7) makes household income "at or below 200 percent" eligible (V4: "under 200 percent"). - Thresholds [1, 1.5, 2.0], initial [0, 0.028], final [0, 0.0528]. - Both years' limits are inclusive, so drop fpl_limit_inclusive and test the exact ratio with <=. - The OE27 enroller deck's summary slide says "up to under 200% FPL" while its own 200% example applies 5.28%; follow (d)(7) and record candidate us-ca:premium-subsidy-200-fpl-limit. - Rate, amount and eligibility cases move to the Final Design, including the deck's $31,920 example (5.28%, $478.80 a year) and incomes that truncate to 2.00 but exceed 200%; the property tests read 2027 as inclusive and #10301's rate properties now cover 2027. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Divide the CA Premium Subsidy band ratio in float64 The model stores aca_magi and tax_unit_fpg as float32. Their float32 quotient can round an exact ratio just above 150% of a fractional FPG down onto 1.5, which side="left" then puts in the 0% band. Divide in float64, as the eligibility gate already does, and add a float32 regression test for both plan years. Whole-dollar FPGs pick the same band either way. Amount Case 19 supplies aca_ptc at the official Rev. Proc. 2026-26 credit. Say why in the case: the federal parameters still carry the 2026 applicable percentages into 2027, so a derived credit would use 6.60% instead of 6.78% at 200% FPL. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Derive Case 19's federal credit from the 2027 table Main now carries the federal 2027 applicable percentage table (#10443, Rev. Proc. 2026-26), which gives 6.78% at exactly 200% FPL. Case 19 no longer supplies aca_ptc; it derives it and pins the federal credit, 8,256 - 0.0678 * 31,920 = 6,091.824, as an output. The state subsidy stays 478.80. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
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.
Part of #10442. That issue also asks for California Case 19 to derive the federal credit. The case arrives with #10305, so the issue stays open until #10305 lands (see "California Case 19" below).
The bug
gov.aca.required_contribution_percentage.initialand.finalstopped at 2026 (Rev. Proc. 2025-25), so 2027 reused the 2026 table. At 200% FPL the model used 6.60% where the law for 2027 says 6.78%. Every 2027 percentage is higher than its 2026 counterpart, so the model set the required contribution too low for every household with positive income at or below 400% FPL. For those households it overstated the 2027 federal premium tax credit wherever that credit was above $0 under the 2026 table. Where the benchmark premium is below the required contribution under both tables, the credit is $0 either way. Programs built on the federal credit inherit the error. The California Premium Subsidy, for example, ismax(0, slcsp − aca_ptc − ca_pct × income), so while that subsidy is above $0, each dollar of extra federal credit is a dollar less of it (#10305).The fix
Rev. Proc. 2026-26 §3.01 sets the table for taxable years beginning in 2027. I checked each value against the PDF:
initial.yamlandfinal.yamlget2027-01-01rows, and all three table files cite Rev. Proc. 2026-26 (file page 3).threshold.yamlneeds no new values. The 2027 bands are the same six as 2026: 133, 150, 200, 250, 300 and 400 percent.#page=3, where the 2026 table is, per the reference rules.offered_aca_disqualifying_esi. A search ofparameters/andvariables/for 9.96% (the 2026 Required Contribution Percentage), "affordab",36B(c)(2)(C)and Rev. Proc. 2025-25 found no other 2026-only ACA indexing parameter.Tests
YAML, with expected values from the Rev. Proc., not from model output.
aca_required_contribution_percentage.yaml: 15 cases in 2027. Cases at 100% and 132% are flat 2.15%. Each edge from 133 to 300 percent gives that band's initial percentage, and 400 percent gives 10.22%. Interior points sit at 140, 175, 199, 225, 275 and 350 percent, and 401 percent gives 0.aca_ptc.yaml: 9 cases in 2027 that derive the percentage, at 100, 133, 150, 200, 275, 350 and 390 percent (the last floors at $0). Two cases derive the FPL fraction from income and the 2026 HHS guideline: one person at $31,920 (200%) and a couple at $54,100 (250%). The 200% case is the Covered California OE27 example: $8,256 − 6.78% × $31,920 = $6,091.82.Existing 2027 expectations. None move. I listed every YAML case whose period is 2027 or later (305 files) and kept those whose outputs depend on
aca_required_contribution_percentage. To find those, I built a static reverse-dependency closure over formulas,addsandsubtracts, and the list parameters passed toadd(). That left 17 files with 35 cases. Each file passes unchanged on this branch, one file per process: those cases supplyaca_ptcas an input or test eligibility and program years. No partner contract test has a 2027 or later case.California Case 19. #10305 adds amount Case 19 to
ca_premium_subsidy.yaml, the OE27 example, and suppliesaca_ptc: 6_091.824because main lacks this table. This PR lands before #10305, so #10305, landing second, changes Case 19 to deriveaca_ptc. The expected values are a federal credit of $6,091.82 andca_premium_subsidyof $478.80. #10442 stays open until then.Invariants
These hold for every income, in every year from 2018 through 2027, against that year's table.
policyengine_us/tests/core/test_aca_required_contribution_percentage_properties.pychecks them with Hypothesis:The test also asserts that every year's band edges are among the edges it probes, so a mistyped edge can't pass by being skipped.
Mutation checks (each mutant run against the property test at 83c7d8c, one process at a time, RSS-capped at 2 GB):
side="left". It is an equivalent mutant: the model stores the FPL fraction in float32, andfloat32(1.33)is just above 1.33, so 133% still lands in the upper band. At every other edge the two bands meet at the same value.Cost (Python test, measured twice locally on a shared macOS host, not Linux CI): 4–6 s of test calls, 7–12 s in pytest and 29–36 s wall time with the model import; peak memory footprint 1.7 GB. It runs in the
coregroup of the rest Python tests, liketest_aca_ptc_filing_gate_invariants.py.Impact (2027)
The US hub ran the full default dataset for 2027: main at the merge base
41d218c474against this PR's head83c7d8cd1a, one run at a time under the shared heavy-job lock. Sums are weighted.aca_ptc, per tax unit) falls by $2.00bn across 8,390 records (16.3 million weighted tax units); none rises, and the largest single drop is $548.used_aca_ptc) falls by $805M, and their net marketplace premiums rise by the same amount.household_net_incomedon't change. SPM unit net income falls by $805M, and 10 records (0.1 weighted people) move into poverty.aca_ptcassigned_aca_ptcused_aca_ptcmarketplace_net_premiumbasic_health_programca_premium_subsidyco_premium_assistancemd_premium_assistancenm_premium_assistancevt_premium_assistancect_covered_connecticutma_connector_carenj_njhpswa_cascade_care_savingshealthcare_benefit_valuehousehold_net_income_including_health_benefitsspm_unit_net_incomeperson_in_povertystate_income_taxincome_taxhousehold_net_incomehousehold_benefitsComparison files are in
fixes/10443-impact/on the hub host.This is a model-to-law fix, so the size of the aggregate change doesn't need approval.
Not in this PR
axiom: us/guidance/irs/rev-proc-2026-26 TheAxiomFoundation/rulespec-us#1909 queued (the corpus scope holding Rev. Proc. 2026-26 is not in rulespec-us's pinned release)
🤖 Generated with Claude Code