diff --git a/changelog.d/fix-10268-ca-amt-phase-out-rate.fixed.md b/changelog.d/fix-10268-ca-amt-phase-out-rate.fixed.md new file mode 100644 index 00000000000..c54c8555504 --- /dev/null +++ b/changelog.d/fix-10268-ca-amt-phase-out-rate.fixed.md @@ -0,0 +1 @@ +Phase out the California AMT exemption at 25% under R&TC 17062.1 instead of the federal 2026 rate of 50%. diff --git a/policyengine_us/parameters/gov/states/ca/tax/income/amt/exemption/phase_out_rate.yaml b/policyengine_us/parameters/gov/states/ca/tax/income/amt/exemption/phase_out_rate.yaml new file mode 100644 index 00000000000..b430e3c6541 --- /dev/null +++ b/policyengine_us/parameters/gov/states/ca/tax/income/amt/exemption/phase_out_rate.yaml @@ -0,0 +1,21 @@ +description: California reduces the alternative minimum tax exemption by this share of alternative minimum taxable income above the phase-out threshold. +values: + 2021-01-01: 0.25 + +metadata: + period: year + unit: /1 + label: California AMT exemption phase-out rate + reference: + # California applies IRC 55 as it read on January 1, 2015, so the 50% rate + # that P.L. 119-21 added in IRC 55(d)(4)(A)(ii)(IV) from 2026 does not apply. + - title: Cal. Rev. & Tax. Code § 17062.1 (IRC alternative minimum tax as it read on January 1, 2015) + href: https://leginfo.legislature.ca.gov/faces/codes_displaySection.xhtml?lawCode=RTC§ionNum=17062.1 + - title: Cal. Rev. & Tax. Code § 17062(b)(6) (replaces only the IRC 55(d)(3) phase-out thresholds) + href: https://leginfo.legislature.ca.gov/faces/codes_displaySection.xhtml?lawCode=RTC§ionNum=17062 + - title: 26 U.S.C. § 55(d)(3) (2014 edition) - 25 percent of alternative minimum taxable income above the threshold + href: https://www.govinfo.gov/content/pkg/USCODE-2014-title26/html/USCODE-2014-title26-subtitleA-chap1-subchapA-partVI-sec55.htm + - title: 2021 Instructions for Schedule P (540), Line 21 worksheet line 4 and Line 22 Exemption Worksheet line 5 + href: https://www.ftb.ca.gov/forms/2021/2021-540-p-instructions.html + - title: 2025 Instructions for Schedule P (540), Line 21 worksheet line 4 and Line 22 Exemption Worksheet line 5 + href: https://www.ftb.ca.gov/forms/2025/2025-540-p-instructions.html diff --git a/policyengine_us/tests/policy/baseline/gov/states/ca/tax/income/alternative_minimum_tax/ca_amt_exemption.yaml b/policyengine_us/tests/policy/baseline/gov/states/ca/tax/income/alternative_minimum_tax/ca_amt_exemption.yaml index 1738b1c2937..27ea8a27dc2 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/ca/tax/income/alternative_minimum_tax/ca_amt_exemption.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/ca/tax/income/alternative_minimum_tax/ca_amt_exemption.yaml @@ -70,3 +70,71 @@ state_code: CA output: ca_amt_exemption: 0 + +- name: Single filer, 2026, exemption phases out at 25% under R&TC 17062.1, not the federal 50% + # Schedule P (540) Exemption Worksheet with PE's CPI-uprated 2026 amounts + # (the FTB has not published 2026 amounts): + # Line 1: 94,850.96. Line 3: 355,690.34. Line 4: 500,000 - 355,690.34 = 144,309.66. + # Line 5: 25% x 144,309.66 = 36,077.41. Line 6: 94,850.96 - 36,077.41 = 58,773.55. + # At the federal 2026 rate of 50%, line 6 would be 94,850.96 - 72,154.83 = 22,696.13. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: {} + tax_units: + tax_unit: + members: [person1] + filing_status: SINGLE + ca_amti: 500_000 + head_earned: 500_000 + households: + household: + members: [person1] + state_code: CA + output: + ca_amt_exemption: 58_773.55 + +- name: Joint filers, 2026, exemption phases out at 25% + # Line 1: 126,469.65. Line 3: 474,254.81. Line 4: 700,000 - 474,254.81 = 225,745.19. + # Line 5: 25% x 225,745.19 = 56,436.30. Line 6: 126,469.65 - 56,436.30 = 70,033.36. + # At 50%, line 6 would be 126,469.65 - 112,872.60 = 13,597.06. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: {} + person2: {} + tax_units: + tax_unit: + members: [person1, person2] + filing_status: JOINT + ca_amti: 700_000 + head_earned: 700_000 + households: + household: + members: [person1, person2] + state_code: CA + output: + ca_amt_exemption: 70_033.36 + +- name: Single filer, 2025, published amounts (control, unchanged) + # 2025 Schedule P (540) Exemption Worksheet: + # Line 1: 92,749. Line 3: 347,808. Line 4: 500,000 - 347,808 = 152,192. + # Line 5: 25% x 152,192 = 38,048. Line 6: 92,749 - 38,048 = 54,701. + period: 2025 + input: + people: + person1: {} + tax_units: + tax_unit: + members: [person1] + filing_status: SINGLE + ca_amti: 500_000 + head_earned: 500_000 + households: + household: + members: [person1] + state_code: CA + output: + ca_amt_exemption: 54_701 diff --git a/policyengine_us/variables/gov/states/ca/tax/income/alternative_minimum_tax/amti/ca_amti.py b/policyengine_us/variables/gov/states/ca/tax/income/alternative_minimum_tax/amti/ca_amti.py index d1b9b301963..1ca19510821 100644 --- a/policyengine_us/variables/gov/states/ca/tax/income/alternative_minimum_tax/amti/ca_amti.py +++ b/policyengine_us/variables/gov/states/ca/tax/income/alternative_minimum_tax/amti/ca_amti.py @@ -13,7 +13,6 @@ class ca_amti(Variable): def formula(tax_unit, period, parameters): filing_status = tax_unit("filing_status", period) p = parameters(period).gov.states.ca.tax.income.amt.exemption - p_us = parameters(period).gov.irs.income.amt.capital_gains amti_before_ded = tax_unit("ca_pre_exemption_amti", period) separate = filing_status == filing_status.possible_values.SEPARATE @@ -24,7 +23,7 @@ def formula(tax_unit, period, parameters): # Line 3 reduced_amti = max_(amti_before_ded - maximum_exemption, 0) # Line 4 - reduced_amti_rate = reduced_amti * p_us.capital_gain_excess_tax_rate + reduced_amti_rate = reduced_amti * p.phase_out_rate # Line 5 separate_amti_calc = min_(reduced_amti_rate, p.amount[filing_status]) diff --git a/policyengine_us/variables/gov/states/ca/tax/income/alternative_minimum_tax/exemption/ca_amt_exemption.py b/policyengine_us/variables/gov/states/ca/tax/income/alternative_minimum_tax/exemption/ca_amt_exemption.py index 209f252897f..84812a4bb9f 100644 --- a/policyengine_us/variables/gov/states/ca/tax/income/alternative_minimum_tax/exemption/ca_amt_exemption.py +++ b/policyengine_us/variables/gov/states/ca/tax/income/alternative_minimum_tax/exemption/ca_amt_exemption.py @@ -23,8 +23,7 @@ def formula(tax_unit, period, parameters): # Line 4 reduced_amti = max_(amti - lower_exemption_threshold, 0) # Line 5 - p_irs = parameters(period).gov.irs.income.amt.exemption - reduced_amti_rate = reduced_amti * p_irs.phase_out.rate + reduced_amti_rate = reduced_amti * p.phase_out_rate # Line 6 adult_exemption = max_(exemption_max_amount - reduced_amti_rate, 0) # Eligible children receive an increased exemption amount. @@ -34,6 +33,7 @@ def formula(tax_unit, period, parameters): is_head = person("is_tax_unit_head", period) head_is_eligible_child = tax_unit.any(eligible_child & is_head) # Line 7 + p_irs = parameters(period).gov.irs.income.amt.exemption exemption_amount_child = p_irs.child.amount # Line 8 earned_income = tax_unit("head_earned", period)