Add Tennessee Child Care Payment Assistance (CCAP / Smart Steps) - #9040
Add Tennessee Child Care Payment Assistance (CCAP / Smart Steps)#9040hua7450 wants to merge 11 commits into
Conversation
Initial scaffold for TN DHS Child Care Payment Assistance (Smart Steps / Child Care Certificate Program). Adds changelog fragment; implementation of parameters, variables, and tests to follow under gov/states/tn/dhs/ccap. Closes PolicyEngine#9039 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Age-scope part-time rate halving to Infant/Toddler/Preschool per chart note - Add Head Start/Early Head Start copay waiver (State Plan Sec. 3.3.1.v) - Fix countable income sources citation; citation precision fixes - Add guard and boundary test cases (121 total, all passing) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ay reference tuple - sources.yaml: State Plan section label 2.3.1(c) -> 2.2.4(c); TAC ref -> 1240-1-50-.10 (Definition of Income) #page=9 - tn_ccap_copay.py: reference tuple now covers 5% rate (p.46), part-time share (p.48), waivers (p.49) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…rates - Delete lessons/agent-lessons.md (internal agent-workflow file, not model code) - Note in all four rate parameter files that SCHOOL_OUT rates are transcribed but unreachable: no school-calendar input exists, so tn_ccap_age_category assigns school-age children SCHOOL_IN year-round Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
State Plan §2.2.6(b) (page 32): protective-services families are not evaluated for income or assets. The eligibility formula previously applied the CCDF asset limit unconditionally. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The reimbursement rate chart sets a separate weekly rate for each child from that child's age category, provider type, county tier, and QRIS tier, so the lesser-of comparison between the provider charge and the state rate applies per child. tn_ccap summed every child's cap before a single SPM-unit-wide min_, which let one child's unused rate headroom cover another child's above-rate charges. Sum the per-child minima instead, matching the mt_ccap pattern. The integration Case 2 expectation encoded the pooled formula directly ((328.90 + 119) * 52 / 12), so it moves to the per-child result. Also split child_care_subsidy_programs.yaml line 131, where a merge had concatenated the Tennessee entry onto the DC comment. The file still parsed, so the list silently dropped tn_child_care_subsidies and child_care_subsidies returned 0 for Tennessee households. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Program Review — Tennessee Smart Steps CCAP (new program)PR #9040 — Tennessee Child Care Payment Assistance (CCAP / Smart Steps / Child Care Certificate). Read-only multi-agent review (regulatory, PDF value audit, code pattern, test coverage). No files were edited. Scope — what it implementsNew state program tree under Program mechanics implemented:
CI: 31/31 pass. Verified correctRate/copay value audit — sample of ~28 cells, 0 mismatch (all 5 PDFs reachable):
Protective-services fix — pinned in BOTH directions ( Code cleanliness (0 critical): no hard-coded policy values (every literal is a parameter read); double-floor copay coded as intended with 7 regulatory confirmations (0 critical): two-tier income limit, reimbursement-rate structure + dated changes, copay + all waivers, protective-services pathway, eligibility gates (age/special-needs/immigration/activity/$1M asset), per-child lesser-of subsidy formula, and reuse/convention (shared Critical (must fix)None. Should address
Suggestions
Caveats
Validation summary
Review severity: APPROVEZero criticals across all four reviews, the sampled rate/copay audit is 0-mismatch, the prior-review findings are verifiably fixed, and the protective-services pathway is pinned in both directions — the should-address items are documentation/wording and test-hardening, none blocking. Next steps
🤖 Generated by /review-program (Claude Code) |
Summary
Implements Tennessee's Child Care Certificate Program (Child Care Payment Assistance, branded Smart Steps) in PolicyEngine. The program is Tennessee's CCDF-funded child care subsidy, administered by the Tennessee Department of Human Services (TDHS). This PR adds the full eligibility, income-limit, copay, and provider-reimbursement pipeline, wired into the federal
child_care_subsidiesaggregator via a newtn_child_care_subsidiesprogram.Closes #9039
Review fixes
This branch also addresses the Tennessee CCAP review findings:
is_disabledinput. The narrower “unable to meet the child's care needs” condition is not separately modeled.is_under_court_supervisioninput is available; tracked in Add a general court-supervision input variable #9055.Regulatory Authority
Eligibility
tn_ccap_income_eligiblewithinitial/enrolledSMI-rate params;tn_ccap_enrolledbare input distinguishes applicants from redeterminationis_tanf_enrolledbypass intn_ccap_eligible(breaks the CCAP↔TANF cycle)child_age_limit(13) andspecial_needs_age_limit(19) params intn_ccap_eligible_child; court supervision tracked in #9055tn_ccap_activity_eligiblerequires positive employment evidence plus hours, accepts full-time study, and usesis_disabledfor the two-parent exceptiontn_ccap_eligiblegates onadd(..., ["tn_ccap_eligible_child"]) > 0is_ccdf_immigration_eligible_childis_ccdf_asset_eligibleIncome Limits (SMI-based)
The published dollar bands are not hardcoded. We verified that every band in both copay charts equals the federal
smi()value × rate ÷ 12 exactly, so income limits are computed from PolicyEngine's existinggov.hhs.smiinfrastructure with FFY Oct-1 pinning (the NJ CCAP pattern: month ≥ 10 →{year}-10-01, else{year-1}-10-01).amount= 90,197): HH4 100% SMI monthly = 90,197 / 12 = $7,516.42; × 0.85 = $6,388.95 (chart 85% HH4); × 0.60 = $4,509.85 (chart 60% HH4). Exact match.amount= 102,735): HH4 100% SMI monthly = 102,735 / 12 = $8,561.25 (chart 100% band top); × 0.85 = $7,277.63; × 0.60 = $5,136.75. Exact match.The
smi()size adjustment for HH4 is 0.52 + 0.16 × 3 = 1.00, so 4-person SMI equals the raw TNamount. We parameterize only the rate (initial= 0.85;enrolled= 0.85 → 1.00 @ 2025-10-01), never the dollar tables.Copay
Copay follows the chart's exact weekly double-floor formula rather than a simplified flat 5% (the user chose full fidelity, and the adjudication is that the chart's worked example — not the chart's prose "5% of income" — governs):
floor(monthly countable gross income × 0.05)floor(monthly copay ÷ 4.3)The chart's worked example reproduces exactly: $1,895 × 0.05 = $94.75 → floor $94 → ÷ 4.3 = $21.86 → floor $21/week → ÷ 2 children = $10.50/child. The 4.3 divisor is the exact regulatory factor stored in
copay/weeks_per_month.yaml(notWEEKS_IN_YEAR / MONTHS_IN_YEAR= 4.333…).copay/rate.yaml), below the federal 7% ceiling (which never binds).copay/fpl_waiver_threshold.yaml= 1.5 → 0 @ 2025-10-01 (waiver ended 9/30/2025; 5% now applies to all families).is_tanf_enrolled) and protective-services / DCS-referred children (receives_or_needs_protective_services). Head Start/EHS and Mental Health & Substance Abuse referrals are not modeled (no input).Provider Reimbursement Rates
Per-child max weekly benefit starts with the charted Base State Rate[provider type × county tier × age category]. Licensed-provider QRIS rates are reproduced as whole dollars using half-up rounding before applicable differentials; authorized providers receive no QRIS bonus. Part-time is ½ the full-time rate rounded up (
np.ceil). The provider is paid the lesser of its charge and this state rate.Additive (multiplicative-on-top) stacking — verified. The +15% differentials are applied on top of the base state-rate rows, not baked into them:
Era-dependent multipliers:
rates/qris_bonus.yaml).rates/toddler_differential.yaml).County Tiers
Weekly rates are keyed by county tier (Top Tier vs Lower Tier). The rate-chart footnote lists (the operational source of truth) govern, not the Market Rate Survey (MRS) ranking:
Only Dyer moved between eras. Tiers are encoded deterministically from the TN county enum (
county_tier/top_tier_counties.yaml, era-dated), defaulting unlisted counties to Lower.Gibson discrepancy resolution: Gibson appears on both charts' Top Tier footnote but is absent from the MRS top-20 ranking in both FY24 and FY25 (it shows up only in the MRS county fee tables, ~49k population — far too small to make either top-20 list). Its Top Tier status therefore comes from the employer-petition mechanism (MRS footnote 3: a county gains Top Tier when an employer creates 50+ new child-care slots, majority ages 0–3). Because the operational chart footnote governs reimbursement, Gibson is modeled as Top Tier in both eras. (The FY25 MRS prose also self-contradicts — it says "26 counties" but enumerates 25; the 26th is a stale FY24 copy-paste, and the extra chart name is Gibson, not a phantom.)
Requirements Coverage
The table below maps the implemented requirements. Deferred or approximated pathways are listed under Not Modeled.
income/smi_rate/initialtn_ccap_eligible,tn_ccap_income_eligible,tn_ccap_activity_eligibleeligibility/*tn_ccap_eligible(is_tanf_enrolled)tn_ccap_eligible,integrationtn_ccap_eligibletn_ccap_eligibleeligibility/child_age_limittn_ccap_eligible_childtn_ccap_eligible_childeligibility/special_needs_age_limittn_ccap_eligible_childtn_ccap_eligible_childincome/countable_income/sourcestn_ccap_countable_incometn_ccap_countable_incomeincome/smi_rate/initialtn_ccap_income_eligibletn_ccap_income_eligibleincome/smi_rate/enrolledtn_ccap_income_eligibletn_ccap_income_eligibleincome/smi_rate/enrolledtn_ccap_income_eligibletn_ccap_income_eligiblesmi()+ Oct-1 pintn_ccap_smitn_ccap_smitn_ccap_eligible(is_ccdf_asset_eligible)tn_ccap_eligibletn_ccap_eligible_child(is_ccdf_immigration_eligible_child)tn_ccap_eligible_childactivity/weekly_hourstn_ccap_activity_eligibletn_ccap_activity_eligibletn_ccap_activity_eligibletn_ccap_activity_eligiblecopay/ratetn_ccap_copaytn_ccap_copaycopay/fpl_waiver_thresholdtn_ccap_copaytn_ccap_copaycopay/fpl_waiver_thresholdtn_ccap_copaytn_ccap_copaycopay/part_time_share,time/full_time_thresholdtn_ccap_part_time,tn_ccap_copaytn_ccap_part_time,tn_ccap_copaycopay/weeks_per_monthtn_ccap_copaytn_ccap_copaycopay/ratetn_ccap_copaytn_ccap_copaytn_ccap_copayrates/{child_care_center,group_home,family_home,authorized}tn_ccap_provider_typetn_ccap_max_weekly_benefitage_category/{infant,toddler}_max_monthstn_ccap_age_categorytn_ccap_age_categorycounty_tier/top_tier_countiestn_ccap_county_tiertn_ccap_county_tierrates/qris_bonustn_ccap_qris_tiertn_ccap_max_weekly_benefitrates/qris_bonustn_ccap_max_weekly_benefittn_ccap_max_weekly_benefitrates/part_time_sharetn_ccap_max_weekly_benefittn_ccap_max_weekly_benefitrates/infant_differentialtn_ccap_max_weekly_benefittn_ccap_max_weekly_benefitrates/disability_differentialtn_ccap_max_weekly_benefittn_ccap_max_weekly_benefitrates/toddler_differentialtn_ccap_max_weekly_benefittn_ccap_max_weekly_benefittn_ccaptn_ccap,integrationtn_ccap_max_weekly_benefittn_ccap_max_weekly_benefittn_ccaptn_ccap,integrationtn_child_care_subsidieschild_care_subsidy_programs.yaml,programs.yamltn_child_care_subsidiestn_child_care_subsidiesNot Modeled
is_under_court_supervisioninput; tracked in #9055is_disabledis used as a proxy; inability to care is not separately modeledHistorical Notes
Four effective-date eras are represented and deliberately not collapsed:
For Reviewer Confirmation
special_needs_age_limit= 19 is taken from CCDF State Plan §2.2.1(b) for children incapable of self-care. The court-supervision pathway in §2.2.1(c) is intentionally deferred to Add a general court-supervision input variable #9055.Files Added
55 new files (24 parameters, 17 variables, 14 tests), plus 2 registry edits and a changelog fragment.
Parameters (
policyengine_us/parameters/gov/states/tn/dhs/ccap/):Variables (
policyengine_us/variables/gov/states/tn/dhs/ccap/):Tests (
policyengine_us/tests/policy/baseline/gov/states/tn/dhs/ccap/, 130 cases):Registry / changelog:
Test plan
policyengine_us/tests/policy/baseline/gov/states/tn/dhs/ccap)