Repository navigation
Fix EITC eligibility for married separate filers - #10307
Conversation
|
Picking this up for the US hub. I'll post a hand-off comment here when it's ready. Generated by Claude Code |
Bring in current main (including the source-conflict guard fix) before fixing CI. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ption to separated HoH IRC 32(d)(2)(B)(iii)(I) asks whether the spouses lived apart for the last six months, the same fact is_separated already carries for the head of household, filing status and IRC 21(e)(4) tests. Default eitc_spouses_lived_apart_last_six_months from a separated head or spouse, keeping it overridable, so separated parents filing separately keep the EITC. The legal-separation route stays separate. From 2021, IRC 32(d)(2)(A) determines marriage under 7703(a) only, so a separated filer whom 7703(b) lets file as head of household is still married for the EITC. Apply the same exception test to that unit. calculate_eitc_demographic_eligibility, used only by Washington, tested any member's age, so a childless filer under 25 qualified through a dependent's age. Restrict it to the filer and spouse, as the federal variable does. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Ready for hub review Head: What the item asked, and how it was resolved
Tests (one file per process)
Hand computations2026, one child: maximum 4,427, phase-out start 23,890, rate 0.1598. At $30,000: 4,427 − 0.1598 × 6,110 = 3,450.62. CIPull request run 41409143439 at this head: completed, conclusion failure. Every job passed except Household API Partners, whose log shows exactly the two cases above ( Judgment calls
Proposed follow-up
Generated by Claude Code |
|
@hua7450, this PR needs your go on two partner cases. "Household API Partners" fails on these two and no others (run 41409143439). Both cases are married separate filers with a qualifying child and no separation facts. IRC 32(d)(1) allows the EITC to a married individual only on a joint return. The exception in 32(d)(2)(B) needs either six months living apart or a separation instrument with separate households at year end. Neither case supplies those facts, so the statute gives $0. Both files sit under
The The second case can't take If you agree, reply here and the hub will commit these six values to this branch. If you meant either case as a separated household, tell us which and what you'd like the fixture to say. 🤖 Generated with Claude Code |
|
Partner cases. Yes to the six values. IRC 32(d)(1) allows the EITC to a married individual "only if a joint return is filed", and neither fixture meets the (d)(2)(B) exception: in the first the spouse shares the household, and the second's own comment says "without living apart". Pub 596, Rule 3 reads the same way. Yes to the three partner-test questions. Please also:
I'll review once that's green. |
|
Picking this up for the US hub. I'll post a hand-off comment here when it's ready. Generated by Claude Code |
|
Thanks, @hua7450. A hub session will make your edits in one push: the six values, the rename of The same push fixes two findings from an independent review at
When that push's Household API Partners job finishes, the hub will post its full result here, with all 623 cases. 🤖 Generated with Claude Code |
…e fallback within the federal marital test IRC 7703(a)(2) makes a filer legally separated under a decree of separate maintenance unmarried, so IRC 32(d)(1) does not reach the unit. The new is_separated_under_decree input (default false, since survey data cannot identify a decree) lifts the exception requirement in both the separate and the separated head-of-household branches of the shared predicate. New Jersey's childless fallback waives only the federal age limits, so it now requires eitc_marital_eligible instead of excluding only separate returns; a married separated head of household with no qualifying child no longer reaches it. Updates the two partner cases whose new values the partner-test owner approved on the PR, and adds YAML witnesses and Hypothesis invariants. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LwQq6GNhVT4m1wugwntS23
|
Ready for hub review Head: Items
Judgement calls
Proposed follow-up
Generated by Claude Code |
|
@hua7450, here is the full partner result for the push. Your edits are in
An independent review of the new commit comes next, then the population impact check, before the PR lands. 🤖 Generated with Claude Code |
|
Ready for hub review Round 2 independent review of FindingsP3-1. The NJ change is not a no-op for separate filers without a decree; the hand-off says it is, and no test pins the new path
Witness (2025, NJ):
On main, the same filer as Pin the case in - name: Separate filer who meets the separated-spouse exception through a child without an SSN gets the NJ age fallback
# The child counts for IRC 32(d)(2)(B) but not for the federal schedule
# (32(c)(3)(D)), so eitc_child_count is 0. The filer is 22, below the
# federal minimum age, and meets the marital test: NJ pays 0.4 x 649 = 259.60.
period: 2025
absolute_error_margin: 0.01
input:
people:
head:
age: 22
employment_income: 8_000
child:
age: 5
ssn_card_type: NONE
tax_units:
tax_unit:
members: [head, child]
filing_status: SEPARATE
eitc_spouses_lived_apart_last_six_months: true
households:
household:
members: [head, child]
state_code: NJ
output:
eitc_marital_eligible: true
eitc_child_count: 0
nj_childless_eitc_age_eligible: true
nj_eitc: 259.60The hub's impact pair should also expect P3-2. No test puts the decree on a spouse, so a head-only reading survives in substance
Mutant (e) swaps P3-3. The input's documentation reads as general, but only the EITC predicate reads it
The label says "decree of separate maintenance", but the text and the statute also cover a decree of divorce. That's fine, but the label could read "Legally separated under a decree of divorce or separate maintenance". Proposed follow-up: Apply P3-4. Body wording
Checked and soundSources. I couldn't fetch any statute from this session. curl and web fetch both failed for law.cornell.edu, govinfo.gov, uscode.house.gov, ecfr.gov, pub.njleg.state.nj.us, app.leg.wa.gov, law.justia.com, irs.gov, congress.gov and nj.gov: proxy 403, or DNS not allowed. So I quote no law here. The code's 7703(a)(2) comment matches the quote in the hub's ruling text, and I couldn't check it against the statute. I couldn't read RCW 82.08.0206 or N.J.S.A. 54A:4-7 either. The Washington and New Jersey conclusions below rest on the code. The defect reproduces on main ( P2-1, the decree input. It is a plain boolean Person input with Readers, P2-1 witness at 2025 in each state, without and then with the decree:
P2-2, New Jersey. The fallback now ANDs Partner values.
Tests at head, one file per process, all passing:
Hypothesis tests.
Mutants, each in its own process on a scratch worktree, restored afterwards;
Register. No register entry or Population. The policyengine-us-data 1.115.4 wheel from PyPI sets
Round 1 reported that every calculated separated-HoH unit passes the gate and every calculated CI. Run 41480725111 at Overlap. Open drafts #10043 and #10525 both change What I couldn't check
Generated by Claude Code |
Main now carries the former section 32(c)(1)(F) identification bar in eitc_eligible. Keep both: build eligibility from this PR's five conditions, eitc_marital_eligible included, apply main's 32(c)(1)(F) block to it, and keep both references. Washington's test file keeps this PR's childless cases and main's earned-income reduction case. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LwQq6KcYmGRGLN8zAqaGY3
N.J.S.A. 54A:4-7a.(3) and N.J.A.C. 18:35-4.3(g)(3) require a married claimant to file jointly, except a head of household or surviving spouse. The NJ-1040 line 58 instructions add an exception for a separate filer with a child and six months apart; the statute governs. nj_eitc_separate_filer_eligible passes a filer who doesn't file separately or is separated under a decree (IRC 7703(a)(2)), and both the federal match and the age fallback now read it. Record the conflict in candidates.yaml, pin each route in nj_eitc.yaml, and cut the property file to invariants that can fail on their own. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LwQq6KcYmGRGLN8zAqaGY3
IRC 7703(b)(1) needs the child in the home for more than half the year and 7703(b)(3) needs the spouse out of the household for the last six months, so head_of_household_eligible now reads both inputs. A separated filer who fails either files separately, which keeps Washington's state-only credit ($660 in the witness). The decree and marital documentation now name every reader, and the changelog states New Jersey's tightening. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LwQq6KcYmGRGLN8zAqaGY3
|
Ready for hub review Head: Three commits on What the item asked and how I resolved it
Tests (one file per process, at the head's code)
Mutants (each in its own process, restored after)
Hand computations
CIThe Pull request run at this head, 41707568662, concluded success with all 36 jobs successful. Partner API impact notice, 41707565636, also concluded success. No partner test file changed in this round. Judgment calls
For the hub's follow-up list (not fixed)
Proposed follow-up issue: "Apply IRC 7703(a)(2) decree status outside the EITC". Generated by Claude Code |
hua7450
left a comment
There was a problem hiding this comment.
Approved at 0262579ff1. The New Jersey rule, the head-of-household fix, the merge and the register entry all check out, and CI passed on this head. The register's readings match the sources, and #page=44 is the right page for line 58.
…e child lacks an SSN Main's case from #10307 expected eitc_eligible false for a 2025 separated parent aged 20, since the parent is under the childless minimum age. On this branch the child without an SSN establishes federal eligibility from 2021 (IRC 32(c)(1)(A)(i)) while staying out of the amount, so the parent gets the zero-child 649. The CalEITC outputs do not move. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LwQq6HSDrJsaVhwknS3Czs
… 2021 (#10583) * Let a qualifying child without an SSN establish EITC eligibility from 2021 IRC 32(c)(1)(A)(i) makes an individual with a qualifying child an eligible individual; 32(c)(3)(D) and (m) leave a child without a valid SSN out only of the amount under subsection (b). ARPA section 9622 struck former 32(c)(1)(F) from 2021. The model based eligibility on the SSN-filtered count, so such a parent under 25 failed the childless age test and got nothing. Eligibility now also counts the identification- independent qualifying child from 2021; the amount still uses the filtered count, giving the zero-child schedule. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Give the under-25 DC case the federal self-only credit and DC's match From 2021 a filer whose only qualifying child lacks a TIN is an eligible individual under IRC 32(c)(1)(A)(i), so the federal credit is the zero-child $459. D.C. Code 47-1806.04(f)(4) keeps the child a qualifying child, and (f)(1)(B-1) allows 70% of that credit: $321.30. Update the with-child formula's comment to match. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Merge remote-tracking branch 'origin/main' into eitc-no-ssn-child-age-test * Pin both NJ EITC routes, make the no-SSN property test search, and fix a page range The property test now leaves qualifying-child status to the formulas and compares each filer with an age-40 childless twin, so it fails if the no-SSN child stops establishing eligibility or if the head counts as a qualifying child. The pre-2021 property becomes an upper bound that holds whether or not former 32(c)(1)(F) is modeled. Two NJ cases pin 54A:4-7(a)(1) for the federally eligible parent and (a)(4) for the childless filer under the federal age floor. 32(c)(3)(D) is on file page 3 of the 2021 Code PDF. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Search the EITC property at its age boundaries and with a TIN Round 2's mutants found that random ages rarely reach 64 and that no property case had a child with has_tin false. The New Jersey parent case also pinned nj_childless_eitc_age_eligible at a value the ruling rejects; nj_eitc alone kills the same mutant. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Merge main: keep both sides' NJ EITC cases and pin the federal credit beside them nj_eitc.yaml conflicted because both sides appended cases; both are kept, main's first. With this branch, a child without an SSN makes main's two NJ separate filers federally eligible (zero-child 612 in 2025), so those cases now say so and pin eitc 612; nj_eitc stays 0 under N.J.S.A. 54A:4-7a.(3). Adds a 2021 married separate case to the federal witness file so the #10307 marital exception and this branch's demographic rule are tested together. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Expect the federal zero-child credit for the separated CA parent whose child lacks an SSN Main's case from #10307 expected eitc_eligible false for a 2025 separated parent aged 20, since the parent is under the childless minimum age. On this branch the child without an SSN establishes federal eligibility from 2021 (IRC 32(c)(1)(A)(i)) while staying out of the amount, so the parent gets the zero-child 649. The CalEITC outputs do not move. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Read main's EITC identification bar instead of a second parameter #10297's `qualifying_child_without_identification_bar` already encodes ARPA section 9622, so `eitc_demographic_eligible` reads it and this PR's complement goes. Move the federal cases to a file named for the variable. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Merge main into EITC child without SSN Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Married separate filers currently receive the federal EITC from 2021 without meeting the separated-spouse exception, and CalEITC omits the marital check entirely. This change requires a qualifying child who lived with the filer for more than half the year, plus either different principal residences for the last six months or a qualifying separation instrument with separate households at year end (IRC 32(d)(2)(B)). YCTC inherits the corrected CalEITC eligibility, including its zero-earned-income route.
Separation facts and their defaults
eitc_spouses_lived_apart_last_six_months(IRC 32(d)(2)(B)(iii)(I)) defaults to true when the tax unit head or spouse hasis_separated, and stays settable as an input.is_separated(documented against 26 U.S.C. 7703) is the model's existing living-apart indicator:head_of_household_eligible,filing_statusandcdcc_treated_as_unmarried(IRC 21(e)(4)) already read it for the same fact. A separated dependent does not count.eitc_legal_separation_and_apart_at_year_end(IRC 32(d)(2)(B)(iii)(II)) defaults to false.is_separateddoes not feed it: that route needs a decree or written agreement plus separate households at year end.eitc_child_lived_with_taxpayer_more_than_half_yeardefaults to true, preserving the existing assumption for qualifying dependents.The shared marital predicate checks
is_eitc_qualifying_childbefore SSN filtering, so a child without a valid SSN can establish the marital exception. California retains its own age and identification rules. The existingseparate_filerparameter now enables the conditional exception; pre-2021 joint-return requirements remain.Separated head-of-household filers
From 2021, IRC 32(d)(2)(A) determines marriage under section 7703(a) only, so a separated filer whom 7703(b) treats as unmarried for filing status is still married for the EITC. PE-US produces such units:
head_of_household_eligiblegives head-of-household status to a head withis_separated, a qualifying child and no spouse in the unit. The exception test now also applies to a head-of-household unit whose head or spouse hasis_separated, wherever the exception switch is on (federal from 2021, and states that follow it). With the defaults above, it changes results only when the child fails the EITC qualifying-child test. A living-apart or residence input set false takes the filer out of head-of-household status (IRC 7703(b)), so the unit files separately. Before 2021 these filers were unmarried for the EITC and are unaffected.head_of_household_eligiblenow reads both residence inputs for the separated route: IRC 7703(b)(1) needs a child in the home for more than half the year (eitc_child_lived_with_taxpayer_more_than_half_year), and 7703(b)(3) needs the spouse out of the household for the last six months (eitc_spouses_lived_apart_last_six_months). Neither input depends onfiling_status, so this adds no cycle. Witness (2025, WA): head aged 35, $10,000 wages,is_separated, a child aged 5, living-apart input false. The filer now files separately, the federal EITC is $0, and Washington's state-only path pays $660, as main does; before this change the filer stayed head of household and got $0.Washington
calculate_eitc_demographic_eligibility, used only by the Washington Working Families Tax Credit, applied the childless 25-64 age test to any member of the tax unit. A childless filer under 25 could therefore qualify through a dependent's age. With the PR's separate-filer change, a separate filer in that position lost the credit while a single filer kept it ($335 on main in 2025 for both; $0 and $335 before this fix). The helper now tests only the filer and spouse, as the federaleitc_demographic_eligibledoes under IRC 32(c)(1)(A)(ii), so both get $0. A childless separate filer in the age band keeps the state-only credit ($335).Decree of divorce or separate maintenance
IRC 7703(a)(2) treats an individual "legally separated from his spouse under a decree of divorce or of separate maintenance" as not married. Through IRC 32(d)(2)(A), such a filer is unmarried for the EITC, so IRC 32(d)(1) does not reach the unit and its marital test needs no qualifying child. The new Person input
is_separated_under_decree(default false) records that decree. When the head or spouse has it, the shared predicate intools/state_eitc_helpers.pydrops the exception requirement in both the separate-return and the separated head-of-household branches. Survey data (CPS marital code 6) cannot tell a decree from an informal separation, so the input defaults to false andis_separatedalone keeps the married reading. The existing combined routeeitc_legal_separation_and_apart_at_year_end(decree or written agreement, plus separate households at year end) is unchanged.The input reaches every reader of the predicate when the exception switch is on:
eitc_marital_eligible(and through iteitc_eligible, CA, NM, New Jersey's age fallback and the NY reform), DC's childless credit,calculate_eitc_like_amount(DC's with-child ITIN credit, CO, IL), and Washington's WFTC, whose frozen 2022 law has the switch on. With the switch off (Oklahoma's frozen 2020 law, and every year before 2021), the predicate still returns "not a separate return" and never reads the input, so Oklahoma's results do not change. With the input false, the predicate returns what it did before; with it true, the predicate can only turn from false to true.Witness (2025): head aged 35, $10,000 wages, dependent mother aged 70, head of household,
is_separatedand both separation routes true, no EITC qualifying child. With the decree input the EITC is $649 (the zero-child maximum: 0.0765 × 10,000 = 765, capped at 649, below the 10,620 phase-out start). Without it, $0.New Jersey
P.L.2021, c.130 lets a childless filer who fails the federal EITC only on age claim New Jersey's credit, while keeping the other federal qualifications. Because
eitc_eligiblenow includes the marital condition for separated heads of household, federal ineligibility for marital reasons was reaching that fallback, which excluded only the SEPARATE status.nj_childless_eitc_age_eligiblenow requireseitc_marital_eligible, so a unit that fails the federal marital test gets no fallback, whatever its filing status.New Jersey adds its own bar. N.J.S.A. 54A:4-7a.(3), as P.L.2021, c.130 amended it, and N.J.A.C. 18:35-4.3(g)(3) require a married claimant to file a joint return, except one who files as a head of household or surviving spouse. Neither has an exception for a separate filer with a qualifying child. The 2025 NJ-1040 line 58 instructions do allow that filer the credit with a qualifying child resident for more than half the year and six months apart from the spouse. The code follows the statute and the regulation against the instructions, and
source_conflicts/candidates.yamlrecords the conflict asus-nj:eitc-married-separate-filer. The newnj_eitc_separate_filer_eligiblepasses a unit that doesn't file separately, or whose head or spouse is separated under a decree (not married under IRC 7703(a)(2)). Both the federal match innj_eitcand the age fallback read it, so every married separate filer without a decree gets $0 from New Jersey.Witnesses, all
SEPARATEin New Jersey:Witness for the fallback (2025): married separated head of household aged 55, $12,000 wages, a supported adult child aged 30, six months apart, no EITC qualifying child. Federal EITC falls from $543.43 to $0 (IRC 32(d)), and New Jersey's EITC is now $0 (it was $259.60 = 0.4 × 649 under the fallback). An unmarried 22-year-old with $8,000 of earnings and no qualifying child still gets $259.60.
Property tests
test_eitc_marital_eligibility_properties.pycalls the production formulas on generated units with the real parameters and states these invariants, each of which can fail on its own:Partner contract cases (approved by the partner-test owner)
The partner-test owner approved these six values on this PR on 2026-11-02. Under IRC 32(d)(1), a married individual gets the credit only on a joint return, unless the IRC 32(d)(2)(B) exception applies; neither of its conditions holds in these cases.
partners/.../tax_credits/eitc/federal.yamleitc_married_filing_separately_eligible_post_arpa, renamedeitc_married_filing_separately_same_household_ineligibleeitceitc_eligibleincome_taxpartners/.../tax_credits/cdcc/federal.yamlcdcc_separate_filer_ineligibleeitceitc_eligibleincome_taxThe first case's comment now explains that ARPA section 9623 covers only "certain separated spouses"; the second's notes that the same facts deny the EITC. No other partner file changes. The separated-parent case (
cdcc_separated_parent_treated_as_unmarried) passes with its existing expectations.Validation
See the hand-off comment for the test counts. CI is the evidence for the full suites. No microsimulation was run here.
impact: the hub will measure the impact. Default microdata may contain separate filers without the new separation inputs. They lose the EITC unless the decree input marks a head or spouse, or they have a resident qualifying child and
is_separatedmarks a head or spouse. This PR also lowers New Jersey's EITC for married separate filers: without a decree they now get $0, through the match and the age fallback.axiom: TheAxiomFoundation/rulespec-us#1403 queued; TheAxiomFoundation/rulespec-us#1988 queued; TheAxiomFoundation/rulespec-us#1554 queued; TheAxiomFoundation/rulespec-us#1989 queued
Generated by Claude Code