Skip to content

Add Washington Senior Citizens and Disabled Persons Property Tax Exemption#8161

Draft
hua7450 wants to merge 8 commits intoPolicyEngine:mainfrom
hua7450:wa-senior-disabled-pte
Draft

Add Washington Senior Citizens and Disabled Persons Property Tax Exemption#8161
hua7450 wants to merge 8 commits intoPolicyEngine:mainfrom
hua7450:wa-senior-disabled-pte

Conversation

@hua7450
Copy link
Copy Markdown
Collaborator

@hua7450 hua7450 commented Apr 26, 2026

Summary

Implements Washington's Senior Citizens and Disabled Persons Property Tax Exemption Program in PolicyEngine-US (RCW 84.36.381–.389; WAC 458-16A).

Closes #8160

Regulatory Authority

Program Overview

  • Administration: Washington Department of Revenue + county assessors
  • Type: Property tax exemption (reduces the property tax bill; not a cash benefit paid to the household)
  • Indexing: County thresholds adjust triennially beginning Aug 1, 2023 (not annual)

Eligibility

Modeled as wa_pte_eligible (SPMUnit, YEAR), gated on three conditions:

Requirement Source How Modeled
Age 61+ OR retired due to disability RCW 84.36.381(3)(a)(i)–(ii) wa_pte_categorical_eligible = (age >= p.age_threshold) | is_disabled. Existing is_disabled boolean covers SSDI/SSI/VA/physician-certified disability; doesn't directly verify "retired from gainful employment" — documented in code comment.
Owner-occupant of primary residence RCW 84.36.381(1)(a), (2) add(spm_unit, period, ["real_estate_taxes"]) > 0 — only homeowners pay property tax directly, so a positive value implies ownership.
Combined disposable income ≤ Tier 3 county threshold RCW 84.36.381(5)(a); RCW 84.36.383(10) wa_pte_income_eligible = county-keyed tier-3 lookup

Combined Disposable Income (Simplified)

wa_pte_combined_disposable_income (SPMUnit, YEAR) — uses existing PolicyEngine variables only:

  • Add-backs (6 categories): AGI + tax_exempt_pension_income + military_basic_pay + veterans_benefits + tax_exempt_social_security + tax_exempt_interest_income
  • Deductions: medical_out_of_pocket_expenses + long_term_health_insurance_premiums

Excluded with documented gaps: §121 home-sale gain add-back, depreciation/loss add-back, non-AGI dividend receipts, 11 of 13 itemized medical deduction categories. See income/sources.yaml and income/deductions/sources.yaml for citations.

Income Thresholds (39 counties × 3 tiers × 4 time periods)

Period Statutory rule Counties affected
Pre-2020 Flat statewide $30k / $35k / $40k All 39
2020–2023 45% / 55% / 65% of County Median Household Income All 39
2024–2026 50% / 60% / 70% of County MHI All 39
2027–2029 50% / 60% / 70% of County MHI (next triennial) All 39

Source: DOR Income Thresholds for Senior Citizen and Disabled Persons Property Tax Exemption and Deferral

Example (King County 2024): Tier 1 = $60,000; Tier 2 = $72,000; Tier 3 = $84,000.

wa_pte_tier (SPMUnit, YEAR, int) returns 1/2/3 (lowest income → biggest exemption) or 0 (ineligible by income).

All county-tier threshold values across all 4 time periods verified against official DOR publications — see Verification TODO.

Benefit Calculation (Simplified Levy Approach)

The exemption is modeled as a percentage reduction of total real_estate_taxes (PolicyEngine has no levy-type breakdown):

Tier Reduction Rate Statutory Basis Calibration
Tier 1 (lowest income) 80% of real_estate_taxes RCW 84.36.381(5)(b)(ii): excess + Part 2 + lid-lift levies + regular-levy exemption on max($60k, 60% AV), no cap Estimate, no primary source
Tier 2 60% RCW 84.36.381(5)(b)(i): + regular-levy exemption on max($50k, 35% AV), capped $70k Estimate, no primary source
Tier 3 (highest qualifying income) 40% RCW 84.36.381(5)(a): excess + state Part 2 + lid-lift levies only Supported by DOR 2024 Property Tax Statistics, p. 89: excess + state Part 2 ≈ 39% of typical statewide bill

⚠️ Tier reduction rates are statewide approximations. Actual relief depends on the local mix of regular vs excess levies, which varies by jurisdiction and isn't decomposed in PolicyEngine. The DOR yearbook publishes statewide aggregates ($375.5M total relief, 118,039 claimants in 2024, average $3,181) but does not break out claimant counts or dollars by tier — so Tier 1 (80%) and Tier 2 (60%) cannot be validated with public data and remain estimates. Documented in YAML comments.

wa_senior_disabled_property_tax_exemption (SPMUnit, YEAR, USD) = add(spm_unit, period, ["real_estate_taxes"]) * tier_reduction_rate.

Tax Exemption — Not a Cash Benefit

This program reduces the property tax bill; no cash changes hands. The variable is not wired into spm_unit_benefits or household_state_benefits.yaml, since the household doesn't receive a payment. To capture the tax-side effect (reduced SALT deduction, increased net income), wire as a reduction of real_estate_taxes in a follow-up.

Not Modeled (by design — scope decision)

What Source Why Excluded
VA 80%+ disability rating pathway RCW 84.36.381(3)(b) User scope; existing veterans_benefits doesn't expose rating granularity
Surviving spouse 57+ pathway RCW 84.36.381(3)(a)(iii) User scope; would require new input variable
Valuation freeze RCW 84.36.381(6); WAC 458-16A-140 User scope; requires longitudinal home value tracking
Full 13-category medical deductions RCW 84.36.383(2) User scope; 5–6 missing input variables (Medigap, DME, insulin, nursing home costs, etc.)
Levy-type decomposition RCW 84.36.381(5) PE has no levy breakdown — modeled as % of total
Cotenant income aggregation RCW 84.36.383(2) opening SPM unit aggregation is the v1 proxy
Annualized partial-year income RCW 84.36.381(4)(b)–(c) Not simulatable in calendar-year framework
Care-facility absence exception RCW 84.36.381(1)(a)(i)–(iii) Edge case
Parcel acreage cap RCW 84.36.383(13) No parcel data
§121 home-sale gain add-back RCW 84.36.383(7)(a) capital_gains doesn't decompose; AGI already nets §121 exclusion
Veterans-benefits subcomponent exclusions RCW 84.36.383(7)(f) veterans_benefits is a single bucket; can't separate VA disability comp / DIC / attendant-care from taxable portion
Property-tax deferral program RCW 84.38 Out of scope (separate program)
Reduction of real_estate_taxes / SALT integration Variable computes but isn't wired into property tax / SALT yet

Files

parameters/gov/states/wa/dor/property_tax_exemption/senior_disabled/
├── age_threshold.yaml
├── income/
│   ├── sources.yaml
│   ├── deductions/sources.yaml
│   └── thresholds/{tier_1,tier_2,tier_3}.yaml      # 39 counties × 4 periods
└── benefit/{tier_1,tier_2,tier_3}_reduction_rate.yaml

variables/gov/states/wa/dor/property_tax_exemption/senior_disabled/
├── wa_pte_categorical_eligible.py                  # age 61+ OR is_disabled
├── wa_pte_eligible.py                              # categorical & owner-proxy & income
├── wa_senior_disabled_property_tax_exemption.py    # benefit
└── income/
    ├── wa_pte_combined_disposable_income.py
    ├── wa_pte_income_eligible.py
    └── wa_pte_tier.py

Integration:

  • changelog.d/wa-senior-disabled-pte.added.md

Test Plan

  • 56 program-specific YAML tests pass
  • Microsim regression (CPS 2023, 2024-2025) — variable not consumed by household totals; defined_for filters output to WA only
  • Edge cases for income boundaries, county variation, time-period transitions (2019/2022/2024/2028)
  • CI passes

Verification TODO

  • All county-tier threshold values verified against official DOR publications across all 4 time periods (pre-2020, 2020-2023, 2024-2026, 2027-2029)
  • Tier reduction rates: Tier 3 (0.4) supported by DOR 2024 yearbook; Tier 1 (0.8) and Tier 2 (0.6) remain estimates without primary source — refine if DOR publishes tier-level data, or via direct request to DOR Research division
  • Wire as a reduction of real_estate_taxes (currently the exemption variable computes but doesn't reduce property tax / federal SALT)
  • Disability proxy: is_disabled covers unable-to-work disability across SSA/VA/physician pathways but doesn't directly verify the statute's "retired from gainful employment" condition

hua7450 and others added 2 commits April 26, 2026 17:59
…licyEngine#8160)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Implements county-keyed income thresholds (39 counties × 3 tiers, with
2008/2020/2024/2027 transitions) and tier-based reduction rates per RCW
84.36.381 and 84.36.383. Eligibility requires categorical (age 61+ or
SSDI receipt as a disability proxy), owner-occupant, and combined
disposable income at or below the county Tier 3 limit. Status set to
"partial" in programs.yaml: tier reduction rates are statewide
approximations because PolicyEngine's real_estate_taxes input does not
decompose into excess vs regular levies.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@codecov
Copy link
Copy Markdown

codecov Bot commented Apr 26, 2026

Codecov Report

❌ Patch coverage is 73.07692% with 21 lines in your changes missing coverage. Please review.
✅ Project coverage is 70.62%. Comparing base (20705b0) to head (d442275).
⚠️ Report is 38 commits behind head on main.

Files with missing lines Patch % Lines
...abled/wa_senior_disabled_property_tax_exemption.py 66.66% 5 Missing ⚠️
...n/senior_disabled/income/wa_pte_income_eligible.py 69.23% 4 Missing ⚠️
...ax_exemption/senior_disabled/income/wa_pte_tier.py 69.23% 4 Missing ⚠️
...ion/senior_disabled/wa_pte_categorical_eligible.py 69.23% 4 Missing ⚠️
...y_tax_exemption/senior_disabled/wa_pte_eligible.py 69.23% 4 Missing ⚠️
Additional details and impacted files
@@             Coverage Diff             @@
##             main    #8161       +/-   ##
===========================================
- Coverage   85.36%   70.62%   -14.75%     
===========================================
  Files           3     4571     +4568     
  Lines          41    66422    +66381     
  Branches        2      336      +334     
===========================================
+ Hits           35    46909    +46874     
- Misses          6    19511    +19505     
- Partials        0        2        +2     
Flag Coverage Δ
unittests 70.62% <73.07%> (-14.75%) ⬇️

Flags with carried forward coverage won't be shown. Click here to find out more.

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

hua7450 and others added 6 commits April 26, 2026 19:35
- Remove capital_gains and qualified_dividend_income from disposable income sources (already in AGI; only the §121 home-sale exclusion add-back applies under RCW 84.36.383(7)(a), and there is no PE variable for that)
- Add wa_pte_categorical_eligible.yaml unit test (4 OR-logic cases)
- Add 2022-01 and 2028-01 era coverage to wa_pte_income_eligible.yaml
- Update wa_pte_combined_disposable_income.yaml Case 3 expected output

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…cture

- Switch all variables from MONTH to YEAR (property tax is annual)
- Inline wa_pte_age_eligible and wa_pte_disability_eligible into wa_pte_categorical_eligible
- Replace wa_pte_owner_occupant with real_estate_taxes > 0 check
- Reorganize parameter folders: drop 1-file subfolders, move thresholds under income/
- Reorganize variable folders to mirror parameters (no benefit/ or eligibility/ 1-file subfolders)
- Remove from spm_unit_benefits.py and household_state_benefits.yaml (this is a tax exemption, not a cash benefit)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Property tax exemptions and circuit-breakers are conventionally TaxUnit-level
in PolicyEngine-US (cf. mo_property_tax_credit, mi_homestead_property_tax_credit,
mt_elderly_homeowner_renter_credit). This PR's variables now match that
convention, which also aligns with the future TODO of wiring this exemption as
a reduction of real_estate_taxes / SALT.

Changed entity = SPMUnit -> TaxUnit for: wa_pte_eligible,
wa_pte_combined_disposable_income, wa_pte_income_eligible, wa_pte_tier,
wa_senior_disabled_property_tax_exemption. wa_pte_categorical_eligible stays
Person.

Also restructured wa_pte_categorical_eligible.yaml tests with the full
people/tax_units/spm_units/households hierarchy for consistency with other
test files in this suite.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Implement Washington Senior Citizens and Disabled Persons Property Tax Exemption Program

1 participant