Add Tennessee Child Care Payment Assistance (CCAP / Smart Steps)#9040
Open
hua7450 wants to merge 9 commits into
Open
Add Tennessee Child Care Payment Assistance (CCAP / Smart Steps)#9040hua7450 wants to merge 9 commits into
hua7450 wants to merge 9 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>
hua7450
marked this pull request as ready for review
July 18, 2026 03:07
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.
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)