From 03e371858ca06e84783510363064aed196f79a8f Mon Sep 17 00:00:00 2001 From: PavelMakarchuk Date: Mon, 5 Oct 2026 17:18:16 -0400 Subject: [PATCH 1/3] Net spouses' self-employment losses in state EITC helper earned income The shared state EITC helper and the Indiana decoupled branch used filer_adjusted_earnings, which floors each spouse at zero. The federal eitc uses eitc_earned_income (#8337), which combines both spouses' amounts per Form 1040 EIC Worksheet B. Fixes #9819. Co-Authored-By: Claude Opus 5.5 --- .../state-eitc-helper-earned-income.fixed.md | 1 + .../co/tax/income/credits/eitc/co_eitc.yaml | 30 +++++ .../income/dc_eitc_with_qualifying_child.yaml | 35 +++++- .../states/il/tax/income/credits/il_eitc.yaml | 106 +++++++++++++++++- .../gov/states/in/tax/income/in_eitc.yaml | 72 ++++++++++++ .../in/tax/income/in_eitc_eligible.yaml | 2 +- policyengine_us/tools/state_eitc_helpers.py | 2 +- .../credits/earned_income_credit/in_eitc.py | 2 +- 8 files changed, 244 insertions(+), 6 deletions(-) create mode 100644 changelog.d/state-eitc-helper-earned-income.fixed.md diff --git a/changelog.d/state-eitc-helper-earned-income.fixed.md b/changelog.d/state-eitc-helper-earned-income.fixed.md new file mode 100644 index 00000000000..59e5d8bfc35 --- /dev/null +++ b/changelog.d/state-eitc-helper-earned-income.fixed.md @@ -0,0 +1 @@ +Use federal EITC earned income, which nets spouses' self-employment losses, in the shared state EITC helper (IL, CO, DC, IN) and the Indiana decoupled EITC. diff --git a/policyengine_us/tests/policy/baseline/gov/states/co/tax/income/credits/eitc/co_eitc.yaml b/policyengine_us/tests/policy/baseline/gov/states/co/tax/income/credits/eitc/co_eitc.yaml index 061ddff486b..46581d1dfd5 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/co/tax/income/credits/eitc/co_eitc.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/co/tax/income/credits/eitc/co_eitc.yaml @@ -361,3 +361,33 @@ # child under IRC 152(c)(3)(B), so the CO EITC pays its match on the # 1-child federal-style EITC rather than the childless amount. co_eitc: 1_700 + +- name: Colorado under-25 EITC nets a spouse's self-employment loss (50% x 7.65% x 6,000) + period: 2023 + absolute_error_margin: 0.01 + input: + people: + head: + age: 22 + employment_income: 10_000 + is_tax_unit_head: true + spouse: + age: 22 + self_employment_income: -4_000 + is_tax_unit_spouse: true + tax_units: + tax_unit: + members: [head, spouse] + filing_status: JOINT + spm_units: + spm_unit: + members: [head, spouse] + households: + household: + members: [head, spouse] + state_code: CO + output: + # The spouse's $4,000 self-employment loss offsets the head's $10,000 of + # wages, so federal earned income is $6,000 (Form 1040 EIC Worksheet B, + # line 4b, combines both spouses' amounts on a joint return). + co_eitc: 229.5 diff --git a/policyengine_us/tests/policy/baseline/gov/states/dc/tax/income/dc_eitc_with_qualifying_child.yaml b/policyengine_us/tests/policy/baseline/gov/states/dc/tax/income/dc_eitc_with_qualifying_child.yaml index 35ca7c820f6..dd55b7dfbf1 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/dc/tax/income/dc_eitc_with_qualifying_child.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/dc/tax/income/dc_eitc_with_qualifying_child.yaml @@ -20,7 +20,7 @@ tax_unit: members: [head, child] filing_status: HEAD_OF_HOUSEHOLD - filer_adjusted_earnings: 294.11764705882354 + eitc_earned_income: 294.11764705882354 adjusted_gross_income: 294.11764705882354 households: household: @@ -92,3 +92,36 @@ # and the childless schedule returns zero. dc_eitc_with_qualifying_child: 3_400 dc_eitc_without_qualifying_child: 0 + +- name: DC EITC with a qualifying child nets a spouse's self-employment loss (70% x 2,040) + period: 2023 + absolute_error_margin: 0.01 + input: + people: + head: + age: 40 + employment_income: 10_000 + is_tax_unit_head: true + spouse: + age: 40 + self_employment_income: -4_000 + is_tax_unit_spouse: true + child1: + age: 7 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [head, spouse, child1] + filing_status: JOINT + spm_units: + spm_unit: + members: [head, spouse, child1] + households: + household: + members: [head, spouse, child1] + state_code: DC + output: + # The spouse's $4,000 self-employment loss offsets the head's $10,000 of + # wages, so federal earned income is $6,000 (Form 1040 EIC Worksheet B, + # line 4b, combines both spouses' amounts on a joint return). + dc_eitc_with_qualifying_child: 1_428 diff --git a/policyengine_us/tests/policy/baseline/gov/states/il/tax/income/credits/il_eitc.yaml b/policyengine_us/tests/policy/baseline/gov/states/il/tax/income/credits/il_eitc.yaml index 14c1be44cb2..ff9c2b6cff3 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/il/tax/income/credits/il_eitc.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/il/tax/income/credits/il_eitc.yaml @@ -12,7 +12,7 @@ tax_units: tax_unit: members: [head, child] - filer_adjusted_earnings: 2_941.176470588235 + eitc_earned_income: 2_941.176470588235 adjusted_gross_income: 2_941.176470588235 households: household: @@ -44,7 +44,7 @@ tax_units: tax_unit: members: [head, child] - filer_adjusted_earnings: 2_941.176470588235 + eitc_earned_income: 2_941.176470588235 adjusted_gross_income: 2_941.176470588235 households: household: @@ -174,3 +174,105 @@ # child under IRC 152(c)(3)(B), so the IL EIC reflects the 1-child federal # EITC (rather than the childless schedule) times the IL match. il_eitc: 680 + +- name: IL EIC nets a spouse's self-employment loss, 2021 (18% x 2,400) + period: 2021 + absolute_error_margin: 0.01 + input: + people: + head: + age: 40 + employment_income: 10_000 + is_tax_unit_head: true + spouse: + age: 40 + self_employment_income: -4_000 + is_tax_unit_spouse: true + child1: + age: 7 + is_tax_unit_dependent: true + child2: + age: 10 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [head, spouse, child1, child2] + filing_status: JOINT + spm_units: + spm_unit: + members: [head, spouse, child1, child2] + households: + household: + members: [head, spouse, child1, child2] + state_code: IL + output: + # The spouse's $4,000 self-employment loss offsets the head's $10,000 of + # wages, so federal earned income is $6,000 (Form 1040 EIC Worksheet B, + # line 4b, combines both spouses' amounts on a joint return). + il_eitc: 432 + +- name: IL EIC nets a spouse's self-employment loss, 2023 (20% x 2,400) + period: 2023 + absolute_error_margin: 0.01 + input: + people: + head: + age: 40 + employment_income: 10_000 + is_tax_unit_head: true + spouse: + age: 40 + self_employment_income: -4_000 + is_tax_unit_spouse: true + child1: + age: 7 + is_tax_unit_dependent: true + child2: + age: 10 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [head, spouse, child1, child2] + filing_status: JOINT + spm_units: + spm_unit: + members: [head, spouse, child1, child2] + households: + household: + members: [head, spouse, child1, child2] + state_code: IL + output: + # The spouse's $4,000 self-employment loss offsets the head's $10,000 of + # wages, so federal earned income is $6,000 (Form 1040 EIC Worksheet B, + # line 4b, combines both spouses' amounts on a joint return). + il_eitc: 480 + +- name: IL EIC for a 65+ couple nets a self-employment loss, 2023 (20% x 7.65% x 5,000) + period: 2023 + absolute_error_margin: 0.01 + input: + people: + head: + age: 65 + self_employment_income: -2_000 + is_tax_unit_head: true + spouse: + age: 65 + employment_income: 7_000 + is_tax_unit_spouse: true + tax_units: + tax_unit: + members: [head, spouse] + filing_status: JOINT + spm_units: + spm_unit: + members: [head, spouse] + households: + household: + members: [head, spouse] + state_code: IL + output: + # 35 ILCS 5/212(b-10) waives the federal age limit for filers 65 or older. + # Earned income is $7,000 - $2,000 = $5,000, so the childless credit is + # 7.65% x 5,000 = 382.50 and the IL EIC is 20% of it. + il_eitc: 76.5 diff --git a/policyengine_us/tests/policy/baseline/gov/states/in/tax/income/in_eitc.yaml b/policyengine_us/tests/policy/baseline/gov/states/in/tax/income/in_eitc.yaml index 0ff01cd9ce9..c46196fb1fd 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/in/tax/income/in_eitc.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/in/tax/income/in_eitc.yaml @@ -116,3 +116,75 @@ household: {members: [parent], state_fips: 18} output: in_eitc: 61.20 + +- name: Indiana decoupled EITC nets a spouse's self-employment loss, 2022 (10% x 2,400) + period: 2022 + absolute_error_margin: 0.01 + input: + people: + head: + age: 40 + employment_income: 10_000 + is_tax_unit_head: true + spouse: + age: 40 + self_employment_income: -4_000 + is_tax_unit_spouse: true + child1: + age: 7 + is_tax_unit_dependent: true + child2: + age: 10 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [head, spouse, child1, child2] + filing_status: JOINT + spm_units: + spm_unit: + members: [head, spouse, child1, child2] + households: + household: + members: [head, spouse, child1, child2] + state_code: IN + output: + # The spouse's $4,000 self-employment loss offsets the head's $10,000 of + # wages, so federal earned income is $6,000 (Form 1040 EIC Worksheet B, + # line 4b, combines both spouses' amounts on a joint return). + in_eitc: 240 + +- name: Indiana decoupled EITC nets a spouse's self-employment loss, 2021 (9% x 2,400) + period: 2021 + absolute_error_margin: 0.01 + input: + people: + head: + age: 40 + employment_income: 10_000 + is_tax_unit_head: true + spouse: + age: 40 + self_employment_income: -4_000 + is_tax_unit_spouse: true + child1: + age: 7 + is_tax_unit_dependent: true + child2: + age: 10 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [head, spouse, child1, child2] + filing_status: JOINT + spm_units: + spm_unit: + members: [head, spouse, child1, child2] + households: + household: + members: [head, spouse, child1, child2] + state_code: IN + output: + # The spouse's $4,000 self-employment loss offsets the head's $10,000 of + # wages, so federal earned income is $6,000 (Form 1040 EIC Worksheet B, + # line 4b, combines both spouses' amounts on a joint return). + in_eitc: 216 diff --git a/policyengine_us/tests/policy/baseline/gov/states/in/tax/income/in_eitc_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/in/tax/income/in_eitc_eligible.yaml index 24442fa4938..cca82466d58 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/in/tax/income/in_eitc_eligible.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/in/tax/income/in_eitc_eligible.yaml @@ -97,7 +97,7 @@ eitc: 0 filing_status: HEAD_OF_HOUSEHOLD eitc_child_count: 1 - filer_adjusted_earnings: 10_000 + eitc_earned_income: 10_000 adjusted_gross_income: 10_000 filer_meets_eitc_identification_requirements: true would_file_taxes_voluntarily: true diff --git a/policyengine_us/tools/state_eitc_helpers.py b/policyengine_us/tools/state_eitc_helpers.py index 02f891b989c..06dd1ef9e4b 100644 --- a/policyengine_us/tools/state_eitc_helpers.py +++ b/policyengine_us/tools/state_eitc_helpers.py @@ -72,7 +72,7 @@ def calculate_eitc_amount_from_parameters( ): """Calculate the uncapped EITC amount under a chosen parameter set.""" - earnings = tax_unit("filer_adjusted_earnings", period) + earnings = tax_unit("eitc_earned_income", period) agi = tax_unit("adjusted_gross_income", period) maximum = eitc_parameters.max.calc(child_count) phase_in_rate = eitc_parameters.phase_in_rate.calc(child_count) diff --git a/policyengine_us/variables/gov/states/in/tax/income/credits/earned_income_credit/in_eitc.py b/policyengine_us/variables/gov/states/in/tax/income/credits/earned_income_credit/in_eitc.py index ee2a809c628..9e4a8a738ae 100644 --- a/policyengine_us/variables/gov/states/in/tax/income/credits/earned_income_credit/in_eitc.py +++ b/policyengine_us/variables/gov/states/in/tax/income/credits/earned_income_credit/in_eitc.py @@ -57,7 +57,7 @@ def formula(tax_unit, period, parameters): po_start = where(kids == 0, po_start0, po_start) po_rate = where(kids == 0, po_rate0, po_rate) # ... calculate eitc phase-in amount - earnings = tax_unit("filer_adjusted_earnings", period) + earnings = tax_unit("eitc_earned_income", period) phase_in_amount = min_(earnings * pi_rate, maximum) # ... calculate eitc reduction federal_agi = tax_unit("adjusted_gross_income", period) From 6232ba053b4fcde28bf1236fa223a2ff7d816e86 Mon Sep 17 00:00:00 2001 From: PavelMakarchuk Date: Thu, 8 Oct 2026 09:29:58 -0400 Subject: [PATCH 2/3] Add an IL EIC case with a spouse's self-employment loss in the phase-out range Co-Authored-By: Claude Opus 5.5 --- .../states/il/tax/income/credits/il_eitc.yaml | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/policyengine_us/tests/policy/baseline/gov/states/il/tax/income/credits/il_eitc.yaml b/policyengine_us/tests/policy/baseline/gov/states/il/tax/income/credits/il_eitc.yaml index 2d002c731a0..10aa93786dc 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/il/tax/income/credits/il_eitc.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/il/tax/income/credits/il_eitc.yaml @@ -311,3 +311,41 @@ # A parent fails the IRC 152(c)(2) relationship test: 20% x the childless # federal-like credit of 649. il_eitc: 129.8 + +- name: IL EIC nets a spouse's self-employment loss in the phase-out range, 2023 + period: 2023 + absolute_error_margin: 0.01 + input: + people: + head: + age: 40 + employment_income: 40_000 + is_tax_unit_head: true + spouse: + age: 40 + self_employment_income: -5_000 + is_tax_unit_spouse: true + child1: + age: 7 + is_tax_unit_dependent: true + child2: + age: 10 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [head, spouse, child1, child2] + filing_status: JOINT + spm_units: + spm_unit: + members: [head, spouse, child1, child2] + households: + household: + members: [head, spouse, child1, child2] + state_code: IL + output: + # Earned income and AGI are 40,000 - 5,000 = 35,000. Two children, 2023 + # (Rev. Proc. 2022-38, section 3.06): maximum credit 6,604, phase-out + # 21.06% above the joint 28,120. Federal EITC: 6,604 - 0.2106 x 6,880 = + # 5,155.07; IL EIC 20%: 1,031.01. Without netting, earned income would be + # 40,000 and the IL EIC 20% x (6,604 - 0.2106 x 11,880) = 820.41. + il_eitc: 1_031.01 From 6a5fb64f697ee4371b1ff95f0fca94a487b98cc8 Mon Sep 17 00:00:00 2001 From: PavelMakarchuk Date: Sun, 25 Oct 2026 18:42:29 -0400 Subject: [PATCH 3/3] Test a spouse's farm loss in the IL EIC and note the farm and partnership sources - Add a 2023 IL EIC case where the spouse's farm loss offsets the head's wages (IRC 32(c)(2)(A)(ii) and 1402(a)). - Say in the changelog that the state credits now also count net farm earnings and partnership self-employment earnings. Co-Authored-By: Claude Opus 5.5 --- .../state-eitc-helper-earned-income.fixed.md | 2 +- .../states/il/tax/income/credits/il_eitc.yaml | 37 +++++++++++++++++++ 2 files changed, 38 insertions(+), 1 deletion(-) diff --git a/changelog.d/state-eitc-helper-earned-income.fixed.md b/changelog.d/state-eitc-helper-earned-income.fixed.md index 59e5d8bfc35..58007bed73b 100644 --- a/changelog.d/state-eitc-helper-earned-income.fixed.md +++ b/changelog.d/state-eitc-helper-earned-income.fixed.md @@ -1 +1 @@ -Use federal EITC earned income, which nets spouses' self-employment losses, in the shared state EITC helper (IL, CO, DC, IN) and the Indiana decoupled EITC. +Use federal EITC earned income, which nets spouses' self-employment losses, in the shared state EITC helper (IL, CO, DC, IN) and the Indiana decoupled EITC. These credits now also count net farm earnings and partnership self-employment earnings, as IRC 32(c)(2)(A)(ii) does. diff --git a/policyengine_us/tests/policy/baseline/gov/states/il/tax/income/credits/il_eitc.yaml b/policyengine_us/tests/policy/baseline/gov/states/il/tax/income/credits/il_eitc.yaml index 10aa93786dc..2d07b31d4a9 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/il/tax/income/credits/il_eitc.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/il/tax/income/credits/il_eitc.yaml @@ -247,6 +247,43 @@ # line 4b, combines both spouses' amounts on a joint return). il_eitc: 480 +- name: IL EIC nets a spouse's farm loss, 2023 (20% x 2,400) + period: 2023 + absolute_error_margin: 0.01 + input: + people: + head: + age: 40 + employment_income: 10_000 + is_tax_unit_head: true + spouse: + age: 40 + farm_operations_income: -4_000 + is_tax_unit_spouse: true + child1: + age: 7 + is_tax_unit_dependent: true + child2: + age: 10 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [head, spouse, child1, child2] + filing_status: JOINT + spm_units: + spm_unit: + members: [head, spouse, child1, child2] + households: + household: + members: [head, spouse, child1, child2] + state_code: IL + output: + # Net farm earnings are net earnings from self-employment under IRC + # 1402(a), so IRC 32(c)(2)(A)(ii) counts the spouse's $4,000 farm loss. + # Federal earned income is $6,000; two children, 2023 (Rev. Proc. + # 2022-38, section 3.06): 40% x 6,000 = 2,400; IL EIC 20%: 480. + il_eitc: 480 + - name: IL EIC for a 65+ couple nets a self-employment loss, 2023 (20% x 7.65% x 5,000) period: 2023 absolute_error_margin: 0.01