Skip to content

Update SNAP ABAWD work requirements for HR1 (P.L. 119-21) with missing exemptions and CA delay#7415

Closed
hua7450 wants to merge 10 commits intoPolicyEngine:mainfrom
hua7450:snap-abawd-hr1-update
Closed

Update SNAP ABAWD work requirements for HR1 (P.L. 119-21) with missing exemptions and CA delay#7415
hua7450 wants to merge 10 commits intoPolicyEngine:mainfrom
hua7450:snap-abawd-hr1-update

Conversation

@hua7450
Copy link
Collaborator

@hua7450 hua7450 commented Feb 17, 2026

Summary

Updates SNAP ABAWD work requirements to reflect P.L. 119-21 (One Big Beautiful Bill Act), adds missing non-age work registration exemptions per 7 U.S.C. 2015(o)(3)(D), and properly handles California's delayed HR1 adoption (ACL 25-93) via a centralized state routing variable.

Closes #7446 is tracked as a follow-up (HI/AK delayed adoption parameters).

Regulatory Authority

Changes

Federal parameter updates

  • Corrected effective dates to 2025-07-04 (P.L. 119-21 enactment date)
  • Backdated ABAWD age exemption to 1997-03-01 (PRWORA effective date) with full FRA 2023 phase-in history:
    • 1997-03-01: 50 (original, ages 18-49 subject)
    • 2023-09-01: 51 (FRA phase 1, "over 51")
    • 2023-10-01: 53 (FRA phase 2, "over 53")
    • 2024-10-01: 55 (FRA phase 3, "over 55")
    • 2025-07-04: 65 (HR1/OBBB, "over 65")
  • Dependent age threshold backdated to 1997-03-01 (unchanged value of 18 until HR1 → 14)

HI/AK exemption removed

  • Removed blanket state exemption logic (is_exempt_state) from meets_snap_abawd_work_requirements formula
  • Both HI and AK are implementing ABAWD (effective Nov 1, 2025):
  • exempt_states.yaml parameter retained with updated description documenting preferential waiver authority per 7 U.S.C. 2015(o)(4)(A)(ii) and 2015(o)(7)
  • HI/AK delayed adoption parameters (effective 2025-11-01) tracked in Add HI/AK delayed ABAWD adoption parameters (Nov 2025) #7446

New variable: is_snap_abawd_hr1_in_effect

Centralizes state-level HR1 adoption routing using select(). States that delay HR1 adoption (currently CA) have their own hr1_in_effect parameter; all other states use the federal in_effect parameter.

New variable: is_snap_work_registration_exempt_non_age

Implements 7 CFR 273.7(b)(1) non-age exemptions used by ABAWD exemption (D):

  • (ii) Physically/mentally unfit (is_disabled)
  • (iv) Caring for dependent child under 6 or incapacitated person
  • (v) Receiving unemployment compensation
  • (viii) Enrolled at least half-time in school/training/higher ed

Intentionally omitted (documented in code):

  • (iii) Subject to TANF work requirements — requires TANF enrollment input
  • (vi) Drug/alcohol treatment participant — requires treatment program input
  • (vii) Working 30+ hrs/week — handled separately in ABAWD work activity check

Not implemented (documented in code)

  • (F)-(G) Native American/Indian exemptions per IHCIA definitions — requires tribal membership input variable

Refactored meets_snap_abawd_work_requirements

  • Uses is_snap_abawd_hr1_in_effect for pre/post HR1 branching
  • Structure follows 7 U.S.C. 2015(o)(3) letter by letter: (A) age, (B) disability, (C) parent, (D) work reg exempt, (E) pregnant
  • Pre-HR1 snapshot uses parameters("2025-06-01") (last month before effective date)

Deleted

  • ca_meets_snap_abawd_work_requirements.py and its tests (functionality merged into federal variable via is_snap_abawd_hr1_in_effect routing)

Behavioral Impact

  • Adding three ABAWD exemptions (child under 6, student, UI recipient) is a correct behavioral change — these exist in law but were missing
  • Removing HI/AK blanket exemption is a correct behavioral change — both states are implementing ABAWD
  • Backdating age parameters and adding FRA phase-in is a correct behavioral change for historical simulations

Test plan

  • 56 tests pass (policyengine-core test .../work_requirements -c policyengine_us -v)
  • Broader SNAP tests pass
  • Microsimulation test passes

Tests organized by statutory provision:

  • Pre-HR1 (7 CFR 273.24(c)): age boundaries (17/18, 54/55), disabled, work hours (19/20), parent with child under 18, pregnant, incapacitated caregiver, homeless, veteran
  • Post-HR1 (7 U.S.C. 2015(o)(3)): age boundaries (64/65), ages 55-64 no longer exempt, disabled, parent with child under 14 (boundary at 15), new work-reg-exempt paths (student, UI, child under 6), removed exemptions (homeless/veteran)
  • CA delayed adoption (ACL 25-93): age 55 still exempt, homeless/veteran still exempt, parent with child under 18, non-exempt fails
  • HR1 routing (is_snap_abawd_hr1_in_effect): TX post/pre-HR1, CA pre/post-adoption

🤖 Generated with Claude Code

hua7450 and others added 2 commits February 16, 2026 20:34
Starting implementation of federal SNAP ABAWD work requirement changes
from the One Big Beautiful Bill Act. Key updates: verify effective dates,
add Native American/Indian exemption, update dependent child age threshold.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Fix broken test cases (9, 11, 16) by adjusting periods and expected
values after HR1 effective date moved to 2025-07-01. Add new cases
testing ages 60-64 not ABAWD-exempt post-HR1, incapacitated person
exemption, CA pre-HR1 rules, and SPM-unit-level CA/federal routing.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@codecov
Copy link

codecov bot commented Feb 17, 2026

Codecov Report

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

Additional details and impacted files
@@            Coverage Diff            @@
##              main     #7415   +/-   ##
=========================================
  Coverage   100.00%   100.00%           
=========================================
  Files            4         4           
  Lines           76        79    +3     
  Branches         1         0    -1     
=========================================
+ Hits            76        79    +3     
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.

…ate CA duplicate

- Add is_snap_work_registration_exempt_non_age for 7 CFR 273.7(b)(1) non-age
  exemptions (disabled, child under 6, incapacitated, student, UI recipient)
- Absorb CA pre-HR1 delay logic into federal ABAWD variable using CA-specific
  parameters instead of hardcoded frozen date
- Delete ca_meets_snap_abawd_work_requirements (merged into federal variable)
- Add CA ABAWD age threshold parameters with delayed 2026-06-01 effective date
- Redesign test cases organized by statutory provision with legal citations

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@hua7450 hua7450 changed the title Update SNAP ABAWD work requirements for HR1 (P.L. 119-21) Refactor SNAP ABAWD work requirements: add missing exemptions, eliminate CA duplicate Feb 17, 2026
@hua7450 hua7450 changed the title Refactor SNAP ABAWD work requirements: add missing exemptions, eliminate CA duplicate Update SNAP ABAWD work requirements for HR1 (P.L. 119-21) with missing exemptions and CA delay Feb 18, 2026
@hua7450 hua7450 marked this pull request as ready for review February 18, 2026 22:51
hua7450 and others added 3 commits February 18, 2026 17:52
- Extract state-level HR1 adoption routing into single variable using select()
- Remove CA-specific parameters (use hardcoded pre-HR1 date instead)
- Remove state logic from ABAWD and aggregator formulas
- Fix test naming conventions and period formats per PolicyEngine standards
- Add explicit state_code to post-HR1 tests (default is CA which delays HR1)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…ulate_divide bug

The unemployment_compensation call with options=[DIVIDE] triggers a
policyengine-core bug where calculate_divide() rejects the decode_enums
kwarg. Since we only check > 0, yearly amount works identically.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@PavelMakarchuk
Copy link
Collaborator

SNAP ABAWD Parameter Audit — PR #7415

Sources


🔴 Critical

1. HI/AK exempt_states parameter may be incorrect

The PR treats Hawaii and Alaska as categorically exempt from ABAWD (exempt_states.yaml adds [HI, AK] effective 2025-07-01). However, the law does not create a blanket exemption — it provides:

  • A preferential waiver pathway (150% of national unemployment rate vs 10% for other states)
  • A temporary good faith exemption authority (through Dec 31, 2028), which requires states to apply and the Secretary to approve

Hawaii's own DHS FAQ (updated Oct 16, 2025) confirms it is implementing the expanded ABAWD rules, estimating ~16,000 individuals aged 55-64 and ~10,000 households with children 14+ will be affected. Alaska had a pre-OBBB FY 2025 area waiver (approved Sept 2024), but Hawaii did not appear on the FY 2025 waiver list.

This parameter should be re-evaluated — treating these states as blanket-exempt contradicts both the statutory framework and Hawaii's own implementation materials.


🟡 Should Address

2. Effective date 2025-07-01 vs 2025-07-04

All 4 federal parameter files use 2025-07-01. The FNS memo explicitly states: "These changes were effective upon enactment, July 4, 2025." The PR's own working_references.md also says the correct date is July 4, 2025. While monthly granularity makes this functionally equivalent for most simulations, consider using 2025-07-04 for accuracy (or document why July 1 was chosen).

3. Hardcoded "2025-06-01" in two variables

Both meets_snap_abawd_work_requirements.py and meets_snap_work_requirements.py use parameters("2025-06-01") to snapshot pre-HR1 values. If the federal effective date is updated (e.g., to 2025-07-04), this hardcoded date must be updated in two separate files with no programmatic link. Consider adding a comment explaining the relationship, or defining the pre-HR1 snapshot date in a single location.

4. Native American/Indian exemption not implemented

HR1 added new ABAWD exemptions under 7 U.S.C. 2015(o)(3)(F)-(G) for Indians, Urban Indians, and California Indians per IHCIA definitions. CA ACL 25-93 (pp. 5-7) also details this. This requires a new person-level input variable for tribal membership status — should be tracked as a follow-up issue.


✅ Confirmed Correct

Parameter Repo Value Regulatory Source Status
Age threshold (exempted) 55 → 65 7 U.S.C. 2015(o)(3)(A): "under 18, or over 65"
Dependent child age 18 → 14 7 U.S.C. 2015(o)(3)(C): "under 14 years of age"
Homeless/veteran removal in_effect: false → true FNS memo: "removes exceptions for homeless individuals, veterans"
CA delay date 2026-06-01 ACL 25-93 p.3: "effective June 1, 2026"
CA #page=3 citation Correct page Page 3 contains the operative date language

✅ Code Quality

Check Verdict
select() state routing in is_snap_abawd_hr1_in_effect Correct — vectorized boolean arrays handled properly
where() vectorization (3 uses) Correct — element-wise operations verified
YEAR/MONTH period compatibility Correct — auto-conversion for is_disabled, is_snap_higher_ed_student, unemployment_compensation
Age 60-64 bug fix Correct and important — replacing meets_snap_general_work_requirements with is_snap_work_registration_exempt_non_age prevents age-based general work reg exemption from creating a backdoor ABAWD exemption for ages 60-64. Per FNS memo: "Individuals aged 60 or older remain exempt from the general work requirements" but are NOT automatically ABAWD-exempt.

🟢 Suggestions

  • Add comments in is_snap_work_registration_exempt_non_age.py explaining why 7 CFR 273.7(b)(1) exemptions (iii), (vi), (vii) are intentionally omitted
  • The sources/working_references.md (390 lines) is helpful context but may not belong in the repo long-term
  • The ca_meets_snap_abawd_work_requirements deletion is mentioned in the changelog but not in the diff — clarify if it was deleted in a prior commit

Pre-existing Issues (not from this PR)

  • Foster youth exemption (FRA 2023) was never implemented; HR1 removes it
  • is_parent is narrower than statutory "responsible for care" (misses grandparents, siblings, etc.)
  • FRA 2023 age phase-in dates (50/52/54) not captured; HR1 supersedes them

Test Coverage: 47 tests ✅

Comprehensive coverage across pre/post HR1 periods, all statutory exemption categories (A)-(E), removed exemptions, CA delayed adoption, and age boundaries.


Validation Summary

Check Result
Regulatory Accuracy 1 critical (HI/AK), 1 should-address (effective date)
Reference Quality References correct; #page=3 verified
Code Patterns All vectorization correct; age 60-64 fix is important improvement
Test Coverage 47 tests; comprehensive

@hua7450 hua7450 removed the request for review from PavelMakarchuk February 20, 2026 18:26
7 CFR 273.7(b)(1)(v) also exempts people who have applied for but
not yet received unemployment compensation; we are not tracking that yet.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@PavelMakarchuk
Copy link
Collaborator

SNAP ABAWD Parameter Audit

Sources Verified


P.L. 119-21 / HR1 Parameters (8 items)

Parameter File PR Value Law Value Status
Effective date All ABAWD params 2025-07-04 July 4, 2025 (upon enactment) ✅ MATCH
Upper age threshold exempted.yaml 65 "over 65 years of age" — (o)(3)(A) ✅ MATCH
Dependent child age dependent.yaml 14 "under 14 years of age" — (o)(3)(C) ✅ MATCH
Homeless/veteran removed in_effect.yaml + formula Excluded post-HR1 Not in amended (o)(3) ✅ MATCH
HI/AK waiver authority exempt_states.yaml Listed from 2025-07-04 (o)(4)(A)(ii) and (o)(7) ✅ MATCH
Work reg exemptions (D) is_snap_work_registration_exempt_non_age.py (ii),(iv),(v),(viii) (o)(3)(D) → (d)(2) → 273.7(b)(1) ✅ MATCH
Pregnant exemption (E) Formula Both paths "a pregnant woman" — (o)(3)(E) ✅ MATCH
Native American (F)-(G) Formula comments Documented not implemented Both exist in law ✅ MATCH

FRA 2023 Age Phase-In (5 items)

Parameter PR Value Source Value Status
PRWORA effective date 1997-03-01 ~1996-11-22 or 1996-12-01 ⚠️ MISMATCH
Original age threshold 50 "over 50 years of age" ✅ MATCH
FRA Phase 1 2023-09-01: 51 Sept 1, 2023 (90 days post-enactment) ✅ MATCH
FRA Phase 2 2023-10-01: 53 Oct 1, 2023 (FY2024 start) ✅ MATCH
FRA Phase 3 2024-10-01: 55 Oct 1, 2024 (FY2025 start) ✅ MATCH

California ACL 25-93 (4 items)

Parameter PR Value ACL Value Status
CA delayed adoption date 2026-06-01 June 1, 2026 ✅ MATCH
Pre-HR1 rules preserved (age 55+, homeless, veteran, child <18) Yes, through 5/31/2026 Confirmed by ACL ✅ MATCH
Federal vs CA gap period 7/4/2025 – 5/31/2026 Confirmed ✅ MATCH
Routing logic CA → CA param, else → federal Correct ✅ MATCH

Issues Found

⚠️ MISMATCH — PRWORA Effective Date (Low Impact)

Files: exempted.yaml, dependent.yaml — both use 1997-03-01

PRWORA (P.L. 104-193) was signed August 22, 1996. FNS guidance confirms ABAWD provisions took effect in late 1996: "December 1996 is considered the first month of the first 36 month period" (Federal Register, Jan 2001; CBPP). The correct date should be ~1996-11-22 or 1996-12-01. Only affects historical simulations before March 1997.

⚠️ Test Cases 19-22 Labeled "post-HR1" but Run Under Pre-HR1 Rules

Cases 19-22 in meets_snap_abawd_work_requirements.yaml use period 2026-01 without specifying state_code. Default state is CA, which doesn't adopt HR1 until June 2026, so these tests actually execute under pre-HR1 rules.

  • Case 19 (age 62, caregiver): Passes via age exemption (62 ≥ 55 under pre-HR1), NOT the caregiver exemption being tested.
  • Cases 20-22: Pass correctly via work_reg_exempt, but don't specifically exercise post-HR1 behavior.

Suggestion: Add state_code: TX to these cases to actually test under post-HR1 rules.

⚠️ HI/AK Gap Period (Known — Tracked in #7446)

From 2025-07-04 to 2025-10-31, code applies HR1 rules to HI/AK residents who had not yet implemented ABAWD. Acknowledged in PR body with follow-up tracked.

ℹ️ Work Registration Exemptions Retroactively Applied to Pre-HR1 Periods

is_snap_work_registration_exempt_non_age (student, UI recipient) is in base_conditions for both pre-HR1 and post-HR1 paths. This is arguably correct (7 CFR 273.24(c)(5) cross-references 273.7(b)(1) pre-HR1), but it's a behavioral change for historical simulations.

ℹ️ Minor Items

  • Test comment in is_snap_abawd_hr1_in_effect.yaml line 1 says 2025-07-01 but effective date is 2025-07-04
  • Test case numbers jump from 25 to 28 (cosmetic)

Confirmed Correct

  • 16 of 17 parameter values verified against source documents
  • All formula logic correctly implements 7 U.S.C. 2015(o)(3)(A)-(G)
  • CA routing via select() is correct
  • Pre-HR1 snapshot date parameters("2025-06-01") is correct
  • All 49 test cases produce correct expected outputs
  • Deleted ca_meets_snap_abawd_work_requirements.py has no dangling references

Unmodeled Items (for reference)

Provision Source Notes
(F)-(G) Native American/Indian exemptions 7 U.S.C. 2015(o)(3)(F)-(G) Requires tribal membership input
Foster care youth exemption (removed by HR1) Pre-amendment (o)(3) Was never modeled; now removed
TANF work requirement cross-exemption 7 CFR 273.7(b)(1)(iii) Requires TANF enrollment input
Drug/alcohol treatment exemption 7 CFR 273.7(b)(1)(vi) Requires treatment program input
UI applicants (applied but not yet received) 7 CFR 273.7(b)(1)(v) Only receipt modeled

@MaxGhenis
Copy link
Contributor

This PR had merge conflicts that couldn't be resolved by rebasing the fork branch directly. I've created #7453 with the same commits rebased on top of the current main branch (from the PolicyEngine org directly). The new PR preserves all of @hua7450's commits and the full PR description.

Closing this in favor of #7453.

@MaxGhenis MaxGhenis closed this Feb 23, 2026
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 HI/AK delayed ABAWD adoption parameters (Nov 2025)

3 participants