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 64 commits into
mainfrom
claimable-filer-ri-sc-ut-vt-wv-wi
Open

MaxGhenis wants to merge 64 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. West Virginia allows $500 per claimable filer on a return whose dependents add no exemption, and counts that exemption in the family tax credit's family size.

A shared helper, wv_claimable_filer_exemptions_count, holds that count for the baseline exemption, the contributed reform and the family size. The repeal override counts every claimable filer, since it repeals the dependent exemptions. Returns whose dependents add exemptions keep the IT-140 count, pending a ruling.

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, and a dependent of the return is claimed by it. 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 A qualifying dependent is one for whom the claimant is allowed an IRC 24 credit (59-10-1018(1)(c)). ut_qualifying_dependent tests ctc_individual_maximum > 0, which keeps the DTT and filing exception; the total, birth-year unit and reform read it. 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, 11-21-16(d) gives $500/$2,000 per claimable/nonclaimable filer. The family tax credit's family size counts each 16(d) exemption, and a return the IT-140 treats as having none may claim it (11-21-22a(b)).
WI When either filer is claimable, both deduction paths use min(ordinary deduction, max($1,350, earned income + $450)) in 2025. Earned income comes 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 keeps main's age-only test (71.05(23)(b)3). 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

A reading with an id in brackets is recorded in source_conflicts/candidates.yaml under that id.

Item What changed or was kept, and why
WV $500 personal exemption [us-wv:zero-exemption-return-500-allowance] Returns with no lawful dependent exemptions follow 11-21-16(d), which allows "a single West Virginia exemption in the amount of $500" to each claimable individual. A claimable single gets $500; one/both claimable spouses get $2,500/$1,000. A child who adds no exemption leaves the per-filer $500 alone. This replaces the IT-140 p.3 once-per-return fallback in baseline, reform and repeal. Values date from 1987 (1988 H.B.4472 pp.9–10).
WV returns whose dependents add exemptions [us-wv:claimable-filer-exemption-with-dependents, open] Kept the IT-140 count as built, pending a ruling. A filing-exception single filer with one child gets $2,000; a literal 16(d) reading gives $500 and a per-person reading $2,500. Joint, one claimable spouse, two children: $6,000 as built, $6,500 per person.
WV family tax credit family size [us-wv:family-tax-credit-claimable-filer-family-size, open] Changed to follow 11-21-22a(b): family size is "the total number of exemptions that may be legally claimed", leaving out only the 16(c) surviving spouse exemption. It now counts each 16(d) exemption, and the IT-140 p.13 zero-exemption bar is gone. 2025, $16,000 of wages: single claimable $307.84 (was $0); joint one claimable $325.60 (was $260.48); joint both claimable $370 (was $0).
WI $250 age-65 exemption [us-wi:age-65-exemption-claimable-filer, open] Restored main's age-only test under 71.05(23)(b)3, which allows $250 if the taxpayer "has reached the age of 65", with no claimability condition. Form 1 line 10b would also require the line 10a $700 exemption. The claimable retiree witness owes $185.50, not $194.25.
WI $700 personal exemption [us-wi:personal-exemption-claimable-filer, open] Unchanged and pre-existing. 71.05(23)(b)1 keys the $700 to the 71.03(2)(a) filing requirement; wi_base_exemption follows line 10a's claimability rule through the federal exemptions_count.
WI earned income [us-wi:dependent-standard-deduction-earned-income, open] Reuses the federal worksheet's earned income (standard_deduction_worksheet_earned_income) on both deduction paths, pending a ruling. 71.05(22)(f)3m uses earned income "as defined in section 911 (d) (2)", which caps a capital-intensive business at 30 percent of net profits. 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 (at most $3,450 under 911(d)(2) if capital is material). A dependent child's own $5,000 of wages leaves the filer's deduction at $1,350.
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.
RI same-person claimant [us-ri:property-tax-relief-claimant-same-person, open] Kept the statute over RI-1040H question D: one person must be aged or disabled and not claimed. A joint return where only the claimed spouse is 65 gets $0 (main gave $700).
UT qualifying dependents Changed to follow 59-10-1018(1)(c): count only dependents for whom an IRC 24 credit is allowed. A 2025 child with no SSN and no TIN adds nothing; a child with an ITIN adds $2,111 through the credit for other dependents.
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 [us-vt:renter-credit-income-limit-household-size, open] Kept: DOR guidance sizes the limits by "the number of family members who live with you"; 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.
VT renter, zero exemptions [us-vt:renter-credit-zero-exemption-rent, ruled] 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 [us-vt:renter-credit-statewide-average-fmr] 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.

Three earlier hub rulings remain as built: NIIT/QBI/HSA/education; HI/NY/MA/KS; NM medical/WV senior-disability. The last one'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)

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. 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.

In CI run 41944409704, the property file ran in Rest Python shard 4 (rest-python-core-2). Its five tests took 27.1 s of the shard's 1,179.3 s of test time. The shard's process took 20:34 of wall time and 6.44 GiB of peak RSS for all 32 files, so the file's own memory isn't separable there. Locally (Linux VM, not CI) the file alone took 123.2 s with imports and 2,252 MB of peak RSS.

Validation and merge

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

Merge commit 3db73a90b8 imports origin/main at ba9bfdea75 with a merge commit; no rebase or history rewrite was performed. It resolves two conflicts and keeps both sides. repeal_state_dependent_exemptions.yaml keeps this PR's WV/WI/RI cases and main's three California cases from #10053. vt_renter_credit.py keeps main's #10725 rent test, size cap and safe_county, and indexes the fair market rent by exemptions and safe_county.

The 16 claimable-filer RI reform pairs 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), at this head:

Test file Result
policy/baseline/gov/states/wi/tax/income/wi_additional_exemption.yaml 13 passed
policy/baseline/gov/states/wi/tax/income/wi_retirement_income_exclusion_tax.yaml 11 passed
policy/baseline/gov/states/wi/tax/income/wi_exemption.yaml 2 passed
policy/baseline/gov/states/wv/tax/income/credits/liftc/wv_low_income_family_tax_credit_eligible.yaml 8 passed
policy/baseline/gov/states/wv/tax/income/credits/liftc/wv_low_income_family_tax_credit.yaml 5 passed
policy/baseline/gov/states/wv/tax/income/credits/liftc/wv_low_income_family_tax_credit_fpg.yaml 4 passed
policy/baseline/gov/states/wv/tax/income/credits/liftc/integration.yaml 1 passed
policy/baseline/gov/states/wv/tax/income/exemptions/wv_personal_exemption.yaml 18 passed
policy/baseline/gov/states/wv/tax/income/wv_taxable_income.yaml 3 passed
policy/contrib/states/wv/dependent_exemption_reform_test.yaml 21 passed
policy/contrib/state_dependent_exemptions/repeal_state_dependent_exemptions.yaml 43 passed
policy/baseline/gov/states/ut/tax/income/credits/ut_total_dependents.yaml 8 passed
policy/baseline/gov/states/ut/tax/income/credits/ut_personal_exemption_additional_dependent_eligible.yaml 5 passed
policy/baseline/gov/states/ut/tax/income/credits/ut_personal_exemption.yaml 9 passed
policy/baseline/gov/states/ut/tax/income/credits/ut_taxpayer_credit.yaml 1 passed
policy/contrib/states/ut/dependent_exemption/ut_dependent_exemption.yaml 12 passed
policy/baseline/gov/states/ri/tax/income/credits/property_tax/ri_property_tax_credit_eligible.yaml 17 passed
policy/baseline/gov/states/vt/tax/income/credits/rent/vt_renter_credit.yaml 46 passed
core/test_claimable_filer_ri_sc_ut_vt_wv_wi_invariants.py 5 passed
code_health/test_source_conflicts.py 103 passed
code_health/test_reference_urls.py 32 passed
code_health/test_no_concatenated_reference_urls.py 48 passed
code_health/test_known_dead_reference_urls.py 40 passed
code_health/test_no_group_variables_in_person_adds.py 10 passed
code_health/test_parameter_yaml_keys.py 34 passed

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

Pull request run 42651314431 at 586e460dd1: at hand-off, 35 of 36 jobs had passed and none was skipped or cancelled. Contrib other-shard-1 was still running.

impact: pending a comparison at the final head.

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 with 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>
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.

MaxGhenis added a commit that referenced this pull request Nov 9, 2026
vt_renter_credit had no renter test, so it gave every low-income Vermont tax
unit a credit based on fair market rent, homeowners included. Only the TAXSIM
comparison read the amount until this branch counted the credit in benefits.
The AABD integration case then showed the result: $1,324 more in
household_state_benefits for a person who pays no rent.

32 V.S.A. 6066(b)(1) gives the credit to "an eligible claimant who rented the
homestead", and 6066(c)(3) requires at least six calendar months of renting.
vt_renter_credit_eligible applies the rent test. PE-US has no months-rented
input, so rent paid stands in for the six-month test.

PE-US #10044 adds the 6066(c)(2) dependent bar with its joint-return reading,
so this commit leaves that bar to it.

The YAML cases and department-table tests set rent to 0 while checking the
credit amount. They now set rent, and new cases and properties cover a tax
unit that pays no rent and a tenant whose subsidy covers all the rent.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
MaxGhenis added a commit that referenced this pull request Nov 9, 2026
vt_renter_credit had no renter test, so it gave every low-income Vermont tax
unit a credit based on fair market rent, homeowners included. Only the TAXSIM
comparison read the amount until this branch counted the credit in benefits.
The AABD integration case then showed the result: $1,324 more in
household_state_benefits for a person who pays no rent.

32 V.S.A. 6066(b)(1) gives the credit to "an eligible claimant who rented the
homestead", and 6066(c)(3) requires at least six calendar months of renting.
vt_renter_credit_eligible applies the rent test. PE-US has no months-rented
input, so rent paid stands in for the six-month test.

PE-US #10044 adds the 6066(c)(2) dependent bar with its joint-return reading,
so this commit leaves that bar to it.

The YAML cases and department-table tests set rent to 0 while checking the
credit amount. They now set rent, and new cases and properties cover a tax
unit that pays no rent and a tenant whose subsidy covers all the rent.

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

Copy link
Copy Markdown
Contributor Author

#10725 adds a rent test (vt_renter_credit_eligible) and safe_county to vt_renter_credit. On rebase, keep both and index fair_market_rent on exemptions and safe_county. This PR's Vermont renter credit cases also need rent above zero.

@MaxGhenis

MaxGhenis commented Nov 9, 2026 •

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

GitHub reported the branch as conflicting with main. Both conflicts keep
both sides:

- repeal_state_dependent_exemptions.yaml: main's three California repeal
  cases from #10053 follow this branch's WV, WI and RI cases.
- vt_renter_credit.py: main's #10725 added the rent test, the household
  size cap and safe_county. The fair market rent now indexes on this
  branch's exemption count and main's safe_county, while the income
  limits keep main's capped size.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Wis. Stat. 71.05(23)(b)3 allows $250 for a taxpayer, and for a spouse,
who has reached age 65, with no other condition. The Form 1 instructions
also require the line 10a $700 exemption, which they deny to a filer who
can be claimed. Under the statute-first rule the statute governs, so the
claimability bar goes and each aged filer counts again, as on main.

The claimable cases now expect 250 per aged filer, and the retiree on the
positive retirement-exclusion path owes $185.50 instead of $194.25.

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

W. Va. Code 11-21-22a(b) sets family size to "the total number of
exemptions that may be legally claimed", leaving out only the 16(c)
surviving spouse exemption. 16(d) calls the claimable filer's $500
"a single West Virginia exemption", so it counts. Nothing in 22a bars a
return the IT-140 treats as having zero exemptions, so that bar goes.

A new wv_claimable_filer_exemptions_count holds the number of 16(d)
exemptions on a return whose dependents add none. The baseline exemption,
the contributed reform and the family size now share it, so the three
cannot drift apart. The repeal keeps its own count, since it repeals the
dependent exemptions. The zero-exemption $500 fallback stays in both
exemption formulas.

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

Utah Code 59-10-1018(1)(c) defines a qualifying dependent as one "with
respect to whom the claimant is allowed to claim a tax credit under
Section 24". The rewritten count applied only IRC 152(b)(1), so a
dependent with no child or other-dependent credit still counted.

ut_qualifying_dependent now tests ctc_individual_maximum > 0, which keeps
the federal identification rules and the 152(b)(1) gate with its filing
exception. The total, the birth-year unit and the contributed reform all
read it.

New cases pin a child with no SSN and no TIN (no credit, so $0), a child
with an ITIN (the $500 credit for other dependents, so $2,111), and the
filing exception for the newborn unit and the reform.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
44-33-3(1) excludes "any person claimed as a dependent by any taxpayer"
from the claimant, and a dependent of the return is claimed by it. No case
had an aged or disabled dependent, so deleting the filer term failed no
test. A 40-year-old filer with a 70-year-old dependent parent now expects
no claimant.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
CLAUDE.md asks that a multi-page reference title end with "#page 9-10" and
be quoted, with the href opening the first page.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Two items named this PR but described main. The Vermont zero-exemption
rent item now lists vt_renter_credit.py and fair_market_rent.yaml, and the
West Virginia $500 item now follows the statute in every year since 1987
and lists the baseline, reform and repeal files. The statewide-average
item now covers the 2021-2025 zero-bedroom rows.

New open items record the Wisconsin $250 and $700 exemptions, Wisconsin's
earned-income measure, the West Virginia family size and allocation
questions, Rhode Island's same-person claimant, and Vermont's income-limit
household size.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The fragment no longer lists the Wisconsin $250 exemption, which keeps
main's age-only test. It now names the West Virginia family size change
and the Utah qualifying-dependent test, and splits long sentences.

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

Copy link
Copy Markdown
Contributor Author

Ready for hub review

Head: 586e460dd1c87bd817b2fcde4ee53afad0f802fc

Built on a527247897, the head the item named. No other commit landed on the branch while I worked.

1. Main

  • Merge. 3db73a90b8 merges origin/main at ba9bfdea75 with a merge commit; no rebase or force-push. GitHub's conflict was real, and main had moved on, so there were two conflicts. Both keep both sides:
  • The note's rent point already held. Every case this PR adds to vt_renter_credit.yaml already sets rent above zero (12,000, or 6,000 per spouse), so no input changed. The property test's adults draw rent too.
  • Main's tests on the merged head (3db73a90b8, before any fix), one process each:

2. Findings

I reproduced each finding before changing code. Every statute quoted below I read in this session. docs.legis.wisconsin.gov returned 503s and connection resets throughout, so I read Wis. Stat. 71.05 on a LawServer copy; its (23)(b) and (22)(f) text matches the review's quotes.

C1, Wisconsin $250 age-65 exemption: FIXED (policyengine_us/variables/gov/states/wi/tax/income/exemptions/wi_additional_exemption.py:29-33).

  • Reproduced at the merged head: a claimable, unclaimed single filer aged 65 got $0, and the retiree witness owed $194.25 with wi_exemption $0.
  • 71.05(23)(b)3 allows $250 "if the taxpayer has reached the age of 65 before the close of the taxable year", and $250 for a spouse who has. Age is the only condition. Form 1 line 10b adds "are allowed the $700 exemption on line 10a" (2025 instructions, PDF p.16). The statute governs, so the ~claimable term is gone and the formula is main's per-filer age test again.
  • Cases: the nine claimable cases in wi_additional_exemption.yaml (lines 57-291) now expect $250 per aged filer and carry statute names. The retiree case (wi_retirement_income_exclusion_tax.yaml:228) now expects wi_exemption 250 and tax (34,000 − 24,000 − 4,450 − 250) × 3.5% = $185.50.

C2, West Virginia family tax credit: FIXED (.../wv/tax/income/credits/liftc/wv_low_income_family_tax_credit_fpg.py:23-30, .../wv_low_income_family_tax_credit_eligible.py:18-23, new .../wv/tax/income/exemptions/wv_claimable_filer_exemptions_count.py:21-38).

  • Reproduced at the merged head: single claimable, ineligible and $0; joint with one claimable spouse, FPG $15,650 and $260.48; joint with both claimable, ineligible and $0.
  • 11-21-22a(b): family size is "the total number of exemptions that may be legally claimed" on the return, and the only exclusion is "the additional exemption that may be claimed by a surviving spouse pursuant to subsection (c)". 11-21-16(d) calls the claimable individual's $500 "a single West Virginia exemption". 22a(e) lists no exemption minimum. IT-140 2025 p.13 says "Individuals who file their income tax return with zero exemptions cannot claim the credit" and takes family size from boxes a, b and c.
  • Family size is now exemptions_count + wv_claimable_filer_exemptions_count, and the zero-exemption bar is gone. Since every return then has a family size of at least 1, eligibility is the AMT test alone.
  • Hand values (2025, $16,000 of wages; tax 2.22% to $10,000, then 2.96%):
    • single claimable: family size 1, FPG $15,650; tax on $15,500 = 222 + 5,500 × 2.96% = $384.80; $350 over the FPG gives 80%: $307.84;
    • joint, one claimable spouse: family size 2, FPG $21,150 ≥ $16,000; tax on $13,500 = $325.60; 100%: $325.60;
    • joint, both claimable: family size 2; tax on $15,000 = 222 + 5,000 × 2.96% = $370; 100%: $370.
  • Cases: wv_low_income_family_tax_credit_eligible.yaml lines 17, 44, 79 and 110 carry these values, and line 175 adds a filing-exception single filer with one child. That return keeps the IT-140 count (family size 1, exemption $2,000, tax $340.40, credit $272.32), which pins the open allocation question below.

S1, stale candidates: FIXED (source_conflicts/candidates.yaml).

  • us-vt:renter-credit-zero-exemption-rent (line 11315) lists vt_renter_credit.py and fair_market_rent.yaml and drops "Code not yet on main".
  • us-wv:zero-exemption-return-500-allowance (line 12135): follows: statute, years from 1987 with no end, the code files (helper, baseline, base_personal.yaml, reform, repeal), the 16(d) quote, and a refreshed note.
  • us-vt:renter-credit-statewide-average-fmr (line 11279): years now 2021-2025, the zero-bedroom convention added to the note and example, and this PR added to prs.

S2, unrecorded readings: FIXED as three new items, all state: open.

  • (a) us-wv:claimable-filer-exemption-with-dependents (line 11845), follows: conflicting-source.
  • (b) us-wi:dependent-standard-deduction-earned-income (line 11543), follows: conflicting-source. I read IRC 911(d)(2)(B) ("not in excess of 30 percent of his share of the net profits") and the Wisconsin footnote (p.15). I chose a Wisconsin item over extending the federal one, since the federal item's basis (63(c)(5) is silent) doesn't hold here.
  • (c) us-ri:property-tax-relief-claimant-same-person (line 9347), follows: statute. I read 44-33-3(1) and the 2025 RI-1040H question D.

S3, axiom issues: DRAFTED below; I didn't edit any issue. The body's axiom: line is unchanged.

S4, Rhode Island filer & term: FIXED with the review's case (ri_property_tax_credit_eligible.yaml:381): a 40-year-old filer with $1,000 of real estate tax and a 70-year-old dependent parent has no claimant, so ri_property_tax_credit_eligible is false and the credit $0. Deleting the term now fails it (M8).

S5, Utah IRC 24 condition: FIXED, with a different witness.

  • The review's witness doesn't isolate the gap: a 5-year-old with only has_tin: false still gets ctc_child_individual_maximum $2,200, because the child-credit SSN test reads ssn_card_type. With ssn_card_type: NONE added, the merged head gave ut_total_dependents 1 and ut_personal_exemption $2,111.
  • 59-10-1018(1)(c): a qualifying dependent is one "with respect to whom the claimant is allowed to claim a tax credit under Section 24". New ut_qualifying_dependent (.../ut/tax/income/credits/taxpayer_credit/ut_qualifying_dependent.py:24) tests ctc_individual_maximum > 0, as the review suggested. That keeps the identification rules and the 152(b)(1) gate with its filing exception.
  • ut_total_dependents.py:19, ut_personal_exemption_additional_dependent_eligible.py:21 and the contributed reform (ut_dependent_exemption_reform.py:40) read it. (1)(g)'s birth-year unit is "an additional qualifying dependent", so it takes the same test.
  • Cases: ut_total_dependents.yaml:168 (no SSN, no TIN: 0 and $0) and :196 (ITIN: the $500 credit for other dependents, so 1 and $2,111); ut_personal_exemption_additional_dependent_eligible.yaml:55 (a newborn with neither: $0); ut_dependent_exemption.yaml:317 (the reform counts none).

S6, reference title: FIXED (policyengine_us/parameters/gov/states/wv/tax/income/exemptions/base_personal.yaml:10): "1988 West Virginia H.B. 4472, enacted personal exemptions #page 9-10". I fetched the bill; page 10 carries "(d) Certain dependents.-Notwithstanding any provi-".

Suggestions.

  1. VT rent paid and proration: Count property tax and rent refunds paid outside the income tax in household and SPM benefits #10725 added the rent test on main, and this merge keeps it. Proration by months rented remains; the follow-up is proposed below (I open no issues).
  2. WI $700 exemption: recorded as us-wi:personal-exemption-claimable-filer (line 11752), follows: conflicting-source, open. The code is unchanged.
  3. VT income-limit sizing: recorded as us-vt:renter-credit-income-limit-household-size (line 11248), follows: gap-fill, open. The department's page sizes the limits by "the number of family members who live with you".
  4. Filing-exception pins: added ut_personal_exemption_additional_dependent_eligible.yaml:28 (newborn, (1 + 1) × $2,111 = $4,222) and ut_dependent_exemption.yaml:290 (reform, $3,000). Swapping in the ordinary helper now fails each (M6, M7).
  5. CI cost: in run 41944409704 the property file ran in Rest Python shard 4 (rest-python-core-2, 32 files). Its five tests took 27.1 s of the shard's 1,179.3 s of test time (19.2 s for the Hypothesis test, about 2 s per seeded year). The shard took 20:34 of wall time and 6,750,744 KB (6.44 GiB) of peak RSS; per-file memory isn't separable there. Locally (this VM, not CI) the file alone took 123.2 s with imports and 2,252 MB of peak RSS. The body now says so.
  6. WV duplication: done for the baseline, the contributed reform and the new family size, which now share wv_claimable_filer_exemptions_count. The repeal keeps its own count on purpose: it repeals dependent exemptions, so every claimable filer gets $500 there, while the helper gives none when dependents add exemptions. Both exemption formulas keep the $500 for a return with no exemption at all (tax_unit_size: 0), which main's "Zero tax unit counts" case pins.

3. Rulings for the hub

Each call applies CONTRIBUTING.md#source-conflicts and has a candidates.yaml item. Please confirm each before the PR lands.

  1. WI $250 age-65 exemption (us-wi:age-65-exemption-claimable-filer). Read: Wis. Stat. 71.05(23)(b)3 (LawServer copy) and 2025 Form 1 instructions pp.15-16. Call: statute first. (b)3 tests only age, so a claimable filer aged 65 gets $250, as on main. This reverses the PR body's reading ("requires an own exemption (p.16)") and the hub's 2026-10-10 note, which asked this gate to read claimability.
  2. WV family tax credit family size (us-wv:family-tax-credit-claimable-filer-family-size). Read: W. Va. Code 11-21-22a, 11-21-16 and IT-140 2025 pp.3, 13 and 26. Call: statute first. Family size counts each 16(d) exemption, and no zero-exemption bar applies. This reverses the PR body's reading that 22a(b) and IT-140 bar zero-exemption units.
  3. WV returns whose dependents add exemptions (us-wv:claimable-filer-exemption-with-dependents). Read: 11-21-16(a), (d) and IT-140 pp.3, 26. Call needed. The text supports two statutory readings: $500 for the claimable individual's whole return ("notwithstanding any provisions in this section ... a single West Virginia exemption"), or $500 plus the dependents' $2,000 each. IT-140 gives neither; it gives $2,000 per dependent and no $500. The statute-first rule calls for a change, but to which reading is the hub's choice. Until then I kept the IT-140 count, and two YAML cases pin it.
  4. WI earned income for the dependent limit (us-wi:dependent-standard-deduction-earned-income). Read: 71.05(22)(f)1m-3m (LawServer copy), IRC 911(d)(2) (Cornell LII) and 2025 Form 1 instructions p.15. Call needed. 911(d)(2) caps a business in which capital is material at 30 percent of net profits and subtracts no self-employment tax, so the statute-first rule points away from the worksheet measure. But 911(d)(2)(B) needs a "reasonable allowance as compensation", which the model has no input for. The worksheet measure is also the taxpayer's cheaper choice. I kept it as built.
  5. RI same-person claimant (us-ri:property-tax-relief-claimant-same-person). Read: R.I. Gen. Laws 44-33-3(1) and 2025 RI-1040H question D. Call: statute first, as built. No reversal.
  6. WI $700 exemption (us-wi:personal-exemption-claimable-filer, pre-existing). Read: 71.05(23)(b)1 and line 10a. The statute keys the $700 to the 71.03(2)(a) filing requirement, so statute first would allow it to a claimable filer who must file. I didn't change it: the code predates this PR, and the change reaches every claimable Wisconsin filer. Follow-up proposed below.
  7. VT income-limit sizing (us-vt:renter-credit-income-limit-household-size). Read: 32 V.S.A. 6061(19)-(20), 6066 and the department's Renter Credit page. Call: gap-fill. The statute adopts HUD's limits without saying whose family size counts, so the agency's resident-member count breaks the tie. As built.
  8. Record changes, not reversals: us-wv:zero-exemption-return-500-allowance moves from follows: conflicting-source to statute, reflecting this PR's code; its state: ruled stands. The statewide-average FMR item now covers 2021.

4. Axiom line

The body's axiom: line is unchanged until the hub replaces it.

S3 drafts for the hub to file on rulespec-us

I can't read rulespec-us from this session, so these drafts rest on the review's description of each issue. Each re-pins to 586e460dd1c87bd817b2fcde4ee53afad0f802fc. Paste the comment, or fold it into the issue body.

#1807 (RI) comment:

Re-pin to policyengine-us#10044 head 586e460dd1. The required outputs stand. Add a companion for the same-person claimant (R.I. Gen. Laws 44-33-3(1): the claimant "shall not mean or include any person claimed as a dependent by any taxpayer"):

  • 2025, single filer aged 40, not disabled, $1,000 of real estate tax, with a 70-year-old parent who is a dependent of the return: no claimant, so no property tax relief ($0).
  • 2025 joint return where only the claimed spouse is 65 and the other is 40 and not disabled: $0 (the RI-1040H question D would admit it; PolicyEngine follows the statute).

#1808 (SC) comment:

Re-pin to policyengine-us#10044 head 586e460dd1. No output or companion changes since 71b1238d02.

#1809 (UT) comment:

Re-pin to policyengine-us#10044 head 586e460dd1. Add an output. A qualifying dependent under 59-10-1018(1)(c) is one "with respect to whom the claimant is allowed to claim a tax credit under Section 24". So a dependent with neither the child tax credit nor the credit for other dependents doesn't count. The birth-year unit in (1)(g) counts only a qualifying dependent too. Companions (2025, single filer with $30,000 of wages, $2,111 per qualifying dependent):

  • child aged 5 with no SSN and no TIN: 0 qualifying dependents, $0 exemption;
  • child aged 5 with an ITIN and no SSN: 1 qualifying dependent through the credit for other dependents, $2,111;
  • newborn with no SSN and no TIN: no birth-year dependent, $0;
  • filer aged 22 who can be claimed, whose would-be claimant meets the filing exception, with a newborn: (1 + 1) x $2,111 = $4,222.

#1810 (VT) comment:

Re-pin to policyengine-us#10044 head 586e460dd1. No output changes. Since policyengine-us#10725, the renter credit also needs rent paid (vt_renter_credit_eligible, 6066(b)(1) and (c)(3)), so every renter companion assumes rent above zero.

#1811 (WV) comment, replacing required outputs 2 and 3 and their companions (this folds in the correction the hub owes on the gate):

Re-pin to policyengine-us#10044 head 586e460dd1.

Output 2, replaced. 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". Apply it per person. On a return whose dependents add no exemption (no dependents, or dependents who add none under IRC 152(b)(1)), allow $500 for each head or spouse who can be claimed. Allow $2,000 for each other filer. Do not limit the $500 to returns whose lawful exemptions are all zero.

Returns whose dependents add exemptions (the claimant filing exception) keep the IT-140 count, $2,000 per exemption with no $500, until PolicyEngine rules on that open question.

Output 3, replaced. 11-21-22a(b): family size is "the total number of exemptions that may be legally claimed" on the return, leaving out only the 16(c) surviving spouse exemption. Count each 16(d) exemption in family size, and let a return with no other exemption claim the credit. Do not apply the IT-140 p.13 zero-exemption bar.

Companions, 2025:

  • exemption: single claimable $500; joint, one claimable spouse $2,500; joint, both claimable $1,000; joint, one claimable spouse with one or two children who add no exemption $2,500; both claimable with two children $1,000;
  • exemption, open question kept at the IT-140 count: single filer with the filing exception and one child $2,000; joint, one claimable spouse with the filing exception and two children $6,000;
  • family tax credit at $16,000 of wages:
    • single claimable: family size 1, FPG $15,650, tax $384.80, credit $307.84;
    • joint, one claimable spouse: family size 2, FPG $21,150, tax $325.60, credit $325.60;
    • joint, both claimable: family size 2, tax $370, credit $370;
    • single filer with the filing exception and one child: family size 1, tax $340.40, credit $272.32.

#1812 (WI) comment, replacing the earned-income measure, its companions and the $250 output:

Re-pin to policyengine-us#10044 head 586e460dd1.

Earned income for the 71.05(22)(f)3m limit: PolicyEngine uses the federal Standard Deduction Worksheet for Dependents measure on both deduction paths. That is wages after pretax payroll deductions, taxable disability wages, and business and farm income less the self-employment tax deduction, counting the head and spouse only. The statute's "earned income, as defined in section 911 (d) (2)" reading is an open PolicyEngine question (us-wi:dependent-standard-deduction-earned-income). Companions (2025, claimable single filer aged 22):

  • $10,000 of taxable disability wages and $20,000 of interest: $10,450;
  • $10,000 of farm income and $20,000 of interest: 10,000 - 706.48 + 450 = $9,743.52 (at most $3,450 under 911(d)(2) if capital is material);
  • $10,000 of wages with a $5,000 traditional 401(k) deferral and $10,000 of interest: $5,000 + $450 = $5,450 deduction, $15,000 - $5,450 = $9,550 taxable income;
  • no earnings of the filer's own, and a dependent child with $5,000 of wages: the filer's deduction stays $1,350.

$250 output, replaced. 71.05(23)(b)3 allows $250 "if the taxpayer has reached the age of 65", and $250 for a spouse who has; age is the only condition. A filer aged 65 or older who can be claimed, claimed or not, gets it. Companions (2025):

  • single claimable aged 65: $250;
  • joint, both aged 65, with one or both claimable: $500;
  • single claimable retiree aged 70 with $34,000 of income and a $24,000 exclusion: tax (34,000 - 24,000 - 4,450 - 250) x 3.5% = $185.50.

5. Mutants

Each mutant ran in its own process, one test file per process, with the file restored afterwards (git status clean after each).

Mutant What it undoes File (one process) Result Case that kills it
M1 C1: puts & ~claimable back in wi_additional_exemption wi_additional_exemption.yaml 9 of 13 fail "2025 single filer aged 65 who is claimed as a dependent keeps the Wisconsin $250 exemption" (0 vs 250), and the other eight claimable cases
M1 same wi_retirement_income_exclusion_tax.yaml 1 of 11 fails "2025 claimable but unclaimed retiree uses the dependent deduction on the positive retirement exclusion path" (wi_exemption 0 vs 250)
M2 C2: family size back to exemptions_count wv_low_income_family_tax_credit_eligible.yaml 4 of 8 fail the single claimed filer (FPG 10,150 vs 15,650), both one-claimed-spouse labellings (15,650 vs 21,150), both claimed (10,150 vs 21,150)
M3 C2: restores the exemptions_count > 0 bar same file 2 of 8 fail the single claimed filer and the both-claimed return (eligible false vs true)
M4 Suggestion 6: the helper ignores whether dependents add exemptions same file 1 of 8 fails the filing-exception single filer with one child (FPG 21,150 vs 15,650)
M4 same wv_personal_exemption.yaml 1 of 18 fails "2025 single filer who can be claimed but whose would-be claimant meets the filing exception gets a West Virginia dependent exemption" (2,500 vs 2,000)
M5 S5: a qualifying dependent is any lawful dependent again ut_total_dependents.yaml 1 of 8 fails "2025 single filer whose child has no SSN and no taxpayer identification number has no Utah qualifying dependent" (1 vs 0)
M5 same ut_personal_exemption_additional_dependent_eligible.yaml 1 of 5 fails "2025 newborn with no SSN and no taxpayer identification number is not an additional Utah dependent" ([0, 1] vs [0, 0])
M6 Suggestion 4: the ordinary helper in the birth-year unit ut_personal_exemption_additional_dependent_eligible.yaml 1 of 5 fails "2025 newborn of a filer whose would-be claimant meets the filing exception is an additional Utah dependent" ([0, 0] vs [0, 1])
M7 Suggestion 4 and S5: the reform counts lawful dependents through the ordinary helper ut_dependent_exemption.yaml (contrib) 2 of 12 fail the reform's filing-exception case (0 vs 3,000) and its no-SSN, no-TIN case (3,000 vs 0)
M8 S4: drops filer & ri_property_tax_credit_eligible.yaml 1 of 17 fails "2025 single filer aged 40 whose 70-year-old parent is a dependent of the return has no Rhode Island property tax relief claimant" (true vs false)

No mutant was needed for S6 (a reference title) or the candidate records; test_source_conflicts.py checks the latter.

6. Tests and CI

Local runs at 586e460dd1, one file per process (Linux VM, not CI): 25 files, 499 passed, 0 failed.

Test file Result
policy/baseline/gov/states/wi/tax/income/wi_additional_exemption.yaml 13 passed
policy/baseline/gov/states/wi/tax/income/wi_retirement_income_exclusion_tax.yaml 11 passed
policy/baseline/gov/states/wi/tax/income/wi_exemption.yaml 2 passed
policy/baseline/gov/states/wv/tax/income/credits/liftc/wv_low_income_family_tax_credit_eligible.yaml 8 passed
policy/baseline/gov/states/wv/tax/income/credits/liftc/wv_low_income_family_tax_credit.yaml 5 passed
policy/baseline/gov/states/wv/tax/income/credits/liftc/wv_low_income_family_tax_credit_fpg.yaml 4 passed
policy/baseline/gov/states/wv/tax/income/credits/liftc/integration.yaml 1 passed
policy/baseline/gov/states/wv/tax/income/exemptions/wv_personal_exemption.yaml 18 passed
policy/baseline/gov/states/wv/tax/income/wv_taxable_income.yaml 3 passed
policy/contrib/states/wv/dependent_exemption_reform_test.yaml 21 passed
policy/contrib/state_dependent_exemptions/repeal_state_dependent_exemptions.yaml 43 passed
policy/baseline/gov/states/ut/tax/income/credits/ut_total_dependents.yaml 8 passed
policy/baseline/gov/states/ut/tax/income/credits/ut_personal_exemption_additional_dependent_eligible.yaml 5 passed
policy/baseline/gov/states/ut/tax/income/credits/ut_personal_exemption.yaml 9 passed
policy/baseline/gov/states/ut/tax/income/credits/ut_taxpayer_credit.yaml 1 passed
policy/contrib/states/ut/dependent_exemption/ut_dependent_exemption.yaml 12 passed
policy/baseline/gov/states/ri/tax/income/credits/property_tax/ri_property_tax_credit_eligible.yaml 17 passed
policy/baseline/gov/states/vt/tax/income/credits/rent/vt_renter_credit.yaml 46 passed
core/test_claimable_filer_ri_sc_ut_vt_wv_wi_invariants.py 5 passed
code_health/test_source_conflicts.py 103 passed
code_health/test_reference_urls.py 32 passed
code_health/test_no_concatenated_reference_urls.py 48 passed
code_health/test_known_dead_reference_urls.py 40 passed
code_health/test_no_group_variables_in_person_adds.py 10 passed
code_health/test_parameter_yaml_keys.py 34 passed

ruff format --check . reports 8,198 files already formatted, and ruff check passes on the changed Python files. I ran no directory suite and no microsimulation. No partner-contract or .github file is touched, and no partner test uses a UT, WV or WI household.

CI. Pull request run 42651314431 at 586e460dd1 hadn't finished 60 minutes after the push, so I'm handing off with it running. At 17:11Z, 35 of 36 jobs had completed, all with success. Contrib tests / Full Suite - Contrib (other-shard-1) was still in progress. No job was skipped or cancelled. Please read the run's final conclusion before landing.

7. Body

Every section now describes the final head. That covers the summary and state table (UT IRC 24 test, WV family size, WI $250), a Readings row per candidate id and the merge. It also covers this round's local runs, the CI timing for Suggestion 5 and the CI run. I replaced the internal decision ids in the old "remain as built" line with a description. The body had no impact: line, and this round changes WI, WV and UT results, so I added impact: pending a comparison at the final head. The axiom: line is untouched. I read the body back after the PATCH, and it matches.

8. Judgment calls

  • Merge. I kept the renter credit's claimant gate inside vt_renter_credit, rather than moving it into main's new vt_renter_credit_eligible. I also kept this branch's clip(exemptions, 0, 8).
  • S5's reach. I applied the IRC 24 test to the birth-year unit and the contributed reform too. (1)(g) adds "an additional qualifying dependent", and the reform's comment promised to match the baseline count.
  • Shared WV helper. It is a new variable, wv_claimable_filer_exemptions_count. The baseline and reform exemption amounts are unchanged in every case the YAML and property tests cover (M4 shows the helper's condition is pinned in both consumers).
  • Candidate states. The seven new items are open, since the hub confirms each call; the two items that were ruled stay so. Years start where I could anchor them: the model's first Wisconsin and Rhode Island form years, 1987 for 16(d), 2007 for the family tax credit. Each note says which form editions I read.
  • IT-140 p.13 stays in wv_low_income_family_tax_credit_eligible's references, since it documents the credit's schedule.

9. Follow-up issues I'd propose

  • Prorate Vermont's renter credit by months rented. 6066(c)(3) needs six months of renting, and the department prorates a credit for under a full year. The model has no months-rented input, so any renter who pays rent gets a full-year credit.
  • Apply Wisconsin's $700 exemption to a claimable filer who must file, once the hub rules on us-wi:personal-exemption-claimable-filer. 71.05(23)(b)1 keys the exemption to the 71.03(2)(a) filing requirement; line 10a keys it to claimability.
  • Measure Wisconsin's dependent-limit earned income under IRC 911(d)(2), once the hub rules on us-wi:dependent-standard-deduction-earned-income. It needs an input for whether capital is material to a business, and a cap of 30 percent of its net profits.
  • Settle West Virginia's exemption for a claimable filer whose dependents add exemptions, once the hub rules on us-wv:claimable-filer-exemption-with-dependents. The helper and two YAML cases mark where the chosen reading goes.

DISMISSAL MAP

  • C1 (WI $250 claimability bar): FIXED. wi_additional_exemption.py:29-33; cases wi_additional_exemption.yaml:57-291, wi_retirement_income_exclusion_tax.yaml:228; candidate candidates.yaml:11484; mutant M1 killed.
  • C2 (WV family size and zero-exemption bar): FIXED. wv_low_income_family_tax_credit_fpg.py:23-30, wv_low_income_family_tax_credit_eligible.py:18-23, wv_claimable_filer_exemptions_count.py:21-38; cases wv_low_income_family_tax_credit_eligible.yaml:17,44,79,110,175; candidate candidates.yaml:11878; M2 and M3 killed.
  • S1 (stale candidates): FIXED. candidates.yaml:11315 (VT zero-exemption rent), :12135 (WV $500), :11279 (statewide average, now 2021-2025).
  • S2(a) (WV allocation with dependents): RECORDED, open. candidates.yaml:11845; ruling 3 asks the hub to pick.
  • S2(b) (WI earned-income measure): RECORDED, open. candidates.yaml:11543; ruling 4 asks the hub to pick.
  • S2(c) (RI same-person claimant): RECORDED. candidates.yaml:9347, follows: statute.
  • S3 (axiom issues): DRAFTED in section 4 for the hub to file, folding in the WV gate correction on Texas TANF earned income exclusion #1811. The axiom: line is unchanged.
  • S4 (RI filer & term): FIXED. ri_property_tax_credit_eligible.yaml:381; M8 killed.
  • S5 (UT IRC 24 condition): FIXED. ut_qualifying_dependent.py:24, read by ut_total_dependents.py:19, ut_personal_exemption_additional_dependent_eligible.py:21 and ut_dependent_exemption_reform.py:40; cases ut_total_dependents.yaml:168,196, ut_personal_exemption_additional_dependent_eligible.yaml:55, ut_dependent_exemption.yaml:317; M5 killed. The review's witness needs ssn_card_type: NONE as well as has_tin: false.
  • S6 (reference title): FIXED. base_personal.yaml:10.
  • Suggestion 1 (VT rent paid and proration): rent test on main via Count property tax and rent refunds paid outside the income tax in household and SPM benefits #10725 and kept in the merge (vt_renter_credit.py:18); proration needs a months-rented input, so I propose a follow-up (section 9).
  • Suggestion 2 (WI $700): RECORDED, open. candidates.yaml:11752; follow-up proposed.
  • Suggestion 3 (VT income-limit sizing): RECORDED, open. candidates.yaml:11248.
  • Suggestion 4 (filing-exception pins): FIXED. ut_personal_exemption_additional_dependent_eligible.yaml:28, ut_dependent_exemption.yaml:290; M6 and M7 killed.
  • Suggestion 5 (CI cost): REPORTED in section 2 and the body: shard 4, 27.1 s of test time; the shard 20:34 and 6.44 GiB peak RSS.
  • Suggestion 6 (WV duplication): DONE for the baseline, reform and family size via wv_claimable_filer_exemptions_count.py; the repeal keeps its own count by design; M4 killed.
  • Branch status (conflict with main): FIXED by merge 3db73a90b8, keeping both sides.

Generated by Claude Code

source_conflicts/candidates.yaml (resolved by hand): both sides added
backlog items at the same two places. The result keeps every item from
both sides once, in id order: main's us-wa:pte-veteran-pathway-pre-2016
before this branch's us-wi:age-65-exemption-claimable-filer, and this
branch's us-wi:dependent-standard-deduction-earned-income before main's
us-wi:homestead-age-disability-earned-income-routes.

ut_at_home_parent_credit_potential.py merged without a conflict, and the
result keeps both changes. This branch counts a qualifying child only
when the return can claim dependents (IRC 152(b)(1)); main pays the $100
once for each child, however many spouses are at-home parents (Utah Code
59-10-1005(2)).

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

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