Skip to content

Date Hawaii's EITC from 2018, confine the Act 115 refund to 2021, and use each year's military pay cap - #10205

Merged
MaxGhenis merged 7 commits into
mainfrom
hi-credit-start-dates
Nov 10, 2026
Merged

MaxGhenis merged 7 commits into
mainfrom
hi-credit-start-dates

Conversation

@MaxGhenis

@MaxGhenis MaxGhenis commented Oct 13, 2026 •

Copy link
Copy Markdown
Contributor

Summary

backdate_parameters (policyengine_us/tools/parameters.py) copies each parameter's earliest value back to 2015 (FIRST_MODELED_YEAR). Hawaii parameters first dated after 2015 therefore applied in years before the law existed. This PR dates them. It changes no formula, and the 2018–2022 nonrefundable EITC is unchanged.

Before (single, age 30, $8,000 wages) After
Act 115 refund in hi_refundable_credits $300 in 2021 only (main's #10309 already zeroes the amounts before 2021) unchanged; the 2015–2020 list now omits it too
hi_eitc_potential 20% of the federal EITC in 2015-2017 0 in 2015-2017; the same from 2018
hi_income_tax 2017 $0.00 (main limits the $102 EITC to the $5.79 adjusted liability) $5.79
hi_military_pay_exclusion cap $7,345 for 2015–2022; $8,315.01 (uprated) for 2025; $8,503.45 for 2026 each year's N-11 amount through 2025; $8,831.72 for 2026, uprated from $8,636

Changes

  • credits/refundable.yaml: a 2000-01-01 block without hi_act_115_rebate. Act 115 (SLH 2022) refunds went only to filers of a 2021 Form N-11 (DOTAX Announcement 2022-03, p.2). The 2018 Form N-11 lists the same three modeled refundable credits (p.3).
  • credits/act_115_rebate/{single,joint}.yaml: no change. This PR first dated the amounts to 2021 only. Main's Guard historical state rebate eligibility and document attribution #10309 has since dated them 2020-01-01: 0, which zeroes 2015–2020, and keeps the 2022+ schedules on purpose for standalone calculations. The merge takes main's files, so the dated refundable list keeps the refund out of 2022 and later. The 2022 tests now check hi_refundable_credits rather than the standalone refund.
  • credits/non_refundable.yaml: 2000-01-01: [], 2018-01-01: [hi_eitc], 2023-01-01: [].
  • credits/eitc/match.yaml: 2000-01-01: 0, 2018-01-01: 0.2 (was 2017-01-01: 0.2). The credit is "effective for taxable years beginning after December 31, 2017" (2018 Form N-356, p.2; Act 107, SLH 2017, per 2018 N-11 instructions, p.2). gov/states/household/state_eitcs.yaml already starts hi_eitc in 2018.
  • Act 163 references: credits/eitc/match.yaml, credits/cdcc/dependent_care_benefits/expense_floor.yaml and the five credits/food_excise_tax/amount/*.yaml files cited Section 4, which only explains the act's bracket and underscore marks. They now cite Section 5, which repeals the act and reenacts the earlier text on December 31, 2027 (Act 163, SLH 2023, p. 3). No value changes.
  • subtractions/military_pay/cap.yaml: the file held the 2022 amount ($7,345) from 2021, so 2015–2021 used it. It now has each year's N-11 instructions line 15 amount: 2015 $6,198, 2016 $6,279, 2017 $6,410, 2018 $6,564, 2019 $6,735, 2020 $6,943, 2021 $7,152, 2022 $7,345, 2023 $7,683, 2024 $8,082, 2025 $8,636. 2026 onward is still projected by gov.irs.uprating, now from $8,636. cap.yaml cites the 2015–2017 instructions through the Wayback Machine, since DOTAX's site no longer serves them.

Audit of the other Hawaii income tax parameters first dated after 2015

I checked each against the 2015–2022 N-11 instructions, Form N-311 (2016–2022) and Schedule X (2015, 2017–2021, 2023):

Parameter (first date) Result
Food/excise credit amounts, minor-child $110, age and support thresholds (2021) Match 2016–2022. 2015 differs: Act 223 (SLH 2015) raised the amounts from 2016, and the 2015 minor-child amount was $85 (2015 Schedule X line 9). Listed as a follow-up.
Renters' credit $50, AGI under $30,000, rent over $1,000, age 65 (2021) Match 2015–2023
Exemption $1,144, disability exemption $7,000, aged threshold 65 (2021) Match 2015–2022
Itemized deduction limitation threshold $166,800 / $83,400 (2021) Match 2015–2022
Alternative tax on capital gains, 7.25% (2021) Match 2015–2022
Standard deduction $2,200 / $4,400 / $3,212 (2022) Match 2015–2021
Rates (2018) 2016–2017 differ: Act 107 (SLH 2017) reinstated the top three brackets from 2018 (2017 N-11 instructions p.2); 2015 had them under Act 60 (SLH 2009). Out of this PR's scope; listed as a follow-up.
CDCC rate table (2018) Matches the 2017 Schedule X

Not audited: the composition of subtractions/subtractions.yaml.

Tests

  • YAML: new cases in hi_eitc.yaml, hi_act_115_rebate.yaml and hi_military_pay_exclusion.yaml. The existing 2021 military cap case now expects $7,152. Run against main's model at ba9bfdea75, 13 of these cases fail, all in years the model was wrong. Five are in hi_eitc.yaml (2015, 2016 and 2017) and eight in hi_military_pay_exclusion.yaml. The 2018–2022 EITC cases and the 2021 and 2022 refund cases pass on both and guard the years that were right.
  • A single filer, age 30, with $8,000 of wages has a case for 2016, 2017, 2018 and 2020 in hi_eitc.yaml, and for 2021 and 2022 in hi_act_115_rebate.yaml. Until 2026-11-09 these six cases sat in hi_credit_start_dates.yaml; that round moved them unchanged.
  • hi_military_pay_exclusion.yaml has a case for each year's cap from 2015 to 2025.
  • The PR adds no Python test. Earlier heads carried tests/unit/test_hi_credit_start_dates_properties.py, a 108-household grid with Hypothesis batches for 2015–2026. YAML covers what it checked, so the 2026-11-09 round removed it (see "What pins each rule").
    • CI cost at b07103b3ca, from run 41946261850's timing artifact: 19.7 s of test time in Rest shard 1, group remaining-1. That group's process ran 21:08 and peaked at 8,861,144 KB RSS, against the Makefile's target of about 10 GB.
    • Local cost (4 vCPU VM, not CI): 58 s in pytest, 2:41 wall and 4,497,364 KB peak RSS when passing.
  • Pull request run 42639431774 at f781461877 passed all 36 jobs. It tested the head merged into main at ba9bfdea75. Quick Feedback ran hi_act_115_rebate.yaml, hi_eitc.yaml and hi_military_pay_exclusion.yaml (22, 17 and 12 passed), and Baseline states-shard-4 ran them again in the full suite.
  • A trial merge of this head with main at ba9bfdea75, which includes Model Hawaii's claim of right deduction and credit (section 1341 as operative in Hawaii from 2022) #10200 and Apply Hawaii refundable credits before nonrefundable credits #10202, passes hi_eitc.yaml (17 cases), hi_act_115_rebate.yaml (22) and hi_non_refundable_credits.yaml (6).

What pins each rule

Rule YAML cases
hi_act_115_rebate is 0 before 2021 hi_act_115_rebate.yaml: the 2015 schedules case, 2017, and 2020 single and joint. The single-filer cases for 2016, 2017, 2018 and 2020 in hi_eitc.yaml.
The 2021 refund: $300 or $100 per exemption hi_act_115_rebate.yaml: single and joint returns on each side of their thresholds, a head-of-household return, dependents, and the 2021 single filer
The refund enters hi_refundable_credits only in 2021 2021 single filer (400). For 2022, "No refund in 2022 refundable credits" (0) and the single filer (100). From 2023, "The 2025 earned income tax credit is refundable" in hi_non_refundable_credits.yaml, and the 2024 and 2025 cases in integration.yaml.
No match before 2018 hi_eitc.yaml: 2015, 2016 and 2017, and the 2016 and 2017 single-filer cases
20% match for 2018–2022, nonrefundable hi_eitc.yaml: 2018, 2020, 2021 and 2022. The 2022 cases in hi_non_refundable_credits.yaml and integration.yaml apply the liability limit.
40% for 2023–2027, 20% from 2028, refundable hi_eitc.yaml: 2023, 2027 and 2028. hi_non_refundable_credits.yaml: 2025.
No nonrefundable credit before 2018 or from 2023 hi_eitc.yaml: 2015, 2016 and 2017. "Empty 2023 list" in integration.yaml, and "The 2025 earned income tax credit is refundable" in hi_non_refundable_credits.yaml.
Before 2018, hi_income_tax is tax before credits minus refundable credits The 2017 single filer in hi_eitc.yaml ($5.792)

Mutants on this head, each in its own process: paying the 20% match in 2015 alone is killed by "No Hawaii EITC in 2015, the first modeled year". At b07103b3ca, every YAML case passed under that mutant, so only the removed Python grid caught it. Adding the refund to the 2022 list fails two hi_act_115_rebate.yaml cases. Adding it to the 2023 list fails the 2025 case in hi_non_refundable_credits.yaml and four integration.yaml cases.

Merge with main (2026-11-03)

Merge with main (2026-11-04)

  • No conflicts.

Review round (2026-11-09)

Sources

  • Military pay caps. Each amount in cap.yaml matches line 15 of that year's N-11 instructions, at the page the file cites. The legislature tied the amount to the pay an E-5 with eight years of service earns for 48 drills and 15 days of annual duty (HRS § 235-7(a)(7)).
  • The EITC. The legislature created the credit in Act 107 (SLH 2017) at 20% of the federal credit, nonrefundable, for 2018 through 2022 (2018 N-11 instructions, p. 2). It made the credit refundable from 2023 in Act 114 (SLH 2022) (2022 N-11 instructions, p. 2), and raised it to 40% for 2023 through 2027 in Act 163 (SLH 2023) (DOTAX Announcement 2023-04, p. 3). Act 163's increase expires on December 31, 2027 (§ 235-55.75(a), current text), so the rate returns to 20% for 2028, as in match.yaml. In Act 25 (SLH 2025) the legislature changed only the carryforward in subsection (g), and DOTAX lists no change to the credit in its summary of the 2026 session's tax laws (Announcement 2026-06).

Axiom note

Axiom's Hawaii income tax modules cover tax year 2026 only. This PR changes 2015–2025 values, and the uprated military pay cap from 2026.

Microsimulation impact

We estimate no change in 2026 on the default dataset: each measured output has the same value for every record on main at 25c4253483 and on this branch at f781461877.

The dated changes fall in 2015 to 2021, before the dataset's first year, 2024, and the YAML cases above pin them. The military pay cap also changes from 2023. The Hawaii military pay exclusion totals $0 on both sides, so the new cap moves no record.

Output Main total Change Records changed (weighted)
hi_income_tax $3.15bn $0 0 (0)
hi_eitc $88.2m $0 0 (0)
hi_act_115_rebate $379.8m $0 0 (0)
hi_military_pay_exclusion $0 $0 0 (0)
hi_food_excise_credit $92.9m $0 0 (0)
hi_cdcc $8.6m $0 0 (0)
hi_refundable_credits $195.1m $0 0 (0)
hi_non_refundable_credits $0 $0 0 (0)
state_income_tax $578.0bn $0 0 (0)
income_tax $2,595.1bn $0 0 (0)
household_net_income $17,162.3bn $0 0 (0)
household_benefits $2,060.6bn $0 0 (0)

impact: no change in 2026 on the default dataset (each measured Hawaii and household output matches main for every record); the dated changes fall in 2015 to 2021
axiom: TheAxiomFoundation/rulespec-us#2039 queued, extended with a comment (Hawaii EITC, with the 2015 case); TheAxiomFoundation/rulespec-us#1685 queued, extended with two comments (Act 115 refund); TheAxiomFoundation/rulespec-us#2040 queued (military pay exclusion)

Coordination: #10202 and #10200 have merged. #10200 added hi_claim_of_right_credit to the 2022+ blocks of refundable.yaml, and that file auto-merges with this PR.

🤖 Generated with Claude Code

MaxGhenis and others added 2 commits October 13, 2026 08:49
backdate_parameters copies each parameter's first value back to 2015, so
the 2021-dated credit lists and the 2017-dated EITC match paid the Act 115
refund in 2015-2020 and the EITC in 2015-2017. Add 2000-01-01 sentinels,
start the nonrefundable EITC list and match in 2018 (Act 107, SLH 2017),
and zero the Act 115 amounts outside 2021. Also replace the military
reserve pay exclusion cap, which used the 2022 amount for 2015-2021, with
each year's N-11 instruction value for 2015-2025.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
YAML cases at 2016, 2017, 2018, 2020, 2021 and 2022 for the Hawaii EITC,
the Act 115 refund and the credit lists, and military pay exclusion caps
for 2015, 2018, 2020, 2021, 2022 and 2025; the 2021 cap case now expects
the 2021 instruction amount ($7,152). A grid and Hypothesis property test
checks the date invariants for 2015-2026 and compares the exclusion with
each year's published cap.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@MaxGhenis MaxGhenis changed the title Stop paying Hawaii's EITC before 2018 and the Act 115 refund outside 2021 Date Hawaii's EITC from 2018, confine the Act 115 refund to 2021, and use each year's military pay cap Oct 13, 2026
@MaxGhenis
MaxGhenis marked this pull request as ready for review October 13, 2026 13:30
@MaxGhenis

Copy link
Copy Markdown
Contributor Author

Picking this up for the US hub. I'll post a hand-off comment here when it's ready.


Generated by Claude Code

@MaxGhenis

Copy link
Copy Markdown
Contributor Author

Picking this up for the US hub. I continue an earlier session's work: it picked this PR up on 2026-11-02 and stopped before pushing anything. I'll post a hand-off comment here when it's ready.


Generated by Claude Code

Main's #10309 already zeroes the Act 115 amounts before 2021 and keeps
the 2022+ schedules on purpose, leaving the dated refundable credit list
to confine the refund to 2021. Take main's amount files, check 2022 through
hi_refundable_credits instead of the standalone refund, and keep both
sides' new test cases.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LwQq6GA1FXMB3qVPzGgvWQ
@MaxGhenis

Copy link
Copy Markdown
Contributor Author

Picking this up for the US hub. I continue the earlier sessions' work on this PR; they pushed nothing. I'll post a hand-off comment here when it's ready.


Generated by Claude Code

@MaxGhenis

Copy link
Copy Markdown
Contributor Author

Ready for hub review

Head: fac53d9ea875f856ea1b7a0cf14213cc2174b7b2

What the item asked, and how I resolved it

  • Date Hawaii's EITC from 2018. Kept as the PR had it: credits/eitc/match.yaml starts at 0, then 0.2 from 2018-01-01. credits/non_refundable.yaml lists hi_eitc only for 2018–2022. Both match gov/states/household/state_eitcs.yaml, which already starts hi_eitc in 2018.

  • Confine the Act 115 refund. The item says "to 2023", but the PR, its tests and Act 115 itself confine the refund to tax year 2021. Act 115 (SLH 2022) refunded filers of a 2021 return, paid in 2022. I kept 2021. Main's Guard historical state rebate eligibility and document attribution #10309 (merged 2026-11-03) had meanwhile done most of this:

    • it dates the amount schedules 2020-01-01: 0, which zeroes 2015–2020;
    • it keeps the 2022+ amounts on purpose ("These schedules can persist for later standalone calculations; the dated refundable-credit total determines whether they affect income tax").

    So the merge takes main's act_115_rebate/{single,joint}.yaml. The 2022+ refund is confined by credits/refundable.yaml, which lists hi_act_115_rebate only for 2021. The PR's 2000-01-01 block there (food/excise, CDCC and renters' credits only) still applies. It changes nothing in dollars now that the amounts are 0 before 2021.

  • Act 115 and HRS 235-55.75 history. I couldn't refetch them: this session's network policy blocked capitol.hawaii.gov, files.hawaii.gov and web.archive.org. The 2018 start and the 2023 change to 40% refundable are as the PR and the existing parameter citations record them. A reviewer with web access should confirm the Act 107 (SLH 2017) effective date and the military pay caps for 2015–2021.

Merge with main

fac53d9ea8 merges origin/main (abc67b98de). Conflicts:

  • act_115_rebate/joint.yaml, single.yaml: took main's files.
  • hi_act_115_rebate.yaml: kept both sides' new cases. The PR's "No refund for 2022" became "No refund in 2022 refundable credits", which checks hi_refundable_credits = 0 with the other refundable credits zeroed. The standalone refund is 300 in 2022 on main by design.
  • No conflict, but adjusted for the same reason:
    • hi_credit_start_dates.yaml case 5 no longer asserts hi_act_115_rebate: 0 in 2022.
    • tests/unit/test_hi_credit_start_dates_properties.py checks the standalone refund only through 2021, and from 2022 checks it through hi_refundable_credits.
  • The changelog fragment drops the Act 115 claim, since main's Guard historical state rebate eligibility and document attribution #10309 already stops the pre-2021 refund.

Tests (merged head, one file per process)

File Result
hi_act_115_rebate.yaml 20 passed
hi_credit_start_dates.yaml 6 passed
hi_eitc.yaml 10 passed
hi_military_pay_exclusion.yaml 7 passed
tests/unit/test_hi_credit_start_dates_properties.py (Hypothesis) 17 passed
tests/test_hi_credit_ordering.py (from #10202, now on main) 14 passed
code health: reference URLs 32, concatenated URLs 48, dead URLs 40, source conflicts 103 passed

Hand computations

  • 2017, single, age 30, $8,000 wages: match rate 0 before 2018, so hi_eitc_potential = 0. Refundable credits = $100 food/excise (AGI $5,000–$10,000) + 0 = $100.
  • 2022, same filer: federal EITC 560, hi_eitc_potential = 20% × 560 = 112. Refundable credits = $100, since the 2022 list leaves the refund out.
  • 2021, single, AGI $50,000, one exemption: refund = $300 × 1 = $300, inside hi_refundable_credits.

Mutants (each in its own process, code restored after)

Mutant Result
EITC match back to 2017-01-01: 0.2 with no zero before it (the old backdating) caught: 2 of 6 hi_credit_start_dates.yaml cases fail
hi_act_115_rebate added to the 2022 refundable list caught: 1 of 20 hi_act_115_rebate.yaml cases fails

CI

The Pull request run at fac53d9ea8 passed, with every job succeeding: https://github.com/PolicyEngine/policyengine-us/actions/runs/41717636918

Judgment calls

Proposed follow-ups

  • Hawaii 2015 food/excise credit amounts. Act 223 (SLH 2015) raised the amounts from 2016, so the 2015 minor-child amount was $85, not $110 (2015 Schedule X). Date the 2015 values.
  • Hawaii 2016–2017 rates. Act 107 (SLH 2017) reinstated the top three brackets from 2018, and the model backdates the 2018 schedule. Date the rate brackets.

Generated by Claude Code

@MaxGhenis

MaxGhenis commented Nov 4, 2026 •

Copy link
Copy Markdown
Contributor Author

Hub review in progress

Reviewing head fac53d9ea875f856ea1b7a0cf14213cc2174b7b2 (unchanged since the hand-off).

Findings so far, still being checked:

  • CI: the Pull request run at this head passed; all 36 jobs succeeded (run 41717636918).
  • Every changed test file passes at the head, one per process: 20, 6, 10 and 7 YAML cases, and 17 property tests.
  • The body's evidence for main is stale. With main's four parameter files restored, 9 YAML cases fail (the body says 16) and 6 of 17 property tests fail (it says 15). For the table's filer, current main gives hi_income_tax of $0.00 in 2017, not −$396.21. The head gives $5.79.
  • The military cap change moves current-year output: the 2025 cap goes from $8,315.01 to $8,636, and 2026 from $8,503.45 to $8,831.72. The 2025 step (+6.85%) is the largest in the series, and no source I could reach confirms it.
  • Sources: this session's network policy blocks capitol.hawaii.gov, data.capitol.hawaii.gov, files.hawaii.gov, web.archive.org, govinfo.gov and law.justia.com.
  • Mutants are still running.

Generated by Claude Code

@MaxGhenis

Copy link
Copy Markdown
Contributor Author

Ready for hub review
VERDICT: REQUEST_CHANGES
fac53d9
METHODOLOGY_CHOICE: no

The head hasn't moved since the hand-off. It merges cleanly with current origin/main (25c4253483; git merge-tree reports no conflicts). The code does what the hand-off says. Every changed test passes at the head, and the Pull request run is green. I ask for changes because the PR body's evidence for main is false at the merge base. The body becomes the record for this change, and it misstates what the PR changes. None of the Hawaii sources were reachable from this session, so the law behind the dates and caps is still unconfirmed.

Findings

P1. The body's "Before" figures and failure counts are wrong at this PR's base

The body's evidence predates #10202 and #10309, which both landed on main before the merge.

  • The table says hi_income_tax 2017 goes from "−$396.21" to "$5.79" for a single filer, age 30, with $8,000 of wages. On current main that filer owes $0.00 in 2017. Since Apply Hawaii refundable credits before nonrefundable credits #10202, the 20% EITC ($102) is capped at the adjusted tax liability ($105.79 − $100 = $5.79), so the tax is 105.79 − 5.79 − 100 = 0. The head gives $5.79. The real change for this filer is +$5.79, not +$402.
  • "On main, 16 of these cases fail": with main's four parameter files restored, 9 fail (hi_credit_start_dates.yaml 2, hi_eitc.yaml 2, hi_military_pay_exclusion.yaml 5). hi_act_115_rebate.yaml passes in full on main (20/20), because Guard historical state rebate eligibility and document attribution #10309 already zeroes the amounts before 2021.
  • "On main, 15 of the 17 tests fail": 6 of 17 fail (test_grid_invariants[2015], [2016], [2017], test_hawaii_eitc_starts_in_2018, test_generated_invariants, test_military_pay_exclusion_matches_published_caps).

Run: the same filer from 2015 to 2027 at main (origin/main worktree) and at the head.

main 2017 {'eitc': 510.0, 'hi_eitc_potential': 102.0, 'hi_eitc': 5.79, 'hi_non_refundable_credits': 5.79, 'hi_act_115_rebate': 0.0, 'hi_refundable_credits': 100.0, 'hi_income_tax': 0.0}
head 2017 {'eitc': 510.0, 'hi_eitc_potential': 0.0,   'hi_eitc': 0.0,  'hi_non_refundable_credits': 0.0,  'hi_act_115_rebate': 0.0, 'hi_refundable_credits': 100.0, 'hi_income_tax': 5.79}

For the failure counts, I ran git checkout origin/main -- <the four parameter files>, then each changed test file in its own process, then restored the files. Main's seven commits after the merge base touch no Hawaii file. The only EITC change among them (#10307) affects separate filers, and no case here has one.

Replacement table row: | hi_income_tax 2017 | $0.00 (the $102 EITC is capped at the $5.79 adjusted liability) | $5.79 |. In "Tests", say 9 cases fail on main instead of 16, and 6 of the 17 property tests instead of 15.

P2. The military pay caps move current-year output, and no session has checked them against a source

policyengine_us/parameters/gov/states/hi/tax/income/subtractions/military_pay/cap.yaml:3-13. The hand-off says the values are "as an earlier session recorded them", and neither the author nor I could reach files.hawaii.gov or web.archive.org. The changes to 2015–2021 lower historical caps. The 2025 value raises current and future years:

Year Main Head
2025 8,315.01 (uprated) 8,636
2026 8,503.45 8,831.72
2027 8,756.88 9,094.92

Year-on-year growth in the PR's series is 1.31%, 2.09%, 2.40%, 2.61%, 3.09%, 3.01%, 2.70%, 4.60% and 5.19% for 2016–2024, then 6.85% for 2025, the largest step. That isn't evidence the value is wrong, but it is the one value that changes baseline output now. Before landing, someone with access should read line 15 of the 2025 N-11 instructions (the forms/2025/n11ins.pdf#page=13 reference the PR adds). The 2015–2017 Wayback citations need the same check.

P3. The body and the property test say the Hawaii EITC is "40% from 2023", but the parameter returns to 20% in 2028

policyengine_us/parameters/gov/states/hi/tax/income/credits/eitc/match.yaml:7-8 keeps main's 2023-01-01: 0.4 and 2028-01-01: 0.2. The body's invariant ("0.4 from 2023") and the test docstring ("then 40% and refundable from 2023") hold only through 2027. The test's YEARS stops at 2026, so it doesn't catch this. Replacement in the body: hi_eitc_potential equals the year's match rate (0 before 2018, 0.2 for 2018–2022, 0.4 for 2023–2027, 0.2 from 2028 as the parameter stands) times eitc.

A web search summary pointed to a 2025 act that may keep the 40% rate past 2027. It was a search summary, not the act, so I don't treat it as established. The 2028 value is on main and outside this PR, so I list it under follow-ups.

P3. The military cap differential test copies the parameter file into Python

policyengine_us/tests/unit/test_hi_credit_start_dates_properties.py:56-68, 228-252. MILITARY_PAY_CAP restates cap.yaml value for value, and test_military_pay_exclusion_matches_published_caps checks the parameter against that copy. CLAUDE.md asks for YAML here ("Use YAML for policy calculations"), and hi_military_pay_exclusion.yaml already covers 2015, 2018, 2020, 2021, 2022 and 2025. EITC_MATCH does the same for match.yaml, though there the grid adds real checks (the refundable composition and the pre-2018 tax identity). The hand-off doesn't report the cost CLAUDE.md asks for. Locally the file takes 58 s of pytest time when passing and 287–364 s when failing, because Hypothesis shrinks. Replacement: add YAML cases for 2016 ($6,279), 2017 ($6,410), 2019 ($6,735), 2023 ($7,683) and 2024 ($8,082) to hi_military_pay_exclusion.yaml, and delete MILITARY_PAY_CAP and test_military_pay_exclusion_matches_published_caps. My mutant M3 (below) shows that today only the Python copy guards 2016.

P3. The brief asked for Act 115 and the HRS 235-55.75 history to be read, and nobody has read them

The author's brief said "confine the Act 115 refund to 2023" and "Read Act 115 and the HRS 235-55.75 history." The PR confines the refund to tax year 2021, and the hand-off reads "2023" as a slip. The code, main's #10309 parameters and the existing references all attribute the refund to the 2021 return, so 2021 is consistent with the model. Neither the author nor I could fetch Act 115, Act 107 or HRS 235-55.75, so the 2018 start and the 2021 year rest on the PR's citations, not on text either session read.

Mutants

Each mutant ran on a scratch worktree at the head, with each test file in its own process. I restored the code after each one, and git status was clean afterwards.

Mutant Result Killed by
M1 (hand-off): match.yaml back to 2017-01-01: 0.2 with no zero killed hi_credit_start_dates.yaml 2 of 6; hi_eitc.yaml 2 of 10 (the 2016 and 2017 cases); properties 5 of 17 (test_grid_invariants[2015-2017], test_hawaii_eitc_starts_in_2018, test_generated_invariants)
M2 (hand-off): hi_act_115_rebate added to the 2022 refundable list killed hi_act_115_rebate.yaml 1 of 20 ("No refund in 2022 refundable credits"); hi_credit_start_dates.yaml 1 of 6 (case 5); properties 3 of 17 (test_grid_invariants[2022], test_act_115_refund_is_paid_only_for_2021, test_generated_invariants)
M3 (mine): 2016 cap 6,279 → 6,410 killed only by Python test_military_pay_exclusion_matches_published_caps; every YAML file passes, since no YAML case covers 2016 (see P3)
M4 (mine): drop 2025-01-01: 8_636 (back to the uprated 8,315.01) killed hi_military_pay_exclusion.yaml 1 of 7 ("The 2025 cap is $8,636"); test_military_pay_exclusion_matches_published_caps
M5 (mine): drop the refundable.yaml 2000-01-01 block survives (equivalent) none; the refund amounts are 0 before 2021, so the block moves no dollar amount
M6 (mine): drop non_refundable.yaml 2000-01-01: [] survives (equivalent) none; with the match at 0 before 2018, listing hi_eitc as nonrefundable in 2015–2017 moves no dollar amount

M5 and M6 show that the two 2000-01-01 list blocks are belt-and-braces, not load-bearing. That is fine. The changelog's "list only the credits a 2015-2020 Form N-11 carried" describes a list change with no dollar effect.

Readers of each changed parameter

  • credits/eitc/match.yaml: read only by hi_eitc_potential. That feeds hi_eitc, which returns the potential directly when hi_eitc isn't in the nonrefundable list (it isn't before 2018). hi_eitc is listed in gov/states/household/state_eitcs.yaml from its 2018-01-01 block (line 81), so the state EITC total already began in 2018.
  • credits/non_refundable.yaml: read by hi_non_refundable_credits and hi_eitc. The empty list before 2018 gives 0 for both (head run above: 0.0 in 2015–2017).
  • credits/refundable.yaml: read by hi_refundable_credits (the adds list), which feeds hi_income_tax, hi_adjusted_tax_liability (its "hi_act_115_rebate" in p.refundable branch is false for the new 2000 block, and it subtracted a $0 refund before) and the household and state refundable credit lists. The new 2000-01-01 block changes no dollar amount, because main's Guard historical state rebate eligibility and document attribution #10309 already sets the refund amounts to 0 before 2021.
  • subtractions/military_pay/cap.yaml: read only by hi_military_pay_exclusion, which is in both subtractions.yaml lists (2021 and 2025, the 2021 list backdated to 2015).
  • No contrib reform under policyengine_us/reforms/states/hi/ reads any of these.

No reader gets worse. The PR does make these reachable outputs change: Hawaii tax rises in 2015–2017 for filers with a federal EITC and Hawaii liability, the military exclusion falls in 2015–2021, and it rises from 2025 on. So baseline output moves in 2025 and later wherever military_service_income is positive for a Hawaii head or spouse. The hub's population check should look at Hawaii income tax for 2025–2026 among those records, and at 2015–2017 if any historical run matters.

Checked and sound

What I couldn't check

Follow-ups (main's defects, not this PR's)

  • Hawaii EITC rate from 2028. match.yaml drops to 0.2 on 2028-01-01. If a 2025 act made 40% permanent, as a search summary suggested, 2028+ is wrong. Witness: any Hawaii filer with a federal EITC in 2028 gets hi_eitc_potential = 0.2 × eitc. Check against the current HRS 235-55.75 and its 2025 history.
  • The hand-off's two proposals (2015 food/excise amounts, 2016–2017 top brackets) need the same source check before anyone files them.

Generated by Claude Code

@MaxGhenis

Copy link
Copy Markdown
Contributor Author

Picking this up for the US hub. I'll post a hand-off comment here when it's ready.


Generated by Claude Code

Brings the branch up to date before the round 1 review changes. No conflicts.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LwQq6K4r2Szr4jxEJDaoDh
…sources

The round 1 review found that the Python differential test copied cap.yaml
value for value. Each year's cap from 2015 to 2025 now has a YAML case, so
the Python copy and its test go. Two hi_eitc cases pin the 40% match in 2027
and its return to 20% in 2028, when Act 163's increase is repealed and the
section reenacted. The references now point at the pages of DOTAX's chapter
235 compilation that hold HRS 235-7(a)(7) and 235-55.75, credit Act 114 (SLH
2022) with refundability, and give the refundable list the right section.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LwQq6K4r2Szr4jxEJDaoDh
@MaxGhenis

Copy link
Copy Markdown
Contributor Author

Ready for hub review

Head: 90e7100358197a51b09633580ba42fe52c50a429

Round 1 changes, on top of fac53d9ea8. Nobody else committed to the branch while I worked.

Items

  1. Pick-up and merge. I posted the pick-up comment, then merged origin/main (25c4253483) with a merge commit, e3ca3090e0. No files conflicted, and the merge changes no Hawaii file. I reran every changed file after the merge (see Tests).
  2. Sources. The references and body cite the sources the hub read on 2026-11-04. No value changes.
  3. Military caps move to YAML. Five cases at hi_military_pay_exclusion.yaml:65,74,83,92,101 (2016 $6,279, 2017 $6,410, 2019 $6,735, 2023 $7,683, 2024 $8,082), each with military_service_income: 10_000, is_tax_unit_head_or_spouse: true and state_code: HI. The file now covers every year from 2015 to 2025 (12 cases). I deleted MILITARY_PAY_CAP, test_military_pay_exclusion_matches_published_caps and the docstring bullet that described them from test_hi_credit_start_dates_properties.py. Nothing else used them.
  4. 40% wording.
    • The docstring now says "then refundable from 2023 (Act 114, SLH 2022), at 40% through 2027 (Act 163, SLH 2023) and 20% from 2028" (test_hi_credit_start_dates_properties.py:9-11).
    • The EITC_MATCH comment (:43-44) now says the table runs through 2026 and that the 40% rate expires after 2027. YEARS still stops at 2026.
    • No other comment in the PR said 40% applies from 2023 with no end, or credited Act 115 with refundability. I grepped every changed file.
    • New cases hi_eitc.yaml:106 ("40% refundable match in 2027": 400/400) and :115 ("20% refundable match in 2028": 200/200).
    • Formula check, done before I wrote the outputs: hi_eitc.formula returns hi_eitc_potential when "hi_eitc" not in credits.non_refundable, and that list is [] from 2023-01-01. The 2028 case's comment cites the repeal and reenactment of § 235-55.75(a) on December 31, 2027 (L 2023, c 163, §5).
  5. Statute references.
    • cap.yaml:24: #page=23.
    • match.yaml:14: #page=49.
    • non_refundable.yaml:15: the comment now reads # nonrefundable through 2022; refundable from 2023 (Act 114, SLH 2022).
    • refundable.yaml:43-44: the title is now "Hawaii Income Tax Law, Chapter 235, Section 235-55.75", and the href is the data.capitol.hawaii.gov URL.
  6. The body's evidence, against main. I restored main's four parameter files (git checkout origin/main -- …), ran each test file in its own process, then restored HEAD. git status was clean afterwards.
    • YAML: 12 cases fail on main.
      • hi_military_pay_exclusion.yaml: 8 of 12 (the 2021-over-cap case, plus 2015, 2016, 2017, 2018, 2019, 2020 and 2025).
      • hi_eitc.yaml: 2 of 12 (the 2016 and 2017 cases).
      • hi_credit_start_dates.yaml: 2 of 6 (cases 1 and 6).
      • hi_act_115_rebate.yaml: 0 of 20.
      • The 2022, 2023 and 2024 cap cases pass on main, which already has those values.
    • Property test: 5 of 16 fail on main. They are test_grid_invariants[2015], [2016] and [2017], test_hawaii_eitc_starts_in_2018 and test_generated_invariants. That run took 337 s, mostly Hypothesis shrinking.
    • Single filer, age 30, $8,000 wages, 2015–2028. Head and main match in every year from 2018 to 2028. In 2015–2017, main gives hi_eitc_potential 102.0, hi_eitc 5.79 and hi_income_tax 0.00; the head gives 0, 0 and 5.79. Main still gives $0.00 in 2017, so I used the brief's row as written.
    • The body's Summary rows, the "Tests" counts (12, and "5 of its 16"), the new military YAML bullet, the hi_eitc_potential invariant and the Changes sentence are all replaced. The military invariant bullet is gone.
  7. Sources section. I replaced it with the two bullets as given. I also added a "Merge with main (2026-11-04): No conflicts" note. The read-back body matches what I sent. No sentence still calls a source unread: I grepped for "unread", "could not" and "confirm".
    • Links: all six parse as well-formed Markdown links (checked locally: 6 links, no stray brackets).
    • What I couldn't check: GitHub's /markdown render endpoint is blocked here (403), and this session can't reach files.hawaii.gov or data.capitol.hawaii.gov (curl returns 000). So I didn't render the section on GitHub or fetch the targets.
  8. Mutants. Each ran in its own process, and I restored the file after each one.
Mutant Result Killed by
M3: 2016 cap 6,279 → 6,410 killed hi_military_pay_exclusion.yaml "The 2016 cap is $6,279" (6410 vs 6279), 1 of 12
M4: drop 2025-01-01: 8_636 killed hi_military_pay_exclusion.yaml "The 2025 cap is $8,636" (8315.01 vs 8636), 1 of 12
New: match.yaml 2028-01-01: 0.2 → 0.4 killed hi_eitc.yaml "20% refundable match in 2028" (400 vs 200), 1 of 12
  1. Runs at the head. One file per process.
    • hi_military_pay_exclusion.yaml: 12 passed.
    • hi_eitc.yaml: 12 passed.
    • hi_credit_start_dates.yaml: 6 passed.
    • hi_act_115_rebate.yaml: 20 passed.
    • test_hi_credit_start_dates_properties.py: 16 passed. Pytest reports 101.3 s. Wall time including the interpreter was 237.8 s, and peak RSS was 4,388 MB. These are local measurements on a 4-vCPU VM, not Linux CI numbers.
    • ruff format --check passed ("1 file already formatted"), and so did ruff check ("All checks passed!").

CI

Not finished at hand-off. The Pull request run at 90e7100358 is 41859475657. At 16:41Z, 65 minutes after the push, 35 of 36 jobs had completed with success. One, Contrib tests / Full Suite - Contrib (other-shard-3), was still in progress, after the run sat queued for about 30 minutes. None had failed or been cancelled. Per the brief, I'm handing off with the run URL rather than waiting.

Judgment calls

Left for the hub

Proposed follow-ups

None new. The review's 2028-rate follow-up closes on the sources in the body.


Generated by Claude Code

@MaxGhenis

MaxGhenis commented Nov 4, 2026 •

Copy link
Copy Markdown
Contributor Author

Hub review in progress

Round 2 review of head 90e7100358197a51b09633580ba42fe52c50a429, unchanged since the hand-off. Its merge base with origin/main is main's tip (25c4253483).

Firm so far:

  • CI. The Pull request run at this head (41859475657) completed with success. All 36 jobs succeeded, including Contrib (other-shard-3), which was still running at hand-off. None was skipped or cancelled.
  • Tests at the head, one file per process. hi_military_pay_exclusion.yaml 12 passed, hi_eitc.yaml 12, hi_credit_start_dates.yaml 6, hi_act_115_rebate.yaml 20. test_hi_credit_start_dates_properties.py 16 passed (pytest 106 s, wall 239 s, peak RSS 4,394 MB, local VM). ruff format --check and ruff check pass.
  • Against main's four parameter files. 12 YAML cases fail (military 8, EITC 2, start dates 2, Act 115 0), as the body says. The single filer (age 30, $8,000 wages) has hi_income_tax $0.00 in 2017 on main and hi_eitc_potential 102.0 in 2015-2017.
  • Sources. This session's network policy blocks files.hawaii.gov, data.capitol.hawaii.gov, capitol.hawaii.gov, web.archive.org, govinfo.gov, uscode.house.gov, ecfr.gov and law.justia.com, by curl and by fetch.

Still running: the property test against main, mutants, and the #10200 trial merge.


Generated by Claude Code

@MaxGhenis

Copy link
Copy Markdown
Contributor Author

Ready for hub review
VERDICT: APPROVE
90e7100
METHODOLOGY_CHOICE: no

The head hasn't moved since the hand-off. Its merge base with origin/main is main's tip (25c4253483). This round, fac53d9ea8..90e7100358, has two commits: a conflict-free merge of main (e3ca3090e0, no Hawaii file changed) and 90e7100358, which makes the round 1 changes. It changes no parameter value, only references, comments and tests, so it moves no output by itself. Every round 1 finding is resolved. I reran the body's evidence and got the same numbers. CI is green. Three P3s remain, all wording in the body or in a reference title. None blocks landing.

Findings

P3. Two places cite different sections of Act 163 for the repeal

The new comment at policyengine_us/tests/policy/baseline/gov/states/hi/tax/income/credits/hi_eitc.yaml:121-122 cites "L 2023, c 163, sec. 5". policyengine_us/parameters/gov/states/hi/tax/income/credits/eitc/match.yaml:18, which was already on main, titles the act reference "Act 163 (SLH 2023) Section 4 - Sunset provision". The current HRS § 235-55.75 note, as the hub read it, says "L 2023, c 163, §5". I couldn't read Act 163 (capitol.hawaii.gov is blocked here), so I can't say which section is right. A reader following the parameter would land on the wrong section if §5 is correct. Suggested replacement, once someone confirms it against the act: - title: Act 163 (SLH 2023) Section 5 - Repeal and reenactment on December 31, 2027.

P3. The Invariants header says 2015–2026, but its EITC bullet states the 2027 and 2028 rates

In the body, "Invariants (checked for every grid point and generated household, 2015–2026)" now heads a bullet that gives 0.4 for 2023–2027 and 0.2 from 2028. The property test's YEARS is range(2015, 2027) (test_hi_credit_start_dates_properties.py:41), so the grid doesn't check 2027 or 2028. Two hi_eitc.yaml cases do. The hand-off already notes this. Replacement for the end of that bullet: … and 0.2 from 2028) times eitc. The grid checks 2015–2026; two hi_eitc.yaml cases check 2027 and 2028.

P3. The body's 535-case and 543-case runs predate this round

"All 535 cases in the Hawaii baseline and contrib YAML tests … pass" and "In a trial merge with #10200 and #10202, all 543 Hawaii YAML cases … pass" were measured before this round added 7 cases (5 military, 2 EITC). Nobody reran them, as the hand-off says. A static count with the same file selection grows by 7 from fac53d9ea8 to 90e7100358. The green CI run at this head is the current evidence. Replacement: - The Pull request run at 90e7100358 (all 36 jobs) runs every Hawaii baseline and contrib YAML file. Then drop the 543 figure, or mark it "(measured at fac53d9)".

Round 1 findings, checked

Round 1 finding Status at this head How I checked
P1: the body's evidence against main Fixed Reran below. The body's 12 YAML failures and 5 of 16 property failures match.
P2: military caps unsourced Resolved by the hub's reading, cited in the body The 11 values in cap.yaml:3-13 and its page anchors match the amounts and pages the hub quotes from line 15 of each year's N-11 instructions. I couldn't fetch the forms (see below).
P3: 40% "from 2023" Fixed The docstring (:9-11), the EITC_MATCH comment (:43-44) and the body bullet give 40% through 2027 and 20% from 2028. New cases at hi_eitc.yaml:106 and :115.
P3: Python copy of the caps Fixed MILITARY_PAY_CAP and test_military_pay_exclusion_matches_published_caps are gone, and nothing else referenced them (ruff check passes; grep finds no use). hi_military_pay_exclusion.yaml has a case for each year from 2015 to 2025.
P3: Act 115 and § 235-55.75 history unread Resolved by the hub's reading The body's Sources section cites them. non_refundable.yaml:15 now credits Act 114 (SLH 2022) with refundability.

Verification

The rule, by hand, before reading the formula. The caps are the hub's line 15 amounts: 2016 $6,279, 2017 $6,410, 2019 $6,735, 2023 $7,683 and 2024 $8,082, each below the cases' $10,000 of pay. The EITC with eitc: 1_000: 2027 is 0.4 × 1,000 = 400, and 2028 is 0.2 × 1,000 = 200. Both years are refundable, since the credit is refundable from 2023, so hi_eitc equals the potential. With no income the liability is 0, so a nonrefundable credit would be 0. For the single filer (age 30, $8,000 wages) at the head in 2017: federal EITC 510 at a 0 match gives a potential of 0. Tax 105.79 minus $100 food/excise gives $5.79. In 2027 the potential is 0.4 × 612 = 244.8, and in 2028 it is 0.2 × 612 = 122.4.

The formula. hi_eitc.formula returns hi_eitc_potential when "hi_eitc" not in credits.non_refundable, and that list is [] from 2023-01-01. hi_eitc_potential is match × eitc. hi_military_pay_exclusion sums min_(military_service_income, cap) over heads and spouses, with no year branch, so a per-year case at a value above the cap is enough.

Tests at the head, one file per process:

File Result
hi_military_pay_exclusion.yaml 12 passed
hi_eitc.yaml 12 passed
hi_credit_start_dates.yaml 6 passed
hi_act_115_rebate.yaml 20 passed
test_hi_credit_start_dates_properties.py 16 passed; pytest 106 s, wall 239 s, peak RSS 4,394 MB (local 4-vCPU VM, not CI). It needs the dev extra for hypothesis.
ruff format --check, ruff check on that file "1 file already formatted", "All checks passed!"

The body's evidence against main. I ran git checkout origin/main -- <the four parameter files>, then each file in its own process, then restored the files (git status clean):

  • hi_military_pay_exclusion.yaml failed 8 of 12: the 2021 over-cap case, and 2015, 2016, 2017, 2018, 2019 and 2020 (each gives 7345), and 2025 (8315.01 vs 8636).
  • hi_eitc.yaml failed 2 of 12 (hi_eitc_potential@2016 101.2, @2017 102 vs 0).
  • hi_credit_start_dates.yaml failed 2 of 6.
  • hi_act_115_rebate.yaml failed 0 of 20.
  • In total, 12 YAML cases fail, as the body says.
  • Property test: 5 of 16 fail (test_grid_invariants[2015], [2016], [2017], test_hawaii_eitc_starts_in_2018, test_generated_invariants), as the body says. That run took 439 s of pytest time, 564 s wall and 5,262 MB peak.
  • Single filer, 2015–2028. Main gives hi_eitc_potential 102.0, hi_eitc 5.79 and hi_income_tax 0.0 in 2015–2017. The head gives 0.0, 0.0 and 5.79. Every year from 2018 to 2028 is identical. So the body's rows "hi_income_tax 2017 | $0.00 … | $5.79" and "hi_eitc_potential | 20% … 2015-2017 | 0 in 2015-2017" are right. Main's cap.yaml (2021 $7,345 backdated, 2023 $7,683, 2024 $8,082, uprated after) confirms the "Before" military row.

Mutants. Each ran on the scratch worktree at the head, one test file per process. I restored the code after each one, and git status --porcelain was empty after each.

Mutant Result Killed by
M3: 2016 cap 6,279 → 6,410 killed hi_military_pay_exclusion.yaml "The 2016 cap is $6,279" (6410 vs 6279), 1 of 12
M4: drop 2025-01-01: 8_636 killed "The 2025 cap is $8,636" (8315.01 vs 8636), 1 of 12
match.yaml 2028-01-01: 0.2 → 0.4 killed hi_eitc.yaml "20% refundable match in 2028" (hi_eitc_potential 400 vs 200)
Mine: the drop dated 2027-01-01 instead of 2028-01-01 (off by a year) killed hi_eitc.yaml "40% refundable match in 2027" (200 vs 400)
Mine: hi_eitc nonrefundable again from 2028 (in non_refundable.yaml, and out of a 2028 refundable.yaml block) killed "20% refundable match in 2028" (hi_eitc 0 vs 200). Adding it to non_refundable.yaml alone, with hi_eitc left in the refundable list, raises a CycleError instead, so I made the mutant change both lists.

The 2027 and 2028 cases assert the claim, not a weaker one: they pin the rate on each side of the repeal date, and the 2028 case also pins refundability.

Readers. match.yaml is read only by hi_eitc_potential. non_refundable.yaml is read by hi_eitc and hi_non_refundable_credits. refundable.yaml is read by hi_refundable_credits (adds). cap.yaml is read only by hi_military_pay_exclusion, which subtractions.yaml lists. hi_eitc also appears in gov/states/household/state_eitcs.yaml from 2018. No contrib reform reads any of them. This round changes none of their values, so no reader changes since round 1.

Baseline output. This round moves nothing. The PR as a whole, as round 1 found, lowers the military cap in 2015–2021, raises it from 2025 (8,315.01 → 8,636 in 2025, uprated after that), and removes the EITC in 2015–2017. The hub's population check is Hawaii income tax for 2025 onward among Hawaii heads and spouses with military_service_income, and 2015–2017 if historical runs matter.

CI. The Pull request run at this head, 41859475657, completed with success. All 36 jobs succeeded, none skipped or cancelled, including Contrib (other-shard-3) (still running at hand-off) and Household API Partners.

References. cap.yaml:24 is #page=23, match.yaml:14 is #page=49, the comment at non_refundable.yaml:15 names Act 114, and refundable.yaml:43-44 is titled § 235-55.75 with the data.capitol.hawaii.gov href. Each matches the round's instructions. One reference per source, with no page list in an href. The 2025 cap reference opens #page=13, as the hub's reading puts it.

Body. The Sources section has its two bullets, and their six links are well-formed. No sentence calls a source unread. impact: the hub will measure and axiom: (hub files pe-parity before landing) are present. Both were left for the hub.

Scope and overlap. Nothing under .github/ or tests/policy/baseline/partners/. The changelog fragment changelog.d/hi-credit-start-dates.fixed.md is top-level. In a search of open PRs by changed file name, only #10200 (refundable.yaml) and #10614 (Hawaii LIHEAP, no shared file) touch Hawaii files. A trial merge of #10200 into this head (git merge-tree, full history) auto-merges refundable.yaml, which adds hi_claim_of_right_credit to the 2022 and 2023 blocks, with no Hawaii conflict. #10200 itself reports mergeable_state: dirty against main, from its own base.

Methodology. The PR dates parameters to the law as DOTAX states it. It picks no reading where the law allows two.

What I couldn't check

  • Every legal source. This session's network policy blocks files.hawaii.gov, data.capitol.hawaii.gov, capitol.hawaii.gov, tax.hawaii.gov, web.archive.org, govinfo.gov, uscode.house.gov, ecfr.gov and law.justia.com, by curl (proxy 403) and by fetch (no DNS). So I read none of the N-11 instructions, Form N-356, the DOTAX announcements, HRS § 235-7 or § 235-55.75, or Acts 107, 114, 115, 163 or 25. The caps, the 2018 start, refundability from 2023 and the 2028 return to 20% rest on the hub's reading of those sources as quoted to me, and the PR matches that reading at every value and page. I didn't independently confirm the 2025 cap against the E-5 pay formula in § 235-7(a)(7).
  • Population impact. That needs data this session doesn't have.
  • Whether GitHub renders the body's links. I parsed them locally but didn't render them.

Generated by Claude Code

@MaxGhenis

Copy link
Copy Markdown
Contributor Author

Picking this up for the US hub. I'll post a hand-off comment here when it's ready.


Generated by Claude Code

Section 5 of Act 163 (SLH 2023), on PDF page 3, applies the act from
2023 and repeals it on December 31, 2027, reenacting the earlier text.
Section 4 only explains the act's bracket and underscore marks. Point
the seven parameter files that cite the sunset at Section 5.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LwQq6HWtPqg7fKcLTqL3ef
@MaxGhenis

Copy link
Copy Markdown
Contributor Author

Ready for hub review

Head: b07103b3ca14ba0b21cfcaa561095e438a899b8a

Built on 90e7100358, the head the item named; no other commit landed on the branch. No merge of origin/main was needed.

Items

  1. P3, Act 163's repeal section. In each of the seven files, the "Act 163 (SLH 2023) Section 4 - Sunset provision" entry (title, comment and href) is replaced with the item's Section 5 entry, at the file's indentation, at https://data.capitol.hawaii.gov/slh/Years/SLH2023/SLH2023_Act163.pdf#page=3:

    • policyengine_us/parameters/gov/states/hi/tax/income/credits/eitc/match.yaml:25-27
    • .../credits/cdcc/dependent_care_benefits/expense_floor.yaml:37-39
    • .../credits/food_excise_tax/amount/{head_of_household,joint,separate,single,surviving_spouse}.yaml:18-20

    No other file under policyengine_us/ cites Act 163's old URL or "Section 4 - Sunset", including the known-dead URL list. hi_eitc.yaml:121-122 is untouched. I didn't fetch the act myself; the Section 5 reading is the hub's.

  2. Runs, one file per process at this head:

File Result
hi_eitc.yaml 12 passed
act_163_sunset.yaml 6 passed
hi_cdcc.yaml 13 passed
hi_food_excise_credit.yaml 30 passed
code_health/test_reference_urls.py 32 passed
code_health/test_known_dead_reference_urls.py 40 passed

Mutants and hand computations

None. The change only touches reference metadata, so it can't move an output, and no Python file changed.

Body

I read the body after the push. It cites Act 163 only for the 40% rate (through DOTAX Announcement 2023-04) and the repeal date (through § 235-55.75(a)), not by section, so no sentence became false. The Invariants bullet and test-count lines the hub fixed on 2026-11-04 are untouched. After CI finished, I replaced the one CI sentence that named 90e7100358 with the run at this head, and read the body back.

CI

Pull request run 41946261850 at b07103b3ca concluded success: all 36 jobs completed with success, none cancelled or skipped.

Judgment calls

  • The old href pointed at www.capitol.hawaii.gov with no page anchor; the item's entry uses data.capitol.hawaii.gov with #page=3. I used the item's URL as given.

Generated by Claude Code

@DTrim99

DTrim99 commented Nov 6, 2026

Copy link
Copy Markdown
Collaborator

PR Review: Date Hawaii's EITC from 2018, confine the Act 115 refund to 2021, and use each year's military pay cap

Summary

The PR dates three Hawaii parameters that backdate_parameters had copied back to 2015. Each date and value matches the governing law.

  • EITC. The match is now 0 before 2018, 20% for 2018–2022 (nonrefundable), 40% for 2023–2027 and 20% from 2028 (both refundable).
  • Act 115 refund. A 2015–2020 refundable-credit block without the refund. It changes no output, because main's Guard historical state rebate eligibility and document attribution #10309 already sets the refund amounts to $0 before 2021.
  • Military pay cap. Each year's DOTAX amount for 2015–2025.
  • References. A switch from Act 163 §4 to §5 in seven files.

I checked the claims myself rather than relying on the author's self-check. I read Acts 107 (via DOTAX), 114, 115 and 163, HRS §§ 235-55.75 and 235-7(a)(7), DOTAX Announcements 2022-03 and 2023-04, and the N-11 instructions for every year from 2015 to 2025. Every value and every new reference page matches its source. Each new or re-dated value that changes an output has a YAML case that pins it. CI is green (36/36), and the branch merges cleanly with main.

One should-address item remains. The new Python property test doesn't meet the repo's "Test design and CI cost" rules: the PR body neither justifies it nor reports its cost. The rest are suggestions.

Critical (must fix)

None.

Should address

1. policyengine_us/tests/unit/test_hi_credit_start_dates_properties.py is a simulation-built Python test of policy values, with no stated justification or cost report (CLAUDE.md, "Test design and CI cost").

What the file does:

  • It builds a 108-household Simulation over 12 years, plus eight more simulations from Hypothesis.
  • It re-implements the EITC match schedule (EITC_MATCH) and the Act 115 table (act_115_reference) in Python and compares the model against them.

What CLAUDE.md asks of a test like this:

  • "Use YAML for policy calculations … Do not add a Python test when the existing YAML framework can exercise the same behavior."
  • "Justify Python coverage … explain the distinct failure the new test detects."
  • For tests that build models: "report before/after elapsed time (including setup) and peak memory … Identify the affected CI group."

Where the PR falls short:

  • Overlap with YAML. The body says 5 of the file's 16 tests fail on main. All five fail on the 2015–2017 EITC match, which the new hi_eitc.yaml cases ("No Hawaii EITC in 2016/2017") and hi_credit_start_dates.yaml Cases 1 and 6 already catch.
  • No justification. The body names no failure that only this file would detect.
  • No cost report. The body gives no CI group, timing or memory. The author's self-check comment reports a local isolated run of 106 s and 4.4 GB peak RSS.
  • Measured CI cost. I took this from the run's timing artifact. In PR run 41946261850 the file ran in Rest shard 1, group remaining-1 (65 files). Its calls took about 21 s. The group took 21:08 wall time with a peak RSS of 8,861,144 KB (8.45 GiB), against the Makefile's target of about 10 GB per process.

Fix, either way:

  • Drop the file. After this PR, every re-dated value has a variable-named YAML case.
  • Or keep it and add two lines to the body. The first names the distinct failure it guards against, for example the composition of the refundable list in years without YAML cases (2019, 2023–2026), checked across filing statuses with randomized households. The second gives the CI numbers above, marked separately from the local measurement.

Suggestions

  1. Body placeholder. impact: the hub will measure is still in the body. Fill it with the measured impact, or drop the line. The PR changes Hawaii income tax in 2015–2017 (EITC removed) and the military cap in 2015–2021 (lower) and 2025 onward (higher).

  2. The standalone hi_act_115_rebate is $0 on only one side of 2021.

    • The amount schedules (act_115_rebate/{single,joint}.yaml) are 2020-01-01: 0 and 2021-01-01: 300/100. The variable therefore still returns $300 or $100 per exemption for 2022 and later.
    • Its only readers gate on the dated refundable list: hi_refundable_credits, hi_adjusted_tax_liability and main's new hi_income_tax_rebate_adjustment. So no tax or net-income figure is wrong. Main's Guard historical state rebate eligibility and document attribution #10309 and docs/validation/state-rebates.md chose this on purpose.
    • Act 115 §3(a) grants "a one-time general income tax refund" for "the 2021 taxable year". A 2022-01-01: 0 amount in both files, plus one hi_act_115_rebate: 0 case for 2022, would make the variable itself match the law. The PR's own rulespec-us#1685 comment asks the lawful output to return zero after 2021.
    • Optional, given the repo convention.
  3. Pre-existing gaps that the PR's axiom issues record but PE-US doesn't track. Neither is introduced or claimed by this PR. Consider filing PE-US issues so they don't live only in rulespec-us.

    • Separate filers under Act 115. Act 115 §3(a) says "a married couple filing separate tax returns … shall only be eligible for the refund that they would have been eligible for had a joint return been filed". Announcement 2022-03 (p. 2) applies the $200,000 threshold to "Both spouses combined". hi_act_115_rebate instead applies the single schedule ($100,000) to each spouse's own AGI. The author notes the gap in the rulespec-us#1685 comment.
    • Who qualifies for the military exclusion. HRS § 235-7(a)(7) excludes only pay of "each member of the reserve components … and the Hawaii national guard". hi_military_pay_exclusion caps military_service_income, which the variable documents as including active-duty pay. rulespec-us#2040 records this.
  4. Test file name. credits/hi_credit_start_dates.yaml is named for a topic, not a variable. CLAUDE.md asks for variable-named YAML files. Its six cases mostly assert hi_eitc_potential and hi_refundable_credits, so they could go into hi_eitc.yaml, hi_act_115_rebate.yaml or the existing integration.yaml. act_163_sunset.yaml is a local precedent, so this is optional.

  5. Body axiom note.

    • The note says "this PR changes 2015–2025 values". The military cap also changes for 2026 onward: it is now uprated from $8,636 in 2025, where main uprated from $8,082 in 2024. The 2025 gap of $320.99 (main: $8,315.01) carries into later years.
    • The 2026 resident pipeline holds this amount unencoded (rulespec-us#2040), so nothing is miscounted. The note could still say "2015–2025, and the uprated cap from 2026".

Verified correct

Law, read directly:

EITC:

  • 2018 N-11 instructions, p. 2. "A qualifying individual taxpayer may claim a new nonrefundable Earned Income Tax Credit equal to 20 percent of the federal earned income credit … for tax years 2018 through 2022. (Act 107, SLH 2017)."
  • 2018 Form N-356, p. 2 (Wayback copy cited). "The earned income tax credit is effective for taxable years beginning after December 31, 2017." This supports match.yaml 2000-01-01: 0 and 2018-01-01: 0.2, and non_refundable.yaml 2018-01-01: [hi_eitc].
  • HRS § 235-55.75 (2025 compilation, PDF p. 49, as match.yaml now cites).
    • Subsection (a) is headed "[Repeal and reenactment on December 31, 2027. L 2023, c 163, §5.]" and sets the rate at "forty per cent".
    • Subsection (g) covers nonrefundable credits "for any of the four consecutive taxable years beginning after December 31, 2017" and "for the taxable year beginning after December 31, 2021". That confirms the credit was nonrefundable for 2018–2022.
    • The section note says the Act 114 amendment "applies to taxable years beginning after December 31, 2022".
  • 2022 N-11 instructions, p. 2. The credit "is amended to make the credit refundable and permanent … Applies to taxable years beginning after December 31, 2022. (Act 114, SLH 2022)".
  • Act 163, SLH 2023, §5 (PDF p. 3, the page the seven files now cite). It "shall apply to taxable years beginning after December 31, 2022; provided that on December 31, 2027, this Act shall be repealed and sections 235-55.6(c), 235-55.75(a), and 235-55.85(b) … reenacted in the form in which they read on the day prior to the effective date". So §5 is the right section, and the rate returns to Act 114's 20%, still refundable, from 2028.
  • Announcement 2023-04, p. 3. "from 20% to 40% … applies to taxable years beginning after December 31, 2022, and will be repealed on December 31, 2027."

Act 115:

  • Act 115 (S.B. 514 C.D. 2).
    • §3(a) allows a refund to each qualifying resident taxpayer "who files an individual income tax return for the 2021 taxable year, a one-time general income tax refund". It sets $300 or $100 per qualified exemption, with a $100,000 threshold for single, separate and head-of-household returns and $200,000 for joint returns and surviving spouses, and allows no extra refunds for age or disability.
    • §3(b) excludes anyone "claimed or … otherwise eligible to be claimed as a dependent".
    • §6 makes §3 apply to "taxable years beginning after December 31, 2020".
    • The code's thresholds, exemption counting and dependent gate match. The one exception is the separate-filer proviso; see Suggestion 3.
  • Announcement 2022-03, p. 2. Refunds go to filers of a "2021 Resident Tax Return (Form N-11)". This supports dating the refundable list. The 2018 N-11 (p. 3) lists the food/excise, low-income renters' and dependent care credits as refundable (lines 28–30), so the new 2015–2020 block is right.

Military pay cap:

  • HRS § 235-7(a)(7) is at PDF p. 23 of hrs_235.pdf, as cap.yaml now cites. It covers pay for "forty-eight drills … and fifteen days of annual duty" at the E-5, eight-years-of-service grade.
  • The caps. Each N-11 instructions booklet reads "Hawaii does not tax the first $X" at the page cap.yaml cites:
Year Cap PDF page
2015 $6,198 14
2016 $6,279 15
2017 $6,410 15
2018 $6,564 15
2019 $6,735 15
2020 $6,943 15
2021 $7,152 13
2022 $7,345 13
2023 $7,683 13
2024 $8,082 13
2025 $8,636 13

Hand-checks (10 expectations):

Case Arithmetic Expected
hi_credit_start_dates Case 1, 2017 Federal EITC: min(7.65% × 8,000 = 612, 510 max) = 510, since AGI 8,000 is below the 8,340 phase-out start. Taxable income 8,000 − 2,200 − 1,144 = 4,656. Tax 1.4% × 2,400 + 3.2% × 2,256 = 33.60 + 72.19 = 105.79. Match 0. Food/excise $100 (single, AGI $5,000–$10,000). 105.79 − 0 − 100 eitc 510; hi_income_tax 5.792 ✓
Case 2, 2018 519 maximum (8,000 < 8,490); 0.2 × 519 103.8; refundable 100 ✓
Case 3, 2020 538 maximum (8,000 < 8,790); 0.2 × 538 107.6 ✓
Case 4, 2021 15.3% × 8,000 = 1,224 (below the 1,502 maximum); 0.2 × 1,224 = 244.8. Act 115: 1 exemption × $300 (AGI < $100,000). Refundable 100 + 300 1,224 / 244.8 / 300 / 400 ✓
Case 5, 2022 560 maximum (8,000 < 9,160); 0.2 × 560 = 112. The 2022 list has no Act 115 112; refundable 100 ✓
hi_eitc 2017 0 × 510 0, and nonrefundable 0 ✓
hi_eitc 2018 0.2 × 519 = 103.8. Liability left after the $110 food/excise credit at zero AGI is 999,890, which covers it hi_eitc and hi_non_refundable_credits 103.8 ✓
hi_eitc 2027 / 2028 0.4 × 1,000 / 0.2 × 1,000, refundable because the nonrefundable list is [] from 2023 400 / 200 ✓
hi_military_pay_exclusion 2015 / 2016 / 2021 / 2025 min(8,000, 6,198); min(10,000, 6,279); min(8,000, 7,152); min(9,000, 8,636) 6,198 / 6,279 / 7,152 / 8,636 ✓
hi_act_115_rebate, 2022 aggregate and 2020 joint 0 + 0 + 0 with no Act 115 in the 2022 list; 2 × $0 (amounts are 0 before 2021) 0 / 0 ✓

Main-failure claim. A static count against main's parameters agrees with the body's 12 YAML failures:

  • hi_military_pay_exclusion.yaml: 8 (2015–2020 and the 2021 over-cap case all give 7,345; 2025 gives 8,315.01).
  • hi_eitc.yaml: 2 (2016 and 2017).
  • hi_credit_start_dates.yaml: 2 (Cases 1 and 6).
  • hi_act_115_rebate.yaml: 0.

Mutation pinning (static).

  • match.yaml. The 2000-01-01: 0 value is pinned by the 2016 and 2017 cases (main gives 101.2 and 102). The 2018 date is pinned by the 2017 and 2018 cases. The 2028 value is pinned by the 2027 and 2028 cases.
  • non_refundable.yaml. The 2018 date is pinned by the 2018 nonrefundable case: a later date would leave hi_non_refundable_credits at 0.
  • cap.yaml. All 11 values have a case each.
  • Inert blocks. The new 2000-01-01 blocks in refundable.yaml and non_refundable.yaml can't change an output, because Act 115 amounts are $0 before 2021 and the match is 0 before 2018. No test could pin them. They are harmless and make the intent clear.

Code and process checks:

  • Readers.
    • match.yaml → hi_eitc_potential.
    • non_refundable.yaml → hi_eitc and hi_non_refundable_credits.
    • refundable.yaml → hi_refundable_credits, hi_adjusted_tax_liability and main's hi_income_tax_rebate_adjustment (Add state tax comparison outputs and caller documentation #10310), all of which check list membership.
    • cap.yaml → hi_military_pay_exclusion.
    • state_eitcs.yaml already starts hi_eitc in 2018.
  • Formulas. No formula changes, so vectorization, entity and period are unaffected. No new state-gated int or enum key, so the NH Add New Hampshire state supplementation for 2026 #10156 pattern doesn't apply.
  • References. They follow the CLAUDE.md rules: one entry per document, a single #page= in the href, no page in titles. The 235-55.675 typo in refundable.yaml is fixed.
  • Changelog. changelog.d/hi-credit-start-dates.fixed.md is top-level, with type fixed.
  • Partner tests. No files under tests/policy/baseline/partners/ changed.
  • Source-conflict ratchet. None of the added comments match CONFLICT_COMMENT_RE. Main changed only a KNOWN_UNMARKED entry for a South Carolina file since the merge base.

Axiom line assessment

axiom: rulespec-us#2039 queued (Hawaii EITC); rulespec-us#1685 queued, extended with a comment (Act 115 refund); rulespec-us#2040 queued (military pay exclusion). The line is valid.

Issue State Label Matches head b07103b3ca Dispatch-ready
#2039 (EITC, HRS 235-55.75) OPEN pe-parity Yes Yes: module path, corpus citations (Acts 107, 114 and 163), verbatim law, required outputs and invariants, companion rows for 2016–2028, blocker recorded (historical corpus and re-pin)
#1685 (Act 115), extended by a 2026-11-05 comment OPEN pe-parity Yes (the comment names this head) Yes: module path us-hi/statutes/session-laws/2022/act115.yaml, verbatim §3(a) and the announcement table, required outputs that separate the lawful refund from PE's reconciliation, companion rows, blocker recorded (enacted-source pin)
#2040 (HRS 235-7(a)(7)) OPEN pe-parity Yes Yes: module paths, Act 197 and N-11 citations, verbatim excerpts for each year, per-person cap outputs, 12 companion rows, blocker recorded

The issues also record PE-side divergences:

CI status

All 36 checks pass at b07103b3ca. I re-checked with gh pr checks 10205 at the end of the review, and nothing is pending or failing. The new Python file ran in Rest shard 1 (group remaining-1, peak RSS 8.45 GiB). The new YAML runs in the Baseline state shards.

Branch status

Verdict: REQUEST_CHANGES

@DTrim99 DTrim99 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Requesting changes per the review above: 0 critical, 1 should (the new simulation-built Python property test re-checks values YAML already covers, with no stated distinct failure or CI cost report per CLAUDE.md 'Test design and CI cost'), 5 suggestions. The law and values all check out.

@MaxGhenis

Copy link
Copy Markdown
Contributor Author

Picking this up for the US hub. I'll post a hand-off comment here when it's ready.


Generated by Claude Code

…property test

The review found that the simulation-built property test re-checks values
that YAML cases already cover, and that the PR names no failure only it
detects. CLAUDE.md asks for YAML for policy calculations, so this commit
removes tests/unit/test_hi_credit_start_dates_properties.py.

The one value it checked that no YAML case did, the 2015 EITC match,
becomes "No Hawaii EITC in 2015, the first modeled year" in hi_eitc.yaml.
A mutant that pays the 20% match in 2015 alone passed every YAML case at
the old head; the new case kills it.

The six household cases in the topic-named hi_credit_start_dates.yaml
move with their inputs and outputs unchanged. The 2016, 2017, 2018 and
2020 cases go to hi_eitc.yaml, and the 2021 and 2022 cases go to
hi_act_115_rebate.yaml, under names that describe each case.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01N2tyHT12N9L3WVu8rJokf1
@MaxGhenis

Copy link
Copy Markdown
Contributor Author

Ready for hub review

Head: f7814618775242af48b18b32805377d5a2cb6f88

I built on b07103b3ca, the head the item named. No other commit landed on the branch while I worked. The round adds one commit, f781461877.

Items

  1. Main. No merge. GitHub reports the PR mergeable: true, and the review names no failure on the merged tree or any main test to run. A trial merge with main at ba9bfdea75, which includes Model Hawaii's claim of right deduction and credit (section 1341 as operative in Hawaii from 2022) #10200 and Apply Hawaii refundable credits before nonrefundable credits #10202, auto-merges refundable.yaml. On that tree hi_eitc.yaml (17), hi_act_115_rebate.yaml (22) and hi_non_refundable_credits.yaml (6) pass.
  2. Findings.
    • Should-address 1, the property test. I took the review's first fix and removed policyengine_us/tests/unit/test_hi_credit_start_dates_properties.py.
      • I reproduced the claim first. With only main's match.yaml restored, the file fails the 5 of 16 tests the body named, all on the 2015–2017 match: test_grid_invariants[2015], [2016], [2017], test_hawaii_eitc_starts_in_2018 and test_generated_invariants.
      • The review's CI figures hold. Run 41946261850's timing artifact gives the file 19.7 s of test time (the review says about 21 s) in group remaining-1, 65 files. That process ran 21:08 with a peak RSS of 8,861,144 KB. The Makefile targets about 10 GB per process.
      • Local cost of the removed file (4 vCPU VM, not CI): passing at b07103b3ca, 58.5 s in pytest, 2:40.8 wall and 4,497,364 KB peak RSS. Failing on main's match: 309 s in pytest, 6:59 wall and 5,551,084 KB.
      • The 2015 match was the one value it checked that no YAML case did. hi_eitc.yaml:49 now pins it ("No Hawaii EITC in 2015, the first modeled year"), and that case fails on main's model (100.6 vs 0).
      • The review names 2019 and 2023–2026 as years with no YAML case on the refundable list. 2019 sits inside the 2015–2020 block, pinned on each side by the 2018 and 2020 cases. Existing main cases already pin the 2023+ list (mutant M-B).
    • Suggestion 4, the file name. Done. The six cases moved with period, inputs, outputs and margins unchanged; I parsed both versions to check. Cases 6, 1, 2 and 3 are now hi_eitc.yaml:144, :165, :192 and :214. Cases 4 and 5 are now hi_act_115_rebate.yaml:225 and :250. hi_credit_start_dates.yaml is gone.
    • Suggestion 1, the impact line. The body now reads impact: pending a comparison at the final head., as the brief asks. The hub fills it.
    • Suggestion 5, the axiom note. Done. The note now says the PR changes "2015–2025 values, and the uprated military pay cap from 2026". The summary table's military row adds 2026: $8,503.45 on main and $8,831.72 at the head, read from the parameter at each.
    • Suggestion 2, the standalone refund after 2021. Skipped; see "Judgment calls".
    • Suggestion 3, the pre-existing gaps. I opened no issue. Drafts 1 and 2 under "Follow-ups" are for the hub to file. I read Act 115 §3(a), Announcement 2022-03 (p. 2) and HRS § 235-7(a)(7) this session, and both gaps hold.
  3. Source conflicts. None, so no candidates.yaml entry. No finding turns on two sources that disagree. Act 115 §3(a) and Announcement 2022-03 agree on separate filers, and no source supports the model's wider military exclusion. CONTRIBUTING.md calls such a departure a bug, so both go to follow-ups.
  4. Axiom line. The review finds it valid, so I kept it and drafted nothing.
  5. Mutants. See "Mutants".
  6. Tests. See "Tests at the final head".
  7. Body. Updated and read back. The Tests section gives the moved cases, the removal, both cost measurements and the run at this head. "What pins each rule" replaces the grid's Invariants section and names the YAML cases for each rule. A "Review round (2026-11-09)" section records this round. The coordination line records that Model Hawaii's claim of right deduction and credit (section 1341 as operative in Hawaii from 2022) #10200 has merged.

Rulings for the hub

None. No change reverses a legal reading in the body, in candidates.yaml or in an earlier review. One change reverses a test-design choice that the round 2 approval accepted: the property test is gone.

Tests at the final head

One process per file, at f781461877:

File Result
credits/hi_eitc.yaml 17 passed
credits/hi_act_115_rebate.yaml 22 passed
code_health/test_source_conflicts.py 103 passed
code_health/test_rest_python_groups.py, test_batched_yaml_collection.py, test_make_test_matches_ci.py, run because the round deletes a test file 62, 21 and 5 passed
ruff format . and ruff check . 7,897 files unchanged; all checks passed

I also ran this head's test files against main's model at ba9bfdea75. hi_eitc.yaml fails 5 (the 2015, 2016 and 2017 cases, and the 2016 and 2017 single filers), and hi_military_pay_exclusion.yaml fails 8. hi_act_115_rebate.yaml passes all 22. The total is 13, up from the body's old 12 by the new 2015 case.

Hand computations

  • The new 2015 case. The match is 0, so hi_eitc_potential = 0 × 503 = 0, and hi_eitc and hi_non_refundable_credits are 0. Main backdates its 20% match to 2015, which gives 0.2 × 503 = 100.6, the value the failing run printed.
  • The moved cases. They are unchanged, so the review's hand checks still apply. Spot check for 2017: the federal EITC is min(7.65% × 8,000 = 612, 510) = 510. Tax is 1.4% × 2,400 + 3.2% × 2,256 = 105.792, less the $100 food/excise credit = 5.792.
  • The military cap. 2025: 8,636 − 8,315.01 = 320.99. 2026: $8,831.72 at the head and $8,503.45 on main.

Mutants

Each ran in its own process. I restored the file after each one, and git diff was empty.

Mutant Head Result Killed by
M1: match.yaml as on main (20% from 2017, backdated to 2015) f781461877 killed, 5 of 17 hi_eitc.yaml: the 2015, 2016 and 2017 cases and the 2016 and 2017 single filers
M-A: the 20% match in 2015 only (2000-01-01: 0.2, 2016-01-01: 0) f781461877 killed, 1 of 17 "No Hawaii EITC in 2015, the first modeled year" (100.6 vs 0)
M-A, the same mutant b07103b3ca survives every YAML case hi_eitc.yaml 12 of 12 and hi_credit_start_dates.yaml 6 of 6 pass. Only the removed grid covered 2015.
M2: the refund back in the 2022 refundable list f781461877 killed, 2 of 22 "No refund in 2022 refundable credits" (300 vs 0) and the 2022 single filer (400 vs 100)
M-B: the refund in the 2023+ refundable list f781461877 killed hi_non_refundable_credits.yaml "The 2025 earned income tax credit is refundable" (1,900 vs 1,600). integration.yaml, 4 of 15: "3-HI.yaml" and both "0-HI.yaml" cases (2024), and "2025 refundable credits paid in full beyond the tax".

CI

Pull request run 42639431774 at f781461877 was in progress at hand-off. 14 of its 26 jobs had succeeded, including Household API Partners, PR validation and Quick Feedback, and 12 were running. None had been skipped or cancelled. The hub reads the result.

Judgment calls

  • Drop the property test rather than justify it. CLAUDE.md asks for YAML for policy calculations, and Python only for behavior YAML can't exercise. Every check in the file is a household calculation YAML can express. The PR changes no formula, so the grid's breadth across households tests code the PR doesn't touch. I moved the one uncovered value to YAML, and mutants confirm YAML pins the rest.
  • Skip suggestion 2. docs/validation/state-rebates.md (lines 45 and 59–66) documents the persisting Act 115 schedules. It shares that convention with the Illinois, New Mexico, Arizona and Massachusetts 62F rebates. Main's Guard historical state rebate eligibility and document attribution #10309 kept it on purpose, and no tax or net-income output is wrong. A change to Hawaii alone would break the convention and the doc, so it belongs in a cross-state PR (follow-up 3).
  • Where the six cases went. The 2016–2020 cases center on the EITC's start, so they went to hi_eitc.yaml. The 2021 and 2022 cases center on the refund's year, so they went to hi_act_115_rebate.yaml. Those two overlap integration.yaml's 2021 and 2022 cases for the same filer. I kept them, since the suggestion asked for a move, not a consolidation.
  • New case names. "Case N" names read oddly in a variable-named file, so each case now says what it checks. Case 1 is the 2017 single filer, 2 is 2018, 3 is 2020, 4 is 2021, 5 is 2022 and 6 is 2016.
  • No merge of main. Neither of item 1's conditions held.

Follow-ups (drafts for the hub to file)

  1. Hawaii Act 115: test a separate filer's combined AGI against the joint threshold. Act 115 §3(a) limits separate filers to the refund "they would have been eligible for had a joint return been filed". hi_act_115_rebate instead applies the single schedule ($100,000) to each separate return's own AGI.
  2. Hawaii military pay exclusion: limit it to reserve and National Guard pay. HRS § 235-7(a)(7) excludes income of "each member of the reserve components … and the Hawaii National Guard". hi_military_pay_exclusion caps military_service_income, which the model documents as including active-duty pay.
  3. Zero standalone one-time rebate schedules after their year (optional, cross-state). The Hawaii Act 115, Illinois, New Mexico, Arizona and Massachusetts 62F variables keep positive standalone amounts after 2021, as docs/validation/state-rebates.md documents. A convention PR could date each to zero and update the doc.
  4. Federal EITC amounts for 2015 and 2016. gov/irs/credits/eitc/max.yaml starts at 2017-01-01, so 2015 and 2016 reuse the 2017 amounts; the 2016 single filer's eitc is $510. Check those years against the IRS revenue procedures.

DISMISSAL MAP

  • Critical: the review lists none.
  • Should-address 1 (the property test has no justification or cost report): FIXED. The file is removed. Its 2015 check moved to hi_eitc.yaml:49, and the body's Tests section gives the costs. Mutants M-A and M-B show YAML pins every rule.
  • Suggestion 1 (the impact placeholder): DONE as the brief directs. The body reads impact: pending a comparison at the final head., and the hub fills it.
  • Suggestion 2 (the standalone refund after 2021): SKIPPED. A cross-state convention documented at docs/validation/state-rebates.md:45 and :59-66; no output is wrong. Follow-up 3.
  • Suggestion 3 (separate filers; the military exclusion's scope): FOLLOW-UP. Both gaps predate the PR; drafts 1 and 2 are for the hub to file.
  • Suggestion 4 (the topic-named test file): DONE. The cases are at hi_eitc.yaml:138-234 and hi_act_115_rebate.yaml:222-270, and hi_credit_start_dates.yaml is removed.
  • Suggestion 5 (the axiom note misses 2026 on): DONE in the body's Axiom note and summary table.

Generated by Claude Code

@DTrim99

DTrim99 commented Nov 9, 2026

Copy link
Copy Markdown
Collaborator

PR Review (round 2): Date Hawaii's EITC from 2018, confine the Act 115 refund to 2021, and use each year's military pay cap

Summary

Our round 1 review (2026-11-06, head b07103b3ca) requested changes for one should-address item and made five suggestions. Since then the author has pushed one commit, f781461877, and merged nothing from main. The commit changes tests only:

  • Python test removed. It deletes tests/unit/test_hi_credit_start_dates_properties.py, the simulation-built property test behind our should-address finding.
  • New 2015 case. It adds "No Hawaii EITC in 2015, the first modeled year" to hi_eitc.yaml. The 2015 match was the only value the removed file checked that no YAML case did.
  • Cases moved. It moves the six cases of the topic-named hi_credit_start_dates.yaml, unchanged, into hi_eitc.yaml (2016, 2017, 2018 and 2020) and hi_act_115_rebate.yaml (2021 and 2022), and deletes that file.

No parameter, formula or reference has changed, so the round 1 legal check still applies. The should-address item is fixed: the PR no longer adds a Python test, and the new 2015 case catches a mutant that only the removed file used to catch.

CI is green (36/36) at the head. The branch merges cleanly with current main, including #10200's claim-of-right additions to refundable.yaml. Three suggestions remain, and none of them blocks the merge.

Prior findings

Finding Status Evidence
Should 1: the simulation-built Python property test had no stated distinct failure and no CI cost report (CLAUDE.md, "Test design and CI cost") Fixed f781461877 deletes the file, and the diff at the head contains no Python file. The one value only it checked, the 2015 match, is now a YAML case. Mutation check: at b07103b3ca the pre-2018 YAML cases started in 2016. A mutant paying 20% in 2015 only (2000-01-01: 0.2, 2016-01-01: 0) therefore passed every YAML case. At the head, the 2015 case expects hi_eitc_potential: 0, but the mutant gives 0.2 × 503 = 100.6, so the case fails. Main's own match (20% from 2017, backdated to 2015) also gives 100.6. Cost: the removal takes about 20 s of test time and a 108-household simulation build out of Rest shard 1, group remaining-1, which peaked at 8.45 GiB in run 41946261850. The body records the CI and local measurements and labels them separately.
Suggestion 1: the impact: placeholder in the body Open The line now reads impact: pending a comparison at the final head. It is still a placeholder; the author leaves it for a later comparison. See new Suggestion 2.
Suggestion 2: the standalone hi_act_115_rebate stays positive after 2021 Declined, reason accepted docs/validation/state-rebates.md on main documents this as a cross-state convention. It lists the persisting standalone schedules (Hawaii Act 115, Illinois, New Mexico) and standalone formulas (Arizona, Massachusetts 62F). The dated credit lists keep these amounts out of every aggregate. Main's #10309 chose the convention on purpose, and no tax or net-income output is wrong. A Hawaii-only change would break the documented convention, so the author's cross-state follow-up is the right place for it. The statute and DOTAX agree that the refund is for 2021 only, so this is a convention for standalone values, not a source conflict that needs recording.
Suggestion 3: file PE-US issues for the pre-existing gaps (Act 115 separate filers; military exclusion limited to reserve and Guard pay) Deferred The author re-read Act 115 §3(a), Announcement 2022-03 (p. 2) and HRS § 235-7(a)(7), and confirmed both gaps. Issue drafts are in the 2026-11-09 hand-off comment, but a search finds no PE-US issue yet. This stays optional; see new Suggestion 3.
Suggestion 4: the topic-named test file Fixed I parsed both versions. Each of the six old cases matches a new case on period, inputs, outputs and margin; only the names changed, and the new names describe each case. Every earlier case is kept: hi_eitc.yaml grows from 12 to 17 cases (the four moved cases plus the new 2015 case), and hi_act_115_rebate.yaml from 20 to 22. hi_credit_start_dates.yaml is gone, and nothing at the head refers to it.
Suggestion 5: the axiom note omitted the cap change from 2026 Fixed The body note now reads "This PR changes 2015–2025 values, and the uprated military pay cap from 2026." The summary table adds 2026: $8,503.45 on main and $8,831.72 at the head. The figures agree: the uprating factor is 8,503.45 / 8,315.01 = 1.02266, and 8,636 × 1.02266 = 8,831.7.

New findings

Critical

None.

Should address

None.

Suggestions

  1. The queued axiom issues name the deleted file and the old head.

    • Pin pydata-sphinx-theme==0.13.1 #2039 says "Match hi_eitc.yaml at this head", meaning b07103b3ca. Its unit table starts at 2016, and it says "Project the hi_credit_start_dates.yaml cases onto this module".
    • Top-level CO TANF variable #1685's 2026-11-05 comment also projects "the hi_credit_start_dates.yaml cases".
    • Why it's only a suggestion. The commit changes no behavior, so every rule and companion value in the issues still holds, and they remain dispatch-ready. Without material fixes, a stale issue isn't a should-address item.
    • Fix. Add a one-line comment to each issue. It should name head f781461877 and say that the start-date cases now sit in hi_eitc.yaml (2016–2020) and hi_act_115_rebate.yaml (2021–2022). For Pin pydata-sphinx-theme==0.13.1 #2039, also add the 2015 row: federal EITC 503, potential 0, allowed 0.
  2. Body housekeeping.

    • Impact line. It is still a placeholder (prior Suggestion 1). Fill it with the measured impact before merge, or drop it.
    • CI sentence. The Tests section still says run 42639431774 "was still running when this body was written". That run has finished, and all 36 checks succeeded.
  3. Follow-up issues (prior Suggestion 3, optional). File the two drafts from the hand-off comment as PE-US issues, so the gaps aren't tracked only in rulespec-us:

    • Act 115 separate filers should be tested on combined AGI against the joint threshold.
    • hi_military_pay_exclusion should be limited to reserve and National Guard pay.

    Neither gap is introduced by this PR. Its other two drafts (zeroing standalone rebate schedules across states, and the 2015–2016 federal EITC amounts) are also worth filing.

Verified

Hand-checks: every new or changed expectation.

Case (file at the head) Arithmetic Expected
New: "No Hawaii EITC in 2015, the first modeled year" (hi_eitc.yaml) match.yaml 2000-01-01: 0 gives 0 × 503 = 0. non_refundable.yaml is [] in 2015, so hi_eitc returns the potential and hi_non_refundable_credits sums an empty list. The $503 input is the 2015 maximum federal credit for a filer with no qualifying child. 0 / 0 / 0 ✓
2016 single filer, $8,000 of wages (moved to hi_eitc.yaml) The match is 0, and the nonrefundable list is empty. The Act 115 amounts are $0 before 2021. Refundable: food/excise $100 (single, AGI $5,000–$9,999) + $0 dependent care + $0 renters. 0 / 0 / 0 / 100 ✓
2017 single filer (moved to hi_eitc.yaml) Federal EITC: min(7.65% × 8,000 = 612, 510) = 510, with AGI below the 8,340 phase-out start. Taxable income: 8,000 − 2,200 − 1,144 = 4,656. Tax: 1.4% × 2,400 + 3.2% × 2,256 = 33.60 + 72.192 = 105.792. 105.792 − 0 − 100 = 5.792. 510 / 0 / 0 / 0 / 100 / 100 / 5.792 ✓
2018 single filer (moved to hi_eitc.yaml) min(612, 519) = 519, below 8,490. 0.2 × 519 = 103.8. Refundable $100. 519 / 103.8 / 0 / 100 ✓
2020 single filer (moved to hi_eitc.yaml) min(612, 538) = 538, below 8,790. 0.2 × 538 = 107.6. Refundable $100. 538 / 107.6 / 0 / 100 ✓
2021 single filer (moved to hi_act_115_rebate.yaml) 15.3% × 8,000 = 1,224, under the 2021 phase-in and below the $1,502 maximum. 0.2 × 1,224 = 244.8. Act 115: 1 exemption × $300, with AGI under $100,000. Refundable: 100 + 300. 1,224 / 244.8 / 300 / 400 ✓
2022 single filer (moved to hi_act_115_rebate.yaml) min(612, 560) = 560, below 9,160. 0.2 × 560 = 112. The 2022 list leaves out Act 115, so refundable credits are 100. On the merged tree that list also carries hi_claim_of_right_credit, which is 0 here. 560 / 112 / 100 ✓

Main-failure count. The body says 13 of the PR's cases fail on main:

  • hi_eitc.yaml, 5 cases: the 2015, 2016 and 2017 unit cases, and the 2016 and 2017 single filers.
  • hi_military_pay_exclusion.yaml, 8 cases.

This matches round 1's static count of 12 plus the new 2015 case.

Other checks:

  • Scope of the commit. git diff b07103b3ca f781461877 touches four test files only. The round 1 checks of the law therefore still apply. Those covered Acts 107, 114, 115 and 163 of the Session Laws of Hawaii, HRS §§ 235-55.75 and 235-7(a)(7), DOTAX Announcements 2022-03 and 2023-04, and the N-11 instructions for 2015–2025.
  • No dangling references. Nothing at the head refers to either deleted file, and no Makefile or workflow selector named the Python file.
  • Body's "What pins each rule" table. Every case it cites exists at the head, for example "The 2025 earned income tax credit is refundable" in hi_non_refundable_credits.yaml and "Empty 2023 list" in integration.yaml.
  • Changelog. changelog.d/hi-credit-start-dates.fixed.md is unchanged and still accurate.
  • Partner tests. No file under tests/policy/baseline/partners/ changed.
  • Overlap, no finding. The 2021 and 2022 single-filer cases now in hi_act_115_rebate.yaml use the same household as integration.yaml's 2021 and 2022 cases. integration.yaml asserts every one of their outputs except eitc. The author kept them because Suggestion 4 asked for a move, not a consolidation. Two YAML cases cost almost nothing to run.

Axiom

The line reads axiom: TheAxiomFoundation/rulespec-us#2039 queued (Hawaii EITC); TheAxiomFoundation/rulespec-us#1685 queued, extended with a comment (Act 115 refund); TheAxiomFoundation/rulespec-us#2040 queued (military pay exclusion). It is valid.

Issue State Label Last updated Matches head f781461877
#2039 (HRS 235-55.75) OPEN pe-parity 2026-11-05 Yes in substance: the dated rules and every companion value are unchanged. It still names b07103b3ca and the deleted file, and lacks the 2015 row (Suggestion 1).
#1685 (Act 115), with its 2026-11-05 comment OPEN pe-parity 2026-11-05 Yes in substance. The comment names b07103b3ca and the deleted file (Suggestion 1).
#2040 (HRS 235-7(a)(7)) OPEN pe-parity 2026-11-05 Yes: neither the cap parameter nor its tests changed.

All three remain dispatch-ready, with module paths, corpus citations, verbatim law, required outputs, companion rows and a recorded blocker. The body's separate axiom note is also accurate: Hawaii's modules cover tax year 2026 only, and the PR changes 2015–2025 values and the uprated cap from 2026.

CI

All 36 checks pass at f781461877 in pull request run 42639431774. I re-checked with gh pr checks 10205 at the end of this review, and nothing is pending or failing.

That run tested the PR merged with main as of 2026-11-09 14:55 UTC, which already included #10200. Main's six later commits touch no Hawaii file: two ACA changes, Montana's #10331 and version bumps.

Branch

Verdict: APPROVE

@DTrim99 DTrim99 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Round 2: the Python property test is gone and its one uncovered check is now a YAML case that kills the surviving mutant; the start-date cases moved verbatim to variable-named files; CI is green. Three optional suggestions remain.

@MaxGhenis
MaxGhenis merged commit 5cd2c54 into main Nov 10, 2026
36 checks passed
@MaxGhenis

Copy link
Copy Markdown
Contributor Author

US + core hub merge audit, us#10205 at f7814618775242af48b18b32805377d5a2cb6f88 (squash): Date Hawaii's EITC from 2018, confine the Act 115 refund to 2021, and use each year's military pay cap.

  • Reviews:
    • An independent review requested changes at fac53d9ea8, and a second approved 90e7100358.
    • DTrim99 requested changes at b07103b3ca: a Python test built on full simulations, with no stated failure that it alone would catch. f781461877 moves that test's six cases into YAML, adds a 2015 case and deletes the Python test, and DTrim99 approved f781461877.
    • An independent review of the changes since 90e7100358 agreed at f781461877. It found no formula or parameter value changed, checked each moved case against the original, and read Act 163 to confirm the Section 5 citation.
  • Gates checked live at merge:
    • gh pr checks exits 0;
    • the latest Pull request run at the head, 42639431774, passed all 36 jobs and tested this head merged into main at ba9bfdea75;
    • MERGEABLE;
    • not a draft;
    • no reviewer's latest review requests changes;
    • the semantic-overlap guard: main has changed no area this PR touches since ba9bfdea75;
    • the merge pins the head.
  • Impact (default dataset, 2026, f781461877 against main at 25c4253483): we estimate no change. Each measured output has the same value for every record. The dated changes fall in 2015 to 2021, before the dataset's first year.
  • Axiom: TheAxiomFoundation/rulespec-us#2039 and #1685 queued, each now with a comment for this head; #2040 queued.

🤖 Generated with Claude Code

@MaxGhenis
MaxGhenis deleted the hi-credit-start-dates branch November 10, 2026 06:10
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.

3 participants