Add Washington Senior Citizens and Disabled Persons Property Tax Exemption#8161
Draft
hua7450 wants to merge 8 commits intoPolicyEngine:mainfrom
Draft
Add Washington Senior Citizens and Disabled Persons Property Tax Exemption#8161hua7450 wants to merge 8 commits intoPolicyEngine:mainfrom
hua7450 wants to merge 8 commits intoPolicyEngine:mainfrom
Conversation
…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 Report❌ Patch coverage is 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
Flags with carried forward coverage won't be shown. Click here to find out more. ☔ View full report in Codecov by Sentry. 🚀 New features to boost your workflow:
|
- 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>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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
Eligibility
Modeled as
wa_pte_eligible(SPMUnit, YEAR), gated on three conditions:wa_pte_categorical_eligible=(age >= p.age_threshold) | is_disabled. Existingis_disabledboolean covers SSDI/SSI/VA/physician-certified disability; doesn't directly verify "retired from gainful employment" — documented in code comment.add(spm_unit, period, ["real_estate_taxes"]) > 0— only homeowners pay property tax directly, so a positive value implies ownership.wa_pte_income_eligible= county-keyed tier-3 lookupCombined Disposable Income (Simplified)
wa_pte_combined_disposable_income(SPMUnit, YEAR) — uses existing PolicyEngine variables only: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.yamlandincome/deductions/sources.yamlfor citations.Income Thresholds (39 counties × 3 tiers × 4 time periods)
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):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_benefitsorhousehold_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 ofreal_estate_taxesin a follow-up.Not Modeled (by design — scope decision)
veterans_benefitsdoesn't expose rating granularitycapital_gainsdoesn't decompose; AGI already nets §121 exclusionveterans_benefitsis a single bucket; can't separate VA disability comp / DIC / attendant-care from taxable portionreal_estate_taxes/ SALT integrationFiles
Integration:
changelog.d/wa-senior-disabled-pte.added.mdTest Plan
Verification TODO
real_estate_taxes(currently the exemption variable computes but doesn't reduce property tax / federal SALT)is_disabledcovers unable-to-work disability across SSA/VA/physician pathways but doesn't directly verify the statute's "retired from gainful employment" condition