diff --git a/changelog.d/wy-ssp-2026.added.md b/changelog.d/wy-ssp-2026.added.md new file mode 100644 index 00000000000..5cefdcf3772 --- /dev/null +++ b/changelog.d/wy-ssp-2026.added.md @@ -0,0 +1 @@ +Add Wyoming's State Supplemental Payment for residents whose sole income is SSI, verified for 2026. diff --git a/policyengine_us/parameters/gov/household/household_state_benefits.yaml b/policyengine_us/parameters/gov/household/household_state_benefits.yaml index efec9b3ce44..dc385efe5ef 100644 --- a/policyengine_us/parameters/gov/household/household_state_benefits.yaml +++ b/policyengine_us/parameters/gov/household/household_state_benefits.yaml @@ -77,6 +77,8 @@ values: - tx_ssi_state_supplement # Virginia benefits - va_child_care_subsidies + # Wyoming benefits + - wy_ssp # Massachusetts benefits - ma_eaedc # DC benefits @@ -175,6 +177,8 @@ values: - va_child_care_subsidies # West Virginia benefits - wv_child_care_subsidies + # Wyoming benefits + - wy_ssp # North Carolina benefits - nc_child_care_subsidies # South Carolina benefits @@ -281,6 +285,8 @@ values: - va_child_care_subsidies # West Virginia benefits - wv_child_care_subsidies + # Wyoming benefits + - wy_ssp # North Carolina benefits - nc_child_care_subsidies # South Carolina benefits @@ -388,6 +394,8 @@ values: - va_child_care_subsidies # West Virginia benefits - wv_child_care_subsidies + # Wyoming benefits + - wy_ssp # North Carolina benefits - nc_child_care_subsidies # South Carolina benefits diff --git a/policyengine_us/parameters/gov/hud/annual_income/sources/unearned.yaml b/policyengine_us/parameters/gov/hud/annual_income/sources/unearned.yaml index 30646eea1e9..be58eee99f2 100644 --- a/policyengine_us/parameters/gov/hud/annual_income/sources/unearned.yaml +++ b/policyengine_us/parameters/gov/hud/annual_income/sources/unearned.yaml @@ -21,6 +21,7 @@ values: - ssi - nj_ssp - pa_ssp + - wy_ssp - general_assistance - total_unemployment_compensation - child_support_received diff --git a/policyengine_us/parameters/gov/states/wy/health/ssp/amount.yaml b/policyengine_us/parameters/gov/states/wy/health/ssp/amount.yaml new file mode 100644 index 00000000000..06b74f11600 --- /dev/null +++ b/policyengine_us/parameters/gov/states/wy/health/ssp/amount.yaml @@ -0,0 +1,17 @@ +description: Wyoming provides this amount as the monthly payment under the State Supplemental Payment program. +values: + 2021-07-01: 20 + +metadata: + unit: currency-USD + period: month + label: Wyoming SSP amount + reference: + - title: Wyoming Eligibility Online Manual M1804, State Supplemental Payments + href: https://ecom.wyo.gov/m1800-other-programs/m1804-state-supplemental-payments + - title: W.S. 42-2-103(d) + href: https://wyoleg.gov/statutes/compress/title42.pdf#page=7 + - title: 2024 Wyoming Budget Act HB0001 (Enrolled Act 50), Section 2, Section 048, footnote 2 + href: https://wyoleg.gov/2024/Enroll/HB0001.pdf#page=21 + - title: "2026 Wyoming Budget Act SF0001 (Enrolled Act 27), Section 2, Section 048, footnote 2 #page 21-22" + href: https://wyoleg.gov/2026/Enroll/SF0001.pdf#page=21 diff --git a/policyengine_us/parameters/gov/usda/snap/income/sources/unearned.yaml b/policyengine_us/parameters/gov/usda/snap/income/sources/unearned.yaml index 859029639b8..911286fbe0c 100644 --- a/policyengine_us/parameters/gov/usda/snap/income/sources/unearned.yaml +++ b/policyengine_us/parameters/gov/usda/snap/income/sources/unearned.yaml @@ -52,6 +52,7 @@ values: - sc_ssi_state_supplement - tx_ssi_state_supplement - wa_ssp + - wy_ssp # Listed elsewhere: ca_state_supplement is an SPM unit variable with no # person-level counterpart. policyengine-core projects a group value onto # every member, so listing it here would count it once per person in the diff --git a/policyengine_us/programs.yaml b/policyengine_us/programs.yaml index f626dd6ccc7..13c27c1be98 100644 --- a/policyengine_us/programs.yaml +++ b/policyengine_us/programs.yaml @@ -1117,6 +1117,16 @@ programs: homes, plus the institutional Supplement for Personal Needs. Mandatory grandfathered and essential-person supplements and ancillary facility subsidies are not modeled. + - state: WY + status: partial + name: Wyoming SSP + full_name: Wyoming State Supplemental Payment + variable: wy_ssp + parameter_prefix: gov.states.wy.health.ssp + verified_years: "2026" + notes: >- + Models the 2026 flat payment for Wyoming residents who receive SSI + and have no other income. - id: social_security name: Social Security diff --git a/policyengine_us/tests/policy/baseline/gov/states/wy/health/ssp/integration.yaml b/policyengine_us/tests/policy/baseline/gov/states/wy/health/ssp/integration.yaml new file mode 100644 index 00000000000..1d07b6116e3 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/wy/health/ssp/integration.yaml @@ -0,0 +1,40 @@ +- name: Case 1, Wyoming supplement enters state benefit and SNAP income totals. + period: 2026-01 + input: + state_code: WY + age: 65 + output: + wy_ssp_eligible: true + wy_ssp: 20 + snap_unearned_income: 1_014 + household_state_benefits: 20 + +- name: Case 2, eligible couple receives twenty dollars each. + period: 2026-01 + input: + people: + person1: + age: 65 + person2: + age: 65 + marital_units: + couple: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: WY + output: + ssi: [745.5, 745.5] + wy_ssp: [20, 20] + household_state_benefits: 40 + +- name: Case 3, annual Wyoming supplement counts as HUD income. + period: 2026 + input: + state_code: WY + age: 65 + output: + wy_ssp: 240 + # SSI $994 * 12 = $11,928, plus the $240 supplement = $12,168. + hud_annual_income: 12_168 diff --git a/policyengine_us/tests/policy/baseline/gov/states/wy/health/ssp/wy_ssp.yaml b/policyengine_us/tests/policy/baseline/gov/states/wy/health/ssp/wy_ssp.yaml new file mode 100644 index 00000000000..022a2b11f46 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/wy/health/ssp/wy_ssp.yaml @@ -0,0 +1,201 @@ +# Wyoming EOM M1804: $20 monthly, with SSI as the sole income source. +- name: Case 1, aged recipient with only SSI. + period: 2026-01 + input: + state_code: WY + age: 65 + output: + ssi: 994 + wy_ssp: 20 + +- name: Case 2, income excluded from federal SSI still defeats the sole income rule. + period: 2026-01 + input: + state_code: WY + age: 65 + # $1,500 in savings, under the $2,000 SSI resource limit, earning the FDIC + # national savings rate of 0.37% (September 2026): $1,500 * 0.0037 = $5.55. + bank_account_assets: 1_500 + taxable_interest_income: 5.55 + output: + # $5.55 / 12 = $0.4625 interest a month, all absorbed by the $20 general + # exclusion: countable income $0, so $994 - $0 = $994. + ssi: 994 + # $0.4625 > $0 is other income in the month, so the sole income rule fails. + wy_ssp: 0 + +- name: Case 3, part-time earnings still defeat the sole income rule. + period: 2026-01 + input: + state_code: WY + age: 65 + # 10 hours a week at the Wyoming retail salesperson median wage of $16.50 + # (BLS OEWS May 2025): $16.50 * 10 * 52 = $8,580 a year. + employment_income: 8_580 + output: + # $8,580 / 12 = $715 a month; ($715 - $20 - $65) * 0.5 = $315 countable; + # $994 - $315 = $679. + ssi: 679 + # $715 of wages is other income in the month, so the sole income rule fails. + wy_ssp: 0 + +- name: Case 4, no SSI receipt. + period: 2026-01 + input: + state_code: WY + age: 65 + takes_up_ssi_if_eligible: false + output: + wy_ssp: 0 + +- name: Case 5, outside Wyoming. + period: 2026-01 + input: + state_code: UT + age: 65 + output: + wy_ssp: 0 + +- name: Case 6, institutional SSI also qualifies. + period: 2026-01 + input: + state_code: WY + age: 65 + ssi_lives_in_medical_treatment_facility: true + ssi_medicaid_pays_majority_of_care: true + output: + ssi: 30 + wy_ssp: 20 + +- name: Case 7, losses cannot offset other income for sole source eligibility. + period: 2026-01 + input: + state_code: WY + age: 65 + self_employment_income: -12_000 + social_security_retirement: 120 + output: + wy_ssp: 0 + +- name: Case 8, a disabled child living with working parents may qualify. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 40 + own_children_in_household: 1 + # Full-time work at the Wyoming median annual wage (BLS OEWS May 2025). + employment_income: 50_270 + person2: + age: 38 + own_children_in_household: 1 + person3: + age: 12 + meets_ssi_disability_criteria: true + tax_units: + tax_unit: + members: [person1, person2, person3] + marital_units: + marital_unit: + members: [person1, person2] + households: + household: + members: [person1, person2, person3] + state_code: WY + output: + # Parents: $50,270 / 12 = $4,189.17 a month; ($4,189.17 - $20 - $65) * 0.5 + # = $2,052.08; less the two-parent allocation of $1,491 = $561.08 deemed. + ssi_unearned_income_deemed_from_ineligible_parent: [0, 0, 561.08] + # Child: $561.08 - $20 general exclusion = $541.08 countable; + # $994 - $541.08 = $452.92. The parents are not aged, blind or disabled. + ssi: [0, 0, 452.92] + # The sole income rule reads only the child's own sources, which are $0; + # deemed parental income is not one of them. + wy_ssp: [0, 0, 20] + +- name: Case 9, annual total includes twelve payments. + period: 2026 + input: + state_code: WY + age: 65 + output: + wy_ssp: 240 + +- name: Case 10, a self-employment loss alone is not other income. + period: 2026-01 + input: + state_code: WY + age: 65 + self_employment_income: -12_000 + output: + # SSI floors earned income at $0: countable income $0, so $994 - $0 = $994. + ssi: 994 + # -$12,000 / 12 = -$1,000 a month is not above $0, so no source is other + # income: $20. + wy_ssp: 20 + +- name: Case 11, reported SSI receipt qualifies when modeled SSI is zero. + period: 2026-01 + input: + state_code: WY + age: 40 + receives_ssi: true + output: + # No disability input, so the model finds no aged, blind or disabled + # status and computes $0 SSI. + ssi: 0 + # Reported receipt meets the SSI condition and there is no other income: $20. + wy_ssp: 20 + +- name: Case 12, in an eligible couple only the spouse with other income loses the supplement. + period: 2026-01 + input: + people: + person1: + age: 67 + # $100 a month of Social Security retirement: $100 * 12 = $1,200 a year. + social_security_retirement: 1_200 + person2: + age: 66 + marital_units: + marital_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: WY + output: + # Couple: $100 - $20 general exclusion = $80 countable; + # ($1,491 - $80) / 2 = $705.50 each. + ssi: [705.5, 705.5] + # person1 has $100 of own income; person2's own sources are $0, so the + # spouse's income does not count against person2: $20. + wy_ssp: [0, 20] + +- name: Case 13, income deemed from an ineligible spouse does not defeat the sole income rule. + period: 2026-01 + input: + people: + person1: + age: 67 + person2: + age: 45 + # 14 hours a week at the Wyoming retail salesperson median wage of + # $16.50 (BLS OEWS May 2025): $16.50 * 14 * 52 = $12,012 a year. + employment_income: 12_012 + marital_units: + marital_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: WY + output: + # $12,012 / 12 = $1,001 a month of spouse wages, above the $497 difference + # between the couple and individual rates, so deeming applies: + # ($1,001 - $20 - $65) * 0.5 = $458 deemed; $1,491 - $458 = $1,033, + # capped at the $994 individual rate. person2 is not aged, blind or disabled. + ssi: [994, 0] + # person1's own sources are $0; deemed spouse income is not one of them: $20. + wy_ssp: [20, 0] diff --git a/policyengine_us/variables/gov/states/wy/health/ssp/wy_ssp.py b/policyengine_us/variables/gov/states/wy/health/ssp/wy_ssp.py new file mode 100644 index 00000000000..f7b4eeb23cd --- /dev/null +++ b/policyengine_us/variables/gov/states/wy/health/ssp/wy_ssp.py @@ -0,0 +1,15 @@ +from policyengine_us.model_api import * + + +class wy_ssp(Variable): + value_type = float + entity = Person + label = "Wyoming State Supplemental Payment" + definition_period = MONTH + unit = USD + defined_for = "wy_ssp_eligible" + reference = ( + "https://ecom.wyo.gov/m1800-other-programs/m1804-state-supplemental-payments", + "https://wyoleg.gov/statutes/compress/title42.pdf#page=7", + ) + adds = ["gov.states.wy.health.ssp.amount"] diff --git a/policyengine_us/variables/gov/states/wy/health/ssp/wy_ssp_eligible.py b/policyengine_us/variables/gov/states/wy/health/ssp/wy_ssp_eligible.py new file mode 100644 index 00000000000..ab782c831d6 --- /dev/null +++ b/policyengine_us/variables/gov/states/wy/health/ssp/wy_ssp_eligible.py @@ -0,0 +1,32 @@ +from policyengine_us.model_api import * + + +class wy_ssp_eligible(Variable): + value_type = bool + entity = Person + label = "Eligible for Wyoming State Supplemental Payment" + definition_period = MONTH + defined_for = StateCode.WY + reference = ( + "https://ecom.wyo.gov/m1800-other-programs/m1804-state-supplemental-payments", + "https://wyoleg.gov/statutes/compress/title42.pdf#page=7", + ) + + def formula(person, period, parameters): + receives_ssi = (person("ssi", period) > 0) | person("receives_ssi", period) + p = parameters(period).gov.ssa.ssi.income.sources + # W.S. 42-2-103(d) requires no other income in the month. The test + # precedes SSI exclusions, and only positive amounts count, so a loss + # in one source cannot offset a positive payment from another source. + # NOTE: noncash support and income sources absent from the federal SSI + # income model are not separately evaluated. + # NOTE: only the person's own sources count. Income deemed from a parent + # or an ineligible spouse, and the other spouse's income in an eligible + # couple, are not treated as the person's other income. The statute does + # not define "income", and EOM M1804 lists child cases in a parent's + # household (living arrangement C) among its pay-rate codes. + sources = list(p.earned) + list(p.unearned) + has_other_income = np.zeros_like(receives_ssi) + for source in sources: + has_other_income = has_other_income | (person(source, period) > 0) + return receives_ssi & ~has_other_income 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 52d604f8842..57f160d6ebe 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 @@ -24,6 +24,7 @@ def formula(spm_unit, period, parameters): "fl_oss", "nj_ssp", # New Jersey benefits "pa_ssp", # Pennsylvania benefits + "wy_ssp", # Wyoming benefits "ks_sspp", # Kansas benefits "hi_oss", "la_oss", # Louisiana benefits