From 24a6b153e5b25f2cd9f905898d2aa56d24457c36 Mon Sep 17 00:00:00 2001 From: Ziming Date: Mon, 12 Oct 2026 14:20:39 -0400 Subject: [PATCH 1/4] Add New York state supplementation for 2026 --- changelog.d/ny-ssp-2026.added.md | 1 + .../household/household_state_benefits.yaml | 4 + .../hud/annual_income/sources/unearned.yaml | 1 + .../ssi/state_supplement/minimum_payment.yaml | 12 + .../gov/states/ny/otda/ssp/amount/couple.yaml | 29 ++ .../states/ny/otda/ssp/amount/individual.yaml | 29 ++ .../ny/otda/ssp/downstate_counties.yaml | 20 ++ .../ssp/family_care_downstate_premium.yaml | 12 + .../states/ny/otda/ssp/minimum_payment.yaml | 11 + .../gov/states/ny/otda/ssp/minor_age.yaml | 9 + .../ssp/personal_needs/nursing_facility.yaml | 12 + .../other_medical_facility.yaml | 12 + .../residential_care_downstate_premium.yaml | 12 + .../states/ny/otda/ssp/student_minor_age.yaml | 9 + .../usda/snap/income/sources/unearned.yaml | 7 +- policyengine_us/programs.yaml | 13 + .../gov/states/ny/otda/ssp/integration.yaml | 198 +++++++++++ .../gov/states/ny/otda/ssp/ny_ssp.yaml | 321 ++++++++++++++++++ .../ssp/ny_ssp_regularly_attends_school.yaml | 13 + .../gov/ssa/ssi/_ssi_state_supplement.py | 53 +++ .../gov/states/ny/otda/ssp/ny_ssp.py | 74 ++++ .../gov/states/ny/otda/ssp/ny_ssp_is_minor.py | 20 ++ .../ny/otda/ssp/ny_ssp_living_arrangement.py | 51 +++ .../ssp/ny_ssp_regularly_attends_school.py | 20 ++ .../income/spm_unit/spm_unit_benefits.py | 1 + 25 files changed, 940 insertions(+), 4 deletions(-) create mode 100644 changelog.d/ny-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/ny/otda/ssp/amount/couple.yaml create mode 100644 policyengine_us/parameters/gov/states/ny/otda/ssp/amount/individual.yaml create mode 100644 policyengine_us/parameters/gov/states/ny/otda/ssp/downstate_counties.yaml create mode 100644 policyengine_us/parameters/gov/states/ny/otda/ssp/family_care_downstate_premium.yaml create mode 100644 policyengine_us/parameters/gov/states/ny/otda/ssp/minimum_payment.yaml create mode 100644 policyengine_us/parameters/gov/states/ny/otda/ssp/minor_age.yaml create mode 100644 policyengine_us/parameters/gov/states/ny/otda/ssp/personal_needs/nursing_facility.yaml create mode 100644 policyengine_us/parameters/gov/states/ny/otda/ssp/personal_needs/other_medical_facility.yaml create mode 100644 policyengine_us/parameters/gov/states/ny/otda/ssp/residential_care_downstate_premium.yaml create mode 100644 policyengine_us/parameters/gov/states/ny/otda/ssp/student_minor_age.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/ny/otda/ssp/integration.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/ny/otda/ssp/ny_ssp.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/ny/otda/ssp/ny_ssp_regularly_attends_school.yaml create mode 100644 policyengine_us/variables/gov/ssa/ssi/_ssi_state_supplement.py create mode 100644 policyengine_us/variables/gov/states/ny/otda/ssp/ny_ssp.py create mode 100644 policyengine_us/variables/gov/states/ny/otda/ssp/ny_ssp_is_minor.py create mode 100644 policyengine_us/variables/gov/states/ny/otda/ssp/ny_ssp_living_arrangement.py create mode 100644 policyengine_us/variables/gov/states/ny/otda/ssp/ny_ssp_regularly_attends_school.py diff --git a/changelog.d/ny-ssp-2026.added.md b/changelog.d/ny-ssp-2026.added.md new file mode 100644 index 00000000000..ca95253a1d0 --- /dev/null +++ b/changelog.d/ny-ssp-2026.added.md @@ -0,0 +1 @@ +Add New York State Supplement Program for 2026. diff --git a/policyengine_us/parameters/gov/household/household_state_benefits.yaml b/policyengine_us/parameters/gov/household/household_state_benefits.yaml index d2cbd6ba2d4..3fe5d2eeb71 100644 --- a/policyengine_us/parameters/gov/household/household_state_benefits.yaml +++ b/policyengine_us/parameters/gov/household/household_state_benefits.yaml @@ -78,6 +78,7 @@ values: # DC benefits - dc_ossp # Kansas benefits + - ny_ssp - ks_sspp # Hawaii benefits - hi_oss @@ -176,6 +177,7 @@ values: # DC benefits - dc_ossp # Kansas benefits + - ny_ssp - ks_sspp # Hawaii benefits - hi_oss @@ -279,6 +281,7 @@ values: - dc_ossp - dc_child_care_subsidies # Kansas benefits + - ny_ssp - ks_sspp # Hawaii benefits - hi_oss @@ -382,6 +385,7 @@ values: - dc_ossp - dc_child_care_subsidies # Kansas benefits + - ny_ssp - ks_sspp # Hawaii benefits - hi_oss 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..20358b77075 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 + - ny_ssp - 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 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/ny/otda/ssp/amount/couple.yaml b/policyengine_us/parameters/gov/states/ny/otda/ssp/amount/couple.yaml new file mode 100644 index 00000000000..685f29744b0 --- /dev/null +++ b/policyengine_us/parameters/gov/states/ny/otda/ssp/amount/couple.yaml @@ -0,0 +1,29 @@ +description: New York provides these monthly State Supplement Program rates for an eligible couple, excluding + the downstate care premium. +metadata: + unit: currency-USD + period: month + label: New York SSP couple amount + breakdown: + - ny_ssp_living_arrangement + reference: + - title: 'New York 2026 SSI and SSP maximum monthly benefit levels #page 1-2' + href: https://opwdd.ny.gov/system/files/documents/2025/11/25-inf-06-attachment-1.pdf#page=1 + - title: New York Social Services Law section 209 + href: https://www.nysenate.gov/legislation/laws/SOS/209 +LIVING_ALONE: + '2026-01-01': 104 +LIVING_WITH_OTHERS: + '2026-01-01': 46 +FAMILY_CARE: + '2026-01-01': 953.96 +RESIDENTIAL_CARE: + '2026-01-01': 1307 +ENHANCED_RESIDENTIAL_CARE: + '2026-01-01': 1885 +NURSING_FACILITY: + '2026-01-01': 0 +OTHER_MEDICAL_FACILITY: + '2026-01-01': 0 +NONE: + '2026-01-01': 0 diff --git a/policyengine_us/parameters/gov/states/ny/otda/ssp/amount/individual.yaml b/policyengine_us/parameters/gov/states/ny/otda/ssp/amount/individual.yaml new file mode 100644 index 00000000000..6468a67c3dd --- /dev/null +++ b/policyengine_us/parameters/gov/states/ny/otda/ssp/amount/individual.yaml @@ -0,0 +1,29 @@ +description: New York provides these monthly State Supplement Program rates for an eligible individual, + excluding the downstate care premium. +metadata: + unit: currency-USD + period: month + label: New York SSP individual amount + breakdown: + - ny_ssp_living_arrangement + reference: + - title: 'New York 2026 SSI and SSP maximum monthly benefit levels #page 1-2' + href: https://opwdd.ny.gov/system/files/documents/2025/11/25-inf-06-attachment-1.pdf#page=1 + - title: New York Social Services Law section 209 + href: https://www.nysenate.gov/legislation/laws/SOS/209 +LIVING_ALONE: + '2026-01-01': 87 +LIVING_WITH_OTHERS: + '2026-01-01': 23 +FAMILY_CARE: + '2026-01-01': 228.48 +RESIDENTIAL_CARE: + '2026-01-01': 405 +ENHANCED_RESIDENTIAL_CARE: + '2026-01-01': 694 +NURSING_FACILITY: + '2026-01-01': 0 +OTHER_MEDICAL_FACILITY: + '2026-01-01': 0 +NONE: + '2026-01-01': 0 diff --git a/policyengine_us/parameters/gov/states/ny/otda/ssp/downstate_counties.yaml b/policyengine_us/parameters/gov/states/ny/otda/ssp/downstate_counties.yaml new file mode 100644 index 00000000000..65034c49673 --- /dev/null +++ b/policyengine_us/parameters/gov/states/ny/otda/ssp/downstate_counties.yaml @@ -0,0 +1,20 @@ +description: New York pays higher family and residential care supplements in these counties. +values: + '2026-01-01': + - BRONX_COUNTY_NY + - KINGS_COUNTY_NY + - NEW_YORK_COUNTY_NY + - QUEENS_COUNTY_NY + - RICHMOND_COUNTY_NY + - NASSAU_COUNTY_NY + - ROCKLAND_COUNTY_NY + - SUFFOLK_COUNTY_NY + - WESTCHESTER_COUNTY_NY +metadata: + unit: list + label: New York SSP downstate care counties + reference: + - title: 'New York 2026 SSI and SSP maximum monthly benefit levels #page 1-2' + href: https://opwdd.ny.gov/system/files/documents/2025/11/25-inf-06-attachment-1.pdf#page=1 + - title: New York Social Services Law section 209 + href: https://www.nysenate.gov/legislation/laws/SOS/209 diff --git a/policyengine_us/parameters/gov/states/ny/otda/ssp/family_care_downstate_premium.yaml b/policyengine_us/parameters/gov/states/ny/otda/ssp/family_care_downstate_premium.yaml new file mode 100644 index 00000000000..f3ca44243c4 --- /dev/null +++ b/policyengine_us/parameters/gov/states/ny/otda/ssp/family_care_downstate_premium.yaml @@ -0,0 +1,12 @@ +description: New York adds this monthly amount per person to the family care rate in downstate counties. +values: + '2026-01-01': 38 +metadata: + unit: currency-USD + label: New York SSP family care downstate premium + reference: + - title: 'New York 2026 SSI and SSP maximum monthly benefit levels #page 1-2' + href: https://opwdd.ny.gov/system/files/documents/2025/11/25-inf-06-attachment-1.pdf#page=1 + - title: New York Social Services Law section 209 + href: https://www.nysenate.gov/legislation/laws/SOS/209 + period: month diff --git a/policyengine_us/parameters/gov/states/ny/otda/ssp/minimum_payment.yaml b/policyengine_us/parameters/gov/states/ny/otda/ssp/minimum_payment.yaml new file mode 100644 index 00000000000..15f61f7e742 --- /dev/null +++ b/policyengine_us/parameters/gov/states/ny/otda/ssp/minimum_payment.yaml @@ -0,0 +1,11 @@ +description: New York provides at least this monthly State Supplement Program payment when the computed + benefit is positive. +values: + '2014-10-01': 1 +metadata: + unit: currency-USD + label: New York SSP minimum payment + reference: + - title: 18 NYCRR 398-4.6(c), Payment of SSP benefits + href: https://www.law.cornell.edu/regulations/new-york/18-NYCRR-398-4.6 + period: month diff --git a/policyengine_us/parameters/gov/states/ny/otda/ssp/minor_age.yaml b/policyengine_us/parameters/gov/states/ny/otda/ssp/minor_age.yaml new file mode 100644 index 00000000000..dc143d18570 --- /dev/null +++ b/policyengine_us/parameters/gov/states/ny/otda/ssp/minor_age.yaml @@ -0,0 +1,9 @@ +description: New York treats people below this age as minors for State Supplement Program living arrangements. +values: + '2014-10-01': 18 +metadata: + unit: year + label: New York SSP minor age + reference: + - title: 18 NYCRR 398-2.1(t), Minor child + href: https://www.law.cornell.edu/regulations/new-york/18-NYCRR-398-2.1 diff --git a/policyengine_us/parameters/gov/states/ny/otda/ssp/personal_needs/nursing_facility.yaml b/policyengine_us/parameters/gov/states/ny/otda/ssp/personal_needs/nursing_facility.yaml new file mode 100644 index 00000000000..2745b40e3cc --- /dev/null +++ b/policyengine_us/parameters/gov/states/ny/otda/ssp/personal_needs/nursing_facility.yaml @@ -0,0 +1,12 @@ +description: New York provides this monthly state personal needs allowance in this medical facility category. +values: + '1988-01-01': 25 +metadata: + unit: currency-USD + label: New York SSP nursing facility personal needs allowance + reference: + - title: 'New York 2026 SSI and SSP maximum monthly benefit levels #page 1-2' + href: https://opwdd.ny.gov/system/files/documents/2025/11/25-inf-06-attachment-1.pdf#page=1 + - title: New York Social Services Law section 209 + href: https://www.nysenate.gov/legislation/laws/SOS/209 + period: month diff --git a/policyengine_us/parameters/gov/states/ny/otda/ssp/personal_needs/other_medical_facility.yaml b/policyengine_us/parameters/gov/states/ny/otda/ssp/personal_needs/other_medical_facility.yaml new file mode 100644 index 00000000000..81edd6597f8 --- /dev/null +++ b/policyengine_us/parameters/gov/states/ny/otda/ssp/personal_needs/other_medical_facility.yaml @@ -0,0 +1,12 @@ +description: New York provides this monthly state personal needs allowance in this medical facility category. +values: + '1988-01-01': 5 +metadata: + unit: currency-USD + label: New York SSP other medical facility personal needs allowance + reference: + - title: 'New York 2026 SSI and SSP maximum monthly benefit levels #page 1-2' + href: https://opwdd.ny.gov/system/files/documents/2025/11/25-inf-06-attachment-1.pdf#page=1 + - title: New York Social Services Law section 209 + href: https://www.nysenate.gov/legislation/laws/SOS/209 + period: month diff --git a/policyengine_us/parameters/gov/states/ny/otda/ssp/residential_care_downstate_premium.yaml b/policyengine_us/parameters/gov/states/ny/otda/ssp/residential_care_downstate_premium.yaml new file mode 100644 index 00000000000..90793eda2dd --- /dev/null +++ b/policyengine_us/parameters/gov/states/ny/otda/ssp/residential_care_downstate_premium.yaml @@ -0,0 +1,12 @@ +description: New York adds this monthly amount per person to the residential care rate in downstate counties. +values: + '2026-01-01': 30 +metadata: + unit: currency-USD + label: New York SSP residential care downstate premium + reference: + - title: 'New York 2026 SSI and SSP maximum monthly benefit levels #page 1-2' + href: https://opwdd.ny.gov/system/files/documents/2025/11/25-inf-06-attachment-1.pdf#page=1 + - title: New York Social Services Law section 209 + href: https://www.nysenate.gov/legislation/laws/SOS/209 + period: month diff --git a/policyengine_us/parameters/gov/states/ny/otda/ssp/student_minor_age.yaml b/policyengine_us/parameters/gov/states/ny/otda/ssp/student_minor_age.yaml new file mode 100644 index 00000000000..4b1926593f9 --- /dev/null +++ b/policyengine_us/parameters/gov/states/ny/otda/ssp/student_minor_age.yaml @@ -0,0 +1,9 @@ +description: New York treats an unmarried student who is not a household head as a minor below this age. +values: + '2014-10-01': 22 +metadata: + unit: year + label: New York SSP student minor age + reference: + - title: 18 NYCRR 398-2.1(t), Minor child + href: https://www.law.cornell.edu/regulations/new-york/18-NYCRR-398-2.1 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..663905a27ca 100644 --- a/policyengine_us/parameters/gov/usda/snap/income/sources/unearned.yaml +++ b/policyengine_us/parameters/gov/usda/snap/income/sources/unearned.yaml @@ -36,6 +36,7 @@ values: - hi_oss - id_aabd - in_ssp + - ny_ssp - ks_sspp - ky_ssp - la_oss @@ -95,9 +96,7 @@ values: metadata: reference: - - title: 7 CFR 273.9(b)(2) - href: https://www.law.cornell.edu/cfr/text/7/273.9#b_2 - - title: 7 CFR 273.9(c)(1) - href: https://www.law.cornell.edu/cfr/text/7/273.9#c_1 + - title: 7 CFR 273.9(b)(2) and (c)(1), (5) + href: https://www.law.cornell.edu/cfr/text/7/273.9 - title: POMS SI 01401.001 General Information about State Supplementation href: https://secure.ssa.gov/poms.nsf/lnx/0501401001 diff --git a/policyengine_us/programs.yaml b/policyengine_us/programs.yaml index 05cb1d13747..14a36a298b1 100644 --- a/policyengine_us/programs.yaml +++ b/policyengine_us/programs.yaml @@ -1090,6 +1090,19 @@ programs: tracks. Unmodeled paths: grandfathered medically-needy-in-medical- institution recipients per WAC 388-478-0055(2)(b); DDA-determined / PVL track per (2)(f); and foster child in BRS per (2)(g). + - state: NY + status: partial + name: New York SSP + full_name: New York State Supplement Program + variable: ny_ssp + parameter_prefix: gov.states.ny.otda.ssp + verified_years: '2026' + notes: Models the 2026 individual and couple rates, downstate care premiums, income taper, + minimum payment, and institutional personal-needs allowance. Certified care, separate-food + household exceptions and separate institutional SSI claims require explicit inputs. + Regular student status accepts an explicit regular-attendance determination, + with full-time student status as the fallback. Grandfathered mandatory payments + are not modeled. - id: social_security name: Social Security diff --git a/policyengine_us/tests/policy/baseline/gov/states/ny/otda/ssp/integration.yaml b/policyengine_us/tests/policy/baseline/gov/states/ny/otda/ssp/integration.yaml new file mode 100644 index 00000000000..5f00d3d2a7a --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/ny/otda/ssp/integration.yaml @@ -0,0 +1,198 @@ +- name: Case 1, couple living alone. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + first: + age: 65 + second: + age: 65 + marital_units: + couple: + members: + - first + - second + tax_units: + unit: + members: + - first + - second + households: + household: + members: + - first + - second + state_code: NY + county: ALBANY_COUNTY_NY + output: + ny_ssp: + - 52 + - 52 +- name: Case 2, family care couple. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + first: + age: 65 + ny_ssp_living_arrangement: FAMILY_CARE + second: + age: 65 + ny_ssp_living_arrangement: FAMILY_CARE + marital_units: + couple: + members: + - first + - second + tax_units: + unit: + members: + - first + - second + households: + household: + members: + - first + - second + state_code: NY + county: NEW_YORK_COUNTY_NY + output: + ny_ssp: + - 514.98 + - 514.98 +- name: Case 3, residential care couple. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + first: + age: 65 + ny_ssp_living_arrangement: RESIDENTIAL_CARE + second: + age: 65 + ny_ssp_living_arrangement: RESIDENTIAL_CARE + marital_units: + couple: + members: + - first + - second + tax_units: + unit: + members: + - first + - second + households: + household: + members: + - first + - second + state_code: NY + county: ALBANY_COUNTY_NY + output: + ny_ssp: + - 653.5 + - 653.5 +- name: Case 4, enhanced residential care couple. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + first: + age: 65 + ny_ssp_living_arrangement: ENHANCED_RESIDENTIAL_CARE + second: + age: 65 + ny_ssp_living_arrangement: ENHANCED_RESIDENTIAL_CARE + marital_units: + couple: + members: + - first + - second + tax_units: + unit: + members: + - first + - second + households: + household: + members: + - first + - second + state_code: NY + county: ALBANY_COUNTY_NY + output: + ny_ssp: + - 942.5 + - 942.5 +- name: Case 5, ineligible spouse uses living with others. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + first: + age: 65 + second: + age: 40 + marital_units: + couple: + members: + - first + - second + tax_units: + unit: + members: + - first + - second + households: + household: + members: + - first + - second + state_code: NY + county: ALBANY_COUNTY_NY + output: + ny_ssp: + - 23 + - 0 +- name: Case 6, spouse deemed income reduces state payment. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + first: + age: 65 + second: + age: 40 + social_security_retirement: 18408 + marital_units: + couple: + members: + - first + - second + tax_units: + unit: + members: + - first + - second + households: + household: + members: + - first + - second + state_code: NY + county: ALBANY_COUNTY_NY + output: + ny_ssp: + - 23 + - 0 +- name: Case 7, annual benefit and SNAP income. + period: '2026' + absolute_error_margin: 0.01 + input: + state_code: NY + age: 65 + output: + ny_ssp: 1044 + household_state_benefits: 1044 + snap_unearned_income: 12972 + hud_unearned_income: 12972 diff --git a/policyengine_us/tests/policy/baseline/gov/states/ny/otda/ssp/ny_ssp.yaml b/policyengine_us/tests/policy/baseline/gov/states/ny/otda/ssp/ny_ssp.yaml new file mode 100644 index 00000000000..7ba2d9beb86 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/ny/otda/ssp/ny_ssp.yaml @@ -0,0 +1,321 @@ +- name: Case 1, living alone. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: NY + age: 65 + output: + ny_ssp: 87 +- name: Case 2, living with others. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: NY + age: 65 + ny_ssp_living_arrangement: LIVING_WITH_OTHERS + output: + ny_ssp: 23 +- name: Case 3, federal household reduction. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: NY + age: 65 + ssi_lives_in_another_persons_household: true + ssi_receives_shelter_from_others_in_household: true + ssi_others_pay_all_meals: true + output: + ny_ssp: 23 +- name: Case 4, family_care in albany_county_ny. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: NY + age: 65 + ny_ssp_living_arrangement: FAMILY_CARE + county: ALBANY_COUNTY_NY + output: + ny_ssp: 228.48 +- name: Case 5, family_care in bronx_county_ny. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: NY + age: 65 + ny_ssp_living_arrangement: FAMILY_CARE + county: BRONX_COUNTY_NY + output: + ny_ssp: 266.48 +- name: Case 6, family_care in nassau_county_ny. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: NY + age: 65 + ny_ssp_living_arrangement: FAMILY_CARE + county: NASSAU_COUNTY_NY + output: + ny_ssp: 266.48 +- name: Case 7, residential_care in albany_county_ny. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: NY + age: 65 + ny_ssp_living_arrangement: RESIDENTIAL_CARE + county: ALBANY_COUNTY_NY + output: + ny_ssp: 405 +- name: Case 8, residential_care in westchester_county_ny. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: NY + age: 65 + ny_ssp_living_arrangement: RESIDENTIAL_CARE + county: WESTCHESTER_COUNTY_NY + output: + ny_ssp: 435 +- name: Case 9, enhanced_residential_care in albany_county_ny. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: NY + age: 65 + ny_ssp_living_arrangement: ENHANCED_RESIDENTIAL_CARE + county: ALBANY_COUNTY_NY + output: + ny_ssp: 694 +- name: Case 10, state only payment. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: NY + age: 65 + social_security_retirement: 12360 + output: + ny_ssp: 71 +- name: Case 11, state minimum payment. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: NY + age: 65 + social_security_retirement: 13209 + output: + ny_ssp: 1 +- name: Case 12, income cutoff. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: NY + age: 65 + social_security_retirement: 13212 + output: + ny_ssp: 0 +- name: Case 13, excess resources. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: NY + age: 65 + ssi_countable_resources: 2001 + output: + ny_ssp: 0 +- name: Case 14, nonresident. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: NJ + age: 65 + output: + ny_ssp: 0 +- name: Case 15, no aged blind or disability eligibility. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: NY + age: 30 + output: + ny_ssp: 0 +- name: Case 16, does not apply for SSI. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: NY + age: 65 + takes_up_ssi_if_eligible: false + output: + ny_ssp: 0 +- name: Case 17, excluded institution. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: NY + age: 65 + ny_ssp_living_arrangement: NONE + output: + ny_ssp: 0 +- name: Case 18, nursing facility personal needs. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: NY + age: 65 + ssi_lives_in_medical_treatment_facility: true + ssi_medicaid_pays_majority_of_care: true + ny_ssp_living_arrangement: NURSING_FACILITY + output: + ny_ssp: 25 +- name: Case 19, other medical personal needs. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: NY + age: 65 + ssi_lives_in_medical_treatment_facility: true + ssi_medicaid_pays_majority_of_care: true + output: + ny_ssp: 5 +- name: Case 20, nursing facility countable income prevents personal needs. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: NY + age: 65 + ssi_lives_in_medical_treatment_facility: true + ssi_medicaid_pays_majority_of_care: true + ny_ssp_living_arrangement: NURSING_FACILITY + social_security_retirement: 252 + output: + ny_ssp: 0 +- name: Case 21, excluded income does not prevent personal needs. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: NY + age: 65 + ssi_lives_in_medical_treatment_facility: true + ssi_medicaid_pays_majority_of_care: true + ny_ssp_living_arrangement: NURSING_FACILITY + social_security_retirement: 240 + output: + ny_ssp: 25 +- name: Case 22, institution without Medicaid paying majority. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: NY + age: 65 + ssi_lives_in_medical_treatment_facility: true + output: + ny_ssp: 0 +- name: Case 23, nursing facility without federal institutional classification. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: NY + age: 65 + ny_ssp_living_arrangement: NURSING_FACILITY + output: + ny_ssp: 0 +- name: Case 24, minor in enhanced care receives household rate. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: NY + age: 17 + is_blind: true + is_full_time_student: false + ny_ssp_living_arrangement: ENHANCED_RESIDENTIAL_CARE + output: + ny_ssp: 23 +- name: Case 25, student under twenty two is a minor. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: NY + age: 21 + is_blind: true + is_full_time_student: true + ny_ssp_living_arrangement: ENHANCED_RESIDENTIAL_CARE + output: + ny_ssp: 23 +- name: Case 26, student at age twenty two receives care rate. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: NY + age: 22 + is_blind: true + is_full_time_student: true + ny_ssp_living_arrangement: ENHANCED_RESIDENTIAL_CARE + output: + ny_ssp: 694 +- name: Case 27, certified minor family placement receives care rate. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: NY + age: 17 + is_blind: true + is_full_time_student: false + ny_ssp_living_arrangement: FAMILY_CARE + output: + ny_ssp: 228.48 + +# 18 NYCRR 398-2.1(t), 398-4.5(e): regular attendance is broader than full-time study. +# The certified true input represents qualifying eight-hour-per-week college attendance. +# https://www.law.cornell.edu/regulations/new-york/18-NYCRR-398-2.1 +- name: Case 28, certified regularly attending part-time college student receives minor rate. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: NY + age: 20 + is_blind: true + is_part_time_college_student: true + ny_ssp_regularly_attends_school: true + is_household_head: false + ny_ssp_living_arrangement: ENHANCED_RESIDENTIAL_CARE + output: + ny_ssp: 23 +- name: Case 29, nonregular part-time attendance does not confer minor status. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: NY + age: 20 + is_blind: true + is_part_time_college_student: true + ny_ssp_regularly_attends_school: false + is_household_head: false + ny_ssp_living_arrangement: ENHANCED_RESIDENTIAL_CARE + output: + ny_ssp: 694 +- name: Case 30, regularly attending student who is household head receives adult rate. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: NY + age: 20 + is_blind: true + is_part_time_college_student: true + ny_ssp_regularly_attends_school: true + is_household_head: true + ny_ssp_living_arrangement: ENHANCED_RESIDENTIAL_CARE + output: + ny_ssp: 694 +- name: Case 31, regular student at age twenty-two receives adult rate. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: NY + age: 22 + is_blind: true + is_part_time_college_student: true + ny_ssp_regularly_attends_school: true + is_household_head: false + ny_ssp_living_arrangement: ENHANCED_RESIDENTIAL_CARE + output: + ny_ssp: 694 diff --git a/policyengine_us/tests/policy/baseline/gov/states/ny/otda/ssp/ny_ssp_regularly_attends_school.yaml b/policyengine_us/tests/policy/baseline/gov/states/ny/otda/ssp/ny_ssp_regularly_attends_school.yaml new file mode 100644 index 00000000000..2881a3991ff --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/ny/otda/ssp/ny_ssp_regularly_attends_school.yaml @@ -0,0 +1,13 @@ +# Regular attendance may be supplied when the existing full-time input cannot establish the rule. +- name: Case 1, full-time college study supplies regular attendance by default. + period: 2026 + input: + is_full_time_college_student: true + output: + ny_ssp_regularly_attends_school: true +- name: Case 2, part-time enrollment alone does not establish qualifying weekly hours. + period: 2026 + input: + is_part_time_college_student: true + output: + ny_ssp_regularly_attends_school: false 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/ny/otda/ssp/ny_ssp.py b/policyengine_us/variables/gov/states/ny/otda/ssp/ny_ssp.py new file mode 100644 index 00000000000..973c89e87a9 --- /dev/null +++ b/policyengine_us/variables/gov/states/ny/otda/ssp/ny_ssp.py @@ -0,0 +1,74 @@ +from policyengine_us.model_api import * +from policyengine_us.variables.gov.ssa.ssi._ssi_state_supplement import ( + ssi_state_supplement, +) +from policyengine_us.variables.gov.ssa.ssi.eligibility.status.ssi_federal_living_arrangement import ( + SSIFederalLivingArrangement, +) + + +class ny_ssp(Variable): + value_type = float + entity = Person + label = "New York State Supplement Program payment" + unit = USD + definition_period = MONTH + defined_for = StateCode.NY + reference = ( + "https://www.nysenate.gov/legislation/laws/SOS/209", + "https://www.law.cornell.edu/regulations/new-york/18-NYCRR-398-3.2", + "https://www.law.cornell.edu/regulations/new-york/18-NYCRR-398-4.6", + ) + + def formula(person, period, parameters): + p = parameters(period).gov.states.ny.otda.ssp + arrangement = person("ny_ssp_living_arrangement", period) + la = arrangement.possible_values + # A minor in level III receives the living-with-others rate. + minor = person("ny_ssp_is_minor", period.this_year) + minor_enhanced_care = minor & (arrangement == la.ENHANCED_RESIDENTIAL_CARE) + county = person.household("county_str", period.this_year) + downstate = np.isin(county, p.downstate_counties) + premium = downstate * select( + [arrangement == la.FAMILY_CARE, arrangement == la.RESIDENTIAL_CARE], + [p.family_care_downstate_premium, p.residential_care_downstate_premium], + default=0, + ) + individual = where( + minor_enhanced_care, + p.amount.individual.LIVING_WITH_OTHERS, + p.amount.individual[arrangement] + premium, + ) + couple = where( + minor_enhanced_care, + p.amount.couple.LIVING_WITH_OTHERS, + p.amount.couple[arrangement] + 2 * premium, + ) + payment = ssi_state_supplement( + person, + period, + parameters, + individual, + couple, + federal_payment_rules=False, + ) + payment = where(payment > 0, max_(payment, p.minimum_payment), 0) + federal = person("ssi_federal_living_arrangement", period) + medical = federal == SSIFederalLivingArrangement.MEDICAL_TREATMENT_FACILITY + personal_needs_eligible = ( + medical + & (person("ssi", period) > 0) + & (person("ssi_countable_income", period) == 0) + ) + personal_needs = select( + [ + arrangement == la.NURSING_FACILITY, + arrangement == la.OTHER_MEDICAL_FACILITY, + ], + [ + p.personal_needs.nursing_facility, + p.personal_needs.other_medical_facility, + ], + default=0, + ) + return payment + personal_needs_eligible * personal_needs diff --git a/policyengine_us/variables/gov/states/ny/otda/ssp/ny_ssp_is_minor.py b/policyengine_us/variables/gov/states/ny/otda/ssp/ny_ssp_is_minor.py new file mode 100644 index 00000000000..101b514c38c --- /dev/null +++ b/policyengine_us/variables/gov/states/ny/otda/ssp/ny_ssp_is_minor.py @@ -0,0 +1,20 @@ +from policyengine_us.model_api import * + + +class ny_ssp_is_minor(Variable): + value_type = bool + entity = Person + label = "Minor for New York State Supplement Program living arrangements" + definition_period = YEAR + reference = "https://www.law.cornell.edu/regulations/new-york/18-NYCRR-398-2.1" + + def formula(person, period, parameters): + p = parameters(period).gov.states.ny.otda.ssp + age = person("age", period) + student = person("ny_ssp_regularly_attends_school", period) + return (age < p.minor_age) | ( + (age < p.student_minor_age) + & student + & ~person.family("is_married", period) + & ~person("is_household_head", period) + ) diff --git a/policyengine_us/variables/gov/states/ny/otda/ssp/ny_ssp_living_arrangement.py b/policyengine_us/variables/gov/states/ny/otda/ssp/ny_ssp_living_arrangement.py new file mode 100644 index 00000000000..cc4fd900562 --- /dev/null +++ b/policyengine_us/variables/gov/states/ny/otda/ssp/ny_ssp_living_arrangement.py @@ -0,0 +1,51 @@ +from policyengine_us.model_api import * +from policyengine_us.variables.gov.ssa.ssi.eligibility.status.ssi_federal_living_arrangement import ( + SSIFederalLivingArrangement, +) + + +class NYSSPLivingArrangement(Enum): + LIVING_ALONE = "Living alone" + LIVING_WITH_OTHERS = "Living with others" + FAMILY_CARE = "Certified congregate care level I" + RESIDENTIAL_CARE = "Certified congregate care level II" + ENHANCED_RESIDENTIAL_CARE = "Certified congregate care level III" + NURSING_FACILITY = "Department of Health licensed nursing facility" + OTHER_MEDICAL_FACILITY = "Other qualifying Medicaid medical facility" + NONE = "No eligible New York living arrangement" + + +class ny_ssp_living_arrangement(Variable): + value_type = Enum + entity = Person + label = "New York State Supplement Program living arrangement" + definition_period = MONTH + defined_for = StateCode.NY + possible_values = NYSSPLivingArrangement + default_value = NYSSPLivingArrangement.NONE + reference = "https://www.law.cornell.edu/regulations/new-york/18-NYCRR-398-4.5" + documentation = """ + Set certified care categories explicitly. Family and residential care for + minors require the authorized placements specified in 18 NYCRR 398-4.5. + The formula uses household membership; set LIVING_ALONE explicitly for + qualifying separate-food, room-and-board, foster-child or attendant cases. + Use NONE for excluded public facilities and emergency shelters. Nursing + facilities must be identified explicitly; other Medicaid institutions use + the lower medical-facility allowance. Set SSI claim status explicitly for + institutional couples after their month of entry. + """ + + def formula(person, period, parameters): + la = NYSSPLivingArrangement + federal = person("ssi_federal_living_arrangement", period) + medical = federal == SSIFederalLivingArrangement.MEDICAL_TREATMENT_FACILITY + excluded = person("ssi_lives_in_medical_treatment_facility", period) & ~medical + other = federal == SSIFederalLivingArrangement.ANOTHER_PERSONS_HOUSEHOLD + joint = person("ssi_couple_computation_applies", period) + alone = person.household.nb_persons() == where(joint, 2, 1) + minor = person("ny_ssp_is_minor", period.this_year) + return select( + [excluded, medical, other | minor | ~alone], + [la.NONE, la.OTHER_MEDICAL_FACILITY, la.LIVING_WITH_OTHERS], + default=la.LIVING_ALONE, + ) diff --git a/policyengine_us/variables/gov/states/ny/otda/ssp/ny_ssp_regularly_attends_school.py b/policyengine_us/variables/gov/states/ny/otda/ssp/ny_ssp_regularly_attends_school.py new file mode 100644 index 00000000000..41ec158f450 --- /dev/null +++ b/policyengine_us/variables/gov/states/ny/otda/ssp/ny_ssp_regularly_attends_school.py @@ -0,0 +1,20 @@ +from policyengine_us.model_api import * + + +class ny_ssp_regularly_attends_school(Variable): + value_type = bool + entity = Person + label = "Regularly attends school for New York SSP" + definition_period = YEAR + reference = ( + "https://www.law.cornell.edu/regulations/new-york/18-NYCRR-398-2.1", + "https://www.law.cornell.edu/cfr/text/20/416.1861", + ) + # Regular attendance under 20 CFR 416.1861, including qualifying part-time college + # attendance (normally at least eight hours weekly), school or vocational training + # and permitted reduced attendance or temporary absence. Full-time enrollment is the + # fallback. Supply the actual attendance determination for other students; the + # generic half-time college flag does not establish the required hours. + + def formula(person, period, parameters): + return person("is_full_time_student", period) 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..dd4884e88d9 100644 --- a/policyengine_us/variables/household/income/spm_unit/spm_unit_benefits.py +++ b/policyengine_us/variables/household/income/spm_unit/spm_unit_benefits.py @@ -22,6 +22,7 @@ def formula(spm_unit, period, parameters): "ky_ssp", # Kentucky benefits "de_ssp", # Delaware benefits "fl_oss", + "ny_ssp", "ks_sspp", # Kansas benefits "hi_oss", "la_oss", # Louisiana benefits From 851f37299061c744aa0c7608ac257482e7d0014a Mon Sep 17 00:00:00 2001 From: Ziming Date: Tue, 13 Oct 2026 01:00:27 -0400 Subject: [PATCH 2/4] Normalize New York SSP parameter and test formatting --- .../household/household_state_benefits.yaml | 1 + .../hud/annual_income/sources/unearned.yaml | 1 + .../ssi/state_supplement/minimum_payment.yaml | 1 + .../gov/states/ny/otda/ssp/amount/couple.yaml | 38 +++-- .../states/ny/otda/ssp/amount/individual.yaml | 38 +++-- .../ny/otda/ssp/downstate_counties.yaml | 29 ++-- .../ssp/family_care_downstate_premium.yaml | 13 +- .../states/ny/otda/ssp/minimum_payment.yaml | 12 +- .../gov/states/ny/otda/ssp/minor_age.yaml | 7 +- .../ssp/personal_needs/nursing_facility.yaml | 13 +- .../other_medical_facility.yaml | 13 +- .../residential_care_downstate_premium.yaml | 13 +- .../states/ny/otda/ssp/student_minor_age.yaml | 7 +- .../gov/states/ny/otda/ssp/integration.yaml | 138 ++++++------------ .../gov/states/ny/otda/ssp/ny_ssp.yaml | 37 ++++- .../ssp/ny_ssp_regularly_attends_school.yaml | 1 + 16 files changed, 188 insertions(+), 174 deletions(-) diff --git a/policyengine_us/parameters/gov/household/household_state_benefits.yaml b/policyengine_us/parameters/gov/household/household_state_benefits.yaml index 3fe5d2eeb71..e958eeafdd0 100644 --- a/policyengine_us/parameters/gov/household/household_state_benefits.yaml +++ b/policyengine_us/parameters/gov/household/household_state_benefits.yaml @@ -405,6 +405,7 @@ values: - nj_property_tax_relief # New York benefits - ny_child_care_subsidies + metadata: unit: list period: year diff --git a/policyengine_us/parameters/gov/hud/annual_income/sources/unearned.yaml b/policyengine_us/parameters/gov/hud/annual_income/sources/unearned.yaml index 20358b77075..dda1c6001e4 100644 --- a/policyengine_us/parameters/gov/hud/annual_income/sources/unearned.yaml +++ b/policyengine_us/parameters/gov/hud/annual_income/sources/unearned.yaml @@ -30,6 +30,7 @@ values: - disability_benefits - survivor_benefits - financial_assistance + metadata: unit: list period: year 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/ny/otda/ssp/amount/couple.yaml b/policyengine_us/parameters/gov/states/ny/otda/ssp/amount/couple.yaml index 685f29744b0..094b5573c4a 100644 --- a/policyengine_us/parameters/gov/states/ny/otda/ssp/amount/couple.yaml +++ b/policyengine_us/parameters/gov/states/ny/otda/ssp/amount/couple.yaml @@ -1,29 +1,37 @@ -description: New York provides these monthly State Supplement Program rates for an eligible couple, excluding - the downstate care premium. +description: New York provides these monthly State Supplement Program rates for an eligible couple, excluding the downstate care premium. + metadata: unit: currency-USD period: month label: New York SSP couple amount breakdown: - - ny_ssp_living_arrangement + - ny_ssp_living_arrangement reference: - - title: 'New York 2026 SSI and SSP maximum monthly benefit levels #page 1-2' - href: https://opwdd.ny.gov/system/files/documents/2025/11/25-inf-06-attachment-1.pdf#page=1 - - title: New York Social Services Law section 209 - href: https://www.nysenate.gov/legislation/laws/SOS/209 + - title: "New York 2026 SSI and SSP maximum monthly benefit levels #page 1-2" + href: https://opwdd.ny.gov/system/files/documents/2025/11/25-inf-06-attachment-1.pdf#page=1 + - title: New York Social Services Law section 209 + href: https://www.nysenate.gov/legislation/laws/SOS/209 + LIVING_ALONE: - '2026-01-01': 104 + 2026-01-01: 104 + LIVING_WITH_OTHERS: - '2026-01-01': 46 + 2026-01-01: 46 + FAMILY_CARE: - '2026-01-01': 953.96 + 2026-01-01: 953.96 + RESIDENTIAL_CARE: - '2026-01-01': 1307 + 2026-01-01: 1_307 + ENHANCED_RESIDENTIAL_CARE: - '2026-01-01': 1885 + 2026-01-01: 1_885 + NURSING_FACILITY: - '2026-01-01': 0 + 2026-01-01: 0 + OTHER_MEDICAL_FACILITY: - '2026-01-01': 0 + 2026-01-01: 0 + NONE: - '2026-01-01': 0 + 2026-01-01: 0 diff --git a/policyengine_us/parameters/gov/states/ny/otda/ssp/amount/individual.yaml b/policyengine_us/parameters/gov/states/ny/otda/ssp/amount/individual.yaml index 6468a67c3dd..422d3bf0fb0 100644 --- a/policyengine_us/parameters/gov/states/ny/otda/ssp/amount/individual.yaml +++ b/policyengine_us/parameters/gov/states/ny/otda/ssp/amount/individual.yaml @@ -1,29 +1,37 @@ -description: New York provides these monthly State Supplement Program rates for an eligible individual, - excluding the downstate care premium. +description: New York provides these monthly State Supplement Program rates for an eligible individual, excluding the downstate care premium. + metadata: unit: currency-USD period: month label: New York SSP individual amount breakdown: - - ny_ssp_living_arrangement + - ny_ssp_living_arrangement reference: - - title: 'New York 2026 SSI and SSP maximum monthly benefit levels #page 1-2' - href: https://opwdd.ny.gov/system/files/documents/2025/11/25-inf-06-attachment-1.pdf#page=1 - - title: New York Social Services Law section 209 - href: https://www.nysenate.gov/legislation/laws/SOS/209 + - title: "New York 2026 SSI and SSP maximum monthly benefit levels #page 1-2" + href: https://opwdd.ny.gov/system/files/documents/2025/11/25-inf-06-attachment-1.pdf#page=1 + - title: New York Social Services Law section 209 + href: https://www.nysenate.gov/legislation/laws/SOS/209 + LIVING_ALONE: - '2026-01-01': 87 + 2026-01-01: 87 + LIVING_WITH_OTHERS: - '2026-01-01': 23 + 2026-01-01: 23 + FAMILY_CARE: - '2026-01-01': 228.48 + 2026-01-01: 228.48 + RESIDENTIAL_CARE: - '2026-01-01': 405 + 2026-01-01: 405 + ENHANCED_RESIDENTIAL_CARE: - '2026-01-01': 694 + 2026-01-01: 694 + NURSING_FACILITY: - '2026-01-01': 0 + 2026-01-01: 0 + OTHER_MEDICAL_FACILITY: - '2026-01-01': 0 + 2026-01-01: 0 + NONE: - '2026-01-01': 0 + 2026-01-01: 0 diff --git a/policyengine_us/parameters/gov/states/ny/otda/ssp/downstate_counties.yaml b/policyengine_us/parameters/gov/states/ny/otda/ssp/downstate_counties.yaml index 65034c49673..bd330b35766 100644 --- a/policyengine_us/parameters/gov/states/ny/otda/ssp/downstate_counties.yaml +++ b/policyengine_us/parameters/gov/states/ny/otda/ssp/downstate_counties.yaml @@ -1,20 +1,21 @@ description: New York pays higher family and residential care supplements in these counties. values: - '2026-01-01': - - BRONX_COUNTY_NY - - KINGS_COUNTY_NY - - NEW_YORK_COUNTY_NY - - QUEENS_COUNTY_NY - - RICHMOND_COUNTY_NY - - NASSAU_COUNTY_NY - - ROCKLAND_COUNTY_NY - - SUFFOLK_COUNTY_NY - - WESTCHESTER_COUNTY_NY + 2026-01-01: + - BRONX_COUNTY_NY + - KINGS_COUNTY_NY + - NEW_YORK_COUNTY_NY + - QUEENS_COUNTY_NY + - RICHMOND_COUNTY_NY + - NASSAU_COUNTY_NY + - ROCKLAND_COUNTY_NY + - SUFFOLK_COUNTY_NY + - WESTCHESTER_COUNTY_NY + metadata: unit: list label: New York SSP downstate care counties reference: - - title: 'New York 2026 SSI and SSP maximum monthly benefit levels #page 1-2' - href: https://opwdd.ny.gov/system/files/documents/2025/11/25-inf-06-attachment-1.pdf#page=1 - - title: New York Social Services Law section 209 - href: https://www.nysenate.gov/legislation/laws/SOS/209 + - title: "New York 2026 SSI and SSP maximum monthly benefit levels #page 1-2" + href: https://opwdd.ny.gov/system/files/documents/2025/11/25-inf-06-attachment-1.pdf#page=1 + - title: New York Social Services Law section 209 + href: https://www.nysenate.gov/legislation/laws/SOS/209 diff --git a/policyengine_us/parameters/gov/states/ny/otda/ssp/family_care_downstate_premium.yaml b/policyengine_us/parameters/gov/states/ny/otda/ssp/family_care_downstate_premium.yaml index f3ca44243c4..30f93166366 100644 --- a/policyengine_us/parameters/gov/states/ny/otda/ssp/family_care_downstate_premium.yaml +++ b/policyengine_us/parameters/gov/states/ny/otda/ssp/family_care_downstate_premium.yaml @@ -1,12 +1,13 @@ description: New York adds this monthly amount per person to the family care rate in downstate counties. values: - '2026-01-01': 38 + 2026-01-01: 38 + metadata: unit: currency-USD + period: month label: New York SSP family care downstate premium reference: - - title: 'New York 2026 SSI and SSP maximum monthly benefit levels #page 1-2' - href: https://opwdd.ny.gov/system/files/documents/2025/11/25-inf-06-attachment-1.pdf#page=1 - - title: New York Social Services Law section 209 - href: https://www.nysenate.gov/legislation/laws/SOS/209 - period: month + - title: "New York 2026 SSI and SSP maximum monthly benefit levels #page 1-2" + href: https://opwdd.ny.gov/system/files/documents/2025/11/25-inf-06-attachment-1.pdf#page=1 + - title: New York Social Services Law section 209 + href: https://www.nysenate.gov/legislation/laws/SOS/209 diff --git a/policyengine_us/parameters/gov/states/ny/otda/ssp/minimum_payment.yaml b/policyengine_us/parameters/gov/states/ny/otda/ssp/minimum_payment.yaml index 15f61f7e742..802737c6c26 100644 --- a/policyengine_us/parameters/gov/states/ny/otda/ssp/minimum_payment.yaml +++ b/policyengine_us/parameters/gov/states/ny/otda/ssp/minimum_payment.yaml @@ -1,11 +1,11 @@ -description: New York provides at least this monthly State Supplement Program payment when the computed - benefit is positive. +description: New York provides at least this monthly State Supplement Program payment when the computed benefit is positive. values: - '2014-10-01': 1 + 2014-10-01: 1 + metadata: unit: currency-USD + period: month label: New York SSP minimum payment reference: - - title: 18 NYCRR 398-4.6(c), Payment of SSP benefits - href: https://www.law.cornell.edu/regulations/new-york/18-NYCRR-398-4.6 - period: month + - title: 18 NYCRR 398-4.6(c), Payment of SSP benefits + href: https://www.law.cornell.edu/regulations/new-york/18-NYCRR-398-4.6 diff --git a/policyengine_us/parameters/gov/states/ny/otda/ssp/minor_age.yaml b/policyengine_us/parameters/gov/states/ny/otda/ssp/minor_age.yaml index dc143d18570..202c588a79c 100644 --- a/policyengine_us/parameters/gov/states/ny/otda/ssp/minor_age.yaml +++ b/policyengine_us/parameters/gov/states/ny/otda/ssp/minor_age.yaml @@ -1,9 +1,10 @@ description: New York treats people below this age as minors for State Supplement Program living arrangements. values: - '2014-10-01': 18 + 2014-10-01: 18 + metadata: unit: year label: New York SSP minor age reference: - - title: 18 NYCRR 398-2.1(t), Minor child - href: https://www.law.cornell.edu/regulations/new-york/18-NYCRR-398-2.1 + - title: 18 NYCRR 398-2.1(t), Minor child + href: https://www.law.cornell.edu/regulations/new-york/18-NYCRR-398-2.1 diff --git a/policyengine_us/parameters/gov/states/ny/otda/ssp/personal_needs/nursing_facility.yaml b/policyengine_us/parameters/gov/states/ny/otda/ssp/personal_needs/nursing_facility.yaml index 2745b40e3cc..df4e5b5db0a 100644 --- a/policyengine_us/parameters/gov/states/ny/otda/ssp/personal_needs/nursing_facility.yaml +++ b/policyengine_us/parameters/gov/states/ny/otda/ssp/personal_needs/nursing_facility.yaml @@ -1,12 +1,13 @@ description: New York provides this monthly state personal needs allowance in this medical facility category. values: - '1988-01-01': 25 + 1988-01-01: 25 + metadata: unit: currency-USD + period: month label: New York SSP nursing facility personal needs allowance reference: - - title: 'New York 2026 SSI and SSP maximum monthly benefit levels #page 1-2' - href: https://opwdd.ny.gov/system/files/documents/2025/11/25-inf-06-attachment-1.pdf#page=1 - - title: New York Social Services Law section 209 - href: https://www.nysenate.gov/legislation/laws/SOS/209 - period: month + - title: "New York 2026 SSI and SSP maximum monthly benefit levels #page 1-2" + href: https://opwdd.ny.gov/system/files/documents/2025/11/25-inf-06-attachment-1.pdf#page=1 + - title: New York Social Services Law section 209 + href: https://www.nysenate.gov/legislation/laws/SOS/209 diff --git a/policyengine_us/parameters/gov/states/ny/otda/ssp/personal_needs/other_medical_facility.yaml b/policyengine_us/parameters/gov/states/ny/otda/ssp/personal_needs/other_medical_facility.yaml index 81edd6597f8..0f2480c351e 100644 --- a/policyengine_us/parameters/gov/states/ny/otda/ssp/personal_needs/other_medical_facility.yaml +++ b/policyengine_us/parameters/gov/states/ny/otda/ssp/personal_needs/other_medical_facility.yaml @@ -1,12 +1,13 @@ description: New York provides this monthly state personal needs allowance in this medical facility category. values: - '1988-01-01': 5 + 1988-01-01: 5 + metadata: unit: currency-USD + period: month label: New York SSP other medical facility personal needs allowance reference: - - title: 'New York 2026 SSI and SSP maximum monthly benefit levels #page 1-2' - href: https://opwdd.ny.gov/system/files/documents/2025/11/25-inf-06-attachment-1.pdf#page=1 - - title: New York Social Services Law section 209 - href: https://www.nysenate.gov/legislation/laws/SOS/209 - period: month + - title: "New York 2026 SSI and SSP maximum monthly benefit levels #page 1-2" + href: https://opwdd.ny.gov/system/files/documents/2025/11/25-inf-06-attachment-1.pdf#page=1 + - title: New York Social Services Law section 209 + href: https://www.nysenate.gov/legislation/laws/SOS/209 diff --git a/policyengine_us/parameters/gov/states/ny/otda/ssp/residential_care_downstate_premium.yaml b/policyengine_us/parameters/gov/states/ny/otda/ssp/residential_care_downstate_premium.yaml index 90793eda2dd..8e0a89a2ae0 100644 --- a/policyengine_us/parameters/gov/states/ny/otda/ssp/residential_care_downstate_premium.yaml +++ b/policyengine_us/parameters/gov/states/ny/otda/ssp/residential_care_downstate_premium.yaml @@ -1,12 +1,13 @@ description: New York adds this monthly amount per person to the residential care rate in downstate counties. values: - '2026-01-01': 30 + 2026-01-01: 30 + metadata: unit: currency-USD + period: month label: New York SSP residential care downstate premium reference: - - title: 'New York 2026 SSI and SSP maximum monthly benefit levels #page 1-2' - href: https://opwdd.ny.gov/system/files/documents/2025/11/25-inf-06-attachment-1.pdf#page=1 - - title: New York Social Services Law section 209 - href: https://www.nysenate.gov/legislation/laws/SOS/209 - period: month + - title: "New York 2026 SSI and SSP maximum monthly benefit levels #page 1-2" + href: https://opwdd.ny.gov/system/files/documents/2025/11/25-inf-06-attachment-1.pdf#page=1 + - title: New York Social Services Law section 209 + href: https://www.nysenate.gov/legislation/laws/SOS/209 diff --git a/policyengine_us/parameters/gov/states/ny/otda/ssp/student_minor_age.yaml b/policyengine_us/parameters/gov/states/ny/otda/ssp/student_minor_age.yaml index 4b1926593f9..458c222939c 100644 --- a/policyengine_us/parameters/gov/states/ny/otda/ssp/student_minor_age.yaml +++ b/policyengine_us/parameters/gov/states/ny/otda/ssp/student_minor_age.yaml @@ -1,9 +1,10 @@ description: New York treats an unmarried student who is not a household head as a minor below this age. values: - '2014-10-01': 22 + 2014-10-01: 22 + metadata: unit: year label: New York SSP student minor age reference: - - title: 18 NYCRR 398-2.1(t), Minor child - href: https://www.law.cornell.edu/regulations/new-york/18-NYCRR-398-2.1 + - title: 18 NYCRR 398-2.1(t), Minor child + href: https://www.law.cornell.edu/regulations/new-york/18-NYCRR-398-2.1 diff --git a/policyengine_us/tests/policy/baseline/gov/states/ny/otda/ssp/integration.yaml b/policyengine_us/tests/policy/baseline/gov/states/ny/otda/ssp/integration.yaml index 5f00d3d2a7a..45395a2e5b1 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/ny/otda/ssp/integration.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/ny/otda/ssp/integration.yaml @@ -3,196 +3,154 @@ absolute_error_margin: 0.01 input: people: - first: + person1: age: 65 - second: + person2: age: 65 marital_units: couple: - members: - - first - - second + members: [person1, person2] tax_units: unit: - members: - - first - - second + members: [person1, person2] households: household: - members: - - first - - second + members: [person1, person2] state_code: NY county: ALBANY_COUNTY_NY output: - ny_ssp: - - 52 - - 52 + ny_ssp: [52, 52] + - name: Case 2, family care couple. period: 2026-01 absolute_error_margin: 0.01 input: people: - first: + person1: age: 65 ny_ssp_living_arrangement: FAMILY_CARE - second: + person2: age: 65 ny_ssp_living_arrangement: FAMILY_CARE marital_units: couple: - members: - - first - - second + members: [person1, person2] tax_units: unit: - members: - - first - - second + members: [person1, person2] households: household: - members: - - first - - second + members: [person1, person2] state_code: NY county: NEW_YORK_COUNTY_NY output: - ny_ssp: - - 514.98 - - 514.98 + ny_ssp: [514.98, 514.98] + - name: Case 3, residential care couple. period: 2026-01 absolute_error_margin: 0.01 input: people: - first: + person1: age: 65 ny_ssp_living_arrangement: RESIDENTIAL_CARE - second: + person2: age: 65 ny_ssp_living_arrangement: RESIDENTIAL_CARE marital_units: couple: - members: - - first - - second + members: [person1, person2] tax_units: unit: - members: - - first - - second + members: [person1, person2] households: household: - members: - - first - - second + members: [person1, person2] state_code: NY county: ALBANY_COUNTY_NY output: - ny_ssp: - - 653.5 - - 653.5 + ny_ssp: [653.5, 653.5] + - name: Case 4, enhanced residential care couple. period: 2026-01 absolute_error_margin: 0.01 input: people: - first: + person1: age: 65 ny_ssp_living_arrangement: ENHANCED_RESIDENTIAL_CARE - second: + person2: age: 65 ny_ssp_living_arrangement: ENHANCED_RESIDENTIAL_CARE marital_units: couple: - members: - - first - - second + members: [person1, person2] tax_units: unit: - members: - - first - - second + members: [person1, person2] households: household: - members: - - first - - second + members: [person1, person2] state_code: NY county: ALBANY_COUNTY_NY output: - ny_ssp: - - 942.5 - - 942.5 + ny_ssp: [942.5, 942.5] + - name: Case 5, ineligible spouse uses living with others. period: 2026-01 absolute_error_margin: 0.01 input: people: - first: + person1: age: 65 - second: + person2: age: 40 marital_units: couple: - members: - - first - - second + members: [person1, person2] tax_units: unit: - members: - - first - - second + members: [person1, person2] households: household: - members: - - first - - second + members: [person1, person2] state_code: NY county: ALBANY_COUNTY_NY output: - ny_ssp: - - 23 - - 0 + ny_ssp: [23, 0] + - name: Case 6, spouse deemed income reduces state payment. period: 2026-01 absolute_error_margin: 0.01 input: people: - first: + person1: age: 65 - second: + person2: age: 40 - social_security_retirement: 18408 + social_security_retirement: 18_408 marital_units: couple: - members: - - first - - second + members: [person1, person2] tax_units: unit: - members: - - first - - second + members: [person1, person2] households: household: - members: - - first - - second + members: [person1, person2] state_code: NY county: ALBANY_COUNTY_NY output: - ny_ssp: - - 23 - - 0 + ny_ssp: [23, 0] + - name: Case 7, annual benefit and SNAP income. - period: '2026' + period: 2026 absolute_error_margin: 0.01 input: state_code: NY age: 65 output: - ny_ssp: 1044 - household_state_benefits: 1044 - snap_unearned_income: 12972 - hud_unearned_income: 12972 + ny_ssp: 1_044 + household_state_benefits: 1_044 + snap_unearned_income: 12_972 + hud_unearned_income: 12_972 diff --git a/policyengine_us/tests/policy/baseline/gov/states/ny/otda/ssp/ny_ssp.yaml b/policyengine_us/tests/policy/baseline/gov/states/ny/otda/ssp/ny_ssp.yaml index 7ba2d9beb86..f093e7aee0a 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/ny/otda/ssp/ny_ssp.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/ny/otda/ssp/ny_ssp.yaml @@ -6,6 +6,7 @@ age: 65 output: ny_ssp: 87 + - name: Case 2, living with others. period: 2026-01 absolute_error_margin: 0.01 @@ -15,6 +16,7 @@ ny_ssp_living_arrangement: LIVING_WITH_OTHERS output: ny_ssp: 23 + - name: Case 3, federal household reduction. period: 2026-01 absolute_error_margin: 0.01 @@ -26,6 +28,7 @@ ssi_others_pay_all_meals: true output: ny_ssp: 23 + - name: Case 4, family_care in albany_county_ny. period: 2026-01 absolute_error_margin: 0.01 @@ -36,6 +39,7 @@ county: ALBANY_COUNTY_NY output: ny_ssp: 228.48 + - name: Case 5, family_care in bronx_county_ny. period: 2026-01 absolute_error_margin: 0.01 @@ -46,6 +50,7 @@ county: BRONX_COUNTY_NY output: ny_ssp: 266.48 + - name: Case 6, family_care in nassau_county_ny. period: 2026-01 absolute_error_margin: 0.01 @@ -56,6 +61,7 @@ county: NASSAU_COUNTY_NY output: ny_ssp: 266.48 + - name: Case 7, residential_care in albany_county_ny. period: 2026-01 absolute_error_margin: 0.01 @@ -66,6 +72,7 @@ county: ALBANY_COUNTY_NY output: ny_ssp: 405 + - name: Case 8, residential_care in westchester_county_ny. period: 2026-01 absolute_error_margin: 0.01 @@ -76,6 +83,7 @@ county: WESTCHESTER_COUNTY_NY output: ny_ssp: 435 + - name: Case 9, enhanced_residential_care in albany_county_ny. period: 2026-01 absolute_error_margin: 0.01 @@ -86,42 +94,47 @@ county: ALBANY_COUNTY_NY output: ny_ssp: 694 + - name: Case 10, state only payment. period: 2026-01 absolute_error_margin: 0.01 input: state_code: NY age: 65 - social_security_retirement: 12360 + social_security_retirement: 12_360 output: ny_ssp: 71 + - name: Case 11, state minimum payment. period: 2026-01 absolute_error_margin: 0.01 input: state_code: NY age: 65 - social_security_retirement: 13209 + social_security_retirement: 13_209 output: ny_ssp: 1 + - name: Case 12, income cutoff. period: 2026-01 absolute_error_margin: 0.01 input: state_code: NY age: 65 - social_security_retirement: 13212 + social_security_retirement: 13_212 output: ny_ssp: 0 + - name: Case 13, excess resources. period: 2026-01 absolute_error_margin: 0.01 input: state_code: NY age: 65 - ssi_countable_resources: 2001 + ssi_countable_resources: 2_001 output: ny_ssp: 0 + - name: Case 14, nonresident. period: 2026-01 absolute_error_margin: 0.01 @@ -130,6 +143,7 @@ age: 65 output: ny_ssp: 0 + - name: Case 15, no aged blind or disability eligibility. period: 2026-01 absolute_error_margin: 0.01 @@ -138,6 +152,7 @@ age: 30 output: ny_ssp: 0 + - name: Case 16, does not apply for SSI. period: 2026-01 absolute_error_margin: 0.01 @@ -147,6 +162,7 @@ takes_up_ssi_if_eligible: false output: ny_ssp: 0 + - name: Case 17, excluded institution. period: 2026-01 absolute_error_margin: 0.01 @@ -156,6 +172,7 @@ ny_ssp_living_arrangement: NONE output: ny_ssp: 0 + - name: Case 18, nursing facility personal needs. period: 2026-01 absolute_error_margin: 0.01 @@ -167,6 +184,7 @@ ny_ssp_living_arrangement: NURSING_FACILITY output: ny_ssp: 25 + - name: Case 19, other medical personal needs. period: 2026-01 absolute_error_margin: 0.01 @@ -177,6 +195,7 @@ ssi_medicaid_pays_majority_of_care: true output: ny_ssp: 5 + - name: Case 20, nursing facility countable income prevents personal needs. period: 2026-01 absolute_error_margin: 0.01 @@ -189,6 +208,7 @@ social_security_retirement: 252 output: ny_ssp: 0 + - name: Case 21, excluded income does not prevent personal needs. period: 2026-01 absolute_error_margin: 0.01 @@ -201,6 +221,7 @@ social_security_retirement: 240 output: ny_ssp: 25 + - name: Case 22, institution without Medicaid paying majority. period: 2026-01 absolute_error_margin: 0.01 @@ -210,6 +231,7 @@ ssi_lives_in_medical_treatment_facility: true output: ny_ssp: 0 + - name: Case 23, nursing facility without federal institutional classification. period: 2026-01 absolute_error_margin: 0.01 @@ -219,6 +241,7 @@ ny_ssp_living_arrangement: NURSING_FACILITY output: ny_ssp: 0 + - name: Case 24, minor in enhanced care receives household rate. period: 2026-01 absolute_error_margin: 0.01 @@ -230,6 +253,7 @@ ny_ssp_living_arrangement: ENHANCED_RESIDENTIAL_CARE output: ny_ssp: 23 + - name: Case 25, student under twenty two is a minor. period: 2026-01 absolute_error_margin: 0.01 @@ -241,6 +265,7 @@ ny_ssp_living_arrangement: ENHANCED_RESIDENTIAL_CARE output: ny_ssp: 23 + - name: Case 26, student at age twenty two receives care rate. period: 2026-01 absolute_error_margin: 0.01 @@ -252,6 +277,7 @@ ny_ssp_living_arrangement: ENHANCED_RESIDENTIAL_CARE output: ny_ssp: 694 + - name: Case 27, certified minor family placement receives care rate. period: 2026-01 absolute_error_margin: 0.01 @@ -280,6 +306,7 @@ ny_ssp_living_arrangement: ENHANCED_RESIDENTIAL_CARE output: ny_ssp: 23 + - name: Case 29, nonregular part-time attendance does not confer minor status. period: 2026-01 absolute_error_margin: 0.01 @@ -293,6 +320,7 @@ ny_ssp_living_arrangement: ENHANCED_RESIDENTIAL_CARE output: ny_ssp: 694 + - name: Case 30, regularly attending student who is household head receives adult rate. period: 2026-01 absolute_error_margin: 0.01 @@ -306,6 +334,7 @@ ny_ssp_living_arrangement: ENHANCED_RESIDENTIAL_CARE output: ny_ssp: 694 + - name: Case 31, regular student at age twenty-two receives adult rate. period: 2026-01 absolute_error_margin: 0.01 diff --git a/policyengine_us/tests/policy/baseline/gov/states/ny/otda/ssp/ny_ssp_regularly_attends_school.yaml b/policyengine_us/tests/policy/baseline/gov/states/ny/otda/ssp/ny_ssp_regularly_attends_school.yaml index 2881a3991ff..ea5f240c191 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/ny/otda/ssp/ny_ssp_regularly_attends_school.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/ny/otda/ssp/ny_ssp_regularly_attends_school.yaml @@ -5,6 +5,7 @@ is_full_time_college_student: true output: ny_ssp_regularly_attends_school: true + - name: Case 2, part-time enrollment alone does not establish qualifying weekly hours. period: 2026 input: From 92f6d9ab64954c0d3ff8e995363d93fc45b26cb4 Mon Sep 17 00:00:00 2001 From: Ziming Date: Tue, 13 Oct 2026 02:32:16 -0400 Subject: [PATCH 3/4] Fix issues from review: New York SSP minor definition, registries and tests - Apply the not-married / not-head-of-household test to minors under 18 too, per person - Read is_full_time_student directly instead of a wrapper variable - Registry placement and comments, SNAP reference title, shorter programs.yaml note - Pinpoint SSL 209 and 18 NYCRR 398-4.4 references - Make the deeming test exercise deeming; add minor-branch and earned-income cases Co-Authored-By: Claude Opus 5.5 --- .../household/household_state_benefits.yaml | 8 +- .../gov/states/ny/otda/ssp/amount/couple.yaml | 2 +- .../states/ny/otda/ssp/amount/individual.yaml | 2 +- .../ny/otda/ssp/downstate_counties.yaml | 2 +- .../ssp/family_care_downstate_premium.yaml | 2 +- .../gov/states/ny/otda/ssp/minor_age.yaml | 2 + .../ssp/personal_needs/nursing_facility.yaml | 6 +- .../other_medical_facility.yaml | 6 +- .../residential_care_downstate_premium.yaml | 2 +- .../states/ny/otda/ssp/student_minor_age.yaml | 2 + .../usda/snap/income/sources/unearned.yaml | 4 +- policyengine_us/programs.yaml | 9 +- .../gov/states/ny/otda/ssp/integration.yaml | 56 ++++++++- .../gov/states/ny/otda/ssp/ny_ssp.yaml | 110 +++++++++++++++--- .../ssp/ny_ssp_regularly_attends_school.yaml | 14 --- .../gov/states/ny/otda/ssp/ny_ssp.py | 2 + .../gov/states/ny/otda/ssp/ny_ssp_is_minor.py | 31 +++-- .../ny/otda/ssp/ny_ssp_living_arrangement.py | 11 +- .../ssp/ny_ssp_regularly_attends_school.py | 20 ---- .../income/spm_unit/spm_unit_benefits.py | 2 +- 20 files changed, 208 insertions(+), 85 deletions(-) delete mode 100644 policyengine_us/tests/policy/baseline/gov/states/ny/otda/ssp/ny_ssp_regularly_attends_school.yaml delete mode 100644 policyengine_us/variables/gov/states/ny/otda/ssp/ny_ssp_regularly_attends_school.py diff --git a/policyengine_us/parameters/gov/household/household_state_benefits.yaml b/policyengine_us/parameters/gov/household/household_state_benefits.yaml index e958eeafdd0..87e4bd2b57c 100644 --- a/policyengine_us/parameters/gov/household/household_state_benefits.yaml +++ b/policyengine_us/parameters/gov/household/household_state_benefits.yaml @@ -78,7 +78,6 @@ values: # DC benefits - dc_ossp # Kansas benefits - - ny_ssp - ks_sspp # Hawaii benefits - hi_oss @@ -91,6 +90,7 @@ values: # Washington benefits - wa_child_care_subsidies # New York benefits + - ny_ssp - ny_child_care_subsidies 2024-01-01: # Delaware benefits @@ -177,7 +177,6 @@ values: # DC benefits - dc_ossp # Kansas benefits - - ny_ssp - ks_sspp # Hawaii benefits - hi_oss @@ -194,6 +193,7 @@ values: # Washington child care subsidies - wa_child_care_subsidies # New York benefits + - ny_ssp - ny_child_care_subsidies 2025-01-01: # Delaware benefits @@ -281,7 +281,6 @@ values: - dc_ossp - dc_child_care_subsidies # Kansas benefits - - ny_ssp - ks_sspp # Hawaii benefits - hi_oss @@ -298,6 +297,7 @@ values: # Washington child care subsidies - wa_child_care_subsidies # New York benefits + - ny_ssp - ny_child_care_subsidies 2026-01-01: # Delaware benefits @@ -385,7 +385,6 @@ values: - dc_ossp - dc_child_care_subsidies # Kansas benefits - - ny_ssp - ks_sspp # Hawaii benefits - hi_oss @@ -404,6 +403,7 @@ values: # New Jersey benefits - nj_property_tax_relief # New York benefits + - ny_ssp - ny_child_care_subsidies metadata: diff --git a/policyengine_us/parameters/gov/states/ny/otda/ssp/amount/couple.yaml b/policyengine_us/parameters/gov/states/ny/otda/ssp/amount/couple.yaml index 094b5573c4a..33e8a9bec30 100644 --- a/policyengine_us/parameters/gov/states/ny/otda/ssp/amount/couple.yaml +++ b/policyengine_us/parameters/gov/states/ny/otda/ssp/amount/couple.yaml @@ -9,7 +9,7 @@ metadata: reference: - title: "New York 2026 SSI and SSP maximum monthly benefit levels #page 1-2" href: https://opwdd.ny.gov/system/files/documents/2025/11/25-inf-06-attachment-1.pdf#page=1 - - title: New York Social Services Law section 209 + - title: New York Social Services Law section 209(2)(a)-(e) href: https://www.nysenate.gov/legislation/laws/SOS/209 LIVING_ALONE: diff --git a/policyengine_us/parameters/gov/states/ny/otda/ssp/amount/individual.yaml b/policyengine_us/parameters/gov/states/ny/otda/ssp/amount/individual.yaml index 422d3bf0fb0..76334fb1756 100644 --- a/policyengine_us/parameters/gov/states/ny/otda/ssp/amount/individual.yaml +++ b/policyengine_us/parameters/gov/states/ny/otda/ssp/amount/individual.yaml @@ -9,7 +9,7 @@ metadata: reference: - title: "New York 2026 SSI and SSP maximum monthly benefit levels #page 1-2" href: https://opwdd.ny.gov/system/files/documents/2025/11/25-inf-06-attachment-1.pdf#page=1 - - title: New York Social Services Law section 209 + - title: New York Social Services Law section 209(2)(a)-(e) href: https://www.nysenate.gov/legislation/laws/SOS/209 LIVING_ALONE: diff --git a/policyengine_us/parameters/gov/states/ny/otda/ssp/downstate_counties.yaml b/policyengine_us/parameters/gov/states/ny/otda/ssp/downstate_counties.yaml index bd330b35766..d192a5963c7 100644 --- a/policyengine_us/parameters/gov/states/ny/otda/ssp/downstate_counties.yaml +++ b/policyengine_us/parameters/gov/states/ny/otda/ssp/downstate_counties.yaml @@ -17,5 +17,5 @@ metadata: reference: - title: "New York 2026 SSI and SSP maximum monthly benefit levels #page 1-2" href: https://opwdd.ny.gov/system/files/documents/2025/11/25-inf-06-attachment-1.pdf#page=1 - - title: New York Social Services Law section 209 + - title: New York Social Services Law section 209(2)(c)-(d) href: https://www.nysenate.gov/legislation/laws/SOS/209 diff --git a/policyengine_us/parameters/gov/states/ny/otda/ssp/family_care_downstate_premium.yaml b/policyengine_us/parameters/gov/states/ny/otda/ssp/family_care_downstate_premium.yaml index 30f93166366..34d54daa5a5 100644 --- a/policyengine_us/parameters/gov/states/ny/otda/ssp/family_care_downstate_premium.yaml +++ b/policyengine_us/parameters/gov/states/ny/otda/ssp/family_care_downstate_premium.yaml @@ -9,5 +9,5 @@ metadata: reference: - title: "New York 2026 SSI and SSP maximum monthly benefit levels #page 1-2" href: https://opwdd.ny.gov/system/files/documents/2025/11/25-inf-06-attachment-1.pdf#page=1 - - title: New York Social Services Law section 209 + - title: New York Social Services Law section 209(2)(c) href: https://www.nysenate.gov/legislation/laws/SOS/209 diff --git a/policyengine_us/parameters/gov/states/ny/otda/ssp/minor_age.yaml b/policyengine_us/parameters/gov/states/ny/otda/ssp/minor_age.yaml index 202c588a79c..0959d6c3e85 100644 --- a/policyengine_us/parameters/gov/states/ny/otda/ssp/minor_age.yaml +++ b/policyengine_us/parameters/gov/states/ny/otda/ssp/minor_age.yaml @@ -8,3 +8,5 @@ metadata: reference: - title: 18 NYCRR 398-2.1(t), Minor child href: https://www.law.cornell.edu/regulations/new-york/18-NYCRR-398-2.1 + - title: New York Social Services Law section 209(3)(b) + href: https://www.nysenate.gov/legislation/laws/SOS/209 diff --git a/policyengine_us/parameters/gov/states/ny/otda/ssp/personal_needs/nursing_facility.yaml b/policyengine_us/parameters/gov/states/ny/otda/ssp/personal_needs/nursing_facility.yaml index df4e5b5db0a..b8745b07086 100644 --- a/policyengine_us/parameters/gov/states/ny/otda/ssp/personal_needs/nursing_facility.yaml +++ b/policyengine_us/parameters/gov/states/ny/otda/ssp/personal_needs/nursing_facility.yaml @@ -7,7 +7,7 @@ metadata: period: month label: New York SSP nursing facility personal needs allowance reference: - - title: "New York 2026 SSI and SSP maximum monthly benefit levels #page 1-2" - href: https://opwdd.ny.gov/system/files/documents/2025/11/25-inf-06-attachment-1.pdf#page=1 - - title: New York Social Services Law section 209 + - title: New York 2026 SSI and SSP maximum monthly benefit levels + href: https://opwdd.ny.gov/system/files/documents/2025/11/25-inf-06-attachment-1.pdf#page=2 + - title: New York Social Services Law section 209(2-a) href: https://www.nysenate.gov/legislation/laws/SOS/209 diff --git a/policyengine_us/parameters/gov/states/ny/otda/ssp/personal_needs/other_medical_facility.yaml b/policyengine_us/parameters/gov/states/ny/otda/ssp/personal_needs/other_medical_facility.yaml index 0f2480c351e..dc76d889922 100644 --- a/policyengine_us/parameters/gov/states/ny/otda/ssp/personal_needs/other_medical_facility.yaml +++ b/policyengine_us/parameters/gov/states/ny/otda/ssp/personal_needs/other_medical_facility.yaml @@ -7,7 +7,7 @@ metadata: period: month label: New York SSP other medical facility personal needs allowance reference: - - title: "New York 2026 SSI and SSP maximum monthly benefit levels #page 1-2" - href: https://opwdd.ny.gov/system/files/documents/2025/11/25-inf-06-attachment-1.pdf#page=1 - - title: New York Social Services Law section 209 + - title: New York 2026 SSI and SSP maximum monthly benefit levels + href: https://opwdd.ny.gov/system/files/documents/2025/11/25-inf-06-attachment-1.pdf#page=2 + - title: New York Social Services Law section 209(2-a) href: https://www.nysenate.gov/legislation/laws/SOS/209 diff --git a/policyengine_us/parameters/gov/states/ny/otda/ssp/residential_care_downstate_premium.yaml b/policyengine_us/parameters/gov/states/ny/otda/ssp/residential_care_downstate_premium.yaml index 8e0a89a2ae0..2c79b240ef1 100644 --- a/policyengine_us/parameters/gov/states/ny/otda/ssp/residential_care_downstate_premium.yaml +++ b/policyengine_us/parameters/gov/states/ny/otda/ssp/residential_care_downstate_premium.yaml @@ -9,5 +9,5 @@ metadata: reference: - title: "New York 2026 SSI and SSP maximum monthly benefit levels #page 1-2" href: https://opwdd.ny.gov/system/files/documents/2025/11/25-inf-06-attachment-1.pdf#page=1 - - title: New York Social Services Law section 209 + - title: New York Social Services Law section 209(2)(d) href: https://www.nysenate.gov/legislation/laws/SOS/209 diff --git a/policyengine_us/parameters/gov/states/ny/otda/ssp/student_minor_age.yaml b/policyengine_us/parameters/gov/states/ny/otda/ssp/student_minor_age.yaml index 458c222939c..764a1b75c8c 100644 --- a/policyengine_us/parameters/gov/states/ny/otda/ssp/student_minor_age.yaml +++ b/policyengine_us/parameters/gov/states/ny/otda/ssp/student_minor_age.yaml @@ -8,3 +8,5 @@ metadata: reference: - title: 18 NYCRR 398-2.1(t), Minor child href: https://www.law.cornell.edu/regulations/new-york/18-NYCRR-398-2.1 + - title: New York Social Services Law section 209(3)(b) + href: https://www.nysenate.gov/legislation/laws/SOS/209 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 663905a27ca..381438cac82 100644 --- a/policyengine_us/parameters/gov/usda/snap/income/sources/unearned.yaml +++ b/policyengine_us/parameters/gov/usda/snap/income/sources/unearned.yaml @@ -36,7 +36,6 @@ values: - hi_oss - id_aabd - in_ssp - - ny_ssp - ks_sspp - ky_ssp - la_oss @@ -48,6 +47,7 @@ values: - mo_ssp - ne_aabd - nm_ssi_state_supplement + - ny_ssp - sc_ssi_state_supplement - tx_ssi_state_supplement - wa_ssp @@ -96,7 +96,7 @@ values: metadata: reference: - - title: 7 CFR 273.9(b)(2) and (c)(1), (5) + - title: 7 CFR 273.9(b)(2) and (c)(1) href: https://www.law.cornell.edu/cfr/text/7/273.9 - title: POMS SI 01401.001 General Information about State Supplementation href: https://secure.ssa.gov/poms.nsf/lnx/0501401001 diff --git a/policyengine_us/programs.yaml b/policyengine_us/programs.yaml index 14a36a298b1..907c5c5c20b 100644 --- a/policyengine_us/programs.yaml +++ b/policyengine_us/programs.yaml @@ -1097,12 +1097,9 @@ programs: variable: ny_ssp parameter_prefix: gov.states.ny.otda.ssp verified_years: '2026' - notes: Models the 2026 individual and couple rates, downstate care premiums, income taper, - minimum payment, and institutional personal-needs allowance. Certified care, separate-food - household exceptions and separate institutional SSI claims require explicit inputs. - Regular student status accepts an explicit regular-attendance determination, - with full-time student status as the fallback. Grandfathered mandatory payments - are not modeled. + notes: Models 2026 living alone, living with others and congregate care supplements with + downstate premiums, plus the medical facility personal needs allowance. Grandfathered + mandatory payments are not modeled. - id: social_security name: Social Security diff --git a/policyengine_us/tests/policy/baseline/gov/states/ny/otda/ssp/integration.yaml b/policyengine_us/tests/policy/baseline/gov/states/ny/otda/ssp/integration.yaml index 45395a2e5b1..b77487046e6 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/ny/otda/ssp/integration.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/ny/otda/ssp/integration.yaml @@ -127,8 +127,9 @@ person1: age: 65 person2: - age: 40 - social_security_retirement: 18_408 + # Early-claimed Social Security retirement benefit of 1_550 a month. + age: 63 + social_security_retirement: 18_600 marital_units: couple: members: [person1, person2] @@ -141,7 +142,20 @@ state_code: NY county: ALBANY_COUNTY_NY output: - ny_ssp: [23, 0] + # Spouse income 18_600 / 12 = 1_550 > 1_491 - 994 = 497, so deeming applies. + is_ssi_spousal_deeming_applies: [true, false] + # Couple countable (1_550 - 20) - own countable 0 = 1_530. + ssi_income_deemed_from_ineligible_spouse: [1_530, 0] + ssi_countable_income: [1_530, 0] + # Couple FBR 1_491 - 1_530 = -39, so no federal SSI. + uncapped_ssi: [-39, 0] + ssi: [0, 0] + # The ineligible spouse makes a two-person household. + ny_ssp_living_arrangement: [LIVING_WITH_OTHERS, LIVING_WITH_OTHERS] + # Own-income path: 23 - max(0 - 994, 0) = 23. + # Deemed path: couple rate 46 - excess (1_530 - 1_491 = 39) = 7. + # The lesser path pays 7. + ny_ssp: [7, 0] - name: Case 7, annual benefit and SNAP income. period: 2026 @@ -154,3 +168,39 @@ household_state_benefits: 1_044 snap_unearned_income: 12_972 hud_unearned_income: 12_972 + +- name: Case 8, part-time earnings reduce SSI but not the state payment. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 45 + meets_ssi_disability_criteria: true + # 20 hours a week at the 2026 minimum wage outside New York City, + # Long Island and Westchester ($16.00, https://dol.ny.gov/minimum-wage-0): + # 16 * 20 * 52 = 16_640. + employment_income: 16_640 + households: + household: + members: [person1] + state_code: NY + county: ALBANY_COUNTY_NY + output: + # 16_640 / 12 = 1_386.67 a month. + ssi_earned_income: 1_386.67 + # 1_386.67 is below the 2026 non-blind SGA limit of 1_690. + ssi_engaged_in_sga: false + is_ssi_disabled: true + # (1_386.67 - 20 general - 65 earned) / 2 = 650.83. + ssi_countable_income: 650.83 + # Individual FBR in the person's own household. + ssi_amount_if_eligible: 994 + # 994 - 650.83 = 343.17. + uncapped_ssi: 343.17 + ssi: 343.17 + ny_ssp_is_minor: false + # One-person household. + ny_ssp_living_arrangement: LIVING_ALONE + # Excess countable income max(650.83 - 994, 0) = 0: living alone rate 87 - 0 = 87. + ny_ssp: 87 diff --git a/policyengine_us/tests/policy/baseline/gov/states/ny/otda/ssp/ny_ssp.yaml b/policyengine_us/tests/policy/baseline/gov/states/ny/otda/ssp/ny_ssp.yaml index f093e7aee0a..56ec0fafd14 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/ny/otda/ssp/ny_ssp.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/ny/otda/ssp/ny_ssp.yaml @@ -290,24 +290,23 @@ output: ny_ssp: 228.48 -# 18 NYCRR 398-2.1(t), 398-4.5(e): regular attendance is broader than full-time study. -# The certified true input represents qualifying eight-hour-per-week college attendance. +# 18 NYCRR 398-2.1(t): is_full_time_student stands in for regular school attendance; +# qualifying part-time attendance is not modeled. # https://www.law.cornell.edu/regulations/new-york/18-NYCRR-398-2.1 -- name: Case 28, certified regularly attending part-time college student receives minor rate. +- name: Case 28, full-time student who is not a household head receives minor rate. period: 2026-01 absolute_error_margin: 0.01 input: state_code: NY age: 20 is_blind: true - is_part_time_college_student: true - ny_ssp_regularly_attends_school: true + is_full_time_student: true is_household_head: false ny_ssp_living_arrangement: ENHANCED_RESIDENTIAL_CARE output: ny_ssp: 23 -- name: Case 29, nonregular part-time attendance does not confer minor status. +- name: Case 29, part-time attendance does not confer minor status. period: 2026-01 absolute_error_margin: 0.01 input: @@ -315,36 +314,121 @@ age: 20 is_blind: true is_part_time_college_student: true - ny_ssp_regularly_attends_school: false + is_full_time_student: false is_household_head: false ny_ssp_living_arrangement: ENHANCED_RESIDENTIAL_CARE output: ny_ssp: 694 -- name: Case 30, regularly attending student who is household head receives adult rate. +- name: Case 30, full-time student who is household head receives adult rate. period: 2026-01 absolute_error_margin: 0.01 input: state_code: NY age: 20 is_blind: true - is_part_time_college_student: true - ny_ssp_regularly_attends_school: true + is_full_time_student: true is_household_head: true ny_ssp_living_arrangement: ENHANCED_RESIDENTIAL_CARE output: ny_ssp: 694 -- name: Case 31, regular student at age twenty-two receives adult rate. +- name: Case 31, full-time student at age twenty-two receives adult rate. period: 2026-01 absolute_error_margin: 0.01 input: state_code: NY age: 22 is_blind: true - is_part_time_college_student: true - ny_ssp_regularly_attends_school: true + is_full_time_student: true is_household_head: false ny_ssp_living_arrangement: ENHANCED_RESIDENTIAL_CARE output: ny_ssp: 694 + +# 18 NYCRR 398-2.1(t): a minor is neither married nor a head of a household, +# under both the age and the student test. +# https://www.law.cornell.edu/regulations/new-york/18-NYCRR-398-2.1 +- name: Case 32, blind seventeen-year-old household head living alone is not a minor. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: NY + age: 17 + is_blind: true + is_household_head: true + output: + # Age 17 < 18, but a household head is not a minor. + ny_ssp_is_minor: false + # One-person household, not a minor: living alone. + ny_ssp_living_arrangement: LIVING_ALONE + # Living alone rate 87 - excess countable income 0 = 87. + ny_ssp: 87 + +- name: Case 33, blind sixteen-year-old living with parents receives minor rate. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 45 + own_children_in_household: 1 + person2: + age: 43 + own_children_in_household: 1 + person3: + age: 16 + is_blind: true + marital_units: + parents: + members: [person1, person2] + child: + members: [person3] + tax_units: + tax_unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + state_code: NY + output: + # person3: age 16 < 18, unmarried and not a household head. + ny_ssp_is_minor: [false, false, true] + # person3 is a minor (the three-person household also rules out living alone). + ny_ssp_living_arrangement: [LIVING_WITH_OTHERS, LIVING_WITH_OTHERS, LIVING_WITH_OTHERS] + # Parents have no income to deem: living with others rate 23 - 0 = 23. + # The parents are not aged, blind or disabled. + ny_ssp: [0, 0, 23] + +- name: Case 34, unmarried twenty-year-old student with married parents is a minor. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 50 + person2: + age: 48 + person3: + age: 20 + is_blind: true + is_full_time_student: true + marital_units: + parents: + members: [person1, person2] + child: + members: [person3] + tax_units: + tax_unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + state_code: NY + output: + # person3: age 20 < 22 and a full-time student; the parents' marriage does + # not make person3 married. + ny_ssp_is_minor: [false, false, true] + ny_ssp_living_arrangement: [LIVING_WITH_OTHERS, LIVING_WITH_OTHERS, LIVING_WITH_OTHERS] + # No countable income: living with others rate 23 - 0 = 23. + ny_ssp: [0, 0, 23] diff --git a/policyengine_us/tests/policy/baseline/gov/states/ny/otda/ssp/ny_ssp_regularly_attends_school.yaml b/policyengine_us/tests/policy/baseline/gov/states/ny/otda/ssp/ny_ssp_regularly_attends_school.yaml deleted file mode 100644 index ea5f240c191..00000000000 --- a/policyengine_us/tests/policy/baseline/gov/states/ny/otda/ssp/ny_ssp_regularly_attends_school.yaml +++ /dev/null @@ -1,14 +0,0 @@ -# Regular attendance may be supplied when the existing full-time input cannot establish the rule. -- name: Case 1, full-time college study supplies regular attendance by default. - period: 2026 - input: - is_full_time_college_student: true - output: - ny_ssp_regularly_attends_school: true - -- name: Case 2, part-time enrollment alone does not establish qualifying weekly hours. - period: 2026 - input: - is_part_time_college_student: true - output: - ny_ssp_regularly_attends_school: false diff --git a/policyengine_us/variables/gov/states/ny/otda/ssp/ny_ssp.py b/policyengine_us/variables/gov/states/ny/otda/ssp/ny_ssp.py index 973c89e87a9..e0f217c3860 100644 --- a/policyengine_us/variables/gov/states/ny/otda/ssp/ny_ssp.py +++ b/policyengine_us/variables/gov/states/ny/otda/ssp/ny_ssp.py @@ -15,8 +15,10 @@ class ny_ssp(Variable): definition_period = MONTH defined_for = StateCode.NY reference = ( + # Social Services Law 209(2)(a)-(e), (2-a) "https://www.nysenate.gov/legislation/laws/SOS/209", "https://www.law.cornell.edu/regulations/new-york/18-NYCRR-398-3.2", + "https://www.law.cornell.edu/regulations/new-york/18-NYCRR-398-4.4", "https://www.law.cornell.edu/regulations/new-york/18-NYCRR-398-4.6", ) diff --git a/policyengine_us/variables/gov/states/ny/otda/ssp/ny_ssp_is_minor.py b/policyengine_us/variables/gov/states/ny/otda/ssp/ny_ssp_is_minor.py index 101b514c38c..9bbd52a6ebd 100644 --- a/policyengine_us/variables/gov/states/ny/otda/ssp/ny_ssp_is_minor.py +++ b/policyengine_us/variables/gov/states/ny/otda/ssp/ny_ssp_is_minor.py @@ -1,4 +1,7 @@ from policyengine_us.model_api import * +from policyengine_us.variables.gov.ssa.ssi.eligibility.resources.deemed._ssi_spouses import ( + _ssi_spouse_index, +) class ny_ssp_is_minor(Variable): @@ -6,15 +9,27 @@ class ny_ssp_is_minor(Variable): entity = Person label = "Minor for New York State Supplement Program living arrangements" definition_period = YEAR - reference = "https://www.law.cornell.edu/regulations/new-york/18-NYCRR-398-2.1" + reference = ( + # 18 NYCRR 398-2.1(t) + "https://www.law.cornell.edu/regulations/new-york/18-NYCRR-398-2.1", + # Social Services Law 209(3)(b) + "https://www.nysenate.gov/legislation/laws/SOS/209", + ) + documentation = """ + A minor is below the minor age, or below the student minor age and a + full-time student, and is neither married nor the head of a household. + Set is_household_head for a student who lives away from home and heads + their own household. Part-time attendance that counts as regular + attendance under 20 CFR 416.1861 is not captured by is_full_time_student. + """ def formula(person, period, parameters): p = parameters(period).gov.states.ny.otda.ssp age = person("age", period) - student = person("ny_ssp_regularly_attends_school", period) - return (age < p.minor_age) | ( - (age < p.student_minor_age) - & student - & ~person.family("is_married", period) - & ~person("is_household_head", period) - ) + student = person("is_full_time_student", period) + # Marriage uses the SSI spouse test, so a child of a married couple + # is not treated as married. + married = _ssi_spouse_index(person, period) >= 0 + head = person("is_household_head", period) + under_age = (age < p.minor_age) | ((age < p.student_minor_age) & student) + return under_age & ~married & ~head diff --git a/policyengine_us/variables/gov/states/ny/otda/ssp/ny_ssp_living_arrangement.py b/policyengine_us/variables/gov/states/ny/otda/ssp/ny_ssp_living_arrangement.py index cc4fd900562..b1d0ebdd565 100644 --- a/policyengine_us/variables/gov/states/ny/otda/ssp/ny_ssp_living_arrangement.py +++ b/policyengine_us/variables/gov/states/ny/otda/ssp/ny_ssp_living_arrangement.py @@ -29,9 +29,14 @@ class ny_ssp_living_arrangement(Variable): minors require the authorized placements specified in 18 NYCRR 398-4.5. The formula uses household membership; set LIVING_ALONE explicitly for qualifying separate-food, room-and-board, foster-child or attendant cases. - Use NONE for excluded public facilities and emergency shelters. Nursing - facilities must be identified explicitly; other Medicaid institutions use - the lower medical-facility allowance. Set SSI claim status explicitly for + The household count includes a spouse who lives in a medical facility, + because temporary and permanent absence are not modeled, so set the + arrangement of the spouse at home explicitly. Use NONE for excluded public + facilities and emergency shelters. Residents of medical facilities where + Medicaid pays more than half the cost default to OTHER_MEDICAL_FACILITY, + the lower personal needs allowance; residents of Department of Health + licensed nursing homes receive the higher allowance only when + NURSING_FACILITY is set explicitly. Set SSI claim status explicitly for institutional couples after their month of entry. """ diff --git a/policyengine_us/variables/gov/states/ny/otda/ssp/ny_ssp_regularly_attends_school.py b/policyengine_us/variables/gov/states/ny/otda/ssp/ny_ssp_regularly_attends_school.py deleted file mode 100644 index 41ec158f450..00000000000 --- a/policyengine_us/variables/gov/states/ny/otda/ssp/ny_ssp_regularly_attends_school.py +++ /dev/null @@ -1,20 +0,0 @@ -from policyengine_us.model_api import * - - -class ny_ssp_regularly_attends_school(Variable): - value_type = bool - entity = Person - label = "Regularly attends school for New York SSP" - definition_period = YEAR - reference = ( - "https://www.law.cornell.edu/regulations/new-york/18-NYCRR-398-2.1", - "https://www.law.cornell.edu/cfr/text/20/416.1861", - ) - # Regular attendance under 20 CFR 416.1861, including qualifying part-time college - # attendance (normally at least eight hours weekly), school or vocational training - # and permitted reduced attendance or temporary absence. Full-time enrollment is the - # fallback. Supply the actual attendance determination for other students; the - # generic half-time college flag does not establish the required hours. - - def formula(person, period, parameters): - return person("is_full_time_student", period) 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 dd4884e88d9..c0fdb497941 100644 --- a/policyengine_us/variables/household/income/spm_unit/spm_unit_benefits.py +++ b/policyengine_us/variables/household/income/spm_unit/spm_unit_benefits.py @@ -22,7 +22,7 @@ def formula(spm_unit, period, parameters): "ky_ssp", # Kentucky benefits "de_ssp", # Delaware benefits "fl_oss", - "ny_ssp", + "ny_ssp", # New York benefits "ks_sspp", # Kansas benefits "hi_oss", "la_oss", # Louisiana benefits From db43e764fc93f8503c9f0d2093929590c95bf64e Mon Sep 17 00:00:00 2001 From: Ziming Date: Thu, 15 Oct 2026 11:29:48 -0400 Subject: [PATCH 4/4] Address review: New York SSP couple care rates, deeming, personal needs allowance, care setting input - Congregate care couple rates follow Social Services Law 209(2)(c)-(e): two times the individual standard less the couple FBR, so they move with each federal increase; couple.yaml keeps the living alone and living with others amounts. - Under spousal deeming, follow 18 NYCRR 398-2.1(ac) and 398-4.4(b): the individual standard less the greater of the individual FBR or countable income including deemed income. A NOTE quotes SSA's method and SSL 209(4). - Personal needs allowance follows SSL 209(2-a) and 18 NYCRR 398-3.4: $25 by default in a Medicaid-majority facility, $5 for OPWDD and OMH facilities. - New ny_ssp_care_setting input; the living arrangement reads it, and foster children and members in a medical facility do not end living alone. - No state payment in an excluded setting or a Medicaid-majority facility. - Descriptions follow the template; references cite 398-3.4 and 398-4.2. - Tests: care setting inputs, couples after entry, deeming, facility and household-count cases, spm_unit_benefits. Co-Authored-By: Claude Opus 5.5 --- .../gov/states/ny/otda/ssp/amount/couple.yaml | 28 +-- .../states/ny/otda/ssp/amount/individual.yaml | 6 +- .../ny/otda/ssp/downstate_counties.yaml | 4 +- .../ssp/family_care_downstate_premium.yaml | 4 +- .../states/ny/otda/ssp/minimum_payment.yaml | 2 +- .../gov/states/ny/otda/ssp/minor_age.yaml | 2 +- ...velopmental_or_mental_health_facility.yaml | 15 ++ .../ssp/personal_needs/nursing_facility.yaml | 13 -- .../other_medical_facility.yaml | 13 -- .../residential_health_care_facility.yaml | 15 ++ .../residential_care_downstate_premium.yaml | 4 +- .../states/ny/otda/ssp/student_minor_age.yaml | 2 +- .../gov/states/ny/otda/ssp/integration.yaml | 127 +++++++++-- .../gov/states/ny/otda/ssp/ny_ssp.yaml | 200 ++++++++++++++++-- .../gov/states/ny/otda/ssp/ny_ssp.py | 90 ++++++-- .../states/ny/otda/ssp/ny_ssp_care_setting.py | 40 ++++ .../gov/states/ny/otda/ssp/ny_ssp_is_minor.py | 1 + .../ny/otda/ssp/ny_ssp_living_arrangement.py | 68 ++++-- 18 files changed, 504 insertions(+), 130 deletions(-) create mode 100644 policyengine_us/parameters/gov/states/ny/otda/ssp/personal_needs/developmental_or_mental_health_facility.yaml delete mode 100644 policyengine_us/parameters/gov/states/ny/otda/ssp/personal_needs/nursing_facility.yaml delete mode 100644 policyengine_us/parameters/gov/states/ny/otda/ssp/personal_needs/other_medical_facility.yaml create mode 100644 policyengine_us/parameters/gov/states/ny/otda/ssp/personal_needs/residential_health_care_facility.yaml create mode 100644 policyengine_us/variables/gov/states/ny/otda/ssp/ny_ssp_care_setting.py diff --git a/policyengine_us/parameters/gov/states/ny/otda/ssp/amount/couple.yaml b/policyengine_us/parameters/gov/states/ny/otda/ssp/amount/couple.yaml index 33e8a9bec30..11048eb02fa 100644 --- a/policyengine_us/parameters/gov/states/ny/otda/ssp/amount/couple.yaml +++ b/policyengine_us/parameters/gov/states/ny/otda/ssp/amount/couple.yaml @@ -1,37 +1,19 @@ -description: New York provides these monthly State Supplement Program rates for an eligible couple, excluding the downstate care premium. +description: New York provides this amount as the monthly couple payment for couples living alone or with others under the State Supplement Program. metadata: unit: currency-USD period: month label: New York SSP couple amount - breakdown: - - ny_ssp_living_arrangement reference: - - title: "New York 2026 SSI and SSP maximum monthly benefit levels #page 1-2" + - title: New York 2026 SSI and SSP maximum monthly benefit levels href: https://opwdd.ny.gov/system/files/documents/2025/11/25-inf-06-attachment-1.pdf#page=1 - - title: New York Social Services Law section 209(2)(a)-(e) + - title: New York Social Services Law section 209(2)(a)-(b) href: https://www.nysenate.gov/legislation/laws/SOS/209 +# Congregate care couples have two times the individual standard of need +# (Social Services Law 209(2)(c)-(e)); ny_ssp computes those payments. LIVING_ALONE: 2026-01-01: 104 LIVING_WITH_OTHERS: 2026-01-01: 46 - -FAMILY_CARE: - 2026-01-01: 953.96 - -RESIDENTIAL_CARE: - 2026-01-01: 1_307 - -ENHANCED_RESIDENTIAL_CARE: - 2026-01-01: 1_885 - -NURSING_FACILITY: - 2026-01-01: 0 - -OTHER_MEDICAL_FACILITY: - 2026-01-01: 0 - -NONE: - 2026-01-01: 0 diff --git a/policyengine_us/parameters/gov/states/ny/otda/ssp/amount/individual.yaml b/policyengine_us/parameters/gov/states/ny/otda/ssp/amount/individual.yaml index 76334fb1756..45cd56ea9fd 100644 --- a/policyengine_us/parameters/gov/states/ny/otda/ssp/amount/individual.yaml +++ b/policyengine_us/parameters/gov/states/ny/otda/ssp/amount/individual.yaml @@ -1,4 +1,4 @@ -description: New York provides these monthly State Supplement Program rates for an eligible individual, excluding the downstate care premium. +description: New York provides this amount as the monthly individual payment under the State Supplement Program. metadata: unit: currency-USD @@ -27,10 +27,10 @@ RESIDENTIAL_CARE: ENHANCED_RESIDENTIAL_CARE: 2026-01-01: 694 -NURSING_FACILITY: +RESIDENTIAL_HEALTH_CARE_FACILITY: 2026-01-01: 0 -OTHER_MEDICAL_FACILITY: +DEVELOPMENTAL_OR_MENTAL_HEALTH_FACILITY: 2026-01-01: 0 NONE: diff --git a/policyengine_us/parameters/gov/states/ny/otda/ssp/downstate_counties.yaml b/policyengine_us/parameters/gov/states/ny/otda/ssp/downstate_counties.yaml index d192a5963c7..2233481ce88 100644 --- a/policyengine_us/parameters/gov/states/ny/otda/ssp/downstate_counties.yaml +++ b/policyengine_us/parameters/gov/states/ny/otda/ssp/downstate_counties.yaml @@ -1,4 +1,4 @@ -description: New York pays higher family and residential care supplements in these counties. +description: New York pays the higher family care and residential care amounts in these counties under the State Supplement Program. values: 2026-01-01: - BRONX_COUNTY_NY @@ -15,7 +15,7 @@ metadata: unit: list label: New York SSP downstate care counties reference: - - title: "New York 2026 SSI and SSP maximum monthly benefit levels #page 1-2" + - title: New York 2026 SSI and SSP maximum monthly benefit levels href: https://opwdd.ny.gov/system/files/documents/2025/11/25-inf-06-attachment-1.pdf#page=1 - title: New York Social Services Law section 209(2)(c)-(d) href: https://www.nysenate.gov/legislation/laws/SOS/209 diff --git a/policyengine_us/parameters/gov/states/ny/otda/ssp/family_care_downstate_premium.yaml b/policyengine_us/parameters/gov/states/ny/otda/ssp/family_care_downstate_premium.yaml index 34d54daa5a5..71a4dbe69a0 100644 --- a/policyengine_us/parameters/gov/states/ny/otda/ssp/family_care_downstate_premium.yaml +++ b/policyengine_us/parameters/gov/states/ny/otda/ssp/family_care_downstate_premium.yaml @@ -1,4 +1,4 @@ -description: New York adds this monthly amount per person to the family care rate in downstate counties. +description: New York adds this amount per person to the monthly family care payment in downstate counties under the State Supplement Program. values: 2026-01-01: 38 @@ -7,7 +7,7 @@ metadata: period: month label: New York SSP family care downstate premium reference: - - title: "New York 2026 SSI and SSP maximum monthly benefit levels #page 1-2" + - title: New York 2026 SSI and SSP maximum monthly benefit levels href: https://opwdd.ny.gov/system/files/documents/2025/11/25-inf-06-attachment-1.pdf#page=1 - title: New York Social Services Law section 209(2)(c) href: https://www.nysenate.gov/legislation/laws/SOS/209 diff --git a/policyengine_us/parameters/gov/states/ny/otda/ssp/minimum_payment.yaml b/policyengine_us/parameters/gov/states/ny/otda/ssp/minimum_payment.yaml index 802737c6c26..3445c6c1b60 100644 --- a/policyengine_us/parameters/gov/states/ny/otda/ssp/minimum_payment.yaml +++ b/policyengine_us/parameters/gov/states/ny/otda/ssp/minimum_payment.yaml @@ -1,4 +1,4 @@ -description: New York provides at least this monthly State Supplement Program payment when the computed benefit is positive. +description: New York sets this amount as the minimum monthly payment under the State Supplement Program. values: 2014-10-01: 1 diff --git a/policyengine_us/parameters/gov/states/ny/otda/ssp/minor_age.yaml b/policyengine_us/parameters/gov/states/ny/otda/ssp/minor_age.yaml index 0959d6c3e85..56aa37121ce 100644 --- a/policyengine_us/parameters/gov/states/ny/otda/ssp/minor_age.yaml +++ b/policyengine_us/parameters/gov/states/ny/otda/ssp/minor_age.yaml @@ -1,4 +1,4 @@ -description: New York treats people below this age as minors for State Supplement Program living arrangements. +description: New York treats people below this age as minor children under the State Supplement Program. values: 2014-10-01: 18 diff --git a/policyengine_us/parameters/gov/states/ny/otda/ssp/personal_needs/developmental_or_mental_health_facility.yaml b/policyengine_us/parameters/gov/states/ny/otda/ssp/personal_needs/developmental_or_mental_health_facility.yaml new file mode 100644 index 00000000000..fd9945fc2c4 --- /dev/null +++ b/policyengine_us/parameters/gov/states/ny/otda/ssp/personal_needs/developmental_or_mental_health_facility.yaml @@ -0,0 +1,15 @@ +description: New York provides this amount as the monthly personal needs allowance to residents of developmental disabilities intermediate care facilities and state psychiatric hospitals under the State Supplement Program. +values: + 1988-01-01: 5 + +metadata: + unit: currency-USD + period: month + label: New York SSP developmental disabilities or mental health facility personal needs allowance + reference: + - title: New York 2026 SSI and SSP maximum monthly benefit levels + href: https://opwdd.ny.gov/system/files/documents/2025/11/25-inf-06-attachment-1.pdf#page=2 + - title: New York Social Services Law section 209(2-a) + href: https://www.nysenate.gov/legislation/laws/SOS/209 + - title: 18 NYCRR 398-3.4, Benefit levels for SSPNA + href: https://www.law.cornell.edu/regulations/new-york/18-NYCRR-398-3.4 diff --git a/policyengine_us/parameters/gov/states/ny/otda/ssp/personal_needs/nursing_facility.yaml b/policyengine_us/parameters/gov/states/ny/otda/ssp/personal_needs/nursing_facility.yaml deleted file mode 100644 index b8745b07086..00000000000 --- a/policyengine_us/parameters/gov/states/ny/otda/ssp/personal_needs/nursing_facility.yaml +++ /dev/null @@ -1,13 +0,0 @@ -description: New York provides this monthly state personal needs allowance in this medical facility category. -values: - 1988-01-01: 25 - -metadata: - unit: currency-USD - period: month - label: New York SSP nursing facility personal needs allowance - reference: - - title: New York 2026 SSI and SSP maximum monthly benefit levels - href: https://opwdd.ny.gov/system/files/documents/2025/11/25-inf-06-attachment-1.pdf#page=2 - - title: New York Social Services Law section 209(2-a) - href: https://www.nysenate.gov/legislation/laws/SOS/209 diff --git a/policyengine_us/parameters/gov/states/ny/otda/ssp/personal_needs/other_medical_facility.yaml b/policyengine_us/parameters/gov/states/ny/otda/ssp/personal_needs/other_medical_facility.yaml deleted file mode 100644 index dc76d889922..00000000000 --- a/policyengine_us/parameters/gov/states/ny/otda/ssp/personal_needs/other_medical_facility.yaml +++ /dev/null @@ -1,13 +0,0 @@ -description: New York provides this monthly state personal needs allowance in this medical facility category. -values: - 1988-01-01: 5 - -metadata: - unit: currency-USD - period: month - label: New York SSP other medical facility personal needs allowance - reference: - - title: New York 2026 SSI and SSP maximum monthly benefit levels - href: https://opwdd.ny.gov/system/files/documents/2025/11/25-inf-06-attachment-1.pdf#page=2 - - title: New York Social Services Law section 209(2-a) - href: https://www.nysenate.gov/legislation/laws/SOS/209 diff --git a/policyengine_us/parameters/gov/states/ny/otda/ssp/personal_needs/residential_health_care_facility.yaml b/policyengine_us/parameters/gov/states/ny/otda/ssp/personal_needs/residential_health_care_facility.yaml new file mode 100644 index 00000000000..69ea678c936 --- /dev/null +++ b/policyengine_us/parameters/gov/states/ny/otda/ssp/personal_needs/residential_health_care_facility.yaml @@ -0,0 +1,15 @@ +description: New York provides this amount as the monthly personal needs allowance to residential health care facility residents under the State Supplement Program. +values: + 1988-01-01: 25 + +metadata: + unit: currency-USD + period: month + label: New York SSP residential health care facility personal needs allowance + reference: + - title: New York 2026 SSI and SSP maximum monthly benefit levels + href: https://opwdd.ny.gov/system/files/documents/2025/11/25-inf-06-attachment-1.pdf#page=2 + - title: New York Social Services Law section 209(2-a) + href: https://www.nysenate.gov/legislation/laws/SOS/209 + - title: 18 NYCRR 398-3.4, Benefit levels for SSPNA + href: https://www.law.cornell.edu/regulations/new-york/18-NYCRR-398-3.4 diff --git a/policyengine_us/parameters/gov/states/ny/otda/ssp/residential_care_downstate_premium.yaml b/policyengine_us/parameters/gov/states/ny/otda/ssp/residential_care_downstate_premium.yaml index 2c79b240ef1..d26f6fdeb2b 100644 --- a/policyengine_us/parameters/gov/states/ny/otda/ssp/residential_care_downstate_premium.yaml +++ b/policyengine_us/parameters/gov/states/ny/otda/ssp/residential_care_downstate_premium.yaml @@ -1,4 +1,4 @@ -description: New York adds this monthly amount per person to the residential care rate in downstate counties. +description: New York adds this amount per person to the monthly residential care payment in downstate counties under the State Supplement Program. values: 2026-01-01: 30 @@ -7,7 +7,7 @@ metadata: period: month label: New York SSP residential care downstate premium reference: - - title: "New York 2026 SSI and SSP maximum monthly benefit levels #page 1-2" + - title: New York 2026 SSI and SSP maximum monthly benefit levels href: https://opwdd.ny.gov/system/files/documents/2025/11/25-inf-06-attachment-1.pdf#page=1 - title: New York Social Services Law section 209(2)(d) href: https://www.nysenate.gov/legislation/laws/SOS/209 diff --git a/policyengine_us/parameters/gov/states/ny/otda/ssp/student_minor_age.yaml b/policyengine_us/parameters/gov/states/ny/otda/ssp/student_minor_age.yaml index 764a1b75c8c..82df5738e3e 100644 --- a/policyengine_us/parameters/gov/states/ny/otda/ssp/student_minor_age.yaml +++ b/policyengine_us/parameters/gov/states/ny/otda/ssp/student_minor_age.yaml @@ -1,4 +1,4 @@ -description: New York treats an unmarried student who is not a household head as a minor below this age. +description: New York treats unmarried students who do not head a household as minor children below this age under the State Supplement Program. values: 2014-10-01: 22 diff --git a/policyengine_us/tests/policy/baseline/gov/states/ny/otda/ssp/integration.yaml b/policyengine_us/tests/policy/baseline/gov/states/ny/otda/ssp/integration.yaml index b77487046e6..72f1201d719 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/ny/otda/ssp/integration.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/ny/otda/ssp/integration.yaml @@ -22,16 +22,18 @@ ny_ssp: [52, 52] - name: Case 2, family care couple. + # Social Services Law 209(2)(c): two times the 1_260.48 downstate individual + # standard is 2_520.96, less the 1_491 couple FBR = 1_029.96, or 514.98 each. period: 2026-01 absolute_error_margin: 0.01 input: people: person1: age: 65 - ny_ssp_living_arrangement: FAMILY_CARE + ny_ssp_care_setting: FAMILY_CARE person2: age: 65 - ny_ssp_living_arrangement: FAMILY_CARE + ny_ssp_care_setting: FAMILY_CARE marital_units: couple: members: [person1, person2] @@ -46,17 +48,19 @@ output: ny_ssp: [514.98, 514.98] -- name: Case 3, residential care couple. +- name: Case 3, residential care couple in a small non-institutional facility. + # 18 NYCRR 398-4.5(d): couple status continues where the facility is not an + # institution for SSI. 2 * 1_399 - 1_491 = 1_307, or 653.50 each. period: 2026-01 absolute_error_margin: 0.01 input: people: person1: age: 65 - ny_ssp_living_arrangement: RESIDENTIAL_CARE + ny_ssp_care_setting: RESIDENTIAL_CARE person2: age: 65 - ny_ssp_living_arrangement: RESIDENTIAL_CARE + ny_ssp_care_setting: RESIDENTIAL_CARE marital_units: couple: members: [person1, person2] @@ -71,17 +75,18 @@ output: ny_ssp: [653.5, 653.5] -- name: Case 4, enhanced residential care couple. +- name: Case 4, enhanced residential care couple in a small non-institutional facility. + # 18 NYCRR 398-4.5(e): 2 * 1_688 - 1_491 = 1_885, or 942.50 each. period: 2026-01 absolute_error_margin: 0.01 input: people: person1: age: 65 - ny_ssp_living_arrangement: ENHANCED_RESIDENTIAL_CARE + ny_ssp_care_setting: ENHANCED_RESIDENTIAL_CARE person2: age: 65 - ny_ssp_living_arrangement: ENHANCED_RESIDENTIAL_CARE + ny_ssp_care_setting: ENHANCED_RESIDENTIAL_CARE marital_units: couple: members: [person1, person2] @@ -119,7 +124,7 @@ output: ny_ssp: [23, 0] -- name: Case 6, spouse deemed income reduces state payment. +- name: Case 6, spouse deemed income above the standard of need leaves no state payment. period: 2026-01 absolute_error_margin: 0.01 input: @@ -152,10 +157,9 @@ ssi: [0, 0] # The ineligible spouse makes a two-person household. ny_ssp_living_arrangement: [LIVING_WITH_OTHERS, LIVING_WITH_OTHERS] - # Own-income path: 23 - max(0 - 994, 0) = 23. - # Deemed path: couple rate 46 - excess (1_530 - 1_491 = 39) = 7. - # The lesser path pays 7. - ny_ssp: [7, 0] + # 18 NYCRR 398-4.4(b): standard 994 + 23 = 1_017 minus the greater of the + # 994 FBR or countable income 1_530 is below zero, so no state payment. + ny_ssp: [0, 0] - name: Case 7, annual benefit and SNAP income. period: 2026 @@ -168,6 +172,10 @@ household_state_benefits: 1_044 snap_unearned_income: 12_972 hud_unearned_income: 12_972 + # SNAP with the 877 utility allowance: 168 a month in January to September + # (298 - 130) and 180 in October to December (306 - 126), 2_052 a year. + # SSI 11_928 + 1_044 + 2_052 = 15_024. + spm_unit_benefits: 15_024 - name: Case 8, part-time earnings reduce SSI but not the state payment. period: 2026-01 @@ -204,3 +212,96 @@ ny_ssp_living_arrangement: LIVING_ALONE # Excess countable income max(650.83 - 994, 0) = 0: living alone rate 87 - 0 = 87. ny_ssp: 87 + +- name: Case 9, residential care spouses claim as individuals after the month of entry. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 65 + ny_ssp_care_setting: RESIDENTIAL_CARE + person2: + age: 65 + ny_ssp_care_setting: RESIDENTIAL_CARE + # 18 NYCRR 398-4.5(d): after the month of entry into an institutional level + # II facility, the spouses are two individuals, entered as separate units. + marital_units: + unit1: + members: [person1] + unit2: + members: [person2] + tax_units: + unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: NY + county: ALBANY_COUNTY_NY + output: + ssi: [994, 994] + ny_ssp: [405, 405] + +- name: Case 10, enhanced residential care spouses claim as individuals after the month of entry. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 65 + ny_ssp_care_setting: ENHANCED_RESIDENTIAL_CARE + person2: + age: 65 + ny_ssp_care_setting: ENHANCED_RESIDENTIAL_CARE + # 18 NYCRR 398-4.5(e) applies the same rule to level III. + marital_units: + unit1: + members: [person1] + unit2: + members: [person2] + tax_units: + unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: NY + county: ALBANY_COUNTY_NY + output: + ssi: [994, 994] + ny_ssp: [694, 694] + +- name: Case 11, spouse with part-time earnings leaves the state payment unchanged under deeming. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 70 + person2: + age: 63 + # 20 hours a week at the 2026 minimum wage outside New York City, + # Long Island and Westchester ($16.00, https://dol.ny.gov/minimum-wage-0): + # 16 * 20 * 52 = 16_640. + employment_income: 16_640 + marital_units: + couple: + members: [person1, person2] + tax_units: + unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: NY + county: ALBANY_COUNTY_NY + output: + # Spouse earnings 16_640 / 12 = 1_386.67 > 497, so deeming applies. + is_ssi_spousal_deeming_applies: [true, false] + # (1_386.67 - 20 - 65) / 2 = 650.83. + ssi_countable_income: [650.83, 0] + # Couple FBR 1_491 - 650.83 = 840.17. + ssi: [840.17, 0] + # 18 NYCRR 398-4.4(b): 1_017 - max(994, 650.83) = 23. + ny_ssp: [23, 0] diff --git a/policyengine_us/tests/policy/baseline/gov/states/ny/otda/ssp/ny_ssp.yaml b/policyengine_us/tests/policy/baseline/gov/states/ny/otda/ssp/ny_ssp.yaml index 56ec0fafd14..3572d22eae5 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/ny/otda/ssp/ny_ssp.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/ny/otda/ssp/ny_ssp.yaml @@ -35,7 +35,7 @@ input: state_code: NY age: 65 - ny_ssp_living_arrangement: FAMILY_CARE + ny_ssp_care_setting: FAMILY_CARE county: ALBANY_COUNTY_NY output: ny_ssp: 228.48 @@ -46,7 +46,7 @@ input: state_code: NY age: 65 - ny_ssp_living_arrangement: FAMILY_CARE + ny_ssp_care_setting: FAMILY_CARE county: BRONX_COUNTY_NY output: ny_ssp: 266.48 @@ -57,7 +57,7 @@ input: state_code: NY age: 65 - ny_ssp_living_arrangement: FAMILY_CARE + ny_ssp_care_setting: FAMILY_CARE county: NASSAU_COUNTY_NY output: ny_ssp: 266.48 @@ -68,7 +68,7 @@ input: state_code: NY age: 65 - ny_ssp_living_arrangement: RESIDENTIAL_CARE + ny_ssp_care_setting: RESIDENTIAL_CARE county: ALBANY_COUNTY_NY output: ny_ssp: 405 @@ -79,7 +79,7 @@ input: state_code: NY age: 65 - ny_ssp_living_arrangement: RESIDENTIAL_CARE + ny_ssp_care_setting: RESIDENTIAL_CARE county: WESTCHESTER_COUNTY_NY output: ny_ssp: 435 @@ -90,7 +90,7 @@ input: state_code: NY age: 65 - ny_ssp_living_arrangement: ENHANCED_RESIDENTIAL_CARE + ny_ssp_care_setting: ENHANCED_RESIDENTIAL_CARE county: ALBANY_COUNTY_NY output: ny_ssp: 694 @@ -169,11 +169,11 @@ input: state_code: NY age: 65 - ny_ssp_living_arrangement: NONE + ny_ssp_care_setting: EXCLUDED output: ny_ssp: 0 -- name: Case 18, nursing facility personal needs. +- name: Case 18, residential health care facility personal needs by default. period: 2026-01 absolute_error_margin: 0.01 input: @@ -181,11 +181,10 @@ age: 65 ssi_lives_in_medical_treatment_facility: true ssi_medicaid_pays_majority_of_care: true - ny_ssp_living_arrangement: NURSING_FACILITY output: ny_ssp: 25 -- name: Case 19, other medical personal needs. +- name: Case 19, OPWDD or OMH facility personal needs. period: 2026-01 absolute_error_margin: 0.01 input: @@ -193,6 +192,7 @@ age: 65 ssi_lives_in_medical_treatment_facility: true ssi_medicaid_pays_majority_of_care: true + ny_ssp_care_setting: DEVELOPMENTAL_OR_MENTAL_HEALTH_FACILITY output: ny_ssp: 5 @@ -204,7 +204,6 @@ age: 65 ssi_lives_in_medical_treatment_facility: true ssi_medicaid_pays_majority_of_care: true - ny_ssp_living_arrangement: NURSING_FACILITY social_security_retirement: 252 output: ny_ssp: 0 @@ -217,7 +216,6 @@ age: 65 ssi_lives_in_medical_treatment_facility: true ssi_medicaid_pays_majority_of_care: true - ny_ssp_living_arrangement: NURSING_FACILITY social_security_retirement: 240 output: ny_ssp: 25 @@ -232,13 +230,13 @@ output: ny_ssp: 0 -- name: Case 23, nursing facility without federal institutional classification. +- name: Case 23, OPWDD or OMH facility without Medicaid paying the majority. period: 2026-01 absolute_error_margin: 0.01 input: state_code: NY age: 65 - ny_ssp_living_arrangement: NURSING_FACILITY + ny_ssp_care_setting: DEVELOPMENTAL_OR_MENTAL_HEALTH_FACILITY output: ny_ssp: 0 @@ -250,7 +248,7 @@ age: 17 is_blind: true is_full_time_student: false - ny_ssp_living_arrangement: ENHANCED_RESIDENTIAL_CARE + ny_ssp_care_setting: ENHANCED_RESIDENTIAL_CARE output: ny_ssp: 23 @@ -262,7 +260,7 @@ age: 21 is_blind: true is_full_time_student: true - ny_ssp_living_arrangement: ENHANCED_RESIDENTIAL_CARE + ny_ssp_care_setting: ENHANCED_RESIDENTIAL_CARE output: ny_ssp: 23 @@ -274,7 +272,7 @@ age: 22 is_blind: true is_full_time_student: true - ny_ssp_living_arrangement: ENHANCED_RESIDENTIAL_CARE + ny_ssp_care_setting: ENHANCED_RESIDENTIAL_CARE output: ny_ssp: 694 @@ -286,7 +284,7 @@ age: 17 is_blind: true is_full_time_student: false - ny_ssp_living_arrangement: FAMILY_CARE + ny_ssp_care_setting: FAMILY_CARE output: ny_ssp: 228.48 @@ -302,7 +300,7 @@ is_blind: true is_full_time_student: true is_household_head: false - ny_ssp_living_arrangement: ENHANCED_RESIDENTIAL_CARE + ny_ssp_care_setting: ENHANCED_RESIDENTIAL_CARE output: ny_ssp: 23 @@ -316,7 +314,7 @@ is_part_time_college_student: true is_full_time_student: false is_household_head: false - ny_ssp_living_arrangement: ENHANCED_RESIDENTIAL_CARE + ny_ssp_care_setting: ENHANCED_RESIDENTIAL_CARE output: ny_ssp: 694 @@ -329,7 +327,7 @@ is_blind: true is_full_time_student: true is_household_head: true - ny_ssp_living_arrangement: ENHANCED_RESIDENTIAL_CARE + ny_ssp_care_setting: ENHANCED_RESIDENTIAL_CARE output: ny_ssp: 694 @@ -342,7 +340,7 @@ is_blind: true is_full_time_student: true is_household_head: false - ny_ssp_living_arrangement: ENHANCED_RESIDENTIAL_CARE + ny_ssp_care_setting: ENHANCED_RESIDENTIAL_CARE output: ny_ssp: 694 @@ -432,3 +430,161 @@ ny_ssp_living_arrangement: [LIVING_WITH_OTHERS, LIVING_WITH_OTHERS, LIVING_WITH_OTHERS] # No countable income: living with others rate 23 - 0 = 23. ny_ssp: [0, 0, 23] + +- name: Case 35, general hospital resident receives no state payment. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: NY + age: 65 + ssi_lives_in_medical_treatment_facility: true + ssi_medicaid_pays_majority_of_care: true + # Social Services Law 209(2-a) pays no allowance in a general hospital. + ny_ssp_care_setting: EXCLUDED + output: + ssi: 30 + ny_ssp_living_arrangement: NONE + ny_ssp: 0 + +- name: Case 36, person at the minor age living alone is not a minor. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: NY + age: 18 + is_blind: true + is_full_time_student: false + output: + ny_ssp_living_arrangement: LIVING_ALONE + ny_ssp: 87 + +- name: Case 37, married seventeen-year-old is not a minor. + period: 2026 + input: + people: + person1: + age: 17 + is_blind: true + # A spouse is not the other spouse's tax dependent. + is_tax_unit_dependent: false + person2: + age: 19 + marital_units: + couple: + members: [person1, person2] + tax_units: + unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: NY + output: + # 18 NYCRR 398-2.1(t): a minor child is neither married nor a household head. + ny_ssp_is_minor: [false, false] + +- name: Case 38, living only with a foster child is living alone. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 70 + person2: + age: 10 + is_in_foster_care: true + households: + household: + members: [person1, person2] + state_code: NY + output: + # 18 NYCRR 398-4.5(a)(1)(vi): lives with only a foster child. + ny_ssp_living_arrangement: [LIVING_ALONE, LIVING_WITH_OTHERS] + ny_ssp: [87, 0] + +- name: Case 39, spouse at home is living alone while the other spouse is in a nursing home. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 70 + ssi_lives_in_medical_treatment_facility: true + ssi_medicaid_pays_majority_of_care: true + person2: + age: 70 + marital_units: + couple: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: NY + output: + ny_ssp_living_arrangement: [RESIDENTIAL_HEALTH_CARE_FACILITY, LIVING_ALONE] + ssi: [30, 994] + # $25 allowance in the nursing home; 87 living alone at home. + ny_ssp: [25, 87] + +- name: Case 40, deeming claimant in a nursing home receives no state payment. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 70 + ssi_lives_in_medical_treatment_facility: true + ssi_medicaid_pays_majority_of_care: true + person2: + age: 63 + social_security_retirement: 12_000 + marital_units: + couple: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: NY + output: + ny_ssp_living_arrangement: [RESIDENTIAL_HEALTH_CARE_FACILITY, LIVING_ALONE] + # Social Services Law 209(1)(d) bars a state payment in a Medicaid-majority + # facility, and the deemed income rules out the personal needs allowance + # (18 NYCRR 398-3.2(d)). + ny_ssp: [0, 0] + +- name: Case 41, spouse at home is living alone while the other spouse is in a facility Medicaid does not mostly pay for. + period: 2026-01 + input: + people: + person1: + age: 70 + ssi_lives_in_medical_treatment_facility: true + person2: + age: 70 + marital_units: + couple: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: NY + output: + ny_ssp_living_arrangement: [NONE, LIVING_ALONE] + +- name: Case 42, household member in a medical facility does not end living alone. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 70 + person2: + age: 45 + ssi_lives_in_medical_treatment_facility: true + households: + household: + members: [person1, person2] + state_code: NY + output: + ny_ssp_living_arrangement: [LIVING_ALONE, NONE] + ny_ssp: [87, 0] diff --git a/policyengine_us/variables/gov/states/ny/otda/ssp/ny_ssp.py b/policyengine_us/variables/gov/states/ny/otda/ssp/ny_ssp.py index e0f217c3860..c69e3ac2acf 100644 --- a/policyengine_us/variables/gov/states/ny/otda/ssp/ny_ssp.py +++ b/policyengine_us/variables/gov/states/ny/otda/ssp/ny_ssp.py @@ -15,15 +15,20 @@ class ny_ssp(Variable): definition_period = MONTH defined_for = StateCode.NY reference = ( - # Social Services Law 209(2)(a)-(e), (2-a) + # Social Services Law 209(2)(a)-(e), (2-a), (4) "https://www.nysenate.gov/legislation/laws/SOS/209", + # 18 NYCRR 398-2.1(g), (l), (o), (ac) + "https://www.law.cornell.edu/regulations/new-york/18-NYCRR-398-2.1", "https://www.law.cornell.edu/regulations/new-york/18-NYCRR-398-3.2", + "https://www.law.cornell.edu/regulations/new-york/18-NYCRR-398-3.4", + "https://www.law.cornell.edu/regulations/new-york/18-NYCRR-398-4.2", "https://www.law.cornell.edu/regulations/new-york/18-NYCRR-398-4.4", "https://www.law.cornell.edu/regulations/new-york/18-NYCRR-398-4.6", ) def formula(person, period, parameters): p = parameters(period).gov.states.ny.otda.ssp + fbr = parameters(period).gov.ssa.ssi.amount arrangement = person("ny_ssp_living_arrangement", period) la = arrangement.possible_values # A minor in level III receives the living-with-others rate. @@ -41,11 +46,31 @@ def formula(person, period, parameters): p.amount.individual.LIVING_WITH_OTHERS, p.amount.individual[arrangement] + premium, ) + congregate_care = ( + (arrangement == la.FAMILY_CARE) + | (arrangement == la.RESIDENTIAL_CARE) + | (arrangement == la.ENHANCED_RESIDENTIAL_CARE) + ) & ~minor_enhanced_care + household_couple = select( + [ + arrangement == la.LIVING_ALONE, + (arrangement == la.LIVING_WITH_OTHERS) | minor_enhanced_care, + ], + [p.amount.couple.LIVING_ALONE, p.amount.couple.LIVING_WITH_OTHERS], + default=0, + ) + # Social Services Law 209(2)(c)-(e): a congregate care couple's standard + # of need is two times the individual standard, so its supplement moves + # with each federal benefit increase. couple = where( - minor_enhanced_care, - p.amount.couple.LIVING_WITH_OTHERS, - p.amount.couple[arrangement] + 2 * premium, + congregate_care, + 2 * (fbr.individual + individual) - fbr.couple, + household_couple, ) + # NOTE: 18 NYCRR 398-2.1(l) requires both spouses to be in active + # receipt of SSI. The federal couple computation ignores take-up, so a + # couple in which an aged, blind or disabled spouse declines SSI is + # still computed as a couple. payment = ssi_state_supplement( person, period, @@ -54,22 +79,59 @@ def formula(person, period, parameters): couple, federal_payment_rules=False, ) + # NOTE: Under spousal deeming, New York's sources differ. The shared + # helper follows SSA's method for federally administered supplements + # (POMS SI 01320.430 D), which uses the couple rate. Social Services Law + # 209(4) subtracts "the sum of such individual's or couple's + # supplemental security income benefit plus countable income". 18 NYCRR + # 398-2.1(ac) and 398-4.4(b) subtract "the FBR or a recipient's monthly + # Countable Income, whichever is greater", where the FBR is "the maximum + # amount of SSI payable to an individual or couple with no countable + # income" (398-2.1(o)). New York administers its own supplement since + # October 1, 2014, and the model follows the regulation: countable + # income includes the deemed income (398-2.1(g)), measured against the + # individual's own FBR. + deeming = person("is_ssi_spousal_deeming_applies", period.this_year) + federal_la = person("ssi_federal_living_arrangement", period) + # 20 CFR 416.1131(a): one-third of the FBR counts as income in another + # person's household. + own_fbr = fbr.individual * where( + federal_la == SSIFederalLivingArrangement.ANOTHER_PERSONS_HOUSEHOLD, + 1 - fbr.one_third_reduction_rate, + 1, + ) + countable = person("ssi_countable_income", period) + regulatory = max_(individual - max_(countable - own_fbr, 0), 0) + eligible = person("is_ssi_eligible", period) & person( + "takes_up_ssi_if_eligible", period.this_year + ) + payment = where(deeming, eligible * regulatory, payment) + # Social Services Law 209(1)(d): no state payment in a public + # institution or a medical facility where Medicaid pays more than half + # the cost; only the personal needs allowance is paid there. + no_standard = ( + (arrangement == la.NONE) + | (arrangement == la.RESIDENTIAL_HEALTH_CARE_FACILITY) + | (arrangement == la.DEVELOPMENTAL_OR_MENTAL_HEALTH_FACILITY) + ) + payment = where(no_standard, 0, payment) payment = where(payment > 0, max_(payment, p.minimum_payment), 0) - federal = person("ssi_federal_living_arrangement", period) - medical = federal == SSIFederalLivingArrangement.MEDICAL_TREATMENT_FACILITY - personal_needs_eligible = ( - medical - & (person("ssi", period) > 0) - & (person("ssi_countable_income", period) == 0) + # NOTE: The 2026 OTDA chart gives $5 to residents of "other medical + # facilities"; Social Services Law 209(2-a) and 18 NYCRR 398-3.4 limit + # the $5 allowance to OPWDD intermediate care facilities and OMH + # hospitals and pay $25 in residential health care facilities. The + # model follows the statute and regulation. + personal_needs_eligible = (person("ssi", period) > 0) & ( + person("ssi_countable_income", period) == 0 ) personal_needs = select( [ - arrangement == la.NURSING_FACILITY, - arrangement == la.OTHER_MEDICAL_FACILITY, + arrangement == la.RESIDENTIAL_HEALTH_CARE_FACILITY, + arrangement == la.DEVELOPMENTAL_OR_MENTAL_HEALTH_FACILITY, ], [ - p.personal_needs.nursing_facility, - p.personal_needs.other_medical_facility, + p.personal_needs.residential_health_care_facility, + p.personal_needs.developmental_or_mental_health_facility, ], default=0, ) diff --git a/policyengine_us/variables/gov/states/ny/otda/ssp/ny_ssp_care_setting.py b/policyengine_us/variables/gov/states/ny/otda/ssp/ny_ssp_care_setting.py new file mode 100644 index 00000000000..df52ffcce82 --- /dev/null +++ b/policyengine_us/variables/gov/states/ny/otda/ssp/ny_ssp_care_setting.py @@ -0,0 +1,40 @@ +from policyengine_us.model_api import * + + +class NYSSPCareSetting(Enum): + FAMILY_CARE = "New York certified family care (congregate care level I)" + RESIDENTIAL_CARE = "New York certified residential care (congregate care level II)" + ENHANCED_RESIDENTIAL_CARE = ( + "New York certified enhanced residential care (congregate care level III)" + ) + DEVELOPMENTAL_OR_MENTAL_HEALTH_FACILITY = ( + "OPWDD intermediate care facility or OMH hospital" + ) + EXCLUDED = "Setting excluded from the New York State Supplement Program" + NONE = "No certified care or designated facility setting" + + +class ny_ssp_care_setting(Variable): + value_type = Enum + entity = Person + label = "New York SSP care setting" + definition_period = MONTH + defined_for = StateCode.NY + possible_values = NYSSPCareSetting + default_value = NYSSPCareSetting.NONE + reference = ( + "https://www.law.cornell.edu/regulations/new-york/18-NYCRR-398-4.5", + "https://www.law.cornell.edu/regulations/new-york/18-NYCRR-398-3.4", + ) + documentation = """ + Certified care levels require an operating certificate for the facility. + Family and residential care for minors require the authorized placements + in 18 NYCRR 398-4.5. DEVELOPMENTAL_OR_MENTAL_HEALTH_FACILITY covers OPWDD + intermediate care facilities and OMH hospitals, which pay the lower + personal needs allowance when Medicaid pays most of the cost of care. + EXCLUDED covers publicly operated residences, emergency shelters and other + medical facilities, such as general hospitals, that the State Supplement + Program does not pay. Use separate marital units for a spouse living apart + in an excluded setting, and for couples after their month of entry into an + institutional level II or III facility. + """ diff --git a/policyengine_us/variables/gov/states/ny/otda/ssp/ny_ssp_is_minor.py b/policyengine_us/variables/gov/states/ny/otda/ssp/ny_ssp_is_minor.py index 9bbd52a6ebd..55e7265f1b6 100644 --- a/policyengine_us/variables/gov/states/ny/otda/ssp/ny_ssp_is_minor.py +++ b/policyengine_us/variables/gov/states/ny/otda/ssp/ny_ssp_is_minor.py @@ -9,6 +9,7 @@ class ny_ssp_is_minor(Variable): entity = Person label = "Minor for New York State Supplement Program living arrangements" definition_period = YEAR + defined_for = StateCode.NY reference = ( # 18 NYCRR 398-2.1(t) "https://www.law.cornell.edu/regulations/new-york/18-NYCRR-398-2.1", diff --git a/policyengine_us/variables/gov/states/ny/otda/ssp/ny_ssp_living_arrangement.py b/policyengine_us/variables/gov/states/ny/otda/ssp/ny_ssp_living_arrangement.py index b1d0ebdd565..10f6c0a256e 100644 --- a/policyengine_us/variables/gov/states/ny/otda/ssp/ny_ssp_living_arrangement.py +++ b/policyengine_us/variables/gov/states/ny/otda/ssp/ny_ssp_living_arrangement.py @@ -2,6 +2,9 @@ from policyengine_us.variables.gov.ssa.ssi.eligibility.status.ssi_federal_living_arrangement import ( SSIFederalLivingArrangement, ) +from policyengine_us.variables.gov.states.ny.otda.ssp.ny_ssp_care_setting import ( + NYSSPCareSetting, +) class NYSSPLivingArrangement(Enum): @@ -10,8 +13,10 @@ class NYSSPLivingArrangement(Enum): FAMILY_CARE = "Certified congregate care level I" RESIDENTIAL_CARE = "Certified congregate care level II" ENHANCED_RESIDENTIAL_CARE = "Certified congregate care level III" - NURSING_FACILITY = "Department of Health licensed nursing facility" - OTHER_MEDICAL_FACILITY = "Other qualifying Medicaid medical facility" + RESIDENTIAL_HEALTH_CARE_FACILITY = "Residential health care facility" + DEVELOPMENTAL_OR_MENTAL_HEALTH_FACILITY = ( + "OPWDD intermediate care facility or OMH hospital" + ) NONE = "No eligible New York living arrangement" @@ -23,34 +28,57 @@ class ny_ssp_living_arrangement(Variable): defined_for = StateCode.NY possible_values = NYSSPLivingArrangement default_value = NYSSPLivingArrangement.NONE - reference = "https://www.law.cornell.edu/regulations/new-york/18-NYCRR-398-4.5" + reference = ( + "https://www.law.cornell.edu/regulations/new-york/18-NYCRR-398-4.5", + "https://www.law.cornell.edu/regulations/new-york/18-NYCRR-398-3.4", + ) documentation = """ - Set certified care categories explicitly. Family and residential care for - minors require the authorized placements specified in 18 NYCRR 398-4.5. - The formula uses household membership; set LIVING_ALONE explicitly for - qualifying separate-food, room-and-board, foster-child or attendant cases. - The household count includes a spouse who lives in a medical facility, - because temporary and permanent absence are not modeled, so set the - arrangement of the spouse at home explicitly. Use NONE for excluded public - facilities and emergency shelters. Residents of medical facilities where - Medicaid pays more than half the cost default to OTHER_MEDICAL_FACILITY, - the lower personal needs allowance; residents of Department of Health - licensed nursing homes receive the higher allowance only when - NURSING_FACILITY is set explicitly. Set SSI claim status explicitly for - institutional couples after their month of entry. + Care levels and designated facilities come from ny_ssp_care_setting. + Residents of medical facilities where Medicaid pays more than half the + cost default to a residential health care facility (nursing home). Set + this variable for every member of the household only for the separate-food, + room-and-board, homemaker, family care resident or aide cases that + 18 NYCRR 398-4.5(a)(1) counts as living alone. """ def formula(person, period, parameters): la = NYSSPLivingArrangement + care = person("ny_ssp_care_setting", period) federal = person("ssi_federal_living_arrangement", period) medical = federal == SSIFederalLivingArrangement.MEDICAL_TREATMENT_FACILITY - excluded = person("ssi_lives_in_medical_treatment_facility", period) & ~medical + in_facility = person("ssi_lives_in_medical_treatment_facility", period) + designated = care == NYSSPCareSetting.DEVELOPMENTAL_OR_MENTAL_HEALTH_FACILITY + excluded = (care == NYSSPCareSetting.EXCLUDED) | ( + (in_facility | designated) & ~medical + ) other = federal == SSIFederalLivingArrangement.ANOTHER_PERSONS_HOUSEHOLD joint = person("ssi_couple_computation_applies", period) - alone = person.household.nb_persons() == where(joint, 2, 1) + # 18 NYCRR 398-4.5(a) defines living alone by the private household. + # Foster children do not end it ((a)(1)(vi), (a)(2)(ii)), and a member + # living in a medical facility is not part of the household. + household_member = ~person("is_in_foster_care", period) & ~in_facility + alone = person.household.sum(household_member) == where( + joint, person.marital_unit.sum(household_member), 1 + ) minor = person("ny_ssp_is_minor", period.this_year) return select( - [excluded, medical, other | minor | ~alone], - [la.NONE, la.OTHER_MEDICAL_FACILITY, la.LIVING_WITH_OTHERS], + [ + excluded, + medical & designated, + medical, + care == NYSSPCareSetting.FAMILY_CARE, + care == NYSSPCareSetting.RESIDENTIAL_CARE, + care == NYSSPCareSetting.ENHANCED_RESIDENTIAL_CARE, + other | minor | ~alone, + ], + [ + la.NONE, + la.DEVELOPMENTAL_OR_MENTAL_HEALTH_FACILITY, + la.RESIDENTIAL_HEALTH_CARE_FACILITY, + la.FAMILY_CARE, + la.RESIDENTIAL_CARE, + la.ENHANCED_RESIDENTIAL_CARE, + la.LIVING_WITH_OTHERS, + ], default=la.LIVING_ALONE, )