Skip to content

Implement Kentucky Child Care Assistance Program (CCAP)#8620

Open
hua7450 wants to merge 9 commits into
PolicyEngine:mainfrom
hua7450:ky-ccap
Open

Implement Kentucky Child Care Assistance Program (CCAP)#8620
hua7450 wants to merge 9 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 or receives_or_needs_protective_services

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 family fee with a dated formula per regulation edition:
    • Before 2024-11-18 (2019 edition): fee by income band × family size (2 / 3 / 4 / 5+) × number of children needing care (1 vs 2-or-more), as seven bracket scales; $0 below $900/month.
    • From 2024-11-18 (current edition's CCAP Daily Co-Payment Chart): fee by income band × household size — the household-of-2 fee (copay/base.yaml, $4 at $1,600/month rising $1 per $300 band to $25 at $7,900) minus $1 per additional member with a $0 floor, plus $1 per full $300 of income over $8,199.99 (copay/escalation/). The chart's "over age 6" extension note is applied by household size alone, matching the chart's printed unconditional household-of-7 column. The Section 5(3) copay waiver for Protection & Permanency families is mandatory in this edition and is modeled (copay = $0).
    • Both periods cap the fee at $25/day (§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 copay waiver before 2024-11-18 / court-ordered substitution §5(3) (2019 ed.), §11(2) The waiver was discretionary in the 2019 edition (not modeled); the 11-18-2024 edition makes it mandatory and it is modeled from that date
Child-care-worker full income exclusion §4(4) (eff. 11-18-2024) We don't track employment in a licensed child-care center or certified family child-care home at the moment
Six-month transitional period at 50% provider rate §9(6) (eff. 9-1-2022) We don't track months since an income change
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

  • Regulation editions: the program was first encoded from the 5-31-2019 edition; the PR now also models the current 11-18-2024 edition (copay chart restructure, special-care supplement $1 → $5, mandatory P&P copay waiver). Intermediate amendments (12-15-2021, 11-15-2022) were not diffed, so some 2024-dated changes may have earlier true effective dates.
  • The 2024 chart aligns the copay bands with the 85% SMI income limits (bands to $8,199.99 plus an open-ended escalation), where the 2019 table stopped at $3,699.99.

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

  • 113 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 (5027302).
⚠️ Report is 36 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       265      +256     
============================================
+ Hits            7       265      +258     
+ 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.

hua7450 and others added 6 commits June 9, 2026 21:38
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The Protection and Permanency pathway (922 KAR 2:160 Section 5) covers
children receiving child protective or preventive services, not only
foster placements. Combine the existing receives_or_needs_protective_services
input with is_in_foster_care, matching the federal CCDF reason-for-care
check and the PA/NJ/DE/SC/AL/VT child care implementations.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Covers approved activities not modeled individually (SNAP E&T, education/
job training, job search, incapacitated parent, teen-parent education),
matching the fallback pattern in AK/AL/PA/NJ/DE/VT/VA/AR child care programs.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…tucky concept

DCC-300 lists per-county rates with no region structure; the 120 county
rows take only 10 distinct rate signatures, which PolicyEngine groups as
rate regions. The previous descriptions wrongly attributed the grouping
to Kentucky.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
922 KAR 2:160 Section 8(5)(a) deducts actual, legally obligated child
support paid to a party outside the residence; the self-employment
operating-cost deduction in Section 8(5)(b) is inherent in
self_employment_income. Follows the AK CCAP pattern.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The implementation previously encoded the superseded 5-31-2019 edition.
Changes effective 2024-11-18 (2019 values retained for earlier periods):
- Copay restructured to the CCAP Daily Co-Payment Chart: income band x
  household size (household-of-2 fee, -$1 per additional member with a
  $0 floor, +$1 per full $300 over $8,199.99), via a dated formula
- Mandatory P&P copay waiver (Section 5(3): "shall waive", was "may")
- Special-care supplement $1 -> $5 (Section 10(3))
- Documented as not modeled: Section 4(4) child-care-worker income
  exclusion, Section 9(6) six-month transitional period
- Pre-2024 tests re-dated to 2024-01; new 2025 cases cover the new
  chart, escalation, size floor, and the P&P waiver

Intermediate editions (12-15-2021, 11-15-2022) were not diffed, so some
changes may have earlier true effective dates.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@hua7450 hua7450 marked this pull request as ready for review June 10, 2026 18:15
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