Skip to content

Apply the RI, SC, UT, VT, WV and WI rules for a filer who can be claimed as a dependent - #10044

Open
MaxGhenis wants to merge 55 commits into
mainfrom
claimable-filer-ri-sc-ut-vt-wv-wi
Open

MaxGhenis wants to merge 55 commits into
mainfrom
claimable-filer-ri-sc-ut-vt-wv-wi

Conversation

@MaxGhenis

@MaxGhenis MaxGhenis commented Oct 10, 2026 •

Copy link
Copy Markdown
Contributor

Summary

Apply RI/SC/UT/VT/WV/WI claimable-filer rules symmetrically between head and spouse. Preserve claimability versus actual-claim gates and the Dependent Taxpayer Test (DTT), including #10024/#10087's filing exception.

Preserve gates in RI/SC/UT/VT/WV contributed reforms and RI/WI/WV repeal overrides. Wisconsin's deduction paths share the federal dependent worksheet's earned income; Vermont uses 2021–2025 HUD efficiency rents for zero exemptions. WV baseline and reform allow $500 per claimable filer when no dependent adds an exemption (exemptions_count minus own exemptions is zero), so a child who adds no exemption leaves the per-filer $500 alone; the repeal override, which counts only own exemptions, allows it to every claimable filer. Unresolved attribution when dependents do add exemptions intentionally retains the prior behavior.

State Behavior and statutory basis
RI Property credit requires one filer to be aged/disabled and unclaimed: 44-33-3(1) permits household members to select an unclaimed claimant. The 2021 child rebate requires lawful dependents under 44-30-103(b)(1) and IRC 152(b)(1). Reform/repeal preserve own-filer gates.
SC Exemptions, young-child deductions and both reform dependent paths respect the DTT. 12-6-1140(13) and 12-6-1160 require IRC 151/152-eligible dependents.
UT Taxpayer-credit dependent/birth-year counts and the reform respect the DTT under 59-10-1018. At-home credit requires claimed dependents under 59-10-1005.
VT Exemptions/reform and CTC require allowable dependents under 5811(21)(C) and 5830f; CTC excludes nondependent children. Renter credit uses actual claims and exemption-sized bedrooms under 6066, including efficiency rent.
WV When no dependent adds an exemption (a claimable filer's children add none under IRC 152(b)(1)), 11-21-16(d) gives $500/$2,000 per claimable/nonclaimable filer. LIFTC uses lawful exemptions and bars zero-exemption units under 11-21-22a(b) and IT-140 instructions.
WI When either filer is claimable, both deduction paths use min(ordinary deduction, max($1,350, earned income + $450)) in 2025, with earned income from the federal dependent worksheet: wages after pretax deductions, taxable disability wages, and business and farm income, less the self-employment tax deduction: 71.05(22)(f) and Form 1 p.15. The age-65 $250 exemption requires an own exemption (p.16). Homestead counts lawful dependents (Schedule H p.17); care deductions/credits use qualifying expenses under IRC 21 and Wis. Stat. 71.05(6)(b)43/71.07(9g), including filing/incapacity exceptions.

#10104 separately fixes VT student-loan interest/CTC per-child phase-out, UT at-home parent multiplier and WI homestead claimant conditions. HI/VA repeal remains a separate follow-up: preserve baseline own/aged gates (claimable-single repeal wrongly restores $1,144/$930).

Readings

Item What changed or was kept, and why
WV $500 personal exemption Changed returns with no lawful dependent exemptions to follow 11-21-16(d). A claimable single gets $500; summing the individual statutory allowances gives $2,500/$1,000 for one/both claimable spouses, symmetrically. A child who adds no exemption leaves the per-filer $500 alone: one claimable spouse with one or two children gets $2,500, both claimable with two children $1,000. Replaces the IT-140 p.3 once-per-return fallback in baseline, reform and repeal. Downstream mixed-spouse credit fixtures now check $2,500 exemption, $13,500 taxable income, $325.60 tax and $260.48 credit at $16,000 AGI. Keep $2,000/$500 values from 1987 (1988 H.B.4472 pp.9–10); describe $500 per individual. Kept returns whose dependents add exemptions as built (for example, the filing-exception case at $2,000): ordinary dependent exemptions remain; attribution under a claimable filer's single-exemption limit is unresolved.
VT renter, one claimed spouse Kept: the unclaimed spouse can be the claimant under 6063. Witness: $1,771 versus $0 under a joint-claim bar.
VT renter income-limit sizing Kept: DOR resident-family guidance fills the income-limit sizing gap with resident-member counts; bedrooms count exemptions. The 2025 Chittenden $62,000/one-claimed-spouse witness gives $270 versus $0 with exemption-sized limits. rulespec #1678 requests the alternative, retained as a parity coordination point.
WI dependent deduction parameters Kept: reuse federal parameters because Wisconsin's 2021–2025 worksheets match. The 2026 Wisconsin match is an indexing inference; federal $1,350/$450 values are verified in Rev. Proc. 2025-32 p.18.
VT renter, zero exemptions Kept the statute over department practice: 6066(b)(2) requires exemption-sized bedrooms, including efficiency rent at zero. DOR 2021, 2024 and 2025 calculators instead use family size and omit efficiency rent. Burlington's 2025 witness receives $1,656 versus $1,771 under department practice (HUD 2025 p.51).
VT Franklin/Grand Isle averaging Kept: unrounded mean of 12 HUD rent areas every year. 6061(7)(C) calls for a state average without specifying weights or intermediate rounding. Historical conventions differ by at most $1: $883/$883 (2021), $918/$919 (2022), $1,171/$1,172 (2024), historical/PR; 2023/2025 agree. A 14-county mean instead gives $1,273 versus $1,209 in 2025. The 2025 department calculator one-bedroom amount of $1,269 matches the 12-area calculation; parameter comments retain the historical departures.
WI earned income Reuses the federal worksheet's earned income (standard_deduction_worksheet_earned_income) on both deduction paths: wages after pretax deductions, taxable disability wages, and business and farm income, less the self-employment tax deduction; non-W-2 grants remain excluded. Witnesses (2025, claimable single, age 22, $20,000 interest): $10,000 of disability wages gives $10,450; $10,000 of farm income gives $9,743.52 (SE tax deduction 10,000 × 0.9235 × 0.153 / 2 = 706.48; 10,000 − 706.48 + 450). The $10,000 wage/$5,000 traditional 401(k) witness gives a $5,450 deduction and $9,550 taxable income; a claimable but unclaimed control retains the $1,450 deduction. A dependent child's own $5,000 of wages stays out of a claimable filer's earned income, so that filer's deduction stays $1,350.

d1741/d1742/d1744 remain as built: NIIT/QBI/HSA/education; HI/NY/MA/KS; NM medical/WV senior-disability. d1744's WV 11-21-12(c)(9) income-base choice is distinct from this exemption fix.

Not modeled (listed, not implemented)

  • RI individual health-coverage mandate (filing condition: "You cannot be claimed as a dependent by another taxpayer").
  • SC special-needs adopted-child deduction and identity-protection deduction (higher cap for returns claiming dependents).
  • VT homestead property tax adjustment (same claimant exclusion as the renter credit).
  • WI private-school and college tuition deductions (dependent branches).
  • WV surviving spouse's additional exemption (11-21-16(c)); family size excludes it anyway.
  • WI homestead: the dependent's six-month residence test (71.52(5)); the model treats tax-unit dependents as household members.
  • VT CTC identification rules by year (the waiver starts in 2023; the model applies no identification test in any year).

Other findings (not fixed here)

  • vt_renter_credit never checks that the unit paid rent or prorates by months rented (6066(b)(1)(E)); any low-income Vermont unit gets the full-year credit.
  • ut_total_dependents counts every dependent of the return; 59-10-1018(1)(c) counts only those for whom an IRC 24 credit is allowed (for example, not a dependent without a taxpayer identification number).

Invariants and test scope

Five property tests check head/spouse swaps, claimability monotonicity and statutory identities in 2021/2023/2025/2026 populations including pension/IRA income. For WV returns with no lawful dependent exemptions (childless, or whose children add none), the exemption identity is $2,000 per nonclaimable filer plus $500 per claimable filer; attribution when dependents add exemptions retains the existing behavior. YAML pins WV witnesses and baseline/reform/repeal, ordinary-dependent and filing-exception controls. Nobody-claimable controls use YAML, without property-test base comparisons. Model-construction counts stay fixed.

Validation and merge

Head: a527247897fe305ce6747ba783991881e0e1b226. The PR is ready for review (not a draft).

Merge commit 382bdbc900 imports origin/main at 25c42534839b2bb60c02730a3ff4152cdd826ee9 with a merge commit; it had no conflicts, and no rebase or history rewrite was performed. It brings in main's uv.lock and pyproject.toml; no lock refresh was needed.

The 16 claimable-filer RI reform pairs now live in policy/contrib/states/ri/exemption_reform_claimable_filer_test.yaml, so exemption_reform_test.yaml keeps its 4 original cases and stays within the reform-combo budget.

Local runs, one file per process (Linux VM, not CI). The two WI files and test_reference_urls.py ran at this head; the other files ran at ce5880d884, and the commit since then changes only the WI test file and a WI reference URL:

Test file Result
policy/contrib/states/ri/exemption_reform_test.yaml 4 passed
policy/contrib/states/ri/exemption_reform_claimable_filer_test.yaml 16 passed
policy/baseline/gov/states/wi/tax/income/wi_standard_deduction.yaml 24 passed
wi_retirement_income_exclusion_tax.yaml 11 passed
policy/baseline/gov/states/wv/tax/income/exemptions/wv_personal_exemption.yaml 18 passed
policy/contrib/states/wv/dependent_exemption_reform_test.yaml 21 passed
policy/contrib/state_dependent_exemptions/repeal_state_dependent_exemptions.yaml 40 passed
policy/baseline/gov/states/wv/tax/income/credits/liftc/wv_low_income_family_tax_credit_eligible.yaml 7 passed
code_health/test_reform_combo_budget.py 1 passed
code_health/test_reference_urls.py 32 passed
core/test_claimable_filer_ri_sc_ut_vt_wv_wi_invariants.py 5 passed

ruff format --check and ruff check pass on the changed Python files. No directory suite or microsimulation was run locally.

Pull request run 41944409704 passed all 36 jobs at a527247897.

axiom: TheAxiomFoundation/rulespec-us#1807 queued (RI: 44-33-3, 44-30-103) | TheAxiomFoundation/rulespec-us#1808 queued (SC: 12-6-1140(13), 12-6-1160) | TheAxiomFoundation/rulespec-us#1809 queued (UT: 59-10-1018, 59-10-1005 lawful dependents) | TheAxiomFoundation/rulespec-us#1810 queued (VT: 5811(21)(C), 5830f, 6066 claimant/FMR) | TheAxiomFoundation/rulespec-us#1811 queued (WV: 11-21-16, 11-21-22a) | TheAxiomFoundation/rulespec-us#1812 queued (WI: 71.05(22)(f), age-65 $250, lawful care/homestead counts)


Generated by Claude Code

MaxGhenis and others added 27 commits October 8, 2026 11:03
The federal standard deduction and 17 state formulas read only whether the
tax-unit head is claimed elsewhere, so a joint return where one spouse can be
claimed was taxed differently depending on which spouse was labelled head.
Each formula now applies its jurisdiction's rule for that case (either spouse,
single filers only, per spouse, or only when every filer is claimed), using
two new label-independent helpers. Adds swap-pair YAML cases and a Hypothesis
property test.

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

The New Mexico, Maine and Hawaii renters gates counted filers who are not
claimed elsewhere, so a tax unit with neither a head nor a spouse (252 in
the default dataset) looked like one whose every filer was claimed. A new
helper, every_filer_is_dependent_elsewhere, requires a claimed filer and no
unclaimed one.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ss EITC

- Hawaii's dependent standard deduction uses earned income net of the
  deductible part of self-employment tax, as the N-11 worksheet does.
- New Mexico's medical care credit needs a filer who is both 65 or older
  and not a dependent when a filer is a dependent elsewhere (NMSA 7-2-18.13).
- The federal EITC without a qualifying child requires that no filer can be
  claimed as a dependent (IRC 32(c)(1)(A)(ii)(III), Publication 596), so
  Missouri's working family credit no longer reaches such a couple.
- Hawaii's food/excise credit keeps minor children receiving public support
  (HRS 235-55.85(c)) on a joint return where one spouse can be claimed.
- Comments label the readings the law does not settle, and the property
  test covers the EITC and the food/excise exemption amount.

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

- The federal and Oregon dependent worksheets use earned income net of the
  deductible part of self-employment tax, as Hawaii's now does.
- Hawaii's food/excise minor-child count excludes children who can be
  claimed by another taxpayer and the filers themselves (Form N-311 line 3).
- claimed_as_dependent_on_another_return documents what it stands for: a
  §151 deduction for the person is allowable to another taxpayer, so a
  person whose would-be claimer files only for a refund is not one
  (Publications 501 and 596); rules on actually being claimed read it too.
- Hawaii's renters comment labels the mixed joint reading as an inference;
  the Hawaii dependent threshold cites HRS 235-2.4(a)(3) on its page.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A filer who can be claimed on another return is treated as having no
dependents (IRC 152(b)(1); on a joint return either spouse counts) and has no
personal exemption (IRC 151(d)(2)); one who is claimed gets no education
credits (25A(g)(3)), student loan interest deduction (221(c)) or recovery
rebate (6428(d)(2), 6428A(d)(2), 6428B(c)(2)). The model read none of these.
Now the child tax credit and credit for other dependents, the under-13 child
and dependent care qualifying person, exemptions_count and its RI, DE, OH, OR,
WI, HI and NM readers, the recovery rebates, the education credits and the
student loan interest deduction apply them symmetrically for joint returns.
Georgia keeps its own counts; the HI, WI and Treasury exemption reforms
follow the corrected count.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Property tax relief (R.I. Gen. Laws 44-33-3): the claimant is a filer aged
  65 or older or disabled who is not claimed as a dependent; household members
  choose the claimant, so either spouse qualifies, but the age or disability
  and the dependency test belong to the same person.
- 2021-return child rebate (44-30-103(b)(1)): only children the taxpayer
  "validly claims as a dependent", and a return with a claimable filer has
  none (IRC 152(b)(1)).

The exemptions, EITC and care credit already follow the federal fixes.

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

The dependent exemption (S.C. Code 12-6-1140(13): dependents must meet IRC
151 and 152) and the under-six deduction (12-6-1160) are zero on a return
where the filer, or either joint spouse, can be claimed (IRC 152(b)(1)).
The EITC and care credit already follow the federal fixes.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The taxpayer credit's qualifying dependents (Utah Code 59-10-1018(1)(c):
those for whom the claimant is allowed an IRC 24 credit), its birth-year
additional dependent and the at-home parent credit's qualifying child
(59-10-1005) are zero on a return where the filer, or either joint spouse,
can be claimed (IRC 152(b)(1)). The child tax credit and EITC already follow
the federal fixes.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Personal exemptions (32 V.S.A. 5811(21)(C)): no dependents on a return where
  the filer, or either joint spouse, can be claimed (IRC 152(b)(1)); the own
  and spouse exemptions already excluded a claimable filer.
- Child tax credit (5830f): requires federal child tax credit entitlement for
  an IRC 152(c) qualifying child; the identification-number waiver does not
  reach 152(b)(1), so a return with a claimable filer gets none, and a young
  member who is not a dependent no longer counts.
- Renter credit (6066): the claimant may not be claimed as a dependent, but an
  unclaimed spouse can be the claimant; fair market rent is for a number of
  bedrooms equal to the personal exemptions (6066(b)(2)).
- Student loan interest (5811(21)(B)(vi), (29); IN-112 line 16): from 2022
  Vermont subtracts the qualified interest paid less the federal deduction,
  for AGI up to $200,000 joint or $120,000 otherwise. The model subtracted the
  raw interest from 2021, deducting it twice for filers who took the federal
  deduction; a claimed filer, who gets no federal deduction (IRC 221(c)), now
  subtracts the whole amount.

The EITC and care credit already follow the federal fixes.

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

- Personal exemptions (W. Va. Code 11-21-16): $2,000 per exemption a filer may
  claim (none for a claimable filer, no dependents on a return where either
  joint spouse can be claimed), and a single $500 when the return has none
  (IT-140: "If box e is zero, enter $500"). The model counted every member.
- Low-income family credit (11-21-22a): family size is the number of
  exemptions that may be legally claimed, and a return with zero exemptions
  cannot claim the credit.

The care credit already follows the federal fix.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Standard deduction (Wis. Stat. 71.05(22)(f)): when the filer, or either joint
  spouse, can be claimed, the lesser of the ordinary deduction and the greater
  of $1,350 or earned income plus $450 (2025; indexed as the federal amounts),
  on both the regular and the retirement-exclusion paths.
- $250 exemption (Form 1 line 10b): only for a filer aged 65 or older who is
  allowed the $700 exemption, so each spouse is tested separately.
- Homestead credit (71.53; Schedule H): the claimant is the spouse who is 18
  or older, has earned income or is 62 or older or disabled, and is not
  claimed as a dependent unless 62 or older; the $500 household-income
  deduction counts no dependents on a return with a claimable filer.

The $700 exemption and care credits already follow the federal fixes.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Swap invariance, monotonicity and identities (dependent-based amounts are
zero on a return with a claimable filer; a return whose every filer is
claimed gets no RI relief or VT renter credit and West Virginia's single
$500 exemption), plus the changelog fragment.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Utah Code 59-10-1005(2) allows $100 "for each qualifying child if ... the
claimant or another claimant filing a joint individual income tax return with
the claimant is an at-home parent". The model multiplied the credit by the
number of spouses earning $3,000 or less, doubling it for such couples; the
existing two-parent test asserted $400 for two children and now expects $200.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
32 V.S.A. 5830f(b) reduces "the amount of the credit per child" by $20 for
each $1,000 of AGI over $125,000; the model reduced the total once, so a
family with two young children at $150,000 got $1,500 instead of $1,000. The
existing phase-out and age cases used the filer as the child; they now have a
parent and a child, since 5830f counts IRC 152(c) qualifying children.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…nt exemption reform

When in effect, the contributed reform recounts is_tax_unit_dependent itself;
it now applies the same IRC 152(b)(1) gate as the baseline
ut_total_dependents, as the federal branch did for the HI, WI and Treasury
reforms.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Child and dependent care: childcare expenses do not count on a return with a
  claimable filer unless a child under 13 still qualifies (IRC 21(b)(2)(A)(ii)).
- Tuition and fees deduction: not allowed to a filer who can be claimed (IRC
  222(c)(3)), so the education credit bar no longer makes such a filer eligible.
- Recovery rebates: the Armed Forces exception waives the identification rule
  only, not the exclusion of a spouse who is another taxpayer's dependent.
- Georgia: the contributed refundable credit and SB 520 reforms count the same
  children as ga_ctc_potential through a new ga_ctc_eligible_child.
- Education credits and student loan interest read the claimed input directly,
  since IRC 25A(g)(3) and 221(c) turn on an actual claim.
- One reference per source document; quote IRC 24(h)(4)(A) exactly.
- Tests: mixed-recipient care, tuition deduction, military rebates, Georgia
  refund cap, and the swapped New Mexico rebate case; the property test now
  covers the state readers of the exemption count.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
# Conflicts:
#	policyengine_us/tests/policy/baseline/gov/states/oh/tax/income/exemptions/personal/oh_personal_exemptions_eligible.yaml
#10024 now separates three facts: is claimed, can be claimed, and the would-be
claimant's filing exception.

- IRC 152(b)(1) gates (child tax credit, credit for other dependents, under-13
  care child and its expenses, dependents in exemptions_count, ARPA dependents,
  Ohio dependents, the Hawaii and Wisconsin reforms) read
  head_or_spouse_is_dependent_elsewhere_without_filing_exception, so a filer
  within the Publication 501 exception keeps their dependents.
- Own exemptions, recovery rebates and the tuition deduction read claimability.
- Education credits and student loan interest keep reading the claimed input.
- Tests: the filing exception and a filer who can be claimed but is not.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
#10024's food/excise credit, Act 115 rebate and renters credit took claimable
filers off exemptions_count themselves. exemptions_count now leaves them out
(and, outside the filing exception, the return's dependents), so those credits
read it as it is; the filing-exception cases were one exemption short.

The renters credit also leaves out a dependent who can be claimed by another
taxpayer (Schedule X counts only people who cannot be), as the food/excise
credit already did.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Education credits: a dependent student is not eligible on a return whose
  filer can be claimed outside the filing exception (IRC 25A(f)(1)(A)(iii),
  152(b)(1)); the filer's own eligibility still turns on an actual claim.
- Recovery rebates: no credit when every filer is a dependent of another
  taxpayer (IRC 6428B(a)); the CARES and CAA child prerequisite is a spouse
  with a valid SSN, whether or not that spouse is an eligible individual.
- Child and dependent care: cdcc_qualifying_childcare_expenses holds the
  expense rule, and the single-parent work requirement reform and California's
  expenses read it.
- References: Georgia HB 136 page 3; one entry per recovery rebate statute;
  quote IRC 24(h)(4)(A) exactly in the test comment.
- Tests: dependent students, the two rebate cases, the reform and California
  expenses, and the Hawaii, Wisconsin and Treasury reforms with a claimable
  filer under both labellings.

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

Copy link
Copy Markdown
Contributor Author

Note from the US + core hub for this PR's owner (2026-10-10).

#10024 now has an approved head, c7f969f872, that splits one input into three facts:

  • claimed_as_dependent_on_another_return: actually or expectedly claimed on another return (main's meaning, restored);
  • claimable_as_dependent_on_another_return: can be claimed, whether or not it is; defaults to the input above when unspecified;
  • dependent_claimant_filing_exception: the would-be claimant isn't required to file and files no return or only for a refund.

A reviewer of the claimable-filer-federal branch found that this PR's wi_additional_exemption change reads the actual claim where the rule turns on claimability. When you rebase onto the settled stack, point it at claimable_as_dependent_on_another_return, or at the helper head_or_spouse_is_dependent_elsewhere (which now means claimability), and add a case for a filer who can be claimed but is not.

Two related points from the same branch:

MaxGhenis and others added 2 commits October 10, 2026 15:51
- Education credits: is_barred_from_education_credits_by_dependency holds the
  claimed-filer and dependent-student rules; both eligibility formulas and the
  reconciliation SSN reform's Lifetime Learning Credit read it, so the reform
  no longer turns a barred student's tuition into that credit.
- Child and dependent care: childcare counts when any child under 18 is still a
  qualifying individual, so an incapacitated child aged 13 to 17 keeps it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Setting meets_eitc_identification_requirements on one person made it an input
for every person, so the other spouse lost their SSN too.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@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'll post a hand-off comment here when it's ready.


Generated by Claude Code

Taxable disability benefits before minimum retirement age are wages for
federal purposes and the federal dependent worksheet counts them; the shared
Wisconsin cap left them out, so a claimable 2025 filer with $10,000 of them
and $20,000 of interest got $1,350 instead of $10,450. Both Wisconsin
deduction paths use this helper.

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

MaxGhenis commented Nov 4, 2026 •

Copy link
Copy Markdown
Contributor Author

Ready for hub review

Head: 3433ec7c209fdd0631e897194e1cca7cf03ad7fd (draft; fast-forward, since main merges cleanly).

P2: WI's dependent standard deduction cap omits disability wages: FIXED

policyengine_us/variables/gov/states/wi/tax/income/wi_standard_deduction.py:45-58: the shared helper wi_dependent_standard_deduction_limit now adds earned_disability_benefits to the earned income it caps on, per the hub ruling us-wi:claimable-filer-cap-disability-wages (IRS Publication 907 treats these as wages; added as a reference). Both Wisconsin deduction paths call this helper.

Other sources: the federal dependent worksheet (basic_standard_deduction) counts earned_income (employment, self-employment and SSTB self-employment income) plus earned_disability_benefits. The Wisconsin helper already had the first three (with wages as irs_employment_income, after pretax deductions), so disability wages were the only missing source.

New cases in wi_standard_deduction.yaml (2025, claimable single filer):

  • $10,000 taxable disability wages before minimum retirement age and $20,000 interest: AGI and WI AGI $30,000; ordinary deduction 13,560 − 0.12 × (30,000 − 19,550) = 12,306; dependent limit max(1,350, 10,000 + 450) = 10,450 → $10,450.
  • The same filer with only the $20,000 interest: ordinary 13,560 − 0.12 × (20,000 − 19,550) = 13,506; limit max(1,350, 0 + 450) = 1,350 → $1,350 (unchanged).

Mutant: with the code change reverted, the disability case fails at $1,350 against $10,450, the review's $9,100 gap; the file passes 22 of 22 with it.

P3: the WV parity hand-off

Drafted for the hub to post on TheAxiomFoundation/rulespec-us#1811 (not posted here); it replaces the $2,000/$500 form reading with the statute's per-person $500/$2,500/$1,000 and lists the wv_personal_exemption.yaml witnesses. I checked the two children witnesses by simulation at this head: joint one claimable spouse plus two children $2,000, both claimable plus two children $500.

Tests (local, one file per process)

All 26 changed YAML files: 354 cases passed, 0 failed (RI 4 files, SC 3, UT 4, VT 4, WI 7, WV 3, and the repeal file). contrib/states/ri/exemption_reform_test.yaml was killed for memory twice (11 GB) as one process, so I ran its 20 cases in four 5-case processes: 20 passed. tests/core/test_claimable_filer_ri_sc_ut_vt_wv_wi_invariants.py: 5 passed.

CI: the PR is a draft, so the Pull request workflow skips it; CI hasn't run.

Judgment calls

  • Including disability wages is the ruling's classification; no Wisconsin sentence names this category (the review noted the same).
  • The RI reform file's memory use isn't from this round's change; CI's contrib shards run it batched.

Generated by Claude Code

@MaxGhenis
MaxGhenis marked this pull request as ready for review November 4, 2026 12:43
@MaxGhenis

MaxGhenis commented Nov 4, 2026 •

Copy link
Copy Markdown
Contributor Author

Hub review in progress

Round-5 delta review of 3433ec7c209fdd0631e897194e1cca7cf03ad7fd. The head hasn't moved. Firm so far:

  • P2, WI helper misses farm income and the SE-tax subtraction (wi_standard_deduction.py:52-58). Take a claimable 2025 single filer with $10,000 of farm income and $20,000 of interest. The PR gives a $1,350 WI deduction, main gives $12,390.78, and the federal worksheet's earned income gives $9,743.52. After merging main, basic_standard_deduction gives $9,743.52 via standard_deduction_worksheet_earned_income. Replacing the helper's add(...)/is_filer block with tax_unit("standard_deduction_worksheet_earned_income", period) on the merged tree passes wi_standard_deduction.yaml (22) and wi_retirement_income_exclusion_tax.yaml (11).
  • P2, WV gate uses the raw dependent count (wv_personal_exemption.py:32, and the copies at wv_dependent_exemption_reform.py:98 and repeal_state_dependent_exemptions.py:234). For a joint return with one claimable spouse, adding children who add no exemption (exemptions_count stays at 1) cuts the exemption from $2,500 to $2,000. With both spouses claimable it falls from $1,000 to $500.
  • P2, body: there is no impact: line, the head and draft statements are stale, and the WI row doesn't mention the disability change.
  • Sound: the fix, both hand values, both mutants, and the two deduction paths.

Generated by Claude Code

@MaxGhenis

Copy link
Copy Markdown
Contributor Author

Ready for hub review
VERDICT: REQUEST_CHANGES
3433ec7
METHODOLOGY_CHOICE: yes

This is a round-5 delta review of fc6bd175bb..3433ec7c20 (one commit), which answers the statute review's WI disability-wage P2. The head hasn't moved since 3433ec7c20. The disability fix itself is correct and its tests are sound. Two things block landing: CI is red at this head, and the same helper still misses other earned income. The methodology choices are the WI classification inference (taxable disability wages count as earned income) and WV's per-person $500 reading, which the PR applies only when the return has no dependent members.

P1

P1-a. CI fails the reform-combo memory budget because of this PR's RI test additions. policyengine_us/tests/policy/contrib/states/ri/exemption_reform_test.yaml:119-410

This PR adds 16 cases to that file (4 on main, 20 at head). They introduce new reform combos, and the file now exceeds the per-file budget that main's code-health guard enforces. The Pull request run at this head (run 41831766745) fails "Python tests / Full Suite - Rest (Python shard 5)" and "Check Rest Python shards":

E  policyengine_us/tests/policy/contrib/states/ri/exemption_reform_test.yaml (weight 6.50, 8 distinct reform combos)
FAILED policyengine_us/tests/code_health/test_reform_combo_budget.py::test_no_test_file_exceeds_reform_combo_budget

I reproduced it locally. pytest -q -p no:cacheprovider policyengine_us/tests/code_health/test_reform_combo_budget.py fails at head with the same line and passes on origin/main. The hand-off reports that this file was killed for memory (11 GB) when run as one process, which is the cost the guard exists to stop.

Fix: move lines 119 to the end (the 16 "young/older dependent", "joint return …" and "filing exception" baseline/reform pairs) into a new file, policyengine_us/tests/policy/contrib/states/ri/exemption_reform_claimable_filer_test.yaml, and leave lines 1-118 (the 4 original cases) in place. I tried exactly this split on a scratch copy:

  • the budget test passes;
  • the new file runs on its own with 16 passed in 148.56 s, at a peak child RSS of 7,247 MB (local Linux VM, not a CI measurement).

The new file sits in the same folder, so the contrib selectors that already collect this one still reach it.

P1-b. The "Package and compatibility" job fails at this head. Same run: release_lock.py: error: Versioning changed the reviewed dependency graph; prepare and review a registry lock first, in both the rc1 and final candidates. This job checks out the PR head, not the merge commit. The diff doesn't touch uv.lock or pyproject.toml, but the head's copies are 99 commits behind main: git diff 3433ec7c20 origin/main -- uv.lock shows policyengine-core 3.32.27 → 3.34.2 and the package version 2.53.0 → 2.94.6, among others. Four other PRs' runs today, all on newer main locks, pass this job (runs 41831775423, 41834014443, 41836087181 and 41755053141).

I couldn't reproduce CI's resolution locally. With uv 0.11.32, python .github/release_lock.py --rehearse passes at this head and fails on origin/main, so the local resolver isn't a faithful stand-in. The likely fix is to merge current origin/main, which merges cleanly: I ran git merge --no-commit --no-ff origin/main on a scratch copy and saw no conflicts. Rerun CI after that merge. If the job still fails, it needs a reviewed lock refresh per .github/release-lock.md.

P2

P2-a. The WI dependent cap still omits farm income and the self-employment-tax subtraction, and the hand-off says disability wages were the only missing source. policyengine_us/variables/gov/states/wi/tax/income/wi_standard_deduction.py:49-58

The helper sums irs_employment_income, self_employment_income, sstb_self_employment_income and earned_disability_benefits. The model's own list of dependent earned-income sources, parameters/gov/irs/income/filing_requirement/dependent/earned_income_sources.yaml, also has farm_operations_income. That list quotes the 1040 worksheet footnote: "Schedule 1, lines 3, 6, … minus the amount, if any, on Schedule 1, line 15". The federal basic_standard_deduction at the PR's own base subtracts self_employment_tax_ald; the WI helper doesn't. On current main, the federal side reads standard_deduction_worksheet_earned_income, which counts farm income and subtracts the SE-tax deduction.

Here is what a claimable 2025 single filer age 22 with $20,000 of interest gets (Simulation runs, year-keyed inputs):

Extra income main WI PR head WI PR merged with main: federal PR merged with main: WI
$10,000 farm 12,390.78 1,350 9,743.52 1,350
$10,000 self-employment 12,390.78 10,450 9,743.52 10,450
$10,000 disability wages 12,306 10,450 10,450 10,450

Hand check for the farm row: SE tax ALD = 10,000 × 0.9235 × 0.153 / 2 = 706.48. Earned income = 10,000 − 706.48 = 9,293.52, plus 450 gives 9,743.52. The ordinary deduction is 13,560 − 0.12 × (29,293.52 − 19,550) = 12,390.78, so the cap gives 9,743.52. The PR's $1,350 understates it by $8,393.52. Main gives $12,390.78 because it has no cap at all, so this PR is what makes the farm case worse. The SE row overstates by $706.48. The Form 1 worksheet text was out of reach from this VM (see below), so the SE-tax half of this rests on the helper's own premise that WI mirrors the federal worksheet ("as on the federal worksheet").

Fix, after merging main (needed for P1-b anyway): replace lines 49-60 (earned_income = add( … earned_income = max_(tax_unit.sum(earned_income * is_filer), 0)) with

    earned_income = tax_unit("standard_deduction_worksheet_earned_income", period)

and update the comment above it to say the helper reuses the federal worksheet's earned income. That variable already applies the head/spouse filter, the joint netting and the zero floor. I applied this on a scratch merge with main:

  • wi_standard_deduction.yaml: 22 passed;
  • wi_retirement_income_exclusion_tax.yaml: 11 passed;
  • the farm and SE rows become 9,743.52 and the disability row stays 10,450.

Add a farm-income case (2025, claimable, $10,000 farm_operations_income plus $20,000 interest → wi_standard_deduction: 9_743.52).

P2-b. WV: children who add no exemption switch off the per-filer $500. policyengine_us/variables/gov/states/wv/tax/income/exemptions/wv_personal_exemption.py:32, and the same gate at policyengine_us/reforms/states/wv/dependent_exemption/wv_dependent_exemption_reform.py:98 and policyengine_us/reforms/state_dependent_exemptions/repeal_state_dependent_exemptions.py:234.

The gate tests the raw tax_unit_dependents == 0. When a filer is claimable, IRC 152(b)(1) leaves the return no lawful dependents, so exemptions_count is the same with or without children. There's no attribution question in that case, yet the result changes (Simulation runs, 2025, $8,000 wages each):

Return exemptions_count tax_unit_dependents wv_personal_exemption
joint, one claimable 1 0 2,500
joint, one claimable + 1 child 1 1 2,000
joint, one claimable + 2 children 1 2 2,000
joint, both claimable 0 0 1,000
joint, both claimable + 2 children 0 2 500

Under the PR's own per-person reading, the child rows should be 2,500 and 1,000. The body's caveat ("attribution under a claimable filer's single-exemption limit is unresolved") covers returns where dependents do count, such as the filing-exception case, not these.

Fix: in the baseline variable and the contributed reform, gate on lawful dependent exemptions instead of dependent members:

        exemptions = tax_unit("exemptions_count", period)
        lawful_dependent_exemptions = exemptions - own_exemptions
        childless_claimable = (lawful_dependent_exemptions == 0) & (
            claimable_filers > 0
        )

In the baseline, this replaces lines 32-36 and the later duplicate exemptions = … line. In the reform, it replaces lines 98-101. In the repeal override (lines 234-236), the ordinary amount already counts only own_exemptions, so dependents add nothing there; gate on claimable_filers > 0 alone. I tried this in the baseline variable on a scratch copy. Two cases in wv_personal_exemption.yaml flip, both "2025 joint return with one claimable spouse and a child …", from 2,000 to 2,500. The other 15 pass, including the filing-exception case at $2,000. Those two expectations, their reform/repeal counterparts and any downstream LIFTC fixtures would need updating, and the #1811 witnesses below would move with them. If the hub instead keeps the as-built behaviour, the body should say plainly that a child who contributes no exemption still removes $500.

P2-c. The PR body is stale and has no impact: line. The axiom: line is present. The impact: line the hub keeps is missing. Other stale text:

  • "Validation and merge" names head fc6bd175bb… and says "The PR remains draft, with all seven CI checks skipped". The PR is now ready, and CI ran with the failures above.
  • The WI rows don't mention that disability wages now count.

The hub owns the impact: line; the rest is the author's to refresh.

P3

P3-a. The new reference https://www.irs.gov/publications/p907 (wi_standard_deduction.py:82) is an undated HTML page. The model's other disability-wage citations use dated prior-year PDFs (irs-prior/p596--2024.pdf#page=8, earned_disability_benefits.py). A dated irs-prior/p907--2025.pdf link with its page would pin the source. I couldn't fetch either from this VM.

WV parity witnesses (for the #1811 correction)

These are from wv_personal_exemption.yaml at this head. All 17 cases pass (one process, 19.69 s), and I reran each value below through a separate Simulation probe:

Filing status Claimable filers Children wv_personal_exemption
single the filer 0 500 (wv_agi 30,000 → wv_taxable_income 29,500)
joint head only 0 2,500 (taxable 27,500)
joint spouse only 0 2,500 (taxable 27,500)
joint both 0 1,000 (taxable 29,000)
joint neither 0 4,000
joint head only 1 2,000 as built (2,500 under P2-b's fix)
joint spouse only 1 2,000 as built (2,500 under P2-b's fix)
joint neither 1 6,000
single, claimant meets filing exception the filer 1 2,000
joint head only / spouse only 2 2,000 / 2,000 as built (2,500 under the fix)
joint both 2 500 as built (1,000 under the fix)
joint neither 2 8,000

The hand-off says it drafted a #1811 correction but didn't include the text, so there's nothing to check it against. The two-children values it quotes ($2,000 and $500) match these runs as built.

Checked and sound

  • The delta. git diff fc6bd175bb 3433ec7c20 touches only wi_standard_deduction.py (+6) and wi_standard_deduction.yaml (+55).
  • Both WI paths call the helper. wi_standard_deduction.py:94 and wi_retirement_income_exclusion_tax.py:47. head_or_spouse_is_dependent_elsewhere (claimability) gates the cap.
  • Hand values, computed from the parameters before reading the cases. 2025 single maximum 13,560, phase-out 12% above 19,550, dependent amount 1,350, additional 450.
    • Disability case: 13,560 − 0.12 × 10,450 = 12,306; cap max(1,350, 10,450) = 10,450; result 10,450.
    • Interest-only case: 13,560 − 0.12 × 450 = 13,506; cap 1,350; result 1,350.
    • Both match the YAML. The new cases assert the final deduction plus AGI, WI AGI, earned_disability_benefits and the federal deduction, so they test the claim rather than a weaker one.
  • The defect. It reproduces at the review head fc6bd175bb: the disability case gives $1,350 there and $10,450 at this head. It can't be reproduced on main, which has no WI dependent cap (main gives $12,306).
  • An unclaimable control. The same disability filer, not claimable, keeps $12,306 at head, so the cap stays gated.
  • Tests at head, one file per process.
    • wi_standard_deduction.yaml: 22 passed.
    • wv_personal_exemption.yaml: 17 passed.
    • wi_retirement_income_exclusion_tax.yaml: 11 passed (in the mutant tree, unmutated cases).
    • tests/core/test_claimable_filer_ri_sc_ut_vt_wv_wi_invariants.py: 5 passed in 51.94 s (after installing the dev extra for hypothesis).
  • Mutants, each in its own process on a scratch worktree, restored afterwards (git status clean):
    1. The hand-off's mutant: drop "earned_disability_benefits" from the helper. Killed by "Wisconsin counts a claimable filer's taxable disability wages as earned income" ([1350.] differs from 10450.0, 21 of 22 pass).
    2. Mine: replace the cap on the retirement-exclusion path with np.inf. Killed by "2025 claimable but unclaimed retiree uses the dependent deduction on the positive retirement exclusion" in wi_retirement_income_exclusion_tax.yaml ([0.] differs from 194.25).
  • Readers of wi_standard_deduction:
    • wi_taxable_income;
    • wi_retirement_income_exclusion_tax;
    • wi_itemized_deduction_credit_potential;
    • the state_standard_deductions list.
      The round's change only raises the deduction for claimable filers with earned disability benefits, in the same direction on every path.
  • Baseline movement. disability_benefits_before_minimum_retirement_age is an input that defaults to zero, so this round's commit moves baseline output only where the dataset fills it. The population check is the count and weight of WI tax units with a claimable head or spouse and positive earned_disability_benefits, plus farm_operations_income or self-employment income if P2-a's fix is taken.
  • Scope.
  • CI (run 41831766745, completed, conclusion failure): every baseline shard, every contrib shard, the microsimulation, Quick Feedback, Household API Partners, PR validation and eight of nine Rest Python shards passed. Exactly three jobs failed: Package and compatibility, Rest Python shard 5 and the shard check (P1).

What I couldn't check

  • Sources. This VM couldn't reach revenue.wi.gov, irs.gov, docs.legis.wisconsin.gov, govinfo.gov, uscode.house.gov, ecfr.gov or code.wvlegislature.gov; the proxy refused every request. So I couldn't read Publication 907 or the 2025 Form 1 instructions (p. 15), and I can't say whether either text changes the hub's classification. In particular, I couldn't confirm that Wisconsin's worksheet line 1 subtracts the SE-tax deduction or counts farm income. P2-a rests on the federal worksheet text as quoted in the model's own parameter metadata, and on the helper's stated premise that WI follows it.
  • Population impact. The dataset isn't reachable here, so I measured no microsimulation.
  • CI's lock resolution. I couldn't confirm that merging main clears P1-b, since local uv resolution doesn't match CI's.

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

… pyproject.toml

The Package and compatibility job checks the head's lock, which sat 99
commits behind main.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The 16 claimable-filer baseline/reform pairs pushed exemption_reform_test.yaml
past the per-file reform-combo budget that test_reform_combo_budget.py
enforces. Moving them to a sibling file in the same folder keeps the
contrib selectors collecting them.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The helper summed wages, business income and disability wages itself, so
it missed farm income and never subtracted the deductible part of
self-employment tax. standard_deduction_worksheet_earned_income already
applies those, the head/spouse filter, joint netting and the zero floor.
Adds the 2025 farm-income case (9,743.52).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A child on a return whose filer can be claimed adds no exemption under
IRC 152(b)(1), so it should not switch off the per-filer amounts. The
baseline and contributed reform now test exemptions_count minus own
exemptions instead of tax_unit_dependents; the repeal override, whose
ordinary amount counts only own exemptions, applies whenever a filer is
claimable. Updates the one-claimable-plus-child cases to 2,500 and the
both-claimable-plus-children cases to 1,000, adds baseline and repeal
cases, and widens the invariant identity to match.

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

Copy link
Copy Markdown
Contributor Author

Ready for hub review

Head: ce5880d884849695186f48beb5b34b7c7505ccdc (built on 3433ec7c20; no one else pushed while I worked).

Commits this round: 382bdbc900 (merge of origin/main at 25c42534839b), 18f3b34310 (RI split), af909693ac (WI cap), 97ab9394c7 (WV gate), ce5880d884 (changelog fragment).

Items

  1. Pick-up and P1-b, the merge. Done. I merged origin/main with a merge commit, 382bdbc900; there were no conflicts and no rebase. "Package and compatibility" passes at this head in run 41855545317, so the lock didn't need refreshing. Nothing under .github/ changed.
  2. P1-a, the reform-combo budget. Done. Lines 119 to the end moved to policyengine_us/tests/policy/contrib/states/ri/exemption_reform_claimable_filer_test.yaml (16 cases). exemption_reform_test.yaml keeps lines 1–117 (4 cases); I dropped the trailing blank line 118. test_reform_combo_budget.py: 1 passed. CI's Rest Python shard 5, which failed last round, passes.
  3. P2-a, Wisconsin's cap. Done. wi_standard_deduction.py:50 is now earned_income = tax_unit("standard_deduction_worksheet_earned_income", period). I read that variable and its per-person part in my clone. They sum earned_income_sources (wages, business income and farm_operations_income) plus earned_disability_benefits, subtract self_employment_tax_ald_person, take the head's and spouse's amounts through tax_unit_non_dep_sum, and floor at zero. The comment above it (lines 43–49) now says the helper reuses the federal worksheet's earned income. The farm case is at wi_standard_deduction.yaml:412. The disability row stays at 10,450.
  4. P2-b, West Virginia's $500. Done.
    • The gate now uses lawful_dependent_exemptions = exemptions - own_exemptions in wv_personal_exemption.py:34-38 (the duplicate exemptions = line is gone) and in wv_dependent_exemption_reform.py:99-103.
    • repeal_state_dependent_exemptions.py:256 gates on claimable_filers > 0 alone.
    • Tests are updated or added (listed below), and the invariant identity is widened at test_claimable_filer_ri_sc_ut_vt_wv_wi_invariants.py:137.
  5. P3-a, a dated source. Not done. This session couldn't reach irs.gov: the proxy returned 403 for irs-prior/p907--2025.pdf, web.archive.org was refused too, and WebFetch said irs.gov isn't on this session's network allowlist. Following the brief, I kept https://www.irs.gov/publications/p907 (now wi_standard_deduction.py:72), and I didn't add a page I hadn't read.
  6. P2-c, the body. Done, and read back.
    • The summary, the WV and WI table rows, both readings and the invariants paragraph now say that taxable disability wages, farm income and the SE-tax deduction count for WI, and that for WV a child who adds no exemption leaves the per-filer $500 alone.
    • "Validation and merge" names this head, says the PR is ready (not a draft), and gives this round's local counts and the CI state.
    • The axiom: line is unchanged. I didn't add the impact: line.
  7. Runs. Listed below.

Expectations that moved (before → after)

File:line (case) Before After
wv_personal_exemption.yaml:159 (one claimable spouse + child, head claimable) 2,000 2,500
wv_personal_exemption.yaml:191 (same, spouse claimable) 2,000 2,500
dependent_exemption_reform_test.yaml:217 (WV baseline, one claimable + 2 children) 2,000 2,500
dependent_exemption_reform_test.yaml:235 (WV reform, same) 2,000 2,500
dependent_exemption_reform_test.yaml:257 (WV baseline, both claimable + 2 children) 500 1,000
dependent_exemption_reform_test.yaml:279 (WV reform, same) 500 1,000

Added:

  • wv_personal_exemption.yaml:247: joint return, both spouses claimable, two children → exemptions_count 0, wv_personal_exemption 1,000;
  • repeal_state_dependent_exemptions.yaml:513: repeal, joint return, one claimable spouse and two children → 2,500 (the repeal file had no such case, so nothing tested the repeal gate);
  • the WI farm case.

Unchanged:

  • the filing-exception case stays at 2,000;
  • the LIFTC file wv_low_income_family_tax_credit_eligible.yaml (7 cases) is unchanged, and no LIFTC fixture moved;
  • no file under tests/policy/baseline/partners/ changed.

WV parity witnesses after this change

These come from a Simulation probe at this head (2025, $8,000 wages each on joint returns). They match the YAML.

Filing status Claimable filers Children exemptions_count wv_personal_exemption
single the filer 0 0 500
joint head only 0 1 2,500
joint spouse only 0 1 2,500
joint both 0 0 1,000
joint neither 0 2 4,000
joint head only 1 1 2,500
joint spouse only 1 1 2,500
joint neither 1 3 6,000
single, claimant meets filing exception the filer 1 1 2,000
joint head only / spouse only 2 1 2,500 / 2,500
joint both 2 0 1,000
joint neither 2 4 8,000

Hand computations

  • WI farm (2025, single, age 22, claimable, $10,000 farm income plus $20,000 interest):
    • SE-tax deduction = 10,000 × 0.9235 × 0.153 / 2 = 706.48 (706.4775 unrounded).
    • AGI = 30,000 − 706.48 = 29,293.52.
    • Earned income = 10,000 − 706.48 = 9,293.52.
    • Cap = max(1,350, 9,293.52 + 450) = 9,743.52.
    • Ordinary deduction = 13,560 − 0.12 × (29,293.52 − 19,550) = 12,390.78.
    • Result: 9,743.52. The case uses absolute_error_margin: 0.01 and also asserts self_employment_tax_ald, wi_agi, standard_deduction_worksheet_earned_income and basic_standard_deduction.
  • WV, one claimable spouse and a child: own exemptions 1, lawful dependent exemptions 1 − 1 = 0, so 2,000 × 1 + 500 × 1 = 2,500.
  • WV, both claimable and two children: 0 own and 0 lawful dependent exemptions, so 500 × 2 = 1,000.

Tests (one file per process, local Linux VM)

File Result
contrib/states/ri/exemption_reform_test.yaml 4 passed
contrib/states/ri/exemption_reform_claimable_filer_test.yaml 16 passed (84 s in pytest, 274 s wall)
wi_standard_deduction.yaml 23 passed
wi_retirement_income_exclusion_tax.yaml 11 passed
wv_personal_exemption.yaml 18 passed
contrib/states/wv/dependent_exemption_reform_test.yaml 21 passed
repeal_state_dependent_exemptions.yaml 40 passed
wv_low_income_family_tax_credit_eligible.yaml 7 passed
code_health/test_reform_combo_budget.py 1 passed
core/test_claimable_filer_ri_sc_ut_vt_wv_wi_invariants.py 5 passed

ruff format --check and ruff check pass on the 5 changed Python files. I didn't measure peak memory (/usr/bin/time isn't installed here). I ran no full suite and no microsimulation.

Mutants

Each ran in its own process, and the file was restored with git checkout afterwards; git status was clean at the end. All four were killed.

  1. M1: the baseline WV gate reverted to tax_unit_dependents == 0. Killed: wv_personal_exemption.yaml had 3 failures (2000 ≠ 2500 twice, 500 ≠ 1000).
  2. M2: the WI helper reverted to its own four-source sum. Killed: the farm case gave 1350 ≠ 9743.52 (1 of 23 failed).
  3. M3: the repeal gate reverted to the childless test. Killed: the new repeal case gave 2000 ≠ 2500 (1 of 40 failed).
  4. M4: the reform gate reverted. Killed: the two reform rows gave 2000 ≠ 2500 and 500 ≠ 1000 (2 of 21 failed).

CI

Pull request run 41855545317 was still in progress at hand-off, about 60 minutes after the push, so it has no conclusion yet.

  • 26 jobs had completed, all success. They include Package and compatibility, PR validation, Quick Feedback, Household API Partners, every Baseline shard, the Rest Python plan and every Rest Python shard (including shard 5).
  • Still running: the nine Contrib shards (started 15:46Z) and Microsimulation.

Judgment calls

  • Invariant identity. _identities asserted 500 for every WV return with dependents and exemptions_count == 0; that's false under the fix, which gives 1,000 when both spouses can be claimed. I replaced it and the childless identity with one identity over returns where exemptions_count == own. It covers childless returns and returns whose children add nothing, and I updated the module docstring to match.
  • New repeal case. The brief asked for the repeal counterparts, but the repeal file had none with children and a claimable spouse, so I added one. M3 shows it's the only test that pins the repeal gate.
  • Changelog fragment. I updated the existing fragment's WV and WI sentences to describe this round's behaviour.
  • Comments. The reform and repeal comments now describe the new gates.
  • RI split. The original file ends at its last case, without the blank line 118.

Proposed follow-up

  • Pin WI's disability-wage citation to Publication 907 (2025). This session couldn't reach irs.gov. A session that can should replace the undated publications/p907 link with irs-prior/p907--2025.pdf#page=N, citing the page that calls these benefits wages.

Generated by Claude Code

@MaxGhenis

Copy link
Copy Markdown
Contributor Author

Hub review in progress

Round 6 delta review of 3433ec7c20..ce5880d884849695186f48beb5b34b7c7505ccdc. The head hasn't moved since ce5880d884.

Findings so far:

  • CI. Pull request run 41855545317 at this head has completed with conclusion success. All 36 jobs succeeded, including Package and compatibility, Rest Python shard 5, all nine Contrib shards and Microsimulation.
  • The RI split is lossless. The two RI files concatenated equal the old file except for one dropped blank line. The 4-case file is byte-identical to main's. CI ran the new file in its own batch (16 cases).
  • WI farm case. My hand computation gives 9,743.52, matching the YAML, and the disability row stays 10,450.
  • No source host is reachable from this VM: irs.gov, revenue.wi.gov, docs.legis.wisconsin.gov, code.wvlegislature.gov, govinfo.gov, uscode.house.gov, ecfr.gov and web.archive.org are all refused by the proxy.
  • Local test runs and mutants are in progress.

Generated by Claude Code

@MaxGhenis

Copy link
Copy Markdown
Contributor Author

Ready for hub review
VERDICT: APPROVE
ce5880d
METHODOLOGY_CHOICE: yes

This is a round-6 delta review of 3433ec7c20..ce5880d884, checked against the round-5 review. The head hasn't moved since ce5880d884. The delta has five commits:

  • 382bdbc900 merges main at 25c4253483 (still main's tip when I fetched);
  • 18f3b34310 splits the RI file;
  • af909693ac changes the WI cap;
  • 97ab9394c7 changes the WV gate;
  • ce5880d884 updates the changelog.

All three round-5 blockers are fixed, CI is green, and every mutant the hand-off lists is killed. I found no P1 or P2. The methodology choices are unchanged from round 5:

  • WV: the per-person reading of 11-21-16(d), now applied whenever no dependent adds an exemption.
  • WI: reusing the federal worksheet's earned income for the dependent cap.

P3

P3-a. The Publication 907 reference is still undated. policyengine_us/variables/gov/states/wi/tax/income/wi_standard_deduction.py:72

The hand-off reports that the session couldn't reach irs.gov, and this VM couldn't either (proxy 403). The hub read Publication 907 (2025), PDF page 3: "You must report your taxable disability payments as wages on line 1h of Form 1040 or 1040-SR until you reach minimum retirement age." I couldn't fetch that page myself, so this rests on the hub's reading. Replace

        "https://www.irs.gov/publications/p907",

with

        "https://www.irs.gov/pub/irs-prior/p907--2025.pdf#page=3",

This doesn't block landing.

P3-b. No test pins that a dependent's own earnings stay out of WI's cap (surviving mutant M7). policyengine_us/variables/gov/states/wi/tax/income/wi_standard_deduction.py:50

The head is correct: standard_deduction_worksheet_earned_income sums only non-dependents through tax_unit_non_dep_sum (policyengine_us/tools/general.py:99-103). But if the helper instead sums every member's standard_deduction_worksheet_earned_income_person, both WI files still pass:

  • wi_standard_deduction.yaml: 23 passed;
  • wi_retirement_income_exclusion_tax.yaml: 11 passed.

The result does change. A Simulation probe (2025: a claimable filer aged 22 with $20,000 of interest, plus a 16-year-old dependent earning $5,000 in wages) gives wi_standard_deduction 1,350 at head and 5,450 under the mutant. Add this case to wi_standard_deduction.yaml. I ran these inputs as a Simulation, not as this YAML:

- name: Wisconsin leaves a dependent's own wages out of a claimable filer's earned income
  period: 2025
  input:
    people:
      filer:
        age: 22
        taxable_interest_income: 20_000
        claimable_as_dependent_on_another_return: true
      child:
        age: 16
        employment_income: 5_000
    tax_units:
      tax_unit:
        members: [filer, child]
    households:
      household:
        members: [filer, child]
        state_code: WI
  output:
    standard_deduction_worksheet_earned_income: 0
    # The child's wages belong on the child's own return.
    # Dependent limit: max(1,350, 0 + 450) = 1,350.
    wi_standard_deduction: 1_350

P3-c. The body's CI paragraph is stale, and the impact: line is still missing. The "Validation and merge" section says run 41855545317 "was still in progress at hand-off". That run has since completed with conclusion success. Replace the paragraph that starts "CI: Pull request run" with:

CI: Pull request run 41855545317 at this head completed with conclusion success. All 36 jobs passed, including Package and compatibility, PR validation, Quick Feedback, Household API Partners, every Baseline, Contrib and Rest Python shard, and Microsimulation.

The axiom: line is present. The hub owns the impact: line.

Checked and sound

CI. Pull request run 41855545317 at ce5880d884 (attempt 1) is completed with conclusion success. All 36 jobs report success, none cancelled or skipped:

  • Package and compatibility, which failed in round 5;
  • Rest Python shard 5 and the shard check, which failed in round 5. Shard 5's log shows test_no_test_file_exceeds_reform_combo_budget PASSED;
  • all nine Contrib shards, Microsimulation, every Baseline shard, Quick Feedback, Household API Partners and PR validation.

The RI split (P1-a).

  • cat exemption_reform_test.yaml exemption_reform_claimable_filer_test.yaml equals the round-5 file except for one dropped blank line between cases (diff reports only 118d117 < followed by an empty line). Case counts are 4 + 16 = 20, as before.
  • The 4-case file is byte-identical to origin/main's copy.
  • The contrib states shards collect the whole contrib/states tree. CI's log shows "Batch 15/18 started: 1 files from …/ri/exemption_reform_claimable_filer_test.yaml" with 16 passing dots, so no case went uncollected.
  • test_reform_combo_budget.py: 1 passed locally.

WI cap (P2-a). I computed the hand values from the parameter tree before reading the cases. The 2025 values are:

  • dependent amount 1,350 and additional earned income 450;
  • WI single maximum 13,560, phasing out at 12% above 19,550;
  • SE rates 0.124 + 0.029;
  • earned_income_sources = wages, self-employment, SSTB self-employment and farm_operations_income, in effect since 2010, so it covers every year the cap reaches.

The farm case works out as follows:

  • SE deduction = 10,000 × 0.9235 × 0.153 / 2 = 706.4775;
  • earned income = 9,293.5225, so the cap is 9,743.5225;
  • the ordinary deduction is 13,560 − 0.12 × (29,293.5225 − 19,550) = 12,390.78;
  • the result is 9,743.52, which matches wi_standard_deduction.yaml:412.

The disability row is min(12,306, max(1,350, 10,450)) = 10,450, and it still passes.

I read standard_deduction_worksheet_earned_income and its per-person variable. They sum earned_income_sources plus earned_disability_benefits, subtract self_employment_tax_ald_person, sum non-dependents and floor at zero. The new comment at lines 43–49 states exactly that.

Simulation probes (2025, a claimable single filer aged 22 with $20,000 of interest):

Extra income main round-5 head this head
$10,000 farm 12,390.78 1,350 9,743.52
$10,000 self-employment 12,390.78 10,450 9,743.52
$10,000 wages 12,306 10,450 10,450
none 13,506 1,350 1,350
$10,000 farm, filer not claimable 12,390.78 12,390.78 12,390.78

So the round-5 farm and SE defects reproduce at 3433ec7c20 and are fixed here, and the cap stays gated on claimability. Main has no WI dependent cap at all.

WV gate (P2-b). exemptions_count (read in this session) is own + dependents when a filer is claimable, with dependents set to 0 unless the claimant meets the filing exception. Otherwise it is tax_unit_size. So exemptions_count − own is the lawful dependent count.

The contributed reform's wv_eligible_dependents_count and wv_older_dependents_count apply the same head_or_spouse_is_dependent_elsewhere_without_filing_exception gate. The reform's gate and its own dependent terms therefore agree.

The repeal's ordinary amount counts only own_exemptions, so gating on claimable_filers > 0 alone is sound. A claimable single filer gets 500 either way.

Hand values with $2,000 and $500 (both constant from 2021 through 2026 in the parameter tree):

  • one claimable spouse and children: 2,000 × 1 + 500 × 1 = 2,500;
  • both claimable and two children: 500 × 2 = 1,000;
  • filing-exception single with one child: own 0, lawful dependents 1, so 2,000 × 1 = 2,000.

All six moved expectations and both new cases (wv_personal_exemption.yaml:247 and repeal_state_dependent_exemptions.yaml:513) match. Each new case also asserts exemptions_count, so it tests the claim rather than a weaker one.

Joint-return Simulation probes (2025, $8,000 wages each), giving wv_personal_exemption:

Return main round-5 head this head
one claimable, no children 4,000 2,500 2,500
one claimable + 1 child (head or spouse) 6,000 2,000 2,500
one claimable + 2 children 8,000 2,000 2,500
both claimable, no children 4,000 1,000 1,000
both claimable + 2 children 8,000 500 1,000
neither claimable + 2 children 8,000 8,000 8,000

The hand-off's parity table. Every row matches either these probes or a passing case in wv_personal_exemption.yaml: single claimable 500 (line 32), filing exception 2,000 (line 282), and neither-claimable 4,000 and 6,000 (lines 133 and 220). Its "before → after" line citations point at the cases' name lines.

The widened identity (test_claimable_filer_ri_sc_ut_vt_wv_wi_invariants.py:137) selects WV returns with exemptions_count == own and asserts 2,000 × own + 500 × (filers − own). That matches the module docstring (lines 19–25) and the baseline formula. For the baseline, the identity is close to the formula restated. It still bites, though: mutant M1 fails it in all four years, so the population reaches claimable returns with children.

LIFTC. The fixture file is untouched this round and passes. Its arithmetic checks out: 16,000 − 2,500 = 13,500; 10,000 × 2.22% + 3,500 × 2.96% = 325.60; 80% of that is 260.48.

Tests at head, one file per process (local Linux VM):

File Result
code_health/test_reform_combo_budget.py 1 passed
wi_standard_deduction.yaml 23 passed
wi_retirement_income_exclusion_tax.yaml 11 passed
wv_personal_exemption.yaml 18 passed
contrib/states/wv/dependent_exemption_reform_test.yaml 21 passed
repeal_state_dependent_exemptions.yaml 40 passed
wv_low_income_family_tax_credit_eligible.yaml 7 passed
contrib/states/ri/exemption_reform_test.yaml 4 passed
core/test_claimable_filer_ri_sc_ut_vt_wv_wi_invariants.py 5 passed
contrib/states/ri/exemption_reform_claimable_filer_test.yaml 16 passed

ruff format --check reports "5 files already formatted" and ruff check reports "All checks passed!" on the five changed Python files.

Mutants. Each ran in its own process on a scratch worktree that imports its own copy of the package. Each was restored afterwards, and git status was clean.

Mutant Result
M1: baseline WV gate back to tax_unit_dependents == 0 Killed. wv_personal_exemption.yaml: 3 failed (2000 ≠ 2500 twice, 500 ≠ 1000). The invariants test: 4 failed (2021, 2023, 2025 and 2026, at line 140).
M2: WI helper back to its four-source sum Killed. The farm case gave 1350 ≠ 9743.52 (1 of 23 failed).
M3: repeal gate back to the childless test Killed. The new repeal case gave 2000 ≠ 2500 (1 of 40 failed).
M4: reform gate back to tax_unit_dependents == 0 Killed. 2000 ≠ 2500 and 500 ≠ 1000 (2 of 21 failed).
M5 (mine): $500 once per return (base_personal * (claimable_filers > 0)) Killed by the three both-claimable cases (500 ≠ 1000).
M6 (mine): baseline gate changed to lawful_dependent_exemptions >= 0 Killed by the filing-exception control (500 ≠ 2000).
M7 (mine): WI helper counts dependents' own earnings Survived both WI files (P3-b).

Readers.

  • wv_personal_exemption is read by wv_taxable_income, and through it by WV tax and the LIFTC, and is overridden by the WV reform and the repeal.
  • wi_dependent_standard_deduction_limit is called by wi_standard_deduction (line 84) and wi_retirement_income_exclusion_tax (line 47).
  • wi_standard_deduction is read by wi_taxable_income, wi_retirement_income_exclusion_tax, wi_itemized_deduction_credit_potential and the state_standard_deductions list.
  • standard_deduction_worksheet_earned_income is unchanged; its other readers are federal, OR and HI.

Against the round-5 head, this round's changes only raise the WV exemption and only raise or lower the WI cap toward the worksheet value, in the same direction on each path. I found no reader made worse.

Baseline movement. Yes, this round moves baseline outputs.

  • WV: tax units with a claimable head or spouse, dependent members present and the Dependent Taxpayer Test applying gain $500 of exemption per claimable filer.
  • WI: relative to the round-5 head, claimable filers with farm income get a higher deduction and those with self-employment income a lower one. Relative to main, the PR's cap lowers the deduction for claimable filers generally.

The population check is the count and weight of:

  • WV tax units with head_or_spouse_is_dependent_elsewhere_without_filing_exception and tax_unit_dependents > 0;
  • WI tax units with a claimable head or spouse and nonzero farm or self-employment income.

Scope.

  • None of the 55 PR files is under .github/ or tests/policy/baseline/partners/.
  • uv.lock and pyproject.toml don't differ from main at the merge base.
  • The changelog fragment's new WV and WI sentences match the code.

Body. Checked against the code:

  • the summary's WV and WI sentences;
  • the WV and WI table rows;
  • the "WV $500" and "WI earned income" readings;
  • the invariants paragraph;
  • the RI-split and merge paragraphs.

All hold, except the CI paragraph (P3-c).

Overlaps.

What I couldn't check

  • Sources. The proxy refused, by policy, every source host I tried: irs.gov, revenue.wi.gov, docs.legis.wisconsin.gov, code.wvlegislature.gov, tax.wv.gov, govinfo.gov, uscode.house.gov, ecfr.gov and web.archive.org. So I confirmed no statute or form text in this session. In particular, I couldn't confirm:

    • that Wisconsin's worksheet line 1 counts farm income and subtracts the SE-tax deduction;
    • the Publication 907 page in P3-a;
    • the text of WV 11-21-16(d).

    The WI change rests on the helper's stated premise that Wisconsin follows the federal worksheet, and the Publication 907 quote is the hub's reading.

  • Population impact. The dataset isn't reachable here, so I ran no microsimulation.

  • Peak memory of the local runs. I measured wall time only; the RI 16-case file took 242 s wall, with 74.82 s in pytest.


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

…ages

Cite the 2025 Publication 907 PDF at the page that treats disability
payments before minimum retirement age as wages, rather than the undated
web page. Add a case where a claimable filer's dependent child earns
wages: the child's earnings belong on the child's own return, so the
dependent limit stays at 1,350. Without it, a helper that summed every
member's earned income would pass both WI files while giving 5,450.

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: a527247897fe305ce6747ba783991881e0e1b226

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

Items

  1. P3-a, the dated Publication 907. policyengine_us/variables/gov/states/wi/tax/income/wi_standard_deduction.py:72 now cites https://www.irs.gov/pub/irs-prior/p907--2025.pdf#page=3. No other file cited the undated page. I didn't fetch the PDF myself; this rests on the hub's reading of page 3.
  2. P3-b, a dependent's own wages. policyengine_us/tests/policy/baseline/gov/states/wi/tax/income/wi_standard_deduction.yaml:445-467 adds the review's case with its name, inputs and outputs, and the two comments directly above wi_standard_deduction.
    • Hand value: the filer has no earned income, and the child's $5,000 of wages stay on the child's own return, so the dependent limit is max(1,350, 0 + 450) = 1,350. That is below the ordinary deduction, so wi_standard_deduction = 1,350, and standard_deduction_worksheet_earned_income = 0.
    • At this head: passes.
  3. P3-c, the body. The WI row in the test table now reads 24 passed, and a test_reference_urls.py row (32 passed) is added. The "Head:" line names this head. The "Local runs" sentence now says which files ran at this head and which ran at ce5880d884. The WI earned-income row gains one sentence on the new case. The impact: and axiom: lines are untouched. I read the body back after the PATCH, and it matches.
  4. Runs, one file per process at this head:
File Result
wi_standard_deduction.yaml 24 passed
wi_retirement_income_exclusion_tax.yaml 11 passed
code_health/test_reference_urls.py 32 passed

ruff format --check and ruff check pass on wi_standard_deduction.py.

Mutant

M7: standard_deduction_worksheet_earned_income sums every member's standard_deduction_worksheet_earned_income_person (add(...) in place of tax_unit_non_dep_sum(...)). It ran in its own process, and I restored the file afterwards; git status showed only my two intended changes.

  • Against wi_standard_deduction.yaml: 1 failed, 23 passed. The new case fails first on standard_deduction_worksheet_earned_income@2025: [5000.] differs from 0.0.
  • To show the deduction itself moves, a scratch copy of the case asserting only wi_standard_deduction gives [5450.] differs from 1350.0 under M7, and passes with the code restored.

CI

Pull request run 41944409704 at a527247897 concluded success: all 36 jobs completed with success, none cancelled or skipped. The body's CI sentence now names this run and head.

Judgment calls

  • The body's other test rows (RI, WV, invariants) were run at ce5880d884 by the previous session. The only commit since then touches a WI test file and a WI reference string, so I didn't rerun them, and the body now says so.

Generated by Claude Code

@DTrim99

DTrim99 commented Nov 7, 2026

Copy link
Copy Markdown
Collaborator

PR Review: Apply the RI, SC, UT, VT, WV and WI rules for a filer who can be claimed as a dependent

Summary

I read each state's statute and the claimed years' forms first, then the code. The PR uses only existing dependency variables, and no variable is reinvented:

  • head_or_spouse_is_dependent_elsewhere_without_filing_exception for IRC 152(b)(1)'s "no dependents" rule;
  • head_or_spouse_is_dependent_elsewhere and claimable_as_dependent_on_another_return where a rule turns on claimability;
  • claimed_as_dependent_on_another_return where a rule turns on an actual claim;
  • exemptions_count, head_spouse_count_not_dependent_elsewhere, cdcc_qualifying_childcare_expenses and standard_deduction_worksheet_earned_income.

Most changed gates match the governing text for the claimed years:

  • the RI same-person claimant and 2021 rebate;
  • SC's dependent exemption and under-six deduction;
  • UT's qualifying dependents, birth-year unit and at-home parent credit;
  • VT's exemptions, CTC, the renter-credit actual-claim bar and exemption-sized (including zero-bedroom) rent;
  • WV's per-person $500 allowance on returns without lawful dependent exemptions;
  • WI's dependent standard-deduction cap on both tax paths, the care expenses and the homestead $500.

CI is 36/36 green at the head. The branch conflicts with current main in one test file.

Two critical items and six should items are open:

  1. Wisconsin's $250 age-65 exemption is now denied to a filer who can be claimed. Wis. Stat. 71.05(23)(b)3 tests only age; the bar comes from the Form 1 instructions alone.
  2. West Virginia's family tax credit now leaves the 11-21-16(d) exemption out of family size and bars zero-exemption returns. 11-21-22a(b) counts every exemption that may be legally claimed and excludes only the surviving-spouse exemption.
  3. Two candidates.yaml items that name this PR are stale, and three readings the PR takes aren't recorded.
  4. All six queued axiom issues pin an October 19 head. Texas TANF earned income exclusion #1811 encodes the opposite WV reading from the head's, and Update law references for CARE and FERA programs #1812 lacks the new WI earned-income measure.
  5. Rhode Island's new filer & term is unpinned. Utah's rewritten ut_total_dependents omits the IRC 24 condition its own comment quotes. One reference title doesn't follow the CLAUDE.md format.

Critical (must fix)

C1. Wisconsin $250 additional exemption: the new claimability bar follows the instructions, not 71.05(23)(b)3 (wi_additional_exemption.py:33-34: eligible_filers = tax_unit.sum(filer & elderly & ~claimable))

  • The statute. Wis. Stat. 71.05(23)(b):
    • 3.: "An additional exemption of $250 if the taxpayer has reached the age of 65 before the close of the taxable year ... and $250 for the taxpayer's spouse if he or she has reached the age of 65". The only condition is age.
      1. conditions the $700 personal exemption on a filing requirement: "A personal exemption of $700 if the taxpayer is required to file a return under s. 71.03 (2) (a) 1. or 2.". It doesn't condition it on claimability.
    • The Legislative Fiscal Bureau's January 2023 informational paper 2, p.11 reads it the same way: "An additional $250 exemption is provided for each taxpayer who has reached the age of 65".
  • The form. 2025 Form 1 instructions, line 10b (PDF p.16): "You may claim the $250 exemption on line 10b ... only if you and/or your spouse are 65 years of age or older and are allowed the $700 exemption on line 10a". Line 10a (p.15) in turn gives 0 to a filer who "can be claimed as a dependent".
  • Why it is critical. Main paid the $250 on age alone, which matches (b)3. The head pays $0 in every claimed year.
    • Reading "additional" to require the (b)1 exemption doesn't save the bar. (b)1 is keyed to the 71.03(2)(a)1 filing requirement, and every filer with Wisconsin tax liability is at or above that threshold, which the department sets so that "no individual in that category whose gross income is below that amount has a state income tax liability".
    • Under CONTRIBUTING.md#source-conflicts the statute governs here, because it isn't silent.
  • Witness: the PR's own case "2025 claimable but unclaimed retiree uses the dependent deduction on the positive retirement exclusion path" (wi_retirement_income_exclusion_tax.yaml:226). The filer is 70 and has $34,000 of income, so is required to file under 71.03(2)(a)1.
    • Head: (34,000 − 24,000 − 4,450 − 0) × 3.5% = $194.25.
    • Statute: (34,000 − 24,000 − 4,450 − 250) × 3.5% = $185.50. This holds the pre-existing $0 line-10a amount (Suggestion 2).
    • The direct case "2025 single filer aged 65 who can be claimed but is not claimed gets no Wisconsin $250 exemption" (wi_additional_exemption.yaml:222) expects 0. Main and the statute give 250.
  • Fix. Drop the ~claimable term, restoring the per-spouse age test. Then update the six claimable cases in wi_additional_exemption.yaml (250/500 instead of 0/250) and the retiree case (185.50).
    • If you read (b)3 differently, record a candidate with these readings and get a ruling before merging. Even then, key any gate to (b)1's filing-requirement condition, not to claimability.
    • Issue Update law references for CARE and FERA programs #1812 needs the same change (S3).

C2. West Virginia family tax credit: family size drops the 11-21-16(d) exemption, and zero-exemption returns are barred, against 11-21-22a(b) (wv_low_income_family_tax_credit_eligible.py:23-24: has_exemption = exemptions_count > 0; wv_low_income_family_tax_credit_fpg.py:24: n = exemptions_count)

  • The statute.

    • W. Va. Code 11-21-22a(b): "'Family size' means the total number of exemptions that may be legally claimed on the West Virginia resident personal income tax return ...: Provided, That family size shall not include the additional exemption that may be claimed by a surviving spouse pursuant to subsection (c), section sixteen".
    • 11-21-16(d): "a resident individual whose exemption amount for federal tax purposes is zero by virtue of section 151(d)(2) ... shall be allowed a single West Virginia exemption in the amount of $500."
    • So a claimable individual may legally claim one West Virginia exemption. 22a(b) excludes only the 16(c) surviving-spouse exemption, not the 16(d) one. Nothing in 22a bars a zero-exemption return.
    • The head's own comment ("A filer who can be claimed as a dependent has no exemption", fpg file) contradicts 16(d)'s words. The PR body's claim that 22a(b) "bars zero-exemption units" isn't in the section.
  • The form. 2025 IT-140, PDF p.13: "Individuals who file their income tax return with zero exemptions cannot claim the credit". Line 5 takes family size as the "sum of boxes a, b, and c", which leaves out the $500 allowance.

  • Why it is critical. Main used tax_unit_size, which gives the statutory family size for the childless claimable returns below. The head turns those into $0, or into a smaller credit, in every claimed year.

    • It is also internally inconsistent. The PR adopts the statute's per-person reading of 16(d) for the exemption amount, then follows the form to exclude that same exemption from family size.
  • Witnesses: the PR's own cases, 2025, $16,000 of wages, at the IT-140 table step its mixed-joint case uses (80% at $350 over FPG):

    Case Head Statute (16(d) exemption counted) Main
    Single claimable filer (wv_low_income_family_tax_credit_eligible.yaml:17) ineligible, $0 size 1, FPG 15,650; tax on 15,500 = 222 + 5,500 × 2.96% = 384.80; 80% = 307.84 eligible, size 1 (272.32 at the old $2,000 exemption)
    Joint, one claimable spouse (line 38/72) size 1, 260.48 size 2, FPG 21,150 ≥ 16,000; 100% of 325.60 = 325.60 size 2
    Joint, both claimable (line 103) ineligible, $0 size 2; tax on 15,000 = 222 + 5,000 × 2.96% = 370; 100% = 370 size 2
  • Fix.

    • Count each claimable filer's 16(d) exemption in family size. For returns without lawful dependent exemptions, that is exemptions_count + claimable filers.
    • Drop the has_exemption bar, since family size can then never be 0.
    • Update the four cases above.
    • If you read 22a(b) differently, record the conflict (statute vs IT-140 p.13) as a candidate and get a ruling before merging. Issue Texas TANF earned income exclusion #1811 needs the same change (S3).

Should address

S1. Two source_conflicts/candidates.yaml items name this PR but describe main

CONTRIBUTING.md#source-conflicts, step 1: "If the backlog already lists the conflict, it updates that item instead." Neither item is touched by the PR.

  • us-vt:renter-credit-zero-exemption-rent has follows: statute and state: ruled, but code: [], and its note says "Code not yet on main: vt_renter_credit". The head implements the reading in vt_renter_credit.py and fair_market_rent.yaml, so list both.
  • us-wv:zero-exemption-return-500-allowance is stale in four fields:
    • follows: conflicting-source and code: [], with years 2025 only. The head follows the statute's per-person reading (follows: statute) in wv_personal_exemption.py and base_personal.yaml, plus the contributed reform and the repeal, in every year: the parameter dates from 1987, and cases run 2021–2026.
    • The note asks to "obtain the exact statutory text". 16(d) reads "a resident individual ... shall be allowed a single West Virginia exemption in the amount of $500", which supports the per-person reading, so the note can be refreshed.
  • Related: us-vt:renter-credit-statewide-average-fmr. It covers fair_market_rent.yaml for 2022–2025 and says the Franklin/Grand Isle values "reproduce the department's credit amounts". The new zero-bedroom rows use a different convention (the unrounded 12-area mean in every year, 2021 included), and no department table exists for zero bedrooms. Extend its years and note, or add a separate item.

S2. Three readings the PR takes are not recorded

  • (a) WV allocation when a claimable filer's dependents add exemptions. On these returns (wv_personal_exemption.py:40-43, ordinary_amount) the head follows the IT-140 count. The PR body calls this "unresolved".
    • 16(d) gives the claimable individual "a single West Virginia exemption in the amount of $500" "notwithstanding any provisions in this section". IT-140 (pp.3, 26) counts box (c) dependents at $2,000 and adds $500 only when box (e) is zero.
    • Witnesses (pinned at wv_personal_exemption.yaml:282):
      • a filing-exception single filer with one child gets $2,000 at the head, $500 under a literal 16(d) and $2,000 on the form (main gave $4,000);
      • a joint return with one claimable spouse, the filing exception and two children gets $6,000 at the head, against $6,500 under the per-person reading.
    • Record it, as its own item or inside the WV item, with state: open unless it's ruled.
  • (b) Wisconsin's earned-income measure for the dependent cap. The head reuses the federal worksheet measure, so the farm case gives 9,743.52 (wi_standard_deduction.yaml:412). That measure counts business and farm income, subtracts the self-employment tax deduction and counts disability wages.
    • The statute isn't silent. 71.05(22)(f)3m uses "earned income, as defined in section 911 (d) (2)". 911(d)(2)(B) limits earned income from a business "in which both personal services and capital are material income-producing factors" to "not in excess of 30 percent of his share of the net profits", and 911(d)(2) has no self-employment-tax subtraction.
    • The Wisconsin worksheet footnote (2025 Form 1 instructions, p.15) says only "wages, salaries, tips, professional fees, and any other compensation received for services you performed". Unlike the federal footnote, it lists no Schedule C/F lines.
    • For a farm where capital is material, earned income would be at most 3,000, so the cap is 3,450, not 9,743.52.
    • The federal item us:dependent-deduction-worksheet-earned-income rests on "Section 63(c)(5) leaves earned income undefined", which isn't true of Wisconsin's statute, and it doesn't list the WI files.
    • The author's own self-review says it could not confirm "that Wisconsin's worksheet line 1 counts farm income and subtracts the SE-tax deduction". Record a us-wi item with these readings, or extend the federal item to the WI code with a Wisconsin-specific basis.
  • (c) Rhode Island same-person claimant against RI-1040H question D.
    • 2025 RI-1040H asks "Were you or your spouse 65 years of age or older and/or disabled". 44-33-3(1) requires the claimant to be "sixty-five (65) years of age or older, and/or disabled" and excludes "any person claimed as a dependent by any taxpayer".
    • The head follows the statute: "2025 joint return where only the claimable spouse is 65 or older" gives $0, where the form's question admits the unclaimed 40-year-old. Main gave $700.
    • The statute-first choice is right, but it should be recorded (follows: statute).

S3. The axiom: line: all six issues pin an old head, and two don't match it

  • Status. rulespec-us#1807 through #1812 are OPEN, labelled pe-parity and dispatch-ready in form, with module paths, verbatim law, required outputs, companion tables and named blockers. But all six pin head 71b1238d02 (October 19) and were last updated on 2026-10-19. The PR's own October 20 and November 3–5 commits changed WV and WI behaviour after that pin.
  • Texas TANF earned income exclusion #1811 (WV) contradicts the head.
    • Its required output 2 says "allow $500 once per return only when all lawful exemptions are zero ... Do not add $500 for each claimable spouse". Its companions list joint one-claimable as $2,000 and both-claimable as $500.
    • The head pins $2,500 and $1,000. So do the PR body and the changelog.
    • Output 3 ("Do not treat the $500 zero-return amount as one lawful exemption for family-size purposes") must also change if C2 is accepted.
  • Update law references for CARE and FERA programs #1812 (WI) doesn't match the head.
    • Its cap uses "earned income included in Wisconsin income after pretax payroll deductions" only. It has none of the head's measure (farm and self-employment income less the SE-tax deduction, disability wages, no dependents' earnings), and none of the new companions (10,450; 9,743.52; the dependent's-own-wages 1,350).
    • Its $250 output ("A claimable but unclaimed age-65 filer is still ineligible") follows the form (C1).
  • TANF (Issue1750) #1807–Create CARE Discount Variable, FERA Program #1810 (RI, SC, UT, VT) match the head's baseline behaviour but need re-pinning to the current head.
  • Fix. Re-pin all six issues to the current head, rewrite Texas TANF earned income exclusion #1811's per-person and family-size outputs and companions, and update Update law references for CARE and FERA programs #1812's earned-income measure, companions and $250 output.

S4. Rhode Island's new filer & term is unpinned (mutation rule) (ri_property_tax_credit_eligible.py:27)

  • What the term does. filer & keeps the unit's own dependents from becoming the claimant. Such a dependent is claimed, by this return, but claimed_as_dependent_on_another_return doesn't record that.
  • Why no test catches its removal.
    • No YAML case has a non-filer member who is 65 or older or disabled.
    • The property-test dependents are aged 0–23 and carry no disability input.
    • So deleting the term fails no test.
  • Witness. 2025: a single RI filer aged 40, not disabled, with $1,000 of real estate tax and a 70-year-old parent who is a tax-unit dependent.
    • Head: no claimant, so ineligible.
    • Without the term: eligible, up to $700.
  • Fix. Add that case, expecting ri_property_tax_credit_eligible: false.

S5. Utah: the rewritten ut_total_dependents omits the IRC 24 condition its comment quotes (ut_total_dependents.py:24)

  • The statute. 59-10-1018(1)(c): "'Qualifying dependent' means an individual with respect to whom the claimant is allowed to claim a tax credit under Section 24". (1)(g) multiplies the exemption by "the number of the claimant's qualifying dependents".
  • The code. The PR replaces adds = ["tax_unit_count_dependents"] with a formula and quotes (1)(c). It applies only 152(b)(1), so a dependent with no §24 credit still counts.
    • For example, a dependent with no taxpayer identification number: ctc_adult_individual_maximum requires has_tin, and the child credit requires an SSN.
    • The PR body lists this gap but leaves it. It sits inside the formula the PR rewrites, and no test covers it.
  • Witness. 2025: a single UT filer nobody can claim, $30,000 of wages, and a dependent child aged 5 with has_tin: false.
    • Head: ut_total_dependents 1, ut_personal_exemption 2,111.
    • Statute: no §24 credit is allowed, so 0.
  • Fix. Count dependents with ctc_individual_maximum > 0, which keeps the existing federal determination and the 152(b)(1) gate. Add the case.

S6. A reference title doesn't follow the CLAUDE.md format (base_personal.yaml:10)

title: 1988 West Virginia H.B. 4472, enacted personal exemptions, pages 9-10 with href: ...#page=9. CLAUDE.md: for several cited pages, "the title ends with #page 72-75 ... Quote the title". Use title: "1988 West Virginia H.B. 4472, enacted personal exemptions #page 9-10". The pages do corroborate: p.10 carries "(d) Certain dependents.-Notwithstanding any provi-".

Suggestions

  1. VT renter credit: rent paid and proration. The PR body notes that vt_renter_credit never checks that the unit rented its homestead, and doesn't prorate by months rented. 6066(b)(1): "An eligible claimant who rented the homestead". The new claimant gate sits next to that condition. Open an issue so the follow-up isn't lost.
  2. WI $700 own exemption (pre-existing). 71.05(23)(b)1 keys the $700 to the 71.03(2)(a)1/2 filing requirement. wi_exemption, through the federal exemptions_count, follows line 10a's claimability rule instead. The PR doesn't change this, but C1's comment leans on it. Record it as a candidate.
  3. VT income-limit sizing. The resident tax-unit count for HUD income limits is an agency gap-fill. Refactor SNAP emergency allotment to decompose accurately in the app #1678 pursues exemption-sized limits, and the PR's $62,000 witness gives $270 against $0. Record the reading so the register reflects the disagreement.
  4. Filing-exception pins. Neither ut_personal_exemption_additional_dependent_eligible (a newborn plus dependent_claimant_filing_exception: true) nor the UT contributed reform has a filing-exception case. Swapping in the ordinary helper passes every test. Add one case each.
  5. CLAUDE.md "Test design and CI cost". The new property file builds simulations for 6 states × 4 years in the Rest core group. The body gives local wall time for one YAML file only. Report that shard's elapsed time and peak RSS from run 41944409704, or say they're unavailable.
  6. WV duplication. The claimable-filer count and the $500 allowance logic are written three times: baseline, contributed reform and repeal. A shared helper would keep them from drifting, especially once C2 and S2(a) are settled.

Verified correct

The law, read first.

  • RI.
    • 44-33-3(1): the claimant is aged 65 or older or disabled, and "shall not mean or include any person claimed as a dependent by any taxpayer". Also: "When two (2) individuals of a household are able to meet the qualifications for a claimant, they may determine between themselves as to who the claimant is." The same-person test and the actual-claim bar match.
    • 44-30-103: $250 "for each child, up to a maximum of three children, whom the eligible taxpayer validly claims as a dependent". The 152(b)(1) gate with the filing exception matches.
  • SC. 12-6-1140(13) requires dependents to meet "the eligibility requirements of Section 151 and 152" as of January 1, 2017. 12-6-1160 requires a "dependent eligible for the South Carolina dependent exemption". Both gates match.
  • UT.
    • 59-10-1018(1)(g): the personal exemption is per qualifying dependent, "plus an additional qualifying dependent in the year of a qualifying dependent's birth".
    • 59-10-1005(1)(a)(ii): the parent "claims the qualifying child as a dependent".
    • The 152(b)(1) gates match, apart from S5.
  • VT.
    • 5811(21)(C) gives an exemption "for each individual qualifying as a dependent of the taxpayer under 26 U.S.C. § 152, provided that no exemption may be claimed for an individual who is a dependent of another taxpayer".
    • 5830f(a) requires entitlement to the federal child credit, waiving only the TIN rules, "per qualifying child, as defined under 26 U.S.C. § 152(c)".
    • 6066(b)(2) uses "the fair market rent corresponding to a number of bedrooms equal to the number of personal exemptions allowed under subdivision 5811(21)(C)". (c)(2): the claimant "may not be a person claimed as a dependent by any taxpayer".
    • Zero bedrooms for zero exemptions follows the statute over the calculators, as ruled.
  • WV. 16(d)'s "a resident individual ... shall be allowed a single West Virginia exemption" supports $500 per claimable person on returns without lawful dependent exemptions. The IT-140, p.3 once-per-return rule ("If box e is zero, enter $500") is the conflicting source. The amount change is right; see C2 and S2(a) for the rest.
  • WI.
    • 71.05(22)(f)1m applies "in the case of a taxpayer with respect to whom an exemption under sub. (23)(b)2. is allowable to another person". That is claimability, so head_or_spouse_is_dependent_elsewhere is the right helper.
    • The lesser of the ordinary deduction and the greater of $500 or earned income plus $250, indexed like the federal amounts. The 2025 worksheet shows $1,350 and $450.
    • Applying the cap to the retirement-exclusion path is right.
    • Care expenses under IRC 21(b)(2) and the homestead $500 for 152 dependents match.

The code.

  • Mutation rule. Removing any of these gates fails a YAML case:
    • RI: the claimant and rebate gates;
    • SC: both gates, with filing-exception controls;
    • UT: total dependents, the birth-year unit and the at-home credit;
    • VT: the CTC dependent term (the non-dependent sibling case), exemptions, the renter-credit claimant gate and the zero-bedroom rows;
    • WV: the exemption and LIFTC gates;
    • WI: the cap on both paths, the care expenses, the homestead and $250 gates, and the dependent's own wages;
    • all five contributed reforms and the RI/WI/WV repeal overrides.
    • The VT county_str fallback is exercised by the multi-state property test. Exceptions: S4 and Suggestion 4.
  • Construction.
    • Vectorization is sound (where, tax_unit.sum/any, person.tax_unit, clip). Entities and periods are correct.
    • No new state-gated int or enum key: the renter credit indexes by the federal exemptions_count (clipped to 0–8) and a VT-defaulted county string. So the NH Add New Hampshire state supplementation for 2026 #10156 pattern doesn't arise.
  • Hand-checks (22).
    • RI property: min(1,000 − 0, 700) = 700 (2025 maximum $700). RI rebate: min(1, 3) × 250 = 250.
    • SC: 1 × 4,930 = 4,930.
    • UT: (1 + 1) × 2,111 = 4,222; 1 × 2,111 = 2,111; at-home 1 × 100 = 100.
    • VT exemptions: 3 × 5,300 = 15,900; 1 × 5,300 = 5,300.
    • VT renter credit:
      • one exemption: 1,476 × 12 × 10% = 1,771.2, so 1,771;
      • two exemptions: 1,936 × 1.2 = 2,323.2, so 2,323;
      • zero exemptions: 1,380 × 1.2 = 1,656;
      • 2021 Chittenden: 1,091 × 1.2 = 1,309.2, so 1,309;
      • 2024 Chittenden: 1,341 × 1.2 = 1,609.2, so 1,609;
      • Franklin 2025: 12,092 / 12 = 1,007.67, × 1.2 = 1,209;
      • Franklin 2021: 8,833 / 12 = 736.08, so 883;
      • Franklin 2022: 9,192 / 12 = 766, so 919.
    • WV: 2,000 + 500 = 2,500; 2 × 500 = 1,000. LIFTC: 13,500 gives 222 + 103.60 = 325.60, × 80% = 260.48; 12,000 gives 281.20 (as built).
    • WI deduction:
      • 2025 farm: SE deduction 10,000 × 0.9235 × 0.153 / 2 = 706.48, so 9,293.52 + 450 = 9,743.52. That is below 13,560 − 0.12 × (29,293.52 − 19,550) = 12,390.78.
      • Disability: min(12,306, 10,450) = 10,450.
      • 401(k): 5,000 + 450 = 5,450, so taxable income is 15,000 − 5,450 = 9,550.
      • 2021: max(1,100, 950) = 1,100. 2023: max(1,250, 3,400) = 3,400.
    • WI homestead: (1,000 − 1,940 × 8.785%) × 80% = 663.6568; (1,000 − 1,440 × 8.785%) × 80% = 698.7968.
    • WI care: 1,000 × 20% × 1 = 200; 3,000 × 20% = 600; the 2021 subtraction 1,000 and 3,000.
  • References. These show the cited text:
    • IT-140 pp.3, 13 and 26;
    • WI Form 1 instructions pp.15–16;
    • Pub 907 (2025), p.3: "payments as wages on line 1h ... until you reach minimum retirement age";
    • 1988 H.B. 4472 pp.9–10.
    • The HUD FY2025 Burlington efficiency FMR of $1,380 is confirmed in HUD's FY2025 HOME rent table. I couldn't fetch HUD's FMR schedule PDFs to check the other zero-bedroom cells. The Franklin/Grand Isle means reproduce exactly from the listed area values.
  • The author's self-review.
    • Its CI claim holds, and so do its arithmetic and its overlap list.
    • No partner-contract or .github file is touched.
    • Its caveat that it couldn't confirm the WI worksheet's farm treatment is borne out (S2(b)).
  • Housekeeping.
    • The changelog changelog.d/claimable-filer-ri-sc-ut-vt-wv-wi.fixed.md is top-level.
    • Tests are in variable-named files.
    • The RI split keeps the reform-combo budget.
    • The PR adds no conflict-sounding comments to any scanned file, so the source-conflict ratchet is unaffected on the merged tree.

Axiom line assessment

The line lists six queued issues:

CI status

gh pr checks 10044 at head a527247897: 36 of 36 pass, all in run 41944409704. That covers every Baseline and Contrib shard, all Rest Python shards (including the new property file and the reform-combo budget), Microsimulation, Household API Partners and PR validation. Nothing fails or is pending.

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: 2 critical (WI age-65 $250 exemption barred for claimable filers against 71.05(23)(b)3; WV family tax credit family size drops the 11-21-16(d) exemption and bars zero-exemption returns against 11-21-22a(b) — both turn main's correct results wrong), 6 should, 6 suggestions.

This branch has not been deployed

No deployments
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