From 51a820ec4f12ad6e695668f1e5e9f6af893f1677 Mon Sep 17 00:00:00 2001 From: Ziming Date: Mon, 2 Feb 2026 12:18:11 -0500 Subject: [PATCH 1/6] Add SNAP immigration status eligibility - Add eligible_immigration_statuses parameter with pre/post OBBBA values - Add is_snap_immigration_status_eligible variable - Update is_snap_eligible to check immigration status - Add tests for immigration eligibility Closes #1475 Co-Authored-By: Claude Opus 4.5 --- changelog_entry.yaml | 4 + .../eligible_immigration_statuses.yaml | 28 ++++ .../is_snap_immigration_status_eligible.yaml | 132 ++++++++++++++++++ .../usda/snap/eligibility/is_snap_eligible.py | 4 + .../is_snap_immigration_status_eligible.py | 20 +++ 5 files changed, 188 insertions(+) create mode 100644 policyengine_us/parameters/gov/usda/snap/eligibility/eligible_immigration_statuses.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/usda/snap/eligibility/immigration/is_snap_immigration_status_eligible.yaml create mode 100644 policyengine_us/variables/gov/usda/snap/eligibility/is_snap_immigration_status_eligible.py diff --git a/changelog_entry.yaml b/changelog_entry.yaml index e69de29bb2d..ed753b4a6d5 100644 --- a/changelog_entry.yaml +++ b/changelog_entry.yaml @@ -0,0 +1,4 @@ +- bump: minor + changes: + added: + - Add SNAP immigration status eligibility, reflecting changes from the One Big Beautiful Bill Act of 2025. diff --git a/policyengine_us/parameters/gov/usda/snap/eligibility/eligible_immigration_statuses.yaml b/policyengine_us/parameters/gov/usda/snap/eligibility/eligible_immigration_statuses.yaml new file mode 100644 index 00000000000..a47a688b757 --- /dev/null +++ b/policyengine_us/parameters/gov/usda/snap/eligibility/eligible_immigration_statuses.yaml @@ -0,0 +1,28 @@ +description: The Department of Agriculture limits Supplemental Nutrition Assistance Program eligibility to these immigration statuses. +values: + 2018-01-01: + - CITIZEN + - LEGAL_PERMANENT_RESIDENT + - REFUGEE + - ASYLEE + - DEPORTATION_WITHHELD + - CUBAN_HAITIAN_ENTRANT + - CONDITIONAL_ENTRANT + - PAROLED_ONE_YEAR + + 2025-07-04: + - CITIZEN + - LEGAL_PERMANENT_RESIDENT + - CUBAN_HAITIAN_ENTRANT + +metadata: + label: SNAP eligible immigration statuses + period: year + unit: list + reference: + - title: 7 USC 2015(f) - Eligibility disqualifications + href: https://www.law.cornell.edu/uscode/text/7/2015#f + - title: 8 USC 1612 - Limited eligibility of qualified aliens for certain Federal programs + href: https://www.law.cornell.edu/uscode/text/8/1612 + - title: USDA FNS - SNAP Implementation of OBBB - Alien SNAP Eligibility + href: https://www.fns.usda.gov/snap/obbb-alien-eligibility diff --git a/policyengine_us/tests/policy/baseline/gov/usda/snap/eligibility/immigration/is_snap_immigration_status_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/usda/snap/eligibility/immigration/is_snap_immigration_status_eligible.yaml new file mode 100644 index 00000000000..d65b0f3cea7 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/usda/snap/eligibility/immigration/is_snap_immigration_status_eligible.yaml @@ -0,0 +1,132 @@ +- name: Case 1, citizen always eligible. + period: 2024 + input: + immigration_status: CITIZEN + output: + is_snap_immigration_status_eligible: true + +- name: Case 2, legal permanent resident always eligible. + period: 2024 + input: + immigration_status: LEGAL_PERMANENT_RESIDENT + output: + is_snap_immigration_status_eligible: true + +- name: Case 3, refugee eligible pre-OBBBA. + period: 2024 + input: + immigration_status: REFUGEE + output: + is_snap_immigration_status_eligible: true + +- name: Case 4, asylee eligible pre-OBBBA. + period: 2024 + input: + immigration_status: ASYLEE + output: + is_snap_immigration_status_eligible: true + +- name: Case 5, cuban haitian entrant always eligible. + period: 2024 + input: + immigration_status: CUBAN_HAITIAN_ENTRANT + output: + is_snap_immigration_status_eligible: true + +- name: Case 6, deportation withheld eligible pre-OBBBA. + period: 2024 + input: + immigration_status: DEPORTATION_WITHHELD + output: + is_snap_immigration_status_eligible: true + +- name: Case 7, conditional entrant eligible pre-OBBBA. + period: 2024 + input: + immigration_status: CONDITIONAL_ENTRANT + output: + is_snap_immigration_status_eligible: true + +- name: Case 8, paroled one year eligible pre-OBBBA. + period: 2024 + input: + immigration_status: PAROLED_ONE_YEAR + output: + is_snap_immigration_status_eligible: true + +- name: Case 9, undocumented never eligible. + period: 2024 + input: + immigration_status: UNDOCUMENTED + output: + is_snap_immigration_status_eligible: false + +- name: Case 10, DACA never eligible. + period: 2024 + input: + immigration_status: DACA + output: + is_snap_immigration_status_eligible: false + +- name: Case 11, TPS never eligible. + period: 2024 + input: + immigration_status: TPS + output: + is_snap_immigration_status_eligible: false + +- name: Case 12, refugee ineligible post-OBBBA. + period: 2026 + input: + immigration_status: REFUGEE + output: + is_snap_immigration_status_eligible: false + +- name: Case 13, asylee ineligible post-OBBBA. + period: 2026 + input: + immigration_status: ASYLEE + output: + is_snap_immigration_status_eligible: false + +- name: Case 14, deportation withheld ineligible post-OBBBA. + period: 2026 + input: + immigration_status: DEPORTATION_WITHHELD + output: + is_snap_immigration_status_eligible: false + +- name: Case 15, conditional entrant ineligible post-OBBBA. + period: 2026 + input: + immigration_status: CONDITIONAL_ENTRANT + output: + is_snap_immigration_status_eligible: false + +- name: Case 16, paroled one year ineligible post-OBBBA. + period: 2026 + input: + immigration_status: PAROLED_ONE_YEAR + output: + is_snap_immigration_status_eligible: false + +- name: Case 17, citizen still eligible post-OBBBA. + period: 2026 + input: + immigration_status: CITIZEN + output: + is_snap_immigration_status_eligible: true + +- name: Case 18, LPR still eligible post-OBBBA. + period: 2026 + input: + immigration_status: LEGAL_PERMANENT_RESIDENT + output: + is_snap_immigration_status_eligible: true + +- name: Case 19, cuban haitian entrant still eligible post-OBBBA. + period: 2026 + input: + immigration_status: CUBAN_HAITIAN_ENTRANT + output: + is_snap_immigration_status_eligible: true diff --git a/policyengine_us/variables/gov/usda/snap/eligibility/is_snap_eligible.py b/policyengine_us/variables/gov/usda/snap/eligibility/is_snap_eligible.py index c8f4efedc34..3d1ad77b865 100644 --- a/policyengine_us/variables/gov/usda/snap/eligibility/is_snap_eligible.py +++ b/policyengine_us/variables/gov/usda/snap/eligibility/is_snap_eligible.py @@ -28,8 +28,12 @@ def formula(spm_unit, period, parameters): work_requirements_eligibility = spm_unit( "meets_snap_work_requirements", period ) + immigration_eligible_member_present = spm_unit.any( + person("is_snap_immigration_status_eligible", period) + ) return ( (normal_eligibility | categorical_eligibility) & eligible_person_present & work_requirements_eligibility + & immigration_eligible_member_present ) diff --git a/policyengine_us/variables/gov/usda/snap/eligibility/is_snap_immigration_status_eligible.py b/policyengine_us/variables/gov/usda/snap/eligibility/is_snap_immigration_status_eligible.py new file mode 100644 index 00000000000..bb161f39c74 --- /dev/null +++ b/policyengine_us/variables/gov/usda/snap/eligibility/is_snap_immigration_status_eligible.py @@ -0,0 +1,20 @@ +from policyengine_us.model_api import * + + +class is_snap_immigration_status_eligible(Variable): + value_type = bool + entity = Person + label = "Person is eligible for SNAP due to immigration status" + definition_period = YEAR + reference = ( + "https://www.law.cornell.edu/uscode/text/7/2015#f", + "https://www.law.cornell.edu/uscode/text/8/1612", + "https://www.fns.usda.gov/snap/obbb-alien-eligibility", + ) + + def formula(person, period, parameters): + p = parameters(period).gov.usda.snap.eligibility + immigration_status = person("immigration_status", period) + immigration_status_str = immigration_status.decode_to_str() + + return np.isin(immigration_status_str, p.eligible_immigration_statuses) From f58a2f2b19a476b656c23853d56d04bb767ac309 Mon Sep 17 00:00:00 2001 From: Ziming Date: Fri, 6 Feb 2026 10:25:43 -0500 Subject: [PATCH 2/6] Add SNAP immigration status eligibility with CA delayed implementation - Exclude immigration-ineligible members from snap_unit_size (using OR to avoid double-counting with ineligible students) - Add California-specific delayed effective date (April 1, 2026) per ACL 25-92 - Rename snap_unit.py to snap_unit_size.py to match variable name Co-Authored-By: Claude Opus 4.6 --- changelog_entry.yaml | 2 + .../eligible_immigration_statuses.yaml | 26 +++ .../eligible_immigration_statuses.yaml | 4 +- .../ca_snap_immigration_status_eligible.yaml | 111 ++++++++++++ .../is_snap_immigration_status_eligible.yaml | 154 ++++++++--------- .../snap/eligibility/is_snap_eligible.yaml | 18 ++ .../baseline/gov/usda/snap/snap_unit.yaml | 50 ------ .../gov/usda/snap/snap_unit_size.yaml | 162 ++++++++++++++++++ .../ca_snap_immigration_status_eligible.py | 23 +++ .../is_snap_immigration_status_eligible.py | 10 +- .../snap/{snap_unit.py => snap_unit_size.py} | 10 +- 11 files changed, 428 insertions(+), 142 deletions(-) create mode 100644 policyengine_us/parameters/gov/states/ca/cdss/snap/eligibility/eligible_immigration_statuses.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/ca/cdss/snap/eligibility/ca_snap_immigration_status_eligible.yaml delete mode 100644 policyengine_us/tests/policy/baseline/gov/usda/snap/snap_unit.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/usda/snap/snap_unit_size.yaml create mode 100644 policyengine_us/variables/gov/states/ca/cdss/snap/eligibility/ca_snap_immigration_status_eligible.py rename policyengine_us/variables/gov/usda/snap/{snap_unit.py => snap_unit_size.py} (50%) diff --git a/changelog_entry.yaml b/changelog_entry.yaml index ed753b4a6d5..91b689ea2fe 100644 --- a/changelog_entry.yaml +++ b/changelog_entry.yaml @@ -2,3 +2,5 @@ changes: added: - Add SNAP immigration status eligibility, reflecting changes from the One Big Beautiful Bill Act of 2025. + - Exclude immigration-ineligible members from SNAP unit size. + - Add California-specific delayed effective date (April 1, 2026) for SNAP immigration eligibility changes per ACL 25-92. diff --git a/policyengine_us/parameters/gov/states/ca/cdss/snap/eligibility/eligible_immigration_statuses.yaml b/policyengine_us/parameters/gov/states/ca/cdss/snap/eligibility/eligible_immigration_statuses.yaml new file mode 100644 index 00000000000..73e21945e25 --- /dev/null +++ b/policyengine_us/parameters/gov/states/ca/cdss/snap/eligibility/eligible_immigration_statuses.yaml @@ -0,0 +1,26 @@ +description: California limits Supplemental Nutrition Assistance Program eligibility to these immigration statuses. +values: + 2018-01-01: + - CITIZEN + - LEGAL_PERMANENT_RESIDENT + - REFUGEE + - ASYLEE + - DEPORTATION_WITHHELD + - CUBAN_HAITIAN_ENTRANT + - CONDITIONAL_ENTRANT + - PAROLED_ONE_YEAR + + 2026-04-01: + - CITIZEN + - LEGAL_PERMANENT_RESIDENT + - CUBAN_HAITIAN_ENTRANT + +metadata: + label: California SNAP eligible immigration statuses + period: year + unit: list + reference: + - title: California CDSS All County Letter No. 25-92 - CalFresh Implementation of H.R. 1 Noncitizen Eligibility Changes + href: https://www.cdss.ca.gov/Portals/9/Additional-Resources/Letters-and-Notices/ACLs/2025/25-92.pdf#page=7 + - title: 7 USC 2015(f) - Eligibility disqualifications + href: https://www.law.cornell.edu/uscode/text/7/2015#f diff --git a/policyengine_us/parameters/gov/usda/snap/eligibility/eligible_immigration_statuses.yaml b/policyengine_us/parameters/gov/usda/snap/eligibility/eligible_immigration_statuses.yaml index a47a688b757..626fee9b30e 100644 --- a/policyengine_us/parameters/gov/usda/snap/eligibility/eligible_immigration_statuses.yaml +++ b/policyengine_us/parameters/gov/usda/snap/eligibility/eligible_immigration_statuses.yaml @@ -10,11 +10,11 @@ values: - CONDITIONAL_ENTRANT - PAROLED_ONE_YEAR - 2025-07-04: + 2025-07-01: # Real effective date July 4th. - CITIZEN - LEGAL_PERMANENT_RESIDENT - CUBAN_HAITIAN_ENTRANT - + # Compacts of Free Association (COFA) citizens metadata: label: SNAP eligible immigration statuses period: year diff --git a/policyengine_us/tests/policy/baseline/gov/states/ca/cdss/snap/eligibility/ca_snap_immigration_status_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/ca/cdss/snap/eligibility/ca_snap_immigration_status_eligible.yaml new file mode 100644 index 00000000000..a0b7a12ff56 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/ca/cdss/snap/eligibility/ca_snap_immigration_status_eligible.yaml @@ -0,0 +1,111 @@ +- name: Case 1, CA citizen always eligible. + period: 2024 + absolute_error_margin: 0.1 + input: + people: + person1: + immigration_status: CITIZEN + households: + household1: + members: [person1] + state_code: CA + output: + ca_snap_immigration_status_eligible: true + +- name: Case 2, CA refugee eligible pre-OBBBA. + period: 2024 + absolute_error_margin: 0.1 + input: + people: + person1: + immigration_status: REFUGEE + households: + household1: + members: [person1] + state_code: CA + output: + ca_snap_immigration_status_eligible: true + +- name: Case 3, CA refugee still eligible in 2025 due to delayed implementation. + period: 2025 + absolute_error_margin: 0.1 + input: + people: + person1: + immigration_status: REFUGEE + households: + household1: + members: [person1] + state_code: CA + output: + ca_snap_immigration_status_eligible: true + +- name: Case 4, CA refugee ineligible after April 2026. + period: 2027 + absolute_error_margin: 0.1 + input: + people: + person1: + immigration_status: REFUGEE + households: + household1: + members: [person1] + state_code: CA + output: + ca_snap_immigration_status_eligible: false + +- name: Case 5, CA asylee still eligible in 2025. + period: 2025 + absolute_error_margin: 0.1 + input: + people: + person1: + immigration_status: ASYLEE + households: + household1: + members: [person1] + state_code: CA + output: + ca_snap_immigration_status_eligible: true + +- name: Case 6, CA asylee ineligible after April 2026. + period: 2027 + absolute_error_margin: 0.1 + input: + people: + person1: + immigration_status: ASYLEE + households: + household1: + members: [person1] + state_code: CA + output: + ca_snap_immigration_status_eligible: false + +- name: Case 7, CA LPR always eligible. + period: 2026 + absolute_error_margin: 0.1 + input: + people: + person1: + immigration_status: LEGAL_PERMANENT_RESIDENT + households: + household1: + members: [person1] + state_code: CA + output: + ca_snap_immigration_status_eligible: true + +- name: Case 8, CA undocumented never eligible. + period: 2024 + absolute_error_margin: 0.1 + input: + people: + person1: + immigration_status: UNDOCUMENTED + households: + household1: + members: [person1] + state_code: CA + output: + ca_snap_immigration_status_eligible: false diff --git a/policyengine_us/tests/policy/baseline/gov/usda/snap/eligibility/immigration/is_snap_immigration_status_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/usda/snap/eligibility/immigration/is_snap_immigration_status_eligible.yaml index d65b0f3cea7..897abcb6325 100644 --- a/policyengine_us/tests/policy/baseline/gov/usda/snap/eligibility/immigration/is_snap_immigration_status_eligible.yaml +++ b/policyengine_us/tests/policy/baseline/gov/usda/snap/eligibility/immigration/is_snap_immigration_status_eligible.yaml @@ -5,128 +5,114 @@ output: is_snap_immigration_status_eligible: true -- name: Case 2, legal permanent resident always eligible. - period: 2024 - input: - immigration_status: LEGAL_PERMANENT_RESIDENT - output: - is_snap_immigration_status_eligible: true - -- name: Case 3, refugee eligible pre-OBBBA. +- name: Case 2, refugee eligible pre-OBBBA. period: 2024 input: immigration_status: REFUGEE output: is_snap_immigration_status_eligible: true -- name: Case 4, asylee eligible pre-OBBBA. - period: 2024 - input: - immigration_status: ASYLEE - output: - is_snap_immigration_status_eligible: true - -- name: Case 5, cuban haitian entrant always eligible. - period: 2024 - input: - immigration_status: CUBAN_HAITIAN_ENTRANT - output: - is_snap_immigration_status_eligible: true - -- name: Case 6, deportation withheld eligible pre-OBBBA. - period: 2024 - input: - immigration_status: DEPORTATION_WITHHELD - output: - is_snap_immigration_status_eligible: true - -- name: Case 7, conditional entrant eligible pre-OBBBA. - period: 2024 - input: - immigration_status: CONDITIONAL_ENTRANT - output: - is_snap_immigration_status_eligible: true - -- name: Case 8, paroled one year eligible pre-OBBBA. - period: 2024 - input: - immigration_status: PAROLED_ONE_YEAR - output: - is_snap_immigration_status_eligible: true - -- name: Case 9, undocumented never eligible. +- name: Case 3, undocumented never eligible. period: 2024 input: immigration_status: UNDOCUMENTED output: is_snap_immigration_status_eligible: false -- name: Case 10, DACA never eligible. - period: 2024 - input: - immigration_status: DACA - output: - is_snap_immigration_status_eligible: false - -- name: Case 11, TPS never eligible. - period: 2024 - input: - immigration_status: TPS - output: - is_snap_immigration_status_eligible: false - -- name: Case 12, refugee ineligible post-OBBBA. +- name: Case 4, refugee ineligible post-OBBBA federal date. period: 2026 + absolute_error_margin: 0.1 input: - immigration_status: REFUGEE + people: + person1: + immigration_status: REFUGEE + households: + household1: + members: [person1] + state_code: TX output: is_snap_immigration_status_eligible: false -- name: Case 13, asylee ineligible post-OBBBA. +- name: Case 5, asylee ineligible post-OBBBA federal date. period: 2026 + absolute_error_margin: 0.1 input: - immigration_status: ASYLEE + people: + person1: + immigration_status: ASYLEE + households: + household1: + members: [person1] + state_code: TX output: is_snap_immigration_status_eligible: false -- name: Case 14, deportation withheld ineligible post-OBBBA. +- name: Case 6, citizen still eligible post-OBBBA. period: 2026 + absolute_error_margin: 0.1 input: - immigration_status: DEPORTATION_WITHHELD + people: + person1: + immigration_status: CITIZEN + households: + household1: + members: [person1] + state_code: TX output: - is_snap_immigration_status_eligible: false - -- name: Case 15, conditional entrant ineligible post-OBBBA. - period: 2026 - input: - immigration_status: CONDITIONAL_ENTRANT - output: - is_snap_immigration_status_eligible: false + is_snap_immigration_status_eligible: true -- name: Case 16, paroled one year ineligible post-OBBBA. +- name: Case 7, LPR still eligible post-OBBBA. period: 2026 + absolute_error_margin: 0.1 input: - immigration_status: PAROLED_ONE_YEAR + people: + person1: + immigration_status: LEGAL_PERMANENT_RESIDENT + households: + household1: + members: [person1] + state_code: TX output: - is_snap_immigration_status_eligible: false + is_snap_immigration_status_eligible: true -- name: Case 17, citizen still eligible post-OBBBA. - period: 2026 +- name: Case 8, CA refugee still eligible in 2025 due to delayed implementation. + period: 2025 + absolute_error_margin: 0.1 input: - immigration_status: CITIZEN + people: + person1: + immigration_status: REFUGEE + households: + household1: + members: [person1] + state_code: CA output: is_snap_immigration_status_eligible: true -- name: Case 18, LPR still eligible post-OBBBA. +- name: Case 9, CA refugee still eligible in 2026 due to delayed implementation. period: 2026 + absolute_error_margin: 0.1 input: - immigration_status: LEGAL_PERMANENT_RESIDENT + people: + person1: + immigration_status: REFUGEE + households: + household1: + members: [person1] + state_code: CA output: is_snap_immigration_status_eligible: true -- name: Case 19, cuban haitian entrant still eligible post-OBBBA. - period: 2026 +- name: Case 10, CA refugee ineligible in 2027. + period: 2027 + absolute_error_margin: 0.1 input: - immigration_status: CUBAN_HAITIAN_ENTRANT + people: + person1: + immigration_status: REFUGEE + households: + household1: + members: [person1] + state_code: CA output: - is_snap_immigration_status_eligible: true + is_snap_immigration_status_eligible: false diff --git a/policyengine_us/tests/policy/baseline/gov/usda/snap/eligibility/is_snap_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/usda/snap/eligibility/is_snap_eligible.yaml index 6699ea6fb28..d13d7f7e2ae 100644 --- a/policyengine_us/tests/policy/baseline/gov/usda/snap/eligibility/is_snap_eligible.yaml +++ b/policyengine_us/tests/policy/baseline/gov/usda/snap/eligibility/is_snap_eligible.yaml @@ -99,3 +99,21 @@ meets_snap_categorical_eligibility: false output: is_snap_eligible: true + +- name: Case 8, single undocumented ineligible student. + period: 2024-01 + absolute_error_margin: 0.1 + input: + people: + person1: + immigration_status: UNDOCUMENTED + is_snap_ineligible_student: true + spm_units: + spm_unit1: + members: [person1] + meets_snap_gross_income_test: true + meets_snap_net_income_test: true + meets_snap_asset_test: true + meets_snap_categorical_eligibility: false + output: + is_snap_eligible: false diff --git a/policyengine_us/tests/policy/baseline/gov/usda/snap/snap_unit.yaml b/policyengine_us/tests/policy/baseline/gov/usda/snap/snap_unit.yaml deleted file mode 100644 index d93b2db0c7c..00000000000 --- a/policyengine_us/tests/policy/baseline/gov/usda/snap/snap_unit.yaml +++ /dev/null @@ -1,50 +0,0 @@ -- name: Household with one ineligible studnet - period: 2022 - input: - people: - person1: - is_snap_ineligible_student: false - person2: - is_snap_ineligible_student: false - person3: - is_snap_ineligible_student: true - spm_units: - spm_unit1: - members: [person1, person2, person3] - spm_unit_size: 3 - output: - snap_unit_size: 2 - -- name: Everybody eligible - period: 2022 - input: - people: - person1: - is_snap_ineligible_student: false - person2: - is_snap_ineligible_student: false - person3: - is_snap_ineligible_student: false - spm_units: - spm_unit1: - members: [person1, person2, person3] - spm_unit_size: 3 - output: - snap_unit_size: 3 - -- name: No eligible people - period: 2022 - input: - people: - person1: - is_snap_ineligible_student: true - person2: - is_snap_ineligible_student: true - person3: - is_snap_ineligible_student: true - spm_units: - spm_unit1: - members: [person1, person2, person3] - spm_unit_size: 3 - output: - snap_unit_size: 0 diff --git a/policyengine_us/tests/policy/baseline/gov/usda/snap/snap_unit_size.yaml b/policyengine_us/tests/policy/baseline/gov/usda/snap/snap_unit_size.yaml new file mode 100644 index 00000000000..8ae05db6bc2 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/usda/snap/snap_unit_size.yaml @@ -0,0 +1,162 @@ +- name: Household with one ineligible student + period: 2022 + input: + people: + person1: + is_snap_ineligible_student: false + person2: + is_snap_ineligible_student: false + person3: + is_snap_ineligible_student: true + spm_units: + spm_unit1: + members: [person1, person2, person3] + spm_unit_size: 3 + output: + snap_unit_size: 2 + +- name: Everybody eligible + period: 2022 + input: + people: + person1: + is_snap_ineligible_student: false + person2: + is_snap_ineligible_student: false + person3: + is_snap_ineligible_student: false + spm_units: + spm_unit1: + members: [person1, person2, person3] + spm_unit_size: 3 + output: + snap_unit_size: 3 + +- name: No eligible people + period: 2022 + input: + people: + person1: + is_snap_ineligible_student: true + person2: + is_snap_ineligible_student: true + person3: + is_snap_ineligible_student: true + spm_units: + spm_unit1: + members: [person1, person2, person3] + spm_unit_size: 3 + output: + snap_unit_size: 0 + +- name: Case 4, mixed-status household with one immigration-ineligible member. + period: 2024 + absolute_error_margin: 0.1 + input: + people: + person1: + immigration_status: CITIZEN + person2: + immigration_status: UNDOCUMENTED + person3: + immigration_status: CITIZEN + spm_units: + spm_unit1: + members: [person1, person2, person3] + spm_unit_size: 3 + output: + snap_unit_size: 2 + +- name: Case 5, all members immigration-ineligible. + period: 2024 + absolute_error_margin: 0.1 + input: + people: + person1: + immigration_status: UNDOCUMENTED + person2: + immigration_status: UNDOCUMENTED + spm_units: + spm_unit1: + members: [person1, person2] + spm_unit_size: 2 + output: + snap_unit_size: 0 + +- name: Case 6, ineligible student and immigration-ineligible member. + period: 2024 + absolute_error_margin: 0.1 + input: + people: + person1: + immigration_status: CITIZEN + person2: + immigration_status: UNDOCUMENTED + person3: + immigration_status: CITIZEN + is_snap_ineligible_student: true + person4: + immigration_status: CITIZEN + spm_units: + spm_unit1: + members: [person1, person2, person3, person4] + spm_unit_size: 4 + output: + snap_unit_size: 2 + +- name: Case 7, post-OBBBA refugee no longer eligible reduces unit size. + period: 2026 + absolute_error_margin: 0.1 + input: + people: + person1: + immigration_status: CITIZEN + person2: + immigration_status: REFUGEE + person3: + immigration_status: CITIZEN + households: + household1: + members: [person1, person2, person3] + state_code: TX + spm_units: + spm_unit1: + members: [person1, person2, person3] + spm_unit_size: 3 + output: + snap_unit_size: 2 + +- name: Case 8, pre-OBBBA refugee is eligible, full unit size. + period: 2024 + absolute_error_margin: 0.1 + input: + people: + person1: + immigration_status: CITIZEN + person2: + immigration_status: REFUGEE + person3: + immigration_status: CITIZEN + spm_units: + spm_unit1: + members: [person1, person2, person3] + spm_unit_size: 3 + output: + snap_unit_size: 3 + +- name: Case 9, undocumented ineligible student not double-counted. + period: 2024 + absolute_error_margin: 0.1 + input: + people: + person1: + immigration_status: CITIZEN + person2: + immigration_status: UNDOCUMENTED + is_snap_ineligible_student: true + spm_units: + spm_unit1: + members: [person1, person2] + spm_unit_size: 2 + output: + snap_unit_size: 1 diff --git a/policyengine_us/variables/gov/states/ca/cdss/snap/eligibility/ca_snap_immigration_status_eligible.py b/policyengine_us/variables/gov/states/ca/cdss/snap/eligibility/ca_snap_immigration_status_eligible.py new file mode 100644 index 00000000000..707f3d91823 --- /dev/null +++ b/policyengine_us/variables/gov/states/ca/cdss/snap/eligibility/ca_snap_immigration_status_eligible.py @@ -0,0 +1,23 @@ +from policyengine_us.model_api import * + + +class ca_snap_immigration_status_eligible(Variable): + value_type = bool + entity = Person + label = "Person is eligible for California SNAP due to immigration status" + definition_period = YEAR + defined_for = StateCode.CA + reference = ( + "https://www.cdss.ca.gov/Portals/9/Additional-Resources/Letters-and-Notices/ACLs/2025/25-92.pdf#page=7", + "https://www.law.cornell.edu/uscode/text/7/2015#f", + ) + + def formula(person, period, parameters): + # California delays OBBBA implementation to April 1, 2026 per ACL 25-92. + p = parameters(period).gov.states.ca.cdss.snap.eligibility + immigration_status = person("immigration_status", period) + immigration_status_str = immigration_status.decode_to_str() + return np.isin( + immigration_status_str, + p.eligible_immigration_statuses, + ) diff --git a/policyengine_us/variables/gov/usda/snap/eligibility/is_snap_immigration_status_eligible.py b/policyengine_us/variables/gov/usda/snap/eligibility/is_snap_immigration_status_eligible.py index bb161f39c74..42c54a1781e 100644 --- a/policyengine_us/variables/gov/usda/snap/eligibility/is_snap_immigration_status_eligible.py +++ b/policyengine_us/variables/gov/usda/snap/eligibility/is_snap_immigration_status_eligible.py @@ -13,8 +13,14 @@ class is_snap_immigration_status_eligible(Variable): ) def formula(person, period, parameters): - p = parameters(period).gov.usda.snap.eligibility immigration_status = person("immigration_status", period) immigration_status_str = immigration_status.decode_to_str() - return np.isin(immigration_status_str, p.eligible_immigration_statuses) + p = parameters(period).gov.usda.snap.eligibility + federal_eligible = np.isin( + immigration_status_str, + p.eligible_immigration_statuses, + ) + ca_eligible = person("ca_snap_immigration_status_eligible", period) + + return federal_eligible | ca_eligible diff --git a/policyengine_us/variables/gov/usda/snap/snap_unit.py b/policyengine_us/variables/gov/usda/snap/snap_unit_size.py similarity index 50% rename from policyengine_us/variables/gov/usda/snap/snap_unit.py rename to policyengine_us/variables/gov/usda/snap/snap_unit_size.py index 0bb83609ba8..a8d87e3997b 100644 --- a/policyengine_us/variables/gov/usda/snap/snap_unit.py +++ b/policyengine_us/variables/gov/usda/snap/snap_unit_size.py @@ -4,12 +4,14 @@ class snap_unit_size(Variable): value_type = int entity = SPMUnit - label = "SNAP unit" + label = "SNAP unit size" definition_period = YEAR def formula(spm_unit, period, parameters): unit_size = spm_unit("spm_unit_size", period) person = spm_unit.members - ineligible_student = person("is_snap_ineligible_student", period) - ineligible_students = spm_unit.sum(ineligible_student) - return max_(unit_size - ineligible_students, 0) + ineligible = person("is_snap_ineligible_student", period) | ~person( + "is_snap_immigration_status_eligible", period + ) + ineligible_count = spm_unit.sum(ineligible) + return max_(unit_size - ineligible_count, 0) From 3096f2302e7cf8d4b7fcb1835aa7559de28972ce Mon Sep 17 00:00:00 2001 From: Ziming Date: Fri, 6 Feb 2026 10:26:24 -0500 Subject: [PATCH 3/6] minor --- sources/working_references.md | 399 ---------------------------------- uv.lock | 2 +- 2 files changed, 1 insertion(+), 400 deletions(-) delete mode 100644 sources/working_references.md diff --git a/sources/working_references.md b/sources/working_references.md deleted file mode 100644 index 27856ccebd3..00000000000 --- a/sources/working_references.md +++ /dev/null @@ -1,399 +0,0 @@ -# Collected Documentation - -## Michigan 2025 Individual Income Tax - Parameter Updates -**Collected**: 2026-01-06 -**Implementation Task**: Update Michigan income tax parameters to 2025 values per issue #7120 - ---- - -## Official Program Names - -**Program**: Michigan Individual Income Tax -**Administering Agency**: Michigan Department of Treasury -**Key Forms**: MI-1040, MI-1040CR, MI-1040CR-7 -**Tax Rate**: 4.25% (flat rate, unchanged for 2025) - ---- - -## 2025 Parameter Values - Summary - -| Parameter | 2024 Value | 2025 Value | Source | -|-----------|------------|------------|--------| -| Personal Exemption | $5,600 | $5,800 | 446 Withholding Guide | -| Disabled Exemption | $3,300 | $3,400 | 446 Withholding Guide | -| Disabled Veteran Exemption | $500 | $500 | 446 Withholding Guide | -| Homestead Property Value Limit | $160,700 | $165,400 | MI-1040CR Form | -| Homestead Credit Cap | $1,800 | $1,900 | MI-1040CR Form | -| Homestead Reduction Start | $60,700 | $62,500 | MI-1040CR Form | -| Total Household Resources Limit | $69,700 | $71,500 | MI-1040CR Form | -| Tier One Retirement (Single) | $64,040 | $65,897 | Retirement & Pension Benefits | -| Tier One Retirement (Joint) | $128,080 | $131,794 | Retirement & Pension Benefits | - ---- - -## Detailed Parameter Documentation - -### 1. Personal Exemption Amount - -**2025 Value**: $5,800 -**2024 Value**: $5,600 -**Change**: +$200 - -**Source**: Michigan 2025 Income Tax Withholding Guide (Form 446, Rev. 01-25) -- Quote: "Withholding Rate: 4.25% Personal Exemption Amount: $5,800" -- This exemption applies to the filer, spouse, each dependent, and stillborn children - -**Legal Authority**: Michigan Legal Code Section 206.30(2) - -**References for Parameter**: -```yaml -reference: - - title: Michigan 2025 Income Tax Withholding Guide (Form 446) - href: https://www.michigan.gov/taxes/-/media/Project/Websites/taxes/Forms/SUW/TY2025/446_Withholding-Guide_2025.pdf - - title: 2025 MI-1040 Instructions - href: https://www.michigan.gov/taxes/-/media/Project/Websites/taxes/Forms/IIT/TY2025/MI-1040-Book.pdf -``` - ---- - -### 2. Disabled Exemption Amount (Special Exemption) - -**2025 Value**: $3,400 -**2024 Value**: $3,300 -**Change**: +$100 - -**Applies to**: Individuals who are deaf, blind, hemiplegic, paraplegic, quadriplegic, or totally and permanently disabled - -**Note**: A taxpayer who is age 66 by April 30 of the tax year may not claim a totally and permanently disabled exemption (considered retirement age). - -**Source**: Michigan 2025 Income Tax Withholding Guide (Form 446) -- Quote: "The special exemption allowance for deaf, blind, hemiplegic, paraplegic, quadriplegic, or totally and permanently disabled is $3,400" - -**Legal Authority**: Michigan Legal Code Section 206.30(3)(a) - -**References for Parameter**: -```yaml -reference: - - title: Michigan 2025 Income Tax Withholding Guide (Form 446) - href: https://www.michigan.gov/taxes/-/media/Project/Websites/taxes/Forms/SUW/TY2025/446_Withholding-Guide_2025.pdf - - title: 2025 MI-1040 Instructions - href: https://www.michigan.gov/taxes/-/media/Project/Websites/taxes/Forms/IIT/TY2025/MI-1040-Book.pdf -``` - ---- - -### 3. Disabled Veteran Exemption Amount - -**2025 Value**: $500 -**2024 Value**: $500 -**Change**: No change - -**Applies to**: Qualified disabled veteran, spouse of qualified disabled veteran, or dependent of taxpayer who is a qualified disabled veteran - -**Source**: Michigan 2025 Income Tax Withholding Guide (Form 446) -- Quote: "The exemption allowance for qualified disabled veterans is $500" - -**Legal Authority**: Michigan Legal Code Section 206.30 - -**References for Parameter**: -```yaml -reference: - - title: Michigan 2025 Income Tax Withholding Guide (Form 446) - href: https://www.michigan.gov/taxes/-/media/Project/Websites/taxes/Forms/SUW/TY2025/446_Withholding-Guide_2025.pdf -``` - ---- - -### 4. Homestead Property Tax Credit - Property Value Limit - -**2025 Value**: $165,400 -**2024 Value**: $160,700 -**Change**: +$4,700 - -**Rule**: Homesteads with a taxable value greater than this amount are not eligible for the credit (except vacant farmland classified as agricultural) - -**Source**: 2025 MI-1040CR Form -- Quote: "Homesteads with a taxable value greater than $165,400 are not eligible for this credit" - -**Legal Authority**: Michigan Income Tax Act 206.520(1) - -**References for Parameter**: -```yaml -reference: - - title: 2025 MI-1040CR Form - href: https://www.michigan.gov/taxes/-/media/Project/Websites/taxes/Forms/IIT/TY2025/MI-1040CR.pdf - - title: Michigan Income Tax Act 206.520(1) - href: http://legislature.mi.gov/doc.aspx?mcl-206-520 -``` - ---- - -### 5. Homestead Property Tax Credit - Maximum Credit Cap - -**2025 Value**: $1,900 -**2024 Value**: $1,800 -**Change**: +$100 - -**Rule**: The maximum homestead property tax credit is capped at this amount - -**Source**: 2025 MI-1040CR Form -- The credit is calculated and then capped at the maximum - -**Legal Authority**: Michigan Income Tax Act 206.520(15) - -**References for Parameter**: -```yaml -reference: - - title: 2025 MI-1040CR Form - href: https://www.michigan.gov/taxes/-/media/Project/Websites/taxes/Forms/IIT/TY2025/MI-1040CR.pdf - - title: Michigan Income Tax Act 206.520(15) - href: http://legislature.mi.gov/doc.aspx?mcl-206-520 -``` - ---- - -### 6. Homestead Property Tax Credit - Reduction Start Threshold - -**2025 Value**: $62,500 -**2024 Value**: $60,700 -**Change**: +$1,800 - -**Rule**: The computed credit is reduced by 10% for every $1,000 (or part of $1,000) that total household resources exceeds this threshold - -**Source**: 2025 MI-1040CR Form -- Quote: "The computed credit (line 12) is reduced by 10 percent for every $1,000 (or part of $1,000) that total household resources exceeds $62,500" - -**Legal Authority**: Michigan Income Tax Act 206.520(8) - -**References for Parameter**: -```yaml -reference: - - title: 2025 MI-1040CR Form - href: https://www.michigan.gov/taxes/-/media/Project/Websites/taxes/Forms/IIT/TY2025/MI-1040CR.pdf - - title: Michigan Income Tax Act 206.520(8) - href: http://legislature.mi.gov/doc.aspx?mcl-206-520 -``` - ---- - -### 7. Homestead Property Tax Credit - Total Household Resources Limit - -**2025 Value**: $71,500 -**2024 Value**: $69,700 -**Change**: +$1,800 - -**Rule**: Taxpayers with total household resources over this amount are not eligible for a credit in any category - -**Source**: 2025 MI-1040CR Form -- Quote: "Taxpayers with total household resources over $71,500 are not eligible for a credit in any category" - -**Note**: This threshold equals the reduction start ($62,500) plus $9,000, at which point the 10% reduction per $1,000 completely phases out the credit. - -**References for Parameter**: -```yaml -reference: - - title: 2025 MI-1040CR Form - href: https://www.michigan.gov/taxes/-/media/Project/Websites/taxes/Forms/IIT/TY2025/MI-1040CR.pdf - - title: Michigan Homestead Property Tax Credit - href: https://www.michigan.gov/taxes/iit/tax-guidance/credits-exemptions/hptc -``` - ---- - -### 8. Tier One Retirement Deduction Amounts - -**2025 Values**: -- Single/Married Filing Separately: $65,897 -- Married Filing Jointly: $131,794 - -**2024 Values**: -- Single/Married Filing Separately: $64,040 -- Married Filing Jointly: $128,080 - -**Change**: -- Single: +$1,857 -- Joint: +$3,714 - -**Eligibility**: -- **Born before 1946 (Tier 1)**: May deduct all qualifying public/federal pension and up to the maximum for private pensions -- **Born 1946-1966**: May deduct 75% of maximum for 2025 ($49,422 single / $98,845 joint) -- **Born 1967 or after**: Not eligible for deduction in 2025 tax year - -**Note**: Maximum amounts are adjusted annually by the percentage increase in the United States Consumer Price Index. - -**Source**: Michigan Department of Treasury - Retirement and Pension Benefits -- Quote: "The maximum deduction for the 2025 tax year is $65,897 for single or married filing separately, and $131,794 for married filing jointly" - -**Legal Authority**: Michigan Legal Code Section 206.30(1)(f) - -**References for Parameter**: -```yaml -reference: - - title: Michigan Retirement and Pension Benefits - href: https://www.michigan.gov/taxes/iit/tax-guidance/tax-situations/retirement-and-pension-benefits - - title: Michigan Legal Code Section 206.30(1)(f) - href: http://legislature.mi.gov/doc.aspx?mcl-206-30 - - title: 2025 MI-1040 Instructions - href: https://www.michigan.gov/taxes/-/media/Project/Websites/taxes/Forms/IIT/TY2025/MI-1040-Book.pdf -``` - ---- - -### 9. Home Heating Credit Standard Allowances - -**Status**: The 2025 tax year MI-1040CR-7 form has not yet been released. Current values are for 2024 tax year. - -**2024 Values (filed in 2025)**: -| Exemptions | Standard Allowance | -|------------|-------------------| -| 1 | $581 | -| 2 | $788 | -| 3 | $995 | -| 4 | $1,202 | -| 5 | $1,409 | -| 6 | $1,616 | - -**Note**: For tax year 2025, there will be a major form change to MI-1040CR-7, Home Heating Credit Claim. The 2025 values will need to be verified once the form is released. - -**Additional Exemption Amount**: -- Senior/disabled claimants receive an additional exemption -- 2024 additional exemption: $207 (difference between 3 and 2 exemption amounts: $995 - $788) - -**Source**: Michigan 2024 MI-1040CR-7 Instructions, Table A - -**Legal Authority**: Michigan Section 206.527a, Income Tax Act of 1967 - -**References for Parameter**: -```yaml -reference: - - title: Michigan 2024 MI-1040CR-7 Home Heating Instructions, Table A - href: https://www.michigan.gov/taxes/-/media/Project/Websites/taxes/Forms/IIT/TY2024/BOOK_MI-1040CR-7.pdf#page=11 - - title: Michigan Section 206.527a - href: http://legislature.mi.gov/doc.aspx?mcl-206-527a -``` - ---- - -## Tax Rate Confirmation - -**2025 Tax Rate**: 4.25% (unchanged) - -**Source**: Michigan Department of Treasury Notice -- Quote: "After applying the statutory formula, it has been determined there is no reduction of the Section 51 rate for the 2025 tax year. The rate in effect under Section 51 for the 2025 tax year is therefore 4.25%" - -**References**: -```yaml -reference: - - title: 2025 Tax Year Income Tax Rate for Individuals and Fiduciaries - href: https://www.michigan.gov/treasury/reference/taxpayer-notices/2025-tax-year-income-tax-rate-for-individuals-and-fiduciaries - - title: Calculation of State Individual Income Tax Rate Adjustment for 2025 Tax Year - href: https://www.michigan.gov/treasury/news/2025/05/01/calculation-of-state-individual-income-tax-rate-adjustment-for-2025-tax-year -``` - ---- - -## PDFs for Future Reference - -The following PDFs contain additional information but could not be fully extracted: - -### 1. **2025 MI-1040 Instructions (Complete)** - - URL: https://www.michigan.gov/taxes/-/media/Project/Websites/taxes/Forms/IIT/TY2025/MI-1040-Book.pdf - - Expected content: Complete individual income tax instructions including exemption calculations, deduction instructions, and credit eligibility - - Key pages: Page 3 (exemption amounts), Page 13 (line-by-line instructions), Page 20+ (retirement deductions) - -### 2. **2025 MI-1040 Form** - - URL: https://www.michigan.gov/taxes/-/media/Project/Websites/taxes/Forms/IIT/TY2025/MI-1040.pdf - - Expected content: The actual tax return form with line numbers and calculations - - Key pages: Page 1-2 (main form) - -### 3. **2025 MI-1040CR Form (Homestead Property Tax Credit)** - - URL: https://www.michigan.gov/taxes/-/media/Project/Websites/taxes/Forms/IIT/TY2025/MI-1040CR.pdf - - Expected content: Homestead property tax credit form with 2025 thresholds - - Key pages: Page 1 (line 9 - taxable value $165,400), Page 2 (line 38 - max credit $1,900) - -### 4. **2025 MI-1040CR-2 Book (Veterans/Blind)** - - URL: https://www.michigan.gov/taxes/-/media/Project/Websites/taxes/Forms/IIT/TY2025/MI-1040CR-2-Book.pdf - - Expected content: Instructions for veterans and blind homestead property tax credit with specific thresholds - -### 5. **2025 Withholding Guide (Form 446)** - - URL: https://www.michigan.gov/taxes/-/media/Project/Websites/taxes/Forms/SUW/TY2025/446_Withholding-Guide_2025.pdf - - Expected content: Withholding tables, personal exemption amounts, disabled exemption amounts - - Key pages: Page 1 (exemption amounts: $5,800 personal, $3,400 disabled, $500 veteran) - -### 6. **2025 MI-1040CR-7 Home Heating Credit Instructions** - - URL: Not yet available (2024 form: https://www.michigan.gov/taxes/-/media/Project/Websites/taxes/Forms/IIT/TY2024/BOOK_MI-1040CR-7.pdf) - - Expected content: 2025 standard allowance amounts (Table A), income limits - - Note: Per Michigan Treasury, there will be a major form change for 2025. Values should be verified when released. - ---- - -## Implementation Notes - -### Parameters to Update - -The following parameter files need 2025-01-01 values added: - -1. **Personal Exemption**: `gov/states/mi/tax/income/exemptions/personal.yaml` - - Add: `2025-01-01: 5_800` - -2. **Disabled Exemption**: `gov/states/mi/tax/income/exemptions/disabled/amount/base.yaml` - - Add: `2025-01-01: 3_400` - -3. **Homestead Property Value Limit**: `gov/states/mi/tax/income/credits/homestead_property_tax/property_value_limit.yaml` - - Add: `2025-01-01: 165_400` - -4. **Homestead Credit Cap**: `gov/states/mi/tax/income/credits/homestead_property_tax/cap.yaml` - - Add: `2025-01-01: 1_900` - -5. **Homestead Reduction Start**: `gov/states/mi/tax/income/credits/homestead_property_tax/reduction/start.yaml` - - Add: `2025-01-01: 62_500` - -6. **Tier One Retirement Amount**: `gov/states/mi/tax/income/deductions/retirement_benefits/tier_one/amount.yaml` - - Add for SINGLE: `2025-01-01: 65_897` - - Add for JOINT: `2025-01-01: 131_794` - - Add for SURVIVING_SPOUSE: `2025-01-01: 65_897` - - Add for HEAD_OF_HOUSEHOLD: `2025-01-01: 65_897` - - Add for SEPARATE: `2025-01-01: 65_897` - -7. **Home Heating Credit Standard Base**: `gov/states/mi/tax/income/credits/home_heating/standard/base.yaml` - - **Status**: 2025 values not yet available; form release pending with major changes - - Current 2024 values should remain; 2025 values to be added when MI-1040CR-7 2025 is released - -### Note on Uprating - -Several of these parameters have automatic uprating configured. However, the actual published values should be used rather than relying on uprating, as Michigan Treasury publishes specific amounts that may differ slightly from mechanical uprating calculations. - ---- - -## Sources Consulted - -### Official Michigan Government Sources - -1. [Michigan Department of Treasury - Tax Forms](https://www.michigan.gov/taxes/iit-forms/2025-individual-income-tax-forms) -2. [Michigan Homestead Property Tax Credit](https://www.michigan.gov/taxes/iit/tax-guidance/credits-exemptions/hptc) -3. [Michigan Retirement and Pension Benefits](https://www.michigan.gov/taxes/iit/tax-guidance/tax-situations/retirement-and-pension-benefits) -4. [Michigan Withholding Tax Information](https://www.michigan.gov/taxes/business-taxes/withholding/calendar-year-tax-information) -5. [Michigan Home Heating Credit Information](https://www.michigan.gov/taxes/questions/iit/accordion/heating/home-heating-credit-information-1) -6. [2025 Tax Year Income Tax Rate Notice](https://www.michigan.gov/treasury/reference/taxpayer-notices/2025-tax-year-income-tax-rate-for-individuals-and-fiduciaries) - -### Legal Authority - -1. [Michigan Compiled Laws Section 206.30](http://legislature.mi.gov/doc.aspx?mcl-206-30) - Exemptions and deductions -2. [Michigan Compiled Laws Section 206.520](http://legislature.mi.gov/doc.aspx?mcl-206-520) - Homestead property tax credit -3. [Michigan Compiled Laws Section 206.527a](http://legislature.mi.gov/doc.aspx?mcl-206-527a) - Home heating credit - ---- - -## Validation Checklist - -- [x] Personal exemption 2025 value confirmed: $5,800 -- [x] Disabled exemption 2025 value confirmed: $3,400 -- [x] Disabled veteran exemption 2025 value confirmed: $500 -- [x] Homestead property value limit 2025 confirmed: $165,400 -- [x] Homestead credit cap 2025 confirmed: $1,900 -- [x] Homestead reduction start 2025 confirmed: $62,500 -- [x] Total household resources limit 2025 confirmed: $71,500 -- [x] Tier one retirement single 2025 confirmed: $65,897 -- [x] Tier one retirement joint 2025 confirmed: $131,794 -- [ ] Home heating credit 2025 standard allowances: PENDING (form not yet released) -- [x] Tax rate 2025 confirmed: 4.25% diff --git a/uv.lock b/uv.lock index f11130ff8a4..b220855f8bd 100644 --- a/uv.lock +++ b/uv.lock @@ -1664,7 +1664,7 @@ wheels = [ [[package]] name = "policyengine-us" -version = "1.534.2" +version = "1.546.0" source = { editable = "." } dependencies = [ { name = "microdf-python" }, From c168d8afdbe251b4bf7c54e7f6e71b36e4750a8c Mon Sep 17 00:00:00 2001 From: Ziming Date: Mon, 9 Feb 2026 11:46:23 -0500 Subject: [PATCH 4/6] Change SNAP immigration eligibility variables to monthly definition period This enables mid-year parameter changes (e.g., 2025-07-01 OBBBA cutoff) to correctly affect SNAP eligibility and benefit calculations on a per-month basis. Co-Authored-By: Claude Opus 4.6 --- .../snap/eligibility/ca_snap_immigration_status_eligible.py | 2 +- .../snap/eligibility/is_snap_immigration_status_eligible.py | 2 +- policyengine_us/variables/gov/usda/snap/income/snap_fpg.py | 2 +- policyengine_us/variables/gov/usda/snap/snap_unit_size.py | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/policyengine_us/variables/gov/states/ca/cdss/snap/eligibility/ca_snap_immigration_status_eligible.py b/policyengine_us/variables/gov/states/ca/cdss/snap/eligibility/ca_snap_immigration_status_eligible.py index 707f3d91823..a09386c0bc5 100644 --- a/policyengine_us/variables/gov/states/ca/cdss/snap/eligibility/ca_snap_immigration_status_eligible.py +++ b/policyengine_us/variables/gov/states/ca/cdss/snap/eligibility/ca_snap_immigration_status_eligible.py @@ -5,7 +5,7 @@ class ca_snap_immigration_status_eligible(Variable): value_type = bool entity = Person label = "Person is eligible for California SNAP due to immigration status" - definition_period = YEAR + definition_period = MONTH defined_for = StateCode.CA reference = ( "https://www.cdss.ca.gov/Portals/9/Additional-Resources/Letters-and-Notices/ACLs/2025/25-92.pdf#page=7", diff --git a/policyengine_us/variables/gov/usda/snap/eligibility/is_snap_immigration_status_eligible.py b/policyengine_us/variables/gov/usda/snap/eligibility/is_snap_immigration_status_eligible.py index 42c54a1781e..f396a238b5d 100644 --- a/policyengine_us/variables/gov/usda/snap/eligibility/is_snap_immigration_status_eligible.py +++ b/policyengine_us/variables/gov/usda/snap/eligibility/is_snap_immigration_status_eligible.py @@ -5,7 +5,7 @@ class is_snap_immigration_status_eligible(Variable): value_type = bool entity = Person label = "Person is eligible for SNAP due to immigration status" - definition_period = YEAR + definition_period = MONTH reference = ( "https://www.law.cornell.edu/uscode/text/7/2015#f", "https://www.law.cornell.edu/uscode/text/8/1612", diff --git a/policyengine_us/variables/gov/usda/snap/income/snap_fpg.py b/policyengine_us/variables/gov/usda/snap/income/snap_fpg.py index ca0144bc512..aa51ccad72d 100644 --- a/policyengine_us/variables/gov/usda/snap/income/snap_fpg.py +++ b/policyengine_us/variables/gov/usda/snap/income/snap_fpg.py @@ -12,7 +12,7 @@ class snap_fpg(Variable): definition_period = MONTH def formula(spm_unit, period, parameters): - n = spm_unit("snap_unit_size", period.this_year) + n = spm_unit("snap_unit_size", period) state_group = spm_unit.household("state_group_str", period.this_year) year = period.start.year month = period.start.month diff --git a/policyengine_us/variables/gov/usda/snap/snap_unit_size.py b/policyengine_us/variables/gov/usda/snap/snap_unit_size.py index a8d87e3997b..4f068514416 100644 --- a/policyengine_us/variables/gov/usda/snap/snap_unit_size.py +++ b/policyengine_us/variables/gov/usda/snap/snap_unit_size.py @@ -5,7 +5,7 @@ class snap_unit_size(Variable): value_type = int entity = SPMUnit label = "SNAP unit size" - definition_period = YEAR + definition_period = MONTH def formula(spm_unit, period, parameters): unit_size = spm_unit("spm_unit_size", period) From 9c189d065cdfadd61e7c4aa29c611a2365005b13 Mon Sep 17 00:00:00 2001 From: Ziming Date: Wed, 11 Feb 2026 16:00:50 -0500 Subject: [PATCH 5/6] minor --- .../immigration/is_snap_immigration_status_eligible.yaml | 6 +++--- uv.lock | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/policyengine_us/tests/policy/baseline/gov/usda/snap/eligibility/immigration/is_snap_immigration_status_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/usda/snap/eligibility/immigration/is_snap_immigration_status_eligible.yaml index 897abcb6325..43868fb9686 100644 --- a/policyengine_us/tests/policy/baseline/gov/usda/snap/eligibility/immigration/is_snap_immigration_status_eligible.yaml +++ b/policyengine_us/tests/policy/baseline/gov/usda/snap/eligibility/immigration/is_snap_immigration_status_eligible.yaml @@ -89,8 +89,8 @@ output: is_snap_immigration_status_eligible: true -- name: Case 9, CA refugee still eligible in 2026 due to delayed implementation. - period: 2026 +- name: Case 9, CA refugee still eligible in January 2026 due to delayed implementation. + period: 2026-01 absolute_error_margin: 0.1 input: people: @@ -103,7 +103,7 @@ output: is_snap_immigration_status_eligible: true -- name: Case 10, CA refugee ineligible in 2027. +- name: Case 10, CA refugee ineligible in 2027 after delayed implementation ends. period: 2027 absolute_error_margin: 0.1 input: diff --git a/uv.lock b/uv.lock index 66293da3350..c80c802baf2 100644 --- a/uv.lock +++ b/uv.lock @@ -1664,7 +1664,7 @@ wheels = [ [[package]] name = "policyengine-us" -version = "1.549.0" +version = "1.550.2" source = { editable = "." } dependencies = [ { name = "microdf-python" }, From 01b60bf4e6b2a83766c34638667277c97799774c Mon Sep 17 00:00:00 2001 From: Ziming Date: Wed, 11 Feb 2026 16:14:48 -0500 Subject: [PATCH 6/6] pr fix --- .../variables/gov/usda/snap/eligibility/is_snap_eligible.py | 1 + policyengine_us/variables/gov/usda/snap/snap_unit_size.py | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/policyengine_us/variables/gov/usda/snap/eligibility/is_snap_eligible.py b/policyengine_us/variables/gov/usda/snap/eligibility/is_snap_eligible.py index 3d1ad77b865..94c59da1e7e 100644 --- a/policyengine_us/variables/gov/usda/snap/eligibility/is_snap_eligible.py +++ b/policyengine_us/variables/gov/usda/snap/eligibility/is_snap_eligible.py @@ -10,6 +10,7 @@ class is_snap_eligible(Variable): reference = ( "https://www.law.cornell.edu/uscode/text/7/2017#a", "https://www.law.cornell.edu/uscode/text/7/2014#c", + "https://www.law.cornell.edu/uscode/text/7/2015#f", ) def formula(spm_unit, period, parameters): diff --git a/policyengine_us/variables/gov/usda/snap/snap_unit_size.py b/policyengine_us/variables/gov/usda/snap/snap_unit_size.py index 4f068514416..d4e9ab9194f 100644 --- a/policyengine_us/variables/gov/usda/snap/snap_unit_size.py +++ b/policyengine_us/variables/gov/usda/snap/snap_unit_size.py @@ -6,6 +6,10 @@ class snap_unit_size(Variable): entity = SPMUnit label = "SNAP unit size" definition_period = MONTH + reference = ( + "https://www.law.cornell.edu/uscode/text/7/2014#b", + "https://www.law.cornell.edu/uscode/text/7/2015#f", + ) def formula(spm_unit, period, parameters): unit_size = spm_unit("spm_unit_size", period)