Skip to content
Open
1 change: 1 addition & 0 deletions changelog.d/credits-2026-id-ctc-co-fatc.fixed.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Remove Idaho's expired child tax credit from state child tax credit totals after 2025, preserve those totals under Idaho revival reforms, and pause Colorado's family affordability tax credit from 2026.
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,23 @@ description: Colorado provides this family affordability tax credit base amount
values:
2024-01-01: 3_200
2025-01-01: 3_273
# C.R.S. 39-22-130(6)(f): no credit is allowed below the 3% adjustment factor.
# LCS R26-322 confirms the credit is unavailable for 2026 and projects
# adjustment factors of 2.78% for 2027 and 2.71% for 2028, also below 3%.
# The amount stays at zero from 2026 pending a later determination.
2026-01-01: 0
metadata:
period: year
unit: currency-USD
label: Colorado family affordability tax credit young child amount
reference:
- title: Colorado General Assembly House Bill 24-1311 Family Affordability Tax Credit
href: https://leg.colorado.gov/bills/hb24-1311
- title: 2024 Colorado Child Tax Credit Instructions, Section C
href: https://tax.colorado.gov/sites/tax/files/documents/DR0104CN_2024.pdf#page=3
- title: 2025 Colorado Individual Tax Filing Guide 104 Book, Section C
href: https://tax.colorado.gov/sites/tax/files/documents/Book104_2025.pdf#page=27
- title: 2025 Colorado Child Tax Credit Instructions, Section C
href: https://tax.colorado.gov/sites/tax/files/documents/DR_0104CN_2025.pdf#page=3
- title: "House Bill 24-1311, C.R.S. 39-22-130(6), (6)(f) #page 7,10"
href: https://leg.colorado.gov/sites/default/files/2024a_1311_signed.pdf#page=7
- title: Legislative Council Staff R26-322, Treatment of Tax Credit Triggers in Fiscal Notes
href: https://content.leg.colorado.gov/sites/default/files/R26-322_Treatment%20of%20Tax%20Credit%20Triggers%20in%20Fiscal%20Notes%20March%202026.pdf#page=3
- title: Colorado Department of Revenue, Child Tax Credit and EITC FAQs (tax year 2026 pause)
href: https://tax.colorado.gov/ctc-eitc-faqs
Original file line number Diff line number Diff line change
Expand Up @@ -74,14 +74,14 @@ values:
- or_ctc
- ut_ctc
- vt_ctc
# Idaho's child tax credit ends after 2025 (Idaho Code 63-3029L(1)).
2026-01-01:
- az_dependent_tax_credit
- ca_yctc
- co_ctc
- co_family_affordability_credit
- dc_ctc
- ga_ctc
- id_ctc
- il_ctc
- ma_child_and_family_credit_or_dependent_care_credit
- md_ctc
Expand All @@ -103,7 +103,6 @@ values:
- co_family_affordability_credit
- dc_ctc
- ga_ctc
- id_ctc
- il_ctc
- ma_child_and_family_credit_or_dependent_care_credit
- md_ctc
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,4 +15,4 @@ metadata:
- title: Idaho Individual Income Tax Instructions Packet 2024
href: https://tax.idaho.gov/wp-content/uploads/forms/EIN00046/EIN00046_10-23-2024.pdf#page=10
- title: Idaho Individual Income Tax Instructions Packet 2025
href: https://tax.idaho.gov/wp-content/uploads/forms/EIN00046/EIN00046_03-02-2026.pdf
href: https://tax.idaho.gov/wp-content/uploads/forms/EIN00046/EIN00046_03-02-2026.pdf#page=12
28 changes: 28 additions & 0 deletions policyengine_us/reforms/states/id/ctc/id_ctc_reform.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,33 @@ def _first_true_instant(nodes, default):
return min(candidates)


def _restore_id_ctc_reporting(parameters, revival_start):
"""Include the revived worksheet amount without erasing later credits."""
state_ctcs = parameters.gov.states.household.state_ctcs
revival_stop = instant("2100-12-31")
if revival_start > revival_stop:
return

# Snapshot every dated list before update replaces overlapping intervals.
# In particular, the 2027 list adds Rhode Island's credit independently.
dated_lists = [(revival_start, list(state_ctcs(revival_start)))]
dated_lists.extend(
(instant(value.instant_str), list(value.value))
for value in state_ctcs.values_list
if str(revival_start) < value.instant_str <= str(revival_stop)
)
dated_lists.sort(key=lambda entry: entry[0])
for index, (start, credits) in enumerate(dated_lists):
if "id_ctc" in credits:
continue
stop = (
dated_lists[index + 1][0].offset(-1, "day")
if index + 1 < len(dated_lists)
else revival_stop
)
state_ctcs.update(start=start, stop=stop, value=credits + ["id_ctc"])


def create_id_ctc() -> Reform:
class id_refundable_ctc(Variable):
value_type = float
Expand Down Expand Up @@ -73,6 +100,7 @@ def modify_parameters(parameters):
# Never revive before the baseline drop date: id_ctc is already in the
# list through 2025, so revival only matters from 2026 onward.
revival_start = max(activation, baseline_drop)
_restore_id_ctc_reporting(parameters, revival_start)
non_refundable = parameters.gov.states.id.tax.income.credits.non_refundable
current_non_refundable = non_refundable(revival_start)
if "id_ctc" not in current_non_refundable:
Expand Down
4 changes: 4 additions & 0 deletions policyengine_us/reforms/states/id/s1450/s1450.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,9 @@
from policyengine_core.reforms import Reform

from policyengine_us.model_api import *
from policyengine_us.reforms.states.id.ctc.id_ctc_reform import (
_restore_id_ctc_reporting,
)


def create_id_s1450() -> Reform:
Expand All @@ -14,6 +17,7 @@ def modify_parameters(parameters: ParameterNode) -> ParameterNode:
stop=instant("2100-12-31"),
value=["id_ctc"],
)
_restore_id_ctc_reporting(parameters, instant("2026-01-01"))
return parameters

class reform(Reform):
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -118,3 +118,45 @@
output:
co_family_affordability_credit: [0, 0, 0]
co_refundable_credits: 0

- name: Colorado family affordability credit in 2025
period: 2025
input:
people:
head:
age: 30
child:
age: 1
tax_units:
tax_unit:
members: [head, child]
adjusted_gross_income: 0
households:
household:
members: [head, child]
state_code: CO
output:
co_family_affordability_credit: [0, 3_273]

- name: Colorado pauses the family affordability credit in 2026
period: 2026
input:
people:
head:
age: 30
child:
age: 1
older_child:
age: 10
tax_units:
tax_unit:
members: [head, child, older_child]
adjusted_gross_income: 0
households:
household:
members: [head, child, older_child]
state_code: CO
output:
# C.R.S. 39-22-130(6)(f): no credit when forecast revenue growth is below
# three percent; the Department of Revenue pauses it for tax year 2026.
co_family_affordability_credit: [0, 0, 0]
Original file line number Diff line number Diff line change
Expand Up @@ -126,3 +126,24 @@
output:
# 5 children under 17 * $205
id_ctc: 1025

- name: No Idaho child tax credit after 2025 in the credit list or the state child tax credit totals
period: 2026
input:
people:
head:
age: 30
child:
age: 5
tax_units:
tax_unit:
members: [head, child]
households:
household:
members: [head, child]
state_code: ID
output:
# Idaho Code 63-3029L(1): taxable years beginning before January 1, 2026.
# id_ctc stays the worksheet amount a reform can revive.
id_non_refundable_credits: 0
taxsim_state_ctc: 0
Original file line number Diff line number Diff line change
Expand Up @@ -139,6 +139,6 @@
# FAC mid-reduction (HOH threshold 16,000): excess 24,000 ->
# ceil(24,000 / 5,000) = 5 increments x 6.875% = 34.375% reduction;
# 3,273 x 1.0 (age under 6) x 0.65625 = 2,147.91.
co_family_affordability_credit: 2_147.91
co_family_affordability_credit: 0
co_state_supplement: 0.0
co_oap: 0.0
Original file line number Diff line number Diff line change
Expand Up @@ -136,12 +136,12 @@
child1:
# AGI 10,000 < 26,000 joint threshold -> no reduction;
# age 5 -> 3,273 x 1.0 = 3,273.
co_family_affordability_credit: 3_273.0
co_family_affordability_credit: 0
co_state_supplement: 0.0
co_oap: 0.0
child2:
# Age 6 -> 3,273 x 0.75 = 2,454.75.
co_family_affordability_credit: 2_454.75
co_family_affordability_credit: 0
co_state_supplement: 0.0
co_oap: 0.0
child3:
Expand Down Expand Up @@ -245,7 +245,7 @@
child1:
# AGI exactly at the 26,000 joint threshold -> excess 0 -> full
# 3,273 x 1.0 (age under 6); $1 more starts the reduction.
co_family_affordability_credit: 3_273.0
co_family_affordability_credit: 0
co_state_supplement: 0.0
co_oap: 0.0
- name: co_family_affordability_joint_agi_26k_plus_1_first_increment (co)
Expand Down Expand Up @@ -343,7 +343,7 @@
child1:
# Excess 1 over the 26,000 joint threshold -> ceil(1/5,000) = 1
# increment x 6.875%; 3,273 x 0.93125 = 3,047.98.
co_family_affordability_credit: 3_047.98
co_family_affordability_credit: 0
co_state_supplement: 0.0
co_oap: 0.0
- name: co_family_affordability_hoh_agi_90k_fully_phased_out (co)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -98,12 +98,12 @@
child1:
# FAC: excess 4,000 over 16,000 HOH threshold -> 1 increment x 6.875%;
# age 8 -> 3,273 x 0.75 x 0.93125 = 2,285.99.
co_family_affordability_credit: 2_285.99
co_family_affordability_credit: 0
co_state_supplement: 0.0
co_oap: 0.0
child2:
# Age 3 -> 3,273 x 1.0 x 0.93125 = 3,047.98.
co_family_affordability_credit: 3_047.98
co_family_affordability_credit: 0
co_state_supplement: 0.0
co_oap: 0.0
- name: statetax_size_4_couple_2_children (co)
Expand Down Expand Up @@ -220,11 +220,11 @@
child1:
# FAC joint: AGI 20,000 < 26,000 threshold -> no reduction;
# age 8 -> 3,273 x 0.75 = 2,454.75.
co_family_affordability_credit: 2_454.75
co_family_affordability_credit: 0
co_state_supplement: 0.0
co_oap: 0.0
child2:
# Age 3 -> full 3,273 (contrast with the HOH case at the same AGI).
co_family_affordability_credit: 3_273.0
co_family_affordability_credit: 0
co_state_supplement: 0.0
co_oap: 0.0
Original file line number Diff line number Diff line change
Expand Up @@ -183,7 +183,7 @@
wic_category: 5
child1:
co_chp_eligible: false
co_family_affordability_credit: 1610.93
co_family_affordability_credit: 0
co_oap: 0.0
co_state_supplement: 0.0
commodity_supplemental_food_program: 0.0
Expand All @@ -195,7 +195,7 @@
wic_category: 5
child2:
co_chp_eligible: false
co_family_affordability_credit: 2147.91
co_family_affordability_credit: 0
co_oap: 0.0
co_state_supplement: 0.0
commodity_supplemental_food_program: 0.0
Expand Down Expand Up @@ -381,7 +381,7 @@
wic_category: 5
child1:
co_chp_eligible: false
co_family_affordability_credit: 1610.93
co_family_affordability_credit: 0
co_oap: 0.0
co_state_supplement: 0.0
commodity_supplemental_food_program: 0.0
Expand All @@ -393,7 +393,7 @@
wic_category: 5
child2:
co_chp_eligible: false
co_family_affordability_credit: 2147.91
co_family_affordability_credit: 0
co_oap: 0.0
co_state_supplement: 0.0
commodity_supplemental_food_program: 0.0
Expand Down Expand Up @@ -582,7 +582,7 @@
wic_category: 5
child1:
co_chp_eligible: false
co_family_affordability_credit: 1610.93
co_family_affordability_credit: 0
co_oap: 0.0
co_state_supplement: 0.0
commodity_supplemental_food_program: 0.0
Expand All @@ -594,7 +594,7 @@
wic_category: 5
child2:
co_chp_eligible: false
co_family_affordability_credit: 2147.91
co_family_affordability_credit: 0
co_oap: 0.0
co_state_supplement: 0.0
commodity_supplemental_food_program: 0.0
Expand Down Expand Up @@ -703,9 +703,9 @@
spouse:
co_family_affordability_credit: 0.0
child1:
co_family_affordability_credit: 1610.93
co_family_affordability_credit: 0
child2:
co_family_affordability_credit: 2147.91
co_family_affordability_credit: 0
- name: signature_108 (2 reqs)
period: 2026
absolute_error_margin: 0.1
Expand Down Expand Up @@ -871,7 +871,7 @@
wic_category: 5
child1:
co_chp_eligible: false
co_family_affordability_credit: 1610.93
co_family_affordability_credit: 0
co_oap: 0.0
co_state_supplement: 0.0
commodity_supplemental_food_program: 0.0
Expand All @@ -882,7 +882,7 @@
wic_category: 5
child2:
co_chp_eligible: false
co_family_affordability_credit: 2147.91
co_family_affordability_credit: 0
co_oap: 0.0
co_state_supplement: 0.0
commodity_supplemental_food_program: 0.0
Expand Down Expand Up @@ -1071,7 +1071,7 @@
wic_category: 5
child1:
co_chp_eligible: false
co_family_affordability_credit: 1610.93
co_family_affordability_credit: 0
co_oap: 0.0
co_state_supplement: 0.0
commodity_supplemental_food_program: 0.0
Expand All @@ -1083,7 +1083,7 @@
wic_category: 5
child2:
co_chp_eligible: false
co_family_affordability_credit: 2147.91
co_family_affordability_credit: 0
co_oap: 0.0
co_state_supplement: 0.0
commodity_supplemental_food_program: 0.0
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
# id_ctc still computes 2 * 205 = 410 as a worksheet amount, but it is not
# in the 2026 nonrefundable list, so no credit is applied.
id_non_refundable_credits: 0
taxsim_state_ctc: 0

- name: Revival applies the nonrefundable CTC capped at liability
period: 2026
Expand All @@ -29,6 +30,7 @@
# Revived list is [id_ctc]; applied = min(410, 1000) = 410. Refundable off.
id_non_refundable_credits: 410
id_refundable_ctc: 0
taxsim_state_ctc: 410

- name: Refundable option pays unused CTC to a no-liability family
period: 2026
Expand All @@ -44,6 +46,7 @@
# potential 410, nonrefundable 0 (no liability), unused 410,
# cap = 205 * 2 = 410 -> fully refundable.
id_refundable_ctc: 410
taxsim_state_ctc: 410

- name: Refundable cap override composes
period: 2026
Expand All @@ -59,6 +62,7 @@
output:
# refund = min(410 unused, 100 * 2) = 200.
id_refundable_ctc: 200
taxsim_state_ctc: 410

- name: Baseline CTC amount override composes with the revival
period: 2026
Expand All @@ -73,3 +77,4 @@
output:
id_ctc: 600
id_non_refundable_credits: 600
taxsim_state_ctc: 600
Loading
Loading