From 8af3938b92650263789069d275df327a43c58b64 Mon Sep 17 00:00:00 2001 From: PavelMakarchuk Date: Wed, 4 Nov 2026 10:46:54 -0500 Subject: [PATCH 1/4] Apply the NY itemized deduction adjustment to IT-196 line 45 The line 46 worksheets take a share of line 45, which is after the line 40 limitation and before the college tuition deduction (line 48). Both incremental reductions took the share of the total before the limitation. Co-Authored-By: Claude Opus 5.5 --- .../ny-itemized-reduction-line-45.fixed.md | 1 + ...eductions_lower_incremental_reduction.yaml | 30 +++++++++++++ ...ized_deductions_phase_out_integration.yaml | 43 +++++++++++++++++++ ...deductions_higher_incremental_reduction.py | 14 ++++-- ..._deductions_lower_incremental_reduction.py | 14 ++++-- 5 files changed, 96 insertions(+), 6 deletions(-) create mode 100644 changelog.d/ny-itemized-reduction-line-45.fixed.md diff --git a/changelog.d/ny-itemized-reduction-line-45.fixed.md b/changelog.d/ny-itemized-reduction-line-45.fixed.md new file mode 100644 index 00000000000..60ec16da1cf --- /dev/null +++ b/changelog.d/ny-itemized-reduction-line-45.fixed.md @@ -0,0 +1 @@ +Apply the New York itemized deduction adjustment (IT-196 line 46) to line 45, after the line 40 limitation and before the college tuition deduction. diff --git a/policyengine_us/tests/policy/baseline/gov/states/ny/tax/income/taxable_income/deductions/itemized/ny_itemized_deductions_lower_incremental_reduction.yaml b/policyengine_us/tests/policy/baseline/gov/states/ny/tax/income/taxable_income/deductions/itemized/ny_itemized_deductions_lower_incremental_reduction.yaml index 84386a40dd3..25bb2adb51e 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/ny/tax/income/taxable_income/deductions/itemized/ny_itemized_deductions_lower_incremental_reduction.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/ny/tax/income/taxable_income/deductions/itemized/ny_itemized_deductions_lower_incremental_reduction.yaml @@ -33,3 +33,33 @@ state_code: NY output: ny_itemized_deductions_lower_incremental_reduction: 25 + +- name: Case 4, the line 46 share uses line 45, after the line 40 limitation. + period: 2021 + absolute_error_margin: 0.01 + input: + ny_agi: 360_200 + ny_itemized_deductions_max: 50_000 + ny_itemized_deductions_phase_out: 640.50 + charitable_deduction: 0 + filing_status: JOINT + state_code: NY + output: + # IT-196 (2021) line 46 Worksheet 3: line 45 = 50,000 - 640.50 = 49,359.50. + # Line 4 = min(360,200 - 200,000, 50,000) = 50,000; line 5 = 1. + # Line 6 = 0.25 * 49,359.50 = 12,339.875. + ny_itemized_deductions_lower_incremental_reduction: 12_339.875 + +- name: Case 5, the college tuition deduction (line 48) is not part of line 45. + period: 2021 + absolute_error_margin: 0.01 + input: + ny_agi: 360_200 + ny_itemized_deductions_max: 60_000 + ny_college_tuition_deduction: 10_000 + charitable_deduction: 0 + filing_status: JOINT + state_code: NY + output: + # Line 45 = 60,000 - 10,000 = 50,000; line 6 = 0.25 * 50,000. + ny_itemized_deductions_lower_incremental_reduction: 12_500 diff --git a/policyengine_us/tests/policy/baseline/gov/states/ny/tax/income/taxable_income/deductions/itemized/ny_itemized_deductions_phase_out_integration.yaml b/policyengine_us/tests/policy/baseline/gov/states/ny/tax/income/taxable_income/deductions/itemized/ny_itemized_deductions_phase_out_integration.yaml index 7704dceee09..87d4fa0270e 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/ny/tax/income/taxable_income/deductions/itemized/ny_itemized_deductions_phase_out_integration.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/ny/tax/income/taxable_income/deductions/itemized/ny_itemized_deductions_phase_out_integration.yaml @@ -79,3 +79,46 @@ # ny_itemized_deductions_max = 50,000 + 25,000 + 10,000 = 85,000 passes # through Line 40 untouched (Line 46 still applies on NY AGI 300,000). ny_itemized_deductions_phase_out_applies: false + +- name: JOINT 2021 - the line 46 adjustment applies to line 45, after the line 40 limitation. + period: 2021 + absolute_error_margin: 0.5 + input: + people: + head: + age: 40 + taxable_interest_income: 360_200 + deductible_mortgage_interest: 50_000 + spouse: + age: 40 + tax_units: + tax_unit: + members: [head, spouse] + state_sales_tax: 0 + local_sales_tax: 0 + marital_units: + marital_unit: + members: [head, spouse] + families: + family: + members: [head, spouse] + spm_units: + spm_unit: + members: [head, spouse] + households: + household: + members: [head, spouse] + state_code: NY + output: + # Hand computation from the 2021 IT-196 instructions (policyengine-taxsim #1512). + # Line 40: 50,000 - min(0.80 * 50,000, 0.03 * (360,200 - 338,850)) = 49,359.50. + # Line 46 (Worksheet 3): 0.25 * 49,359.50 = 12,339.875. + # Line 47: 49,359.50 - 12,339.875 = 37,019.625. + ny_itemized_deductions_phase_out: 640.50 + ny_itemized_deductions_reduction: 12_339.875 + ny_itemized_deductions: 37_019.625 + # IT-201 (2021): taxable income 360,200 - 37,019.625 = 323,180.375 is not + # more than 323,200, so Tax computation worksheet 2 applies. NY AGI is + # $211,550 or more, so the tax is line 3: 0.0633 * 323,180.375 = 20,457.32. + ny_taxable_income: 323_180.375 + ny_income_tax_before_credits: 20_457.32 diff --git a/policyengine_us/variables/gov/states/ny/tax/income/taxable_income/deductions/itemized/reduction/based_on_charitable_deduction/incremental/ny_itemized_deductions_higher_incremental_reduction.py b/policyengine_us/variables/gov/states/ny/tax/income/taxable_income/deductions/itemized/reduction/based_on_charitable_deduction/incremental/ny_itemized_deductions_higher_incremental_reduction.py index 4fbd86fdd6e..29473f13bff 100644 --- a/policyengine_us/variables/gov/states/ny/tax/income/taxable_income/deductions/itemized/reduction/based_on_charitable_deduction/incremental/ny_itemized_deductions_higher_incremental_reduction.py +++ b/policyengine_us/variables/gov/states/ny/tax/income/taxable_income/deductions/itemized/reduction/based_on_charitable_deduction/incremental/ny_itemized_deductions_higher_incremental_reduction.py @@ -7,7 +7,10 @@ class ny_itemized_deductions_higher_incremental_reduction(Variable): label = "New York itemized deductions higher incremental reduction" unit = USD definition_period = YEAR - reference = "https://www.nysenate.gov/legislation/laws/TAX/615" # (f) + reference = ( + "https://www.nysenate.gov/legislation/laws/TAX/615", # (f) + "https://www.tax.ny.gov/pdf/2021/inc/it196i_2021.pdf#page=20", # Line 46 + ) defined_for = "ny_itemized_deductions_reduction_applies" def formula(tax_unit, period, parameters): @@ -18,5 +21,10 @@ def formula(tax_unit, period, parameters): agi_excess = max_(agi - p.income_threshold, 0) numerator = min_(p.numerator, agi_excess) fraction = numerator / p.denominator - itemized_deduction = tax_unit("ny_itemized_deductions_max", period) - return itemized_deduction * p.rate * fraction + # IT-196 line 46 worksheets take a share of line 45, which is after the + # line 40 limitation and before the college tuition deduction (line 48). + itemized_max = tax_unit("ny_itemized_deductions_max", period) + college_tuition = tax_unit("ny_college_tuition_deduction", period) + phase_out = tax_unit("ny_itemized_deductions_phase_out", period) + line_45 = max_(itemized_max - college_tuition - phase_out, 0) + return line_45 * p.rate * fraction diff --git a/policyengine_us/variables/gov/states/ny/tax/income/taxable_income/deductions/itemized/reduction/based_on_charitable_deduction/incremental/ny_itemized_deductions_lower_incremental_reduction.py b/policyengine_us/variables/gov/states/ny/tax/income/taxable_income/deductions/itemized/reduction/based_on_charitable_deduction/incremental/ny_itemized_deductions_lower_incremental_reduction.py index fb4e7be5f7f..f7660ca3098 100644 --- a/policyengine_us/variables/gov/states/ny/tax/income/taxable_income/deductions/itemized/reduction/based_on_charitable_deduction/incremental/ny_itemized_deductions_lower_incremental_reduction.py +++ b/policyengine_us/variables/gov/states/ny/tax/income/taxable_income/deductions/itemized/reduction/based_on_charitable_deduction/incremental/ny_itemized_deductions_lower_incremental_reduction.py @@ -7,7 +7,10 @@ class ny_itemized_deductions_lower_incremental_reduction(Variable): label = "New York itemized deductions lower incremental reduction" unit = USD definition_period = YEAR - reference = "https://www.nysenate.gov/legislation/laws/TAX/615" # (f) + reference = ( + "https://www.nysenate.gov/legislation/laws/TAX/615", # (f) + "https://www.tax.ny.gov/pdf/2021/inc/it196i_2021.pdf#page=20", # Line 46 + ) defined_for = "ny_itemized_deductions_reduction_applies" def formula(tax_unit, period, parameters): @@ -19,5 +22,10 @@ def formula(tax_unit, period, parameters): agi_excess = max_(agi - p.income_threshold[filing_status], 0) numerator = min_(p.numerator, agi_excess) fraction = numerator / p.denominator - itemized_deduction = tax_unit("ny_itemized_deductions_max", period) - return itemized_deduction * p.rate * fraction + # IT-196 line 46 worksheets take a share of line 45, which is after the + # line 40 limitation and before the college tuition deduction (line 48). + itemized_max = tax_unit("ny_itemized_deductions_max", period) + college_tuition = tax_unit("ny_college_tuition_deduction", period) + phase_out = tax_unit("ny_itemized_deductions_phase_out", period) + line_45 = max_(itemized_max - college_tuition - phase_out, 0) + return line_45 * p.rate * fraction From 2afa11600c36c346569f803d5ad30e834b195138 Mon Sep 17 00:00:00 2001 From: PavelMakarchuk Date: Fri, 6 Nov 2026 10:48:19 -0500 Subject: [PATCH 2/4] Include the college tuition deduction in the NY 615(f) base Tax Law 615(f) takes its percentage of the deduction allowable under 615(a), which includes the 615(d)(4) college tuition deduction. IT-196 line 45 holds it (line 43) for Form IT-203 filers; the IT-201 line 48 placement is a form layout. Both incremental reductions now use ny_itemized_deductions_max minus the line 40 limitation. Add tests with tuition for both tiers, a higher-tier case after the line 40 limitation, and an integration case with tuition expenses. Record the statute and form readings as a source-conflict candidate. Co-Authored-By: Claude Opus 5.5 --- .../ny-itemized-reduction-line-45.fixed.md | 2 +- ...ductions_higher_incremental_reduction.yaml | 33 ++++++++++++ ...eductions_lower_incremental_reduction.yaml | 28 ++++++++-- ...ized_deductions_phase_out_integration.yaml | 54 +++++++++++++++++++ ...deductions_higher_incremental_reduction.py | 13 +++-- ..._deductions_lower_incremental_reduction.py | 13 +++-- source_conflicts/candidates.yaml | 43 +++++++++++++++ 7 files changed, 172 insertions(+), 14 deletions(-) diff --git a/changelog.d/ny-itemized-reduction-line-45.fixed.md b/changelog.d/ny-itemized-reduction-line-45.fixed.md index 60ec16da1cf..03b58d529ea 100644 --- a/changelog.d/ny-itemized-reduction-line-45.fixed.md +++ b/changelog.d/ny-itemized-reduction-line-45.fixed.md @@ -1 +1 @@ -Apply the New York itemized deduction adjustment (IT-196 line 46) to line 45, after the line 40 limitation and before the college tuition deduction. +Apply the New York itemized deduction adjustment (Tax Law 615(f), IT-196 line 46) to the deduction after the line 40 limitation, including the college tuition itemized deduction. diff --git a/policyengine_us/tests/policy/baseline/gov/states/ny/tax/income/taxable_income/deductions/itemized/ny_itemized_deductions_higher_incremental_reduction.yaml b/policyengine_us/tests/policy/baseline/gov/states/ny/tax/income/taxable_income/deductions/itemized/ny_itemized_deductions_higher_incremental_reduction.yaml index 53913b572ff..9d9096f9d92 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/ny/tax/income/taxable_income/deductions/itemized/ny_itemized_deductions_higher_incremental_reduction.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/ny/tax/income/taxable_income/deductions/itemized/ny_itemized_deductions_higher_incremental_reduction.yaml @@ -21,3 +21,36 @@ state_code: NY output: ny_itemized_deductions_higher_incremental_reduction: 25 + +- name: Case 3, the higher share uses the base after the line 40 limitation. + period: 2021 + absolute_error_margin: 0.01 + input: + ny_agi: 500_000 + ny_itemized_deductions_max: 50_000 + ny_itemized_deductions_phase_out: 640.50 + charitable_deduction: 0 + filing_status: SINGLE + state_code: NY + output: + # IT-196 (2021) line 46 Worksheet 4: line 1 = 50,000 - 640.50 = 49,359.50. + # Line 2 = min(500,000 - 475,000, 50,000) / 50,000 = 0.5. + # Line 3 = 0.25 * 49,359.50 = 12,339.875; higher amount = 0.5 * 12,339.875. + ny_itemized_deductions_higher_incremental_reduction: 6_169.9375 + +- name: Case 4, the higher share base includes the college tuition deduction. + period: 2021 + absolute_error_margin: 0.01 + input: + ny_agi: 500_000 + ny_itemized_deductions_max: 60_000 + ny_college_tuition_deduction: 10_000 + ny_itemized_deductions_phase_out: 640.50 + charitable_deduction: 0 + filing_status: SINGLE + state_code: NY + output: + # Tax Law 615(f)(2) uses the deduction allowable under 615(a), with the + # 615(d)(4) tuition deduction: base = 60,000 - 640.50 = 59,359.50. + # Fraction = 25,000 / 50,000 = 0.5; 0.5 * 0.25 * 59,359.50 = 7,419.9375. + ny_itemized_deductions_higher_incremental_reduction: 7_419.9375 diff --git a/policyengine_us/tests/policy/baseline/gov/states/ny/tax/income/taxable_income/deductions/itemized/ny_itemized_deductions_lower_incremental_reduction.yaml b/policyengine_us/tests/policy/baseline/gov/states/ny/tax/income/taxable_income/deductions/itemized/ny_itemized_deductions_lower_incremental_reduction.yaml index 25bb2adb51e..17aa2202975 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/ny/tax/income/taxable_income/deductions/itemized/ny_itemized_deductions_lower_incremental_reduction.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/ny/tax/income/taxable_income/deductions/itemized/ny_itemized_deductions_lower_incremental_reduction.yaml @@ -50,7 +50,7 @@ # Line 6 = 0.25 * 49,359.50 = 12,339.875. ny_itemized_deductions_lower_incremental_reduction: 12_339.875 -- name: Case 5, the college tuition deduction (line 48) is not part of line 45. +- name: Case 5, the college tuition deduction is part of the 615(f) base. period: 2021 absolute_error_margin: 0.01 input: @@ -61,5 +61,27 @@ filing_status: JOINT state_code: NY output: - # Line 45 = 60,000 - 10,000 = 50,000; line 6 = 0.25 * 50,000. - ny_itemized_deductions_lower_incremental_reduction: 12_500 + # Tax Law 615(f)(1) takes the percentage of the deduction allowable under + # 615(a), which includes the 615(d)(4) college tuition deduction (IT-196 + # line 45 holds it on line 43 for Form IT-203 filers). No federal AGI is + # given, so the line 40 limitation does not apply: base = 60,000. + # Line 4 = min(360,200 - 200,000, 50,000) = 50,000; line 5 = 1. + # Line 6 = 0.25 * 60,000 = 15,000. + ny_itemized_deductions_lower_incremental_reduction: 15_000 + +- name: Case 6, the base includes college tuition and is after the line 40 limitation. + period: 2021 + absolute_error_margin: 0.01 + input: + ny_agi: 360_200 + ny_itemized_deductions_max: 60_000 + ny_college_tuition_deduction: 10_000 + ny_itemized_deductions_phase_out: 640.50 + charitable_deduction: 0 + filing_status: JOINT + state_code: NY + output: + # Base = 60,000 - 640.50 = 59,359.50 (tuition 10,000 stays in the base). + # Line 5 = min(160,200, 50,000) / 50,000 = 1. + # Line 6 = 0.25 * 59,359.50 = 14,839.875. + ny_itemized_deductions_lower_incremental_reduction: 14_839.875 diff --git a/policyengine_us/tests/policy/baseline/gov/states/ny/tax/income/taxable_income/deductions/itemized/ny_itemized_deductions_phase_out_integration.yaml b/policyengine_us/tests/policy/baseline/gov/states/ny/tax/income/taxable_income/deductions/itemized/ny_itemized_deductions_phase_out_integration.yaml index 87d4fa0270e..4405c7b9a4d 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/ny/tax/income/taxable_income/deductions/itemized/ny_itemized_deductions_phase_out_integration.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/ny/tax/income/taxable_income/deductions/itemized/ny_itemized_deductions_phase_out_integration.yaml @@ -121,4 +121,58 @@ # more than 323,200, so Tax computation worksheet 2 applies. NY AGI is # $211,550 or more, so the tax is line 3: 0.0633 * 323,180.375 = 20,457.32. ny_taxable_income: 323_180.375 + # The 0.5 margin covers only the supplemental tax: the model adds the + # rounded $1,056 recapture amount, so it returns about 0.22 more than the + # flat 6.33% of line 3. The itemized amounts above match to the cent. ny_income_tax_before_credits: 20_457.32 + +- name: JOINT 2021 - the line 46 adjustment base includes the college tuition deduction. + period: 2021 + absolute_error_margin: 0.5 + input: + people: + head: + age: 40 + taxable_interest_income: 360_200 + deductible_mortgage_interest: 50_000 + qualified_tuition_expenses: 10_000 + spouse: + age: 40 + tax_units: + tax_unit: + members: [head, spouse] + state_sales_tax: 0 + local_sales_tax: 0 + marital_units: + marital_unit: + members: [head, spouse] + families: + family: + members: [head, spouse] + spm_units: + spm_unit: + members: [head, spouse] + households: + household: + members: [head, spouse] + state_code: NY + output: + # Tax Law 615(d)(4): tuition deduction = 100% of 10,000 allowable expenses. + ny_college_tuition_deduction: 10_000 + # Line 40: tuition is not on the line 40 worksheet, so the limitation is + # min(0.80 * 50,000, 0.03 * (360,200 - 338,850)) = 640.50. + ny_itemized_deductions_phase_out: 640.50 + # Tax Law 615(f)(1): 25% of the deduction allowable under 615(a), which + # includes the 615(d)(4) tuition deduction (IT-196 line 45 with line 43): + # 0.25 * (50,000 + 10,000 - 640.50) = 0.25 * 59,359.50 = 14,839.875. + ny_itemized_deductions_reduction: 14_839.875 + # 59,359.50 - 14,839.875 = 44,519.625. + ny_itemized_deductions: 44_519.625 + # IT-201 (2021): taxable income 360,200 - 44,519.625 = 315,680.375 is not + # more than 323,200, so Tax computation worksheet 2 applies. NY AGI is + # $211,550 or more, so the tax is line 3: 0.0633 * 315,680.375 = 19,982.57. + ny_taxable_income: 315_680.375 + # The 0.5 margin covers only the supplemental tax: the model adds the + # rounded $1,056 recapture amount, so it returns about 0.22 more than the + # flat 6.33% of line 3. The itemized amounts above match to the cent. + ny_income_tax_before_credits: 19_982.57 diff --git a/policyengine_us/variables/gov/states/ny/tax/income/taxable_income/deductions/itemized/reduction/based_on_charitable_deduction/incremental/ny_itemized_deductions_higher_incremental_reduction.py b/policyengine_us/variables/gov/states/ny/tax/income/taxable_income/deductions/itemized/reduction/based_on_charitable_deduction/incremental/ny_itemized_deductions_higher_incremental_reduction.py index 29473f13bff..1d1713e68b4 100644 --- a/policyengine_us/variables/gov/states/ny/tax/income/taxable_income/deductions/itemized/reduction/based_on_charitable_deduction/incremental/ny_itemized_deductions_higher_incremental_reduction.py +++ b/policyengine_us/variables/gov/states/ny/tax/income/taxable_income/deductions/itemized/reduction/based_on_charitable_deduction/incremental/ny_itemized_deductions_higher_incremental_reduction.py @@ -9,6 +9,7 @@ class ny_itemized_deductions_higher_incremental_reduction(Variable): definition_period = YEAR reference = ( "https://www.nysenate.gov/legislation/laws/TAX/615", # (f) + "https://www.tax.ny.gov/pdf/2021/inc/it196_2021.pdf#page=3", # Lines 40-49 "https://www.tax.ny.gov/pdf/2021/inc/it196i_2021.pdf#page=20", # Line 46 ) defined_for = "ny_itemized_deductions_reduction_applies" @@ -21,10 +22,12 @@ def formula(tax_unit, period, parameters): agi_excess = max_(agi - p.income_threshold, 0) numerator = min_(p.numerator, agi_excess) fraction = numerator / p.denominator - # IT-196 line 46 worksheets take a share of line 45, which is after the - # line 40 limitation and before the college tuition deduction (line 48). + # Tax Law 615(f) applies the percentage to the New York itemized + # deduction otherwise allowable under 615(a): the pre-TCJA federal + # deductions after the line 40 limitation, with the 615(c)-(e) + # modifications, including the 615(d)(4) college tuition deduction. + # This is IT-196 line 45 for Form IT-203 filers (line 43 tuition). itemized_max = tax_unit("ny_itemized_deductions_max", period) - college_tuition = tax_unit("ny_college_tuition_deduction", period) phase_out = tax_unit("ny_itemized_deductions_phase_out", period) - line_45 = max_(itemized_max - college_tuition - phase_out, 0) - return line_45 * p.rate * fraction + base = itemized_max - phase_out + return base * p.rate * fraction diff --git a/policyengine_us/variables/gov/states/ny/tax/income/taxable_income/deductions/itemized/reduction/based_on_charitable_deduction/incremental/ny_itemized_deductions_lower_incremental_reduction.py b/policyengine_us/variables/gov/states/ny/tax/income/taxable_income/deductions/itemized/reduction/based_on_charitable_deduction/incremental/ny_itemized_deductions_lower_incremental_reduction.py index f7660ca3098..91a60ed56b8 100644 --- a/policyengine_us/variables/gov/states/ny/tax/income/taxable_income/deductions/itemized/reduction/based_on_charitable_deduction/incremental/ny_itemized_deductions_lower_incremental_reduction.py +++ b/policyengine_us/variables/gov/states/ny/tax/income/taxable_income/deductions/itemized/reduction/based_on_charitable_deduction/incremental/ny_itemized_deductions_lower_incremental_reduction.py @@ -9,6 +9,7 @@ class ny_itemized_deductions_lower_incremental_reduction(Variable): definition_period = YEAR reference = ( "https://www.nysenate.gov/legislation/laws/TAX/615", # (f) + "https://www.tax.ny.gov/pdf/2021/inc/it196_2021.pdf#page=3", # Lines 40-49 "https://www.tax.ny.gov/pdf/2021/inc/it196i_2021.pdf#page=20", # Line 46 ) defined_for = "ny_itemized_deductions_reduction_applies" @@ -22,10 +23,12 @@ def formula(tax_unit, period, parameters): agi_excess = max_(agi - p.income_threshold[filing_status], 0) numerator = min_(p.numerator, agi_excess) fraction = numerator / p.denominator - # IT-196 line 46 worksheets take a share of line 45, which is after the - # line 40 limitation and before the college tuition deduction (line 48). + # Tax Law 615(f) applies the percentage to the New York itemized + # deduction otherwise allowable under 615(a): the pre-TCJA federal + # deductions after the line 40 limitation, with the 615(c)-(e) + # modifications, including the 615(d)(4) college tuition deduction. + # This is IT-196 line 45 for Form IT-203 filers (line 43 tuition). itemized_max = tax_unit("ny_itemized_deductions_max", period) - college_tuition = tax_unit("ny_college_tuition_deduction", period) phase_out = tax_unit("ny_itemized_deductions_phase_out", period) - line_45 = max_(itemized_max - college_tuition - phase_out, 0) - return line_45 * p.rate * fraction + base = itemized_max - phase_out + return base * p.rate * fraction diff --git a/source_conflicts/candidates.yaml b/source_conflicts/candidates.yaml index e59be87270a..957ed658cc6 100644 --- a/source_conflicts/candidates.yaml +++ b/source_conflicts/candidates.yaml @@ -6742,6 +6742,49 @@ candidates: can be claimed, reading item C as marked for the whole return (ny_household_credit_potential.py, nyc_household_credit.py). An October 2026 ruling accepted the instructions; the statute-first rule requires a model change after resolving the statutory allocation.' +- id: us-ny:itemized-deduction-adjustment-college-tuition-base + program: income-tax + years: + from: 2018 + type: tax + question: Does the Tax Law 615(f) itemized deduction adjustment (IT-196 line 46) apply to a base that includes the + 615(d)(4) college tuition itemized deduction, as 615(a) defines the deduction, or to a base without it, as Form + IT-196 lays out lines 45 and 48 for Form IT-201 filers? + sources: + - kind: statute + citation: N.Y. Tax Law 615(a), (d)(4), (f)(1)-(2) and (g) + url: https://www.nysenate.gov/legislation/laws/TAX/615 + - kind: form + citation: Form IT-196 (2021), lines 40-49 + url: https://www.tax.ny.gov/pdf/2021/inc/it196_2021.pdf#page=3 + - kind: instructions + citation: Form IT-196-I (2021), lines 43, 46 and 48 and Worksheets 3 and 4 + url: https://www.tax.ny.gov/pdf/2021/inc/it196i_2021.pdf#page=20 + readings: + statute: 615(f) takes its percentage of "the New York itemized deduction otherwise allowable under subsection (a)", + and 615(a) defines that deduction "with the modifications specified in this section", which include the + 615(d)(4) college tuition deduction. The base includes tuition, as IT-196 line 45 does for Form IT-203 filers + (line 43). + other: For Form IT-201 filers, IT-196 adds the college tuition deduction on line 48, after the line 46 + adjustment, so the line 45 base leaves it out. + example: A 2021 joint return with NY AGI $360,200, $50,000 of mortgage interest, a $640.50 line 40 limitation and a + $10,000 college tuition deduction has a line 46 adjustment of 0.25 x 59,359.50 = 14,839.875 and a New York itemized + deduction of 44,519.625 under the statute, against 12,339.875 and 47,019.625 under the IT-201 form layout. + pe_us: + follows: statute + code: + - policyengine_us/variables/gov/states/ny/tax/income/taxable_income/deductions/itemized/reduction/based_on_charitable_deduction/incremental/ny_itemized_deductions_lower_incremental_reduction.py + - policyengine_us/variables/gov/states/ny/tax/income/taxable_income/deductions/itemized/reduction/based_on_charitable_deduction/incremental/ny_itemized_deductions_higher_incremental_reduction.py + - policyengine_us/variables/gov/states/ny/tax/income/taxable_income/deductions/itemized/ny_itemized_deductions.py + prs: + - https://github.com/PolicyEngine/policyengine-us/pull/10658 + state: unreviewed + note: The 615(f) base is ny_itemized_deductions_max (which includes ny_college_tuition_deduction) minus the line 40 + limitation, for every filer. Above NY AGI $1,000,000, ny_itemized_deductions returns only the 615(g) share of the + charitable deduction, so the college tuition deduction is not added back, which also follows the statute ("Notwithstanding + subsection (a)") over the IT-201 line 48 addition. The model has no IT-201/IT-203 split for this rule. The IT-196 + line 40-49 layout and the Worksheets 3 and 4 "25% (.25) of line 45" wording are the same on the 2018-2025 forms + and instructions checked: forms 2018-2021 and 2025, instructions 2018-2022, 2024 and 2025. - id: us-ny:real-property-credit-claimable-spouse program: income-tax years: From e219f7a6ebee0dd08fc53a029a59ce32415b12f7 Mon Sep 17 00:00:00 2001 From: PavelMakarchuk Date: Fri, 6 Nov 2026 12:30:36 -0500 Subject: [PATCH 3/4] Fix YAML syntax in the NY 615(f) source-conflict entry Co-Authored-By: Claude Opus 5.5 --- source_conflicts/candidates.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source_conflicts/candidates.yaml b/source_conflicts/candidates.yaml index 957ed658cc6..07fd4ca6763 100644 --- a/source_conflicts/candidates.yaml +++ b/source_conflicts/candidates.yaml @@ -6784,7 +6784,7 @@ candidates: charitable deduction, so the college tuition deduction is not added back, which also follows the statute ("Notwithstanding subsection (a)") over the IT-201 line 48 addition. The model has no IT-201/IT-203 split for this rule. The IT-196 line 40-49 layout and the Worksheets 3 and 4 "25% (.25) of line 45" wording are the same on the 2018-2025 forms - and instructions checked: forms 2018-2021 and 2025, instructions 2018-2022, 2024 and 2025. + and instructions checked (forms 2018-2021 and 2025; instructions 2018-2022, 2024 and 2025). - id: us-ny:real-property-credit-claimable-spouse program: income-tax years: From d7103c554dd8a578ebb69635933aea07487c0025 Mon Sep 17 00:00:00 2001 From: PavelMakarchuk Date: Mon, 9 Nov 2026 09:56:26 -0500 Subject: [PATCH 4/4] Keep the NY itemized amounts at a 0.01 margin in the integration tests Move the tax-before-credits assertions into their own cases, so that only they use the 0.5 margin for the supplemental tax rounding. Co-Authored-By: Claude Opus 5.5 --- ...ized_deductions_phase_out_integration.yaml | 83 +++++++++++++++++-- 1 file changed, 75 insertions(+), 8 deletions(-) diff --git a/policyengine_us/tests/policy/baseline/gov/states/ny/tax/income/taxable_income/deductions/itemized/ny_itemized_deductions_phase_out_integration.yaml b/policyengine_us/tests/policy/baseline/gov/states/ny/tax/income/taxable_income/deductions/itemized/ny_itemized_deductions_phase_out_integration.yaml index 4405c7b9a4d..10b3f0301ec 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/ny/tax/income/taxable_income/deductions/itemized/ny_itemized_deductions_phase_out_integration.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/ny/tax/income/taxable_income/deductions/itemized/ny_itemized_deductions_phase_out_integration.yaml @@ -82,7 +82,7 @@ - name: JOINT 2021 - the line 46 adjustment applies to line 45, after the line 40 limitation. period: 2021 - absolute_error_margin: 0.5 + absolute_error_margin: 0.01 input: people: head: @@ -121,14 +121,47 @@ # more than 323,200, so Tax computation worksheet 2 applies. NY AGI is # $211,550 or more, so the tax is line 3: 0.0633 * 323,180.375 = 20,457.32. ny_taxable_income: 323_180.375 - # The 0.5 margin covers only the supplemental tax: the model adds the - # rounded $1,056 recapture amount, so it returns about 0.22 more than the - # flat 6.33% of line 3. The itemized amounts above match to the cent. + +- name: JOINT 2021 - the line 46 adjustment applies to line 45, after the line 40 limitation, tax before credits. + period: 2021 + # The model adds the rounded $1,056 recapture amount, so it returns about + # 0.22 more than the flat 6.33% of line 3. + absolute_error_margin: 0.5 + input: + people: + head: + age: 40 + taxable_interest_income: 360_200 + deductible_mortgage_interest: 50_000 + spouse: + age: 40 + tax_units: + tax_unit: + members: [head, spouse] + state_sales_tax: 0 + local_sales_tax: 0 + marital_units: + marital_unit: + members: [head, spouse] + families: + family: + members: [head, spouse] + spm_units: + spm_unit: + members: [head, spouse] + households: + household: + members: [head, spouse] + state_code: NY + output: + # IT-201 (2021): taxable income 360,200 - 37,019.625 = 323,180.375 is not + # more than 323,200, so Tax computation worksheet 2 applies. NY AGI is + # $211,550 or more, so the tax is line 3: 0.0633 * 323,180.375 = 20,457.32. ny_income_tax_before_credits: 20_457.32 - name: JOINT 2021 - the line 46 adjustment base includes the college tuition deduction. period: 2021 - absolute_error_margin: 0.5 + absolute_error_margin: 0.01 input: people: head: @@ -172,7 +205,41 @@ # more than 323,200, so Tax computation worksheet 2 applies. NY AGI is # $211,550 or more, so the tax is line 3: 0.0633 * 315,680.375 = 19,982.57. ny_taxable_income: 315_680.375 - # The 0.5 margin covers only the supplemental tax: the model adds the - # rounded $1,056 recapture amount, so it returns about 0.22 more than the - # flat 6.33% of line 3. The itemized amounts above match to the cent. + +- name: JOINT 2021 - the line 46 adjustment base includes the college tuition deduction, tax before credits. + period: 2021 + # The model adds the rounded $1,056 recapture amount, so it returns about + # 0.22 more than the flat 6.33% of line 3. + absolute_error_margin: 0.5 + input: + people: + head: + age: 40 + taxable_interest_income: 360_200 + deductible_mortgage_interest: 50_000 + qualified_tuition_expenses: 10_000 + spouse: + age: 40 + tax_units: + tax_unit: + members: [head, spouse] + state_sales_tax: 0 + local_sales_tax: 0 + marital_units: + marital_unit: + members: [head, spouse] + families: + family: + members: [head, spouse] + spm_units: + spm_unit: + members: [head, spouse] + households: + household: + members: [head, spouse] + state_code: NY + output: + # IT-201 (2021): taxable income 360,200 - 44,519.625 = 315,680.375 is not + # more than 323,200, so Tax computation worksheet 2 applies. NY AGI is + # $211,550 or more, so the tax is line 3: 0.0633 * 315,680.375 = 19,982.57. ny_income_tax_before_credits: 19_982.57