diff --git a/changelog.d/ok-ssp-2026.added.md b/changelog.d/ok-ssp-2026.added.md new file mode 100644 index 00000000000..c0067e2b9ae --- /dev/null +++ b/changelog.d/ok-ssp-2026.added.md @@ -0,0 +1 @@ +Add Oklahoma State Supplemental Payment 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 d2cbd6ba2d4..fdfc5c6b269 100644 --- a/policyengine_us/parameters/gov/household/household_state_benefits.yaml +++ b/policyengine_us/parameters/gov/household/household_state_benefits.yaml @@ -63,6 +63,7 @@ values: - nv_child_care_subsidies # Oklahoma benefits - ok_child_care_subsidies + - ok_ssp # South Carolina benefits - sc_child_care_subsidies # New Mexico benefits @@ -157,6 +158,7 @@ values: - nv_child_care_subsidies # Oklahoma benefits - ok_child_care_subsidies + - ok_ssp # New Mexico benefits - nm_ssi_state_supplement # South Carolina benefits @@ -259,6 +261,7 @@ values: - nv_child_care_subsidies # Oklahoma benefits - ok_child_care_subsidies + - ok_ssp # New Mexico benefits - nm_ssi_state_supplement # South Carolina benefits @@ -362,6 +365,7 @@ values: - nv_child_care_subsidies # Oklahoma benefits - ok_child_care_subsidies + - ok_ssp # New Mexico benefits - nm_ssi_state_supplement # South Carolina benefits @@ -401,6 +405,7 @@ values: - nj_property_tax_relief # New York benefits - ny_child_care_subsidies + metadata: unit: list period: year 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 0df11213631..878c558c514 100644 --- a/policyengine_us/parameters/gov/hud/annual_income/sources/unearned.yaml +++ b/policyengine_us/parameters/gov/hud/annual_income/sources/unearned.yaml @@ -19,6 +19,7 @@ values: - strike_benefits - social_security - ssi + - ok_ssp - general_assistance - total_unemployment_compensation - child_support_received @@ -29,6 +30,7 @@ values: - disability_benefits - survivor_benefits - financial_assistance + metadata: unit: list period: year diff --git a/policyengine_us/parameters/gov/ssa/ssi/income/exclusions/child_support_share.yaml b/policyengine_us/parameters/gov/ssa/ssi/income/exclusions/child_support_share.yaml new file mode 100644 index 00000000000..81c360b8302 --- /dev/null +++ b/policyengine_us/parameters/gov/ssa/ssi/income/exclusions/child_support_share.yaml @@ -0,0 +1,10 @@ +description: The Social Security Administration excludes this share of child support received by an eligible child from SSI unearned income. +values: + 2026-01-01: 0.3333333333333333 + +metadata: + unit: /1 + label: SSI child support exclusion share + reference: + - title: 20 CFR 416.1124(c)(11) + href: https://www.law.cornell.edu/cfr/text/20/416.1124 diff --git a/policyengine_us/parameters/gov/states/ok/dhs/ssp/blind_earned_exclusion.yaml b/policyengine_us/parameters/gov/states/ok/dhs/ssp/blind_earned_exclusion.yaml new file mode 100644 index 00000000000..e1dc7548a81 --- /dev/null +++ b/policyengine_us/parameters/gov/states/ok/dhs/ssp/blind_earned_exclusion.yaml @@ -0,0 +1,11 @@ +description: Oklahoma excludes this amount of a blind individual's monthly earned income under the State Supplemental Payment program. +values: + 2026-01-01: 500 + +metadata: + unit: currency-USD + period: month + label: Oklahoma SSP blind earnings exclusion + reference: + - title: OAC 317:35-5-42(g)(5) + href: https://www.oklahoma.gov/ohca/policies-and-rules/xpolicy/medical-assistance-for-adults-and-children-eligibility/eligibility-and-countable-income/countable-income-and-resources/determination-of-countable-income-for-individuals-categorically-.html diff --git a/policyengine_us/parameters/gov/states/ok/dhs/ssp/child_allocation.yaml b/policyengine_us/parameters/gov/states/ok/dhs/ssp/child_allocation.yaml new file mode 100644 index 00000000000..de0da95fd3a --- /dev/null +++ b/policyengine_us/parameters/gov/states/ok/dhs/ssp/child_allocation.yaml @@ -0,0 +1,21 @@ +description: Oklahoma allocates this monthly amount for each ineligible child under the State Supplemental Payment program. +values: + 2026-01-01: 498 + +metadata: + unit: currency-USD + period: month + label: Oklahoma SSP allocation for an ineligible child + # OAC 340:15-1-4(9)(A)-(B) bases the SSP standards on the FBR and passes + # along the SSI cost-of-living adjustment; the next Appendix C-1 edition + # replaces the projection. + uprating: + parameter: gov.ssa.uprating + rounding: + type: nearest + interval: 1 + reference: + - title: OKDHS Appendix C-1 (7/1/2026), Schedule VIII.C + href: https://oklahoma.gov/content/dam/ok/en/okdhs/documents/searchcenter/okdhsformresults/c-1.pdf#page=4 + - title: OAC 340:15-1-4(9) + href: https://www.law.cornell.edu/regulations/oklahoma/OAC-340-15-1-4 diff --git a/policyengine_us/parameters/gov/states/ok/dhs/ssp/excluded_unearned_sources.yaml b/policyengine_us/parameters/gov/states/ok/dhs/ssp/excluded_unearned_sources.yaml new file mode 100644 index 00000000000..385449c8e85 --- /dev/null +++ b/policyengine_us/parameters/gov/states/ok/dhs/ssp/excluded_unearned_sources.yaml @@ -0,0 +1,13 @@ +description: Oklahoma excludes these unearned income sources from countable income under the State Supplemental Payment program. +values: + 2026-01-01: + - dividend_income + - interest_income + +metadata: + unit: list + period: year + label: Oklahoma SSP excluded unearned income sources + reference: + - title: OAC 317:35-5-42(f)(22) + href: https://www.oklahoma.gov/ohca/policies-and-rules/xpolicy/medical-assistance-for-adults-and-children-eligibility/eligibility-and-countable-income/countable-income-and-resources/determination-of-countable-income-for-individuals-categorically-.html diff --git a/policyengine_us/parameters/gov/states/ok/dhs/ssp/ineligible_spouse_standard.yaml b/policyengine_us/parameters/gov/states/ok/dhs/ssp/ineligible_spouse_standard.yaml new file mode 100644 index 00000000000..07fd44ea1e0 --- /dev/null +++ b/policyengine_us/parameters/gov/states/ok/dhs/ssp/ineligible_spouse_standard.yaml @@ -0,0 +1,21 @@ +description: Oklahoma sets this amount as the monthly need standard for an individual with an ineligible or essential spouse under the State Supplemental Payment program. +values: + 2026-01-01: 1_532 + +metadata: + unit: currency-USD + period: month + label: Oklahoma SSP need standard for an individual with an ineligible or essential spouse + # OAC 340:15-1-4(9)(A)-(B) bases the SSP standards on the FBR and passes + # along the SSI cost-of-living adjustment; the next Appendix C-1 edition + # replaces the projection. + uprating: + parameter: gov.ssa.uprating + rounding: + type: nearest + interval: 1 + reference: + - title: OKDHS Appendix C-1 (7/1/2026), Schedule VIII.A + href: https://oklahoma.gov/content/dam/ok/en/okdhs/documents/searchcenter/okdhsformresults/c-1.pdf#page=3 + - title: OAC 340:15-1-4(9) + href: https://www.law.cornell.edu/regulations/oklahoma/OAC-340-15-1-4 diff --git a/policyengine_us/parameters/gov/states/ok/dhs/ssp/maximum_payment.yaml b/policyengine_us/parameters/gov/states/ok/dhs/ssp/maximum_payment.yaml new file mode 100644 index 00000000000..526523d44b1 --- /dev/null +++ b/policyengine_us/parameters/gov/states/ok/dhs/ssp/maximum_payment.yaml @@ -0,0 +1,11 @@ +description: Oklahoma limits each recipient's monthly payment to this amount under the State Supplemental Payment program. +values: + 2026-01-01: 40 + +metadata: + unit: currency-USD + period: month + label: Oklahoma SSP maximum payment per recipient + reference: + - title: OKDHS Appendix C-1 (7/1/2026), Schedule VIII.A + href: https://oklahoma.gov/content/dam/ok/en/okdhs/documents/searchcenter/okdhsformresults/c-1.pdf#page=3 diff --git a/policyengine_us/parameters/gov/states/ok/tax/income/credits/gross_income_sources.yaml b/policyengine_us/parameters/gov/states/ok/tax/income/credits/gross_income_sources.yaml index 70ba3a77295..54eb8257ffc 100644 --- a/policyengine_us/parameters/gov/states/ok/tax/income/credits/gross_income_sources.yaml +++ b/policyengine_us/parameters/gov/states/ok/tax/income/credits/gross_income_sources.yaml @@ -25,7 +25,7 @@ values: - illicit_income - miscellaneous_income - ssi - # - ok_state_supplement + - ok_ssp - general_assistance - eitc @@ -42,7 +42,7 @@ metadata: href: https://oklahoma.gov/content/dam/ok/en/tax/documents/forms/individuals/past-year/2024/511-Pkt-2024.pdf - title: 2025 Form 511 packet, Form 538-S, Part 3 (gross income lines 9 to 14) href: https://oklahoma.gov/content/dam/ok/en/tax/documents/forms/individuals/current/511-Pkt.pdf#page=51 - - title: 2025 Form 538-H, line 11 (gross positive income from rentals, royalties, partnerships, estates and trusts) + - title: 2025 Form 538-H, lines 10 (public assistance) and 11 (gross positive income from rentals, royalties, partnerships, estates and trusts) href: https://oklahoma.gov/content/dam/ok/en/tax/documents/forms/individuals/current/538-H.pdf#page=1 - title: Okla. Admin. Code 710:50-15-96(c) (gross household income is the gross income of every type) href: https://www.law.cornell.edu/regulations/oklahoma/OAC-710-50-15-96 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 e9baee603e8..482cb03d9ae 100644 --- a/policyengine_us/parameters/gov/usda/snap/income/sources/unearned.yaml +++ b/policyengine_us/parameters/gov/usda/snap/income/sources/unearned.yaml @@ -47,6 +47,7 @@ values: - mo_ssp - ne_aabd - nm_ssi_state_supplement + - ok_ssp - sc_ssi_state_supplement - tx_ssi_state_supplement - wa_ssp @@ -95,9 +96,7 @@ values: metadata: reference: - - title: 7 CFR 273.9(b)(2) - href: https://www.law.cornell.edu/cfr/text/7/273.9#b_2 - - title: 7 CFR 273.9(c)(1) - href: https://www.law.cornell.edu/cfr/text/7/273.9#c_1 + - title: 7 CFR 273.9(b)(2) and (c)(1) + href: https://www.law.cornell.edu/cfr/text/7/273.9 - title: POMS SI 01401.001 General Information about State Supplementation href: https://secure.ssa.gov/poms.nsf/lnx/0501401001 diff --git a/policyengine_us/programs.yaml b/policyengine_us/programs.yaml index 5250ab3aa89..f50413efa8d 100644 --- a/policyengine_us/programs.yaml +++ b/policyengine_us/programs.yaml @@ -1093,6 +1093,16 @@ programs: tracks. Unmodeled paths: grandfathered medically-needy-in-medical- institution recipients per WAC 388-478-0055(2)(b); DDA-determined / PVL track per (2)(f); and foster child in BRS per (2)(g). + - state: OK + status: partial + name: Oklahoma SSP + full_name: Oklahoma State Supplemental Payment + variable: ok_ssp + parameter_prefix: gov.states.ok.dhs.ssp + verified_years: '2026' + notes: Models the 2026 community supplement for individuals, couples and individuals with + an ineligible spouse. Essential spouses, persons in a TANF case and grandfathered + institutional payments are not modeled. - id: social_security name: Social Security diff --git a/policyengine_us/tests/policy/baseline/gov/states/ok/dhs/ssp/integration.yaml b/policyengine_us/tests/policy/baseline/gov/states/ok/dhs/ssp/integration.yaml new file mode 100644 index 00000000000..596a6abf76d --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/ok/dhs/ssp/integration.yaml @@ -0,0 +1,540 @@ +- name: Case 1, eligible couple maximum. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 65 + person2: + age: 65 + marital_units: + couple: + members: [person1, person2] + families: + family: + members: [person1, person2] + households: + hh: + members: [person1, person2] + state_code: OK + output: + ok_ssp: [40, 40] + +- name: Case 2, odd dollar couple grant. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 65 + social_security_retirement: 18_600 + person2: + age: 65 + marital_units: + couple: + members: [person1, person2] + families: + family: + members: [person1, person2] + households: + hh: + members: [person1, person2] + state_code: OK + output: + ok_ssp: [20, 21] + +- name: Case 3, ineligible spouse income leaves partial grant. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 65 + person2: + age: 63 + social_security_retirement: 18_480 + marital_units: + couple: + members: [person1, person2] + families: + family: + members: [person1, person2] + households: + hh: + members: [person1, person2] + state_code: OK + output: + ok_ssp: [12, 0] + +- name: Case 4, own income test is separate from combined test. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 65 + social_security_retirement: 12_720 + person2: + age: 40 + marital_units: + couple: + members: [person1, person2] + families: + family: + members: [person1, person2] + households: + hh: + members: [person1, person2] + state_code: OK + output: + ok_ssp: [0, 0] + +- name: Case 5, aged spouse who declines SSI is an ineligible spouse whose income counts. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 68 + social_security_retirement: 6_000 + person2: + age: 66 + social_security_retirement: 18_000 + takes_up_ssi_if_eligible: false + marital_units: + couple: + members: [person1, person2] + families: + family: + members: [person1, person2] + households: + hh: + members: [person1, person2] + state_code: OK + output: + # person2 does not take up, so only person1 is SSP-eligible. + ok_ssp_eligible: [true, false] + # 317:35-5-42(k)(1): a spouse who is not eligible is an ineligible spouse. + # Federal couple SSI: (500 + 1_500 - 20) / 2 = 990 > 745.5, so 0. + # Own income 500 - 20 = 480 < 1_034, but combined income + # 500 + 1_500 - 20 = 1_980 >= 1_532, so 0. + ok_ssp: [0, 0] + +- name: Case 6, disabled spouse barred from SSP is an ineligible spouse whose income counts. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 68 + social_security_retirement: 6_000 + person2: + age: 55 + meets_ssi_disability_criteria: true + social_security_disability: 18_000 + ok_ssp_is_excluded: true + marital_units: + couple: + members: [person1, person2] + families: + family: + members: [person1, person2] + households: + hh: + members: [person1, person2] + state_code: OK + output: + # person2 is disabled but excluded, so only person1 is SSP-eligible. + ok_ssp_eligible: [true, false] + # 317:35-5-42(k)(1): the barred spouse is an ineligible spouse, so the + # 1_500 SSDI is combined. Federal couple SSI: (500 + 1_500 - 20) / 2 = 990 + # > 745.5, so 0. Combined income 1_980 >= 1_532, so 0. + ok_ssp: [0, 0] + +- name: Case 7, spouse child allocation supports recipient. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 65 + person2: + age: 40 + employment_income: 41_600 + person3: + age: 10 + marital_units: + couple: + members: [person1, person2] + child: + members: [person3] + families: + family: + members: [person1, person2, person3] + households: + hh: + members: [person1, person2, person3] + state_code: OK + output: + # Federal: 41_600 - 5_964 child allocation = 35_636 deemed earnings; + # 1_491 - (2_969.67 - 85) / 2 = 48.67 SSI. + # Combined: 3_466.67 rounds to 3_467; (3_467 - 498 - 85) / 2 = 1_442 + # + 48.67 = 1_490.67 < 1_532; min(41.33, 40) = 40. + ok_ssp: [40, 0, 0] + +- name: Case 8, child income reduces spouse allocation. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 65 + person2: + age: 40 + employment_income: 41_600 + person3: + age: 10 + social_security_survivors: 4_800 + marital_units: + couple: + members: [person1, person2] + child: + members: [person3] + families: + family: + members: [person1, person2, person3] + households: + hh: + members: [person1, person2, person3] + state_code: OK + output: + # Federal: 41_600 - (5_964 - 4_800) = 40_436 deemed earnings; + # (3_369.67 - 85) / 2 = 1_642.33 > 1_491, so SSI is 0. + # Allocation 498 - 400 = 98; (3_467 - 98 - 85) / 2 = 1_642 >= 1_532. + ok_ssp: [0, 0, 0] + +- name: Case 9, resources of ineligible spouse count. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 65 + person2: + age: 40 + ssi_countable_resources: 3_001 + marital_units: + couple: + members: [person1, person2] + families: + family: + members: [person1, person2] + households: + hh: + members: [person1, person2] + state_code: OK + output: + ok_ssp: [0, 0] + +- name: Case 10, annual supplement and SNAP income. + period: 2026 + absolute_error_margin: 0.01 + input: + state_code: OK + age: 65 + output: + ok_ssp: 480 + household_state_benefits: 480 + snap_unearned_income: 12_408 + hud_unearned_income: 12_408 + +- name: Case 11, parents' savings over the deeming allowance bar a blind child. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 40 + person_id: 1 + employment_income: 45_000 + bank_account_assets: 9_000 + person2: + age: 38 + person_id: 2 + person3: + age: 8 + person_id: 3 + parent_1_id: 1 + parent_2_id: 2 + is_blind: true + marital_units: + parents: + members: [person1, person2] + child: + members: [person3] + families: + family: + members: [person1, person2, person3] + households: + hh: + members: [person1, person2, person3] + state_code: OK + output: + # 9_000 parental savings - 3_000 two-parent allowance = 6_000 deemed. + ssi_resources_deemed_from_ineligible_parent: [0, 0, 6_000] + # Child: 0 own + 6_000 deemed > 2_000 limit; parents are not aged, + # blind or disabled. + is_ssi_eligible: [false, false, false] + ok_ssp_eligible: [false, false, false] + # Father: (3_750 - 85) / 2 = 1_832.5. Child: deemed parental income + # (3_750 - 85) / 2 - 2 * 745.5 = 341.5, less 20 = 321.5, with no SSI. + ok_ssp_own_countable_income: [1_832.5, 0, 321.5] + # 321.5 < 1_034, so only the resource test bars the payment. + ok_ssp: [0, 0, 0] + +- name: Case 12, one-third value counts once for an SSI husband with an ineligible wife in their daughter's home. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 70 + ssi_lives_in_another_persons_household: true + ssi_receives_shelter_from_others_in_household: true + ssi_others_pay_all_meals: true + person2: + age: 62 + social_security_retirement: 4_800 + ssi_lives_in_another_persons_household: true + ssi_receives_shelter_from_others_in_household: true + ssi_others_pay_all_meals: true + marital_units: + couple: + members: [person1, person2] + families: + family: + members: [person1, person2] + households: + hh: + members: [person1, person2] + state_code: OK + output: + # Wife's 400 is below the 1_491 - 994 = 497 deeming threshold. + # Husband: 994 * (1 - 1/3) = 662.67 reduced federal rate. + ssi: [662.67, 0] + ok_ssp_eligible: [true, false] + # Husband: 662.67 SSI + 994 / 3 = 331.33 one-third value = 994. + # Wife: 400 - 20 = 380 + 331.33 = 711.33 (not used). + ok_ssp_own_countable_income: [994, 711.33] + # 380 + 662.67 + 331.33 for the husband only = 1_374. + ok_ssp_countable_income: [1_374, 1_374] + # Own 994 < 1_034; min(1_532 - 1_374, 40) = 40. + ok_ssp: [40, 0] + +- name: Case 13, aged spouse in a medical facility leaves the community spouse on the individual test. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 68 + social_security_retirement: 7_200 + person2: + age: 66 + social_security_retirement: 7_200 + ssi_lives_in_medical_treatment_facility: true + ssi_medicaid_pays_majority_of_care: true + marital_units: + couple: + members: [person1, person2] + families: + family: + members: [person1, person2] + households: + hh: + members: [person1, person2] + state_code: OK + output: + # Separate computation: 994 - (600 - 20) = 414; facility rate 30 - 580 < 0. + ssi: [414, 0] + ok_ssp_eligible: [true, false] + # Community spouse: 580 + 414 = 994. Facility spouse: 600 - 20 = 580. + ok_ssp_own_countable_income: [994, 580] + # 1_200 - 20 + 414 = 1_594 (not used). + ok_ssp_countable_income: [1_594, 1_594] + # min(1_034 - 994, 40) = 40. + ok_ssp: [40, 0] + +- name: Case 14, one-third of child support is excluded for a disabled child. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 32 + person_id: 1 + employment_income: 31_200 + person2: + age: 9 + person_id: 2 + parent_1_id: 1 + meets_ssi_disability_criteria: true + child_support_received: 4_800 + marital_units: + parent: + members: [person1] + child: + members: [person2] + families: + family: + members: [person1, person2] + households: + hh: + members: [person1, person2] + state_code: OK + output: + # (2_600 - 85) / 2 = 1_257.5 - 994 parent allocation = 263.5. + ssi_unearned_income_deemed_from_ineligible_parent: [0, 263.5] + # Federal SSI counts all child support: 994 - (400 + 263.5 - 20) = 350.5. + ssi: [0, 350.5] + ok_ssp_eligible: [false, true] + # Mother: (2_600 - 85) / 2 = 1_257.5. + # Child: 400 - 400 / 3 = 266.67 + 263.5 - 20 = 510.17 + 350.5 = 860.67. + ok_ssp_own_countable_income: [1_257.5, 860.67] + ok_ssp_countable_income: [1_257.5, 860.67] + # min(1_034 - 860.67, 40) = 40. + ok_ssp: [0, 40] + +- name: Case 15, children's allocation is summed and reduced by a teen's earnings. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 45 + meets_ssi_disability_criteria: true + person2: + age: 43 + employment_income: 41_600 + person3: + age: 16 + employment_income: 3_600 + person4: + age: 9 + marital_units: + couple: + members: [person1, person2] + teen: + members: [person3] + child: + members: [person4] + families: + family: + members: [person1, person2, person3, person4] + households: + hh: + members: [person1, person2, person3, person4] + state_code: OK + output: + # (498 - 300) + 498 = 696. + ok_ssp_spouse_child_allocation: [696, 696, 696, 696] + # Federal: 41_600 - (5_964 - 3_600) - 5_964 = 33_272 deemed earnings; + # (2_772.67 - 85) / 2 = 1_343.83; 1_491 - 1_343.83 = 147.17. + ssi: [147.17, 0, 0, 0] + ok_ssp_eligible: [true, false, false, false] + # Claimant: 147.17 SSI. Wife: (3_467 - 85) / 2 = 1_691. + # Teen: (300 - 85) / 2 = 107.5. + ok_ssp_own_countable_income: [147.17, 1_691, 107.5, 0] + # Combined: (3_467 - 696 - 85) / 2 = 1_343 + 147.17 = 1_490.17; + # min(1_532 - 1_490.17, 40) = 40. + ok_ssp: [40, 0, 0, 0] + +- name: Case 16, ineligible spouse's in-kind support and maintenance is excluded from the couple test. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 70 + ssi_receives_outside_shelter_support: true + person2: + age: 62 + social_security_retirement: 8_400 + ssi_receives_outside_shelter_support: true + marital_units: + couple: + members: [person1, person2] + families: + family: + members: [person1, person2] + households: + hh: + members: [person1, person2] + state_code: OK + output: + # Deeming presumed maximum value 1_491 / 6 + 10 = 258.50 for the claimant; + # the ineligible spouse's own 994 / 3 + 20 = 351.33 is excluded by + # 317:35-5-42(l)(12). + ssi_in_kind_support_and_maintenance: [258.5, 351.33] + # Federal: 1_491 - (258.50 - 20 + 700 - 20) = 572.50 (the deeming + # computation applies the $20 exclusion twice; issue 10243). + ssi: [572.5, 0] + # Combined: 258.50 + 700 - 20 + 572.50 = 1_511, the same as when only + # person1 receives the support; min(1_532 - 1_511, 40) = 21. + ok_ssp_countable_income: [1_511, 1_511] + ok_ssp: [21, 0] + +- name: Case 17, eligible couple's shared in-kind support and maintenance counts once. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 70 + ssi_receives_outside_shelter_support: true + person2: + age: 68 + ssi_receives_outside_shelter_support: true + marital_units: + couple: + members: [person1, person2] + families: + family: + members: [person1, person2] + households: + hh: + members: [person1, person2] + state_code: OK + output: + # The couple presumed maximum value 1_491 / 3 + 20 = 517 is counted once: + # SSI (745.50 - (517 - 20) / 2) = 497 each. + ssi: [497, 497] + # 517 - 20 + 497 + 497 = 1_491; 1_571 - 1_491 = 80, split [40, 40]. + ok_ssp_countable_income: [1_491, 1_491] + ok_ssp: [40, 40] + +- name: Case 18, ineligible spouse standard follows the projected 2027 SSI cost-of-living adjustment. + period: 2027-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 65 + person2: + age: 63 + social_security_retirement: 18_480 + marital_units: + couple: + members: [person1, person2] + families: + family: + members: [person1, person2] + households: + hh: + members: [person1, person2] + state_code: OK + output: + # The Case 3 household in 2027: the projected couple FBR (about 1_532.75) + # leaves partial SSI, so combined income is about 1_532.75. The uprated + # 1_575 standard keeps the 40 maximum; a frozen 1_532 would pay 0. + ok_ssp: [40, 0] diff --git a/policyengine_us/tests/policy/baseline/gov/states/ok/dhs/ssp/ok_ssp.yaml b/policyengine_us/tests/policy/baseline/gov/states/ok/dhs/ssp/ok_ssp.yaml new file mode 100644 index 00000000000..8a4616a8caa --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/ok/dhs/ssp/ok_ssp.yaml @@ -0,0 +1,245 @@ +- name: Case 1, full SSI gets maximum supplement. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: OK + age: 65 + output: + ok_ssp: 40 + +- name: Case 2, small cash income gets maximum supplement. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: OK + age: 65 + social_security_retirement: 240 + output: + ok_ssp: 40 + +- name: Case 3, state only payment above SSI limit. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: OK + age: 65 + social_security_retirement: 12_240 + output: + ok_ssp: 34 + +- name: Case 4, income at state need standard. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: OK + age: 65 + social_security_retirement: 12_648 + output: + ok_ssp: 0 + +- name: Case 5, earnings without special blind exclusion. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: OK + age: 65 + employment_income: 30_000 + output: + ok_ssp: 0 + +- name: Case 6, extra five hundred dollar exclusion for blind earnings. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: OK + age: 65 + employment_income: 30_000 + is_blind: true + output: + ok_ssp: 40 + +- name: Case 7, income sources round before exclusions. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: OK + age: 65 + social_security_retirement: 12_245.88 + output: + ok_ssp: 34 + +- name: Case 8, half dollar source rounds upward. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: OK + age: 65 + social_security_retirement: 12_246 + output: + ok_ssp: 33 + +- name: Case 9, interest from resources is excluded. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: OK + age: 65 + social_security_retirement: 12_240 + interest_income: 1_200 + output: + ok_ssp: 34 + +- name: Case 10, countable resources at limit. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: OK + age: 65 + ssi_countable_resources: 2_000 + output: + ok_ssp: 40 + +- name: Case 11, excess countable resources. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: OK + age: 65 + ssi_countable_resources: 2_001 + output: + ok_ssp: 0 + +- name: Case 12, blind child is eligible. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 34 + person_id: 1 + employment_income: 15_080 + person2: + age: 10 + person_id: 2 + parent_1_id: 1 + is_blind: true + marital_units: + parent: + members: [person1] + child: + members: [person2] + households: + hh: + members: [person1, person2] + state_code: OK + output: + # Parent works full time at 7.25 an hour: (1_256.67 - 85) / 2 = 585.83 + # is below the 994 parent allocation, so nothing is deemed. + # Child SSI 994; min(1_034 - 994, 40) = 40. + ok_ssp: [0, 40] + +- name: Case 13, nonresident. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: TX + age: 65 + output: + ok_ssp: 0 + +- name: Case 14, not aged blind or disabled. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: OK + age: 40 + output: + ok_ssp: 0 + +- name: Case 15, opt out. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: OK + age: 65 + takes_up_ssi_if_eligible: false + output: + ok_ssp: 0 + +- name: Case 16, incarcerated person cannot get SSP. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: OK + age: 65 + is_incarcerated: true + output: + # Incarceration fails ok_ssp_eligible. + ok_ssp: 0 + +- name: Case 17, excluded facility or sanction. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: OK + age: 65 + ok_ssp_is_excluded: true + output: + ok_ssp: 0 + +- name: Case 18, institutional SSI is outside optional community program. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: OK + age: 65 + ssi_lives_in_medical_treatment_facility: true + ssi_medicaid_pays_majority_of_care: true + output: + # Living in a medical treatment facility fails ok_ssp_eligible. + ok_ssp: 0 + +- name: Case 19, VTR does not increase the forty dollar maximum. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: OK + age: 65 + ssi_federal_living_arrangement: ANOTHER_PERSONS_HOUSEHOLD + output: + ok_ssp: 40 + +- name: Case 20, facility living arrangement alone bars SSP. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: OK + age: 65 + ssi_federal_living_arrangement: MEDICAL_TREATMENT_FACILITY + output: + # Aged, 0 resources <= 2_000, citizen: otherwise SSI-eligible. + is_ssi_eligible: true + # The facility booleans stay false, but the arrangement is + # MEDICAL_TREATMENT_FACILITY, so in_facility is true. + ok_ssp_eligible: false + # defined_for ok_ssp_eligible, so 0. + ok_ssp: 0 + +- name: Case 21, pre-tax health premiums are not counted as wages. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: OK + age: 45 + meets_ssi_disability_criteria: true + # Full-time work at the $7.25 Oklahoma minimum wage: 7.25 x 40 x 52. + employment_income: 15_080 + pre_tax_health_insurance_premiums: 1_200 + output: + # Federal: (15_080 - 1_200) / 12 = 1_156.67; (1_156.67 - 85) / 2 = 535.83; + # SSI 994 - 535.83 = 458.17. + ssi: 458.17 + # 317:35-5-42(i): wages net of premiums round to 1_157; + # (1_157 - 85) / 2 = 536 + 458.17 = 994.17; min(1_034 - 994.17, 40) = 39.83. + ok_ssp_own_countable_income: 994.17 + ok_ssp: 39.83 diff --git a/policyengine_us/tests/policy/baseline/gov/states/ok/tax/income/ok_gross_income.yaml b/policyengine_us/tests/policy/baseline/gov/states/ok/tax/income/ok_gross_income.yaml index 72d1c4817d2..ac934f30090 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/ok/tax/income/ok_gross_income.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/ok/tax/income/ok_gross_income.yaml @@ -57,3 +57,16 @@ # 18,000 is within the 20,000 limit, so the credit is 40 for one person. ok_gross_income: 18_000 ok_stc: 40 + +- name: OK gross income counts the state supplement, which can end the property tax credit + period: 2026 + input: + age: 70 + real_estate_taxes: 500 + state_code: OK + output: + # Form 538-H line 10 counts public assistance: SSI 994 x 12 = 11,928 plus + # the 40 x 12 = 480 state supplement is 12,408, over the 12,000 limit. + ok_ssp: 480 + ok_gross_income: 12_408 + ok_ptc: 0 diff --git a/policyengine_us/variables/gov/states/ok/dhs/ssp/_ok_ssp_income.py b/policyengine_us/variables/gov/states/ok/dhs/ssp/_ok_ssp_income.py new file mode 100644 index 00000000000..485d136b1d7 --- /dev/null +++ b/policyengine_us/variables/gov/states/ok/dhs/ssp/_ok_ssp_income.py @@ -0,0 +1,88 @@ +from policyengine_us.model_api import * +from policyengine_us.variables.gov.ssa.ssi.eligibility.income._apply_ssi_exclusions import ( + _apply_ssi_exclusions, +) + + +def ok_ssp_income(person, period, parameters, *, combined): + p = parameters(period).gov.states.ok.dhs.ssp + ssi = parameters(period).gov.ssa.ssi + # 317:35-5-42(i) rounds each monthly source before applying exclusions. + earned = 0 + for source in ssi.income.sources.earned: + amount = max_(person(source, period), 0) + if source == "employment_income": + # As in ssi_earned_income, salary-reduction health premiums are + # not wages (POMS SI 00820.102). + premiums = max_(person("pre_tax_health_insurance_premiums", period), 0) + amount = amount - min_(amount, premiums) + earned = earned + np.floor(amount + 0.5) + unearned = 0 + for source in ssi.income.sources.unearned: + if source not in p.excluded_unearned_sources: + unearned = unearned + np.floor(max_(person(source, period), 0) + 0.5) + # 317:35-5-42(f)(11) excludes one-third of a child's child support. + # Federal SSI does not apply 20 CFR 416.1124(c)(11) yet (issue 10242). + child = person("is_child", period.this_year) + unearned = max_( + unearned + - child + * np.floor(max_(person("child_support_received", period), 0) + 0.5) + * ssi.income.exclusions.child_support_share, + 0, + ) + # NOTE: the deemed parental income uses the federal ineligible-child + # allocation (couple FBR minus individual FBR, 497 in 2026); Appendix C-1 + # Schedule VIII.C lists 498, so a sibling's allocation can be $1 lower. + unearned = unearned + person( + "ssi_unearned_income_deemed_from_ineligible_parent", period + ) + earned = max_( + earned + - person("ssi_blind_or_disabled_working_student_exclusion", period) + - person("is_blind", period.this_year) * p.blind_earned_exclusion, + 0, + ) + benefit = person("ssi", period) + # VTR shelter is counted separately, without the $20 income exclusion. + arrangement = person("ssi_federal_living_arrangement", period) + vtr = arrangement == arrangement.possible_values.ANOTHER_PERSONS_HOUSEHOLD + joint = person("ssi_couple_computation_applies", period) + shelter = ( + vtr + * where(joint, ssi.amount.couple / 2, ssi.amount.individual) + * ssi.amount.one_third_reduction_rate + ) + # ssi_pmv_amount gives each member of an SSI couple the whole couple + # presumed maximum value, which federal SSI counts once per couple. + # NOTE: federal SSI also runs a couple computation for an aged, blind or + # disabled spouse who is not eligible (issue 10243), so the half equals the + # deeming value (1/6 couple FBR + $10) even when 317:35-5-42(m)(4) deems + # nothing and the individual value would apply. + ism = person("ssi_in_kind_support_and_maintenance", period) + ism = where(joint, ism / 2, ism) + if combined: + eligible = person("ok_ssp_eligible", period) + # 317:35-5-42(l)(12) excludes an ineligible spouse's in-kind support + # and maintenance. + unearned = unearned + ism * eligible + allocation = ~eligible * person("ok_ssp_spouse_child_allocation", period) + earned = max_(earned - max_(allocation - unearned, 0), 0) + unearned = max_(unearned - allocation, 0) + earned = person.marital_unit.sum(earned) + unearned = person.marital_unit.sum(unearned) + # 317:35-5-42(l)(2) excludes an ineligible spouse's SSI. + benefit = person.marital_unit.sum(benefit * eligible) + # 317:35-5-42(b)(8)(A) counts the one-third value once, for the + # individual or the eligible couple, never for an ineligible spouse. + shelter = person.marital_unit.sum(shelter * eligible) + else: + unearned = unearned + ism + countable = ( + _apply_ssi_exclusions( + earned * MONTHS_IN_YEAR, unearned * MONTHS_IN_YEAR, parameters, period + ) + / MONTHS_IN_YEAR + ) + # SSI is needs-based income and does not consume the general exclusion. + return countable + benefit + shelter diff --git a/policyengine_us/variables/gov/states/ok/dhs/ssp/ok_ssp.py b/policyengine_us/variables/gov/states/ok/dhs/ssp/ok_ssp.py new file mode 100644 index 00000000000..83cccfe156d --- /dev/null +++ b/policyengine_us/variables/gov/states/ok/dhs/ssp/ok_ssp.py @@ -0,0 +1,61 @@ +from policyengine_us.model_api import * + + +class ok_ssp(Variable): + value_type = float + entity = Person + label = "Oklahoma State Supplemental Payment" + definition_period = MONTH + unit = USD + reference = ( + "https://www.law.cornell.edu/regulations/oklahoma/OAC-340-15-1-5", + "https://www.law.cornell.edu/regulations/oklahoma/OAC-340-15-1-4", + "https://www.law.cornell.edu/regulations/oklahoma/OAC-340-15-1-2", + "https://www.oklahoma.gov/ohca/policies-and-rules/xpolicy/medical-assistance-for-adults-and-children-eligibility/eligibility-and-countable-income/countable-income-and-resources/determination-of-countable-income-for-individuals-categorically-.html", + ) + defined_for = "ok_ssp_eligible" + + def formula(person, period, parameters): + p = parameters(period).gov.states.ok.dhs.ssp + ssi = parameters(period).gov.ssa.ssi.amount + # OAC 340:15-1-4(9)(B)(i): countable income must be less than 100 + # percent of the FBR plus the maximum SSP amount. + individual_standard = ssi.individual + p.maximum_payment + couple_standard = ssi.couple + 2 * p.maximum_payment + eligible = person("ok_ssp_eligible", period) + joint = person.marital_unit.sum(eligible) == 2 + # NOTE: OAC 340:15-1-2 defines an ineligible spouse as one who is not + # aged, blind or disabled, and is silent on an aged, blind or disabled + # spouse who is not eligible. 340:15-1-4(10) applies 317:35-5-42, whose + # (k)(1) defines an ineligible spouse as one living in the household + # who "is not eligible for Supplemental Security Income (SSI)", as SSI + # deeming does. Any spouse living together who is not SSP-eligible is + # therefore treated as an ineligible spouse. Essential spouses (in the + # case before 1974) are not modeled separately. + arrangement = person("ssi_federal_living_arrangement", period) + in_facility = person("ssi_lives_in_medical_treatment_facility", period) | ( + arrangement == arrangement.possible_values.MEDICAL_TREATMENT_FACILITY + ) + apart = in_facility | person("is_incarcerated", period) + ineligible_spouse = person.marital_unit.sum(~eligible & ~apart) > 0 + own = person("ok_ssp_own_countable_income", period) + combined = person("ok_ssp_countable_income", period) + standard = where( + joint, + couple_standard, + where(ineligible_spouse, p.ineligible_spouse_standard, individual_standard), + ) + income = where(joint | ineligible_spouse, combined, own) + gap = max_(standard - income, 0) + # OAC 340:15-1-5(c)(1)(B) and Appendix C-1 Schedule VIII.A give one + # spouse the odd dollar without naming which, so person-level amounts + # follow member order while the couple total does not. + first_share = np.floor(gap / 2) + first = person.marital_unit.reference_entity.members_position == 0 + payment = where(joint, where(first, first_share, gap - first_share), gap) + # NOTE: 340:15-1-5(c)(6) tests a blind or disabled minor's income plus + # deemed parental income against the SSP standard for an individual, + # while 340:15-1-4(9)(B)(iii) and Appendix C-1 Schedule VIII.C say it + # must be less than the FBR. The model follows the (c)(6) procedure. + own_test = joint | (own < individual_standard) + return own_test * min_(payment, p.maximum_payment) diff --git a/policyengine_us/variables/gov/states/ok/dhs/ssp/ok_ssp_countable_income.py b/policyengine_us/variables/gov/states/ok/dhs/ssp/ok_ssp_countable_income.py new file mode 100644 index 00000000000..c59ad6abc21 --- /dev/null +++ b/policyengine_us/variables/gov/states/ok/dhs/ssp/ok_ssp_countable_income.py @@ -0,0 +1,14 @@ +from policyengine_us.model_api import * +from policyengine_us.variables.gov.states.ok.dhs.ssp._ok_ssp_income import ok_ssp_income + + +class ok_ssp_countable_income(Variable): + value_type = float + entity = Person + label = "Oklahoma SSP countable income" + definition_period = MONTH + unit = USD + reference = "https://www.oklahoma.gov/ohca/policies-and-rules/xpolicy/medical-assistance-for-adults-and-children-eligibility/eligibility-and-countable-income/countable-income-and-resources/determination-of-countable-income-for-individuals-categorically-.html" + + def formula(person, period, parameters): + return ok_ssp_income(person, period, parameters, combined=True) diff --git a/policyengine_us/variables/gov/states/ok/dhs/ssp/ok_ssp_eligible.py b/policyengine_us/variables/gov/states/ok/dhs/ssp/ok_ssp_eligible.py new file mode 100644 index 00000000000..8339f1183cc --- /dev/null +++ b/policyengine_us/variables/gov/states/ok/dhs/ssp/ok_ssp_eligible.py @@ -0,0 +1,26 @@ +from policyengine_us.model_api import * + + +class ok_ssp_eligible(Variable): + value_type = bool + entity = Person + label = "Oklahoma State Supplemental Payment non-income eligibility" + definition_period = MONTH + reference = "https://www.law.cornell.edu/regulations/oklahoma/OAC-340-15-1-5" + defined_for = StateCode.OK + + def formula(person, period, parameters): + arrangement = person("ssi_federal_living_arrangement", period) + in_facility = person("ssi_lives_in_medical_treatment_facility", period) | ( + arrangement == arrangement.possible_values.MEDICAL_TREATMENT_FACILITY + ) + # NOTE: OAC 340:15-1-5(d) bars a person whose needs are in a TANF + # case, and (c)(4)-(5) change the spouse income test when the spouse + # or children are in one. Neither is modeled, to avoid a TANF/SSP cycle. + return ( + person("is_ssi_eligible", period) + & ~in_facility + & ~person("is_incarcerated", period) + & ~person("ok_ssp_is_excluded", period) + & person("takes_up_ssi_if_eligible", period.this_year) + ) diff --git a/policyengine_us/variables/gov/states/ok/dhs/ssp/ok_ssp_is_excluded.py b/policyengine_us/variables/gov/states/ok/dhs/ssp/ok_ssp_is_excluded.py new file mode 100644 index 00000000000..3d378ea9de7 --- /dev/null +++ b/policyengine_us/variables/gov/states/ok/dhs/ssp/ok_ssp_is_excluded.py @@ -0,0 +1,17 @@ +from policyengine_us.model_api import * + + +class ok_ssp_is_excluded(Variable): + value_type = bool + entity = Person + label = "Oklahoma SSP exclusion applies" + definition_period = MONTH + reference = "https://www.law.cornell.edu/regulations/oklahoma/OAC-340-15-1-5" + documentation = ( + "Public facility, psychiatric stay over 30 days, prohibited resource " + "transfer, unmet benefit pursuit, or state-paid out-of-home child " + "placement under 340:15-1-5(b). For a spouse who lives away in a " + "facility, also set ssi_lives_in_medical_treatment_facility or " + "is_incarcerated; otherwise the excluded spouse is treated as an " + "ineligible spouse living in the household." + ) diff --git a/policyengine_us/variables/gov/states/ok/dhs/ssp/ok_ssp_own_countable_income.py b/policyengine_us/variables/gov/states/ok/dhs/ssp/ok_ssp_own_countable_income.py new file mode 100644 index 00000000000..75ef3c3852d --- /dev/null +++ b/policyengine_us/variables/gov/states/ok/dhs/ssp/ok_ssp_own_countable_income.py @@ -0,0 +1,14 @@ +from policyengine_us.model_api import * +from policyengine_us.variables.gov.states.ok.dhs.ssp._ok_ssp_income import ok_ssp_income + + +class ok_ssp_own_countable_income(Variable): + value_type = float + entity = Person + label = "Oklahoma SSP own countable income" + definition_period = MONTH + unit = USD + reference = "https://www.oklahoma.gov/ohca/policies-and-rules/xpolicy/medical-assistance-for-adults-and-children-eligibility/eligibility-and-countable-income/countable-income-and-resources/determination-of-countable-income-for-individuals-categorically-.html" + + def formula(person, period, parameters): + return ok_ssp_income(person, period, parameters, combined=False) diff --git a/policyengine_us/variables/gov/states/ok/dhs/ssp/ok_ssp_spouse_child_allocation.py b/policyengine_us/variables/gov/states/ok/dhs/ssp/ok_ssp_spouse_child_allocation.py new file mode 100644 index 00000000000..b274e4ea099 --- /dev/null +++ b/policyengine_us/variables/gov/states/ok/dhs/ssp/ok_ssp_spouse_child_allocation.py @@ -0,0 +1,20 @@ +from policyengine_us.model_api import * + + +class ok_ssp_spouse_child_allocation(Variable): + value_type = float + entity = Person + label = "Oklahoma SSP ineligible spouse allocation for dependent children" + definition_period = MONTH + unit = USD + reference = "https://www.law.cornell.edu/regulations/oklahoma/OAC-340-15-1-5" + documentation = "The total allocation for the family's children who are not aged, blind or disabled, each reduced by that child's own income. Blended families and children in a TANF case are not modeled separately." + + def formula(person, period, parameters): + p = parameters(period).gov.states.ok.dhs.ssp + child = person("is_ssi_ineligible_child", period.this_year) + child_income = max_(person("ssi_earned_income", period), 0) + max_( + person("ssi_unearned_income", period), 0 + ) + allocation = child * max_(p.child_allocation - child_income, 0) + return person.family.sum(allocation) 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 a473c2b438d..d2f9e75c068 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 @@ -22,6 +22,7 @@ def formula(spm_unit, period, parameters): "ky_ssp", # Kentucky benefits "de_ssp", # Delaware benefits "fl_oss", + "ok_ssp", # Oklahoma benefits "ks_sspp", # Kansas benefits "hi_oss", "la_oss", # Louisiana benefits