From 6342857cf317a12abbe99bab1a52503cb27bade4 Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Tue, 25 Nov 2025 08:34:15 -0500 Subject: [PATCH] Extend AMT kiddie tax to include full-time students under age 24 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Per IRC 1(g)(2)(A), the kiddie tax applies to children who meet the age requirements of Section 152(c)(3), which includes full-time students under age 24. Previously, the AMT kiddie tax only checked if the filer was under age 19. Changes: - Updated amt_kiddie_tax_applies to check student status for ages 19-23 - Computes head/spouse student status inline from person-level data - Added tests for student scenarios Closes #3909 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- changelog_entry.yaml | 4 + .../kiddie_tax/amt_kiddie_tax_applies.yaml | 84 ++++++++++++++++++- .../kiddie_tax/amt_kiddie_tax_applies.py | 37 +++++++- uv.lock | 2 +- 4 files changed, 119 insertions(+), 8 deletions(-) diff --git a/changelog_entry.yaml b/changelog_entry.yaml index e69de29bb2d..58db677ca62 100644 --- a/changelog_entry.yaml +++ b/changelog_entry.yaml @@ -0,0 +1,4 @@ +- bump: patch + changes: + changed: + - Extend AMT kiddie tax to include full-time students under age 24. diff --git a/policyengine_us/tests/policy/baseline/gov/irs/tax/federal_income/alternative_minimum_tax/kiddie_tax/amt_kiddie_tax_applies.yaml b/policyengine_us/tests/policy/baseline/gov/irs/tax/federal_income/alternative_minimum_tax/kiddie_tax/amt_kiddie_tax_applies.yaml index 24df9a9e893..2a8ebeebdf4 100644 --- a/policyengine_us/tests/policy/baseline/gov/irs/tax/federal_income/alternative_minimum_tax/kiddie_tax/amt_kiddie_tax_applies.yaml +++ b/policyengine_us/tests/policy/baseline/gov/irs/tax/federal_income/alternative_minimum_tax/kiddie_tax/amt_kiddie_tax_applies.yaml @@ -1,11 +1,12 @@ -- name: Kiddie tax does applies to single head +# Non-student tests +- name: Kiddie tax applies to single head under 19 period: 2022 input: age_head: 18 output: amt_kiddie_tax_applies: true -- name: Older spouse +- name: Kiddie tax does not apply when spouse is 19+ (non-student) period: 2022 input: age_head: 18 @@ -13,7 +14,7 @@ output: amt_kiddie_tax_applies: false -- name: Younger spouse +- name: Kiddie tax applies when both head and spouse under 19 period: 2022 input: age_head: 18 @@ -21,10 +22,85 @@ output: amt_kiddie_tax_applies: true -- name: Older head +- name: Kiddie tax does not apply when head is 19+ (non-student) period: 2022 input: age_head: 19 age_spouse: 18 output: amt_kiddie_tax_applies: false + +# Full-time student tests (students under 24 are subject to kiddie tax) +- name: Kiddie tax applies to 20-year-old full-time student head + period: 2022 + input: + people: + person1: + age: 20 + is_full_time_college_student: true + is_tax_unit_head: true + tax_units: + tax_unit: + members: [person1] + output: + amt_kiddie_tax_applies: true + +- name: Kiddie tax applies to 23-year-old full-time student head + period: 2022 + input: + people: + person1: + age: 23 + is_full_time_college_student: true + is_tax_unit_head: true + tax_units: + tax_unit: + members: [person1] + output: + amt_kiddie_tax_applies: true + +- name: Kiddie tax does not apply to 24-year-old student + period: 2022 + input: + people: + person1: + age: 24 + is_full_time_college_student: true + is_tax_unit_head: true + tax_units: + tax_unit: + members: [person1] + output: + amt_kiddie_tax_applies: false + +- name: Kiddie tax does not apply to 20-year-old non-student + period: 2022 + input: + people: + person1: + age: 20 + is_full_time_college_student: false + is_tax_unit_head: true + tax_units: + tax_unit: + members: [person1] + output: + amt_kiddie_tax_applies: false + +- name: Kiddie tax does not apply when student spouse is 24+ + period: 2022 + input: + people: + person1: + age: 20 + is_full_time_college_student: true + is_tax_unit_head: true + person2: + age: 24 + is_full_time_college_student: true + is_tax_unit_spouse: true + tax_units: + tax_unit: + members: [person1, person2] + output: + amt_kiddie_tax_applies: false diff --git a/policyengine_us/variables/gov/irs/tax/federal_income/alternative_minimum_tax/kiddie_tax/amt_kiddie_tax_applies.py b/policyengine_us/variables/gov/irs/tax/federal_income/alternative_minimum_tax/kiddie_tax/amt_kiddie_tax_applies.py index f4c857896ac..90f3224814d 100644 --- a/policyengine_us/variables/gov/irs/tax/federal_income/alternative_minimum_tax/kiddie_tax/amt_kiddie_tax_applies.py +++ b/policyengine_us/variables/gov/irs/tax/federal_income/alternative_minimum_tax/kiddie_tax/amt_kiddie_tax_applies.py @@ -7,10 +7,41 @@ class amt_kiddie_tax_applies(Variable): definition_period = YEAR label = "Alternative Minimum Tax kiddie tax applies" documentation = "Whether the kiddie tax applies to the tax unit" + reference = [ + "https://www.law.cornell.edu/uscode/text/26/1#g_2_A", + "https://www.irs.gov/publications/p929", + ] def formula(tax_unit, period, parameters): - age_head = tax_unit("age_head", period) + # The kiddie tax applies to children under 19, or under 24 if a + # full-time student. Per IRC 1(g)(2)(A), the age requirements + # reference Section 152(c)(3), same as the dependent definition. p = parameters(period).gov.irs.dependent.ineligible_age - young_head = (age_head != 0) & (age_head < p.non_student) - no_or_young_spouse = tax_unit("age_spouse", period) < p.non_student + + # Get student status from person-level data + person = tax_unit.members + is_student = person("is_full_time_student", period) + is_head = person("is_tax_unit_head", period) + is_spouse = person("is_tax_unit_spouse", period) + + # Check if head or spouse is a full-time student + head_is_student = tax_unit.any(is_student & is_head) + spouse_is_student = tax_unit.any(is_student & is_spouse) + + # Get tax unit level ages + age_head = tax_unit("age_head", period) + age_spouse = tax_unit("age_spouse", period) + + # Determine age limits based on student status + head_age_limit = where(head_is_student, p.student, p.non_student) + spouse_age_limit = where(spouse_is_student, p.student, p.non_student) + + # Check head age: head must be young (and exist - age != 0) + young_head = (age_head != 0) & (age_head < head_age_limit) + + # Check spouse age: spouse must be young (or not exist - age == 0) + no_or_young_spouse = (age_spouse == 0) | ( + age_spouse < spouse_age_limit + ) + return young_head & no_or_young_spouse diff --git a/uv.lock b/uv.lock index c3a2817611e..0ffb3cb3289 100644 --- a/uv.lock +++ b/uv.lock @@ -1244,7 +1244,7 @@ wheels = [ [[package]] name = "policyengine-us" -version = "1.432.2" +version = "1.441.0" source = { editable = "." } dependencies = [ { name = "microdf-python" },