Skip to content

Implement Rhode Island CCAP#7739

Open
hua7450 wants to merge 9 commits intoPolicyEngine:mainfrom
hua7450:ri-ccap
Open

Implement Rhode Island CCAP#7739
hua7450 wants to merge 9 commits intoPolicyEngine:mainfrom
hua7450:ri-ccap

Conversation

@hua7450
Copy link
Collaborator

@hua7450 hua7450 commented Mar 9, 2026

Summary

Implements Rhode Island's Starting RIght Child Care Assistance Program (CCAP) in PolicyEngine, covering eligibility determination, income testing, co-payment calculation, provider rate caps, and subsidy computation.

Closes #7738

All RI CCAP variables use definition_period = MONTH (consistent with MA CCFA and TX CCS patterns). The aggregator ri_child_care_subsidies remains YEAR to feed into the federal child_care_subsidies.

Federal CCDF Infrastructure Reuse

This PR leverages federal CCDF variables from #7765:

  • is_ccdf_immigration_eligible_child — replaces state-specific immigration check
  • is_ccdf_asset_eligible — replaces state-specific asset check
  • child_care_subsidy_programs.yaml — RI added to federal program list

Regulatory Authority

Income Eligibility Tests

Initial Eligibility: <= 261% FPL

New applicants must have gross countable income at or below 261% of the Federal Poverty Level.

Transitional Eligibility: <= 300% FPL (enrolled families only)

Families already receiving CCAP whose income rises above 261% FPL may continue receiving benefits up to 300% FPL at recertification. Uses ri_ccap_enrolled input variable to distinguish applicants from recipients.

Exit Threshold: > 300% FPL

Benefits terminate when income exceeds 300% FPL.

Asset Test: <= $1,000,000

Family assets must not exceed $1,000,000. Uses federal is_ccdf_asset_eligible (CCDBG Act of 2014).

Child Age Eligibility

  • Under age 13 (base)
  • Under age 18 if disabled (exception for children with documented physical/mental disability incapable of self-care)
  • Source: 218-RICR-20-00-4, Section 4.3.1.A.1

Immigration Status (child only)

Child must be a US citizen or qualified immigrant. Parent citizenship is NOT required. Uses federal is_ccdf_immigration_eligible_child (8 U.S.C. § 1641).

Income Deductions & Exemptions

RI CCAP uses gross countable income with NO earned income disregards or deductions. The only adjustments are excluded income types (omitted from the countable income sources list).

Countable Income Sources

Gross wages/salary, self-employment AGI, Social Security (RSDI), SSI, dividends, interest, rental income, pensions/annuities, veterans benefits, military retirement, unemployment compensation, workers' compensation, alimony, and child support received.

Excluded Income (omitted from sources list)

USDA foods, relocation assistance, student financial aid, tribal payments, foster grandparent payments, SNAP, housing subsidies, home energy assistance, college work study, dependent child earned income, WIOA payments, EITC refunds, SSA PASS/IRWE, Veterans Aid/Attendant Allowances, Americorps/VISTA, RI Works cash assistance, Veterans Disability Pension, and others.

Co-Payment Schedule

One co-payment per family regardless of number of children enrolled.

Level FPL Range Co-Share Rate
0 <= 100% FPL 0% of gross income
1 > 100% to <= 125% FPL 2% of gross income
2 > 125% to <= 150% FPL 5% of gross income
3 > 150% to <= 261% FPL 7% of gross income
4 (Transitional) > 261% to <= 300% FPL 7% of gross income

Special $0 co-payment for:

Note: RI Works (TANF) recipients are not given a separate $0 co-payment exemption because their income (~37% FPL) falls in the 0% co-share bracket automatically.

Source: 218-RICR-20-00-4, Section 4.6.1.C; 2026 Co-Pay Chart

Benefit Calculation

CCAP Subsidy = min(max(childcare_expenses - copay, 0), max_weekly_rate * 52)

Where:

  • childcare_expenses = spm_unit_pre_subsidy_childcare_expenses (annual)
  • copay = co-share rate * ri_ccap_countable_income (annual, at SPM unit level)
  • max_weekly_rate = sum of per-child maximum weekly rates based on provider type, star/step rating, age category, and time authorization

Sources: 218-RICR-20-00-4, Section 4.12; Center Rates; Family Rates; Exempt Rates

Provider Rate Tables

Licensed Centers (July 2025) -- 80 rate cells

4 age categories (Infant/Toddler/Preschool/School Age) x 5 star ratings x 4 time authorizations

Licensed Family (July 2024) -- 60 rate cells

3 age categories (Infant-Toddler/Preschool/School Age) x 5 star ratings x 4 time authorizations

Licensed Exempt (January 2022) -- 48 rate cells

3 age categories (Infant-Toddler/Preschool/School Age) x 4 step ratings x 4 time authorizations

Time Authorization Levels

Level Hours/Week
Full Time (FT) 30+
Three Quarter Time (3QT) 20-29
Half Time (HT) 10-19
Quarter Time (QT) 0-9

Source: 218-RICR-20-00-4, Section 4.7.1.A.2

Requirements Coverage

REQ Description Parameter Variable Test
REQ-002 Child max age < 13 age_threshold/child.yaml ri_ccap_eligible_child.py ri_ccap_eligible_child.yaml
REQ-003 Disabled child age < 18 age_threshold/disabled_child.yaml ri_ccap_eligible_child.py ri_ccap_eligible_child.yaml
REQ-006 Child citizen/qualified immigrant Federal is_ccdf_immigration_eligible_child ri_ccap_eligible_child.py ri_ccap_eligible_child.yaml
REQ-007 Parent citizenship not required -- ri_ccap_eligible_child.py (child-only) ri_ccap_eligible_child.yaml
REQ-008 Initial eligibility <= 261% FPL income/fpl_rate/initial_eligibility.yaml ri_ccap_income_eligible.py ri_ccap_income_eligible.yaml
REQ-009 Transitional eligibility <= 300% FPL income/fpl_rate/transitional.yaml ri_ccap_income_eligible.py, ri_ccap_enrolled.py ri_ccap_income_eligible.yaml
REQ-010 Exit threshold > 300% FPL -- ri_ccap_income_eligible.py ri_ccap_income_eligible.yaml
REQ-012 Countable income (gross sources) income/countable_income/sources.yaml ri_ccap_countable_income.py ri_ccap_income_eligible.yaml
REQ-013 Excluded income types income/countable_income/sources.yaml (comments) ri_ccap_countable_income.py (omits excluded) implicit
REQ-014 No deductions on gross income -- ri_ccap_countable_income.py (adds only, no subtracts) implicit
REQ-016 Asset test <= $1,000,000 Federal is_ccdf_asset_eligible ri_ccap_eligible.py ri_ccap_eligible.yaml
REQ-017 Activity req: employment 20 hrs/wk activity_requirements/weekly_hours.yaml ri_ccap_activity_eligible.py ri_ccap_activity_eligible.yaml
REQ-020 Two-parent both meet 20 hrs activity_requirements/weekly_hours.yaml ri_ccap_activity_eligible.py ri_ccap_activity_eligible.yaml
REQ-024 Co-share 0%/2%/5%/7% by FPL copay/rate.yaml ri_ccap_copay.py ri_ccap_copay.yaml
REQ-025 One co-payment per family -- ri_ccap_copay.py (SPMUnit-level) ri_ccap_copay.yaml
REQ-028 Housing insecure $0 co-payment -- ri_ccap_copay.py ri_ccap_copay.yaml
REQ-029 Subsidy = expenses - copay, capped at rate -- ri_ccap.py ri_ccap.yaml, integration.yaml
REQ-030 Licensed center rates (80 cells) rates/center.yaml ri_ccap_maximum_weekly_benefit.py ri_ccap_maximum_weekly_benefit.yaml
REQ-031 Licensed family rates (60 cells) rates/family.yaml ri_ccap_maximum_weekly_benefit.py ri_ccap_maximum_weekly_benefit.yaml
REQ-032 Licensed exempt rates (48 cells) rates/exempt.yaml ri_ccap_maximum_weekly_benefit.py ri_ccap_maximum_weekly_benefit.yaml
REQ-033 Time authorization FT/3QT/HT/QT time_authorization/thresholds.yaml ri_ccap_time_category.py ri_ccap_time_category.yaml
REQ-040 2026 FPL via federal spm_unit_fpg -- ri_ccap_income_eligible.py ri_ccap_income_eligible.yaml

22/22 in-scope requirements covered.

Not Modeled

REQ Description Reason
REQ-001 Child min age >= 6 weeks Too granular for microsimulation
REQ-004 Age 13 during certification period Certification period timing not modeled
REQ-005 RI residency Handled via defined_for = StateCode.RI
REQ-011 85% SMI reporting trigger Administrative reporting requirement
REQ-015 Prospective budgeting (weekly x 4.3333) PolicyEngine uses annual income
REQ-021 Child support cooperation Administrative requirement
REQ-022 RI Works categorical eligibility RI Works families (~37% FPL) pass CCAP income test (261% FPL) and copay bracket (0% under 100% FPL) automatically
REQ-023 RI Works two-parent employment plans Administrative requirement
REQ-027 RI Works $0 co-payment Redundant: RI Works families are under 100% FPL, so copay rate = 0% via bracket
REQ-023 RI Works two-parent employment plans Administrative requirement
REQ-026 Co-share assigned to youngest child Provider-level distribution; SPMUnit total is what matters
REQ-034 Travel time addition up to 1 hr/day Administrative adjustment
REQ-035 Financial unit definition SPM unit used as proxy
REQ-036 24-month certification period Temporal/administrative
REQ-037 Job search 3-month temp authorization Time-limited administrative provision
REQ-038 Change in status 3-month grace Time-limited administrative provision
REQ-039 Health condition 6-month extension Time-limited administrative provision

Files Added

Parameters (15 files)

policyengine_us/parameters/gov/states/ri/dhs/ccap/
  age_threshold/
    child.yaml                          # Max age 13
    disabled_child.yaml                 # Max age 18 (disabled)
  age_group/
    center/
      infant_max.yaml                   # Center infant age boundary (1.5 yrs = 18 months)
      toddler_max.yaml                  # Center toddler age boundary
    family/
      infant_toddler_max.yaml           # Family infant/toddler age boundary
  activity_requirements/
    weekly_hours.yaml                   # 20 hrs/wk minimum
  copay/
    rate.yaml                           # Scale: FPL ratio -> 0%/2%/5%/7%
  income/
    countable_income/
      sources.yaml                      # 14 income variable list
    fpl_rate/
      initial_eligibility.yaml          # 2.61
      transitional.yaml                 # 3.00
  rates/
    center.yaml                         # 80 cells (4 age x 5 star x 4 time)
    family.yaml                         # 60 cells (3 age x 5 star x 4 time)
    exempt.yaml                         # 48 cells (3 age x 4 step x 4 time)
  time_authorization/
    thresholds.yaml                     # FT/3QT/HT/QT hour thresholds

Variables (16 files)

policyengine_us/variables/gov/states/ri/dhs/ccap/
  ri_ccap.py                            # Main benefit (SPMUnit)
  ri_child_care_subsidies.py            # Aggregator for childcare_expenses.py
  ri_ccap_countable_income.py           # Gross income (adds pattern)
  ri_ccap_enrolled.py                   # Bare input: enrolled flag
  ri_ccap_provider_type.py              # Enum: center/family/exempt
  ri_ccap_star_rating.py                # Input: 1-5 star rating
  ri_ccap_step_rating.py                # Input: 1-4 step rating
  ri_ccap_time_category.py              # Derived: FT/3QT/HT/QT
  ri_ccap_center_age_group.py           # Center age category
  ri_ccap_family_age_group.py           # Family/exempt age category
  ri_ccap_maximum_weekly_benefit.py     # Per-child max rate lookup
  eligibility/
    ri_ccap_eligible.py                 # Overall eligibility (SPMUnit)
    ri_ccap_eligible_child.py           # Child eligibility (Person)
    ri_ccap_income_eligible.py          # Income test with entry/transitional
    ri_ccap_activity_eligible.py        # Activity/work requirement (20 hrs/wk)
  copay/
    ri_ccap_copay.py                    # Family copay with FPL rate calc (SPMUnit)

Tests (18 files)

policyengine_us/tests/policy/baseline/gov/states/ri/dhs/ccap/
  ri_ccap.yaml                          # 6 benefit cases
  ri_ccap_time_category.yaml            # 10 time authorization cases
  ri_ccap_center_age_group.yaml         # Center age group cases
  ri_ccap_family_age_group.yaml         # Family age group cases
  ri_ccap_maximum_weekly_benefit.yaml   # 12 rate lookup cases
  integration.yaml                      # 7 end-to-end scenarios
  eligibility/
    ri_ccap_eligible.yaml               # Overall eligibility cases
    ri_ccap_eligible_child.yaml         # Child age + disability cases
    ri_ccap_income_eligible.yaml        # FPL threshold cases
    ri_ccap_activity_eligible.yaml      # Activity requirement cases
  copay/
    ri_ccap_copay.yaml                  # Copay calculation cases
  edge_cases/
    ri_ccap.yaml                        # Benefit edge cases
    ri_ccap_eligible_child.yaml         # Child eligibility boundaries
    ri_ccap_time_category.yaml          # Time category boundaries
    ri_ccap_eligible.yaml               # Eligibility edge cases
    ri_ccap_copay.yaml                  # Copay edge cases
    ri_ccap_maximum_weekly_benefit.yaml # Rate lookup edge cases
    ri_ccap_income_eligible.yaml        # Income threshold boundaries

hua7450 and others added 3 commits March 9, 2026 10:33
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@codecov
Copy link

codecov bot commented Mar 9, 2026

Codecov Report

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

Additional details and impacted files
@@            Coverage Diff             @@
##              main     #7739    +/-   ##
==========================================
  Coverage   100.00%   100.00%            
==========================================
  Files            3        16    +13     
  Lines           33       249   +216     
==========================================
+ Hits            33       249   +216     
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 3 commits March 9, 2026 12:05
…SDI/survivors income

- disabled_child.yaml: keep value at 18 (matches law), fix formula to use <= instead of <
- sources.yaml: add social_security_disability and social_security_survivors (RSDI)
- Update tests for corrected disabled child age boundary

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@hua7450 hua7450 marked this pull request as ready for review March 16, 2026 03:52
@hua7450 hua7450 requested a review from PavelMakarchuk March 16, 2026 17:24
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 Rhode Island CCAP

1 participant