Implement Wisconsin Shares Child Care Subsidy Program (CCAP) - #9062
Implement Wisconsin Shares Child Care Subsidy Program (CCAP)#9062hua7450 wants to merge 12 commits into
Conversation
Scaffolds the branch for PolicyEngine#9060 (Wisconsin Shares Child Care Subsidy Program). Implementation to follow. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ne#9060) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Add farm_operations_income, partnership_s_corp_income, farm_rent_income, estate_income to countable income sources (Handbook 6.2) - Extend minor-dependent earned income disregard to farm/partnership SE income - Deep-link statute citations to subsections (/155/5, /155/6) - Fix DCF-201 citation page and title; Appendix II titles; comment corrections - Tests: federal aggregator assertion, 760-hour-cap per-child allocation, decisive SE-loss activity cases, new-sources coverage (129 passing) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The five copay schedules shifted every band edge down by 0.0001 as a float32 workaround, which charged the higher band to income marginally below a legal boundary. Restore the exact thresholds and instead compute the FPL ratio in float64 rounded to 5 decimals before the bracket lookup, so exact-edge incomes stay in their band per Handbook 18.2. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…, citation polish - Add sstb_self_employment_income to countable income sources, the minor-dependent earned-income disregard, and the approved-activity self-employment evidence check (3 symmetric sites) + 2 pinning tests - Mirror the float64 band-lookup guard on the exit-copay floor - Ceil above-full-time add-on hours per the handbook rounding convention (2 test expectations recomputed) - Deepen Wis. Stat. 49.155 references to exact subsections; note the pp. 26-40 span on the county rate matrices; document the copay column-count and band-lookup interpretations Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
breakdown: [county, ...] made core homogenize the four rate tables across all 3,236 County enum values (+64,727 nodes, +52% whole-tree), inflating reform-test deepcopies from 736 MB to 1,163 MB and OOM-killing the congress and Rest CI legs (the 'runner shutdown' failures). Adopt the MN CCAP layout: breakdown lists only wi_shares_age_group, county names are literal nested keys (not homogenized), and the rate variables index p[age_group][county] with the existing non-WI masking. All county/age/date values byte-identical (round-trip verified); tree back to 127,566 descendants vs 126,042 on main. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
wi_shares carries no effective-date gate, so parameter backdating applies the 2025-10-01 maximum rates and the 2026-02-01 copayment schedule to earlier periods rather than returning zero. Record the coverage window and the planned backdating in wi_shares_child_subsidy so pre-2025-10-01 results read as unmodeled rather than as a statement of prior law. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…into wi-ccap # Conflicts: # policyengine_us/programs.yaml
Program Review — Wisconsin Shares (new program)PR #9062 — Wisconsin Shares Child Care Subsidy (WI CCAP / CCDF). Tree: ScopeA large, well-executed NEW-program PR implementing Wisconsin's Shares child care subsidy: 20 variables and ~30 parameters plus the federal CCDF registry hookup. It covers the two-tier income test (initial applicants ≤200% FPG; enrolled/ongoing ≤85% SMI), the eligibility gates (age <13 / disabled <19, $25k liquid-asset limit, approved-activity, per-child CCDF immigration, WI residency), a 72-county × 4-age-group × provider-type max-rate matrix, an hours-based copay schedule (5 child-count columns × FPG-share brackets, per-child 152-hr / AG 760-hr caps, exit-period phase-out), and the subsidy formula (
Verified correctRate / copay value audit — 0 mismatches (sample). 96 rate cells across 6 counties (Adams, Ashland, Dane, Milwaukee, Menominee, Wood — spanning first/last alphabetical, high-cost Dane/Milwaukee, low-cost rural) × 2 provider types × {hourly, FT-monthly} × 4 age groups: 96 match / 0 mismatch (all deltas $0.00). Copay schedule: 95 cells (19 non-zero FPL bands × 5 child columns): 95 match / 0 mismatch. Edge claims confirmed against the PDFs: ≤100% FPG = $0; 200% row == 195% row; per-child cap 152 / AG cap 760 (760 = 5×152); exit phase-out rate 0.2 ($1 per $5 over 200% FPG). Derivations confirmed: FT-monthly = hourly × 152.18 (transcribed per-cell), PT-monthly = hourly × 131 (derived), Certified = 0.9 × licensed-family. Tribal-agency rows correctly excluded. The copay PDF's own embedded worked example (AG of 3, $2,618 = 115% FPG, 2 children → $0.65/hr) cross-checks the row/column alignment. Tests — thorough, no critical gaps. Every formula-bearing variable and both new Enums ( Code — clean. No hard-coded policy values — every threshold/rate/derivation factor reads from a parameter (131/152/153 monthly hours appear only in comments; code derives via Regulatory — 6 items confirmed correct against Wis. Stat. § 49.155 and DCF Handbook July 2026:
Critical (must fix)None. Should address
Suggestions
Full-matrix caveatThe rate-matrix audit verified 96 of 1,152 cells (~8%) — the sample deliberately spans first/last county alphabetically, high-cost (Dane, Milwaukee) and low-cost rural (Ashland) counties, all four age groups, and both provider types, and found 0 mismatches. But the remaining ~66 counties were not individually checked. Recommendation: before merge, the author should confirm the full-matrix transcription against Separately: the branch is 54 commits behind main — rebase onto Validation summary
Review severity: APPROVE0 criticals, a sample-clean rate/copay audit, faithful regulatory implementation, and an unusually thorough test suite justify APPROVE — the one item to close before merge is the full-matrix rate transcription confirmation (scripted PDF diff over all 1,152 cells), plus a routine rebase (54 behind main); the six should-address items are documented approximations and style nits, none blocking. Next steps
🤖 Generated by /review-program (Claude Code) |
Implement Wisconsin Shares Child Care Subsidy Program (WI CCAP)
Summary
Implements the Wisconsin Shares Child Care Subsidy Program (Wisconsin's CCDF child care assistance program, administered by the Department of Children and Families) in PolicyEngine: eligibility (residency, child age/immigration, approved activity, income, assets), the full 72-county × provider-type × age-group maximum rate matrix, and the hours-based copayment schedule, netting to a per-child monthly subsidy aggregated in
wi_shares/wi_child_care_subsidies.Closes #9060
Regulatory Authority
Income Eligibility Tests
Wisconsin Shares applies two different gross-income limits depending on whether the assistance group (AG) is already enrolled. The model switches between them with the boolean input
is_wi_shares_enrolled(SPMUnit, MONTH, default false), following the ND/NJ two-tier pattern:income/limit/initial_fpg_rate.yaml(2.0) ×spm_unit_fpgincome/limit/ongoing_smi_rate.yaml(0.85) ×hhs_smiEnrolled families between 200% FPL and 85% SMI remain eligible during the "Exit period": eligibility only ends when income exceeds 85% SMI or the copayment reduces the subsidy to $0 (Handbook §§ 18.2.2, 18.4.2). This emerges naturally in the model:
wi_shares_income_eligiblegates enrolled families only on the SMI test, andwi_shares_child_subsidyfloors at $0 without affecting eligibility.Income Deductions & Exemptions
wi_shares_countable_incomesums 12 gross income sources (income/sources.yaml: employment, self-employment, dividends, interest, rental, Social Security, pensions, unemployment compensation, workers' compensation, alimony, veterans benefits, capital gains) plus formula-level handling per Handbook §§ 6.2–6.3:where(cs > cap, cs, 0)withincome/child_support_disregard_cap.yaml($1,250)ssifor persons withage < 18who are not tax-unit head/spouse (income/minor_income_disregard_age.yaml)sources.yamlby design (also avoids the CCAP↔TANF income cycle)self_employment_incomeonly; add-backs have no PolicyEngine inputs (documented in the variable); total income floored at 0There is no living-expense deduction — the test uses gross income.
Benefit Calculation
Per eligible child with positive care hours, per month (Handbook § 18.5; verified against the Appendix II worked examples):
The AG copayment (Handbook § 18.2; Copayment Schedule eff. 2/1/2026; Wis. Stat. § 49.155(5)(a)):
If the copayment equals or exceeds the subsidy, the family receives $0 but remains eligible (§ 18.2.2). Children with a $0 copayment type — Foster (
is_in_foster_care) and W-2 Participant (is_tanf_enrolled) — are excluded from the copay hours pool (§ 18.3).Worked example (Appendix II Example 1, reproduced as integration test case 1): two part-time children at 115% FPL → copay per hour $0.65 (two-children column) × 262 copay hours (2 × 131) = $170.30.
Rate Structure
Maximum rates are a 72-county × provider-type (Licensed Group / Licensed Family / Certified) × age-group (0–1, 2–3, 4–5, 6+) × form (Hourly / PT Monthly / FT Monthly) matrix from the statewide table, pp. 26–40 (effective 10/1/2025), following the NC SCCA county-keyed precedent:
rates/certified_licensed_rate_ratio.yaml; Handbook § 18.5.1; § 49.155(6)(b)–(c)). Certified providers have no monthly maximum of their own; monthly payments are capped at the Licensed Family monthly maximum.defined_fordoes not short-circuit vectorized execution).Requirements Coverage
30 in-scope requirements, all covered; every parameter file is read by at least one formula (no orphans). Condensed mapping (grouped where requirements share files):
wi_shares_eligible(defined_forchain)eligibility/child_age_limit(13),disabled_child_age_limit(19)wi_shares_eligible_child(reusesis_ccdf_immigration_eligible_child)wi_shares_eligible_child.yaml(9 cases)meets_ccdf_activity_testfallbackwi_shares_activity_eligible,wi_shares_parent_in_approved_activityincome/limit/initial_fpg_rate(2.0),ongoing_smi_rate(0.85)wi_shares_income_eligiblewi_shares_income_eligible.yaml(8 cases); integration cases 3, 5, 6, 8income/sources,child_support_disregard_cap($1,250),minor_income_disregard_age(18)wi_shares_countable_incomewi_shares_countable_income.yaml(10 cases)eligibility/asset_limitwi_shares_asset_eligiblewi_shares_asset_eligible.yaml(5 cases)hours/part_time_max_weekly_hours(20),part_time_weekly_conversion(30),full_time_weekly_conversion(35),weeks_per_month(4.348125)wi_shares_time_category,wi_shares_monthly_subsidized_hourstime_category(4 cases, 20/21 boundary),monthly_subsidized_hours(2 cases)hours/above_full_time_threshold(50),above_full_time_cap(75)wi_shares_child_subsidychild_subsidycases 4, 5, 7rates/licensed_group/*,licensed_family/*,certified_licensed_rate_ratio(0.9),age_groupwi_shares_hourly_max_rate,monthly_max_rate,age_group,provider_type(input)hourly_max_rate(8),monthly_max_rate(5),age_group(8)wi_shares_child_subsidychild_subsidycases 3, 8copay/per_hour/{one…five_or_more}_children(20 brackets each)wi_shares_copay_per_hourcopay_per_hour.yaml(10 cases, all 5 columns + boundaries)copay/hours/per_child_cap(152),assistance_group_cap(760)wi_shares_copay_hours,wi_shares_copaycopay_hours(4 cases),copaycases 1, 2, 7copay/exit/phase_out_rate(0.2)wi_shares_copaycopaycases 4, 9; integration cases 3, 5wi_shares_child_subsidy(max_(…, 0))child_subsidycase 1; integration case 4 (Ebony)wi_shares_copay,wi_shares_copay_hourscopaycases 5, 6, 8;copay_hourscase 4gov/hhs/ccdf/child_care_subsidy_programs.yaml,programs.yamlwi_shares,wi_child_care_subsidieswi_shares.yaml; integration case 2 assertswi_child_care_subsidiesis_wi_shares_enrolled(input)Not Modeled
meets_ccdf_activity_testinput covers it if neededHistorical Notes
wi_sharescarries no effective-date gate, so policyengine-us parameter backdating (system.py,first_instant="2015-01-01") applies the current-era schedules to earlier periods. A household modeled in any month from 2021-01 through 2025-09 receives the same subsidy it would in 2027, and that amount also flows into the federalchild_care_subsidiesaggregate. The same mechanism applies the 2026-02-01 copayment schedule from 2025-10-01 onward, four months before it took effect. Treat pre-2025-10-01 Wisconsin Shares results as unmodeled rather than as a statement of prior law; backdating the true historical rate and copayment tables is planned. This is documented inwi_shares_child_subsidy.Files Added
Test plan
policyengine-core test policyengine_us/tests/policy/baseline/gov/states/wi/dcf/shares -c policyengine_us), including all 5 Handbook Appendix II worked examples reproduced as integration tests (Juniper $170.30 copay, Monique $197.60 copay, Renee exit-period $31 add-on, Ebony copay ≥ subsidy → $0 while eligible, Sarafina $15.24 — the Handbook prose's "$13.25" is a typo; the printed inputs yield $15.24)make formatclean (ruff format and ruff check pass)