Implement South Carolina CCAP (Child Care Assistance Program)#7935
Open
hua7450 wants to merge 16 commits intoPolicyEngine:mainfrom
Open
Implement South Carolina CCAP (Child Care Assistance Program)#7935hua7450 wants to merge 16 commits intoPolicyEngine:mainfrom
hua7450 wants to merge 16 commits intoPolicyEngine:mainfrom
Conversation
Adds eligibility, income, copay, provider rates (~840 cells), and benefit calculation for SC's Working Families track. Refs PolicyEngine#7934. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## main #7935 +/- ##
===========================================
+ Coverage 92.72% 100.00% +7.27%
===========================================
Files 3 18 +15
Lines 55 353 +298
Branches 2 4 +2
===========================================
+ Hits 51 353 +302
+ Misses 3 0 -3
+ Partials 1 0 -1
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:
|
- Add 150% FPL and disabled child copay exemptions - Fix disabled_child_age_limit off-by-one (19→20) - Correct fee scale effective dates to 2025-10-01 - Fix 9 wrong page numbers and 2 wrong section titles - Add historical FT hours threshold (30→25 on 10/01/2024) - Verify second child discount direction is correct Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Revert disabled_child_age_limit from 20 back to 19 (Policy Manual: "under 19") - Filter disabled child copay exemption to children only (not adults) - Add fpg_exempt_in_effect boolean guard (false before 2024-10-01) - Add defined_for on sc_ccap_second_child_discount_rate - Remove is_tax_unit_dependent from eligible_child (use age-based check only) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
The SC CCAP implementation previously hard-required income and activity tests for all cases, which is narrower than the actual program. The policy manual (Section 2.4, 2.15) defines protective services and Head Start wraparound categories that bypass these requirements. - Add sc_ccap_protective_services variable (foster care, homeless, CPS) - Add sc_ccap_head_start_category variable (Head Start enrollment) - Add is_enrolled_in_head_start input variable - Refactor sc_ccap_eligible to OR across standard, protective services, and Head Start pathways - Refactor sc_ccap_copay to use category-based zero-copay instead of ad-hoc foster/homeless checks - Remove sources/working_references.md (agent artifact) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…ity, part-time rates - Head Start pathway now only covers the enrolled child, not siblings (Section 2.15: "for the Head Start child") - Head Start children forced to half-time rates while enrolled (Section 2.15: "pays only part time to extend the Head Start day") - Disabled parent satisfies activity requirement (Section 2.13) - Copay: Head Start children excluded per-child, not family-level - Protective services comment clarifying income test is retained - Second-child discount comment clarifying per-facility simplification Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…esholds Replace 16 family_size_*.yaml bracket files with structural parameters (SMI tier ratios, weekly copay amounts, tier count). The copay formula now computes tier boundaries dynamically from HHS SMI and FPG, covering both eras: pre-2024 (SMI ratio thresholds) and post-2024 (150% FPL to 85% SMI equal bands). Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Derive tier count from smi_tier_ratios bracket length instead of separate parameter file. - Use period auto-conversion for hhs_smi (YEAR→MONTH) instead of manual period.this_year / MONTHS_IN_YEAR. - Comment out tanf from CCAP countable income sources to break circular dependency (tanf → childcare_expenses → sc_ccap → sc_ccap_countable_income → tanf). Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…NF cycle - Require Head Start child itself to be CCDF-eligible (age + immigration) rather than allowing one child's enrollment to combine with a different child's eligibility (P3 fix). - Only charge copay for non-Head-Start children when the unit qualifies through standard or protective pathway. Head Start-only units pay $0 for uncovered siblings (P2 fix). - Remove tier_count parameter (derived from bracket length). - Simplify hhs_smi period access (auto-conversion). - Comment out tanf from countable income sources to break circular dependency. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Require is_tax_unit_dependent for child eligibility (Policy Manual 2.1.7), matching all other CCAP implementations. - Add age-6 threshold to age_group bracket so 6+ children always get AGE_5_12_IN_SCHOOL instead of AGE_5_NOT_IN_K when is_in_k12_school is false. - Gate rate and copay on childcare_hours_per_week > 0 so children with no care arrangement get $0 rate and are not counted in copay. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…ount to in-care children - Move the 2% income cap from per-child weekly to total monthly family copay, so multi-child families are correctly capped. - Compute youngest child for second-child discount only among children with childcare_hours_per_week > 0, so at-home siblings don't trigger the discount on in-care children. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Post-2024, only family sizes 1-14 have paid copay tiers; sizes 15-16 are $0-only in the published fee scale. Cap the FPL/SMI threshold computation at max_family_size and exempt families above it. This also prevents 17+ person units from getting extrapolated thresholds beyond the published table. Co-Authored-By: Claude Opus 4.6 (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 South Carolina's Child Care Scholarship Program (CCAP) in PolicyEngine, covering the Working Families track. Includes eligibility logic, income counting, copayment fee scale, provider rate tables, and benefit calculation.
This branch also fixes the large-family copay edge cases in the South Carolina fee scale implementation, narrows the disabled-child copay exemption to actual dependent children, and removes an unused
sc_ccap_head_start_categoryvariable and fixture.Closes #7934
Regulatory Authority
Program Overview
Eligibility
defined_for = StateCode.SCsc_ccap_eligible_childwith parameterized age limitsis_ccdf_immigration_eligible_child(federal)is_tax_unit_dependentsc_ccap_activity_eligiblesc_ccap_income_eligibleis_ccdf_asset_eligible(federal)sc_ccap_eligiblechecks eligible child count > 0Income Rules
sources.yaml— 13 included sources (employment, self-employment, farm, Social Security, pension, UI, workers comp, child support, alimony, interest, dividends, rental, veterans benefits). TANF is excluded to avoid a circular dependency (tanf -> childcare_expenses -> sc_ccap -> sc_ccap_countable_income -> tanf).Copayment (Fee Scale)
The copay formula covers two eras:
Pre-2024-10-01 (SMI ratio method): 5 tiers at fixed SMI ratios (45%/55%/65%/75%/85%). Family size is capped at the published 16-person row so 17+ households inherit the last published thresholds rather than receiving larger derived thresholds.
Post-2024-10-01 (FPL-to-SMI band method): Families at or below 150% FPL pay $0. Above that, positive copay bands are derived only through the last published paid-tier family size. Rows 15-16 remain $0-only per the published fee scale, and 17+ households inherit the capped published row.
This avoids two correctness issues in the original implementation:
$0when150% FPLovertakes85% SMIchildcare_hours_per_week = 0get $0 rate and are excluded from copay countsmi_tier_ratios.yaml— SMI ratio per tier (pre-2024)weekly_amounts.yaml— copay per tiermax_family_size.yaml— published fee-scale row capmax_paid_family_size.yaml— last post-2024 family size with positive copay tiersProvider Rates
Full rate tables encoded across all dimensions:
sc_ccap_second_child_discount_rateNot Modeled (by design)
Review Fixes Applied
sc_ccap_head_start_categoryvariable and its standalone YAML fixture because the main SC CCAP formulas do not depend on it.Files
Validation
Local checks run:
uv run policyengine-core test policyengine_us/tests/policy/baseline/gov/states/sc/dss/ccapStatus at update time:
130tests)