From cce9071f2479a77efecc7f8225915d2ccfc94bb4 Mon Sep 17 00:00:00 2001 From: David Trimmer Date: Tue, 3 Nov 2026 10:01:55 -0500 Subject: [PATCH 1/2] Count Montana refundable credits received, not this year's, in elderly credit income MCA 15-30-2337(4) counts income received during the year, and ARM 42.4.301(2)(c) counts "any state refundable tax credits received". Schedule 2EC line 8 still took the Montana EITC from this year's return, which is paid after the year ends. A Montana receipt input (default 0) replaces it in the 2017 and 2023 source lists, as the federal credits already do; the 2009 list drops it, since Montana had no other refundable credit before 2019. taxsim #1492 (2024, single, 63): the credit moves from 235.27 to 237.73 (TaxAct 237). Worked cases that supply federal receipts now supply the Montana receipt the same way; the 2021 case drops the 2.45 Montana EITC paid in 2022 (63.33 -> 63.45). Co-Authored-By: Claude Opus 5.5 (1M context) --- ...e-bugs-mt-disability-ehrc-elderly.fixed.md | 2 +- .../gross_income_sources.yaml | 22 ++++--- ...mt_elderly_homeowner_or_renter_credit.yaml | 58 +++++++++++++++++-- ..._renter_credit_gross_household_income.yaml | 6 ++ ...est_mt_elderly_credit_household_members.py | 4 +- ...est_mt_elderly_credit_nontaxable_income.py | 5 +- ...st_mt_elderly_credit_refundable_credits.py | 22 +++---- ..._renter_credit_state_refundable_credits.py | 30 ++++++++++ 8 files changed, 117 insertions(+), 32 deletions(-) create mode 100644 policyengine_us/variables/gov/states/mt/tax/income/credits/mt_elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit_state_refundable_credits.py diff --git a/changelog.d/statute-bugs-mt-disability-ehrc-elderly.fixed.md b/changelog.d/statute-bugs-mt-disability-ehrc-elderly.fixed.md index 7aedae846e4..8ddd6d50972 100644 --- a/changelog.d/statute-bugs-mt-disability-ehrc-elderly.fixed.md +++ b/changelog.d/statute-bugs-mt-disability-ehrc-elderly.fixed.md @@ -1 +1 @@ -End Montana's disability income exclusion with its 2024 repeal, count only the federal refundable credits a household actually received (by default the 2020 and 2021 Economic Impact Payments) in the elderly homeowner/renter credit's gross household income, and require that credit's claimant to meet the six-month owner, renter or lessee occupancy and nine-month residence tests (MCA 15-30-2338(1)(b)-(c)). +End Montana's disability income exclusion with its 2024 repeal, count only the federal and Montana refundable credits a household actually received (by default the 2020 and 2021 Economic Impact Payments, and no Montana credits) in the elderly homeowner/renter credit's gross household income, and require that credit's claimant to meet the six-month owner, renter or lessee occupancy and nine-month residence tests (MCA 15-30-2338(1)(b)-(c)). diff --git a/policyengine_us/parameters/gov/states/mt/tax/income/credits/elderly_homeowner_or_renter/gross_income_sources.yaml b/policyengine_us/parameters/gov/states/mt/tax/income/credits/elderly_homeowner_or_renter/gross_income_sources.yaml index fccbdf3a096..6046db17fb7 100644 --- a/policyengine_us/parameters/gov/states/mt/tax/income/credits/elderly_homeowner_or_renter/gross_income_sources.yaml +++ b/policyengine_us/parameters/gov/states/mt/tax/income/credits/elderly_homeowner_or_renter/gross_income_sources.yaml @@ -83,17 +83,15 @@ values: # unemployment"; Schedule 2EC line 14 from 2024, the total received). - mt_elderly_homeowner_or_renter_credit_unemployment_compensation_addback # Refundable credits received (2023 schedule line 7, Schedule 2EC line 8 - # from 2024): Montana's refundable credits other than this credit, - # and this credit as received during the year (ARM 42.4.301(2)(c)). - # Known gap: mt_refundable_credits_before_renter_credit is the Montana - # refundable credits on this year's return, which are paid after the - # year ends, not the Montana credits received during the year (MCA - # 15-30-2337(4)). Federal credits use receipts from 2017. - - mt_refundable_credits_before_renter_credit + # from 2024): this credit as received during the year (ARM + # 42.4.301(2)(c)). Before 2019 Montana had no other refundable credit; + # Montana credits received count from 2017, with the federal ones. - mt_elderly_homeowner_or_renter_credit_received - # ARM 42.4.301(2)(b), amended effective 11/10/2017, counts "federal - # refundable credits received"; the 2017 Form 2EC worksheet counts "any - # federal or state refundable credits". + # ARM 42.4.301(2)(b)-(c), amended effective 11/10/2017, counts "federal + # refundable credits received" and "any state refundable credits + # received"; the 2017 Form 2EC worksheet counts "any federal or state + # refundable credits". Both are receipts during the year, not the credits + # on this year's return (MCA 15-30-2337(4)). 2017-01-01: - adjusted_gross_income_person - tax_exempt_interest_income @@ -110,7 +108,7 @@ values: - gi_cash_assistance - tax_exempt_disability_benefits - mt_elderly_homeowner_or_renter_credit_unemployment_compensation_addback - - mt_refundable_credits_before_renter_credit + - mt_elderly_homeowner_or_renter_credit_state_refundable_credits - mt_elderly_homeowner_or_renter_credit_received - mt_elderly_homeowner_or_renter_credit_federal_refundable_credits # Actual rebate receipts count under the statutory nontaxable-income @@ -133,7 +131,7 @@ values: - gi_cash_assistance - tax_exempt_disability_benefits - mt_elderly_homeowner_or_renter_credit_unemployment_compensation_addback - - mt_refundable_credits_before_renter_credit + - mt_elderly_homeowner_or_renter_credit_state_refundable_credits - mt_elderly_homeowner_or_renter_credit_received - mt_elderly_homeowner_or_renter_credit_federal_refundable_credits - mt_elderly_homeowner_or_renter_credit_property_tax_rebate_received diff --git a/policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/credits/elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit.yaml b/policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/credits/elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit.yaml index 47aed5c8586..0266bfc0029 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/credits/elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/credits/elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit.yaml @@ -230,12 +230,11 @@ # Economic Impact Payments". Received in 2021: the 1_400 Economic Impact # Payment (the 2021 recovery rebate credit, which the model counts by # default). The 2021 federal EITC (ARPA, no qualifying child), 1_502 - - # 15.3% x (20_892.60 - 11_610) = 81.76, is paid in 2022, so it is not; - # the Montana EITC on the 2021 return, 3% = 2.45, counts as the model's - # Montana refundable credits. Line 10 = 20_892.60 + 1_400 + 2.45 = - # 22_295.05; line 12 = 15_995.05; line 14 = 799.75; line 19 = 863.08 - - # 799.75 = 63.33. - mt_elderly_homeowner_or_renter_credit: 63.33 + # 15.3% x (20_892.60 - 11_610) = 81.76, is paid in 2022, so it is not, + # and nor is the Montana EITC on the 2021 return, 3% = 2.45. Line 10 = + # 20_892.60 + 1_400 = 22_292.60; line 12 = 15_992.60; line 14 = 799.63; + # line 19 = 863.08 - 799.63 = 63.45. + mt_elderly_homeowner_or_renter_credit: 63.45 - name: MT EHRC uses the $12,600 exclusion from 2022 (HB 191) period: 2022 @@ -941,6 +940,8 @@ employment_income: 10_000 # Federal EITC refund received during 2024. mt_elderly_homeowner_or_renter_credit_federal_refundable_credits: 632 + # Montana EITC refund received during 2024. + mt_elderly_homeowner_or_renter_credit_state_refundable_credits: 63.20 tax_units: tax_unit1: members: [person1] @@ -977,6 +978,8 @@ employment_income: 10_000 # Federal EITC and refundable CTC received during 2024. mt_elderly_homeowner_or_renter_credit_federal_refundable_credits: 4_525 + # Montana EITC refund received during 2024. + mt_elderly_homeowner_or_renter_credit_state_refundable_credits: 340 person3: age: 5 tax_units: @@ -1016,6 +1019,8 @@ employment_income: 12_000 # Federal EITC and refundable CTC received during 2024. mt_elderly_homeowner_or_renter_credit_federal_refundable_credits: 5_505 + # Montana EITC refund received during 2024. + mt_elderly_homeowner_or_renter_credit_state_refundable_credits: 408 person3: age: 5 tax_units: @@ -1086,6 +1091,8 @@ employment_income: 10_000 # Federal EITC refund received during 2023. mt_elderly_homeowner_or_renter_credit_federal_refundable_credits: 584.70 + # Montana EITC refund received during 2023. + mt_elderly_homeowner_or_renter_credit_state_refundable_credits: 17.54 tax_units: tax_unit1: members: [person1] @@ -1724,3 +1731,42 @@ # child's spouse; line 25 = 600; line 27 = 600; line 30 = 600. mt_elderly_homeowner_or_renter_credit_gross_rent: [4_000, 0] mt_elderly_homeowner_or_renter_credit: [600, 0, 0] + +- name: 2024 Schedule 2EC, this return's federal and Montana EITC are not refundable credits received in 2024 (taxsim 1492) + period: 2024 + absolute_error_margin: 1 + input: + people: + person1: + age: 63 + employment_income: 10_057.14 + social_security_retirement: 11_043.82 + rent: 3_795.12 + households: + household: + members: [person1] + state_code: MT + output: + # TaxAct Schedule 2EC line 18: 21,100. The 2024 federal EITC (632) and + # Montana EITC (63.20) are paid in 2025, so line 8 is 0. + mt_elderly_homeowner_or_renter_credit_state_refundable_credits: 0 + mt_elderly_homeowner_or_renter_credit_gross_household_income: 21_100.96 + mt_elderly_homeowner_or_renter_credit: 237.73 # TaxAct line 30: 237 + +- name: 2024 Schedule 2EC, a Montana EITC refund received in 2024 from the 2023 return counts on line 8 + period: 2024 + absolute_error_margin: 1 + input: + people: + person1: + age: 63 + employment_income: 10_057.14 + social_security_retirement: 11_043.82 + rent: 3_795.12 + mt_elderly_homeowner_or_renter_credit_state_refundable_credits: 60 + households: + household: + members: [person1] + state_code: MT + output: + mt_elderly_homeowner_or_renter_credit_gross_household_income: 21_160.96 diff --git a/policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/credits/elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit_gross_household_income.yaml b/policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/credits/elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit_gross_household_income.yaml index 158c5386cbf..73347b8029f 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/credits/elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit_gross_household_income.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/credits/elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit_gross_household_income.yaml @@ -207,6 +207,8 @@ employment_income: 10_000 # Federal EITC refund received during 2024. mt_elderly_homeowner_or_renter_credit_federal_refundable_credits: 632 + # Montana EITC refund received during 2024. + mt_elderly_homeowner_or_renter_credit_state_refundable_credits: 63.20 tax_units: tax_unit1: members: [person1] @@ -240,6 +242,8 @@ employment_income: 10_000 # Federal EITC and refundable CTC received during 2024. mt_elderly_homeowner_or_renter_credit_federal_refundable_credits: 4_525 + # Montana EITC refund received during 2024. + mt_elderly_homeowner_or_renter_credit_state_refundable_credits: 340 person3: age: 5 tax_units: @@ -531,6 +535,8 @@ employment_income: 25_000 # Federal EITC and refundable CTC received during 2024. mt_elderly_homeowner_or_renter_credit_federal_refundable_credits: 9_854.83 + # Montana EITC refund received during 2024. + mt_elderly_homeowner_or_renter_credit_state_refundable_credits: 647.98 person3: age: 5 person4: diff --git a/policyengine_us/tests/test_mt_elderly_credit_household_members.py b/policyengine_us/tests/test_mt_elderly_credit_household_members.py index bb0ef7d06ec..91459ff2d47 100644 --- a/policyengine_us/tests/test_mt_elderly_credit_household_members.py +++ b/policyengine_us/tests/test_mt_elderly_credit_household_members.py @@ -151,7 +151,9 @@ def calculate(cases): dependent = np.asarray(simulation.calculate("is_tax_unit_dependent", YEAR)) other_refundable_credits = np.asarray( simulation.calculate( - "mt_refundable_credits_before_renter_credit", YEAR, map_to="household" + "mt_elderly_homeowner_or_renter_credit_state_refundable_credits", + YEAR, + map_to="household", ) ) federal_refundable_credits = np.asarray( diff --git a/policyengine_us/tests/test_mt_elderly_credit_nontaxable_income.py b/policyengine_us/tests/test_mt_elderly_credit_nontaxable_income.py index 3090ca71bfc..c1be241cac7 100644 --- a/policyengine_us/tests/test_mt_elderly_credit_nontaxable_income.py +++ b/policyengine_us/tests/test_mt_elderly_credit_nontaxable_income.py @@ -211,7 +211,10 @@ def by_household(variable, year): "mt_elderly_homeowner_or_renter_credit_federal_refundable_credits", year, ) - + by_household("mt_refundable_credits_before_renter_credit", year), + + by_household( + "mt_elderly_homeowner_or_renter_credit_state_refundable_credits", + year, + ), } for year in YEARS } diff --git a/policyengine_us/tests/test_mt_elderly_credit_refundable_credits.py b/policyengine_us/tests/test_mt_elderly_credit_refundable_credits.py index 7a2403a605e..ebe84e0fcf3 100644 --- a/policyengine_us/tests/test_mt_elderly_credit_refundable_credits.py +++ b/policyengine_us/tests/test_mt_elderly_credit_refundable_credits.py @@ -144,13 +144,13 @@ def assert_properties(cases): def test_worked_example(): """2024 Schedule 2EC: the claimant's line 5 pension 20,000; the daughter's wages 10,000 (line 17). Her 2024 return has a federal EITC of - 34% x 10,000 = 3,400 and a refundable child tax credit of min(1,700, 15% - x 7,500) = 1,125, paid in 2025, so they are not received in 2024. Line 8 - counts the 4,525 of federal credits she received during 2024 and her - Montana EITC of 340. Line 18 = 34,865; line 22 = (34,865 - 12,600) x - 0.05 = 1,113.25; line 27 = 2,000 - 1,113.25 = 886.75; line 30 = 886.75. - With nothing received, line 18 = 30,340, line 22 = 887 and line 30 = - 1,113.""" + 34% x 10,000 = 3,400, a refundable child tax credit of min(1,700, 15% x + 7,500) = 1,125 and a Montana EITC of 340, all paid in 2025, so none is + received in 2024. Line 8 counts the 4,525 of federal credits she + received during 2024. Line 18 = 34,525; line 22 = (34,525 - 12,600) x + 0.05 = 1,096.25; line 27 = 2,000 - 1,096.25 = 903.75; line 30 = 903.75. + With nothing received, line 18 = 30,000, line 22 = 870 and line 30 = + 1,130.""" case = { "claimant_age": 70, "pension": 20_000, @@ -166,10 +166,10 @@ def test_worked_example(): z = calculate([case], received=False) assert z["federal_tax_unit"][0] == pytest.approx(4_525, abs=TOLERANCE) assert z["federal_person"][0] == 0 - assert w["gross"][0] == pytest.approx(34_865, abs=TOLERANCE) - assert w["credit"][0] == pytest.approx(886.75, abs=TOLERANCE) - assert z["gross"][0] == pytest.approx(30_340, abs=TOLERANCE) - assert z["credit"][0] == pytest.approx(1_113, abs=TOLERANCE) + assert w["gross"][0] == pytest.approx(34_525, abs=TOLERANCE) + assert w["credit"][0] == pytest.approx(903.75, abs=TOLERANCE) + assert z["gross"][0] == pytest.approx(30_000, abs=TOLERANCE) + assert z["credit"][0] == pytest.approx(1_130, abs=TOLERANCE) assert_properties([case]) diff --git a/policyengine_us/variables/gov/states/mt/tax/income/credits/mt_elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit_state_refundable_credits.py b/policyengine_us/variables/gov/states/mt/tax/income/credits/mt_elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit_state_refundable_credits.py new file mode 100644 index 00000000000..3258ec0e203 --- /dev/null +++ b/policyengine_us/variables/gov/states/mt/tax/income/credits/mt_elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit_state_refundable_credits.py @@ -0,0 +1,30 @@ +from policyengine_us.model_api import * + + +class mt_elderly_homeowner_or_renter_credit_state_refundable_credits(Variable): + value_type = float + entity = Person + label = "Montana refundable credits received, in Montana elderly homeowner/renter credit gross household income" + documentation = ( + "Montana refundable tax credit cash this person received during the " + "year, other than the elderly homeowner/renter credit, such as a " + "Montana earned income tax credit refund from the prior year's " + "return. Defaults to zero: the Montana credits claimed on this year's " + "return are paid after the year ends, so they do not establish a " + "receipt. The elderly homeowner/renter credit received enters " + "separately through mt_elderly_homeowner_or_renter_credit_received." + ) + unit = USD + definition_period = YEAR + defined_for = StateCode.MT + reference = ( + # MCA 15-30-2337(4): gross household income is "all income received + # by all individuals of a household" + "https://mca.legmt.gov/bills/mca/title_0150/chapter_0300/part_0230/section_0370/0150-0300-0230-0370.html", + # ARM 42.4.301(2)(c): "any state refundable tax credits received" + "https://rules.mt.gov/api/policy-library-public/collections/aec52c46-128e-4279-9068-8af5d5432d74/policies/c90ea93a-03a2-4605-a0f8-f2f3760198bf/document/768c8344-24ee-4950-9d5e-9d8fc97ec0f7", + # 2024 Schedule 2EC, line 8: "Combine all the refundable credits + # received by all household members in 2024", including "the federal + # and Montana earned income tax credits" + "https://revenue.mt.gov/files/forms/Montana-Individual-Income-Tax-Return-Form-2-Instructions/2024_Montana_Individual_Income_Tax_Return_Form_2_Instructions.pdf#page=47", + ) From 099a8ed11861522e97b594a7f85f7a789f962016 Mon Sep 17 00:00:00 2001 From: David Trimmer Date: Tue, 3 Nov 2026 14:41:12 -0500 Subject: [PATCH 2/2] Note that the property tax rebate has its own input (review G1) Co-Authored-By: Claude Opus 5.5 (1M context) --- ...ly_homeowner_or_renter_credit_state_refundable_credits.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/policyengine_us/variables/gov/states/mt/tax/income/credits/mt_elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit_state_refundable_credits.py b/policyengine_us/variables/gov/states/mt/tax/income/credits/mt_elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit_state_refundable_credits.py index 3258ec0e203..0c281935821 100644 --- a/policyengine_us/variables/gov/states/mt/tax/income/credits/mt_elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit_state_refundable_credits.py +++ b/policyengine_us/variables/gov/states/mt/tax/income/credits/mt_elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit_state_refundable_credits.py @@ -12,7 +12,10 @@ class mt_elderly_homeowner_or_renter_credit_state_refundable_credits(Variable): "return. Defaults to zero: the Montana credits claimed on this year's " "return are paid after the year ends, so they do not establish a " "receipt. The elderly homeowner/renter credit received enters " - "separately through mt_elderly_homeowner_or_renter_credit_received." + "separately through mt_elderly_homeowner_or_renter_credit_received, " + "and the Montana property tax rebate received through " + "mt_elderly_homeowner_or_renter_credit_property_tax_rebate_received, " + "so leave both out of this amount." ) unit = USD definition_period = YEAR