Skip to content

Add Arizona Child Care Assistance Program#8373

Merged
hua7450 merged 13 commits into
PolicyEngine:mainfrom
hua7450:az-ccap
Jun 18, 2026
Merged

Add Arizona Child Care Assistance Program#8373
hua7450 merged 13 commits into
PolicyEngine:mainfrom
hua7450:az-ccap

Conversation

@hua7450

@hua7450 hua7450 commented May 21, 2026

Copy link
Copy Markdown
Collaborator

Summary

Fixes #8370.

Adds Arizona's Child Care Assistance Program (CCAP), including:

  • Eligibility for Arizona families with an eligible child under age 13 who is a citizen or qualified noncitizen (CCDF, 45 CFR 98.20).
  • Initial and ongoing income eligibility using the DES FFY 2026 fee schedule.
  • az_ccap_enrolled to apply ongoing/redetermination eligibility through 85% SMI.
  • DES daily copays by fee level, with formula-based copay exemptions for employed Cash Assistance families, protective services, and foster care pathways.
  • A without-regard-to-income (categorical) eligibility pathway for the same families (R6-5-4914(A)).
  • DES reimbursement rates by provider type, child age group, quality status, formula-derived special-needs child status, and school-age season.
  • Monthly subsidy calculation as max(0, min(pre-subsidy childcare expenses, state maximum reimbursement) - copay).

Regulatory Authority

  • Arizona DES child care assistance eligibility page.
  • DES CCA-0229A, Child Care Assistance Gross Monthly Income Eligibility Chart and Fee Schedule FFY 2026.
  • DES CCA-1227A, Maximum Reimbursement Rates for Child Care, effective November 1, 2025.
  • Arizona Administrative Code Title 6, Chapter 5, Article 49.
  • DES Child Care Provider Registration Agreement CCA-1210B for special-needs definition and enhanced-rate criteria.

Income Eligibility Tests

  • Non-enrolled applicants use fee levels L1-L6, corresponding to the initial 165% FPL limit.
  • Enrolled recipients use az_ccap_enrolled and may qualify through fee level L7, corresponding to the ongoing 85% SMI limit.
  • Family sizes 1-12 use the DES FFY 2026 monthly gross income thresholds.

Eligible Activity

  • Employment (full or part-time) qualifies under R6-5-4912(A)(1).
  • Education and training qualify an adult only when paired with an average of at least 20 hours/week of work (R6-5-4912(A)(3)); education alone qualifies only teen parents — a parent under the teen_parent_age_limit (20) attending secondary school (R6-5-4912(A)(4)).
  • Inability to provide care (is_disabled) qualifies.
  • CPS-referred and CPS/DDD foster cases satisfy the activity-or-need requirement without an employment activity, because the case plan is itself an eligible need (R6-5-4912(A)(9)).
  • Activity employment checks read pre-labor-supply-response hours (weekly_hours_worked_before_lsr) so a reform's behavioral hours change does not feed back into eligibility.

Income Deductions And Exemptions

  • Countable income uses PolicyEngine income variables matching R6-5-4914(F) countable income categories, including SSI, railroad retirement, general assistance, recurring cash gifts, and gambling/lottery proceeds.
  • A minor student's earnings (wages and self-employment, including SSTB and farm) are excluded (R6-5-4914(G)(13)); lump-sum capital gains from property sales are excluded (R6-5-4914(G)(3)).
  • Child support paid for dependents residing outside the household is deducted (R6-5-4914(H)).
  • Countable income is rounded down to the whole dollar (R6-5-4914(I)).

Standards And Benefit Calculation

  • Copay is a daily per-child amount by fee level and attendance days.
  • az_ccap_categorically_eligible (used for both the income-test bypass and the copay exemption) is formula-based from is_tanf_enrolled combined with an employed head/spouse, receives_or_needs_protective_services, and is_in_foster_care.
  • az_ccap_special_needs_child is formula-based from eligible child status and is_disabled; the enhanced special-needs rate additionally requires a quality-enhanced (3-5 star / accredited) provider per CCA-1210B.
  • Reimbursement uses provider type, child age group, school-age season, quality enhanced rate (+40%), and the flat special-needs rate.

Requirements Coverage

  • Covered: Arizona residence, child age, citizenship/qualified-noncitizen status, activity (with the adult education work requirement), initial and ongoing income limits, countable income sources and deductions, family-size thresholds, fee levels, daily copays, formula-based copay exemptions, the categorical without-regard-to-income pathway, provider/age/season rates, quality rate, formula-based special-needs rate, final subsidy formula, and CCDF/state-benefit aggregation.
  • Out of scope by user decision: the CDA-only (+35%) enhanced rate and the TCC no-copay-beyond-third-child rule.
  • Not modeled: waiting lists, verification workflow, provider contract status, nonpayment sanctions, overpayments, appeals, exact administrative notices, time limits, and the Jobs/rehabilitation/court-ordered/shelter activity pathways (employment, education, and inability-to-care are modeled).

Modeling Limitations And Future Work

  • Historical backdating. Only the FFY 2026 schedule is modeled (income/fee effective 2025-10-01, rates effective 2025-11-01). As with the other state CCAP implementations, earlier periods back-extrapolate these values rather than using period-correct historical rates, so simulations before late 2025 are approximate. This program may need historical rate/threshold backdating in the future.

Files

Parameters and variables are organized into reimbursement/ (rates, age groups, school-age season), copay/, eligibility/, and income/ subfolders.

  • policyengine_us/parameters/gov/states/az/hhs/ccap/{reimbursement,copay,eligibility,income}/...
  • policyengine_us/variables/gov/states/az/hhs/ccap/{az_ccap.py, az_ccap_enrolled.py, reimbursement/, copay/, eligibility/, income/}
  • policyengine_us/variables/gov/states/az/hhs/az_child_care_subsidies.py
  • policyengine_us/tests/policy/baseline/gov/states/az/hhs/ccap/...
  • policyengine_us/programs.yaml (CCDF state implementation registration)
  • changelog.d/8370.added.md

Validation

  • policyengine-core test policyengine_us/tests/policy/baseline/gov/states/az/hhs/ccap -c policyengine_us
  • make format

Known failing tests: none.

@hua7450 hua7450 force-pushed the az-ccap branch 2 times, most recently from a2a08c2 to 5ce3ba2 Compare May 21, 2026 21:28
@codecov

codecov Bot commented May 21, 2026

Copy link
Copy Markdown

Codecov Report

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

Additional details and impacted files
@@            Coverage Diff            @@
##              main     #8373   +/-   ##
=========================================
  Coverage   100.00%   100.00%           
=========================================
  Files           15        19    +4     
  Lines          255       272   +17     
=========================================
+ Hits           255       272   +17     
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 Harness.
📢 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 June 1, 2026 14:52
Critical fixes:
- Correct copay daily rates at fee levels 2/3/4/6 to match CCA-0229AFY26
- Add categorical income-test bypass for foster/DCS/TANF families
  (R6-5-4914(A)) via new az_ccap_categorically_eligible
- Remove capital_gains from countable income (excluded by R6-5-4914(G)(3))
- Add is_ccdf_immigration_eligible_child to eligible-child (45 CFR 98.20)
- Correct regulation page anchors in parameters and variables

Should-address:
- Exclude minor-student earnings (R6-5-4914(G)(13)) and deduct child
  support paid (R6-5-4914(H)) from countable income
- Register Arizona in programs.yaml CCDF coverage and state_implementations
- Strip #page=1 anchors from the single-page CCA-1227A; improve citations
- Document special-needs rate gate, CDA tier (not modeled), age<13 limit,
  TCC copay rule (not modeled), and activity pathways
- Add test coverage: provider types, age groups, fee levels, direct unit
  tests, categorical bypass, and roll-up (21 -> 72 passing cases)

Remove working_references.md transcription.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…into az-ccap

# Conflicts:
#	policyengine_us/parameters/gov/hhs/ccdf/child_care_subsidy_programs.yaml
#	policyengine_us/programs.yaml
- Count SSI, railroad retirement, and general assistance as countable
  income (R6-5-4914(F)(5),(8))
- Round countable income down to the whole dollar (R6-5-4914(I))
- Exclude all of a minor student's earnings, including SSTB and farm
  self-employment, not just wages (R6-5-4914(G)(13))
- Restrict the without-regard-to-income / fee-exempt categorical treatment
  for Cash Assistance families to those employed (R6-5-4914(A)(2))
- Require adults using education as their activity to work >=20 hours/week;
  education alone qualifies only teen parents under 20 (R6-5-4912(A)(3)-(4))
- Move the changelog fragment to a top-level path (changelog.d/8370.added.md)
- Add tests: SSI counted, farm-earnings exclusion, whole-dollar floor,
  teen-parent activity, corrected adult-student activity

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- Count recurring cash gifts (financial_assistance) and gambling proceeds
  as countable income (R6-5-4914(F)(16)-(17))
- Restrict the no-work education activity exception to teen parents in
  secondary school (is_in_secondary_school and is_parent), not any
  full-time student (R6-5-4912(A)(4))
- Parameterize the teen-parent age limit (gov.states.az.hhs.ccap.eligibility
  .teen_parent_age_limit = 20) citing R6-5-4912(A)(4)(a)
- Remove trailing blank-line-at-EOF whitespace across the AZ CCAP YAML files
- Add tests: cash gifts/gambling counted, teen-parent secondary-school
  eligibility, and adult-college-student ineligibility

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Group reimbursement-related parameters and variables under reimbursement/
(AZ's own term, per CCA-1227A "Maximum Reimbursement Rates" / R6-5-4925) and
copay variables under copay/, mirroring the Maine CCAP layout:

- variables/.../ccap/reimbursement/: daily_rate, max_reimbursement, age_group,
  provider_type, quality_enhanced_provider, special_needs_child
- variables/.../ccap/copay/: copay, copay_exempt
- parameters/.../ccap/reimbursement/: rates/, age_group/, school_age_summer/
- tests moved to mirror

Update the provider-type import and parameter paths (ccap.rates ->
ccap.reimbursement.rates, ccap.age_group/school_age_summer ->
ccap.reimbursement.*) accordingly.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
… tests

- Fix az_ccap_copay vectorization: project SPMUnit fee rate to persons before
  multiplying by person-level arrays (avoids microsim broadcast error).
- Let CPS-referred / CPS-or-DDD foster cases satisfy the activity-or-need test
  without employment (R6-5-4912(A)(9)).
- Use weekly_hours_worked_before_lsr for the activity/categorical employment
  checks so labor-supply responses don't feed back into eligibility.
- Correct child_age_limit reference anchor (#page=25 -> #page=26).
- Add dedicated unit tests for az_ccap_eligible and az_ccap_special_needs_child,
  a whole-year summer reimbursement test, and edge cases (age/fee boundaries,
  daily-rate fallback branches, multi-child copay).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…into az-ccap

# Conflicts:
#	policyengine_us/parameters/gov/hhs/ccdf/child_care_subsidy_programs.yaml
#	policyengine_us/programs.yaml
@hua7450 hua7450 marked this pull request as ready for review June 3, 2026 18:22
@MaxGhenis

Copy link
Copy Markdown
Contributor

Holding this one back from the current CCAP merge batch (KS/IA/IN/HI/FL/ID/KY are all merged) pending a source check on a single value.

In az_ccap_daily_rate / reimbursement/rates/special_needs.yaml, the special-needs rate is $89.81, applied as a flat rate that overrides the age/provider/quality rate for any special-needs child at a quality provider. That figure appears to equal the quality-enhanced infant center rate ($64.15 base × 1.4 quality multiplier = $89.81) rather than a distinct all-ages special-needs rate. If so, a special-needs preschool/school-age child at a quality provider would receive $89.81/day instead of their (lower) age-appropriate quality-enhanced rate, overstating the benefit.

Could you confirm against CCA-1227A (page 1) whether a standalone special-needs rate row actually exists? If $89.81 is really the infant quality rate, the special-needs branch should select the age-appropriate quality rate rather than apply a flat override. Everything else verified cleanly against the cited sources — happy to merge as soon as this is confirmed or adjusted.

hua7450 and others added 2 commits June 15, 2026 12:52
Include children with an Individualized Education Program (IEP) and
children with a documented developmental delay, in addition to the
generic is_disabled flag, per CCA-1210B item 14 (IFSP/IEP/ISP/504
pathways).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…into az-ccap

# Conflicts:
#	policyengine_us/programs.yaml
@hua7450

hua7450 commented Jun 15, 2026

Copy link
Copy Markdown
Collaborator Author

Thanks for catching this and holding it back — good instinct to double-check the value.

I verified against CCA-1227A, and there is a standalone Special Needs Rates row at the bottom of the rate table:

Special Needs Rates — Birth through 12-year-old · Daily Rate · All Districts: $89.81

So $89.81 is a genuine published flat rate for special-needs children of any age (birth–12), not the infant-center quality cell. The match to the infant quality rate ($64.15 × 1.4 = $89.81) is coincidental — on the prior Aug 1, 2024 sheet the Special Needs Rate was $96.23, which likewise equals that sheet's infant quality rate (×1.5, before AZ dropped the multiplier to 1.4). Both sheets list it as its own all-ages row.

Per CCA-1210B item 14, the special-needs enhanced rate applies at providers with a 3–5 star Quality First rating or national accreditation — exactly the special_needs & quality gate in az_ccap_daily_rate. So a special-needs preschool/school-age child at a quality provider does receive the flat $89.81 by design, and the implementation is correct as written.

Source: https://des.az.gov/sites/default/files/dl/CCA-1227A.pdf#page=1 (Special Needs Rates section, bottom of the table)

Separately, I broadened the az_ccap_special_needs_child definition to also recognize children with an IEP or a documented developmental delay (not just the generic is_disabled flag), matching the IFSP/IEP/ISP/504 pathways in CCA-1210B item 14 — pushed in the latest commit.

Let me know if you'd like anything else before merging.

@PavelMakarchuk PavelMakarchuk left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Program Review — Arizona Child Care Assistance Program (CCAP)

Automated multi-agent review (regulatory, references, code patterns, test coverage, and source-value audits of income/copay + the provider-rate matrix).

Strong, well-structured implementation — 100 CCAP + 11 param/system tests pass, microsim runs clean, mechanisms (the +40% quality multiplier, flat special-needs rate, enrolled-vs-applicant two-tier, categorical bypass) all correctly reflect AZ CCA rules, and all 84 income-threshold cells + copays + base rates match CCA-0229A FFY2026. Requesting changes on a few items below — none are value errors.

✅ Cleared (not errors) — flagging so they aren't re-litigated

quality_multiplier = 1.4 and special_needs = $89.81 are correct for FFY2026. AZ reduced the Quality First enhancement to 40% effective 2025-11-01 ($64.15 × 1.4 = $89.81). The 50% / $96.23 figures are from the prior FFY2025 (08/24) sheet — the live FFY2026 rates confirm the PR's values.

Should address

  1. Hard-coded age < 18 in policyengine_us/variables/gov/states/az/hhs/ccap/income/az_ccap_countable_income.py (~line 30) — this is a policy threshold (minor-student earnings exclusion, R6-5-4914(G)(13)); move it to a parameter. It's the only genuine hard-coded value in the PR.
  2. Reimbursement-rate citations point to the stale Aug-2024 edition. The 11 reimbursement/ params are dated 2025-11-01 and their values are the FFY2026 rates, but the reference hrefs cite the "08/24" CCA-1227A. Re-cite to the FFY2026 edition so the source matches the effective date (values are correct; only the cited edition is wrong).
  3. Test coverage pins: add the level-7 fee-level upper boundary (== threshold → 7, +1 → 0); a level-2 ($1/day) copay case + a multi-child case with differing attendance days; a max_family_size clamp case; and at least one non-center provider summer-rate case.
  4. Confirm the special-needs & quality gate. The flat $89.81 special-needs rate is applied only when the provider is quality-enhanced; CCA-1227A lists Special Needs as a flat all-districts rate without an explicit star precondition — please confirm the gate is intended.

Suggestions

  • Rename the changelog fragment changelog.d/8370.added.md8373.added.md (or az-ccap.added.md) — it's named for the issue, not this PR.
  • The +35% CDA-credentialed certified-family tier isn't modeled (a CDA-only provider without a star rating is under-reimbursed) — worth a documented note.
  • az_ccap_enrolled defaults False, so the level-7 (85% SMI) continued-eligibility tier is unreachable population-wide in microsim — document or impute as future work.
  • Cosmetic: 48.7048.7 in reimbursement/rates/center.yaml; tighten the teen_parent_age_limit.yaml description; the countable_income/sources.yaml excluded-income anchor is p.32 (not p.31).

Cleared / verified

All income/copay/eligibility values match source; no 7% copay cap needed (AZ's fixed daily-fee schedule is its 45 CFR 98.45 sliding scale); enums complete (no dead lookups); reuses the shared federal is_ccdf_asset_eligible / is_ccdf_immigration_eligible_child; no shared CCDF code modified.

🤖 Multi-agent review via /review-program

hua7450 and others added 3 commits June 18, 2026 15:18
…child, citation cleanup

- Restrict special-needs enhanced rate to licensed centers and certified group
  homes per CCA-1210B item 14 (provider type + quality + documented disability)
- Replace hard-coded age < 18 with is_child in az_ccap_countable_income
- Collapse duplicate same-PDF references to a single link across 5 files
- Cosmetic: center toddler rate 48.70 -> 48.7
- Rename changelog fragment 8370.added.md -> az-ccap.added.md
- Add daily-rate tests: certified-family special-needs (excluded) and
  group-home special-needs (included)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…into az-ccap

# Conflicts:
#	policyengine_us/programs.yaml
…into az-ccap

# Conflicts:
#	policyengine_us/programs.yaml
@hua7450 hua7450 merged commit 3001326 into PolicyEngine:main Jun 18, 2026
27 checks passed
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.

Add Arizona Child Care Assistance Program

3 participants