From 6d5ae8780abc48b33a12dae9ce085f290fe57998 Mon Sep 17 00:00:00 2001 From: Ziming Date: Fri, 24 Apr 2026 00:45:09 -0400 Subject: [PATCH 1/9] Add WA SFA, WA RCA, and federal 5-year bar; fix WA TANF countable income test Implements Washington State Family Assistance (SFA) and Refugee Cash Assistance (RCA), with shared parameters reused from WA TANF per WAC 388-478-0020 and 388-478-0035. Adds a federal 5-year bar check on TANF eligibility (8 USC 1613) with a new years_since_us_entry person-level input (default 5 years) and a bar_exempt_immigration_statuses parameter list. Fixes wa_tanf_income_eligible to also enforce the WAC 388-450-0162 countable-income-below-payment-standard test, which was previously missing and allowed households with high unearned income to pass eligibility. Co-Authored-By: Claude Opus 4.7 (1M context) --- changelog.d/wa-rca-tanf-fixes.added.md | 1 + changelog.d/wa-rca-tanf-fixes.fixed.md | 1 + .../tanf/bar_exempt_immigration_statuses.yaml | 17 +++ .../gov/hhs/tanf/five_year_bar_years.yaml | 12 +++ .../household/household_state_benefits.yaml | 6 ++ .../rca/eligible_immigration_statuses.yaml | 22 ++++ policyengine_us/programs.yaml | 22 ++++ .../dshs/rca/eligibility/wa_rca_eligible.yaml | 69 ++++++++++++ .../wa_rca_immigration_status_eligible.yaml | 79 ++++++++++++++ .../gov/states/wa/dshs/rca/wa_rca.yaml | 67 ++++++++++++ .../dshs/sfa/eligibility/wa_sfa_eligible.yaml | 94 ++++++++++++++++ .../wa_sfa_immigration_status_eligible.yaml | 68 ++++++++++++ .../gov/states/wa/dshs/sfa/wa_sfa.yaml | 69 ++++++++++++ .../tanf/eligibility/wa_tanf_eligible.yaml | 45 ++++++-- .../wa_tanf_immigration_status_eligible.yaml | 85 +++++++++++++++ .../eligibility/wa_tanf_income_eligible.yaml | 101 +++++++----------- .../gov/states/wa/dshs/tanf/integration.yaml | 15 ++- .../dshs/rca/eligibility/wa_rca_eligible.py | 26 +++++ .../wa_rca_immigration_status_eligible.py | 20 ++++ .../gov/states/wa/dshs/rca/wa_rca.py | 19 ++++ .../dshs/sfa/eligibility/wa_sfa_eligible.py | 27 +++++ .../wa_sfa_immigration_status_eligible.py | 21 ++++ .../gov/states/wa/dshs/sfa/wa_sfa.py | 19 ++++ .../dshs/tanf/eligibility/wa_tanf_eligible.py | 11 +- .../wa_tanf_immigration_status_eligible.py | 27 +++++ .../eligibility/wa_tanf_income_eligible.py | 9 +- .../person/years_since_us_entry.py | 11 ++ .../income/spm_unit/spm_unit_benefits.py | 2 + 28 files changed, 885 insertions(+), 80 deletions(-) create mode 100644 changelog.d/wa-rca-tanf-fixes.added.md create mode 100644 changelog.d/wa-rca-tanf-fixes.fixed.md create mode 100644 policyengine_us/parameters/gov/hhs/tanf/bar_exempt_immigration_statuses.yaml create mode 100644 policyengine_us/parameters/gov/hhs/tanf/five_year_bar_years.yaml create mode 100644 policyengine_us/parameters/gov/states/wa/dshs/rca/eligible_immigration_statuses.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/wa/dshs/rca/eligibility/wa_rca_eligible.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/wa/dshs/rca/eligibility/wa_rca_immigration_status_eligible.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/wa/dshs/rca/wa_rca.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/wa/dshs/sfa/eligibility/wa_sfa_eligible.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/wa/dshs/sfa/eligibility/wa_sfa_immigration_status_eligible.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/wa/dshs/sfa/wa_sfa.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/wa/dshs/tanf/eligibility/wa_tanf_immigration_status_eligible.yaml create mode 100644 policyengine_us/variables/gov/states/wa/dshs/rca/eligibility/wa_rca_eligible.py create mode 100644 policyengine_us/variables/gov/states/wa/dshs/rca/eligibility/wa_rca_immigration_status_eligible.py create mode 100644 policyengine_us/variables/gov/states/wa/dshs/rca/wa_rca.py create mode 100644 policyengine_us/variables/gov/states/wa/dshs/sfa/eligibility/wa_sfa_eligible.py create mode 100644 policyengine_us/variables/gov/states/wa/dshs/sfa/eligibility/wa_sfa_immigration_status_eligible.py create mode 100644 policyengine_us/variables/gov/states/wa/dshs/sfa/wa_sfa.py create mode 100644 policyengine_us/variables/gov/states/wa/dshs/tanf/eligibility/wa_tanf_immigration_status_eligible.py create mode 100644 policyengine_us/variables/household/demographic/person/years_since_us_entry.py diff --git a/changelog.d/wa-rca-tanf-fixes.added.md b/changelog.d/wa-rca-tanf-fixes.added.md new file mode 100644 index 00000000000..567c84938d9 --- /dev/null +++ b/changelog.d/wa-rca-tanf-fixes.added.md @@ -0,0 +1 @@ +Washington State Family Assistance and Refugee Cash Assistance programs, a `years_since_us_entry` person-level input, and a `wa_tanf_immigration_status_eligible` variable that enforces the federal five-year bar with its statutory exemptions. diff --git a/changelog.d/wa-rca-tanf-fixes.fixed.md b/changelog.d/wa-rca-tanf-fixes.fixed.md new file mode 100644 index 00000000000..db020f79e7d --- /dev/null +++ b/changelog.d/wa-rca-tanf-fixes.fixed.md @@ -0,0 +1 @@ +Washington TANF income eligibility now also requires countable income below the payment standard, per WAC 388-450-0162. diff --git a/policyengine_us/parameters/gov/hhs/tanf/bar_exempt_immigration_statuses.yaml b/policyengine_us/parameters/gov/hhs/tanf/bar_exempt_immigration_statuses.yaml new file mode 100644 index 00000000000..9f6bdbe7e74 --- /dev/null +++ b/policyengine_us/parameters/gov/hhs/tanf/bar_exempt_immigration_statuses.yaml @@ -0,0 +1,17 @@ +description: The United States exempts these immigration statuses from the five-year bar on federal Temporary Assistance for Needy Families. + +values: + 1996-08-22: + - REFUGEE + - ASYLEE + - CUBAN_HAITIAN_ENTRANT + - DEPORTATION_WITHHELD + - CONDITIONAL_ENTRANT + +metadata: + unit: list + period: year + label: TANF five-year bar exempt immigration statuses + reference: + - title: 8 USC 1613(b) - Exceptions to five-year limited eligibility + href: https://www.law.cornell.edu/uscode/text/8/1613 diff --git a/policyengine_us/parameters/gov/hhs/tanf/five_year_bar_years.yaml b/policyengine_us/parameters/gov/hhs/tanf/five_year_bar_years.yaml new file mode 100644 index 00000000000..57ab1351fb9 --- /dev/null +++ b/policyengine_us/parameters/gov/hhs/tanf/five_year_bar_years.yaml @@ -0,0 +1,12 @@ +description: The United States bars qualified aliens from federal Temporary Assistance for Needy Families for this many years after obtaining qualified status. + +values: + 1996-08-22: 5 + +metadata: + unit: year + period: year + label: TANF five-year bar duration + reference: + - title: 8 USC 1613(a) - Five-year limited eligibility + href: https://www.law.cornell.edu/uscode/text/8/1613 diff --git a/policyengine_us/parameters/gov/household/household_state_benefits.yaml b/policyengine_us/parameters/gov/household/household_state_benefits.yaml index 619bf682302..17d0982b4e7 100644 --- a/policyengine_us/parameters/gov/household/household_state_benefits.yaml +++ b/policyengine_us/parameters/gov/household/household_state_benefits.yaml @@ -55,6 +55,9 @@ values: - ks_sspp # Hawaii benefits - hi_oss + # Washington benefits + - wa_sfa + - wa_rca 2024-01-01: # Delaware benefits - de_ssp @@ -112,6 +115,9 @@ values: - ks_sspp # Hawaii benefits - hi_oss + # Washington benefits + - wa_sfa + - wa_rca metadata: unit: list period: year diff --git a/policyengine_us/parameters/gov/states/wa/dshs/rca/eligible_immigration_statuses.yaml b/policyengine_us/parameters/gov/states/wa/dshs/rca/eligible_immigration_statuses.yaml new file mode 100644 index 00000000000..5c66c8151c9 --- /dev/null +++ b/policyengine_us/parameters/gov/states/wa/dshs/rca/eligible_immigration_statuses.yaml @@ -0,0 +1,22 @@ +description: Washington considers these immigration statuses eligible for the Refugee Cash Assistance program. + +values: + 1996-08-22: + - REFUGEE + - ASYLEE + - CUBAN_HAITIAN_ENTRANT + - DEPORTATION_WITHHELD + - CONDITIONAL_ENTRANT + - PAROLED_ONE_YEAR + +metadata: + unit: list + period: year + label: Washington RCA eligible immigration statuses + reference: + - title: 8 USC 1522 - Authorization for Refugee Assistance + href: https://www.law.cornell.edu/uscode/text/8/1522 + - title: 45 CFR 400.43 - Requirements for Documentation of Immigration Status + href: https://www.ecfr.gov/current/title-45/subtitle-B/chapter-IV/part-400/subpart-D/section-400.43 + - title: WAC 388-466-0120 - Refugee assistance + href: https://app.leg.wa.gov/wac/default.aspx?cite=388-466-0120 diff --git a/policyengine_us/programs.yaml b/policyengine_us/programs.yaml index 801129254f1..06bdb64028e 100644 --- a/policyengine_us/programs.yaml +++ b/policyengine_us/programs.yaml @@ -417,6 +417,28 @@ programs: full_name: Wyoming Personal Opportunities With Employment Responsibilities variable: wy_power + - id: wa_sfa + name: Washington SFA + full_name: Washington State Family Assistance + category: Benefits + agency: State + status: complete + coverage: WA + variable: wa_sfa + parameter_prefix: gov.states.wa.dshs + verified_start_year: 2016 + + - id: wa_rca + name: Washington RCA + full_name: Washington Refugee Cash Assistance + category: Benefits + agency: State + status: complete + coverage: WA + variable: wa_rca + parameter_prefix: gov.states.wa.dshs.rca + verified_start_year: 2016 + - id: ccdf name: CCDF full_name: Child Care and Development Fund diff --git a/policyengine_us/tests/policy/baseline/gov/states/wa/dshs/rca/eligibility/wa_rca_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/wa/dshs/rca/eligibility/wa_rca_eligible.yaml new file mode 100644 index 00000000000..b670b7b9530 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/wa/dshs/rca/eligibility/wa_rca_eligible.yaml @@ -0,0 +1,69 @@ +- name: Case 1, refugee meets all requirements - eligible. + period: 2024-01 + input: + state_code: WA + immigration_status: REFUGEE + wa_tanf_income_eligible: true + wa_tanf_resources_eligible: true + output: + wa_rca_eligible: true + +- name: Case 2, single refugee adult without children - eligible (no child required). + period: 2024-01 + input: + state_code: WA + immigration_status: REFUGEE + wa_tanf_income_eligible: true + wa_tanf_resources_eligible: true + output: + wa_rca_eligible: true + +- name: Case 3, citizen - ineligible (not an RCA-eligible immigration status). + period: 2024-01 + input: + state_code: WA + immigration_status: CITIZEN + wa_tanf_income_eligible: true + wa_tanf_resources_eligible: true + output: + wa_rca_eligible: false + +- name: Case 4, refugee income-ineligible - ineligible. + period: 2024-01 + input: + state_code: WA + immigration_status: REFUGEE + wa_tanf_income_eligible: false + wa_tanf_resources_eligible: true + output: + wa_rca_eligible: false + +- name: Case 5, refugee resources-ineligible - ineligible. + period: 2024-01 + input: + state_code: WA + immigration_status: REFUGEE + wa_tanf_income_eligible: true + wa_tanf_resources_eligible: false + output: + wa_rca_eligible: false + +- name: Case 6, non-WA refugee - ineligible. + period: 2024-01 + input: + state_code: OR + immigration_status: REFUGEE + wa_tanf_income_eligible: true + wa_tanf_resources_eligible: true + output: + wa_rca_eligible: false + +- name: Case 7, undocumented - ineligible. + period: 2024-01 + input: + state_code: WA + immigration_status: UNDOCUMENTED + wa_tanf_income_eligible: true + wa_tanf_resources_eligible: true + output: + wa_rca_eligible: false diff --git a/policyengine_us/tests/policy/baseline/gov/states/wa/dshs/rca/eligibility/wa_rca_immigration_status_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/wa/dshs/rca/eligibility/wa_rca_immigration_status_eligible.yaml new file mode 100644 index 00000000000..a1072179760 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/wa/dshs/rca/eligibility/wa_rca_immigration_status_eligible.yaml @@ -0,0 +1,79 @@ +- name: Case 1, refugee is eligible. + period: 2024-01 + input: + state_code: WA + immigration_status: REFUGEE + output: + wa_rca_immigration_status_eligible: true + +- name: Case 2, asylee is eligible. + period: 2024-01 + input: + state_code: WA + immigration_status: ASYLEE + output: + wa_rca_immigration_status_eligible: true + +- name: Case 3, Cuban or Haitian entrant is eligible. + period: 2024-01 + input: + state_code: WA + immigration_status: CUBAN_HAITIAN_ENTRANT + output: + wa_rca_immigration_status_eligible: true + +- name: Case 4, deportation-withheld is eligible. + period: 2024-01 + input: + state_code: WA + immigration_status: DEPORTATION_WITHHELD + output: + wa_rca_immigration_status_eligible: true + +- name: Case 5, conditional entrant is eligible. + period: 2024-01 + input: + state_code: WA + immigration_status: CONDITIONAL_ENTRANT + output: + wa_rca_immigration_status_eligible: true + +- name: Case 6, humanitarian parolee is eligible. + period: 2024-01 + input: + state_code: WA + immigration_status: PAROLED_ONE_YEAR + output: + wa_rca_immigration_status_eligible: true + +- name: Case 7, US citizen is ineligible. + period: 2024-01 + input: + state_code: WA + immigration_status: CITIZEN + output: + wa_rca_immigration_status_eligible: false + +- name: Case 8, lawful permanent resident is ineligible. + period: 2024-01 + input: + state_code: WA + immigration_status: LEGAL_PERMANENT_RESIDENT + output: + wa_rca_immigration_status_eligible: false + +- name: Case 9, undocumented immigrant is ineligible. + period: 2024-01 + input: + state_code: WA + immigration_status: UNDOCUMENTED + output: + wa_rca_immigration_status_eligible: false + +- name: Case 10, DACA recipient is ineligible. + period: 2024-01 + input: + state_code: WA + immigration_status: DACA + output: + wa_rca_immigration_status_eligible: false diff --git a/policyengine_us/tests/policy/baseline/gov/states/wa/dshs/rca/wa_rca.yaml b/policyengine_us/tests/policy/baseline/gov/states/wa/dshs/rca/wa_rca.yaml new file mode 100644 index 00000000000..30114ec7ffb --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/wa/dshs/rca/wa_rca.yaml @@ -0,0 +1,67 @@ +- name: Case 1, eligible refugee with no income. + period: 2024-01 + absolute_error_margin: 0.1 + input: + state_code: WA + wa_rca_eligible: true + wa_tanf_payment_standard: 450 + wa_tanf_countable_income: 0 + output: + # Single-person payment standard = $450 (2024 Jan, family of 1) + wa_rca: 450 + +- name: Case 2, eligible refugee family with partial income. + period: 2024-01 + absolute_error_margin: 0.1 + input: + state_code: WA + wa_rca_eligible: true + wa_tanf_payment_standard: 706 + wa_tanf_countable_income: 250 + output: + # Benefit = $706 - $250 = $456 + wa_rca: 456 + +- name: Case 3, countable income equals payment standard. + period: 2024-01 + absolute_error_margin: 0.1 + input: + state_code: WA + wa_rca_eligible: true + wa_tanf_payment_standard: 706 + wa_tanf_countable_income: 706 + output: + wa_rca: 0 + +- name: Case 4, countable income exceeds payment standard. + period: 2024-01 + absolute_error_margin: 0.1 + input: + state_code: WA + wa_rca_eligible: true + wa_tanf_payment_standard: 706 + wa_tanf_countable_income: 900 + output: + wa_rca: 0 + +- name: Case 5, ineligible household. + period: 2024-01 + absolute_error_margin: 0.1 + input: + state_code: WA + wa_rca_eligible: false + wa_tanf_payment_standard: 706 + wa_tanf_countable_income: 0 + output: + wa_rca: 0 + +- name: Case 6, negative countable income capped at payment standard. + period: 2024-01 + absolute_error_margin: 0.1 + input: + state_code: WA + wa_rca_eligible: true + wa_tanf_payment_standard: 450 + wa_tanf_countable_income: -500 + output: + wa_rca: 450 diff --git a/policyengine_us/tests/policy/baseline/gov/states/wa/dshs/sfa/eligibility/wa_sfa_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/wa/dshs/sfa/eligibility/wa_sfa_eligible.yaml new file mode 100644 index 00000000000..7b6b60b0a7a --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/wa/dshs/sfa/eligibility/wa_sfa_eligible.yaml @@ -0,0 +1,94 @@ +- name: Case 1, LPR in bar with child meets all requirements - eligible. + period: 2024-01 + input: + state_code: WA + immigration_status: LEGAL_PERMANENT_RESIDENT + years_since_us_entry: 2 + is_demographic_tanf_eligible: true + wa_tanf_income_eligible: true + wa_tanf_resources_eligible: true + output: + wa_sfa_eligible: true + +- name: Case 2, LPR past bar - ineligible (qualifies for TANF instead). + period: 2024-01 + input: + state_code: WA + immigration_status: LEGAL_PERMANENT_RESIDENT + years_since_us_entry: 6 + is_demographic_tanf_eligible: true + wa_tanf_income_eligible: true + wa_tanf_resources_eligible: true + output: + wa_sfa_eligible: false + +- name: Case 3, refugee - ineligible (qualifies for TANF instead). + period: 2024-01 + input: + state_code: WA + immigration_status: REFUGEE + years_since_us_entry: 0 + is_demographic_tanf_eligible: true + wa_tanf_income_eligible: true + wa_tanf_resources_eligible: true + output: + wa_sfa_eligible: false + +- name: Case 4, LPR in bar without demographic eligibility - ineligible. + period: 2024-01 + input: + state_code: WA + immigration_status: LEGAL_PERMANENT_RESIDENT + years_since_us_entry: 2 + is_demographic_tanf_eligible: false + wa_tanf_income_eligible: true + wa_tanf_resources_eligible: true + output: + wa_sfa_eligible: false + +- name: Case 5, LPR in bar with income ineligible - ineligible. + period: 2024-01 + input: + state_code: WA + immigration_status: LEGAL_PERMANENT_RESIDENT + years_since_us_entry: 2 + is_demographic_tanf_eligible: true + wa_tanf_income_eligible: false + wa_tanf_resources_eligible: true + output: + wa_sfa_eligible: false + +- name: Case 6, LPR in bar with resources ineligible - ineligible. + period: 2024-01 + input: + state_code: WA + immigration_status: LEGAL_PERMANENT_RESIDENT + years_since_us_entry: 2 + is_demographic_tanf_eligible: true + wa_tanf_income_eligible: true + wa_tanf_resources_eligible: false + output: + wa_sfa_eligible: false + +- name: Case 7, undocumented - ineligible. + period: 2024-01 + input: + state_code: WA + immigration_status: UNDOCUMENTED + is_demographic_tanf_eligible: true + wa_tanf_income_eligible: true + wa_tanf_resources_eligible: true + output: + wa_sfa_eligible: false + +- name: Case 8, non-WA state - ineligible. + period: 2024-01 + input: + state_code: OR + immigration_status: LEGAL_PERMANENT_RESIDENT + years_since_us_entry: 2 + is_demographic_tanf_eligible: true + wa_tanf_income_eligible: true + wa_tanf_resources_eligible: true + output: + wa_sfa_eligible: false diff --git a/policyengine_us/tests/policy/baseline/gov/states/wa/dshs/sfa/eligibility/wa_sfa_immigration_status_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/wa/dshs/sfa/eligibility/wa_sfa_immigration_status_eligible.yaml new file mode 100644 index 00000000000..526c23b3be1 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/wa/dshs/sfa/eligibility/wa_sfa_immigration_status_eligible.yaml @@ -0,0 +1,68 @@ +- name: Case 1, US citizen is not SFA-eligible (TANF-eligible instead). + period: 2024-01 + input: + state_code: WA + immigration_status: CITIZEN + output: + wa_sfa_immigration_status_eligible: false + +- name: Case 2, LPR in 5-year bar is SFA-eligible. + period: 2024-01 + input: + state_code: WA + immigration_status: LEGAL_PERMANENT_RESIDENT + years_since_us_entry: 2 + output: + wa_sfa_immigration_status_eligible: true + +- name: Case 3, LPR past 5-year bar is not SFA-eligible (TANF-eligible instead). + period: 2024-01 + input: + state_code: WA + immigration_status: LEGAL_PERMANENT_RESIDENT + years_since_us_entry: 6 + output: + wa_sfa_immigration_status_eligible: false + +- name: Case 4, paroled one-year alien in bar is SFA-eligible. + period: 2024-01 + input: + state_code: WA + immigration_status: PAROLED_ONE_YEAR + years_since_us_entry: 1 + output: + wa_sfa_immigration_status_eligible: true + +- name: Case 5, refugee is not SFA-eligible (TANF bar-exempt). + period: 2024-01 + input: + state_code: WA + immigration_status: REFUGEE + years_since_us_entry: 0 + output: + wa_sfa_immigration_status_eligible: false + +- name: Case 6, asylee is not SFA-eligible (TANF bar-exempt). + period: 2024-01 + input: + state_code: WA + immigration_status: ASYLEE + years_since_us_entry: 0 + output: + wa_sfa_immigration_status_eligible: false + +- name: Case 7, undocumented immigrant is not SFA-eligible. + period: 2024-01 + input: + state_code: WA + immigration_status: UNDOCUMENTED + output: + wa_sfa_immigration_status_eligible: false + +- name: Case 8, DACA recipient is not SFA-eligible (not a qualified alien). + period: 2024-01 + input: + state_code: WA + immigration_status: DACA + output: + wa_sfa_immigration_status_eligible: false diff --git a/policyengine_us/tests/policy/baseline/gov/states/wa/dshs/sfa/wa_sfa.yaml b/policyengine_us/tests/policy/baseline/gov/states/wa/dshs/sfa/wa_sfa.yaml new file mode 100644 index 00000000000..a686b34e2d2 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/wa/dshs/sfa/wa_sfa.yaml @@ -0,0 +1,69 @@ +- name: Case 1, eligible LPR in bar with no income. + period: 2024-01 + absolute_error_margin: 0.1 + input: + state_code: WA + wa_sfa_eligible: true + wa_tanf_payment_standard: 706 + wa_tanf_countable_income: 0 + output: + # Benefit = $706 - $0 = $706 (uses TANF payment standard per WAC 388-478-0020) + wa_sfa: 706 + +- name: Case 2, eligible LPR in bar with partial income. + period: 2024-01 + absolute_error_margin: 0.1 + input: + state_code: WA + wa_sfa_eligible: true + wa_tanf_payment_standard: 706 + wa_tanf_countable_income: 250 + output: + # Benefit = $706 - $250 = $456 + wa_sfa: 456 + +- name: Case 3, eligible with income equal to payment standard. + period: 2024-01 + absolute_error_margin: 0.1 + input: + state_code: WA + wa_sfa_eligible: true + wa_tanf_payment_standard: 706 + wa_tanf_countable_income: 706 + output: + wa_sfa: 0 + +- name: Case 4, eligible with income exceeding payment standard. + period: 2024-01 + absolute_error_margin: 0.1 + input: + state_code: WA + wa_sfa_eligible: true + wa_tanf_payment_standard: 706 + wa_tanf_countable_income: 900 + output: + # Benefit capped at 0, not negative + wa_sfa: 0 + +- name: Case 5, ineligible household. + period: 2024-01 + absolute_error_margin: 0.1 + input: + state_code: WA + wa_sfa_eligible: false + wa_tanf_payment_standard: 706 + wa_tanf_countable_income: 0 + output: + wa_sfa: 0 + +- name: Case 6, negative countable income capped at payment standard. + period: 2024-01 + absolute_error_margin: 0.1 + input: + state_code: WA + wa_sfa_eligible: true + wa_tanf_payment_standard: 706 + wa_tanf_countable_income: -500 + output: + # max_ on countable_income prevents negative-income inflation + wa_sfa: 706 diff --git a/policyengine_us/tests/policy/baseline/gov/states/wa/dshs/tanf/eligibility/wa_tanf_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/wa/dshs/tanf/eligibility/wa_tanf_eligible.yaml index 3ae2c572f55..0a6204fccda 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/wa/dshs/tanf/eligibility/wa_tanf_eligible.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/wa/dshs/tanf/eligibility/wa_tanf_eligible.yaml @@ -3,7 +3,6 @@ input: state_code: WA is_demographic_tanf_eligible: true - is_citizen_or_legal_immigrant: true wa_tanf_income_eligible: true wa_tanf_resources_eligible: true output: @@ -14,29 +13,63 @@ input: state_code: WA is_demographic_tanf_eligible: false - is_citizen_or_legal_immigrant: true wa_tanf_income_eligible: true wa_tanf_resources_eligible: true output: wa_tanf_eligible: false -- name: Missing citizenship - ineligible +- name: Undocumented immigrant - ineligible period: 2024-01 input: state_code: WA + immigration_status: UNDOCUMENTED is_demographic_tanf_eligible: true - is_citizen_or_legal_immigrant: false wa_tanf_income_eligible: true wa_tanf_resources_eligible: true output: wa_tanf_eligible: false +- name: LPR inside 5-year bar - ineligible + period: 2024-01 + input: + state_code: WA + immigration_status: LEGAL_PERMANENT_RESIDENT + years_since_us_entry: 2 + is_demographic_tanf_eligible: true + wa_tanf_income_eligible: true + wa_tanf_resources_eligible: true + output: + wa_tanf_eligible: false + +- name: LPR past 5-year bar - eligible + period: 2024-01 + input: + state_code: WA + immigration_status: LEGAL_PERMANENT_RESIDENT + years_since_us_entry: 6 + is_demographic_tanf_eligible: true + wa_tanf_income_eligible: true + wa_tanf_resources_eligible: true + output: + wa_tanf_eligible: true + +- name: Refugee bar-exempt - eligible + period: 2024-01 + input: + state_code: WA + immigration_status: REFUGEE + years_since_us_entry: 0 + is_demographic_tanf_eligible: true + wa_tanf_income_eligible: true + wa_tanf_resources_eligible: true + output: + wa_tanf_eligible: true + - name: Income ineligible - ineligible period: 2024-01 input: state_code: WA is_demographic_tanf_eligible: true - is_citizen_or_legal_immigrant: true wa_tanf_income_eligible: false wa_tanf_resources_eligible: true output: @@ -47,7 +80,6 @@ input: state_code: WA is_demographic_tanf_eligible: true - is_citizen_or_legal_immigrant: true wa_tanf_income_eligible: true wa_tanf_resources_eligible: false output: @@ -58,7 +90,6 @@ input: state_code: ID is_demographic_tanf_eligible: true - is_citizen_or_legal_immigrant: true wa_tanf_income_eligible: true wa_tanf_resources_eligible: true output: diff --git a/policyengine_us/tests/policy/baseline/gov/states/wa/dshs/tanf/eligibility/wa_tanf_immigration_status_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/wa/dshs/tanf/eligibility/wa_tanf_immigration_status_eligible.yaml new file mode 100644 index 00000000000..cdcfab101ae --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/wa/dshs/tanf/eligibility/wa_tanf_immigration_status_eligible.yaml @@ -0,0 +1,85 @@ +- name: Case 1, US citizen is eligible. + period: 2024-01 + input: + state_code: WA + immigration_status: CITIZEN + output: + wa_tanf_immigration_status_eligible: true + +- name: Case 2, refugee just arrived is eligible (bar-exempt). + period: 2024-01 + input: + state_code: WA + immigration_status: REFUGEE + years_since_us_entry: 0 + output: + wa_tanf_immigration_status_eligible: true + +- name: Case 3, asylee just arrived is eligible (bar-exempt). + period: 2024-01 + input: + state_code: WA + immigration_status: ASYLEE + years_since_us_entry: 0 + output: + wa_tanf_immigration_status_eligible: true + +- name: Case 4, Cuban or Haitian entrant just arrived is eligible (bar-exempt). + period: 2024-01 + input: + state_code: WA + immigration_status: CUBAN_HAITIAN_ENTRANT + years_since_us_entry: 0 + output: + wa_tanf_immigration_status_eligible: true + +- name: Case 5, LPR in 5-year bar is ineligible. + period: 2024-01 + input: + state_code: WA + immigration_status: LEGAL_PERMANENT_RESIDENT + years_since_us_entry: 2 + output: + wa_tanf_immigration_status_eligible: false + +- name: Case 6, LPR at exactly 5 years is eligible. + period: 2024-01 + input: + state_code: WA + immigration_status: LEGAL_PERMANENT_RESIDENT + years_since_us_entry: 5 + output: + wa_tanf_immigration_status_eligible: true + +- name: Case 7, LPR past 5-year bar is eligible. + period: 2024-01 + input: + state_code: WA + immigration_status: LEGAL_PERMANENT_RESIDENT + years_since_us_entry: 10 + output: + wa_tanf_immigration_status_eligible: true + +- name: Case 8, LPR using default years_since_us_entry is eligible. + period: 2024-01 + input: + state_code: WA + immigration_status: LEGAL_PERMANENT_RESIDENT + output: + wa_tanf_immigration_status_eligible: true + +- name: Case 9, undocumented immigrant is ineligible. + period: 2024-01 + input: + state_code: WA + immigration_status: UNDOCUMENTED + output: + wa_tanf_immigration_status_eligible: false + +- name: Case 10, DACA recipient is ineligible. + period: 2024-01 + input: + state_code: WA + immigration_status: DACA + output: + wa_tanf_immigration_status_eligible: false diff --git a/policyengine_us/tests/policy/baseline/gov/states/wa/dshs/tanf/eligibility/wa_tanf_income_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/wa/dshs/tanf/eligibility/wa_tanf_income_eligible.yaml index 0c0bba89104..f0abc036356 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/wa/dshs/tanf/eligibility/wa_tanf_income_eligible.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/wa/dshs/tanf/eligibility/wa_tanf_income_eligible.yaml @@ -1,4 +1,6 @@ -# Tests for Aug 2024+ income limits +# Tests cover both the WAC 388-478-0035 gross earned income limit +# and the WAC 388-450-0162 countable-income-under-payment-standard test. + - name: Case 1, zero gross earned income. period: 2025-01 input: @@ -6,8 +8,6 @@ spm_unit_size: 3 tanf_gross_earned_income: 0 output: - # Income limit for family of 3: $1,912 (Aug 2024+) - # Gross earned: $0 <= $1,912 wa_tanf_income_eligible: true - name: Case 2, gross earned income below threshold. @@ -17,77 +17,61 @@ spm_unit_size: 3 tanf_gross_earned_income: 1_500 output: - # Income limit for family of 3: $1,912 - # Gross earned: $1,500 <= $1,912 + # Countable earned = max($1,500 - $500, 0) x 0.5 = $500 < $706 PS → eligible wa_tanf_income_eligible: true -- name: Case 3, gross earned income exactly at threshold. +- name: Case 3, gross earned at threshold, countable equals payment standard. period: 2025-01 input: state_code: WA spm_unit_size: 3 tanf_gross_earned_income: 1_912 output: - # Income limit for family of 3: $1,912 - # Gross earned: $1,912 <= $1,912 - wa_tanf_income_eligible: true + # Gross earned ($1,912) at WAC 388-478-0035 limit → passes + # Countable earned = max($1,912 - $500, 0) x 0.5 = $706 = PS → fails WAC 388-450-0162 + wa_tanf_income_eligible: false -- name: Case 4, gross earned income one dollar over threshold. +- name: Case 4, gross earned one dollar over threshold. period: 2025-01 input: state_code: WA spm_unit_size: 3 tanf_gross_earned_income: 1_913 output: - # Income limit for family of 3: $1,912 - # Gross earned: $1,913 > $1,912 wa_tanf_income_eligible: false -- name: Case 5, gross earned income far over threshold. +- name: Case 5, gross earned far over threshold. period: 2025-01 input: state_code: WA spm_unit_size: 3 tanf_gross_earned_income: 3_000 output: - # Income limit for family of 3: $1,912 - # Gross earned: $3,000 > $1,912 wa_tanf_income_eligible: false -- name: Case 6, family size 1 at threshold. - period: 2025-01 - input: - state_code: WA - spm_unit_size: 1 - tanf_gross_earned_income: 1_400 - output: - # Income limit for family of 1: $1,400 (Aug 2024+) - # Gross earned: $1,400 <= $1,400 - wa_tanf_income_eligible: true - -- name: Case 7, family size 10 at maximum threshold. +- name: Case 6, high unearned income fails payment standard test. period: 2025-01 input: state_code: WA - spm_unit_size: 10 - tanf_gross_earned_income: 3_824 + spm_unit_size: 3 + tanf_gross_earned_income: 0 + tanf_gross_unearned_income: 1_000 output: - # Income limit for family of 10: $3,824 (Aug 2024+) - # Gross earned: $3,824 <= $3,824 - wa_tanf_income_eligible: true + # Countable = $1,000 > PS ($706) → fails WAC 388-450-0162 + wa_tanf_income_eligible: false -- name: Case 8, family size 15 capped at size 10 limit. +- name: Case 7, moderate unearned income below payment standard. period: 2025-01 input: state_code: WA - spm_unit_size: 15 - tanf_gross_earned_income: 3_824 + spm_unit_size: 3 + tanf_gross_earned_income: 0 + tanf_gross_unearned_income: 300 output: - # Income limit capped at family of 10: $3,824 - # Gross earned: $3,824 <= $3,824 + # Countable = $300 < PS ($706) → eligible wa_tanf_income_eligible: true -- name: Case 9, only calculate for WA. +- name: Case 8, only calculate for WA. period: 2025-01 input: state_code: MT @@ -96,71 +80,60 @@ output: wa_tanf_income_eligible: false -# Historical tests - verify 2024-01 income limits (before Aug 2024 increase) -- name: Case 10, 2024-01 uses Jan 2024 income limits. +- name: Case 9, 2024-01 at Jan 2024 gross earned limit. period: 2024-01 input: state_code: WA spm_unit_size: 3 tanf_gross_earned_income: 1_412 output: - # Income limit for family of 3 in Jan 2024: $1,412 - # Gross earned: $1,412 <= $1,412 - wa_tanf_income_eligible: true + # Gross earned at limit; countable = $1,412 x 0.5 = $706 = PS → fails payment standard test + wa_tanf_income_eligible: false -- name: Case 11, 2024-01 over Jan 2024 limit. +- name: Case 10, 2024-01 over Jan 2024 limit. period: 2024-01 input: state_code: WA spm_unit_size: 3 tanf_gross_earned_income: 1_413 output: - # Income limit for family of 3 in Jan 2024: $1,412 - # Gross earned: $1,413 > $1,412 wa_tanf_income_eligible: false -# Historical tests - verify 2018-01 income limits (2016 values) -- name: Case 12, 2018-01 uses 2016 income limits. +- name: Case 11, 2018-01 at 2016 gross earned limit. period: 2018-01 input: state_code: WA spm_unit_size: 3 tanf_gross_earned_income: 1_042 output: - # Income limit for family of 3 in 2018-01: $1,042 (2016 value) - # Gross earned: $1,042 <= $1,042 - wa_tanf_income_eligible: true + # Countable = $1,042 x 0.5 = $521 = PS → fails payment standard test + wa_tanf_income_eligible: false -- name: Case 13, 2018-01 over 2016 income limit. +- name: Case 12, 2018-01 well below threshold. period: 2018-01 input: state_code: WA spm_unit_size: 3 - tanf_gross_earned_income: 1_043 + tanf_gross_earned_income: 500 output: - # Income limit for family of 3 in 2018-01: $1,042 - # Gross earned: $1,043 > $1,042 - wa_tanf_income_eligible: false + # Countable = $500 x 0.5 = $250 < PS ($521) → eligible + wa_tanf_income_eligible: true -# Historical tests - verify 2021-07 income limits (15% increase) -- name: Case 14, 2022-01 uses July 2021 income limits. +- name: Case 13, 2022-01 at July 2021 gross earned limit. period: 2022-01 input: state_code: WA spm_unit_size: 3 tanf_gross_earned_income: 1_308 output: - # Income limit for family of 3 in 2022-01: $1,308 (15% increase) - # Gross earned: $1,308 <= $1,308 - wa_tanf_income_eligible: true + # Countable = $1,308 x 0.5 = $654 = PS → fails payment standard test + wa_tanf_income_eligible: false -- name: Case 15, 2022-01 over July 2021 limit. +- name: Case 14, 2022-01 over July 2021 limit. period: 2022-01 input: state_code: WA spm_unit_size: 3 tanf_gross_earned_income: 1_309 output: - # Income limit for family of 3 in 2022-01: $1,308 - # Gross earned: $1,309 > $1,308 wa_tanf_income_eligible: false diff --git a/policyengine_us/tests/policy/baseline/gov/states/wa/dshs/tanf/integration.yaml b/policyengine_us/tests/policy/baseline/gov/states/wa/dshs/tanf/integration.yaml index 981285e2d37..bb3548efa8f 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/wa/dshs/tanf/integration.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/wa/dshs/tanf/integration.yaml @@ -98,7 +98,8 @@ # Monthly income: $22,944 / 12 = $1,912 (at income limit) # Countable earned = max($1,912 - $500, 0) × 0.5 = $706 wa_tanf_countable_income: 706 - wa_tanf_eligible: true + # Countable income ($706) not less than payment standard ($706) per WAC 388-450-0162 + wa_tanf_eligible: false wa_tanf: 0 - name: Case 4, two parents with 3 children, one parent working. @@ -397,7 +398,8 @@ wa_tanf_payment_standard: 959 # Monthly unearned income: $12,000 / 12 = $1,000 wa_tanf_countable_income: 1_000 - wa_tanf_eligible: true + # Countable income ($1,000) not less than payment standard ($959) per WAC 388-450-0162 + wa_tanf_eligible: false wa_tanf: 0 - name: Case 12, single parent with 4 children, self-employment income. @@ -540,7 +542,8 @@ # Monthly income: $15,696 / 12 = $1,308 (at income limit) # Countable earned = $1,308 × 0.5 = $654 wa_tanf_countable_income: 654 - wa_tanf_eligible: true + # Countable income ($654) not less than payment standard ($654) per WAC 388-450-0162 + wa_tanf_eligible: false wa_tanf: 0 # Historical integration tests for 2018-01 period @@ -643,7 +646,8 @@ # Monthly income: $12,504 / 12 = $1,042 (at income limit) # Countable earned = $1,042 × 0.5 = $521 wa_tanf_countable_income: 521 - wa_tanf_eligible: true + # Countable income ($521) not less than payment standard ($521) per WAC 388-450-0162 + wa_tanf_eligible: false wa_tanf: 0 # Historical integration tests for 2024-01 period @@ -746,7 +750,8 @@ # Monthly income: $16,944 / 12 = $1,412 (at income limit) # Countable earned = $1,412 × 0.5 = $706 wa_tanf_countable_income: 706 - wa_tanf_eligible: true + # Countable income ($706) not less than payment standard ($706) per WAC 388-450-0162 + wa_tanf_eligible: false wa_tanf: 0 # Mixed earned + unearned income tests (post-Aug-2024) diff --git a/policyengine_us/variables/gov/states/wa/dshs/rca/eligibility/wa_rca_eligible.py b/policyengine_us/variables/gov/states/wa/dshs/rca/eligibility/wa_rca_eligible.py new file mode 100644 index 00000000000..fca26792c5a --- /dev/null +++ b/policyengine_us/variables/gov/states/wa/dshs/rca/eligibility/wa_rca_eligible.py @@ -0,0 +1,26 @@ +from policyengine_us.model_api import * + + +class wa_rca_eligible(Variable): + value_type = bool + entity = SPMUnit + label = "Washington Refugee Cash Assistance eligible" + definition_period = MONTH + defined_for = StateCode.WA + reference = ( + "https://app.leg.wa.gov/wac/default.aspx?cite=388-400-0030", + "https://app.leg.wa.gov/wac/default.aspx?cite=388-466-0120", + ) + + def formula(spm_unit, period, parameters): + # RCA does not require a dependent child, unlike TANF and SFA. + # Federal RCA eligibility is limited to the first 12 months after + # entry or status grant (8 USC 1522; 45 CFR 400.211); we do not + # track months-since-entry at the moment, so that window is not + # enforced here. + has_rca_eligible_immigrant = ( + add(spm_unit, period, ["wa_rca_immigration_status_eligible"]) > 0 + ) + income_eligible = spm_unit("wa_tanf_income_eligible", period) + resources_eligible = spm_unit("wa_tanf_resources_eligible", period.this_year) + return has_rca_eligible_immigrant & income_eligible & resources_eligible diff --git a/policyengine_us/variables/gov/states/wa/dshs/rca/eligibility/wa_rca_immigration_status_eligible.py b/policyengine_us/variables/gov/states/wa/dshs/rca/eligibility/wa_rca_immigration_status_eligible.py new file mode 100644 index 00000000000..ae774efbe37 --- /dev/null +++ b/policyengine_us/variables/gov/states/wa/dshs/rca/eligibility/wa_rca_immigration_status_eligible.py @@ -0,0 +1,20 @@ +from policyengine_us.model_api import * + + +class wa_rca_immigration_status_eligible(Variable): + value_type = bool + entity = Person + label = "Washington Refugee Cash Assistance immigration status eligible" + definition_period = MONTH + defined_for = StateCode.WA + reference = ( + "https://www.law.cornell.edu/uscode/text/8/1522", + "https://app.leg.wa.gov/wac/default.aspx?cite=388-466-0120", + "https://app.leg.wa.gov/wac/default.aspx?cite=388-400-0030", + ) + + def formula(person, period, parameters): + status = person("immigration_status", period.this_year) + status_str = status.decode_to_str() + p = parameters(period).gov.states.wa.dshs.rca + return np.isin(status_str, p.eligible_immigration_statuses) diff --git a/policyengine_us/variables/gov/states/wa/dshs/rca/wa_rca.py b/policyengine_us/variables/gov/states/wa/dshs/rca/wa_rca.py new file mode 100644 index 00000000000..72146824a2f --- /dev/null +++ b/policyengine_us/variables/gov/states/wa/dshs/rca/wa_rca.py @@ -0,0 +1,19 @@ +from policyengine_us.model_api import * + + +class wa_rca(Variable): + value_type = float + entity = SPMUnit + label = "Washington Refugee Cash Assistance" + unit = USD + definition_period = MONTH + reference = ( + "https://app.leg.wa.gov/wac/default.aspx?cite=388-478-0020", + "https://app.leg.wa.gov/wac/default.aspx?cite=388-466-0120", + ) + defined_for = "wa_rca_eligible" + + def formula(spm_unit, period, parameters): + payment_standard = spm_unit("wa_tanf_payment_standard", period) + countable_income = max_(spm_unit("wa_tanf_countable_income", period), 0) + return max_(payment_standard - countable_income, 0) diff --git a/policyengine_us/variables/gov/states/wa/dshs/sfa/eligibility/wa_sfa_eligible.py b/policyengine_us/variables/gov/states/wa/dshs/sfa/eligibility/wa_sfa_eligible.py new file mode 100644 index 00000000000..4323110793c --- /dev/null +++ b/policyengine_us/variables/gov/states/wa/dshs/sfa/eligibility/wa_sfa_eligible.py @@ -0,0 +1,27 @@ +from policyengine_us.model_api import * + + +class wa_sfa_eligible(Variable): + value_type = bool + entity = SPMUnit + label = "Washington State Family Assistance eligible" + definition_period = MONTH + defined_for = StateCode.WA + reference = ( + "https://app.leg.wa.gov/wac/default.aspx?cite=388-400-0010", + "https://app.leg.wa.gov/rcw/default.aspx?cite=74.08A.010", + ) + + def formula(spm_unit, period, parameters): + demographic_eligible = spm_unit("is_demographic_tanf_eligible", period) + has_sfa_eligible_immigrant = ( + add(spm_unit, period, ["wa_sfa_immigration_status_eligible"]) > 0 + ) + income_eligible = spm_unit("wa_tanf_income_eligible", period) + resources_eligible = spm_unit("wa_tanf_resources_eligible", period.this_year) + return ( + demographic_eligible + & has_sfa_eligible_immigrant + & income_eligible + & resources_eligible + ) diff --git a/policyengine_us/variables/gov/states/wa/dshs/sfa/eligibility/wa_sfa_immigration_status_eligible.py b/policyengine_us/variables/gov/states/wa/dshs/sfa/eligibility/wa_sfa_immigration_status_eligible.py new file mode 100644 index 00000000000..e63a5e42666 --- /dev/null +++ b/policyengine_us/variables/gov/states/wa/dshs/sfa/eligibility/wa_sfa_immigration_status_eligible.py @@ -0,0 +1,21 @@ +from policyengine_us.model_api import * + + +class wa_sfa_immigration_status_eligible(Variable): + value_type = bool + entity = Person + label = "Washington State Family Assistance immigration status eligible" + definition_period = MONTH + defined_for = StateCode.WA + reference = ( + "https://app.leg.wa.gov/wac/default.aspx?cite=388-400-0010", + "https://app.leg.wa.gov/wac/default.aspx?cite=388-424-0015", + "https://app.leg.wa.gov/rcw/default.aspx?cite=74.08A.010", + ) + + def formula(person, period, parameters): + is_qualified = person("is_citizen_or_legal_immigrant", period.this_year) + tanf_immigration_eligible = person( + "wa_tanf_immigration_status_eligible", period + ) + return is_qualified & ~tanf_immigration_eligible diff --git a/policyengine_us/variables/gov/states/wa/dshs/sfa/wa_sfa.py b/policyengine_us/variables/gov/states/wa/dshs/sfa/wa_sfa.py new file mode 100644 index 00000000000..f3a434b25d0 --- /dev/null +++ b/policyengine_us/variables/gov/states/wa/dshs/sfa/wa_sfa.py @@ -0,0 +1,19 @@ +from policyengine_us.model_api import * + + +class wa_sfa(Variable): + value_type = float + entity = SPMUnit + label = "Washington State Family Assistance" + unit = USD + definition_period = MONTH + reference = ( + "https://app.leg.wa.gov/wac/default.aspx?cite=388-478-0020", + "https://app.leg.wa.gov/wac/default.aspx?cite=388-450-0165", + ) + defined_for = "wa_sfa_eligible" + + def formula(spm_unit, period, parameters): + payment_standard = spm_unit("wa_tanf_payment_standard", period) + countable_income = max_(spm_unit("wa_tanf_countable_income", period), 0) + return max_(payment_standard - countable_income, 0) diff --git a/policyengine_us/variables/gov/states/wa/dshs/tanf/eligibility/wa_tanf_eligible.py b/policyengine_us/variables/gov/states/wa/dshs/tanf/eligibility/wa_tanf_eligible.py index 67eb8b2a78e..51290d53588 100644 --- a/policyengine_us/variables/gov/states/wa/dshs/tanf/eligibility/wa_tanf_eligible.py +++ b/policyengine_us/variables/gov/states/wa/dshs/tanf/eligibility/wa_tanf_eligible.py @@ -11,9 +11,14 @@ class wa_tanf_eligible(Variable): def formula(spm_unit, period, parameters): demographic_eligible = spm_unit("is_demographic_tanf_eligible", period) - has_citizen = ( - add(spm_unit, period.this_year, ["is_citizen_or_legal_immigrant"]) > 0 + has_tanf_eligible_immigrant = ( + add(spm_unit, period, ["wa_tanf_immigration_status_eligible"]) > 0 ) income_eligible = spm_unit("wa_tanf_income_eligible", period) resources_eligible = spm_unit("wa_tanf_resources_eligible", period.this_year) - return demographic_eligible & has_citizen & income_eligible & resources_eligible + return ( + demographic_eligible + & has_tanf_eligible_immigrant + & income_eligible + & resources_eligible + ) diff --git a/policyengine_us/variables/gov/states/wa/dshs/tanf/eligibility/wa_tanf_immigration_status_eligible.py b/policyengine_us/variables/gov/states/wa/dshs/tanf/eligibility/wa_tanf_immigration_status_eligible.py new file mode 100644 index 00000000000..9b2ff79de51 --- /dev/null +++ b/policyengine_us/variables/gov/states/wa/dshs/tanf/eligibility/wa_tanf_immigration_status_eligible.py @@ -0,0 +1,27 @@ +from policyengine_us.model_api import * + + +class wa_tanf_immigration_status_eligible(Variable): + value_type = bool + entity = Person + label = "Washington TANF immigration status eligible" + definition_period = MONTH + defined_for = StateCode.WA + reference = ( + "https://www.law.cornell.edu/uscode/text/8/1613", + "https://app.leg.wa.gov/wac/default.aspx?cite=388-424-0020", + ) + + def formula(person, period, parameters): + status = person("immigration_status", period.this_year) + status_str = status.decode_to_str() + is_citizen = status == status.possible_values.CITIZEN + + p = parameters(period).gov.hhs.tanf + is_bar_exempt = np.isin(status_str, p.bar_exempt_immigration_statuses) + + is_qualified = person("is_citizen_or_legal_immigrant", period.this_year) + years_in_us = person("years_since_us_entry", period.this_year) + past_bar = years_in_us >= p.five_year_bar_years + + return is_citizen | is_bar_exempt | (is_qualified & past_bar) diff --git a/policyengine_us/variables/gov/states/wa/dshs/tanf/eligibility/wa_tanf_income_eligible.py b/policyengine_us/variables/gov/states/wa/dshs/tanf/eligibility/wa_tanf_income_eligible.py index 3f5e96b8cd8..2acfab5772d 100644 --- a/policyengine_us/variables/gov/states/wa/dshs/tanf/eligibility/wa_tanf_income_eligible.py +++ b/policyengine_us/variables/gov/states/wa/dshs/tanf/eligibility/wa_tanf_income_eligible.py @@ -8,6 +8,7 @@ class wa_tanf_income_eligible(Variable): definition_period = MONTH reference = ( "https://app.leg.wa.gov/wac/default.aspx?cite=388-478-0035", + "https://app.leg.wa.gov/wac/default.aspx?cite=388-450-0162", "https://app.leg.wa.gov/wac/default.aspx?cite=388-450-0170", ) defined_for = StateCode.WA @@ -17,4 +18,10 @@ def formula(spm_unit, period, parameters): p = parameters(period).gov.states.wa.dshs.tanf size = spm_unit("spm_unit_size", period) size_capped = min_(size, p.maximum_family_size) - return gross_earned <= p.income.limit[size_capped] + gross_earned_eligible = gross_earned <= p.income.limit[size_capped] + + countable_income = spm_unit("wa_tanf_countable_income", period) + payment_standard = spm_unit("wa_tanf_payment_standard", period) + countable_eligible = countable_income < payment_standard + + return gross_earned_eligible & countable_eligible diff --git a/policyengine_us/variables/household/demographic/person/years_since_us_entry.py b/policyengine_us/variables/household/demographic/person/years_since_us_entry.py new file mode 100644 index 00000000000..c1209de8bca --- /dev/null +++ b/policyengine_us/variables/household/demographic/person/years_since_us_entry.py @@ -0,0 +1,11 @@ +from policyengine_us.model_api import * + + +class years_since_us_entry(Variable): + value_type = float + entity = Person + label = "Years since US entry or qualified immigration status grant" + unit = "year" + definition_period = YEAR + default_value = 5 + reference = "https://www.law.cornell.edu/uscode/text/8/1613" diff --git a/policyengine_us/variables/household/income/spm_unit/spm_unit_benefits.py b/policyengine_us/variables/household/income/spm_unit/spm_unit_benefits.py index 9fdb27b3401..4393ee80b38 100644 --- a/policyengine_us/variables/household/income/spm_unit/spm_unit_benefits.py +++ b/policyengine_us/variables/household/income/spm_unit/spm_unit_benefits.py @@ -43,6 +43,8 @@ def formula(spm_unit, period, parameters): "spm_unit_broadband_subsidy", "spm_unit_energy_subsidy", "tanf", + "wa_sfa", + "wa_rca", "high_efficiency_electric_home_rebate", "residential_efficiency_electrification_rebate", "unemployment_compensation", From dd7ecfb8cabc2d55f567a77449a023fc0dee8c1a Mon Sep 17 00:00:00 2001 From: Ziming Date: Fri, 24 Apr 2026 00:50:46 -0400 Subject: [PATCH 2/9] Add wa_show_all_cash_assistance_programs override and integration test Adds an SPMUnit-level boolean input that lets API consumers display all three WA cash assistance programs' benefit amounts for the same household. The override bypasses the immigration gate on TANF, SFA, and RCA; demographic, income, and resource tests still apply. Also adds a cross-program integration test covering the mutually- exclusive immigration gates and the override behavior. Co-Authored-By: Claude Opus 4.7 (1M context) --- changelog.d/wa-rca-tanf-fixes.added-2.md | 1 + .../gov/states/wa/dshs/integration.yaml | 227 ++++++++++++++++++ .../dshs/rca/eligibility/wa_rca_eligible.py | 7 +- .../dshs/sfa/eligibility/wa_sfa_eligible.py | 3 +- .../dshs/tanf/eligibility/wa_tanf_eligible.py | 3 +- .../wa_show_all_cash_assistance_programs.py | 10 + 6 files changed, 248 insertions(+), 3 deletions(-) create mode 100644 changelog.d/wa-rca-tanf-fixes.added-2.md create mode 100644 policyengine_us/tests/policy/baseline/gov/states/wa/dshs/integration.yaml create mode 100644 policyengine_us/variables/gov/states/wa/dshs/wa_show_all_cash_assistance_programs.py diff --git a/changelog.d/wa-rca-tanf-fixes.added-2.md b/changelog.d/wa-rca-tanf-fixes.added-2.md new file mode 100644 index 00000000000..9661a1b365b --- /dev/null +++ b/changelog.d/wa-rca-tanf-fixes.added-2.md @@ -0,0 +1 @@ +Washington `wa_show_all_cash_assistance_programs` override that bypasses the immigration gate on TANF, SFA, and RCA for consumers that want to display all three programs' benefit amounts side by side. diff --git a/policyengine_us/tests/policy/baseline/gov/states/wa/dshs/integration.yaml b/policyengine_us/tests/policy/baseline/gov/states/wa/dshs/integration.yaml new file mode 100644 index 00000000000..087e2c319f7 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/wa/dshs/integration.yaml @@ -0,0 +1,227 @@ +# Cross-program integration tests for Washington cash assistance +# programs: TANF, SFA, and RCA. Exercises the mutually-exclusive +# immigration gates and the wa_show_all_cash_assistance_programs +# override used by consumers that want to display all three programs' +# benefit amounts alongside each other. + +- name: Case 1, citizen family with child receives TANF only. + period: 2024-01 + absolute_error_margin: 0.1 + input: + people: + person1: + age: 30 + immigration_status: CITIZEN + person2: + age: 5 + is_tax_unit_dependent: true + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: WA + output: + wa_tanf_eligible: true + wa_sfa_eligible: false + wa_rca_eligible: false + # Family size 2 payment standard Jan 2024: $570 + wa_tanf: 570 + wa_sfa: 0 + wa_rca: 0 + +- name: Case 2, LPR in 5-year bar with child receives SFA only. + period: 2024-01 + absolute_error_margin: 0.1 + input: + people: + person1: + age: 30 + immigration_status: LEGAL_PERMANENT_RESIDENT + years_since_us_entry: 2 + person2: + age: 5 + is_tax_unit_dependent: true + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: WA + output: + wa_tanf_eligible: false + wa_sfa_eligible: true + wa_rca_eligible: false + wa_tanf: 0 + wa_sfa: 570 + wa_rca: 0 + +- name: Case 3, refugee family with child receives TANF and RCA. + period: 2024-01 + absolute_error_margin: 0.1 + input: + people: + person1: + age: 30 + immigration_status: REFUGEE + years_since_us_entry: 0 + person2: + age: 5 + is_tax_unit_dependent: true + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: WA + output: + # Refugees are bar-exempt (TANF) and RCA-eligible. Overlap persists + # until the 12-month RCA window is tracked. + wa_tanf_eligible: true + wa_sfa_eligible: false + wa_rca_eligible: true + wa_tanf: 570 + wa_sfa: 0 + wa_rca: 570 + +- name: Case 4, single refugee adult without child receives RCA only. + period: 2024-01 + absolute_error_margin: 0.1 + input: + people: + person1: + age: 30 + immigration_status: REFUGEE + years_since_us_entry: 0 + spm_units: + spm_unit: + members: [person1] + households: + household: + members: [person1] + state_code: WA + output: + # RCA does not require a dependent child; TANF and SFA do. + wa_tanf_eligible: false + wa_sfa_eligible: false + wa_rca_eligible: true + wa_tanf: 0 + wa_sfa: 0 + # Family size 1 payment standard Jan 2024: $450 + wa_rca: 450 + +- name: Case 5, override shows all 3 programs with benefit amounts. + period: 2024-01 + absolute_error_margin: 0.1 + input: + people: + person1: + age: 30 + immigration_status: CITIZEN + person2: + age: 5 + is_tax_unit_dependent: true + person3: + age: 3 + is_tax_unit_dependent: true + spm_units: + spm_unit: + members: [person1, person2, person3] + wa_show_all_cash_assistance_programs: true + households: + household: + members: [person1, person2, person3] + state_code: WA + output: + # Override bypasses the immigration gate across all 3 programs; + # other requirements (demographic, income, resources) still apply. + wa_tanf_eligible: true + wa_sfa_eligible: true + wa_rca_eligible: true + # Family size 3 payment standard Jan 2024: $706; no income. + wa_tanf: 706 + wa_sfa: 706 + wa_rca: 706 + +- name: Case 6, override with single adult shows RCA only (TANF and SFA still require a child). + period: 2024-01 + absolute_error_margin: 0.1 + input: + people: + person1: + age: 30 + immigration_status: CITIZEN + spm_units: + spm_unit: + members: [person1] + wa_show_all_cash_assistance_programs: true + households: + household: + members: [person1] + state_code: WA + output: + wa_tanf_eligible: false + wa_sfa_eligible: false + wa_rca_eligible: true + wa_tanf: 0 + wa_sfa: 0 + # Family size 1 payment standard Jan 2024: $450 + wa_rca: 450 + +- name: Case 7, override respects the income test (high unearned income disqualifies all). + period: 2024-01 + absolute_error_margin: 0.1 + input: + people: + person1: + age: 30 + immigration_status: CITIZEN + social_security: 24_000 + person2: + age: 5 + is_tax_unit_dependent: true + spm_units: + spm_unit: + members: [person1, person2] + wa_show_all_cash_assistance_programs: true + households: + household: + members: [person1, person2] + state_code: WA + output: + # Monthly unearned = $2,000 > PS ($570) → income test fails for all + wa_tanf_eligible: false + wa_sfa_eligible: false + wa_rca_eligible: false + wa_tanf: 0 + wa_sfa: 0 + wa_rca: 0 + +- name: Case 8, undocumented immigrant with child is ineligible for all 3. + period: 2024-01 + absolute_error_margin: 0.1 + input: + people: + person1: + age: 30 + immigration_status: UNDOCUMENTED + person2: + age: 5 + is_tax_unit_dependent: true + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: WA + output: + wa_tanf_eligible: false + wa_sfa_eligible: false + wa_rca_eligible: false + wa_tanf: 0 + wa_sfa: 0 + wa_rca: 0 diff --git a/policyengine_us/variables/gov/states/wa/dshs/rca/eligibility/wa_rca_eligible.py b/policyengine_us/variables/gov/states/wa/dshs/rca/eligibility/wa_rca_eligible.py index fca26792c5a..9e2ee11031b 100644 --- a/policyengine_us/variables/gov/states/wa/dshs/rca/eligibility/wa_rca_eligible.py +++ b/policyengine_us/variables/gov/states/wa/dshs/rca/eligibility/wa_rca_eligible.py @@ -21,6 +21,11 @@ def formula(spm_unit, period, parameters): has_rca_eligible_immigrant = ( add(spm_unit, period, ["wa_rca_immigration_status_eligible"]) > 0 ) + show_all = spm_unit("wa_show_all_cash_assistance_programs", period) income_eligible = spm_unit("wa_tanf_income_eligible", period) resources_eligible = spm_unit("wa_tanf_resources_eligible", period.this_year) - return has_rca_eligible_immigrant & income_eligible & resources_eligible + return ( + (has_rca_eligible_immigrant | show_all) + & income_eligible + & resources_eligible + ) diff --git a/policyengine_us/variables/gov/states/wa/dshs/sfa/eligibility/wa_sfa_eligible.py b/policyengine_us/variables/gov/states/wa/dshs/sfa/eligibility/wa_sfa_eligible.py index 4323110793c..0b7b34348ee 100644 --- a/policyengine_us/variables/gov/states/wa/dshs/sfa/eligibility/wa_sfa_eligible.py +++ b/policyengine_us/variables/gov/states/wa/dshs/sfa/eligibility/wa_sfa_eligible.py @@ -17,11 +17,12 @@ def formula(spm_unit, period, parameters): has_sfa_eligible_immigrant = ( add(spm_unit, period, ["wa_sfa_immigration_status_eligible"]) > 0 ) + show_all = spm_unit("wa_show_all_cash_assistance_programs", period) income_eligible = spm_unit("wa_tanf_income_eligible", period) resources_eligible = spm_unit("wa_tanf_resources_eligible", period.this_year) return ( demographic_eligible - & has_sfa_eligible_immigrant + & (has_sfa_eligible_immigrant | show_all) & income_eligible & resources_eligible ) diff --git a/policyengine_us/variables/gov/states/wa/dshs/tanf/eligibility/wa_tanf_eligible.py b/policyengine_us/variables/gov/states/wa/dshs/tanf/eligibility/wa_tanf_eligible.py index 51290d53588..ec9a289bd4a 100644 --- a/policyengine_us/variables/gov/states/wa/dshs/tanf/eligibility/wa_tanf_eligible.py +++ b/policyengine_us/variables/gov/states/wa/dshs/tanf/eligibility/wa_tanf_eligible.py @@ -14,11 +14,12 @@ def formula(spm_unit, period, parameters): has_tanf_eligible_immigrant = ( add(spm_unit, period, ["wa_tanf_immigration_status_eligible"]) > 0 ) + show_all = spm_unit("wa_show_all_cash_assistance_programs", period) income_eligible = spm_unit("wa_tanf_income_eligible", period) resources_eligible = spm_unit("wa_tanf_resources_eligible", period.this_year) return ( demographic_eligible - & has_tanf_eligible_immigrant + & (has_tanf_eligible_immigrant | show_all) & income_eligible & resources_eligible ) diff --git a/policyengine_us/variables/gov/states/wa/dshs/wa_show_all_cash_assistance_programs.py b/policyengine_us/variables/gov/states/wa/dshs/wa_show_all_cash_assistance_programs.py new file mode 100644 index 00000000000..a06d921b010 --- /dev/null +++ b/policyengine_us/variables/gov/states/wa/dshs/wa_show_all_cash_assistance_programs.py @@ -0,0 +1,10 @@ +from policyengine_us.model_api import * + + +class wa_show_all_cash_assistance_programs(Variable): + value_type = bool + entity = SPMUnit + label = "Treat all Washington cash assistance programs as immigration-eligible for display" + definition_period = MONTH + default_value = False + defined_for = StateCode.WA From e3050c4f10b7c8f36e8eb5e2cea57927239dea37 Mon Sep 17 00:00:00 2001 From: Ziming Date: Fri, 24 Apr 2026 01:05:02 -0400 Subject: [PATCH 3/9] Document WA RCA PAROLED_ONE_YEAR simplification Adds a YAML comment explaining that PAROLED_ONE_YEAR is included as RCA-eligible to cover Afghan and Ukrainian humanitarian parolees, at the cost of over-granting RCA to the smaller population of non- humanitarian parolees. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../gov/states/wa/dshs/rca/eligible_immigration_statuses.yaml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/policyengine_us/parameters/gov/states/wa/dshs/rca/eligible_immigration_statuses.yaml b/policyengine_us/parameters/gov/states/wa/dshs/rca/eligible_immigration_statuses.yaml index 5c66c8151c9..2c752d02bc6 100644 --- a/policyengine_us/parameters/gov/states/wa/dshs/rca/eligible_immigration_statuses.yaml +++ b/policyengine_us/parameters/gov/states/wa/dshs/rca/eligible_immigration_statuses.yaml @@ -1,5 +1,9 @@ description: Washington considers these immigration statuses eligible for the Refugee Cash Assistance program. +# PAROLED_ONE_YEAR is treated as RCA-eligible to cover Afghan (P.L. 117-43) +# and Ukrainian (P.L. 117-128) humanitarian parolees. PolicyEngine does not +# distinguish those populations from other INA 212(d)(5) parolees, so this +# over-grants RCA to the small population of non-humanitarian parolees. values: 1996-08-22: - REFUGEE From 7298a9a841f40dae594c51ad52791b12a6acea9d Mon Sep 17 00:00:00 2001 From: Ziming Date: Fri, 24 Apr 2026 01:23:42 -0400 Subject: [PATCH 4/9] Apply program-review fixes for WA cash assistance PR Critical fixes per review: - Remove CONDITIONAL_ENTRANT from federal TANF bar-exempt list. 8 USC 1613(b)(1) does not exempt conditional entrants; they are qualified aliens subject to the 5-year bar. - Correct WAC citation on wa_tanf_immigration_status_eligible from 388-424-0020 (SNAP) to 388-424-0006 and 388-424-0010. - Prevent mixed-status SFA+TANF double-pay. SFA eligibility now excludes households with any TANF-immigration-eligible member at the SPM-unit level, matching WAC 388-400-0010's intent that SFA is for families federally ineligible for TANF. Also applies the previously queued Option A fix to wa_rca_eligible: enforce the 12-month ORR window via years_since_us_entry and disqualify RCA applicants who are eligible for TANF or SFA per 45 CFR 400.47 and WAC 388-400-0030(2)(a). Override bypasses both new gates so API consumers can still display all three programs. Test updates: - wa_tanf_immigration_status_eligible: add DEPORTATION_WITHHELD and CONDITIONAL_ENTRANT cases (in-bar and past-bar). - wa_rca_eligible: reframe cases around the 12-month window, add past-window and default-year cases. - integration.yaml: flip Case 3 (refugee family) to TANF-only; add Case 8 (refugee past window), Case 10 (mixed-status household), Case 11 (override with refugee still fires all three). Co-Authored-By: Claude Opus 4.7 (1M context) --- changelog.d/wa-rca-tanf-fixes.added-3.md | 1 + changelog.d/wa-rca-tanf-fixes.fixed-2.md | 1 + .../tanf/bar_exempt_immigration_statuses.yaml | 3 +- .../gov/states/wa/dshs/integration.yaml | 101 ++++++++++++++++-- .../dshs/rca/eligibility/wa_rca_eligible.yaml | 38 +++++-- .../wa_tanf_immigration_status_eligible.yaml | 27 +++++ .../dshs/rca/eligibility/wa_rca_eligible.py | 27 +++-- .../dshs/sfa/eligibility/wa_sfa_eligible.py | 9 +- .../wa_tanf_immigration_status_eligible.py | 3 +- 9 files changed, 186 insertions(+), 24 deletions(-) create mode 100644 changelog.d/wa-rca-tanf-fixes.added-3.md create mode 100644 changelog.d/wa-rca-tanf-fixes.fixed-2.md diff --git a/changelog.d/wa-rca-tanf-fixes.added-3.md b/changelog.d/wa-rca-tanf-fixes.added-3.md new file mode 100644 index 00000000000..4e265e6637b --- /dev/null +++ b/changelog.d/wa-rca-tanf-fixes.added-3.md @@ -0,0 +1 @@ +Washington RCA now enforces the 12-month ORR window via `years_since_us_entry` and disqualifies applicants eligible for TANF or SFA per 45 CFR 400.47. diff --git a/changelog.d/wa-rca-tanf-fixes.fixed-2.md b/changelog.d/wa-rca-tanf-fixes.fixed-2.md new file mode 100644 index 00000000000..d3c9c249a17 --- /dev/null +++ b/changelog.d/wa-rca-tanf-fixes.fixed-2.md @@ -0,0 +1 @@ +Washington cash assistance program review fixes — removed CONDITIONAL_ENTRANT from the federal TANF five-year bar exemption list per 8 USC 1613(b)(1), corrected the WAC citation on `wa_tanf_immigration_status_eligible` from 388-424-0020 (SNAP) to 388-424-0006 and 388-424-0010, and excluded TANF-immigration-eligible households from SFA at the SPM-unit level to prevent mixed-status double-pay. diff --git a/policyengine_us/parameters/gov/hhs/tanf/bar_exempt_immigration_statuses.yaml b/policyengine_us/parameters/gov/hhs/tanf/bar_exempt_immigration_statuses.yaml index 9f6bdbe7e74..bb6df88fbd1 100644 --- a/policyengine_us/parameters/gov/hhs/tanf/bar_exempt_immigration_statuses.yaml +++ b/policyengine_us/parameters/gov/hhs/tanf/bar_exempt_immigration_statuses.yaml @@ -6,12 +6,11 @@ values: - ASYLEE - CUBAN_HAITIAN_ENTRANT - DEPORTATION_WITHHELD - - CONDITIONAL_ENTRANT metadata: unit: list period: year label: TANF five-year bar exempt immigration statuses reference: - - title: 8 USC 1613(b) - Exceptions to five-year limited eligibility + - title: 8 USC 1613(b)(1) - Exceptions to five-year limited eligibility href: https://www.law.cornell.edu/uscode/text/8/1613 diff --git a/policyengine_us/tests/policy/baseline/gov/states/wa/dshs/integration.yaml b/policyengine_us/tests/policy/baseline/gov/states/wa/dshs/integration.yaml index 087e2c319f7..964851c0e15 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/wa/dshs/integration.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/wa/dshs/integration.yaml @@ -58,7 +58,7 @@ wa_sfa: 570 wa_rca: 0 -- name: Case 3, refugee family with child receives TANF and RCA. +- name: Case 3, refugee family with child receives TANF only (RCA blocked by 45 CFR 400.47). period: 2024-01 absolute_error_margin: 0.1 input: @@ -78,14 +78,14 @@ members: [person1, person2] state_code: WA output: - # Refugees are bar-exempt (TANF) and RCA-eligible. Overlap persists - # until the 12-month RCA window is tracked. + # Refugees are bar-exempt, so TANF applies. Per 45 CFR 400.47, an + # applicant eligible for TANF is disqualified from RCA. wa_tanf_eligible: true wa_sfa_eligible: false - wa_rca_eligible: true + wa_rca_eligible: false wa_tanf: 570 wa_sfa: 0 - wa_rca: 570 + wa_rca: 0 - name: Case 4, single refugee adult without child receives RCA only. period: 2024-01 @@ -200,7 +200,32 @@ wa_sfa: 0 wa_rca: 0 -- name: Case 8, undocumented immigrant with child is ineligible for all 3. +- name: Case 8, single refugee adult past 12-month window receives nothing. + period: 2024-01 + absolute_error_margin: 0.1 + input: + people: + person1: + age: 30 + immigration_status: REFUGEE + years_since_us_entry: 2 + spm_units: + spm_unit: + members: [person1] + households: + household: + members: [person1] + state_code: WA + output: + # No child → TANF/SFA demographic fails. Past 12-month window → RCA fails. + wa_tanf_eligible: false + wa_sfa_eligible: false + wa_rca_eligible: false + wa_tanf: 0 + wa_sfa: 0 + wa_rca: 0 + +- name: Case 9, undocumented immigrant with child is ineligible for all 3. period: 2024-01 absolute_error_margin: 0.1 input: @@ -225,3 +250,67 @@ wa_tanf: 0 wa_sfa: 0 wa_rca: 0 + +- name: Case 10, mixed-status citizen head + LPR-in-bar spouse + child receives TANF only. + period: 2024-01 + absolute_error_margin: 0.1 + input: + people: + person1: + age: 30 + immigration_status: CITIZEN + person2: + age: 28 + immigration_status: LEGAL_PERMANENT_RESIDENT + years_since_us_entry: 2 + person3: + age: 5 + is_tax_unit_dependent: true + spm_units: + spm_unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + state_code: WA + output: + # Citizen head makes household TANF-immigration-eligible; SFA-eligibility + # excluded at SPM-unit level to prevent mixed-status double-pay. + wa_tanf_eligible: true + wa_sfa_eligible: false + wa_rca_eligible: false + # Family size 3 payment standard Jan 2024: $706 + wa_tanf: 706 + wa_sfa: 0 + wa_rca: 0 + +- name: Case 11, override with refugee household still fires all 3. + period: 2024-01 + absolute_error_margin: 0.1 + input: + people: + person1: + age: 30 + immigration_status: REFUGEE + years_since_us_entry: 0 + person2: + age: 5 + is_tax_unit_dependent: true + spm_units: + spm_unit: + members: [person1, person2] + wa_show_all_cash_assistance_programs: true + households: + household: + members: [person1, person2] + state_code: WA + output: + # Override bypasses the SFA mutex and RCA mutex so API consumers can + # display all 3 programs for bar-exempt immigrants too. + wa_tanf_eligible: true + wa_sfa_eligible: true + wa_rca_eligible: true + # Family size 2 payment standard Jan 2024: $570 + wa_tanf: 570 + wa_sfa: 570 + wa_rca: 570 diff --git a/policyengine_us/tests/policy/baseline/gov/states/wa/dshs/rca/eligibility/wa_rca_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/wa/dshs/rca/eligibility/wa_rca_eligible.yaml index b670b7b9530..25ff934da77 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/wa/dshs/rca/eligibility/wa_rca_eligible.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/wa/dshs/rca/eligibility/wa_rca_eligible.yaml @@ -1,18 +1,20 @@ -- name: Case 1, refugee meets all requirements - eligible. +- name: Case 1, refugee within 12-month window, no TANF/SFA competition - eligible. period: 2024-01 input: state_code: WA immigration_status: REFUGEE + years_since_us_entry: 0 wa_tanf_income_eligible: true wa_tanf_resources_eligible: true output: wa_rca_eligible: true -- name: Case 2, single refugee adult without children - eligible (no child required). +- name: Case 2, single refugee adult within window - eligible. period: 2024-01 input: state_code: WA immigration_status: REFUGEE + years_since_us_entry: 0 wa_tanf_income_eligible: true wa_tanf_resources_eligible: true output: @@ -28,37 +30,61 @@ output: wa_rca_eligible: false -- name: Case 4, refugee income-ineligible - ineligible. +- name: Case 4, refugee past 12-month window - ineligible. period: 2024-01 input: state_code: WA immigration_status: REFUGEE + years_since_us_entry: 2 + wa_tanf_income_eligible: true + wa_tanf_resources_eligible: true + output: + wa_rca_eligible: false + +- name: Case 5, refugee using default years_since_us_entry (5) - ineligible. + period: 2024-01 + input: + state_code: WA + immigration_status: REFUGEE + wa_tanf_income_eligible: true + wa_tanf_resources_eligible: true + output: + wa_rca_eligible: false + +- name: Case 6, refugee income-ineligible - ineligible. + period: 2024-01 + input: + state_code: WA + immigration_status: REFUGEE + years_since_us_entry: 0 wa_tanf_income_eligible: false wa_tanf_resources_eligible: true output: wa_rca_eligible: false -- name: Case 5, refugee resources-ineligible - ineligible. +- name: Case 7, refugee resources-ineligible - ineligible. period: 2024-01 input: state_code: WA immigration_status: REFUGEE + years_since_us_entry: 0 wa_tanf_income_eligible: true wa_tanf_resources_eligible: false output: wa_rca_eligible: false -- name: Case 6, non-WA refugee - ineligible. +- name: Case 8, non-WA refugee - ineligible. period: 2024-01 input: state_code: OR immigration_status: REFUGEE + years_since_us_entry: 0 wa_tanf_income_eligible: true wa_tanf_resources_eligible: true output: wa_rca_eligible: false -- name: Case 7, undocumented - ineligible. +- name: Case 9, undocumented - ineligible. period: 2024-01 input: state_code: WA diff --git a/policyengine_us/tests/policy/baseline/gov/states/wa/dshs/tanf/eligibility/wa_tanf_immigration_status_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/wa/dshs/tanf/eligibility/wa_tanf_immigration_status_eligible.yaml index cdcfab101ae..b845ab4fe28 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/wa/dshs/tanf/eligibility/wa_tanf_immigration_status_eligible.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/wa/dshs/tanf/eligibility/wa_tanf_immigration_status_eligible.yaml @@ -83,3 +83,30 @@ immigration_status: DACA output: wa_tanf_immigration_status_eligible: false + +- name: Case 11, deportation-withheld just arrived is eligible (bar-exempt). + period: 2024-01 + input: + state_code: WA + immigration_status: DEPORTATION_WITHHELD + years_since_us_entry: 0 + output: + wa_tanf_immigration_status_eligible: true + +- name: Case 12, conditional entrant in 5-year bar is ineligible. + period: 2024-01 + input: + state_code: WA + immigration_status: CONDITIONAL_ENTRANT + years_since_us_entry: 2 + output: + wa_tanf_immigration_status_eligible: false + +- name: Case 13, conditional entrant past 5-year bar is eligible. + period: 2024-01 + input: + state_code: WA + immigration_status: CONDITIONAL_ENTRANT + years_since_us_entry: 6 + output: + wa_tanf_immigration_status_eligible: true diff --git a/policyengine_us/variables/gov/states/wa/dshs/rca/eligibility/wa_rca_eligible.py b/policyengine_us/variables/gov/states/wa/dshs/rca/eligibility/wa_rca_eligible.py index 9e2ee11031b..7d6408b7021 100644 --- a/policyengine_us/variables/gov/states/wa/dshs/rca/eligibility/wa_rca_eligible.py +++ b/policyengine_us/variables/gov/states/wa/dshs/rca/eligibility/wa_rca_eligible.py @@ -10,22 +10,33 @@ class wa_rca_eligible(Variable): reference = ( "https://app.leg.wa.gov/wac/default.aspx?cite=388-400-0030", "https://app.leg.wa.gov/wac/default.aspx?cite=388-466-0120", + "https://www.ecfr.gov/current/title-45/subtitle-B/chapter-IV/part-400/subpart-D/section-400.47", + "https://www.ecfr.gov/current/title-45/subtitle-B/chapter-IV/part-400/subpart-J/section-400.211", ) def formula(spm_unit, period, parameters): - # RCA does not require a dependent child, unlike TANF and SFA. - # Federal RCA eligibility is limited to the first 12 months after - # entry or status grant (8 USC 1522; 45 CFR 400.211); we do not - # track months-since-entry at the moment, so that window is not - # enforced here. - has_rca_eligible_immigrant = ( - add(spm_unit, period, ["wa_rca_immigration_status_eligible"]) > 0 + members_rca_imm_eligible = spm_unit.members( + "wa_rca_immigration_status_eligible", period ) + within_orr_window = ( + spm_unit.members("years_since_us_entry", period.this_year) < 1 + ) + has_rca_eligible_member = spm_unit.any( + members_rca_imm_eligible & within_orr_window + ) + + tanf_eligible = spm_unit("wa_tanf_eligible", period) + sfa_eligible = spm_unit("wa_sfa_eligible", period) + not_otherwise_eligible = ~tanf_eligible & ~sfa_eligible + show_all = spm_unit("wa_show_all_cash_assistance_programs", period) + income_eligible = spm_unit("wa_tanf_income_eligible", period) resources_eligible = spm_unit("wa_tanf_resources_eligible", period.this_year) + return ( - (has_rca_eligible_immigrant | show_all) + (has_rca_eligible_member | show_all) + & (not_otherwise_eligible | show_all) & income_eligible & resources_eligible ) diff --git a/policyengine_us/variables/gov/states/wa/dshs/sfa/eligibility/wa_sfa_eligible.py b/policyengine_us/variables/gov/states/wa/dshs/sfa/eligibility/wa_sfa_eligible.py index 0b7b34348ee..81f886bd6c0 100644 --- a/policyengine_us/variables/gov/states/wa/dshs/sfa/eligibility/wa_sfa_eligible.py +++ b/policyengine_us/variables/gov/states/wa/dshs/sfa/eligibility/wa_sfa_eligible.py @@ -17,12 +17,19 @@ def formula(spm_unit, period, parameters): has_sfa_eligible_immigrant = ( add(spm_unit, period, ["wa_sfa_immigration_status_eligible"]) > 0 ) + # Per WAC 388-400-0010, SFA is explicitly for families federally + # ineligible for TANF. Exclude at SPM-unit level to prevent mixed- + # status households from receiving both. + has_tanf_eligible_immigrant = ( + add(spm_unit, period, ["wa_tanf_immigration_status_eligible"]) > 0 + ) + sfa_pathway = has_sfa_eligible_immigrant & ~has_tanf_eligible_immigrant show_all = spm_unit("wa_show_all_cash_assistance_programs", period) income_eligible = spm_unit("wa_tanf_income_eligible", period) resources_eligible = spm_unit("wa_tanf_resources_eligible", period.this_year) return ( demographic_eligible - & (has_sfa_eligible_immigrant | show_all) + & (sfa_pathway | show_all) & income_eligible & resources_eligible ) diff --git a/policyengine_us/variables/gov/states/wa/dshs/tanf/eligibility/wa_tanf_immigration_status_eligible.py b/policyengine_us/variables/gov/states/wa/dshs/tanf/eligibility/wa_tanf_immigration_status_eligible.py index 9b2ff79de51..3fad419f410 100644 --- a/policyengine_us/variables/gov/states/wa/dshs/tanf/eligibility/wa_tanf_immigration_status_eligible.py +++ b/policyengine_us/variables/gov/states/wa/dshs/tanf/eligibility/wa_tanf_immigration_status_eligible.py @@ -9,7 +9,8 @@ class wa_tanf_immigration_status_eligible(Variable): defined_for = StateCode.WA reference = ( "https://www.law.cornell.edu/uscode/text/8/1613", - "https://app.leg.wa.gov/wac/default.aspx?cite=388-424-0020", + "https://app.leg.wa.gov/wac/default.aspx?cite=388-424-0006", + "https://app.leg.wa.gov/wac/default.aspx?cite=388-424-0010", ) def formula(person, period, parameters): From 792883a9f38d8c701340fae265680d66db47584b Mon Sep 17 00:00:00 2001 From: Ziming Date: Fri, 24 Apr 2026 01:24:41 -0400 Subject: [PATCH 5/9] Document known modeling gaps in WA cash assistance variables Adds inline comments per the program review: - wa_show_all_cash_assistance_programs: explain consumer-facing use - years_since_us_entry: note the default preserves prior behavior - wa_sfa_immigration_status_eligible: list the unmodeled WAC 388-400-0010 SFA pathways (T/U visa, nonqualified-alien residency, student cases) - wa_rca_eligible: note the unmodeled WAC 388-400-0030(2)(b)/(c) exclusions (TANF-sanction history, full-time students) Co-Authored-By: Claude Opus 4.7 (1M context) --- .../gov/states/wa/dshs/rca/eligibility/wa_rca_eligible.py | 4 ++++ .../sfa/eligibility/wa_sfa_immigration_status_eligible.py | 6 ++++++ .../states/wa/dshs/wa_show_all_cash_assistance_programs.py | 5 +++++ .../household/demographic/person/years_since_us_entry.py | 4 ++++ 4 files changed, 19 insertions(+) diff --git a/policyengine_us/variables/gov/states/wa/dshs/rca/eligibility/wa_rca_eligible.py b/policyengine_us/variables/gov/states/wa/dshs/rca/eligibility/wa_rca_eligible.py index 7d6408b7021..d150425f8f4 100644 --- a/policyengine_us/variables/gov/states/wa/dshs/rca/eligibility/wa_rca_eligible.py +++ b/policyengine_us/variables/gov/states/wa/dshs/rca/eligibility/wa_rca_eligible.py @@ -13,6 +13,10 @@ class wa_rca_eligible(Variable): "https://www.ecfr.gov/current/title-45/subtitle-B/chapter-IV/part-400/subpart-D/section-400.47", "https://www.ecfr.gov/current/title-45/subtitle-B/chapter-IV/part-400/subpart-J/section-400.211", ) + # Two WAC 388-400-0030 exclusions are not tracked at the moment: + # (2)(b) applicants denied/terminated from TANF for noncompliance + # (requires TANF sanction history) and (2)(c) full-time students in + # higher education. def formula(spm_unit, period, parameters): members_rca_imm_eligible = spm_unit.members( diff --git a/policyengine_us/variables/gov/states/wa/dshs/sfa/eligibility/wa_sfa_immigration_status_eligible.py b/policyengine_us/variables/gov/states/wa/dshs/sfa/eligibility/wa_sfa_immigration_status_eligible.py index e63a5e42666..7c671b37839 100644 --- a/policyengine_us/variables/gov/states/wa/dshs/sfa/eligibility/wa_sfa_immigration_status_eligible.py +++ b/policyengine_us/variables/gov/states/wa/dshs/sfa/eligibility/wa_sfa_immigration_status_eligible.py @@ -12,6 +12,12 @@ class wa_sfa_immigration_status_eligible(Variable): "https://app.leg.wa.gov/wac/default.aspx?cite=388-424-0015", "https://app.leg.wa.gov/rcw/default.aspx?cite=74.08A.010", ) + # Only the qualified-alien-in-5-year-bar pathway (WAC 388-424-0015(1)(a)) + # is modeled. Other SFA pathways from WAC 388-400-0010 — nonqualified + # aliens meeting WA residency, T/U-visa and VAWA survivors of certain + # crimes, 19-20 year old students, caretaker relatives of such students, + # and pregnant women convicted of multi-state fraud — are not tracked + # at the moment. def formula(person, period, parameters): is_qualified = person("is_citizen_or_legal_immigrant", period.this_year) diff --git a/policyengine_us/variables/gov/states/wa/dshs/wa_show_all_cash_assistance_programs.py b/policyengine_us/variables/gov/states/wa/dshs/wa_show_all_cash_assistance_programs.py index a06d921b010..775eae448f8 100644 --- a/policyengine_us/variables/gov/states/wa/dshs/wa_show_all_cash_assistance_programs.py +++ b/policyengine_us/variables/gov/states/wa/dshs/wa_show_all_cash_assistance_programs.py @@ -8,3 +8,8 @@ class wa_show_all_cash_assistance_programs(Variable): definition_period = MONTH default_value = False defined_for = StateCode.WA + # Consumer-facing toggle that bypasses immigration-based mutual + # exclusivity across TANF, SFA, and RCA so that frontend calculators + # can display all three programs' benefit amounts side by side for the + # same household. Does not override demographic, income, or resource + # tests. diff --git a/policyengine_us/variables/household/demographic/person/years_since_us_entry.py b/policyengine_us/variables/household/demographic/person/years_since_us_entry.py index c1209de8bca..f15adff47f9 100644 --- a/policyengine_us/variables/household/demographic/person/years_since_us_entry.py +++ b/policyengine_us/variables/household/demographic/person/years_since_us_entry.py @@ -9,3 +9,7 @@ class years_since_us_entry(Variable): definition_period = YEAR default_value = 5 reference = "https://www.law.cornell.edu/uscode/text/8/1613" + # Default of 5 treats a person as past the federal 5-year bar, which + # preserves pre-5-year-bar behavior for households that do not set + # this input. Refugee-like or bar-exempt statuses are handled via + # separate parameter lists rather than this clock. From bde75e2199b8e0ff0899dede6edb63d1d78f2ef5 Mon Sep 17 00:00:00 2001 From: Ziming Date: Fri, 24 Apr 2026 01:25:07 -0400 Subject: [PATCH 6/9] Replace duplicate WA RCA eligibility test with Afghan parolee case Case 2 previously duplicated Case 1's inputs and output. Retarget it to cover the PAROLED_ONE_YEAR pathway for Afghan/Ukrainian humanitarian parolees, which is the main non-refugee RCA population. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../gov/states/wa/dshs/rca/eligibility/wa_rca_eligible.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/policyengine_us/tests/policy/baseline/gov/states/wa/dshs/rca/eligibility/wa_rca_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/wa/dshs/rca/eligibility/wa_rca_eligible.yaml index 25ff934da77..03e97be55cd 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/wa/dshs/rca/eligibility/wa_rca_eligible.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/wa/dshs/rca/eligibility/wa_rca_eligible.yaml @@ -9,11 +9,11 @@ output: wa_rca_eligible: true -- name: Case 2, single refugee adult within window - eligible. +- name: Case 2, Afghan humanitarian parolee within window - eligible. period: 2024-01 input: state_code: WA - immigration_status: REFUGEE + immigration_status: PAROLED_ONE_YEAR years_since_us_entry: 0 wa_tanf_income_eligible: true wa_tanf_resources_eligible: true From 212b6803f896300df00a57d9bbd74bdb3c2ef42f Mon Sep 17 00:00:00 2001 From: Ziming Date: Sat, 25 Apr 2026 17:14:21 -0400 Subject: [PATCH 7/9] Route humanitarian parolees to WA TANF and tighten integration tests - Add PAROLED_ONE_YEAR to the federal TANF five-year-bar-exempt list so Afghan (P.L. 117-43) and Ukrainian (P.L. 117-128) humanitarian parolee families with children receive TANF rather than SFA/RCA. Cross-reference the existing approximation comment on the WA RCA eligible-status list. - Update WA SFA Case 4 (PAROLED_ONE_YEAR) and WA TANF Case 14 to reflect the bar-exempt routing. - Set immigration_status explicitly on dependent children in WA DSHS integration Cases 2, 3, 9, 11 so the test inputs match each case name (children otherwise default to CITIZEN, which routed mixed-status cases through the citizen-child pathway instead of the parent's status). - Add WA DSHS integration Case 12 covering an Afghan/Ukrainian humanitarian parolee family with a child receiving TANF only. - Drop the redundant default_value = False on wa_show_all_cash_assistance_programs. Co-Authored-By: Claude Opus 4.7 (1M context) --- changelog.d/wa-rca-tanf-fixes.fixed-3.md | 1 + .../tanf/bar_exempt_immigration_statuses.yaml | 8 ++++ .../rca/eligible_immigration_statuses.yaml | 11 +++-- .../gov/states/wa/dshs/integration.yaml | 48 ++++++++++++++++++- .../wa_sfa_immigration_status_eligible.yaml | 4 +- .../wa_tanf_immigration_status_eligible.yaml | 9 ++++ .../wa_show_all_cash_assistance_programs.py | 1 - 7 files changed, 74 insertions(+), 8 deletions(-) create mode 100644 changelog.d/wa-rca-tanf-fixes.fixed-3.md diff --git a/changelog.d/wa-rca-tanf-fixes.fixed-3.md b/changelog.d/wa-rca-tanf-fixes.fixed-3.md new file mode 100644 index 00000000000..9203016a25c --- /dev/null +++ b/changelog.d/wa-rca-tanf-fixes.fixed-3.md @@ -0,0 +1 @@ +Treat PAROLED_ONE_YEAR as TANF five-year-bar exempt to route Afghan and Ukrainian humanitarian parolees to TANF instead of SFA/RCA. diff --git a/policyengine_us/parameters/gov/hhs/tanf/bar_exempt_immigration_statuses.yaml b/policyengine_us/parameters/gov/hhs/tanf/bar_exempt_immigration_statuses.yaml index bb6df88fbd1..e40a89952e6 100644 --- a/policyengine_us/parameters/gov/hhs/tanf/bar_exempt_immigration_statuses.yaml +++ b/policyengine_us/parameters/gov/hhs/tanf/bar_exempt_immigration_statuses.yaml @@ -1,11 +1,19 @@ description: The United States exempts these immigration statuses from the five-year bar on federal Temporary Assistance for Needy Families. +# PAROLED_ONE_YEAR is treated as bar-exempt to cover Afghan (P.L. 117-43) +# and Ukrainian (P.L. 117-128) humanitarian parolees, who are statutorily +# treated as refugees for federal benefit purposes. We do not distinguish +# those populations from other INA 212(d)(5) parolees at the moment, so +# this over-grants the bar exemption to the small population of +# non-humanitarian parolees. Kept consistent with the RCA eligible-status +# list at parameters/gov/states/wa/dshs/rca/eligible_immigration_statuses.yaml. values: 1996-08-22: - REFUGEE - ASYLEE - CUBAN_HAITIAN_ENTRANT - DEPORTATION_WITHHELD + - PAROLED_ONE_YEAR metadata: unit: list diff --git a/policyengine_us/parameters/gov/states/wa/dshs/rca/eligible_immigration_statuses.yaml b/policyengine_us/parameters/gov/states/wa/dshs/rca/eligible_immigration_statuses.yaml index 2c752d02bc6..b574364808a 100644 --- a/policyengine_us/parameters/gov/states/wa/dshs/rca/eligible_immigration_statuses.yaml +++ b/policyengine_us/parameters/gov/states/wa/dshs/rca/eligible_immigration_statuses.yaml @@ -1,9 +1,14 @@ description: Washington considers these immigration statuses eligible for the Refugee Cash Assistance program. # PAROLED_ONE_YEAR is treated as RCA-eligible to cover Afghan (P.L. 117-43) -# and Ukrainian (P.L. 117-128) humanitarian parolees. PolicyEngine does not -# distinguish those populations from other INA 212(d)(5) parolees, so this -# over-grants RCA to the small population of non-humanitarian parolees. +# and Ukrainian (P.L. 117-128) humanitarian parolees. We do not distinguish +# those populations from other INA 212(d)(5) parolees at the moment, so +# this over-grants RCA to the small population of non-humanitarian parolees. +# PAROLED_ONE_YEAR is also bar-exempt for federal TANF (see +# parameters/gov/hhs/tanf/bar_exempt_immigration_statuses.yaml), so a +# humanitarian-parolee family with a child receives TANF rather than RCA; +# RCA picks up adults without children and pre-TANF cases via the 12-month +# ORR window. values: 1996-08-22: - REFUGEE diff --git a/policyengine_us/tests/policy/baseline/gov/states/wa/dshs/integration.yaml b/policyengine_us/tests/policy/baseline/gov/states/wa/dshs/integration.yaml index 964851c0e15..84cd5c45477 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/wa/dshs/integration.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/wa/dshs/integration.yaml @@ -31,7 +31,7 @@ wa_sfa: 0 wa_rca: 0 -- name: Case 2, LPR in 5-year bar with child receives SFA only. +- name: Case 2, LPR-only family in 5-year bar receives SFA only. period: 2024-01 absolute_error_margin: 0.1 input: @@ -43,6 +43,8 @@ person2: age: 5 is_tax_unit_dependent: true + immigration_status: LEGAL_PERMANENT_RESIDENT + years_since_us_entry: 2 spm_units: spm_unit: members: [person1, person2] @@ -51,6 +53,8 @@ members: [person1, person2] state_code: WA output: + # Child immigration_status set explicitly: it defaults to CITIZEN, which + # would otherwise route the unit to TANF via the citizen-child pathway. wa_tanf_eligible: false wa_sfa_eligible: true wa_rca_eligible: false @@ -70,6 +74,8 @@ person2: age: 5 is_tax_unit_dependent: true + immigration_status: REFUGEE + years_since_us_entry: 0 spm_units: spm_unit: members: [person1, person2] @@ -225,7 +231,7 @@ wa_sfa: 0 wa_rca: 0 -- name: Case 9, undocumented immigrant with child is ineligible for all 3. +- name: Case 9, fully undocumented family is ineligible for all 3. period: 2024-01 absolute_error_margin: 0.1 input: @@ -236,6 +242,7 @@ person2: age: 5 is_tax_unit_dependent: true + immigration_status: UNDOCUMENTED spm_units: spm_unit: members: [person1, person2] @@ -244,6 +251,8 @@ members: [person1, person2] state_code: WA output: + # Child immigration_status set explicitly: it defaults to CITIZEN, which + # would otherwise route the unit to TANF via the citizen-child pathway. wa_tanf_eligible: false wa_sfa_eligible: false wa_rca_eligible: false @@ -296,6 +305,8 @@ person2: age: 5 is_tax_unit_dependent: true + immigration_status: REFUGEE + years_since_us_entry: 0 spm_units: spm_unit: members: [person1, person2] @@ -314,3 +325,36 @@ wa_tanf: 570 wa_sfa: 570 wa_rca: 570 + +- name: Case 12, Afghan or Ukrainian humanitarian parolee family with child receives TANF only. + period: 2024-01 + absolute_error_margin: 0.1 + input: + people: + person1: + age: 30 + immigration_status: PAROLED_ONE_YEAR + years_since_us_entry: 0 + person2: + age: 5 + is_tax_unit_dependent: true + immigration_status: PAROLED_ONE_YEAR + years_since_us_entry: 0 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: WA + output: + # PAROLED_ONE_YEAR stands in for Afghan (P.L. 117-43) and Ukrainian + # (P.L. 117-128) humanitarian parolees, who are bar-exempt for TANF. + # TANF therefore applies; RCA is blocked by 45 CFR 400.47. + wa_tanf_eligible: true + wa_sfa_eligible: false + wa_rca_eligible: false + # Family size 2 payment standard Jan 2024: $570 + wa_tanf: 570 + wa_sfa: 0 + wa_rca: 0 diff --git a/policyengine_us/tests/policy/baseline/gov/states/wa/dshs/sfa/eligibility/wa_sfa_immigration_status_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/wa/dshs/sfa/eligibility/wa_sfa_immigration_status_eligible.yaml index 526c23b3be1..42cb0e7e724 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/wa/dshs/sfa/eligibility/wa_sfa_immigration_status_eligible.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/wa/dshs/sfa/eligibility/wa_sfa_immigration_status_eligible.yaml @@ -24,14 +24,14 @@ output: wa_sfa_immigration_status_eligible: false -- name: Case 4, paroled one-year alien in bar is SFA-eligible. +- name: Case 4, paroled one-year alien is not SFA-eligible (TANF bar-exempt as humanitarian parolee). period: 2024-01 input: state_code: WA immigration_status: PAROLED_ONE_YEAR years_since_us_entry: 1 output: - wa_sfa_immigration_status_eligible: true + wa_sfa_immigration_status_eligible: false - name: Case 5, refugee is not SFA-eligible (TANF bar-exempt). period: 2024-01 diff --git a/policyengine_us/tests/policy/baseline/gov/states/wa/dshs/tanf/eligibility/wa_tanf_immigration_status_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/wa/dshs/tanf/eligibility/wa_tanf_immigration_status_eligible.yaml index b845ab4fe28..e774277d01a 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/wa/dshs/tanf/eligibility/wa_tanf_immigration_status_eligible.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/wa/dshs/tanf/eligibility/wa_tanf_immigration_status_eligible.yaml @@ -110,3 +110,12 @@ years_since_us_entry: 6 output: wa_tanf_immigration_status_eligible: true + +- name: Case 14, Afghan or Ukrainian humanitarian parolee just arrived is eligible (bar-exempt). + period: 2024-01 + input: + state_code: WA + immigration_status: PAROLED_ONE_YEAR + years_since_us_entry: 0 + output: + wa_tanf_immigration_status_eligible: true diff --git a/policyengine_us/variables/gov/states/wa/dshs/wa_show_all_cash_assistance_programs.py b/policyengine_us/variables/gov/states/wa/dshs/wa_show_all_cash_assistance_programs.py index 775eae448f8..342d60c5a6c 100644 --- a/policyengine_us/variables/gov/states/wa/dshs/wa_show_all_cash_assistance_programs.py +++ b/policyengine_us/variables/gov/states/wa/dshs/wa_show_all_cash_assistance_programs.py @@ -6,7 +6,6 @@ class wa_show_all_cash_assistance_programs(Variable): entity = SPMUnit label = "Treat all Washington cash assistance programs as immigration-eligible for display" definition_period = MONTH - default_value = False defined_for = StateCode.WA # Consumer-facing toggle that bypasses immigration-based mutual # exclusivity across TANF, SFA, and RCA so that frontend calculators From 90e967230a2bc75740c1cf778222ea8053ad6b83 Mon Sep 17 00:00:00 2001 From: Ziming Date: Sat, 25 Apr 2026 17:52:59 -0400 Subject: [PATCH 8/9] Add WA SFA 19-20 year old student pathway and consolidate PR housekeeping - Add wa_sfa_student_pathway_eligible covering WAC 388-400-0010(2)(c). Caretaker relatives per (2)(d) are picked up automatically through SPM-unit aggregation. Uses a single bracket-style age parameter (age_eligible.yaml) covering ages 19 and 20. - Wire the student pathway alongside the qualified-alien-in-bar pathway in wa_sfa_eligible, with TANF mutex via ~wa_tanf_eligible so families with an under-18 child still route to TANF. - Update wa_sfa_immigration_status_eligible docstring to mark the student and caretaker pathways as modeled. - Tests: 6 cases on the new variable + 7 new SFA eligibility cases (19/20 student, vocational, age boundaries, caretaker, TANF mutex, LPR-in-bar parent + citizen student). New integration Case 13 covers single-mom-plus-19-year-old-senior end-to-end. - Consolidate the 6 changelog fragments into a single .added.md per one-fragment-per-PR convention. - Revert programs.yaml additions so SFA and RCA registry entries can be added later with an accurate partial/complete status. Co-Authored-By: Claude Opus 4.7 (1M context) --- changelog.d/wa-rca-tanf-fixes.added-2.md | 1 - changelog.d/wa-rca-tanf-fixes.added-3.md | 1 - changelog.d/wa-rca-tanf-fixes.added.md | 3 +- changelog.d/wa-rca-tanf-fixes.fixed-2.md | 1 - changelog.d/wa-rca-tanf-fixes.fixed-3.md | 1 - changelog.d/wa-rca-tanf-fixes.fixed.md | 1 - .../sfa/student_pathway/age_eligible.yaml | 27 +++ policyengine_us/programs.yaml | 22 --- .../gov/states/wa/dshs/integration.yaml | 31 ++++ .../dshs/sfa/eligibility/wa_sfa_eligible.yaml | 166 ++++++++++++++++++ .../wa_sfa_student_pathway_eligible.yaml | 53 ++++++ .../dshs/sfa/eligibility/wa_sfa_eligible.py | 26 ++- .../wa_sfa_immigration_status_eligible.py | 13 +- .../wa_sfa_student_pathway_eligible.py | 25 +++ 14 files changed, 331 insertions(+), 40 deletions(-) delete mode 100644 changelog.d/wa-rca-tanf-fixes.added-2.md delete mode 100644 changelog.d/wa-rca-tanf-fixes.added-3.md delete mode 100644 changelog.d/wa-rca-tanf-fixes.fixed-2.md delete mode 100644 changelog.d/wa-rca-tanf-fixes.fixed-3.md delete mode 100644 changelog.d/wa-rca-tanf-fixes.fixed.md create mode 100644 policyengine_us/parameters/gov/states/wa/dshs/sfa/student_pathway/age_eligible.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/wa/dshs/sfa/eligibility/wa_sfa_student_pathway_eligible.yaml create mode 100644 policyengine_us/variables/gov/states/wa/dshs/sfa/eligibility/wa_sfa_student_pathway_eligible.py diff --git a/changelog.d/wa-rca-tanf-fixes.added-2.md b/changelog.d/wa-rca-tanf-fixes.added-2.md deleted file mode 100644 index 9661a1b365b..00000000000 --- a/changelog.d/wa-rca-tanf-fixes.added-2.md +++ /dev/null @@ -1 +0,0 @@ -Washington `wa_show_all_cash_assistance_programs` override that bypasses the immigration gate on TANF, SFA, and RCA for consumers that want to display all three programs' benefit amounts side by side. diff --git a/changelog.d/wa-rca-tanf-fixes.added-3.md b/changelog.d/wa-rca-tanf-fixes.added-3.md deleted file mode 100644 index 4e265e6637b..00000000000 --- a/changelog.d/wa-rca-tanf-fixes.added-3.md +++ /dev/null @@ -1 +0,0 @@ -Washington RCA now enforces the 12-month ORR window via `years_since_us_entry` and disqualifies applicants eligible for TANF or SFA per 45 CFR 400.47. diff --git a/changelog.d/wa-rca-tanf-fixes.added.md b/changelog.d/wa-rca-tanf-fixes.added.md index 567c84938d9..a08141a55d2 100644 --- a/changelog.d/wa-rca-tanf-fixes.added.md +++ b/changelog.d/wa-rca-tanf-fixes.added.md @@ -1 +1,2 @@ -Washington State Family Assistance and Refugee Cash Assistance programs, a `years_since_us_entry` person-level input, and a `wa_tanf_immigration_status_eligible` variable that enforces the federal five-year bar with its statutory exemptions. +Washington State Family Assistance and Refugee Cash Assistance programs. +Fix Washington TANF immigration eligibility, add `years_since_us_entry` and `wa_show_all_cash_assistance_programs` variables. diff --git a/changelog.d/wa-rca-tanf-fixes.fixed-2.md b/changelog.d/wa-rca-tanf-fixes.fixed-2.md deleted file mode 100644 index d3c9c249a17..00000000000 --- a/changelog.d/wa-rca-tanf-fixes.fixed-2.md +++ /dev/null @@ -1 +0,0 @@ -Washington cash assistance program review fixes — removed CONDITIONAL_ENTRANT from the federal TANF five-year bar exemption list per 8 USC 1613(b)(1), corrected the WAC citation on `wa_tanf_immigration_status_eligible` from 388-424-0020 (SNAP) to 388-424-0006 and 388-424-0010, and excluded TANF-immigration-eligible households from SFA at the SPM-unit level to prevent mixed-status double-pay. diff --git a/changelog.d/wa-rca-tanf-fixes.fixed-3.md b/changelog.d/wa-rca-tanf-fixes.fixed-3.md deleted file mode 100644 index 9203016a25c..00000000000 --- a/changelog.d/wa-rca-tanf-fixes.fixed-3.md +++ /dev/null @@ -1 +0,0 @@ -Treat PAROLED_ONE_YEAR as TANF five-year-bar exempt to route Afghan and Ukrainian humanitarian parolees to TANF instead of SFA/RCA. diff --git a/changelog.d/wa-rca-tanf-fixes.fixed.md b/changelog.d/wa-rca-tanf-fixes.fixed.md deleted file mode 100644 index db020f79e7d..00000000000 --- a/changelog.d/wa-rca-tanf-fixes.fixed.md +++ /dev/null @@ -1 +0,0 @@ -Washington TANF income eligibility now also requires countable income below the payment standard, per WAC 388-450-0162. diff --git a/policyengine_us/parameters/gov/states/wa/dshs/sfa/student_pathway/age_eligible.yaml b/policyengine_us/parameters/gov/states/wa/dshs/sfa/student_pathway/age_eligible.yaml new file mode 100644 index 00000000000..bdfc07f0044 --- /dev/null +++ b/policyengine_us/parameters/gov/states/wa/dshs/sfa/student_pathway/age_eligible.yaml @@ -0,0 +1,27 @@ +description: Washington considers a person in this age range a 19-20 year old student for the State Family Assistance program. + +metadata: + type: single_amount + threshold_unit: year + amount_unit: bool + period: year + label: Washington SFA 19-20 year old student age eligibility + reference: + - title: WAC 388-400-0010(2)(c) - Who Is Eligible for State Family Assistance + href: https://app.leg.wa.gov/wac/default.aspx?cite=388-400-0010 + - title: WAC 388-404-0005(3) - How Does a Child's Age and Attendance in School Affect Their Eligibility for TANF and SFA + href: https://app.leg.wa.gov/wac/default.aspx?cite=388-404-0005 + +brackets: + - threshold: + 2010-07-01: 0 + amount: + 2010-07-01: false + - threshold: + 2010-07-01: 19 + amount: + 2010-07-01: true + - threshold: + 2010-07-01: 21 + amount: + 2010-07-01: false diff --git a/policyengine_us/programs.yaml b/policyengine_us/programs.yaml index 06bdb64028e..801129254f1 100644 --- a/policyengine_us/programs.yaml +++ b/policyengine_us/programs.yaml @@ -417,28 +417,6 @@ programs: full_name: Wyoming Personal Opportunities With Employment Responsibilities variable: wy_power - - id: wa_sfa - name: Washington SFA - full_name: Washington State Family Assistance - category: Benefits - agency: State - status: complete - coverage: WA - variable: wa_sfa - parameter_prefix: gov.states.wa.dshs - verified_start_year: 2016 - - - id: wa_rca - name: Washington RCA - full_name: Washington Refugee Cash Assistance - category: Benefits - agency: State - status: complete - coverage: WA - variable: wa_rca - parameter_prefix: gov.states.wa.dshs.rca - verified_start_year: 2016 - - id: ccdf name: CCDF full_name: Child Care and Development Fund diff --git a/policyengine_us/tests/policy/baseline/gov/states/wa/dshs/integration.yaml b/policyengine_us/tests/policy/baseline/gov/states/wa/dshs/integration.yaml index 84cd5c45477..4995bb7faf7 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/wa/dshs/integration.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/wa/dshs/integration.yaml @@ -358,3 +358,34 @@ wa_tanf: 570 wa_sfa: 0 wa_rca: 0 + +- name: Case 13, single mom + 19-year-old high school senior receives SFA only via 19-20 student pathway. + period: 2024-01 + absolute_error_margin: 0.1 + input: + people: + person1: + age: 35 + immigration_status: CITIZEN + person2: + age: 19 + immigration_status: CITIZEN + is_in_secondary_school: true + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: WA + output: + # No under-18 child means TANF demographic fails. The 19-year-old + # student triggers the WAC 388-400-0010(2)(c) pathway; the parent is + # covered as a caretaker relative per (2)(d) via SPM-unit aggregation. + wa_tanf_eligible: false + wa_sfa_eligible: true + wa_rca_eligible: false + # Family size 2 payment standard Jan 2024: $570 + wa_tanf: 0 + wa_sfa: 570 + wa_rca: 0 diff --git a/policyengine_us/tests/policy/baseline/gov/states/wa/dshs/sfa/eligibility/wa_sfa_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/wa/dshs/sfa/eligibility/wa_sfa_eligible.yaml index 7b6b60b0a7a..0c21e5908ae 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/wa/dshs/sfa/eligibility/wa_sfa_eligible.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/wa/dshs/sfa/eligibility/wa_sfa_eligible.yaml @@ -92,3 +92,169 @@ wa_tanf_resources_eligible: true output: wa_sfa_eligible: false + +- name: Case 9, single 19-year-old citizen high school senior - eligible via student pathway. + period: 2024-01 + absolute_error_margin: 0.1 + input: + people: + person1: + age: 19 + immigration_status: CITIZEN + is_in_secondary_school: true + spm_units: + spm_unit: + members: [person1] + wa_tanf_income_eligible: true + wa_tanf_resources_eligible: true + households: + household: + members: [person1] + state_code: WA + output: + wa_sfa_eligible: true + +- name: Case 10, single 20-year-old citizen vocational student - eligible via student pathway. + period: 2024-01 + absolute_error_margin: 0.1 + input: + people: + person1: + age: 20 + immigration_status: CITIZEN + technical_institution_student: true + spm_units: + spm_unit: + members: [person1] + wa_tanf_income_eligible: true + wa_tanf_resources_eligible: true + households: + household: + members: [person1] + state_code: WA + output: + wa_sfa_eligible: true + +- name: Case 11, single 21-year-old citizen student - ineligible (over age cap). + period: 2024-01 + absolute_error_margin: 0.1 + input: + people: + person1: + age: 21 + immigration_status: CITIZEN + is_in_secondary_school: true + spm_units: + spm_unit: + members: [person1] + wa_tanf_income_eligible: true + wa_tanf_resources_eligible: true + households: + household: + members: [person1] + state_code: WA + output: + wa_sfa_eligible: false + +- name: Case 12, single 19-year-old citizen non-student - ineligible. + period: 2024-01 + absolute_error_margin: 0.1 + input: + people: + person1: + age: 19 + immigration_status: CITIZEN + spm_units: + spm_unit: + members: [person1] + wa_tanf_income_eligible: true + wa_tanf_resources_eligible: true + households: + household: + members: [person1] + state_code: WA + output: + wa_sfa_eligible: false + +- name: Case 13, parent + 19-year-old citizen student (no younger child) - eligible via caretaker pathway. + period: 2024-01 + absolute_error_margin: 0.1 + input: + people: + person1: + age: 35 + immigration_status: CITIZEN + person2: + age: 19 + immigration_status: CITIZEN + is_in_secondary_school: true + spm_units: + spm_unit: + members: [person1, person2] + wa_tanf_income_eligible: true + wa_tanf_resources_eligible: true + households: + household: + members: [person1, person2] + state_code: WA + output: + # Caretaker (parent) is covered automatically because the 19-year-old + # student in the SPM unit makes the unit demographically SFA-eligible. + wa_sfa_eligible: true + +- name: Case 14, parent + 19-year-old student + 5-year-old child - ineligible (TANF wins). + period: 2024-01 + absolute_error_margin: 0.1 + input: + people: + person1: + age: 35 + immigration_status: CITIZEN + person2: + age: 19 + immigration_status: CITIZEN + is_in_secondary_school: true + person3: + age: 5 + immigration_status: CITIZEN + is_tax_unit_dependent: true + spm_units: + spm_unit: + members: [person1, person2, person3] + wa_tanf_income_eligible: true + wa_tanf_resources_eligible: true + households: + household: + members: [person1, person2, person3] + state_code: WA + output: + # 5-year-old triggers TANF demographic; TANF/SFA mutex blocks SFA. + wa_sfa_eligible: false + +- name: Case 15, LPR-in-bar parent + 19-year-old citizen student - eligible via student pathway. + period: 2024-01 + absolute_error_margin: 0.1 + input: + people: + person1: + age: 35 + immigration_status: LEGAL_PERMANENT_RESIDENT + years_since_us_entry: 2 + person2: + age: 19 + immigration_status: CITIZEN + is_in_secondary_school: true + spm_units: + spm_unit: + members: [person1, person2] + wa_tanf_income_eligible: true + wa_tanf_resources_eligible: true + households: + household: + members: [person1, person2] + state_code: WA + output: + # Citizen 19-year-old student blocks the immigration pathway (mutex + # excludes units with TANF-immigration-eligible members), but the + # student pathway fires independently. + wa_sfa_eligible: true diff --git a/policyengine_us/tests/policy/baseline/gov/states/wa/dshs/sfa/eligibility/wa_sfa_student_pathway_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/wa/dshs/sfa/eligibility/wa_sfa_student_pathway_eligible.yaml new file mode 100644 index 00000000000..759753b0c36 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/wa/dshs/sfa/eligibility/wa_sfa_student_pathway_eligible.yaml @@ -0,0 +1,53 @@ +- name: Case 1, age 18 secondary student - not in pathway (TANF covers them). + period: 2024-01 + input: + state_code: WA + age: 18 + is_in_secondary_school: true + output: + wa_sfa_student_pathway_eligible: false + +- name: Case 2, age 19 secondary student - eligible. + period: 2024-01 + input: + state_code: WA + age: 19 + is_in_secondary_school: true + output: + wa_sfa_student_pathway_eligible: true + +- name: Case 3, age 20 vocational student - eligible. + period: 2024-01 + input: + state_code: WA + age: 20 + technical_institution_student: true + output: + wa_sfa_student_pathway_eligible: true + +- name: Case 4, age 21 secondary student - not in pathway (over age cap). + period: 2024-01 + input: + state_code: WA + age: 21 + is_in_secondary_school: true + output: + wa_sfa_student_pathway_eligible: false + +- name: Case 5, age 19 non-student - not in pathway. + period: 2024-01 + input: + state_code: WA + age: 19 + output: + wa_sfa_student_pathway_eligible: false + +- name: Case 6, age 20 secondary and vocational - eligible (either qualifies). + period: 2024-01 + input: + state_code: WA + age: 20 + is_in_secondary_school: true + technical_institution_student: true + output: + wa_sfa_student_pathway_eligible: true diff --git a/policyengine_us/variables/gov/states/wa/dshs/sfa/eligibility/wa_sfa_eligible.py b/policyengine_us/variables/gov/states/wa/dshs/sfa/eligibility/wa_sfa_eligible.py index 81f886bd6c0..11ecf1292cc 100644 --- a/policyengine_us/variables/gov/states/wa/dshs/sfa/eligibility/wa_sfa_eligible.py +++ b/policyengine_us/variables/gov/states/wa/dshs/sfa/eligibility/wa_sfa_eligible.py @@ -13,23 +13,37 @@ class wa_sfa_eligible(Variable): ) def formula(spm_unit, period, parameters): - demographic_eligible = spm_unit("is_demographic_tanf_eligible", period) + # Pathway A: qualified alien in 5-year bar, per WAC 388-400-0010(2)(a). + # Per WAC 388-400-0010, SFA is for families federally ineligible for + # TANF. Exclude at SPM-unit level to prevent mixed-status households + # from receiving both. has_sfa_eligible_immigrant = ( add(spm_unit, period, ["wa_sfa_immigration_status_eligible"]) > 0 ) - # Per WAC 388-400-0010, SFA is explicitly for families federally - # ineligible for TANF. Exclude at SPM-unit level to prevent mixed- - # status households from receiving both. has_tanf_eligible_immigrant = ( add(spm_unit, period, ["wa_tanf_immigration_status_eligible"]) > 0 ) - sfa_pathway = has_sfa_eligible_immigrant & ~has_tanf_eligible_immigrant + immigration_pathway = has_sfa_eligible_immigrant & ~has_tanf_eligible_immigrant + + # Pathway B: 19-20 year old student, per WAC 388-400-0010(2)(c) and + # the caretaker relative of such a student per (2)(d). Caretakers + # are covered automatically because the student's presence in the + # SPM unit makes the whole unit demographically eligible. + has_19_20_student = ( + add(spm_unit, period, ["wa_sfa_student_pathway_eligible"]) > 0 + ) + tanf_eligible = spm_unit("wa_tanf_eligible", period) + student_pathway = has_19_20_student & ~tanf_eligible + + federal_demographic_eligible = spm_unit("is_demographic_tanf_eligible", period) + demographic_eligible = federal_demographic_eligible | has_19_20_student + show_all = spm_unit("wa_show_all_cash_assistance_programs", period) income_eligible = spm_unit("wa_tanf_income_eligible", period) resources_eligible = spm_unit("wa_tanf_resources_eligible", period.this_year) return ( demographic_eligible - & (sfa_pathway | show_all) + & (immigration_pathway | student_pathway | show_all) & income_eligible & resources_eligible ) diff --git a/policyengine_us/variables/gov/states/wa/dshs/sfa/eligibility/wa_sfa_immigration_status_eligible.py b/policyengine_us/variables/gov/states/wa/dshs/sfa/eligibility/wa_sfa_immigration_status_eligible.py index 7c671b37839..77f766c621c 100644 --- a/policyengine_us/variables/gov/states/wa/dshs/sfa/eligibility/wa_sfa_immigration_status_eligible.py +++ b/policyengine_us/variables/gov/states/wa/dshs/sfa/eligibility/wa_sfa_immigration_status_eligible.py @@ -12,12 +12,13 @@ class wa_sfa_immigration_status_eligible(Variable): "https://app.leg.wa.gov/wac/default.aspx?cite=388-424-0015", "https://app.leg.wa.gov/rcw/default.aspx?cite=74.08A.010", ) - # Only the qualified-alien-in-5-year-bar pathway (WAC 388-424-0015(1)(a)) - # is modeled. Other SFA pathways from WAC 388-400-0010 — nonqualified - # aliens meeting WA residency, T/U-visa and VAWA survivors of certain - # crimes, 19-20 year old students, caretaker relatives of such students, - # and pregnant women convicted of multi-state fraud — are not tracked - # at the moment. + # The qualified-alien-in-5-year-bar pathway (WAC 388-424-0015(1)(a)) is + # modeled here. The 19-20 year old student pathway (WAC 388-400-0010(2)(c)) + # and the caretaker-relative pathway (2)(d) are modeled separately via + # wa_sfa_student_pathway_eligible. Other SFA pathways from + # WAC 388-400-0010 — nonqualified aliens meeting WA residency, + # T/U-visa and VAWA survivors of certain crimes, and pregnant women + # convicted of multi-state fraud — are not tracked at the moment. def formula(person, period, parameters): is_qualified = person("is_citizen_or_legal_immigrant", period.this_year) diff --git a/policyengine_us/variables/gov/states/wa/dshs/sfa/eligibility/wa_sfa_student_pathway_eligible.py b/policyengine_us/variables/gov/states/wa/dshs/sfa/eligibility/wa_sfa_student_pathway_eligible.py new file mode 100644 index 00000000000..ca90ab8fe8e --- /dev/null +++ b/policyengine_us/variables/gov/states/wa/dshs/sfa/eligibility/wa_sfa_student_pathway_eligible.py @@ -0,0 +1,25 @@ +from policyengine_us.model_api import * + + +class wa_sfa_student_pathway_eligible(Variable): + value_type = bool + entity = Person + label = "Washington SFA student pathway eligible" + definition_period = MONTH + defined_for = StateCode.WA + reference = ( + "https://app.leg.wa.gov/wac/default.aspx?cite=388-400-0010", + "https://app.leg.wa.gov/wac/default.aspx?cite=388-404-0005", + ) + # WAC 388-404-0005(3)(a) extends SFA to 19-20 year olds with disabilities + # receiving special education per RCW 28A.155.020. We do not separately + # model that pathway at the moment; students still in K-12 special + # education at ages 19-20 are typically captured by is_in_secondary_school. + + def formula(person, period, parameters): + age = person("age", period.this_year) + p = parameters(period).gov.states.wa.dshs.sfa.student_pathway + in_age_range = p.age_eligible.calc(age) + in_secondary = person("is_in_secondary_school", period.this_year) + in_vocational = person("technical_institution_student", period.this_year) + return in_age_range & (in_secondary | in_vocational) From 3afe24042b30fcb511a87b3ac1ef819f8e7657aa Mon Sep 17 00:00:00 2001 From: Ziming Date: Sat, 25 Apr 2026 18:13:31 -0400 Subject: [PATCH 9/9] Date PAROLED_ONE_YEAR additions to 2021-09-30 enactment MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Both PAROLED_ONE_YEAR additions were dated to 1996-08-22 alongside the original PRWORA-era statuses, which retroactively grants Afghan/ Ukrainian-style bar-exemption and RCA eligibility to humanitarian parolees in pre-2021 historical-year simulations. - bar_exempt_immigration_statuses: split into two value entries; only the 2021-09-30 entry includes PAROLED_ONE_YEAR, matching enactment of P.L. 117-43 § 2502 (Continuing Appropriations Act, 2022). - eligible_immigration_statuses (WA RCA): same split, kept consistent with the federal bar-exempt list as the cross-reference comment promises. - Add 8 USC 1641(b)(8) and P.L. 117-43 § 2502 to the bar-exempt YAML reference block; the comment already named them but the structured reference list cited only 1613(b)(1), which does not actually enumerate parolees. - Update both comments to lead with the 2021-09-30 start date and cite P.L. 117-128 / P.L. 118-42 § 209(f) for the Ukrainian extension. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../tanf/bar_exempt_immigration_statuses.yaml | 22 ++++++++++++++----- .../rca/eligible_immigration_statuses.yaml | 22 +++++++++++++------ 2 files changed, 31 insertions(+), 13 deletions(-) diff --git a/policyengine_us/parameters/gov/hhs/tanf/bar_exempt_immigration_statuses.yaml b/policyengine_us/parameters/gov/hhs/tanf/bar_exempt_immigration_statuses.yaml index e40a89952e6..5a2d17580dd 100644 --- a/policyengine_us/parameters/gov/hhs/tanf/bar_exempt_immigration_statuses.yaml +++ b/policyengine_us/parameters/gov/hhs/tanf/bar_exempt_immigration_statuses.yaml @@ -1,11 +1,12 @@ description: The United States exempts these immigration statuses from the five-year bar on federal Temporary Assistance for Needy Families. -# PAROLED_ONE_YEAR is treated as bar-exempt to cover Afghan (P.L. 117-43) -# and Ukrainian (P.L. 117-128) humanitarian parolees, who are statutorily -# treated as refugees for federal benefit purposes. We do not distinguish -# those populations from other INA 212(d)(5) parolees at the moment, so -# this over-grants the bar exemption to the small population of -# non-humanitarian parolees. Kept consistent with the RCA eligible-status +# PAROLED_ONE_YEAR is treated as bar-exempt starting 2021-09-30 to cover +# Afghan (P.L. 117-43 § 2502, enacted 2021-09-30) and Ukrainian (P.L. 117-128 +# and P.L. 118-42 Div. G § 209(f)) humanitarian parolees, who are statutorily +# treated as refugees for federal benefit purposes per 8 USC 1641(b)(8). We +# do not distinguish those populations from other INA 212(d)(5) parolees at +# the moment, so this over-grants the bar exemption to the small population +# of non-humanitarian parolees. Kept consistent with the RCA eligible-status # list at parameters/gov/states/wa/dshs/rca/eligible_immigration_statuses.yaml. values: 1996-08-22: @@ -13,6 +14,11 @@ values: - ASYLEE - CUBAN_HAITIAN_ENTRANT - DEPORTATION_WITHHELD + 2021-09-30: + - REFUGEE + - ASYLEE + - CUBAN_HAITIAN_ENTRANT + - DEPORTATION_WITHHELD - PAROLED_ONE_YEAR metadata: @@ -22,3 +28,7 @@ metadata: reference: - title: 8 USC 1613(b)(1) - Exceptions to five-year limited eligibility href: https://www.law.cornell.edu/uscode/text/8/1613 + - title: 8 USC 1641(b)(8) - "Qualified alien" includes humanitarian parolees treated as refugees + href: https://www.law.cornell.edu/uscode/text/8/1641 + - title: P.L. 117-43 § 2502 - Afghan humanitarian parolees treated as refugees for benefit purposes + href: https://www.congress.gov/117/plaws/publ43/PLAW-117publ43.pdf diff --git a/policyengine_us/parameters/gov/states/wa/dshs/rca/eligible_immigration_statuses.yaml b/policyengine_us/parameters/gov/states/wa/dshs/rca/eligible_immigration_statuses.yaml index b574364808a..d3a5da246ba 100644 --- a/policyengine_us/parameters/gov/states/wa/dshs/rca/eligible_immigration_statuses.yaml +++ b/policyengine_us/parameters/gov/states/wa/dshs/rca/eligible_immigration_statuses.yaml @@ -1,12 +1,14 @@ description: Washington considers these immigration statuses eligible for the Refugee Cash Assistance program. -# PAROLED_ONE_YEAR is treated as RCA-eligible to cover Afghan (P.L. 117-43) -# and Ukrainian (P.L. 117-128) humanitarian parolees. We do not distinguish -# those populations from other INA 212(d)(5) parolees at the moment, so -# this over-grants RCA to the small population of non-humanitarian parolees. -# PAROLED_ONE_YEAR is also bar-exempt for federal TANF (see -# parameters/gov/hhs/tanf/bar_exempt_immigration_statuses.yaml), so a -# humanitarian-parolee family with a child receives TANF rather than RCA; +# PAROLED_ONE_YEAR is treated as RCA-eligible starting 2021-09-30 to cover +# Afghan (P.L. 117-43 § 2502, enacted 2021-09-30) and Ukrainian (P.L. 117-128 +# and P.L. 118-42 Div. G § 209(f)) humanitarian parolees, who are statutorily +# treated as refugees for federal benefit purposes per 8 USC 1641(b)(8). We +# do not distinguish those populations from other INA 212(d)(5) parolees at +# the moment, so this over-grants RCA to the small population of +# non-humanitarian parolees. PAROLED_ONE_YEAR is also bar-exempt for federal +# TANF (see parameters/gov/hhs/tanf/bar_exempt_immigration_statuses.yaml), so +# a humanitarian-parolee family with a child receives TANF rather than RCA; # RCA picks up adults without children and pre-TANF cases via the 12-month # ORR window. values: @@ -16,6 +18,12 @@ values: - CUBAN_HAITIAN_ENTRANT - DEPORTATION_WITHHELD - CONDITIONAL_ENTRANT + 2021-09-30: + - REFUGEE + - ASYLEE + - CUBAN_HAITIAN_ENTRANT + - DEPORTATION_WITHHELD + - CONDITIONAL_ENTRANT - PAROLED_ONE_YEAR metadata: