Skip to content

Implement Florida child care subsidy (School Readiness Program)#8598

Merged
MaxGhenis merged 18 commits into
PolicyEngine:mainfrom
hua7450:fl-ccap
Jun 14, 2026
Merged

Implement Florida child care subsidy (School Readiness Program)#8598
MaxGhenis merged 18 commits into
PolicyEngine:mainfrom
hua7450:fl-ccap

Conversation

@hua7450

@hua7450 hua7450 commented Jun 8, 2026

Copy link
Copy Markdown
Collaborator

Summary

Implements Florida's School Readiness Program (SR) — the state's CCDF-funded child care subsidy, administered by the Division of Early Learning (DEL) within the Florida Department of Education, and delivered through 30 local Early Learning Coalitions (ELCs).

Modeled scope (important): this PR models only the SMI-Percentage sliding fee scale (effective 2025-10-01). The pre-2025-10 rule eras — the Standard Dollar-Based scale and the Percentage-FPL scale (both keyed to enrollment cohort) — and the CCEP / SR Match / SR Plus pathways are not modeled. PolicyEngine has no enrollment-cohort state, so for any simulation period the SMI-Percentage scale applies; the program is gated off before 2025-10-01. The benefit is capped at the statewide per-county provider reimbursement schedule (all 67 counties; SPB 2502 / 6M-4.500), and there is no TANF categorical bypass (see Not Modeled).

Closes #8597

Regulatory Authority

Program Overview

  • Administration: State-level by DEL (statewide eligibility rules, income thresholds, asset limit, sliding fee scale, and the statewide per-county provider reimbursement-rate maximums); regional delivery by 30 ELCs (the coalition-defined "unit of care" full-time/part-time boundary, copay-waiver choices, waitlist ordering). The maximum reimbursement rates are published statewide per county under SPB 2502 / 6M-4.500 — they are not set freely by each coalition.
  • Agency folder: files live under gov/states/fl/doe/sr/. The agency segment is doe (Florida Department of Education — the parent department of the Division of Early Learning, which administers SR). This was chosen to match the department-level fl/dcf convention already used in the repo, and because del is a Python reserved keyword that would force bracket parameter access (parameters(...)["del"]) instead of clean dotted access.
  • Funding: Federal CCDF + state appropriations (Fla. Stat. §1002.89).
  • Caseload: FY2023-24 — 117,981 enrollments age 0–4 against 357,199 eligible (≈33% of eligible children served statewide); FY2022-23 — 212,062 children at 6,889 providers, ≈$990M expenditures (CS/HB 859 staff analysis, p.4–5).

Eligibility

Requirement Source How Modeled
Income — new applicants ≤ 55% SMI Fla. Stat. §1002.81(6) (2025, "55 percent of the state median income"); DEL SMI scale p.2 footnote ("55% SMI = SR entry threshold") is_fl_sr_income_eligible reads entry_smi_rate (0.55) when fl_sr_enrolled == False
Income — continued/exit ≤ 85% SMI 6M-4.200(2)(b)(3)a., (4)(a); DEL SMI scale p.2 footnote ("85% SMI = upper eligibility") is_fl_sr_income_eligible reads exit_smi_rate (0.85) when fl_sr_enrolled == True
Countable income = gross family income of members 18+ (no SR-specific disregards) Fla. Stat. §1002.81(7) (gross income, earned or unearned, of members 18 or older); 6M-4.400 FAQ Q6 fl_sr_countable_income sums the 19 income/sources.yaml sources over members 18+ only (add(person, …) × ~is_child); a minor's earned and unearned income is excluded
Parent activity: single ≥ 20 hr/wk; two-parent ≥ 40 hr/wk combined; in a two-parent family one parent may be age/disability-exempt if the other works ≥ 20 (§1002.81(14)(c)); approved non-work activities count Fla. Stat. §1002.81(14)(a)–(c) "working family" (confirmed by State Plan s. 2.2.2); §1002.87(5)–(6) (90-day grace) is_fl_sr_activity_eligible reads weekly_hours_worked_before_lsr (pre-LSR — SNAP convention) against activity_hours_single (20) / activity_hours_two_parent (40). The age/disability exemption (is_disabled | is_senior, 65+) is two-parent-only; a single disabled non-working parent and a both-exempt couple qualify (if at all) via the protective-services pathway (next row) or meets_ccdf_activity_test (education/training/job-search/grace, default false)
Protective-services pathway — a protective-services child qualifies with the income and activity tests waived State Plan §2.2.2(f)–(h) (income waiver §2.2.2.g, activity waiver §2.2.2.h); Fla. Stat. §1002.81(1) fl_sr_protective_services = any member receives_or_needs_protective_services. is_fl_sr_eligible uses (income_eligible | protective_services); is_fl_sr_activity_eligible ORs it in. Age, asset, residency, and in_effect still apply; the copay is not waived (the §3.3.1 copay waiver keys on foster care)
Child age < 13 6M-4.200; Fla. Stat. §1002.87(1) is_fl_sr_age_eligible (age < child_age_limit = 13)
Federal immigration eligibility 8 USC 1641; 45 CFR 98.20 (6M-4 silent on immigration) Reuses federal is_ccdf_immigration_eligible_child — no FL copy
Family assets ≤ $1,000,000 (self-certified) 6M-4.200(2)(b)(3)b. Reuses federal is_ccdf_asset_eligible (verified gov.hhs.ccdf.asset_limit == $1M) — no FL param
Reside in Florida 6M-4.200(8)(c) defined_for = StateCode.FL on is_fl_sr_eligible; eligibility chain inherits the scope
Program in effect (≥ 2025-10-01) 6M-4.400 (eff. 2025-07-01); SMI scale (eff. 2025-10-01) in_effect.yaml (false → true at 2025-10-01) gates is_fl_sr_eligible; prevents phantom pre-program benefits

Copay (sliding fee scale)

Florida's copay is a percentage of family income, not a fixed dollar table. The SMI-Percentage scale (eff. 2025-10-01) classifies the family by monthly countable income ÷ monthly SMI (SMI by state + family size) and applies a bracket rate:

Income (% SMI) Full-time rate Part-time rate
$0 up through 55% SMI 4.0% 2.0%
above 55% SMI up through 85% SMI 6.0% 3.0%
  • copay = monthly countable income × bracket rate (FT rate if the authorized care is full-time, else PT rate). This matches the RI/NJ percentage-of-income mechanic.
  • Income floored at zero. fl_sr_copay applies max_(fl_sr_countable_income, 0) before computing the copay so a negative self-employment loss can't produce a negative copay — which would otherwise inflate the benefit above the family's actual childcare expenses.
  • One copay per household, regardless of how many children are in care (6M-4.400 FAQ Q7/Q13; sibling discounts do not apply to percentage copays per Q17). Modeled at the SPMUnit level.
  • No $0-copay bracket on this SMI scale. The lowest income bracket already carries 4.0% FT / 2.0% PT. (The "$0" cells in the PDF are the income floor of the first bracket — $0 income — not a copay rate. The earlier July FPL scale did have a $0 row at ≤50% FPL; the SMI scale does not.)
  • 7% cap (45 CFR 98.45(l)(3); 6M-4.400): copay = min_(copay, 0.07 × monthly countable income). Implemented for fidelity but structurally slack — the scale's maximum rate is 6% FT, below the 7% ceiling, so the cap never binds for the modeled single-household copay.
  • Copay waived for State Plan §3.3.1 families. fl_sr_copay_waived zeroes the copay for families that are (i)–(ii) ≤ 150% FPG, (iii) homeless, (iv) have a child with a disability, (v) enrolled in Head Start / Early Head Start, or (vi) have a child in foster care. Because most SR families are ≤ 150% FPG, the 4%/6% scale above effectively bites only between 150% FPG and the 85% SMI exit limit. The case-by-case at-risk waiver (6M-4.400(6)(a)) and coalition "other criteria" (§1002.84(9)) are not derivable and not modeled.
  • SMI is pinned to the FFY of the schedule (Oct → FFY of the following year), matching the NJ CCAP pattern, because the DEL scale is built on FFY 2026 SMI estimates.

Benefit Calculation

fl_sr = max_(min_(monthly expenses, monthly cap) − fl_sr_copay, 0)

monthly cap = Σ over eligible children of
              fl_sr_max_daily_rate × childcare_attending_days_per_month
  • Capped at the statewide provider reimbursement schedule. The subsidy can no longer exceed what the state would reimburse the provider. The monthly cap sums each eligible child's fl_sr_max_daily_rate (a per-county × provider-type × care-level × unit-of-care lookup against the SPB 2502 / 6M-4.500 schedule) times that child's childcare_attending_days_per_month, across the SPMUnit. The benefit is then max_(min_(monthly expenses, monthly cap) − copay, 0), where monthly expenses is spm_unit_pre_subsidy_childcare_expenses (YEAR, auto-divided to a monthly value).
  • No published rate → $0 benefit. If county_str has no published Florida rate (an unknown / non-Florida county such as ORANGE_COUNTY_CA), every child's daily rate resolves to 0, the monthly cap is 0, and min_(expenses, 0) = 0 — so the subsidy is $0 even when the unit is otherwise eligible (there is no published rate to pay against). The benefit does not fall back to expenses. Real FL households are unaffected: an unset county_str defaults to the first FL county, which has a published rate.
  • Negative-income floor preserved. The outer max_(., 0) guards against negative-income sign flips, and fl_sr_copay independently floors countable income at 0 (see Copay) so a self-employment loss can't drive the copay negative and push the benefit above expenses.
  • fl_sr is MONTH-defined. The state aggregator fl_child_care_subsidies (YEAR, adds = ["fl_sr"], defined_for = StateCode.FL) sums it into the federal child_care_subsidies total via the CCDF program registry.

Provider reimbursement rates

The rate cap is driven by the statewide School Readiness Reimbursement Rates, Fiscal Year 2025-2026 schedule (SPB 2502, FL Senate Committee on Appropriations, April 3, 2025), incorporated by reference under Fla. Admin. Code 6M-4.500. All 67 Florida counties are modeled.

  • Storage. The schedule is stored as a long-form CSV — parameters/gov/states/fl/doe/sr/rates/reimbursement/fy2025_26.csv — with 2,814 daily rates (67 counties × FT/PT × 7 care levels × 3 provider types). It is loaded via pandas through rates/reimbursement/__init__.py (get_reimbursement_rates, lru_cached), mirroring the Texas CCS CSV-rate-table pattern. The rates were programmatically extracted from the source PDF text layer and spot-verified against the PDF (Miami-Dade, Alachua). The same file serves both FY2025-26 and FY2026-27 (the FY2026-27 schedule, HB 5001E, carried the rates forward byte-identical); if a future fiscal year publishes different rates, add fy<YYYY>.csv and select by the July 1 fiscal-year boundary in get_reimbursement_rates.
  • Lookup dimensions. fl_sr_max_daily_rate (Person, MONTH) does a vectorized left-merge on four enum-name string keys: county_str × fl_sr_provider_type × fl_sr_care_level × fl_sr_time_category (unit of care). An unmatched county (an unknown / non-FL county_str) yields rate 0, which zeroes the subsidy — the benefit caps at this rate with no fall-back to expenses.
  • Provider type (fl_sr_provider_type, input enum): Licensed/Exempt (center; default), Licensed Family Child Care Home, Registered Family Child Care Home.
  • Care level by age (fl_sr_care_level, derived from rates/care_level_age.yaml bracket parameter): Infant (<1), Toddler (1), 2-Year-Old (2), Preschool 3 / Preschool 4 / Preschool 5 (ages 3 / 4 / 5), School Age (6+).
  • Daily → monthly. childcare_attending_days_per_month (YEAR-defined; read with period.this_year) converts the per-child daily rate to that child's monthly cap contribution.

Requirements Coverage

21 / 21 in-scope items covered (100%). 19 requirements + 2 federal registrations.

Requirement Implemented as
REQ-004/005 income entry 55% / exit 85% SMI eligibility/income/{entry,exit}_smi_rate.yaml; is_fl_sr_income_eligible.py (12 cases: both boundaries × sizes 1/8)
REQ-006 gross-income countable (members 18+) income/sources.yaml (19 types); fl_sr_countable_income.py (age-filtered per §1002.81(7); minor earned/unearned excluded)
REQ-007/008 activity ≥20/≥40; two-parent age/disability exemption; non-work fallback eligibility/activity_hours_{single,two_parent}.yaml; is_fl_sr_activity_eligible.py (pre-LSR hours; exemption two-parent-only per §1002.81(14)(c) via is_disabled|is_senior; meets_ccdf_activity_test OR-fallback)
REQ-009 child age < 13 eligibility/child_age_limit.yaml; is_fl_sr_age_eligible.py (12/13 boundary)
REQ-011 immigration reuses is_ccdf_immigration_eligible_child in is_fl_sr_child_eligible.py (citizen/undocumented/refugee)
REQ-012 assets ≤ $1M reuses federal is_ccdf_asset_eligible in is_fl_sr_eligible.py
REQ-013 FL residency defined_for = StateCode.FL; integration out-of-FL case (GA → $0/ineligible)
REQ-014 in_effect 2025-10-01 in_effect.yaml; gate in is_fl_sr_eligible.py; integration pre-effective-date case (2025-01 → $0)
REQ-015/017/018 SMI-% copay scale copay/smi_scale/{full,part}_time_rate.yaml; fl_sr_smi.py; fl_sr_copay.py (tiers + 0.5501 boundary; income floored at 0)
REQ-016 one copay/household SPMUnit-level fl_sr_copay; integration multi-child case
REQ-019 lowest bracket fl_sr_copay.yaml (lowest bracket = 4%/2%, no $0 row); integration zero-income case (→ $0 copay)
REQ-020 7% cap fl_sr_copay.py min_(); test documents the cap is structurally slack
Copay waiver (State Plan §3.3.1) copay/fl_sr_copay_waived.py (≤150% FPG / homeless / disabled child / Head Start / foster); copay/waiver/income_fpl_limit.yaml; wired into fl_sr_copay.py; copay/fl_sr_copay_waived.yaml
Protective-services pathway (income + activity waiver) eligibility/fl_sr_protective_services.py; wired into is_fl_sr_eligible.py (income) and is_fl_sr_activity_eligible.py (activity); eligibility/fl_sr_protective_services.yaml + activity & integration cases
REQ-021 FT/PT classification fl_sr_time_category.py from childcare_hours_per_day (full-time = ≥ 6 hrs within a 24-hour period, Fla. Stat. §1002.81(9)/(11); 5/6-hr boundary + 4-day×6-hr case tested)
REQ-022 provider reimbursement rate cap rates/care_level_age.yaml, rates/reimbursement/{fy2025_26.csv, __init__.py}; fl_sr_provider_type.py, fl_sr_care_level.py, fl_sr_max_daily_rate.py; tested in rates/ (18 cases) + integration cases where the cap binds
REQ-023 benefit max_(min_(expenses, cap) − copay, 0) fl_sr.py; dedicated fl_sr.yaml + integration cases (cap binding / slack / floored)
Federal agg #1 fl_child_care_subsidies in child_care_subsidy_programs.yaml adds (line 11); integration annual + federal flow-through case
Federal agg #2 FL state_implementations entry + coverage in programs.yaml (lines 498–503)

Not Modeled (by design)

What Source Why excluded
Standard Dollar-Based copay scale (enrolled ≤ 2025-06-30) DEL dollar scale Closed enrollment cohort; PolicyEngine has no cohort state — only the current SMI-Percentage scale is modeled
Percentage-FPL copay scale (eligible 2025-07-01 to 2025-09-30) DEL July percentage scale Superseded by the SMI scale; pre-2025-10 era not modeled
Pre-2025 ≤150% FPL income entry Fla. Stat. §1002.81(6); 6M-4.200(2) Only the SMI-scale era (≥ 2025-10-01) is modeled
2025-07-01 "greater of 50% SMI or 150% FPL" entry Fla. Stat. §1002.81(6) (2025); CS/HB 859 July percentage era not modeled
CCEP (Child Care Executive Partnership) 200% FPL pathway 6M-4.200(2) Employer-match population we don't track at the moment; SR core only
SR Match (70% SMI entry) / SR Plus (≤100% SMI exiters) DEL SMI scale footnotes; 6M-9.200 Separate pathways; SR core only
DEL quality differentials (+5% assessment; QPI +4/+7/+10%) 6M-4 quality provisions Provider-level quality attributes we don't track at the moment
Case-by-case copay waivers (at-risk 6M-4.400(6)(a); coalition "other criteria" §1002.84(9)) 6M-4.400(6)(a); §1002.84(9) Per-family discretionary events we don't track; the income / homeless / disabled-child / Head Start / foster waivers in State Plan §3.3.1 are modeled (fl_sr_copay_waived)
At-risk / diversion eligibility beyond the protective-services flag Fla. Stat. §1002.81(1) The protective-services pathway (income and activity waived) is modeled via fl_sr_protective_services (State Plan §2.2.2.f–h); broader at-risk/diversion concepts without that flag are not tracked
Priority categories / TANF priority Fla. Stat. §1002.87(1) Waitlist ordering, not an eligibility/benefit gate; no TANF categorical bypass
Annual reevaluation / 10-day reporting / 90-day grace Fla. Stat. §1002.87(3) Administrative timing rules outside a snapshot simulation (the grace-period activity exception is reachable via meets_ccdf_activity_test)

Open items for reviewer (from validation)

No open value assumptions remain. One modeling proxy is worth noting (not blocking):

  1. Age-exemption proxy for the §1002.81(14)(c) two-parent work exemption. The statute exempts a parent from the work requirement "due to age or disability … as determined and documented by a physician" but specifies no age. Disability uses is_disabled; the age exemption is proxied by is_senior (≥ 65, matching MA CCFA's work-exempt age). A documented exemption outside these proxies remains reachable via meets_ccdf_activity_test. (The earlier 30 hr/wk full-time convention has been removed — FT/PT now follows the statutory 6-hours-within-a-24-hour-period definition, Fla. Stat. §1002.81(9)/(11).)

Files

Parameters (under parameters/gov/states/fl/doe/sr/):

in_effect.yaml
eligibility/child_age_limit.yaml
eligibility/income/entry_smi_rate.yaml
eligibility/income/exit_smi_rate.yaml
eligibility/activity_hours_single.yaml
eligibility/activity_hours_two_parent.yaml
copay/max_share_of_income.yaml
copay/full_time_hours_threshold.yaml
copay/smi_scale/full_time_rate.yaml
copay/smi_scale/part_time_rate.yaml
copay/waiver/income_fpl_limit.yaml        # copay-waiver income line (150% FPG; State Plan s. 3.3.1)
income/sources.yaml
rates/care_level_age.yaml                 # care level (enum index) by child age
rates/reimbursement/fy2025_26.csv         # 2,814 daily rates: 67 counties × FT/PT × 7 care levels × 3 provider types
rates/reimbursement/__init__.py           # pandas loader (get_reimbursement_rates), Texas CCS pattern

Variables (under variables/gov/states/fl/doe/sr/):

fl_child_care_subsidies.py            # SPMUnit, YEAR — aggregator, adds=["fl_sr"]
fl_sr.py                              # SPMUnit, MONTH — benefit = max_(min_(expenses, cap) − copay, 0)
fl_sr_enrolled.py                     # SPMUnit, MONTH — bare input (entry vs exit threshold)
fl_sr_smi.py                          # SPMUnit, MONTH — FFY-pinned SMI
eligibility/is_fl_sr_eligible.py      # SPMUnit, MONTH — top-level (in_effect + child + (income | protective-services) + activity + asset)
eligibility/is_fl_sr_child_eligible.py# Person, MONTH — age + immigration
eligibility/is_fl_sr_age_eligible.py  # Person, MONTH — age < 13
eligibility/is_fl_sr_income_eligible.py # SPMUnit, MONTH — entry 55% / exit 85% SMI
eligibility/is_fl_sr_activity_eligible.py # SPMUnit, MONTH — pre-LSR ≥20/≥40 hr; two-parent age/disability exemption (is_disabled|is_senior); meets_ccdf_activity_test + protective-services waiver
eligibility/fl_sr_protective_services.py # SPMUnit, MONTH — protective-services pathway (waives income + activity)
income/fl_sr_countable_income.py      # SPMUnit, MONTH — gross family income, members 18+ (excludes minors)
copay/fl_sr_copay.py                  # SPMUnit, MONTH — income (floored at 0) × bracket rate; 7% cap; waived per fl_sr_copay_waived
copay/fl_sr_copay_waived.py           # SPMUnit, MONTH — copay waiver (≤150% FPG / homeless / disabled child / Head Start / foster)
copay/fl_sr_time_category.py          # Person, MONTH — FULL_TIME (>= 6 hrs/day, 1002.81(9)) / PART_TIME from childcare_hours_per_day
rates/fl_sr_provider_type.py          # Person, MONTH — input enum (Licensed/Exempt [default], Licensed FCCH, Registered FCCH)
rates/fl_sr_care_level.py             # Person, MONTH — care level enum from age (care_level_age.yaml)
rates/fl_sr_max_daily_rate.py         # Person, MONTH — county × provider type × care level × unit CSV lookup

Tests (under tests/policy/baseline/gov/states/fl/doe/sr/):

fl_sr.yaml                            # benefit (cap binds / cap slack / floored at 0 / copay-waiver flow-through)
fl_sr_smi.yaml
integration.yaml                      # 15 cases end-to-end (cap binding, federal flow-through, out-of-FL, multi-child, SE loss, non-FL-county → $0, copay waived ≤150% FPG, protective-services pathway)
income/fl_sr_countable_income.yaml
copay/fl_sr_copay.yaml
copay/fl_sr_copay_waived.yaml          # 8 cases: income / homeless / disabled child / Head Start / foster + 150% FPG boundary
copay/fl_sr_time_category.yaml
eligibility/is_fl_sr_eligible.yaml
eligibility/is_fl_sr_child_eligible.yaml
eligibility/is_fl_sr_age_eligible.yaml
eligibility/is_fl_sr_income_eligible.yaml
eligibility/is_fl_sr_activity_eligible.yaml
eligibility/fl_sr_protective_services.yaml
rates/fl_sr_care_level.yaml           # age → care level (8 cases, all bands)
rates/fl_sr_max_daily_rate.yaml       # county × provider type × care level × unit lookup (10 cases, incl. non-FL-county → 0, FY2026-27 read)

Modified federal registration files (2):

parameters/gov/hhs/ccdf/child_care_subsidy_programs.yaml   # add fl_child_care_subsidies to adds list (line 11)
programs.yaml                                              # add FL state_implementations entry + CCDF coverage (lines 498–503)

The meets_ccdf_activity_test fallback reuses the existing federal variables/gov/hhs/ccdf/meets_ccdf_activity_test.py input (SPMUnit, YEAR, default false) — no new variable was added for it.

Test plan

  • 112 unit/integration tests pass (policyengine-core test policyengine_us/tests/policy/baseline/gov/states/fl/doe -c policyengine_us)
  • make format (ruff format + check) clean
  • Branch merged with upstream main
  • Federal child_care_subsidies flow-through verified in microsim (FL family → $880/mo; non-FL control → $0)
  • Reimbursement rates spot-verified against the SPB 2502 PDF (Miami-Dade, Alachua)
  • CI passes



hua7450 and others added 3 commits June 7, 2026 20:38
Closes PolicyEngine#8597

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
PolicyEngine#8597)

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

codecov Bot commented Jun 8, 2026

Copy link
Copy Markdown

Codecov Report

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

Additional details and impacted files
@@            Coverage Diff             @@
##              main     #8598    +/-   ##
==========================================
  Coverage   100.00%   100.00%            
==========================================
  Files            2        17    +15     
  Lines           36       282   +246     
  Branches         0         2     +2     
==========================================
+ Hits            36       282   +246     
Flag Coverage Δ
unittests 100.00% <100.00%> (ø)

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

☔ View full report in Codecov by Harness.
📢 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 12 commits June 7, 2026 22:32
…e anchors (PR PolicyEngine#8598)

- Floor countable income at 0 in fl_sr_copay (negative self-employment income no longer inflates the benefit)
- Repoint entry_smi_rate citation to enacted 2025 Fla. Stat. 1002.81(6) (55% SMI)
- Correct 6M-4.400 FAQ Q6 page anchors (#page=2 -> #page=1)
- Reframe 30 hr/wk full-time threshold as a documented assumption
- Add negative-self-employment-income copay-floor test (integration Case 13)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…n-defined (PR PolicyEngine#8598)

User supplied the previously 403-blocked Fla. Admin. Code 6M-4.500. It bases
reimbursement on 'a child's care level and unit of care as defined by the
coalition established rate schedule' (6M-4.500(1)(b),(1)(j)) — confirming the
full-time/part-time boundary is set locally per Early Learning Coalition, with
no statewide hours cutoff. Updated the comment/reference accordingly; the
30 hr/wk value remains a documented modeling convention (value unchanged).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…ty test (PR PolicyEngine#8598)

- Read weekly_hours_worked_before_lsr (not post-LSR) so the work-activity test
  does not move with the policy's own labor-supply incentives (SNAP convention)
- Add meets_ccdf_activity_test OR-fallback: Fla. Stat. 1002.81(14) counts
  'eligible work OR education activities' toward the 20/40 hours, which cannot
  be derived from employment hours alone (default false, dataset/user override)
- Update test input keys to weekly_hours_worked_before_lsr; add fallback test

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

del is a Python reserved keyword, forcing bracket parameter access
(parameters(period).gov.states.fl["del"].sr). Rename the agency folder to
doe (Department of Education, the parent agency of the Division of Early
Learning) — consistent with the department-level fl/dcf convention — so
formulas use clean attribute access gov.states.fl.doe.sr and the dotted
adds-string/parameter_prefix update accordingly. No values or logic changed.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…ies) (PR PolicyEngine#8598)

Cap the subsidy at the statewide maximum reimbursement rate
(Fla. Admin. Code 6M-4.500; 'School Readiness Reimbursement Rates FY2025-26',
SPB 2502). Benefit is now max(min(expense, sum of daily_rate x attendance days)
- copay, 0); an unknown county falls back to uncapped.

- Rate table stored as CSV (2,814 daily rates = 67 counties x FT/PT x 7 care
  levels x 3 provider types), loaded via pandas (Texas CCS pattern)
- New: fl_sr_provider_type (input, default Licensed/Exempt), fl_sr_care_level
  (from age), fl_sr_max_daily_rate (county/provider/care-level/unit CSV lookup)
- Rates programmatically extracted from the source PDF text layer and
  spot-verified against the PDF (Miami-Dade, Alachua)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…olicyEngine#8598)

The FY2026-27 schedule (HB 5001E Conference Report, May 26 2026) carries the
FY2025-26 rates forward byte-identical (0 of 2,814 cells differ), so a single CSV
covers both fiscal years (2025-07-01 through 2027-06-30). Source note cites both
documents and explains the July-1 fiscal-year boundary for any future differing year.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…cyEngine#8598)

The benefit no longer falls back to expenses when there is no published
reimbursement rate: fl_sr = max(min(expense, sum daily_rate*days) - copay, 0).
A county with no FL rate (an unknown / non-Florida county_str such as
ORANGE_COUNTY_CA) yields a zero cap and therefore $0, even when the unit is
otherwise eligible. (Real FL households are unaffected: an unset county_str
defaults to the first FL county, which has a published rate.)

Tests: ORANGE_COUNTY_CA -> eligible but fl_sr 0 (rate-lookup Case 9 +
integration Case 14); a 2027-01 case confirms the loader reads fy2025_26.csv
for FY2026-27 (HB 5001E carried the rates forward unchanged).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…ntical (PR PolicyEngine#8598)

Add the canonical flsenate.gov source URLs for the FY2025-26 (SPB 2502) and
FY2026-27 (HB 5001E) per-county reimbursement-rate schedules to the rate-table
loader, the care-level parameter, and the rate-lookup variable. Document that
FY2026-27 carries the FY2025-26 rates forward byte-identical (0 of 2,814 cells
differ), so a single CSV covers both fiscal years (2025-07-01 .. 2027-06-30).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…icyEngine#8598)

- Activity test (Fla. Stat. 1002.81(14)): the age/disability exemption applies
  only to a two-parent family where the OTHER parent works >= 20 hr/wk. A single
  disabled non-working parent (14)(a) and a two-parent both-disabled family are
  no longer treated as working families (the old non_exempt_parents==0 shortcut
  wrongly passed them). Single >= 20; two-parent neither exempt >= 40 combined.
- Countable income (Fla. Stat. 1002.81(7)): family income is the gross income
  (earned or unearned) of members 18 or older; income of members under 18 is now
  excluded via an age-filtered sum (VA CCSP pattern). Still-enrolled 18+ HS
  students and disabled students under 22 remain not modeled.
- Tests: activity Case 6 corrected + Cases 11/12 (two-parent one-disabled vs
  both-disabled); countable-income Cases 4/5 (minor excluded; 18yo counted).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…olicyEngine#8598)

Model the activity requirement exactly as Fla. Stat. 1002.81(14) (confirmed by
the FFY2025-27 CCDF State Plan s. 2.2.2): single parent works >= 20 hr/wk;
two-parent neither-exempt >= 40 combined; two-parent with one parent exempt due
to age or disability (14)(c) requires the OTHER parent to work >= 20. The
age/disability exemption is two-parent-only -- a single disabled non-working
parent and a both-exempt couple are NOT working families; they qualify (if at
all) via the protective-services / meets_ccdf_activity_test path. The exemption
is proxied by is_disabled and is_senior (65+, matching MA CCFA's work-exempt
age). Adds tests: single disabled + fallback -> eligible; two-parent age-exempt.

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

Florida waives the School Readiness parent copay for families that are (i)-(ii)
at or below 150% FPG, (iii) homeless, (iv) have a child with a disability, (v)
enrolled in Head Start / Early Head Start, or (vi) have a child in foster care
(FFY2025-27 CCDF State Plan s. 3.3.1). New fl_sr_copay_waived (SPMUnit, MONTH)
models these derivable conditions; the case-by-case at-risk waiver
(6M-4.400(6)(a)) and coalition 'other criteria' (s. 1002.84(9)) are not
derivable and noted as not modeled. fl_sr_copay returns 0 when waived.

Consequence: low-income families (<=150% FPG) now have a $0 copay, so the 4%/6%
SMI scale only applies between 150% FPG and 85% SMI. Recomputed the copay-scale,
benefit, and integration tests accordingly (model-verified).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@hua7450 hua7450 marked this pull request as ready for review June 8, 2026 18:45
…services (PR PolicyEngine#8598)

Addresses the /review-program findings on the FL School Readiness PR. The
changes span shared test/variable files, so they are one commit, sectioned here.

Full-time/part-time care: classify by the statutory daily measure (Fla. Stat.
1002.81(9)/(11): full-time = at least 6 hours within a 24-hour period) via
childcare_hours_per_day, replacing the prior 30-hr/week proxy -- so 4 days x
6 hours = 24 hr/week is now correctly full-time. fl_sr_time_category +
full_time_hours_threshold (-> 6) + the 5 affected test files updated.

Protective-services pathway: a child who receives or needs protective services
qualifies with the income AND activity tests waived (State Plan s. 2.2.2.f-h;
Fla. Stat. 1002.81(1)). New fl_sr_protective_services feeds both is_fl_sr_eligible
(income) and is_fl_sr_activity_eligible (activity). Age, asset, residency, and
in_effect still apply; the copay is not waived (it keys on foster care).

Review fixes: statute citations 2024 -> 2025; 6M-4.500 -> flrules.elaws.us and
45 CFR -> Cornell hosts; rate-doc #page anchors -> 4; FAQ Q7/Q8 and s. 1002.87(5)
comment numbering; deprecated documentation field removed; TANF-cash exclusion
documented; FPG comments recomputed (size-3 monthly 2_276.67) + a 150%-FPG
copay-waiver boundary test; get_reimbursement_rates now selects the CSV by FL
fiscal year (year + (month >= 7)).

112 tests pass; make format clean.

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

@MaxGhenis MaxGhenis left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reviewed: parameter values spot-checked against the cited state sources and match; structure follows conventions (one variable per file, defined_for state scoping, no hardcoded values, correct entities/periods); meaningful YAML integration test coverage; CI green. LGTM.

…into fl-ccap

# Conflicts:
#	policyengine_us/parameters/gov/hhs/ccdf/child_care_subsidy_programs.yaml
#	policyengine_us/programs.yaml
…into fl-ccap

# Conflicts:
#	policyengine_us/parameters/gov/hhs/ccdf/child_care_subsidy_programs.yaml
#	policyengine_us/programs.yaml
@MaxGhenis MaxGhenis merged commit e293c25 into PolicyEngine:main Jun 14, 2026
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 Florida child care subsidy (School Readiness Program)

2 participants