Skip to content

Implement Rhode Island CCAP#7739

Draft
hua7450 wants to merge 6 commits intoPolicyEngine:mainfrom
hua7450:ri-ccap
Draft

Implement Rhode Island CCAP#7739
hua7450 wants to merge 6 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

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 (vehicles excl. primary, real estate excl. primary residence, cash, bank accounts, investments) must not exceed $1,000,000.

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.

RI Works (TANF) Categorical Eligibility

RI Works recipients are categorically eligible, bypassing income and asset tests, with $0 co-payment.

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:

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 qualified_immigration_statuses.yaml ri_ccap_immigration_status_eligible_child.py ri_ccap_immigration_status_eligible_child.yaml
REQ-007 Parent citizenship not required -- ri_ccap_immigration_status_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 assets/limit.yaml, assets/sources.yaml ri_ccap_asset_eligible.py, ri_ccap_assets.py ri_ccap_asset_eligible.yaml
REQ-022 RI Works categorical eligibility -- ri_ccap_eligible.py ri_ccap_eligible.yaml, ri_ccap.yaml
REQ-024 Co-share 0%/2%/5%/7% by FPL copay/rate.yaml ri_ccap_fpl_copay_rate.py ri_ccap_fpl_copay_rate.yaml
REQ-025 One co-payment per family -- ri_ccap_copay.py (SPMUnit-level) ri_ccap_copay.yaml
REQ-027 RI Works $0 co-payment -- ri_ccap_copay.py 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-017 Activity req: employment 20 hrs/wk Work hours not tracked in microsim
REQ-018 Activity req: education 20 hrs/wk Education hours not tracked in microsim
REQ-019 Activity req: college 7 credits Credit hours not tracked in microsim
REQ-020 Two-parent both meet 20 hrs Work hours not tracked in microsim
REQ-021 Child support cooperation Administrative requirement
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 (16 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
      toddler_max.yaml                  # Center toddler age boundary
    family/
      infant_toddler_max.yaml           # Family infant/toddler age boundary
  assets/
    limit.yaml                          # $1,000,000
    sources.yaml                        # Asset variable list
  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
  qualified_immigration_statuses.yaml   # Qualified immigration status list

Variables (19 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_assets.py                     # Asset calculation
  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_asset_eligible.py           # Asset test
    ri_ccap_immigration_status_eligible_child.py  # Child immigration check
  copay/
    ri_ccap_copay.py                    # Family copay (SPMUnit)
    ri_ccap_fpl_copay_rate.py           # Copay rate by FPL bracket

Tests (22 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_asset_eligible.yaml         # Asset test cases
    ri_ccap_immigration_status_eligible_child.yaml  # Immigration cases
  copay/
    ri_ccap_copay.yaml                  # Copay calculation cases
    ri_ccap_fpl_copay_rate.yaml         # FPL rate bracket 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_asset_eligible.yaml         # Asset test boundaries
    ri_ccap_income_eligible.yaml        # Income threshold boundaries
    ri_ccap_fpl_copay_rate.yaml         # Copay rate 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 (406df75) to head (0fc3a86).
⚠️ Report is 111 commits behind head on main.

Additional details and impacted files
@@            Coverage Diff             @@
##              main     #7739    +/-   ##
==========================================
  Coverage   100.00%   100.00%            
==========================================
  Files            1        20    +19     
  Lines           23       294   +271     
  Branches         1         0     -1     
==========================================
+ Hits            23       294   +271     
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>
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