From 814272ea45f13ec4224b9ce79d1e570ab9c807c1 Mon Sep 17 00:00:00 2001 From: PavelMakarchuk Date: Mon, 19 Oct 2026 12:10:42 -0400 Subject: [PATCH 1/3] Count CTC-qualifying children only when the filer meets the ID rules IRC 24(h)(7)(A) allows no credit with respect to any qualifying child unless the return includes the taxpayer's SSN (or one spouse's on a joint return), and IRC 24(e)(2) requires the taxpayer's identification number. Move filer_meets_child_ctc_identification_requirements into ctc_qualifying_child so ctc_qualifying_children agrees with the amount, and drop the duplicate multiply in ctc_child_individual_maximum. Keep the previous child tests in ctc_qualifying_child_ignoring_filer_identification for consumers whose statutes do not require the federal credit to be allowed: - Idaho 63-3029L (IRC 24(c) definition): id_ctc_qualifying_children - Maine 5213-A and 5219-KK (section 24 credit, including the credit for other dependents): me_fairness_credit_qualifying_children - CARES rebate, IRC 6428(a)(2) (IRC 24(c) definition) - Illinois SB 3567 reform (builds on the ITIN-inclusive IL EITC) NC (G.S. 105-153.5(a1), Code date moved to July 5, 2025 by S.L. 2026-31), Utah 59-10-1047 and NY 606(c-1) use the new count. The NY A04038 reform now uses the baseline ny_escc_qualifying_child. Fixes #9403. Co-Authored-By: Claude Opus 5.5 --- .../ctc-qualifying-children-filer-id.fixed.md | 1 + .../ctc/family_security_act_2024_ctc.py | 9 +- .../reforms/ctc/ctc_additional_bracket.py | 9 +- .../reforms/ctc/ctc_older_child_supplement.py | 9 +- .../reforms/states/id/ctc/id_ctc_reform.py | 4 +- .../states/il/sb3567/il_sb3567_reform.py | 7 +- .../a04038/ny_a04038_enhanced_escc_infants.py | 7 +- .../ctc/maximum/ctc_qualifying_child.yaml | 104 ++++++++++++++++++ ...g_child_ignoring_filer_identification.yaml | 81 ++++++++++++++ ...es_qualifying_children_with_valid_ssn.yaml | 30 +++++ .../states/id/tax/income/credits/id_ctc.yaml | 12 +- .../credits/id_ctc_qualifying_children.yaml | 69 ++++++++++++ ...e_fairness_credit_qualifying_children.yaml | 88 +++++++++++++++ ...property_tax_fairness_credit_base_cap.yaml | 24 ++-- ...erty_tax_fairness_credit_benefit_base.yaml | 16 +-- ...property_tax_fairness_credit_eligible.yaml | 6 +- .../me_sales_tax_fairness_credit.yaml | 28 ++--- .../gov/states/me/tax/income/integration.yaml | 4 +- .../income/deductions/nc_child_deduction.yaml | 68 ++++++++++-- .../tax/income/credits/ny_ctc_pre_2024.yaml | 46 ++++++++ .../states/ut/tax/income/credits/ut_ctc.yaml | 63 +++++++++++ .../contrib/states/id/ctc/id_ctc_reform.yaml | 10 +- .../test_id_ga_ctc_reform_activation.py | 10 +- .../ctc/maximum/ctc_qualifying_child.py | 40 +++---- ...ing_child_ignoring_filer_identification.py | 41 +++++++ .../ctc/maximum/ctc_qualifying_children.py | 11 +- .../ctc_child_individual_maximum.py | 8 +- ...ares_qualifying_children_with_valid_ssn.py | 8 +- .../states/id/tax/income/credits/id_ctc.py | 13 +-- .../credits/id_ctc_qualifying_children.py | 33 ++++++ .../me_fairness_credit_qualifying_children.py | 45 ++++++++ ...operty_tax_fairness_credit_benefit_base.py | 2 +- .../me_sales_tax_fairness_credit.py | 2 +- .../income/deductions/nc_child_deduction.py | 13 ++- .../credits/ctc/ny_ctc_pre_2024_eligible.py | 11 +- 35 files changed, 798 insertions(+), 134 deletions(-) create mode 100644 changelog.d/ctc-qualifying-children-filer-id.fixed.md create mode 100644 policyengine_us/tests/policy/baseline/gov/irs/credits/ctc/maximum/ctc_qualifying_child_ignoring_filer_identification.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/irs/credits/recovery_rebate_credit/rrc_cares_qualifying_children_with_valid_ssn.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/id/tax/income/credits/id_ctc_qualifying_children.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/me/tax/income/credits/fairness/me_fairness_credit_qualifying_children.yaml create mode 100644 policyengine_us/variables/gov/irs/credits/ctc/maximum/ctc_qualifying_child_ignoring_filer_identification.py create mode 100644 policyengine_us/variables/gov/states/id/tax/income/credits/id_ctc_qualifying_children.py create mode 100644 policyengine_us/variables/gov/states/me/tax/income/credits/fairness/me_fairness_credit_qualifying_children.py diff --git a/changelog.d/ctc-qualifying-children-filer-id.fixed.md b/changelog.d/ctc-qualifying-children-filer-id.fixed.md new file mode 100644 index 00000000000..74dd0acba9a --- /dev/null +++ b/changelog.d/ctc-qualifying-children-filer-id.fixed.md @@ -0,0 +1 @@ +Exclude children whose filer fails the Child Tax Credit identification requirements (IRC 24(e)(2), 24(h)(7)) from ctc_qualifying_children, which also removes them from the North Carolina child deduction and the Utah child tax credit from 2025; the Idaho Child Tax Credit, the Maine fairness credits, and the CARES recovery rebate keep counting them under their own child definitions. diff --git a/policyengine_us/reforms/congress/romney/family_security_act_2024/ctc/family_security_act_2024_ctc.py b/policyengine_us/reforms/congress/romney/family_security_act_2024/ctc/family_security_act_2024_ctc.py index 35d1afb7d85..e4befb61ce5 100644 --- a/policyengine_us/reforms/congress/romney/family_security_act_2024/ctc/family_security_act_2024_ctc.py +++ b/policyengine_us/reforms/congress/romney/family_security_act_2024/ctc/family_security_act_2024_ctc.py @@ -84,17 +84,10 @@ class ctc_child_individual_maximum(Variable): def formula(person, period, parameters): age = person("age", period) qualifying_child = person("ctc_qualifying_child", period) - filer_meets_child_ctc_id_requirements = person.tax_unit( - "filer_meets_child_ctc_identification_requirements", period - ) p = parameters( period ).gov.contrib.congress.romney.family_security_act_2_0.ctc - return ( - qualifying_child - * filer_meets_child_ctc_id_requirements - * p.base.calc(age) - ) + return qualifying_child * p.base.calc(age) class ctc_qualifying_children(Variable): value_type = int diff --git a/policyengine_us/reforms/ctc/ctc_additional_bracket.py b/policyengine_us/reforms/ctc/ctc_additional_bracket.py index d83b1b35152..660a5d46fe8 100644 --- a/policyengine_us/reforms/ctc/ctc_additional_bracket.py +++ b/policyengine_us/reforms/ctc/ctc_additional_bracket.py @@ -15,15 +15,8 @@ class ctc_child_individual_maximum(Variable): def formula(person, period, parameters): age = person("age", period) qualifying_child = person("ctc_qualifying_child", period) - filer_meets_child_ctc_id_requirements = person.tax_unit( - "filer_meets_child_ctc_identification_requirements", period - ) p = parameters(period).gov.contrib.ctc.additional_bracket.amount - return ( - qualifying_child - * filer_meets_child_ctc_id_requirements - * p.base.calc(age) - ) + return qualifying_child * p.base.calc(age) class ctc_refundable_maximum(Variable): value_type = float diff --git a/policyengine_us/reforms/ctc/ctc_older_child_supplement.py b/policyengine_us/reforms/ctc/ctc_older_child_supplement.py index e11ba0bf70b..767939a7440 100644 --- a/policyengine_us/reforms/ctc/ctc_older_child_supplement.py +++ b/policyengine_us/reforms/ctc/ctc_older_child_supplement.py @@ -19,19 +19,12 @@ class ctc_child_individual_maximum(Variable): def formula(person, period, parameters): age = person("age", period) qualifying_child = person("ctc_qualifying_child", period) - filer_meets_child_ctc_id_requirements = person.tax_unit( - "filer_meets_child_ctc_identification_requirements", period - ) base_amount = parameters(period).gov.irs.credits.ctc.amount.base base_amount = base_amount.calc(age) oldest_child = person("child_index", period) == 1 p_ref = parameters(period).gov.contrib.ctc.oldest_child_supplement oldest_child_supplement = oldest_child * p_ref.amount - return ( - qualifying_child - * filer_meets_child_ctc_id_requirements - * (base_amount + oldest_child_supplement) - ) + return qualifying_child * (base_amount + oldest_child_supplement) class reform(Reform): def apply(self): diff --git a/policyengine_us/reforms/states/id/ctc/id_ctc_reform.py b/policyengine_us/reforms/states/id/ctc/id_ctc_reform.py index 771d5c45848..73b1a724d20 100644 --- a/policyengine_us/reforms/states/id/ctc/id_ctc_reform.py +++ b/policyengine_us/reforms/states/id/ctc/id_ctc_reform.py @@ -36,7 +36,7 @@ class id_refundable_ctc(Variable): def formula(tax_unit, period, parameters): p = parameters(period).gov.contrib.states.id.ctc # Potential is the revived (nonrefundable) Idaho CTC worksheet - # amount, ctc_qualifying_children * amount. + # amount, id_ctc_qualifying_children * amount. potential = tax_unit("id_ctc", period) ordered_credits = parameters( period @@ -50,7 +50,7 @@ def formula(tax_unit, period, parameters): ) non_refundable = min_(potential, credit_limit) unused_credit = max_(potential - non_refundable, 0) - eligible_children = tax_unit("ctc_qualifying_children", period) + eligible_children = tax_unit("id_ctc_qualifying_children", period) refund_limit = p.refundable.amount * eligible_children refundable_credit = min_(unused_credit, refund_limit) # Only pay the refundable portion when the refundable option is on; diff --git a/policyengine_us/reforms/states/il/sb3567/il_sb3567_reform.py b/policyengine_us/reforms/states/il/sb3567/il_sb3567_reform.py index f7b604b894c..182b8652a6d 100644 --- a/policyengine_us/reforms/states/il/sb3567/il_sb3567_reform.py +++ b/policyengine_us/reforms/states/il/sb3567/il_sb3567_reform.py @@ -30,7 +30,12 @@ def formula(tax_unit, period, parameters): person = tax_unit.members age = person("age", period) age_eligible_child = age < ctc.age_limit - federal_ctc_eligible_child = person("ctc_qualifying_child", period) + # The Illinois credit builds on the Illinois EITC, which does not + # require the filer's social security number, so the federal CTC + # filer identification requirements are not applied here. + federal_ctc_eligible_child = person( + "ctc_qualifying_child_ignoring_filer_identification", period + ) eligible_child = age_eligible_child & federal_ctc_eligible_child eligible_child_present = tax_unit.any(eligible_child) diff --git a/policyengine_us/reforms/states/ny/a04038/ny_a04038_enhanced_escc_infants.py b/policyengine_us/reforms/states/ny/a04038/ny_a04038_enhanced_escc_infants.py index ddfbad0a880..22429e9865a 100644 --- a/policyengine_us/reforms/states/ny/a04038/ny_a04038_enhanced_escc_infants.py +++ b/policyengine_us/reforms/states/ny/a04038/ny_a04038_enhanced_escc_infants.py @@ -32,9 +32,10 @@ def formula(tax_unit, period, parameters): person = tax_unit.members age = person("age", period) - # Post-2024 CTC rules (2025-2027) - qualifies_for_federal_ctc = person("ctc_qualifying_child", period) - qualifies = qualifies_for_federal_ctc & (age >= p.minimum_age) + # Post-2024 CTC rules (2025-2027). Use the baseline NY qualifying + # child (ny_ctc_post_2024_base), which allows ITIN holders and + # does not apply the federal filer SSN requirement. + qualifies = person("ny_escc_qualifying_child", period) # Calculate base credit amount by age credit_by_age = p.post_2024.amount.calc(age) diff --git a/policyengine_us/tests/policy/baseline/gov/irs/credits/ctc/maximum/ctc_qualifying_child.yaml b/policyengine_us/tests/policy/baseline/gov/irs/credits/ctc/maximum/ctc_qualifying_child.yaml index fc96d52a969..73910108d7c 100644 --- a/policyengine_us/tests/policy/baseline/gov/irs/credits/ctc/maximum/ctc_qualifying_child.yaml +++ b/policyengine_us/tests/policy/baseline/gov/irs/credits/ctc/maximum/ctc_qualifying_child.yaml @@ -243,3 +243,107 @@ state_code: TX output: ctc_qualifying_child: [false, false, true] + +# IRC 24(h)(7)(A)(i): from 2025, no credit with respect to any qualifying child +# unless the return includes the taxpayer's SSN (on a joint return, at least one +# spouse's). The child is not counted, and gets the credit for other dependents +# instead (IRC 24(h)(4)(C)). Issue #9403. +- name: 2026 filer without an SSN has no CTC-qualifying child + period: 2026 + input: + people: + parent: + age: 35 + employment_income: 40_000 + ssn_card_type: NONE + child: + age: 8 + is_tax_unit_dependent: true + ssn_card_type: CITIZEN + tax_units: + tax_unit: + members: [parent, child] + households: + household: + members: [parent, child] + state_code: TX + output: + ctc_qualifying_child: [false, false] + ctc_qualifying_child_ignoring_filer_identification: [false, true] + ctc_qualifying_children: 0 + ctc_child_individual_maximum: [0, 0] + ctc_adult_individual_maximum: [0, 500] + +- name: 2026 joint return where only one spouse has an SSN keeps the CTC-qualifying child + period: 2026 + input: + people: + head: + age: 35 + ssn_card_type: OTHER_NON_CITIZEN + spouse: + age: 35 + ssn_card_type: CITIZEN + child: + age: 8 + is_tax_unit_dependent: true + ssn_card_type: CITIZEN + tax_units: + tax_unit: + members: [head, spouse, child] + filing_status: JOINT + households: + household: + members: [head, spouse, child] + state_code: TX + output: + ctc_qualifying_child: [false, false, true] + ctc_qualifying_children: 1 + +- name: 2024 filer without an SSN keeps the CTC-qualifying child + # The filer SSN rule starts in 2025; before then the filer needs only a TIN. + period: 2024 + input: + people: + parent: + age: 35 + ssn_card_type: OTHER_NON_CITIZEN + child: + age: 8 + is_tax_unit_dependent: true + ssn_card_type: CITIZEN + tax_units: + tax_unit: + members: [parent, child] + households: + household: + members: [parent, child] + state_code: TX + output: + ctc_qualifying_child: [false, true] + ctc_qualifying_children: 1 + +- name: 2024 filer without any TIN has no CTC-qualifying child + # IRC 24(e)(2): no credit unless the taxpayer has an identification number. + period: 2024 + input: + people: + parent: + age: 35 + ssn_card_type: NONE + has_tin: false + child: + age: 8 + is_tax_unit_dependent: true + ssn_card_type: CITIZEN + tax_units: + tax_unit: + members: [parent, child] + households: + household: + members: [parent, child] + state_code: TX + output: + ctc_qualifying_child: [false, false] + ctc_qualifying_child_ignoring_filer_identification: [false, true] + ctc_qualifying_children: 0 diff --git a/policyengine_us/tests/policy/baseline/gov/irs/credits/ctc/maximum/ctc_qualifying_child_ignoring_filer_identification.yaml b/policyengine_us/tests/policy/baseline/gov/irs/credits/ctc/maximum/ctc_qualifying_child_ignoring_filer_identification.yaml new file mode 100644 index 00000000000..e586250570d --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/irs/credits/ctc/maximum/ctc_qualifying_child_ignoring_filer_identification.yaml @@ -0,0 +1,81 @@ +- name: Child of a filer without an SSN meets the qualifying child tests in 2026 + period: 2026 + input: + people: + parent: + age: 35 + ssn_card_type: NONE + child: + age: 8 + is_tax_unit_dependent: true + ssn_card_type: CITIZEN + tax_units: + tax_unit: + members: [parent, child] + households: + household: + members: [parent, child] + state_code: TX + output: + ctc_qualifying_child_ignoring_filer_identification: [false, true] + +- name: Child aged 17 does not meet the qualifying child tests in 2026 + period: 2026 + input: + people: + parent: + age: 45 + ssn_card_type: NONE + child: + age: 17 + is_tax_unit_dependent: true + ssn_card_type: CITIZEN + tax_units: + tax_unit: + members: [parent, child] + households: + household: + members: [parent, child] + state_code: TX + output: + ctc_qualifying_child_ignoring_filer_identification: [false, false] + +- name: Child without an SSN does not meet the qualifying child tests in 2026 + period: 2026 + input: + people: + parent: + age: 35 + child: + age: 8 + is_tax_unit_dependent: true + ssn_card_type: OTHER_NON_CITIZEN + tax_units: + tax_unit: + members: [parent, child] + households: + household: + members: [parent, child] + state_code: TX + output: + ctc_qualifying_child_ignoring_filer_identification: [false, false] + +- name: Child of a filer who can be claimed as a dependent does not meet the qualifying child tests in 2026 + # IRC 24(a), 152(b)(1); Publication 501, Dependent Taxpayer Test. + period: 2026 + input: + people: + parent: + age: 20 + claimed_as_dependent_on_another_return: true + child: + age: 5 + tax_units: + tax_unit: + members: [parent, child] + households: + household: + members: [parent, child] + state_code: TX + output: + ctc_qualifying_child_ignoring_filer_identification: [false, false] diff --git a/policyengine_us/tests/policy/baseline/gov/irs/credits/recovery_rebate_credit/rrc_cares_qualifying_children_with_valid_ssn.yaml b/policyengine_us/tests/policy/baseline/gov/irs/credits/recovery_rebate_credit/rrc_cares_qualifying_children_with_valid_ssn.yaml new file mode 100644 index 00000000000..66820300c69 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/irs/credits/recovery_rebate_credit/rrc_cares_qualifying_children_with_valid_ssn.yaml @@ -0,0 +1,30 @@ +# IRC 6428(a)(2) counts each "qualifying child (within the meaning of section +# 24(c))", so the Child Tax Credit filer identification requirements do not apply +# (issue #9403). The rebate's own identification rules are in IRC 6428(g). +- name: CARES - Child of a joint return where one spouse has no TIN still counts + period: 2020 + input: + people: + head: + age: 35 + ssn_card_type: CITIZEN + spouse: + age: 35 + ssn_card_type: NONE + has_tin: false + child: + age: 8 + is_tax_unit_dependent: true + ssn_card_type: CITIZEN + tax_units: + tax_unit: + members: [head, spouse, child] + filing_status: JOINT + households: + household: + members: [head, spouse, child] + state_code: TX + output: + ctc_qualifying_children: 0 + rrc_cares_qualifying_children_with_valid_ssn: 1 + rrc_cares: 1_700 # 1_200 for the spouse with an SSN + 500 for the child diff --git a/policyengine_us/tests/policy/baseline/gov/states/id/tax/income/credits/id_ctc.yaml b/policyengine_us/tests/policy/baseline/gov/states/id/tax/income/credits/id_ctc.yaml index 9b0596d7c1d..89046ef1c12 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/id/tax/income/credits/id_ctc.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/id/tax/income/credits/id_ctc.yaml @@ -1,7 +1,7 @@ - name: One child period: 2022 input: - ctc_qualifying_children: 1 + id_ctc_qualifying_children: 1 state_code: ID output: id_ctc: 205 @@ -9,7 +9,7 @@ - name: Family with 2 children period: 2018 input: - ctc_qualifying_children: 2 + id_ctc_qualifying_children: 2 state_code: ID output: id_ctc: 410 @@ -17,7 +17,7 @@ - name: No children period: 2022 input: - ctc_qualifying_children: 0 + id_ctc_qualifying_children: 0 state_code: ID output: id_ctc: 0 @@ -29,7 +29,7 @@ # $205 per qualifying child period: 2025 input: - ctc_qualifying_children: 1 + id_ctc_qualifying_children: 1 state_code: ID output: id_ctc: 205 @@ -38,7 +38,7 @@ # 3 children * $205 = $615 period: 2025 input: - ctc_qualifying_children: 3 + id_ctc_qualifying_children: 3 state_code: ID output: id_ctc: 615 @@ -46,7 +46,7 @@ - name: No children in 2025 period: 2025 input: - ctc_qualifying_children: 0 + id_ctc_qualifying_children: 0 state_code: ID output: id_ctc: 0 diff --git a/policyengine_us/tests/policy/baseline/gov/states/id/tax/income/credits/id_ctc_qualifying_children.yaml b/policyengine_us/tests/policy/baseline/gov/states/id/tax/income/credits/id_ctc_qualifying_children.yaml new file mode 100644 index 00000000000..a033d726e8f --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/id/tax/income/credits/id_ctc_qualifying_children.yaml @@ -0,0 +1,69 @@ +# Idaho Code 63-3029L(1) gives "qualifying child" the meaning in IRC 24(c) and does +# not require the federal credit to be allowed, so a child whose filer fails the +# federal filer identification requirements still counts (issue #9403). +- name: Idaho counts the child of a filer without an SSN in 2025 + period: 2025 + input: + people: + parent: + age: 35 + employment_income: 40_000 + ssn_card_type: NONE + child: + age: 8 + is_tax_unit_dependent: true + ssn_card_type: CITIZEN + tax_units: + tax_unit: + members: [parent, child] + households: + household: + members: [parent, child] + state_code: ID + output: + ctc_qualifying_children: 0 + id_ctc_qualifying_children: 1 + id_ctc: 205 + +- name: Idaho counts the child of a filer with an SSN in 2025 + period: 2025 + input: + people: + parent: + age: 35 + employment_income: 40_000 + child: + age: 8 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [parent, child] + households: + household: + members: [parent, child] + state_code: ID + output: + ctc_qualifying_children: 1 + id_ctc_qualifying_children: 1 + id_ctc: 205 + +- name: Idaho does not count a child aged 17 in 2021 + # The 2021 federal expansion to age 17 is in IRC 24(i)(1), not 24(c). + period: 2021 + input: + people: + parent: + age: 45 + child: + age: 17 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [parent, child] + households: + household: + members: [parent, child] + state_code: ID + output: + ctc_qualifying_children: 1 + id_ctc_qualifying_children: 0 diff --git a/policyengine_us/tests/policy/baseline/gov/states/me/tax/income/credits/fairness/me_fairness_credit_qualifying_children.yaml b/policyengine_us/tests/policy/baseline/gov/states/me/tax/income/credits/fairness/me_fairness_credit_qualifying_children.yaml new file mode 100644 index 00000000000..e9507a009cf --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/me/tax/income/credits/fairness/me_fairness_credit_qualifying_children.yaml @@ -0,0 +1,88 @@ +# 36 MRSA 5213-A(1)(A-1)(2) and 5219-KK(1)(A-1)(2)-(3) count each "qualifying child +# or dependent" for whom the filer can claim the federal credit under section 24, +# which includes the credit for other dependents. A child whose filer fails the +# Child Tax Credit SSN rule gets that credit (IRC 24(h)(4)(C)) if the filer has an +# SSN or ITIN, so the child still counts (issue #9403). +- name: Maine counts the child of a joint return where neither spouse has an SSN in 2025 + period: 2025 + input: + people: + head: + age: 35 + ssn_card_type: OTHER_NON_CITIZEN + spouse: + age: 35 + ssn_card_type: OTHER_NON_CITIZEN + child: + age: 8 + is_tax_unit_dependent: true + ssn_card_type: CITIZEN + tax_units: + tax_unit: + members: [head, spouse, child] + filing_status: JOINT + me_sales_and_property_tax_fairness_credit_income: 10_000 + households: + household: + members: [head, spouse, child] + state_code: ME + output: + ctc_qualifying_children: 0 + me_fairness_credit_qualifying_children: 1 + me_sales_tax_fairness_credit: 250 + +- name: Maine does not count the child of a joint return where neither spouse has any TIN in 2025 + # No section 24 credit is allowed without a taxpayer identification number. + period: 2025 + input: + people: + head: + age: 35 + ssn_card_type: NONE + has_tin: false + spouse: + age: 35 + ssn_card_type: NONE + has_tin: false + child: + age: 8 + is_tax_unit_dependent: true + ssn_card_type: CITIZEN + tax_units: + tax_unit: + members: [head, spouse, child] + filing_status: JOINT + me_sales_and_property_tax_fairness_credit_income: 10_000 + households: + household: + members: [head, spouse, child] + state_code: ME + output: + ctc_qualifying_children: 0 + me_fairness_credit_qualifying_children: 0 + me_sales_tax_fairness_credit: 215 + +- name: Maine counts the child of a joint return with SSNs in 2025 + period: 2025 + input: + people: + head: + age: 35 + spouse: + age: 35 + child: + age: 8 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [head, spouse, child] + filing_status: JOINT + me_sales_and_property_tax_fairness_credit_income: 10_000 + households: + household: + members: [head, spouse, child] + state_code: ME + output: + ctc_qualifying_children: 1 + me_fairness_credit_qualifying_children: 1 + me_sales_tax_fairness_credit: 250 diff --git a/policyengine_us/tests/policy/baseline/gov/states/me/tax/income/credits/property_tax_fairness_credit/me_property_tax_fairness_credit_base_cap.yaml b/policyengine_us/tests/policy/baseline/gov/states/me/tax/income/credits/property_tax_fairness_credit/me_property_tax_fairness_credit_base_cap.yaml index b8e5decd973..958676687d9 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/me/tax/income/credits/property_tax_fairness_credit/me_property_tax_fairness_credit_base_cap.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/me/tax/income/credits/property_tax_fairness_credit/me_property_tax_fairness_credit_base_cap.yaml @@ -4,7 +4,7 @@ input: state_code: ME filing_status: SINGLE - ctc_qualifying_children: 0 + me_fairness_credit_qualifying_children: 0 me_sales_and_property_tax_fairness_credit_income: 0 me_property_tax_fairness_credit_countable_rent_property_tax: 1_000 age_head: 66 @@ -18,7 +18,7 @@ input: state_code: ME filing_status: SINGLE - ctc_qualifying_children: 3 + me_fairness_credit_qualifying_children: 3 me_sales_and_property_tax_fairness_credit_income: 100_000 me_property_tax_fairness_credit_countable_rent_property_tax: 3_000 age_head: 66 @@ -32,7 +32,7 @@ input: state_code: ME filing_status: SINGLE - ctc_qualifying_children: 3 + me_fairness_credit_qualifying_children: 3 me_sales_and_property_tax_fairness_credit_income: 10_000 me_property_tax_fairness_credit_countable_rent_property_tax: 3_000 age_head: 66 @@ -46,7 +46,7 @@ input: state_code: ME filing_status: SINGLE - ctc_qualifying_children: 0 + me_fairness_credit_qualifying_children: 0 me_sales_and_property_tax_fairness_credit_income: 51_000 me_property_tax_fairness_credit_countable_rent_property_tax: 7_000 age_head: 66 @@ -60,7 +60,7 @@ input: state_code: ME filing_status: SINGLE - ctc_qualifying_children: 0 + me_fairness_credit_qualifying_children: 0 me_sales_and_property_tax_fairness_credit_income: 0 me_property_tax_fairness_credit_countable_rent_property_tax: 2_000 age_head: 64 @@ -74,7 +74,7 @@ input: state_code: ME filing_status: SINGLE - ctc_qualifying_children: 0 + me_fairness_credit_qualifying_children: 0 me_sales_and_property_tax_fairness_credit_income: 0 me_property_tax_fairness_credit_countable_rent_property_tax: 2_000 age_head: 64 @@ -88,7 +88,7 @@ input: state_code: ME filing_status: SINGLE - ctc_qualifying_children: 0 + me_fairness_credit_qualifying_children: 0 me_sales_and_property_tax_fairness_credit_income: 0 me_property_tax_fairness_credit_countable_rent_property_tax: 3_000 age_head: 65 @@ -106,7 +106,7 @@ input: state_code: ME filing_status: SINGLE - ctc_qualifying_children: 0 + me_fairness_credit_qualifying_children: 0 me_sales_and_property_tax_fairness_credit_income: 60_000 me_property_tax_fairness_credit_countable_rent_property_tax: 5_000 age_head: 66 @@ -124,7 +124,7 @@ input: state_code: ME filing_status: SINGLE - ctc_qualifying_children: 0 + me_fairness_credit_qualifying_children: 0 me_sales_and_property_tax_fairness_credit_income: 60_000 me_property_tax_fairness_credit_countable_rent_property_tax: 5_000 age_head: 65 @@ -138,7 +138,7 @@ input: state_code: ME filing_status: SINGLE - ctc_qualifying_children: 0 + me_fairness_credit_qualifying_children: 0 me_sales_and_property_tax_fairness_credit_income: 60_000 me_property_tax_fairness_credit_countable_rent_property_tax: 5_000 age_head: 64 @@ -152,7 +152,7 @@ input: state_code: ME filing_status: JOINT - ctc_qualifying_children: 0 + me_fairness_credit_qualifying_children: 0 me_sales_and_property_tax_fairness_credit_income: 60_000 me_property_tax_fairness_credit_countable_rent_property_tax: 5_000 age_head: 60 @@ -172,7 +172,7 @@ input: state_code: ME filing_status: SINGLE - ctc_qualifying_children: 0 + me_fairness_credit_qualifying_children: 0 me_sales_and_property_tax_fairness_credit_income: 60_000 me_property_tax_fairness_credit_countable_rent_property_tax: 5_000 age_head: 66 diff --git a/policyengine_us/tests/policy/baseline/gov/states/me/tax/income/credits/property_tax_fairness_credit/me_property_tax_fairness_credit_benefit_base.yaml b/policyengine_us/tests/policy/baseline/gov/states/me/tax/income/credits/property_tax_fairness_credit/me_property_tax_fairness_credit_benefit_base.yaml index 0f05822f6e1..1b3c06d0827 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/me/tax/income/credits/property_tax_fairness_credit/me_property_tax_fairness_credit_benefit_base.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/me/tax/income/credits/property_tax_fairness_credit/me_property_tax_fairness_credit_benefit_base.yaml @@ -3,7 +3,7 @@ input: state_code: ME filing_status: SINGLE - ctc_qualifying_children: 0 + me_fairness_credit_qualifying_children: 0 output: me_property_tax_fairness_credit_benefit_base: 2_100 @@ -13,7 +13,7 @@ input: state_code: ME filing_status: SINGLE - ctc_qualifying_children: 3 + me_fairness_credit_qualifying_children: 3 output: me_property_tax_fairness_credit_benefit_base: 2_200 @@ -23,7 +23,7 @@ input: state_code: ME filing_status: JOINT - ctc_qualifying_children: 0 + me_fairness_credit_qualifying_children: 0 output: me_property_tax_fairness_credit_benefit_base: 2_750 @@ -33,7 +33,7 @@ input: state_code: ME filing_status: JOINT - ctc_qualifying_children: 1 + me_fairness_credit_qualifying_children: 1 output: me_property_tax_fairness_credit_benefit_base: 3_450 @@ -43,7 +43,7 @@ input: state_code: ME filing_status: HEAD_OF_HOUSEHOLD - ctc_qualifying_children: 0 + me_fairness_credit_qualifying_children: 0 output: me_property_tax_fairness_credit_benefit_base: 3_000 @@ -54,7 +54,7 @@ input: state_code: ME filing_status: SINGLE - ctc_qualifying_children: 0 + me_fairness_credit_qualifying_children: 0 output: me_property_tax_fairness_credit_benefit_base: 2_550 @@ -63,7 +63,7 @@ input: state_code: ME filing_status: JOINT - ctc_qualifying_children: 2 + me_fairness_credit_qualifying_children: 2 output: me_property_tax_fairness_credit_benefit_base: 4_050 @@ -72,7 +72,7 @@ input: state_code: ME filing_status: HEAD_OF_HOUSEHOLD - ctc_qualifying_children: 1 + me_fairness_credit_qualifying_children: 1 output: me_property_tax_fairness_credit_benefit_base: 3_300 diff --git a/policyengine_us/tests/policy/baseline/gov/states/me/tax/income/credits/property_tax_fairness_credit/me_property_tax_fairness_credit_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/me/tax/income/credits/property_tax_fairness_credit/me_property_tax_fairness_credit_eligible.yaml index f32dbd63d7d..137b96af466 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/me/tax/income/credits/property_tax_fairness_credit/me_property_tax_fairness_credit_eligible.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/me/tax/income/credits/property_tax_fairness_credit/me_property_tax_fairness_credit_eligible.yaml @@ -4,7 +4,7 @@ state_code: ME me_sales_and_property_tax_fairness_credit_income: 0 filing_status: SEPARATE - ctc_qualifying_children: 2 + me_fairness_credit_qualifying_children: 2 output: me_property_tax_fairness_credit_eligible: false @@ -13,7 +13,7 @@ input: state_code: ME filing_status: SINGLE - ctc_qualifying_children: 4 + me_fairness_credit_qualifying_children: 4 output: me_property_tax_fairness_credit_eligible: true @@ -22,6 +22,6 @@ input: state_code: ME filing_status: HEAD_OF_HOUSEHOLD - ctc_qualifying_children: 0 + me_fairness_credit_qualifying_children: 0 output: me_property_tax_fairness_credit_eligible: true diff --git a/policyengine_us/tests/policy/baseline/gov/states/me/tax/income/credits/sales_tax_fairness_credit/me_sales_tax_fairness_credit.yaml b/policyengine_us/tests/policy/baseline/gov/states/me/tax/income/credits/sales_tax_fairness_credit/me_sales_tax_fairness_credit.yaml index dcfd7467a15..b871586dbdd 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/me/tax/income/credits/sales_tax_fairness_credit/me_sales_tax_fairness_credit.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/me/tax/income/credits/sales_tax_fairness_credit/me_sales_tax_fairness_credit.yaml @@ -2,7 +2,7 @@ period: 2022 input: me_sales_tax_fairness_credit_eligible: true - ctc_qualifying_children: 1 + me_fairness_credit_qualifying_children: 1 filing_status: SEPARATE me_sales_and_property_tax_fairness_credit_income: 0 output: @@ -12,7 +12,7 @@ period: 2022 input: me_sales_tax_fairness_credit_eligible: false - ctc_qualifying_children: 1 + me_fairness_credit_qualifying_children: 1 filing_status: SINGLE me_sales_and_property_tax_fairness_credit_income: 0 output: @@ -22,7 +22,7 @@ period: 2022 input: me_sales_tax_fairness_credit_eligible: true - ctc_qualifying_children: 0 + me_fairness_credit_qualifying_children: 0 filing_status: JOINT me_sales_and_property_tax_fairness_credit_income: 0 output: @@ -32,7 +32,7 @@ period: 2022 input: me_sales_tax_fairness_credit_eligible: true - ctc_qualifying_children: 4 + me_fairness_credit_qualifying_children: 4 filing_status: JOINT me_sales_and_property_tax_fairness_credit_income: 0 output: @@ -42,7 +42,7 @@ period: 2022 input: me_sales_tax_fairness_credit_eligible: true - ctc_qualifying_children: 4 + me_fairness_credit_qualifying_children: 4 filing_status: JOINT me_sales_and_property_tax_fairness_credit_income: 51_700 output: @@ -52,7 +52,7 @@ period: 2022 input: me_sales_tax_fairness_credit_eligible: true - ctc_qualifying_children: 3 + me_fairness_credit_qualifying_children: 3 filing_status: SINGLE me_sales_and_property_tax_fairness_credit_income: 25_350 output: @@ -62,7 +62,7 @@ period: 2022 input: me_sales_tax_fairness_credit_eligible: true - ctc_qualifying_children: 3 + me_fairness_credit_qualifying_children: 3 filing_status: SINGLE me_sales_and_property_tax_fairness_credit_income: 50_000 output: @@ -72,7 +72,7 @@ period: 2025 input: me_sales_tax_fairness_credit_eligible: true - ctc_qualifying_children: 2 + me_fairness_credit_qualifying_children: 2 filing_status: JOINT me_sales_and_property_tax_fairness_credit_income: 52_630 output: @@ -85,7 +85,7 @@ period: 2025 input: me_sales_tax_fairness_credit_eligible: true - ctc_qualifying_children: 0 + me_fairness_credit_qualifying_children: 0 filing_status: JOINT me_sales_and_property_tax_fairness_credit_income: 0 output: @@ -95,7 +95,7 @@ period: 2025 input: me_sales_tax_fairness_credit_eligible: true - ctc_qualifying_children: 0 + me_fairness_credit_qualifying_children: 0 filing_status: HEAD_OF_HOUSEHOLD me_sales_and_property_tax_fairness_credit_income: 0 output: @@ -105,7 +105,7 @@ period: 2025 input: me_sales_tax_fairness_credit_eligible: true - ctc_qualifying_children: 0 + me_fairness_credit_qualifying_children: 0 filing_status: SURVIVING_SPOUSE me_sales_and_property_tax_fairness_credit_income: 0 output: @@ -115,7 +115,7 @@ period: 2025 input: me_sales_tax_fairness_credit_eligible: true - ctc_qualifying_children: 1 + me_fairness_credit_qualifying_children: 1 filing_status: JOINT me_sales_and_property_tax_fairness_credit_income: 0 output: @@ -125,7 +125,7 @@ period: 2025 input: me_sales_tax_fairness_credit_eligible: true - ctc_qualifying_children: 0 + me_fairness_credit_qualifying_children: 0 filing_status: SINGLE me_sales_and_property_tax_fairness_credit_income: 0 output: @@ -138,7 +138,7 @@ period: 2024 input: me_sales_tax_fairness_credit_eligible: true - ctc_qualifying_children: 0 + me_fairness_credit_qualifying_children: 0 filing_status: JOINT me_sales_and_property_tax_fairness_credit_income: 0 output: diff --git a/policyengine_us/tests/policy/baseline/gov/states/me/tax/income/integration.yaml b/policyengine_us/tests/policy/baseline/gov/states/me/tax/income/integration.yaml index b0f8b96acc2..c72d4c3b14f 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/me/tax/income/integration.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/me/tax/income/integration.yaml @@ -57,7 +57,7 @@ input: state_code: ME filing_status: JOINT - ctc_qualifying_children: 0 + me_fairness_credit_qualifying_children: 0 me_sales_and_property_tax_fairness_credit_income: 0 me_property_tax_fairness_credit_countable_rent_property_tax: 3_000 age_head: 64 @@ -71,7 +71,7 @@ input: state_code: ME filing_status: JOINT - ctc_qualifying_children: 0 + me_fairness_credit_qualifying_children: 0 me_sales_and_property_tax_fairness_credit_income: 0 me_property_tax_fairness_credit_countable_rent_property_tax: 3_000 age_head: 60 diff --git a/policyengine_us/tests/policy/baseline/gov/states/nc/tax/income/deductions/nc_child_deduction.yaml b/policyengine_us/tests/policy/baseline/gov/states/nc/tax/income/deductions/nc_child_deduction.yaml index f7491264cb2..392db18f429 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/nc/tax/income/deductions/nc_child_deduction.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/nc/tax/income/deductions/nc_child_deduction.yaml @@ -58,13 +58,14 @@ output: nc_child_deduction: 2_000 * 1 -# Regression guard for the #6374 NC resolution: NC is a static IRC-conformity state -# (conformed to the Code as of Jan 1, 2023, N.C. Gen. Stat. 105-228.90(b)(1b)), so it -# does NOT import the OBBBA (July 2025) filer-SSN gate on section 24. An ITIN filer -# whose qualifying child has a valid SSN still receives the NC child deduction, because -# nc_child_deduction keys on ctc_qualifying_children (child-SSN gate only), not the -# federal filer-SSN gate. Fails if a filer-SSN gate is ever propagated into the NC count. -- name: NC child deduction counts an SSN-holding child of an ITIN filer in 2025 +# G.S. 105-153.5(a1) allows the deduction for each qualifying child "for whom the +# taxpayer is allowed the federal tax credit" under section 24 of the Code. S.L. +# 2026-31, Section 12.(a), moved the Code date in G.S. 105-228.90(b)(7) from +# January 1, 2023 to July 5, 2025, which includes the One Big Beautiful Bill Act's +# filer social security number rule in IRC 24(h)(7)(A)(i). An ITIN filer whose child +# has a valid SSN is not allowed the federal credit for that child from 2025, so the +# NC child deduction is zero (issue #9403). +- name: NC child deduction excludes the SSN-holding child of an ITIN filer in 2025 period: 2025 input: people: @@ -84,6 +85,59 @@ household: members: [parent, child] state_code: NC + output: + ctc_qualifying_children: 0 + nc_child_deduction: 0 + +- name: NC child deduction counts the SSN-holding child of an ITIN filer in 2024 + # The filer social security number rule starts in 2025. + period: 2024 + input: + people: + parent: + age: 40 + ssn_card_type: OTHER_NON_CITIZEN + child: + age: 5 + is_tax_unit_dependent: true + ssn_card_type: CITIZEN + tax_units: + tax_unit: + members: [parent, child] + filing_status: HEAD_OF_HOUSEHOLD + adjusted_gross_income: 25_000 + households: + household: + members: [parent, child] + state_code: NC + output: + ctc_qualifying_children: 1 + nc_child_deduction: 3_000 + +- name: NC child deduction counts the child of a joint return where one spouse has an SSN in 2025 + # IRC 24(h)(7)(A)(i): on a joint return, the SSN of at least one spouse. + period: 2025 + input: + people: + head: + age: 40 + ssn_card_type: OTHER_NON_CITIZEN + spouse: + age: 40 + ssn_card_type: CITIZEN + child: + age: 5 + is_tax_unit_dependent: true + ssn_card_type: CITIZEN + tax_units: + tax_unit: + members: [head, spouse, child] + filing_status: JOINT + adjusted_gross_income: 35_000 + households: + household: + members: [head, spouse, child] + state_code: NC output: ctc_qualifying_children: 1 nc_child_deduction: 3_000 diff --git a/policyengine_us/tests/policy/baseline/gov/states/ny/tax/income/credits/ny_ctc_pre_2024.yaml b/policyengine_us/tests/policy/baseline/gov/states/ny/tax/income/credits/ny_ctc_pre_2024.yaml index d083f389a8d..24f9dba2d81 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/ny/tax/income/credits/ny_ctc_pre_2024.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/ny/tax/income/credits/ny_ctc_pre_2024.yaml @@ -97,3 +97,49 @@ output: ny_ctc: 330 ny_ctc_pre_2024: 330 + +# Tax Law 606(c-1) uses section 24 as it existed before Public Law 115-97, which +# requires the filer's identification number (IRC 24(e)), and the IT-213 +# instructions require "a valid Social Security number (SSN) or IRS individual +# taxpayer identification number (ITIN)" for the filer (issue #9403). +- name: Parent with an ITIN and a four-year-old child gets the credit in 2023 + period: 2023 + input: + people: + parent: + age: 30 + employment_income: 25_000 + ssn_card_type: NONE + child: + age: 4 + tax_units: + tax_unit: + members: [parent, child] + households: + household: + members: [parent, child] + state_code: NY + output: + ny_ctc_pre_2024: 330 + +- name: Parent without any TIN and a four-year-old child gets no credit in 2023 + period: 2023 + input: + people: + parent: + age: 30 + employment_income: 25_000 + ssn_card_type: NONE + has_tin: false + child: + age: 4 + tax_units: + tax_unit: + members: [parent, child] + households: + household: + members: [parent, child] + state_code: NY + output: + ny_ctc_pre_2024_eligible: false + ny_ctc_pre_2024: 0 diff --git a/policyengine_us/tests/policy/baseline/gov/states/ut/tax/income/credits/ut_ctc.yaml b/policyengine_us/tests/policy/baseline/gov/states/ut/tax/income/credits/ut_ctc.yaml index 38aabc2b227..054b0abca28 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/ut/tax/income/credits/ut_ctc.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/ut/tax/income/credits/ut_ctc.yaml @@ -397,3 +397,66 @@ state_code: UT output: ut_ctc: 500 +# Utah Code 59-10-1047 counts a child "with respect to whom the claimant is allowed +# to claim a tax credit under Section 24", and the Tax Commission requires a child +# who "qualifies for the federal child tax credit under IRC 24". From 2025 the +# federal credit is not allowed for any child of a filer without an SSN (IRC +# 24(h)(7)(A)(i)), so the Utah credit is zero (issue #9403). +- name: Head of household without an SSN and 1 child gets no Utah CTC in 2026 + period: 2026 + input: + people: + person1: + age: 35 + ssn_card_type: OTHER_NON_CITIZEN + tax_exempt_interest_income: 0 + person2: + age: 3 + is_tax_unit_dependent: true + ssn_card_type: CITIZEN + tax_units: + tax_unit: + members: + - person1 + - person2 + ut_total_income: 1000 + filing_status: HEAD_OF_HOUSEHOLD + ut_income_tax_before_non_refundable_credits: 1000000 + households: + household: + members: + - person1 + - person2 + state_code: UT + output: + ctc_qualifying_children: 0 + ut_ctc: 0 +- name: Head of household with an SSN and 1 child gets the Utah CTC in 2026 + period: 2026 + input: + people: + person1: + age: 35 + ssn_card_type: CITIZEN + tax_exempt_interest_income: 0 + person2: + age: 3 + is_tax_unit_dependent: true + ssn_card_type: CITIZEN + tax_units: + tax_unit: + members: + - person1 + - person2 + ut_total_income: 1000 + filing_status: HEAD_OF_HOUSEHOLD + ut_income_tax_before_non_refundable_credits: 1000000 + households: + household: + members: + - person1 + - person2 + state_code: UT + output: + ctc_qualifying_children: 1 + ut_ctc: 1000 diff --git a/policyengine_us/tests/policy/contrib/states/id/ctc/id_ctc_reform.yaml b/policyengine_us/tests/policy/contrib/states/id/ctc/id_ctc_reform.yaml index e191a130705..3a23b9ced25 100644 --- a/policyengine_us/tests/policy/contrib/states/id/ctc/id_ctc_reform.yaml +++ b/policyengine_us/tests/policy/contrib/states/id/ctc/id_ctc_reform.yaml @@ -9,7 +9,7 @@ absolute_error_margin: 0.01 input: state_code: ID - ctc_qualifying_children: 2 + id_ctc_qualifying_children: 2 id_income_tax_before_non_refundable_credits: 1_000 output: # id_ctc still computes 2 * 205 = 410 as a worksheet amount, but it is not @@ -23,7 +23,7 @@ input: gov.contrib.states.id.ctc.in_effect: true state_code: ID - ctc_qualifying_children: 2 + id_ctc_qualifying_children: 2 id_income_tax_before_non_refundable_credits: 1_000 output: # Revived list is [id_ctc]; applied = min(410, 1000) = 410. Refundable off. @@ -38,7 +38,7 @@ gov.contrib.states.id.ctc.in_effect: true gov.contrib.states.id.ctc.refundable.in_effect: true state_code: ID - ctc_qualifying_children: 2 + id_ctc_qualifying_children: 2 id_income_tax_before_non_refundable_credits: 0 output: # potential 410, nonrefundable 0 (no liability), unused 410, @@ -54,7 +54,7 @@ gov.contrib.states.id.ctc.refundable.in_effect: true gov.contrib.states.id.ctc.refundable.amount: 100 state_code: ID - ctc_qualifying_children: 2 + id_ctc_qualifying_children: 2 id_income_tax_before_non_refundable_credits: 0 output: # refund = min(410 unused, 100 * 2) = 200. @@ -68,7 +68,7 @@ gov.contrib.states.id.ctc.in_effect: true gov.states.id.tax.income.credits.ctc.amount: 300 state_code: ID - ctc_qualifying_children: 2 + id_ctc_qualifying_children: 2 id_income_tax_before_non_refundable_credits: 1_000 output: id_ctc: 600 diff --git a/policyengine_us/tests/policy/contrib/states/test_id_ga_ctc_reform_activation.py b/policyengine_us/tests/policy/contrib/states/test_id_ga_ctc_reform_activation.py index 91f4d035358..e981168299f 100644 --- a/policyengine_us/tests/policy/contrib/states/test_id_ga_ctc_reform_activation.py +++ b/policyengine_us/tests/policy/contrib/states/test_id_ga_ctc_reform_activation.py @@ -78,11 +78,17 @@ def modify(parameters): "parent": {"age": {"2026": 30, "2028": 30}}, "child1": { "age": {"2026": 2, "2028": 4}, - "ctc_qualifying_child": {"2026": True, "2028": True}, + "ctc_qualifying_child_ignoring_filer_identification": { + "2026": True, + "2028": True, + }, }, "child2": { "age": {"2026": 4, "2028": 6}, - "ctc_qualifying_child": {"2026": True, "2028": True}, + "ctc_qualifying_child_ignoring_filer_identification": { + "2026": True, + "2028": True, + }, }, }, "tax_units": { diff --git a/policyengine_us/variables/gov/irs/credits/ctc/maximum/ctc_qualifying_child.py b/policyengine_us/variables/gov/irs/credits/ctc/maximum/ctc_qualifying_child.py index f8906588f5d..d588d1d4293 100644 --- a/policyengine_us/variables/gov/irs/credits/ctc/maximum/ctc_qualifying_child.py +++ b/policyengine_us/variables/gov/irs/credits/ctc/maximum/ctc_qualifying_child.py @@ -5,31 +5,33 @@ class ctc_qualifying_child(Variable): value_type = bool entity = Person label = "CTC-qualifying child" - documentation = "Child qualifies for the Child Tax Credit" + documentation = ( + "Child qualifies for the Child Tax Credit, including the filer " + "identification requirements" + ) definition_period = YEAR defined_for = "is_tax_unit_dependent" reference = ( - # Subsections (a) and (c). "https://www.law.cornell.edu/uscode/text/26/24#c", - "https://www.law.cornell.edu/uscode/text/26/152#b_1", - # Publication 501, Dependent Taxpayer Test. - "https://www.irs.gov/pub/irs-prior/p501--2025.pdf#page=11", + "https://www.law.cornell.edu/uscode/text/26/24#e_2", + "https://www.law.cornell.edu/uscode/text/26/24#h_7", + # 2025 Instructions for Schedule 8812, SSN Required Before the Due + # Date of Your Return To Claim the CTC and ACTC. + "https://www.irs.gov/pub/irs-pdf/i1040s8.pdf#page=1", ) def formula(person, period, parameters): - age = person("age", period) - p = parameters(period).gov.irs.credits.ctc - age_limit = p.amount.base.thresholds[-1] - age_eligible = age < age_limit - meets_identification_requirements = person( - "meets_ctc_child_identification_requirements", period + qualifying_child = person( + "ctc_qualifying_child_ignoring_filer_identification", period ) - # IRC 24(a) allows the credit only for a qualifying child for whom the - # taxpayer is allowed a deduction under section 151. Under IRC - # 152(b)(1) a taxpayer who can be claimed as a dependent is treated as - # having no dependents, and on a joint return neither spouse may be - # claimable (Publication 501, Dependent Taxpayer Test). - filer_is_dependent = person.tax_unit( - "head_or_spouse_is_dependent_elsewhere_without_filing_exception", period + # IRC 24(h)(7)(A) allows no credit "with respect to any qualifying + # child" unless the return includes the taxpayer's social security + # number (on a joint return, at least one spouse's), and IRC 24(e)(2) + # allows no credit if the taxpayer's identification number was issued + # after the due date. A child whose filer fails these tests is not + # counted; IRC 24(h)(4)(C) moves the child to the credit for other + # dependents. + filer_meets_identification_requirements = person.tax_unit( + "filer_meets_child_ctc_identification_requirements", period ) - return age_eligible & meets_identification_requirements & ~filer_is_dependent + return qualifying_child & filer_meets_identification_requirements diff --git a/policyengine_us/variables/gov/irs/credits/ctc/maximum/ctc_qualifying_child_ignoring_filer_identification.py b/policyengine_us/variables/gov/irs/credits/ctc/maximum/ctc_qualifying_child_ignoring_filer_identification.py new file mode 100644 index 00000000000..4d911edf14a --- /dev/null +++ b/policyengine_us/variables/gov/irs/credits/ctc/maximum/ctc_qualifying_child_ignoring_filer_identification.py @@ -0,0 +1,41 @@ +from policyengine_us.model_api import * + + +class ctc_qualifying_child_ignoring_filer_identification(Variable): + value_type = bool + entity = Person + label = "CTC-qualifying child, ignoring the filer identification requirements" + documentation = ( + "Child meets the Child Tax Credit qualifying child tests, whether or " + "not the filer meets the taxpayer identification requirements of IRC " + "24(e)(2) and 24(h)(7)(A)(i). State credits that adopt the IRC 24(c) " + "definition without requiring the federal credit to be allowed use " + "this; ctc_qualifying_child adds the filer test." + ) + definition_period = YEAR + defined_for = "is_tax_unit_dependent" + reference = ( + # Subsections (a) and (c). + "https://www.law.cornell.edu/uscode/text/26/24#c", + "https://www.law.cornell.edu/uscode/text/26/152#b_1", + # Publication 501, Dependent Taxpayer Test. + "https://www.irs.gov/pub/irs-prior/p501--2025.pdf#page=11", + ) + + def formula(person, period, parameters): + age = person("age", period) + p = parameters(period).gov.irs.credits.ctc + age_limit = p.amount.base.thresholds[-1] + age_eligible = age < age_limit + meets_identification_requirements = person( + "meets_ctc_child_identification_requirements", period + ) + # IRC 24(a) allows the credit only for a qualifying child for whom the + # taxpayer is allowed a deduction under section 151. Under IRC + # 152(b)(1) a taxpayer who can be claimed as a dependent is treated as + # having no dependents, and on a joint return neither spouse may be + # claimable (Publication 501, Dependent Taxpayer Test). + filer_is_dependent = person.tax_unit( + "head_or_spouse_is_dependent_elsewhere_without_filing_exception", period + ) + return age_eligible & meets_identification_requirements & ~filer_is_dependent diff --git a/policyengine_us/variables/gov/irs/credits/ctc/maximum/ctc_qualifying_children.py b/policyengine_us/variables/gov/irs/credits/ctc/maximum/ctc_qualifying_children.py index 457bf523b5f..fe7cadb70ef 100644 --- a/policyengine_us/variables/gov/irs/credits/ctc/maximum/ctc_qualifying_children.py +++ b/policyengine_us/variables/gov/irs/credits/ctc/maximum/ctc_qualifying_children.py @@ -5,8 +5,15 @@ class ctc_qualifying_children(Variable): value_type = int entity = TaxUnit label = "CTC-qualifying children" - documentation = "Count of children that qualify for the Child Tax Credit" + documentation = ( + "Count of children for whom the filer can claim the Child Tax Credit. " + "Children whose filer fails the identification requirements of IRC " + "24(e)(2) or 24(h)(7)(A)(i) are not counted." + ) definition_period = YEAR - reference = "https://www.law.cornell.edu/uscode/text/26/24#c" + reference = ( + "https://www.law.cornell.edu/uscode/text/26/24#c", + "https://www.law.cornell.edu/uscode/text/26/24#h_7", + ) adds = ["ctc_qualifying_child"] diff --git a/policyengine_us/variables/gov/irs/credits/ctc/maximum/individual/ctc_child_individual_maximum.py b/policyengine_us/variables/gov/irs/credits/ctc/maximum/individual/ctc_child_individual_maximum.py index cc983dcb5a6..4d7d52151b6 100644 --- a/policyengine_us/variables/gov/irs/credits/ctc/maximum/individual/ctc_child_individual_maximum.py +++ b/policyengine_us/variables/gov/irs/credits/ctc/maximum/individual/ctc_child_individual_maximum.py @@ -17,11 +17,7 @@ class ctc_child_individual_maximum(Variable): def formula(person, period, parameters): age = person("age", period) + # ctc_qualifying_child includes the filer identification requirements. qualifying_child = person("ctc_qualifying_child", period) - filer_meets_child_ctc_id_requirements = person.tax_unit( - "filer_meets_child_ctc_identification_requirements", period - ) p = parameters(period).gov.irs.credits.ctc.amount - return ( - qualifying_child * filer_meets_child_ctc_id_requirements * p.base.calc(age) - ) + return qualifying_child * p.base.calc(age) diff --git a/policyengine_us/variables/gov/irs/credits/recovery_rebate_credit/rrc_cares_qualifying_children_with_valid_ssn.py b/policyengine_us/variables/gov/irs/credits/recovery_rebate_credit/rrc_cares_qualifying_children_with_valid_ssn.py index ba96dc6121a..21429f389d2 100644 --- a/policyengine_us/variables/gov/irs/credits/recovery_rebate_credit/rrc_cares_qualifying_children_with_valid_ssn.py +++ b/policyengine_us/variables/gov/irs/credits/recovery_rebate_credit/rrc_cares_qualifying_children_with_valid_ssn.py @@ -7,12 +7,18 @@ class rrc_cares_qualifying_children_with_valid_ssn(Variable): definition_period = YEAR label = "Count of CTC qualifying children with valid SSN for CARES RRC" reference = ( + "https://www.law.cornell.edu/uscode/text/26/6428#a_2", "https://www.law.cornell.edu/uscode/text/26/6428#g_1_C", "https://www.law.cornell.edu/uscode/text/26/6428A#g_3", ) def formula(tax_unit, period, parameters): person = tax_unit.members - is_ctc_qualifying_child = person("ctc_qualifying_child", period) + # IRC 6428(a)(2) counts each "qualifying child (within the meaning of + # section 24(c))", so the CTC filer identification requirements do not + # apply; IRC 6428(g) sets the rebate's own identification rules. + is_ctc_qualifying_child = person( + "ctc_qualifying_child_ignoring_filer_identification", period + ) has_valid_ssn = person("meets_eitc_identification_requirements", period) return tax_unit.sum(is_ctc_qualifying_child & has_valid_ssn) diff --git a/policyengine_us/variables/gov/states/id/tax/income/credits/id_ctc.py b/policyengine_us/variables/gov/states/id/tax/income/credits/id_ctc.py index 032866e9861..a3d0be5cb82 100644 --- a/policyengine_us/variables/gov/states/id/tax/income/credits/id_ctc.py +++ b/policyengine_us/variables/gov/states/id/tax/income/credits/id_ctc.py @@ -14,18 +14,7 @@ class id_ctc(Variable): ) def formula(tax_unit, period, parameters): - # Get relevant parameter subtree. p = parameters(period).gov.states.id.tax.income.credits.ctc - # "the term "qualifying child" has the meaning as defined in section 24(c) of the Internal Revenue Code." - # IRC 24(c) defines eligible children under the federal CTC. Its age - # test is under 17; the 2021 federal expansion to age 17 is in IRC - # 24(i)(1), so Idaho does not count those children in 2021. - person = tax_unit.members - over_age = person("ctc_qualifying_child", period) & ( - person("age", period) >= p.ineligible_age - ) - eligible_children = tax_unit("ctc_qualifying_children", period) - tax_unit.sum( - over_age - ) + eligible_children = tax_unit("id_ctc_qualifying_children", period) # Multiply by the amount per child. return eligible_children * p.amount diff --git a/policyengine_us/variables/gov/states/id/tax/income/credits/id_ctc_qualifying_children.py b/policyengine_us/variables/gov/states/id/tax/income/credits/id_ctc_qualifying_children.py new file mode 100644 index 00000000000..a00bd833689 --- /dev/null +++ b/policyengine_us/variables/gov/states/id/tax/income/credits/id_ctc_qualifying_children.py @@ -0,0 +1,33 @@ +from policyengine_us.model_api import * + + +class id_ctc_qualifying_children(Variable): + value_type = int + entity = TaxUnit + label = "Idaho Child Tax Credit qualifying children" + definition_period = YEAR + defined_for = StateCode.ID + reference = ( + "https://legislature.idaho.gov/statutesrules/idstat/Title63/T63CH30/SECT63-3029L/", + # 2025 Idaho Form 40 instructions, Line 24 Idaho Child Tax Credit + # Worksheet. + "https://tax.idaho.gov/wp-content/uploads/forms/EIN00046/EIN00046_03-02-2026.pdf#page=11", + ) + + def formula(tax_unit, period, parameters): + p = parameters(period).gov.states.id.tax.income.credits.ctc + person = tax_unit.members + # Idaho Code 63-3029L(1): "the term "qualifying child" has the meaning + # as defined in section 24(c) of the Internal Revenue Code." Idaho + # does not require the federal credit to be allowed, so a child whose + # filer fails the federal identification requirements of IRC 24(e)(2) + # or 24(h)(7)(A)(i) still counts. The Form 40 instructions list only + # "Your qualifying child" and "Age 16 or under". + qualifying_child = person( + "ctc_qualifying_child_ignoring_filer_identification", period + ) + # IRC 24(c) defines eligible children under the federal CTC. Its age + # test is under 17; the 2021 federal expansion to age 17 is in IRC + # 24(i)(1), so Idaho does not count those children in 2021. + age_eligible = person("age", period) < p.ineligible_age + return tax_unit.sum(qualifying_child & age_eligible) diff --git a/policyengine_us/variables/gov/states/me/tax/income/credits/fairness/me_fairness_credit_qualifying_children.py b/policyengine_us/variables/gov/states/me/tax/income/credits/fairness/me_fairness_credit_qualifying_children.py new file mode 100644 index 00000000000..ef1511e46c4 --- /dev/null +++ b/policyengine_us/variables/gov/states/me/tax/income/credits/fairness/me_fairness_credit_qualifying_children.py @@ -0,0 +1,45 @@ +from policyengine_us.model_api import * + + +class me_fairness_credit_qualifying_children(Variable): + value_type = int + entity = TaxUnit + label = "Maine sales and property tax fairness credit qualifying children" + documentation = ( + "Number of qualifying children for whom the filer can claim a federal " + "credit under IRC section 24 (the Child Tax Credit or the credit for " + "other dependents), for the Maine sales tax and property tax fairness " + "credits." + ) + definition_period = YEAR + defined_for = StateCode.ME + reference = ( + # 36 MRSA 5213-A(1)(A-1)(2). + "https://legislature.maine.gov/statutes/36/title36sec5213-A.html", + # 36 MRSA 5219-KK(1)(A-1)(2) and (3). + "https://legislature.maine.gov/statutes/36/title36sec5219-KK.html", + # 2025 Instructions for Schedule 8812, TIN Required by Due Date of + # Your Return To Claim the ODC, and Credit for Other Dependents. + # PDF pages 1-2. + "https://www.irs.gov/pub/irs-pdf/i1040s8.pdf#page=1", + ) + + def formula(tax_unit, period, parameters): + person = tax_unit.members + # 36 MRSA 5213-A(1)(A-1)(2) and 5219-KK(1)(A-1)(2)-(3) count each + # "qualifying child or dependent" for whom the filer "can claim the + # federal child tax credit pursuant to the Code, Section 24". Section + # 24 includes the credit for other dependents of IRC 24(h)(4), and IRC + # 24(h)(4)(C) gives that credit for a child whose Child Tax Credit is + # denied by the social security number rule of IRC 24(h)(7). So a + # child whose filer fails the Child Tax Credit identification test + # still counts when the filer meets the taxpayer identification test + # for the credit for other dependents. Dependents who are not CTC + # qualifying children are not counted here. + qualifying_child = person( + "ctc_qualifying_child_ignoring_filer_identification", period + ) + filer_meets_identification_requirements = tax_unit( + "filer_meets_ctc_identification_requirements", period + ) + return tax_unit.sum(qualifying_child) * filer_meets_identification_requirements diff --git a/policyengine_us/variables/gov/states/me/tax/income/credits/fairness/property_tax_fairness_credit/me_property_tax_fairness_credit_benefit_base.py b/policyengine_us/variables/gov/states/me/tax/income/credits/fairness/property_tax_fairness_credit/me_property_tax_fairness_credit_benefit_base.py index 7798ad88eee..8280b0063c2 100644 --- a/policyengine_us/variables/gov/states/me/tax/income/credits/fairness/property_tax_fairness_credit/me_property_tax_fairness_credit_benefit_base.py +++ b/policyengine_us/variables/gov/states/me/tax/income/credits/fairness/property_tax_fairness_credit/me_property_tax_fairness_credit_benefit_base.py @@ -11,7 +11,7 @@ class me_property_tax_fairness_credit_benefit_base(Variable): def formula(tax_unit, period, parameters): p = parameters(period).gov.states.me.tax.income.credits.fairness.property_tax - dependents = tax_unit("ctc_qualifying_children", period) + dependents = tax_unit("me_fairness_credit_qualifying_children", period) filing_status = tax_unit("filing_status", period) filing_statuses = filing_status.possible_values single = filing_status == filing_statuses.SINGLE diff --git a/policyengine_us/variables/gov/states/me/tax/income/credits/fairness/sales_tax_fairness_credit/me_sales_tax_fairness_credit.py b/policyengine_us/variables/gov/states/me/tax/income/credits/fairness/sales_tax_fairness_credit/me_sales_tax_fairness_credit.py index c0aa36b4b3b..02a3d9c3ff3 100644 --- a/policyengine_us/variables/gov/states/me/tax/income/credits/fairness/sales_tax_fairness_credit/me_sales_tax_fairness_credit.py +++ b/policyengine_us/variables/gov/states/me/tax/income/credits/fairness/sales_tax_fairness_credit/me_sales_tax_fairness_credit.py @@ -14,7 +14,7 @@ class me_sales_tax_fairness_credit(Variable): def formula(tax_unit, period, parameters): p = parameters(period).gov.states.me.tax.income.credits.fairness.sales_tax - children = tax_unit("ctc_qualifying_children", period) + children = tax_unit("me_fairness_credit_qualifying_children", period) filing_status = tax_unit("filing_status", period) status = filing_status.possible_values base = p.amount.base[filing_status] diff --git a/policyengine_us/variables/gov/states/nc/tax/income/deductions/nc_child_deduction.py b/policyengine_us/variables/gov/states/nc/tax/income/deductions/nc_child_deduction.py index f6f8f50c5ed..c87a58b61e2 100644 --- a/policyengine_us/variables/gov/states/nc/tax/income/deductions/nc_child_deduction.py +++ b/policyengine_us/variables/gov/states/nc/tax/income/deductions/nc_child_deduction.py @@ -8,6 +8,11 @@ class nc_child_deduction(Variable): unit = USD definition_period = YEAR defined_for = StateCode.NC + reference = ( + "https://www.ncleg.gov/EnactedLegislation/Statutes/HTML/BySection/Chapter_105/GS_105-153.5.html", + # S.L. 2026-31, Section 12.(a), amending G.S. 105-228.90(b)(7). + "https://www.ncleg.gov/EnactedLegislation/SessionLaws/PDF/2025-2026/SL2026-31.pdf#page=42", + ) def formula(tax_unit, period, parameters): # calculate deduction amount per eligible child @@ -31,7 +36,13 @@ def formula(tax_unit, period, parameters): p.head_of_household.calc(federal_agi, right=True), ], ) - # calculate number of eligible children + # G.S. 105-153.5(a1) allows the deduction "for each qualifying child + # for whom the taxpayer is allowed the federal tax credit" under + # section 24 of the Code. S.L. 2026-31 moved the Code date in + # G.S. 105-228.90(b)(7) from January 1, 2023 to July 5, 2025, so the + # filer social security number rule that the One Big Beautiful Bill + # Act added to IRC 24(h)(7) applies; ctc_qualifying_children counts + # only children for whom the federal credit is allowed. children = tax_unit("ctc_qualifying_children", period) # calculate NC child deduction return amount * children diff --git a/policyengine_us/variables/gov/states/ny/tax/income/credits/ctc/ny_ctc_pre_2024_eligible.py b/policyengine_us/variables/gov/states/ny/tax/income/credits/ctc/ny_ctc_pre_2024_eligible.py index 6506de0a399..3381ec65067 100644 --- a/policyengine_us/variables/gov/states/ny/tax/income/credits/ctc/ny_ctc_pre_2024_eligible.py +++ b/policyengine_us/variables/gov/states/ny/tax/income/credits/ctc/ny_ctc_pre_2024_eligible.py @@ -11,7 +11,10 @@ class ny_ctc_pre_2024_eligible(Variable): label = "NY CTC pre-2024 eligibility" documentation = "Whether the tax unit is eligible for NY CTC under pre-2024 rules" definition_period = YEAR - reference = "https://www.nysenate.gov/legislation/laws/TAX/606" # (c-1) + reference = ( + "https://www.nysenate.gov/legislation/laws/TAX/606", # (c-1) + "https://www.tax.ny.gov/forms/html-instructions/2023/it/it213i-2023.htm", + ) defined_for = StateCode.NY def formula(tax_unit, period, parameters): @@ -24,7 +27,11 @@ def formula(tax_unit, period, parameters): person = tax_unit.members age = person("age", period) - # Check if we have qualifying children + # Check if we have qualifying children. ctc_qualifying_child includes + # the filer identification test, which under the pre-TCJA rules is an + # SSN or ITIN for each filer (IRC 24(e)); the IT-213 instructions + # likewise require "a valid Social Security number (SSN) or IRS + # individual taxpayer identification number (ITIN)" for the filer. if not p.pre_tcja: qualifies_for_federal_ctc = person("ctc_qualifying_child", period) else: From 7c01e3278b0fc2dad2a116bf7422ca32797d4ea6 Mon Sep 17 00:00:00 2001 From: PavelMakarchuk Date: Mon, 19 Oct 2026 14:04:07 -0400 Subject: [PATCH 2/3] Use the IRC 24(c) child test in the AWRA rebate and fix a reform test The American Worker Rebate Act counts "qualifying children (within the meaning of section 24(c))", like IRC 6428(a)(2), so its child amount uses ctc_qualifying_child_ignoring_filer_identification; the bill's own identification rules stay in american_worker_tax_rebate_eligible. The refundable credit conversion clamp test set meets_ctc_identification_requirements only on the child, which left the filer at the default false and now fails the filer SSN test. Set it on the filer too, as the test intends a CTC-qualifying child. Co-Authored-By: Claude Opus 5.5 --- .../congress/hawley/awra/american_worker_rebate_act.py | 5 ++++- .../refundable_credit_conversion/dependent_definition.yaml | 4 ++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/policyengine_us/reforms/congress/hawley/awra/american_worker_rebate_act.py b/policyengine_us/reforms/congress/hawley/awra/american_worker_rebate_act.py index 8218bba43c5..3c7cdcbfdcc 100644 --- a/policyengine_us/reforms/congress/hawley/awra/american_worker_rebate_act.py +++ b/policyengine_us/reforms/congress/hawley/awra/american_worker_rebate_act.py @@ -84,7 +84,10 @@ class american_worker_tax_rebate_child_amount(Variable): "The tax rebate amount for children, under the American Worker Rebate Act." ) definition_period = YEAR - defined_for = "ctc_qualifying_child" + # The bill counts "qualifying children (within the meaning of section + # 24(c))", so the CTC filer identification requirements do not apply; + # american_worker_tax_rebate_eligible applies the bill's own rules. + defined_for = "ctc_qualifying_child_ignoring_filer_identification" adds = ["gov.contrib.congress.hawley.awra.amount.non_joint"] diff --git a/policyengine_us/tests/policy/contrib/refundable_credit_conversion/dependent_definition.yaml b/policyengine_us/tests/policy/contrib/refundable_credit_conversion/dependent_definition.yaml index 19174c7bdf4..4563c1fee62 100644 --- a/policyengine_us/tests/policy/contrib/refundable_credit_conversion/dependent_definition.yaml +++ b/policyengine_us/tests/policy/contrib/refundable_credit_conversion/dependent_definition.yaml @@ -128,6 +128,10 @@ people: filer: age: 38 + # The filer meets the CTC filer SSN requirement, so the child is + # CTC-qualifying (an input set only on the child would default the + # filer to false). + meets_ctc_identification_requirements: true child: age: 5 meets_eitc_identification_requirements: false From 629fc123597622b86e256d195c6ef6cbe957fff2 Mon Sep 17 00:00:00 2001 From: PavelMakarchuk Date: Mon, 19 Oct 2026 14:30:41 -0400 Subject: [PATCH 3/3] Count ODC dependents for the Maine fairness credits 36 MRSA 5213-A(1)(A-1)(2) and 5219-KK(1)(A-1)(2)-(3) count each qualifying child or dependent for whom the filer can claim the federal credit under section 24, and Form 1040ME line 13a counts dependents for the Child Tax Credit or the credit for other dependents. Count each dependent with a positive section 24 amount (ctc_individual_maximum), so 17-year-olds, children with an ITIN and adult dependents with a TIN count. Co-Authored-By: Claude Opus 5.5 --- ...me-fairness-credit-odc-dependents.fixed.md | 1 + ...e_fairness_credit_qualifying_children.yaml | 185 +++++++++++++++++- .../me_fairness_credit_qualifying_children.py | 42 ++-- 3 files changed, 206 insertions(+), 22 deletions(-) create mode 100644 changelog.d/me-fairness-credit-odc-dependents.fixed.md diff --git a/changelog.d/me-fairness-credit-odc-dependents.fixed.md b/changelog.d/me-fairness-credit-odc-dependents.fixed.md new file mode 100644 index 00000000000..f453cdd17e3 --- /dev/null +++ b/changelog.d/me-fairness-credit-odc-dependents.fixed.md @@ -0,0 +1 @@ +Count dependents who get the federal credit for other dependents, not only Child Tax Credit children, for the Maine sales tax and property tax fairness credits. diff --git a/policyengine_us/tests/policy/baseline/gov/states/me/tax/income/credits/fairness/me_fairness_credit_qualifying_children.yaml b/policyengine_us/tests/policy/baseline/gov/states/me/tax/income/credits/fairness/me_fairness_credit_qualifying_children.yaml index e9507a009cf..55fe4b14c1d 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/me/tax/income/credits/fairness/me_fairness_credit_qualifying_children.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/me/tax/income/credits/fairness/me_fairness_credit_qualifying_children.yaml @@ -1,8 +1,10 @@ # 36 MRSA 5213-A(1)(A-1)(2) and 5219-KK(1)(A-1)(2)-(3) count each "qualifying child # or dependent" for whom the filer can claim the federal credit under section 24, -# which includes the credit for other dependents. A child whose filer fails the -# Child Tax Credit SSN rule gets that credit (IRC 24(h)(4)(C)) if the filer has an -# SSN or ITIN, so the child still counts (issue #9403). +# which includes the credit for other dependents. Form 1040ME line 13a counts each +# dependent for the Child Tax Credit or the credit for other dependents. A child +# whose filer fails the Child Tax Credit SSN rule gets that credit (IRC 24(h)(4)(C)) +# if the filer has an SSN or ITIN, so the child still counts (issue #9403). Older +# dependents and children without an SSN count when they have a TIN. - name: Maine counts the child of a joint return where neither spouse has an SSN in 2025 period: 2025 input: @@ -86,3 +88,180 @@ ctc_qualifying_children: 1 me_fairness_credit_qualifying_children: 1 me_sales_tax_fairness_credit: 250 + +- name: Maine counts a 17-year-old dependent who gets the credit for other dependents in 2025 + period: 2025 + input: + people: + head: + age: 45 + spouse: + age: 45 + child: + age: 17 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [head, spouse, child] + filing_status: JOINT + me_sales_and_property_tax_fairness_credit_income: 10_000 + households: + household: + members: [head, spouse, child] + state_code: ME + output: + ctc_qualifying_children: 0 + me_fairness_credit_qualifying_children: 1 + # 2025 Schedule PTFC/STFC line 8 table, joint, line 13a is 1: $4,050. + me_property_tax_fairness_credit_benefit_base: 4_050 + # 2025 Schedule PTFC/STFC line 17 table, joint, $0-$50,950, line 13a is 1: $250. + me_sales_tax_fairness_credit: 250 + +- name: Maine counts a child with an ITIN but no SSN in 2025 + # IRC 24(h)(7) denies the Child Tax Credit; IRC 24(h)(4)(C) allows the credit for + # other dependents. + period: 2025 + input: + people: + head: + age: 35 + spouse: + age: 35 + child: + age: 8 + is_tax_unit_dependent: true + ssn_card_type: OTHER_NON_CITIZEN + tax_units: + tax_unit: + members: [head, spouse, child] + filing_status: JOINT + me_sales_and_property_tax_fairness_credit_income: 10_000 + households: + household: + members: [head, spouse, child] + state_code: ME + output: + ctc_qualifying_children: 0 + me_fairness_credit_qualifying_children: 1 + me_sales_tax_fairness_credit: 250 + +- name: Maine counts an adult dependent with a child for a head of household in 2025 + period: 2025 + input: + people: + head: + age: 45 + adult_dependent: + age: 20 + is_tax_unit_dependent: true + child: + age: 10 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [head, adult_dependent, child] + filing_status: HEAD_OF_HOUSEHOLD + me_sales_and_property_tax_fairness_credit_income: 10_000 + households: + household: + members: [head, adult_dependent, child] + state_code: ME + output: + ctc_qualifying_children: 1 + me_fairness_credit_qualifying_children: 2 + # 2025 Schedule PTFC/STFC line 8 table, head of household, line 13a is more + # than 1: $4,050. + me_property_tax_fairness_credit_benefit_base: 4_050 + # 2025 Schedule PTFC/STFC line 17 table, head of household, $0-$38,200, line + # 13a is 2: $250. + me_sales_tax_fairness_credit: 250 + +- name: Maine does not count a dependent without any TIN in 2025 + # The credit for other dependents requires the dependent's SSN, ITIN or ATIN. + period: 2025 + input: + people: + head: + age: 45 + spouse: + age: 45 + child: + age: 17 + is_tax_unit_dependent: true + ssn_card_type: NONE + has_tin: false + tax_units: + tax_unit: + members: [head, spouse, child] + filing_status: JOINT + me_sales_and_property_tax_fairness_credit_income: 10_000 + households: + household: + members: [head, spouse, child] + state_code: ME + output: + ctc_qualifying_children: 0 + me_fairness_credit_qualifying_children: 0 + me_property_tax_fairness_credit_benefit_base: 3_300 + me_sales_tax_fairness_credit: 215 + +- name: Maine counts the Child Tax Credit child and the older dependent with a TIN in 2025 + period: 2025 + input: + people: + head: + age: 45 + spouse: + age: 45 + child: + age: 8 + is_tax_unit_dependent: true + teen: + age: 17 + is_tax_unit_dependent: true + adult_dependent: + age: 19 + is_tax_unit_dependent: true + ssn_card_type: NONE + has_tin: false + tax_units: + tax_unit: + members: [head, spouse, child, teen, adult_dependent] + filing_status: JOINT + me_sales_and_property_tax_fairness_credit_income: 10_000 + households: + household: + members: [head, spouse, child, teen, adult_dependent] + state_code: ME + output: + ctc_qualifying_children: 1 + me_fairness_credit_qualifying_children: 2 + # 2025 Schedule PTFC/STFC line 17 table, joint, $0-$50,950, line 13a is 2+: $280. + me_sales_tax_fairness_credit: 280 + +- name: Maine counts only Child Tax Credit children before the credit for other dependents in 2017 + # IRC 24(h)(4) applies from 2018, so a 17-year-old dependent does not count in 2017. + period: 2017 + input: + people: + head: + age: 45 + spouse: + age: 45 + child: + age: 8 + is_tax_unit_dependent: true + teen: + age: 17 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [head, spouse, child, teen] + filing_status: JOINT + households: + household: + members: [head, spouse, child, teen] + state_code: ME + output: + ctc_qualifying_children: 1 + me_fairness_credit_qualifying_children: 1 diff --git a/policyengine_us/variables/gov/states/me/tax/income/credits/fairness/me_fairness_credit_qualifying_children.py b/policyengine_us/variables/gov/states/me/tax/income/credits/fairness/me_fairness_credit_qualifying_children.py index ef1511e46c4..37cdda6e42d 100644 --- a/policyengine_us/variables/gov/states/me/tax/income/credits/fairness/me_fairness_credit_qualifying_children.py +++ b/policyengine_us/variables/gov/states/me/tax/income/credits/fairness/me_fairness_credit_qualifying_children.py @@ -4,12 +4,12 @@ class me_fairness_credit_qualifying_children(Variable): value_type = int entity = TaxUnit - label = "Maine sales and property tax fairness credit qualifying children" + label = "Maine sales and property tax fairness credit qualifying children and dependents" documentation = ( - "Number of qualifying children for whom the filer can claim a federal " - "credit under IRC section 24 (the Child Tax Credit or the credit for " - "other dependents), for the Maine sales tax and property tax fairness " - "credits." + "Number of qualifying children and dependents for whom the filer can " + "claim a federal credit under IRC section 24 (the Child Tax Credit or " + "the credit for other dependents), for the Maine sales tax and " + "property tax fairness credits." ) definition_period = YEAR defined_for = StateCode.ME @@ -18,6 +18,12 @@ class me_fairness_credit_qualifying_children(Variable): "https://legislature.maine.gov/statutes/36/title36sec5213-A.html", # 36 MRSA 5219-KK(1)(A-1)(2) and (3). "https://legislature.maine.gov/statutes/36/title36sec5219-KK.html", + # 2025 Form 1040ME Instructions, line 13a, Property Tax Fairness + # Credit and Sales Tax Fairness Credit. PDF pages 5, 11. + "https://www.maine.gov/revenue/sites/maine.gov.revenue/files/inline-files/25_1040me_gen_instr_w_cover_pg.pdf#page=5", + # 2025 Schedule PTFC/STFC, line 8, line 17 and instructions. + # PDF pages 2-4. + "https://www.maine.gov/revenue/sites/maine.gov.revenue/files/inline-files/25_1040me_sch_ptfc_fillable.pdf#page=2", # 2025 Instructions for Schedule 8812, TIN Required by Due Date of # Your Return To Claim the ODC, and Credit for Other Dependents. # PDF pages 1-2. @@ -29,17 +35,15 @@ def formula(tax_unit, period, parameters): # 36 MRSA 5213-A(1)(A-1)(2) and 5219-KK(1)(A-1)(2)-(3) count each # "qualifying child or dependent" for whom the filer "can claim the # federal child tax credit pursuant to the Code, Section 24". Section - # 24 includes the credit for other dependents of IRC 24(h)(4), and IRC - # 24(h)(4)(C) gives that credit for a child whose Child Tax Credit is - # denied by the social security number rule of IRC 24(h)(7). So a - # child whose filer fails the Child Tax Credit identification test - # still counts when the filer meets the taxpayer identification test - # for the credit for other dependents. Dependents who are not CTC - # qualifying children are not counted here. - qualifying_child = person( - "ctc_qualifying_child_ignoring_filer_identification", period - ) - filer_meets_identification_requirements = tax_unit( - "filer_meets_ctc_identification_requirements", period - ) - return tax_unit.sum(qualifying_child) * filer_meets_identification_requirements + # 24 includes the credit for other dependents of IRC 24(h)(4), and the + # Form 1040ME line 13a instructions count each dependent for whom the + # filer is eligible to claim "the federal child tax credit or the + # credit for other dependents". So a dependent counts when either + # credit is allowed for that person before the phase-out: a child + # under 17, a child with an ITIN but no SSN, a child whose filer fails + # the Child Tax Credit SSN rule (IRC 24(h)(4)(C)), or an older + # dependent. The dependent and the filer still need a TIN (IRC 24(e)). + # The credit for other dependents starts in 2018, so earlier years + # count only Child Tax Credit children. + section_24_amount = person("ctc_individual_maximum", period) + return tax_unit.sum(section_24_amount > 0)