From 8ce69b358b6ec038d7f36070e305c38de2516439 Mon Sep 17 00:00:00 2001 From: PavelMakarchuk Date: Tue, 6 Oct 2026 15:03:54 -0400 Subject: [PATCH] Use EIC earned income in the Minnesota child and working family credits Schedule M1CWFC, line 2 takes earned income from federal EIC Worksheet B: both spouses combined, with a net self-employment loss subtracted, not less than zero. filer_adjusted_earnings floors each spouse separately, so one spouse's loss never reduced the other's wages. Fixes #9917 Co-Authored-By: Claude Opus 5.5 --- .../mn-cwfc-eic-earned-income.fixed.md | 1 + ...mn_child_and_working_families_credits.yaml | 86 ++++++++++++++++--- .../states/mn/tax/income/credits/mn_wfc.yaml | 8 +- .../states/mn/walz/mn_walz_hf1938.yaml | 4 +- .../mn_child_and_working_families_credits.py | 7 +- .../states/mn/tax/income/credits/mn_wfc.py | 5 +- 6 files changed, 87 insertions(+), 24 deletions(-) create mode 100644 changelog.d/mn-cwfc-eic-earned-income.fixed.md diff --git a/changelog.d/mn-cwfc-eic-earned-income.fixed.md b/changelog.d/mn-cwfc-eic-earned-income.fixed.md new file mode 100644 index 00000000000..ec523be112a --- /dev/null +++ b/changelog.d/mn-cwfc-eic-earned-income.fixed.md @@ -0,0 +1 @@ +Use federal EIC earned income (both spouses combined, net of a self-employment loss) in the Minnesota child and working family credits. diff --git a/policyengine_us/tests/policy/baseline/gov/states/mn/tax/income/credits/mn_child_and_working_families_credits.yaml b/policyengine_us/tests/policy/baseline/gov/states/mn/tax/income/credits/mn_child_and_working_families_credits.yaml index 4de751088e0..13ac7c22a3e 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/mn/tax/income/credits/mn_child_and_working_families_credits.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/mn/tax/income/credits/mn_child_and_working_families_credits.yaml @@ -16,7 +16,7 @@ members: [person1, person2, person3] ctc_qualifying_children: 1 mn_wfc_eligible: true - filer_adjusted_earnings: 10_000 + eitc_earned_income: 10_000 adjusted_gross_income: 10_000 filing_status: JOINT households: @@ -51,7 +51,7 @@ members: [person1, person2, person3, person4] ctc_qualifying_children: 1 mn_wfc_eligible: true - filer_adjusted_earnings: 6_000 + eitc_earned_income: 6_000 adjusted_gross_income: 10_000 filing_status: JOINT households: @@ -86,7 +86,7 @@ members: [person1, person2, person3, person4] ctc_qualifying_children: 1 mn_wfc_eligible: true - filer_adjusted_earnings: 100_000 + eitc_earned_income: 100_000 adjusted_gross_income: 10_000 filing_status: JOINT households: @@ -121,7 +121,7 @@ members: [person1, person2, person3, person4] ctc_qualifying_children: 1 mn_wfc_eligible: true - filer_adjusted_earnings: 10_000 + eitc_earned_income: 10_000 adjusted_gross_income: 45_000 filing_status: JOINT households: @@ -156,7 +156,7 @@ members: [person1, person2, person3, person4] ctc_qualifying_children: 1 mn_wfc_eligible: true - filer_adjusted_earnings: 10_000 + eitc_earned_income: 10_000 adjusted_gross_income: 45_000 filing_status: SEPARATE households: @@ -183,7 +183,7 @@ members: [person1, person2] ctc_qualifying_children: 0 mn_wfc_eligible: true - filer_adjusted_earnings: 10_000 + eitc_earned_income: 10_000 adjusted_gross_income: 12_000 filing_status: JOINT households: @@ -210,7 +210,7 @@ members: [person1, person2] ctc_qualifying_children: 0 mn_wfc_eligible: false - filer_adjusted_earnings: 10_000 + eitc_earned_income: 10_000 adjusted_gross_income: 12_000 filing_status: JOINT households: @@ -310,7 +310,7 @@ members: [person1, person2, person3] ctc_qualifying_children: 1 mn_wfc_eligible: true - filer_adjusted_earnings: 10_000 + eitc_earned_income: 10_000 adjusted_gross_income: 10_000 filing_status: JOINT households: @@ -352,7 +352,7 @@ members: [person1, person2, person3, person4] ctc_qualifying_children: 1 mn_wfc_eligible: true - filer_adjusted_earnings: 10_000 + eitc_earned_income: 10_000 adjusted_gross_income: 10_000 filing_status: JOINT households: @@ -414,7 +414,7 @@ members: [person1, person2] ctc_qualifying_children: 1 mn_wfc_eligible: true - filer_adjusted_earnings: 40_000 + eitc_earned_income: 40_000 adjusted_gross_income: 40_000 filing_status: SINGLE households: @@ -445,7 +445,7 @@ members: [person1, disabled_adult] ctc_qualifying_children: 0 mn_wfc_eligible: true - filer_adjusted_earnings: 10_000 + eitc_earned_income: 10_000 adjusted_gross_income: 10_000 filing_status: JOINT households: @@ -479,7 +479,7 @@ members: [person1, adult] ctc_qualifying_children: 0 mn_wfc_eligible: true - filer_adjusted_earnings: 10_000 + eitc_earned_income: 10_000 adjusted_gross_income: 10_000 filing_status: JOINT households: @@ -517,7 +517,7 @@ members: [person1, person2, person3] ctc_qualifying_children: 1 mn_wfc_eligible: true - filer_adjusted_earnings: 10_000 + eitc_earned_income: 10_000 adjusted_gross_income: 10_000 filing_status: JOINT households: @@ -557,7 +557,7 @@ members: [person1, person2, person3] ctc_qualifying_children: 1 mn_wfc_eligible: true - filer_adjusted_earnings: 10_000 + eitc_earned_income: 10_000 adjusted_gross_income: 10_000 filing_status: JOINT households: @@ -566,3 +566,61 @@ state_code: MN output: mn_child_and_working_families_credits: 2_129.2 + +# Schedule M1CWFC, line 2 takes earned income from federal EIC Worksheet B: +# both spouses combined, a net self-employment loss subtracted, not less than +# zero. Line 10 is the greater of AGI (line 1) and line 2. +- name: 2024 joint, one spouse's self-employment loss exceeds the other's wages + period: 2024 + absolute_error_margin: 0.01 + input: + people: + head: + age: 37 + self_employment_income: -200_000 + spouse: + age: 37 + employment_income: 117_548 + child1: + age: 8 + child2: + age: 4 + tax_units: + tax_unit: + members: [head, spouse, child1, child2] + households: + household: + members: [head, spouse, child1, child2] + state_code: MN + output: + # Line 2 is 0 and line 1 is negative, so there is no phaseout: + # 2 x $1,750 CTC + 4% x 0 WFC. NBER TAXSIM-35 also gives $3,500. + eitc_earned_income: 0 + mn_child_and_working_families_credits: 3_500 + +- name: 2024 joint, a self-employment loss reduces the earned income used for the phaseout + period: 2024 + absolute_error_margin: 0.01 + input: + people: + head: + age: 37 + self_employment_income: -20_000 + spouse: + age: 37 + employment_income: 60_000 + child1: + age: 8 + child2: + age: 4 + tax_units: + tax_unit: + members: [head, spouse, child1, child2] + households: + household: + members: [head, spouse, child1, child2] + state_code: MN + output: + eitc_earned_income: 40_000 + # 4% x $9,220 + 2 x $1,750 = $3,868.80; less 12% x ($40,000 - $36,880) = $374.40 + mn_child_and_working_families_credits: 3_494.40 diff --git a/policyengine_us/tests/policy/baseline/gov/states/mn/tax/income/credits/mn_wfc.yaml b/policyengine_us/tests/policy/baseline/gov/states/mn/tax/income/credits/mn_wfc.yaml index a9c87e4ec05..97acceccb03 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/mn/tax/income/credits/mn_wfc.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/mn/tax/income/credits/mn_wfc.yaml @@ -5,7 +5,7 @@ mn_wfc_eligible: true filing_status: JOINT eitc_child_count: 2 - filer_adjusted_earnings: 20_050 + eitc_earned_income: 20_050 adjusted_gross_income: 20_050 state_code: MN output: # expected output from lookup table in Form M1 instructions @@ -18,7 +18,7 @@ mn_wfc_eligible: true filing_status: HEAD_OF_HOUSEHOLD eitc_child_count: 1 - filer_adjusted_earnings: 30_050 + eitc_earned_income: 30_050 adjusted_gross_income: 30_050 state_code: MN output: # expected output from lookup table in Form M1 instructions @@ -31,7 +31,7 @@ mn_wfc_eligible: true filing_status: JOINT eitc_child_count: 2 - filer_adjusted_earnings: 20_050 + eitc_earned_income: 20_050 adjusted_gross_income: 20_050 state_code: MN output: # expected output from lookup table in Form M1 instructions @@ -44,7 +44,7 @@ mn_wfc_eligible: true filing_status: HEAD_OF_HOUSEHOLD eitc_child_count: 1 - filer_adjusted_earnings: 30_050 + eitc_earned_income: 30_050 adjusted_gross_income: 30_050 state_code: MN output: # expected output from lookup table in Form M1 instructions diff --git a/policyengine_us/tests/policy/contrib/states/mn/walz/mn_walz_hf1938.yaml b/policyengine_us/tests/policy/contrib/states/mn/walz/mn_walz_hf1938.yaml index f6a95c657b2..ba403f7eda6 100644 --- a/policyengine_us/tests/policy/contrib/states/mn/walz/mn_walz_hf1938.yaml +++ b/policyengine_us/tests/policy/contrib/states/mn/walz/mn_walz_hf1938.yaml @@ -52,7 +52,7 @@ filing_status: SEPARATE mn_wfc_eligible: true eitc_child_count: 2 - filer_adjusted_earnings: 20_050 + eitc_earned_income: 20_050 adjusted_gross_income: 20_050 households: household: @@ -87,7 +87,7 @@ filing_status: SEPARATE mn_wfc_eligible: true eitc_child_count: 2 - filer_adjusted_earnings: 20_050 + eitc_earned_income: 20_050 adjusted_gross_income: 20_050 households: household: diff --git a/policyengine_us/variables/gov/states/mn/tax/income/credits/mn_child_and_working_families_credits.py b/policyengine_us/variables/gov/states/mn/tax/income/credits/mn_child_and_working_families_credits.py index 77034a7320d..b0972f570f6 100644 --- a/policyengine_us/variables/gov/states/mn/tax/income/credits/mn_child_and_working_families_credits.py +++ b/policyengine_us/variables/gov/states/mn/tax/income/credits/mn_child_and_working_families_credits.py @@ -29,8 +29,11 @@ def formula(tax_unit, period, parameters): base_ctc_amount = qualifying_children * p.ctc.amount # Working Family Credit computation: wfc_eligible = tax_unit("mn_wfc_eligible", period) - # The credit is phased in based on earnings - earnings = tax_unit("filer_adjusted_earnings", period) + # The credit is phased in based on earned income. Schedule M1CWFC, + # line 2 takes it from federal EIC Worksheet B: both spouses' + # earnings combined, with a net self-employment loss subtracted, + # and not less than zero. + earnings = tax_unit("eitc_earned_income", period) base_wfc_credit = p.wfc.phase_in.calc(earnings) person = tax_unit.members # Minn. Stat. 290.0671, subd. 1a defines a qualifying older child as diff --git a/policyengine_us/variables/gov/states/mn/tax/income/credits/mn_wfc.py b/policyengine_us/variables/gov/states/mn/tax/income/credits/mn_wfc.py index 453e99d7b22..c1a3f29360e 100644 --- a/policyengine_us/variables/gov/states/mn/tax/income/credits/mn_wfc.py +++ b/policyengine_us/variables/gov/states/mn/tax/income/credits/mn_wfc.py @@ -17,8 +17,9 @@ def formula(tax_unit, period, parameters): p = parameters(period).gov.states.mn.tax.income.credits.cwfc # determine count of eligible dependents using EITC rules count = tax_unit("eitc_child_count", period) - # determine pre-phaseout credit amount using EITC earnings - earnings = tax_unit("filer_adjusted_earnings", period) + # determine pre-phaseout credit amount using EITC earned income + # (both spouses combined, net of a self-employment loss) + earnings = tax_unit("eitc_earned_income", period) capped_earn = min_( earnings, p.wfc.pre_cwfc_legislation.phase_in.earnings_maximum.calc(count),