Skip to content

Model California county and litigation-reinstated statewide SNAP ABAWD waivers - #8872

Open
daphnehanse11 wants to merge 5 commits into
PolicyEngine:mainfrom
daphnehanse11:snap-abawd-ca-statewide-waivers
Open

Model California county and litigation-reinstated statewide SNAP ABAWD waivers#8872
daphnehanse11 wants to merge 5 commits into
PolicyEngine:mainfrom
daphnehanse11:snap-abawd-ca-statewide-waivers

Conversation

@daphnehanse11

Copy link
Copy Markdown
Collaborator

Fixes #8868

Important

Stacked on #8860 — review only the commits after that branch point; merge #8860 first. This branch builds on snap-abawd-ak-borough-waivers and extends its waived-area mechanism.

Summary

Extends the SNAP ABAWD waived-area mechanism from #8860 with two additions:

  1. California county waivers (7 U.S.C. 2015(o)(4)(A)(i), 7 CFR 273.24(f)): adds seven CA counties to gov.usda.snap.work_requirements.abawd.waived_county_fips effective 2025-11-01 through 2026-10-31 — Colusa (06011), Imperial (06025), Tulare (06107), Alpine (06003), Merced (06047), Monterey (06053), and Plumas (06063). The 2025-11-01 dated entry retains all 29 Alaska boroughs/census areas (the AK good-faith exemption runs through 2026-10-31), and the combined list ends 2026-11-01.
  2. Litigation-reinstated statewide waivers: new dated list parameter gov.usda.snap.work_requirements.abawd.waived_states covering the statewide waivers USDA terminated in November 2025 and — after Rhode Island State Council of Churches v. Rollins (D.R.I. No. 1:25-cv-00569, TRO 2025-10-31) — kept in effect through their original expiration dates per USDA's February 26, 2026 guidance. is_in_snap_abawd_waived_area now returns true when the household's state is in this list, in addition to the county FIPS check. Because the waiver sits in base_conditions of meets_snap_abawd_work_requirements, it applies under both the pre-HR1 and post-HR1 branches (tested in both).

Source provenance (per parameter value)

waived_county_fips — CA counties, 2025-11-01 → 2026-10-31 (primary sources, verified)

Counties Source Basis
Colusa, Imperial, Tulare CDSS ACL 25-79 (Nov 7, 2025) with attached FNS approval (Oct 23, 2025) 12-month average unemployment >10% (13.0% / 18.7% / 10.4%, Jul 2024–Jun 2025 BLS data)
Alpine, Merced, Monterey, Plumas CDSS ACL 26-15 (Feb 26, 2026) with attached FNS modification approval (Feb 10, 2026) 3-month average unemployment >10%; retroactively effective Nov 1, 2025

Both FNS enclosures state implementation 2025-11-01 and expiration 2026-10-31. I read both ACL PDFs directly, including the FNS waiver-response enclosures.

waived_states — statewide waivers (primary sources for scope and windows; guidance table for reinstated expirations)

Verified STATEWIDE from FNS FY2025 waiver response letters (fns-prod.azureedge.us):

State Verified window Sources
CA statewide 2024-11-01 → 2025-10-31, replaced by statewide waiver effective 2025-02-01 (response a, response b) reinstated expiration 2026-01-31 per USDA guidance table
IL statewide 2024-11-01 → 2025-10-31, replaced by statewide waiver 2025-02-01 → 2026-01-31 (a, b) FNS partially approved 12 of 24 requested months
NV statewide since 2024-07-01; replacement statewide waiver 2025-02-01 → 2026-01-31 (response) modeled from 2024-11-01 (parameter's modeling start)
DC districtwide 2024-12-01 → 2025-11-30, replaced by districtwide waiver effective 2025-01-01 (a, b) reinstated expiration 2025-12-31 per USDA guidance table

Resulting dated values: [CA, IL, NV] from 2024-11-01 → [CA, DC, IL, NV] from 2024-12-01 → [CA, IL, NV] from 2026-01-01 (DC expired) → [] from 2026-02-01.

What I could NOT verify from primary sources, and how it is handled:

  • The USDA Feb 26, 2026 guidance expiration table itself. USDA has not published it on a stable public page; the expiration cohorts (CT, KY → 2025-11-30; DC, NM, OR → 2025-12-31; CA, IL, NV, NJ, WA → 2026-01-31; MI, NY, RI → 2026-02-28; MN, MT, ND → 2026-06-30) come from Ballotpedia's OBBBA implementation tracker report of the guidance (its table renders as an image; the accompanying text confirms the guidance reinstated the 18 terminated waivers through original expirations). Labeled as such in the parameter references.
  • 12 of the 16 reinstated waivers were PARTIAL-state, not statewide, per the FNS FY2025 response letters I read: CT (68 towns), KY (117 counties), MI (80 counties + 3 cities + 10 reservations), MN (17 counties + 9 reservations), MT (6 reservation areas), NJ (20 counties), NM (29 counties + 18 reservations), NY (61 of 62 counties), OR (30 counties + 7 reservation areas), RI (9 towns), WA (38 counties + 1 reservation area), plus ND (partial per the FY25 Q2 waiver status report; its response letter was not retrievable). These are not modeled — sub-state coverage would need county FIPS (or sub-county, for towns/reservations) encoding. Documented in the parameter header, and pinned by a test (NY resident in 2026-02 is not exempt).
  • CA/DC approval-letter vs guidance-table end dates. The CA replacement approval letter runs through 2027-01-31 and the DC letter through 2026-12-31, but the USDA guidance table lists 2026-01-31 and 2025-12-31 respectively. The parameter follows the guidance table (which governs post-litigation administration; CDSS implemented the time limit statewide 2026-06-01 per ACL 25-93). The discrepancy is documented in the parameter header.
  • Waivers before 2024-11-01 (e.g., NV's statewide waiver from 2024-07-01) are outside this parameter's modeling window, consistent with Model Alaska borough-level SNAP ABAWD waivers #8860.

Interaction with HR1 (pre/post composition)

is_snap_abawd_hr1_in_effect for CA is false until 2026-06-01 (ACL 25-93). The waiver is part of base_conditions, so it exempts in both branches:

  • pre-HR1 branch: IL 2025-06 (Case 15), CA 2025-12 (Case 10), Tulare County 2026-03 (Case 7)
  • post-HR1 branch: NV 2026-01 (Case 11), DC 2025-12 (Case 13), Tulare County 2026-07 after CA adopts HR1 (Case 9)

Because state_code defaults to CA, three pre-existing tests in meets_snap_abawd_work_requirements.yaml began picking up the CA statewide waiver; they were adjusted minimally while preserving intent (Cases 4 and 25 now pin state_code: TX; Case 32 moved from 2026-01 to 2026-03, after the CA statewide waiver expires but still pre-HR1 for CA).

Tests

uv run policyengine-core test policyengine_us/tests/policy/baseline/gov/usda/snap/eligibility/work_requirements -c policyengine_us
======================== 77 passed, 1 warning in 7.82s =========================

Broader regression runs (both clean):

uv run policyengine-core test policyengine_us/tests/policy/baseline/gov/usda -c policyengine_us
================== 481 passed, 1 warning in 152.41s (0:02:32) ==================

uv run policyengine-core test policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility -c policyengine_us  # consumes meets_snap_abawd_work_requirements
uv run policyengine-core test policyengine_us/tests/policy/baseline/partners -c policyengine_us
================== 191 passed, 1 warning in 128.33s (0:02:08) ==================

Note on test conventions: year-defined inputs (state_code, age, etc.) are keyed by year (e.g. state_code: {2026: NV}) in the new cases because their test periods are non-January months; unkeyed year inputs at such periods fail to build in the YAML test runner.

🤖 Generated with Claude Code

@codecov

codecov Bot commented Jul 2, 2026

Copy link
Copy Markdown

Codecov Report

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

Additional details and impacted files
@@            Coverage Diff            @@
##              main     #8872   +/-   ##
=========================================
  Coverage   100.00%   100.00%           
=========================================
  Files            3         1    -2     
  Lines           49        15   -34     
=========================================
- Hits            49        15   -34     
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.

@MaxGhenis

Copy link
Copy Markdown
Contributor

Held as draft pending a source decision (not a code problem)

Assessed and rebased-tested this branch on current main; the code and the county-level data are sound. Keeping it draft for one reason: the litigation-reinstated statewide-waiver expiration table in waived_states.yaml is sourced from Ballotpedia (as the header notes, "USDA has not published the table on a stable public page"). Encoding specific per-state expiration dates in the model from a secondary source is the one spot in this series that needs firming up. Two acceptable paths:

  1. Primary cite — locate the USDA February 26, 2026 post-Rhode Island State Council of Churches v. Rollins guidance (or the state-agency implementation notices that restate it) and cite that directly for each state/date; or
  2. Documented approximation — reframe the waived_states values explicitly as an approximation of that guidance, with the Ballotpedia table cited as the interim basis and a clear "verify against primary source" note, consistent with how other unverifiable-at-source values are handled.

Separately, the fully-verified portions could ship sooner if wanted: the seven CA county waivers (ACL 25-79 + ACL 26-15, all FIPS confirmed) and the AK borough list (already in #8860) are primary-source-clean. If it's useful, the CA county additions can be split into their own PR on top of #8860 and merged independently of the statewide-waiver question.

What's verified on this branch as-is:

  • CA county FIPS (Alpine 06003, Colusa 06011, Imperial 06025, Merced 06047, Monterey 06053, Plumas 06063, Tulare 06107) — all correct; waiver window 2025-11-01 through 2026-10-31 confirmed via CDSS ACL 25-79 and ACL 26-15.
  • Tests pass on the rebased branch.

Note on the base: #8860 (the branch this is stacked on) was just rebased onto current main and force-pushed (its shared-formula edit was union-merged with the discretionary-exemption and foster-youth changes that landed from #8870/#8871). When you pick this back up, rebase this branch onto the updated snap-abawd-ak-borough-waivers (or directly onto main) so it no longer carries #8860's old commits. Leaving it as draft until then.

daphnehanse11 and others added 4 commits July 28, 2026 10:59
Add seven California counties (Colusa, Imperial, Tulare, Alpine, Merced,
Monterey, Plumas) to the ABAWD waived-county parameter for 2025-11-01
through 2026-10-31 per CDSS ACL 25-79 and ACL 26-15, approved by FNS
under the over-10-percent unemployment criterion of
7 U.S.C. 2015(o)(4)(A)(i).

Add a waived_states parameter for statewide waivers (CA, DC, IL, NV)
verified from FNS FY2025 waiver response letters, covering the period
litigation kept them in effect after Rhode Island State Council of
Churches v. Rollins (D.R.I. No. 1:25-cv-00569) per USDA's February 26,
2026 guidance. Extend is_in_snap_abawd_waived_area to check the
household state against this list. Partial-state reinstated waivers
(12 of 16 states) are documented as a limitation and not modeled.

Fixes PolicyEngine#8868

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Replace the Google Drive mirror and Ballotpedia-derived sourcing of the
litigation-reinstated statewide waiver expiration table with the primary
source: USDA's "SNAP Waiver of the Time Limit - Status Update" memorandum
(February 26, 2026), published on the USDA guidance portal and linked from
the FNA waiver reinstatement page. Appendix A of the memo corroborates
every expiration date encoded in waived_states.yaml. Ballotpedia is
retained as secondary reporting.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@daphnehanse11
daphnehanse11 requested a review from DTrim99 July 28, 2026 16:12
@DTrim99

DTrim99 commented Jul 28, 2026

Copy link
Copy Markdown
Collaborator

Program Review — PR #8872 (California county & litigation-reinstated statewide SNAP ABAWD waivers)

Author: daphnehanse11 · Draft · Fixes #8868 · Builds on merged #8860

Source Documents (verified in full during review)

  • CDSS ACL 25-79 (Colusa/Imperial/Tulare, 12-mo-avg >10%) & ACL 26-15 (Alpine/Merced/Monterey/Plumas, 3-mo-avg >10%) — both Nov 1 2025 → Oct 31 2026
  • USDA FNS Feb 26 2026 memo, Appendix A (the definitive reinstated-expiration table) + FNS FY2025 Q2 ABAWD Waiver Status report
  • 7 U.S.C. 2015(o)(4)(A)(i) / 7 CFR 273.24(f); RI State Council of Churches v. Rollins (D.R.I. 1:25-cv-00569, TRO 2025-10-31)

Branch Status

⚠ PR branch is 383 commits behind main (draft, 4 ahead). Recommend rebasing before merge. Review was scoped strictly to the merge-base diff (6 files; #8860's merged content correctly excluded), so staleness did not cause false-positive findings.

Summary

Correct, well-sourced extension of the ABAWD waived-area mechanism. 0 critical. The 7 CA county FIPS, the county window (Nov 1 2025 → Oct 31 2026, with all 29 AK boroughs retained — zero dropped), and the four litigation-reinstated statewide windows are all correct. The variable logic in_waived_county | in_waived_state is a clean vectorized OR, sits in base_conditions, and correctly applies under both the pre-HR1 and post-HR1 branches (tested in each). No reinvented variables (matches the existing SNAP state-list idiom). CI green (35/35).

Expiration dates confirmed correct. An initial concern — that the reinstated expirations (CA/IL/NV = 2026-01-31, DC = 2025-12-31) are shorter than the replacement FNS letters (2027-01-31 / 2026-12-31) — was resolved by reading USDA Appendix A directly: litigation reinstates the terminated waivers "through their original expiration date," and Appendix A lists exactly CA/IL/NV Jan 31 2026 and DC Dec 31 2025. The PR's dates match the authoritative table.

Critical (Must Fix)

None.

Should Address (non-blocking, but #1 is a genuine coverage gap)

  1. New York is misclassified as a partial waiver and omitted from waived_states — the PR's own cited source says NY was statewide. The FY2025 Q2 ABAWD Waiver Status report (reference Implement policy parameter for SNAP maximum amount #10 in this very file) lists NY among only 7 statewide jurisdictions (CA, DC, IL, NV, NY, Guam, USVI), and Appendix A reinstates NY through Feb 28 2026. As coded, a NY ABAWD in 2025-11 → 2026-02 is wrongly treated as not exempt (Case 16 asserts this) — understating coverage for the largest affected caseload in the reinstated set. Either add NY to waived_states with a 2024-11-01 → 2026-03-01 window and flip Case 16, or, if a later FY25 Q3/Q4 report shows NY reverted to partial before termination, cite it explicitly (the file currently cites only the Q2 report, which says statewide).
  2. Pin the CA county window on its outside edges (test gap). CA counties are tested only inside the window (Cases 7, 9). Missing: a CA county after the window (2026-11, county → false) — without it, altering/deleting the 2026-11-01: [] closing block would leave those counties waived indefinitely with no failing test. Ideally also add the before-window case (2025-10false). (The AK block's closing edge is covered by Case 6; the CA counties — the new content — are not.)
  3. Reference robustness for the Appendix A values. The reinstated-expiration dates are correct, but the PR's corroboration for them leans on a Ballotpedia article (its table is an unreadable image, and its body text partially contradicts the values) and a Google-Drive-hosted copy of the USDA memo. Cite a stable USDA/FNS-hosted URL for the Feb 26 2026 memo + Appendix A so the load-bearing values are traceable.
  4. Domain typo fna.usda.govfns.usda.gov on the AK reference — waived_county_fips.yaml:108 and the is_in_snap_abawd_waived_area.py reference tuple. Inherited from Model Alaska borough-level SNAP ABAWD waivers #8860, but this PR edits that exact line (appending #page=4), so the fix is essentially free and makes the citation resolve.

Suggestions

  • DC documentation: add a one-line note that the modeled DC end date (Dec 31 2025) follows Appendix A, not the Apr-2024 letter's Nov 30 2025 original — removes a maintainer trap. (No value change; the date is correct.)
  • Pin one more of the six untested CA counties by actual FIPS (e.g. Imperial 06025) — currently only Tulare 06107 would catch a transposed digit.
  • Cosmetic: Cases 1-6 in is_in_snap_abawd_waived_area.yaml carry absolute_error_margin: 0.1 on boolean outputs (not vacuous, but inconsistent with the new cases, which correctly omit it).

Validation Summary

Check Result
Regulatory Accuracy Correct — CA counties/FIPS/windows + litigation-reinstated statewide dates all verified vs ACLs + USDA Appendix A; base_conditions placement correct for both HR1 branches. One coverage gap: NY omitted (should be statewide)
Reference Quality 0 missing; all windows corroborated; Appendix A values correct but leaning on weak (Ballotpedia/Drive) corroboration; fna.usda.gov typo
Code Patterns 0 critical / 0 should / 3 cosmetic — no hardcoded values, np.isin OR correct, new waived_states well-formed, changelog added correct
Test Coverage Strong (state transitions both directions, both HR1 branches, county/state independence); gap: CA county outside-window edges unpinned
CI Status Passing (35/35)

Review Severity: COMMENT

A correct, well-researched extension with no blocking defects and confirmed-correct waiver dates. Before marking ready: resolve the NY statewide/partial question (item 1 — the one real coverage gap), add the CA-county after-window test (item 2), firm up the Appendix A citation (item 3), fix the fna typo (item 4), and rebase off the 383-commit lag.

Next Steps

To auto-apply the actionable items: /fix-pr 8872

Review generated with Claude Code via /review-program

@daphnehanse11
daphnehanse11 marked this pull request as ready for review July 28, 2026 17:06
@daphnehanse11
daphnehanse11 removed the request for review from DTrim99 July 28, 2026 17:40
- Document NY's mid-window reclassification: statewide through 2025-02-28
  (FY2024 waiver, now encoded), partial 61-county thereafter per the
  FY25 Q4 status report, so the litigation-reinstated NY waiver is
  correctly out of scope
- Add Cases 17-20: NY inside/outside its statewide window, Imperial
  County FIPS pin, and the CA county after-window boundary
- Cite fns.usda.gov-hosted URLs for the Feb 26 2026 memo, NY response
  letters, and FY25 Q4 status report
- Fix fna.usda.gov domain typo
- Note DC's Appendix A expiration vs the original letter date

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@daphnehanse11
daphnehanse11 force-pushed the snap-abawd-ca-statewide-waivers branch from 0cb50e8 to a16f54a Compare July 28, 2026 18:30
@daphnehanse11

Copy link
Copy Markdown
Collaborator Author

Addressed all four review items and rebased onto current main (branch is now main + 5 commits):

  1. NY classification — resolved via the review's alternative path: the FY25 Q4 ABAWD Waiver Status report (waivers as of 2025-07-01) lists NY as partial under its 61-county FY2025 waiver, so the waiver USDA terminated and litigation reinstated was the partial one, not a statewide waiver. NY's FY2024 statewide waiver (through 2025-02-28) is now encoded in waived_states, with the mid-window reclassification documented in the file header and both sides pinned by new Cases 17–18. Case 16 (NY not exempt in the reinstated window) stays correct.
  2. CA county boundary tests — Case 20 pins a Tulare resident at 2026-11 (after the window) as non-exempt, so deleting the closing block now fails a test; Case 19 additionally pins Imperial by FIPS (06025) inside the window.
  3. Citations — the Feb 26, 2026 memo/Appendix A values now cite fns.usda.gov-hosted URLs (waiver-reinstatement page, NY FY2024/FY2025 response letters, FY25 Q4 status report), replacing the Ballotpedia/Drive corroboration.
  4. Typofna.usda.govfns.usda.gov fixed in both files.

Also documented the DC Appendix A date (2025-12-31) vs the original letter's 2025-11-30, per the suggestion. Max's earlier hold is addressed by the same change: the expiration table now cites the USDA memo directly (path 1). Work-requirements suite passes 131/131 locally.

@daphnehanse11
daphnehanse11 requested a review from DTrim99 July 28, 2026 18:30
@DTrim99

DTrim99 commented Jul 28, 2026

Copy link
Copy Markdown
Collaborator

Re-review — all prior review items addressed ✅

Thanks for the thorough turnaround. Every should-address item from the earlier review is resolved, several more precisely than originally suggested:

1. New York classification — resolved, and more accurately than I'd proposed. My prior note assumed NY was statewide through ~2026-03; your research shows the real picture: NY was statewide only 2024-11-01 → 2025-02-28 (FY2024 waiver), then held a 61-county partial waiver from 2025-03-01. waived_states now correctly carries NY for 2024-11-01/2024-12-01 and drops it at 2025-03-01, with the mid-window classification change documented and backed by the FY2024 + Oct-2-2024 responses and both the Q2 (statewide) and Q4 (partial) status reports. And it's now pinned three ways:

  • Case 17 (NY 2025-01 → exempt via the FY2024 statewide waiver)
  • Case 18 (NY 2025-03 → not exempt after the 2025-02-28 expiry)
  • Case 16 (NY 2026-02 → not exempt) — which I'd flagged as "likely wrong," but with the full history it's correct: NY's litigation-reinstated waiver in that window is the 61-county partial one, not statewide.

2. CA county window edges — pinned. Case 20 (Tulare 2026-11, after the county-waiver end date → not exempt) closes the "waived indefinitely" gap I flagged, and Case 19 (Imperial County) adds a second CA county exercised by its actual FIPS.

3. USDA Appendix A citation — firmed up. Now cites the actual USDA memo PDF (fna.obbb-time-limit-waivers-reinstatement.pdf#page=2, Appendix A) plus the FNS landing page, with Ballotpedia demoted to explicit "secondary reporting." The reinstated expirations (CA/IL/NV 2026-01-31, DC 2025-12-31) trace to a primary source now.

4. fna.usda.govfns.usda.gov typo — fixed in both the waived_county_fips.yaml reference and the is_in_snap_abawd_waived_area.py reference tuple.

One residual (non-blocking) — documented scope limitation, not a defect: NY's 61-county partial waiver (2025-03-01 → 2026-02-28, which spans the litigation-reinstatement window) is not modeled, so ABAWDs in those 61 of 62 NY counties are treated as subject to the time limit though they're actually waived. That's a reasonable, clearly-documented simplification — but it's a meaningful under-coverage for most of NY, so a good follow-up would be to add those 61 counties to waived_county_fips (a /fix-pr-sized task). Not required for this PR.

Net: the waiver dates, FIPS, and litigation-reinstatement logic were already correct; this round closes the NY coverage gap correctly, hardens the boundary tests, and firms up the sourcing. LGTM once CI settles green (currently still running) and the branch is rebased off its main lag.

Re-review via /review-program

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.

SNAP ABAWD: model California county waivers and litigation-reinstated statewide waivers

3 participants