Skip to content

Implement Kansas Child Care Assistance Program (CCAP)#8622

Open
hua7450 wants to merge 8 commits into
PolicyEngine:mainfrom
hua7450:ks-ccap
Open

Implement Kansas Child Care Assistance Program (CCAP)#8622
hua7450 wants to merge 8 commits into
PolicyEngine:mainfrom
hua7450:ks-ccap

Conversation

@hua7450

@hua7450 hua7450 commented Jun 9, 2026

Copy link
Copy Markdown
Collaborator

Summary

Implements the Kansas Child Care Assistance Program (CCAP) in PolicyEngine. CCAP is the state's child care subsidy, administered by the Kansas Department for Children and Families (DCF), Economic and Employment Services (EES). It reimburses providers for the cost of care for children in low-income working families, up to a maximum hourly provider rate and an authorized number of monthly hours, net of a family share deduction owed by the family.

Closes #8621

Regulatory Authority

All sources are from the Kansas Economic and Employment Services Manual (KEESM) and its appendices, published at content.dcf.ks.gov.

Program Overview

  • Administration: State-administered by Kansas DCF/EES.
  • Benefit mechanics: per eligible child, the monthly subsidy is the lesser of the family's actual child care cost and the maximum hourly provider rate times authorized monthly hours; the total across children is reduced by the family share deduction, floored at zero, and capped at actual expenses.

Eligibility

Requirement Source How Modeled
Child age below 13 KEESM 2810 age < child_age_limit (13) in ks_ccap_eligible_child
Special-needs extension to age 18 KEESM 2810 children with is_disabled or has_developmental_delay use special_needs_child_age_limit (age < 19). Court-supervision branch not modeled (no input).
Residency in Kansas KEESM 2810 defined_for = StateCode.KS chained through eligibility variables; ks_ccap_rate_group additionally masks on state_code_str == "KS" before county lookup
Child immigration eligibility federal CCDF (45 CFR 98.20) reuses is_ccdf_immigration_eligible_child
Asset test federal CCDF reuses is_ccdf_asset_eligible
Need for care — non-TANF work KEESM 2820 caretaker weekly_hours_worked_before_lsr >= activity_hours (20). Federal minimum-wage earnings floor not modeled.
Need for care — TANF KEESM 2820 is_tanf_enrolled grants activity eligibility with no minimum-hours test
Need for care — education KEESM 2820 Not an independent pathway: the post-secondary need reason is "Child Care for Employed Persons Also Attending Approved Education/Training," so employed students qualify via the employment test. Teen-parent high school/GED pathway not modeled.

The activity test uses weekly_hours_worked_before_lsr (not the post-labor-supply-response hours) to avoid a circular dependency in reform/microsimulation runs. A non-TANF unit is activity-eligible only if it has a head/spouse caretaker and no head/spouse caretaker fails the individual activity test.

Income Eligibility

KEESM 7540 delegates the income ceiling entirely to the Appendix F-1 schedule: a family is income eligible when nonexempt gross income is "within the income limits established annually by the agency... See Appendix Item F-1." The F-1 "Income Limit" is 85% of State Median Income (SMI) for every family size — the F-1 header states families above 85% SMI are not eligible. The 250% FPL figure from the 2021 DCF memo is the policy basis used to set the schedule, not a separate operational comparison, so the 85% SMI ceiling is the sole binding test.

ks_ccap_income_eligible computes the ceiling from existing federal parameters rather than transcribing the F-1 dollars: round(smi_income_limit_rate (0.85) × gov.hhs.smi[KS] with the HHS household-size adjustment ÷ 12), reading SMI at the federal fiscal-year vintage (October 1) that DCF uses to build each F-1 edition — the gov.hhs.smi parameter is otherwise uprated mid-fiscal-year, which would overstate the published ceiling. Family size is capped at 11 (the largest F-1 column; CCAP requires a child so the schedule starts at size 2). This reproduces every published F-1 income limit exactly:

Family size Monthly income limit (85% SMI)
2 $5,439
3 $6,719
4 $7,998
5 $9,278
6 $10,558
7 $10,798
8 $11,038
9 $11,278
10 $11,518
11 $11,758

TANF bypass: KEESM 7540 exempts households with a TANF recipient from the financial-need test, so is_tanf_enrolled families are income eligible regardless of the F-1 ceiling.

Countable income (KS-specific, KEESM 6200/6300/6410): earned income (employment, self-employment, farm) is counted for members aged 18+ and for any minor who is a parent (legally responsible for another nuclear-family member per KEESM 6410), so a teen parent's own wages stay countable while other children's earnings are exempt. Unearned income (Social Security, unemployment, workers' compensation, pension, military retirement, alimony, rental, veterans' benefits, dividends, interest) is counted for all members. SSI and assigned child support are excluded per the KEESM 6410 exemptions. TANF is excluded from the countable-income list to break the CCAP↔TANF circular dependency — the is_tanf_enrolled bypass already makes TANF families categorically income eligible.

Family Share Deduction

ks_ccap_family_share derives the deduction from the F-1 schedule's underlying rates instead of transcribing its dollar table. Two single_amount brackets keyed by the family's income-to-FPG ratio drive the calculation: tier_floor maps the ratio to the income tier's lower FPL multiple (0, 1.0, 1.1 … 1.85 — mirroring the F-1 "Income Limit" column), and rate maps it to the deduction percentage (0% at or below 100% FPL, 3% above 100% through 185%, 5% above 185% — per the May 2026 memo, unchanged since July 2021). The deduction is round(rate × round(tier_floor × monthly FPG)), rounding half-up to whole dollars at each step exactly as DCF builds the published table. Families below 100% FPL owe $0. Per KEESM 7541 the deduction is assessed only for "Income Eligible (Non-TANF) clients," so TANF recipients owe no family share (formula returns 0 when is_tanf_enrolled).

This derivation reproduces every published F-1 dollar amount (verified value-by-value), with one knowing exception: the published size-11 180% FPL bound shows $10,917 where the rule derives $10,914 — DCF's own schedule deviates from its formula there, and the implementation uses the derived value (noted in code comments). Published deduction values by family size and FPL tier (the May 1, 2026 F-1 schedule):

FPL tier Fam 2 Fam 4 Fam 6 Fam 8 Fam 11
≤100% $0 $0 $0 $0 $0
≤110% $54 $83 $111 $139 $182
≤120% $60 $91 $122 $153 $200
≤130% $65 $99 $133 $167 $218
≤140% $70 $107 $144 $181 $236
≤150% $76 $116 $155 $195 $255
≤160% $81 $124 $166 $209 $273
≤170% $87 $132 $177 $223 $291
≤180% $92 $140 $189 $237 $309
≤185% $97 $149 $200 $251 $327
≤85% SMI $167 $254 $342 $430 $561

Because the schedule is computed from FPG, SMI, and the tier/rate brackets, the implementation tracks future annual F-1 refreshes automatically as the federal gov.hhs.fpg and gov.hhs.smi parameters are updated — no per-size dollar re-transcription required.

Benefit Calculation

ks_ccap (SPMUnit, MONTH) computes, per eligible child:

per_child = min(actual child care expenses, ks_ccap_hourly_rate × ks_ccap_monthly_hours)

summed across eligible children, then max(total − ks_ccap_family_share, 0), capped at the SPM unit's actual monthly child care expenses. Because the benefit is built up from actual expenses and capped rates (no "base minus countable income" fill-the-gap path), negative self-employment income cannot inflate the subsidy.

  • Authorized hours (ks_ccap_monthly_hours): childcare_hours_per_week × WEEKS_IN_YEAR / MONTHS_IN_YEAR, capped at 240 hours/month, or 215 hours/month for relative providers (in-home and out-of-home).
  • Maximum hourly rate (ks_ccap_hourly_rate): selected by provider type from the Appendix C-18 schedule.

The C-18 rate schedule (eff. Oct 1, 2024) varies by county rate group, provider type, and age group. County groups: Group 1 = Johnson County only; Group 2 = 17 named counties (Butler, Douglas, Ellis, Geary, Greeley, Harvey, Jefferson, Leavenworth, Miami, Pottawatomie, Riley, Rush, Scott, Sedgwick, Seward, Shawnee, Wyandotte); Group 3 = all other Kansas counties (statewide base). Child care center maximum hourly rates illustrate the structure:

Age group Group 1 Group 2 Group 3
Infant (0–11 mo) $7.33 $6.28 $6.28
Toddler (12–35 mo) $6.25 $5.28 $5.26
Preschool (36–59 mo) $5.51 $4.13 $4.27
School-age (60+ mo) $4.81 $3.65 $3.16

Licensed homes and out-of-home relative care have their own group × age-group rate tables; in-home relative care is a statewide flat $2.42/hour (eff. Nov 1, 2018) and the enhanced rate for special care is a statewide flat $7.34/hour (eff. Oct 1, 2024).

Requirements Coverage

All 27 in-scope requirements are covered (REQ-001..REQ-027). Items marked "(NM)" model the substantive rule but leave a narrow nuance unmodeled, documented in code comments.

REQ Description Parameter Variable Test
001 Child age < 13 eligibility/child_age_limit ks_ccap_eligible_child ks_ccap_eligible_child
002 (NM) Special-needs age 14–18 extension (court supervision NM) eligibility/special_needs_child_age_limit ks_ccap_eligible_child ks_ccap_eligible_child + integration
003 Child immigration eligibility — (federal) ks_ccap_eligible_child ks_ccap_eligible_child
004 Kansas residency ks_ccap_eligible integration
005 Asset test — (federal) ks_ccap_eligible integration
006 (NM) Non-TANF work ≥20 hr/wk (min-wage floor NM) eligibility/activity_hours ks_ccap_activity_eligible ks_ccap_activity_eligible
007 TANF need pathway ks_ccap_activity_eligible integration
008 (NM) Education pathway (other pathways NM) ks_ccap_activity_eligible ks_ccap_activity_eligible
009/010 Income limit incl. 85% SMI ceiling family_share/income_limit/size_2..11 ks_ccap_income_eligible ks_ccap_income_eligible + integration
011 Countable income (TANF excluded) income/countable_income/{earned,unearned} ks_ccap_countable_income ks_ccap_countable_income
012/013/014 Family share deduction (F-1 table, $0 < 100% FPL, TANF waiver) family_share/deduction/size_2..11 ks_ccap_family_share ks_ccap_family_share + integration
015 County rate group 1/2/3 rate_group/{group_1,group_2} ks_ccap_rate_group ks_ccap_rate_group
016 Hourly rates (group × type × age) rates/{center,licensed_home,out_of_home_relative} ks_ccap_hourly_rate ks_ccap_hourly_rate
017 In-home relative flat $2.42 rates/in_home_relative ks_ccap_hourly_rate ks_ccap_hourly_rate + integration
018 (NM) Enhanced special care $7.34 (form gate NM) rates/enhanced_special_care ks_ccap_hourly_rate ks_ccap_hourly_rate + integration
019 Child age → age-group columns age_group/{center,home,relative}_months ks_ccap_{center,home,relative}_age_group ks_ccap_*_age_group
020 Monthly hours cap 240/215 hours/{standard,relative}_max_monthly ks_ccap_monthly_hours ks_ccap_monthly_hours
021 Enrollment fee excluded by design
022 Transportation fees excluded by design
023 Monthly benefit = min(expenses, rate × hours) − FSD ks_ccap ks_ccap + integration
024 YEAR aggregator adds=[ks_ccap] ks_child_care_subsidies ks_child_care_subsidies
025 Federal CCDF registry gov/hhs/ccdf/child_care_subsidy_programs
026 programs.yaml state_implementations
027 Changelog fragment

Not Modeled

What Source Why excluded
Court-supervision age extension (14–18) KEESM 2810 We don't track court supervision at the moment; the 14–18 extension applies only to children with a disability or developmental delay.
Minimum-wage earnings floor on the 20 hr/wk test KEESM 2820 We model the hours floor but don't enforce the federal minimum-wage earnings floor at the moment.
Other need-for-care pathways (food assistance E&T, teen-parent training, crisis services, Early Head Start partnership, foster care) KEESM 2820 We don't track these activity statuses as inputs at the moment; the work, TANF, and education pathways are modeled.
Abuse/neglect-prevention child care pathway (exempt from the need test) KEESM 7540 We don't track this status at the moment.
Unemployed food-assistance work-program exemption from the income test KEESM 7540 We don't track food-assistance work-program participation at the moment.
Enhanced special-care form/approval gate (ES-1627a + regional approval) Appendix C-18 We model the rate but don't track the form/approval workflow at the moment.
Enrollment fee assistance (up to $50/child/case/year) KEESM 7600 We don't track provider enrollment fees as an input at the moment.
Transportation fees KEESM 7600 Excluded by design — not a subsidized cost.
KEESM 2835 family-share-deduction exceptions KEESM 7541/2835 We don't model the FSD exception cases at the moment.
Eligibility-period boundary nuance (age "through the end of the period containing the 13th birthday") KEESM 2810 We don't track eligibility-period boundaries at the moment; modeled as age < 13.
High-school-diploma extension of the children's-earnings exemption to age 19 KEESM 6410 We don't track high-school-completion status at the moment; the exemption is applied through age 18.

Historical Notes

The income test has always been delegated to Appendix F-1 by KEESM 7540, but the schedule's policy basis evolved. The July 1, 2021 implementation memo expanded eligibility to 250% FPL, federally capped at 85% SMI — at that time the SMI cap bound only for the largest family sizes (sizes 7+, asterisked in that era's F-1). The current F-1 (eff. May 1, 2026) lists "Up to 85% SMI" as the top eligibility band for every family size 2–11: the 85% SMI dollar values now fall below 250% × FPG for all sizes, so the effective ceiling is 85% SMI across the board. The 2026 memo is the annual FPG/SMI table refresh; the family share deduction structure (0% / 3% / 5% by FPL tier) has been unchanged since July 2021.

An income/fpl_limit.yaml parameter (2.5, eff. 2021-07-01) was initially created from the 2021 memo, then deleted as an orphan once KEESM 7540's delegation to F-1 was verified — the F-1 schedule is the sole operative income test, so a separate 250% FPL comparison would have been redundant. The implementation initially transcribed the F-1 dollar tables (20 per-size parameter files); after verifying that every published value derives exactly from FPL multiples, the 3%/5% rates, and 85% of the HHS SMI series, those tables were replaced with the rate-based bracket parameters described above.

Verification TODO for reviewers: the exact date Kansas moved from min(250% FPL, 85% SMI) to a pure 85% SMI ceiling for the smaller family sizes (2–6) was not pinned down (intermediate F-1 editions and memos were not collected). This does not affect modeled periods, because all parameters start at their documented effective dates (F-1 income/FSD tables 2026-05-01; C-18 rates 2024-10-01; in-home relative rate 2018-11-01).

Files Added

policyengine_us/parameters/gov/states/ks/dcf/ccap/
├── age_group/{center_months,home_months,relative_months}.yaml
├── eligibility/{child_age_limit,special_needs_child_age_limit,activity_hours}.yaml
├── family_share/{tier_floor,rate,smi_income_limit_rate,max_family_size}.yaml
├── hours/{standard_max_monthly,relative_max_monthly}.yaml
├── income/countable_income/{earned,unearned}.yaml
├── rate_group/{group_1,group_2}.yaml
└── rates/{center,licensed_home,out_of_home_relative,in_home_relative,enhanced_special_care}.yaml

policyengine_us/variables/gov/states/ks/dcf/ccap/
├── eligibility/{ks_ccap_eligible,ks_ccap_eligible_child,ks_ccap_income_eligible,ks_ccap_activity_eligible}.py
├── ks_ccap.py
├── ks_child_care_subsidies.py
├── ks_ccap_countable_income.py
├── ks_ccap_family_share.py
├── ks_ccap_rate_group.py
├── ks_ccap_provider_type.py
├── ks_ccap_hourly_rate.py
├── ks_ccap_monthly_hours.py
└── ks_ccap_{center,home,relative}_age_group.py

policyengine_us/tests/policy/baseline/gov/states/ks/dcf/ccap/   (14 test files)

# Registry and changelog edits
policyengine_us/parameters/gov/hhs/ccdf/child_care_subsidy_programs.yaml   (add ks_child_care_subsidies)
policyengine_us/programs.yaml                                              (KS CCAP state_implementations entry)
changelog.d/ks-ccap.added.md

Test plan

  • 107 YAML test cases across 14 files — all passing (policyengine-core test policyengine_us/tests/policy/baseline/gov/states/ks/dcf/ccap -c policyengine_us)
  • Microsimulation test (5 tests) — passing; no ParameterNotFoundError, no CCAP↔TANF cycle errors, no KS-originated warnings
  • CI passes

hua7450 and others added 2 commits June 9, 2026 18:52
Add changelog fragment for the Kansas Child Care Assistance Program (CCAP)
implementation. Tracks PolicyEngine#8621.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ne#8621)

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 (020e558).
⚠️ Report is 31 commits behind head on main.

Additional details and impacted files
@@             Coverage Diff              @@
##             main     #8622       +/-   ##
============================================
+ Coverage   77.77%   100.00%   +22.22%     
============================================
  Files           1        15       +14     
  Lines           9       280      +271     
============================================
+ Hits            7       280      +273     
+ 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 10, 2026 08:47
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Replace the 20 transcribed F-1 dollar tables (income limits and family
share deductions by family size) with rate parameters derived from
existing federal sources: FPL tier-floor and 0%/3%/5% deduction-rate
brackets keyed by income-to-FPG ratio, and an 85% SMI income ceiling
computed from gov.hhs.smi at the federal fiscal year vintage. Verified
to reproduce every published F-1 value (except DCF's own size-11 180%
FPL quirk, documented in code). Adds boundary and tier coverage tests
(111 cases passing).

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

- tier_floor/rate first thresholds -> -.inf (explicit negative-income clamp)
- Note keesm2810/keesm7540 page spans in titles citing sections 2820/7541
- Reword the ks_ccap expense cap comment (guards inconsistent direct inputs)
- Document the SMI vintage vs May F-1 refresh lag as a forward-modeling choice

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The post-secondary need reason is "Child Care for Employed Persons Also
Attending Approved Education/Training" - education does not independently
satisfy the activity requirement, so a non-working full-time student
household no longer qualifies. Employed students qualify through the
20-hour employment test; the teen-parent high school/GED pathway remains
unmodeled (documented).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@hua7450 hua7450 marked this pull request as ready for review June 10, 2026 16:33
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 Kansas Child Care Assistance Program (CCAP)

1 participant