Implement Wisconsin Shares Child Care Subsidy Program (CCAP)#9062
Open
hua7450 wants to merge 10 commits into
Open
Implement Wisconsin Shares Child Care Subsidy Program (CCAP)#9062hua7450 wants to merge 10 commits into
hua7450 wants to merge 10 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>
hua7450
marked this pull request as ready for review
July 18, 2026 23:55
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.
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
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)