From 8ad186ab822c05156c9aad46cf93ba7442df7f4b Mon Sep 17 00:00:00 2001 From: PavelMakarchuk Date: Tue, 2 Jun 2026 09:41:07 -0400 Subject: [PATCH 1/3] Flow OBBBA Schedule 1-A deductions into MT taxable income MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Mont. Code Ann. § 15-30-2120 starts from federal taxable income, so the federal OBBBA Schedule 1-A deductions (the $6K enhanced senior deduction, qualified tip and overtime income exclusions, and passenger-vehicle loan interest) should flow into MT taxable income. PE-US's mt_agi_joint and mt_agi_indiv currently start from federal AGI and replicate the federal standard deduction in mt_standard_deduction, which understates MT subtractions by the Schedule 1-A amount. Add a new mt_federal_obbba_subtraction Person-level variable that projects the federal TaxUnit-level Schedule 1-A deductions onto the tax-unit head, and wire it into the subtractions list at 2025-01-01 (OBBBA effective date). Closes #8562. Co-Authored-By: Claude Opus 4.7 (1M context) --- ...-1a-deductions-to-mt-subtractions.fixed.md | 1 + .../tax/income/subtractions/subtractions.yaml | 10 +++ .../mt_federal_obbba_subtraction.yaml | 71 +++++++++++++++++++ .../mt_federal_obbba_subtraction.py | 22 ++++++ 4 files changed, 104 insertions(+) create mode 100644 changelog.d/add-obbba-schedule-1a-deductions-to-mt-subtractions.fixed.md create mode 100644 policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/subtractions/mt_federal_obbba_subtraction.yaml create mode 100644 policyengine_us/variables/gov/states/mt/tax/income/subtractions/mt_federal_obbba_subtraction.py diff --git a/changelog.d/add-obbba-schedule-1a-deductions-to-mt-subtractions.fixed.md b/changelog.d/add-obbba-schedule-1a-deductions-to-mt-subtractions.fixed.md new file mode 100644 index 00000000000..b4acbdc1815 --- /dev/null +++ b/changelog.d/add-obbba-schedule-1a-deductions-to-mt-subtractions.fixed.md @@ -0,0 +1 @@ +Flow the federal OBBBA Schedule 1-A deductions (enhanced senior deduction, qualified tip and overtime income exclusions, and passenger-vehicle loan interest) through into Montana taxable income, since Mont. Code Ann. § 15-30-2120 starts from federal taxable income. diff --git a/policyengine_us/parameters/gov/states/mt/tax/income/subtractions/subtractions.yaml b/policyengine_us/parameters/gov/states/mt/tax/income/subtractions/subtractions.yaml index dbb99828d57..11a88dd9454 100644 --- a/policyengine_us/parameters/gov/states/mt/tax/income/subtractions/subtractions.yaml +++ b/policyengine_us/parameters/gov/states/mt/tax/income/subtractions/subtractions.yaml @@ -12,6 +12,16 @@ values: - mt_tuition_subtraction_person - mt_old_age_subtraction - mt_disability_income_exclusion_person + 2025-01-01: + # Section 15-30-2120 starts from federal taxable income, so federal + # OBBBA Schedule 1-A deductions (enhanced senior deduction, qualified + # tip and overtime exclusions, and passenger-vehicle loan interest) + # flow through into MT taxable income via mt_federal_obbba_subtraction. + - mt_interest_exemption_person + - mt_tuition_subtraction_person + - mt_old_age_subtraction + - mt_disability_income_exclusion_person + - mt_federal_obbba_subtraction metadata: unit: list period: year diff --git a/policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/subtractions/mt_federal_obbba_subtraction.yaml b/policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/subtractions/mt_federal_obbba_subtraction.yaml new file mode 100644 index 00000000000..d7d6e0b3a26 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/subtractions/mt_federal_obbba_subtraction.yaml @@ -0,0 +1,71 @@ +- name: MT subtracts the federal OBBBA $6K senior deduction from taxable income (HoH age 75) + # Scenario from issue #8562 / PolicyEngine/policyengine-taxsim#948. + # Per Mont. Code Ann. § 15-30-2120, MT taxable income starts from + # federal taxable income (Form 1040 Line 15), which already nets the + # Schedule 1-A senior deduction. + period: 2025 + absolute_error_margin: 5 + input: + people: + head: + age: 75 + employment_income: 25_000 + taxable_interest_income: 17_510.73 + taxable_pension_income: 12_218.48 + social_security_retirement: 16_731.73 + child: + age: 5 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [head, child] + tax_unit_childcare_expenses: 3_500 + households: + household: + members: [head, child] + state_name: MT + output: + additional_senior_deduction: 6_000 + # Per-person; head receives the projection, dependent child sees 0. + mt_federal_obbba_subtraction: [6_000, 0] + mt_taxable_income_joint: [31_666, 0] + mt_income_tax: 1_488 + +- name: Pre-2025 MT household does not see the OBBBA Schedule 1-A subtraction + # The mt_federal_obbba_subtraction entry only appears in the subtractions + # parameter list from 2025-01-01 onward, matching the OBBBA effective date. + period: 2024 + input: + people: + head: + age: 75 + employment_income: 25_000 + tax_units: + tax_unit: + members: [head] + households: + household: + members: [head] + state_name: MT + output: + # The variable computes the projected federal value (which is zero + # pre-2025) but the parameter list does not include it. + mt_federal_obbba_subtraction: 0 + +- name: Non-senior MT household sees zero subtraction from this variable + period: 2025 + input: + people: + head: + age: 40 + employment_income: 50_000 + tax_units: + tax_unit: + members: [head] + households: + household: + members: [head] + state_name: MT + output: + additional_senior_deduction: 0 + mt_federal_obbba_subtraction: 0 diff --git a/policyengine_us/variables/gov/states/mt/tax/income/subtractions/mt_federal_obbba_subtraction.py b/policyengine_us/variables/gov/states/mt/tax/income/subtractions/mt_federal_obbba_subtraction.py new file mode 100644 index 00000000000..160fb4d6dd8 --- /dev/null +++ b/policyengine_us/variables/gov/states/mt/tax/income/subtractions/mt_federal_obbba_subtraction.py @@ -0,0 +1,22 @@ +from policyengine_us.model_api import * + + +class mt_federal_obbba_subtraction(Variable): + value_type = float + entity = Person + label = "Montana subtraction for federal OBBBA Schedule 1-A deductions" + unit = USD + definition_period = YEAR + defined_for = StateCode.MT + reference = ( + "https://mca.legmt.gov/bills/mca/title_0150/chapter_0300/part_0210/section_0200/0150-0300-0210-0200.html", + "https://www.congress.gov/119/bills/hr1/BILLS-119hr1enr.pdf#page=88", + ) + + def formula(person, period, parameters): + is_head = person("is_tax_unit_head", period) + senior = person.tax_unit("additional_senior_deduction", period) + tips = person.tax_unit("tip_income_deduction", period) + overtime = person.tax_unit("overtime_income_deduction", period) + auto = person.tax_unit("auto_loan_interest_deduction", period) + return is_head * (senior + tips + overtime + auto) From e0f5f5d6b5f2db7128a521b407b4f9ec68b11f78 Mon Sep 17 00:00:00 2001 From: PavelMakarchuk Date: Tue, 2 Jun 2026 10:14:46 -0400 Subject: [PATCH 2/3] Add MFJ, phaseout, and tipped-worker tests; expand references Adds reviewer-driven tests: - MFJ both spouses 65+: confirms head gets $12K, spouse 0. - Senior phaseout at MAGI = $75K (single threshold) and at $300K (fully phased out). - Tipped worker (non-senior) exercises the tip_income_deduction branch of the Schedule 1-A sum. Expands the variable reference tuple with the 2025 MT Form 2 Instructions p.7 (the most authoritative source for the design) and OBBBA SEC. 70201 (qualified tips). Co-Authored-By: Claude Opus 4.7 (1M context) --- .../mt_federal_obbba_subtraction.yaml | 89 +++++++++++++++++++ .../mt_federal_obbba_subtraction.py | 2 + 2 files changed, 91 insertions(+) diff --git a/policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/subtractions/mt_federal_obbba_subtraction.yaml b/policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/subtractions/mt_federal_obbba_subtraction.yaml index d7d6e0b3a26..0824cf0bbb2 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/subtractions/mt_federal_obbba_subtraction.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/subtractions/mt_federal_obbba_subtraction.yaml @@ -69,3 +69,92 @@ output: additional_senior_deduction: 0 mt_federal_obbba_subtraction: 0 + +- name: MFJ with both spouses 65+ — head receives the full $12K projection, spouse zero + # Both spouses qualify so the federal additional_senior_deduction + # doubles to $12_000; the head-only projection keeps mt_subtractions' + # Person-level sum from double-counting. + period: 2025 + input: + people: + head: + age: 70 + employment_income: 30_000 + spouse: + age: 68 + employment_income: 20_000 + tax_units: + tax_unit: + members: [head, spouse] + marital_units: + marital_unit: + members: [head, spouse] + households: + household: + members: [head, spouse] + state_name: MT + output: + additional_senior_deduction: 12_000 + mt_federal_obbba_subtraction: [12_000, 0] + +- name: Senior phaseout — at $75K MAGI single, deduction is unphased + # OBBBA SEC. 70103 starts the 6% phaseout at $75K MAGI (single). + # At exactly $75K the deduction is still the full $6K. + period: 2025 + input: + people: + head: + age: 70 + employment_income: 75_000 + tax_units: + tax_unit: + members: [head] + households: + household: + members: [head] + state_name: MT + output: + additional_senior_deduction: 6_000 + mt_federal_obbba_subtraction: 6_000 + +- name: Senior phaseout — fully phased out at $300K MAGI single + period: 2025 + input: + people: + head: + age: 70 + employment_income: 300_000 + tax_units: + tax_unit: + members: [head] + households: + household: + members: [head] + state_name: MT + output: + additional_senior_deduction: 0 + mt_federal_obbba_subtraction: 0 + +- name: Tipped worker (non-senior) — tip_income_deduction flows through to MT subtractions + # Exercises the tip_income_deduction branch of the Schedule 1-A sum, + # which the senior-only scenarios above never touch. + period: 2025 + input: + people: + head: + age: 30 + employment_income: 30_000 + tip_income: 8_000 + tip_income_deduction_occupation_requirement_met: true + tax_units: + tax_unit: + members: [head] + tip_income_deduction_ssn_requirement_met: true + households: + household: + members: [head] + state_name: MT + output: + additional_senior_deduction: 0 + tip_income_deduction: 8_000 + mt_federal_obbba_subtraction: 8_000 diff --git a/policyengine_us/variables/gov/states/mt/tax/income/subtractions/mt_federal_obbba_subtraction.py b/policyengine_us/variables/gov/states/mt/tax/income/subtractions/mt_federal_obbba_subtraction.py index 160fb4d6dd8..acbc2d1ab71 100644 --- a/policyengine_us/variables/gov/states/mt/tax/income/subtractions/mt_federal_obbba_subtraction.py +++ b/policyengine_us/variables/gov/states/mt/tax/income/subtractions/mt_federal_obbba_subtraction.py @@ -10,7 +10,9 @@ class mt_federal_obbba_subtraction(Variable): defined_for = StateCode.MT reference = ( "https://mca.legmt.gov/bills/mca/title_0150/chapter_0300/part_0210/section_0200/0150-0300-0210-0200.html", + "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=7", "https://www.congress.gov/119/bills/hr1/BILLS-119hr1enr.pdf#page=88", + "https://www.congress.gov/119/bills/hr1/BILLS-119hr1enr.pdf#page=96", ) def formula(person, period, parameters): From df2d589ad47f74143ef2dd03b1c8fa4e6d65db78 Mon Sep 17 00:00:00 2001 From: Ziming Date: Tue, 2 Jun 2026 15:02:57 -0400 Subject: [PATCH 3/3] minor comment --- .../gov/states/mt/tax/income/subtractions/subtractions.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/policyengine_us/parameters/gov/states/mt/tax/income/subtractions/subtractions.yaml b/policyengine_us/parameters/gov/states/mt/tax/income/subtractions/subtractions.yaml index 11a88dd9454..d4d23acecb0 100644 --- a/policyengine_us/parameters/gov/states/mt/tax/income/subtractions/subtractions.yaml +++ b/policyengine_us/parameters/gov/states/mt/tax/income/subtractions/subtractions.yaml @@ -21,6 +21,8 @@ values: - mt_tuition_subtraction_person - mt_old_age_subtraction - mt_disability_income_exclusion_person + # TODO: Remove this subtraction starting in 2029 because the federal + # Schedule 1-A deductions expire after 2028. - mt_federal_obbba_subtraction metadata: unit: list