Skip to content

Add SNAP work requirements baseline and reform #6139

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 10 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions changelog_entry.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
- bump: minor
changes:
added:
- SNAP work requirements.
- Reconciliation SNAP work requirements reform.
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
description: The Committee on Ways and Means proposed an Able-Bodied Adult Without Dependents (ABAWD) work requirement for the Supplemental Nutrition Assistance Program, which is in effect if this is true.

values:
0000-01-01: false

metadata:
unit: bool
period: year
label: Reconciled ABAWD work requirement for SNAP in effect
reference:
- title: COMMITTEE ON WAYS AND MEANS, THE ONE, BIG, BEAUTIFUL BILL
href: https://agriculture.house.gov/uploadedfiles/ag-recon-combo_03_xml.pdf#page=4
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
description: The Committee on Ways and Means proposed an Able-Bodied Adult Without Dependents (ABAWD) work requirement for the Supplemental Nutrition Assistance Program, which is in effect if this is true.

values:
2022-01-01: false
2030-10-01: true

metadata:
unit: bool
period: year
label: Reconciled ABAWD work requirement for SNAP in effect
reference:
- title: COMMITTEE ON WAYS AND MEANS, THE ONE, BIG, BEAUTIFUL BILL
href: https://agriculture.house.gov/uploadedfiles/ag-recon-combo_03_xml.pdf#page=5
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
# Able-Bodied Adult Without Dependents
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
description: The United States Department of Agriculture considers individuals who do not have any dependent under this age to be Able-Bodied Adult Without Dependents (ABAWD) under the Supplemental Nutrition Assistance Program.
values:
2019-01-01: 18

metadata:
unit: year
period: year
label: USDA SNAP ABAWD dependent age threshold
reference:
- title: 7 CFR § 273.1 - Household concept (b)(iii)
href: https://www.law.cornell.edu/cfr/text/7/273.1#b_iii
- title: SNAP Work Requirements
href: https://www.fns.usda.gov/snap/work-requirements

Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
description: The United States Department of Agriculture exempts applicants who are within these age brackets from the Able-Bodied Adult Without Dependents (ABAWD) work requirements under the Supplemental Nutrition Assistance Program.
metadata:
threshold_unit: year
amount_unit: bool
period: year
type: single_amount
label: USDA SNAP ABAWD work requirements work exempted age threshold
reference:
- title: 7 C.F.R. § 273.24 Time limit for able-bodied adults (c)(1)
href: https://www.law.cornell.edu/cfr/text/7/273.24#c_1
- title: SNAP Work Requirements
href: https://www.fns.usda.gov/snap/work-requirements
brackets:
- threshold:
2019-01-01: 0
amount:
2019-01-01: true
- threshold:
2019-01-01: 18
amount:
2019-01-01: false
- threshold:
2019-01-01: 55
amount:
2019-01-01: true
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
description: The United States Department of Agriculture limits the Supplemental Nutrition Assistance Program to individuals working more than this number of weekly hours from the Able-Bodied Adult Without Dependents (ABAWD) work requirements.

values:
2019-01-01: 20

metadata:
unit: hours
label: USDA SNAP ABAWD work requirements weekly hours threshold
period: week
reference:
- title: 7 C.F.R. § 273.24 Time limit for able-bodied adults (a)(1)(i)
href: https://www.law.cornell.edu/cfr/text/7/273.24#a_1_i
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
description: The United States Department of Agriculture exempts individuals caring for a dependent child under this age from the general work requirements under the Supplemental Nutrition Assistance Program.
values:
2019-01-01: 6

metadata:
unit: year
period: year
label: USDA SNAP general work requirements caring dependent child age threshold
reference:
- title: 7 C.F.R. § 273.7 Work provisions (b)(1)(iv)
href: https://www.law.cornell.edu/cfr/text/7/273.7#b_1_iv
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
description: The United States Department of Agriculture exempts individuals within these age brackets from the general work requirements under the Supplemental Nutrition Assistance Program.
metadata:
threshold_unit: year
amount_unit: bool
period: year
type: single_amount
label: USDA SNAP general work requirements work exempted age threshold
reference:
- title: 7 C.F.R. § 273.7 Work provisions (b)(1)(i)
href: https://www.law.cornell.edu/cfr/text/7/273.7#b_1_i
- title: SNAP Work Requirements
href: https://www.fns.usda.gov/snap/work-requirements
brackets:
- threshold:
2019-01-01: 0
amount:
2019-01-01: true
- threshold:
2019-01-01: 16
amount:
2019-01-01: false
- threshold:
2019-01-01: 60
amount:
2019-01-01: true
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
description: The United States Department of Agriculture limits the Supplemental Nutrition Assistance Program to individuals working more than this number of weekly hours from the general work requirements.

values:
2019-01-01: 30

metadata:
unit: hours
label: USDA SNAP general work requirements weekly hours threshold
period: week
reference:
- title: 7 C.F.R. § 273.7 Work provisions (b)(1)(vii)
href: https://www.law.cornell.edu/cfr/text/7/273.7#b_1_vii
3 changes: 3 additions & 0 deletions policyengine_us/reforms/reconciliation/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,3 +28,6 @@
from .reconciliation_cdcc import (
create_reconciliation_cdcc_reform,
)
from .reconciled_snap_abawd_work_requirement import (
create_reconciled_snap_abawd_work_requirement_reform,
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,129 @@
from policyengine_us.model_api import *
from policyengine_core.periods import period as period_
from policyengine_core.periods import instant


def create_reconciled_snap_abawd_work_requirement() -> Reform:
class meets_snap_abawd_work_requirements(Variable):
value_type = bool
entity = Person
label = "Person is eligible for SNAP benefits via Able-Bodied Adult Without Dependents (ABAWD) work requirements"
definition_period = MONTH
reference = "https://agriculture.house.gov/uploadedfiles/ag-recon-combo_03_xml.pdf#page=4"

def formula(person, period, parameters):
p = parameters(period).gov.usda.snap.work_requirements.abawd
age = person("monthly_age", period)
weekly_hours_worked = person(
"weekly_hours_worked", period.this_year
)
# Work at least 20 hours a week
is_working = weekly_hours_worked >= p.weekly_hours_threshold
# Under 18 or 65 years of age or older are exempted (baseline is 18 or 65) (A)
worked_exempted_age = p.age_threshold.exempted.calc(age)
# Unable to work due to a physical or mental limitation (B)
is_disabled = person("is_disabled", period)
# Parent of a household member under 7 (baseline is 18) (C)
is_dependent = person("is_tax_unit_dependent", period)
is_child = age < p.age_threshold.dependent
is_parent = person("is_parent", period)
has_child = person.spm_unit.any(is_dependent & is_child)
exempted_parent = is_parent & has_child
# Exempted from the general work requirements (D)
meets_snap_general_work_requirements = person(
"meets_snap_general_work_requirements", period
)
# Pregnant (E)
is_pregnant = person("is_pregnant", period)
# Homeless (remove in 2030) (F)
is_homeless = person.household("is_homeless", period)
# A veteran (remove in 2030) (G)
is_veteran = person("is_veteran", period)
# Responsible for a child above 7 and is married to individual who is working (I)
child_above_7 = age >= p.age_threshold.dependent
is_married = person.family("is_married", period)
has_child_above_7 = person.spm_unit.any(
is_dependent & child_above_7
)
is_head_or_spouse = person("is_tax_unit_head_or_spouse", period)
has_head_or_spouse_working = person.spm_unit.any(
is_head_or_spouse & is_working
)
exempted_married_person = where(
is_married & has_child_above_7, has_head_or_spouse_working, 0
)
# Sunset provision effects on 2030-10-01
p_reform = parameters(
period
).gov.contrib.reconciliation.snap_abawd_work_requirement
if p_reform.sunset_provision_in_effect:
return (
is_working
| worked_exempted_age
| is_disabled
| exempted_parent
| meets_snap_general_work_requirements
| is_pregnant
| exempted_married_person
)
return (
is_working
| worked_exempted_age
| is_disabled
| exempted_parent
| meets_snap_general_work_requirements
| is_pregnant
| is_homeless
| is_veteran
| exempted_married_person
)

def modify_parameters(parameters):
parameters.gov.usda.snap.work_requirements.abawd.age_threshold.dependent.update(
start=instant("2027-01-01"), stop=instant("2035-12-31"), value=7
)
parameters.gov.usda.snap.work_requirements.abawd.age_threshold.exempted[
2
].threshold.update(
start=instant("2027-01-01"),
stop=instant("2035-12-31"),
value=65,
)
return parameters

class reform(Reform):
def apply(self):
self.update_variable(meets_snap_abawd_work_requirements)
self.modify_parameters(modify_parameters)

return reform


def create_reconciled_snap_abawd_work_requirement_reform(
parameters, period, bypass: bool = False
):
if bypass:
return create_reconciled_snap_abawd_work_requirement()

p = parameters.gov.contrib.reconciliation.snap_abawd_work_requirement

reform_active = False
current_period = period_(period)

for i in range(5):
if p(current_period).in_effect:
reform_active = True
break
current_period = current_period.offset(1, "year")

if reform_active:
return create_reconciled_snap_abawd_work_requirement()
else:
return None


reconciled_snap_abawd_work_requirement = (
create_reconciled_snap_abawd_work_requirement_reform(
None, None, bypass=True
)
)
8 changes: 8 additions & 0 deletions policyengine_us/reforms/reforms.py
Original file line number Diff line number Diff line change
Expand Up @@ -106,6 +106,7 @@
create_aca_ptc_immigration_status_reform,
create_reconciliation_qbid_with_floor_reform,
create_reconciliation_cdcc_reform,
create_reconciled_snap_abawd_work_requirement_reform,
)
from .additional_tax_bracket import (
create_additional_tax_bracket_reform,
Expand Down Expand Up @@ -258,6 +259,12 @@ def create_structural_reforms_from_parameters(parameters, period):
parameters, period
)

reconciled_snap_abawd_work_requirement = (
create_reconciled_snap_abawd_work_requirement_reform(
parameters, period
)
)

reforms = [
afa_reform,
winship_reform,
Expand Down Expand Up @@ -311,6 +318,7 @@ def create_structural_reforms_from_parameters(parameters, period):
ctc_additional_bracket,
reconciliation_cdcc,
additional_tax_bracket,
reconciled_snap_abawd_work_requirement,
]
reforms = tuple(filter(lambda x: x is not None, reforms))

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
- name: Case 1, age 17, exempted from the general work requirements.
period: 2022
input:
age: 17
weekly_hours_worked: 1
is_disabled: false
output:
meets_snap_abawd_work_requirements: true

- name: Case 2, age 55, exempted from the general work requirements.
period: 2022
input:
age: 55
weekly_hours_worked: 1
is_disabled: false
output:
meets_snap_abawd_work_requirements: true

- name: Case 3, age 18, not exempted from the general work requirements.
period: 2022
input:
age: 18
weekly_hours_worked: 1
is_disabled: false
output:
meets_snap_abawd_work_requirements: false

- name: Case 4, age 30, but disabled.
period: 2022
input:
age: 39
weekly_hours_worked: 1
is_disabled: true
output:
meets_snap_abawd_work_requirements: true

- name: Case 5, age 30, working 19 hours per week.
period: 2022
input:
age: 30
weekly_hours_worked: 19
is_disabled: false
output:
meets_snap_abawd_work_requirements: false

- name: Case 6, age 30, working 20 hours per week.
period: 2022
input:
age: 30
weekly_hours_worked: 20
is_disabled: false
output:
meets_snap_abawd_work_requirements: true

- name: Case 7, age 30, homeless.
period: 2022
input:
age: 30
weekly_hours_worked: 1
is_disabled: false
is_homeless: true
output:
meets_snap_abawd_work_requirements: true

- name: Case 8, integration test.
period: 2022
input:
people:
person1:
age: 30
weekly_hours_worked: 19
person2:
age: 30
weekly_hours_worked: 20
is_pregnant: true
spm_units:
spm_unit:
members: [person1, person2]
tax_units:
tax_unit:
members: [person1, person2]
households:
household:
members: [person1, person2]
output:
meets_snap_abawd_work_requirements: [false, true]
Loading
Loading