Implement Georgia CCAP (Childcare and Parent Services - CAPS)#7958
Draft
hua7450 wants to merge 12 commits into
Draft
Implement Georgia CCAP (Childcare and Parent Services - CAPS)#7958hua7450 wants to merge 12 commits into
hua7450 wants to merge 12 commits into
Conversation
Closes PolicyEngine#7957 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…ine#7957) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## main #7958 +/- ##
==========================================
Coverage 100.00% 100.00%
==========================================
Files 3 15 +12
Lines 63 253 +190
==========================================
+ Hits 63 253 +190
Flags with carried forward coverage won't be shown. Click here to find out more. ☔ View full report in Codecov by Sentry. 🚀 New features to boost your workflow:
|
- Remove is_tax_unit_dependent from child eligibility (use age-based check only) - Exclude children's income from countable income (CAPS Manual §8.4.3) - Apply quality bonus to net base payment, not gross rate (CCDF Plan §4767) - Correct quality bonus effective date to 2024-09-29 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Rewrite ga_caps.py formula with per-child min(state max, provider published rate); add ga_caps_provider_published_rate input variable (defaults to per-child share of spm_unit_pre_subsidy_childcare_expenses). Replace np.divide(out=..., where=...) workaround with idiomatic where(). - Fix income source: military_retirement_pay -> military_basic_pay; note military_allotments has no matching PolicyEngine variable. - Register ga_caps in programs.yaml under CCDF (coverage + state_implementations). - Replace 17 broken caps.decal.ga.gov reference URLs with working ones (0-CAPS_Policy-Manual.pdf and renamed appendix files). - Correct Policy Manual, Appendix C/D, and CCDF State Plan page anchors; CCDF State Plan now references working decal.ga.gov URL with §4.3.3 (was wrongly §4.3.2 / #page=110). - Merge integration_edge.yaml into integration.yaml (Cases 8-13). - Rename ga_caps_edge.yaml -> ga_caps.yaml; merge five other *_edge.yaml files into their canonical counterparts. - Pin meets_ccdf_activity_test=false in activity tests to isolate the GA-specific 24-hour rule from the federal CCDF fallback. - Remove duplicate-date entries in quality_rated/bonus_rate.yaml. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…blished_rate Reverts the per-child lesser-of attempt from review round 2: without per-child provider published rate data, the "even share of pre_subsidy expenses" default was just a derived value from spm_unit_pre_subsidy_childcare_expenses with no new information. Matches the SPMUnit-level pattern used by RI CCAP, MA CCFA, and CO CCAP. Keeps the idiomatic where(denom > 0, ...) fix from round 2 (replaces the np.divide(out=..., where=...) workaround for the weighted-average bonus rate). Per-child lesser-of with §9.6.1's exact regulatory semantics is now unmodeled — PolicyEngine doesn't track per-child provider published rates. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
… fee cutoffs - Exempt disabled heads/spouses from the GA 24-hour activity gate per Policy Manual §6.8.1.8 (disabled parent counts as care provider). Previously, two-parent units with one disabled spouse failed the GA gate and relied on the federal CCDF fallback. Also tightens `sum(...) == 0` -> `~any(...)`. - Remove 0.0001 threshold shifts in family_fee/rate.yaml. The shifted thresholds (0.1001 / 0.5001 / 1.0001) created multi-dollar gaps where income just above 10% / 50% / 100% FPL incorrectly stayed in the lower bracket (e.g., a family of 2 with $2,165 income, which is 10.005% FPL, was charged $0 instead of 3%). Now uses exact 0.1 / 0.5 / 1.0 thresholds, matching how the rest of PE encodes FPL-percentage brackets. - Add tests: disabled-parent activity Cases 14-15; refactor family_fee Cases 7-13 to test "$1 above/below" boundary behavior. Co-Authored-By: Claude Opus 4.7 (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 Georgia Childcare and Parent Services (CAPS) — the state's CCDF-funded child care subsidy program administered by the Department of Early Care and Learning (DECAL). Models eligibility (residency, child age/disability, immigration, income, activity, assets), a 108-cell reimbursement rate table (3 zones x 3 provider types x 4 age groups x 3 care types), income-based family fees with waivers, and Quality Rated provider add-ons.
Closes #7957
Regulatory Authority
Income Eligibility Tests
ga_caps_enrolledflag: new applicants use 50% SMI threshold; enrolled families use 85% SMIIncome Sources
12 countable income types (Policy Manual §8.4):
employment_incomeself_employment_incomeunemployment_compensationworkers_compensationalimony_incomechild_support_receivedveterans_benefitscapital_gainsrental_incomedividend_incomepension_incomemilitary_basic_payListed in §8.4 but no PolicyEngine variable: military allotments, lottery payments. Commissions and cash bonuses are folded into
employment_income.Excluded income (by omission from sources list): TANF, SSI, SSA disability/survivors, adoption supplements, LIHEAP, Census Bureau income, in-kind donations, tax refunds, cash gifts, disaster relief, relative care subsidy, GBI/UBI, AmeriCorps unearned income, DECAL stipends, income from children 17 or younger.
Benefit Calculation
Subsidy formula (Policy Manual §9.6, §10):
Matches the SPMUnit-level capping pattern used by RI CCAP, MA CCFA, and CO CCAP. Per §9.6.1's exact "per-child lesser-of state max and provider's published rate" is approximated at the SPMUnit level since PolicyEngine does not track per-child provider published rates.
Rate table — 3 zones x 3 provider types x 4 age groups x 3 care types = 108 cells (Appendix C):
(Informal rates = Family rates. Part-time daily and before/after school weekly rates also included.)
Family fee tiers (Appendix D):
Quality Rated add-ons (CCDF Plan §4.3.3):
Requirements Coverage
defined_for=StateCode.GAage_threshold/child.yaml(13)ga_caps_eligible_childage_threshold/disabled_child.yaml(17)ga_caps_eligible_childis_ccdf_immigration_eligible_childga_caps_eligible_childincome/smi_rate/initial_eligibility.yaml(0.5)ga_caps_income_eligibleincome/smi_rate/ongoing_eligibility.yaml(0.85)ga_caps_income_eligiblega_caps_family_feeactivity_requirements/weekly_hours.yaml(24)ga_caps_activity_eligibleis_ccdf_asset_eligiblega_caps_eligibleincome/countable_income/sources.yamlga_caps_countable_incomega_caps_countable_incomezone_1_counties.yaml,zone_2_counties.yamlga_caps_zoneGACAPSProviderTypega_caps_provider_typeage_group/*.yamlthresholdsga_caps_age_groupGACAPSCareTypega_caps_care_typerates/center.yaml,family.yaml,informal.yamlga_caps_maximum_weekly_benefitga_capsquality_rated/bonus_rate.yamlga_caps,ga_caps_quality_ratingga_caps_family_feefamily_fee/rate.yamlga_caps_family_feega_caps_family_feefamily_fee/rate.yamltop bracketga_caps_family_feefamily_fee/minor_parent_age.yaml(17)ga_caps_family_feefamily_fee/rate.yamltier 1 (0%)ga_caps_family_feesmi_rate/*.yaml+hhs_smiga_caps_income_eligibleNot Modeled
is_in_foster_carein a future iterationFiles Added
Verification
Test Plan
_edge.yamlfiles merged into canonical counterparts per testing-patterns skill)meets_ccdf_activity_test: falseto isolate the GA-specific 24-hour rule from the federal CCDF fallback