Skip to content
Open
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-income-tax.added.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Added WA SSB 6346 reform: 9.9% income tax on high earners.
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
description: Washington limits the charitable contribution deduction to this amount per individual under the SSB 6346 reform.

values:
2028-01-01: 100_000

metadata:
unit: currency-USD
period: year
label: WA SSB 6346 charitable deduction cap (individual)
reference:
- title: SSB 6346, Sec. 307 - Charitable Contributions
href: https://lawfilesext.leg.wa.gov/biennium/2025-26/Pdf/Bills/Senate%20Bills/6346-S.pdf#page=21
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
description: Washington limits the combined charitable contribution deduction for married couples to this amount under the SSB 6346 reform.

values:
2028-01-01: 100_000

metadata:
unit: currency-USD
period: year
label: WA SSB 6346 charitable deduction cap (joint)
reference:
- title: SSB 6346, Sec. 307 - Charitable Contributions
href: https://lawfilesext.leg.wa.gov/biennium/2025-26/Pdf/Bills/Senate%20Bills/6346-S.pdf#page=21
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
description: The Washington SSB 6346 income tax reform applies if this is true.

values:
0000-01-01: false

metadata:
unit: bool
period: year
label: WA SSB 6346 income tax reform in effect
reference:
- title: SSB 6346, 69th Legislature, 2025-2026
href: https://lawfilesext.leg.wa.gov/biennium/2025-26/Pdf/Bills/Senate%20Bills/6346-S.pdf#page=1
12 changes: 12 additions & 0 deletions policyengine_us/parameters/gov/contrib/states/wa/sb6346/rate.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
description: Washington sets the income tax rate to this share under the SSB 6346 reform.

values:
2028-01-01: 0.099

metadata:
unit: /1
period: year
label: WA SSB 6346 income tax rate
reference:
- title: SSB 6346, Sec. 201(1) - Tax Imposed
href: https://lawfilesext.leg.wa.gov/biennium/2025-26/Pdf/Bills/Senate%20Bills/6346-S.pdf#page=16
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
description: Washington provides this amount as the standard deduction under the SSB 6346 reform.

values:
2028-01-01: 1_000_000

metadata:
unit: currency-USD
period: year
label: WA SSB 6346 standard deduction
uprating: gov.bls.cpi.cpi_u
# Sec. 312 specifies Seattle-area CPI-U for indexing starting Oct 2029
# (for tax year 2030). Using national CPI-U as a proxy until we add
# Seattle-area CPI data. Fixed at $1M for 2028-2029.
rounding:
type: nearest
interval: 1000
reference:
- title: SSB 6346, Sec. 310 - Standard Deduction
href: https://lawfilesext.leg.wa.gov/biennium/2025-26/Pdf/Bills/Senate%20Bills/6346-S.pdf#page=22
- title: SSB 6346, Sec. 312 - Inflation Adjustment
href: https://lawfilesext.leg.wa.gov/biennium/2025-26/Pdf/Bills/Senate%20Bills/6346-S.pdf#page=23
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
description: Minimum age for WFTC eligibility under SSB 6346, for individuals who do not meet the federal EITC age requirement.

values:
2028-01-01: 18

metadata:
unit: year
period: year
label: SSB 6346 WFTC minimum age for expanded eligibility
reference:
- title: SSB 6346, Sec. 901(2)(a)(ii)(C)
href: https://lawfilesext.leg.wa.gov/biennium/2025-26/Pdf/Bills/Senate%20Bills/6346-S.pdf#page=52
5 changes: 5 additions & 0 deletions policyengine_us/reforms/reforms.py
Original file line number Diff line number Diff line change
Expand Up @@ -177,6 +177,9 @@
from .congress.watca import (
create_watca_reform,
)
from .states.wa.sb6346.sb6346 import (
create_wa_sb6346_reform,
)


from .states.ga.sb520 import (
Expand Down Expand Up @@ -346,6 +349,7 @@ def create_structural_reforms_from_parameters(parameters, period):
ct_hb5009 = create_ct_hb5009_reform(parameters, period)
ga_sb520 = create_ga_sb520_reform(parameters, period)
watca = create_watca_reform(parameters, period)
wa_sb6346 = create_wa_sb6346_reform(parameters, period)

reforms = [
afa_reform,
Expand Down Expand Up @@ -428,6 +432,7 @@ def create_structural_reforms_from_parameters(parameters, period):
ct_tax_rebate_2026,
ga_sb520,
watca,
wa_sb6346,
]
reforms = tuple(filter(lambda x: x is not None, reforms))

Expand Down
Empty file.
1 change: 1 addition & 0 deletions policyengine_us/reforms/states/wa/sb6346/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
from .sb6346 import create_wa_sb6346_reform, wa_sb6346
178 changes: 178 additions & 0 deletions policyengine_us/reforms/states/wa/sb6346/sb6346.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,178 @@
from policyengine_us.model_api import *
from policyengine_core.periods import period as period_


def create_wa_sb6346() -> Reform:
"""
WA SSB 6346 - 9.9% income tax on high earners.

Imposes a 9.9% tax on Washington taxable income (federal AGI minus
a $1M standard deduction and capped charitable deduction).

Reference: https://lawfilesext.leg.wa.gov/biennium/2025-26/Pdf/Bills/Senate%20Bills/6346-S.pdf
"""

class wa_income_tax_base_income(Variable):
value_type = float
entity = TaxUnit
label = "Washington base income under SSB 6346"
unit = USD
definition_period = YEAR
reference = "https://lawfilesext.leg.wa.gov/biennium/2025-26/Pdf/Bills/Senate%20Bills/6346-S.pdf#page=17"
defined_for = StateCode.WA

def formula(tax_unit, period, parameters):
return tax_unit("adjusted_gross_income", period)

class wa_income_tax_charitable_deduction(Variable):
value_type = float
entity = TaxUnit
label = "Washington income tax charitable deduction under SSB 6346"
unit = USD
definition_period = YEAR
reference = "https://lawfilesext.leg.wa.gov/biennium/2025-26/Pdf/Bills/Senate%20Bills/6346-S.pdf#page=21"
defined_for = StateCode.WA

def formula(tax_unit, period, parameters):
p = parameters(period).gov.contrib.states.wa.sb6346.charitable_deduction.cap
filing_status = tax_unit("filing_status", period)
charitable = add(
tax_unit,
period,
["charitable_cash_donations", "charitable_non_cash_donations"],
)
is_joint = filing_status == filing_status.possible_values.JOINT
cap = where(is_joint, p.joint, p.individual)
return min_(charitable, cap)

class wa_income_tax_standard_deduction(Variable):
value_type = float
entity = TaxUnit
label = "Washington income tax standard deduction under SSB 6346"
unit = USD
definition_period = YEAR
reference = "https://lawfilesext.leg.wa.gov/biennium/2025-26/Pdf/Bills/Senate%20Bills/6346-S.pdf#page=22"
defined_for = StateCode.WA

def formula(tax_unit, period, parameters):
p = parameters(period).gov.contrib.states.wa.sb6346.standard_deduction
return p.amount

class wa_income_tax_taxable_income(Variable):
value_type = float
entity = TaxUnit
label = "Washington taxable income under SSB 6346"
unit = USD
definition_period = YEAR
reference = (
"https://lawfilesext.leg.wa.gov/biennium/2025-26/Pdf/Bills/Senate%20Bills/6346-S.pdf#page=21",
"https://lawfilesext.leg.wa.gov/biennium/2025-26/Pdf/Bills/Senate%20Bills/6346-S.pdf#page=22",
)
defined_for = StateCode.WA

def formula(tax_unit, period, parameters):
base_income = tax_unit("wa_income_tax_base_income", period)
charitable_deduction = tax_unit(
"wa_income_tax_charitable_deduction", period
)
standard_deduction = tax_unit("wa_income_tax_standard_deduction", period)
return max_(base_income - charitable_deduction - standard_deduction, 0)

class wa_income_tax(Variable):
value_type = float
entity = TaxUnit
label = "Washington income tax"
unit = USD
definition_period = YEAR
reference = "https://lawfilesext.leg.wa.gov/biennium/2025-26/Pdf/Bills/Senate%20Bills/6346-S.pdf#page=16"
defined_for = StateCode.WA

def formula(tax_unit, period, parameters):
p = parameters(period).gov.contrib.states.wa.sb6346
taxable_income = tax_unit("wa_income_tax_taxable_income", period)
sb6346_tax = taxable_income * p.rate
capital_gains_tax = tax_unit("wa_capital_gains_tax", period)
refundable_credits = tax_unit("wa_refundable_credits", period)
return sb6346_tax + capital_gains_tax - refundable_credits

class wa_working_families_tax_credit(Variable):
value_type = float
entity = TaxUnit
label = "Washington Working Families Tax Credit"
unit = USD
definition_period = YEAR
reference = (
"https://app.leg.wa.gov/RCW/default.aspx?cite=82.08.0206",
"https://lawfilesext.leg.wa.gov/biennium/2025-26/Pdf/Bills/Senate%20Bills/6346-S.pdf#page=52",
)
defined_for = StateCode.WA

def formula(tax_unit, period, parameters):
eitc = tax_unit("eitc", period)
eitc_eligible = eitc > 0
# SSB 6346 Sec. 901(2)(a)(ii)(C): individuals who do not meet
# the EITC age requirement but are at least age 18.
sb6346_p = parameters(period).gov.contrib.states.wa.sb6346.wftc
age_head = tax_unit("age_head", period)
age_spouse = tax_unit("age_spouse", period)
filer_at_least_min_age = (age_head >= sb6346_p.min_age) | (
age_spouse >= sb6346_p.min_age
)
earned_income = tax_unit("filer_adjusted_earnings", period)
has_earned_income = earned_income > 0
eligible = eitc_eligible | (filer_at_least_min_age & has_earned_income)
p = parameters(
period
).gov.states.wa.tax.income.credits.working_families_tax_credit
eitc_child_count = tax_unit("eitc_child_count", period)
max_amount = p.amount.calc(eitc_child_count)
eitc_agi_limit = tax_unit("eitc_agi_limit", period)
phase_out_start_reduction = p.phase_out.start_below_eitc.calc(
eitc_child_count
)
phase_out_start = eitc_agi_limit - phase_out_start_reduction
phase_out_rate = (max_amount - p.min_amount) / phase_out_start_reduction
excess = max_(0, earned_income - phase_out_start)
reduction = max_(0, excess * phase_out_rate)
phased_out_amount = max_amount - reduction
amount_if_eligible = where(
phased_out_amount > 0,
max_(p.min_amount, phased_out_amount),
0,
)
return amount_if_eligible * eligible

class reform(Reform):
def apply(self):
self.add_variable(wa_income_tax_base_income)
self.add_variable(wa_income_tax_charitable_deduction)
self.add_variable(wa_income_tax_standard_deduction)
self.add_variable(wa_income_tax_taxable_income)
self.update_variable(wa_income_tax)
self.update_variable(wa_working_families_tax_credit)

return reform


def create_wa_sb6346_reform(parameters, period, bypass=False):
if bypass:
return create_wa_sb6346()

p = parameters.gov.contrib.states.wa.sb6346

reform_active = False
current_period = period_(period)

for _ in range(5):
if p(current_period).in_effect:
reform_active = True
break
current_period = current_period.offset(1, "year")

if reform_active:
return create_wa_sb6346()
else:
return None


wa_sb6346 = create_wa_sb6346_reform(None, None, bypass=True)
Loading
Loading