Skip to content
Merged
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
1 change: 1 addition & 0 deletions changelog.d/hub-pb-snap-heat-eat-1009.fixed.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Restrict SNAP heat-and-eat standard utility allowances to households with an elderly or disabled SNAP member under P.L. 119-21, while preserving eligibility based on actual heating or cooling expenses.
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
description: The Department of Agriculture requires an elderly or disabled SNAP household member for heating and cooling standard utility allowance eligibility based on energy assistance under the Supplemental Nutrition Assistance Program.

# Section 10103 took effect upon enactment on July 4, 2025. Monthly SNAP
# formulas evaluate policy at month start, so August 2025 is the first full
# affected model month. Individual certification/recertification dates and
# state administrative implementation dates are not modeled here.
values:
0000-01-01: false
2025-07-04: true

metadata:
unit: bool
period: month
label: SNAP heat-and-eat SUA elderly or disabled requirement
reference:
- title: 7 U.S.C. 2014(e)(6)(C)(iv)(I) - Availability of allowance to recipients of energy assistance
href: https://www.law.cornell.edu/uscode/text/7/2014#e_6_C_iv_I
- title: Public Law 119-21, Section 10103(a) - Standard Utility Allowance
href: https://www.govinfo.gov/content/pkg/PLAW-119publ21/html/PLAW-119publ21.htm
17 changes: 17 additions & 0 deletions policyengine_us/tests/core/test_snap_heat_and_eat.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
"""Check the legal-day boundary that monthly policy YAML cannot express."""

from pathlib import Path

from policyengine_core.parameters import load_parameter_file


def test_heat_and_eat_requirement_takes_effect_on_enactment_date():
requirement = load_parameter_file(
str(
Path(__file__).resolve().parents[2]
/ "parameters/gov/usda/snap/income/deductions/utility"
/ "heat_and_eat_requires_elderly_disabled.yaml"
)
)
assert requirement("2025-07-03") is False
assert requirement("2025-07-04") is True
Original file line number Diff line number Diff line change
Expand Up @@ -130,15 +130,18 @@
snap_earned_income: 1_333.33
snap_earned_income_deduction: 266.67
snap_standard_deduction: 209
# Massachusetts standard utility allowance $914 - 50% of the $857.67
# net income before the shelter deduction ($428.83) = $485.17.
snap_utility_allowance: 914
snap_excess_shelter_expense_deduction: 485.17
# $857.67 - $485.17 = $372.50, rounded to $373.
snap_net_income: 373
# 30% of $373 = $111.90, rounded up to $112; $546 - $112 = $434.
snap_expected_contribution: 112
snap: 434
# No utility costs or elderly/disabled member: no actual-cost SUA or
# Massachusetts H-EAT SUA under P.L. 119-21 section 10103(a).
# https://www.govinfo.gov/content/pkg/PLAW-119publ21/html/PLAW-119publ21.htm
# https://dtapolicyguide.qa.eohhs.mass.gov/SNAP/ExpensesDeductions/HEAT.htm
snap_utility_allowance: 0
# No housing costs or SUA, so there is no excess shelter deduction.
snap_excess_shelter_expense_deduction: 0
# $1,333.33 - $266.67 - $209 = $857.67, rounded to $858.
snap_net_income: 858
# 30% of $858 = $257.40, rounded up to $258; $546 - $258 = $288.
snap_expected_contribution: 258
snap: 288

- name: Case 4, LPR earner inside the waiting period is prorated under both tests in a hybrid gross-test state.
period: 2026-01
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,122 @@
# PolicyBench snapshot facts and takeup defaults. Leaf input aliases mirror
# the US Simulation adapter, which Core's YAML SimulationBuilder bypasses.
- name: Case 1, PolicyBench scenario_080 PA household receives SNAP without the heat-and-eat SUA.
period: 2026
absolute_error_margin: 0.01
input:
people:
person1:
age: 41
employment_income_before_lsr: 0
bank_account_assets: 19_827.646484375
financial_assistance: 3_600
is_disabled: true
is_tax_unit_head: true
is_tax_unit_spouse: false
long_term_capital_gains_before_response: 924
other_medical_expenses: 12
over_the_counter_health_expenses: 100
qualified_dividend_income: 16
takes_up_medicaid_if_eligible: true
takes_up_ssi_if_eligible: true
marital_units:
marital_unit_1:
members: [person1]
tax_units:
tax_unit:
members: [person1]
first_home_mortgage_balance: 93_000
takes_up_aca_if_eligible: true
takes_up_dc_ptc: true
takes_up_eitc: true
would_file_if_eligible_for_refundable_credit: true
would_file_taxes_voluntarily: true
spm_units:
spm_unit:
members: [person1]
spm_unit_energy_subsidy: 2_000
takes_up_snap_if_eligible: true
families:
family:
members: [person1]
households:
household:
members: [person1]
state_code: PA
household_vehicles_value: 3_570
output:
snap: 3_270

- name: Case 2, PolicyBench scenario_100 MT household receives SNAP without the heat-and-eat SUA.
period: 2026
absolute_error_margin: 0.01
input:
people:
person1:
age: 46
employment_income_before_lsr: 5_914.720703125
bank_account_assets: 2_800
employer_sponsored_insurance_premiums: 20_643.525390625
fsla_overtime_premium: 709.7664794921875
has_esi: true
health_insurance_premiums_without_medicare_part_b: 564
hourly_wage: 2.319999933242798
hours_worked_last_week: 55
is_disabled: true
is_tax_unit_head: true
is_tax_unit_spouse: false
other_health_insurance_premiums: 564
other_medical_expenses: 500
over_the_counter_health_expenses: 480
roth_401k_contributions_desired: 681
roth_ira_contributions_desired: 279.67999267578125
traditional_401k_contributions_desired: 3_859
traditional_ira_contributions_desired: 180.32000732421875
weekly_hours_worked_before_lsr: 55
takes_up_medicaid_if_eligible: true
takes_up_ssi_if_eligible: true
person2:
age: 6
employment_income_before_lsr: 0
has_esi: true
is_tax_unit_head: false
is_tax_unit_spouse: false
takes_up_medicaid_if_eligible: true
takes_up_ssi_if_eligible: true
person3:
age: 5
employment_income_before_lsr: 0
is_tax_unit_head: false
is_tax_unit_spouse: false
other_medical_expenses: 500
takes_up_medicaid_if_eligible: true
takes_up_ssi_if_eligible: true
marital_units:
marital_unit_1:
members: [person1]
marital_unit_2:
members: [person2]
marital_unit_3:
members: [person3]
tax_units:
tax_unit:
members: [person1, person2, person3]
takes_up_aca_if_eligible: true
takes_up_dc_ptc: true
takes_up_eitc: true
would_file_if_eligible_for_refundable_credit: true
would_file_taxes_voluntarily: true
spm_units:
spm_unit:
members: [person1, person2, person3]
takes_up_snap_if_eligible: true
families:
family:
members: [person1, person2, person3]
households:
household:
members: [person1, person2, person3]
state_code: MT
household_vehicles_value: 1_980.88232421875
output:
snap: 7_002
Loading
Loading