Implement Washington ECEAP (Early Childhood Education and Assistance Program)#8154
Open
hua7450 wants to merge 9 commits intoPolicyEngine:mainfrom
Open
Implement Washington ECEAP (Early Childhood Education and Assistance Program)#8154hua7450 wants to merge 9 commits intoPolicyEngine:mainfrom
hua7450 wants to merge 9 commits intoPolicyEngine:mainfrom
Conversation
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## main #8154 +/- ##
============================================
+ Coverage 85.36% 100.00% +14.63%
============================================
Files 3 9 +6
Lines 41 134 +93
Branches 2 4 +2
============================================
+ Hits 35 134 +99
+ Misses 6 0 -6
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:
|
- Fix FSKA Sec. 403 page anchor: #page=7 → #page=9 in 5 files - Replace ccdf_income (excludes govt transfers) with new wa_eceap_family_income aggregator (market_income + TANF + SSI + Social Security + child support) per RCW 43.216.505 - Fix is_single_parent_household projection: child-level access was always False; now projects via add(spm_unit, ...) > 0 so parent's flag reaches the child Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Round 2 fixes (from /review-program round 2):
- wa_eceap_family_income: add 4 missing income types per WAC 110-425-0080
(unemployment_compensation, alimony_income, veterans_benefits, workers_compensation)
- wa_eceap_risk_factor_eligible: switch single-parent projection from
add(spm_unit, ...) > 0 to person.spm_unit.any(...) (idiomatic pattern)
- in_effect.yaml: add specific subsection citation for 2030-08-01 sunset
- early_eceap_age_limit.yaml: drop FSKA Sec. 403 (income), add WAC 110-425
- wa_eceap_categorically_eligible: clarify "prior Head Start" proxy scope in docstring
- wa_eceap_eligible: document why is_on_tribal_land is not an Indian-child proxy
Historical fidelity (per HB 1945 Feb 2024 House Bill Report):
- Add FPL-era parameters for Early ECEAP and risk-factor pathway
- early_eceap_fraction_of_fpg.yaml (130% FPL)
- early_eceap_uses_fpg.yaml (basis toggle)
- risk_factor_pathway/lower_fraction_of_fpg.yaml (130% FPL lower bound)
- risk_factor_pathway/fraction_of_fpg.yaml (200% FPL upper bound)
- risk_factor_pathway/uses_fpg.yaml (basis toggle)
- Update wa_early_eceap_income_eligible and wa_eceap_risk_factor_eligible
formulas with FPL/SMI branching
- Backfill all parameters to FSKA enactment (2021-07-25): 110% FPL standard,
130% FPL Early ECEAP, 130-200% FPL risk-factor; SMI rollover 2025-10-01
Reorganization:
- Drop wa_ prefix from parameter file names (path already has wa_)
- Drop is_ prefix from variable class names (matches wa_tanf, wa_apple_health convention)
- Hierarchical variable folders: eceap/{eligibility/{age,income,categorical,risk_factor},income/}
- Top-level outputs (wa_eceap_eligible, wa_early_eceap_eligible) at eceap/ root
- Update programs.yaml: variable: wa_eceap_eligible
100/100 ECEAP tests pass; make format clean.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- Variables: drop eligibility/, age/, income/ subfolders; flat layout under eceap/ with early_eceap/ subfolder for the birth-to-three variant - Parameters: drop age/ subfolder (age_range and age_limit move up one level) - Parameter filenames under early_eceap/ drop the early_eceap_ prefix since the folder already disambiguates - Add income_sources.yaml at top of eceap/ and convert wa_eceap_family_income to YAML-driven adds (gov.states.wa.dcyf.eceap.income_sources) - Update parameter paths in 3 formulas (wa_eceap_age_eligible, wa_early_eceap_age_eligible, wa_early_eceap_income_eligible) 100/100 ECEAP tests pass; make format clean. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- Add separate birth_to_three_eceap/uses_fpg toggle (flips 2026-07-01, not 2025-07-01 like standard ECEAP) - Move BT3 SMI rate effective date 2025-10-01 to 2026-07-01 - Replace shared wa_eceap_categorically_eligible (homeless | IEP) with inline is_snap_eligible: BT3 statute has no homeless/IEP path, only income or Basic Food/SNAP/FAP - Update BT3 income variable to use local toggle - Rewrite BT3 tests for FPL era (2025-2026) and SMI era (2027+), including regression tests confirming the 2026-07-01 transition 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 Early Childhood Education and Assistance Program (ECEAP), including both standard ECEAP (ages 3-5, RCW 43.216.505/512) and Birth to Three ECEAP (under age 3, RCW 43.216.578). Service eligibility only — ECEAP provides preschool slots, not a cash benefit. Analogous to federal Head Start.
Closes #8153
Regulatory Authority
Program Overview
ECEAP is Washington's state-funded preschool program administered by DCYF. It provides preschool slots plus wraparound family-support services. Standard ECEAP (RCW 43.216.505) and Birth to Three ECEAP (RCW 43.216.578) are governed by separate statutes with different rules and different transition dates. Per the Fair Start for Kids Act (2021 c 199), Sections 204-206 took effect July 1, 2025, replacing FPL-based thresholds with state median income for standard ECEAP; the threshold rises to 50% SMI on August 1, 2030. Birth to Three transitions on a different date (2026-07-01).
Income Eligibility (Standard ECEAP)
The standard pathway uses a single FPG-or-SMI rate gated by the standard
uses_fpgtoggle:Why 130% FPL, not 110%: per RCW 43.216.505, families ≤ 110% FPL have priority enrollment; per RCW 43.216.512, families 110-130% FPL are allowed enrollment without a risk factor (space-available). PolicyEngine does not simulate space allocation, so both pathways are treated as eligible. The 130-200% FPL with-risk-factor band lives in
wa_eceap_risk_factor_eligible. Documented in a code comment.Risk-factor pathway (RCW 43.216.512): applies in the 130-200% FPL band (FPL era) or 36-50% SMI band (SMI era) for children with at least one modeled risk factor; expires 2030-08-01. The lower bound reuses the parent
fpg_rate/smi_rate, since the risk-factor band starts where the standard pathway ends.Birth to Three ECEAP (RCW 43.216.578)
Quoted directly from the statute: a child must be under 36 months old AND either (i) household income at or below the income threshold, OR (ii) eligible for / receiving SNAP or state FAP. No homelessness or IEP categorical pathway exists in RCW 43.216.578, unlike standard ECEAP.
Birth to Three has its own FPG↔SMI toggle (
birth_to_three_eceap/uses_fpg.yaml):The categorical SNAP path uses the existing
is_snap_eligible(SPMUnit) projected to Person, inlined directly inwa_birth_to_three_eceap_eligible. State FAP (for SNAP-ineligible legal immigrants) is documented as not modeled — small edge case, no PolicyEngine variable available.Age Eligibility (Standard ECEAP)
Per RCW 43.216.505(4) and WAC 110-425-0080, an ECEAP-eligible child is at least 3 by August 31 of the school year and not yet kindergarten-age, with mid-year carry-over for a child who turns 5 during enrollment. PolicyEngine evaluates age annually without an Aug-31 anchor, so we take the generous reading and treat ages 3-5 as eligible to capture the carry-over case. Documented in a code comment.
Family Income Definition (
wa_eceap_family_income)The income aggregator counts the sources DCYF lists in Form 05-006, Section 9 (page 6) of the official ECEAP application. The list is a
unit: listparameter (income_sources.yaml), pulled in via parameter-drivenadds:Source list (
income_sources.yaml):market_income(covers W-2, self-employment, military pay)tanf_reportedssi_reportedsocial_securitychild_support_receivedunemployment_compensationveterans_benefitsworkers_compensationalimony_incomeis excluded — it is not listed in DCYF Form 05-006 Section 9. Tribal income, emergency assistance cash, regular insurance payments, training stipends, and scholarships listed in Section 9 have no PolicyEngine equivalent at the moment.Categorical Eligibility (Standard ECEAP,
wa_eceap_categorically_eligible)Per RCW 43.216.505(4), only two categorical paths are modelable with existing inputs:
is_homeless(Household)has_individualized_education_program(Person)The other two statutory pathways — prior early-intervention services (Early Head Start / ESIT / class C developmental services / Birth-to-Three ECEAP / ECLIPSE) and Native-American + 100% SMI — are not modeled because we do not track those prior-program indicators or tribal enrollment at the moment. These categorical paths apply ONLY to standard ECEAP, not Birth to Three — RCW 43.216.578 has its own (different, narrower) categorical rules.
Risk Factors Modeled (Standard ECEAP only)
Modelable subset of RCW 43.216.512 risk factors using existing PolicyEngine inputs:
is_non_english_speaking_home(Household)is_migratory_child(Person)has_developmental_delay(Person)has_individualized_education_program(Person)is_single_parent_household(Person, projected viaperson.spm_unit.any(...))Not modeled (no input variables): domestic violence, incarcerated parent, teen parent, parent education level, substance abuse, premature/LBW birth, chronic health, deployed military, loss of caregiver, Indian Boarding School family history, per-person ELL status.
Variables Created
wa_eceap_eligiblewa_eceap_age_eligiblewa_eceap_income_eligiblewa_eceap_categorically_eligiblewa_eceap_risk_factor_eligiblewa_eceap_family_incomeadds)wa_birth_to_three_eceap_eligiblewa_birth_to_three_eceap_age_eligiblewa_birth_to_three_eceap_income_eligibleAll variables have
defined_for = StateCode.WAanddefinition_period = YEAR. Following Washington convention, nois_prefix; thewa_state prefix is retained.Parameter Structure
Parameters use a flat-by-rate convention (
fpg_rate,smi_rate) with separate FPG↔SMI toggles for the two programs:The standard toggle and the risk-factor pathway share
eceap.uses_fpgbecause they transition on the same date (2025-07-01). Birth to Three has its own toggle because RCW 43.216.578 transitions one year later (2026-07-01).Existing Variables Reused
age,is_homeless,has_individualized_education_program,is_snap_eligibleis_migratory_child,is_non_english_speaking_home,has_developmental_delay,is_single_parent_householdspm_unit_fpg,hhs_smimarket_income,tanf_reported,ssi_reported,social_security,child_support_received,unemployment_compensation,veterans_benefits,workers_compensationScope Excluded (documented reasons)
is_snap_eligibleis used as the proxy.Open Questions / Known Gaps
is_in_foster_care/was_in_foster_caretowa_eceap_categorically_eligiblein a follow-up.Files Added/Updated
policyengine_us/parameters/gov/states/wa/dcyf/eceap/— 12 parameter YAMLspolicyengine_us/variables/gov/states/wa/dcyf/eceap/— 9 variable .py filespolicyengine_us/tests/policy/baseline/gov/states/wa/dcyf/eceap/— 8 test YAMLs (98 test cases)policyengine_us/programs.yaml— ECEAP added as state implementation under federal Head Start entry,variable: wa_eceap_eligiblechangelog.d/wa-eceap.added.mdTest plan
make formatclean