Skip to content

Conversation

@hua7450
Copy link
Collaborator

@hua7450 hua7450 commented Dec 15, 2025

Summary

Fixes #6776 (PFA)
Fixes #6777 (PFAE)

Implements the Illinois Preschool For All (PFA) and Preschool For All Expansion (PFAE) programs, administered by the Illinois State Board of Education (ISBE).

Regulatory Authority

Program Overview

Aspect PFA PFAE
Hours Part-day: 2.5 hrs/day Full-day: 5+ hrs/day
Meals Snack only Breakfast + Lunch + Snack
Funding/Child (FY2024) $3,900 $8,500
Funding/Child (FY2025) $3,900 $8,500
Services Basic preschool Comprehensive + family support

Note: PFA and PFAE share identical eligibility criteria. A child receives one or the other based on local program availability, not both simultaneously.

PFAE Eligibility Model

Based on the ISBE PDG Enrollment Form, PFAE uses a weighted point system:

Basic Eligibility

  • Age 3-5 years (before kindergarten per 105 ILCS 5/10-20.12)
  • Family income ≤ 400% FPL (per 105 ILCS 5/2-3.71(a)(4.5))

Highest Priority Factors (50 points each)

If a child has any one of these factors, they are directly enrolled in PFAE:

# Factor Variable
1 Homeless (McKinney-Vento) is_homeless
2 Child welfare involvement (foster care) is_in_foster_care
3 Has IEP or referred for special education has_individualized_education_program
4 Family income ≤ 50% FPL and/or receiving TANF il_pfae_is_deep_poverty or il_tanf > 0

Secondary Priority Factors (25 points each)

Children with 2+ of these factors qualify for PFAE:

# Factor Variable
5 Family income ≤ 100% FPL il_pfae_is_low_income
6 Parent didn't complete high school parent_has_less_than_high_school_education (Household)
7 Teen parent at birth of first child (under 20) il_isbe_was_teen_parent_at_first_birth (SPMUnit)
8 Child/parent born outside US is_born_outside_us
9 Non-English speaking home is_non_english_speaking_home (Household)
10 Active Duty Military family military_basic_pay > 0
11 Developmental delays (without IEP) has_developmental_delay
12 Never attended formal early learning has_no_prior_formal_early_learning

Eligibility Formula

PFAE Eligible = Basic Eligible AND (any highest priority factor OR 2+ secondary priority factors)

Where:
  Basic Eligible = Age 3-5 AND Income ≤ 400% FPL

Income Definition

Per ISBE Form 69-72, countable income includes:

  • Earnings from work (gross, before deductions)
  • Child support, alimony
  • Pensions, retirement, Social Security
  • Workers' comp, unemployment, SSI, VA benefits, disability

Excluded: SNAP, FDPIR, WIC, TANF, federal education benefits, foster payments

Benefit Amounts

Program FY2024 FY2025 Source
PFA $3,900 $3,900 Smart Start Press Releases
PFAE $8,500 $8,500 Smart Start Press Releases

Calculations:

  • PFA FY2024: $20.99M ÷ 5,383 children = $3,900
  • PFA FY2025: $15.63M ÷ 4,008 children = $3,900
  • PFAE FY2024: $4.28M ÷ 503 children = $8,500
  • PFAE FY2025: $9.70M ÷ 1,142 children = $8,500

New Variables

IL ISBE Shared Variables

Variable Entity Description
il_isbe_countable_income SPMUnit ISBE countable income for eligibility
il_isbe_income_eligible Person Income ≤ 400% FPL eligibility
il_isbe_was_teen_parent_at_first_birth SPMUnit Parent was under 20 at birth of first child

Demographic Input Variables

Variable Entity Description
is_born_outside_us Person Person was born outside the United States
has_no_prior_formal_early_learning Person Child has NOT attended formal early learning program
has_individualized_education_program Person Has Individualized Education Program (IEP)
has_developmental_delay Person Has screening-indicated developmental delay
is_non_english_speaking_home Household Household primary language is not English
parent_has_less_than_high_school_education Household Parent didn't complete high school

PFA Variables

Variable Description
il_pfa PFA benefit amount
il_pfa_eligible PFA eligibility (mirrors PFAE)

PFAE Eligibility Variables

Variable Description
il_pfae_eligible Main PFAE eligibility determination
il_pfae_basic_eligible Age and income eligibility combined
il_pfae_age_eligible_child Age 3-5 eligibility

PFAE Priority Variables

Variable Description
il_pfae_has_highest_priority_factor Has any 50-point factor
il_pfae_secondary_priority_factor_count Count of 25-point factors
il_pfae_is_deep_poverty Income ≤ 50% FPL
il_pfae_is_low_income Income ≤ 100% FPL

PFAE Benefit Variables

Variable Description
il_pfae PFAE benefit amount

Parameters

Parameter Path Value Description
gov.states.il.isbe.income.income_limit_rate 4.0 400% FPL max income
gov.states.il.isbe.income.countable_sources list Income sources for ISBE programs
gov.states.il.isbe.pfa.benefit.amount $3,900 PFA per-child funding (FY2024+)
gov.states.il.isbe.pfae.benefit.amount $8,500 PFAE per-child funding (FY2024+)
gov.states.il.isbe.pfae.eligibility.age_range 3-5 Eligible age range
gov.states.il.isbe.pfae.eligibility.income.deep_poverty_rate 0.5 50% FPL (highest priority)
gov.states.il.isbe.pfae.eligibility.income.low_income_rate 1.0 100% FPL (secondary priority)
gov.states.il.isbe.age_threshold.teen_parent 20 Age threshold for teen parent factor

Test Coverage

  • Unit tests for each eligibility variable
  • Integration tests with realistic family scenarios
  • Priority factor tests for highest and secondary factors
  • 47 total test cases

🤖 Generated with Claude Code

@codecov
Copy link

codecov bot commented Dec 15, 2025

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 100.00%. Comparing base (0ef8eeb) to head (b0e1680).
⚠️ Report is 124 commits behind head on main.

Additional details and impacted files
@@             Coverage Diff             @@
##             main     #6982      +/-   ##
===========================================
+ Coverage   91.89%   100.00%   +8.10%     
===========================================
  Files           5        19      +14     
  Lines         148       222      +74     
  Branches       14         0      -14     
===========================================
+ Hits          136       222      +86     
+ Misses         12         0      -12     
Flag Coverage Δ
unittests 100.00% <100.00%> (+8.10%) ⬆️

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 3 commits December 15, 2025 00:53
- PFA: Requires 1+ risk factors (was 2+) to broaden eligibility
- PFAE: Requires 2+ risk factors OR highest-priority PLUS income ≤200% FPL
- This models PFAE as "priority for full-day slots" rather than separate eligibility
- Updated tests to reflect Illinois Medicaid coverage counting as risk factor
- PFAE now represents families most likely to access full-day comprehensive services

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
@hua7450 hua7450 changed the title Pre-School for All (PFA) & Extension Illinois Preschool For All (PFA) & Expansion (PFAE) Dec 16, 2025
@hua7450 hua7450 marked this pull request as ready for review December 16, 2025 16:34
hua7450 and others added 4 commits December 16, 2025 11:41
Clarifies that PFA/PFAE includes 5-year-olds as a simplification since
PolicyEngine cannot model the September 1 kindergarten cutoff date.
Per 105 ILCS 5/10-20.12, children who turn 5 on or before September 1
are kindergarten eligible; those with later birthdays remain in PFA/PFAE.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
@hua7450 hua7450 marked this pull request as draft December 17, 2025 02:26
@hua7450 hua7450 marked this pull request as ready for review December 19, 2025 16:58
@PavelMakarchuk
Copy link
Collaborator

PR Review: Illinois Preschool For All (PFA) & Expansion (PFAE)

✅ Overall Assessment: APPROVE

This is a well-structured education program implementation with a sophisticated weighted point eligibility system. All CI checks pass. The implementation correctly models the ISBE enrollment form's priority factor system.


🟢 Strengths

Implementation Quality:

  • Excellent modeling of the weighted eligibility system (50-point highest priority vs 25-point secondary factors)
  • All policy values properly parameterized (400% FPL, age range, benefit amounts)
  • Correct entity hierarchy usage (Person, SPMUnit, Household)
  • Proper vectorization patterns throughout
  • Good use of adds attribute for income sources and benefit amounts
  • Clear documentation of the two-tier priority system

Reference Quality:

  • Core statutory reference (105 ILCS 5/2-3.71) verified for 400% FPL income limit
  • Age eligibility properly supported by 23 IAC 235.10 and kindergarten statute
  • Teen parent threshold appropriately cross-referenced to IDHS program

Test Coverage:

  • 47 test cases as documented
  • Good coverage of age boundaries (2, 3, 4, 5, 6 years)
  • Developmental delay WITH vs WITHOUT IEP properly tested
  • Multiple secondary factor combinations tested

New Input Variables:

  • Useful new demographic variables (is_born_outside_us, has_individualized_education_program, etc.) that can be reused by other programs

🟡 Should Address

1. Hard-Coded Policy Threshold

File: il_pfae_eligible.py:28

return basic_eligible & (has_highest_priority | (secondary_count >= 2))

The >= 2 is a policy value from the ISBE enrollment form. Consider creating a parameter:

# gov/states/il/isbe/pfae/eligibility/required_secondary_factor_count.yaml
values:
  2024-01-01: 2

This allows for policy analysis if the threshold changes.

2. Missing Critical Edge Case Test

Issue: No test verifies that exactly 1 secondary factor is INELIGIBLE.

The eligibility logic requires 2+ secondary factors, but there's no test confirming this boundary:

- name: Ineligible - basic eligible but only 1 secondary factor
  period: 2024
  input:
    state_code: IL
    age: 4
    is_born_outside_us: true  # Only 1 secondary factor
    employment_income: 50_000  # Above 100% FPL
  output:
    il_pfae_secondary_priority_factor_count: 1
    il_pfae_eligible: false

3. Missing Unit Test Files

The following variables only have integration test coverage:

  • il_pfa.py (benefit amount)
  • il_pfae.py (benefit amount)
  • il_pfa_eligible.py
  • il_isbe_countable_income.py

Consider adding dedicated unit tests.


🟢 Suggestions (Optional)

1. Highest Priority Factor Test Gaps

The il_pfae_has_highest_priority_factor tests cover IEP, foster care, and deep poverty. Consider adding:

  • Homeless (McKinney-Vento) - not tested
  • Receives TANF (il_tanf > 0) - not tested

2. Income Boundary Tests

All three FPL thresholds (400%, 100%, 50%) lack exact boundary tests. Consider adding tests at exactly the threshold values.

3. Benefit Amount Derivation

The $3,900 and $8,500 per-child amounts are calculated from total funding / enrolled children. The reference titles document this calculation, which is good. Consider adding a code comment noting these are derived values, not statutory rates.

4. FY2024 Press Release Link

The illinois.gov FY2024 press release URL may be returning an empty template. Verify accessibility or find an archived version.


📊 Validation Summary

Check Result
CI Status ✅ All checks pass
Hard-coded Values 🟡 One threshold (>= 2)
Reference Quality ✅ Core statutes verified
Vectorization ✅ Correct patterns
Entity/Period Usage ✅ Correct
Test Coverage 🟡 Good, minor gaps

📝 Notes

Program Structure (Well Documented):

  • Basic eligibility: Age 3-5 AND income ≤ 400% FPL
  • Highest Priority (50 pts): homeless, foster care, IEP, deep poverty/TANF → automatic enrollment
  • Secondary Priority (25 pts): 8 factors including low income, teen parent, immigrant, military
  • Need 2+ secondary factors OR 1+ highest priority to qualify

Known Simplification (Documented):
The age eligibility includes all 5-year-olds as a simplification since PolicyEngine doesn't track birth month. The code comments explain this appropriately.


Verdict: APPROVE - Ready for merge. The suggestions above would strengthen the implementation but are not blocking.

🤖 Generated with Claude Code

@PavelMakarchuk PavelMakarchuk merged commit 3ae3885 into PolicyEngine:main Dec 19, 2025
10 checks passed
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.

Pre-School for All Expansion (PFAE) Pre-School for All (PFA)

2 participants