Skip to content

Implement Georgia CCAP (Childcare and Parent Services - CAPS)#7958

Draft
hua7450 wants to merge 12 commits into
PolicyEngine:mainfrom
hua7450:ga-ccap
Draft

Implement Georgia CCAP (Childcare and Parent Services - CAPS)#7958
hua7450 wants to merge 12 commits into
PolicyEngine:mainfrom
hua7450:ga-ccap

Conversation

@hua7450
Copy link
Copy Markdown
Collaborator

@hua7450 hua7450 commented Apr 9, 2026

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

  • Initial eligibility: gross applicable income <= 50% State Median Income (Appendix A; Policy Manual §8.3)
  • Ongoing/redetermination: gross applicable income <= 85% SMI (Appendix A; CCDF Plan §2.5.5)
  • Modeled via ga_caps_enrolled flag: new applicants use 50% SMI threshold; enrolled families use 85% SMI

Income Sources

12 countable income types (Policy Manual §8.4):

# CAPS Income Type PolicyEngine Variable
1 Gross wages/salary (incl. commissions, cash bonuses) employment_income
2 Net self-employment income self_employment_income
3 Unemployment compensation unemployment_compensation
4 Worker's compensation workers_compensation
5 Alimony alimony_income
6 Child support (regular/ongoing) child_support_received
7 Veteran's benefits veterans_benefits
8 Capital gains capital_gains
9 Rental income rental_income
10 Dividends (regular/ongoing) dividend_income
11 Retirement/pension pension_income
12 Base pay for military personnel military_basic_pay

Listed 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):

sum_max_monthly  = sum_over_eligible_children(ga_caps_maximum_weekly_benefit) * 52/12
base_monthly     = min(spm_unit_pre_subsidy_childcare_expenses_monthly, sum_max_monthly)
net_base         = max(base_monthly - ga_caps_family_fee, 0)
weighted_bonus_rate = sum(max_weekly * quality_bonus_rate) / sum(max_weekly)
ga_caps          = net_base * (1 + weighted_bonus_rate)

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):

Zone Provider Infant FT/wk Toddler FT/wk Preschool FT/wk School FT/wk
1 Center $260 $248 $221 $185
1 Family $199 $188 $180 $156
2 Center $165 $160 $150 $140
2 Family $145 $140 $135 $135
3 Center $130 $125 $120 $115
3 Family $120 $110 $105 $94

(Informal rates = Family rates. Part-time daily and before/after school weekly rates also included.)

Family fee tiers (Appendix D):

Income-to-FPL Ratio Fee Rate
<= 10% 0% (no fee)
> 10% to 50% 3% of income
> 50% to 100% 5% of income
> 100% 7% of income (federal cap)
  • Fee is per-family, not per-child
  • Weekly fee = floor(annual_income * rate / 52), converted to monthly
  • Fee waived for minor parents (age <= 17)

Quality Rated add-ons (CCDF Plan §4.3.3):

  • 2-star: 5% bonus on net base payment
  • 3-star: 10% bonus on net base payment

Requirements Coverage

REQ Description Parameter Variable Test
REQ-001 Georgia residency defined_for=StateCode.GA all variables integration.yaml Case 7
REQ-002 Child age <= 12 age_threshold/child.yaml (13) ga_caps_eligible_child eligible_child.yaml Cases 1-3
REQ-003 Disabled child age <= 17 age_threshold/disabled_child.yaml (17) ga_caps_eligible_child eligible_child.yaml Cases 4-6
REQ-004 Child citizenship (INA/45 CFR 98.20) federal is_ccdf_immigration_eligible_child ga_caps_eligible_child eligible_child.yaml Cases 7-8, 16
REQ-008 Initial income <= 50% SMI income/smi_rate/initial_eligibility.yaml (0.5) ga_caps_income_eligible income_eligible.yaml Cases 1-2, 7-8
REQ-009 Ongoing income <= 85% SMI income/smi_rate/ongoing_eligibility.yaml (0.85) ga_caps_income_eligible income_eligible.yaml Cases 3-5, 9-10
REQ-010 Very low income priority (50% FPL) Captured by fee tier (REQ-025/REQ-030) ga_caps_family_fee family_fee.yaml Cases 2, 7
REQ-011 Activity: 24 hrs/week activity_requirements/weekly_hours.yaml (24) ga_caps_activity_eligible activity_eligible.yaml Cases 1-13 (Case 13 verifies CCDF fallback)
REQ-012 Asset test ($1M) federal is_ccdf_asset_eligible ga_caps_eligible eligible.yaml Case 4
REQ-013 12 countable income sources income/countable_income/sources.yaml ga_caps_countable_income income_eligible.yaml Case 15
REQ-014 Excluded income types Implicit (omitted from sources) ga_caps_countable_income income tests
REQ-015 4-week annualization method Implicit (PE uses annual income) -- --
REQ-016 Family unit composition SPMUnit entity all SPM-unit variables all SPM-unit tests
REQ-017 3 geographic zones (county-based) zone_1_counties.yaml, zone_2_counties.yaml ga_caps_zone zone.yaml Cases 1-7
REQ-018 Provider type (Center/Family/Informal) enum GACAPSProviderType ga_caps_provider_type maximum_weekly_benefit.yaml Cases 1-9
REQ-019 4 child age groups age_group/*.yaml thresholds ga_caps_age_group age_group.yaml Cases 1-7
REQ-020 Care type (FT/PT/Before-After) enum GACAPSCareType ga_caps_care_type maximum_weekly_benefit.yaml Cases 10-18
REQ-021 108-cell rate table rates/center.yaml, family.yaml, informal.yaml ga_caps_maximum_weekly_benefit maximum_weekly_benefit.yaml (18 cases)
REQ-022 Subsidy = min(max, expenses) - fee, with QR bonus -- ga_caps ga_caps.yaml, integration.yaml
REQ-023 Quality Rated add-on (5%/10%) quality_rated/bonus_rate.yaml ga_caps, ga_caps_quality_rating ga_caps.yaml Cases 2-4
REQ-024 Family fee is per-family -- (SPMUnit entity) ga_caps_family_fee family_fee.yaml
REQ-025 Fee tiers by FPL ratio (4 tiers) family_fee/rate.yaml ga_caps_family_fee family_fee.yaml Cases 1-4, 8-13
REQ-026 Weekly fee = floor(income * rate / 52) -- ga_caps_family_fee family_fee.yaml
REQ-027 Max copay cap 7% family_fee/rate.yaml top bracket ga_caps_family_fee family_fee.yaml Case 1
REQ-029 Fee waiver: minor parents <= 17 family_fee/minor_parent_age.yaml (17) ga_caps_family_fee family_fee.yaml Cases 6, 14
REQ-030 Fee waiver: income <= 10% FPL family_fee/rate.yaml tier 1 (0%) ga_caps_family_fee family_fee.yaml Cases 2, 7-8
REQ-038 Income limits from SMI/FPL smi_rate/*.yaml + hhs_smi ga_caps_income_eligible income_eligible.yaml Cases 12-14

Not Modeled

What Source Why Excluded
REQ-005: Immunization requirement Policy Manual §6 Administrative verification, not a financial variable
REQ-006: Proof of identity Policy Manual §6 Administrative verification, not a financial variable
REQ-007: Priority group membership Policy Manual §7 Complex categorical; group 13 is catch-all so effectively all eligible families qualify
REQ-028: Fee waiver for DFCS custody Policy Manual §9.5 Could use is_in_foster_care in a future iteration
REQ-031: Registration fee ($65/child) Policy Manual §10 One-time administrative cost, not recurring subsidy
REQ-032: 12-month eligibility period Policy Manual Time-based administrative rule; PE models point-in-time eligibility
REQ-033: Fee protection (no mid-period increases) Policy Manual Time-based administrative rule; requires temporal state tracking
REQ-034: Graduated phase-out Policy Manual Captured by entry vs. ongoing thresholds (REQ-008/REQ-009)
REQ-035: Age transition timing (Monday after birthday) Policy Manual §10 Intra-month timing; PE uses annual/monthly periods
REQ-036: Disability negotiated rate Policy Manual §10 Case-by-case administrative decision, no standard formula
REQ-037: 15% QR discount removal Policy Manual Already removed (10/06/2025), before our effective date
Per-child lesser-of (state max vs published rate) Policy Manual §9.6.1 PolicyEngine does not track per-child provider published rates; cap applied at SPMUnit total (same pattern as RI/MA/CO childcare)
Variable Schedule Scholarship (VSS) Policy Manual §10 Combines B&A, FT, and PT rates dynamically; collapsed to a single dominant care type
Military allotments Policy Manual §8.4 No matching PolicyEngine variable

Files Added

parameters/gov/states/ga/decal/caps/
  age_threshold/child.yaml
  age_threshold/disabled_child.yaml
  age_group/toddler_min.yaml
  age_group/preschool_min.yaml
  age_group/school_age_min.yaml
  activity_requirements/weekly_hours.yaml
  income/smi_rate/initial_eligibility.yaml
  income/smi_rate/ongoing_eligibility.yaml
  income/countable_income/sources.yaml
  family_fee/rate.yaml
  family_fee/minor_parent_age.yaml
  quality_rated/bonus_rate.yaml
  zone_1_counties.yaml
  zone_2_counties.yaml
  rates/center.yaml
  rates/family.yaml
  rates/informal.yaml

variables/gov/states/ga/decal/caps/
  ga_caps.py
  ga_caps_enrolled.py
  ga_child_care_subsidies.py
  eligibility/ga_caps_eligible.py
  eligibility/ga_caps_eligible_child.py
  eligibility/ga_caps_income_eligible.py
  eligibility/ga_caps_activity_eligible.py
  income/ga_caps_countable_income.py
  copay/ga_caps_family_fee.py
  payment/ga_caps_zone.py
  payment/ga_caps_provider_type.py
  payment/ga_caps_care_type.py
  payment/ga_caps_age_group.py
  payment/ga_caps_quality_rating.py
  payment/ga_caps_maximum_weekly_benefit.py

tests/policy/baseline/gov/states/ga/decal/caps/
  integration.yaml
  ga_caps.yaml
  eligibility/ga_caps_eligible.yaml
  eligibility/ga_caps_eligible_child.yaml
  eligibility/ga_caps_income_eligible.yaml
  eligibility/ga_caps_activity_eligible.yaml
  copay/ga_caps_family_fee.yaml
  payment/ga_caps_zone.yaml
  payment/ga_caps_age_group.yaml
  payment/ga_caps_maximum_weekly_benefit.yaml

programs.yaml — Georgia registered under CCDF state_implementations

Verification

  • Reimbursement rates verified against Appendix C (108/108 cells match, 600 DPI confirmed)
  • Income limits verified against Appendix A (50% SMI / 85% SMI thresholds — Appendix A supersedes CCDF Plan §2.2.4's outdated 40%)
  • Family fee tiers verified against Appendix D (4 FPL brackets, "above X%" boundary semantics with 0.0001 shift)
  • Quality Rated add-ons verified against CCDF Plan §4.3.3 (5%/10% rates)
  • Zone county assignments verified against Appendix C zone map (14 Zone 1 + 46 Zone 2 counties match)
  • CI passes

Test Plan

  • 10 test files covering eligibility, income, fees, rates, zones, integration (_edge.yaml files merged into canonical counterparts per testing-patterns skill)
  • Activity-eligibility tests pin meets_ccdf_activity_test: false to isolate the GA-specific 24-hour rule from the federal CCDF fallback
  • All 121 GA CAPS tests pass locally
  • CI passes

hua7450 and others added 4 commits April 8, 2026 23:36
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
Copy link
Copy Markdown

codecov Bot commented Apr 9, 2026

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 100.00%. Comparing base (8cb60e7) to head (d852b15).
⚠️ Report is 23 commits behind head on main.

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     
Flag Coverage Δ
unittests 100.00% <100.00%> (ø)

Flags with carried forward coverage won't be shown. Click here to find out more.

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

hua7450 and others added 7 commits April 9, 2026 01:20
- 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>
@hua7450 hua7450 marked this pull request as ready for review May 14, 2026 22:27
@hua7450 hua7450 marked this pull request as draft May 14, 2026 22:37
… 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>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Implement Georgia CCAP (Childcare and Parent Services - CAPS)

1 participant