From f4594f444100f1c0425212a674e0b1a770c85e77 Mon Sep 17 00:00:00 2001 From: PavelMakarchuk Date: Tue, 6 Oct 2026 12:05:30 -0400 Subject: [PATCH 1/3] Add the federal excess business loss back to Massachusetts income from 2022 Massachusetts conforms to the Code as amended on January 1, 2022 from tax year 2022, including Section 461(l). Filers add the federal excess business loss (Schedule 1, line 8p) back to 5.0% income on Schedule X, line 6. Fixes #9907 Co-Authored-By: Claude Opus 5.5 --- changelog.d/ma-excess-business-loss.fixed.md | 1 + .../excess_business_loss/in_effect.yaml | 21 ++++ .../excess_business_loss.yaml | 81 ++++++++++++++++ .../ma_excess_business_loss_adjustment.yaml | 96 +++++++++++++++++++ .../excess_business_loss.py | 39 ++++++++ .../ma_excess_business_loss_adjustment.py | 22 +++++ .../income/gross_income/ma_gross_income.py | 7 +- 7 files changed, 266 insertions(+), 1 deletion(-) create mode 100644 changelog.d/ma-excess-business-loss.fixed.md create mode 100644 policyengine_us/parameters/gov/states/ma/tax/income/excess_business_loss/in_effect.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/irs/income/taxable_income/adjusted_gross_income/above_the_line_deductions/excess_business_loss.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/ma/tax/income/gross_income/ma_excess_business_loss_adjustment.yaml create mode 100644 policyengine_us/variables/gov/irs/income/taxable_income/adjusted_gross_income/above_the_line_deductions/excess_business_loss.py create mode 100644 policyengine_us/variables/gov/states/ma/tax/income/gross_income/ma_excess_business_loss_adjustment.py diff --git a/changelog.d/ma-excess-business-loss.fixed.md b/changelog.d/ma-excess-business-loss.fixed.md new file mode 100644 index 00000000000..da0e91b6393 --- /dev/null +++ b/changelog.d/ma-excess-business-loss.fixed.md @@ -0,0 +1 @@ +Add the federal excess business loss back to Massachusetts 5.0% income from 2022 (Schedule X, line 6), with a new excess_business_loss variable. diff --git a/policyengine_us/parameters/gov/states/ma/tax/income/excess_business_loss/in_effect.yaml b/policyengine_us/parameters/gov/states/ma/tax/income/excess_business_loss/in_effect.yaml new file mode 100644 index 00000000000..0d3522ea3cf --- /dev/null +++ b/policyengine_us/parameters/gov/states/ma/tax/income/excess_business_loss/in_effect.yaml @@ -0,0 +1,21 @@ +description: Massachusetts adds the federal excess business loss back to 5.0% income if this is true. + +values: + 2018-01-01: false + # Massachusetts conforms to the Code as amended on January 1, 2022 for tax + # years beginning on or after January 1, 2022, including Section 461(l). + 2022-01-01: true + +metadata: + unit: bool + period: year + label: Massachusetts excess business loss add-back in effect + reference: + - title: 2022 Form 1 instructions, Updated IRC Conformity Date ("Code Update") + href: https://taxsim.nber.org/historical_state_tax_forms/MA/2022/dor-2022-inc_form-1_instructions.pdf#page=4 + - title: 2022 Form 1 instructions, Schedule X, line 6 Excess Business Loss Adjustment + href: https://taxsim.nber.org/historical_state_tax_forms/MA/2022/dor-2022-inc_form-1_instructions.pdf#page=20 + - title: 2024 Form 1 instructions, Schedule X, line 6 Excess Business Loss Adjustment + href: https://taxsim.nber.org/historical_state_tax_forms/MA/2024/dor-2024-inc-form-1-inst_1.pdf#page=20 + - title: 2025 Form 1 instructions, Schedule X, line 6 Excess Business Loss Adjustment + href: https://taxsim.nber.org/historical_state_tax_forms/MA/2025/ma-dor-2025-inc-form-1-inst.pdf#page=19 diff --git a/policyengine_us/tests/policy/baseline/gov/irs/income/taxable_income/adjusted_gross_income/above_the_line_deductions/excess_business_loss.yaml b/policyengine_us/tests/policy/baseline/gov/irs/income/taxable_income/adjusted_gross_income/above_the_line_deductions/excess_business_loss.yaml new file mode 100644 index 00000000000..90b79ce55cb --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/irs/income/taxable_income/adjusted_gross_income/above_the_line_deductions/excess_business_loss.yaml @@ -0,0 +1,81 @@ +- name: An S corporation loss above the 2022 joint threshold is an excess business loss + period: 2022 + input: + people: + head: + age: 50 + partnership_s_corp_income: -1_000_000 + spouse: + age: 50 + tax_units: + tax_unit: + members: [head, spouse] + households: + household: + members: [head, spouse] + state_code: TX + output: + # 1,000,000 - 540,000 (Rev. Proc. 2021-45) + excess_business_loss: 460_000 + loss_ald: 540_000 + +- name: Business income of the other spouse raises the allowed loss + period: 2022 + input: + people: + head: + age: 50 + partnership_s_corp_income: -1_000_000 + spouse: + age: 50 + self_employment_income: 200_000 + tax_units: + tax_unit: + members: [head, spouse] + households: + household: + members: [head, spouse] + state_code: TX + output: + # 1,000,000 - (200,000 + 540,000) + excess_business_loss: 260_000 + +- name: No excess business loss below the 2025 single threshold + period: 2025 + input: + people: + head: + age: 50 + self_employment_income: -300_000 + tax_units: + tax_unit: + members: [head] + households: + household: + members: [head] + state_code: TX + output: + # The 2025 single threshold is $313,000 (Form 461, line 15). + excess_business_loss: 0 + +- name: A dependent's business loss is on their own return + period: 2022 + input: + people: + head: + age: 50 + partnership_s_corp_income: -400_000 + dependent: + age: 20 + is_tax_unit_dependent: true + partnership_s_corp_income: -500_000 + tax_units: + tax_unit: + members: [head, dependent] + households: + household: + members: [head, dependent] + state_code: TX + output: + # 400,000 - 270,000 + excess_business_loss: 130_000 diff --git a/policyengine_us/tests/policy/baseline/gov/states/ma/tax/income/gross_income/ma_excess_business_loss_adjustment.yaml b/policyengine_us/tests/policy/baseline/gov/states/ma/tax/income/gross_income/ma_excess_business_loss_adjustment.yaml new file mode 100644 index 00000000000..ee51f67c2fd --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/ma/tax/income/gross_income/ma_excess_business_loss_adjustment.yaml @@ -0,0 +1,96 @@ +# Massachusetts adds the federal excess business loss (Schedule 1, line 8p) +# back to 5.0% income from 2022 (Schedule X, line 6). The interest is +# Massachusetts bank interest, so it is 5.0% income. + +- name: 2022 joint return adds back the loss above $540,000 + period: 2022 + absolute_error_margin: 0.01 + input: + people: + head: + age: 50 + taxable_interest_income: 2_000_000 + partnership_s_corp_income: -1_000_000 + spouse: + age: 50 + tax_units: + tax_unit: + members: [head, spouse] + households: + household: + members: [head, spouse] + state_code: MA + output: + ma_excess_business_loss_adjustment: 460_000 + # 2,000,000 - 1,000,000 + 460,000 + ma_gross_income: 1_460_000 + # 1,460,000 - 200 bank interest exemption - 8,800 exemption + ma_part_b_taxable_income: 1_451_000 + ma_income_tax_before_credits: 72_550 + +- name: 2022 single return adds back the loss above $270,000 + period: 2022 + absolute_error_margin: 0.01 + input: + people: + head: + age: 50 + taxable_interest_income: 2_000_000 + partnership_s_corp_income: -1_000_000 + tax_units: + tax_unit: + members: [head] + households: + household: + members: [head] + state_code: MA + output: + ma_excess_business_loss_adjustment: 730_000 + # 2,000,000 - 270,000 - 100 bank interest exemption - 4,400 exemption + ma_part_b_taxable_income: 1_725_500 + +- name: 2024 joint return uses the $610,000 threshold + period: 2024 + absolute_error_margin: 0.01 + input: + people: + head: + age: 50 + taxable_interest_income: 2_000_000 + partnership_s_corp_income: -1_000_000 + spouse: + age: 50 + tax_units: + tax_unit: + members: [head, spouse] + households: + household: + members: [head, spouse] + state_code: MA + output: + ma_excess_business_loss_adjustment: 390_000 + # 2,000,000 - 610,000 - 8,800 exemption (no bank interest exemption from 2024) + ma_part_b_taxable_income: 1_381_200 + +- name: No add-back in 2021, before the Code Update + period: 2021 + absolute_error_margin: 0.01 + input: + people: + head: + age: 50 + taxable_interest_income: 2_000_000 + partnership_s_corp_income: -1_000_000 + spouse: + age: 50 + tax_units: + tax_unit: + members: [head, spouse] + households: + household: + members: [head, spouse] + state_code: MA + output: + ma_excess_business_loss_adjustment: 0 + # 2,000,000 - 1,000,000 - 200 - 8,800 + ma_part_b_taxable_income: 991_000 diff --git a/policyengine_us/variables/gov/irs/income/taxable_income/adjusted_gross_income/above_the_line_deductions/excess_business_loss.py b/policyengine_us/variables/gov/irs/income/taxable_income/adjusted_gross_income/above_the_line_deductions/excess_business_loss.py new file mode 100644 index 00000000000..107d4cf2607 --- /dev/null +++ b/policyengine_us/variables/gov/irs/income/taxable_income/adjusted_gross_income/above_the_line_deductions/excess_business_loss.py @@ -0,0 +1,39 @@ +from policyengine_us.model_api import * + + +class excess_business_loss(Variable): + value_type = float + entity = TaxUnit + label = "Excess business loss" + unit = USD + documentation = ( + "Business losses above business income plus the Section 461(l) " + "threshold, which loss_ald does not deduct (Form 461, line 16; " + "Form 1040, Schedule 1, line 8p)." + ) + definition_period = YEAR + reference = ( + "https://www.law.cornell.edu/uscode/text/26/461#l", + "https://www.irs.gov/pub/irs-prior/f461--2025.pdf", + ) + + def formula(tax_unit, period, parameters): + filing_status = tax_unit("filing_status", period) + threshold = parameters(period).gov.irs.ald.loss.max[filing_status] + # The same head and spouse business items as loss_ald. The excess of + # aggregate business deductions over aggregate business income is + # the negative of their net total. + net_business_income = tax_unit_non_dep_add( + tax_unit, + period, + [ + "total_self_employment_income", + "farm_operations_income", + "rental_income", + "farm_rent_income", + "estate_income", + "partnership_s_corp_income", + "other_net_gain", + ], + ) + return max_(0, -net_business_income - threshold) diff --git a/policyengine_us/variables/gov/states/ma/tax/income/gross_income/ma_excess_business_loss_adjustment.py b/policyengine_us/variables/gov/states/ma/tax/income/gross_income/ma_excess_business_loss_adjustment.py new file mode 100644 index 00000000000..bf8133e299d --- /dev/null +++ b/policyengine_us/variables/gov/states/ma/tax/income/gross_income/ma_excess_business_loss_adjustment.py @@ -0,0 +1,22 @@ +from policyengine_us.model_api import * + + +class ma_excess_business_loss_adjustment(Variable): + value_type = float + entity = TaxUnit + label = "MA excess business loss adjustment" + documentation = ( + "Massachusetts Schedule X, line 6: the federal excess business loss " + "(Form 1040, Schedule 1, line 8p), added back to 5.0% income." + ) + unit = USD + definition_period = YEAR + reference = ( + "https://taxsim.nber.org/historical_state_tax_forms/MA/2022/dor-2022-inc_form-1_instructions.pdf#page=20", + "https://taxsim.nber.org/historical_state_tax_forms/MA/2024/dor-2024-inc-form-1-inst_1.pdf#page=20", + ) + defined_for = StateCode.MA + + def formula(tax_unit, period, parameters): + p = parameters(period).gov.states.ma.tax.income.excess_business_loss + return p.in_effect * tax_unit("excess_business_loss", period) diff --git a/policyengine_us/variables/gov/states/ma/tax/income/gross_income/ma_gross_income.py b/policyengine_us/variables/gov/states/ma/tax/income/gross_income/ma_gross_income.py index 6d3440a1de1..c7e4e077e0f 100644 --- a/policyengine_us/variables/gov/states/ma/tax/income/gross_income/ma_gross_income.py +++ b/policyengine_us/variables/gov/states/ma/tax/income/gross_income/ma_gross_income.py @@ -17,6 +17,8 @@ def formula(tax_unit, period, parameters): federal_gross_income = add(tax_unit, period, ["irs_gross_income"]) # Add back lines 6/7 losses dropped by irs_gross_income. loss_adjustment = tax_unit("ma_gross_income_loss_adjustment", period) + # Add back the federal excess business loss (Schedule X, line 6). + excess_business_loss = tax_unit("ma_excess_business_loss_adjustment", period) # Exclude foreign earned income, Social Security, state/local tax refunds, # and contributory public pensions. # Under M.G.L. c. 62 ยง 2(a)(2)(E), contributory pensions from the US, @@ -33,4 +35,7 @@ def formula(tax_unit, period, parameters): + salt_refund_income + public_pension ) - return max_(0, federal_gross_income + loss_adjustment - deductions) + return max_( + 0, + federal_gross_income + loss_adjustment + excess_business_loss - deductions, + ) From f0607028a69b4a355f9f586f464ce2093b9b186f Mon Sep 17 00:00:00 2001 From: PavelMakarchuk Date: Tue, 6 Oct 2026 19:29:00 -0400 Subject: [PATCH 2/3] Use a Massachusetts excess business loss threshold from 2026 and end the add-back after 2028 Massachusetts follows the Code as amended on January 1, 2024 (c. 62 s. 1(c)) and does not conform to OBBBA section 70601 (TIR 26-4), so the federal threshold reset to $256,000 / $512,000 for 2026 (Rev. Proc. 2025-32, section 4.31) does not apply. Add a Massachusetts threshold parameter that equals the federal threshold through 2025 and holds the 2025 values for 2026, pending the Department of Revenue's 2026 figure, and measure the Schedule X, line 6 add-back against it. Move the business items into a new net_business_loss variable that both the federal and Massachusetts excess business loss use. The Code as amended on January 1, 2024 limits excess business losses through the 2028 taxable year (TIR 24-14), so the add-back ends from 2029. Cite c. 62 s. 1(c), TIR 23-1, TIR 23-5, TIR 24-14, TIR 26-4 and the mass.gov Form 1 instructions. Add tests at a loss equal to the 2023 and 2026 thresholds, above the 2026 threshold, and for 2029. Co-Authored-By: Claude Opus 5.5 --- changelog.d/ma-excess-business-loss.fixed.md | 2 +- .../excess_business_loss/in_effect.yaml | 30 ++++- .../excess_business_loss/threshold.yaml | 108 ++++++++++++++++ .../excess_business_loss.yaml | 1 + .../ma_excess_business_loss_adjustment.yaml | 118 +++++++++++++++++- .../excess_business_loss.py | 19 +-- .../net_business_loss.py | 37 ++++++ .../ma_excess_business_loss_adjustment.py | 18 ++- .../income/gross_income/ma_gross_income.py | 2 +- 9 files changed, 303 insertions(+), 32 deletions(-) create mode 100644 policyengine_us/parameters/gov/states/ma/tax/income/excess_business_loss/threshold.yaml create mode 100644 policyengine_us/variables/gov/irs/income/taxable_income/adjusted_gross_income/above_the_line_deductions/net_business_loss.py diff --git a/changelog.d/ma-excess-business-loss.fixed.md b/changelog.d/ma-excess-business-loss.fixed.md index da0e91b6393..7be27950ec5 100644 --- a/changelog.d/ma-excess-business-loss.fixed.md +++ b/changelog.d/ma-excess-business-loss.fixed.md @@ -1 +1 @@ -Add the federal excess business loss back to Massachusetts 5.0% income from 2022 (Schedule X, line 6), with a new excess_business_loss variable. +Add the excess business loss back to Massachusetts 5.0% income for tax years 2022 through 2028 (Schedule X, line 6), measured from 2026 against a Massachusetts threshold that does not adopt the OBBBA reset, with new excess_business_loss and net_business_loss variables. diff --git a/policyengine_us/parameters/gov/states/ma/tax/income/excess_business_loss/in_effect.yaml b/policyengine_us/parameters/gov/states/ma/tax/income/excess_business_loss/in_effect.yaml index 0d3522ea3cf..1d391bb5042 100644 --- a/policyengine_us/parameters/gov/states/ma/tax/income/excess_business_loss/in_effect.yaml +++ b/policyengine_us/parameters/gov/states/ma/tax/income/excess_business_loss/in_effect.yaml @@ -1,21 +1,39 @@ -description: Massachusetts adds the federal excess business loss back to 5.0% income if this is true. +description: Massachusetts adds the excess business loss back to 5.0% income if this is true. values: 2018-01-01: false # Massachusetts conforms to the Code as amended on January 1, 2022 for tax - # years beginning on or after January 1, 2022, including Section 461(l). + # years beginning on or after January 1, 2022 (St. 2022, c. 126, ss. 30 and + # 189), including Section 461(l) (TIR 23-5), and to the Code as amended on + # January 1, 2024 from tax year 2024 (St. 2024, c. 140, ss. 100 and 251). 2022-01-01: true + # The Code as amended on January 1, 2024 limits excess business losses + # through the 2028 taxable year (TIR 24-14). Massachusetts does not conform + # to the OBBBA extension of the limitation (TIR 26-4). + 2029-01-01: false metadata: unit: bool period: year label: Massachusetts excess business loss add-back in effect reference: + - title: M.G.L. c. 62, s. 1(c), definition of Code + href: https://malegislature.gov/Laws/GeneralLaws/PartI/TitleIX/Chapter62/Section1 + - title: TIR 23-1, Tax Provisions in the Fiscal Year 2023 Budget, Including Massachusetts Personal Income Tax Code Update (Code section 461(l)) + href: https://www.mass.gov/technical-information-release/working-draft-tir-tax-provisions-in-the-fiscal-year-2023-budget-including-massachusetts-personal-income-tax-code-update + - title: TIR 23-5, Chapter 62 Conformity to Select Provisions of the 2022 Internal Revenue Code (Code section 461(l)) + href: https://www.mass.gov/technical-information-release/tir-23-5-chapter-62-conformity-to-select-provisions-of-the-2022-internal-revenue-code + - title: TIR 24-14, Tax Provisions in the Fiscal Year 2025 Budget, II.A.1 Limitation on Noncorporate Excess Business Losses + href: https://www.mass.gov/technical-information-release/tir-24-14-tax-provisions-in-the-fiscal-year-2025-budget + - title: TIR 26-4, Massachusetts Conformity to Certain Provisions in Public Law No. 119-21 (Sec. 70601) + href: https://www.mass.gov/technical-information-release/tir-26-4-massachusetts-conformity-to-certain-provisions-in-public-law-no-119-21 - title: 2022 Form 1 instructions, Updated IRC Conformity Date ("Code Update") - href: https://taxsim.nber.org/historical_state_tax_forms/MA/2022/dor-2022-inc_form-1_instructions.pdf#page=4 + href: https://web.archive.org/web/20230616200742/https://www.mass.gov/doc/2022-form-1-instructions/download#page=4 - title: 2022 Form 1 instructions, Schedule X, line 6 Excess Business Loss Adjustment - href: https://taxsim.nber.org/historical_state_tax_forms/MA/2022/dor-2022-inc_form-1_instructions.pdf#page=20 + href: https://web.archive.org/web/20230616200742/https://www.mass.gov/doc/2022-form-1-instructions/download#page=20 + - title: 2023 Form 1 instructions, Schedule X, line 6 Excess Business Loss Adjustment + href: https://www.mass.gov/doc/2023-form-1-instructions/download#page=20 - title: 2024 Form 1 instructions, Schedule X, line 6 Excess Business Loss Adjustment - href: https://taxsim.nber.org/historical_state_tax_forms/MA/2024/dor-2024-inc-form-1-inst_1.pdf#page=20 + href: https://www.mass.gov/doc/2024-form-1-instructions/download#page=20 - title: 2025 Form 1 instructions, Schedule X, line 6 Excess Business Loss Adjustment - href: https://taxsim.nber.org/historical_state_tax_forms/MA/2025/ma-dor-2025-inc-form-1-inst.pdf#page=19 + href: https://www.mass.gov/doc/2025-form-1-instructions/download#page=21 diff --git a/policyengine_us/parameters/gov/states/ma/tax/income/excess_business_loss/threshold.yaml b/policyengine_us/parameters/gov/states/ma/tax/income/excess_business_loss/threshold.yaml new file mode 100644 index 00000000000..ccea6617be4 --- /dev/null +++ b/policyengine_us/parameters/gov/states/ma/tax/income/excess_business_loss/threshold.yaml @@ -0,0 +1,108 @@ +description: Massachusetts treats business losses above business income plus this threshold as an excess business loss, under Section 461(l) of the Code as Massachusetts adopts it; only joint returns receive twice the nonjoint threshold. +metadata: + propagate_metadata_to_children: true + label: Massachusetts excess business loss threshold + breakdown: + - filing_status + unit: currency-USD + period: year + reference: + - title: M.G.L. c. 62, s. 1(c), definition of Code (as amended on January 1, 2024) + href: https://malegislature.gov/Laws/GeneralLaws/PartI/TitleIX/Chapter62/Section1 + - title: TIR 26-4, Massachusetts Conformity to Certain Provisions in Public Law No. 119-21 (Sec. 70601, no conformity) + href: https://www.mass.gov/technical-information-release/tir-26-4-massachusetts-conformity-to-certain-provisions-in-public-law-no-119-21 + - title: Revenue Procedure 2021-45, section 3.32 (2022 threshold) + href: https://www.irs.gov/pub/irs-drop/rp-21-45.pdf#page=19 + - title: Revenue Procedure 2022-38, section 3.32 (2023 threshold) + href: https://www.irs.gov/pub/irs-drop/rp-22-38.pdf#page=18 + - title: Revenue Procedure 2023-34, section 3.32 (2024 threshold) + href: https://www.irs.gov/pub/irs-drop/rp-23-34.pdf#page=17 + - title: Revenue Procedure 2024-40, section 2.32 (2025 threshold) + href: https://www.irs.gov/pub/irs-drop/rp-24-40.pdf#page=17 + - title: 2022 Form 1 instructions, Schedule X, line 6 Excess Business Loss Adjustment + href: https://web.archive.org/web/20230616200742/https://www.mass.gov/doc/2022-form-1-instructions/download#page=20 + - title: 2024 Form 1 instructions, Schedule X, line 6 Excess Business Loss Adjustment + href: https://www.mass.gov/doc/2024-form-1-instructions/download#page=20 + - title: 2025 Form 1 instructions, Schedule X, line 6 Excess Business Loss Adjustment + href: https://www.mass.gov/doc/2025-form-1-instructions/download#page=21 +# Through 2025 the Massachusetts threshold is the federal threshold: Schedule X, +# line 6 is the excess business loss on U.S. Form 1040, Schedule 1, line 8p. +# The 2023 Form 1 instructions still print $270,000 / $540,000, but line 8p +# uses the 2023 federal $289,000 / $578,000 (Rev. Proc. 2022-38). +# From 2026 the federal threshold uses the OBBBA reset ($256,000 / $512,000, +# Rev. Proc. 2025-32, section 4.31), which Massachusetts does not adopt +# (TIR 26-4). The 2026 values are the 2025 values, pending the Massachusetts +# Department of Revenue's 2026 figure under the pre-OBBBA indexing of +# Section 461(l)(3)(B). +HEAD_OF_HOUSEHOLD: + metadata: + uprating: + parameter: gov.irs.uprating + rounding: + type: nearest + interval: 1_000 + values: + 2022-01-01: 270_000 + 2023-01-01: 289_000 + 2024-01-01: 305_000 + 2025-01-01: 313_000 + # Pending the Massachusetts Department of Revenue's 2026 figure. + 2026-01-01: 313_000 +JOINT: + metadata: + uprating: + parameter: gov.irs.uprating + rounding: + # Twice the rounded nonjoint threshold under section 461(l)(3). + type: nearest + interval: 2_000 + values: + 2022-01-01: 540_000 + 2023-01-01: 578_000 + 2024-01-01: 610_000 + 2025-01-01: 626_000 + # Pending the Massachusetts Department of Revenue's 2026 figure. + 2026-01-01: 626_000 +SEPARATE: + metadata: + uprating: + parameter: gov.irs.uprating + rounding: + type: nearest + interval: 1_000 + values: + 2022-01-01: 270_000 + 2023-01-01: 289_000 + 2024-01-01: 305_000 + 2025-01-01: 313_000 + # Pending the Massachusetts Department of Revenue's 2026 figure. + 2026-01-01: 313_000 +SINGLE: + metadata: + uprating: + parameter: gov.irs.uprating + rounding: + type: nearest + interval: 1_000 + values: + 2022-01-01: 270_000 + 2023-01-01: 289_000 + 2024-01-01: 305_000 + 2025-01-01: 313_000 + # Pending the Massachusetts Department of Revenue's 2026 figure. + 2026-01-01: 313_000 +SURVIVING_SPOUSE: + metadata: + uprating: + parameter: gov.irs.uprating + rounding: + type: nearest + interval: 1_000 + # Section 461(l)(3)(A) doubles the threshold only for a joint return. + values: + 2022-01-01: 270_000 + 2023-01-01: 289_000 + 2024-01-01: 305_000 + 2025-01-01: 313_000 + # Pending the Massachusetts Department of Revenue's 2026 figure. + 2026-01-01: 313_000 diff --git a/policyengine_us/tests/policy/baseline/gov/irs/income/taxable_income/adjusted_gross_income/above_the_line_deductions/excess_business_loss.yaml b/policyengine_us/tests/policy/baseline/gov/irs/income/taxable_income/adjusted_gross_income/above_the_line_deductions/excess_business_loss.yaml index 90b79ce55cb..198e0945d8f 100644 --- a/policyengine_us/tests/policy/baseline/gov/irs/income/taxable_income/adjusted_gross_income/above_the_line_deductions/excess_business_loss.yaml +++ b/policyengine_us/tests/policy/baseline/gov/irs/income/taxable_income/adjusted_gross_income/above_the_line_deductions/excess_business_loss.yaml @@ -15,6 +15,7 @@ members: [head, spouse] state_code: TX output: + net_business_loss: 1_000_000 # 1,000,000 - 540,000 (Rev. Proc. 2021-45) excess_business_loss: 460_000 loss_ald: 540_000 diff --git a/policyengine_us/tests/policy/baseline/gov/states/ma/tax/income/gross_income/ma_excess_business_loss_adjustment.yaml b/policyengine_us/tests/policy/baseline/gov/states/ma/tax/income/gross_income/ma_excess_business_loss_adjustment.yaml index ee51f67c2fd..44914f0f2d1 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/ma/tax/income/gross_income/ma_excess_business_loss_adjustment.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/ma/tax/income/gross_income/ma_excess_business_loss_adjustment.yaml @@ -1,6 +1,8 @@ # Massachusetts adds the federal excess business loss (Schedule 1, line 8p) -# back to 5.0% income from 2022 (Schedule X, line 6). The interest is -# Massachusetts bank interest, so it is 5.0% income. +# back to 5.0% income from 2022 (Schedule X, line 6). From 2026 the loss is +# measured against the Massachusetts threshold, not the OBBBA-reset federal +# one, and the add-back ends after 2028. The interest is Massachusetts bank +# interest, so it is 5.0% income. - name: 2022 joint return adds back the loss above $540,000 period: 2022 @@ -94,3 +96,115 @@ ma_excess_business_loss_adjustment: 0 # 2,000,000 - 1,000,000 - 200 - 8,800 ma_part_b_taxable_income: 991_000 + +- name: 2023 single return with a loss equal to the $289,000 threshold adds back nothing + period: 2023 + absolute_error_margin: 0.01 + input: + people: + head: + age: 50 + self_employment_income: -289_000 + tax_units: + tax_unit: + members: [head] + households: + household: + members: [head] + state_code: MA + output: + # 289,000 - 289,000 (Rev. Proc. 2022-38, section 3.32) = 0. Schedule X, + # line 6 is the line 8p amount, although the 2023 instructions print + # $270,000, which would give 19,000. + excess_business_loss: 0 + ma_excess_business_loss_adjustment: 0 + +- name: 2026 single return with a loss equal to the $313,000 Massachusetts threshold adds back nothing + period: 2026 + absolute_error_margin: 0.01 + input: + people: + head: + age: 50 + self_employment_income: -313_000 + tax_units: + tax_unit: + members: [head] + households: + household: + members: [head] + state_code: MA + output: + # Federal: 313,000 - 256,000 (Rev. Proc. 2025-32, section 4.31) + excess_business_loss: 57_000 + # Massachusetts: 313,000 - 313,000 = 0 (no OBBBA reset, TIR 26-4) + ma_excess_business_loss_adjustment: 0 + +- name: 2026 single return with wages and a Schedule C loss below the Massachusetts threshold + period: 2026 + absolute_error_margin: 0.01 + input: + people: + head: + age: 50 + employment_income: 500_000 + self_employment_income: -300_000 + tax_units: + tax_unit: + members: [head] + households: + household: + members: [head] + state_code: MA + output: + # Federal: 300,000 - 256,000 + excess_business_loss: 44_000 + # Massachusetts: 300,000 is below 313,000. + ma_excess_business_loss_adjustment: 0 + # 500,000 wages - 300,000 Form 1, line 6a loss + 0 + ma_gross_income: 200_000 + +- name: 2026 joint return adds back the loss above $626,000 + period: 2026 + absolute_error_margin: 0.01 + input: + people: + head: + age: 50 + partnership_s_corp_income: -1_000_000 + spouse: + age: 50 + tax_units: + tax_unit: + members: [head, spouse] + households: + household: + members: [head, spouse] + state_code: MA + output: + # Federal: 1,000,000 - 512,000 + excess_business_loss: 488_000 + # Massachusetts: 1,000,000 - 626,000 + ma_excess_business_loss_adjustment: 374_000 + +- name: No add-back from 2029, after the limitation ends + period: 2029 + absolute_error_margin: 0.01 + input: + people: + head: + age: 50 + partnership_s_corp_income: -1_000_000 + spouse: + age: 50 + tax_units: + tax_unit: + members: [head, spouse] + households: + household: + members: [head, spouse] + state_code: MA + output: + # The Code as amended on January 1, 2024 limits excess business losses + # through the 2028 taxable year (TIR 24-14). + ma_excess_business_loss_adjustment: 0 diff --git a/policyengine_us/variables/gov/irs/income/taxable_income/adjusted_gross_income/above_the_line_deductions/excess_business_loss.py b/policyengine_us/variables/gov/irs/income/taxable_income/adjusted_gross_income/above_the_line_deductions/excess_business_loss.py index 107d4cf2607..2ffe5180fe1 100644 --- a/policyengine_us/variables/gov/irs/income/taxable_income/adjusted_gross_income/above_the_line_deductions/excess_business_loss.py +++ b/policyengine_us/variables/gov/irs/income/taxable_income/adjusted_gross_income/above_the_line_deductions/excess_business_loss.py @@ -20,20 +20,5 @@ class excess_business_loss(Variable): def formula(tax_unit, period, parameters): filing_status = tax_unit("filing_status", period) threshold = parameters(period).gov.irs.ald.loss.max[filing_status] - # The same head and spouse business items as loss_ald. The excess of - # aggregate business deductions over aggregate business income is - # the negative of their net total. - net_business_income = tax_unit_non_dep_add( - tax_unit, - period, - [ - "total_self_employment_income", - "farm_operations_income", - "rental_income", - "farm_rent_income", - "estate_income", - "partnership_s_corp_income", - "other_net_gain", - ], - ) - return max_(0, -net_business_income - threshold) + net_business_loss = tax_unit("net_business_loss", period) + return max_(0, net_business_loss - threshold) diff --git a/policyengine_us/variables/gov/irs/income/taxable_income/adjusted_gross_income/above_the_line_deductions/net_business_loss.py b/policyengine_us/variables/gov/irs/income/taxable_income/adjusted_gross_income/above_the_line_deductions/net_business_loss.py new file mode 100644 index 00000000000..43268f9c73e --- /dev/null +++ b/policyengine_us/variables/gov/irs/income/taxable_income/adjusted_gross_income/above_the_line_deductions/net_business_loss.py @@ -0,0 +1,37 @@ +from policyengine_us.model_api import * + + +class net_business_loss(Variable): + value_type = float + entity = TaxUnit + label = "Net business loss" + unit = USD + documentation = ( + "Aggregate business deductions above aggregate business income and " + "gains, before the Section 461(l) threshold (Form 461, line 14, as a " + "positive amount)." + ) + definition_period = YEAR + reference = ( + "https://www.law.cornell.edu/uscode/text/26/461#l_3_A", + "https://www.irs.gov/pub/irs-prior/f461--2025.pdf", + ) + + def formula(tax_unit, period, parameters): + # The same head and spouse business items as loss_ald. The excess of + # aggregate business deductions over aggregate business income is + # the negative of their net total. + net_business_income = tax_unit_non_dep_add( + tax_unit, + period, + [ + "total_self_employment_income", + "farm_operations_income", + "rental_income", + "farm_rent_income", + "estate_income", + "partnership_s_corp_income", + "other_net_gain", + ], + ) + return max_(0, -net_business_income) diff --git a/policyengine_us/variables/gov/states/ma/tax/income/gross_income/ma_excess_business_loss_adjustment.py b/policyengine_us/variables/gov/states/ma/tax/income/gross_income/ma_excess_business_loss_adjustment.py index bf8133e299d..1cf161eb6db 100644 --- a/policyengine_us/variables/gov/states/ma/tax/income/gross_income/ma_excess_business_loss_adjustment.py +++ b/policyengine_us/variables/gov/states/ma/tax/income/gross_income/ma_excess_business_loss_adjustment.py @@ -6,17 +6,25 @@ class ma_excess_business_loss_adjustment(Variable): entity = TaxUnit label = "MA excess business loss adjustment" documentation = ( - "Massachusetts Schedule X, line 6: the federal excess business loss " - "(Form 1040, Schedule 1, line 8p), added back to 5.0% income." + "Massachusetts Schedule X, line 6: the excess business loss under " + "Section 461(l) as Massachusetts adopts it, added back to 5.0% income." ) unit = USD definition_period = YEAR reference = ( - "https://taxsim.nber.org/historical_state_tax_forms/MA/2022/dor-2022-inc_form-1_instructions.pdf#page=20", - "https://taxsim.nber.org/historical_state_tax_forms/MA/2024/dor-2024-inc-form-1-inst_1.pdf#page=20", + "https://www.mass.gov/doc/2024-form-1-instructions/download#page=20", + "https://www.mass.gov/doc/2025-form-1-instructions/download#page=21", + "https://www.mass.gov/technical-information-release/tir-26-4-massachusetts-conformity-to-certain-provisions-in-public-law-no-119-21", ) defined_for = StateCode.MA def formula(tax_unit, period, parameters): p = parameters(period).gov.states.ma.tax.income.excess_business_loss - return p.in_effect * tax_unit("excess_business_loss", period) + filing_status = tax_unit("filing_status", period) + # Through 2025 this is the federal excess business loss (Form 1040, + # Schedule 1, line 8p). Massachusetts does not adopt the OBBBA + # threshold reset from 2026, so the loss is measured against the + # Massachusetts threshold. + net_business_loss = tax_unit("net_business_loss", period) + excess_business_loss = max_(0, net_business_loss - p.threshold[filing_status]) + return p.in_effect * excess_business_loss diff --git a/policyengine_us/variables/gov/states/ma/tax/income/gross_income/ma_gross_income.py b/policyengine_us/variables/gov/states/ma/tax/income/gross_income/ma_gross_income.py index c7e4e077e0f..3ad66100a2c 100644 --- a/policyengine_us/variables/gov/states/ma/tax/income/gross_income/ma_gross_income.py +++ b/policyengine_us/variables/gov/states/ma/tax/income/gross_income/ma_gross_income.py @@ -17,7 +17,7 @@ def formula(tax_unit, period, parameters): federal_gross_income = add(tax_unit, period, ["irs_gross_income"]) # Add back lines 6/7 losses dropped by irs_gross_income. loss_adjustment = tax_unit("ma_gross_income_loss_adjustment", period) - # Add back the federal excess business loss (Schedule X, line 6). + # Add back the excess business loss (Schedule X, line 6). excess_business_loss = tax_unit("ma_excess_business_loss_adjustment", period) # Exclude foreign earned income, Social Security, state/local tax refunds, # and contributory public pensions. From 2df6e91a1946242d380526657b6d67de14f9c81d Mon Sep 17 00:00:00 2001 From: PavelMakarchuk Date: Thu, 8 Oct 2026 08:43:49 -0400 Subject: [PATCH 3/3] Compute the 2026 Massachusetts excess business loss threshold from pre-OBBBA 461(l)(3)(C) Massachusetts follows the Code as of January 1, 2024, so the 2026 threshold is 250,000 indexed from 2017 with the C-CPI-U: 320,309, rounded to 320,000 (640,000 joint). The same computation reproduces the 2022-2025 published thresholds. Update the two 2026 tests. Co-Authored-By: Claude Opus 5.5 --- .../excess_business_loss/threshold.yaml | 27 ++++++++++--------- .../ma_excess_business_loss_adjustment.yaml | 18 ++++++------- 2 files changed, 23 insertions(+), 22 deletions(-) diff --git a/policyengine_us/parameters/gov/states/ma/tax/income/excess_business_loss/threshold.yaml b/policyengine_us/parameters/gov/states/ma/tax/income/excess_business_loss/threshold.yaml index ccea6617be4..381fcb62d45 100644 --- a/policyengine_us/parameters/gov/states/ma/tax/income/excess_business_loss/threshold.yaml +++ b/policyengine_us/parameters/gov/states/ma/tax/income/excess_business_loss/threshold.yaml @@ -31,9 +31,15 @@ metadata: # uses the 2023 federal $289,000 / $578,000 (Rev. Proc. 2022-38). # From 2026 the federal threshold uses the OBBBA reset ($256,000 / $512,000, # Rev. Proc. 2025-32, section 4.31), which Massachusetts does not adopt -# (TIR 26-4). The 2026 values are the 2025 values, pending the Massachusetts -# Department of Revenue's 2026 figure under the pre-OBBBA indexing of -# Section 461(l)(3)(B). +# (TIR 26-4). The 2026 values follow Section 461(l)(3)(C) as of January 1, +# 2024: $250,000 times the Section 1(f)(3) cost-of-living adjustment with +# "2017" for "2016" (average C-CPI-U for the 12 months ending August 31), +# rounded to the nearest $1,000. 250,000 x 177.1137 / 138.2368 = 320,309, +# so $320,000 ($640,000 joint). The same computation gives every published +# figure for 2022-2025 (269,580; 289,140; 304,634; 313,038). The Department +# of Revenue has not printed a 2026 figure (TIR 26-4; 2025 Form 1 +# instructions, page 21). 320,309 is about $200 below the 320,500 rounding +# boundary, so a different CPI series could give $321,000. HEAD_OF_HOUSEHOLD: metadata: uprating: @@ -46,8 +52,7 @@ HEAD_OF_HOUSEHOLD: 2023-01-01: 289_000 2024-01-01: 305_000 2025-01-01: 313_000 - # Pending the Massachusetts Department of Revenue's 2026 figure. - 2026-01-01: 313_000 + 2026-01-01: 320_000 JOINT: metadata: uprating: @@ -61,8 +66,7 @@ JOINT: 2023-01-01: 578_000 2024-01-01: 610_000 2025-01-01: 626_000 - # Pending the Massachusetts Department of Revenue's 2026 figure. - 2026-01-01: 626_000 + 2026-01-01: 640_000 SEPARATE: metadata: uprating: @@ -75,8 +79,7 @@ SEPARATE: 2023-01-01: 289_000 2024-01-01: 305_000 2025-01-01: 313_000 - # Pending the Massachusetts Department of Revenue's 2026 figure. - 2026-01-01: 313_000 + 2026-01-01: 320_000 SINGLE: metadata: uprating: @@ -89,8 +92,7 @@ SINGLE: 2023-01-01: 289_000 2024-01-01: 305_000 2025-01-01: 313_000 - # Pending the Massachusetts Department of Revenue's 2026 figure. - 2026-01-01: 313_000 + 2026-01-01: 320_000 SURVIVING_SPOUSE: metadata: uprating: @@ -104,5 +106,4 @@ SURVIVING_SPOUSE: 2023-01-01: 289_000 2024-01-01: 305_000 2025-01-01: 313_000 - # Pending the Massachusetts Department of Revenue's 2026 figure. - 2026-01-01: 313_000 + 2026-01-01: 320_000 diff --git a/policyengine_us/tests/policy/baseline/gov/states/ma/tax/income/gross_income/ma_excess_business_loss_adjustment.yaml b/policyengine_us/tests/policy/baseline/gov/states/ma/tax/income/gross_income/ma_excess_business_loss_adjustment.yaml index 44914f0f2d1..26fa9401fa3 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/ma/tax/income/gross_income/ma_excess_business_loss_adjustment.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/ma/tax/income/gross_income/ma_excess_business_loss_adjustment.yaml @@ -119,14 +119,14 @@ excess_business_loss: 0 ma_excess_business_loss_adjustment: 0 -- name: 2026 single return with a loss equal to the $313,000 Massachusetts threshold adds back nothing +- name: 2026 single return with a loss equal to the $320,000 Massachusetts threshold adds back nothing period: 2026 absolute_error_margin: 0.01 input: people: head: age: 50 - self_employment_income: -313_000 + self_employment_income: -320_000 tax_units: tax_unit: members: [head] @@ -135,9 +135,9 @@ members: [head] state_code: MA output: - # Federal: 313,000 - 256,000 (Rev. Proc. 2025-32, section 4.31) - excess_business_loss: 57_000 - # Massachusetts: 313,000 - 313,000 = 0 (no OBBBA reset, TIR 26-4) + # Federal: 320,000 - 256,000 (Rev. Proc. 2025-32, section 4.31) + excess_business_loss: 64_000 + # Massachusetts: 320,000 - 320,000 = 0 (no OBBBA reset, TIR 26-4) ma_excess_business_loss_adjustment: 0 - name: 2026 single return with wages and a Schedule C loss below the Massachusetts threshold @@ -159,12 +159,12 @@ output: # Federal: 300,000 - 256,000 excess_business_loss: 44_000 - # Massachusetts: 300,000 is below 313,000. + # Massachusetts: 300,000 is below 320,000. ma_excess_business_loss_adjustment: 0 # 500,000 wages - 300,000 Form 1, line 6a loss + 0 ma_gross_income: 200_000 -- name: 2026 joint return adds back the loss above $626,000 +- name: 2026 joint return adds back the loss above $640,000 period: 2026 absolute_error_margin: 0.01 input: @@ -184,8 +184,8 @@ output: # Federal: 1,000,000 - 512,000 excess_business_loss: 488_000 - # Massachusetts: 1,000,000 - 626,000 - ma_excess_business_loss_adjustment: 374_000 + # Massachusetts: 1,000,000 - 640,000 + ma_excess_business_loss_adjustment: 360_000 - name: No add-back from 2029, after the limitation ends period: 2029