Implement Missouri Child Care Subsidy (CCS) program#8653
Open
hua7450 wants to merge 11 commits into
Open
Conversation
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Implements Missouri's Child Care Subsidy under DESE, a provider-reimbursement subsidy with four geographic regions, age-based maximum daily rates by provider type (licensed center, registered center, licensed family home, group home, and six-or-fewer), special-needs rate add-ons, time-category-based units (full/half/ part-day), and a family-size copay tier with SMI minimum rate and minimum annual fee. Includes FPL-based initial and transitional income eligibility, activity and protective-services eligibility paths, and wires the state into the federal CCDF child_care_subsidy_programs registry and programs.yaml. Closes PolicyEngine#8652 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 #8653 +/- ##
==========================================
Coverage 100.00% 100.00%
==========================================
Files 5 16 +11
Lines 71 277 +206
==========================================
+ Hits 71 277 +206
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:
|
…CCS) - TCC funding multiplier applied to remaining base rate (base − fee) per 5 CSR 25-200.060 and Manual 2010.045.00 (transitional families only) - Sliding-fee copay tier keyed on adjusted gross income per CSR 25-200.060(3)(C)1 (25% SMI / $1-min floor remains on gross per Manual 2025.010) - Protective-services pathway bypasses income+activity per CSR 25-200.060(7)(B) - Incapacitated-parent need-for-care pathway added (is_disabled, Manual 2010.050.25) - Reference fixes: funding_rate + initial_eligibility repointed to current manual 2010.045.00; dropped stale EU-page ref on child_age_limit - Expanded test coverage (PS rates all providers, more rate cells, copay ladder) Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…O CCS) Round 1 made the protective-services pathway bypass the income+activity tests, but mo_ccs_protective_services wrongly included is_homeless. Homelessness is a need-for-care reason (Manual 2010.050.35), NOT a CSR 25-200.060(7)(A) income-maximum exemption — so it must not bypass income. - Remove is_homeless from mo_ccs_protective_services (now foster | protective) - Add is_homeless as a need-for-care term in mo_ccs_activity_eligible, so homeless families satisfy need-for-care but still face the income test - Document is_disabled as a proxy for the incapacity attestation we don't track - Repoint dead Wayback manual references (2010.050.25/.05/.35) to working snapshots - Correct copay/tier/size_* descriptions to "adjusted gross income" - Add regression tests: homeless over-income -> ineligible; within-income -> eligible Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…items (MO CCS) Critical: - mo_ccs_time_category now reads childcare_hours_per_day (the chart's full/half/part thresholds are per day, not per week); update cascade across all 6 test files preserving each case's time category. References: - funding_rate / income fpl_rate transitional / income_eligible: cite 5 CSR 25-200.060(4)(C) Transitional Child Care and Manual 2010.045.00; fix pre-existing (3)(C) -> (4)(C) misreference in mo_ccs. Docs: - Note 85% SMI is the informational CCDF ceiling, infant/toddler special-needs rate equals base (deferred +25%), is_disabled proxy for the six-criteria special-needs definition, and job-search need not modeled. Tests: - Add TCC2 (0.60) and TCC3 (0.50) end-to-end funding cases, registered-center half/part rate cells, and a multi-child (special-needs + base) case. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…CDF State Plan references Special-needs (is_disabled) children are reimbursed at the market rate plus a 25% rate differential per Missouri's CCDF State Plan FFY 2025-2027 (secs. 2.3.2(d) and 4.3.3), not the non-enhanced rate. The PR previously used the non-enhanced "PS @ Market Rate" columns (and the base rate for infant/toddler), under-reimbursing every special-needs child by 25%. - Regenerate all 5 rates/*/special_needs.yaml from the workbook's "PS ... with 25% Enhancement" columns (225 cells; base rates unchanged). - Correct the mo_ccs_maximum_daily_benefit comment: the +25% is the special-needs rate, not a deferral. The deferred differentials are non-traditional/EW (+15%), accreditation (+20%), and high-subsidy enrollment (+30%). - Update special-needs test expectations: mo_ccs Cases 5 & 9, integration Case 4, and the five special-needs cases in mo_ccs_maximum_daily_benefit. - Add CCDF State Plan and #page citations across the rate, copay, and income references. All 127 MO CCS YAML tests pass. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…iver, estate income, 85% SMI cap Three should-address items from the CSR / DESE Manual / CCDF State Plan audit: - Sliding fee waived for protective-services (foster) children, not only is_disabled children. A Protective Service Child is a child with special needs (5 CSR 25-200.050(11)) and the Manual (9.1/9.2) waives the fee for both. mo_ccs_copay now excludes is_in_foster_care / receives_or_needs_protective_services children from the charged set. - Count estate_income toward countable income (5 CSR 25-200.050(20)(F)), which was previously omitted from the sources list. - Cap the income-eligibility limit at min(FPG limit, 85% SMI) per the CCDF State Plan (secs. 4.7, 2.3.2), reusing gov.hhs.ccdf.income_limit_smi. For typical household sizes the FPG limit binds; the 85% SMI cap only binds for very large households (roughly 8+). Adds tests: copay foster-child waiver (Case 18), estate-income (Case 7), and size-10 households on both sides of the 85% SMI cap (income_eligible Cases 11-12). All 131 MO CCS YAML tests pass. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Verified the implementation against the regulation (5 CSR 25-200), the May 2026 Eligibility Policy Manual, the CCDF State Plan, and the rates workbook. - Protective-services children are eligible to under 19 and bypass the asset test (5 CSR 25-200.050(15)(B), Manual secs. 4.5(4)/4.8). - Special-needs under-19 in-school path keys on is_in_secondary_school (not is_full_time_student, which includes college) per Manual sec. 4.5(3). - Repoint stale 2010-manual citations to current 5 CSR / Manual sec. 5.6, 5.7, and 6 numbering; fix CCDF base-rate citation to sec. 4.3.2 (page 49). - Correct the 85% SMI and (7)(A)/(7)(B) explanatory comments. - Add mo_child_care_subsidies to household_state_benefits.yaml. - Note that only daytime rates are modeled (no evening/weekend rates). - Add tests for the protective age path, secondary-vs-college, and asset bypass (138 MO CCS tests pass). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…into mo-ccap # Conflicts: # policyengine_us/programs.yaml
SA1: Add SSI receipt as a special-needs pathway (5 CSR 25-200.050(11)(A)).
Special-needs status is now is_disabled | receives_ssi | is_protective;
the MO DMH-services, adoption-subsidy, and court-supervision criteria
have no PolicyEngine input and are documented as not tracked.
SA2: Cite the CCDF State Plan Section 5.2.2 (age classifications) for the
0/2/5 age-group cutoffs instead of the DESE payments landing page.
Stored values unchanged.
SA3: Add one special-needs reimbursement-rate test per region
(METRO, URBAN, MICROPOLITAN, RURAL); region 1 was already covered.
SA4: Add a guard test that being in school does not extend the age limit
for a non-special-needs child.
SA5: Add three mid-ladder copay-tier tests (tiers 2/4/6), reached via the
health-premium deduction since the tier lookup keys on adjusted income
while the 25% SMI minimum-fee floor keys on gross income.
All 147 MO CCS tests pass.
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 Missouri's Child Care Subsidy program, administered by the DESE Office of Childhood, in PolicyEngine. Missouri colloquially calls this program "CCAP," but the official name is the Child Care Subsidy; the implementation uses the
mo_ccs_variable prefix and lives undergov/states/mo/dese/ccs/accordingly.The subsidy is a provider-reimbursement childcare benefit: each eligible child's daily base reimbursement rate (looked up by region, provider type, age group, and time unit) is reduced by the family's sliding fee, floored at zero, and capped at the family's actual childcare expense. Existing families above the traditional income limit can receive a phased-down ("transitional") subsidy.
Closes #8652
Regulatory Authority
Program Overview
Eligibility
mo_ccs_eligible_child—age < child_age_limit(13)mo_ccs_eligible_child—special_needs_child_age_limit(18), extended tospecial_needs_in_school_age_limit(19) whenis_in_k12_schooloris_in_secondary_school; special-needs proxied byis_disabledmo_ccs_protective_servicesis treated as special-needs and reaches the under-19 ceilingis_tax_unit_dependentinmo_ccs_eligible_childis_ccdf_immigration_eligible_childdefined_for = StateCode.MO(chains through eligibility vars)mo_ccs_eligibleand the income variablesmo_ccs_activity_eligible— head/spouse activity present (weekly_hours_worked > 0,is_full_time_student, oris_disabled), or householdis_homelessmo_ccs_protective_services(is_in_foster_careorreceives_or_needs_protective_services)is_ccdf_asset_eligible; waived for the protective pathwaymo_ccs_income_eligible(see Income)mo_ccs_eligible= has an eligible child and (protective services or (income-eligible and activity-eligible and asset-eligible)). The protective pathway bypasses the income maximums, the need-for-care test (5 CSR 25-200.060(7)(B)), and the net-worth/asset test (Manual §4.8 excludes applicants with a protective-services child).Income
mo_ccs_countable_income) = monthly gross income (earned + unearned) of EU members, modeled via anaddslist of countable income sources (income/countable_income/sources.yaml).mo_ccs_adjusted_income) = countable gross −health_insurance_premiums, floored at 0. Medical-insurance premiums are the only deduction (5 CSR 25-200.050(2); Manual §5.7).mo_ccs_enrolledSPMUnit boolean input (only enrolled recipients can use the >150% path).min(FPG limit, 85% SMI); Manual §4.7, CCDF State Plan). In practice the FPG limit is the binding ceiling at all realistic household sizes, so the SMI cap is a non-binding federal backstop.The manual's income-exclusions list (§5.6.1–5.6.6) is modeled by omission:
sources.yamlenumerates only the 15 countable PolicyEngine income variables, so any excluded type is simply absent from the list (the SC/WV pattern). Several excluded types have no PolicyEngine equivalent and so drop out automatically (e.g., LIHEAP/energy assistance, in-kind income, lump sums, SNAP value, tribal/restitution payments). Two excluded types cannot be split out cleanly and are documented as known limitations:veterans_benefits(§5.6.1(8)) — we don't track the education-portion split at the moment, so gross veterans benefits are counted (a slight over-count).Benefit Calculation
mo_ccs_maximum_daily_benefit) is looked up by region (5) × provider type (5) × age group (3) × time unit (3) from the Daytime rate table. Special-needs children use the special-needs rate column (rates/<provider>/special_needs.yaml), which is the market rate plus the 25% special-needs differential (CCDF State Plan §2.3.2(d)/§4.3.3). Only daytime rates are modeled (see Not Modeled).min(daily rate × attending days, per-child pre-subsidy expense)− the family's sliding fee, floored at 0 (mo_ccs), then multiplied by the transitional funding rate.transitional/funding_rate.yaml; Manual §11.1).mo_ccs_copay): a daily fee per child looked up by household size (1–20, viacopay/tier/size_N.yaml) × monthly adjusted-income band, with per-unit fees varying by full / half / part day (copay/daily_fee/{full,half,part}_unit.yaml; Manual §9.1). A $1/year minimum applies to families enrolled in TANF (is_tanf_enrolled, a proxy for the manual's TANF-only-income condition) or whose gross income is below 25% of State Median Income (minimum_annual_fee.yaml,smi_minimum_rate.yaml). Special-needs and protective-services children are exempt from the sliding fee. (Note: the variable is namedmo_ccs_copaybut computes the Manual §9.1 sliding fee; the separate §9.2 co-payment — provider charges above the state max rate — is correctly not part of the DESE subsidy and falls out as the family's residual childcare expense.)Requirements Coverage
All in-scope requirements are covered (138 tests pass). Out-of-scope rate-table differentials (evening/weekend, accreditation, high-subsidy) and administrative provisions are listed under "Not Modeled."
eligibility/child_age_limitmo_ccs_eligible_childeligibility/mo_ccs_eligible_child(1–3)special_needs_child_age_limit,special_needs_in_school_age_limitmo_ccs_eligible_childmo_ccs_eligible_child(4,5,8,9,12,14)mo_ccs_eligible_childmo_ccs_eligible_child(7)is_ccdf_immigration_eligible_childmo_ccs_eligible_child(6)defined_for = StateCode.MOmo_ccs_eligibleincome/countable_income/sourcesmo_ccs_countable_incomeincome/mo_ccs_countable_incomemo_ccs_adjusted_incomeincome/mo_ccs_adjusted_incomeincome/fpl_rate/initial_eligibilitymo_ccs_income_eligiblemo_ccs_income_eligible(1–3)income/fpl_rate/transitionalmo_ccs_enrolled,mo_ccs_income_eligiblemo_ccs_income_eligible(4,5,9,10)income/countable_income/sourcesmo_ccs_countable_incomemo_ccs_countable_incomemo_ccs_activity_eligibleeligibility/mo_ccs_activity_eligibleis_ccdf_asset_eligible,mo_ccs_eligiblemo_ccs_eligible(10,11)region/region_1..4_countiesmo_ccs_regionmo_ccs_regionrates/<provider>/mo_ccs_provider_typemo_ccs_maximum_daily_benefit(1–5)age_group/agemo_ccs_age_groupmo_ccs_age_grouptime_category/hoursmo_ccs_time_categorymo_ccs_time_categoryrates/*/basemo_ccs_maximum_daily_benefitmo_ccs_maximum_daily_benefit(1–12)rates/*/special_needsmo_ccs_maximum_daily_benefitmo_ccs_maximum_daily_benefit(special-needs cases)transitional/funding_ratemo_ccs_maximum_daily_benefit,mo_ccsmo_ccs_maximum_daily_benefit(14–16)transitional/funding_ratemo_ccs_maximum_daily_benefitmo_ccs_maximum_daily_benefit(17,18);integration(3)copay/tier/size_1..20mo_ccs_copaycopay/mo_ccs_copay(9,10,13)copay/daily_fee/{full,half,part}_unitmo_ccs_copaycopay/mo_ccs_copay(1–3)copay/minimum_annual_fee,copay/smi_minimum_ratemo_ccs_copaycopay/mo_ccs_copay(5,6,11,12)mo_ccs_copaycopay/mo_ccs_copay(7)copay/tier/size_*mo_ccs_copaycopay/mo_ccs_copay(4)mo_ccsmo_ccs(1,6)mo_ccsmo_ccs(2);integration(7)mo_ccs_protective_services,mo_ccs_eligibleeligibility/mo_ccs_protective_services;mo_ccs_eligible(5,7,10);mo_ccs_eligible_child(10,11,13)mo_ccs_income_eligible(min(FPG, 85% SMI))mo_ccs_income_eligible(11,12)Not Modeled (by design)
pre_subsidy_childcare_expenses − subsidy)The 25% special-needs differential is modeled (see REQ 023); the remaining differentials (+15% evening/weekend, +20%/+30% accreditation) are deferred.
Historical Notes
Verification Notes
region/region_N_counties.yamland Region 5 is the catch-all default.Files Added
Federal/shared wiring edits:
policyengine_us/parameters/gov/hhs/ccdf/child_care_subsidy_programs.yaml— registersmo_child_care_subsidiesin the federal CCDF aggregator.policyengine_us/parameters/gov/household/household_state_benefits.yaml— attributesmo_child_care_subsidiesto Missouri's state benefits.policyengine_us/programs.yaml— adds the Missouri CCS program entry (variable: mo_ccs,parameter_prefix: gov.states.mo.dese.ccs,status: complete).Changelog:
changelog.d/mo-ccap.added.md.