Implement Minnesota Child Care Assistance Program (CCAP)#8637
Conversation
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
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 #8637 +/- ##
=========================================
Coverage 100.00% 100.00%
=========================================
Files 18 19 +1
Lines 292 308 +16
=========================================
+ Hits 292 308 +16
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:
|
- Model MN CCAP activity-hours requirement (>=20 hr/wk, >=10 FT students) per Minn. Stat. 142E.12 subd.1(b) - Fix citations: 142E.06->142E.10 subd.1 (income), 142E.01 subd.7->subd.4 (child age), family_months->9502.0315, rate_unit->142E.17 subd.1 - Replace hard-coded 26 with WEEKS_IN_YEAR/2; strip page suffix from reference titles - Add MN CCAP to programs.yaml; add copay size 7/10 + LNL/exempt/full-day integration tests Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- exit_during_period.yaml: cite DHS-6413N + 45 CFR 98.21(a)(1) for 85% SMI (142E.10 lacks it) - Document 142E.12 subd.3 education/training pathway as not modeled; pin 142E.12 subd.1(b) ref - center_months.yaml: align title with 9503.0005 href - Add inclusive 20-hr activity edge test; fix stale subd.7 comment Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- Exclude children's earned income from countable income (manual 6.6.1) - Activity eligibility: MFIP/DWP categorical, full-time-student education pathway, and broaden the "unable to provide care" exemption (manual 4.6.1, 4.6.3); full-time students no longer need a work-hours floor - Apply statutory per-day and per-week payment caps and legal non-licensed 10-hour/day and 50-hour/week caps to provider rates (Minn. Stat. 142E.17 subd. 1(f), 2(b)) Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- Exempt families experiencing homelessness from the authorized-activity requirement (CCAP Policy Manual 4.6.9), mirroring MA/SC/AL/KY CCAP via is_homeless. - Floor net self-employment at zero per person so a business loss cannot reduce wages or unearned income (Minn. Rules 3400.0170 subp. 4; manual 6.15.6); split self-employment into its own countable-income source list. - Cite CCAP Policy Manual 9.9 as the source of the rate-unit hour thresholds. - Add tests: homelessness exemption, self-employment loss floor (wage, unearned, cross-member, and allowed cross-business offset), and the activity term in the overall eligibility gate. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
PavelMakarchuk
left a comment
There was a problem hiding this comment.
Program Review — Minnesota Child Care Assistance Program (CCAP)
Automated multi-agent review (regulatory, references, code patterns, test coverage, and source-value audits of income/copay + the 87-county provider-rate tables).
Excellent, thorough implementation of a large, complex program — 113 CCAP + 11 param/system tests pass, vectorized clean, and every audited value matches source: SMI rates 0.47/0.67/0.85 (DHS-6413N), income limits reconstruct the at-a-glance table to <$1, the biweekly copay schedule matches DHS-6413N bracket-by-bracket, and all provider rate cells match DHS-6441F exactly (8 counties × 2 types × 4 ages × 4 units, largest diff 0.00). The 67/47/85 three-way SMI split is verbatim-correct per 142E.10, and the Parent Aware 15%/20% differential checks out. Requesting changes on a few items — none are value errors.
✅ Cleared (not an error) — flagging so it isn't "fixed"
rate_unit/weekly_hours_threshold = 35 (and daily_hours_threshold = 5) are correct. These implement the Policy Manual §9.9 rate-UNIT billing rule (>35 hr/wk → weekly; ≤35 & >5/day → daily; else hourly). Statute 142E.17 subd 6's "30 hours" is a different rule — the eligibility floor to access the weekly rate basis — not the billing threshold. Please do not change 35 → 30.
Should address
- Revert the unrelated
uv.lockchange. This PR bumpspolicyengine-us1.721.1 → 1.729.5, which is unrelated to CCAP —git checkout main -- uv.lock. - Rate-unit citation quality (
rate_unit/weekly_hours_threshold.yaml,daily_hours_threshold.yaml). The values are right, but they cite a non-resolving Policy Manual §9.9 dynamic-conversion link (and 142E.17 subd 1, which sets no hour threshold). Please supply a resolvable §9.9 anchor and add a one-line comment distinguishing the statutory 30-hr eligibility floor from the §9.9 35-hr billing rule (so a future updater doesn't "correct" it to 30). - Test coverage gaps: add an explicit out-of-state (non-MN) county case to exercise the
mn_ccap_provider_ratemasking guard; broaden county coverage beyond Becker + Hennepin; and add a disabled 13–14-year-old end-to-end through a benefit.
Suggestions
- Note the copay date back-extrapolation (rates eff 2025-01-06, copay eff 2025-10-13 → Jan–Sep 2025 back-fills the Oct copay schedule; verified non-zero — worth a one-line comment).
quality_differential.yaml:STAR_4: 0.20→0.2(value-formatting rule).- Add a comment in
lnl_hourly.yamlthat the DHS-6441F LNL column already reflects the 90%-of-licensed rule (so it isn't recomputed as a literal 90%). - Note that DWP is folded into the
is_tanf_enrolledMFIP proxy. - DHS-6441F lists St. Cloud/Sartell as separate city rate blocks; the PR keys by county only (St. Cloud city FCC rates differ from Stearns county) — a documented sub-county simplification worth a note.
Cleared / verified
All source values match; 67/47/85 split correct; Parent Aware differential correct; all 87 county enums present (no orphans); no reinvented variables; no shared federal code touched; programs.yaml: complete justified.
🤖 Multi-agent review via /review-program
…, add tests - Revert unrelated uv.lock policyengine-us version bump (1.729.5 -> 1.721.1) - rate_unit weekly/daily hours thresholds: cite a resolvable section 9.9 stable PDF (page 287) and add a comment distinguishing the 35-hour billing rule from the 142E.17 subd. 6 statutory 30-hour eligibility floor (do not change to 30) - quality_differential STAR_4 0.20 -> 0.2 - Add provider-rate tests: Ramsey county (broaden coverage) and an out-of-state masking-guard case; add a disabled 13-year-old end-to-end benefit test Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…into mn-ccap # Conflicts: # policyengine_us/parameters/gov/hhs/ccdf/child_care_subsidy_programs.yaml # policyengine_us/programs.yaml
Summary
Implements Minnesota's Child Care Assistance Program (CCAP) in PolicyEngine — a provider-rate reimbursement subsidy computed per child as the lesser of the provider's charge or the state maximum rate, minus the biweekly parent fee. Administered by the Minnesota Department of Children, Youth, and Families (DCYF), which took CCAP over from the Department of Human Services (DHS) in 2024.
Closes #8636
Regulatory Authority
Program Overview
hhs_smivariable × {47% / 67% / 85%} (verified to the dollar against DHS-6413N: 2-person 47% = $46,022; 3-person 67% = $81,042; 4-person 85% = $122,398), so the implementation reuseshhs_smirather than introducing a separate Minnesota SMI variable.Eligibility
mn_ccap_eligibleaggregatesmn_ccap_eligible_childover the SPM unitage_threshold/child.yaml(13) +disabled_child.yaml(15) inmn_ccap_eligible_childis_tax_unit_dependentinmn_ccap_eligible_childis_ccdf_immigration_eligible_childmn_ccap_activity_eligible(see below)is_ccdf_asset_eligiblemn_ccap_income_eligible(SMI test reusinghhs_smi)Authorized activity (
mn_ccap_activity_eligible; manual §4.6.1, §4.6.3; Minn. Stat. 142E.12 subd. 1(b)): at least one caretaker must be in an authorized activity — employed an average of ≥ 20 hrs/week, or enrolled as a full-time student (education is itself an authorized activity under §4.6.6.9, with no work-hours floor). In a two-caretaker family the other caretaker must also be active or "unable to provide care" — modeled viais_disabled,is_incapable_of_self_care,is_incarcerated(house arrest), and out-of-home/residential care-facility status. MFIP/DWP families meet the requirement categorically through their Employment Plan (is_tanf_enrolled), and families experiencing homelessness are exempt from the activity requirement (§4.6.9), modeled viais_homeless— we don't track the manual's ~3-month exemption window, so the exemption applies for the full period. Themeets_ccdf_activity_testinput covers approved activities we don't derive directly (job search, education/training programs, temporary leave) and the applicable-minimum-wage component.Income
Income base = annual gross income after allowable deductions, used for both the eligibility test and the copay band lookup (manual §6.3, §6.6; Minn. Rules 3400.0170 subp. 4; Minn. Stat. 256P.06).
income/countable_income/earned.yaml.income/countable_income/self_employment_sources.yaml): a net business loss may offset other self-employment income but cannot reduce wages or unearned income (Minn. Rules 3400.0170 subp. 4; manual §6.15.6), somn_ccap_gross_earned_incomeappliesmax_(self_employment, 0)per person before adding it to wages.mn_ccap_gross_earned_incomesubtracts the earnings of household members under 18 (is_child). This is a simplification — the manual additionally counts a non-student minor's earnings and a dependent post-secondary student's earnings, which we don't separately track.income/countable_income/unearned.yaml. Income types without a PolicyEngine variable are listed as inline comments.income/deductions/sources.yaml; applied asmn_ccap_countable_income = max_(gross − deductions, 0).Benefit Calculation
Per eligible child:
summed across eligible children. Actual expenses come from the federal
spm_unit_pre_subsidy_childcare_expenses(RI/MA/CO precedent). The parent pays any provider charge above the maximum, plus the copay (manual §9.9; Minn. Stat. 142E.17 subd. 1(e),(i)).rates/{weekly,full_day,hourly,lnl_hourly}.yaml.mn_ccap_rate_unit; parameters:rate_unit/{weekly,daily}_hours_threshold.yaml.rates/lnl_max_daily_hours.yaml(10),rates/lnl_max_weekly_hours.yaml(50).quality_differential.yaml.copay/biweekly/size_2.yaml…size_13.yaml; variable:mn_ccap_copay.Source Verification
Every published dollar value was verified against the official PDFs:
hhs_smi× {47% / 67% / 85%}.Not Modeled
Verification TODO
Files
Test plan
policyengine-core test)