Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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 changelog.d/wa-wftc-current-year-income-limit.fixed.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Indexed the Washington Working Families Tax Credit maximum qualifying income and investment-income limit to the current-year federal EITC figures instead of freezing them at 2022 values.
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@
people:
head:
age: 30
employment_income: 43_490
employment_income: 49_084
has_tin: true
ssn_card_type: CITIZEN
is_tax_unit_head: true
Expand All @@ -77,8 +77,9 @@
members: [head, child]
state_code: WA
output:
# Per RCW 82.08.0206(3)(f), minimum credit is $50
wa_working_families_tax_credit: 50.05
# At the 2024 head-of-household one-child federal EITC limit ($49,084) the
# credit reaches the $50 statutory minimum (RCW 82.08.0206(3)(f)).
wa_working_families_tax_credit: 50.02

- name: Case 5, mid-phaseout gives correctly reduced credit.
period: 2024
Expand All @@ -87,7 +88,7 @@
people:
head:
age: 30
employment_income: 40_992
employment_income: 46_584
has_tin: true
ssn_card_type: CITIZEN
is_tax_unit_head: true
Expand All @@ -110,7 +111,10 @@
members: [head, child]
state_code: WA
output:
wa_working_families_tax_credit: 344.82
# 2024 head-of-household, one child: maximum $640, phase-out start $44,084
# (limit $49,084 less the $5,000 band), rate (640 - 50) / 5,000 = 11.8%.
# 640 - 0.118 x (46,584 - 44,084) = 345.
wa_working_families_tax_credit: 345.02

- name: Case 6, joint filer with 1 child and moderate income receives credit.
period: 2024
Expand Down Expand Up @@ -158,7 +162,7 @@
head:
age: 40
employment_income: 40_000
unemployment_compensation: 16_000
unemployment_compensation: 25_000
has_tin: true
ssn_card_type: CITIZEN
is_tax_unit_head: true
Expand Down Expand Up @@ -196,13 +200,14 @@
members: [head, spouse, child1, child2, child3]
state_code: WA
output:
# Earned income ($40,000) is below the 3-child phase-out start (~$54,190),
# but AGI ($56,000, incl. $16,000 unemployment) lands inside the phase-out
# band. RCW 82.08.0206(3)(b) measures the reduction against the federal
# phase-out income = max(earned income, AGI) = $56,000, so the $1,330
# maximum tapers at 25.6% over the ~$1,810 of excess to ~$866.57 rather
# than paying the full $1,330. See policyengine-taxsim#986.
wa_working_families_tax_credit: 866.57
# Earned income ($40,000) is below the 2025 three-child phase-out start
# ($63,675 = limit $68,675 less the $5,000 band), but AGI ($65,000, incl.
# $25,000 unemployment) lands inside the phase-out band. RCW 82.08.0206(3)(b)
# measures the reduction against the federal phase-out income =
# max(earned income, AGI) = $65,000, so the $1,330 maximum tapers at 25.6%
# over the $1,325 of excess to ~$990.83 rather than paying the full $1,330.
# See policyengine-taxsim#986.
wa_working_families_tax_credit: 990.83

# ESSB 6346 Sec. 901 - WFTC Age Expansion tests (effective 2029)

Expand Down Expand Up @@ -685,3 +690,133 @@
state_code: WA
output:
wa_working_families_tax_credit: 0

- name: Case 16, income limit indexes to the current year (taxsim #1155).
period: 2023
absolute_error_margin: 0.01
input:
people:
head:
age: 49
employment_income: 20_412.535
has_tin: true
ssn_card_type: CITIZEN
is_tax_unit_head: true
spouse:
age: 52
employment_income: 29_635.352
has_tin: true
ssn_card_type: CITIZEN
is_tax_unit_spouse: true
child:
age: 10
has_tin: true
ssn_card_type: CITIZEN
is_tax_unit_dependent: true
tax_units:
tax_unit:
members: [head, spouse, child]
filing_status: JOINT
would_file_taxes_voluntarily: true
takes_up_eitc: true
spm_units:
spm_unit:
members: [head, spouse, child]
households:
household:
members: [head, spouse, child]
state_code: WA
output:
# The maximum qualifying income equals Washington DOR's published 2023
# married-filing-jointly one-child limit of $53,120, not the frozen 2022
# limit of $49,620.
wa_working_families_tax_credit_maximum_qualifying_income: 53_120
# AGI $50,047.89 is below that limit. Maximum $625, phase-out start $48,120
# (limit $53,120 less the $5,000 band), rate (625 - 50) / 5,000 = 11.5%.
# 625 - 0.115 x (50,047.89 - 48,120) = 403.
wa_working_families_tax_credit: 403.29

- name: Case 17, two-child near-ceiling credit reaches the minimum (2-child coverage).
period: 2023
absolute_error_margin: 0.01
input:
people:
head:
age: 35
employment_income: 59_470
has_tin: true
ssn_card_type: CITIZEN
is_tax_unit_head: true
spouse:
age: 35
has_tin: true
ssn_card_type: CITIZEN
is_tax_unit_spouse: true
child1:
age: 5
has_tin: true
ssn_card_type: CITIZEN
is_tax_unit_dependent: true
child2:
age: 8
has_tin: true
ssn_card_type: CITIZEN
is_tax_unit_dependent: true
tax_units:
tax_unit:
members: [head, spouse, child1, child2]
filing_status: JOINT
would_file_taxes_voluntarily: true
takes_up_eitc: true
spm_units:
spm_unit:
members: [head, spouse, child1, child2]
households:
household:
members: [head, spouse, child1, child2]
state_code: WA
output:
# 2023 married-filing-jointly two-child ceiling = $59,478 (Washington DOR).
# Maximum $940, phase-out start $54,478 (limit less the $5,000 band), rate
# (940 - 50) / 5,000 = 17.8%. Income $59,470 is $8 below the ceiling, so the
# credit is at the $50 statutory minimum region: 940 - 0.178 x (59,470 -
# 54,478) = 51.43. (The ceiling itself is pinned to DOR's $53,120 in the
# one-child case above; DOR rounds to whole dollars, whereas the model
# carries the federal indexing to the cent.)
wa_working_families_tax_credit: 51.43

- name: Case 18, investment-income limit indexes to the current year.
period: 2023
absolute_error_margin: 0.01
input:
people:
head:
age: 30
employment_income: 15_000
taxable_interest_income: 10_500
has_tin: true
ssn_card_type: CITIZEN
is_tax_unit_head: true
child:
age: 5
has_tin: true
ssn_card_type: CITIZEN
is_tax_unit_dependent: true
tax_units:
tax_unit:
members: [head, child]
filing_status: HEAD_OF_HOUSEHOLD
would_file_taxes_voluntarily: true
takes_up_eitc: true
spm_units:
spm_unit:
members: [head, child]
households:
household:
members: [head, child]
state_code: WA
output:
# Investment income $10,500 exceeds the frozen 2022 federal limit ($10,300)
# but is below the current-year 2023 limit ($11,000, Washington DOR), so the
# filer remains eligible and receives the full 2023 one-child maximum.
wa_working_families_tax_credit: 625
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,10 @@
# EITC rules as in effect 2022-06-09. 2026 maximum amounts (2025 statutory
# values uprated by gov.irs.uprating, no rounding applied at runtime):
# 0 kids $342.59, 1 kid $674.96, 2 kids $1,017.55, 3+ kids $1,360.14;
# $50 minimum. Income ceiling = frozen-2022 EITC maximum AGI; the credit
# phases from the maximum down to $50 over the last $2,500 (0 kids) /
# $5,000 (1+ kids) of income below that ceiling.
# $50 minimum. Income ceiling = the current-year federal EITC maximum AGI
# (indexed each year, e.g. $19,539.74 childless / $51,593.38 head-of-household
# one child in 2026); the credit phases from the maximum down to $50 over the
# last $2,500 (0 kids) / $5,000 (1+ kids) of income below that ceiling.
- name: wa_wftc_joint_1_child_max_amount (wa)
period: 2026
absolute_error_margin: 0.1
Expand Down Expand Up @@ -79,9 +80,9 @@
output:
tax_units:
tax_unit:
# 1-kid joint phase-out starts at (20,130 + 6,130 + 3,733/0.1598)
# - 5,000 = 44,620; income 20,000 is below it -> full 2026 maximum
# 660 x 1.02266 uprating = 674.96.
# Income $20,000 is well below the 2026 one-child joint phase-out
# start, so the credit is the full 2026 maximum: $660 (2025) x 1.02266
# uprating = 674.96.
wa_working_families_tax_credit: 674.96
adjusted_gross_income: 20_000.0
- name: wa_wftc_childless_mid_phase_out (wa)
Expand All @@ -96,7 +97,7 @@
is_tax_unit_dependent: false
is_disabled: false
immigration_status_str: CITIZEN
employment_income_before_lsr: 15_000
employment_income_before_lsr: 18_000
capital_gains: 0
rent: 0
was_in_foster_care: false
Expand Down Expand Up @@ -126,11 +127,11 @@
output:
tax_units:
tax_unit:
# Childless ceiling = 9,160 + 560/0.0765 = 16,480.26; phase-out
# starts 2,500 below at 13,980.26; rate = (342.59 - 50)/2,500 =
# 0.11704; 342.59 - (15,000 - 13,980.26) x 0.11704 = 223.24.
wa_working_families_tax_credit: 223.25
adjusted_gross_income: 15_000.0
# 2026 childless ceiling $19,539.74; phase-out starts $2,500 below at
# $17,039.74; rate = (342.59 - 50)/2,500 = 0.11704;
# 342.59 - (18,000 - 17,039.74) x 0.11704 = 230.21.
wa_working_families_tax_credit: 230.21
adjusted_gross_income: 18_000.0
- name: wa_wftc_1_child_min_amount_near_ceiling (wa)
period: 2026
absolute_error_margin: 0.1
Expand All @@ -143,7 +144,7 @@
is_tax_unit_dependent: false
is_disabled: false
immigration_status_str: CITIZEN
employment_income_before_lsr: 43_490
employment_income_before_lsr: 51_590
capital_gains: 0
rent: 0
was_in_foster_care: false
Expand Down Expand Up @@ -190,12 +191,11 @@
output:
tax_units:
tax_unit:
# 1-kid single ceiling = 20,130 + 3,733/0.1598 = 43,490.45; income
# 43,490 sits $0.45 below it; rate = (674.96 - 50)/5,000 = 0.12499;
# 674.96 - 4,999.55 x 0.12499 = 50.06 (the $50 statutory minimum
# region, RCW 82.08.0206(3)(c)).
wa_working_families_tax_credit: 50.06
adjusted_gross_income: 43_490.0
# 2026 head-of-household one-child ceiling $51,593.38; income $51,590
# sits just below it, in the $50 statutory minimum region
# (RCW 82.08.0206(3)(c)).
wa_working_families_tax_credit: 50.42
adjusted_gross_income: 51_590.0
- name: wa_wftc_1_child_above_income_ceiling (wa)
period: 2026
absolute_error_margin: 0.1
Expand All @@ -208,7 +208,7 @@
is_tax_unit_dependent: false
is_disabled: false
immigration_status_str: CITIZEN
employment_income_before_lsr: 43_495
employment_income_before_lsr: 51_600
capital_gains: 0
rent: 0
was_in_foster_care: false
Expand Down Expand Up @@ -255,10 +255,11 @@
output:
tax_units:
tax_unit:
# Income-route zero: 43,495 exceeds the 43,490.45 frozen-EITC
# ceiling by $4.55 -> $0 (cliff from the $50 minimum below it).
# Income-route zero: $51,600 exceeds the 2026 head-of-household
# one-child ceiling of $51,593.38 -> $0 (cliff from the $50 minimum
# below it).
wa_working_families_tax_credit: 0.0
adjusted_gross_income: 43_495.0
adjusted_gross_income: 51_600.0
- name: wa_wftc_age_18_before_2029_expansion (wa)
period: 2026
absolute_error_margin: 0.1
Expand Down Expand Up @@ -481,7 +482,7 @@
tax_units:
tax_unit:
# Top child bracket: 3+ kids 2026 maximum = 1,330 x 1.02266
# uprating = 1,360.14; income 20,000 is below the joint 3-kid
# phase-out start (20,130 + 6,130 + 6,935/0.2106 - 5,000 = 54,190).
# uprating = 1,360.14; income 20,000 is well below the 2026 joint
# three-child phase-out start, so the full maximum applies.
wa_working_families_tax_credit: 1_360.14
adjusted_gross_income: 20_000.0
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,14 @@ def formula(tax_unit, period, parameters):
# date-valued types, so the date appears here rather than in the
# parameter tree.
frozen_eitc = parameters.gov.irs.credits.eitc("2022-06-09")
# The June 9, 2022 Internal Revenue Code still contains the EITC
# inflation-adjustment provisions (26 U.S.C. 32(j)), so the
# inflation-indexed dollar amounts (the investment-income limit here,
# and the maximum qualifying income) track the current tax year, while
# the structural rules (age band, disabled-dependent waiver,
# separate-filer rule) stay on the frozen snapshot. Washington DOR
# publishes the current-year federal investment-income limit each year.
eitc = parameters(period).gov.irs.credits.eitc
person = tax_unit.members
has_tin = person("has_tin", period)
is_head_or_spouse = person("is_tax_unit_head_or_spouse", period)
Expand Down Expand Up @@ -64,9 +72,9 @@ def formula(tax_unit, period, parameters):
federal_demographic_eligible = calculate_eitc_demographic_eligibility(
tax_unit, period, frozen_eitc, federal_child_count
)
frozen_investment_income_eligible = (
investment_income_eligible = (
tax_unit("eitc_relevant_investment_income", period)
<= frozen_eitc.phase_out.max_investment_income
<= eitc.phase_out.max_investment_income
)
earnings = tax_unit("filer_adjusted_earnings", period)
agi = tax_unit("adjusted_gross_income", period)
Expand All @@ -85,7 +93,7 @@ def formula(tax_unit, period, parameters):
baseline_income_eligible
& federal_demographic_eligible
& federal_identification_eligible
& frozen_investment_income_eligible
& investment_income_eligible
& eitc_filing_status_eligible(
tax_unit,
period,
Expand All @@ -107,7 +115,7 @@ def formula(tax_unit, period, parameters):
state_only_income_eligible
& demographic_eligible
& filer_has_tin
& frozen_investment_income_eligible
& investment_income_eligible
& is_filer
& takes_up_eitc
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,10 +46,14 @@ def formula(tax_unit, period, parameters):
# wa_working_families_tax_credit child_count.
# RCW 82.08.0206(2)(d) pins WFTC to the federal EITC rules as in
# effect on June 9, 2022; this snapshot date is a statutory literal.
frozen_eitc = parameters.gov.irs.credits.eitc("2022-06-09")
frozen_investment_income_eligible = (
# The investment-income limit is an inflation-indexed dollar amount
# (26 U.S.C. 32(j), inside the pinned June 9, 2022 Code), so it tracks
# the current tax year -- matching Washington DOR's published limits --
# even though the WFTC's structural rules stay on the frozen snapshot.
eitc = parameters(period).gov.irs.credits.eitc
investment_income_eligible = (
tax_unit("eitc_relevant_investment_income", period)
<= frozen_eitc.phase_out.max_investment_income
<= eitc.phase_out.max_investment_income
)
earnings = tax_unit("filer_adjusted_earnings", period)
agi = tax_unit("adjusted_gross_income", period)
Expand All @@ -66,7 +70,7 @@ def formula(tax_unit, period, parameters):
expansion_in_effect
& filer_meets_min_age
& income_eligible
& frozen_investment_income_eligible
& investment_income_eligible
& filers_have_tin
& is_filer
& takes_up_eitc
Expand Down
Loading
Loading