From cf5be2cbb445e2374f1cbebe63fbe669a62a4e03 Mon Sep 17 00:00:00 2001 From: David Trimmer Date: Wed, 26 Aug 2026 09:40:25 -0400 Subject: [PATCH 1/3] Remove Montana property tax rebate from non-refundable credit list The Montana Property Tax Rebate (up to $675 for TY2022-2023) is a standalone rebate claimed on a separate application to the Department of Revenue, not a Form 2 nonrefundable income-tax credit. It was listed in gov.states.mt.tax.income.credits.non_refundable, so it reduced Montana income tax; and because the person-level aggregator mt_non_refundable_credits adds the tax-unit-level $675 rebate, PolicyEngine projected it onto every household member (e.g. $675 x 3 = $2,025 for a family of three), understating MT tax. Remove it from the 2022-01-01 credit list, leaving mt_capital_gain_credit. The rebate variable still computes its $675 value; it simply no longer reduces income tax. Restores mt_income_tax to 5,708.16 for the issue household (was 3,683.16), matching the TaxAct return. Fixes #9347. Co-Authored-By: Claude Opus 4.8 Claude-Session: https://claude.ai/code/session_018ECQhxDkVchXm1RNVyqwnx --- changelog_entry.yaml | 4 +++ .../mt/tax/income/credits/non_refundable.yaml | 1 - .../gov/states/mt/tax/income/integration.yaml | 36 +++++++++++++++++++ 3 files changed, 40 insertions(+), 1 deletion(-) create mode 100644 changelog_entry.yaml diff --git a/changelog_entry.yaml b/changelog_entry.yaml new file mode 100644 index 00000000000..872e8ebe233 --- /dev/null +++ b/changelog_entry.yaml @@ -0,0 +1,4 @@ +- bump: patch + changes: + fixed: + - Removed the Montana property tax rebate from the state non-refundable credit list so it no longer reduces Montana income tax. diff --git a/policyengine_us/parameters/gov/states/mt/tax/income/credits/non_refundable.yaml b/policyengine_us/parameters/gov/states/mt/tax/income/credits/non_refundable.yaml index 8c79519aa4c..bbd61f3ed1e 100644 --- a/policyengine_us/parameters/gov/states/mt/tax/income/credits/non_refundable.yaml +++ b/policyengine_us/parameters/gov/states/mt/tax/income/credits/non_refundable.yaml @@ -5,7 +5,6 @@ values: - mt_income_tax_rebate 2022-01-01: - mt_capital_gain_credit - - mt_property_tax_rebate 2024-01-01: [] metadata: unit: list diff --git a/policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/integration.yaml b/policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/integration.yaml index 83209df9ad4..9b610d880c9 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/integration.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/integration.yaml @@ -567,3 +567,39 @@ # Files separately: 5,099.51 - 1,250 + 3,719.51 - 1,250 = 6,319.02 # (old double-count subtracted $2,500 per column, understating tax by $2,500) mt_income_tax: 6_319.02 + +- name: MT property tax rebate is not a Form 2 credit and is not tripled (issue 9347) + absolute_error_margin: 0.01 + period: 2023 + input: + people: + person1: + is_tax_unit_head: true + age: 26 + employment_income: 110_625.07 + taxable_interest_income: 204.41 + real_estate_taxes: 2_754.52 + person2: + is_tax_unit_spouse: true + age: 25 + employment_income: 3_414.32 + person3: + is_tax_unit_dependent: true + age: 10 + tax_units: + tax_unit: + members: [person1, person2, person3] + spm_units: + spm_unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + state_fips: 30 + output: + # The $675 standalone property tax rebate is still computed as its own variable + mt_property_tax_rebate: 675 + # but it is not a Form 2 non-refundable credit. Before the fix it was booked + # as a credit and projected onto every household member (675 x 3 = 2,025), + # understating Montana income tax; it must contribute 0 to each person. + mt_non_refundable_credits: [0, 0, 0] From 3066fdce840330ef55ddab14dab4e30046e9fd4f Mon Sep 17 00:00:00 2001 From: David Trimmer Date: Wed, 26 Aug 2026 10:44:39 -0400 Subject: [PATCH 2/3] Use changelog.d fragment instead of changelog_entry.yaml Co-Authored-By: Claude Opus 4.8 Claude-Session: https://claude.ai/code/session_018ECQhxDkVchXm1RNVyqwnx --- changelog.d/mt-property-tax-rebate.fixed.md | 1 + changelog_entry.yaml | 4 ---- 2 files changed, 1 insertion(+), 4 deletions(-) create mode 100644 changelog.d/mt-property-tax-rebate.fixed.md delete mode 100644 changelog_entry.yaml diff --git a/changelog.d/mt-property-tax-rebate.fixed.md b/changelog.d/mt-property-tax-rebate.fixed.md new file mode 100644 index 00000000000..9f3214451af --- /dev/null +++ b/changelog.d/mt-property-tax-rebate.fixed.md @@ -0,0 +1 @@ +Removed the Montana property tax rebate from the state non-refundable credit list so it no longer reduces Montana income tax. diff --git a/changelog_entry.yaml b/changelog_entry.yaml deleted file mode 100644 index 872e8ebe233..00000000000 --- a/changelog_entry.yaml +++ /dev/null @@ -1,4 +0,0 @@ -- bump: patch - changes: - fixed: - - Removed the Montana property tax rebate from the state non-refundable credit list so it no longer reduces Montana income tax. From 9792584858f0526d8eaf20163a04961652f9c7bc Mon Sep 17 00:00:00 2001 From: David Trimmer Date: Fri, 28 Aug 2026 09:51:33 -0400 Subject: [PATCH 3/3] Address 8/27 review: refresh MT refs, add removal citation and tests Applies the Should-Address and Suggestion items from PavelMakarchuk's 2026-08-27 review. No substantive change to the removal; no parameter value changed. - A1: refresh dead mtrevenue.gov reference hrefs to live revenuefiles.mt.gov URLs (all verified HTTP 200), correct the 2022 anchor #page=17 -> #page=16, name the 2025 reference section, drop trailing whitespace. - A2: cite the removal itself with the 2023 Form 2 What's New (p.5): the property tax rebate is claimed via TAP/Form MPTR23 and is income-tax-exempt, not a Form 2 nonrefundable credit. - A3: add a period 2022 sibling case (the removed entry governed TY2022 too). - A4: assert mt_income_tax 5,708.16 on the issue-9347 case (TaxAct-verified). - A5: add an aggregate test pinning the rebate is rerouted to taxsim_state_property_tax_credit (675), not dropped. - S1: use state_code MT and drop the unneeded spm_units block on the new case. - S2: add a 2024 case covering the empty non-refundable list band. - S3: relabel the mislabeled 676->675 rebate case and add the 675->675 boundary. - S4: note the unmodeled statutory eligibility conditions on the rebate variable. Co-Authored-By: Claude Opus 4.8 Claude-Session: https://claude.ai/code/session_01YCwrSsGY7vPCpKYGfV1xRr --- .../mt/tax/income/credits/non_refundable.yaml | 12 ++-- .../mt_property_tax_rebate_in_aggregate.yaml | 26 ++++++++ .../rebate/mt_property_tax_rebate.yaml | 10 ++- .../gov/states/mt/tax/income/integration.yaml | 65 +++++++++++++++++-- .../credits/rebate/mt_property_tax_rebate.py | 5 ++ 5 files changed, 108 insertions(+), 10 deletions(-) create mode 100644 policyengine_us/tests/policy/baseline/gov/states/household/state_property_tax_credits/mt_property_tax_rebate_in_aggregate.yaml diff --git a/policyengine_us/parameters/gov/states/mt/tax/income/credits/non_refundable.yaml b/policyengine_us/parameters/gov/states/mt/tax/income/credits/non_refundable.yaml index bbd61f3ed1e..8035a51a351 100644 --- a/policyengine_us/parameters/gov/states/mt/tax/income/credits/non_refundable.yaml +++ b/policyengine_us/parameters/gov/states/mt/tax/income/credits/non_refundable.yaml @@ -10,13 +10,15 @@ metadata: unit: list period: year label: Montana non-refundable tax credits - reference: + reference: - title: 2023 Montana Form 2 Individual Income Tax Instructions, Net Long-Term Capital Gains Tax Rates - href: https://mtrevenue.gov/wp-content/uploads/dlm_uploads/2023/12/Form_2_2023_Instructions.pdf#page=6 + href: https://revenuefiles.mt.gov/files/Forms/Montana-Individual-Income-Tax-Return-Form-2-Instructions/2023_Montana_Individual_Income_Tax_Return_Form_2_Instructions.pdf#page=6 - title: 2021 Montana Form 2 Individual Income Tax Instructions, Line 19 Nonrefundable Credits - href: https://mtrevenue.gov/wp-content/uploads/mdocs/form%202%202021%20instructions.pdf#page=16 + href: https://revenuefiles.mt.gov/files/Forms/Montana-Individual-Income-Tax-Return-Form-2-Instructions/2021_Montana_Individual_Income_Tax_Return_Form_2_Instructions.pdf#page=16 - title: 2022 Montana Form 2 Individual Income Tax Instructions, Line 19 Nonrefundable Credits - href: https://mtrevenue.gov/wp-content/uploads/dlm_uploads/2022/12/Form-2-2022-Instructions.pdf#page=17 - - title: 2025 Montana Form 2 Instructions + href: https://revenuefiles.mt.gov/files/Forms/Montana-Individual-Income-Tax-Return-Form-2-Instructions/2022_Montana_Individual_Income_Tax_Return_Form_2_Instructions.pdf#page=16 + - title: 2023 Montana Form 2 Individual Income Tax Instructions, What's New - Property Tax Rebates (rebate claimed via TransAction Portal or Form MPTR23; exempt from Montana income tax, not a Form 2 nonrefundable credit) + href: https://revenuefiles.mt.gov/files/Forms/Montana-Individual-Income-Tax-Return-Form-2-Instructions/2023_Montana_Individual_Income_Tax_Return_Form_2_Instructions.pdf#page=5 + - title: 2025 Montana Form 2 Instructions, Schedule III - Tax Credits, Part I - Nonrefundable Credits href: https://revenuefiles.mt.gov/files/Forms/Montana-Individual-Income-Tax-Return-Form-2-Instructions/2025_Montana_Individual_Income_Tax_Return_Form_2_Instructions.pdf#page=36 diff --git a/policyengine_us/tests/policy/baseline/gov/states/household/state_property_tax_credits/mt_property_tax_rebate_in_aggregate.yaml b/policyengine_us/tests/policy/baseline/gov/states/household/state_property_tax_credits/mt_property_tax_rebate_in_aggregate.yaml new file mode 100644 index 00000000000..3abf3612f58 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/household/state_property_tax_credits/mt_property_tax_rebate_in_aggregate.yaml @@ -0,0 +1,26 @@ +# Pins that the Montana property tax rebate is REROUTED into the state property +# tax credits aggregate (taxsim_state_property_tax_credit), not dropped, after it +# was removed from the Form 2 non-refundable credit list (issue 9347 / PR 9348). +# mt_property_tax_rebate is in the year-keyed aggregate list from 2022-01-01. + +- name: MT property tax rebate flows into the state property tax credits aggregate + period: 2023 + absolute_error_margin: 0.01 + input: + people: + head: + age: 40 + employment_income: 50_000 + real_estate_taxes: 2_000 + tax_units: + tax_unit: + members: [head] + households: + household: + members: [head] + state_code: MT + output: + # Non-elderly single filer: elderly homeowner/renter credit = 0, so the only + # contributor to the aggregate is the $675 property tax rebate. + mt_property_tax_rebate: 675 + taxsim_state_property_tax_credit: 675 diff --git a/policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/credits/rebate/mt_property_tax_rebate.yaml b/policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/credits/rebate/mt_property_tax_rebate.yaml index 972cd9e403c..b2c717f534e 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/credits/rebate/mt_property_tax_rebate.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/credits/rebate/mt_property_tax_rebate.yaml @@ -6,10 +6,18 @@ output: mt_property_tax_rebate: 600 -- name: Property tax less than rebate amount +- name: Property tax greater than rebate amount period: 2023 input: real_estate_taxes: 676 state_code: MT output: mt_property_tax_rebate: 675 + +- name: Property tax equal to rebate amount + period: 2023 + input: + real_estate_taxes: 675 + state_code: MT + output: + mt_property_tax_rebate: 675 diff --git a/policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/integration.yaml b/policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/integration.yaml index 9b610d880c9..1427235ceaa 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/integration.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/integration.yaml @@ -589,13 +589,10 @@ tax_units: tax_unit: members: [person1, person2, person3] - spm_units: - spm_unit: - members: [person1, person2, person3] households: household: members: [person1, person2, person3] - state_fips: 30 + state_code: MT output: # The $675 standalone property tax rebate is still computed as its own variable mt_property_tax_rebate: 675 @@ -603,3 +600,63 @@ # as a credit and projected onto every household member (675 x 3 = 2,025), # understating Montana income tax; it must contribute 0 to each person. mt_non_refundable_credits: [0, 0, 0] + # TaxAct-verified Montana income tax: pre-fix 3,683.16 wrongly subtracted the + # 2,025 phantom credit; post-fix the full 5,708.16 is owed. + mt_income_tax: 5_708.16 + +- name: MT property tax rebate is not a Form 2 credit in 2022 either (issue 9347) + # The removed non-refundable list entry governed TY2022 and TY2023; 2023 is + # covered above, this case pins the 2022 tax year. In 2022 the non-refundable + # list is [mt_capital_gain_credit] only, so wage earners get 0 per person. + absolute_error_margin: 0.01 + period: 2022 + input: + people: + person1: + is_tax_unit_head: true + age: 26 + employment_income: 110_625.07 + taxable_interest_income: 204.41 + real_estate_taxes: 2_754.52 + person2: + is_tax_unit_spouse: true + age: 25 + employment_income: 3_414.32 + person3: + is_tax_unit_dependent: true + age: 10 + tax_units: + tax_unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + state_code: MT + output: + # The $675 standalone property tax rebate is computed (amount defined 2022-01-01) + mt_property_tax_rebate: 675 + # but it is not a Form 2 non-refundable credit, so it contributes 0 per person. + mt_non_refundable_credits: [0, 0, 0] + +- name: MT non-refundable credit list is empty in 2024 (issue 9347) + # The 2024-01-01 band of the non-refundable list is [], so the aggregate is a + # scalar 0 regardless of the property tax rebate. + absolute_error_margin: 0.01 + period: 2024 + input: + people: + person1: + is_tax_unit_head: true + age: 40 + employment_income: 50_000 + long_term_capital_gains: 10_000 + real_estate_taxes: 2_000 + tax_units: + tax_unit: + members: [person1] + households: + household: + members: [person1] + state_code: MT + output: + mt_non_refundable_credits: 0 diff --git a/policyengine_us/variables/gov/states/mt/tax/income/credits/rebate/mt_property_tax_rebate.py b/policyengine_us/variables/gov/states/mt/tax/income/credits/rebate/mt_property_tax_rebate.py index aed0c4e058e..b3dce1d6ae7 100644 --- a/policyengine_us/variables/gov/states/mt/tax/income/credits/rebate/mt_property_tax_rebate.py +++ b/policyengine_us/variables/gov/states/mt/tax/income/credits/rebate/mt_property_tax_rebate.py @@ -11,6 +11,11 @@ class mt_property_tax_rebate(Variable): defined_for = StateCode.MT def formula(tax_unit, period, parameters): + # Modeling limitation: this does not encode the statutory eligibility + # conditions for the rebate (principal residence; at least 7 months of + # ownership and occupancy during the year; property taxes billed and + # paid; a timely rebate claim). Revisit if the rebate is ever wired + # into a benefit-side channel where those conditions would bind. p = parameters(period).gov.states.mt.tax.income.credits.rebate.property person = tax_unit.members mt_property_tax = person("real_estate_taxes", period)