Skip to content

Add UT CCAP Table 4 copays and income limits effective October 1, 2026 - #9367

Merged
hua7450 merged 3 commits into
PolicyEngine:mainfrom
hua7450:ut-ccap-copay-table4-oct-2026
Sep 1, 2026
Merged

Add UT CCAP Table 4 copays and income limits effective October 1, 2026#9367
hua7450 merged 3 commits into
PolicyEngine:mainfrom
hua7450:ut-ccap-copay-table4-oct-2026

Conversation

@hua7450

@hua7450 hua7450 commented Aug 31, 2026

Copy link
Copy Markdown
Collaborator

Summary

Adds Utah's already-published next CCAP copay/income schedule: the DWS Table 4 "Child Care Income Eligibility and Co-Payment" effective October 1, 2026 (table1026.pdf), as a 2026-10-01 layer in ut/dwf/ccap/copay/. Copays rise ~3–4% (e.g., household of 2: group 3 $42 → $43, group 5 $109 → $113, group 16 $352 → $366; household of 4 group 16 $518/$538/$558 → $539/$559/$580 by child count) and every income-group bound is uprated (household of 2 group 16: $5,668 → $5,896; 12+: $12,502 → $13,006).

Found by the #9365 copay sweep. The existing 2020-01-01 layers (the April 2026 edition at the backdating floor, per the file comments) are untouched.

Changes

File Change
amount.yaml 528 cells (11 household sizes × 16 income groups × 3 child-count columns) at 2026-10-01
income_limits.yaml 176 group upper bounds at 2026-10-01
Tests 5 new ut_ccap_copay cases and 2 new ut_ccap_income_group cases at period 2027-01 (inside the new schedule): an uprated interior cell, both sides of the raised group-2 boundary (inclusive bound $2,140 → $18 vs. $2,141 → $43), the above-group-16 clamp ($366), and a size-4 group-16 three-child cell ($580)

Verification: transcription ran through a generation script with built-in assertions (all nine sweep-identified sample deltas, group-1 zeros, within-column monotonicity, contiguous bounds), then 22 cells re-checked independently against the PDF, plus a further independent 15-cell check of the household-size-7 block against the source extract.

Transcription notes (documented in file comments)

  • This edition prints 0 (not "n/a") in impossible child-count cells (e.g., household of 2, "2 children" column); the established repeat-padding convention for TWO/THREE_PLUS is retained so those cells stay non-binding, consistent with the April layer.
  • Household 10 group 16 upper bound prints $12,846, breaking size-monotonicity (HH9 $12,225, HH11 $12,746, HH12+ $13,006; the uniform step suggests $12,486 was intended). Encoded as published and flagged as an apparent typo — behaviorally inert since the group-16 bound only separates group 15 from 16.
  • Household 6 group 16 prints its range without the usual .01 offset; only upper bounds are encoded, so no effect.

Out of scope (deliberately)

The October 2026 table introduces a two-tier eligibility structure — Entry Limit at income Group 6 (applications), Exit Limit at Group 10 (reviews), Open Child Care at Group 16 — versus the single 85% SMI ceiling currently in ut_ccap_income_eligible. That is an eligibility-variable restructure left for a follow-up; this PR only notes it in the income_limits.yaml comment.

Part of #9365.

Test plan

  • CI passes (tests intentionally not run locally)

🤖 Generated with Claude Code

https://claude.ai/code/session_01ASXyC4DNpinDieKCdkNgL8

hua7450 and others added 2 commits August 31, 2026 14:33
Encode the DWS Table 4 "Child Care Income Eligibility and Co-Payment"
edition effective October 1, 2026 as a 2026-10-01 layer in the copay
amount and income group upper-bound parameters (household sizes 2-12+,
income groups 1-16, all child-count columns). The existing 2020-01-01
layer keeps the April 1, 2026 edition at the backdating floor.

The October edition prints 0 (previously n/a) in the structurally
impossible child-count cells; the repeat-padding convention is retained.
The size 10 group 16 bound is encoded as published (12,846) with a
comment noting the apparent typo for 12,486; it has no behavioral
effect. The new entry/exit eligibility structure (groups 6/10/16) is
noted but not modeled here.

Part of PolicyEngine#9365.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ASXyC4DNpinDieKCdkNgL8
The 2026 annual case now spans two Table 4 editions: nine months at the
April 2026 copay (791/month) and three at the October 2026 copay
(826/month, since the uprated bounds move the household from income
group 5 to 4), totaling 9,597.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ASXyC4DNpinDieKCdkNgL8
@hua7450
hua7450 marked this pull request as ready for review September 1, 2026 00:48
@hua7450
hua7450 requested a review from DTrim99 September 1, 2026 13:35
@DTrim99

DTrim99 commented Sep 1, 2026

Copy link
Copy Markdown
Collaborator

PR #9367 Review — Utah CCAP Table 4 (copays + income limits, effective 2026-10-01)

Program Review

PR #9367 adds the October 1, 2026 edition of Utah DWS Table 4 (Child Care Income
Eligibility and Co-Payment) to the Utah Child Care Assistance Program (CCAP) parameters.
It is a pure parameter/table update — no .py files change. A second dated layer
(2026-10-01) is added on top of the existing layer (2020-01-01, holding the April 2026
edition at the backdating floor) in two files:

  • policyengine_us/parameters/gov/states/ut/dwf/ccap/copay/amount.yaml — copay amounts by
    household size (2–12) × income group (1–16) × child-count group (ONE / TWO / THREE_PLUS).
  • policyengine_us/parameters/gov/states/ut/dwf/ccap/copay/income_limits.yaml — inclusive
    upper income bound by household size (2–12) × income group (1–16).

The addition is strictly additive: every prior 2020-01-01 value is untouched (diff shows
only + insertions of new-date lines, no modification/deletion of any prior-edition line).
The existing formulas (ut_ccap_copay, ut_ccap_income_group) read the breakdown generically,
so the new dated layer is picked up automatically for periods on/after 2026-10-01 with no code
change. Three test YAMLs are updated (ut_ccap_copay, ut_ccap_income_group,
ut_child_care_subsidies) with cases pinned to period: 2027-01 (which resolves the new layer)
plus a mid-year year-blend integration case.

Source Documents

  • New (October 2026): Utah DWS Table 4 — Child Care Income Eligibility and Co-Payment,
    effective October 1, 2026 — https://jobs.utah.gov/occ/provider/table1026.pdf#page=1
    (HTTP 200, valid PDF, date-stamped durable filename). Cited in both files.
  • Retained (April 2026): Utah DWS Table 4, effective April 1, 2026 (Infosource .htm).
    Covers the 2020-01-01 layer. Retained; see Should Address for a durability note.
  • Regulatory: Utah Admin. Code R986-700-707(1) (copay) and R986-700-710(6)(d) (income
    limits), retained in the respective files as authority backup.

Critical

None.

Should Address

  1. New-block test coverage has real gaps (tests). The new-block cases correctly pin
    representative cells across sizes 2–4, groups 2/3/4/16, and all three child-count columns at
    period: 2027-01, plus a true at-bound/above-bound income-group pair (size 2: 2,140 / 2,141),
    an above-ceiling clamp, and a mid-year year-blend integration case (9×791 + 3×826 = 9,597).
    Gaps that would pass CI silently if the corresponding new-block cells regressed:

    • No 2027-01 analogue of the old Case 11 for the size-2 (>2 children) n/a-column padded cell.
      The PR's own comment describes the October edition's changed rendering of these cells, yet
      no new-block test confirms the padded value (18, not 0) under the October layer.
    • No large-household new-block case (e.g. size 12, group 16 → 870) to pin the far corner of
      the new table; large-size values are asserted only on the old block.
    • Only one household size (size 2) gets a new-block income-group threshold edge; a second size
      (e.g. size 4 at the 8,288 / 8,289 grp-15/16 edge) is not exercised on the new limits.
      No incorrect expected values were found — every asserted new-block number matches the parameter
      diff. These are additive test requests, not corrections.
  2. Retained April-2026 citation is not edition-durable (references). The retained April block
    cites the Infosource "current Table 4" .htm page, which Utah overwrites in place each time
    Table 4 is reissued; once DWS publishes the next edition this link will no longer show the
    April 2026 values. The new October citation, by contrast, uses a date-stamped PDF
    (table1026.pdf) and is durable. Suggest replacing the .htm with a date-stamped April PDF if
    one exists (e.g. a table0426-style filename). Non-blocking: the April block is corroborated by
    the R986-700 regulatory citation and internal documentation.

  3. Oct-2026 entry/exit eligibility thresholds not modeled (regulatory — documented follow-up).
    The October 2026 edition introduces application/review/interim eligibility gates
    (Entry = Group 6, Exit = Group 10, Open/Special-Needs = Group 16). The income_limits.yaml
    comment explicitly discloses that this structure "is not yet modeled in
    ut_ccap_income_eligible," which applies a single 85%-SMI ceiling. This gap is pre-existing
    (the April layer also lacked it), orthogonal to this PR's stated scope (loading the new
    copay/income-limit numbers), and does not touch the new block (ut_ccap_income_eligible uses
    hhs_smi, not these table bounds). Recommend a tracking issue for follow-up; do not block
    this PR on it.

Suggestions

  1. Tighten the n/a-cell header comment (code / copay audit). The amount.yaml header comment
    reads that the impossible child-count columns are what "the October 2026 edition prints as 0
    instead; in both layers these cells repeat the largest published column." The two clauses read
    as contradictory. The encoding is correct — impossible cells repeat the largest published
    column (e.g. size 2 group 6 = 126/126/126), never 0 — so the wording should be tightened to
    avoid implying the values are stored as 0. Documentation only; no behavioral impact. (This is
    also the minor cross-report doc inconsistency: one source described these cells as "printing 0,"
    the copay audit found the repo "repeats the top column" — both describe the same intentional
    convention.)

  2. Optionally mirror the PDF's literal 0 in the n/a cells (copay audit). For strict
    source-fidelity, the 45 structurally-unreachable n/a cells (size 2 with TWO/THREE_PLUS; size 3
    with THREE_PLUS) could be encoded as 0 to match what the October PDF literally prints. The repo
    instead repeats the largest published column so the three-key lookup is always defined and
    degrades safely. These cells can never bind (a 2-person household cannot have 2+ children in
    care; a 3-person household cannot have >2), so this is a convention choice, not a defect.

  3. Optionally pin the size-10 group-16 anomaly with a test (code / income audit). The
    published size-10 group-16 upper bound is 12,846, which breaks cross-size monotonicity (size 9
    = 12,225; size 11 = 12,746; size 12 = 13,006) and is likely a Utah DWS typo for 12,486. The PR
    faithfully encodes the published 12,846 and documents it. Since the group-16 bound only
    separates group 15 from group 16 (group 16 being the maximum band), there is no behavioral
    effect
    . A one-line YAML test pinning size-10 group-15/16 classification would guard the
    intentional discrepancy against a future well-meaning "fix."

Value Audit Summary

Both tables were audited cell-by-cell against the October 1, 2026 PDF (table1026.pdf).

Table Scope audited Match Mismatch Notes
Income limits (income_limits.yaml) 176 size×group upper bounds 176 / 176 0 100% match. size-10 grp-16 = 12,846 is published as-is by Utah (likely typo for 12,486); faithfully encoded; no behavioral effect (grp-16 = 85%-SMI band).
Copay amounts (amount.yaml) 483 published copay cells (size×group×child-count) 483 / 483 0 Every published value transcribed exactly.
Copay — n/a cells 45 structurally-unreachable cells n/a 0 binding PDF prints literal 0; repo repeats the largest published column so the lookup stays defined. Never selectable, never binds. Suggestion only.

Zero value errors. The only source–repo divergences are (a) the deliberate n/a-column repeat
convention (45 unreachable cells) and (b) one faithfully-mirrored Utah source anomaly (12,846),
both documented and behaviorally inert.

Validation Summary

  • CI: 31/31 green.
  • Value audit: income limits 176/176 exact; copay 483/483 published cells exact; 0 mismatches.
  • Structure: breakdowns preserved (range(2,13) × range(1,17) × child-count); additive dated
    layer; prior edition untouched.
  • Effective-date layering: 2026-10-01 correct; resolved by period: 2027-01 tests and by
    mid-year period arithmetic in the year-blend case.
  • References: both files cite the correct October 2026 Table 4 (durable, date-stamped) plus
    admin-code authority; jurisdiction (Utah) correct.
  • Changelog: top-level fragment changelog.d/ut-ccap-copay-table4-oct-2026.changed.md; .changed
    is the correct type (patch bump) for a rate/value update.
  • Code patterns: 0 critical / 0 should / 2 suggestions; no hard-coded logic, no .py changes,
    formatting clean.

Review Severity

APPROVE. All values are verified against the authoritative source (176/176 income limits,
483/483 published copays, 0 mismatches). There are no criticals and no should-address items that
affect any household outcome. The should-address items are additive test coverage, a citation-
durability improvement on the retained (pre-existing) April block, and a documented, pre-existing
eligibility-modeling follow-up — none of which block this parameter/table update.

Next Steps

Run /fix-pr 9367 to optionally apply the non-blocking improvements: add the three requested
new-block test cases (n/a padded cell, large-household corner, second-size boundary), tighten the
n/a-cell header comment, and (optionally) swap the retained April .htm citation for a date-stamped
PDF. Consider filing a tracking issue for the Group 6 entry / Group 10 exit eligibility thresholds
in ut_ccap_income_eligible.

🤖 Generated with Claude Code /review-program

@DTrim99 DTrim99 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.

Fix minor nits, then ready

Adds the reviewer-requested October-layer tests (padded n/a cell,
size 12 group 16 far corner, size 4 and size 10 group 15/16 boundary
pairs documenting the as-published 12,846 bound), tightens the n/a-cell
header comment in amount.yaml, and swaps the April 2026 citation to an
archived capture of the Infosource page (verified to show the April
edition), since Utah overwrites the live page at each reissue and
publishes no date-stamped April PDF. The entry/exit eligibility tiers
are tracked in PolicyEngine#9372.

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

hua7450 commented Sep 1, 2026

Copy link
Copy Markdown
Collaborator Author

Addressed the review in 20bbfe9:

Should address

  1. New-block test coverage — added four October-layer cases: the Case 11 analogue pinning the padded n/a cell at 2027-01 (ut_ccap_copay Case 17: size 2, forced TWO column → 18); the far-corner large-household case (Case 18: size 12, group 16, 3+ children → 870); and a second size's boundary pair on the new limits (ut_ccap_income_group Cases 15–16: size 4 at 8,288 → group 15 / 8,289 → group 16).
  2. April citation durability — Utah publishes no date-stamped April PDF (probed table0426-style names on jobs.utah.gov), so I archived the live Infosource page to the Wayback Machine and verified the capture shows the April edition ("effective April 1, 2026", size-2 group-2 bound 2,082). Both parameter files now cite the archived capture instead of the overwritable live page.
  3. Entry/exit eligibility tiers — tracking issue filed: UT CCAP: model the October 2026 entry/exit income eligibility tiers (Table 4 groups 6/10/16) #9372.

Suggestions

  1. n/a-cell header comment — reworded in amount.yaml: the two editions' renderings (n/a vs 0) and the repeat-largest-column encoding are now stated as separate facts, with an explicit "neither the n/a nor the 0 is stored."
  2. Literal 0 in n/a cells — declined, keeping the repeat convention: it keeps the three-key lookup defined and degrading safely, and the cells can never bind (now pinned on both layers by Cases 11 and 17).
  3. Size-10 group-15/16 guard — added as ut_ccap_income_group Cases 17–18 (11,935 → group 15, 11,936 → group 16) with a comment noting the as-published 12,846 bound; since income above any group-16 bound clamps to group 16, classification is identical under either reading of the bound, so the boundary pair plus the documentation is the strongest guard available.

@hua7450
hua7450 requested a review from DTrim99 September 1, 2026 17:53
@hua7450
hua7450 merged commit da2cf1a into PolicyEngine:main Sep 1, 2026
31 checks passed
@hua7450
hua7450 deleted the ut-ccap-copay-table4-oct-2026 branch September 3, 2026 02:04
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