Skip to content

Add Vermont Child Care Assistance Program (CCAP)#7769

Open
hua7450 wants to merge 10 commits intoPolicyEngine:mainfrom
hua7450:vt-ccap
Open

Add Vermont Child Care Assistance Program (CCAP)#7769
hua7450 wants to merge 10 commits intoPolicyEngine:mainfrom
hua7450:vt-ccap

Conversation

@hua7450
Copy link
Collaborator

@hua7450 hua7450 commented Mar 12, 2026

Summary

Implements the Vermont Child Care Financial Assistance Program (CCFAP) in PolicyEngine, covering eligibility determination, income testing, rate lookups, family share calculation, and benefit computation.

Closes #7768

Regulatory Authority

Income Eligibility Tests

  1. Gross income <= FPL threshold (adjusted for family size) -- CCFAP Regulations Section II B 2; Income Guidelines
  2. Asset limit < $1 million -- reuses federal is_ccdf_asset_eligible (dcf.vermont.gov/benefits/ccfap)
  3. Child age: 6 weeks to < 13 years (< 19 for special needs) -- CCFAP Regulations Section I B
  4. Citizenship/immigration: U.S. citizen or qualified noncitizen -- reuses is_ccdf_immigration_eligible_child (45 CFR 98.20)
  5. Categorical exemptions (bypass income test): Reach Up/Reach First recipients, protective services children, foster children -- CCFAP Regulations Section II B 2 a

Income Deductions & Exemptions

16 income exclusion categories per CCFAP Regulations Section II B 2. Implementation uses an inclusion-list approach (income/sources.yaml) listing 12 counted income sources. Excluded income types are implicitly omitted.

Income Standards

Using 2025 Federal Poverty Guidelines at 575% FPL (maximum eligibility threshold):

Family Size Annual FPG (2025) 575% FPL Annual 575% FPL Monthly
1 $15,650 $89,988 $7,499
2 $21,150 $121,613 $10,134
3 $26,650 $153,238 $12,770
4 $32,150 $184,863 $15,405

Family Share (Copayment)

Current (Oct 6, 2024): $0/wk at ≤175% FPL, $50-$425/wk at 175-575% FPL in $25 increments per 25% FPL step.
Pre-April 2024: $0/wk at ≤150% FPL, $25-$200/wk at 150-350% FPL. Source: Jan 2024 Legislative Report p15

Benefit Calculation

Formula (Understanding Payments Guide):

Weekly Benefit = max(sum(State Rate per eligible child) - Weekly Family Share, $0)
Monthly Benefit = Weekly Benefit × 52 / 12

Verified against PDF examples:

  • Jane Smith: Registered home infant FT, $50/wk share → $387 - $50 = $337/wk
  • Honey Child Care: Licensed center toddler PT, $50/wk share → $243 - $50 = $193/wk

Rate History

Rates are backdated to July 2, 2023 (Act 76 simplified rate structure). Source: Rate Increase Per Act 76

Date Licensed Center Change Registered Home Change
Jul 2, 2023 Simplified to 5-STAR rate Simplified to 5-STAR rate
Jan 1, 2024 35% increase 35% increase
Jun 30, 2024 No change 50% differential reduction
Jul 13, 2025 Infant/Toddler increase Infant/Toddler increase

Age group boundary change: Preschool upper limit moves from 60 months to 72 months ("3 up to 6 years old") effective Jul 13, 2025. Source: Capped Rates Important Definitions

Requirements Coverage

REQ Description Param Variable Test
REQ-001 VT residency defined_for = StateCode.VT All variables All tests use state_code: VT
REQ-002 Citizen/qualified noncitizen (federal) is_ccdf_immigration_eligible_child (reused) vt_ccfap_eligible_child.yaml
REQ-003 Child age 6wk-13yr (19 special needs) age_group/months.yaml vt_ccfap_eligible_child vt_ccfap_eligible_child.yaml (10 cases)
REQ-005 Asset limit < $1M (federal) is_ccdf_asset_eligible (reused) vt_ccfap_eligible.yaml
REQ-006 Gross income <= FPL limit income/fpl_limit.yaml vt_ccfap_income_eligible vt_ccfap_income_eligible.yaml (11 cases)
REQ-007 Gross income definition income/sources.yaml (12 sources) vt_ccfap_countable_income Income eligible + integration tests
REQ-009 Age categories age_group/months.yaml (bracket) vt_ccfap_age_group vt_ccfap_age_group.yaml (7 cases)
REQ-010 Care schedule PT/FT/Extended care_schedule/hours.yaml (bracket) vt_ccfap_care_schedule vt_ccfap_care_schedule.yaml (11 cases)
REQ-011 Provider types -- vt_ccfap_provider_type vt_ccfap_provider_type.yaml (5 cases)
REQ-012 State rates by provider × age × schedule rates/licensed_center.yaml, rates/registered_home.yaml vt_ccfap_state_rate vt_ccfap_state_rate.yaml (24 cases)
REQ-013 Family share sliding scale family_share/scale.yaml vt_ccfap_family_share vt_ccfap_family_share.yaml (14 cases)
REQ-014 Benefit = sum(rates) - family_share ≥ $0 -- vt_ccfap vt_ccfap.yaml (10 cases), integration.yaml (13 cases)
REQ-015 Reach Up → 100% subsidy -- vt_reach_up_eligible (reused) Multiple test files
REQ-016 Protective services → 100% subsidy -- receives_or_needs_protective_services (reused) Multiple test files
REQ-018 Foster families → 100% subsidy -- is_in_foster_care (reused) Multiple test files
REQ-021 Act 76 expansion timeline income/fpl_limit.yaml (3.5→4.0→5.75) vt_ccfap_income_eligible Cases 9-10 test pre-April 350% limit

Coverage: 17/17 in-scope requirements implemented (100%)

Not Modeled

REQ Description Reason
REQ-004 Service need / reason for care Bare input variable (meets_ccdf_activity_test) -- not simulatable from household data
REQ-017 Family Support child care exemption No corresponding input variable in codebase
REQ-019 Adoptive parents with adoption subsidy exemption No receives_adoption_subsidy variable available
REQ-020 Adoptive parents with special needs child exemption Adoption-specific -- not simulatable
REQ-022 Enrollment-based payments (vs attendance) No attendance tracking in PolicyEngine
REQ-023 Provider rate excess over state rate Family bears difference; beyond subsidy calculation scope

Files Added

policyengine_us/
  parameters/gov/states/vt/dcf/ccfap/
    age_threshold/
      base.yaml                    # 13 years
      special_needs.yaml           # 19 years
    age_group/
      months.yaml                  # Bracket: 0→Infant, 24→Toddler, 36→Preschool, 60/72→School Age
    care_schedule/
      hours.yaml                   # Bracket: 0→PT, 25.0001→FT, 50.0001→Extended
    income/
      fpl_limit.yaml               # 3.5 (2009), 4.0 (Apr 2024), 5.75 (Oct 2024)
      sources.yaml                 # 12 counted income sources
    family_share/
      scale.yaml                   # Sliding scale: FPL ratio → weekly amount (backdated to 2009)
    rates/
      licensed_center.yaml         # Weekly rates by age × schedule (Jul 2023 → Jul 2025)
      registered_home.yaml         # Weekly rates by age × schedule (Jul 2023 → Jul 2025)
  variables/gov/states/vt/dcf/ccfap/
    eligibility/
      vt_ccfap_categorically_exempt.py  # Categorical exemption (TANF/foster/protective)
      vt_ccfap_eligible.py         # Overall CCFAP eligibility (SPMUnit)
      vt_ccfap_eligible_child.py   # Child eligibility - age + dependent + immigration (Person)
      vt_ccfap_income_eligible.py  # Income eligibility (SPMUnit)
    vt_ccfap.py                    # Monthly CCFAP benefit (SPMUnit)
    vt_ccfap_age_group.py          # Age group via bracket .calc() (Person)
    vt_ccfap_care_schedule.py      # Care schedule via bracket .calc() (Person)
    vt_ccfap_countable_income.py   # Gross countable income (SPMUnit)
    vt_ccfap_family_share.py       # Weekly family copayment, monthly (SPMUnit)
    vt_ccfap_provider_type.py      # Provider type enum (Person)
    vt_ccfap_state_rate.py         # Weekly state rate per child (Person)
    vt_child_care_subsidies.py     # State child care subsidy aggregator (SPMUnit)
  tests/policy/baseline/gov/states/vt/dcf/ccfap/
    vt_ccfap.yaml                  # 10 benefit calculation tests
    vt_ccfap_age_group.yaml        # 7 age group tests
    vt_ccfap_care_schedule.yaml    # 11 care schedule tests
    vt_ccfap_eligible.yaml         # Overall eligibility tests
    vt_ccfap_eligible_child.yaml   # 10 child eligibility tests
    vt_ccfap_family_share.yaml     # 14 family share tests
    vt_ccfap_income_eligible.yaml  # 11 income eligibility tests (incl. pre-2024 350% FPL)
    vt_ccfap_provider_type.yaml    # 5 provider type tests
    vt_ccfap_state_rate.yaml       # 24 state rate tests
    integration.yaml               # 13 end-to-end tests (incl. Jane Smith & Honey Child Care)

Totals: 9 parameter files, 12 variable files, 10 test files (31 files)

hua7450 and others added 3 commits March 12, 2026 13:54
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Closes PolicyEngine#7768

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@codecov
Copy link

codecov bot commented Mar 12, 2026

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 100.00%. Comparing base (19ec305) to head (f0fc005).
⚠️ Report is 10 commits behind head on main.

Additional details and impacted files
@@            Coverage Diff             @@
##              main     #7769    +/-   ##
==========================================
  Coverage   100.00%   100.00%            
==========================================
  Files            3        12     +9     
  Lines           33       186   +153     
==========================================
+ Hits            33       186   +153     
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 7 commits March 12, 2026 16:16
…d test name

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…into vt-ccap

# Conflicts:
#	policyengine_us/variables/gov/hhs/ccdf/child_care_subsidies.py
- Backdate rates to 2023-07-02 (Act 76 simplified rate structure)
- Add Jan 1, 2024 registered home rates before Jun 30 differential reduction
- Fix FPL limit: 350% from 2009, 400% from Apr 7 2024, 575% from Oct 6 2024
- Backdate family share scale to 2009 with pre-April bracket at 150% FPL
- Add preschool age boundary change to 72 months at 2025-07-13
- Fix #page= references on 8 variable files
- Add pre-Oct-2024 income eligibility tests for 350% FPL limit
- Run make format

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Replace 3 separate age_group files (infant_max, toddler_max, preschool_max)
  with single age_group/months.yaml bracket parameter using .calc()
- Replace 2 separate care_schedule files (part_time_max, full_time_max)
  with single care_schedule/hours.yaml bracket parameter using .calc()
- Simplify both variables to return p.xxx.calc() directly (Enum index mapping)
- Add Jane Smith and Honey Child Care test cases from Understanding Payments PDF
- Both PDF examples match exactly: $337/wk and $193/wk respectively

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@hua7450 hua7450 marked this pull request as ready for review March 17, 2026 21:35
@PavelMakarchuk
Copy link
Collaborator

Program Review: Vermont CCFAP (PR #7769)

Source Documents

Critical (Must Fix)

  1. Wrong page anchor in vt_ccfap_eligible.py -- The reference uses #page=4 but Section II A "Eligibility Criteria" is on file page 6 (printed page 4). The author used the printed page number instead of the file page number. Change #page=4 to #page=6.

    • File: policyengine_us/variables/gov/states/vt/dcf/ccfap/eligibility/vt_ccfap_eligible.py
    • Source: page verification audit (PDF 1)
  2. Act 76 reference missing #page= anchor in family_share/scale.yaml -- The Act 76 href points to the full enacted law PDF with no page anchor. The $25-to-$0 change at the 150-175% FPL bracket (effective 2024-04-07) cannot be verified from the provided PDFs. The October 2024 Income Guidelines (PDF 2) confirm the $0 bracket exists but only for the post-October period, not the April effective date.

    • File: policyengine_us/parameters/gov/states/vt/dcf/ccfap/family_share/scale.yaml
    • Action: Add #page=XX to the Act 76 href pointing to Section 5; verify April 7, 2024 effective date.
  3. income/fpl_limit.yaml -- 350% and 400% FPL values lack corroboration in provided PDFs -- The 575% value is confirmed by PDF 2. The 350% (2009) value is not stated in the regulations PDF, and the 400% (April 2024) value references Act 76 FAQs which was not among the provided PDFs. The statute reference "33 V.S.A. Section 3512" lacks a subsection.

    • File: policyengine_us/parameters/gov/states/vt/dcf/ccfap/income/fpl_limit.yaml
    • Action: Add subsection to the 33 V.S.A. reference (e.g., 3512(a)(1)); verify the 350% and 400% values against Act 76 or the statute text.

Should Address

  1. Rate PDF hrefs missing #page= anchors -- rates/licensed_center.yaml and rates/registered_home.yaml reference the state rate PDFs (PDF 3, PDF 4) and the Act 76 rate increase PDF without page anchors on some references.

    • Files: policyengine_us/parameters/gov/states/vt/dcf/ccfap/rates/licensed_center.yaml, registered_home.yaml
  2. 2023-07-02 rates lack a corroborating source -- Both rate files include values effective 2023-07-02 referencing "CCFAP Rate Increase Per Act 76" which was not among the provided PDFs. The 2024 and 2025 rates are fully verified.

    • Files: policyengine_us/parameters/gov/states/vt/dcf/ccfap/rates/licensed_center.yaml, registered_home.yaml
    • Action: Provide or cite the Act 76 rate increase document, or add a note explaining the source.
  3. Reference titles lack descriptive suffixes -- Several parameter references use bare section numbers (e.g., "CCFAP Regulations Section I B 1") without topic descriptors. Adding suffixes improves navigability.

    • Files: age_group/months.yaml (add "- Age Category"), care_schedule/hours.yaml (add "- Care Category"), age_threshold/base.yaml and special_needs.yaml (add "- Child age eligibility definition"), income/sources.yaml (add "- Income Eligibility Requirements")
  4. Parameter description verb "counts" not in approved list -- income/sources.yaml uses verb "counts" which is not in the approved set (limits, provides, sets, excludes, deducts, uses). Suggest changing to "uses."

    • File: policyengine_us/parameters/gov/states/vt/dcf/ccfap/income/sources.yaml
  5. Parameter descriptions use "these" instead of "this" -- Several bracket/multi-value parameters use "these" (e.g., "these age thresholds", "these weekly reimbursement rates"). The strict standard says "this." Low impact since "these" is arguably more accurate for bracket parameters.

    • Files: age_group/months.yaml, care_schedule/hours.yaml, rates/licensed_center.yaml, rates/registered_home.yaml
  6. Missing test: activity test failure as sole cause of ineligibility -- All current ineligibility tests are driven by income, age, or assets. No test confirms that failing only the activity test (meets_ccdf_activity_test: false) blocks eligibility for a non-exempt family.

    • Directory: policyengine_us/tests/policy/baseline/gov/states/vt/dcf/ccfap/
  7. Missing test: asset boundary at exactly $1,000,000 -- Tests cover $0 (under) and $1.5M (over) but not the exact boundary.

    • Directory: policyengine_us/tests/policy/baseline/gov/states/vt/dcf/ccfap/
  8. Defensive division guard in vt_ccfap_family_share.py -- fpl_ratio = income / fpg could divide by zero if FPG is 0 in microsimulation. Consider where(fpg > 0, income / fpg, 0).

    • File: policyengine_us/variables/gov/states/vt/dcf/ccfap/vt_ccfap_family_share.py, line 18

Suggestions

  1. Document known limitations -- The implementation omits 3 of 6 categorical exemptions (Family Support, adoptive families with special needs children, adoptive parents with own special needs). These require input variables not currently in PolicyEngine. Add a code comment noting this.

    • File: policyengine_us/variables/gov/states/vt/dcf/ccfap/eligibility/vt_ccfap_categorically_exempt.py
  2. Document activity test simplification -- Reach Up families bypass both the activity test and income test, but the regulation says they still need a "service need." This is an acceptable simplification but worth documenting.

    • File: policyengine_us/variables/gov/states/vt/dcf/ccfap/eligibility/vt_ccfap_eligible.py
  3. Add test for July 2025 age group change -- The preschool-to-school-age boundary changes from 60 to 72 months on 2025-07-13. No test covers this transition.

  4. Add non-VT state sanity test -- A single test confirming a non-Vermont family gets zero benefit would guard against defined_for regressions.

  5. Trim code-explaining comments in vt_ccfap_categorically_exempt.py -- Comments like "# Reach Up (VT TANF) recipients -- MONTH variable" explain what code does rather than why. The period annotations are useful; the rest could be trimmed.

  6. Parameter description wording for age_threshold/*.yaml -- Uses "this age" instead of "this threshold" per naming conventions.

PDF Audit Summary

Note: The PDF audit agents (pdf-rules, pdf-rates) could not read repo files due to a branch mismatch. The reference validator successfully compared all repo values against the PDFs and serves as the authoritative audit result.

Category Count
Confirmed correct 48 rate values (24 Jun 2024 + 24 Jul 2025), 17 family share brackets, 4 age thresholds, 3 care schedule thresholds, 2 child age limits, 14 income sources, 3 FPL limits (575% confirmed; 350%, 400% need external verification)
Mismatches 0
Unmodeled items 3 categorical exemptions (Family Support, adoptive families x2), some uncommon income sources

Validation Summary

Check Result
Regulatory Accuracy 0 critical issues; 3 low-severity known limitations (acceptable simplifications)
Reference Quality 3 issues: 1 wrong page anchor (Critical #1), 1 missing page anchor on Act 76 (Critical #2), 1 uncorroborated historical FPL value (Critical #3)
Code Patterns 0 critical; 8 minor warnings (descriptions, comments, defensive coding)
Test Coverage 113+ test cases; 3 minor gaps (activity test, asset boundary, non-VT state)
PDF Value Audit 0 mismatches / 48+ rate values confirmed correct by reference validator
Page References 14 correct, 1 wrong (vt_ccfap_eligible.py #page=4 should be #page=6), 2 unverifiable (external PDFs not provided)
CI Status All passing

Review Severity: COMMENT

The implementation is high quality with no value mismatches and thorough test coverage (113+ cases). The three critical findings are all reference/documentation issues (wrong page anchor, missing page anchors, uncorroborated historical values) rather than logic or value errors. The program logic correctly implements Vermont CCFAP regulations, Act 76 expansion, and current income guidelines. The benefit formula reproduces official state examples (Jane Smith, Honey Child Care) exactly.

Next Steps

To auto-fix issues: /fix-pr 7769

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.

Add Vermont Child Care Assistance Program (CCAP)

2 participants