Skip to content

Implement Alaska Child Care Assistance Program (CCAP)#8320

Open
hua7450 wants to merge 16 commits into
PolicyEngine:mainfrom
hua7450:ak-ccap
Open

Implement Alaska Child Care Assistance Program (CCAP)#8320
hua7450 wants to merge 16 commits into
PolicyEngine:mainfrom
hua7450:ak-ccap

Conversation

@hua7450
Copy link
Copy Markdown
Collaborator

@hua7450 hua7450 commented May 15, 2026

Summary

Implements Alaska Child Care Assistance Program (CCAP), the state's CCDF-funded child care subsidy program administered as Parents Achieving Self-Sufficiency (PASS) under the Alaska Department of Health, Division of Public Assistance, Child Care Program Office.

This PR covers PASS III (general subsidy population) and PASS II (12-month transitional post-ATAP), with the full provider rate matrix and Alaska IN! special-needs supplement.

Closes #8319

Regulatory Authority

  • CCAP Policies and Procedures Manual (rev. Jan 2023) — 706 pages; primary operational manual for PASS I–IV
  • Family Income & Contribution Schedule (FICS), rev. Feb 21, 2022 — current SMI thresholds + sliding-scale copay (2-page PDF, no page anchor)
  • Provider Rate Schedule, rev. Dec 1, 2021 — full rate matrix by region × age group × provider type × care unit
  • Alaska Statutes AS 47.25.001 – .095 (Day Care Assistance and Child Care Grants)
  • Alaska Administrative Code 7 AAC 41:
    • 7 AAC 41.012 — PASS I–IV category structure
    • 7 AAC 41.060 — Alaska IN! special-needs supplemental rate
    • 7 AAC 41.300 — eligible family / residency / asset limit
    • 7 AAC 41.310 — eligible activities
    • 7 AAC 41.335 — family income contribution
    • 7 AAC 41.350 — eligible child
    • 7 AAC 41.360 — parent exceptions

Program Overview

  • Administration: State-administered; CCDF/CCDBG-funded
  • Income limit: 85% Alaska State Median Income (NOT FPG; FPG is used only for self-employment proration per Manual §4080-2 J 4)
  • Categories implemented: PASS II (post-ATAP transitional) + PASS III (general subsidy)
  • Categories excluded: PASS I (ATAP-bundled, covered by PASS III for income-eligible families); PASS IV (OCS protective services, custody status not tracked)
  • Provider rate matrix: 29 rate regions × 4 age groups × 4 provider types × 4 care units (~1,500 cells)
  • Family copay: sliding 0–9% of monthly income, 10 brackets keyed to % SMI band

Eligibility

Requirement Source How Modeled
Child under 13 (turning 13 during cert period OK) Manual §4070-2 (PDF p.173); 7 AAC 41.350 ak_ccap_child_age_eligible (age < p.age_threshold.child)
Special-needs child under 13 Manual §4070-2; 7 AAC 41.060 where(is_disabled, age < p.age_threshold.special_needs, ...)
Family resides in Alaska Manual §4070-1 (PDF p.173); 7 AAC 41.300 defined_for = StateCode.AK
Each parent in eligible activity Manual §4070-3 D (PDF pp.184-194); 7 AAC 41.310 ak_ccap_parent_in_eligible_activity (all-parents-qualify; falls back to meets_ccdf_activity_test)
Family income ≤ 85% AK SMI Manual §4070-2 (PDF p.173); 7 AAC 41.335 ak_ccap_income_eligible (countable_income <= ak_ccap_smi_threshold)
Asset limit $1,000,000 Manual §4070-4 (PDF p.173); 7 AAC 41.300 Federal is_ccdf_asset_eligible + state eligibility/asset_limit.yaml ($1M)
Child citizenship / qualified-noncitizen Manual §4070-2 B (PDF pp.175-176) Federal is_ccdf_immigration_eligible_child (parent citizenship not evaluated, per regulation)
PASS III: general population Manual §4000-2; 7 AAC 41.012 ak_ccap_pass_3_eligible — no prior-assistance precondition
PASS II: 12-month transitional post-ATAP Manual §4000-2; 7 AAC 41.012 ak_ccap_pass_2_eligible reads was_atap_recipient + months_since_atap_exit (input pattern mirrors CA CalWORKs Stage 2/3)
Family size = parents + minor children Manual §4070-4 A (PDF p.194) spm_unit_size

Rate Region (refactored)

  • ak_ccap_rate_region reuses the existing County enum directly instead of maintaining a parallel rate-region enum. The variable is keyed on county_str and returns a County value.
  • The 2019 Valdez-Cordova split is handled by collapsing COPPER_RIVER_CENSUS_AREA_AK into CHUGACH_CENSUS_AREA_AK, so both successors share the single Valdez-Cordova rate column still published on the Provider Rate Schedule.
  • Households with missing/unknown county data fall back to ANCHORAGE_MUNICIPALITY_AK so downstream rate lookups always hit a valid AK borough key.
  • Rate parameter YAMLs (licensed_center, licensed_group_home, licensed_home, approved_relative_in_home) key region breakdowns on full County names (e.g., ANCHORAGE_MUNICIPALITY_AK).

Income & Copay Calculation

  • 85% AK SMI thresholdak_ccap_smi_threshold multiplies HHS SMI by family size by income/smi_rate.yaml (0.85). HHS SMI matches the FICS table at every AK family size to within rounding.
  • Sliding-scale copay (FICS): 10 brackets covering 0–9% of countable monthly income, keyed to the family's % SMI band. Cap = 9%. ak_ccap_copay (SPMUnit/MONTH) applies once at the family level (Manual §4080).
  • PASS I copay waiver: ak_ccap_copay checks is_tanf_enrolled (rather than ak_atap > 0) to break the circular dependency ak_ccap_copay → ak_atap → childcare_expenses → ak_ccap. ATAP is Alaska's TANF, so the family-level TANF enrollment flag is the right semantic match for the PASS I waiver under Manual §4040-3 D.
  • Counted earned income: employment_income, self_employment_income (adults only — child earned income excluded per Manual §4080-1 PDF p.203)
  • Counted unearned income: child support received, alimony, Social Security, SSI, unemployment, veterans benefits, rental, pension, workers' compensation, interest, dividends, capital gains, strike benefits (Manual §4080-3 PDF p.231)
  • Excluded income: Alaska PFD, federal tax refunds, EITC, federal non-cash benefits (SNAP/WIC/Medicaid/Medicare), disaster relief, TA Diversion, in-kind support (Manual §4080-5 PDF p.248) — these variables are not in the adds lists, so they flow around CCAP countable income naturally
  • Child support paid deduction (Manual §4080; 7 AAC 41.335): ak_ccap_child_support_paid_deduction subtracts legally-obligated payments to non-CCAP family members

Benefit Calculation

  • Per-child benefit (ak_ccap_benefit_per_child, Person/MONTH):
    min(provider_charged_rate, state_max_provider_rate) − family_copay_share + special_needs_supplement
  • State max provider rate (ak_ccap_max_provider_rate_per_child): looked up from rates/{provider_type}.yaml indexed by [care_unit][region][age_group]. Day-based schedules (FT_DAY/PT_DAY) multiply the per-day rate by childcare_attending_days_per_month; month-based schedules (FT_MONTH/PT_MONTH) use the flat monthly rate.
  • Family copay share: family copay divided by number of children in care (ak_ccap_dependents_in_care); applied once total per family (Manual §4080)
  • Special-needs supplement (7 AAC 41.060, Alaska IN!): up to 3× the standard provider rate for disabled children under 13. ak_ccap_special_needs_supplement = (supplement_multiplier − 1) × standard_max_rate. The supplement is added OUTSIDE the min(charge, max_rate) cap per regulation wording ("in addition to").
  • Anchorage rate exception (REQ-034, Rate Schedule p.1): no licensed group homes exist in Municipality of Anchorage; parameter file stores 0 for the ANCHORAGE_MUNICIPALITY_AK column under licensed_group_home.
  • Annual aggregator: ak_child_care_subsidies (SPMUnit/YEAR) sums the 12 monthly ak_ccap values; registered in gov.hhs.ccdf.child_care_subsidy_programs to feed the federal child_care_subsidies rollup.

Files Added/Changed

  • Parameters: policyengine_us/parameters/gov/states/ak/dpa/ccap/ (age_threshold, age_group, copay, eligibility, income/countable_income, rates, special_needs) + 1 line in gov/hhs/ccdf/child_care_subsidy_programs.yaml. All parameter start dates set to 2022-01-01.
  • Variables: 28 Python files under policyengine_us/variables/gov/states/ak/dpa/ccap/ (benefit, copay, eligibility, income, rates) + 2 ATAP common variables (was_atap_recipient, months_since_atap_exit). The interim ak_ccap_smi_band was inlined into ak_ccap_copay_rate.
  • Tests: 20 YAML files in policyengine_us/tests/policy/baseline/gov/states/ak/dpa/ccap/ + 2 in ATAP common; 136 tests, all passing.
  • Changelog: changelog.d/ak-ccap.added.md

Test Realism

All tests use period 2022-01 (matching parameter effective dates). Test scenarios reflect real-life Alaska families:

  • Realistic AK childcare expense levels ($800–$3,000/mo by scenario) instead of an artificial $10,000/mo placeholder
  • Realistic income levels for AK (single parent at $24K/yr, two-parent at $36K/yr, etc.)
  • Real family compositions (preschoolers, school-age, mixed-status siblings, special-needs kids, ATAP-enrolled families)
  • Real county/provider combinations (Anchorage center, Mat-Su licensed home, Fairbanks mixed, Bethel approved relative, Aleutians group home)
  • Boundary tests anchored to the actual HHS SMI values used by the formula
  • Special-needs tests set ssi: 0 explicitly to isolate SN supplement logic from SSI deeming math
  • TANF tests set is_tanf_enrolled: true explicitly (matches the PASS I waiver condition the code now uses)

Requirements Coverage

  • 31 in-scope requirements, all covered with parameters/variables/tests
  • 7 requirements documented as NOT-MODELED:
    • REQ-017 (catastrophic medical/dental deduction — specialized expense category not tracked)
    • REQ-018 (educational expense deduction — educational income not separately tracked from other income; net zero effect on countable income since both income and deduction would be omitted)
    • REQ-024 (job search — episodic activity state not simulated)
    • REQ-027 (jury duty — episodic substitute)
    • REQ-028 (CC24 incapacity status — distinct from is_disabled, not tracked)
    • REQ-037 (PASS IV / OCS protective services — custody status not tracked)
    • REQ-038 (PASS I / ATAP-bundled — covered by PASS III for income-eligible families)

Not Modeled (by design)

What Source Why Excluded
PASS IV (OCS protective services / child-only) Manual §4000-2; 7 AAC 41.012 We don't track OCS custody status at the moment
PASS I (ATAP-bundled subsidy) Manual §4000-2; 7 AAC 41.012 Eligibility = ATAP eligibility with no independent income test; ATAP-eligible families with kids already qualify under PASS III via 85% SMI
Catastrophic medical/dental >10% income Manual §4080-4 (PDF p.244) We don't track catastrophic medical expense as a category separate from routine OOP medical at the moment
Educational expense deduction Manual §4080-4 (PDF p.244) Educational income not separately tracked; both the income and the deduction are omitted so the net effect on countable income is zero
Job search activity (ongoing-case) Manual §4070-3 D (PDF pp.184-194) We don't track time-limited episodic activity states at the moment
Jury duty / CC24 incapacity status Manual §4070-3 D (PDF pp.184-194) We don't track point-in-time activity substitutes or the AK-specific CC24 incapacity determination at the moment
AK business license check for self-employment Manual §4070-3 D We don't track state business-licensure status at the moment; income-based proxy used (self-employment net ≥ minimum-wage equivalent)
ANCSA $2,000 per-shareholder per-year exclusion Manual §4080-5 (PDF p.248) We don't track ANCSA distributions as a distinct income source at the moment

Historical Notes

  • Provider Rate Schedule effective Dec 1, 2021 — all CCAP parameters start 2022-01-01 to cleanly cover the schedule's first calendar year onward
  • FICS effective Feb 21, 2022 — current revision; earlier 2019 FICS not backdated in this PR
  • 7 AAC 41.012 (PASS structure) originally effective June 23, 2006; amended January 5, 2017

Test Plan

  • 136 unit + integration tests pass (CCAP + ATAP common)
  • make format clean
  • CI passes

hua7450 and others added 3 commits May 14, 2026 22:31
…icyEngine#8319)

Adds parameters, variables, and tests for the Alaska CCAP program
including PASS III (general subsidy) and PASS II (12-month post-ATAP
transitional), with the full provider rate matrix and special-needs
supplement.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@codecov
Copy link
Copy Markdown

codecov Bot commented May 15, 2026

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 100.00%. Comparing base (cabb82a) to head (2c2e8be).
⚠️ Report is 4 commits behind head on main.

Additional details and impacted files
@@            Coverage Diff             @@
##              main     #8320    +/-   ##
==========================================
  Coverage   100.00%   100.00%            
==========================================
  Files            2        21    +19     
  Lines           44       333   +289     
==========================================
+ Hits            44       333   +289     
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 8 commits May 15, 2026 01:09
- Fix SN supplement formula (was suppressed by charged_rate default)
- Correct PDF page anchors (pass_2_transition_months, child support, rates)
- Strip broken AAC URL fragments
- Add #page=1 to FICS references in .py files
- Add unit test for ak_ccap_parent_in_eligible_activity

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- Add SSI to AK CCAP countable unearned sources (Manual §4080-3.1.b)
- Fix sweep-gap .py references (PASS pages, rate schedule page)
- Strip broken AAC fragment + cite 7 AAC 45 for ATAP common variables
- Add distinguishing test case for SN supplement formula

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- Rename ATAP common variables with ak_ prefix
  (was_atap_recipient → ak_was_atap_recipient,
   months_since_atap_exit → ak_months_since_atap_exit)
- Convert ak_ccap_charged_rate to pure input variable
  (drop circular formula that returned max_provider_rate)
- Register Alaska CCAP in programs.yaml
- Replace akleg.gov landing pages with direct Casetext section URLs
  (7 AAC 41.012, 41.060, 41.335, 41.350; chapter 45 for ATAP)
- Extract ak_ccap_base_eligible (DRY across PASS II/III)
- Drop unused parameters args from formulas
- Tighten multi-sentence parameter descriptions to single sentence
Critical:
- Replace dead Casetext URLs with akleg.gov Title 7 PDF page anchors
  (Casetext deprecated /regulation/ namespace; affects 23 files)
- Fix special-needs supplement base: use authorized rate
  (min(charged, max_state_rate)) per Manual §4370-2, not max_state_rate.
  Extract ak_ccap_authorized_rate_per_child for use in both
  ak_ccap_benefit_per_child and ak_ccap_special_needs_supplement.
- Drop activity-test OR-fallback that bypassed §4070-3 D "each parent"
  requirement. Simplify parent-counting logic.

Should-fix:
- Reword 5 parameter descriptions to match
  [State] [verb] ... [this X] under the [Full Program Name] program.
- Tighten defined_for="ak_ccap_child_eligible" in special-needs supplement
- Delete orphaned ak_ccap_dependents_in_care variable and test
- Remove WHAT-style comments from countable_earned/unearned_income
- Fix comment typos in integration.yaml (SMI threshold, copay band)
- Rename misleading ak_ccap_age_group.yaml Case 2

Test coverage additions (13 new cases, 298 total):
- Rate region: CHUGACH/COPPER_RIVER -> VALDEZ_CORDOVA (2019 split),
  Bethel, Juneau
- Provider/care unit: licensed home FT_DAY Fairbanks, approved relative
  Bethel infant, licensed group home Aleutians East infant
- PASS II 11-month boundary (last month inside window)
- ak_ccap.yaml: non-AK household returns 0; mixed-status siblings
- Special-needs supplement: charged-below-max case (verifies new base);
  undocumented disabled child
- New ak_ccap_authorized_rate_per_child test file
- smi/amount.yaml: re-index thresholds 2-15 (was 1-13, mapping every
  family to next-larger family's SMI); fix transcription errors at
  sizes 11-14; add sizes 14p ($13,529) and 15p ($13,789); fix Manual
  citation href to #page=203 (was #page=230 §4080-2 K)
- age_threshold/adult.yaml: fix Manual citation href to #page=203;
  add §4070-4 A reference for family-size definition
- ak_ccap_smi_threshold.py: update docstring (FICS publishes through
  size 15, not 13)
- Cascading test updates to match corrected SMI values across
  smi_threshold, smi_band, income_eligible, copay_rate, copay,
  ak_ccap, and integration tests

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@hua7450 hua7450 marked this pull request as ready for review May 18, 2026 21:45
hua7450 and others added 4 commits May 18, 2026 17:45
- Replace AKCCAPRateRegion enum with direct County reuse;
  collapse Copper River → Chugach for shared Valdez-Cordova rate;
  UNKNOWN counties fall back to Anchorage.
- Use is_tanf_enrolled (not ak_atap > 0) for PASS I copay waiver,
  breaking the ak_ccap_copay ↔ ak_atap ↔ ak_ccap circular dependency.
- Inline ak_ccap_smi_band into ak_ccap_copay_rate; drop redundant
  /MONTHS_IN_YEAR (bare period auto-divides annual hhs_smi).
- Fix ak_ccap_max_provider_rate_per_child day-vs-month selection
  (was based on attending_days > 0; now based on schedule type).
- Rename rate-region YAML keys to full County names
  (ANCHORAGE → ANCHORAGE_MUNICIPALITY_AK, VALDEZ_CORDOVA →
  CHUGACH_CENSUS_AREA_AK, etc.).
- Backdate all CCAP parameters from 2022-02-21 → 2022-01-01.
- Set all test periods to 2022-01; add UNKNOWN-fallback and
  non-AK defined_for test cases.
- Replace artificial $120K/yr childcare expense placeholders with
  realistic AK family costs ($9.6K–$36K/yr by scenario).
- TANF/SN tests use explicit is_tanf_enrolled / ssi: 0 inputs.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- Fix reference title/page mismatches and AAC section-title fidelity in
  smi_rate.yaml, adult.yaml, earned_sources.yaml, unearned_sources.yaml,
  supplement_multiplier.yaml.
- Reorganize 18 CCAP test files into benefit/, copay/, eligibility/,
  income/, rates/ subfolders matching the variable layout; integration.yaml
  stays at program root.
- Merge ak_ccap_excluded_income.yaml (5 cases) into ak_ccap_countable_income.yaml
  as Cases 10-14; drop the standalone file.
- Clarify modeled scope in changelog and programs.yaml notes: PASS II/III
  modeled; PASS I (ATAP-bundled) and PASS IV (OCS protective services)
  not modeled.

All 136 tests pass.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
ak_ccap_rate_region previously returned a value from the full US County
enum (3,175 values). Every parameter breakdown lookup ran County.encode()
against all 3,175 candidates per person, even though the AK CCAP rate
matrix has only 29 region keys. This made the AK CCAP test suite take
~10 minutes (max_provider_rate_per_child alone took 144s for 20 cases).

Introduce AKCCAPRateRegion (29 values, matching the keys already in the
4 rate parameter YAMLs) and have ak_ccap_rate_region map county_str into
it. The Copper River → Chugach collapse and the UNKNOWN/non-AK fallback
to Anchorage are preserved.

YAMLs do not need to change: the new enum's value names match the
existing parameter keys.

Results:
- Full AK CCAP suite: ~10 min → 12.5s (~48× faster)
- max_provider_rate_per_child: 144s → 5.04s (28.6×)
- benefit/: 199s → 7.08s (28×)
- 136/136 tests still pass

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@hua7450 hua7450 requested a review from PavelMakarchuk May 19, 2026 01:44
@hua7450
Copy link
Copy Markdown
Collaborator Author

hua7450 commented May 19, 2026

Note on SMI source: hhs_smi matches FICS exactly

If a future reviewer asks "why use federal hhs_smi instead of a state-specific FICS parameter?" — they publish the same numbers for Alaska, derived from the same ACS data.

Quick proof (matches integration.yaml Case 1, # Family of 2 monthly SMI = 5_897):

  • gov/hhs/smi/amount.yaml: AK 4-person on 2021-10-01 = $104,070
  • gov/hhs/smi/household_size_adjustment.yaml: 2-person factor = 0.52 + 0.16 = 0.68
  • 104,070 × 0.68 / 12 = $5,897/mo — exact match to FICS row "2 persons"

Same arithmetic reproduces every other FICS family-size row. Both hhs_smi and FICS update whenever new ACS data is available, so using hhs_smi keeps the table in sync without duplicating it.

Used in ak_ccap_copay_rate.py:16 and ak_ccap_income_eligible.py:17.

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 Alaska Child Care Assistance Program (CCAP)

1 participant