Skip to content

Implement Virginia Child Care Assistance Program (CCAP)#7933

Draft
hua7450 wants to merge 4 commits intoPolicyEngine:mainfrom
hua7450:va-ccap
Draft

Implement Virginia Child Care Assistance Program (CCAP)#7933
hua7450 wants to merge 4 commits intoPolicyEngine:mainfrom
hua7450:va-ccap

Conversation

@hua7450
Copy link
Copy Markdown
Collaborator

@hua7450 hua7450 commented Apr 6, 2026

Summary

Implements Virginia's Child Care Subsidy Program (CCSP) in PolicyEngine, including eligibility determination, locality-grouped income tests, copayment calculation (both current 2023 and new 2025-07-01 scales), and benefit computation.

Closes #7932

Regulatory Authority

Program Overview

  • Official name: Child Care Subsidy Program (CCSP)
  • Oversight: Virginia Department of Education (VDOE)
  • Administration: Virginia Department of Social Services (VDSS) through local departments of social services (LDSS)
  • Funding: Federal CCDBG/CCDF block grant + state funds
  • Federal authority: Child Care and Development Block Grant (CCDBG) Act of 2014

Eligibility

Requirement Source How Modeled
Child under 13 8VAC20-790-20(A) va_ccsp_child_eligible: age < p.child (param = 13)
Extended age under 18 for disabled/court 8VAC20-790-20(B) va_ccsp_child_eligible: where(is_disabled, p.disabled_child, p.child)
Child citizenship/immigration 8VAC20-790-40(B)(1) Reuses is_ccdf_immigration_eligible_child
Virginia residency 8VAC20-790-40(A) defined_for = StateCode.VA on all variables
Asset test ($1M) 8VAC20-790-40(C)(4) Reuses is_ccdf_asset_eligible
Activity test (work/education) 8VAC20-790-30 va_ccsp_activity_eligible: weekly_hours_worked >= p.min_hours_per_week OR is_full_time_student, checked on head/spouse
12-month eligibility period 8VAC20-790-40(D) va_ccsp_enrolled bare input switches income test from FPG entry to SMI exit limit

Federal CCDF variables reused (2):

  • is_ccdf_immigration_eligible_child -- child citizenship/immigration status
  • is_ccdf_asset_eligible -- $1M federal asset test

Income Eligibility

Virginia uses a dual FPG/SMI income test with locality-based thresholds.

New applicants (not enrolled): income must not exceed a percentage of the Federal Poverty Guideline based on locality group:

Locality Group FPG Rate Source
Group I (lowest cost-of-living) 150% FPG 8VAC20-790-40(C)(1)
Group II 160% FPG 8VAC20-790-40(C)(1)
Group III (highest cost-of-living) 185% FPG 8VAC20-790-40(C)(1)

Locality group is modeled as a bare input enum (va_ccsp_locality_group) defaulting to Group III (most generous). Full locality-to-group mapping (Appendix Z, 133 localities) is deferred.

Young child exception: families with a child age 5 or younger also qualify at 85% SMI regardless of locality group -- the income limit is max(FPG limit, 85% SMI).

Enrolled families (at redetermination): income limit is 85% of State Median Income (SMI) regardless of locality group.

Categorical waivers:

  • TANF recipients: automatically income-eligible via is_tanf_enrolled (8VAC20-790-30(A))
  • Medicaid/WIC recipients: noted in regulations (8VAC20-790-40(C)(3)) but not yet modeled in va_ccsp_income_test_waived -- can be added in a follow-up

Countable income (va_ccsp_countable_income): uses adds/subtracts pattern with 13 income sources (employment, self-employment, child support received, Social Security, pension, unemployment, workers' comp, veterans benefits, disability, interest, dividends, rental, alimony) minus child support paid. 30 categories of income are excluded by omission per 8VAC20-790-40(C)(1).

Copayment

Current Scale (Jan 1, 2023 -- June 30, 2025)

Income as % FPG Per-Child Monthly Copay
0--100% FPG $0
101--200% FPG $60
201--300% FPG $120
301% FPG -- 85% SMI $180
  • Max children assessed: 3 (max family copay from scale: $540/month)
  • Family income cap: 7% of gross countable income
  • TANF exempt: TANF recipients pay $0

Source: Guidance Manual Appendix B; VECF Budget Language Summary

New Scale (effective July 1, 2025)

Income as % FPG Per-Child Monthly Copay
Income = $0 $0
>0--100% FPG $5
101--150% FPG $125
151--200% FPG $175
201--250% FPG $225
251--300% FPG $275
301--350% FPG $325
351% FPG -- 85% SMI $375
  • Family income cap: 5% of gross countable income
  • TANF exempt: still $0

Source: FY26 Copayment One Pager; HB30 Item 126 #2h; 8VAC20-790 (amended Nov 19, 2025)

Both scales are encoded in per_child_scale.yaml with date-keyed thresholds. The .inf threshold technique makes 2025-only brackets unreachable under the 2023 scale.

Benefit Calculation

benefit = max(childcare_expenses - copay, 0)

Simplified: no Maximum Reimbursable Rate (MRR) ceiling. MRR varies by provider type, child age, and locality (~240 rate cells) and is deferred for future implementation.

Requirements Coverage (23 in-scope)

REQ Category Description Status
REQ-001 ELIGIBILITY Child age < 13 Covered
REQ-002 ELIGIBILITY Extended age < 18 (disabled/court) Covered
REQ-003 ELIGIBILITY Child citizenship/immigration Covered
REQ-004 ELIGIBILITY Virginia residency Covered
REQ-005 ELIGIBILITY Asset test ($1M) Covered
REQ-009 ELIGIBILITY Activity test (parameterized min hours) Covered
REQ-012 ELIGIBILITY 12-month enrolled flag Covered
REQ-013 INCOME Initial FPG by locality group (I/II/III) Covered
REQ-014 INCOME Young child (<=5) 85% SMI exception Covered
REQ-015 INCOME Exit/redetermination 85% SMI Covered
REQ-016 INCOME TANF auto income-eligible Covered
REQ-017 INCOME Medicaid/WIC categorical eligibility Partial (TANF only; Medicaid/WIC deferred)
REQ-019 INCOME Countable income (13 sources) Covered
REQ-020 INCOME Disregarded income (30 categories by omission) Covered
REQ-021 INCOME Deductions (child support paid) Covered
REQ-023 COPAY Current scale $0/$60/$120/$180 Covered
REQ-024 COPAY Max 3 children assessed Covered
REQ-025 COPAY 7% income cap (current) Covered
REQ-026 COPAY TANF exempt from copay Covered
REQ-027 COPAY New scale 2025-07-01 ($0/$5/$125--$375) Covered
REQ-028 COPAY 5% income cap (new) Covered
REQ-029 COPAY Zero-income = $0 copay Covered
REQ-030 BENEFIT Benefit = expenses - copay Covered

Coverage: 22/23 fully covered, 1 partial (REQ-017 Medicaid/WIC deferred).

Not Modeled (by design)

What Source Why Excluded
Immunization requirement 8VAC20-790-40(B)(2) Administrative requirement, not simulatable
Parent age >= 18 Guidance Manual 3.3.5 Administrative; PolicyEngine doesn't model emancipation
School attendance exclusion 8VAC20-790-40(B)(3) Administrative scheduling constraint
Two-parent good cause documentation 8VAC20-790-40(B)(4) Administrative documentation requirement
Family day home exclusion 8VAC20-790-40(B)(5) Provider-specific administrative rule
Non-financially-responsible applicant (250% FPG) 8VAC20-790-40(C)(1)(b) Rare edge case requiring separate applicant type
Income conversion factors (weekly x4.3, etc.) 8VAC20-790-40(C)(1) Handled by PolicyEngine period system
Maximum Reimbursable Rates (MRR) 8VAC20-790-40(E) ~240 rate cells by locality/age/provider; deferred
Five program categories 8VAC20-790-30 Administrative distinctions; TANF rules captured via is_tanf_enrolled
Full locality-to-group mapping (133 localities) Guidance Manual Appendix Z Modeled as bare input enum instead

Files Added

policyengine_us/
  parameters/gov/states/va/dss/ccsp/
    activity/
      min_hours_per_week.yaml             # 8 hours/week minimum activity
    age_threshold/
      child.yaml                          # 13 (standard)
      disabled_child.yaml                 # 18 (disabled/court)
    copay/
      income_cap_rate.yaml                # 0.07 (2023) -> 0.05 (2025-07-01)
      max_children.yaml                   # 3
      per_child_scale.yaml                # Both 2023 and 2025-07-01 brackets
    income/
      countable_income/
        sources.yaml                      # 13 income types
        subtracts.yaml                    # child_support_expense
      exit_smi_rate.yaml                  # 0.85
      initial_eligibility_fpg_rate.yaml   # GROUP_I: 1.5, GROUP_II: 1.6, GROUP_III: 1.85
      young_child_age_threshold.yaml      # 6 (child must be < 6)
      young_child_smi_rate.yaml           # 0.85

  variables/gov/states/va/dss/ccsp/
    va_ccsp.py                            # Main benefit (SPMUnit, MONTH, USD)
    va_ccsp_activity_eligible.py          # Activity test (SPMUnit, MONTH, bool)
    va_ccsp_child_eligible.py             # Child eligibility (Person, MONTH, bool)
    va_ccsp_copay.py                      # Family copayment (SPMUnit, MONTH, USD)
    va_ccsp_countable_income.py           # Countable income via adds/subtracts (SPMUnit, MONTH, USD)
    va_ccsp_eligible.py                   # Overall eligibility (SPMUnit, MONTH, bool)
    va_ccsp_enrolled.py                   # Bare input: currently enrolled (SPMUnit, MONTH, bool)
    va_ccsp_income_eligible.py            # Income eligibility with dual FPG/SMI test (SPMUnit, MONTH, bool)
    va_ccsp_income_test_waived.py         # TANF waiver (SPMUnit, MONTH, bool)
    va_ccsp_locality_group.py             # Bare input enum: GROUP_I/II/III (SPMUnit, YEAR)
    va_child_care_subsidies.py            # Year aggregation wrapper (SPMUnit, YEAR, USD)

  tests/policy/baseline/gov/states/va/dss/ccsp/
    integration.yaml                      # 7 full-pipeline integration tests
    va_ccsp.yaml                          # 4 benefit tests
    va_ccsp_activity_eligible.yaml        # 5 activity test cases
    va_ccsp_child_eligible.yaml           # 8 child eligibility tests
    va_ccsp_copay.yaml                    # 5 copayment tests
    va_ccsp_countable_income.yaml         # 5 income calculation tests
    va_ccsp_eligible.yaml                 # 5 overall eligibility tests
    va_ccsp_income_eligible.yaml          # 7 income eligibility tests
    edge_cases/
      integration_edge.yaml              # 7 boundary integration tests
      va_ccsp_activity_eligible_edge.yaml # 6 activity edge cases
      va_ccsp_child_eligible_edge.yaml   # 7 child eligibility edge cases
      va_ccsp_copay_2025_07.yaml         # 11 new-scale copay tests (July 2025+)
      va_ccsp_copay_edge.yaml            # 13 copay boundary tests
      va_ccsp_edge.yaml                  # 7 benefit edge cases
      va_ccsp_income_eligible_edge.yaml  # 14 income threshold boundary tests

Review History

Two rounds of automated program review (/review-program) were conducted:

Round 1: 8 critical issues identified and fixed:

  • Activity test was not parameterized (REQ-009) -- added min_hours_per_week parameter
  • Missing edge case tests for locality group boundaries
  • Missing 2025-07-01 copay scale tests
  • Income cap rate not date-split for 2025
  • Other test coverage gaps

Round 2: 0 critical issues. All requirements verified covered.

Test Plan

  • 111 test assertions pass across 15 YAML test files
  • Core tests: child eligibility, income eligibility (all 3 locality groups), activity test, copayment, benefit
  • Edge cases: exact threshold boundaries for each locality group, enrolled vs. new applicant, young child SMI exception, 2025-07-01 copay scale, TANF exemptions, disabled child, multi-child cap, income cap binding
  • Integration tests: full pipeline from inputs through eligibility, copay, and benefit
  • CI passes

hua7450 and others added 2 commits April 6, 2026 13:49
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@codecov
Copy link
Copy Markdown

codecov bot commented Apr 6, 2026

Codecov Report

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

Additional details and impacted files
@@            Coverage Diff             @@
##              main     #7933    +/-   ##
==========================================
  Coverage   100.00%   100.00%            
==========================================
  Files            1        11    +10     
  Lines           15       165   +150     
  Branches         1         0     -1     
==========================================
+ Hits            15       165   +150     
Flag Coverage Δ
unittests 100.00% <100.00%> (ø)

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

☔ View full report in Codecov by Sentry.
📢 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 2 commits April 6, 2026 16:04
- Activity min hours: 20 → 8 (Guidance Manual Section 1.1)
- Remove fabricated Medicaid/WIC income waiver (only TANF per 8VAC20-790)
- Young child age threshold: <= 5 → < 6 (fixes float comparison)
- Remove orphaned qualified_immigration_statuses.yaml
- Fix all #page= references (~30 pages off) and section format (dotted → letter)
- Add 2025-07-01 copay scale tests (period: 2026-01)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Activity proxy: is_in_k12_school → is_full_time_student (covers post-secondary)
- Fix 3 section/page references in parameter YAML
- Remove stale Medicaid/WIC test comment
- Changelog: CCAP → CCSP

Co-Authored-By: Claude Opus 4.6 (1M context) <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 Virginia Child Care Assistance Program (CCAP)

1 participant