From fb7827983a4a0e81c78f95792011ccc9ac8feb19 Mon Sep 17 00:00:00 2001 From: PavelMakarchuk Date: Thu, 9 Apr 2026 11:17:00 -0400 Subject: [PATCH 1/7] Add Idaho senior deduction conformity --- .../id-hb559-senior-deduction.fixed.md | 1 + .../tax/income/subtractions/subtractions.yaml | 3 ++ .../gov/states/id/tax/income/integration.yaml | 37 +++++++++++++++++++ .../id_additional_senior_deduction.yaml | 28 ++++++++++++++ .../id_additional_senior_deduction.py | 17 +++++++++ 5 files changed, 86 insertions(+) create mode 100644 changelog.d/id-hb559-senior-deduction.fixed.md create mode 100644 policyengine_us/tests/policy/baseline/gov/states/id/tax/income/subtractions/id_additional_senior_deduction.yaml create mode 100644 policyengine_us/variables/gov/states/id/tax/income/subtractions/id_additional_senior_deduction.py diff --git a/changelog.d/id-hb559-senior-deduction.fixed.md b/changelog.d/id-hb559-senior-deduction.fixed.md new file mode 100644 index 00000000000..163623703e3 --- /dev/null +++ b/changelog.d/id-hb559-senior-deduction.fixed.md @@ -0,0 +1 @@ +Added Idaho conformity to the federal enhanced senior deduction by subtracting the federal additional senior deduction from Idaho income starting in 2025. diff --git a/policyengine_us/parameters/gov/states/id/tax/income/subtractions/subtractions.yaml b/policyengine_us/parameters/gov/states/id/tax/income/subtractions/subtractions.yaml index b10946218af..9dda4918ef0 100644 --- a/policyengine_us/parameters/gov/states/id/tax/income/subtractions/subtractions.yaml +++ b/policyengine_us/parameters/gov/states/id/tax/income/subtractions/subtractions.yaml @@ -15,6 +15,7 @@ values: - us_govt_interest # (3)(a) - military_service_income # (4) - taxable_social_security # (5) + - id_additional_senior_deduction # per HB 559 / OBBBA conformity - id_household_and_dependent_care_expense_deduction # (6) - id_aged_or_disabled_deduction # (8) - id_capital_gains_deduction # (10) @@ -34,5 +35,7 @@ metadata: href: https://tax.idaho.gov/wp-content/uploads/forms/EIN00046/EIN00046_11-15-2021.pdf#page=30 - title: Idaho Individual Income Tax Instructions Packet 2025 href: https://tax.idaho.gov/wp-content/uploads/forms/EIN00046/EIN00046_09-29-2025.pdf#page=32 + - title: Idaho taxpayers can now file 2025 returns to claim new conformity deductions + href: https://tax.idaho.gov/pressrelease/update-on-filing-2025-idaho-income-taxes-now-that-conformity-is-law/ - title: Section 35.01.01.254 - (5) / (3) (a) href: https://regulations.justia.com/states/idaho/35/35-01-01/section-35-01-01-254/ diff --git a/policyengine_us/tests/policy/baseline/gov/states/id/tax/income/integration.yaml b/policyengine_us/tests/policy/baseline/gov/states/id/tax/income/integration.yaml index 775a31e31f8..5dc7fe92a8f 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/id/tax/income/integration.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/id/tax/income/integration.yaml @@ -228,3 +228,40 @@ output: # Grocery credit: 2 people * $155 = $310 (aged credit not in effect for 2025) id_grocery_credit: 310 + +- name: Idaho joint senior filers receive the OBBBA enhanced senior deduction in 2025 + absolute_error_margin: 0.01 + period: 2025 + input: + people: + person1: + age: 70 + taxable_interest_income: 100_000 + is_tax_unit_head: true + is_tax_unit_head_or_spouse: true + ssn_card_type: CITIZEN + person2: + age: 70 + taxable_interest_income: 100_000 + is_tax_unit_spouse: true + is_tax_unit_head_or_spouse: true + ssn_card_type: CITIZEN + tax_units: + tax_unit: + members: [person1, person2] + filing_status: JOINT + itemized_taxable_income_deductions: 60_000 + id_salt_deduction: 0 + spm_units: + spm_unit: + members: [person1, person2] + snap: 0 + tanf: 0 + households: + household: + members: [person1, person2] + state_fips: 16 + output: + additional_senior_deduction: 9_000 + id_additional_senior_deduction: 9_000 + id_taxable_income: 131_000 diff --git a/policyengine_us/tests/policy/baseline/gov/states/id/tax/income/subtractions/id_additional_senior_deduction.yaml b/policyengine_us/tests/policy/baseline/gov/states/id/tax/income/subtractions/id_additional_senior_deduction.yaml new file mode 100644 index 00000000000..aaea6384373 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/id/tax/income/subtractions/id_additional_senior_deduction.yaml @@ -0,0 +1,28 @@ +- name: Idaho conforms to the federal additional senior deduction in 2025. + period: 2025 + input: + people: + person1: + age: 70 + is_tax_unit_head: true + is_tax_unit_head_or_spouse: true + ssn_card_type: CITIZEN + person2: + age: 70 + is_tax_unit_spouse: true + is_tax_unit_head_or_spouse: true + ssn_card_type: CITIZEN + tax_units: + tax_unit: + members: [person1, person2] + filing_status: JOINT + adjusted_gross_income: 200_000 + salt_deduction: 0 + standard_deduction: 0 + households: + household: + members: [person1, person2] + state_code: ID + output: + additional_senior_deduction: 9_000 + id_additional_senior_deduction: 9_000 diff --git a/policyengine_us/variables/gov/states/id/tax/income/subtractions/id_additional_senior_deduction.py b/policyengine_us/variables/gov/states/id/tax/income/subtractions/id_additional_senior_deduction.py new file mode 100644 index 00000000000..bbbfb2a5572 --- /dev/null +++ b/policyengine_us/variables/gov/states/id/tax/income/subtractions/id_additional_senior_deduction.py @@ -0,0 +1,17 @@ +from policyengine_us.model_api import * + + +class id_additional_senior_deduction(Variable): + value_type = float + entity = TaxUnit + label = "Idaho additional senior deduction" + unit = USD + definition_period = YEAR + defined_for = StateCode.ID + reference = ( + "https://legislature.idaho.gov/sessioninfo/2026/legislation/H0559/", + "https://tax.idaho.gov/pressrelease/update-on-filing-2025-idaho-income-taxes-now-that-conformity-is-law/", + ) + + def formula(tax_unit, period, parameters): + return tax_unit("additional_senior_deduction", period) From 56857be458ff64d7d49fbf759b2775baf0cb7e99 Mon Sep 17 00:00:00 2001 From: PavelMakarchuk Date: Fri, 10 Apr 2026 10:07:47 -0400 Subject: [PATCH 2/7] Move Idaho senior deduction to line 18 path --- .../id-hb559-senior-deduction.fixed.md | 2 +- .../tax/income/subtractions/subtractions.yaml | 3 --- .../id_additional_senior_deduction.yaml | 0 .../deductions/id_line_18_deductions.yaml | 8 ++++++++ .../id/tax/income/id_taxable_income.yaml | 16 +++++++++++++--- .../gov/states/id/tax/income/integration.yaml | 1 + .../id_additional_senior_deduction.py | 0 .../id/tax/income/deductions/id_deductions.py | 2 +- .../deductions/id_line_18_deductions.py | 19 +++++++++++++++++++ .../states/id/tax/income/id_taxable_income.py | 6 +++--- 10 files changed, 46 insertions(+), 11 deletions(-) rename policyengine_us/tests/policy/baseline/gov/states/id/tax/income/{subtractions => deductions}/id_additional_senior_deduction.yaml (100%) create mode 100644 policyengine_us/tests/policy/baseline/gov/states/id/tax/income/deductions/id_line_18_deductions.yaml rename policyengine_us/variables/gov/states/id/tax/income/{subtractions => deductions}/id_additional_senior_deduction.py (100%) create mode 100644 policyengine_us/variables/gov/states/id/tax/income/deductions/id_line_18_deductions.py diff --git a/changelog.d/id-hb559-senior-deduction.fixed.md b/changelog.d/id-hb559-senior-deduction.fixed.md index 163623703e3..d6dcacb37f8 100644 --- a/changelog.d/id-hb559-senior-deduction.fixed.md +++ b/changelog.d/id-hb559-senior-deduction.fixed.md @@ -1 +1 @@ -Added Idaho conformity to the federal enhanced senior deduction by subtracting the federal additional senior deduction from Idaho income starting in 2025. +Added Idaho conformity to the federal enhanced senior deduction on the Idaho Form 40 line 18 deduction path starting in 2025. diff --git a/policyengine_us/parameters/gov/states/id/tax/income/subtractions/subtractions.yaml b/policyengine_us/parameters/gov/states/id/tax/income/subtractions/subtractions.yaml index 9dda4918ef0..b10946218af 100644 --- a/policyengine_us/parameters/gov/states/id/tax/income/subtractions/subtractions.yaml +++ b/policyengine_us/parameters/gov/states/id/tax/income/subtractions/subtractions.yaml @@ -15,7 +15,6 @@ values: - us_govt_interest # (3)(a) - military_service_income # (4) - taxable_social_security # (5) - - id_additional_senior_deduction # per HB 559 / OBBBA conformity - id_household_and_dependent_care_expense_deduction # (6) - id_aged_or_disabled_deduction # (8) - id_capital_gains_deduction # (10) @@ -35,7 +34,5 @@ metadata: href: https://tax.idaho.gov/wp-content/uploads/forms/EIN00046/EIN00046_11-15-2021.pdf#page=30 - title: Idaho Individual Income Tax Instructions Packet 2025 href: https://tax.idaho.gov/wp-content/uploads/forms/EIN00046/EIN00046_09-29-2025.pdf#page=32 - - title: Idaho taxpayers can now file 2025 returns to claim new conformity deductions - href: https://tax.idaho.gov/pressrelease/update-on-filing-2025-idaho-income-taxes-now-that-conformity-is-law/ - title: Section 35.01.01.254 - (5) / (3) (a) href: https://regulations.justia.com/states/idaho/35/35-01-01/section-35-01-01-254/ diff --git a/policyengine_us/tests/policy/baseline/gov/states/id/tax/income/subtractions/id_additional_senior_deduction.yaml b/policyengine_us/tests/policy/baseline/gov/states/id/tax/income/deductions/id_additional_senior_deduction.yaml similarity index 100% rename from policyengine_us/tests/policy/baseline/gov/states/id/tax/income/subtractions/id_additional_senior_deduction.yaml rename to policyengine_us/tests/policy/baseline/gov/states/id/tax/income/deductions/id_additional_senior_deduction.yaml diff --git a/policyengine_us/tests/policy/baseline/gov/states/id/tax/income/deductions/id_line_18_deductions.yaml b/policyengine_us/tests/policy/baseline/gov/states/id/tax/income/deductions/id_line_18_deductions.yaml new file mode 100644 index 00000000000..d0c3558ab88 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/id/tax/income/deductions/id_line_18_deductions.yaml @@ -0,0 +1,8 @@ +- name: Idaho line 18 includes QBID and federal Schedule 1-A deductions + period: 2025 + input: + qualified_business_income_deduction: 2_000 + id_additional_senior_deduction: 9_000 + state_code: ID + output: + id_line_18_deductions: 11_000 diff --git a/policyengine_us/tests/policy/baseline/gov/states/id/tax/income/id_taxable_income.yaml b/policyengine_us/tests/policy/baseline/gov/states/id/tax/income/id_taxable_income.yaml index 80309f2e9dd..c11bc036cd7 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/id/tax/income/id_taxable_income.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/id/tax/income/id_taxable_income.yaml @@ -12,17 +12,27 @@ input: id_agi: 500 id_deductions: 1_000 - qualified_business_income_deduction: 200 + id_line_18_deductions: 200 state_code: ID output: id_taxable_income: 0 -- name: AGI after deductions is reduced by QBID +- name: AGI after deductions is reduced by Idaho line 18 deductions period: 2021 input: id_agi: 1_000 id_deductions: 500 - qualified_business_income_deduction: 300 + id_line_18_deductions: 300 state_code: ID output: id_taxable_income: 200 + +- name: Idaho line 18 deductions include the federal senior deduction in 2025 + period: 2025 + input: + id_agi: 200_000 + id_deductions: 60_000 + id_line_18_deductions: 9_000 + state_code: ID + output: + id_taxable_income: 131_000 diff --git a/policyengine_us/tests/policy/baseline/gov/states/id/tax/income/integration.yaml b/policyengine_us/tests/policy/baseline/gov/states/id/tax/income/integration.yaml index 5dc7fe92a8f..6a92a4af795 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/id/tax/income/integration.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/id/tax/income/integration.yaml @@ -264,4 +264,5 @@ output: additional_senior_deduction: 9_000 id_additional_senior_deduction: 9_000 + id_line_18_deductions: 9_000 id_taxable_income: 131_000 diff --git a/policyengine_us/variables/gov/states/id/tax/income/subtractions/id_additional_senior_deduction.py b/policyengine_us/variables/gov/states/id/tax/income/deductions/id_additional_senior_deduction.py similarity index 100% rename from policyengine_us/variables/gov/states/id/tax/income/subtractions/id_additional_senior_deduction.py rename to policyengine_us/variables/gov/states/id/tax/income/deductions/id_additional_senior_deduction.py diff --git a/policyengine_us/variables/gov/states/id/tax/income/deductions/id_deductions.py b/policyengine_us/variables/gov/states/id/tax/income/deductions/id_deductions.py index 4d1b6f308c3..460511569ae 100644 --- a/policyengine_us/variables/gov/states/id/tax/income/deductions/id_deductions.py +++ b/policyengine_us/variables/gov/states/id/tax/income/deductions/id_deductions.py @@ -16,5 +16,5 @@ class id_deductions(Variable): def formula(tax_unit, period, parameters): itm_ded = tax_unit("id_itemized_deductions", period) std_ded = tax_unit("standard_deduction", period) - # We do not model qualified business income deduction for Idaho + # Idaho Form 40 line 18 deductions are modeled separately. return max_(itm_ded, std_ded) diff --git a/policyengine_us/variables/gov/states/id/tax/income/deductions/id_line_18_deductions.py b/policyengine_us/variables/gov/states/id/tax/income/deductions/id_line_18_deductions.py new file mode 100644 index 00000000000..1bec19e5e87 --- /dev/null +++ b/policyengine_us/variables/gov/states/id/tax/income/deductions/id_line_18_deductions.py @@ -0,0 +1,19 @@ +from policyengine_us.model_api import * + + +class id_line_18_deductions(Variable): + value_type = float + entity = TaxUnit + label = "Idaho Form 40 line 18 deductions" + unit = USD + definition_period = YEAR + defined_for = StateCode.ID + reference = ( + "https://tax.idaho.gov/wp-content/uploads/forms/EIN00046/EIN00046_03-02-2026.pdf", + "https://tax.idaho.gov/pressrelease/update-on-filing-2025-idaho-income-taxes-now-that-conformity-is-law/", + ) + + adds = [ + "qualified_business_income_deduction", + "id_additional_senior_deduction", + ] diff --git a/policyengine_us/variables/gov/states/id/tax/income/id_taxable_income.py b/policyengine_us/variables/gov/states/id/tax/income/id_taxable_income.py index fe4e3b7e173..b9a30edd777 100644 --- a/policyengine_us/variables/gov/states/id/tax/income/id_taxable_income.py +++ b/policyengine_us/variables/gov/states/id/tax/income/id_taxable_income.py @@ -8,11 +8,11 @@ class id_taxable_income(Variable): unit = USD documentation = "Idaho taxable income" definition_period = YEAR - reference = "https://tax.idaho.gov/wp-content/uploads/forms/EFO00089/EFO00089_12-30-2022.pdf#page=1" + reference = "https://tax.idaho.gov/wp-content/uploads/forms/EIN00046/EIN00046_03-02-2026.pdf" defined_for = StateCode.ID def formula(tax_unit, period, parameters): agi = tax_unit("id_agi", period) deductions = tax_unit("id_deductions", period) - qbid = tax_unit("qualified_business_income_deduction", period) - return max_(0, agi - deductions - qbid) + line_18_deductions = tax_unit("id_line_18_deductions", period) + return max_(0, agi - deductions - line_18_deductions) From b2fae500a8835334dc0c11b00d6bfb13a4921602 Mon Sep 17 00:00:00 2001 From: PavelMakarchuk Date: Fri, 10 Apr 2026 10:28:30 -0400 Subject: [PATCH 3/7] Use official wording for Idaho conformity deduction --- changelog.d/id-hb559-senior-deduction.fixed.md | 2 +- .../tax/income/deductions/id_line_18_deductions.yaml | 8 -------- ...ness_income_and_federal_schedule_1a_deductions.yaml | 8 ++++++++ .../gov/states/id/tax/income/id_taxable_income.yaml | 10 +++++----- .../baseline/gov/states/id/tax/income/integration.yaml | 2 +- .../states/id/tax/income/deductions/id_deductions.py | 3 ++- ...iness_income_and_federal_schedule_1a_deductions.py} | 4 ++-- .../gov/states/id/tax/income/id_taxable_income.py | 7 +++++-- 8 files changed, 24 insertions(+), 20 deletions(-) delete mode 100644 policyengine_us/tests/policy/baseline/gov/states/id/tax/income/deductions/id_line_18_deductions.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/id/tax/income/deductions/id_qualified_business_income_and_federal_schedule_1a_deductions.yaml rename policyengine_us/variables/gov/states/id/tax/income/deductions/{id_line_18_deductions.py => id_qualified_business_income_and_federal_schedule_1a_deductions.py} (75%) diff --git a/changelog.d/id-hb559-senior-deduction.fixed.md b/changelog.d/id-hb559-senior-deduction.fixed.md index d6dcacb37f8..6a0fae51447 100644 --- a/changelog.d/id-hb559-senior-deduction.fixed.md +++ b/changelog.d/id-hb559-senior-deduction.fixed.md @@ -1 +1 @@ -Added Idaho conformity to the federal enhanced senior deduction on the Idaho Form 40 line 18 deduction path starting in 2025. +Added Idaho conformity to the federal enhanced senior deduction through Idaho's qualified business income and federal Schedule 1-A deduction path starting in 2025. diff --git a/policyengine_us/tests/policy/baseline/gov/states/id/tax/income/deductions/id_line_18_deductions.yaml b/policyengine_us/tests/policy/baseline/gov/states/id/tax/income/deductions/id_line_18_deductions.yaml deleted file mode 100644 index d0c3558ab88..00000000000 --- a/policyengine_us/tests/policy/baseline/gov/states/id/tax/income/deductions/id_line_18_deductions.yaml +++ /dev/null @@ -1,8 +0,0 @@ -- name: Idaho line 18 includes QBID and federal Schedule 1-A deductions - period: 2025 - input: - qualified_business_income_deduction: 2_000 - id_additional_senior_deduction: 9_000 - state_code: ID - output: - id_line_18_deductions: 11_000 diff --git a/policyengine_us/tests/policy/baseline/gov/states/id/tax/income/deductions/id_qualified_business_income_and_federal_schedule_1a_deductions.yaml b/policyengine_us/tests/policy/baseline/gov/states/id/tax/income/deductions/id_qualified_business_income_and_federal_schedule_1a_deductions.yaml new file mode 100644 index 00000000000..e6f30277308 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/id/tax/income/deductions/id_qualified_business_income_and_federal_schedule_1a_deductions.yaml @@ -0,0 +1,8 @@ +- name: Idaho qualified business income and federal Schedule 1-A deductions include the senior deduction + period: 2025 + input: + qualified_business_income_deduction: 2_000 + id_additional_senior_deduction: 9_000 + state_code: ID + output: + id_qualified_business_income_and_federal_schedule_1a_deductions: 11_000 diff --git a/policyengine_us/tests/policy/baseline/gov/states/id/tax/income/id_taxable_income.yaml b/policyengine_us/tests/policy/baseline/gov/states/id/tax/income/id_taxable_income.yaml index c11bc036cd7..882cb6a78d3 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/id/tax/income/id_taxable_income.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/id/tax/income/id_taxable_income.yaml @@ -12,27 +12,27 @@ input: id_agi: 500 id_deductions: 1_000 - id_line_18_deductions: 200 + id_qualified_business_income_and_federal_schedule_1a_deductions: 200 state_code: ID output: id_taxable_income: 0 -- name: AGI after deductions is reduced by Idaho line 18 deductions +- name: AGI after deductions is reduced by Idaho conformity deductions period: 2021 input: id_agi: 1_000 id_deductions: 500 - id_line_18_deductions: 300 + id_qualified_business_income_and_federal_schedule_1a_deductions: 300 state_code: ID output: id_taxable_income: 200 -- name: Idaho line 18 deductions include the federal senior deduction in 2025 +- name: Idaho conformity deductions include the federal senior deduction in 2025 period: 2025 input: id_agi: 200_000 id_deductions: 60_000 - id_line_18_deductions: 9_000 + id_qualified_business_income_and_federal_schedule_1a_deductions: 9_000 state_code: ID output: id_taxable_income: 131_000 diff --git a/policyengine_us/tests/policy/baseline/gov/states/id/tax/income/integration.yaml b/policyengine_us/tests/policy/baseline/gov/states/id/tax/income/integration.yaml index 6a92a4af795..12b4399c2fd 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/id/tax/income/integration.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/id/tax/income/integration.yaml @@ -264,5 +264,5 @@ output: additional_senior_deduction: 9_000 id_additional_senior_deduction: 9_000 - id_line_18_deductions: 9_000 + id_qualified_business_income_and_federal_schedule_1a_deductions: 9_000 id_taxable_income: 131_000 diff --git a/policyengine_us/variables/gov/states/id/tax/income/deductions/id_deductions.py b/policyengine_us/variables/gov/states/id/tax/income/deductions/id_deductions.py index 460511569ae..d10534624fe 100644 --- a/policyengine_us/variables/gov/states/id/tax/income/deductions/id_deductions.py +++ b/policyengine_us/variables/gov/states/id/tax/income/deductions/id_deductions.py @@ -16,5 +16,6 @@ class id_deductions(Variable): def formula(tax_unit, period, parameters): itm_ded = tax_unit("id_itemized_deductions", period) std_ded = tax_unit("standard_deduction", period) - # Idaho Form 40 line 18 deductions are modeled separately. + # Idaho qualified business income and federal Schedule 1-A deductions + # are modeled separately. return max_(itm_ded, std_ded) diff --git a/policyengine_us/variables/gov/states/id/tax/income/deductions/id_line_18_deductions.py b/policyengine_us/variables/gov/states/id/tax/income/deductions/id_qualified_business_income_and_federal_schedule_1a_deductions.py similarity index 75% rename from policyengine_us/variables/gov/states/id/tax/income/deductions/id_line_18_deductions.py rename to policyengine_us/variables/gov/states/id/tax/income/deductions/id_qualified_business_income_and_federal_schedule_1a_deductions.py index 1bec19e5e87..f3970a2c198 100644 --- a/policyengine_us/variables/gov/states/id/tax/income/deductions/id_line_18_deductions.py +++ b/policyengine_us/variables/gov/states/id/tax/income/deductions/id_qualified_business_income_and_federal_schedule_1a_deductions.py @@ -1,10 +1,10 @@ from policyengine_us.model_api import * -class id_line_18_deductions(Variable): +class id_qualified_business_income_and_federal_schedule_1a_deductions(Variable): value_type = float entity = TaxUnit - label = "Idaho Form 40 line 18 deductions" + label = "Idaho qualified business income and federal Schedule 1-A deductions" unit = USD definition_period = YEAR defined_for = StateCode.ID diff --git a/policyengine_us/variables/gov/states/id/tax/income/id_taxable_income.py b/policyengine_us/variables/gov/states/id/tax/income/id_taxable_income.py index b9a30edd777..a6b13b275d7 100644 --- a/policyengine_us/variables/gov/states/id/tax/income/id_taxable_income.py +++ b/policyengine_us/variables/gov/states/id/tax/income/id_taxable_income.py @@ -14,5 +14,8 @@ class id_taxable_income(Variable): def formula(tax_unit, period, parameters): agi = tax_unit("id_agi", period) deductions = tax_unit("id_deductions", period) - line_18_deductions = tax_unit("id_line_18_deductions", period) - return max_(0, agi - deductions - line_18_deductions) + conformity_deductions = tax_unit( + "id_qualified_business_income_and_federal_schedule_1a_deductions", + period, + ) + return max_(0, agi - deductions - conformity_deductions) From a233af22bdec583e81a2baf963b7a5b56dbba0ba Mon Sep 17 00:00:00 2001 From: PavelMakarchuk Date: Mon, 20 Apr 2026 00:00:31 -0400 Subject: [PATCH 4/7] Add pre-2025 zero values to federal senior deduction parameters The senior deduction was introduced in 2025 by H.R.1 but the parameters only had values from 2025-01-01, causing microsim crashes when running for 2024. Add 2018-01-01 entries with 0 so the parameter tree is valid for all years. Co-Authored-By: Claude Opus 4.6 --- .../gov/irs/deductions/senior_deduction/amount.yaml | 1 + .../deductions/senior_deduction/phase_out_rate/joint.yaml | 6 ++++-- .../deductions/senior_deduction/phase_out_rate/other.yaml | 6 ++++-- 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/policyengine_us/parameters/gov/irs/deductions/senior_deduction/amount.yaml b/policyengine_us/parameters/gov/irs/deductions/senior_deduction/amount.yaml index 6df7370181a..54f82f86dd1 100644 --- a/policyengine_us/parameters/gov/irs/deductions/senior_deduction/amount.yaml +++ b/policyengine_us/parameters/gov/irs/deductions/senior_deduction/amount.yaml @@ -1,6 +1,7 @@ description: The IRS provides a deduction for seniors of this amount. values: + 2018-01-01: 0 2025-01-01: 6_000 metadata: diff --git a/policyengine_us/parameters/gov/irs/deductions/senior_deduction/phase_out_rate/joint.yaml b/policyengine_us/parameters/gov/irs/deductions/senior_deduction/phase_out_rate/joint.yaml index ee3af732f69..443ae86f8d3 100644 --- a/policyengine_us/parameters/gov/irs/deductions/senior_deduction/phase_out_rate/joint.yaml +++ b/policyengine_us/parameters/gov/irs/deductions/senior_deduction/phase_out_rate/joint.yaml @@ -11,10 +11,12 @@ metadata: brackets: - threshold: - 2025-01-01: 0 + 2018-01-01: 0 rate: - 2025-01-01: 0 + 2018-01-01: 0 - threshold: + 2018-01-01: 150_000 2025-01-01: 150_000 rate: + 2018-01-01: 0 2025-01-01: 0.06 diff --git a/policyengine_us/parameters/gov/irs/deductions/senior_deduction/phase_out_rate/other.yaml b/policyengine_us/parameters/gov/irs/deductions/senior_deduction/phase_out_rate/other.yaml index f254d8e63c4..1a4a410ac4a 100644 --- a/policyengine_us/parameters/gov/irs/deductions/senior_deduction/phase_out_rate/other.yaml +++ b/policyengine_us/parameters/gov/irs/deductions/senior_deduction/phase_out_rate/other.yaml @@ -11,10 +11,12 @@ metadata: brackets: - threshold: - 2025-01-01: 0 + 2018-01-01: 0 rate: - 2025-01-01: 0 + 2018-01-01: 0 - threshold: + 2018-01-01: 75_000 2025-01-01: 75_000 rate: + 2018-01-01: 0 2025-01-01: 0.06 From 1286ce964ae7fd2cb1c9ea68e94b8b25d743ccba Mon Sep 17 00:00:00 2001 From: PavelMakarchuk Date: Mon, 20 Apr 2026 00:26:28 -0400 Subject: [PATCH 5/7] Fix review findings for Idaho senior deduction conformity - Add missing Schedule 1-A deductions (tip, overtime, car loan interest) to id_qualified_business_income_and_federal_schedule_1a_deductions - Add #page= anchors to PDF references - Add permanent statute reference (IC 63-3004) to id_additional_senior_deduction - Remove redundant documentation field from id_taxable_income - Rename changelog from .fixed to .added (new functionality) - Add test cases: pre-2025 zero, single filer phase-out, age boundary (64 vs 65), and full phase-out elimination Co-Authored-By: Claude Opus 4.6 --- ....md => id-hb559-senior-deduction.added.md} | 0 .../id_additional_senior_deduction.yaml | 114 ++++++++++++++++++ .../id_additional_senior_deduction.py | 1 + ...come_and_federal_schedule_1a_deductions.py | 5 +- .../states/id/tax/income/id_taxable_income.py | 3 +- 5 files changed, 120 insertions(+), 3 deletions(-) rename changelog.d/{id-hb559-senior-deduction.fixed.md => id-hb559-senior-deduction.added.md} (100%) diff --git a/changelog.d/id-hb559-senior-deduction.fixed.md b/changelog.d/id-hb559-senior-deduction.added.md similarity index 100% rename from changelog.d/id-hb559-senior-deduction.fixed.md rename to changelog.d/id-hb559-senior-deduction.added.md diff --git a/policyengine_us/tests/policy/baseline/gov/states/id/tax/income/deductions/id_additional_senior_deduction.yaml b/policyengine_us/tests/policy/baseline/gov/states/id/tax/income/deductions/id_additional_senior_deduction.yaml index aaea6384373..b65d022bae4 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/id/tax/income/deductions/id_additional_senior_deduction.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/id/tax/income/deductions/id_additional_senior_deduction.yaml @@ -26,3 +26,117 @@ output: additional_senior_deduction: 9_000 id_additional_senior_deduction: 9_000 + +- name: Idaho senior deduction is zero before 2025. + period: 2024 + input: + people: + person1: + age: 70 + is_tax_unit_head: true + is_tax_unit_head_or_spouse: true + ssn_card_type: CITIZEN + tax_units: + tax_unit: + members: [person1] + filing_status: SINGLE + adjusted_gross_income: 50_000 + households: + household: + members: [person1] + state_code: ID + output: + id_additional_senior_deduction: 0 + +- name: Single filer senior deduction with non-joint phase-out + period: 2025 + input: + people: + person1: + age: 70 + is_tax_unit_head: true + is_tax_unit_head_or_spouse: true + ssn_card_type: CITIZEN + tax_units: + tax_unit: + members: [person1] + filing_status: SINGLE + adjusted_gross_income: 100_000 + salt_deduction: 0 + standard_deduction: 0 + households: + household: + members: [person1] + state_code: ID + output: + # $6,000 base - 6% * ($100,000 - $75,000) = $6,000 - $1,500 = $4,500 + id_additional_senior_deduction: 4_500 + +- name: Age 64 does not qualify for senior deduction + period: 2025 + input: + people: + person1: + age: 64 + is_tax_unit_head: true + is_tax_unit_head_or_spouse: true + ssn_card_type: CITIZEN + tax_units: + tax_unit: + members: [person1] + filing_status: SINGLE + adjusted_gross_income: 50_000 + households: + household: + members: [person1] + state_code: ID + output: + id_additional_senior_deduction: 0 + +- name: Age 65 qualifies for senior deduction + period: 2025 + input: + people: + person1: + age: 65 + is_tax_unit_head: true + is_tax_unit_head_or_spouse: true + ssn_card_type: CITIZEN + tax_units: + tax_unit: + members: [person1] + filing_status: SINGLE + adjusted_gross_income: 50_000 + salt_deduction: 0 + standard_deduction: 0 + households: + household: + members: [person1] + state_code: ID + output: + # Below $75k threshold, no phase-out + id_additional_senior_deduction: 6_000 + +- name: Phase-out fully eliminates senior deduction + period: 2025 + input: + people: + person1: + age: 70 + is_tax_unit_head: true + is_tax_unit_head_or_spouse: true + ssn_card_type: CITIZEN + tax_units: + tax_unit: + members: [person1] + filing_status: SINGLE + adjusted_gross_income: 200_000 + salt_deduction: 0 + standard_deduction: 0 + households: + household: + members: [person1] + state_code: ID + output: + # 6% * ($200,000 - $75,000) = $7,500 > $6,000, so capped at 0 + id_additional_senior_deduction: 0 diff --git a/policyengine_us/variables/gov/states/id/tax/income/deductions/id_additional_senior_deduction.py b/policyengine_us/variables/gov/states/id/tax/income/deductions/id_additional_senior_deduction.py index bbbfb2a5572..227fe24e5dd 100644 --- a/policyengine_us/variables/gov/states/id/tax/income/deductions/id_additional_senior_deduction.py +++ b/policyengine_us/variables/gov/states/id/tax/income/deductions/id_additional_senior_deduction.py @@ -9,6 +9,7 @@ class id_additional_senior_deduction(Variable): definition_period = YEAR defined_for = StateCode.ID reference = ( + "https://legislature.idaho.gov/statutesrules/idstat/Title63/T63CH30/SECT63-3004/", "https://legislature.idaho.gov/sessioninfo/2026/legislation/H0559/", "https://tax.idaho.gov/pressrelease/update-on-filing-2025-idaho-income-taxes-now-that-conformity-is-law/", ) diff --git a/policyengine_us/variables/gov/states/id/tax/income/deductions/id_qualified_business_income_and_federal_schedule_1a_deductions.py b/policyengine_us/variables/gov/states/id/tax/income/deductions/id_qualified_business_income_and_federal_schedule_1a_deductions.py index f3970a2c198..4d24963a410 100644 --- a/policyengine_us/variables/gov/states/id/tax/income/deductions/id_qualified_business_income_and_federal_schedule_1a_deductions.py +++ b/policyengine_us/variables/gov/states/id/tax/income/deductions/id_qualified_business_income_and_federal_schedule_1a_deductions.py @@ -9,11 +9,14 @@ class id_qualified_business_income_and_federal_schedule_1a_deductions(Variable): definition_period = YEAR defined_for = StateCode.ID reference = ( - "https://tax.idaho.gov/wp-content/uploads/forms/EIN00046/EIN00046_03-02-2026.pdf", + "https://tax.idaho.gov/wp-content/uploads/forms/EIN00046/EIN00046_03-02-2026.pdf#page=11", "https://tax.idaho.gov/pressrelease/update-on-filing-2025-idaho-income-taxes-now-that-conformity-is-law/", ) adds = [ "qualified_business_income_deduction", "id_additional_senior_deduction", + "tip_income_deduction", + "overtime_income_deduction", + "auto_loan_interest_deduction", ] diff --git a/policyengine_us/variables/gov/states/id/tax/income/id_taxable_income.py b/policyengine_us/variables/gov/states/id/tax/income/id_taxable_income.py index a6b13b275d7..7674bd07552 100644 --- a/policyengine_us/variables/gov/states/id/tax/income/id_taxable_income.py +++ b/policyengine_us/variables/gov/states/id/tax/income/id_taxable_income.py @@ -6,9 +6,8 @@ class id_taxable_income(Variable): entity = TaxUnit label = "Idaho taxable income" unit = USD - documentation = "Idaho taxable income" definition_period = YEAR - reference = "https://tax.idaho.gov/wp-content/uploads/forms/EIN00046/EIN00046_03-02-2026.pdf" + reference = "https://tax.idaho.gov/wp-content/uploads/forms/EIN00046/EIN00046_03-02-2026.pdf#page=30" defined_for = StateCode.ID def formula(tax_unit, period, parameters): From 8408075c9e76f8ae6c38db04e7a1495e4b739ae5 Mon Sep 17 00:00:00 2001 From: PavelMakarchuk Date: Tue, 21 Apr 2026 18:42:22 -0400 Subject: [PATCH 6/7] Update ID senior deduction tests for per-senior phase-out MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Main's federal additional_senior_deduction now applies the Schedule 1-A phase-out per eligible senior before summing (commit f6fafc5afb). For joint filers with both age 70 and AGI $200k, the correct value is $6,000 (2 × max($6k − $3k, 0)), not $9,000 as this branch originally expected. Updates three tests to match the corrected federal formula: - id_additional_senior_deduction.yaml joint case - id_taxable_income.yaml conformity scalar input - integration.yaml joint senior integration Co-Authored-By: Claude Opus 4.7 (1M context) --- .../income/deductions/id_additional_senior_deduction.yaml | 7 +++++-- .../gov/states/id/tax/income/id_taxable_income.yaml | 4 ++-- .../baseline/gov/states/id/tax/income/integration.yaml | 8 ++++---- 3 files changed, 11 insertions(+), 8 deletions(-) diff --git a/policyengine_us/tests/policy/baseline/gov/states/id/tax/income/deductions/id_additional_senior_deduction.yaml b/policyengine_us/tests/policy/baseline/gov/states/id/tax/income/deductions/id_additional_senior_deduction.yaml index b65d022bae4..0a85525c64d 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/id/tax/income/deductions/id_additional_senior_deduction.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/id/tax/income/deductions/id_additional_senior_deduction.yaml @@ -24,8 +24,11 @@ members: [person1, person2] state_code: ID output: - additional_senior_deduction: 9_000 - id_additional_senior_deduction: 9_000 + # Joint, both age 70, AGI $200k: per-senior allowed is + # max($6,000 - 6% * ($200,000 - $150,000), 0) = $3,000, + # times 2 eligible seniors = $6,000 (Schedule 1-A per-senior phase-out). + additional_senior_deduction: 6_000 + id_additional_senior_deduction: 6_000 - name: Idaho senior deduction is zero before 2025. period: 2024 diff --git a/policyengine_us/tests/policy/baseline/gov/states/id/tax/income/id_taxable_income.yaml b/policyengine_us/tests/policy/baseline/gov/states/id/tax/income/id_taxable_income.yaml index 882cb6a78d3..5589eb3bc4f 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/id/tax/income/id_taxable_income.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/id/tax/income/id_taxable_income.yaml @@ -32,7 +32,7 @@ input: id_agi: 200_000 id_deductions: 60_000 - id_qualified_business_income_and_federal_schedule_1a_deductions: 9_000 + id_qualified_business_income_and_federal_schedule_1a_deductions: 6_000 state_code: ID output: - id_taxable_income: 131_000 + id_taxable_income: 134_000 diff --git a/policyengine_us/tests/policy/baseline/gov/states/id/tax/income/integration.yaml b/policyengine_us/tests/policy/baseline/gov/states/id/tax/income/integration.yaml index 12b4399c2fd..a96995acc78 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/id/tax/income/integration.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/id/tax/income/integration.yaml @@ -262,7 +262,7 @@ members: [person1, person2] state_fips: 16 output: - additional_senior_deduction: 9_000 - id_additional_senior_deduction: 9_000 - id_qualified_business_income_and_federal_schedule_1a_deductions: 9_000 - id_taxable_income: 131_000 + additional_senior_deduction: 6_000 + id_additional_senior_deduction: 6_000 + id_qualified_business_income_and_federal_schedule_1a_deductions: 6_000 + id_taxable_income: 134_000 From cc196636661b0076e389e4b084761f6ba9a2c400 Mon Sep 17 00:00:00 2001 From: Ziming Date: Sun, 26 Apr 2026 17:15:44 -0400 Subject: [PATCH 7/7] Use adds pattern + add phase-out boundary tests for ID senior deduction - Replace formula wrapper with `adds = ["additional_senior_deduction"]` in id_additional_senior_deduction.py, matching the Indiana OBBBA conformity precedent and the sibling aggregator in this PR. - Add boundary tests around the federal phase-out thresholds: single $74,999 / $75,000 / $75,001, joint $149,999 / $150,000 / $150,001, and joint full phase-out at $350,000. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../id_additional_senior_deduction.yaml | 184 ++++++++++++++++++ .../id_additional_senior_deduction.py | 4 +- 2 files changed, 185 insertions(+), 3 deletions(-) diff --git a/policyengine_us/tests/policy/baseline/gov/states/id/tax/income/deductions/id_additional_senior_deduction.yaml b/policyengine_us/tests/policy/baseline/gov/states/id/tax/income/deductions/id_additional_senior_deduction.yaml index 0a85525c64d..0952a1cfd7f 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/id/tax/income/deductions/id_additional_senior_deduction.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/id/tax/income/deductions/id_additional_senior_deduction.yaml @@ -143,3 +143,187 @@ output: # 6% * ($200,000 - $75,000) = $7,500 > $6,000, so capped at 0 id_additional_senior_deduction: 0 + +- name: Single filer just below $75,000 phase-out threshold. + period: 2025 + input: + people: + person1: + age: 70 + is_tax_unit_head: true + is_tax_unit_head_or_spouse: true + ssn_card_type: CITIZEN + tax_units: + tax_unit: + members: [person1] + filing_status: SINGLE + adjusted_gross_income: 74_999 + salt_deduction: 0 + standard_deduction: 0 + households: + household: + members: [person1] + state_code: ID + output: + id_additional_senior_deduction: 6_000 + +- name: Single filer at $75,000 phase-out threshold. + period: 2025 + input: + people: + person1: + age: 70 + is_tax_unit_head: true + is_tax_unit_head_or_spouse: true + ssn_card_type: CITIZEN + tax_units: + tax_unit: + members: [person1] + filing_status: SINGLE + adjusted_gross_income: 75_000 + salt_deduction: 0 + standard_deduction: 0 + households: + household: + members: [person1] + state_code: ID + output: + id_additional_senior_deduction: 6_000 + +- name: Single filer one dollar above $75,000 phase-out threshold. + period: 2025 + input: + people: + person1: + age: 70 + is_tax_unit_head: true + is_tax_unit_head_or_spouse: true + ssn_card_type: CITIZEN + tax_units: + tax_unit: + members: [person1] + filing_status: SINGLE + adjusted_gross_income: 75_001 + salt_deduction: 0 + standard_deduction: 0 + households: + household: + members: [person1] + state_code: ID + output: + # max($6,000 - 6% * $1, 0) = $5,999.94 + id_additional_senior_deduction: 5_999.94 + +- name: Joint filer just below $150,000 phase-out threshold. + period: 2025 + input: + people: + person1: + age: 70 + is_tax_unit_head: true + is_tax_unit_head_or_spouse: true + ssn_card_type: CITIZEN + person2: + age: 70 + is_tax_unit_spouse: true + is_tax_unit_head_or_spouse: true + ssn_card_type: CITIZEN + tax_units: + tax_unit: + members: [person1, person2] + filing_status: JOINT + adjusted_gross_income: 149_999 + salt_deduction: 0 + standard_deduction: 0 + households: + household: + members: [person1, person2] + state_code: ID + output: + id_additional_senior_deduction: 12_000 + +- name: Joint filer at $150,000 phase-out threshold. + period: 2025 + input: + people: + person1: + age: 70 + is_tax_unit_head: true + is_tax_unit_head_or_spouse: true + ssn_card_type: CITIZEN + person2: + age: 70 + is_tax_unit_spouse: true + is_tax_unit_head_or_spouse: true + ssn_card_type: CITIZEN + tax_units: + tax_unit: + members: [person1, person2] + filing_status: JOINT + adjusted_gross_income: 150_000 + salt_deduction: 0 + standard_deduction: 0 + households: + household: + members: [person1, person2] + state_code: ID + output: + id_additional_senior_deduction: 12_000 + +- name: Joint filer one dollar above $150,000 phase-out threshold. + period: 2025 + input: + people: + person1: + age: 70 + is_tax_unit_head: true + is_tax_unit_head_or_spouse: true + ssn_card_type: CITIZEN + person2: + age: 70 + is_tax_unit_spouse: true + is_tax_unit_head_or_spouse: true + ssn_card_type: CITIZEN + tax_units: + tax_unit: + members: [person1, person2] + filing_status: JOINT + adjusted_gross_income: 150_001 + salt_deduction: 0 + standard_deduction: 0 + households: + household: + members: [person1, person2] + state_code: ID + output: + # Per senior: max($6,000 - 6% * $1, 0) = $5,999.94, times two seniors = $11,999.88. + id_additional_senior_deduction: 11_999.88 + +- name: Joint filer fully phased out at $350,000 AGI. + period: 2025 + input: + people: + person1: + age: 70 + is_tax_unit_head: true + is_tax_unit_head_or_spouse: true + ssn_card_type: CITIZEN + person2: + age: 70 + is_tax_unit_spouse: true + is_tax_unit_head_or_spouse: true + ssn_card_type: CITIZEN + tax_units: + tax_unit: + members: [person1, person2] + filing_status: JOINT + adjusted_gross_income: 350_000 + salt_deduction: 0 + standard_deduction: 0 + households: + household: + members: [person1, person2] + state_code: ID + output: + # 6% * ($350,000 - $150,000) = $12,000 >= $6,000 per senior, so deduction is fully phased out. + id_additional_senior_deduction: 0 diff --git a/policyengine_us/variables/gov/states/id/tax/income/deductions/id_additional_senior_deduction.py b/policyengine_us/variables/gov/states/id/tax/income/deductions/id_additional_senior_deduction.py index 227fe24e5dd..02b95877619 100644 --- a/policyengine_us/variables/gov/states/id/tax/income/deductions/id_additional_senior_deduction.py +++ b/policyengine_us/variables/gov/states/id/tax/income/deductions/id_additional_senior_deduction.py @@ -13,6 +13,4 @@ class id_additional_senior_deduction(Variable): "https://legislature.idaho.gov/sessioninfo/2026/legislation/H0559/", "https://tax.idaho.gov/pressrelease/update-on-filing-2025-idaho-income-taxes-now-that-conformity-is-law/", ) - - def formula(tax_unit, period, parameters): - return tax_unit("additional_senior_deduction", period) + adds = ["additional_senior_deduction"]