Implement North Dakota Child Care Assistance Program (CCAP)#8709
Draft
hua7450 wants to merge 4 commits into
Draft
Implement North Dakota Child Care Assistance Program (CCAP)#8709hua7450 wants to merge 4 commits into
hua7450 wants to merge 4 commits into
Conversation
Closes PolicyEngine#8708 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Child Care Assistance Program (NDAC 75-02-01.3; Manual Service Chapter 400-28, ML 3930): two-tier SMI income test (75% applicant / 85% enrolled), provider max-rate table (4 provider types x 4 age groups x FT/PT), stepped-%SMI copay (waived <=30% SMI, capped 7%), special-needs +10% SMR, QRIS step bonuses, infant/toddler provider bonus. Wired into federal CCDF child_care_subsidies and programs.yaml. 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 #8709 +/- ##
==========================================
Coverage 100.00% 100.00%
==========================================
Files 3 20 +17
Lines 47 312 +265
==========================================
+ Hits 47 312 +265
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:
|
- C1: revert child age limit to under-13 (unsourced 2026-04-01 under-12 entry removed) - C2: infant/toddler bonus gated on QRIS step 2+ and licensed provider; drop unsourced hours gate - C3: children's earned-income exclusion corrected to under-19 (NDAC 75-02-01.3-08(12)) - A1: document incapacity (400-28-35-15) basis for disabled-caretaker activity - A2: add top-level nd_ccap unit test Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
… limitations - Remove stale '40 hours/month' comment from infant_toddler_bonus.yaml (no hours gate after R1) - Document child-age grace-month and CCAP Workforce Benefit waiver as not-modeled 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 North Dakota's Child Care Assistance Program (CCAP) in PolicyEngine. CCAP is a provider-reimbursement childcare subsidy administered by the North Dakota Department of Health and Human Services (ND DHHS) under the federal Child Care and Development Fund (CCDF). The program reimburses providers up to a state maximum rate for eligible children in working or training families, net of an income-based family copay.
The implementation covers two-tier income eligibility (75% SMI at application / 85% SMI for enrolled families), the full 32-cell state maximum rate table (4 provider types x 4 age groups x full-time/part-time), an income-based copay with a 7% cap, and three provider-payment components: the special-needs +10% rate add-on and the additive QRIS-step and infant/toddler bonuses.
Closes #8708
Regulatory Authority
Program Overview
gov/states/nd/dhs/ccap(matches the existingnd/dhs/tanfconvention).nd_child_care_subsidies, which feeds the federal YEARchild_care_subsidies.Eligibility
eligibility/child_age_limit.yaml({2020-01-01: 13, 2026-04-01: 12}), compared viaage * MONTHS_IN_YEARinnd_ccap_eligible_childeligibility/disabled_child_age_limit.yaml(19), gated onis_disabled; court-ordered pathway not modeled (no input)(immigration_status == CITIZEN) | (immigration_status == LEGAL_PERMANENT_RESIDENT)— narrower than CCDF, sois_ccdf_immigration_eligible_childis not reusednd_ccap_eligiblerequiresadd(spm_unit, ..., [nd_ccap_eligible_child]) > 0nd_ccap_income_eligible:where(is_nd_ccap_enrolled, 0.85, 0.75) * hhs_smi; rates inincome/initial_smi_rate.yaml,income/continuing_smi_rate.yaml; new inputis_nd_ccap_enrolledis_ccdf_asset_eligible(gov.hhs.ccdf.asset_limit= $1M); no ND asset parameter creatednd_ccap_parent_in_eligible_activity(work/self-employment/student/training/incapacity/TANF) aggregated over head/spouse innd_ccap_activity_eligibledefined_for = StateCode.NDchain on all top-level variablesIncome & Copay
hhs_smi(federal State Median Income by state and family size, read with the bare monthlyperiod). Applicants must be at or below 75% SMI; enrolled families (viais_nd_ccap_enrolled) at or below 85% SMI, reflecting the graduated-eligibility provision in §400-28-25-15.income/sources.yaml, a positive list of counted PolicyEngine variables mirroring the 46 income exclusions in §400-28-65-15), less children's earned income (excluded per §400-28-65-15 item 6), less court-ordered child and spousal support paid (§400-28-65-30, NDAC 75-02-01.3-09; modeled innd_ccap_child_support_deductionfromchild_support_expense+alimony_expense). TANF cash is deliberately omitted fromsources.yamlto avoid the CCAP→TANF circular dependency.nd_ccap_copay) is a stepped percentage of countable income by % SMI band (copay/rate.yaml), waived at or below 30% SMI (copay/waiver_smi_threshold.yaml) and for TANF-enrolled families (is_tanf_enrolled, the only one of TANF/Diversion/Crossroads that is tracked), and capped at 7% of income (copay/max_rate.yaml, consistent with 45 CFR 98.45).Provider Rate Table & Bonuses
rates/full_time.yaml,rates/part_time.yaml), effective 2026-01-01, keyed bybreakdown: [nd_ccap_provider_type, nd_ccap_age_group]:nd_ccap_age_groupfromage * MONTHS_IN_YEARandis_in_k12_school.nd_ccap_time_category(time_category/full_time_min_hours.yaml= 25).nd_ccap_base_subsidy) =max(min(state_max_rate, billed/expenses) − copay, 0), capped atspm_unit_pre_subsidy_childcare_expenses. Copay is subtracted only from the base subsidy.rates/special_needs_multiplier.yaml= 1.10): raises the per-child state maximum rate ceiling inside themin(rate, expenses)cap, gated onis_disabledANDnd_ccap_provider_qris_step >= STEP_2(§400-28-100-30).is_disabledproxies the required written special-needs verification (the specific documentation type is not tracked). Cited to ND §400-28-100-30 — the manual text here carries stray Kentucky KRS citations that are a copy/paste artifact and are NOT treated as ND authority (a code comment flags this).rates/qris_step_bonus_rate.yaml;nd_ccap_qris_step_bonus): date-varying % of the base SMR by provider QRIS step — 7/1/2025 era Step 2/3/4 = +5%/+10%/+15%, eff. 1/1/2026 = +0%/+5%/+10% (Step 2 eliminated).rates/infant_toddler_bonus.yaml;nd_ccap_infant_toddler_bonus): flat $200/infant-month and $115/toddler-month, eff. 2026-01-01, for children attending 40+ hrs/mo (approximated fromchildcare_hours_per_weekviarates/infant_toddler_bonus_min_weekly_hours.yaml). Provider licensure jurisdiction (ND/tribal/military) is not tracked and is assumed met for non-approved-relative providers.nd_ccap_provider_qris_step(Person, MONTH, EnumNDCCAPProviderQRISStep: STEP_1, STEP_2, STEP_3, STEP_4, UNRATED [default, placed last]). Read by both the QRIS-step bonus and the special-needs +10% gate.Net-income framing note for reviewers: the QRIS-step and infant/toddler bonuses are paid to the provider and, per the manual, are "not intended for the child's billed amount," so they do not reduce family out-of-pocket childcare cost. Per the implementation decision they are nonetheless counted in
nd_ccapand flow intochild_care_subsidies. Reviewers and microsimulation users should be aware that these provider-side payments inflate the household benefit total without lowering the family's out-of-pocket cost.Benefit composition:
nd_ccap= base subsidy + QRIS-step bonus + infant/toddler bonus →nd_child_care_subsidies(YEAR) → federalchild_care_subsidies.Requirements Coverage
31 of 31 in-scope requirements are covered (parameter where value-based, variable where logic-based, and at least one test each); 0 missing.
nd_ccap_provider_qris_steprates/nd_ccap_provider_qris_step.yaml(5)eligibility/child_age_limitnd_ccap_eligible_childnd_ccap_eligible_child.yaml(11)eligibility/disabled_child_age_limit(19)nd_ccap_eligible_childnd_ccap_eligible_childnd_ccap_eligiblend_ccap_eligible.yaml(6)income/initial_smi_rate,continuing_smi_ratend_ccap_income_eligiblend_ccap_income_eligible.yaml(7)income/sourcesnd_ccap_gross_income,nd_ccap_countable_incomend_ccap_countable_income.yaml(5)gov.hhs.ccdf.asset_limit)nd_ccap_eligible(reusesis_ccdf_asset_eligible)nd_ccap_eligible.yamlnd_ccap_parent_in_eligible_activity.yaml(6)nd_ccap_activity_eligible.yaml(5)defined_for = StateCode.NDchainnd_ccap_child_support_deduction.yaml(3)copay/rate,copay/max_ratend_ccap_copaynd_ccap_copay.yaml(10)copay/waiver_smi_thresholdnd_ccap_copaynd_ccap_base_subsidy,nd_ccapnd_ccap_base_subsidy.yaml,integration.yaml(17)rates/full_time,part_timend_ccap_state_max_rate,nd_ccap_provider_type,nd_ccap_age_groupnd_ccap_state_max_rate.yaml(17),nd_ccap_age_group.yaml(10)time_category/full_time_min_hoursnd_ccap_time_categorynd_ccap_time_category.yaml(4)rates/special_needs_multipliernd_ccap_state_max_raterates/qris_step_bonus_ratend_ccap_qris_step_bonusnd_ccap_qris_step_bonus.yaml(9) + integrationrates/infant_toddler_bonus,infant_toddler_bonus_min_weekly_hoursnd_ccap_infant_toddler_bonusnd_ccap_infant_toddler_bonus.yaml(7) + integrationFederal wiring verified:
nd_child_care_subsidiesis in theaddslist ofchild_care_subsidy_programs.yaml, andnd_ccapis registered inprograms.yamlunder North Dakota CCAP.Not Modeled (by design)
childcare_hours_per_weekdirectlyVerification TODO
Test plan
policyengine-core test policyengine_us/tests/policy/baseline/gov/states/nd/dhs/ccap -c policyengine_us), covering all formula variables plus 17 integration scenarios.nd_ccap→nd_child_care_subsidies→ federalchild_care_subsidieswith no circular dependency; a vectorized multi-SPM-unit run (2 ND + 1 TX) computes correctly and the non-ND unit is correctly zeroed bydefined_for = StateCode.ND.make formatclean (ruff checkpasses).Files Added
Federal wiring edits:
parameters/gov/hhs/ccdf/child_care_subsidy_programs.yaml— addednd_child_care_subsidiesto theaddslist.programs.yaml— registered North Dakota CCAP (variablend_ccap) as a state implementation under federal CCDF.changelog.d/nd-ccap.added.md— changelog fragment.🤖 Generated with Claude Code