Implement Ohio Child Care Assistance Program (Publicly Funded Child Care / PFCC)#8718
Draft
hua7450 wants to merge 3 commits into
Draft
Implement Ohio Child Care Assistance Program (Publicly Funded Child Care / PFCC)#8718hua7450 wants to merge 3 commits into
hua7450 wants to merge 3 commits into
Conversation
Closes PolicyEngine#8717 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 Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## main #8718 +/- ##
==========================================
Coverage 100.00% 100.00%
==========================================
Files 3 18 +15
Lines 47 287 +240
==========================================
+ Hits 47 287 +240
Flags with carried forward coverage won't be shown. Click here to find out more. ☔ View full report in Codecov by Harness. 🚀 New features to boost your workflow:
|
- Fix special-needs accommodations 2x citation (5180:6-1-10 (G)(2), not 6-1-09) - Use add() aggregation idiom in oh_ccap.py - Make copay multiplier band lookup float32-deterministic (epsilon thresholds) - Add railroad_benefits to countable income (5180:2-16-03(H)(3)(c)) Co-Authored-By: Claude Opus 4.8 (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 Ohio's Child Care Assistance Program — officially Publicly Funded Child Care (PFCC), administered by the Ohio Department of Children & Youth (DCY) (county Departments of Job & Family Services administer eligibility locally). The program was transferred from ODJFS to DCY and its rules were renumbered from
5101:2-16to5180:2-16(eligibility) and5180:6-1(provider payment).Closes #8717.
These two decisions materially shape the implementation and should be reviewed before merge.
1. Rescinded core rule / live-citation-only approach
Ohio appears to have rescinded its core substantive eligibility rule (old
5101:2-16-02) and its need-for-care rule (old5101:2-16-06) without replacing them inside Chapter5180:2-16.OAC 5180:2-16-02and5180:2-16-06do NOT exist — codes.ohio.gov returns "Number Not Found." The surviving rules (-04,-05,-08) carry dangling cross-references to the nonexistent5101:2-16-02/-06.Per maintainer decision, this PR models only provisions authorized by a currently-live source. Citations are sourced as follows, and never reference
-02or-06:is_ccdf_immigration_eligible_child2. Qualifying-activity (need-for-care) requirement is NOT modeled
Because the authorizing rule for the qualifying-activity requirement (employment / education / training / job search) was rescinded with no live in-chapter replacement, eligibility here is determined by income + child age + child citizenship only — there is no work / need-for-care gate.
This is a deliberate limitation: it over-grants eligibility relative to real policy (families with no working/active caretaker would be modeled as eligible). It is documented in the
oh_ccap_eligibledocstring with "we don't model X at the moment" framing.Regulatory Authority
OAC rule citations use the per-rule
codes.ohio.govlanding pages (single-rule HTML, no#page=anchor).#page=anchors are used only for the genuine multi-page PDFs (DCY PL 21, the copay multiplier Appendix A, and the rate Appendix A).is_ccdf_immigration_eligible_child.Income Eligibility
Two-tier, %-FPG only — no State Median Income (SMI) cap (Ohio uses 300% FPG where federal CCDF allows up to 85% SMI):
The intake-vs-ongoing distinction is selected by the bare boolean input
oh_ccap_enrolled(where(enrolled, ongoing, initial)), matching the NJ CCAP two-tier pattern.Countable income = gross earned + gross unearned, minus the enumerated exclusions in
5180:2-16-03(B)–(I): SSI and the earned income of SSI recipients, child support paid, foster/adoption maintenance, SNAP allotments, income tax refunds / EITC, non-recurring lump sums, and minor full-time-student earnings. There is no childcare or work-expense deduction. The SSI-recipient earnings exclusion (-03(F)(8)) is modeled at the person level (a family member's earned income is zeroed when that member receives SSI) — it cannot be expressed via anadds-list omission alone, so countable income is computed by a formula, not a bareadds.OWF/TANF basic assistance is statutorily countable (
-03(H)(3)(j)) but is omitted from the countable-income sources to break the CCAP↔TANF circular dependency (CCAP income → TANF → dependent-care deduction →childcare_expenses→child_care_subsidies→ CCAP). TANF-active families are instead made categorically income-eligible via the bareis_tanf_enrolledinput (not computed TANF eligibility).Copayment
Implements the faithful band-max method from
5180:2-16-05(B), not a simplified ratio bracket:-05(A)(3)).-05(G)). This is a copay waiver only, not an eligibility bypass.The Appendix A multiplier table runs from 0.0700 (at 105%) through a flat 0.0875 plateau (130–200%) up to 0.2700 (at 300%); income is floored at $0 before computation.
Provider Payment / Rate table
Payment per child = min(county base rate, customary charge) + add-ons, then summed across children and reduced by copay (floored at $0). Customary charge is
pre_subsidy_childcare_expenses.The rate table has 3 county categories × 2 provider types × 5 age groups × 3 time increments:
CENTER(Centers / Day Camps / Preschool-School-age / ODE programs) andHOME(Licensed Type A/B Homes & In-Home Aides).childcare_hours_per_week.Add-ons:
5180:6-1-09).Requirements Coverage
27 of 27 in-scope substantive requirements covered, plus the
programs.yamlregistry entry (REQ-036) — 28/28.eligibility/child_age_limit.yamloh_ccap_eligible_childoh_ccap_eligible_child1-2,8eligibility/special_needs_child_age_limit.yamloh_ccap_eligible_childoh_ccap_eligible_child3-5is_ccdf_immigration_eligible_child)oh_ccap_eligible_childoh_ccap_eligible_child6,9income/fpl_rate/initial_eligibility.yamloh_ccap_income_eligibleoh_ccap_income_eligible1-2,7-8income/fpl_rate/ongoing_eligibility.yamloh_ccap_income_eligible,oh_ccap_enrolledoh_ccap_income_eligible4-5,11-12income/fpl_rate/special_needs_eligibility.yamloh_ccap_income_eligibleoh_ccap_income_eligible3,9-10income/countable_income/sources.yaml,earned_sources.yamloh_ccap_countable_incomeoh_ccap_countable_income(5)oh_ccap_countable_incomeoh_ccap_countable_income+ integration 5is_tanf_enrolledoh_ccap_income_eligibleoh_ccap_income_eligible6copay/fpl_waiver_threshold.yamloh_ccap_copayoh_ccap_copay1,8copay/multiplier.yaml,weeks_in_fiscal_year.yamloh_ccap_copayoh_ccap_copay2-3,9copay/multiplier.yamloh_ccap_copayoh_ccap_copay2-3,9copay/weeks_in_fiscal_year.yamloh_ccap_copayoh_ccap_copayoh_ccap_copay4-6 + integration 4oh_ccap_rate_with_addons,oh_ccapoh_ccap_rate_with_addons11rates/center.yaml,rates/home.yamloh_ccap_base_rateoh_ccap_base_rate(11)time_category/hours.yamloh_ccap_time_categoryoh_ccap_time_category(6)age_group/months.yaml,school_age_summer/{start,end}_month.yamloh_ccap_child_age_groupoh_ccap_child_age_group(8)addons/quality/sutq.yamloh_ccap_rate_with_addons,oh_ccap_quality_tieroh_ccap_rate_with_addons1-4addons/accredited.yamloh_ccap_rate_with_addons,oh_ccap_is_accreditedoh_ccap_rate_with_addons5-6addons/non_traditional_hours.yamloh_ccap_rate_with_addons,oh_ccap_non_traditional_hoursoh_ccap_rate_with_addons7addons/special_needs.yaml,special_needs_accommodations_multiplier.yamloh_ccap_rate_with_addons,oh_ccap_has_special_accommodationsoh_ccap_rate_with_addons8-9oh_ccap_rate_with_addonsoh_ccap_rate_with_addons11geography/category_{1,2,3}_counties.yamloh_ccap_county_rate_categoryoh_ccap_county_rate_category(5)oh_child_care_subsidies+ CCDF registryoh_child_care_subsidiesprograms.yamlentryNot Modeled (by design)
Dropped — no live citation (authority was in the rescinded
-02/-06):-05(G)) survives, which is kept.-02(B)(4); the cap is non-binding. The federalis_ccdf_asset_eligiblehelper is reused instead.Deferred — operational details outside the modeled annual→monthly pipeline:
Note:
SCHOOL_AGE_SUMMERis fully implemented (enum value, rate-table cells, and the summer-month branch inoh_ccap_child_age_group), but the summer branch is untestable under the JAN / whole-year YAML test harness (test periods are restricted toYYYY-01orYYYY); the age-group tests exercise the school-year case in January.Verification TODO
#page=2used).5180:2-16-02page is JS-rendered and could not be captured directly; corroborated indirectly via the unchanged5180:2-16-03).Test plan
policyengine-core test policyengine_us/tests/policy/baseline/gov/states/oh/dcy/ccap/ -c policyengine_us)Files Added