Implement Michigan Child Care Assistance Program (CDC)#8627
Open
hua7450 wants to merge 9 commits into
Open
Conversation
Scaffolds the branch for Michigan's Child Development and Care (CDC) program, the state's CCDF-funded child care subsidy. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Codecov Report❌ Patch coverage is
Additional details and impacted files@@ Coverage Diff @@
## main #8627 +/- ##
===========================================
- Coverage 100.00% 99.31% -0.69%
===========================================
Files 1 18 +17
Lines 23 292 +269
Branches 0 1 +1
===========================================
+ Hits 23 290 +267
- Misses 0 1 +1
- Partials 0 1 +1
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:
|
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Gate family-contribution star waiver to licensed providers; license-exempt children always pay regardless of any star rating on record (RFT 270 p.3). - Remove SSI from countable income; State Plan §2.2.4.c leaves public assistance uncounted, and SSI recipients are income-waived anyway. - Add meets_ccdf_activity_test fallback for approved BEM 703 need reasons we don't model individually (job search, education/training, treatment). - Require tax-unit dependent status for an eligible child. - Fix eligible-child comment: the unmodeled over-13 pathway is court supervision, not high-school completion. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…into mi-ccap # Conflicts: # policyengine_us/programs.yaml
mi_ccap_program_group_size is MI-scoped, so non-MI SPM units report size 0. defined_for masks the result but the income-eligible formula still runs vectorized over every unit, and the size-indexed entry/exit breakdown lookup raised ParameterNotFoundError on the masked-out (size 0) rows in microsimulation. Clamp the lookup index to the scale minimum of 1. Unit tests pass because every test household is MI with size >= 1. 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 the Michigan Child Development and Care (CDC) program — Michigan's CCDF child care subsidy (family brand "CDC Scholarship") — in PolicyEngine. The CDC subsidy is a provider reimbursement, not a percent-of-income copay: each eligible child's subsidy is the department hourly rate (looked up by provider type × star rating × age group) multiplied by block hours, capped at the child's authorized hours, minus a flat Family Contribution. Income only gates entry/exit eligibility and selects the Family Contribution band; it never scales the subsidy by a percentage.
This PR covers the current era only. The 2025-09-21 income/Family-Contribution scale and the highest-hours two-parent rule (effective 2024-11-03) are encoded at their actual effective dates. Prior-era values are documented in Historical Notes below for a follow-up backdating PR.
Closes #8626
Regulatory Authority
Administered by MiLEAP (Michigan Department of Lifelong Education, Advancement and Potential); eligibility is determined through MDHHS Bridges, and policy lives in the MDHHS Bridges Eligibility Manual (BEM), so files use the
mdhhsagency segment.Income Eligibility Tests
A family qualifies through one of six eligibility groups; all groups are subject to the $1,000,000 asset test (BEM 703 p.14, the CCDF asset rule — effectively non-binding). Protective-services groups are assessed before income.
Five income-waived groups (no income test, Family Contribution waived):
receives_or_needs_protective_servicesis_in_foster_careis_tanf_enrolled(MI FIP = TANF) orssi > 0is_homelessIncome-eligible group (income test + Family Contribution): gross monthly income of the program group must be at or below the entry limit at application and at or below the exit limit ongoing (BEM 703 p.17). The initial-applicant vs. enrolled-recipient distinction is modeled via the
mi_ccap_enrolledboolean input, mirroring the two-threshold pattern used by NJ and WV.Income Deductions & Exemptions
The CDC program counts the gross monthly income of the program group (BEM 703 p.13); there are no standard deductions. Counted income sources (
income/countable_income/sources.yaml): employment income, self-employment income, Social Security retirement/disability/survivors, dividend income, interest income, rental income, pension income, veterans' benefits, unemployment compensation, workers' compensation, alimony income, and child support received. SSI is not counted — the State Plan (§2.2.4.c) leaves public assistance uncounted, and SSI recipients are an income-waived group regardless (so it would never affect the income test or Family Contribution band).Grandparent/guardian parent-substitute income is excluded by the manual (BEM 703 p.13) but is not separately tracked in the model (partial — noted below).
Income Standards
RFT 270 Table 1 (effective 2025-09-21). Columns are maximum monthly gross income. The Entry limit is column 2 of the seven-column table; the Exit limit is column 7. (Column 1 is an unlabeled lowest band that pairs with $0 Family Contribution. The header verification corrected the "Entry"/"Exit" label placement; the data values were already correct.) A single parent applying for one child is family size 2; family size 1 arises from the program-group definition. The scale stops at family size 10.
Basis of the limits (confirmed against the FFY 2025–2027 State Plan): entry is 200% FPL and exit is 85% SMI. The State Plan expresses entry as a percent of SMI (54–58% by family size, §2.2.4) for federal reporting but states the limits are "established and reported in terms of current SMI … even if the federal poverty level is used in implementing the program," and confirms explicitly that "program entrance is at 55% SMI (200% FPL)" for a family of three. These limits are therefore transcribed as dollar amounts from RFT 270 rather than computed as a live rate × FPG/SMI, because the published table is single-dated and rounded — a live rate would drift from the official figures as FPG and SMI uprate.
Benefit Calculation
The per-child biweekly subsidy is
min(block_hours, authorized_hours) × hourly_rate − family_contribution, floored at zero, summed across the SPM unit, then converted from a two-week pay period to monthly usingWEEKS_IN_YEAR / 2 / MONTHS_IN_YEAR(= 2.16667).mi_child_care_subsidies(YEAR) aggregates this into the federalchild_care_subsidiestotal.Authorized hours (
authorized_hours/tiers.yaml, BEM 710 p.1 / BEM 706 p.2, p.13): biweekly need hours map to one of the tiers 20 / 40 / 60 / 80 / 90, capped at 90 per child per pay period. Need hours derive from each parent's activity hours (weekly_hours_worked_before_lsr). For two-parent households the program authorizes on the parent with the highest need hours (effective 2024-11-03;two_parent_uses_highest_hours.yaml), implemented asspm_unit.maxover head/spouse hours. The meal-period, study/lab, and travel add-ons in the full BEM 710 need calculation are not tracked, so authorized hours are based on base activity hours only (partial).Block reimbursement (
block_hours/tiers.yaml, BEM 706 p.9, effective 2022-10-09): for Centers and Group & Family Homes, billing 1–30 hours pays the hourly rate × 30, 31–60 hours × 60, and 61+ hours × 90, then capped at the child's authorized hours. License-exempt providers have no block rate — they are paid hourly (hours × rate), capped at authorized hours (BEM 706 p.11; RFT 270 p.7). In a model without a separate "hours billed" input, paid hours equal the authorized tier at every tier.Hourly rate (
rates/center.yaml,rates/family_home.yaml,rates/exempt.yaml, RFT 270 p.4, effective 2024-09-22): a three-dimensional lookup over provider type × star/quality level × age group. Age groups (age_group/thresholds.yaml, RFT 270 p.4) are Infant/Toddler (birth up to 2.5 years), Preschool (2.5 up to 5), and School Age (5 and over). Licensed providers (Center, Group & Family Home) use 5 distinct star tiers (Base/1-Star collapse to one rate; then 2/3/4/5-Star); license-exempt providers use Level 1 / Level 2 only.Family Contribution (
family_contribution/per_child.yaml, RFT 270 p.3 / BEM 706 p.2): a flat per-child, per-pay-period dollar amount set by the income band the program-group income falls in — $0 / $15 / $30 / $45 / $60 / $69 / $78 across the seven columns — subtracted from the provider payment. It is waived (family_contribution/star_waiver_threshold.yaml) for any income-waived child and for income-eligible children at a licensed 3-Star (Enhancing Quality) or higher provider. License-exempt providers have no Great Start to Quality rating, so their income-eligible children always pay regardless of any star rating on record (RFT 270 p.3); the waiver is gated on provider type, not the star rating alone. The summed per-child Family Contribution is capped at a per-family limit (family_contribution/family_limit.yaml): N/A / $45 / $83 / $121 / $143 / $164 / $186 across the seven bands.Requirements Coverage
31 of 38 identified requirements are implemented; 7 are excluded by design (below).
eligibility/child_age_limitmi_ccap_eligible_child(is_tax_unit_dependent)mi_ccap_eligible_childeligibility/disabled_child_age_limitmi_ccap_eligible_childmi_ccap_eligible_childmi_ccap_eligible_child(is_ccdf_immigration_eligible_child)mi_ccap_eligible_childmi_ccap_activity_eligiblemi_ccap_activity_eligiblemi_ccap_activity_eligible(receives_or_needs_protective_services)mi_ccap_activity_eligiblemi_ccap_activity_eligible(is_full_time_student)mi_ccap_activity_eligiblemi_ccap_activity_eligible(is_full_time_student, withmeets_ccdf_activity_testfallback for activities not modeled individually)mi_ccap_activity_eligiblemi_ccap_activity_eligible(weekly_hours_worked_before_lsr)mi_ccap_activity_eligiblemi_ccap_income_waivedmi_ccap_income_waivedmi_ccap_income_waivedmi_ccap_income_waivedmi_ccap_income_waived(is_tanf_enrolled|ssi>0)mi_ccap_income_waivedmi_ccap_income_waivedmi_ccap_income_waivedincome/scale/entry_limit,exit_limitmi_ccap_income_eligible,mi_ccap_enrolledmi_ccap_income_eligiblemi_ccap_eligible(is_ccdf_asset_eligible)mi_ccap_eligibleauthorized_hours/tiersmi_ccap_authorized_hoursmi_ccap_authorized_hourstwo_parent_uses_highest_hoursmi_ccap_authorized_hoursmi_ccap_authorized_hoursauthorized_hours/tiersmi_ccap_authorized_hoursmi_ccap_authorized_hoursblock_hours/tiersmi_ccap_block_paymentmi_ccap_block_paymentmi_ccap_block_paymentmi_ccap_block_paymentrates/center,family_home,exemptmi_ccap_hourly_ratemi_ccap_hourly_rateage_group/thresholdsmi_ccap_age_groupmi_ccap_age_groupeligibility/max_program_group_sizemi_ccap_program_group_sizemi_ccap_program_group_sizeincome/countable_income/sourcesmi_ccap_countable_incomeintegrationincome/scale/band_thresholds/size_1..10mi_ccap_income_eligible,mi_ccap_family_contributionmi_ccap_income_eligible,mi_ccap_family_contributionfamily_contribution/per_childmi_ccap_family_contributionmi_ccap_family_contributionmi_ccapintegrationfamily_contribution/star_waiver_thresholdmi_ccap_family_contributionmi_ccap_family_contribution,integrationfamily_contribution/family_limitmi_ccap_family_contributionmi_ccap_family_contribution,integrationmi_ccap_provider_typemi_ccap_hourly_rate,mi_ccap_block_paymentmi_ccap_star_rating,mi_ccap_exempt_levelmi_ccap_hourly_rateNot Modeled
Historical Notes
The following prior-era values were identified during research but are not encoded here — they are recorded for a follow-up backdating PR:
Files Added
Test plan
policyengine-core test policyengine_us/tests/policy/baseline/gov/states/mi/mdhhs/ccap -c policyengine_us)make formatclean🤖 Generated with Claude Code