Skip to content

Implement West Virginia Child Care Assistance Program (CCAP)#7948

Merged
hua7450 merged 19 commits into
PolicyEngine:mainfrom
hua7450:wv-ccap
Jun 1, 2026
Merged

Implement West Virginia Child Care Assistance Program (CCAP)#7948
hua7450 merged 19 commits into
PolicyEngine:mainfrom
hua7450:wv-ccap

Conversation

@hua7450
Copy link
Copy Markdown
Collaborator

@hua7450 hua7450 commented Apr 8, 2026

Summary

Implements West Virginia's Child Care Assistance Program (CCAP) — the state's CCDF-funded child care subsidy providing provider reimbursement minus parent copayment for eligible families.

Closes #7947

Regulatory Authority

Eligibility

Requirement Source How Modeled
Child under age 13 Policy Manual §3.1.1 wv_ccap_eligible_child (age < 13)
Special needs child up to 18 Policy Manual §3.1.2.2 wv_ccap_eligible_child (has_developmental_delay branch — matches the manual's developmental-delay definition)
Child is US citizen or qualified immigrant Policy Manual Ch.3; Appendix E is_ccdf_immigration_eligible_child (federal variable)
Child resides in WV Policy Manual Ch.3 defined_for = StateCode.WV
Parent in qualifying activity (employment/education/training) Policy Manual §3.6.1 wv_ccap_activity_eligible (weekly hours ≥ 20 OR full-time student)
Both parents active in two-parent family Policy Manual §3.6.1 wv_ccap_activity_eligible (all heads/spouses must qualify)
Gross income ≤ 185% FPL (Appendix A intake cap) Policy Manual §3.2.1; Appendix A wv_ccap_income_eligible with income/fpl_limit parameter
Asset test CCDF asset limit is_ccdf_asset_eligible (federal variable)
TANF recipients categorically eligible Policy Manual §3.2.1 is_tanf_enrolled bypasses income test

Income test notes: We model the Appendix A initial intake cap (~185% FPL across family sizes). The 85% SMI Over-Income Policy Exception (Manual §4.7.1) for already-enrolled recipients is not modeled at the moment — we don't track enrollment status as distinct from initial application.

Income Rules

Countable income (wv_ccap_countable_income, uses adds from sources.yaml):

  • Earned: employment_income, self_employment_income, farm_operations_income
  • Unearned: social_security, ssi, unemployment_compensation, workers_compensation, pension_income, alimony_income, child_support_received, dividend_income, interest_income, rental_income, veterans_benefits, military_retirement_pay

military_retirement_pay is included alongside pension_income because PolicyEngine records military retirement separately and Manual §5.2.4.4 counts pensions and annuities.

Excluded (not in sources list): SNAP, LIEAP/LIHEAP, foster care payments, educational grants/loans, one-time lump sums. TANF is excluded from the list to avoid a circular dependency (is_tanf_enrolled already triggers the categorical bypass for active TANF recipients).

Provider Rates (Appendix B, daily, effective Oct 1, 2024)

Family Child Care Home

Age Group Tier I Tier II Tier III
Infant (0-24mo) $30 $33 $36
Toddler (25-36mo) $30 $33 $36
Pre-School (37-59mo) $29 $32 $35
School-Age (60+mo) $26 $29 $32

Family Child Care Facility

Age Group Tier I Tier II Tier III
Infant $35 $38 $41
Toddler $33 $36 $39
Pre-School $33 $36 $39
School-Age $32 $35 $38

Child Care Center

Age Group Tier I Tier II Tier III
Infant $39 $42 $45
Toddler $37 $40 $43
Pre-School $35 $38 $41
School-Age $32 $35 $39

Other Care Types

Type Rate
Out of School Time $14.50/day (Tier I only)
Informal/Relative (under 2) $7.50/day
Informal/Relative (2 and over) $6.00/day
Special Needs supplement +$3.00/day
Non-Traditional Hours supplement +$6.00/day

Co-payment

The implementation reads Appendix A's full 2D sliding fee table: 16 FPL brackets (40%, 50%, …, 180%, 185%) × 11 family-size columns (1 through 11+ person). Sizes 1–9 are fully published; size 10 lacks the 185% row and size 11 lacks the 170%/180%/185% rows — the last filled bracket carries forward. Each cell returns a daily fee in USD per child (Manual §6.4.3.1).

monthly_care_days   = childcare_attending_days_per_month
daily_fee_per_child = rate.size_{N}.calc(fpl_ratio)              # 2D lookup
total_monthly_days  = sum(monthly_care_days × is_eligible_in_care)
billed_share        = min(N_eligible_in_care, 3) / N_eligible_in_care
copay               = daily_fee_per_child × total_monthly_days × billed_share

Caps and exemptions:

  • Maximum co-payment: 7% of gross income (CCDF Plan §3.1.1)
  • Foster families: $0 co-payment (Manual §6.4.1, CCDF Plan §3.3.1)
  • Below 40% FPL: $0 (matches Appendix A row 0 across all family sizes)
  • Families ≥ 12 people: use 11-person column (Appendix A doesn't publish beyond 11)

Approximations (documented in code):

  • Three-youngest cap (Manual §6.4.3.4) is applied as uniform 3/N scaling because PolicyEngine doesn't track child age ordering. Exact when all eligible children attend the same days; otherwise diverges slightly based on which children attend more.
  • FPG year is not pinned to 2024. We compute fpl_ratio with each simulation period's current FPG instead of the 2024 FPG that Appendix A is calibrated against (~3.5% drift; matters only at bracket boundaries).

Benefit Calculation

Per Manual §7.2.7.3-7.2.7.4 (piecewise billing rule) and Manual §7.2.7.2 ("Monthly rates do not apply to rate supplements"):

monthly_care_days    = childcare_attending_days_per_month
in_monthly_range     = 13 ≤ monthly_care_days ≤ 20
monthly_rate_maximum = daily_rate * 20                      # base billed at fixed 20 days
                     + daily_supplement * monthly_care_days # supplements still billed actual days
per_day_maximum      = wv_ccap_daily_benefit * monthly_care_days
per_child_reimb      = min(
                         pre_subsidy_childcare_expenses,
                         monthly_rate_maximum if in_monthly_range else per_day_maximum,
                       )
total_reimb          = sum(per_child_reimb) over eligible children
benefit              = max(total_reimb - copay, 0)

Where:

  • daily_rate = base rate from Appendix B (provider type × tier × age)
  • daily_supplement = special needs (+$3/day) and/or non-traditional hours (+$6/day) — billed for actual days of care only, NOT scaled to 20 days under the monthly-rate rule
  • wv_ccap_daily_benefit = a view variable that returns min(rate + supplements, daily_charge) — used for per-day billing when monthly days fall outside the 13–20 window
  • copay = single per-family amount from the Appendix A 2D lookup

Not Modeled (by design)

Eligibility

What Source Why Excluded
Court-supervised children up to 18 Policy Manual §3.1.2.1 We don't track court-supervision status at the moment
Minor-parent eligibility Policy Manual §1.1.10, §4.5.3.6 is_tax_unit_head_or_spouse excludes under-18s
Joint custody split into two families Policy Manual §3.2.3 We don't split joint-custody households at the moment
WV minimum-wage earnings floor Policy Manual §3.5 We don't enforce the $8.75/hr eligibility floor at the moment

Activity requirements

What Source Why Excluded
is_full_time_student broader than §3.6.3 credit-hour rule Policy Manual §3.6.3 We don't track credit-hour minimums or web-only-course exclusions at the moment
High-school student activity-hours exemption Policy Manual §3.6.2.2 We don't track high-school enrollment at the moment
CPS Safety/Treatment Plan activity-hours exemption Policy Manual §3.6.4 We don't track CPS Safety/Treatment Plan status at the moment
90-day job search limit Policy Manual §3.6 We don't track time-limited eligibility pathways at the moment

Income test

What Source Why Excluded
85% SMI Over-Income Policy Exception (case-by-case continuation) Policy Manual §4.7.1 We don't track enrollment status as distinct from initial application at the moment
TANF children-only income test Policy Manual §3.2.1.4 is_tanf_enrolled does not distinguish child-only TANF cases at the moment
Under-18 child earnings exclusion Policy Manual §5.2.5.11 We don't filter income sources by age of earner at the moment
Voc-rehab and DoD Transitional Compensation Policy Manual §5.2.4.10, §5.2.4.13 No corresponding PolicyEngine variables at the moment
§5.2.4.3 sub-categories (Relative Caretaker Pay, WV Employment Assistance, WV Works Post-Employment Supplements) Policy Manual §5.2.4.3 No corresponding PolicyEngine variables at the moment
§5.2.4.11 catch-all unearned-income clause Policy Manual §5.2.4.11 Open-ended residual category we can't enumerate exhaustively

Co-payment / fees

What Source Why Excluded
Foster waiver applied at family level (not per-child) Policy Manual §6.4.1 We don't track per-child fee waivers at the moment
Kinship-care copay waiver Policy Manual §6.4.1; CCDF Plan §3.3.1(vi) We don't track kinship-care placements at the moment
CPS Safety/Treatment Plan fee waiver Policy Manual §6.4.1 We don't track CPS Safety/Treatment Plan status at the moment
Protective-services fee waiver CCDF Plan §3.3.1(vi) We don't track protective-services status at the moment
Three-youngest copay ordering Policy Manual §6.4.3.4 We don't track child age ordering at the moment; applied as uniform 3/N scaling

Billing / provider payment

What Source Why Excluded
Part-day → full-day conversion (2/3 rate for 2-4 hrs; 1/3 for < 2 hrs) Policy Manual §7.2.7.6, §7.2.7.7 We don't track per-day attendance hours at the moment
Full-day 4-hr minimum Policy Manual §7.2.7.5 We don't track per-day attendance hours at the moment
18-hour daily payment cap and 24-hour single-day limit Policy Manual §7.2.1, §7.2.2 We don't track per-day hours at the moment
Two-provider-per-child billing Policy Manual §6.4.2, §7.2.3, §7.2.5 We don't track multi-provider arrangements at the moment
Part-day attendance conversion chart Appendix C We don't track attendance levels at the moment
12-month eligibility period Policy Manual Ch.6 Administrative timeline not relevant to point-in-time simulation

Files Added

parameters/gov/states/wv/dhhr/ccap/
  eligibility/
    child_age_limit.yaml
    special_needs_child_age_limit.yaml
    activity_hours.yaml
  income/
    fpl_limit.yaml                  # 185% FPL initial intake cap
    countable_income/
      sources.yaml
  billing/
    monthly_rate_min_days.yaml      # 13 days
    monthly_rate_max_days.yaml      # 20 days
  copayment/
    rate/
      size_1.yaml ... size_11.yaml  # Appendix A daily fee per child by family size × FPL bracket (16 brackets each)
    max_share.yaml                  # 7% cap (CCDF Plan §3.1.1)
    max_billed_children.yaml        # 3 children per Manual §6.4.3.4
  rates/
    family_home.yaml
    family_facility.yaml
    center.yaml
    out_of_school_time.yaml
    informal_relative.yaml
  supplements/
    special_needs.yaml
    non_traditional_hours.yaml
  age_group/
    months.yaml
    informal_months.yaml

variables/gov/states/wv/dhhr/ccap/
  eligibility/
    wv_ccap_eligible.py
    wv_ccap_eligible_child.py
    wv_ccap_activity_eligible.py
    wv_ccap_income_eligible.py
  wv_ccap_provider_type.py          # enum: 5 provider types
  wv_ccap_quality_tier.py           # enum: Tier I/II/III
  wv_ccap_child_age_category.py     # enum: Infant/Toddler/Pre-School/School-Age
  wv_ccap_informal_age_group.py     # enum: Under 2 / 2 and Over
  wv_ccap_non_traditional_hours.py  # input: non-traditional hours flag
  wv_ccap_countable_income.py       # adds from sources.yaml
  wv_ccap_copay.py                  # Appendix A 2D lookup, 7% cap, foster waiver
  wv_ccap_daily_rate.py             # rate lookup by type × tier × age
  wv_ccap_daily_benefit.py          # rate + supplements capped at daily charge (used by per-day billing)
  wv_ccap.py                        # monthly benefit: monthly-rate vs per-day billing per §7.2.7
  wv_child_care_subsidies.py        # yearly aggregator (registered in spm_unit_benefits)

tests/policy/baseline/gov/states/wv/dhhr/ccap/
  wv_ccap_eligible_child.yaml       (5 cases)
  wv_ccap_income_eligible.yaml      (4 cases)
  wv_ccap_activity_eligible.yaml    (6 cases)
  wv_ccap_copay.yaml                (6 cases)
  wv_ccap_daily_rate.yaml           (7 cases)
  wv_ccap_eligible.yaml             (5 cases)
  wv_ccap_daily_benefit.yaml        (3 cases)
  wv_ccap_countable_income.yaml     (3 cases)
  wv_ccap_child_age_category.yaml   (6 cases)
  wv_child_care_subsidies.yaml      (1 case)
  edge_cases.yaml                   (51 cases)
  integration.yaml                  (8 cases)

Review Response

Addresses @PavelMakarchuk's 2026-05-25 review:

  • Dead wv_ccap_daily_benefitwv_ccap.py now calls it for the per-day billing branch.
  • Code duplication of weekly_days × WEEKS_IN_YEAR / MONTHS_IN_YEAR — replaced with the childcare_attending_days_per_month input variable, so each consumer reads it directly.
  • military_retirement_pay rationale — added a comment in sources.yaml and a note above.
  • <13 monthly-days branch untested — added integration.yaml Case 8.
  • Family size 12+ untested — added wv_ccap_copay.yaml Case 5.
  • 3/N billing cap never bites — added wv_ccap_copay.yaml Case 6.
  • max_billed_children.yaml unit: int — changed to /1.
  • §3.6.1 page anchor 32 → 33 — corrected in activity_hours.yaml and wv_ccap_activity_eligible.py.
  • CCDF Plan page anchor inconsistencywv_ccap_copay.py now matches max_share.yaml at #page=39.
  • Trailing zeros in copayment/rate/size_*.yaml — stripped across all 11 files.

Test Plan

  • 105 tests pass locally (unit + integration + edge cases across 12 test files)
  • CI passes

hua7450 and others added 4 commits April 8, 2026 00:32
Adds eligibility, income testing, copayment, provider rates, and benefit
calculation for WV's CCDF-funded child care subsidy program. Ref PolicyEngine#7947

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 8, 2026

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 97.76%. Comparing base (86f5d87) to head (214c0e7).
⚠️ Report is 150 commits behind head on main.

Additional details and impacted files
@@             Coverage Diff             @@
##              main    #7948      +/-   ##
===========================================
- Coverage   100.00%   97.76%   -2.24%     
===========================================
  Files            1       16      +15     
  Lines           13      269     +256     
  Branches         0        2       +2     
===========================================
+ Hits            13      263     +250     
- Misses           0        6       +6     
Flag Coverage Δ
unittests 97.76% <100.00%> (-2.24%) ⬇️

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 10 commits April 8, 2026 02:19
- Age groups: Infant 0-24mo, Toddler 25-36mo, Preschool 37-59mo (was wrong)
- 18 rate values corrected for Toddler + Preschool across 3 provider types
- Initial FPL limit: 150% → 185% (150% was unsupported by documentation)
- 16 page references fixed (+7 offset for Policy Manual, off-by-1 for State Plan)
- 9 reference titles updated with specific subsections
- Activity hours and copay references corrected to proper sections

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…ge=8)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Address findings from /review-program:
- C1: Remove unsupported 150%/185% FPL two-tier income test. Per CCDF
  Plan Sec 2.2.4 / 2.2.5(a), WV uses a single 85% SMI ceiling with
  graduated phase-out marked "Not applicable". Drop fpl_limit/ params
  and wv_ccap_enrolled variable; rewrite wv_ccap_income_eligible to
  apply only the 85% SMI test (plus is_tanf_enrolled bypass).
- C2: Annotate wv_ccap_income_eligible to note the TANF bypass is
  applied to all enrolled units; the Sec 3.2.1.4 children-only
  exception is not yet modeled.
- C3: Remove is_tax_unit_dependent filter from wv_ccap_eligible_child.
  Manual Sec 3.2 requires residency, not tax dependency, and the
  variable-patterns skill forbids is_tax_unit_dependent for benefit
  eligibility.
- C4: Remove min_parent_age=18 hard floor from wv_ccap_eligible. Sec
  1.1.2 is a glossary definition; Sec 1.1.10, 4.5.3.6, and 4.5.6
  explicitly contemplate minor parents in qualifying activity.
- C5: Fix informal/relative age boundary off-by-one. Appendix B groups
  24 months as INFANT ($7.50/day); change threshold from 24 to 25 so
  AGE_2_AND_OVER ($6.00/day) starts at 25 months.
- C6: Add inline note in wv_ccap_copay documenting that the percent-of-
  income scale is a simplified approximation of Appendix A's 176-cell
  daily-dollar table (kept for now per reviewer direction).
- C7: Tighten wv_child_care_subsidies test margin from 1 to 0.01 and
  add "Case 1," prefix.
- C8: Fix countable_income/sources.yaml page anchor from #page=49
  (Ch.5 Sec 5.0 overview) to #page=51 (Sec 5.2.1 start of countable
  income lists).

Test updates reflect the SMI-only income test: cases that previously
asserted ineligibility above 185% FPL now use income above 85% SMI;
cases that toggled wv_ccap_enrolled drop the flag; informal-age 24mo
expectation flips to UNDER_2; non-tax-dependent child case asserts
eligibility per residency rule; minor-parent case asserts eligibility.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- Replace 85% SMI sole income cap with 185% FPL Appendix A intake cap
  per Manual §3.2.1. Remove orphan smi_rate parameter.
- Multiply copay by number of eligible children, capped at 3, per
  Manual §6.4.3 per-child fee structure.
- Implement Manual §7.2.7.3-7.2.7.4 piecewise billing rule (Monthly
  Rate = 20 × daily when 13-20 attendance days; per-day otherwise);
  cap per-child reimbursement at actual provider charge.
- Register wv_child_care_subsidies in spm_unit_benefits aggregator and
  household_state_benefits.yaml so benefits flow to poverty measures.
- Delete unreachable minor-parent test case (Case 6) and update
  docstring to note the modeling gap; trim multi-line policy comments.
- Fix #page=1 anchors on Appendix B and Sliding Fee Scale references;
  copay rate now cites State Plan #page=40 instead of #page=39.
- Add wv_ccap_activity_eligible.yaml test (6 cases covering work-hour,
  student, two-parent, and child-only branches).
- Recalibrate income-threshold edge cases to 185% FPL boundaries.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@hua7450 hua7450 marked this pull request as ready for review May 20, 2026 03:05
@hua7450 hua7450 requested a review from PavelMakarchuk May 20, 2026 04:07
Copy link
Copy Markdown
Collaborator

@PavelMakarchuk PavelMakarchuk left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Program Review — WV Child Care Assistance Program (PR #7948)

Source Documents

  • PDFs: WV BFA Subsidy Policy Manual (Oct 2024, 141 pp), Appendix A Sliding Fee Scale (7+ pages, family sizes 1-9 published, 10-11 partial), Appendix B Rate Structure (2 pp), CCDF State Plan 2025-2027 (212 pp)
  • Year: 2024 (Oct 2024 effective dates)
  • Scope: New state program (61 files, 4809 additions)

CI Status

All checks pass (including codecov/patch and codecov/project).

Critical (Must Fix)

  1. Dead variable wv_ccap_daily_benefit — defined at variables/gov/states/wv/dhhr/ccap/wv_ccap_daily_benefit.py and tested in tests/.../wv_ccap_daily_benefit.yaml but never called by any other variable in production. Either remove the file and its tests, OR refactor wv_ccap.py to use it.

Should Address

  • PR body inaccurate about Appendix A coverage — PR claims sizes 8-11 are unpublished extrapolation. In reality sizes 8 and 9 are fully published in Appendix A; only sizes 10 (missing 185% row) and 11 (missing 170%/180%/185% rows) involve any extrapolation, and the carry-forward is correctly implemented. Update PR description.
  • Redundant military_retirement_pay in income sources — Policy Manual §5.2.4.4 lists only "Pensions and annuities" and §5.2.4.9 "Veteran's benefits". Likely double-counted with pension_income. Either remove or document why both are needed.
  • monthly_care_days < 13 branch never tested — third arm of the monthly-rate transformation in wv_ccap.py has no coverage.
  • Family size 12+ fallback never testedselect default=size_11 branch in wv_ccap_copay.py is uncovered.
  • Multi-child 3/N reduction never bites — no test exercises N≥4 eligible children where the cap actually reduces copay.
  • Code duplication of weekly_days × (WEEKS_IN_YEAR / MONTHS_IN_YEAR) across 3 files (wv_ccap.py, wv_ccap_copay.py, wv_ccap_daily_benefit.py) — extract intermediate variable.
  • max_billed_children.yaml uses unit: int — project convention prefers /1.
  • Page-anchor off-by-one (2 instances): eligibility/activity_hours.yaml and eligibility/wv_ccap_activity_eligible.py cite #page=32 for §3.6.1; actual file page is 33 (offset 8, printed p.25). PDF audit clarifies offset is actually 7, not 8 as the manifest reported — re-verify all #page= anchors.
  • activity_hours.yaml declares period: year for a weekly value (20 hrs/week). Use period: eternity instead.
  • CCDF State Plan page anchors not verified — 5 references into PDF 4 (#page=39, #page=42, etc. for §3.1.1 and §2.2) not auto-verified. max_share.yaml cites #page=39 while the variable cites #page=42 for the same §3.1.1 — fix inconsistency.
  • Trailing zeros in copay YAMLs — 11 copayment/rate/size_*.yaml files have values like 1.50, 2.00 violating project style (use 1.5, 2).
  • 0.4001-style bracket thresholds — workaround for "above 40% FPL" inclusivity, accepted convention but worth documenting.

Suggestions

  • Consider relabeling TIER_III enum to "Tier III - Accreditation" to mirror Appendix B's exact column header.
  • Add Manual §7.2.7.2.B as secondary reference in rates/*.yaml (documents the +$3/+$6 tier ladder).
  • billing/monthly_rate_{min,max}_days.yaml use period: year but represent days-per-month thresholds; period: eternity fits better.
  • Add a consolidated wv_ccap_countable_income test exercising the full source list (unemployment, pension, dividends, etc.).
  • Add foster-waiver, TANF-bypass, multi-child, supplements, and 7% cap cases to integration.yaml (currently tested only at unit/edge-case level).
  • Tighten Manual reference titles to include subsection (e.g., §6.4.3.4) for precision.

Investigated and Cleared

  1. Tier III rates in Appendix B — initially flagged because manifest said "Tier I/II"; actually Appendix B publishes three tiers labeled "Tier I", "Tier II", "Tier III - Accreditation". All 36 main cells match.
  2. No sources/ directory or lessons/agent-lessons.md regression at repo root (unlike PR #8208 from same author).
  3. Aggregator wiringwv_child_care_subsidies correctly registered in spm_unit_benefits.py, household_state_benefits.yaml, gov/hhs/ccdf/child_care_subsidy_programs.yaml, and programs.yaml.
  4. Federal helpers correctly reusedis_ccdf_immigration_eligible_child, is_ccdf_asset_eligible, is_tanf_enrolled used directly, not duplicated.
  5. TANF excluded from countable income sources — intentional to break circular dependency; categorical bypass via is_tanf_enrolled. Documented.
  6. 85% SMI Over-Income Policy Exception (§4.7.1) correctly noted as Not-Modeled, not accidentally implemented.

PDF Audit Summary

Topic Cells Confirmed Mismatches
Eligibility (child age, special-needs age, activity hours) 3 0
Income (FPL limit, sources list) 2 + 14 source vars 0
Copay (sizes 1-9 published, sizes 10-11 partial carry-forward) ~150 cells (16 brackets × ~9 sizes) 0
Provider rates (Center + Family Home + Facility × 4 ages × 3 tiers) 36 0
Out-of-School Time, Informal/Relative, Supplements 4 0
Age categories + billing thresholds 6 0

Validation Summary

Check Result
Regulatory Accuracy Largely correct; activity_hours formula verified
Reference Quality Clean; 2 minor page-anchor off-by-one warnings
Code Patterns 1 critical (dead variable); ~6 SHOULD items
Test Coverage Strong (102 cases); 5 valuable gaps to add
PDF Value Audit 0 value mismatches across ~200 audited cells
CI Status All passing

Recommended Severity: COMMENT (close to APPROVE)

Rationale: No value or regulatory mismatches found. One critical code issue (dead variable) and several should-address items (test gaps, redundant income source, PR-body inaccuracy, code duplication). No blockers — author should address the dead variable plus the should items before merge, but the implementation itself is sound.

Next Steps

  • Author: address the 1 critical (dead variable) + the should items
  • To auto-fix: /fix-pr 7948

hua7450 and others added 2 commits May 27, 2026 00:01
- Switch from childcare_days_per_week to childcare_attending_days_per_month
  to eliminate the weeks-to-months conversion duplicated across three files
- Refactor wv_ccap.py to call wv_ccap_daily_benefit (no longer dead)
- Document why military_retirement_pay is included alongside pension_income
- Add tests for <13 monthly days, family size 12+, and 3/N billing cap
- Fix max_billed_children unit from int to /1
- Bump §3.6.1 page anchor 32 → 33 in activity_hours and activity_eligible
- Align wv_ccap_copay CCDF page anchor 42 → 39 with max_share
- Strip trailing zeros from all copayment/rate/size_*.yaml

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@hua7450 hua7450 merged commit 414873e into PolicyEngine:main Jun 1, 2026
25 of 26 checks passed
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 West Virginia Child Care Assistance Program (CCAP)

2 participants