Skip to content

Apply Hawaii refundable credits before nonrefundable credits - #10202

Merged
MaxGhenis merged 6 commits into
mainfrom
hi-credit-ordering
Oct 14, 2026
Merged

MaxGhenis merged 6 commits into
mainfrom
hi-credit-ordering

Conversation

@MaxGhenis

@MaxGhenis MaxGhenis commented Oct 13, 2026 •

Copy link
Copy Markdown
Contributor

What this fixes

Hawaii applies refundable credits before nonrefundable ones. HRS § 235-91.5 (L 2010, c 21): refundable credits "shall be used first, followed by nonrefundable tax credits". Form N-11 has the same order in every year from 2018 to 2025:

Line 2018–2025 Form N-11
27 Tax
33 Total refundable credits (lines 28–32: food/excise, low-income renters, child and dependent care, child passenger restraint, Schedule CR Part I)
34 Line 27 minus line 33, the adjusted tax liability (may be negative)
35 Total nonrefundable credits (Schedule CR Part II)
36 Line 34 minus line 35

The instructions (2022 p.21, 2025 p.21, 2018 p.25): "the total of the nonrefundable credits used cannot be greater than your adjusted tax liability. If line 34 is zero or less, nonrefundable tax credits may not be used." Form N-356 (the 2018–2022 nonrefundable Hawaii EITC), lines 10–13, limits that credit to the same amount. The 2018–2019 forms say "the amount from Form N-11, line 34"; the 2020–2022 forms say "Adjusted Tax Liability — Enter the amount from Form N-11", which is the label N-11 gives line 34.

The model capped nonrefundable credits at line 27 (gross tax) and then subtracted refundable credits. A filer with both kinds of credit got too much. Example: 2022, tax $1,000, Hawaii EITC $800, refundable credits $500. Form N-11 gives line 34 = $500, line 35 = $500 and line 36 = $0. The model gave −$300.

Change

  • New hi_adjusted_tax_liability (N-11 line 34): hi_income_tax_before_non_refundable_credits − hi_refundable_credits. The 2021 Act 115 refund is excluded when it is in the refundable list. The department paid that refund to people who filed a 2021 N-11 (Ann. 2022-03 p.2), and it is not on lines 28–32.
  • hi_non_refundable_credits caps the ordered credits at hi_adjusted_tax_liability, not gross tax.
  • hi_eitc caps at hi_adjusted_tax_liability while it is nonrefundable (N-356 line 10). It decides that from whether hi_eitc is in gov.states.hi.tax.income.credits.non_refundable, replacing a hardcoded year >= 2023, which gives the same baseline result in every year. With the old year test, a reform that made the EITC refundable before 2023 would loop: hi_eitc → line 34 → refundable credits → hi_eitc.
  • hi_income_tax_before_refundable_credits and hi_income_tax are unchanged. Line 35 ≤ max(line 34, 0) ≤ line 27, so hi_income_tax = hi_income_tax_before_refundable_credits − hi_refundable_credits is exactly line 36 (less any Act 115 refund). The household-level lists (state_income_tax_before_refundable_credits, state_refundable_credits, state_non_refundable_credits, household_tax_before_refundable_credits, household_refundable_credits, household_refundable_state_credits) therefore stay consistent with no edits. Federal SALT reads hi_withheld_income_tax, which does not depend on this chain.

Invariants

For tax T (line 27), refundable credits R (Act 115 refund A in 2021), and nonrefundable potential N:

  1. hi_adjusted_tax_liability = T − (R − A).
  2. hi_non_refundable_credits = min(N, max(T − (R − A), 0)).
  3. hi_income_tax = line 36 − A = hi_income_tax_before_refundable_credits − hi_refundable_credits = state_income_tax.
  4. Refundable credits are paid in full: when R − A ≥ T, no nonrefundable credit applies and hi_income_tax = T − R.
  5. min(T − R, −A) ≤ hi_income_tax ≤ T − R.
  6. Raising R by d lowers hi_income_tax by between 0 and d. A larger federal EITC never raises it.

policyengine_us/tests/test_hi_credit_ordering.py checks all six with Hypothesis and a boundary grid for every year from 2018 to 2025 (tax at, one below and one above R − A and R − A + N). A third test checks 1–3 on computed households (wages, rent, children) for 2021, 2022 and 2025.

Tests

  • hi_adjusted_tax_liability.yaml: line 34, a negative line 34, the 2021 Act 115 exclusion, and no exclusion in 2022.
  • hi_non_refundable_credits.yaml: the review example (2022: $0, not −$300); refundable credits above, equal to and below tax; the refundable 2025 EITC; and a 2025 case that makes the EITC nonrefundable through inline parameters.
  • integration.yaml, three new cases: a single filer aged 30 with $8,000 of wages, worked through N-11 lines 26–36 for 2021, 2022 and 2025. Line 27 comes from the rate schedule, as everywhere in the model, not the Tax Table. In 2022, line 27 = $105.792, line 33 = $100, line 34 = $5.792, line 35 = min($112, $5.792) and line 36 = $0. Main gives −$100.
  • Against main's formulas, 6 of the 9 cases in hi_non_refundable_credits.yaml and the integration cases fail. The 3 that pass are the ones the ordering does not move. The hi_adjusted_tax_liability.yaml cases test the new variable.
  • test_credit_lists_do_not_overlap checks that no credit is in both Hawaii lists from 2015 to 2035. Such a credit would now raise a CycleError through line 34; on main it was counted twice. test_computed_wage_ladder_reaches_the_line_34_limit runs $0–$40,000 wage ladders for 2021 and 2022 and must reach all three cases: line 34 at or below zero, the credit cut to line 34, and the credit used in full.
  • Test cost: test_hi_credit_ordering.py (14 tests) runs in the remaining Rest group. Locally at load ~65 (macOS): 18.1 s of pytest time, 90 s wall including the model import, and 2.1 GB peak RSS for the whole process. The slowest case is the Hypothesis computed-household test at 6.6 s. It builds no extra tax-benefit system.
  • Locally: all 513 Hawaii YAML cases pass, as do household_state_income_tax.yaml, abolish_federal_income_tax.yaml, the property tests and the code-health guards (reference URLs, known dead URLs, Rest groups, aggregate lists, nonrefundable-credit consumers).
  • Merged locally with Model Hawaii's claim of right deduction and credit (section 1341 as operative in Hawaii from 2022) #10200 (Hawaii claim of right, a new refundable credit), all Hawaii YAML tests and the property tests pass and nothing loops: Model Hawaii's claim of right deduction and credit (section 1341 as operative in Hawaii from 2022) #10200 decides its credit in branches where hi_claim_of_right_credit_applies is an input.

Impact

Under current law Hawaii has no nonrefundable credit from 2023 (non_refundable is []), so the fix changes nothing in 2023 and later. The default dataset holds 2024 records, so a 2018–2022 run reads zero inputs. Both sides of a full-population pair therefore ran 2024 data with the Hawaii EITC treated as nonrefundable at the 20% match it had in 2018–2022. Every other 2024 parameter, including the 2023+ food/excise amounts, stays at its 2024 value. This is "2022 EITC rules on 2024 data", not the 2022 impact.

2024 data, Hawaii EITC nonrefundable at 20% (both sides) Change
Hawaii income tax (hi_income_tax, state_income_tax) +$8.26 million across 58 tax-unit records (39,096 weighted tax units), all increases; largest $748
hi_non_refundable_credits −$8.26 million ($24.29M → $16.03M)
hi_refundable_credits, federal income_tax, household_benefits no change
household_net_income −$8.26 million across 55 household records (36,904 weighted households)

Under this reform main's hi_eitc is uncapped in 2024, because main tests year >= 2023; it caps the credit only inside hi_non_refundable_credits. So hi_eitc itself falls by $26.6M (83 records) between the two sides, but that is not a change in tax. The tax change is the hi_non_refundable_credits row. Base 2f3053c, PR d8e37f8. Output: ~/reviews/us-hub/fixes/10202-impact-cf2022eitc/compare.2024.json.

Current law, 2025 (full population; base 2f3053c, PR f8b79a4, the same formulas as the final head): 0 records changed in hi_income_tax, hi_income_tax_before_refundable_credits, hi_non_refundable_credits (base $0), hi_refundable_credits, hi_eitc, state_income_tax, income_tax, household_net_income and household_benefits. Output: ~/reviews/us-hub/fixes/10202-impact/compare.2025.json.

Pre-existing issues found (not fixed here)

Parameter backdating makes the model pay the Act 115 refund ($300/$100 per exemption) in every year from 2015 to 2020. It also pays the 20% Hawaii EITC in 2015–2017, although N-356 says the credit applies to tax years beginning after December 31, 2017. This PR treats both the same way it treats the real credits, so it neither fixes nor worsens them. #10205 fixes them. Merged locally with #10205, all 533 Hawaii YAML cases pass, as do both PRs' property tests (31). The two PRs touch no common file.

axiom: us-hi/statute/235-91.5 encoded-correct. rulespec-us us-hi/policies/income_tax/resident_core_liability_pipeline.yaml (hi_pit_2026_total_refundable_credits, hi_pit_2026_profile_candidate_net_income_tax_liability) uses refundable credits first; its companion test signed_negative_final_when_refundable_credit_exceeds_tax covers it. Axiom covers TY2026, where Hawaii has no nonrefundable credit in its supported profile (a claimed nonrefundable or carryforward credit fails closed), so the line-34 cap never binds there. The 2018–2022 nonrefundable EITC predates Axiom's coverage.

Review. Independent review (Opus 5.5 lane, subfleet run --task review --tier hard, at d8e37f8): APPROVE, with two should-fixes and seven nits, all addressed in 4ef0258:

The review verified the order on every N-11 from 2018 to 2025, Schedule CR (2018, 2022, 2025), N-356 and Ann. 2022-03, and ran the tests. A delta review (GPT-6.1 Sol) of d8e37f8..4ef0258 asked for one change: the archived 2018 N-356 now redirects to a 2023 404 capture. 5172088 cites the archived 2019 N-356 instead (same line 10 wording, "the amount from Form N-11, line 34") and drops the 2018 entry from the dead-URL registry. A re-check at 5172088: APPROVE. Reviews: ~/reviews/hi-credit-ordering-2026-10/review-1.md, review-2-delta.md, review-3-delta2.md.

🤖 Generated with Claude Code

MaxGhenis and others added 4 commits October 13, 2026 06:40
Form N-11 subtracts refundable credits (line 33) from tax (line 27) to get
the adjusted tax liability (line 34), and limits nonrefundable credits
(line 35) to it. The model capped nonrefundable credits at gross tax, which
overstated the benefit when a filer had both kinds of credit.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Replace the dead 2018 Form N-356 link with its archived copy and register
the dead 2018-2021 N-356 links; cite the 2018 and 2022 N-11 in
hi_non_refundable_credits; move the household cases into integration.yaml
and say that line 27 comes from the rate schedule; guard against a credit in
both Hawaii lists; add a computed wage ladder that must reach the line 34
limit.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@MaxGhenis
MaxGhenis marked this pull request as ready for review October 13, 2026 15:04
@codecov

codecov Bot commented Oct 13, 2026 •

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 100.00%. Comparing base (909176a) to head (5172088).
⚠️ Report is 460 commits behind head on main.

Additional details and impacted files
@@            Coverage Diff            @@
##              main    #10202   +/-   ##
=========================================
  Coverage   100.00%   100.00%           
=========================================
  Files            4         4           
  Lines           76        56   -20     
  Branches         2         2           
=========================================
- Hits            76        56   -20     
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.

The 2019 Wayback capture of the 2018 N-356 now redirects to a 2023 404
capture, so cite the 2019 form (same line 10 wording) and drop the 2018
entry from the dead-URL registry.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@MaxGhenis

Copy link
Copy Markdown
Contributor Author

Merge audit (head 5172088):

🤖 Generated with Claude Code

@MaxGhenis
MaxGhenis merged commit 41438c7 into main Oct 14, 2026
28 checks passed
@MaxGhenis
MaxGhenis deleted the hi-credit-ordering branch October 14, 2026 10:21
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