Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
17 commits
Select commit Hold shift + click to select a range
1952b5e
Deny the refundable CTC to filers electing the section 911 exclusion
MaxGhenis Oct 2, 2026
275bb12
Skip the section 911 property tests when hypothesis is not installed
MaxGhenis Oct 2, 2026
e1966e2
Apply the section 911 bar to the Puerto Rico refundable CTC
MaxGhenis Oct 2, 2026
1c5d82f
Count the section 911 exclusion in the filing requirement; review fixes
MaxGhenis Oct 3, 2026
3bd638d
Deny the EITC to section 911 claimants (26 U.S.C. 32(c)(1)(C))
MaxGhenis Oct 3, 2026
7c4f01a
Keep section 911 filers out of New Jersey's EITC and Colorado's CTC
MaxGhenis Oct 3, 2026
20cbba0
Section 911 claimants file, and state EITC recomputations exclude them
MaxGhenis Oct 3, 2026
050fb01
Section 911 claimants file by propensity; AFA bar only before 2025
MaxGhenis Oct 3, 2026
2656278
Merge upstream/main (ea79c39fb7) into ctc-refundable-foreign-earned-i…
MaxGhenis Oct 6, 2026
1614285
Merge upstream/main (47ab53e0fb) into ctc-refundable-foreign-earned-i…
MaxGhenis Oct 6, 2026
e1631f8
Read the section 24(d)(3) bar in Credit Limit Worksheet B
MaxGhenis Oct 6, 2026
7caa0a5
Update section 911(f) comments now that main stacks the tax
MaxGhenis Oct 6, 2026
e0b5baf
Describe the section 911 filing reason as a propensity in the changelog
MaxGhenis Oct 6, 2026
1d276d8
Merge upstream/main (26348e7cf7) into ctc-refundable-foreign-earned-i…
MaxGhenis Oct 7, 2026
0df2fbe
Preserve AFA Puerto Rico refundable CTC after 2039
MaxGhenis Oct 7, 2026
83fd117
Merge branch 'main' into ctc-refundable-foreign-earned-income-exclusion
MaxGhenis Oct 8, 2026
086fbfe
Merge branch 'main' into ctc-refundable-foreign-earned-income-exclusion
MaxGhenis Oct 9, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ venv/
# Python caches

.pytest_cache
.hypothesis
**/__pycache__

# Data
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Deny the refundable Child Tax Credit to filers who elect to exclude foreign earned income or housing amounts under section 911 (26 U.S.C. 24(d)(3)) for tax years from 2015 except fully refundable 2021, including the Puerto Rico refundable Child Tax Credit, Colorado's replica of the refundable credit, the Wyden-Smith CTC expansion reform and the American Family Act reform before 2025; deny the EITC to filers who claim the benefits of section 911 (26 U.S.C. 32(c)(1)(C)), including in New Jersey's childless EITC age exception and the Colorado, DC, Illinois, Indiana and Washington credits that recompute the federal EITC; count the section 911 exclusion in gross income for the filing requirement (26 U.S.C. 6012(c)); and treat a section 911 claimant below the filing threshold as a filer when the tax unit would file if eligible for a refundable credit (would_file_if_eligible_for_refundable_credit). Under the American Family Act, waive the shared section 911 refundable CTC bar from 2025 onward, including the Puerto Rico refund after 2039.
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,21 @@


def create_afa_other_dependent_credit() -> Reform:
class refundable_ctc_barred_by_section_911_exclusion(Variable):
reference = "https://www.bennet.senate.gov/wp-content/uploads/2025/04/American-Family-Act-2025.pdf"
documentation = (
"The American Family Act replaces section 24 from 2025 with "
"section 24A, which does not bar refundability for section 911 "
"claimants, including in Puerto Rico. Earlier years retain "
"the current-law bar."
)

def formula_2025(tax_unit, period, parameters):
# Section 2(c) ends old section 24 after 2024; sections 24A(d)
# and 2(f)(1) provide refundability from 2025 without a sunset.
# Keep this rule after the fully_refundable parameter expires.
return False

class other_dependent_credit(Variable):
value_type = float
entity = TaxUnit
Expand Down Expand Up @@ -152,7 +167,9 @@ def formula(tax_unit, period, parameters):
ctc_capped_by_tax = min_(total_ctc, limiting_tax)
ctc_capped_by_increased_tax = min_(total_ctc, limiting_tax + phase_in)
amount_ctc_would_increase = ctc_capped_by_increased_tax - ctc_capped_by_tax
return min_(maximum_refundable_ctc, amount_ctc_would_increase)
refundable_amount = min_(maximum_refundable_ctc, amount_ctc_would_increase)
barred = tax_unit("refundable_ctc_barred_by_section_911_exclusion", period)
return where(barred, 0, refundable_amount)

class ctc(Variable):
value_type = float
Expand Down Expand Up @@ -256,6 +273,7 @@ def apply(self):
self.update_variable(ctc_lower_phase_out)
self.update_variable(ctc_higher_phase_out)
self.update_variable(ctc)
self.update_variable(refundable_ctc_barred_by_section_911_exclusion)
self.update_variable(refundable_ctc)
self.update_variable(ctc_child_individual_maximum_arpa)
self.modify_parameters(modify_parameters)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -74,8 +74,13 @@ def formula(tax_unit, period, parameters):
ctc_capped_by_tax = min_(total_ctc, limiting_tax)
ctc_capped_by_increased_tax = min_(total_ctc, limiting_tax + tax_increase)
amount_ctc_would_increase = ctc_capped_by_increased_tax - ctc_capped_by_tax
refundable_amount = min_(maximum_refundable_ctc, amount_ctc_would_increase)

return min_(maximum_refundable_ctc, amount_ctc_would_increase)
# The bill's CTC changes amend section 24(h) and leave section
# 24(d)(3) in place: no refundable CTC for filers electing a
# section 911 exclusion.
barred = tax_unit("refundable_ctc_barred_by_section_911_exclusion", period)
return where(barred, 0, refundable_amount)

class reform(Reform):
def apply(self):
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -531,3 +531,92 @@
output:
ctc: 3_500 # 3000 for 10-year-old + 500 for 18-year-old (ODC)
ctc_adult_individual_maximum: [0, 0, 500] # ODC for 18-year-old under ARPA

# Both cases below have zero taxable income and $0 of tax before credits. For
# the Form 2555 filer, the Foreign Earned Income Tax Worksheet (Form 1040 line
# 16), which applies section 911(f), is skipped when taxable income is zero;
# the first case in this file has a Form 2555 filer with positive taxable
# income.
# non_refundable_ctc is the credit before the section 26(a) limit; the limited
# amount is income_tax_capped_non_refundable_credits, which equals Schedule
# 8812 line 14 here because the CTC is the only non-refundable credit ($0).
- name: Head of household with two children and a section 911 exclusion gets no additional child tax credit in 2025.
period: 2025
absolute_error_margin: 0.01
input:
people:
parent:
age: 40
# Wages included in gross income; the excluded foreign wages are
# reported separately below.
employment_income: 8_000
# Over the $11,950 investment income limit, so no EITC either way.
taxable_interest_income: 12_500
child1:
age: 5
child2:
age: 8
tax_units:
tax_unit:
members: [parent, child1, child2]
# Form 2555 exclusion.
foreign_earned_income_exclusion: 40_000
households:
household:
members: [parent, child1, child2]
state_code: TX
output:
filing_status: HEAD_OF_HOUSEHOLD
adjusted_gross_income: 20_500
# $20,500 is below the $23,625 head of household standard deduction.
taxable_income: 0
income_tax_before_credits: 0
eitc: 0
# Schedule 8812 line 12: 2 x $2,200.
ctc: 4_400
# Line 13 (Credit Limit Worksheet A): no tax to offset.
ctc_limiting_tax_liability: 0
refundable_ctc_barred_by_section_911_exclusion: true
# Part II-A: "If you file Form 2555, you cannot claim the additional
# child tax credit." A household with the same included income and no
# foreign earnings gets $825 (next case).
refundable_ctc: 0
non_refundable_ctc: 4_400
income_tax_capped_non_refundable_credits: 0
income_tax_before_refundable_credits: 0
income_tax: 0

- name: A household with the same included income and no foreign earnings gets an $825 additional child tax credit in 2025.
period: 2025
absolute_error_margin: 0.01
input:
people:
parent:
age: 40
employment_income: 8_000
taxable_interest_income: 12_500
child1:
age: 5
child2:
age: 8
tax_units:
tax_unit:
members: [parent, child1, child2]
foreign_earned_income_exclusion: 0
households:
household:
members: [parent, child1, child2]
state_code: TX
output:
income_tax_before_credits: 0
eitc: 0
ctc: 4_400
refundable_ctc_barred_by_section_911_exclusion: false
# Part II-A: line 16a = $4,400 - $0 = $4,400; line 16b = 2 x $1,700
# = $3,400; line 17 = $3,400; line 20 = 15% x ($8,000 - $2,500) = $825;
# line 27 = smaller of lines 17 and 20 = $825.
refundable_ctc: 825
non_refundable_ctc: 3_575
income_tax_capped_non_refundable_credits: 0
income_tax_before_refundable_credits: 0
income_tax: -825
Original file line number Diff line number Diff line change
Expand Up @@ -41,3 +41,23 @@
foreign_earned_income_exclusion: 10_000
output:
ctc_credit_limit_worksheet_b_applies: true

# Worksheet B reads the section 24(d)(3) bar rather than repeating its test, so
# a bar set as an input decides both the refund and the worksheet.
- name: Does not apply when the section 24(d)(3) bar is set as an input, even without an exclusion.
period: 2025
input:
ctc_qualifying_children: 2
foreign_earned_income_exclusion: 0
refundable_ctc_barred_by_section_911_exclusion: true
output:
ctc_credit_limit_worksheet_b_applies: false

- name: Applies to a Form 2555 filer when the section 24(d)(3) bar is set to false as an input.
period: 2025
input:
ctc_qualifying_children: 2
foreign_earned_income_exclusion: 10_000
refundable_ctc_barred_by_section_911_exclusion: false
output:
ctc_credit_limit_worksheet_b_applies: true
Original file line number Diff line number Diff line change
Expand Up @@ -81,3 +81,111 @@
ctc_limiting_tax_liability: 4_000
output:
refundable_ctc: 0

# Section 24(d)(3): no refundable CTC for a filer who elects to exclude any
# amount from gross income under section 911 (2025 Schedule 8812
# instructions, Part II-A: "If you file Form 2555, you cannot claim the
# additional child tax credit.").
- name: Section 911 exclusion denies the refundable credit
period: 2025
input:
ctc_refundable_maximum: 3_400
ctc: 4_400
ctc_phase_out: 0
ctc_phase_in: 10_000
ctc_limiting_tax_liability: 0
foreign_earned_income_exclusion: 1
output:
# Without the exclusion: min(3,400, min(4,400, 0 + 10,000) - 0) = 3,400.
refundable_ctc: 0

- name: Section 911 exclusion denies the refundable credit from social security taxes
period: 2025
input:
# Three children and no earnings over the threshold: the phase-in amount
# is social security taxes less the EITC (section 24(d)(1)(B)(ii)), which
# section 24(d)(3) also switches off.
ctc_qualifying_children: 3
ctc_phase_in_relevant_earnings: 0
ctc_social_security_tax: 4_000
eitc: 0
ctc_refundable_maximum: 5_100
ctc: 6_600
ctc_phase_out: 0
ctc_limiting_tax_liability: 1_000
foreign_earned_income_exclusion: 30_000
output:
ctc_phase_in: 4_000
refundable_ctc: 0

- name: No section 911 exclusion keeps the refundable credit from social security taxes
period: 2025
input:
ctc_qualifying_children: 3
ctc_phase_in_relevant_earnings: 0
ctc_social_security_tax: 4_000
eitc: 0
ctc_refundable_maximum: 5_100
ctc: 6_600
ctc_phase_out: 0
ctc_limiting_tax_liability: 1_000
foreign_earned_income_exclusion: 0
output:
ctc_phase_in: 4_000
# min(5,100, min(6,600, 1,000 + 4,000) - min(6,600, 1,000)) = 4,000.
refundable_ctc: 4_000

- name: Section 911 exclusion bar can be switched off
period: 2025
input:
gov.irs.credits.ctc.refundable.foreign_earned_income_exclusion_bar_applies: false
ctc_refundable_maximum: 5_100
ctc: 6_600
ctc_phase_out: 0
ctc_phase_in: 4_000
ctc_limiting_tax_liability: 1_000
foreign_earned_income_exclusion: 30_000
output:
refundable_ctc: 4_000

- name: Section 911 exclusion did not deny the refundable credit before 2015
period: 2014
input:
# Public Law 114-27, section 807, applies to taxable years beginning
# after December 31, 2014.
ctc_refundable_maximum: 2_000
ctc: 2_000
ctc_phase_out: 0
ctc_phase_in: 1_500
ctc_limiting_tax_liability: 0
foreign_earned_income_exclusion: 30_000
output:
refundable_ctc: 1_500

- name: Section 911 exclusion denies the refundable credit from 2015
period: 2015
input:
ctc_refundable_maximum: 2_000
ctc: 2_000
ctc_phase_out: 0
ctc_phase_in: 1_500
ctc_limiting_tax_liability: 0
foreign_earned_income_exclusion: 30_000
output:
refundable_ctc: 0

- name: In 2021, the fully refundable credit ignores the section 911 exclusion
period: 2021
input:
# Section 24(i)(1)(A): subsection (d), including the section 911 bar,
# does not apply to a filer whose principal place of abode was in the
# United States for more than half of 2021 (Schedule 8812 Part I-B,
# which has no Form 2555 condition). The model assumes that test is met.
ctc_refundable_maximum: 6_000
ctc: 6_000
ctc_phase_out: 0
ctc_phase_in: 0
ctc_limiting_tax_liability: 0
foreign_earned_income_exclusion: 30_000
output:
refundable_ctc: 6_000
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
# Section 24(d)(3): "Paragraph (1) shall not apply to any taxpayer for any
# taxable year if such taxpayer elects to exclude any amount from gross
# income under section 911 for such taxable year."
- name: Any section 911 exclusion bars the refundable credit
period: 2025
input:
foreign_earned_income_exclusion: 1
output:
refundable_ctc_barred_by_section_911_exclusion: true

- name: No section 911 exclusion, no bar
period: 2025
input:
foreign_earned_income_exclusion: 0
output:
refundable_ctc_barred_by_section_911_exclusion: false

- name: The bar did not exist before 2015
period: 2014
input:
# Public Law 114-27, section 807, applies to taxable years beginning
# after December 31, 2014.
foreign_earned_income_exclusion: 30_000
output:
refundable_ctc_barred_by_section_911_exclusion: false

- name: The bar applies from 2015
period: 2015
input:
foreign_earned_income_exclusion: 30_000
output:
refundable_ctc_barred_by_section_911_exclusion: true

- name: No bar in the fully refundable year
period: 2021
input:
# Section 24(i)(1)(A): subsection (d) does not apply to filers living in
# the United States or Puerto Rico, which the model assumes.
foreign_earned_income_exclusion: 30_000
output:
refundable_ctc_barred_by_section_911_exclusion: false

- name: The bar can be switched off
period: 2025
input:
gov.irs.credits.ctc.refundable.foreign_earned_income_exclusion_bar_applies: false
foreign_earned_income_exclusion: 30_000
output:
refundable_ctc_barred_by_section_911_exclusion: false
Original file line number Diff line number Diff line change
Expand Up @@ -37,3 +37,40 @@
filing_status: JOINT
output:
eitc_eligible: true

# 26 U.S.C. 32(c)(1)(C): "The term 'eligible individual' does not include any
# individual who claims the benefits of section 911 (relating to citizens or
# residents living abroad) for the taxable year."
- name: Section 911 claimant is not eligible.
period: 2025
input:
eitc_investment_income_eligible: true
eitc_demographic_eligible: true
filer_meets_eitc_identification_requirements: true
filing_status: JOINT
foreign_earned_income_exclusion: 1
output:
eitc_eligible: false

- name: Without a section 911 exclusion the same filer is eligible.
period: 2025
input:
eitc_investment_income_eligible: true
eitc_demographic_eligible: true
filer_meets_eitc_identification_requirements: true
filing_status: JOINT
foreign_earned_income_exclusion: 0
output:
eitc_eligible: true

- name: Section 911 claimant is not eligible in 2021 either.
period: 2021
input:
# Unlike the CTC bar, section 32(c)(1)(C) has no 2021 exception.
eitc_investment_income_eligible: true
eitc_demographic_eligible: true
filer_meets_eitc_identification_requirements: true
filing_status: SINGLE
foreign_earned_income_exclusion: 30_000
output:
eitc_eligible: false
Loading
Loading