Add Montana Child Care Assistance Program (Best Beginnings Child Care Scholarship)#8662
Open
hua7450 wants to merge 9 commits into
Open
Add Montana Child Care Assistance Program (Best Beginnings Child Care Scholarship)#8662hua7450 wants to merge 9 commits into
hua7450 wants to merge 9 commits into
Conversation
Scaffolding commit for the Montana Child Care Assistance Program implementation. Adds changelog fragment. Issue: PolicyEngine#8661 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…olicyEngine#8661) 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 #8662 +/- ##
==========================================
Coverage 100.00% 100.00%
==========================================
Files 3 13 +10
Lines 47 198 +151
==========================================
+ Hits 47 198 +151
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:
|
Apply two-parent both-full-time-students activity waiver (CC 2-3); add 45 CFR 98.20 child-age citation; fix CC 2-6 page anchor; clean parameter descriptions; add two-parent FT-student regression test. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
C1 (critical): correct the preschool/school-age provider-rate boundary from
60 to 72 months per ARM 37.80.102 (school-age begins at the 6th birthday).
Age-5 children at child care centers were placed in the cheaper school-age
cell, understating the max rate by ~$110/mo full-time. Adds an ARM 37.80.102
reference plus age-5 -> PRESCHOOL / age-6 -> SCHOOL_AGE and CENTER-rate tests.
S1/S2: document that the graduated 185-200% FPG band is recipient-only
("must already be on the Non-TANF program ... at redetermination"), so the
flat 200% ceiling over-grants new applicants (modeling limitation, no
CCAP-enrollment input); annotate the ARM-150/185 vs operational-scale-185/200
divergence.
S3: note the 85% SMI ceiling is operational (45 CFR 98.20(a)(2), not ARM) and
add an SMI-cap isolation test (binds before 200% FPG only at large household
sizes).
S4: replace the incorrect ARM 37.80.201 child-age citation with
45 CFR 98.20(a)(1)(i) (under 13) and (a)(1)(ii) (under 19, special needs).
S5: document the unmodeled activity waivers (incarcerated/pre-release,
teen-parent, disabled-parent, part-time-student+40hr).
S6: reconcile the sliding-fee-scale vintage (2016-11-01 structure vs 2025
values) across the income/copay parameter files.
No parameter values changed except the age-group boundary threshold. Adds
4 test cases; all 113 MT CCAP tests pass.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Activity (mt_ccap_activity_eligible): - Drive the work-hour test off weekly_hours_worked_before_lsr so eligibility is independent of labor-supply response. - Add meets_ccdf_activity_test as a fallback for approved activities not individually modeled (part-time student + 40 hrs, job search, training). - Model the disability (is_disabled) and intact-family incarceration (is_incarcerated) waivers per CC 2-3: a waived parent drops a two-parent family to the single-parent 60-hour standard; all parents waived means no work requirement. Copay (copay_rate, mt_ccap_copay): - Read the Best Beginnings sliding fee scale as a floor (each labeled % FPG is the tier floor, per the scale footnote), matching the source table; replaces the prior +0.0001/ceiling reading that overcharged several bands. Tests: rename work-hours inputs to weekly_hours_worked_before_lsr across the CCAP suite; add disabled / incarcerated / CCDF-fallback activity cases; de-brittle the FPG-boundary copay cases. All 119 MT CCAP tests pass. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…into mt-ccap # Conflicts: # policyengine_us/parameters/gov/hhs/ccdf/child_care_subsidy_programs.yaml # policyengine_us/programs.yaml
Replace the flat 200% FPG ceiling with the ARM rule structure: non-TANF first-time applicants eligible below 150% FPG (initial, sec (1)); non-TANF continuing recipients at annual redetermination up to 185% FPG (graduated, sec (2)), selected by the new mt_ccap_enrolled input (default applicant); TANF families remain categorically income-eligible. The 85% SMI overlay is retained (now binds only at very large household sizes). The published copay sliding scale is unchanged, but its tiers above 185% FPG are unreachable for eligible families. 118 tests pass. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
ARM 37.80.202(1)-(2) grants initial eligibility for income below 150% FPG and graduated eligibility below 185% FPG. Use strict < for the FPG comparison so a non-TANF household exactly at its cap fails the income test. The 85% SMI overlay stays <= (45 CFR 98.20(a)(2): does not exceed). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- Fix stale 60-mo Preschool/School-Age boundary in the mt_ccap_child_age_category docstring; the running code and age_group/months.yaml correctly use the 72-mo cutoff per ARM 37.80.102 (school-age = 6th birthday). Docs-only; no calc change. - Add the official rules.mt.gov citation alongside the Cornell LII mirror for the 150%/185% FPG income limits (initial.yaml, graduated.yaml). Co-Authored-By: Claude Opus 4.8 (1M context) <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 Montana's Child Care Assistance Program (Best Beginnings Child Care Scholarship) in PolicyEngine. The program is administered by Montana DPHHS, Early Childhood Services Bureau (ECSB), and is CCDF-funded. Subsidy = lesser of the provider's charge or the state maximum rate, minus the parent's sliding-scale copayment, floored at $0.
Closes #8661
Regulatory Authority
Eligibility
mt_ccap_income_eligible— non-TANF applicant ≤ 150% FPG; non-TANF continuing recipient (mt_ccap_enrolled) ≤ 185% FPG at redetermination; TANF families categorically eligiblemt_ccap_income_eligible—countable_income <= hhs_smi * 0.85(paramincome/income_limit_smi_rate.yaml= 0.85); rarely binds (FPG limit is tighter)mt_ccap_activity_eligible— two-parent 120/mo combined, single-parent 60/mo (fromweekly_hours_worked_before_lsr); per-parent waivers for full-time students (incl. teens in HS), disabled parents, and incarcerated parents in two-parent familiesis_ccdf_asset_eligibleis_ccdf_immigration_eligible_childdefined_for = StateCode.MTonmt_ccap_eligible; SPM-unit grouping co-locates parent and childadd(spm_unit, period, ["mt_ccap_eligible_child"]) > 0mt_ccap_eligible_child— age < 13, or < 19 if special needs (paramseligibility/child_age_limit.yaml= 13,eligibility/special_needs_child_age_limit.yaml= 19)is_tanf_enrolledIncome Standards
Per ARM 37.80.202(1)-(2):
income/fpg_limit/initial.yaml= 1.5).income/fpg_limit/graduated.yaml= 1.85). The applicant-vs-redetermination split is driven by themt_ccap_enrolledinput (default = applicant).is_tanf_enrolled(their income is far below the FPG limits regardless).hhs_smi * 0.85). With the 185% FPG ceiling the FPG limit binds first for all but the largest households (size 13+ in 2026), so this rarely controls.Benefit Calculation
Subsidy =
min(provider charge, state maximum rate) - copay, floored at $0, summed across eligible children.max(GMI x FPG-bracket %, $10)for non-TANF families. TANF recipients (is_tanf_enrolled) pay a flat $10. The $10 minimum (paramcopayment/minimum.yaml) is both the non-TANF floor and the TANF flat amount.copayment/copay_rate.yaml, asingle_amountbracket keyed on the % FPG ratio): 14 rate tiers from 0.5% (at/below 100% FPG) stepping up to 7.0%. Per the Sliding Fee Scale footnote ("the co-payments listed are minimums and correspond to the lowest level for each income range"), each labeled FPG% is the floor of its tier — e.g. the 1.0% tier runs 105% up to 115% FPG. Bracket thresholds are the labeled % values (0, 1.05, 1.15, …, 1.85) with no offset, sincesingle_amountis "at or above threshold." The published scale's tiers run to 200% FPG, but income eligibility caps at 185% FPG for non-TANF families, so tiers above 185% are unreachable for eligible families (retained only to mirror the published scale).rates/provider_rates.yaml) is a 3-dimensional lookup: provider type (6) x age group (3) x half/full-time (2). Half-time = 5 or fewer hours/day; full-time = more than 5 up to 12 hours/day (ARM 37.80.205).mt_ccap_care_timedefaults to FULL_TIME (we don't track per-day care hours at the moment). RCE / School-Age-Provider NA cells are encoded as 0 (not payable).Requirements Coverage
eligibility/child_age_limit.yaml,eligibility/special_needs_child_age_limit.yamlmt_ccap_eligible_child.pymt_ccap_eligible_child.yamlmt_ccap_eligible.py(defined_for=StateCode.MT)mt_ccap_eligible.yaml(Case 2 WY)mt_ccap_eligible.pymt_ccap_eligible.yaml(Case 3)eligibility/activity_hours/{two_parent,single_parent}.yamlmt_ccap_activity_eligible.pymt_ccap_activity_eligible.yaml(18 cases)mt_ccap_activity_eligible.py(is_full_time_studentwaiver)mt_ccap_activity_eligible.yaml(Cases 3, 12)mt_ccap_activity_eligible.py(is_disabledwaiver)mt_ccap_activity_eligible.yaml(Cases 13-15)mt_ccap_eligible_child.py(is_ccdf_immigration_eligible_child)mt_ccap_eligible_child.yaml(Case 6)mt_ccap_eligible.py(is_ccdf_asset_eligible)mt_ccap_eligible.yaml(Cases 6, 7)income/fpg_limit/initial.yaml(1.5),income/fpg_limit/graduated.yaml(1.85)mt_ccap_income_eligible.py,mt_ccap_enrolled.pymt_ccap_income_eligible.yaml(Cases 1-6)income/income_limit_smi_rate.yaml(= 0.85)mt_ccap_income_eligible.py(hhs_smi)mt_ccap_income_eligible.yaml(Cases 10-11)income/countable_income/sources.yamlmt_ccap_countable_income.pymt_ccap_countable_income.yamlmt_ccap.pymt_ccap.yaml,integration.yamlrates/provider_rates.yamlmt_ccap_max_rate.pymt_ccap_max_rate.yaml(18 cases)rates/provider_rates.yamlmt_ccap_care_time.pymt_ccap_max_rate.yamlrates/provider_rates.yamlmt_ccap_max_rate.pymt_ccap_max_rate.yaml(Case 12)copayment/minimum.yaml(= 10)mt_ccap_copay.pymt_ccap_copay.yamlcopayment/copay_rate.yamlmt_ccap_copay.pymt_ccap_copay.yaml(boundary cases)copayment/minimum.yamlmt_ccap_copay.pymt_ccap_copay.yaml(Case 6),integration.yaml(Case 4)income/fpg_limit/graduated.yamlmt_ccap_income_eligible.py(mt_ccap_enrolled)mt_ccap_income_eligible.yaml(Cases 4-6)mt_ccap_income_eligible.py,mt_ccap_eligible.pymt_ccap_eligible.yaml(Case 8)All 20 in-scope requirements have parameter/variable/test coverage.
* REQ-005: the work-requirement waiver for a parent in full-time school (including a teen in high school/HiSET) is modeled via the
is_full_time_studentwaiver, plus the incarcerated-parent waiver in two-parent ("intact") families viais_incarcerated. The teen-parent "may be treated as a separate household" / under-20 specifics are not modeled (entity structure).Not Modeled
These features are documented limitations — we don't track the underlying inputs at the moment:
mt_ccap_enrolledinput, but not the 12-month eligibility clockmeets_ccdf_activity_testfallback input. Activity test checks hours only, not whether the work is paid at minimum wagecare_timeis a bare input defaulting to FULL_TIMEEligibility uses ARM 37.80.202(1)-(2): initial 150% FPG, graduated 185% FPG (non-TANF, at redetermination). The published Sliding Fee Scale (eff. 07-01-2025) shows higher operational ceilings — a standard table running to 185% FPG ("MAX ENTRY") and a graduated table to 200% FPG ("EXIT"). We use the sliding-fee scale only for the copay percentages, and the ARM rule text for the income-eligibility limits. Reviewers should confirm which source governs eligibility (the ARM rule text vs. the operational scale), since the two differ by ~35 FPG points.
Documented Assumptions
mt_ccap_enrolled(default = applicant): the 150% (initial) vs 185% (graduated) split from ARM 37.80.202(1)-(2) is selected by this input. Households that don't set it — including all microdata — are treated as first-time applicants at the 150% limit. TANF families are categorically eligible regardless.mt_ccap_child_age_categorydocstring.care_timedefaults to FULL_TIME: there is no per-day-hours-in-care input, so half-time must be set explicitly.weekly_hours_worked_before_lsr(converted to monthly via 52/12), so the activity gate is stable under labor-supply responses.tanfexcluded from countable-income sources: avoids a childcare <-> TANF circular dependency. TANF families are instead handled via theis_tanf_enrolledcategorical pathway plus the flat $10 copay branch.Test plan
Files Added
Federal-registration edits (2 files):
policyengine_us/parameters/gov/hhs/ccdf/child_care_subsidy_programs.yaml— addedmt_child_care_subsidiesto theaddslistpolicyengine_us/programs.yaml— added the MT Best Beginningsstate_implementationsentry under the federal CCDF program (variablemt_child_care_subsidies, parameter prefixgov.states.mt.dphhs.ccap)12 parameters, 13 variables, 11 tests (118 test cases).
🤖 Generated with Claude Code