Skip to content

[codex] Add Illinois SB3567 child tax credit contrib reform#8205

Open
DTrim99 wants to merge 3 commits intoPolicyEngine:mainfrom
DTrim99:codex/il-sb3567-ctc
Open

[codex] Add Illinois SB3567 child tax credit contrib reform#8205
DTrim99 wants to merge 3 commits intoPolicyEngine:mainfrom
DTrim99:codex/il-sb3567-ctc

Conversation

@DTrim99
Copy link
Copy Markdown
Collaborator

@DTrim99 DTrim99 commented Apr 29, 2026

Fixes #8191.

Summary

  • add an Illinois SB3567 contributed reform gated by gov.contrib.states.il.sb3567.in_effect
  • override il_ctc so low-AGI filers receive 40% of the maximum Illinois EITC amount for their Section 152 dependent count, while higher-AGI filers remain on 40% of actual Illinois EITC
  • make il_ctc nonrefundable while the reform is active by moving it from the Illinois refundable credit list to the nonrefundable credit list
  • add dedicated Illinois contrib tests and a changelog entry

Modeling notes

  • interpret the "income threshold to qualify for the maximum federal earned income tax credit" as the end of the federal EITC phase-in range
  • map "qualifying dependents" to tax_unit_child_dependents, capped at 3 to match the federal EITC amount schedule

Testing

  • uv run --python 3.11 python -m policyengine_core.scripts.policyengine_command test policyengine_us/tests/policy/contrib/states/il/sb3567/il_sb3567.yaml -c policyengine_us
  • uv run --python 3.11 python -m policyengine_core.scripts.policyengine_command test policyengine_us/tests/policy/baseline/gov/states/il/tax/income/credits/il_ctc.yaml -c policyengine_us
  • make format

DTrim99 and others added 3 commits April 30, 2026 09:32
- Add 35 ILCS 5/244 statute citation to il_ctc reform reference
- Clarify dependent-count comment: code uses tax_unit_child_dependents,
  not literal §152 count; flag for maintainer review
- Inline single-use intermediates in il_ctc formula
- Refine threshold comment to match bill phrasing
- Name the bill and note opt-in mechanism in changelog
- Add two-child phase-in test case
- Add two-child phase-in boundary test (AGI = 17,880 = 7,152 / 0.40)

Open question for maintainers: dependent-count interpretation. Issue
PolicyEngine#8191 suggested either §152 dependent count or EITC qualifying-child
count; the implementation currently uses tax_unit_child_dependents,
which matches neither exactly.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
The bill amends 35 ILCS 5/244(a) but does not strike subsection (b),
which makes the credit refundable. Prior assumption that the reform
removes refundability does not match the underlying IL EITC behavior.

- Drop the modify_parameters block that moved il_ctc to non_refundable
- Update the changelog to remove the nonrefundability claim
- Replace the nonrefundability test with a refundable-credit assertion
  (il_ctc flows to il_refundable_credits; il_income_tax goes negative
  when there is no liability)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@DTrim99 DTrim99 force-pushed the codex/il-sb3567-ctc branch from 0df077b to 2e082b2 Compare April 30, 2026 13:44
@DTrim99 DTrim99 marked this pull request as ready for review April 30, 2026 14:20
@DTrim99 DTrim99 requested a review from PavelMakarchuk April 30, 2026 14:20
Copy link
Copy Markdown
Collaborator

@PavelMakarchuk PavelMakarchuk left a comment

Choose a reason for hiding this comment

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

Program Review — PR #8205: Illinois SB3567 contrib reform

Source Documents

  • Bill PDF: Illinois SB3567 (4 pages, amends 35 ILCS 5/244)
  • Year: TY 2025+ (bill also covers TY 2024 with a different, flat 20% rate)
  • CI Status: ALL GREEN

Critical (Must Fix)

  1. Refundability claim is false. The PR description and in_effect.yaml description both state the reform "makes the credit nonrefundable" / "moves it from the refundable to the nonrefundable credit list." The diff does NOT modify gov.states.il.tax.income.credits.refundableil_ctc remains refundable, which correctly matches Sec. 244(b) ("the excess shall be refunded to the taxpayer"). The test "SB3567 keeps the Illinois CTC refundable when EITC is zero" confirms this. The wrong claims must be corrected in the PR body and the parameter description.

  2. TY 2024 not properly modeled. Sec. 244(a) prescribes a flat 20% of Section 212 for TY 2024 with NO three-tier (AGI-based max-credit boost) structure; the three tiers apply only "for tax years beginning on or after January 1, 2025." The reform applies the where(agi <= threshold, max_credit, actual_credit) tier logic whenever in_effect is true, including 2024. No TY 2024 test exists. Fix: gate tier logic to period.start.year >= 2025, or document that the reform models only 2025+ and set in_effect accordingly. Add a TY 2024 test demonstrating the chosen behavior.

  3. Hard-coded value 3 in reform code. il_sb3567_reform.py line 33 hard-codes min_(tax_unit("tax_unit_child_dependents", period), 3). The cap-at-3 corresponds to the federal EITC plateau schedule and should not be a magic number; reuse eitc_child_count (which already encodes the cap via the federal scale) or parameterize it under gov.contrib.states.il.sb3567.

  4. Wrong child-count primitive. The reform uses tax_unit_child_dependents to index into the federal EITC max schedule. Federal EITC counts qualifying children via eitc_child_count, which enforces TIN/identification rules and matches IRC §152 qualifying-child semantics. tax_unit_child_dependents includes dependent children that may not qualify for EITC and excludes some §152 qualifying children — feeding it into federal_eitc.max.calc(...) can produce incorrect benefit amounts. Switch to eitc_child_count, and consider reusing eitc_maximum to avoid duplicating the federal schedule lookup.

Should Address

  1. Self-contained sb3567 rate parameters. Reform reads gov.states.il...ctc.rate (0.20/0.40) and eitc.match (0.20) from baseline IL params. SB3567-specific 0.40 / 0.20 / 0.20 should live under gov.contrib.states.il.sb3567 so the reform is not silently affected by baseline IL rate changes.

  2. Non-standard activation pattern. create_il_sb3567_reform uses a for _ in range(5) 5-year forward-offset loop to detect the toggle. Sibling contrib reforms (pa_ctc_match, ct_sb100) call parameters(period).gov.contrib...in_effect directly. The 5-year window is undocumented and brittle — collapse to the standard pattern.

  3. Reference quality.

    • Reform .py is missing IRC §152 citation, although Sec. 244(d) explicitly defines "qualifying child" by §152 (suggested: https://www.law.cornell.edu/uscode/text/26/152).
    • in_effect.yaml cites the fragile ILGA HTML "BillStatus/FullText" URL with a transient query string. Switch to the durable PDF URL https://www.ilga.gov/documents/legislation/104/SB/PDF/10400SB3567lv.pdf#page=2.
    • Add 35 ILCS 5/244 statute reference to in_effect.yaml (currently only in the .py file).
    • No #page= anchors anywhere — Sec. 244 begins on page 2 of the 4-page PDF.
  4. Test gaps.

    • No TY 2024 test (paired with item 2 above).
    • No reform-OFF test (in_effect: false) confirming baseline il_ctc is preserved.
    • No phase-in threshold +$1 boundary (verify <= vs < flip from max_credit to actual_credit).
    • No 4+ qualifying children test verifying the cap-at-3 behavior, and no equality assertion between 3-child and 4-child max_credit.
    • No zero-dependents test — potential divide-by-zero on federal_maximum / phase_in_rate when eitc.max.calc(0) and the 0-child phase-in rate are both 0.
    • No IL-EITC-ineligible filer test (e.g., investment income too high) — phase-in branch returns max_credit regardless of EITC eligibility, possibly a bug.
    • No plateau-end / phase-out-start boundary at the actual transition point.
    • Refundability test only confirms zero-liability case; need a positive-liability case showing il_ctc offsets liability and refunds the remainder.

Suggestions

  1. Tier (a)(3) not encoded as a distinct branch. Implementation collapses (a)(2) and (a)(3) into a single fall-through "AGI > threshold ⇒ 40% of actual Section 212." Mathematically equivalent at the plateau boundary but structurally absent from the bill's three-tier text. Add a comment noting the equivalence, or encode it as a third branch for fidelity.

  2. Means-tested exclusion clause. Sec. 244(b) excludes the refund from SNAP/Medicaid/TANF income/resource tests unless federal law requires. Not modeled — cross-cutting concern, small caseload impact. Document as a known limitation.

  3. 0000-01-01 start date in in_effect.yaml. Replace with a realistic effective date aligned to the bill (introduced 2/5/2026, "effective immediately upon becoming law" per Sec. 99) — e.g., 2024-01-01: false or 2026-01-01: false for clarity. Several existing contrib files use 0000-01-01, so this is non-blocking.

  4. Optional reusable variable. Consider extracting federal_eitc_phase_in_end rather than inlining federal_maximum / phase_in_rate; OK has ok_federal_eitc_maximum as precedent.

  5. Test YAML statute link. il_sb3567.yaml cites "35 ILCS 5/244(b)" in a comment without a URL — add the ILCS link inline so reviewers can verify.

Validation Summary

Check Result
Regulatory Accuracy 3 issues (TY 2024, tier (a)(3), means-tested exclusion)
Reference Quality 4 issues (missing §152, fragile HTML URL, missing statute, no #page)
Code Patterns 4 issues (hard-coded 3, wrong child-count primitive, baseline-coupled rates, range(5) loop)
Test Coverage 8 gaps (TY 2024, reform-OFF, boundaries, 4+ children, zero-dependents, IL-EITC-ineligible, plateau boundary, positive-liability refund)
PDF Bill Audit 3 issues (refundability claim false, TY 2024 mishandled, IRC §152 vs tax_unit_child_dependents)
CI Status All passing

Review Severity: REQUEST_CHANGES

Rationale: Three correctness/regulatory issues block merge:

  1. PR description and parameter description make a false claim about refundability — misleading reviewers and downstream consumers.
  2. TY 2024 behavior diverges from the bill (tier logic active when bill prescribes flat 20%); no 2024 test catches this.
  3. The wrong child-count primitive (tax_unit_child_dependents instead of eitc_child_count) feeds the federal EITC max schedule and can produce incorrect benefit amounts for filers whose dependent set differs from their EITC qualifying-child set.

The 2025+ math and most tests check out, but these three items are correctness-grade and must be fixed before merge.

Next Steps

To auto-fix issues: /fix-pr 8205

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.

Model Illinois SB3567 child tax credit as a contributed reform

2 participants