From a779e1aab183f2e950b005f601b7e3ecbeee57d2 Mon Sep 17 00:00:00 2001 From: Ziming Date: Wed, 7 Oct 2026 16:26:38 -0400 Subject: [PATCH 1/3] Add Nevada optional state supplementation for 2026 --- changelog.d/nv-ssp-2026.added.md | 1 + .../household/household_state_benefits.yaml | 4 + .../ssi/state_supplement/minimum_payment.yaml | 12 + .../states/nv/dwss/oss/payment/couple.yaml | 51 ++ .../nv/dwss/oss/payment/individual.yaml | 48 ++ .../usda/snap/income/sources/unearned.yaml | 1 + policyengine_us/programs.yaml | 14 + .../gov/states/nv/dwss/oss/integration.yaml | 191 +++++ .../gov/states/nv/dwss/oss/nv_oss.yaml | 586 ++++++++++++++ .../dwss/oss/nv_oss_living_arrangement.yaml | 76 ++ .../nv/dwss/oss/nv_oss_payment_standard.yaml | 752 ++++++++++++++++++ .../gov/states/nv/dwss/oss/nv_oss.py | 57 ++ .../states/nv/dwss/oss/nv_oss_care_setting.py | 28 + .../nv/dwss/oss/nv_oss_living_arrangement.py | 53 ++ .../nv/dwss/oss/nv_oss_payment_standard.py | 25 + .../income/spm_unit/spm_unit_benefits.py | 1 + 16 files changed, 1900 insertions(+) create mode 100644 changelog.d/nv-ssp-2026.added.md create mode 100644 policyengine_us/parameters/gov/ssa/ssi/state_supplement/minimum_payment.yaml create mode 100644 policyengine_us/parameters/gov/states/nv/dwss/oss/payment/couple.yaml create mode 100644 policyengine_us/parameters/gov/states/nv/dwss/oss/payment/individual.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/nv/dwss/oss/integration.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/nv/dwss/oss/nv_oss.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/nv/dwss/oss/nv_oss_living_arrangement.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/nv/dwss/oss/nv_oss_payment_standard.yaml create mode 100644 policyengine_us/variables/gov/states/nv/dwss/oss/nv_oss.py create mode 100644 policyengine_us/variables/gov/states/nv/dwss/oss/nv_oss_care_setting.py create mode 100644 policyengine_us/variables/gov/states/nv/dwss/oss/nv_oss_living_arrangement.py create mode 100644 policyengine_us/variables/gov/states/nv/dwss/oss/nv_oss_payment_standard.py diff --git a/changelog.d/nv-ssp-2026.added.md b/changelog.d/nv-ssp-2026.added.md new file mode 100644 index 00000000000..9385408cb7e --- /dev/null +++ b/changelog.d/nv-ssp-2026.added.md @@ -0,0 +1 @@ +Add Nevada Optional State Supplementation with 2026 payment rates, living arrangements, couple and spouse-deeming calculations, and benefit and SNAP income integration. diff --git a/policyengine_us/parameters/gov/household/household_state_benefits.yaml b/policyengine_us/parameters/gov/household/household_state_benefits.yaml index d2cbd6ba2d4..2e517c63143 100644 --- a/policyengine_us/parameters/gov/household/household_state_benefits.yaml +++ b/policyengine_us/parameters/gov/household/household_state_benefits.yaml @@ -60,6 +60,7 @@ values: - ne_aabd - ne_child_care_subsidies # Nevada benefits + - nv_oss - nv_child_care_subsidies # Oklahoma benefits - ok_child_care_subsidies @@ -154,6 +155,7 @@ values: - ne_aabd - ne_child_care_subsidies # Nevada benefits + - nv_oss - nv_child_care_subsidies # Oklahoma benefits - ok_child_care_subsidies @@ -256,6 +258,7 @@ values: - ne_aabd - ne_child_care_subsidies # Nevada benefits + - nv_oss - nv_child_care_subsidies # Oklahoma benefits - ok_child_care_subsidies @@ -359,6 +362,7 @@ values: - ne_aabd - ne_child_care_subsidies # Nevada benefits + - nv_oss - nv_child_care_subsidies # Oklahoma benefits - ok_child_care_subsidies diff --git a/policyengine_us/parameters/gov/ssa/ssi/state_supplement/minimum_payment.yaml b/policyengine_us/parameters/gov/ssa/ssi/state_supplement/minimum_payment.yaml new file mode 100644 index 00000000000..96464c8c040 --- /dev/null +++ b/policyengine_us/parameters/gov/ssa/ssi/state_supplement/minimum_payment.yaml @@ -0,0 +1,12 @@ +description: The Social Security Administration pays at least this monthly amount to each recipient of a positive federally administered optional state supplement. +values: + 2026-01-01: 1 +metadata: + unit: currency-USD + period: month + label: SSI optional state supplement minimum payment + reference: + - title: 20 CFR 416.2020(c) - Minimum federally administered supplementary payment + href: https://www.ssa.gov/OP_Home/cfr20/416/416-2020.htm + - title: POMS SI 02001.005 A.2 and B.2 - Minimum benefit for individuals and members of couples + href: https://secure.ssa.gov/poms.nsf/lnx/0502001005 diff --git a/policyengine_us/parameters/gov/states/nv/dwss/oss/payment/couple.yaml b/policyengine_us/parameters/gov/states/nv/dwss/oss/payment/couple.yaml new file mode 100644 index 00000000000..e5e097731c1 --- /dev/null +++ b/policyengine_us/parameters/gov/states/nv/dwss/oss/payment/couple.yaml @@ -0,0 +1,51 @@ +description: Nevada provides this monthly same-category couple payment before income reductions under the Optional State Supplementation program. +metadata: + propagate_metadata_to_children: true + unit: currency-USD + period: month + label: Nevada OSS couple payment + breakdown: + - nv_oss_living_arrangement + - ssi_category + reference: + - title: POMS SI 01415.058 I.2.b - Nevada payment levels for January 2026 + href: https://secure.ssa.gov/poms.nsf/lnx/0501415058#i + +# Full couple rates for two members of the same category. Averaging the +# applicable rates reproduces the published mixed-category couple totals. +INDEPENDENT_LIVING: + AGED: + 2026-01-01: 74.46 + BLIND: + 2026-01-01: 374.6 + DISABLED: + 2026-01-01: 0 + NONE: + 2026-01-01: 0 +HOUSEHOLD_OF_ANOTHER: + AGED: + 2026-01-01: 49.64 + BLIND: + 2026-01-01: 531.94 + DISABLED: + 2026-01-01: 0 + NONE: + 2026-01-01: 0 +DOMICILIARY_CARE: + AGED: + 2026-01-01: 881 + BLIND: + 2026-01-01: 881 + DISABLED: + 2026-01-01: 0 + NONE: + 2026-01-01: 0 +NONE: + AGED: + 2026-01-01: 0 + BLIND: + 2026-01-01: 0 + DISABLED: + 2026-01-01: 0 + NONE: + 2026-01-01: 0 diff --git a/policyengine_us/parameters/gov/states/nv/dwss/oss/payment/individual.yaml b/policyengine_us/parameters/gov/states/nv/dwss/oss/payment/individual.yaml new file mode 100644 index 00000000000..99e6b45ac17 --- /dev/null +++ b/policyengine_us/parameters/gov/states/nv/dwss/oss/payment/individual.yaml @@ -0,0 +1,48 @@ +description: Nevada provides this monthly individual payment before income reductions under the Optional State Supplementation program. +metadata: + propagate_metadata_to_children: true + unit: currency-USD + period: month + label: Nevada OSS individual payment + breakdown: + - nv_oss_living_arrangement + - ssi_category + reference: + - title: POMS SI 01415.058 I.2.a - Nevada payment levels for January 2026 + href: https://secure.ssa.gov/poms.nsf/lnx/0501415058#i +INDEPENDENT_LIVING: + AGED: + 2026-01-01: 36.4 + BLIND: + 2026-01-01: 109.3 + DISABLED: + 2026-01-01: 0 + NONE: + 2026-01-01: 0 +HOUSEHOLD_OF_ANOTHER: + AGED: + 2026-01-01: 24.27 + BLIND: + 2026-01-01: 213.96 + DISABLED: + 2026-01-01: 0 + NONE: + 2026-01-01: 0 +DOMICILIARY_CARE: + AGED: + 2026-01-01: 391 + BLIND: + 2026-01-01: 391 + DISABLED: + 2026-01-01: 0 + NONE: + 2026-01-01: 0 +NONE: + AGED: + 2026-01-01: 0 + BLIND: + 2026-01-01: 0 + DISABLED: + 2026-01-01: 0 + NONE: + 2026-01-01: 0 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 6f94d3d09b2..33485e773ed 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 + - nv_oss - sc_ssi_state_supplement - tx_ssi_state_supplement - wa_ssp diff --git a/policyengine_us/programs.yaml b/policyengine_us/programs.yaml index f5ffc832e76..6009b53acdc 100644 --- a/policyengine_us/programs.yaml +++ b/policyengine_us/programs.yaml @@ -1037,6 +1037,20 @@ programs: name: New Mexico SSI supplement full_name: New Mexico SSI state supplement variable: nm_ssi_state_supplement + - state: NV + status: partial + name: Nevada OSS + full_name: Nevada Optional State Supplementation + variable: nv_oss + parameter_prefix: gov.states.nv.dwss.oss + verified_years: "2026" + notes: >- + Models optional supplementation for independent living, another + person's household, and state-certified domiciliary care, including + mixed-category couples and spouse deeming. Does not model mandatory + minimum-income protection for recipients converted in December 1973. + Uses the federal SSI eligibility and income framework; historical + rates before 2026 have not been verified. - state: SC status: complete name: South Carolina SSI supplement diff --git a/policyengine_us/tests/policy/baseline/gov/states/nv/dwss/oss/integration.yaml b/policyengine_us/tests/policy/baseline/gov/states/nv/dwss/oss/integration.yaml new file mode 100644 index 00000000000..a86b32b75f9 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/nv/dwss/oss/integration.yaml @@ -0,0 +1,191 @@ +- name: Case 1, aged individual integrates federal SSI and Nevada OSS once. + # POMS I.2.a: $994 + $36.40 = $1,030.40; 7 CFR 273.9(b)(2)(i). + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: NV + age: 65 + snap: + 2026: 0 + output: + is_ssi_eligible: true + ssi_category: AGED + nv_oss_living_arrangement: INDEPENDENT_LIVING + nv_oss_payment_standard: 36.4 + ssi_countable_income: 0 + ssi_amount_if_eligible: 994 + ssi: 994 + nv_oss: 36.4 + household_state_benefits: + 2026: 436.8 + snap_unearned_income: 1_030.4 + spm_unit_benefits: + 2026: 12_364.8 + +- name: Case 2, state-only payment remains after federal SSI is exhausted. + # $1,030 Social Security - $20 exclusion = $1,010 countable income. + # Excess over $994 is $16, so Nevada pays $36.40 - $16 = $20.40. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: NV + age: 65 + social_security_retirement: 12_360 + snap: + 2026: 0 + output: + is_ssi_eligible: true + ssi_category: AGED + nv_oss_living_arrangement: INDEPENDENT_LIVING + nv_oss_payment_standard: 36.4 + ssi_countable_income: 1_010 + ssi_amount_if_eligible: 994 + ssi: 0 + nv_oss: 20.4 + household_state_benefits: + 2026: 244.8 + snap_unearned_income: 1_050.4 + spm_unit_benefits: + 2026: 12_604.8 + +- name: Case 3, mixed aged blind couple shares the joint payment after income reduction. + # $1,700 - $20 = $1,680 countable income; excess over $1,491 is $189. + # $224.53 - $189 = $35.53; each $17.765 rounds up to $17.77. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 65 + social_security_retirement: 20_400 + person2: + age: 40 + is_blind: true + marital_units: + marital_unit: + members: [person1, person2] + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + snap: + 2026: 0 + households: + household: + members: [person1, person2] + state_code: NV + output: + is_ssi_eligible: [true, true] + ssi_category: [AGED, BLIND] + ssi_couple_computation_applies: [true, true] + nv_oss_payment_standard: [112.265, 112.265] + ssi_countable_income: [840, 840] + ssi_amount_if_eligible: [745.5, 745.5] + ssi: [0, 0] + nv_oss: [17.77, 17.77] + household_state_benefits: + 2026: 426.48 + snap_unearned_income: 1_735.54 + spm_unit_benefits: + 2026: 20_826.48 + +- name: Case 4, blind claimant with an ineligible spouse uses the couple deeming standard. + # SI 01320.430 D: spouse's $1,850 - $20 = $1,830 countable. + # $374.60 - ($1,830 - $1,491) = $35.60, below the $109.30 own-income cap. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 40 + is_blind: true + person2: + age: 40 + social_security_retirement: 22_200 + marital_units: + marital_unit: + members: [person1, person2] + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + snap: + 2026: 0 + households: + household: + members: [person1, person2] + state_code: NV + output: + is_ssi_eligible: [true, false] + ssi_category: [BLIND, NONE] + ssi_couple_computation_applies: [false, false] + is_ssi_spousal_deeming_applies: [true, false] + nv_oss_payment_standard: [109.3, 0] + ssi_countable_income: [1_830, 0] + ssi_amount_if_eligible: [1_491, 994] + ssi: [0, 0] + nv_oss: [35.6, 0] + household_state_benefits: + 2026: 427.2 + snap_unearned_income: 1_885.6 + spm_unit_benefits: + 2026: 22_627.2 + +- name: Case 5, blind recipient in another household uses the reduced federal rate. + # POMS I.2.a: federal $662.67 plus Nevada $213.96 = $876.63. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: NV + age: 40 + is_blind: true + ssi_lives_in_another_persons_household: + 2026: true + ssi_receives_shelter_from_others_in_household: + 2026: true + ssi_others_pay_all_meals: + 2026: true + snap: + 2026: 0 + output: + is_ssi_eligible: true + ssi_category: BLIND + ssi_federal_living_arrangement: ANOTHER_PERSONS_HOUSEHOLD + nv_oss_living_arrangement: HOUSEHOLD_OF_ANOTHER + nv_oss_payment_standard: 213.96 + ssi_countable_income: 0 + ssi_amount_if_eligible: 662.67 + ssi: 662.67 + nv_oss: 213.96 + household_state_benefits: + 2026: 2_567.52 + snap_unearned_income: 876.63 + spm_unit_benefits: + 2026: 10_519.52 + +- name: Case 6, July domiciliary care uses monthly benefits and annual income inputs. + # $1,200 monthly Social Security - $20 = $1,180 countable income. + # $391 - ($1,180 - $994) = $205 Nevada OSS; no federal SSI remains. + period: 2026-07 + absolute_error_margin: 0.01 + input: + state_code: + 2026: NV + age: + 2026: 65 + social_security_retirement: + 2026: 14_400 + nv_oss_care_setting: DOMICILIARY_CARE + output: + is_ssi_eligible: true + ssi_category: AGED + nv_oss_living_arrangement: DOMICILIARY_CARE + nv_oss_payment_standard: 391 + ssi_countable_income: 1_180 + ssi_amount_if_eligible: 994 + ssi: 0 + nv_oss: 205 diff --git a/policyengine_us/tests/policy/baseline/gov/states/nv/dwss/oss/nv_oss.yaml b/policyengine_us/tests/policy/baseline/gov/states/nv/dwss/oss/nv_oss.yaml new file mode 100644 index 00000000000..c7e15ef0002 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/nv/dwss/oss/nv_oss.yaml @@ -0,0 +1,586 @@ +# Rates: POMS SI 01415.058 I.2. +# Income phaseout: 20 CFR 416.2025(b). +# Spouse deeming: POMS SI 01320.430 D; minimum payment: SI 02001.005. +# Annual income inputs include the $20 monthly general income exclusion. +# Mixed-category couple payments are divided equally after the joint phaseout. +- name: Case 1, aged individual receives the published independent living supplement. + period: 2026-01 + absolute_error_margin: 0.001 + input: + state_code: NV + age: 65 + output: + nv_oss: 36.4 + +- name: Case 2, person just below the aged threshold receives no supplement. + period: 2026-01 + absolute_error_margin: 0.001 + input: + state_code: NV + age: 64 + output: + nv_oss: 0 + +- name: Case 3, blind aged recipient gets the higher blind category. + period: 2026-01 + absolute_error_margin: 0.001 + input: + state_code: NV + age: 65 + is_blind: true + output: + nv_oss: 109.3 + +- name: Case 4, blind child receives the independent living supplement. + period: 2026-01 + absolute_error_margin: 0.001 + input: + state_code: NV + age: 10 + is_blind: true + output: + nv_oss: 109.3 + +- name: Case 5, countable resources exactly at the individual limit remain eligible. + period: 2026-01 + absolute_error_margin: 0.001 + input: + state_code: NV + age: 65 + ssi_countable_resources: 2_000 + output: + nv_oss: 36.4 + +- name: Case 6, countable resources above the individual limit are ineligible. + period: 2026-01 + absolute_error_margin: 0.001 + input: + state_code: NV + age: 65 + ssi_countable_resources: 2_001 + output: + nv_oss: 0 + +- name: Case 7, person without qualifying immigration status receives no supplement. + period: 2026-01 + absolute_error_margin: 0.001 + input: + state_code: NV + age: 65 + immigration_status: UNDOCUMENTED + output: + nv_oss: 0 + +- name: Case 8, Nevada benefit is zero outside Nevada. + period: 2026-01 + absolute_error_margin: 0.001 + input: + state_code: CA + age: 65 + output: + nv_oss: 0 + +- name: Case 9, Medicaid majority-funded medical facility receives no supplement. + period: 2026-01 + absolute_error_margin: 0.001 + input: + state_code: NV + age: 65 + ssi_lives_in_medical_treatment_facility: true + ssi_medicaid_pays_majority_of_care: true + output: + nv_oss: 0 + +- name: Case 10, certified medical facility without majority Medicaid funding uses independent living. + period: 2026-01 + absolute_error_margin: 0.001 + input: + state_code: NV + age: 65 + ssi_lives_in_medical_treatment_facility: true + ssi_medicaid_pays_majority_of_care: false + output: + nv_oss: 36.4 + +- name: Case 11, uncertified private medical facility receives no supplement. + period: 2026-01 + absolute_error_margin: 0.001 + input: + state_code: NV + age: 65 + nv_oss_care_setting: UNCERTIFIED_MEDICAL_FACILITY + output: + nv_oss: 0 + +- name: Case 12, full month in a public emergency shelter receives no supplement. + period: 2026-01 + absolute_error_margin: 0.001 + input: + state_code: NV + age: 65 + nv_oss_care_setting: PUBLIC_EMERGENCY_SHELTER + output: + nv_oss: 0 + +- name: Case 13, negative earned income cannot increase the maximum supplement. + period: 2026-01 + absolute_error_margin: 0.001 + input: + state_code: NV + age: 65 + self_employment_income: -12_000 + output: + nv_oss: 36.4 + +- name: Case 14, federal SSI absorbs income below the federal limit. + period: 2026-01 + absolute_error_margin: 0.001 + input: + state_code: NV + age: 65 + social_security_retirement: 12_000 + output: + nv_oss: 36.4 + ssi_countable_income: 980 + ssi: 14 + +- name: Case 15, supplement continues after federal SSI is exhausted. + period: 2026-01 + absolute_error_margin: 0.001 + input: + state_code: NV + age: 65 + social_security_retirement: 12_360 + output: + nv_oss: 20.4 + ssi_countable_income: 1_010 + ssi: 0 + +- name: Case 16, positive payment below one dollar is raised to the minimum. + period: 2026-01 + absolute_error_margin: 0.001 + input: + state_code: NV + age: 65 + social_security_retirement: 12_603.6 + output: + nv_oss: 1 + ssi: 0 + +- name: Case 17, income at the combined standard produces zero. + period: 2026-01 + absolute_error_margin: 0.001 + input: + state_code: NV + age: 65 + social_security_retirement: 12_604.8 + output: + nv_oss: 0 + ssi: 0 + +- name: Case 18, income above the combined standard produces zero. + period: 2026-01 + absolute_error_margin: 0.001 + input: + state_code: NV + age: 65 + social_security_retirement: 12_612 + output: + nv_oss: 0 + ssi: 0 + +- name: Case 19, earned income uses the federal general and earned exclusions. + period: 2026-01 + absolute_error_margin: 0.001 + input: + state_code: NV + age: 65 + employment_income: 25_200 + output: + nv_oss: 22.9 + ssi_countable_income: 1_007.5 + ssi: 0 + +- name: Case 20, mixed category couple phases out using combined income. + period: 2026-01 + absolute_error_margin: 0.001 + input: + people: + person1: + age: 65 + social_security_retirement: 20_400 + person2: + age: 40 + is_blind: true + marital_units: + marital_unit: + members: [person1, person2] + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: NV + output: + nv_oss: [17.77, 17.77] + +- name: Case 21, disabled spouse receives half of the aged disabled couple payment. + period: 2026-01 + absolute_error_margin: 0.001 + input: + people: + person1: + age: 65 + social_security_retirement: 18_360 + person2: + age: 40 + meets_ssi_disability_criteria: true + marital_units: + marital_unit: + members: [person1, person2] + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: NV + output: + nv_oss: [9.12, 9.12] + +- name: Case 22, couple gets the one dollar minimum per member. + period: 2026-01 + absolute_error_margin: 0.001 + input: + people: + person1: + age: 65 + social_security_retirement: 19_005.6 + person2: + age: 65 + marital_units: + marital_unit: + members: [person1, person2] + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: NV + output: + nv_oss: [1, 1] + +- name: Case 23, couple at the combined income cutoff gets zero. + period: 2026-01 + absolute_error_margin: 0.001 + input: + people: + person1: + age: 65 + social_security_retirement: 19_025.52 + person2: + age: 65 + marital_units: + marital_unit: + members: [person1, person2] + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: NV + output: + nv_oss: [0, 0] + +- name: Case 24, ineligible spouse without income preserves the individual rate. + period: 2026-01 + absolute_error_margin: 0.001 + input: + people: + person1: + age: 65 + person2: + age: 40 + marital_units: + marital_unit: + members: [person1, person2] + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: NV + output: + nv_oss: [36.4, 0] + +- name: Case 25, spousal deeming uses the blind couple rate before capping at the individual payment. + period: 2026-01 + absolute_error_margin: 0.001 + input: + people: + person1: + age: 40 + is_blind: true + person2: + age: 40 + social_security_retirement: 19_200 + marital_units: + marital_unit: + members: [person1, person2] + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: NV + output: + nv_oss: [109.3, 0] + +- name: Case 26, spousal deeming reduces payment after exceeding the couple standard. + period: 2026-01 + absolute_error_margin: 0.001 + input: + people: + person1: + age: 40 + is_blind: true + person2: + age: 40 + social_security_retirement: 22_200 + marital_units: + marital_unit: + members: [person1, person2] + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: NV + output: + nv_oss: [35.6, 0] + +- name: Case 27, spousal deeming cannot exceed the payment on the claimants own income. + period: 2026-01 + absolute_error_margin: 0.001 + input: + people: + person1: + age: 40 + is_blind: true + social_security_retirement: 12_960 + person2: + age: 40 + social_security_retirement: 7_200 + marital_units: + marital_unit: + members: [person1, person2] + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: NV + output: + nv_oss: [43.3, 0] + +- name: Case 28, spousal deemed income can eliminate the supplement. + period: 2026-01 + absolute_error_margin: 0.001 + input: + people: + person1: + age: 40 + is_blind: true + person2: + age: 40 + social_security_retirement: 22_800 + marital_units: + marital_unit: + members: [person1, person2] + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: NV + output: + nv_oss: [0, 0] + +- name: Case 29, one spouse in a Medicaid facility leaves the other on the individual rate. + period: 2026-01 + absolute_error_margin: 0.001 + input: + people: + person1: + age: 65 + person2: + age: 65 + ssi_lives_in_medical_treatment_facility: true + ssi_medicaid_pays_majority_of_care: true + marital_units: + marital_unit: + members: [person1, person2] + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: NV + output: + nv_oss: [36.4, 0] + +- name: Case 30, couple resources exactly at the limit remain eligible. + period: 2026-01 + absolute_error_margin: 0.001 + input: + people: + person1: + age: 65 + ssi_countable_resources: 1_500 + person2: + age: 65 + ssi_countable_resources: 1_500 + marital_units: + marital_unit: + members: [person1, person2] + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: NV + output: + nv_oss: [37.23, 37.23] + +- name: Case 31, couple resources over the limit eliminate both payments. + period: 2026-01 + absolute_error_margin: 0.001 + input: + people: + person1: + age: 65 + ssi_countable_resources: 1_501 + person2: + age: 65 + ssi_countable_resources: 1_500 + marital_units: + marital_unit: + members: [person1, person2] + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: NV + output: + nv_oss: [0, 0] + +- name: Case 32, annual amount sums twelve monthly payments. + period: 2026 + absolute_error_margin: 0.001 + input: + state_code: NV + age: 65 + output: + nv_oss: 436.8 + household_state_benefits: 436.8 + +- name: Case 33, mixed households preserve couple sharing and Nevada residence filtering. + # Reverse the aged/blind order and place the couple's income on the blind + # member. The published $224.53 rate less $189 excess leaves $17.77 each. + period: 2026-01 + absolute_error_margin: 0.001 + input: + people: + person1: + age: 40 + is_blind: true + person2: + age: 40 + is_blind: true + social_security_retirement: 20_400 + person3: + age: 65 + person4: + age: 65 + marital_units: + marital_unit1: + members: [person1] + marital_unit2: + members: [person2, person3] + marital_unit3: + members: [person4] + tax_units: + tax_unit1: + members: [person1] + tax_unit2: + members: [person2, person3] + tax_unit3: + members: [person4] + spm_units: + spm_unit1: + members: [person1] + spm_unit2: + members: [person2, person3] + spm_unit3: + members: [person4] + households: + household1: + members: [person1] + state_code: NV + household2: + members: [person2, person3] + state_code: NV + household3: + members: [person4] + state_code: CA + output: + nv_oss_payment_standard: [109.3, 112.265, 112.265, 0] + nv_oss: [109.3, 17.77, 17.77, 0] diff --git a/policyengine_us/tests/policy/baseline/gov/states/nv/dwss/oss/nv_oss_living_arrangement.yaml b/policyengine_us/tests/policy/baseline/gov/states/nv/dwss/oss/nv_oss_living_arrangement.yaml new file mode 100644 index 00000000000..221b555d72d --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/nv/dwss/oss/nv_oss_living_arrangement.yaml @@ -0,0 +1,76 @@ +# POMS SI SF01415.300 A-E: Nevada living arrangements and exclusions. +- name: Case 1, ordinary living uses independent living. + period: 2026-01 + input: + state_code: NV + output: + nv_oss_living_arrangement: INDEPENDENT_LIVING + +- name: Case 2, federal parental household uses independent living. + period: 2026-01 + input: + state_code: NV + ssi_federal_living_arrangement: CHILD_IN_PARENTAL_HOUSEHOLD + output: + nv_oss_living_arrangement: INDEPENDENT_LIVING + +- name: Case 3, federal one third reduction identifies another household. + period: 2026-01 + input: + state_code: NV + ssi_lives_in_another_persons_household: true + ssi_receives_shelter_from_others_in_household: true + ssi_others_pay_all_meals: true + output: + nv_oss_living_arrangement: HOUSEHOLD_OF_ANOTHER + +- name: Case 4, state certification identifies domiciliary care. + period: 2026-01 + input: + state_code: NV + nv_oss_care_setting: DOMICILIARY_CARE + output: + nv_oss_living_arrangement: DOMICILIARY_CARE + +- name: Case 5, Medicaid majority funding overrides a conflicting care setting. + period: 2026-01 + input: + state_code: NV + nv_oss_care_setting: DOMICILIARY_CARE + ssi_lives_in_medical_treatment_facility: true + ssi_medicaid_pays_majority_of_care: true + output: + nv_oss_living_arrangement: NONE + +- name: Case 6, uncertified medical facility is excluded. + period: 2026-01 + input: + state_code: NV + nv_oss_care_setting: UNCERTIFIED_MEDICAL_FACILITY + output: + nv_oss_living_arrangement: NONE + +- name: Case 7, public emergency shelter is excluded. + period: 2026-01 + input: + state_code: NV + nv_oss_care_setting: PUBLIC_EMERGENCY_SHELTER + output: + nv_oss_living_arrangement: NONE + +- name: Case 8, outside Nevada defaults to no supplementation. + period: 2026-01 + input: + state_code: CA + output: + nv_oss_living_arrangement: NONE + +- name: Case 9, a child does not qualify for adult domiciliary care. + period: 2026-01 + input: + state_code: NV + age: 17 + is_blind: true + nv_oss_care_setting: DOMICILIARY_CARE + output: + nv_oss_living_arrangement: NONE diff --git a/policyengine_us/tests/policy/baseline/gov/states/nv/dwss/oss/nv_oss_payment_standard.yaml b/policyengine_us/tests/policy/baseline/gov/states/nv/dwss/oss/nv_oss_payment_standard.yaml new file mode 100644 index 00000000000..096aad3042a --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/nv/dwss/oss/nv_oss_payment_standard.yaml @@ -0,0 +1,752 @@ +# POMS SI 01415.058 I.2.a-b: January 2026 state-only payment levels. +# Couple amounts are divided equally per POMS SI 02005.030 G.1. +- name: Case 1, aged and aged couple in independent matches the published total of 74.46. + period: 2026-01 + absolute_error_margin: 0.001 + input: + people: + person1: + age: 65 + person2: + age: 65 + marital_units: + marital_unit: + members: [person1, person2] + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: NV + output: + nv_oss_payment_standard: [37.23, 37.23] + nv_oss: [37.23, 37.23] + +- name: Case 2, blind and blind couple in independent matches the published total of 374.6. + period: 2026-01 + absolute_error_margin: 0.001 + input: + people: + person1: + age: 40 + is_blind: true + person2: + age: 40 + is_blind: true + marital_units: + marital_unit: + members: [person1, person2] + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: NV + output: + nv_oss_payment_standard: [187.3, 187.3] + nv_oss: [187.3, 187.3] + +- name: Case 3, aged and blind couple in independent matches the published total of 224.53. + period: 2026-01 + absolute_error_margin: 0.001 + input: + people: + person1: + age: 65 + person2: + age: 40 + is_blind: true + marital_units: + marital_unit: + members: [person1, person2] + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: NV + output: + nv_oss_payment_standard: [112.265, 112.265] + nv_oss: [112.27, 112.27] + +- name: Case 4, aged and disabled couple in independent matches the published total of 37.23. + period: 2026-01 + absolute_error_margin: 0.001 + input: + people: + person1: + age: 65 + person2: + age: 40 + meets_ssi_disability_criteria: true + marital_units: + marital_unit: + members: [person1, person2] + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: NV + output: + nv_oss_payment_standard: [18.615, 18.615] + nv_oss: [18.62, 18.62] + +- name: Case 5, blind and disabled couple in independent matches the published total of 187.3. + period: 2026-01 + absolute_error_margin: 0.001 + input: + people: + person1: + age: 40 + is_blind: true + person2: + age: 40 + meets_ssi_disability_criteria: true + marital_units: + marital_unit: + members: [person1, person2] + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: NV + output: + nv_oss_payment_standard: [93.65, 93.65] + nv_oss: [93.65, 93.65] + +- name: Case 6, disabled and disabled couple in independent matches the published total of 0. + period: 2026-01 + absolute_error_margin: 0.001 + input: + people: + person1: + age: 40 + meets_ssi_disability_criteria: true + person2: + age: 40 + meets_ssi_disability_criteria: true + marital_units: + marital_unit: + members: [person1, person2] + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: NV + output: + nv_oss_payment_standard: [0, 0] + nv_oss: [0, 0] + +- name: Case 7, aged and aged couple in another household matches the published total of 49.64. + period: 2026-01 + absolute_error_margin: 0.001 + input: + people: + person1: + age: 65 + ssi_lives_in_another_persons_household: true + ssi_receives_shelter_from_others_in_household: true + ssi_others_pay_all_meals: true + person2: + age: 65 + ssi_lives_in_another_persons_household: true + ssi_receives_shelter_from_others_in_household: true + ssi_others_pay_all_meals: true + marital_units: + marital_unit: + members: [person1, person2] + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: NV + output: + nv_oss_payment_standard: [24.82, 24.82] + nv_oss: [24.82, 24.82] + +- name: Case 8, blind and blind couple in another household matches the published total of 531.94. + period: 2026-01 + absolute_error_margin: 0.001 + input: + people: + person1: + age: 40 + is_blind: true + ssi_lives_in_another_persons_household: true + ssi_receives_shelter_from_others_in_household: true + ssi_others_pay_all_meals: true + person2: + age: 40 + is_blind: true + ssi_lives_in_another_persons_household: true + ssi_receives_shelter_from_others_in_household: true + ssi_others_pay_all_meals: true + marital_units: + marital_unit: + members: [person1, person2] + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: NV + output: + nv_oss_payment_standard: [265.97, 265.97] + nv_oss: [265.97, 265.97] + +- name: Case 9, aged and blind couple in another household matches the published total of 290.79. + period: 2026-01 + absolute_error_margin: 0.001 + input: + people: + person1: + age: 65 + ssi_lives_in_another_persons_household: true + ssi_receives_shelter_from_others_in_household: true + ssi_others_pay_all_meals: true + person2: + age: 40 + is_blind: true + ssi_lives_in_another_persons_household: true + ssi_receives_shelter_from_others_in_household: true + ssi_others_pay_all_meals: true + marital_units: + marital_unit: + members: [person1, person2] + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: NV + output: + nv_oss_payment_standard: [145.395, 145.395] + nv_oss: [145.4, 145.4] + +- name: Case 10, aged and disabled couple in another household matches the published total of 24.82. + period: 2026-01 + absolute_error_margin: 0.001 + input: + people: + person1: + age: 65 + ssi_lives_in_another_persons_household: true + ssi_receives_shelter_from_others_in_household: true + ssi_others_pay_all_meals: true + person2: + age: 40 + meets_ssi_disability_criteria: true + ssi_lives_in_another_persons_household: true + ssi_receives_shelter_from_others_in_household: true + ssi_others_pay_all_meals: true + marital_units: + marital_unit: + members: [person1, person2] + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: NV + output: + nv_oss_payment_standard: [12.41, 12.41] + nv_oss: [12.41, 12.41] + +- name: Case 11, blind and disabled couple in another household matches the published total of 265.97. + period: 2026-01 + absolute_error_margin: 0.001 + input: + people: + person1: + age: 40 + is_blind: true + ssi_lives_in_another_persons_household: true + ssi_receives_shelter_from_others_in_household: true + ssi_others_pay_all_meals: true + person2: + age: 40 + meets_ssi_disability_criteria: true + ssi_lives_in_another_persons_household: true + ssi_receives_shelter_from_others_in_household: true + ssi_others_pay_all_meals: true + marital_units: + marital_unit: + members: [person1, person2] + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: NV + output: + nv_oss_payment_standard: [132.985, 132.985] + nv_oss: [132.99, 132.99] + +- name: Case 12, disabled and disabled couple in another household matches the published total of 0. + period: 2026-01 + absolute_error_margin: 0.001 + input: + people: + person1: + age: 40 + meets_ssi_disability_criteria: true + ssi_lives_in_another_persons_household: true + ssi_receives_shelter_from_others_in_household: true + ssi_others_pay_all_meals: true + person2: + age: 40 + meets_ssi_disability_criteria: true + ssi_lives_in_another_persons_household: true + ssi_receives_shelter_from_others_in_household: true + ssi_others_pay_all_meals: true + marital_units: + marital_unit: + members: [person1, person2] + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: NV + output: + nv_oss_payment_standard: [0, 0] + nv_oss: [0, 0] + +- name: Case 13, aged and aged couple in domiciliary care matches the published total of 881. + period: 2026-01 + absolute_error_margin: 0.001 + input: + people: + person1: + age: 65 + nv_oss_care_setting: DOMICILIARY_CARE + person2: + age: 65 + nv_oss_care_setting: DOMICILIARY_CARE + marital_units: + marital_unit: + members: [person1, person2] + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: NV + output: + nv_oss_payment_standard: [440.5, 440.5] + nv_oss: [440.5, 440.5] + +- name: Case 14, blind and blind couple in domiciliary care matches the published total of 881. + period: 2026-01 + absolute_error_margin: 0.001 + input: + people: + person1: + age: 40 + is_blind: true + nv_oss_care_setting: DOMICILIARY_CARE + person2: + age: 40 + is_blind: true + nv_oss_care_setting: DOMICILIARY_CARE + marital_units: + marital_unit: + members: [person1, person2] + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: NV + output: + nv_oss_payment_standard: [440.5, 440.5] + nv_oss: [440.5, 440.5] + +- name: Case 15, aged and blind couple in domiciliary care matches the published total of 881. + period: 2026-01 + absolute_error_margin: 0.001 + input: + people: + person1: + age: 65 + nv_oss_care_setting: DOMICILIARY_CARE + person2: + age: 40 + is_blind: true + nv_oss_care_setting: DOMICILIARY_CARE + marital_units: + marital_unit: + members: [person1, person2] + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: NV + output: + nv_oss_payment_standard: [440.5, 440.5] + nv_oss: [440.5, 440.5] + +- name: Case 16, aged and disabled couple in domiciliary care matches the published total of 440.5. + period: 2026-01 + absolute_error_margin: 0.001 + input: + people: + person1: + age: 65 + nv_oss_care_setting: DOMICILIARY_CARE + person2: + age: 40 + meets_ssi_disability_criteria: true + nv_oss_care_setting: DOMICILIARY_CARE + marital_units: + marital_unit: + members: [person1, person2] + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: NV + output: + nv_oss_payment_standard: [220.25, 220.25] + nv_oss: [220.25, 220.25] + +- name: Case 17, blind and disabled couple in domiciliary care matches the published total of 440.5. + period: 2026-01 + absolute_error_margin: 0.001 + input: + people: + person1: + age: 40 + is_blind: true + nv_oss_care_setting: DOMICILIARY_CARE + person2: + age: 40 + meets_ssi_disability_criteria: true + nv_oss_care_setting: DOMICILIARY_CARE + marital_units: + marital_unit: + members: [person1, person2] + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: NV + output: + nv_oss_payment_standard: [220.25, 220.25] + nv_oss: [220.25, 220.25] + +- name: Case 18, disabled and disabled couple in domiciliary care matches the published total of 0. + period: 2026-01 + absolute_error_margin: 0.001 + input: + people: + person1: + age: 40 + meets_ssi_disability_criteria: true + nv_oss_care_setting: DOMICILIARY_CARE + person2: + age: 40 + meets_ssi_disability_criteria: true + nv_oss_care_setting: DOMICILIARY_CARE + marital_units: + marital_unit: + members: [person1, person2] + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: NV + output: + nv_oss_payment_standard: [0, 0] + nv_oss: [0, 0] + +- name: Case 19, all individual categories in independent match the published rates. + period: 2026-01 + absolute_error_margin: 0.001 + input: + people: + person1: + age: 65 + is_blind: false + meets_ssi_disability_criteria: false + person2: + age: 40 + is_blind: true + meets_ssi_disability_criteria: false + person3: + age: 40 + is_blind: false + meets_ssi_disability_criteria: true + person4: + age: 40 + is_blind: false + meets_ssi_disability_criteria: false + marital_units: + marital_units1: + members: [person1] + marital_units2: + members: [person2] + marital_units3: + members: [person3] + marital_units4: + members: [person4] + tax_units: + tax_units1: + members: [person1] + tax_units2: + members: [person2] + tax_units3: + members: [person3] + tax_units4: + members: [person4] + spm_units: + spm_units1: + members: [person1] + spm_units2: + members: [person2] + spm_units3: + members: [person3] + spm_units4: + members: [person4] + households: + households1: + members: [person1] + state_code: NV + households2: + members: [person2] + state_code: NV + households3: + members: [person3] + state_code: NV + households4: + members: [person4] + state_code: NV + output: + nv_oss_payment_standard: [36.4, 109.3, 0, 0] + nv_oss: [36.4, 109.3, 0, 0] + +- name: Case 20, all individual categories in another household match the published rates. + period: 2026-01 + absolute_error_margin: 0.001 + input: + people: + person1: + age: 65 + is_blind: false + meets_ssi_disability_criteria: false + ssi_lives_in_another_persons_household: true + ssi_receives_shelter_from_others_in_household: true + ssi_others_pay_all_meals: true + person2: + age: 40 + is_blind: true + meets_ssi_disability_criteria: false + ssi_lives_in_another_persons_household: true + ssi_receives_shelter_from_others_in_household: true + ssi_others_pay_all_meals: true + person3: + age: 40 + is_blind: false + meets_ssi_disability_criteria: true + ssi_lives_in_another_persons_household: true + ssi_receives_shelter_from_others_in_household: true + ssi_others_pay_all_meals: true + person4: + age: 40 + is_blind: false + meets_ssi_disability_criteria: false + ssi_lives_in_another_persons_household: true + ssi_receives_shelter_from_others_in_household: true + ssi_others_pay_all_meals: true + marital_units: + marital_units1: + members: [person1] + marital_units2: + members: [person2] + marital_units3: + members: [person3] + marital_units4: + members: [person4] + tax_units: + tax_units1: + members: [person1] + tax_units2: + members: [person2] + tax_units3: + members: [person3] + tax_units4: + members: [person4] + spm_units: + spm_units1: + members: [person1] + spm_units2: + members: [person2] + spm_units3: + members: [person3] + spm_units4: + members: [person4] + households: + households1: + members: [person1] + state_code: NV + households2: + members: [person2] + state_code: NV + households3: + members: [person3] + state_code: NV + households4: + members: [person4] + state_code: NV + output: + nv_oss_payment_standard: [24.27, 213.96, 0, 0] + nv_oss: [24.27, 213.96, 0, 0] + +- name: Case 21, all individual categories in domiciliary care match the published rates. + period: 2026-01 + absolute_error_margin: 0.001 + input: + people: + person1: + age: 65 + is_blind: false + meets_ssi_disability_criteria: false + nv_oss_care_setting: DOMICILIARY_CARE + person2: + age: 40 + is_blind: true + meets_ssi_disability_criteria: false + nv_oss_care_setting: DOMICILIARY_CARE + person3: + age: 40 + is_blind: false + meets_ssi_disability_criteria: true + nv_oss_care_setting: DOMICILIARY_CARE + person4: + age: 40 + is_blind: false + meets_ssi_disability_criteria: false + nv_oss_care_setting: DOMICILIARY_CARE + marital_units: + marital_units1: + members: [person1] + marital_units2: + members: [person2] + marital_units3: + members: [person3] + marital_units4: + members: [person4] + tax_units: + tax_units1: + members: [person1] + tax_units2: + members: [person2] + tax_units3: + members: [person3] + tax_units4: + members: [person4] + spm_units: + spm_units1: + members: [person1] + spm_units2: + members: [person2] + spm_units3: + members: [person3] + spm_units4: + members: [person4] + households: + households1: + members: [person1] + state_code: NV + households2: + members: [person2] + state_code: NV + households3: + members: [person3] + state_code: NV + households4: + members: [person4] + state_code: NV + output: + nv_oss_payment_standard: [391, 391, 0, 0] + nv_oss: [391, 391, 0, 0] diff --git a/policyengine_us/variables/gov/states/nv/dwss/oss/nv_oss.py b/policyengine_us/variables/gov/states/nv/dwss/oss/nv_oss.py new file mode 100644 index 00000000000..60616ae6b09 --- /dev/null +++ b/policyengine_us/variables/gov/states/nv/dwss/oss/nv_oss.py @@ -0,0 +1,57 @@ +from policyengine_us.model_api import * + + +class nv_oss(Variable): + value_type = float + entity = Person + definition_period = MONTH + unit = USD + label = "Nevada Optional State Supplementation" + defined_for = StateCode.NV + reference = ( + "https://secure.ssa.gov/poms.nsf/lnx/0501415058#i", + "https://www.ssa.gov/OP_Home/cfr20/416/416-2025.htm", + "https://secure.ssa.gov/poms.nsf/lnx/0501320430#D", + "https://secure.ssa.gov/poms.nsf/lnx/0502001005", + "https://secure.ssa.gov/poms.nsf/lnx/0502001010", + ) + + def formula(person, period, parameters): + eligible = person("is_ssi_eligible", period) + standard = person("nv_oss_payment_standard", period) + countable_income = person("ssi_countable_income", period) + federal_amount = person("ssi_amount_if_eligible", period) + excess_income = max_(countable_income - federal_amount, 0) + payment = max_(standard - excess_income, 0) + + # A spouse's deemed income uses the couple supplement, capped at + # the payment due using the claimant's own income and individual rate. + deeming = person("is_ssi_spousal_deeming_applies", period.this_year) + p = parameters(period).gov.states.nv.dwss.oss.payment + arrangement = person("nv_oss_living_arrangement", period) + category = person("ssi_category", period.this_year) + couple_payment = max_(p.couple[arrangement][category] - excess_income, 0) + own_income = max_( + countable_income + - person("ssi_income_deemed_from_ineligible_spouse", period), + 0, + ) + ssi = parameters(period).gov.ssa.ssi + arrangements = arrangement.possible_values + own_federal_amount = ssi.amount.individual * where( + arrangement == arrangements.HOUSEHOLD_OF_ANOTHER, + 1 - ssi.amount.one_third_reduction_rate, + 1, + ) + own_payment = max_( + p.individual[arrangement][category] + - max_(own_income - own_federal_amount, 0), + 0, + ) + payment = where(deeming, min_(own_payment, couple_payment), payment) + # SI 02001.010: ignore digits after the third decimal place, then + # round each member's state payment up to cents. Truncation also + # prevents floating-point residue at the income cutoff paying $1. + payment = np.ceil(np.floor(payment * 1_000) / 10) / 100 + minimum = ssi.state_supplement.minimum_payment + return where(eligible & (payment > 0), max_(payment, minimum), 0) diff --git a/policyengine_us/variables/gov/states/nv/dwss/oss/nv_oss_care_setting.py b/policyengine_us/variables/gov/states/nv/dwss/oss/nv_oss_care_setting.py new file mode 100644 index 00000000000..8d9bac7dee5 --- /dev/null +++ b/policyengine_us/variables/gov/states/nv/dwss/oss/nv_oss_care_setting.py @@ -0,0 +1,28 @@ +from policyengine_us.model_api import * + + +class NVOssCareSetting(Enum): + DOMICILIARY_CARE = "State-certified domiciliary care" + UNCERTIFIED_MEDICAL_FACILITY = ( + "Private medical facility not certified under Medicaid" + ) + PUBLIC_EMERGENCY_SHELTER = "Public emergency shelter for the full month" + NONE = "No special Nevada supplementation care setting" + + +class nv_oss_care_setting(Variable): + value_type = Enum + entity = Person + definition_period = MONTH + label = "Nevada OSS care setting" + possible_values = NVOssCareSetting + default_value = NVOssCareSetting.NONE + reference = "https://secure.ssa.gov/poms.nsf/lnx/0501415300SF" + documentation = """ + Domiciliary care means a private nonmedical facility, or a public + nonmedical institution serving at most 16 people, licensed or authorized + by Nevada to provide personal care to unrelated adults. The uncertified + medical setting means a private facility not certified under Medicaid. + The public emergency shelter setting applies to residence throughout + the month. Other SSI medical-facility inputs continue to apply. + """ diff --git a/policyengine_us/variables/gov/states/nv/dwss/oss/nv_oss_living_arrangement.py b/policyengine_us/variables/gov/states/nv/dwss/oss/nv_oss_living_arrangement.py new file mode 100644 index 00000000000..6747872acbe --- /dev/null +++ b/policyengine_us/variables/gov/states/nv/dwss/oss/nv_oss_living_arrangement.py @@ -0,0 +1,53 @@ +from policyengine_us.model_api import * + + +class NVOssLivingArrangement(Enum): + INDEPENDENT_LIVING = "Independent living or living in a parental household" + HOUSEHOLD_OF_ANOTHER = "Living in the household of another" + DOMICILIARY_CARE = "State-certified domiciliary care" + NONE = "No Nevada optional supplement" + + +class nv_oss_living_arrangement(Variable): + value_type = Enum + entity = Person + definition_period = MONTH + label = "Nevada OSS living arrangement" + possible_values = NVOssLivingArrangement + default_value = NVOssLivingArrangement.NONE + defined_for = StateCode.NV + reference = ( + "https://secure.ssa.gov/poms.nsf/lnx/0501415300SF", + "https://secure.ssa.gov/poms.nsf/lnx/0501415058#i", + ) + + def formula(person, period, parameters): + care = person("nv_oss_care_setting", period) + settings = care.possible_values + federal = person("ssi_federal_living_arrangement", period) + arrangements = federal.possible_values + excluded = ( + (federal == arrangements.MEDICAL_TREATMENT_FACILITY) + | (care == settings.UNCERTIFIED_MEDICAL_FACILITY) + | (care == settings.PUBLIC_EMERGENCY_SHELTER) + | ( + (care == settings.DOMICILIARY_CARE) + & person("is_child", period.this_year) + ) + ) + return select( + [ + excluded, + care == settings.DOMICILIARY_CARE, + federal == arrangements.ANOTHER_PERSONS_HOUSEHOLD, + (federal == arrangements.OWN_HOUSEHOLD) + | (federal == arrangements.CHILD_IN_PARENTAL_HOUSEHOLD), + ], + [ + NVOssLivingArrangement.NONE, + NVOssLivingArrangement.DOMICILIARY_CARE, + NVOssLivingArrangement.HOUSEHOLD_OF_ANOTHER, + NVOssLivingArrangement.INDEPENDENT_LIVING, + ], + default=NVOssLivingArrangement.NONE, + ) diff --git a/policyengine_us/variables/gov/states/nv/dwss/oss/nv_oss_payment_standard.py b/policyengine_us/variables/gov/states/nv/dwss/oss/nv_oss_payment_standard.py new file mode 100644 index 00000000000..520dc568825 --- /dev/null +++ b/policyengine_us/variables/gov/states/nv/dwss/oss/nv_oss_payment_standard.py @@ -0,0 +1,25 @@ +from policyengine_us.model_api import * + + +class nv_oss_payment_standard(Variable): + value_type = float + entity = Person + definition_period = MONTH + unit = USD + label = "Nevada OSS maximum monthly payment per person" + defined_for = StateCode.NV + reference = ( + "https://secure.ssa.gov/poms.nsf/lnx/0501415058#i", + "https://secure.ssa.gov/poms.nsf/lnx/0502005030#G", + ) + + def formula(person, period, parameters): + p = parameters(period).gov.states.nv.dwss.oss.payment + arrangement = person("nv_oss_living_arrangement", period) + category = person("ssi_category", period.this_year) + couple = person("ssi_couple_computation_applies", period) + # Half of each member's same-category couple rate reproduces all + # mixed-category totals in SI 01415.058 I.2.b. SI 02005.030 G.1 + # divides the joint payment equally, including aged/disabled couples. + couple_total = person.marital_unit.sum(p.couple[arrangement][category] / 2) + return where(couple, couple_total / 2, p.individual[arrangement][category]) 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 41ead044f46..0f5acc7bece 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 @@ -33,6 +33,7 @@ def formula(spm_unit, period, parameters): "mo_ssp", # Missouri benefits "mn_msa", # Minnesota benefits "ne_aabd", # Nebraska benefits + "nv_oss", # Nevada benefits # California programs. "ca_cvrp", # California Clean Vehicle Rebate Project. # California SSI state supplement (SSP). The formula nets federal From cc8928bc0773ee4ab96d889955a91ddbadbf9a37 Mon Sep 17 00:00:00 2001 From: Ziming Date: Tue, 13 Oct 2026 02:21:56 -0400 Subject: [PATCH 2/3] Fix issues from review: Nevada OSS take-up gate, registries and tests - Gate the supplement on SSI take-up, as every other batch supplement does - Key the one-third reduction on the federal living arrangement - Add nv_oss to HUD income; shorten the programs.yaml note - Make minimum_payment.yaml identical to the other batch PRs; normalize payment YAML - Lowercase POMS anchors; document the couple-split limitation - Add take-up and household-of-another deeming cases Co-Authored-By: Claude Opus 5.5 --- .../hud/annual_income/sources/unearned.yaml | 1 + .../ssi/state_supplement/minimum_payment.yaml | 1 + .../states/nv/dwss/oss/payment/couple.yaml | 4 + .../nv/dwss/oss/payment/individual.yaml | 5 ++ policyengine_us/programs.yaml | 10 +-- .../gov/states/nv/dwss/oss/nv_oss.yaml | 74 ++++++++++++++++++- .../gov/states/nv/dwss/oss/nv_oss.py | 21 +++--- .../nv/dwss/oss/nv_oss_payment_standard.py | 4 +- 8 files changed, 103 insertions(+), 17 deletions(-) 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 d2b2bbd8675..6c6c3f9f0bb 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 + - nv_oss - general_assistance - unemployment_compensation - child_support_received diff --git a/policyengine_us/parameters/gov/ssa/ssi/state_supplement/minimum_payment.yaml b/policyengine_us/parameters/gov/ssa/ssi/state_supplement/minimum_payment.yaml index 96464c8c040..1d3e6e2e6b6 100644 --- a/policyengine_us/parameters/gov/ssa/ssi/state_supplement/minimum_payment.yaml +++ b/policyengine_us/parameters/gov/ssa/ssi/state_supplement/minimum_payment.yaml @@ -1,6 +1,7 @@ description: The Social Security Administration pays at least this monthly amount to each recipient of a positive federally administered optional state supplement. values: 2026-01-01: 1 + metadata: unit: currency-USD period: month diff --git a/policyengine_us/parameters/gov/states/nv/dwss/oss/payment/couple.yaml b/policyengine_us/parameters/gov/states/nv/dwss/oss/payment/couple.yaml index e5e097731c1..bac66729b11 100644 --- a/policyengine_us/parameters/gov/states/nv/dwss/oss/payment/couple.yaml +++ b/policyengine_us/parameters/gov/states/nv/dwss/oss/payment/couple.yaml @@ -1,4 +1,5 @@ description: Nevada provides this monthly same-category couple payment before income reductions under the Optional State Supplementation program. + metadata: propagate_metadata_to_children: true unit: currency-USD @@ -22,6 +23,7 @@ INDEPENDENT_LIVING: 2026-01-01: 0 NONE: 2026-01-01: 0 + HOUSEHOLD_OF_ANOTHER: AGED: 2026-01-01: 49.64 @@ -31,6 +33,7 @@ HOUSEHOLD_OF_ANOTHER: 2026-01-01: 0 NONE: 2026-01-01: 0 + DOMICILIARY_CARE: AGED: 2026-01-01: 881 @@ -40,6 +43,7 @@ DOMICILIARY_CARE: 2026-01-01: 0 NONE: 2026-01-01: 0 + NONE: AGED: 2026-01-01: 0 diff --git a/policyengine_us/parameters/gov/states/nv/dwss/oss/payment/individual.yaml b/policyengine_us/parameters/gov/states/nv/dwss/oss/payment/individual.yaml index 99e6b45ac17..03b2eb71f2a 100644 --- a/policyengine_us/parameters/gov/states/nv/dwss/oss/payment/individual.yaml +++ b/policyengine_us/parameters/gov/states/nv/dwss/oss/payment/individual.yaml @@ -1,4 +1,5 @@ description: Nevada provides this monthly individual payment before income reductions under the Optional State Supplementation program. + metadata: propagate_metadata_to_children: true unit: currency-USD @@ -10,6 +11,7 @@ metadata: reference: - title: POMS SI 01415.058 I.2.a - Nevada payment levels for January 2026 href: https://secure.ssa.gov/poms.nsf/lnx/0501415058#i + INDEPENDENT_LIVING: AGED: 2026-01-01: 36.4 @@ -19,6 +21,7 @@ INDEPENDENT_LIVING: 2026-01-01: 0 NONE: 2026-01-01: 0 + HOUSEHOLD_OF_ANOTHER: AGED: 2026-01-01: 24.27 @@ -28,6 +31,7 @@ HOUSEHOLD_OF_ANOTHER: 2026-01-01: 0 NONE: 2026-01-01: 0 + DOMICILIARY_CARE: AGED: 2026-01-01: 391 @@ -37,6 +41,7 @@ DOMICILIARY_CARE: 2026-01-01: 0 NONE: 2026-01-01: 0 + NONE: AGED: 2026-01-01: 0 diff --git a/policyengine_us/programs.yaml b/policyengine_us/programs.yaml index 00bb3a06309..d0ef07b0781 100644 --- a/policyengine_us/programs.yaml +++ b/policyengine_us/programs.yaml @@ -1053,12 +1053,10 @@ programs: parameter_prefix: gov.states.nv.dwss.oss verified_years: "2026" notes: >- - Models optional supplementation for independent living, another - person's household, and state-certified domiciliary care, including - mixed-category couples and spouse deeming. Does not model mandatory - minimum-income protection for recipients converted in December 1973. - Uses the federal SSI eligibility and income framework; historical - rates before 2026 have not been verified. + Models 2026 optional supplementation for independent living, another + person's household and state-certified domiciliary care, including + couples and spouse deeming. Mandatory minimum-income protection for + December 1973 conversions is not modeled. - state: SC status: complete name: South Carolina SSI supplement diff --git a/policyengine_us/tests/policy/baseline/gov/states/nv/dwss/oss/nv_oss.yaml b/policyengine_us/tests/policy/baseline/gov/states/nv/dwss/oss/nv_oss.yaml index c7e15ef0002..b71cce7b1e7 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/nv/dwss/oss/nv_oss.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/nv/dwss/oss/nv_oss.yaml @@ -386,7 +386,7 @@ output: nv_oss: [35.6, 0] -- name: Case 27, spousal deeming cannot exceed the payment on the claimants own income. +- name: Case 27, spousal deeming cannot exceed the payment on the claimant's own income. period: 2026-01 absolute_error_margin: 0.001 input: @@ -584,3 +584,75 @@ output: nv_oss_payment_standard: [109.3, 112.265, 112.265, 0] nv_oss: [109.3, 17.77, 17.77, 0] + +- name: Case 34, an eligible person who does not take up SSI receives no supplement. + period: 2026-01 + absolute_error_margin: 0.001 + input: + state_code: NV + age: 65 + takes_up_ssi_if_eligible: false + output: + # Aged citizen with no resources meets the categorical and resource tests. + is_ssi_eligible: true + # $994 federal benefit rate - $0 countable income = $994 if taken up. + ssi_if_takes_up: 994 + # SI 01415.058 I.2.a aged independent living rate. + nv_oss_payment_standard: 36.4 + # SSI is defined only for people who take it up. + ssi: 0 + # SSA pays the supplement through the SSI claim, so no take-up means $0. + nv_oss: 0 + +- name: Case 35, spousal deeming in another person's household caps the payment with the reduced federal rate. + period: 2026-01 + absolute_error_margin: 0.001 + input: + people: + person1: + age: 40 + is_blind: true + # $750 monthly Social Security disability benefit. + social_security_disability: 9_000 + ssi_lives_in_another_persons_household: true + ssi_receives_shelter_from_others_in_household: true + ssi_others_pay_all_meals: true + person2: + age: 40 + # 20 hours a week at the $12.00 Nevada minimum wage (NRS 608.250): + # $12 * 20 * 52 = $12,480 a year, $1,040 a month. + employment_income: 12_480 + ssi_lives_in_another_persons_household: true + ssi_receives_shelter_from_others_in_household: true + ssi_others_pay_all_meals: true + marital_units: + marital_unit: + members: [person1, person2] + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: NV + output: + # Shelter from others and all meals paid by others: one-third reduction. + ssi_federal_living_arrangement: [ANOTHER_PERSONS_HOUSEHOLD, ANOTHER_PERSONS_HOUSEHOLD] + nv_oss_living_arrangement: [HOUSEHOLD_OF_ANOTHER, HOUSEHOLD_OF_ANOTHER] + # Not a joint claim: person1 gets the blind household-of-another + # individual rate; person2 has no SSI category. + nv_oss_payment_standard: [213.96, 0] + # Spouse earnings $1,040 > $1,491 - $994 = $497, so deeming applies. + # Deemed: ($1,040 - $65) / 2 = $487.50. + ssi_income_deemed_from_ineligible_spouse: [487.5, 0] + # Own $750 - $20 = $730; $730 + $487.50 = $1,217.50. + ssi_countable_income: [1_217.5, 0] + # $1,491 couple rate * 2/3 = $994 - $1,217.50 < 0. + ssi: [0, 0] + # Couple path: $531.94 - ($1,217.50 - $994) = $308.44. + # Own-income cap: $213.96 - ($730 - $994 * 2/3 = $662.67) = $146.63 + # after rounding up to cents. min($146.63, $308.44) = $146.63. + nv_oss: [146.63, 0] diff --git a/policyengine_us/variables/gov/states/nv/dwss/oss/nv_oss.py b/policyengine_us/variables/gov/states/nv/dwss/oss/nv_oss.py index 60616ae6b09..f2baa2600c4 100644 --- a/policyengine_us/variables/gov/states/nv/dwss/oss/nv_oss.py +++ b/policyengine_us/variables/gov/states/nv/dwss/oss/nv_oss.py @@ -1,4 +1,7 @@ from policyengine_us.model_api import * +from policyengine_us.variables.gov.ssa.ssi.eligibility.status.ssi_federal_living_arrangement import ( + SSIFederalLivingArrangement, +) class nv_oss(Variable): @@ -11,13 +14,15 @@ class nv_oss(Variable): reference = ( "https://secure.ssa.gov/poms.nsf/lnx/0501415058#i", "https://www.ssa.gov/OP_Home/cfr20/416/416-2025.htm", - "https://secure.ssa.gov/poms.nsf/lnx/0501320430#D", + "https://secure.ssa.gov/poms.nsf/lnx/0501320430#d", "https://secure.ssa.gov/poms.nsf/lnx/0502001005", "https://secure.ssa.gov/poms.nsf/lnx/0502001010", ) def formula(person, period, parameters): - eligible = person("is_ssi_eligible", period) + eligible = person("is_ssi_eligible", period) & person( + "takes_up_ssi_if_eligible", period.this_year + ) standard = person("nv_oss_payment_standard", period) countable_income = person("ssi_countable_income", period) federal_amount = person("ssi_amount_if_eligible", period) @@ -26,6 +31,7 @@ def formula(person, period, parameters): # A spouse's deemed income uses the couple supplement, capped at # the payment due using the claimant's own income and individual rate. + # Deeming excludes a joint claim, so the standard is that individual rate. deeming = person("is_ssi_spousal_deeming_applies", period.this_year) p = parameters(period).gov.states.nv.dwss.oss.payment arrangement = person("nv_oss_living_arrangement", period) @@ -37,17 +43,14 @@ def formula(person, period, parameters): 0, ) ssi = parameters(period).gov.ssa.ssi - arrangements = arrangement.possible_values + federal_arrangement = person("ssi_federal_living_arrangement", period) own_federal_amount = ssi.amount.individual * where( - arrangement == arrangements.HOUSEHOLD_OF_ANOTHER, + federal_arrangement + == SSIFederalLivingArrangement.ANOTHER_PERSONS_HOUSEHOLD, 1 - ssi.amount.one_third_reduction_rate, 1, ) - own_payment = max_( - p.individual[arrangement][category] - - max_(own_income - own_federal_amount, 0), - 0, - ) + own_payment = max_(standard - max_(own_income - own_federal_amount, 0), 0) payment = where(deeming, min_(own_payment, couple_payment), payment) # SI 02001.010: ignore digits after the third decimal place, then # round each member's state payment up to cents. Truncation also diff --git a/policyengine_us/variables/gov/states/nv/dwss/oss/nv_oss_payment_standard.py b/policyengine_us/variables/gov/states/nv/dwss/oss/nv_oss_payment_standard.py index 520dc568825..e4f08fd1f8a 100644 --- a/policyengine_us/variables/gov/states/nv/dwss/oss/nv_oss_payment_standard.py +++ b/policyengine_us/variables/gov/states/nv/dwss/oss/nv_oss_payment_standard.py @@ -10,7 +10,7 @@ class nv_oss_payment_standard(Variable): defined_for = StateCode.NV reference = ( "https://secure.ssa.gov/poms.nsf/lnx/0501415058#i", - "https://secure.ssa.gov/poms.nsf/lnx/0502005030#G", + "https://secure.ssa.gov/poms.nsf/lnx/0502005030#g", ) def formula(person, period, parameters): @@ -21,5 +21,7 @@ def formula(person, period, parameters): # Half of each member's same-category couple rate reproduces all # mixed-category totals in SI 01415.058 I.2.b. SI 02005.030 G.1 # divides the joint payment equally, including aged/disabled couples. + # NOTE: couples living apart in different Nevada arrangements cannot + # be modeled, because the federal framework has no living-apart status. couple_total = person.marital_unit.sum(p.couple[arrangement][category] / 2) return where(couple, couple_total / 2, p.individual[arrangement][category]) From c3b9a0b7f8428b55db1ea93d83bce320d20cb21d Mon Sep 17 00:00:00 2001 From: Ziming Date: Wed, 14 Oct 2026 14:05:13 -0400 Subject: [PATCH 3/3] Address review: Nevada OSS shared helper, child domiciliary mapping and tests - Compute nv_oss with the shared SSI state supplement helper (identical to the copy in the sibling SSP PRs) and drop nv_oss_payment_standard; every Nevada couple rate is at least the individual rate, so results are unchanged. - A child in domiciliary care keeps the federal living arrangement mapping (SF01415.300 A.2 and E) instead of being excluded. - Cite NRS 422A.070 and point the payment references at SI 01415.058 I.2.a/b. - Assert HUD annual income, and add a blind child with working parents whose income is deemed to the child; fold the payment-level cases into nv_oss.yaml. Co-Authored-By: Claude Opus 5.5 --- .../states/nv/dwss/oss/payment/couple.yaml | 4 +- .../nv/dwss/oss/payment/individual.yaml | 4 +- .../gov/states/nv/dwss/oss/integration.yaml | 9 +- .../gov/states/nv/dwss/oss/nv_oss.yaml | 804 +++++++++++++++++- .../dwss/oss/nv_oss_living_arrangement.yaml | 5 +- .../nv/dwss/oss/nv_oss_payment_standard.yaml | 752 ---------------- .../gov/ssa/ssi/_ssi_state_supplement.py | 53 ++ .../gov/states/nv/dwss/oss/nv_oss.py | 53 +- .../nv/dwss/oss/nv_oss_living_arrangement.py | 12 +- .../nv/dwss/oss/nv_oss_payment_standard.py | 27 - 10 files changed, 887 insertions(+), 836 deletions(-) delete mode 100644 policyengine_us/tests/policy/baseline/gov/states/nv/dwss/oss/nv_oss_payment_standard.yaml create mode 100644 policyengine_us/variables/gov/ssa/ssi/_ssi_state_supplement.py delete mode 100644 policyengine_us/variables/gov/states/nv/dwss/oss/nv_oss_payment_standard.py diff --git a/policyengine_us/parameters/gov/states/nv/dwss/oss/payment/couple.yaml b/policyengine_us/parameters/gov/states/nv/dwss/oss/payment/couple.yaml index bac66729b11..58542cc0904 100644 --- a/policyengine_us/parameters/gov/states/nv/dwss/oss/payment/couple.yaml +++ b/policyengine_us/parameters/gov/states/nv/dwss/oss/payment/couple.yaml @@ -10,7 +10,9 @@ metadata: - ssi_category reference: - title: POMS SI 01415.058 I.2.b - Nevada payment levels for January 2026 - href: https://secure.ssa.gov/poms.nsf/lnx/0501415058#i + href: https://secure.ssa.gov/poms.nsf/lnx/0501415058#i2b + - title: NRS 422A.070, State Supplementary Assistance defined + href: https://www.leg.state.nv.us/NRS/NRS-422A.html#NRS422ASec070 # Full couple rates for two members of the same category. Averaging the # applicable rates reproduces the published mixed-category couple totals. diff --git a/policyengine_us/parameters/gov/states/nv/dwss/oss/payment/individual.yaml b/policyengine_us/parameters/gov/states/nv/dwss/oss/payment/individual.yaml index 03b2eb71f2a..f7ad222b62c 100644 --- a/policyengine_us/parameters/gov/states/nv/dwss/oss/payment/individual.yaml +++ b/policyengine_us/parameters/gov/states/nv/dwss/oss/payment/individual.yaml @@ -10,7 +10,9 @@ metadata: - ssi_category reference: - title: POMS SI 01415.058 I.2.a - Nevada payment levels for January 2026 - href: https://secure.ssa.gov/poms.nsf/lnx/0501415058#i + href: https://secure.ssa.gov/poms.nsf/lnx/0501415058#i2a + - title: NRS 422A.070, State Supplementary Assistance defined + href: https://www.leg.state.nv.us/NRS/NRS-422A.html#NRS422ASec070 INDEPENDENT_LIVING: AGED: diff --git a/policyengine_us/tests/policy/baseline/gov/states/nv/dwss/oss/integration.yaml b/policyengine_us/tests/policy/baseline/gov/states/nv/dwss/oss/integration.yaml index a86b32b75f9..304e6aec557 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/nv/dwss/oss/integration.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/nv/dwss/oss/integration.yaml @@ -11,7 +11,6 @@ is_ssi_eligible: true ssi_category: AGED nv_oss_living_arrangement: INDEPENDENT_LIVING - nv_oss_payment_standard: 36.4 ssi_countable_income: 0 ssi_amount_if_eligible: 994 ssi: 994 @@ -21,6 +20,9 @@ snap_unearned_income: 1_030.4 spm_unit_benefits: 2026: 12_364.8 + # HUD counts SSI and the supplement: $994 * 12 + $436.80 = $12,364.80. + hud_annual_income: + 2026: 12_364.8 - name: Case 2, state-only payment remains after federal SSI is exhausted. # $1,030 Social Security - $20 exclusion = $1,010 countable income. @@ -37,7 +39,6 @@ is_ssi_eligible: true ssi_category: AGED nv_oss_living_arrangement: INDEPENDENT_LIVING - nv_oss_payment_standard: 36.4 ssi_countable_income: 1_010 ssi_amount_if_eligible: 994 ssi: 0 @@ -80,7 +81,6 @@ is_ssi_eligible: [true, true] ssi_category: [AGED, BLIND] ssi_couple_computation_applies: [true, true] - nv_oss_payment_standard: [112.265, 112.265] ssi_countable_income: [840, 840] ssi_amount_if_eligible: [745.5, 745.5] ssi: [0, 0] @@ -124,7 +124,6 @@ ssi_category: [BLIND, NONE] ssi_couple_computation_applies: [false, false] is_ssi_spousal_deeming_applies: [true, false] - nv_oss_payment_standard: [109.3, 0] ssi_countable_income: [1_830, 0] ssi_amount_if_eligible: [1_491, 994] ssi: [0, 0] @@ -156,7 +155,6 @@ ssi_category: BLIND ssi_federal_living_arrangement: ANOTHER_PERSONS_HOUSEHOLD nv_oss_living_arrangement: HOUSEHOLD_OF_ANOTHER - nv_oss_payment_standard: 213.96 ssi_countable_income: 0 ssi_amount_if_eligible: 662.67 ssi: 662.67 @@ -184,7 +182,6 @@ is_ssi_eligible: true ssi_category: AGED nv_oss_living_arrangement: DOMICILIARY_CARE - nv_oss_payment_standard: 391 ssi_countable_income: 1_180 ssi_amount_if_eligible: 994 ssi: 0 diff --git a/policyengine_us/tests/policy/baseline/gov/states/nv/dwss/oss/nv_oss.yaml b/policyengine_us/tests/policy/baseline/gov/states/nv/dwss/oss/nv_oss.yaml index b71cce7b1e7..6eeb1959be4 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/nv/dwss/oss/nv_oss.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/nv/dwss/oss/nv_oss.yaml @@ -582,7 +582,6 @@ members: [person4] state_code: CA output: - nv_oss_payment_standard: [109.3, 112.265, 112.265, 0] nv_oss: [109.3, 17.77, 17.77, 0] - name: Case 34, an eligible person who does not take up SSI receives no supplement. @@ -597,8 +596,6 @@ is_ssi_eligible: true # $994 federal benefit rate - $0 countable income = $994 if taken up. ssi_if_takes_up: 994 - # SI 01415.058 I.2.a aged independent living rate. - nv_oss_payment_standard: 36.4 # SSI is defined only for people who take it up. ssi: 0 # SSA pays the supplement through the SSI claim, so no take-up means $0. @@ -642,9 +639,8 @@ # Shelter from others and all meals paid by others: one-third reduction. ssi_federal_living_arrangement: [ANOTHER_PERSONS_HOUSEHOLD, ANOTHER_PERSONS_HOUSEHOLD] nv_oss_living_arrangement: [HOUSEHOLD_OF_ANOTHER, HOUSEHOLD_OF_ANOTHER] - # Not a joint claim: person1 gets the blind household-of-another - # individual rate; person2 has no SSI category. - nv_oss_payment_standard: [213.96, 0] + # Not a joint claim: person1's own-income cap uses the blind + # household-of-another individual rate; person2 has no SSI category. # Spouse earnings $1,040 > $1,491 - $994 = $497, so deeming applies. # Deemed: ($1,040 - $65) / 2 = $487.50. ssi_income_deemed_from_ineligible_spouse: [487.5, 0] @@ -656,3 +652,799 @@ # Own-income cap: $213.96 - ($730 - $994 * 2/3 = $662.67) = $146.63 # after rounding up to cents. min($146.63, $308.44) = $146.63. nv_oss: [146.63, 0] + +- name: Case 36, a blind child in domiciliary care keeps the independent living supplement. + period: 2026-01 + absolute_error_margin: 0.001 + input: + state_code: NV + age: 17 + is_blind: true + nv_oss_care_setting: DOMICILIARY_CARE + output: + # SF01415.300 E lists no exclusion for children, so the child keeps the + # federal mapping: FLA A gives OSS A, the blind independent living rate. + nv_oss_living_arrangement: INDEPENDENT_LIVING + nv_oss: 109.3 + +- name: Case 37, blind child with two working parents keeps the full supplement after parental deeming. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 40 + own_children_in_household: 1 + # Full-time cashier (SOC 41-2011) at the Nevada median wage, BLS OEWS + # May 2025: $14.36 an hour * 2,080 hours, published as $29,870 a year. + employment_income: 29_870 + person2: + age: 38 + own_children_in_household: 1 + # Also a full-time cashier at the Nevada median: $29,870 a year. + employment_income: 29_870 + person3: + age: 10 + is_blind: true + marital_units: + marital_unit: + members: [person1, person2] + tax_units: + tax_unit: + members: [person1, person2, person3] + spm_units: + spm_unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + state_code: NV + output: + # Neither parent is aged, blind or disabled, so the blind child lives with + # ineligible parents (federal code C), which Nevada pays as OS code A. + ssi_federal_living_arrangement: [OWN_HOUSEHOLD, OWN_HOUSEHOLD, CHILD_IN_PARENTAL_HOUSEHOLD] + nv_oss_living_arrangement: [INDEPENDENT_LIVING, INDEPENDENT_LIVING, INDEPENDENT_LIVING] + # Parents: $29,870 * 2 = $59,740 a year, $4,978.33 a month, all earned. + # ($4,978.33 - $20 - $65) * 0.5 = $2,446.67; less the two-parent + # allocation, the $1,491 couple rate, leaves $955.67 deemed to the child. + ssi_unearned_income_deemed_from_ineligible_parent: [0, 0, 955.67] + # Child: $955.67 - $20 general exclusion = $935.67. + ssi_countable_income: [0, 0, 935.67] + # $994 individual rate - $935.67 = $58.33. + ssi: [0, 0, 58.33] + # $935.67 is below the $994 rate, so there is no excess income and the + # child gets the full $109.30 blind independent living rate. + nv_oss: [0, 0, 109.3] + +# Published payment levels: POMS SI 01415.058 I.2.a-b (January 2026). A joint +# couple's payment is divided equally (POMS SI 02005.030 G.1), and fractions of +# a cent round up (SI 02001.010), so 224.53 / 2 = 112.265 is paid as 112.27. +- name: Case 38, aged and aged couple in independent matches the published total of 74.46. + period: 2026-01 + absolute_error_margin: 0.001 + input: + people: + person1: + age: 65 + person2: + age: 65 + marital_units: + marital_unit: + members: [person1, person2] + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: NV + output: + nv_oss: [37.23, 37.23] + +- name: Case 39, blind and blind couple in independent matches the published total of 374.6. + period: 2026-01 + absolute_error_margin: 0.001 + input: + people: + person1: + age: 40 + is_blind: true + person2: + age: 40 + is_blind: true + marital_units: + marital_unit: + members: [person1, person2] + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: NV + output: + nv_oss: [187.3, 187.3] + +- name: Case 40, aged and blind couple in independent matches the published total of 224.53. + period: 2026-01 + absolute_error_margin: 0.001 + input: + people: + person1: + age: 65 + person2: + age: 40 + is_blind: true + marital_units: + marital_unit: + members: [person1, person2] + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: NV + output: + nv_oss: [112.27, 112.27] + +- name: Case 41, aged and disabled couple in independent matches the published total of 37.23. + period: 2026-01 + absolute_error_margin: 0.001 + input: + people: + person1: + age: 65 + person2: + age: 40 + meets_ssi_disability_criteria: true + marital_units: + marital_unit: + members: [person1, person2] + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: NV + output: + nv_oss: [18.62, 18.62] + +- name: Case 42, blind and disabled couple in independent matches the published total of 187.3. + period: 2026-01 + absolute_error_margin: 0.001 + input: + people: + person1: + age: 40 + is_blind: true + person2: + age: 40 + meets_ssi_disability_criteria: true + marital_units: + marital_unit: + members: [person1, person2] + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: NV + output: + nv_oss: [93.65, 93.65] + +- name: Case 43, disabled and disabled couple in independent matches the published total of 0. + period: 2026-01 + absolute_error_margin: 0.001 + input: + people: + person1: + age: 40 + meets_ssi_disability_criteria: true + person2: + age: 40 + meets_ssi_disability_criteria: true + marital_units: + marital_unit: + members: [person1, person2] + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: NV + output: + nv_oss: [0, 0] + +- name: Case 44, aged and aged couple in another household matches the published total of 49.64. + period: 2026-01 + absolute_error_margin: 0.001 + input: + people: + person1: + age: 65 + ssi_lives_in_another_persons_household: true + ssi_receives_shelter_from_others_in_household: true + ssi_others_pay_all_meals: true + person2: + age: 65 + ssi_lives_in_another_persons_household: true + ssi_receives_shelter_from_others_in_household: true + ssi_others_pay_all_meals: true + marital_units: + marital_unit: + members: [person1, person2] + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: NV + output: + nv_oss: [24.82, 24.82] + +- name: Case 45, blind and blind couple in another household matches the published total of 531.94. + period: 2026-01 + absolute_error_margin: 0.001 + input: + people: + person1: + age: 40 + is_blind: true + ssi_lives_in_another_persons_household: true + ssi_receives_shelter_from_others_in_household: true + ssi_others_pay_all_meals: true + person2: + age: 40 + is_blind: true + ssi_lives_in_another_persons_household: true + ssi_receives_shelter_from_others_in_household: true + ssi_others_pay_all_meals: true + marital_units: + marital_unit: + members: [person1, person2] + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: NV + output: + nv_oss: [265.97, 265.97] + +- name: Case 46, aged and blind couple in another household matches the published total of 290.79. + period: 2026-01 + absolute_error_margin: 0.001 + input: + people: + person1: + age: 65 + ssi_lives_in_another_persons_household: true + ssi_receives_shelter_from_others_in_household: true + ssi_others_pay_all_meals: true + person2: + age: 40 + is_blind: true + ssi_lives_in_another_persons_household: true + ssi_receives_shelter_from_others_in_household: true + ssi_others_pay_all_meals: true + marital_units: + marital_unit: + members: [person1, person2] + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: NV + output: + nv_oss: [145.4, 145.4] + +- name: Case 47, aged and disabled couple in another household matches the published total of 24.82. + period: 2026-01 + absolute_error_margin: 0.001 + input: + people: + person1: + age: 65 + ssi_lives_in_another_persons_household: true + ssi_receives_shelter_from_others_in_household: true + ssi_others_pay_all_meals: true + person2: + age: 40 + meets_ssi_disability_criteria: true + ssi_lives_in_another_persons_household: true + ssi_receives_shelter_from_others_in_household: true + ssi_others_pay_all_meals: true + marital_units: + marital_unit: + members: [person1, person2] + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: NV + output: + nv_oss: [12.41, 12.41] + +- name: Case 48, blind and disabled couple in another household matches the published total of 265.97. + period: 2026-01 + absolute_error_margin: 0.001 + input: + people: + person1: + age: 40 + is_blind: true + ssi_lives_in_another_persons_household: true + ssi_receives_shelter_from_others_in_household: true + ssi_others_pay_all_meals: true + person2: + age: 40 + meets_ssi_disability_criteria: true + ssi_lives_in_another_persons_household: true + ssi_receives_shelter_from_others_in_household: true + ssi_others_pay_all_meals: true + marital_units: + marital_unit: + members: [person1, person2] + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: NV + output: + nv_oss: [132.99, 132.99] + +- name: Case 49, disabled and disabled couple in another household matches the published total of 0. + period: 2026-01 + absolute_error_margin: 0.001 + input: + people: + person1: + age: 40 + meets_ssi_disability_criteria: true + ssi_lives_in_another_persons_household: true + ssi_receives_shelter_from_others_in_household: true + ssi_others_pay_all_meals: true + person2: + age: 40 + meets_ssi_disability_criteria: true + ssi_lives_in_another_persons_household: true + ssi_receives_shelter_from_others_in_household: true + ssi_others_pay_all_meals: true + marital_units: + marital_unit: + members: [person1, person2] + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: NV + output: + nv_oss: [0, 0] + +- name: Case 50, aged and aged couple in domiciliary care matches the published total of 881. + period: 2026-01 + absolute_error_margin: 0.001 + input: + people: + person1: + age: 65 + nv_oss_care_setting: DOMICILIARY_CARE + person2: + age: 65 + nv_oss_care_setting: DOMICILIARY_CARE + marital_units: + marital_unit: + members: [person1, person2] + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: NV + output: + nv_oss: [440.5, 440.5] + +- name: Case 51, blind and blind couple in domiciliary care matches the published total of 881. + period: 2026-01 + absolute_error_margin: 0.001 + input: + people: + person1: + age: 40 + is_blind: true + nv_oss_care_setting: DOMICILIARY_CARE + person2: + age: 40 + is_blind: true + nv_oss_care_setting: DOMICILIARY_CARE + marital_units: + marital_unit: + members: [person1, person2] + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: NV + output: + nv_oss: [440.5, 440.5] + +- name: Case 52, aged and blind couple in domiciliary care matches the published total of 881. + period: 2026-01 + absolute_error_margin: 0.001 + input: + people: + person1: + age: 65 + nv_oss_care_setting: DOMICILIARY_CARE + person2: + age: 40 + is_blind: true + nv_oss_care_setting: DOMICILIARY_CARE + marital_units: + marital_unit: + members: [person1, person2] + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: NV + output: + nv_oss: [440.5, 440.5] + +- name: Case 53, aged and disabled couple in domiciliary care matches the published total of 440.5. + period: 2026-01 + absolute_error_margin: 0.001 + input: + people: + person1: + age: 65 + nv_oss_care_setting: DOMICILIARY_CARE + person2: + age: 40 + meets_ssi_disability_criteria: true + nv_oss_care_setting: DOMICILIARY_CARE + marital_units: + marital_unit: + members: [person1, person2] + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: NV + output: + nv_oss: [220.25, 220.25] + +- name: Case 54, blind and disabled couple in domiciliary care matches the published total of 440.5. + period: 2026-01 + absolute_error_margin: 0.001 + input: + people: + person1: + age: 40 + is_blind: true + nv_oss_care_setting: DOMICILIARY_CARE + person2: + age: 40 + meets_ssi_disability_criteria: true + nv_oss_care_setting: DOMICILIARY_CARE + marital_units: + marital_unit: + members: [person1, person2] + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: NV + output: + nv_oss: [220.25, 220.25] + +- name: Case 55, disabled and disabled couple in domiciliary care matches the published total of 0. + period: 2026-01 + absolute_error_margin: 0.001 + input: + people: + person1: + age: 40 + meets_ssi_disability_criteria: true + nv_oss_care_setting: DOMICILIARY_CARE + person2: + age: 40 + meets_ssi_disability_criteria: true + nv_oss_care_setting: DOMICILIARY_CARE + marital_units: + marital_unit: + members: [person1, person2] + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: NV + output: + nv_oss: [0, 0] + +- name: Case 56, all individual categories in independent match the published rates. + period: 2026-01 + absolute_error_margin: 0.001 + input: + people: + person1: + age: 65 + is_blind: false + meets_ssi_disability_criteria: false + person2: + age: 40 + is_blind: true + meets_ssi_disability_criteria: false + person3: + age: 40 + is_blind: false + meets_ssi_disability_criteria: true + person4: + age: 40 + is_blind: false + meets_ssi_disability_criteria: false + marital_units: + marital_units1: + members: [person1] + marital_units2: + members: [person2] + marital_units3: + members: [person3] + marital_units4: + members: [person4] + tax_units: + tax_units1: + members: [person1] + tax_units2: + members: [person2] + tax_units3: + members: [person3] + tax_units4: + members: [person4] + spm_units: + spm_units1: + members: [person1] + spm_units2: + members: [person2] + spm_units3: + members: [person3] + spm_units4: + members: [person4] + households: + households1: + members: [person1] + state_code: NV + households2: + members: [person2] + state_code: NV + households3: + members: [person3] + state_code: NV + households4: + members: [person4] + state_code: NV + output: + nv_oss: [36.4, 109.3, 0, 0] + +- name: Case 57, all individual categories in another household match the published rates. + period: 2026-01 + absolute_error_margin: 0.001 + input: + people: + person1: + age: 65 + is_blind: false + meets_ssi_disability_criteria: false + ssi_lives_in_another_persons_household: true + ssi_receives_shelter_from_others_in_household: true + ssi_others_pay_all_meals: true + person2: + age: 40 + is_blind: true + meets_ssi_disability_criteria: false + ssi_lives_in_another_persons_household: true + ssi_receives_shelter_from_others_in_household: true + ssi_others_pay_all_meals: true + person3: + age: 40 + is_blind: false + meets_ssi_disability_criteria: true + ssi_lives_in_another_persons_household: true + ssi_receives_shelter_from_others_in_household: true + ssi_others_pay_all_meals: true + person4: + age: 40 + is_blind: false + meets_ssi_disability_criteria: false + ssi_lives_in_another_persons_household: true + ssi_receives_shelter_from_others_in_household: true + ssi_others_pay_all_meals: true + marital_units: + marital_units1: + members: [person1] + marital_units2: + members: [person2] + marital_units3: + members: [person3] + marital_units4: + members: [person4] + tax_units: + tax_units1: + members: [person1] + tax_units2: + members: [person2] + tax_units3: + members: [person3] + tax_units4: + members: [person4] + spm_units: + spm_units1: + members: [person1] + spm_units2: + members: [person2] + spm_units3: + members: [person3] + spm_units4: + members: [person4] + households: + households1: + members: [person1] + state_code: NV + households2: + members: [person2] + state_code: NV + households3: + members: [person3] + state_code: NV + households4: + members: [person4] + state_code: NV + output: + nv_oss: [24.27, 213.96, 0, 0] + +- name: Case 58, all individual categories in domiciliary care match the published rates. + period: 2026-01 + absolute_error_margin: 0.001 + input: + people: + person1: + age: 65 + is_blind: false + meets_ssi_disability_criteria: false + nv_oss_care_setting: DOMICILIARY_CARE + person2: + age: 40 + is_blind: true + meets_ssi_disability_criteria: false + nv_oss_care_setting: DOMICILIARY_CARE + person3: + age: 40 + is_blind: false + meets_ssi_disability_criteria: true + nv_oss_care_setting: DOMICILIARY_CARE + person4: + age: 40 + is_blind: false + meets_ssi_disability_criteria: false + nv_oss_care_setting: DOMICILIARY_CARE + marital_units: + marital_units1: + members: [person1] + marital_units2: + members: [person2] + marital_units3: + members: [person3] + marital_units4: + members: [person4] + tax_units: + tax_units1: + members: [person1] + tax_units2: + members: [person2] + tax_units3: + members: [person3] + tax_units4: + members: [person4] + spm_units: + spm_units1: + members: [person1] + spm_units2: + members: [person2] + spm_units3: + members: [person3] + spm_units4: + members: [person4] + households: + households1: + members: [person1] + state_code: NV + households2: + members: [person2] + state_code: NV + households3: + members: [person3] + state_code: NV + households4: + members: [person4] + state_code: NV + output: + nv_oss: [391, 391, 0, 0] diff --git a/policyengine_us/tests/policy/baseline/gov/states/nv/dwss/oss/nv_oss_living_arrangement.yaml b/policyengine_us/tests/policy/baseline/gov/states/nv/dwss/oss/nv_oss_living_arrangement.yaml index 221b555d72d..32a4814c83b 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/nv/dwss/oss/nv_oss_living_arrangement.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/nv/dwss/oss/nv_oss_living_arrangement.yaml @@ -65,7 +65,7 @@ output: nv_oss_living_arrangement: NONE -- name: Case 9, a child does not qualify for adult domiciliary care. +- name: Case 9, a child in domiciliary care keeps the federal living arrangement mapping. period: 2026-01 input: state_code: NV @@ -73,4 +73,5 @@ is_blind: true nv_oss_care_setting: DOMICILIARY_CARE output: - nv_oss_living_arrangement: NONE + # SF01415.300 E lists no exclusion for children; FLA A gives OSS A. + nv_oss_living_arrangement: INDEPENDENT_LIVING diff --git a/policyengine_us/tests/policy/baseline/gov/states/nv/dwss/oss/nv_oss_payment_standard.yaml b/policyengine_us/tests/policy/baseline/gov/states/nv/dwss/oss/nv_oss_payment_standard.yaml deleted file mode 100644 index 096aad3042a..00000000000 --- a/policyengine_us/tests/policy/baseline/gov/states/nv/dwss/oss/nv_oss_payment_standard.yaml +++ /dev/null @@ -1,752 +0,0 @@ -# POMS SI 01415.058 I.2.a-b: January 2026 state-only payment levels. -# Couple amounts are divided equally per POMS SI 02005.030 G.1. -- name: Case 1, aged and aged couple in independent matches the published total of 74.46. - period: 2026-01 - absolute_error_margin: 0.001 - input: - people: - person1: - age: 65 - person2: - age: 65 - marital_units: - marital_unit: - members: [person1, person2] - tax_units: - tax_unit: - members: [person1, person2] - spm_units: - spm_unit: - members: [person1, person2] - households: - household: - members: [person1, person2] - state_code: NV - output: - nv_oss_payment_standard: [37.23, 37.23] - nv_oss: [37.23, 37.23] - -- name: Case 2, blind and blind couple in independent matches the published total of 374.6. - period: 2026-01 - absolute_error_margin: 0.001 - input: - people: - person1: - age: 40 - is_blind: true - person2: - age: 40 - is_blind: true - marital_units: - marital_unit: - members: [person1, person2] - tax_units: - tax_unit: - members: [person1, person2] - spm_units: - spm_unit: - members: [person1, person2] - households: - household: - members: [person1, person2] - state_code: NV - output: - nv_oss_payment_standard: [187.3, 187.3] - nv_oss: [187.3, 187.3] - -- name: Case 3, aged and blind couple in independent matches the published total of 224.53. - period: 2026-01 - absolute_error_margin: 0.001 - input: - people: - person1: - age: 65 - person2: - age: 40 - is_blind: true - marital_units: - marital_unit: - members: [person1, person2] - tax_units: - tax_unit: - members: [person1, person2] - spm_units: - spm_unit: - members: [person1, person2] - households: - household: - members: [person1, person2] - state_code: NV - output: - nv_oss_payment_standard: [112.265, 112.265] - nv_oss: [112.27, 112.27] - -- name: Case 4, aged and disabled couple in independent matches the published total of 37.23. - period: 2026-01 - absolute_error_margin: 0.001 - input: - people: - person1: - age: 65 - person2: - age: 40 - meets_ssi_disability_criteria: true - marital_units: - marital_unit: - members: [person1, person2] - tax_units: - tax_unit: - members: [person1, person2] - spm_units: - spm_unit: - members: [person1, person2] - households: - household: - members: [person1, person2] - state_code: NV - output: - nv_oss_payment_standard: [18.615, 18.615] - nv_oss: [18.62, 18.62] - -- name: Case 5, blind and disabled couple in independent matches the published total of 187.3. - period: 2026-01 - absolute_error_margin: 0.001 - input: - people: - person1: - age: 40 - is_blind: true - person2: - age: 40 - meets_ssi_disability_criteria: true - marital_units: - marital_unit: - members: [person1, person2] - tax_units: - tax_unit: - members: [person1, person2] - spm_units: - spm_unit: - members: [person1, person2] - households: - household: - members: [person1, person2] - state_code: NV - output: - nv_oss_payment_standard: [93.65, 93.65] - nv_oss: [93.65, 93.65] - -- name: Case 6, disabled and disabled couple in independent matches the published total of 0. - period: 2026-01 - absolute_error_margin: 0.001 - input: - people: - person1: - age: 40 - meets_ssi_disability_criteria: true - person2: - age: 40 - meets_ssi_disability_criteria: true - marital_units: - marital_unit: - members: [person1, person2] - tax_units: - tax_unit: - members: [person1, person2] - spm_units: - spm_unit: - members: [person1, person2] - households: - household: - members: [person1, person2] - state_code: NV - output: - nv_oss_payment_standard: [0, 0] - nv_oss: [0, 0] - -- name: Case 7, aged and aged couple in another household matches the published total of 49.64. - period: 2026-01 - absolute_error_margin: 0.001 - input: - people: - person1: - age: 65 - ssi_lives_in_another_persons_household: true - ssi_receives_shelter_from_others_in_household: true - ssi_others_pay_all_meals: true - person2: - age: 65 - ssi_lives_in_another_persons_household: true - ssi_receives_shelter_from_others_in_household: true - ssi_others_pay_all_meals: true - marital_units: - marital_unit: - members: [person1, person2] - tax_units: - tax_unit: - members: [person1, person2] - spm_units: - spm_unit: - members: [person1, person2] - households: - household: - members: [person1, person2] - state_code: NV - output: - nv_oss_payment_standard: [24.82, 24.82] - nv_oss: [24.82, 24.82] - -- name: Case 8, blind and blind couple in another household matches the published total of 531.94. - period: 2026-01 - absolute_error_margin: 0.001 - input: - people: - person1: - age: 40 - is_blind: true - ssi_lives_in_another_persons_household: true - ssi_receives_shelter_from_others_in_household: true - ssi_others_pay_all_meals: true - person2: - age: 40 - is_blind: true - ssi_lives_in_another_persons_household: true - ssi_receives_shelter_from_others_in_household: true - ssi_others_pay_all_meals: true - marital_units: - marital_unit: - members: [person1, person2] - tax_units: - tax_unit: - members: [person1, person2] - spm_units: - spm_unit: - members: [person1, person2] - households: - household: - members: [person1, person2] - state_code: NV - output: - nv_oss_payment_standard: [265.97, 265.97] - nv_oss: [265.97, 265.97] - -- name: Case 9, aged and blind couple in another household matches the published total of 290.79. - period: 2026-01 - absolute_error_margin: 0.001 - input: - people: - person1: - age: 65 - ssi_lives_in_another_persons_household: true - ssi_receives_shelter_from_others_in_household: true - ssi_others_pay_all_meals: true - person2: - age: 40 - is_blind: true - ssi_lives_in_another_persons_household: true - ssi_receives_shelter_from_others_in_household: true - ssi_others_pay_all_meals: true - marital_units: - marital_unit: - members: [person1, person2] - tax_units: - tax_unit: - members: [person1, person2] - spm_units: - spm_unit: - members: [person1, person2] - households: - household: - members: [person1, person2] - state_code: NV - output: - nv_oss_payment_standard: [145.395, 145.395] - nv_oss: [145.4, 145.4] - -- name: Case 10, aged and disabled couple in another household matches the published total of 24.82. - period: 2026-01 - absolute_error_margin: 0.001 - input: - people: - person1: - age: 65 - ssi_lives_in_another_persons_household: true - ssi_receives_shelter_from_others_in_household: true - ssi_others_pay_all_meals: true - person2: - age: 40 - meets_ssi_disability_criteria: true - ssi_lives_in_another_persons_household: true - ssi_receives_shelter_from_others_in_household: true - ssi_others_pay_all_meals: true - marital_units: - marital_unit: - members: [person1, person2] - tax_units: - tax_unit: - members: [person1, person2] - spm_units: - spm_unit: - members: [person1, person2] - households: - household: - members: [person1, person2] - state_code: NV - output: - nv_oss_payment_standard: [12.41, 12.41] - nv_oss: [12.41, 12.41] - -- name: Case 11, blind and disabled couple in another household matches the published total of 265.97. - period: 2026-01 - absolute_error_margin: 0.001 - input: - people: - person1: - age: 40 - is_blind: true - ssi_lives_in_another_persons_household: true - ssi_receives_shelter_from_others_in_household: true - ssi_others_pay_all_meals: true - person2: - age: 40 - meets_ssi_disability_criteria: true - ssi_lives_in_another_persons_household: true - ssi_receives_shelter_from_others_in_household: true - ssi_others_pay_all_meals: true - marital_units: - marital_unit: - members: [person1, person2] - tax_units: - tax_unit: - members: [person1, person2] - spm_units: - spm_unit: - members: [person1, person2] - households: - household: - members: [person1, person2] - state_code: NV - output: - nv_oss_payment_standard: [132.985, 132.985] - nv_oss: [132.99, 132.99] - -- name: Case 12, disabled and disabled couple in another household matches the published total of 0. - period: 2026-01 - absolute_error_margin: 0.001 - input: - people: - person1: - age: 40 - meets_ssi_disability_criteria: true - ssi_lives_in_another_persons_household: true - ssi_receives_shelter_from_others_in_household: true - ssi_others_pay_all_meals: true - person2: - age: 40 - meets_ssi_disability_criteria: true - ssi_lives_in_another_persons_household: true - ssi_receives_shelter_from_others_in_household: true - ssi_others_pay_all_meals: true - marital_units: - marital_unit: - members: [person1, person2] - tax_units: - tax_unit: - members: [person1, person2] - spm_units: - spm_unit: - members: [person1, person2] - households: - household: - members: [person1, person2] - state_code: NV - output: - nv_oss_payment_standard: [0, 0] - nv_oss: [0, 0] - -- name: Case 13, aged and aged couple in domiciliary care matches the published total of 881. - period: 2026-01 - absolute_error_margin: 0.001 - input: - people: - person1: - age: 65 - nv_oss_care_setting: DOMICILIARY_CARE - person2: - age: 65 - nv_oss_care_setting: DOMICILIARY_CARE - marital_units: - marital_unit: - members: [person1, person2] - tax_units: - tax_unit: - members: [person1, person2] - spm_units: - spm_unit: - members: [person1, person2] - households: - household: - members: [person1, person2] - state_code: NV - output: - nv_oss_payment_standard: [440.5, 440.5] - nv_oss: [440.5, 440.5] - -- name: Case 14, blind and blind couple in domiciliary care matches the published total of 881. - period: 2026-01 - absolute_error_margin: 0.001 - input: - people: - person1: - age: 40 - is_blind: true - nv_oss_care_setting: DOMICILIARY_CARE - person2: - age: 40 - is_blind: true - nv_oss_care_setting: DOMICILIARY_CARE - marital_units: - marital_unit: - members: [person1, person2] - tax_units: - tax_unit: - members: [person1, person2] - spm_units: - spm_unit: - members: [person1, person2] - households: - household: - members: [person1, person2] - state_code: NV - output: - nv_oss_payment_standard: [440.5, 440.5] - nv_oss: [440.5, 440.5] - -- name: Case 15, aged and blind couple in domiciliary care matches the published total of 881. - period: 2026-01 - absolute_error_margin: 0.001 - input: - people: - person1: - age: 65 - nv_oss_care_setting: DOMICILIARY_CARE - person2: - age: 40 - is_blind: true - nv_oss_care_setting: DOMICILIARY_CARE - marital_units: - marital_unit: - members: [person1, person2] - tax_units: - tax_unit: - members: [person1, person2] - spm_units: - spm_unit: - members: [person1, person2] - households: - household: - members: [person1, person2] - state_code: NV - output: - nv_oss_payment_standard: [440.5, 440.5] - nv_oss: [440.5, 440.5] - -- name: Case 16, aged and disabled couple in domiciliary care matches the published total of 440.5. - period: 2026-01 - absolute_error_margin: 0.001 - input: - people: - person1: - age: 65 - nv_oss_care_setting: DOMICILIARY_CARE - person2: - age: 40 - meets_ssi_disability_criteria: true - nv_oss_care_setting: DOMICILIARY_CARE - marital_units: - marital_unit: - members: [person1, person2] - tax_units: - tax_unit: - members: [person1, person2] - spm_units: - spm_unit: - members: [person1, person2] - households: - household: - members: [person1, person2] - state_code: NV - output: - nv_oss_payment_standard: [220.25, 220.25] - nv_oss: [220.25, 220.25] - -- name: Case 17, blind and disabled couple in domiciliary care matches the published total of 440.5. - period: 2026-01 - absolute_error_margin: 0.001 - input: - people: - person1: - age: 40 - is_blind: true - nv_oss_care_setting: DOMICILIARY_CARE - person2: - age: 40 - meets_ssi_disability_criteria: true - nv_oss_care_setting: DOMICILIARY_CARE - marital_units: - marital_unit: - members: [person1, person2] - tax_units: - tax_unit: - members: [person1, person2] - spm_units: - spm_unit: - members: [person1, person2] - households: - household: - members: [person1, person2] - state_code: NV - output: - nv_oss_payment_standard: [220.25, 220.25] - nv_oss: [220.25, 220.25] - -- name: Case 18, disabled and disabled couple in domiciliary care matches the published total of 0. - period: 2026-01 - absolute_error_margin: 0.001 - input: - people: - person1: - age: 40 - meets_ssi_disability_criteria: true - nv_oss_care_setting: DOMICILIARY_CARE - person2: - age: 40 - meets_ssi_disability_criteria: true - nv_oss_care_setting: DOMICILIARY_CARE - marital_units: - marital_unit: - members: [person1, person2] - tax_units: - tax_unit: - members: [person1, person2] - spm_units: - spm_unit: - members: [person1, person2] - households: - household: - members: [person1, person2] - state_code: NV - output: - nv_oss_payment_standard: [0, 0] - nv_oss: [0, 0] - -- name: Case 19, all individual categories in independent match the published rates. - period: 2026-01 - absolute_error_margin: 0.001 - input: - people: - person1: - age: 65 - is_blind: false - meets_ssi_disability_criteria: false - person2: - age: 40 - is_blind: true - meets_ssi_disability_criteria: false - person3: - age: 40 - is_blind: false - meets_ssi_disability_criteria: true - person4: - age: 40 - is_blind: false - meets_ssi_disability_criteria: false - marital_units: - marital_units1: - members: [person1] - marital_units2: - members: [person2] - marital_units3: - members: [person3] - marital_units4: - members: [person4] - tax_units: - tax_units1: - members: [person1] - tax_units2: - members: [person2] - tax_units3: - members: [person3] - tax_units4: - members: [person4] - spm_units: - spm_units1: - members: [person1] - spm_units2: - members: [person2] - spm_units3: - members: [person3] - spm_units4: - members: [person4] - households: - households1: - members: [person1] - state_code: NV - households2: - members: [person2] - state_code: NV - households3: - members: [person3] - state_code: NV - households4: - members: [person4] - state_code: NV - output: - nv_oss_payment_standard: [36.4, 109.3, 0, 0] - nv_oss: [36.4, 109.3, 0, 0] - -- name: Case 20, all individual categories in another household match the published rates. - period: 2026-01 - absolute_error_margin: 0.001 - input: - people: - person1: - age: 65 - is_blind: false - meets_ssi_disability_criteria: false - ssi_lives_in_another_persons_household: true - ssi_receives_shelter_from_others_in_household: true - ssi_others_pay_all_meals: true - person2: - age: 40 - is_blind: true - meets_ssi_disability_criteria: false - ssi_lives_in_another_persons_household: true - ssi_receives_shelter_from_others_in_household: true - ssi_others_pay_all_meals: true - person3: - age: 40 - is_blind: false - meets_ssi_disability_criteria: true - ssi_lives_in_another_persons_household: true - ssi_receives_shelter_from_others_in_household: true - ssi_others_pay_all_meals: true - person4: - age: 40 - is_blind: false - meets_ssi_disability_criteria: false - ssi_lives_in_another_persons_household: true - ssi_receives_shelter_from_others_in_household: true - ssi_others_pay_all_meals: true - marital_units: - marital_units1: - members: [person1] - marital_units2: - members: [person2] - marital_units3: - members: [person3] - marital_units4: - members: [person4] - tax_units: - tax_units1: - members: [person1] - tax_units2: - members: [person2] - tax_units3: - members: [person3] - tax_units4: - members: [person4] - spm_units: - spm_units1: - members: [person1] - spm_units2: - members: [person2] - spm_units3: - members: [person3] - spm_units4: - members: [person4] - households: - households1: - members: [person1] - state_code: NV - households2: - members: [person2] - state_code: NV - households3: - members: [person3] - state_code: NV - households4: - members: [person4] - state_code: NV - output: - nv_oss_payment_standard: [24.27, 213.96, 0, 0] - nv_oss: [24.27, 213.96, 0, 0] - -- name: Case 21, all individual categories in domiciliary care match the published rates. - period: 2026-01 - absolute_error_margin: 0.001 - input: - people: - person1: - age: 65 - is_blind: false - meets_ssi_disability_criteria: false - nv_oss_care_setting: DOMICILIARY_CARE - person2: - age: 40 - is_blind: true - meets_ssi_disability_criteria: false - nv_oss_care_setting: DOMICILIARY_CARE - person3: - age: 40 - is_blind: false - meets_ssi_disability_criteria: true - nv_oss_care_setting: DOMICILIARY_CARE - person4: - age: 40 - is_blind: false - meets_ssi_disability_criteria: false - nv_oss_care_setting: DOMICILIARY_CARE - marital_units: - marital_units1: - members: [person1] - marital_units2: - members: [person2] - marital_units3: - members: [person3] - marital_units4: - members: [person4] - tax_units: - tax_units1: - members: [person1] - tax_units2: - members: [person2] - tax_units3: - members: [person3] - tax_units4: - members: [person4] - spm_units: - spm_units1: - members: [person1] - spm_units2: - members: [person2] - spm_units3: - members: [person3] - spm_units4: - members: [person4] - households: - households1: - members: [person1] - state_code: NV - households2: - members: [person2] - state_code: NV - households3: - members: [person3] - state_code: NV - households4: - members: [person4] - state_code: NV - output: - nv_oss_payment_standard: [391, 391, 0, 0] - nv_oss: [391, 391, 0, 0] diff --git a/policyengine_us/variables/gov/ssa/ssi/_ssi_state_supplement.py b/policyengine_us/variables/gov/ssa/ssi/_ssi_state_supplement.py new file mode 100644 index 00000000000..5e0c84da3f3 --- /dev/null +++ b/policyengine_us/variables/gov/ssa/ssi/_ssi_state_supplement.py @@ -0,0 +1,53 @@ +from policyengine_us.model_api import * +from policyengine_us.variables.gov.ssa.ssi.eligibility.status.ssi_federal_living_arrangement import ( + SSIFederalLivingArrangement, +) + + +def ssi_state_supplement( + person, period, parameters, individual_rate, couple_rate, federal_payment_rules=True +): + """Apply SSI-based supplement income, couple and spouse-deeming rules. + + Rates are state supplements, excluding federal SSI. Each member supplies + the same-category couple rate; averaging these rates implements mixed + arrangements where the state's published schedule supports that method. + Set federal_payment_rules only for SSA-administered payments; state + administrators do not inherit the federal rounding or minimum payment. + Sources: 20 CFR 416.2025; POMS SI 01320.430 D, SI 02005.030 G, + SI 02001.005 and SI 02001.010. Callers apply state-specific eligibility. + """ + joint = person("ssi_couple_computation_applies", period) + couple_total = person.marital_unit.sum(couple_rate / 2) + standard = where(joint, couple_total / 2, individual_rate) + countable = person("ssi_countable_income", period) + federal_amount = person("ssi_amount_if_eligible", period) + excess = max_(countable - federal_amount, 0) + payment = max_(standard - excess, 0) + + deeming = person("is_ssi_spousal_deeming_applies", period.this_year) + deemed = person("ssi_income_deemed_from_ineligible_spouse", period) + own_income = max_(countable - deemed, 0) + ssi = parameters(period).gov.ssa.ssi + federal_la = person("ssi_federal_living_arrangement", period) + own_federal_amount = ssi.amount.individual * where( + federal_la == SSIFederalLivingArrangement.ANOTHER_PERSONS_HOUSEHOLD, + 1 - ssi.amount.one_third_reduction_rate, + 1, + ) + own_payment = max_(individual_rate - max_(own_income - own_federal_amount, 0), 0) + # SI 01320.430 D.2: use the higher individual rate where it exceeds + # the couple rate (including New Jersey's ineligible-spouse variation). + deemed_payment = max_(max_(couple_rate, individual_rate) - excess, 0) + payment = where(deeming, min_(own_payment, deemed_payment), payment) + + eligible = person("is_ssi_eligible", period) & person( + "takes_up_ssi_if_eligible", period.this_year + ) + # Federal administration discards digits beyond the third decimal place, + # rounds up to cents, and pays at least one dollar for a positive amount. + rounded = np.ceil(np.floor(payment * 1_000) / 10) / 100 + federal_payment = where( + rounded > 0, max_(rounded, ssi.state_supplement.minimum_payment), 0 + ) + return eligible * where(federal_payment_rules, federal_payment, payment) diff --git a/policyengine_us/variables/gov/states/nv/dwss/oss/nv_oss.py b/policyengine_us/variables/gov/states/nv/dwss/oss/nv_oss.py index f2baa2600c4..ced89214951 100644 --- a/policyengine_us/variables/gov/states/nv/dwss/oss/nv_oss.py +++ b/policyengine_us/variables/gov/states/nv/dwss/oss/nv_oss.py @@ -1,6 +1,6 @@ from policyengine_us.model_api import * -from policyengine_us.variables.gov.ssa.ssi.eligibility.status.ssi_federal_living_arrangement import ( - SSIFederalLivingArrangement, +from policyengine_us.variables.gov.ssa.ssi._ssi_state_supplement import ( + ssi_state_supplement, ) @@ -13,48 +13,29 @@ class nv_oss(Variable): defined_for = StateCode.NV reference = ( "https://secure.ssa.gov/poms.nsf/lnx/0501415058#i", + "https://www.leg.state.nv.us/NRS/NRS-422A.html#NRS422ASec070", "https://www.ssa.gov/OP_Home/cfr20/416/416-2025.htm", "https://secure.ssa.gov/poms.nsf/lnx/0501320430#d", + "https://secure.ssa.gov/poms.nsf/lnx/0502005030#g", "https://secure.ssa.gov/poms.nsf/lnx/0502001005", "https://secure.ssa.gov/poms.nsf/lnx/0502001010", ) def formula(person, period, parameters): - eligible = person("is_ssi_eligible", period) & person( - "takes_up_ssi_if_eligible", period.this_year - ) - standard = person("nv_oss_payment_standard", period) - countable_income = person("ssi_countable_income", period) - federal_amount = person("ssi_amount_if_eligible", period) - excess_income = max_(countable_income - federal_amount, 0) - payment = max_(standard - excess_income, 0) - - # A spouse's deemed income uses the couple supplement, capped at - # the payment due using the claimant's own income and individual rate. - # Deeming excludes a joint claim, so the standard is that individual rate. - deeming = person("is_ssi_spousal_deeming_applies", period.this_year) p = parameters(period).gov.states.nv.dwss.oss.payment arrangement = person("nv_oss_living_arrangement", period) category = person("ssi_category", period.this_year) - couple_payment = max_(p.couple[arrangement][category] - excess_income, 0) - own_income = max_( - countable_income - - person("ssi_income_deemed_from_ineligible_spouse", period), - 0, - ) - ssi = parameters(period).gov.ssa.ssi - federal_arrangement = person("ssi_federal_living_arrangement", period) - own_federal_amount = ssi.amount.individual * where( - federal_arrangement - == SSIFederalLivingArrangement.ANOTHER_PERSONS_HOUSEHOLD, - 1 - ssi.amount.one_third_reduction_rate, - 1, + # SSA administers Nevada's supplement (SI 01415.058 A), so the federal + # rounding and $1 minimum apply. Half of each member's same-category + # couple rate reproduces all mixed-category totals in SI 01415.058 I.2.b. + # Every Nevada couple rate is at least the individual rate, so spouse + # deeming compares against the couple rate (SI 01320.430 D.3.b). + # NOTE: couples living apart in different Nevada arrangements cannot + # be modeled, because the federal framework has no living-apart status. + return ssi_state_supplement( + person, + period, + parameters, + p.individual[arrangement][category], + p.couple[arrangement][category], ) - own_payment = max_(standard - max_(own_income - own_federal_amount, 0), 0) - payment = where(deeming, min_(own_payment, couple_payment), payment) - # SI 02001.010: ignore digits after the third decimal place, then - # round each member's state payment up to cents. Truncation also - # prevents floating-point residue at the income cutoff paying $1. - payment = np.ceil(np.floor(payment * 1_000) / 10) / 100 - minimum = ssi.state_supplement.minimum_payment - return where(eligible & (payment > 0), max_(payment, minimum), 0) diff --git a/policyengine_us/variables/gov/states/nv/dwss/oss/nv_oss_living_arrangement.py b/policyengine_us/variables/gov/states/nv/dwss/oss/nv_oss_living_arrangement.py index 6747872acbe..1d91e90291f 100644 --- a/policyengine_us/variables/gov/states/nv/dwss/oss/nv_oss_living_arrangement.py +++ b/policyengine_us/variables/gov/states/nv/dwss/oss/nv_oss_living_arrangement.py @@ -30,15 +30,17 @@ def formula(person, period, parameters): (federal == arrangements.MEDICAL_TREATMENT_FACILITY) | (care == settings.UNCERTIFIED_MEDICAL_FACILITY) | (care == settings.PUBLIC_EMERGENCY_SHELTER) - | ( - (care == settings.DOMICILIARY_CARE) - & person("is_child", period.this_year) - ) + ) + # SF01415.300 C facilities serve adults, but E lists no exclusion for + # children, so a child in such a setting keeps the federal mapping + # (A.2: FLA A or a blind child in FLA C is OSS A). + domiciliary = (care == settings.DOMICILIARY_CARE) & ~person( + "is_child", period.this_year ) return select( [ excluded, - care == settings.DOMICILIARY_CARE, + domiciliary, federal == arrangements.ANOTHER_PERSONS_HOUSEHOLD, (federal == arrangements.OWN_HOUSEHOLD) | (federal == arrangements.CHILD_IN_PARENTAL_HOUSEHOLD), diff --git a/policyengine_us/variables/gov/states/nv/dwss/oss/nv_oss_payment_standard.py b/policyengine_us/variables/gov/states/nv/dwss/oss/nv_oss_payment_standard.py deleted file mode 100644 index e4f08fd1f8a..00000000000 --- a/policyengine_us/variables/gov/states/nv/dwss/oss/nv_oss_payment_standard.py +++ /dev/null @@ -1,27 +0,0 @@ -from policyengine_us.model_api import * - - -class nv_oss_payment_standard(Variable): - value_type = float - entity = Person - definition_period = MONTH - unit = USD - label = "Nevada OSS maximum monthly payment per person" - defined_for = StateCode.NV - reference = ( - "https://secure.ssa.gov/poms.nsf/lnx/0501415058#i", - "https://secure.ssa.gov/poms.nsf/lnx/0502005030#g", - ) - - def formula(person, period, parameters): - p = parameters(period).gov.states.nv.dwss.oss.payment - arrangement = person("nv_oss_living_arrangement", period) - category = person("ssi_category", period.this_year) - couple = person("ssi_couple_computation_applies", period) - # Half of each member's same-category couple rate reproduces all - # mixed-category totals in SI 01415.058 I.2.b. SI 02005.030 G.1 - # divides the joint payment equally, including aged/disabled couples. - # NOTE: couples living apart in different Nevada arrangements cannot - # be modeled, because the federal framework has no living-apart status. - couple_total = person.marital_unit.sum(p.couple[arrangement][category] / 2) - return where(couple, couple_total / 2, p.individual[arrangement][category])