Add Connecticut CCAP (Care 4 Kids)#7778
Conversation
Closes PolicyEngine#7777 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…yEngine#7777) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## main #7778 +/- ##
==========================================
Coverage 100.00% 100.00%
==========================================
Files 3 14 +11
Lines 33 228 +195
==========================================
+ Hits 33 228 +195
Flags with carried forward coverage won't be shown. Click here to find out more. ☔ View full report in Codecov by Sentry. 🚀 New features to boost your workflow:
|
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add Jan 2024 and Jul 2024 rate data to all 16 C4K payment rate parameter files (center, family, relative, recreational × 4 care levels). Fixes microsimulation crash for 2024 where rate parameter lookups failed with empty vectorial nodes. Remove lessons/agent-lessons.md which duplicates local memory. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Change all C4K variables to definition_period = MONTH (except aggregator) - Fix care_level bracket amounts to match Enum indices directly (remove - 1 hack) - Fix 2 swapped values in family/quarter_time.yaml (NC/NW School-Age 2024-07-01) - Remove spurious 2025-01-01 entries that were artifacts of the swap - Remove unnecessary index.yaml files - Add comment noting county approximation limitation for C4K regions (C4K uses towns, not counties; PolicyEngine lacks town-level geography) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…ncome - Consolidate 16 rate files into 4 with care_level Enum breakdown - Simplify ct_c4k_payment_rate.py from 100+ lines to ~20 lines - Fix care_level bracket amounts to match Enum indices (remove -1 hack) - Fix 2 swapped values in family quarter-time (NC/NW School-Age Jul 2024) - Change all C4K variables to MONTH definition_period - Update ct_c4k.py formula for monthly computation - Cap ct_c4k_countable_income at 0 (child_support_expense can exceed income) - Add county approximation comment for C4K regions (towns vs counties) - Remove index.yaml files and sources/working_references.md - Update all test files for MONTH periods with correct monthly values - All 122 tests pass Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Fix is_disabled YEAR→MONTH period bug in ct_c4k_payment_rate.py - Add C4K-POL-24-02 reference for 2025 family fee schedule - Specify RCSA 17b-749-13 subsections: (d)(1) accreditation, (c)(11) special needs - Add 45 CFR 98.21(b) federal CCDF reference for 85% SMI continuing limit - Add Jul 2025 and pre-2025 rate period tests - Add pre-2025 family fee bracket test (4% at 25% SMI) - Add age group boundary tests (ages 3, 5, 6) - Remove redundant eligible_child test case Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Program Review Report: Connecticut Care 4 Kids (CCAP/C4K)PR: #7778 -- Add Connecticut CCAP (Care 4 Kids) Source Documents
Critical Issues (Must Fix)CRITICAL 1: Period mismatch -- YEAR booleans accessed with MONTH period in
|
| Category | Checked | Matched | Mismatched |
|---|---|---|---|
| Center-based rates (Jul 2025) | 60 | 60 | 0 |
| Licensed family rates (Jul 2025) | 60 | 60 | 0 |
| Unlicensed relative rates (Jul 2025) | 60 | 60 | 0 |
| Recreational rates (Jul 2025) | 60 | 60 | 0 |
| Care level thresholds | 4 | 4 | 0 |
| Age group thresholds | 3 | 3 | 0 |
| Family fee brackets (post-2025) | 4 | 4 | 0 |
| Family fee brackets (pre-2025) | 5 | 5 | 0 |
| Total | 256 | 256 | 0 |
Items needing external verification (not in provided PDFs): special needs supplement (15%), accreditation bonus (5%), child age thresholds (13/19), income sources/deductions, initial income limit (60% SMI). These are referenced to RCSA regulations and CGA reports not included in the audit set.
Validation Summary
| Aspect | Result |
|---|---|
| Regulatory accuracy | CORRECT -- all major components verified against official sources |
| Payment rates (PDF audit) | 240/240 match, 0 mismatches (256/256 including thresholds and fees) |
| Code patterns | 2 critical period mismatches, 10 warnings (mostly style) |
| Test coverage | 127 test cases across 11 files, 9/10 coverage score |
| CCDF integration | Correct reuse of federal variables |
| Naming conventions | All follow ct_c4k_* pattern |
| Vectorization | All formulas use numpy vectorized operations |
| Hardcoded values | None found -- all parameterized |
| Changelog | Present (changelog.d/ct-ccap.added.md) |
Review Severity
REQUEST_CHANGES
Two critical period mismatch bugs in ct_c4k_eligible.py and ct_c4k_income_eligible.py must be fixed before merge. These cause YEAR-defined boolean variables to be auto-converted to ~0.083 when accessed with MONTH period. While current tests pass (0.083 is truthy), the behavior is incorrect and fragile.
Required before merge:
- Fix
ct_c4k_eligible.py: useperiod.this_yearforis_ccdf_asset_eligibleandmeets_ccdf_activity_test - Fix
ct_c4k_income_eligible.py: useperiod.this_yearforis_enrolled_in_ccdfinadd()
Should address (not blocking):
- Add missing
2023-10-01: 0.65transition tocontinuing_limit_smi.yamlif absent - Verify recreational rate at Jan 2024
- Fix 8 parameter description verbs
Suggestions (optional):
- Add comment about weekly-rate-in-MONTH-variable
- Remove redundant code comment
- Shorten region comment block
- Fix YEAR boolean period mismatches in ct_c4k_eligible.py (is_ccdf_asset_eligible) and ct_c4k_income_eligible.py (is_enrolled_in_ccdf) to use period.this_year - Replace federal meets_ccdf_activity_test with formula-based ct_c4k_meets_activity_test checking employment, self-employment, TFA eligibility, and teen parent in school - Add teen_parent age threshold parameter (RCSA 17b-749-04) - Tighten integration test error margin from 1 to 0.1 with precise expected values - Update integration Case 10 to realistic TFA-eligible scenario - Remove redundant comment in ct_c4k.py, shorten region comment in ct_c4k_region.py Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Review Fixes AppliedAddressed findings from the program review: Critical (fixed)
Should-address
Suggestions (applied)
Not applied (per author decision)
|
Summary
Implements Connecticut Care 4 Kids (C4K) child care subsidy program in PolicyEngine.
Closes #7777
C4K is Connecticut's CCDF-funded child care assistance program, administered by the Office of Early Childhood (OEC). This implementation covers the complete benefit calculation pipeline: child eligibility, two-tier income eligibility (initial vs. continuing), countable income with exclusions and deductions, sliding-scale family fee, multi-dimensional payment rate lookup (5 regions x 4 provider types x 3 age groups x 4 care levels), special needs supplements, accreditation bonuses, and final subsidy computation. Two rate periods are modeled: Jan-Jun 2025 and Jul 2025-Jun 2026 (11% increase). Reuses existing federal CCDF infrastructure for asset eligibility, immigration eligibility, SMI standards, and enrollment status.
Regulatory Authority
Income Eligibility Tests
Initial Application: < 60% SMI
New applicants must have gross countable income below 60% of State Median Income for their family size.
is_enrolled_in_ccdfto distinguish new applicants from continuing recipientsContinuing Recipients: < 85% SMI
Active recipients at redetermination must have income below 85% of SMI.
SMI Standards
Uses federal
hhs_smivariable which computes State Median Income by state and family size from HHS-published figures.Income Deductions & Exemptions
Countable Income (RCSA 17b-749-05(b))
Gross earnings of all parents/adult family members + unearned income of ALL family members. Implemented via
sources.yamlparameter list with 11 income types:employment_income,self_employment_income,farm_incomesocial_security,pension_income,unemployment_compensation,workers_compensation,alimony_income,rental_income,veterans_benefits,disability_benefitsExcluded Income (RCSA 17b-749-05(b)(2))
22+ income types excluded by omission from the sources list:
Deductions (RCSA 17b-749-05(c))
self_employment_incomeis already net of IRS standard deductionschild_support_expensesubtracted viadeductions.yamlparameterIncome Standards
SMI-based thresholds by family size (FY 2024-2025, source: C4K-POL-24-01):
Benefit Calculation
Formula
Where:
Family Fee Sliding Scale
Pre-January 2025 (source: RCSA 17b-749-13(f)):
Effective January 1, 2025 (source: C4K-POL-24-02):
Rules: Families with only unearned income have no fee. Fee allocated to youngest child first.
Payment Rate Structure
5 regions x 4 provider types x 3 age groups x 4 care levels = 240 rate cells per period.
Care Levels: Full-Time Plus (51-65 hrs/wk), Full-Time (35-50), Half-Time (16-34), Quarter-Time (1-15)
Provider Types: Centers/Group Homes/School Programs, Licensed Family Child Care Homes, Unlicensed Relative Care, Recreational Programs (Summer)
Age Groups: Infant/Toddler, Pre-School, School-Age
Regions (county-to-region approximation): Eastern, North Central, Northwest, South Central, Southwest
Rate Periods:
Example weekly rates (Jul 2025, Centers, Full-Time Plus):
Supplements
Activity Test
ct_c4k_meets_activity_testis a CT-specific formula variable (RCSA 17b-749-04) that checks:Teen parent age threshold (20) is parameterized in
age_threshold/teen_parent.yaml.Not modeled: JFES (Job/Family Employment Services) participation — requires administrative data not available in PolicyEngine.
Not Modeled
Review Fixes Applied
Addressed findings from program review (#7778 comment by @PavelMakarchuk):
Critical (fixed)
ct_c4k_eligible.py:is_ccdf_asset_eligible(YEAR boolean) now usesperiod.this_yearct_c4k_income_eligible.py:is_enrolled_in_ccdf(YEAR boolean) inadd()now usesperiod.this_yearmeets_ccdf_activity_test(bare input) with formula-basedct_c4k_meets_activity_testShould-address
continuing_limit_smi.yamlalready had the 2023-10-01: 0.65 transition (no change needed)Suggestions (applied)
ct_c4k.pyct_c4k_region.pyabsolute_error_marginfrom 1 to 0.1 with precise expected values