Implement Utah Child Care Assistance Program (CCAP) - #9063
Conversation
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…takers Two fixes from adversarially verified review findings: - ut_ccap now applies the R986-700-713 lower-of rule per child (min of expense share vs Table 3 cap, then summed), mirroring mt_ccap, instead of capping pooled expenses against pooled caps. - Activity and income formulas now treat the client per R986-700-702(2) as a parent OR, when no parent is present, the tax unit head/spouse (covers specified-relative and guardian caretakers while keeping co-resident non-client relatives excluded per R986-700-710). 130/130 UT CCAP tests pass, including new pins for per-child capping and working nonparent caretakers. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Correct foster-parent comments in ut_ccap_gross_income and ut_ccap_activity_eligible: current R986-700-702(2)(a) makes DHHS-reimbursed foster parents eligible clients whose income counts (710(3)(g), (4)(c)); the repealed 702(11) "categorically ineligible" claim asserted the opposite of current law. - Drop stale utrules.elaws.us (pre-amendment 2019 text) reference URLs from three variables, keeping the current Cornell LII citations. - Fix ut_ccap_age_group comment subsection: 702(4)(b) -> 702(5)(b). - Narrow earned.yaml citation to R986-200-236(2)(a)-(e); (f) is employer-funded temporary disability, not listed in the comment. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Program Review — Utah Child Care Assistance (new program)PR #9063 — Utah Child Care Assistance (CCAP / Employment Support Child Care, CCDF). NEW state program. Consolidated from five independent read-only review passes (regulatory, Table 3/4 value audit, code pattern audit, test coverage, PR context). ScopeImplements Utah's Child Care Assistance Program (CCAP) as a new state benefit under the federal CCDF child-care-subsidy aggregator:
CI: 31/31 passing. Branch status: 7 ahead / 425 behind Sources: Utah Admin. Code R986-700 (sections -702, -707, -709, -710, -713; law.cornell.edu), Table 3 market-rate PDF ( Verified correctRate/copay value audit — SAMPLE, 38 cells checked, 0 mismatch.
Regulatory confirmations (researched independently, then compared). Every material rule matches R986-700: net-countable ≤ %-of-SMI income test (710(6)(b), correctly on post-deduction income); the four deductions ($50 child support received, support/alimony paid, $100/earner, $100 automatic medical) (710(5)); copay-exceeds-cost ineligibility verbatim (707(3)); Group-1 (≤100% FPL) $0 copay (707(5)(a)); 15 / 30-15 activity hours (709); lesser-of market-rate payment (713); under-13 / under-18-special-needs child ages (702). Asset limit reuses Code cleanliness. No hard-coded policy values (every literal is 0/1/2/np.inf; all magnitudes are parameters). Breakdown metadata complete and correct (30 market-rate combos; 11×16×3 copay combos; integer keys via Test thoroughness. All 13 formula-bearing variables have dedicated would-fail-if-broken tests (plus the 2 input Enums exercised as inputs); no zero-coverage formula. Every core mechanic pinned: 85% SMI boundary (below/at/above/zero + dynamic per-size ceiling in integration), market-rate provider×age lookup, copay schedule (group-1 zero, mid, top, size clamp, group-16 overflow, single-adult floor), all five eligibility gates individually, the copay≤cost-of-care boundary (Cases 7/8), per-child lower-of with per-child capping (strong regression pin against pooled-cap bugs), copay floor at 0 while still eligible, and end-to-end per-child→unit→YEAR→federal roll-up asserting the federal total. No invalid test periods; no non-functional boolean margins. Critical (must fix)None. Should address
Suggestions
Caveats
Validation summary
Review severity: APPROVE0 criticals across all five passes, the rate/copay sample is 0-mismatch, and the three things a reviewer would most suspect (the 3,644.01 typo, the n/a-padding, the 85% SMI figure) are each independently confirmed correct — the only operational item to close is the 425-behind staleness, resolved by a rebase + re-test, not a code fix. Next steps
🤖 Generated by /review-program (Claude Code) |
Extract the shared ut_ccap_is_client helper, document the uncapped copay-affordability gate and bare-input expense limitation, record the 85% SMI Group-16 cross-check, and pin the License-Exempt Home == Commercial Preschool equivalence and the padded size-2 copay cell. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
# Conflicts: # policyengine_us/programs.yaml
…s in tests person.spm_unit.sum already broadcasts to members, so the explicit project call raised an entity-size error. Tests previously relied on the removed weekly_hours_worked_before_lsr default of 40; every client adult now sets hours explicitly. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Follow-up — review items verified at
|
Summary
Implements Utah Child Care Assistance (CC) — the state's CCDF child care subsidy (Utah DWS Office of Child Care, Utah Admin. Code R986-700) — in PolicyEngine. The program is modeled as the Employment Support (ES) Child Care subsidy: a per-child market-rate reimbursement cap (Table 3) reduced by a sliding-scale family copayment (Table 4), gated by an 85%-of-state-median-income test and the federal CCDF asset limit.
Closes #9061
Regulatory Authority
Income Eligibility Tests
ut_ccap_income_eligiblecomparesut_ccap_countable_incomeagainstsmi_rate(0.85) ×hhs_smi. Design decision: the eligibility ceiling is computed dynamically from the existinghhs_smivariable rather than reading the encoded Table 4 Group-16 dollar amounts, so the ceiling tracks annual SMI updates. The copay income-group classification (REQ-024) still uses the encoded Table 4 income-group upper bounds — only the eligibility ceiling is dynamic.is_ccdf_asset_eligible(no state parameter)ut_ccap_eligible_childwithchild_age_limit(13) anddisabled_child_age_limit(18), usingis_disabledas the special-needs proxyut_ccap_eligible_childreuses federalis_ccdf_immigration_eligible_child; parent SSN/immigration status is not gatedut_ccap_activity_eligiblewithsingle_parent_min_hours(15),two_parent_first_min_hours(15),two_parent_second_min_hours(30)Income Deductions & Exemptions
Countable income (
ut_ccap_countable_income) starts fromut_ccap_gross_income— anadds-list of earned + unearned parent income defined inincome/sources.yaml(R986-700-710) — then applies the following, all read at the monthly period:income/sources.yamladds-list summed at SPMUnitchild_support_receivedincluded insources.yamlssiomitted fromsources.yaml(never added)child_earned_income_exclusion_age(18)deductions/child_support_received_deduction(50)child_support_expense+alimony_expense(full deduction, no parameter)deductions/earned_income_deduction(100) × number of earnersdeductions/medical_deduction(100) per SPM unitBenefit Calculation
ut_ccap(SPMUnit, MONTH) implements the R986-700-713 lower-of rule reduced by the Table 4 copayment:rates/market_rate.yamlis a breakdown keyed byut_ccap_provider_type(5 provider types) ×ut_ccap_age_group(6 age bands, derived from age-in-months viarates/age_group.yaml).ut_ccap_market_ratelooks up the monthly cap per child.min_(spm_unit_pre_subsidy_childcare_expenses, Σ per-child caps). Billed expenses proxy the provider's actual established rate; the separate hourly-unit-cost × approved-hours path is not modeled (documented simplification, per scope Key Decision 5). Per-child caps are pooled to the SPM unit.ut_ccap_copaylooks upcopay/amount.yaml, keyed by household size (2 through 12+, bounded bycopay/min_household_sizeandcopay/max_household_size) × income group (ut_ccap_income_group, 16 brackets classified againstcopay/income_limits.yaml) × child-count group (ut_ccap_child_count_group: 1 / 2 / >2 children in care). The full published dollar table is encoded directly (interior bracket boundaries are irregular and not derived).copay/amount.yaml.max_(… − copay, 0)floor and reflected inut_ccap_eligiblevia a copay-affordability check.The state YEAR aggregator
ut_child_care_subsidies(adds = ["ut_ccap"],defined_for = StateCode.UT) feeds the federalchild_care_subsidies, and is registered inchild_care_subsidy_programs.yaml.Requirements Coverage
All 21 in-scope requirements are implemented with parameter, variable, and test coverage.
eligibility/child_age_limit(13),disabled_child_age_limit(18)ut_ccap_eligible_childut_ccap_eligible_child1-6ut_ccap_eligible_child→is_ccdf_immigration_eligible_childut_ccap_eligible_child7-9single_parent_min_hours(15),two_parent_first_min_hours(15),two_parent_second_min_hours(30)ut_ccap_activity_eligibleut_ccap_activity_eligible1-7income/smi_rate(0.85)ut_ccap_income_eligibleut_ccap_income_eligible1-4 + integrationut_ccap_eligible→is_ccdf_asset_eligibleut_ccap_eligible4income/sources.yamlut_ccap_gross_income,ut_ccap_countable_incomeut_ccap_countable_income1, 2, 10income/sources.yaml(child_support_received)ut_ccap_gross_incomeut_ccap_countable_income5, 6, 14income/sources.yaml(omitsssi)ut_ccap_gross_incomeut_ccap_countable_income8 + integration 5income/child_earned_income_exclusion_age(18)ut_ccap_countable_incomeut_ccap_countable_income3, 4, 11deductions/child_support_received_deduction(50)ut_ccap_countable_incomeut_ccap_countable_income5, 6, 14child_support_expense+alimony_expense)ut_ccap_countable_incomeut_ccap_countable_income7, 12deductions/earned_income_deduction(100)ut_ccap_countable_incomeut_ccap_countable_income1, 2, 13deductions/medical_deduction(100)ut_ccap_countable_incomeut_ccap_countable_incomecasesut_ccaput_ccap1, 2rates/market_rate.yaml,rates/age_group.yamlut_ccap_market_rate,ut_ccap_provider_type,ut_ccap_age_grouput_ccap_market_rate(all 5×6),ut_ccap_age_grouput_ccaput_ccap1, 2, 6, 8copay/amount.yaml,copay/income_limits.yaml,copay/min_household_size,copay/max_household_sizeut_ccap_copay,ut_ccap_income_group,ut_ccap_child_count_grouput_ccap_copay1-10,ut_ccap_income_group1-12,ut_ccap_child_count_group1-6copay/amount.yaml(group 1 = 0)ut_ccap_copayut_ccap_copay1 + integration 3, 9, 10ut_ccap_eligible(copay-affordable check)ut_ccap_eligible7, 8;ut_ccap3, 4, 7; integration 4ut_ccap(MONTH, formula)ut_ccap(structural)ut_child_care_subsidies(addsut_ccap); registered inchild_care_subsidy_programs.yamlut_child_care_subsidies1, 2Not Modeled
Historical Notes
rates/market_rate.yaml) is effective October 1, 2024; Table 4 (copay/amount.yaml,copay/income_limits.yaml) is effective April 1, 2026; the 85% SMI fact-sheet income limits are effective October 1, 2025. Every parameter entry is placed at a single2020-01-01date — PolicyEngine's backdating floor — as a documented approximation. Earlier editions of Tables 3 and 4 are not encoded, so periods before their true effective dates use the current tables. Each file's header comment documents this.income_limits.yaml, so the typo has no effect on the model, but it is documented in that file's header comment for future maintainers.ut_ccap_provider_typeenum values because the source table lists them as separate provider categories.Files Added
Also modified:
parameters/gov/hhs/ccdf/child_care_subsidy_programs.yaml(registersut_child_care_subsidies),programs.yaml(adds UT to CCDF coverage and a Utah CCAP state implementation entry), and achangelog.d/ut-ccap.added.mdfragment.Test plan