Skip to content

Implement Kentucky Child Care Assistance Program (CCAP)#8620

Draft
hua7450 wants to merge 4 commits into
PolicyEngine:mainfrom
hua7450:ky-ccap
Draft

Implement Kentucky Child Care Assistance Program (CCAP)#8620
hua7450 wants to merge 4 commits into
PolicyEngine:mainfrom
hua7450:ky-ccap

Conversation

@hua7450

@hua7450 hua7450 commented Jun 9, 2026

Copy link
Copy Markdown
Collaborator

Summary

Implements Kentucky's Child Care Assistance Program (CCAP) — the state's subsidy that helps low-income working families, families involved with child protective services, and families in approved workforce-training pay for child care. The implementation covers eligibility, the 85% State Median Income (SMI) income test, county-region provider rates from the DCC-300 chart, the per-day family copay schedule, and the net subsidy that flows into the federal child_care_subsidies total.

Closes #8619

Regulatory Authority

Administering agency: Cabinet for Health and Family Services (CHFS) → Department for Community Based Services (DCBS) → Division of Child Care (DCC). Repo agency directory is dcbs, matching the existing gov/states/ky/dcbs/ssp/.

Eligibility Tests

A household qualifies when its child passes the technical-eligibility tests and the family satisfies at least one activity/need pathway and (unless exempt) the income test.

Test Source How modeled
Kentucky residency §3(1)(a)1 defined_for = StateCode.KY chained through ky_ccap_eligible
U.S. citizen or qualified alien §3(1)(a)2, §1(25) reuses federal is_ccdf_immigration_eligible_child
Age under 13 (under 19 if special need) §3(1)(b) ky_ccap_eligible_child: age < child_age_limit (13), or < special_needs_child_age_limit (19) when the child is_disabled / has_developmental_delay
Working-family activity hours §4(1), §1(10) ky_ccap_activity_eligible: single parent ≥20 hrs/wk, or two adults combined ≥40 hrs/wk with the lesser worker ≥5 hrs/wk, using weekly_hours_worked_before_lsr
Kentucky Works / K-TAP pathway §6 is_tanf_enrolled bypass (also breaks the CCAP↔TANF circular dependency)
Protection & Permanency (no income test) §5, §8(3) ky_ccap_income_eligible exempts the family from the income test when a child in the unit is_in_foster_care

The activity test reads weekly_hours_worked_before_lsr (not weekly_hours_worked) to avoid a labor-supply-response circular dependency. There is no asset/resource test in 922 KAR 2:160, so none is applied.

Income Eligibility

The operative income test is gross monthly income ≤ 85% of Kentucky SMI, by family size (§9(5), citing 42 U.S.C. 9858c(c)(2)(N); confirmed by DCC-113 effective 2023-10-01). The dollar table is transcribed directly from DCC-113:

Family size 85% SMI (monthly)
2 $4,217
3 $5,210
4 $6,202
5 $7,194
6 $8,186
7 $8,372
8 $8,559
Each additional person over 8 + $186

We transcribed Kentucky's own table rather than computing hhs_smi × 0.85 because PolicyEngine's federal hhs_smi for Kentucky is stale (its last entry is FFY2020), whereas DCC-113 uses a newer SMI publication; the federal-derived figure is off by roughly $250–$470/month. The boundary is inclusive (income at or below 85% SMI qualifies). Protection & Permanency families are exempt from this test (§8(3)).

Income Deductions & Exemptions

Countable income is the gross income of the applicant and responsible adult (§8(2)), assembled as a positive sources list in income/countable_income/sources.yaml (employment, self-employment, farm, Social Security, unemployment and workers' compensation, pensions, alimony, child support received, dividends, interest, rent, veterans' benefits, military retirement). The two §8(5) deductions — legally-obligated child support paid out, and self-employment operating costs — are already netted by the underlying PolicyEngine income variables (self_employment_income is net of expenses; child support paid is captured in PE's support variables), so no separate subtraction list is needed.

The 38 excluded income categories in §8(4)(a)–(ll) — including SNAP, housing subsidies, LIHEAP, EITC, foster-care payments, K-TAP child-only payments, educational grants/scholarships, and a child's SSI (§8(4)(ll)) — are handled by omission: they simply are not in the positive sources list. tanf is deliberately omitted as well, both because it is excluded under §8(4) and to keep the CCAP↔TANF cycle broken (categorical eligibility comes from is_tanf_enrolled).

Benefit Calculation

The subsidy is computed per child, per day, then converted to a monthly amount by the child's days in care.

  • Provider daily rate (DCC-300, §10(1))ky_ccap_daily_rate looks up the maximum daily rate keyed by rate region × provider type × age group × day length. Kentucky's 120 counties collapse to 10 distinct rate regions (the DCC-300 chart shows only 10 unique 24-value rate vectors); ky_ccap_rate_region maps county_str to a region via np.isin. There are four provider types (Licensed Type I, Licensed Type II, Certified, Registered), three age groups (Infant/Toddler under 3, Preschool 3–<6, School-age ≥6, derived from age via age_group/months.yaml), and two day lengths (full day ≥5 hrs, part day <5 hrs, derived via rates/full_day_min_hours.yaml).
  • Special-care add-on (§10(3))+$1/day for a child with a special need, added in ky_ccap_daily_benefit.
  • Charge cap (§10(4)) — reimbursement is capped at the amount the provider charges the general public: min(provider charge, DCC-300 max + add-ons), where the per-day charge derives from pre_subsidy_childcare_expenses.
  • Family copay (§11(3))ky_ccap_copay is a per-day fee looked up by monthly countable income band × family size (2 / 3 / 4 / 5+) × number of children needing care (1 vs 2-or-more), implemented as bracket scales. Families with monthly income ≤ $899 pay $0. The per-day copay is capped at $25/day for families with more than five members (§11(3)(b), copay/max_daily.yaml).
  • Net subsidy (§10 + §11) — per child: max(min(charge, rate + add-ons) − copay, 0), summed across children in care and multiplied by each child's days of care per month. ky_ccap (SPMUnit, MONTH) is the household total; ky_child_care_subsidies (YEAR) aggregates it and feeds the federal child_care_subsidies.

Requirements Coverage

All 19 in-scope requirements are implemented; the remaining items are documented as not-modeled (see below).

REQ Description Parameter Variable Test
REQ-001 KY residency ky_ccap_eligible eligibility/ky_ccap_eligible.yaml
REQ-002 U.S. citizen / qualified alien ky_ccap_eligible_child eligibility/ky_ccap_eligible_child.yaml
REQ-003 Age <13 / <19 special need eligibility/child_age_limit, special_needs_child_age_limit ky_ccap_eligible_child eligibility/ky_ccap_eligible_child.yaml
REQ-006 Working-family hours eligibility/single_parent_activity_hours, couple_activity_hours, min_secondary_worker_hours ky_ccap_activity_eligible eligibility/ky_ccap_activity_eligible.yaml
REQ-007 Protection & Permanency (no income test) ky_ccap_income_eligible eligibility/ky_ccap_income_eligible.yaml
REQ-008 Kentucky Works / K-TAP ky_ccap_activity_eligible eligibility/ky_ccap_activity_eligible.yaml
REQ-009 85% SMI income test income/smi_limit/main, additional ky_ccap_income_eligible eligibility/ky_ccap_income_eligible.yaml
REQ-010 Countable income income/countable_income/sources ky_ccap_countable_income ky_ccap_countable_income.yaml
REQ-011 Excluded income (38 categories) — (handled by omission) ky_ccap_countable_income ky_ccap_countable_income.yaml
REQ-012 Deductions (child support paid, SE costs) — (underlying PE income vars) ky_ccap_countable_income ky_ccap_countable_income.yaml
REQ-014 Copay table copay/size_2, size_3_one_child, size_3_two_or_more, size_4_one_child, size_4_two_or_more, size_5_plus_one_child, size_5_plus_two_or_more ky_ccap_copay ky_ccap_copay.yaml
REQ-015 $25/day copay cap (>5 members) copay/max_daily ky_ccap_copay ky_ccap_copay.yaml
REQ-018 DCC-300 daily rate rates/licensed_type_i, licensed_type_ii, certified, registered, full_day_min_hours, regions/region_1region_10, age_group/months ky_ccap_daily_rate, ky_ccap_rate_region, ky_ccap_child_age_category, ky_ccap_day_length, ky_ccap_provider_type ky_ccap_daily_rate.yaml, ky_ccap_rate_region.yaml, ky_ccap_child_age_category.yaml, ky_ccap_day_length.yaml
REQ-019 Special-care add-on (+$1) supplements/special_care ky_ccap_daily_benefit ky_ccap_daily_benefit.yaml
REQ-020 Cap at charge to general public ky_ccap_daily_benefit ky_ccap_daily_benefit.yaml
REQ-022 Net subsidy ky_ccap ky_ccap.yaml, integration.yaml
REQ-023 State aggregator ky_child_care_subsidies ky_child_care_subsidies.yaml
REQ-025 Federal CCDF registry gov/hhs/ccdf/child_care_subsidy_programs.yaml
REQ-026 programs.yaml entry programs.yaml (CCDF state_implementations)

Not Modeled

These provisions are excluded by design and documented in the relevant variable docstrings using "we don't track X at the moment" framing.

What Source Why excluded
Immunization certificate §3(1)(c) No immunization status input available
Provider restrictions (parent/guardian/same-residence/unlicensed) §3(3) No provider-relationship input
Education / job-training pathway + 60-month lifetime cap §7 No student-enrollment input; cumulative lifetime benefit months are not tracked (framework limitation)
Job-search / homeless / medical-leave transitional pathway (up to 3 months) §4(2) No "month N of transitional status" state
Best-estimate income computation method §8(6) Administrative averaging procedure; PE uses annual→monthly conversion
P&P discretionary copay waiver / court-ordered substitution §5(3), §11(2) No input for the waiver decision (the P&P income-test exemption itself is modeled)
Copay frozen during 12-month eligibility period §11(3)(c) No per-household enrollment-cohort state; copay is recomputed each period from current income
Accreditation (+$2) and non-traditional-hours (+$1) rate add-ons §10(2) No provider-accreditation or non-traditional-hours input
Registered-provider per-day child caps (3 / 6) §10(5) Provider-side billing constraint, not a household-benefit calculation

Microsimulation Note

On the CPS-based dataset the statewide ky_ccap total is $0, and this is a dataset characteristic rather than an implementation defect. All 542 Kentucky households in the CPS carry a single county value (ADAIR_COUNTY_KY, which ky_ccap_rate_region correctly maps to Region 2), and the 40 Kentucky households that have child care expenses fail an eligibility gate (income above 85% SMI, no qualifying activity, or child age ≥13) on this synthetic data. The variable computes cleanly over the full population with no NaN or crash. The positive-benefit pipeline is exercised end to end by the unit and integration tests (rate lookup, copay, and net subsidy), e.g. a Jefferson County (Region 4) test household produces a non-zero ky_ccap_daily_benefit.

Historical Notes

Parameters start at recent dates because they reflect the current published policy:

  • 85% SMI income test — effective 2023-10-01 (DCC-113). The regulation's §8(1) text describes an older ≤160% FPL (initial) / ≤200% FPL (recert) test "as adjusted … through calendar year 2018," which is superseded; we implement only the operative 85% SMI test. For periods before 2023-10-01 the SMI dollar table backward-extrapolates to the 2023 values rather than reconstructing the pre-2018 FPL test, which is not modeled.
  • DCC-300 provider rates — effective 2022-10-01 (chart revision R.10/22). The regulation body text references an older "12/18" chart, but the currently published chart is R.10/22; we cite the chart for the rate values and the regulation for the structure.
  • Copay table and structural definitions — effective 2019-05-31, the most recent amendment of 922 KAR 2:160.

Files Added

policyengine_us/parameters/gov/states/ky/dcbs/ccap/
├── age_group/months.yaml
├── copay/
│   ├── max_daily.yaml
│   ├── size_2.yaml
│   ├── size_3_one_child.yaml
│   ├── size_3_two_or_more.yaml
│   ├── size_4_one_child.yaml
│   ├── size_4_two_or_more.yaml
│   ├── size_5_plus_one_child.yaml
│   └── size_5_plus_two_or_more.yaml
├── eligibility/
│   ├── child_age_limit.yaml
│   ├── couple_activity_hours.yaml
│   ├── min_secondary_worker_hours.yaml
│   ├── single_parent_activity_hours.yaml
│   └── special_needs_child_age_limit.yaml
├── income/
│   ├── countable_income/sources.yaml
│   └── smi_limit/{main,additional}.yaml
├── rates/
│   ├── {licensed_type_i,licensed_type_ii,certified,registered}.yaml
│   └── full_day_min_hours.yaml
├── regions/region_1.yaml … region_10.yaml
└── supplements/special_care.yaml

policyengine_us/variables/gov/states/ky/dcbs/ccap/
├── ky_ccap.py
├── ky_child_care_subsidies.py
├── ky_ccap_daily_benefit.py
├── ky_ccap_daily_rate.py
├── ky_ccap_copay.py
├── ky_ccap_countable_income.py
├── ky_ccap_rate_region.py
├── ky_ccap_child_age_category.py
├── ky_ccap_provider_type.py
├── ky_ccap_day_length.py
└── eligibility/
    ├── ky_ccap_eligible.py
    ├── ky_ccap_eligible_child.py
    ├── ky_ccap_income_eligible.py
    └── ky_ccap_activity_eligible.py

policyengine_us/tests/policy/baseline/gov/states/ky/dcbs/ccap/
├── ky_ccap.yaml, ky_child_care_subsidies.yaml, integration.yaml
├── ky_ccap_daily_benefit.yaml, ky_ccap_daily_rate.yaml, ky_ccap_copay.yaml
├── ky_ccap_countable_income.yaml, ky_ccap_rate_region.yaml
├── ky_ccap_child_age_category.yaml, ky_ccap_day_length.yaml
└── eligibility/{ky_ccap_eligible,ky_ccap_eligible_child,ky_ccap_income_eligible,ky_ccap_activity_eligible}.yaml

Modified registry files:

  • policyengine_us/parameters/gov/hhs/ccdf/child_care_subsidy_programs.yaml — adds ky_child_care_subsidies to the federal CCDF adds list.
  • policyengine_us/programs.yaml — adds the KY state_implementations entry under the federal CCDF program.

Test plan

  • 98 YAML tests pass locally (33 parameters, 14 variables, 14 test files)
  • Microsimulation smoke check on the CPS-based dataset (no NaN, no crash)
  • CI passes

🤖 Generated with Claude Code

hua7450 and others added 3 commits June 9, 2026 18:52
Add changelog fragment for the Kentucky Child Care Assistance Program
(CCAP). Closes PolicyEngine#8619.

Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@codecov

codecov Bot commented Jun 10, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 100.00%. Comparing base (bd1ae42) to head (e95555e).
⚠️ Report is 26 commits behind head on main.

Additional details and impacted files
@@             Coverage Diff              @@
##             main     #8620       +/-   ##
============================================
+ Coverage   77.77%   100.00%   +22.22%     
============================================
  Files           1        14       +13     
  Lines           9       244      +235     
============================================
+ Hits            7       244      +237     
+ Misses          2         0        -2     
Flag Coverage Δ
unittests 100.00% <100.00%> (+22.22%) ⬆️

Flags with carried forward coverage won't be shown. Click here to find out more.

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Implement Kentucky Child Care Assistance Program (CCAP)

1 participant