Skip to content

Add IA CCA family co-pay charts effective July 2025 and July 2026 - #9368

Merged
hua7450 merged 2 commits into
PolicyEngine:mainfrom
hua7450:ia-cca-copay-2025-2026
Sep 1, 2026
Merged

Add IA CCA family co-pay charts effective July 2025 and July 2026#9368
hua7450 merged 2 commits into
PolicyEngine:mainfrom
hua7450:ia-cca-copay-2025-2026

Conversation

@hua7450

@hua7450 hua7450 commented Aug 31, 2026

Copy link
Copy Markdown
Collaborator

Summary

Adds Iowa's two missing Child Care Assistance family co-pay chart editions, found by the #9365 copay sweep:

IAC 441—170.4(2) delegates to "the fee schedule … found on the department's website," so these agency charts are the operative documents. Monthly income thresholds moved both years (CCA level A size 1: $1,192 → $1,240 → $1,264; level AA size 4: $5,140 → $5,298 → $5,436; Exit Basic D size 4: $6,500 → $6,700 → $6,875); per-unit fees by level and the Exit percentages (33/45/60/60) are unchanged all three years (references and comments refreshed in those files, no value layers).

Structural changes encoded

  1. Fee level BB eliminated effective 2025-07-01 — the newer charts end at level AA. BB stays in the breakdown (removing it would break validation against the 2024 keys) with all 13 thresholds set to .inf from 2025-07-01: the level-scan formula then always finds BB as the first row exceeding income, so every family caps at AA; pre-2025 behavior is bit-identical (all 11 pre-existing 2025-01 cases verified unchanged against the merged file). Documented in the YAMLs and ia_cca_sliding_fee_level.py.
  2. 2026 CCA Plus ceiling — printed capped cells transcribed as printed (Y size 13 = $12,768; Z size 12 = $12,517); the three blank grey cells (Z-13, AA-12, AA-13) encoded as .inf, which lands such families on the last printed row of their column, consistent with the chart note ("maximum income allowed under the CCA Plus program is $12,517 for a family of 12 and $12,768 for a family of 13"); enrolled families above the CCA Plus ceiling route to the Exit fee via ia_cca_in_exit_tier regardless.
  3. Exit Basic level A row — still flattens at family sizes 9–13 in the 2025 chart (matching 2024's shape) and un-flattens to a linear row only in 2026 (identical to the Special Needs A row); all three years encoded faithfully with a comment.

Transcription verification

Values were parsed programmatically from the PDF text extracts with hard assertions (every sweep-identified threshold, per-row family-size monotonicity, cell-wise 2024 ≤ 2025 ≤ 2026). The 2026 extract's X/Y/Z/AA rows were garbled in the text layer and hand-entered from the page-2 image; those four rows were then independently re-verified cell-for-cell against a fresh render of the chart page (all 52 cells match, including the caps and blanks). Structural loading verified through ParameterNode (BB → inf at 2026-01 vs. 5,000 at 2025-01; AA-12 → 12,545 at 2026-01 vs. inf at 2027-01).

Tests (13 new cases)

  • ia_cca_sliding_fee_level.yaml: 2026-01 boundary pair at the new level-A/B line (family of 3 at $2,220 → level A vs. $2,221 → B); the same household as the existing BB case now capping at AA (index 26); a large family that would have hit BB pre-2025; 2027-01 boundary pair plus the two CCA Plus blank-cell routes (family of 13 → Y; family of 12 above the $12,517 cap → Z).
  • ia_cca_copay.yaml: fee-dollar cases at 2026-01 and 2027-01 (e.g., family of 4 at $2,700 with 3 children in care → level B × $0.70 × 34.6667 units = $24.27; the ex-BB household → AA $6.45 × 34.6667 = $223.60 rather than BB's $232.27), plus Exit-chart 45% cases both years.

January periods only (2026-01 exercises the 2025 chart; 2027-01 the 2026 chart).

Part of #9365.

Test plan

  • CI passes (tests intentionally not run locally)

🤖 Generated with Claude Code

https://claude.ai/code/session_01ASXyC4DNpinDieKCdkNgL8

Encode the July 1, 2025 and July 1, 2026 editions of the Iowa HHS Child
Care Assistance family fee charts (CCA/CCA Plus sliding fee and CCA Exit
basic and special-needs tables). Level BB is eliminated from July 1, 2025
(thresholds set to infinity so the chart scan caps at level AA), and the
2026 chart's cells above the CCA Plus state-median-income ceiling (Y size
13 capped at 12,768; Z size 12 capped at 12,517; Z size 13 and AA sizes
12-13 blank) are encoded with the printed caps and infinity for the blank
cells. Per-unit fees and exit percentages are verified unchanged across
all three editions.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ASXyC4DNpinDieKCdkNgL8
@codecov

codecov Bot commented Aug 31, 2026

Copy link
Copy Markdown

Codecov Report

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

Additional details and impacted files
@@            Coverage Diff            @@
##              main     #9368   +/-   ##
=========================================
  Coverage   100.00%   100.00%           
=========================================
  Files            1         1           
  Lines           17        20    +3     
  Branches         0         1    +1     
=========================================
+ Hits            17        20    +3     
Flag Coverage Δ
unittests 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
hua7450 marked this pull request as ready for review August 31, 2026 20:08
@hua7450
hua7450 requested a review from DTrim99 September 1, 2026 13:35
@DTrim99

DTrim99 commented Sep 1, 2026

Copy link
Copy Markdown
Collaborator

Program Review — PR #9368: Iowa CCA family co-pay charts (2025-07-01 & 2026-07-01)

Program Review

PR #9368 extends the Iowa HHS Child Care Assistance (CCA / CCA Plus) family
co-pay parameters with two new chart editions, effective 2025-07-01 and
2026-07-01, layered on top of the existing 2024-07-01 baseline. The change
is data/coverage only — the single .py touched (ia_cca_sliding_fee_level.py)
receives a comment-only edit documenting the structural changes; the
bottom-up scan logic is byte-identical to baseline.

Three structural events are encoded across the two editions:

  1. Level BB eliminated (2025-07-01). The 2025 and 2026 sliding-fee charts
    both end at Level AA (no BB row). The repo sets all 13 BB family-size cells
    to .inf effective 2025-07-01. Because the variable walks levels bottom-up
    and returns "the row above" the first threshold greater than income, an
    .inf BB row is always the first-greater sentinel, so every family caps at
    AA.
  2. 2026 CCA Plus SMI ceilings (2026-07-01). The 2026 chart leaves three
    cells blank above the state-median-income ceiling (family-of-12 max $12,517,
    family-of-13 max $12,768). The repo blanks exactly those cells — Z/size-13,
    AA/size-12, AA/size-13 — to .inf, and no others.
  3. Basic exit Level-A de-flatten (2026-07-01). The 2026 basic-care Level-A
    row (sizes 9–13) changes from a compressed schedule to a linear one that is
    identical to the 2026 special-needs Level-A row, matching the printed chart.

Effective-date layering is clean: 2024-07-01 values are preserved byte-identical
throughout, and 2025/2026 layers are added to the existing parameter trees with
no renamed or duplicated parameters. Changelog fragment
ia-cca-copay-2025-2026.changed.md is present, top-level, and correctly typed
changed.

Source Documents

Edition Source Sliding-fee Exit
2024-07-01 (baseline) IA HHS media/12445 #page=1 #page=2
2025-07-01 IA HHS media/16424 (147 KB) #page=2 #page=4
2026-07-01 IA HHS media/18656 (289 KB) #page=2 #page=4

Both new-edition URLs resolve to live PDF binaries. Every 2025/2026 value block
is paired with the correct edition and page anchor; jurisdiction (IA HHS for an
Iowa program) is correct throughout.

Critical

None.

Should Address

None.

Suggestions

  1. Normalize reference href punctuation (cosmetic). Three query/anchor
    punctuation variants appear across the new href strings, all of which resolve
    in practice:

    • ...download?inline=#page=N (2024 and most 2025 refs)
    • ...download?inline#page=N (all 2026 refs — missing the = after inline)
    • ...download?inline/#page=N (fee_pct.yaml 2024 & 2025 refs — stray /)

    Recommend normalizing to a single clean form, e.g.
    https://hhs.iowa.gov/media/<id>/download#page=N. Affected 2026 lines:
    sliding_fee/income_thresholds.yaml:18, sliding_fee/unit_fee.yaml:18,
    exit/income_thresholds_basic.yaml:18,
    exit/income_thresholds_special_needs.yaml:18, exit/fee_pct.yaml:16.

  2. Minor comment wording on the Z/size-13 .inf note. In
    sliding_fee/income_thresholds.yaml, the Z size-13 comment references the
    "$12,768 CCA Plus ceiling for a family of 13," which is actually the Y-13
    value (the last printed row for size 13); Z-13 is the blanked cell. The
    encoding is correct — this is purely a phrasing nuance.

  3. Benign, not a defect — retained BB breakdown level. Both
    sliding_fee/income_thresholds.yaml and sliding_fee/unit_fee.yaml retain a
    BB breakdown level even though the chart dropped it. This is intentional: the
    income-threshold BB row is set to .inf from 2025-07-01, so the scan can
    never select BB, and the stale unit_fee BB row is unreachable. No action
    required.

Value Audit Summary

All numeric cells were audited against the official IA HHS chart text for both
editions. Zero mismatches everywhere.

Table Edition Cells Result
Sliding-fee income thresholds 2025-07-01 351 (A–AA × sizes 1–13) 351/351 match; BB correctly eliminated → .inf
Sliding-fee income thresholds 2026-07-01 351 (A–AA × sizes 1–13) 351/351 match (348 numeric + 3 SMI-blank→.inf at Z-13, AA-12, AA-13)
Exit basic thresholds 2025 & 2026 A–D × sizes 1–13 All match, both years
Exit special-needs thresholds 2025 & 2026 A–D × sizes 1–13 All match, both years
Exit fee_pct (A 0.33 / B 0.45 / C 0.60 / D 0.60) 2025 & 2026 4 levels Unchanged — confirmed (refs-only, no hidden change)
Sliding-fee unit_fee (cols 1/2/3+) 2025 & 2026 A–AA Unchanged — confirmed (refs-only, no hidden change)

Structural edges verified against the charts:

  • BB elimination (2025): 2025 chart ends at AA; repo sets all 13 BB cells to
    .inf. Correct.
  • 2026 SMI blanks: exactly Z-13, AA-12, AA-13 blanked → .inf; no
    chart-filled cell blanked, no chart-blank cell filled. Correct.
  • Basic Level-A de-flatten (2026): 2026 basic-A becomes linear (~+1065/step,
    sizes 9–13) and equals 2026 special-needs-A cell-for-cell. Correct.

Validation Summary

Check Result
Sliding-fee 2025-07-01 values (351 cells) PASS — 351/351
Sliding-fee 2026-07-01 values (351 cells) PASS — 351/351
Exit basic + special-needs values, both years PASS — all match
fee_pct / unit_fee unchanged (refs-only) PASS — confirmed byte-identical values
BB elimination encoding (.inf, 13/13 rows) PASS
2026 SMI-blank encoding (exactly 3 cells) PASS
Basic Level-A de-flatten (2026) PASS
Effective-date layering (2024 preserved; 2025+2026 added) PASS
.py change comment-only, no logic change PASS
References traceable to correct edition + page; URLs resolve PASS — 0 critical
Test coverage — both new years + three structural edges PASS (see below)
Changelog fragment present, correct type PASS — .changed
CI 33/33 green

Test coverage detail. The code-pattern audit read the post-PR test YAMLs
directly and confirms the suite exercises both new editions and all
three
structural edges:

  • ia_cca_sliding_fee_level.yaml (+13 cases): periods 2026-01 (2025 chart) and
    2027-01 (2026 chart) honor the mid-year July effective date; exercises the
    BB-elimination edge (families above every 2025 floor land at AA index 26, not
    BB 27) and the 2026 SMI-blank edge (size-13 caps at Y with Z/AA blank; size-12
    caps at Z with AA blank).
  • ia_cca_copay.yaml (+11 cases): both mechanisms (sliding unit fee + exit
    percentage) at 2025/2026 editions, BB-elimination copay shift, exemptions
    (foster, FIP), and the no-children degenerate case.

Note: one reviewer (test-coverage agent) was blocked from reading the post-PR
files (no shell in that environment; working tree was on pre-PR main) and
produced a verification checklist rather than a pass. That checklist's central
risk — added cases whose period still resolves to the 2024 block, or whose
expected values do not differ from the 2024 result — was independently checked
and cleared by the code-pattern audit, which read the actual post-PR test
files and confirmed both new blocks are exercised with regressing (block-guarding)
expected values.

Review Severity

APPROVE.

All 351+351 sliding-fee cells and all exit cells match the official IA HHS
charts for both new editions with zero mismatches; the BB-elimination, 2026
SMI-blank, and basic Level-A de-flatten structural edges are correctly encoded
and tested; refs-only files carry unchanged values; the .py edit is
comment-only; references are traceable and resolve; and CI is 33/33 green. No
CRITICAL or SHOULD ADDRESS items. Only three cosmetic/benign SUGGESTIONS remain.

Next Steps

  • Optionally apply the cosmetic href normalization and comment-wording tweak via
    /fix-pr 9368 (both are non-blocking).
  • Otherwise, ready to merge.

🤖 Generated with Claude Code /review-program

@hua7450
hua7450 merged commit bb4a1cb into PolicyEngine:main Sep 1, 2026
33 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.

2 participants