Implement Indiana Child Care Assistance Program (CCAP / CCDF)#8610
Open
hua7450 wants to merge 6 commits into
Open
Implement Indiana Child Care Assistance Program (CCAP / CCDF)#8610hua7450 wants to merge 6 commits into
hua7450 wants to merge 6 commits into
Conversation
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…ngine#8609) Indiana FSSA/OECOSL Child Care and Development Fund voucher program: eligibility (residency, child age, citizenship, both-adult service need, two-tier income 135% FPL / 85% SMI, $1M assets), countable income, income-based weekly copay, and Marion-County-proxy reimbursement rates (provider type x PTQ level x age group). 99 tests passing. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## main #8610 +/- ##
============================================
+ Coverage 77.77% 100.00% +22.22%
============================================
Files 1 16 +15
Lines 9 232 +223
============================================
+ Hits 7 232 +225
+ Misses 2 0 -2
Flags with carried forward coverage won't be shown. Click here to find out more. ☔ View full report in Codecov by Harness. 🚀 New features to boost your workflow:
|
- Drop is_tax_unit_dependent gate from eligible-child (Policy Manual §1.6 defines child by age/custody/relationship, not tax dependency; follows WV/AK) - Fix stay_on_smi_rate reference (#page=5 -> #page=10) and add OECOSL Jul-2023 bulletin to get-on/stay-on for the 2023-08-01 expansion - Add dedicated unit tests for in_ccdf_parent_in_eligible_activity; add 2027-01 copay case and a multi-child case; document is_disabled/asset-exclusion proxies Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- Register in_child_care_subsidies in household_state_benefits.yaml so the benefit flows into household_benefits/household_net_income (AR precedent) - Fix fee_factor bracket thresholds to prior-band-ceiling + 0.0001 so incomes at published band boundaries land in their labeled band - Convert in_ccdf_copay to a monthly amount inside the variable (was a weekly value in a MONTH-defined variable); update copay test expectations - Backdate get_on_fpg_rate with the documented 127% FPL pre-Aug-2023 era - Replace forecast-pinned income-eligibility boundary tests with values robust to FPG/SMI parameter refreshes; assert eligibility in the ineligible case - Note the Oct 5, 2025 FSSA rate cut as a known limitation in full_time.yaml - Fix stale/incorrect comments (test case FPL ratios, FPG uprating rationale, era-specific income limit) and citation page anchors; collapse duplicate same-document references to one link per file - Drop sources/working_references.md scratch notes from the PR Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Add 2025-10-05 entries to rates/full_time.yaml derived from the FY2023 Marion values (infant/toddler -10%, preschool -15%, school age including kindergarten -35% per the Sept 4, 2025 OECOSL announcement; the official post-cut tables are only on the Provider Portal). Recompute the 2026 rate-dependent test expectations and add a pre-cut era case. - Qualify the employment service need on positive wages or nonzero self-employment income instead of the weekly-hours input, whose default of 40 made the activity test default-true for adults with no hours data. Employment is documented by proof of income with no minimum hours (PM 1.7); a self-employment loss still evidences active self-employment. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
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 the Indiana Child Care and Development Fund (CCDF) Voucher Program, administered by the Family and Social Services Administration (FSSA) Office of Early Childhood and Out-of-School Learning (OECOSL). The program is the new
gov/states/in/fssa/ccdfsubtree and flows into the federalchild_care_subsidiesaggregate and the household-levelhousehold_state_benefitsregistry.Note:
inis a Python reserved keyword, so formula parameter access uses bracket indexing (parameters(period).gov.states["in"].fssa.ccdf...), while dottedadds-path strings still resolve.Closes #8609
Regulatory Authority
Eligibility
defined_for = StateCode.INon all top-level variableschild_age_limit = 13;in_ccdf_eligible_childchecksage < limitdisabled_child_age_limit = 19;is_disabledextends the age cap. Court-ordered supervision not tracked at the momentis_ccdf_immigration_eligible_child(only the child's status matters)in_ccdf_activity_eligiblerequires all head/spouse adults to be in a qualifying activity; no hours threshold or hours input usedin_ccdf_parent_in_eligible_activity: positive wages, nonzero self-employment income (a loss still evidences active self-employment), student status, disability, oris_tanf_enrolled. Employment is documented by proof of income, so the weekly-hours input (default 40) is not used as a qualifierget_on_fpg_rate(1.27 through Jul 2023 per the OECOSL bulletin, 1.50 from Aug 2023, 1.35 from 2026-04-05);in_ccdf_income_eligibleapplicant branchstay_on_smi_rate = 0.85×hhs_smi; selected via theis_in_ccdf_enrolledinputassets/limit = 1_000_000;in_ccdf_asset_eligible(federalis_ccdf_asset_eligibleis not reused — distinct authority)The two income tiers are switched by the
is_in_ccdf_enrolledboolean input: initial applicants are tested at 135% FPL, enrolled recipients at 85% SMI (theis_tanf_enrolledapplicant/recipient pattern).Income
in_ccdf_countable_income(SPMUnit, MONTH) sums countable gross monthly income via theincome/sources.yamlunit: listparameter (PM §1.8, #page=26):employment_income,self_employment_income,rental_income,social_security,ssi,unemployment_compensation,veterans_benefits,workers_compensation,child_support_received,alimony_income.Two modeling decisions:
tanfis omitted from countable income. The Policy Manual counts TANF cash, but listing the dollar amount reintroduces the CCDF↔TANF circular dependency through the dependent-care deduction (tanf→ TANF dependent-care deduction →childcare_expenses→child_care_subsidies→ back to CCDF).is_tanf_enrolledis still used as a service-need gate.social_security_disabilityis not listed separately. In PolicyEngine,social_securityis an umbrella variable whoseaddsalready includes the disability, retirement, survivors, and dependents components. Listing both would double-count SSDI (a person with $12,000/yr SSDI produced $2,000/mo gross before this fix, $1,000/mo after).Earned income of household members under 18 is excluded in the formula.
Copay
in_ccdf_copay(SPMUnit, MONTH) implements the income-based copay (PM §2.6, #page=39 + the 2026 Sliding Fee Schedule):fee_factoris asingle_amountbracket parameter keyed on income as a ratio of the FPG, with the Year 1-3 (new-enrollee) tier: 0 / 0.0116 / 0.0140 / 0.0163 / 0.0163 / 0.0186 / 0.0209 / 0.0233 / 0.0302 / 0.0372 / 0.0442 across 11 brackets.Reimbursement Rates
Per the scope decision, Indiana's reimbursement-rate cap follows Option B: Marion County (the most populous county, ~977K) FY2023 rates (effective 2023-07-30) are transcribed as a statewide proxy ceiling. Indiana otherwise publishes ~8,932 distinct rates (92 counties × ~16 provider × PTQ rows × 6 age groups × weekly/daily/hourly) with no statewide or cluster file.
rates/full_time.yamlparameter is abreakdownover[in_ccdf_provider_type][in_ccdf_ptq_level][in_ccdf_age_group]using the full-time (weekly) rate, converted to monthly in the benefit formula via× WEEKS_IN_YEAR / MONTHS_IN_YEAR.in_ccdf_provider_typeandin_ccdf_ptq_levelare Person-level enum inputs;in_ccdf_age_groupis a derived Person variable from the child'sagevia parameterized month cutoffs (Infant <12mo, Toddler <36mo, Three-to-Five <72mo, Kindergarten = age 6, School Age Before/After = age 7+).special_needs_multiplier = 1.10raises the cap by 10% for children with documented special needs.2025-10-05entries are derived from the FY2023 Marion values (× 0.90 / 0.85 / 0.65 by age group) and can be corrected in place if the official sheets publish.Sample of the full-time weekly rate table (Marion FY2023, pre-cut era; the 2025-10-05 entries apply the percentage cuts to every cell):
The benefit formula is
in_ccdf = max_(min_(pre_subsidy_childcare_expenses, max_rate) − monthly_copay, 0): the subsidy is the lesser of provider charge and reimbursement rate, minus the copay, with the family paying any overage above the rate directly. The expense cap pools the per-child maximum rates across the unit (the MA / RI / AK child care subsidy convention) since childcare expenses are a single SPM-unit input.Not Modeled
Modeling Notes / Limitations
Test plan
policyengine-core test policyengine_us/tests/policy/baseline/gov/states/in/fssa/ccdf/ -c policyengine_us), including pre- and post-cut rate era casesFiles Added
🤖 Generated with Claude Code