From 830401fb1960973874c487728d2aa3ab9bc8c990 Mon Sep 17 00:00:00 2001 From: Ziming Date: Mon, 12 Oct 2026 14:19:46 -0400 Subject: [PATCH 1/6] Add New Jersey state supplementation for 2026 --- changelog.d/nj-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/nj/dhs/ssp/amount/couple.yaml | 26 +++ .../states/nj/dhs/ssp/amount/individual.yaml | 26 +++ .../usda/snap/income/sources/unearned.yaml | 7 +- policyengine_us/programs.yaml | 12 ++ .../gov/states/nj/dhs/ssp/integration.yaml | 193 ++++++++++++++++++ .../gov/states/nj/dhs/ssp/nj_ssp.yaml | 138 +++++++++++++ .../gov/ssa/ssi/_ssi_state_supplement.py | 53 +++++ .../variables/gov/states/nj/dhs/ssp/nj_ssp.py | 25 +++ .../states/nj/dhs/ssp/nj_ssp_care_setting.py | 25 +++ .../nj/dhs/ssp/nj_ssp_living_arrangement.py | 64 ++++++ .../income/spm_unit/spm_unit_benefits.py | 1 + 15 files changed, 584 insertions(+), 4 deletions(-) create mode 100644 changelog.d/nj-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/nj/dhs/ssp/amount/couple.yaml create mode 100644 policyengine_us/parameters/gov/states/nj/dhs/ssp/amount/individual.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/nj/dhs/ssp/integration.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/nj/dhs/ssp/nj_ssp.yaml create mode 100644 policyengine_us/variables/gov/ssa/ssi/_ssi_state_supplement.py create mode 100644 policyengine_us/variables/gov/states/nj/dhs/ssp/nj_ssp.py create mode 100644 policyengine_us/variables/gov/states/nj/dhs/ssp/nj_ssp_care_setting.py create mode 100644 policyengine_us/variables/gov/states/nj/dhs/ssp/nj_ssp_living_arrangement.py diff --git a/changelog.d/nj-ssp-2026.added.md b/changelog.d/nj-ssp-2026.added.md new file mode 100644 index 00000000000..7a522b36c2a --- /dev/null +++ b/changelog.d/nj-ssp-2026.added.md @@ -0,0 +1 @@ +Add New Jersey state supplementary payments and the ineligible-spouse variation, verified for 2026. diff --git a/policyengine_us/parameters/gov/household/household_state_benefits.yaml b/policyengine_us/parameters/gov/household/household_state_benefits.yaml index d2cbd6ba2d4..ecbffad50cc 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 + - nj_ssp - ks_sspp # Hawaii benefits - hi_oss @@ -176,6 +177,7 @@ values: # DC benefits - dc_ossp # Kansas benefits + - nj_ssp - ks_sspp # Hawaii benefits - hi_oss @@ -279,6 +281,7 @@ values: - dc_ossp - dc_child_care_subsidies # Kansas benefits + - nj_ssp - ks_sspp # Hawaii benefits - hi_oss @@ -382,6 +385,7 @@ values: - dc_ossp - dc_child_care_subsidies # Kansas benefits + - nj_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..5835cb0d57b 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 + - nj_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/nj/dhs/ssp/amount/couple.yaml b/policyengine_us/parameters/gov/states/nj/dhs/ssp/amount/couple.yaml new file mode 100644 index 00000000000..69ac2d555d9 --- /dev/null +++ b/policyengine_us/parameters/gov/states/nj/dhs/ssp/amount/couple.yaml @@ -0,0 +1,26 @@ +description: New Jersey provides these monthly state supplementary payment rates for an eligible couple. +metadata: + unit: currency-USD + period: month + label: New Jersey SSP couple payment rate + breakdown: + - nj_ssp_living_arrangement + reference: + - title: POMS SI 01415.058 J.2, New Jersey January 2026 payment levels + href: https://secure.ssa.gov/poms.nsf/lnx/0501415058#j + - title: POMS SI 01320.430 D, Ineligible spouse uses corresponding couple rate or higher individual rate + href: https://secure.ssa.gov/poms.nsf/lnx/0501320430#D +LIVING_ALONE_OR_WITH_OTHERS: + 2026-01-01: 25.35 +LIVING_ONLY_WITH_INELIGIBLE_SPOUSE: + 2026-01-01: 25.35 +CONGREGATE_CARE: + 2026-01-01: 618.35 +RESIDENTIAL_HEALTH_CARE: + 2026-01-01: 738.35 +HOUSEHOLD_OF_ANOTHER: + 2026-01-01: 93.08 +MEDICAID_INSTITUTION: + 2026-01-01: 40 +NONE: + 2026-01-01: 0 diff --git a/policyengine_us/parameters/gov/states/nj/dhs/ssp/amount/individual.yaml b/policyengine_us/parameters/gov/states/nj/dhs/ssp/amount/individual.yaml new file mode 100644 index 00000000000..4d85c056307 --- /dev/null +++ b/policyengine_us/parameters/gov/states/nj/dhs/ssp/amount/individual.yaml @@ -0,0 +1,26 @@ +description: New Jersey provides these monthly state supplementary payment rates for an eligible individual. +metadata: + unit: currency-USD + period: month + label: New Jersey SSP individual payment rate + breakdown: + - nj_ssp_living_arrangement + reference: + - title: POMS SI 01415.058 J.2, New Jersey January 2026 payment levels + href: https://secure.ssa.gov/poms.nsf/lnx/0501415058#j + - title: POMS SI 01320.430 D, Ineligible spouse uses corresponding couple rate or higher individual rate + href: https://secure.ssa.gov/poms.nsf/lnx/0501320430#D +LIVING_ALONE_OR_WITH_OTHERS: + 2026-01-01: 31.25 +LIVING_ONLY_WITH_INELIGIBLE_SPOUSE: + 2026-01-01: 152.99 +CONGREGATE_CARE: + 2026-01-01: 150.05 +RESIDENTIAL_HEALTH_CARE: + 2026-01-01: 210.05 +HOUSEHOLD_OF_ANOTHER: + 2026-01-01: 44.31 +MEDICAID_INSTITUTION: + 2026-01-01: 20 +NONE: + 2026-01-01: 0 diff --git a/policyengine_us/parameters/gov/usda/snap/income/sources/unearned.yaml b/policyengine_us/parameters/gov/usda/snap/income/sources/unearned.yaml index 6f94d3d09b2..2bf3514f591 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 + - nj_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..3657589ebbc 100644 --- a/policyengine_us/programs.yaml +++ b/policyengine_us/programs.yaml @@ -1090,6 +1090,18 @@ 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: NJ + status: partial + name: New Jersey SSP + full_name: New Jersey State Supplementary Payment + variable: nj_ssp + parameter_prefix: gov.states.nj.dhs.ssp + verified_years: "2026" + notes: >- + Models optional living-arrangement payments, including the special + ineligible-spouse rate. Separate food households, certified settings + and post-institutionalization individual claims require explicit + inputs. Mandatory grandfathered supplementation is not modeled. - id: social_security name: Social Security diff --git a/policyengine_us/tests/policy/baseline/gov/states/nj/dhs/ssp/integration.yaml b/policyengine_us/tests/policy/baseline/gov/states/nj/dhs/ssp/integration.yaml new file mode 100644 index 00000000000..2656a21987c --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/nj/dhs/ssp/integration.yaml @@ -0,0 +1,193 @@ +- name: Case 1, eligible couple rounds each half up. + period: 2026-01 + absolute_error_margin: 0.001 + input: + people: + first: + age: 65 + second: + age: 65 + marital_units: + couple: + members: + - first + - second + tax_units: + unit: + members: &id001 + - first + - second + households: + household: + members: *id001 + state_code: NJ + output: + nj_ssp: + - 12.68 + - 12.68 +- name: Case 2, congregate care couple. + period: 2026-01 + absolute_error_margin: 0.001 + input: + people: + first: + age: 65 + nj_ssp_care_setting: CONGREGATE_CARE + second: + age: 65 + nj_ssp_care_setting: CONGREGATE_CARE + marital_units: + couple: + members: + - first + - second + tax_units: + unit: + members: &id002 + - first + - second + households: + household: + members: *id002 + state_code: NJ + output: + nj_ssp: + - 309.18 + - 309.18 +- name: Case 3, special rate with only an ineligible spouse. + period: 2026-01 + absolute_error_margin: 0.001 + input: + people: + first: + age: 65 + second: + age: 40 + marital_units: + couple: + members: + - first + - second + tax_units: + unit: + members: &id003 + - first + - second + households: + household: + members: *id003 + state_code: NJ + output: + nj_ssp: + - 152.99 + - 0 +- name: Case 4, deeming uses higher individual special rate. + period: 2026-01 + absolute_error_margin: 0.001 + input: + people: + first: + age: 65 + second: + age: 40 + social_security_retirement: 19800 + marital_units: + couple: + members: + - first + - second + tax_units: + unit: + members: &id004 + - first + - second + households: + household: + members: *id004 + state_code: NJ + output: + nj_ssp: + - 13.99 + - 0 +- name: Case 5, special rate ends when a child shares the household. + period: 2026-01 + absolute_error_margin: 0.001 + input: + people: + first: + age: 65 + second: + age: 40 + child: + age: 12 + is_tax_unit_dependent: true + marital_units: + couple: + members: + - first + - second + child: + members: + - child + tax_units: + unit: + members: &id005 + - first + - second + - child + households: + household: + members: *id005 + state_code: NJ + output: + nj_ssp: + - 31.25 + - 0 + - 0 +- name: Case 6, explicit separate food household state determination. + period: 2026-01 + absolute_error_margin: 0.001 + input: + people: + first: + age: 65 + nj_ssp_living_arrangement: LIVING_ONLY_WITH_INELIGIBLE_SPOUSE + second: + age: 40 + child: + age: 12 + is_tax_unit_dependent: true + marital_units: + couple: + members: + - first + - second + child: + members: + - child + tax_units: + unit: + members: &id006 + - first + - second + - child + households: + household: + members: *id006 + state_code: NJ + output: + nj_ssp: + - 152.99 + - 0 + - 0 +- name: Case 7, annual state benefits and SNAP income. + period: 2026 + absolute_error_margin: 0.01 + input: + state_code: NJ + age: 65 + output: + nj_ssp: 375 + household_state_benefits: 375 + snap_unearned_income: 12303 + hud_unearned_income: 12303 diff --git a/policyengine_us/tests/policy/baseline/gov/states/nj/dhs/ssp/nj_ssp.yaml b/policyengine_us/tests/policy/baseline/gov/states/nj/dhs/ssp/nj_ssp.yaml new file mode 100644 index 00000000000..02c9e6b0b7b --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/nj/dhs/ssp/nj_ssp.yaml @@ -0,0 +1,138 @@ +# Sources: POMS SI 01415.058 J and SI NY01415.025. +- name: Case 1, independent individual. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: NJ + age: 65 + output: + nj_ssp: 31.25 +- name: Case 2, certified congregate care. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: NJ + age: 65 + nj_ssp_care_setting: CONGREGATE_CARE + output: + nj_ssp: 150.05 +- name: Case 3, certified residential health care. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: NJ + age: 65 + nj_ssp_care_setting: RESIDENTIAL_HEALTH_CARE + output: + nj_ssp: 210.05 +- name: Case 4, excluded setting. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: NJ + age: 65 + nj_ssp_care_setting: EXCLUDED + output: + nj_ssp: 0 +- name: Case 5, Medicaid institutional payment. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: NJ + age: 65 + ssi_lives_in_medical_treatment_facility: true + ssi_medicaid_pays_majority_of_care: true + output: + ssi: 30 + nj_ssp: 20 +- name: Case 6, non Medicaid medical institution. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: NJ + age: 65 + ssi_lives_in_medical_treatment_facility: true + output: + nj_ssp: 0 +- name: Case 7, household of another. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: NJ + age: 65 + ssi_lives_in_another_persons_household: true + ssi_receives_shelter_from_others_in_household: true + ssi_others_pay_all_meals: true + output: + nj_ssp: 44.31 +- name: Case 8, state only payment. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: NJ + age: 65 + social_security_retirement: 12360 + output: + ssi: 0 + nj_ssp: 15.25 +- name: Case 9, positive sub dollar amount receives minimum. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: NJ + age: 65 + social_security_retirement: 12542.88 + output: + nj_ssp: 1 +- name: Case 10, combined income cutoff. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: NJ + age: 65 + social_security_retirement: 12543 + output: + nj_ssp: 0 +- name: Case 11, resource cutoff. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: NJ + age: 65 + ssi_countable_resources: 2001 + output: + nj_ssp: 0 +- name: Case 12, no aged blind or disabled category. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: NJ + age: 30 + output: + nj_ssp: 0 +- name: Case 13, disabled child. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: NJ + age: 12 + meets_ssi_disability_criteria: true + output: + nj_ssp: 31.25 +- name: Case 14, out of state. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: NY + age: 65 + output: + nj_ssp: 0 +- name: Case 15, declining SSI application. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: NJ + age: 65 + takes_up_ssi_if_eligible: false + output: + nj_ssp: 0 diff --git a/policyengine_us/variables/gov/ssa/ssi/_ssi_state_supplement.py b/policyengine_us/variables/gov/ssa/ssi/_ssi_state_supplement.py new file mode 100644 index 00000000000..5e0c84da3f3 --- /dev/null +++ b/policyengine_us/variables/gov/ssa/ssi/_ssi_state_supplement.py @@ -0,0 +1,53 @@ +from policyengine_us.model_api import * +from policyengine_us.variables.gov.ssa.ssi.eligibility.status.ssi_federal_living_arrangement import ( + SSIFederalLivingArrangement, +) + + +def ssi_state_supplement( + person, period, parameters, individual_rate, couple_rate, federal_payment_rules=True +): + """Apply SSI-based supplement income, couple and spouse-deeming rules. + + Rates are state supplements, excluding federal SSI. Each member supplies + the same-category couple rate; averaging these rates implements mixed + arrangements where the state's published schedule supports that method. + Set federal_payment_rules only for SSA-administered payments; state + administrators do not inherit the federal rounding or minimum payment. + Sources: 20 CFR 416.2025; POMS SI 01320.430 D, SI 02005.030 G, + SI 02001.005 and SI 02001.010. Callers apply state-specific eligibility. + """ + joint = person("ssi_couple_computation_applies", period) + couple_total = person.marital_unit.sum(couple_rate / 2) + standard = where(joint, couple_total / 2, individual_rate) + countable = person("ssi_countable_income", period) + federal_amount = person("ssi_amount_if_eligible", period) + excess = max_(countable - federal_amount, 0) + payment = max_(standard - excess, 0) + + deeming = person("is_ssi_spousal_deeming_applies", period.this_year) + deemed = person("ssi_income_deemed_from_ineligible_spouse", period) + own_income = max_(countable - deemed, 0) + ssi = parameters(period).gov.ssa.ssi + federal_la = person("ssi_federal_living_arrangement", period) + own_federal_amount = ssi.amount.individual * where( + federal_la == SSIFederalLivingArrangement.ANOTHER_PERSONS_HOUSEHOLD, + 1 - ssi.amount.one_third_reduction_rate, + 1, + ) + own_payment = max_(individual_rate - max_(own_income - own_federal_amount, 0), 0) + # SI 01320.430 D.2: use the higher individual rate where it exceeds + # the couple rate (including New Jersey's ineligible-spouse variation). + deemed_payment = max_(max_(couple_rate, individual_rate) - excess, 0) + payment = where(deeming, min_(own_payment, deemed_payment), payment) + + eligible = person("is_ssi_eligible", period) & person( + "takes_up_ssi_if_eligible", period.this_year + ) + # Federal administration discards digits beyond the third decimal place, + # rounds up to cents, and pays at least one dollar for a positive amount. + rounded = np.ceil(np.floor(payment * 1_000) / 10) / 100 + federal_payment = where( + rounded > 0, max_(rounded, ssi.state_supplement.minimum_payment), 0 + ) + return eligible * where(federal_payment_rules, federal_payment, payment) diff --git a/policyengine_us/variables/gov/states/nj/dhs/ssp/nj_ssp.py b/policyengine_us/variables/gov/states/nj/dhs/ssp/nj_ssp.py new file mode 100644 index 00000000000..c7820761e0c --- /dev/null +++ b/policyengine_us/variables/gov/states/nj/dhs/ssp/nj_ssp.py @@ -0,0 +1,25 @@ +from policyengine_us.model_api import * +from policyengine_us.variables.gov.ssa.ssi._ssi_state_supplement import ( + ssi_state_supplement, +) + + +class nj_ssp(Variable): + value_type = float + entity = Person + label = "New Jersey State Supplementary Payment" + definition_period = MONTH + unit = USD + defined_for = StateCode.NJ + reference = ( + "https://secure.ssa.gov/poms.nsf/lnx/0501415058#j", + "https://secure.ssa.gov/poms.nsf/lnx/0501415025NY", + "https://secure.ssa.gov/poms.nsf/lnx/0501320430#D", + ) + + def formula(person, period, parameters): + p = parameters(period).gov.states.nj.dhs.ssp.amount + arrangement = person("nj_ssp_living_arrangement", period) + return ssi_state_supplement( + person, period, parameters, p.individual[arrangement], p.couple[arrangement] + ) diff --git a/policyengine_us/variables/gov/states/nj/dhs/ssp/nj_ssp_care_setting.py b/policyengine_us/variables/gov/states/nj/dhs/ssp/nj_ssp_care_setting.py new file mode 100644 index 00000000000..a30606e209a --- /dev/null +++ b/policyengine_us/variables/gov/states/nj/dhs/ssp/nj_ssp_care_setting.py @@ -0,0 +1,25 @@ +from policyengine_us.model_api import * + + +class NJSSPCareSetting(Enum): + NONE = "No certified care setting" + CONGREGATE_CARE = "New Jersey certified congregate care" + RESIDENTIAL_HEALTH_CARE = "New Jersey certified residential health care" + EXCLUDED = "Setting excluded from New Jersey supplementation" + + +class nj_ssp_care_setting(Variable): + value_type = Enum + entity = Person + label = "New Jersey SSP certified care setting" + definition_period = MONTH + possible_values = NJSSPCareSetting + default_value = NJSSPCareSetting.NONE + reference = "https://secure.ssa.gov/poms.nsf/lnx/0501415025NY" + documentation = """ + Certified settings require inclusion in New Jersey's Congregate Care + Directory. EXCLUDED includes publicly operated community residences, + emergency shelters and institutional children funded by private insurance. + Use the SSI claim and marital-unit inputs to represent separate individual + claims after institutionalization; this input does not change federal SSI. + """ diff --git a/policyengine_us/variables/gov/states/nj/dhs/ssp/nj_ssp_living_arrangement.py b/policyengine_us/variables/gov/states/nj/dhs/ssp/nj_ssp_living_arrangement.py new file mode 100644 index 00000000000..15842d07fd8 --- /dev/null +++ b/policyengine_us/variables/gov/states/nj/dhs/ssp/nj_ssp_living_arrangement.py @@ -0,0 +1,64 @@ +from policyengine_us.model_api import * +from policyengine_us.variables.gov.states.nj.dhs.ssp.nj_ssp_care_setting import ( + NJSSPCareSetting, +) +from policyengine_us.variables.gov.ssa.ssi.eligibility.status.ssi_federal_living_arrangement import ( + SSIFederalLivingArrangement, +) + + +class NJSSPLivingArrangement(Enum): + LIVING_ALONE_OR_WITH_OTHERS = "Living alone or with others" + LIVING_ONLY_WITH_INELIGIBLE_SPOUSE = "Living only with an ineligible spouse" + CONGREGATE_CARE = "Certified congregate care" + RESIDENTIAL_HEALTH_CARE = "Certified residential health care" + HOUSEHOLD_OF_ANOTHER = "Household of another" + MEDICAID_INSTITUTION = "Medicaid institution" + NONE = "No supplement" + + +class nj_ssp_living_arrangement(Variable): + value_type = Enum + entity = Person + label = "New Jersey SSP living arrangement" + definition_period = MONTH + defined_for = StateCode.NJ + possible_values = NJSSPLivingArrangement + default_value = NJSSPLivingArrangement.NONE + reference = "https://secure.ssa.gov/poms.nsf/lnx/0501415025NY" + documentation = """ + A separately purchasing couple sharing an address with others, or a couple + living only with foster children, can set the ineligible-spouse variation + explicitly after the state's household determination. + """ + + def formula(person, period, parameters): + care = person("nj_ssp_care_setting", period) + federal = person("ssi_federal_living_arrangement", period) + medical = federal == SSIFederalLivingArrangement.MEDICAL_TREATMENT_FACILITY + other_medical = ( + person("ssi_lives_in_medical_treatment_facility", period) & ~medical + ) + ineligible_spouse = person.marital_unit.any( + person("is_ssi_ineligible_spouse", period.this_year) + ) + no_others = person.household.nb_persons() == person.marital_unit.nb_persons() + return select( + [ + (care == NJSSPCareSetting.EXCLUDED) | other_medical, + medical, + care == NJSSPCareSetting.CONGREGATE_CARE, + care == NJSSPCareSetting.RESIDENTIAL_HEALTH_CARE, + federal == SSIFederalLivingArrangement.ANOTHER_PERSONS_HOUSEHOLD, + ineligible_spouse & no_others, + ], + [ + NJSSPLivingArrangement.NONE, + NJSSPLivingArrangement.MEDICAID_INSTITUTION, + NJSSPLivingArrangement.CONGREGATE_CARE, + NJSSPLivingArrangement.RESIDENTIAL_HEALTH_CARE, + NJSSPLivingArrangement.HOUSEHOLD_OF_ANOTHER, + NJSSPLivingArrangement.LIVING_ONLY_WITH_INELIGIBLE_SPOUSE, + ], + default=NJSSPLivingArrangement.LIVING_ALONE_OR_WITH_OTHERS, + ) 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..b2fb161ba57 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", + "nj_ssp", "ks_sspp", # Kansas benefits "hi_oss", "la_oss", # Louisiana benefits From 07b6054994010a71a0379d30c6e53e56e57c33b6 Mon Sep 17 00:00:00 2001 From: Ziming Date: Tue, 13 Oct 2026 00:59:58 -0400 Subject: [PATCH 2/6] Normalize New Jersey 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/nj/dhs/ssp/amount/couple.yaml | 18 ++- .../states/nj/dhs/ssp/amount/individual.yaml | 18 ++- .../gov/states/nj/dhs/ssp/integration.yaml | 122 ++++++------------ .../gov/states/nj/dhs/ssp/nj_ssp.yaml | 22 +++- 7 files changed, 90 insertions(+), 93 deletions(-) diff --git a/policyengine_us/parameters/gov/household/household_state_benefits.yaml b/policyengine_us/parameters/gov/household/household_state_benefits.yaml index ecbffad50cc..34225edfd88 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 5835cb0d57b..10dd7d9d63f 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/nj/dhs/ssp/amount/couple.yaml b/policyengine_us/parameters/gov/states/nj/dhs/ssp/amount/couple.yaml index 69ac2d555d9..6a3c2f8793d 100644 --- a/policyengine_us/parameters/gov/states/nj/dhs/ssp/amount/couple.yaml +++ b/policyengine_us/parameters/gov/states/nj/dhs/ssp/amount/couple.yaml @@ -1,26 +1,34 @@ description: New Jersey provides these monthly state supplementary payment rates for an eligible couple. + metadata: unit: currency-USD period: month label: New Jersey SSP couple payment rate breakdown: - - nj_ssp_living_arrangement + - nj_ssp_living_arrangement reference: - - title: POMS SI 01415.058 J.2, New Jersey January 2026 payment levels - href: https://secure.ssa.gov/poms.nsf/lnx/0501415058#j - - title: POMS SI 01320.430 D, Ineligible spouse uses corresponding couple rate or higher individual rate - href: https://secure.ssa.gov/poms.nsf/lnx/0501320430#D + - title: POMS SI 01415.058 J.2, New Jersey January 2026 payment levels + href: https://secure.ssa.gov/poms.nsf/lnx/0501415058#j + - title: POMS SI 01320.430 D, Ineligible spouse uses corresponding couple rate or higher individual rate + href: https://secure.ssa.gov/poms.nsf/lnx/0501320430#D + LIVING_ALONE_OR_WITH_OTHERS: 2026-01-01: 25.35 + LIVING_ONLY_WITH_INELIGIBLE_SPOUSE: 2026-01-01: 25.35 + CONGREGATE_CARE: 2026-01-01: 618.35 + RESIDENTIAL_HEALTH_CARE: 2026-01-01: 738.35 + HOUSEHOLD_OF_ANOTHER: 2026-01-01: 93.08 + MEDICAID_INSTITUTION: 2026-01-01: 40 + NONE: 2026-01-01: 0 diff --git a/policyengine_us/parameters/gov/states/nj/dhs/ssp/amount/individual.yaml b/policyengine_us/parameters/gov/states/nj/dhs/ssp/amount/individual.yaml index 4d85c056307..753b5c67e17 100644 --- a/policyengine_us/parameters/gov/states/nj/dhs/ssp/amount/individual.yaml +++ b/policyengine_us/parameters/gov/states/nj/dhs/ssp/amount/individual.yaml @@ -1,26 +1,34 @@ description: New Jersey provides these monthly state supplementary payment rates for an eligible individual. + metadata: unit: currency-USD period: month label: New Jersey SSP individual payment rate breakdown: - - nj_ssp_living_arrangement + - nj_ssp_living_arrangement reference: - - title: POMS SI 01415.058 J.2, New Jersey January 2026 payment levels - href: https://secure.ssa.gov/poms.nsf/lnx/0501415058#j - - title: POMS SI 01320.430 D, Ineligible spouse uses corresponding couple rate or higher individual rate - href: https://secure.ssa.gov/poms.nsf/lnx/0501320430#D + - title: POMS SI 01415.058 J.2, New Jersey January 2026 payment levels + href: https://secure.ssa.gov/poms.nsf/lnx/0501415058#j + - title: POMS SI 01320.430 D, Ineligible spouse uses corresponding couple rate or higher individual rate + href: https://secure.ssa.gov/poms.nsf/lnx/0501320430#D + LIVING_ALONE_OR_WITH_OTHERS: 2026-01-01: 31.25 + LIVING_ONLY_WITH_INELIGIBLE_SPOUSE: 2026-01-01: 152.99 + CONGREGATE_CARE: 2026-01-01: 150.05 + RESIDENTIAL_HEALTH_CARE: 2026-01-01: 210.05 + HOUSEHOLD_OF_ANOTHER: 2026-01-01: 44.31 + MEDICAID_INSTITUTION: 2026-01-01: 20 + NONE: 2026-01-01: 0 diff --git a/policyengine_us/tests/policy/baseline/gov/states/nj/dhs/ssp/integration.yaml b/policyengine_us/tests/policy/baseline/gov/states/nj/dhs/ssp/integration.yaml index 2656a21987c..4be3201a677 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/nj/dhs/ssp/integration.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/nj/dhs/ssp/integration.yaml @@ -3,183 +3,147 @@ absolute_error_margin: 0.001 input: people: - first: + person1: age: 65 - second: + person2: age: 65 marital_units: couple: - members: - - first - - second + members: [person1, person2] tax_units: unit: - members: &id001 - - first - - second + members: &id001 [person1, person2] households: household: members: *id001 state_code: NJ output: - nj_ssp: - - 12.68 - - 12.68 + nj_ssp: [12.68, 12.68] + - name: Case 2, congregate care couple. period: 2026-01 absolute_error_margin: 0.001 input: people: - first: + person1: age: 65 nj_ssp_care_setting: CONGREGATE_CARE - second: + person2: age: 65 nj_ssp_care_setting: CONGREGATE_CARE marital_units: couple: - members: - - first - - second + members: [person1, person2] tax_units: unit: - members: &id002 - - first - - second + members: &id002 [person1, person2] households: household: members: *id002 state_code: NJ output: - nj_ssp: - - 309.18 - - 309.18 + nj_ssp: [309.18, 309.18] + - name: Case 3, special rate with only an ineligible spouse. period: 2026-01 absolute_error_margin: 0.001 input: people: - first: + person1: age: 65 - second: + person2: age: 40 marital_units: couple: - members: - - first - - second + members: [person1, person2] tax_units: unit: - members: &id003 - - first - - second + members: &id003 [person1, person2] households: household: members: *id003 state_code: NJ output: - nj_ssp: - - 152.99 - - 0 + nj_ssp: [152.99, 0] + - name: Case 4, deeming uses higher individual special rate. period: 2026-01 absolute_error_margin: 0.001 input: people: - first: + person1: age: 65 - second: + person2: age: 40 - social_security_retirement: 19800 + social_security_retirement: 19_800 marital_units: couple: - members: - - first - - second + members: [person1, person2] tax_units: unit: - members: &id004 - - first - - second + members: &id004 [person1, person2] households: household: members: *id004 state_code: NJ output: - nj_ssp: - - 13.99 - - 0 + nj_ssp: [13.99, 0] + - name: Case 5, special rate ends when a child shares the household. period: 2026-01 absolute_error_margin: 0.001 input: people: - first: + person1: age: 65 - second: + person2: age: 40 - child: + person3: age: 12 is_tax_unit_dependent: true marital_units: couple: - members: - - first - - second + members: [person1, person2] child: - members: - - child + members: [person3] tax_units: unit: - members: &id005 - - first - - second - - child + members: &id005 [person1, person2, person3] households: household: members: *id005 state_code: NJ output: - nj_ssp: - - 31.25 - - 0 - - 0 + nj_ssp: [31.25, 0, 0] + - name: Case 6, explicit separate food household state determination. period: 2026-01 absolute_error_margin: 0.001 input: people: - first: + person1: age: 65 nj_ssp_living_arrangement: LIVING_ONLY_WITH_INELIGIBLE_SPOUSE - second: + person2: age: 40 - child: + person3: age: 12 is_tax_unit_dependent: true marital_units: couple: - members: - - first - - second + members: [person1, person2] child: - members: - - child + members: [person3] tax_units: unit: - members: &id006 - - first - - second - - child + members: &id006 [person1, person2, person3] households: household: members: *id006 state_code: NJ output: - nj_ssp: - - 152.99 - - 0 - - 0 + nj_ssp: [152.99, 0, 0] + - name: Case 7, annual state benefits and SNAP income. period: 2026 absolute_error_margin: 0.01 @@ -189,5 +153,5 @@ output: nj_ssp: 375 household_state_benefits: 375 - snap_unearned_income: 12303 - hud_unearned_income: 12303 + snap_unearned_income: 12_303 + hud_unearned_income: 12_303 diff --git a/policyengine_us/tests/policy/baseline/gov/states/nj/dhs/ssp/nj_ssp.yaml b/policyengine_us/tests/policy/baseline/gov/states/nj/dhs/ssp/nj_ssp.yaml index 02c9e6b0b7b..4525e6096f6 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/nj/dhs/ssp/nj_ssp.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/nj/dhs/ssp/nj_ssp.yaml @@ -7,6 +7,7 @@ age: 65 output: nj_ssp: 31.25 + - name: Case 2, certified congregate care. period: 2026-01 absolute_error_margin: 0.01 @@ -16,6 +17,7 @@ nj_ssp_care_setting: CONGREGATE_CARE output: nj_ssp: 150.05 + - name: Case 3, certified residential health care. period: 2026-01 absolute_error_margin: 0.01 @@ -25,6 +27,7 @@ nj_ssp_care_setting: RESIDENTIAL_HEALTH_CARE output: nj_ssp: 210.05 + - name: Case 4, excluded setting. period: 2026-01 absolute_error_margin: 0.01 @@ -34,6 +37,7 @@ nj_ssp_care_setting: EXCLUDED output: nj_ssp: 0 + - name: Case 5, Medicaid institutional payment. period: 2026-01 absolute_error_margin: 0.01 @@ -45,6 +49,7 @@ output: ssi: 30 nj_ssp: 20 + - name: Case 6, non Medicaid medical institution. period: 2026-01 absolute_error_margin: 0.01 @@ -54,6 +59,7 @@ ssi_lives_in_medical_treatment_facility: true output: nj_ssp: 0 + - name: Case 7, household of another. period: 2026-01 absolute_error_margin: 0.01 @@ -65,43 +71,48 @@ ssi_others_pay_all_meals: true output: nj_ssp: 44.31 + - name: Case 8, state only payment. period: 2026-01 absolute_error_margin: 0.01 input: state_code: NJ age: 65 - social_security_retirement: 12360 + social_security_retirement: 12_360 output: ssi: 0 nj_ssp: 15.25 + - name: Case 9, positive sub dollar amount receives minimum. period: 2026-01 absolute_error_margin: 0.01 input: state_code: NJ age: 65 - social_security_retirement: 12542.88 + social_security_retirement: 12_542.88 output: nj_ssp: 1 + - name: Case 10, combined income cutoff. period: 2026-01 absolute_error_margin: 0.01 input: state_code: NJ age: 65 - social_security_retirement: 12543 + social_security_retirement: 12_543 output: nj_ssp: 0 + - name: Case 11, resource cutoff. period: 2026-01 absolute_error_margin: 0.01 input: state_code: NJ age: 65 - ssi_countable_resources: 2001 + ssi_countable_resources: 2_001 output: nj_ssp: 0 + - name: Case 12, no aged blind or disabled category. period: 2026-01 absolute_error_margin: 0.01 @@ -110,6 +121,7 @@ age: 30 output: nj_ssp: 0 + - name: Case 13, disabled child. period: 2026-01 absolute_error_margin: 0.01 @@ -119,6 +131,7 @@ meets_ssi_disability_criteria: true output: nj_ssp: 31.25 + - name: Case 14, out of state. period: 2026-01 absolute_error_margin: 0.01 @@ -127,6 +140,7 @@ age: 65 output: nj_ssp: 0 + - name: Case 15, declining SSI application. period: 2026-01 absolute_error_margin: 0.01 From 64c0d3ea646b5dad9a6ec2d2b7ac27ff3c4bbcb8 Mon Sep 17 00:00:00 2001 From: Ziming Date: Tue, 13 Oct 2026 02:29:32 -0400 Subject: [PATCH 3/6] Fix issues from review: New Jersey SSP registries, tests and documentation - Registry placement and comments, SNAP reference title, shorter programs.yaml note - Lowercase POMS anchor; document the C couple placeholder, mixed-arrangement averaging and the ineligible-spouse limitation - Realistic ages and incomes in existing cases; couple-with-income and living-arrangement precedence tests Co-Authored-By: Claude Opus 5.5 --- .../household/household_state_benefits.yaml | 12 +- .../gov/states/nj/dhs/ssp/amount/couple.yaml | 6 +- .../states/nj/dhs/ssp/amount/individual.yaml | 2 +- .../usda/snap/income/sources/unearned.yaml | 4 +- policyengine_us/programs.yaml | 7 +- .../gov/states/nj/dhs/ssp/integration.yaml | 19 ++- .../gov/states/nj/dhs/ssp/nj_ssp.yaml | 32 +++- .../nj/dhs/ssp/nj_ssp_living_arrangement.yaml | 138 ++++++++++++++++++ .../variables/gov/states/nj/dhs/ssp/nj_ssp.py | 10 +- .../states/nj/dhs/ssp/nj_ssp_care_setting.py | 2 +- .../income/spm_unit/spm_unit_benefits.py | 2 +- 11 files changed, 217 insertions(+), 17 deletions(-) create mode 100644 policyengine_us/tests/policy/baseline/gov/states/nj/dhs/ssp/nj_ssp_living_arrangement.yaml diff --git a/policyengine_us/parameters/gov/household/household_state_benefits.yaml b/policyengine_us/parameters/gov/household/household_state_benefits.yaml index 34225edfd88..4aa598b2d20 100644 --- a/policyengine_us/parameters/gov/household/household_state_benefits.yaml +++ b/policyengine_us/parameters/gov/household/household_state_benefits.yaml @@ -65,6 +65,8 @@ values: - ok_child_care_subsidies # South Carolina benefits - sc_child_care_subsidies + # New Jersey benefits + - nj_ssp # New Mexico benefits - nm_ssi_state_supplement # South Carolina benefits @@ -78,7 +80,6 @@ values: # DC benefits - dc_ossp # Kansas benefits - - nj_ssp - ks_sspp # Hawaii benefits - hi_oss @@ -158,6 +159,8 @@ values: - nv_child_care_subsidies # Oklahoma benefits - ok_child_care_subsidies + # New Jersey benefits + - nj_ssp # New Mexico benefits - nm_ssi_state_supplement # South Carolina benefits @@ -177,7 +180,6 @@ values: # DC benefits - dc_ossp # Kansas benefits - - nj_ssp - ks_sspp # Hawaii benefits - hi_oss @@ -261,6 +263,8 @@ values: - nv_child_care_subsidies # Oklahoma benefits - ok_child_care_subsidies + # New Jersey benefits + - nj_ssp # New Mexico benefits - nm_ssi_state_supplement # South Carolina benefits @@ -281,7 +285,6 @@ values: - dc_ossp - dc_child_care_subsidies # Kansas benefits - - nj_ssp - ks_sspp # Hawaii benefits - hi_oss @@ -365,6 +368,8 @@ values: - nv_child_care_subsidies # Oklahoma benefits - ok_child_care_subsidies + # New Jersey benefits + - nj_ssp # New Mexico benefits - nm_ssi_state_supplement # South Carolina benefits @@ -385,7 +390,6 @@ values: - dc_ossp - dc_child_care_subsidies # Kansas benefits - - nj_ssp - ks_sspp # Hawaii benefits - hi_oss diff --git a/policyengine_us/parameters/gov/states/nj/dhs/ssp/amount/couple.yaml b/policyengine_us/parameters/gov/states/nj/dhs/ssp/amount/couple.yaml index 6a3c2f8793d..d2c5fbc0349 100644 --- a/policyengine_us/parameters/gov/states/nj/dhs/ssp/amount/couple.yaml +++ b/policyengine_us/parameters/gov/states/nj/dhs/ssp/amount/couple.yaml @@ -10,11 +10,15 @@ metadata: - title: POMS SI 01415.058 J.2, New Jersey January 2026 payment levels href: https://secure.ssa.gov/poms.nsf/lnx/0501415058#j - title: POMS SI 01320.430 D, Ineligible spouse uses corresponding couple rate or higher individual rate - href: https://secure.ssa.gov/poms.nsf/lnx/0501320430#D + href: https://secure.ssa.gov/poms.nsf/lnx/0501320430#d LIVING_ALONE_OR_WITH_OTHERS: 2026-01-01: 25.35 +# SSA publishes no couple rate for code C (SI 01415.058 J.1). This placeholder +# repeats the B couple rate and never affects results: a claimant with an +# ineligible spouse is paid as an individual or, under deeming, at the higher +# individual rate (SI 01320.430 D.2.c). LIVING_ONLY_WITH_INELIGIBLE_SPOUSE: 2026-01-01: 25.35 diff --git a/policyengine_us/parameters/gov/states/nj/dhs/ssp/amount/individual.yaml b/policyengine_us/parameters/gov/states/nj/dhs/ssp/amount/individual.yaml index 753b5c67e17..b8c675c42a5 100644 --- a/policyengine_us/parameters/gov/states/nj/dhs/ssp/amount/individual.yaml +++ b/policyengine_us/parameters/gov/states/nj/dhs/ssp/amount/individual.yaml @@ -10,7 +10,7 @@ metadata: - title: POMS SI 01415.058 J.2, New Jersey January 2026 payment levels href: https://secure.ssa.gov/poms.nsf/lnx/0501415058#j - title: POMS SI 01320.430 D, Ineligible spouse uses corresponding couple rate or higher individual rate - href: https://secure.ssa.gov/poms.nsf/lnx/0501320430#D + href: https://secure.ssa.gov/poms.nsf/lnx/0501320430#d LIVING_ALONE_OR_WITH_OTHERS: 2026-01-01: 31.25 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 2bf3514f591..29be38bd784 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 - - nj_ssp - ks_sspp - ky_ssp - la_oss @@ -47,6 +46,7 @@ values: - mn_msa_person - mo_ssp - ne_aabd + - nj_ssp - nm_ssi_state_supplement - sc_ssi_state_supplement - tx_ssi_state_supplement @@ -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 3657589ebbc..fec9b10c513 100644 --- a/policyengine_us/programs.yaml +++ b/policyengine_us/programs.yaml @@ -1098,10 +1098,9 @@ programs: parameter_prefix: gov.states.nj.dhs.ssp verified_years: "2026" notes: >- - Models optional living-arrangement payments, including the special - ineligible-spouse rate. Separate food households, certified settings - and post-institutionalization individual claims require explicit - inputs. Mandatory grandfathered supplementation is not modeled. + Models 2026 New Jersey optional supplement rates by living + arrangement, including the ineligible-spouse variation. Mandatory + grandfathered supplementation is not modeled. - id: social_security name: Social Security diff --git a/policyengine_us/tests/policy/baseline/gov/states/nj/dhs/ssp/integration.yaml b/policyengine_us/tests/policy/baseline/gov/states/nj/dhs/ssp/integration.yaml index 4be3201a677..b4f8722fc65 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/nj/dhs/ssp/integration.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/nj/dhs/ssp/integration.yaml @@ -74,7 +74,7 @@ person1: age: 65 person2: - age: 40 + age: 63 social_security_retirement: 19_800 marital_units: couple: @@ -87,6 +87,23 @@ members: *id004 state_code: NJ output: + # person2 is 63, below the SSI aged threshold of 65, and not blind or disabled. + is_ssi_ineligible_spouse: [false, true] + # Spouse income 19_800 per year > (1_491 - 994) * 12 = 5_964, so deeming applies. + is_ssi_spousal_deeming_applies: [true, false] + # Deemed: 19_800 / 12 = 1_650 - 20 general exclusion = 1_630 per month. + ssi_income_deemed_from_ineligible_spouse: [1_630, 0] + # person1 has no own income: 0 + 1_630 deemed = 1_630. + ssi_countable_income: [1_630, 0] + # Deeming uses the couple FBR for person1; person2's 994 is not used. + ssi_amount_if_eligible: [1_491, 994] + # 1_491 - 1_630 = -139, so no federal SSI. + uncapped_ssi: [-139, 0] + ssi: [0, 0] + # Only the ineligible spouse shares the household: code C. + nj_ssp_living_arrangement: [LIVING_ONLY_WITH_INELIGIBLE_SPOUSE, LIVING_ONLY_WITH_INELIGIBLE_SPOUSE] + # Deemed: max(25.35, 152.99) - (1_630 - 1_491) = 152.99 - 139 = 13.99. + # Own: 152.99 - max(0 - 994, 0) = 152.99; the lower amount, 13.99, is paid. nj_ssp: [13.99, 0] - name: Case 5, special rate ends when a child shares the household. diff --git a/policyengine_us/tests/policy/baseline/gov/states/nj/dhs/ssp/nj_ssp.yaml b/policyengine_us/tests/policy/baseline/gov/states/nj/dhs/ssp/nj_ssp.yaml index 4525e6096f6..51fefc3b7b8 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/nj/dhs/ssp/nj_ssp.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/nj/dhs/ssp/nj_ssp.yaml @@ -89,8 +89,10 @@ input: state_code: NJ age: 65 - social_security_retirement: 12_542.88 + social_security_retirement: 12_540 output: + # 12_540 / 12 = 1_045 - 20 = 1_025 countable, 31 above the 994 FBR. + # 31.25 - 31 = 0.25, raised to the 1 dollar minimum. nj_ssp: 1 - name: Case 10, combined income cutoff. @@ -150,3 +152,31 @@ takes_up_ssi_if_eligible: false output: nj_ssp: 0 + +- name: Case 16, couple with Social Security receives a state only payment. + period: 2026-01 + absolute_error_margin: 0.001 + input: + people: + person1: + age: 65 + social_security_retirement: 18_240 + person2: + age: 65 + marital_units: + couple: + members: [person1, person2] + tax_units: + unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: NJ + output: + # 18_240 / 12 = 1_520 - 20 = 1_500 couple countable, 750 per spouse. + ssi_countable_income: [750, 750] + # 750 - 1_491 / 2 = 4.50 above each spouse's federal amount, so no SSI. + ssi: [0, 0] + # 25.35 / 2 = 12.675 - 4.50 = 8.175, rounded up to 8.18 per spouse. + nj_ssp: [8.18, 8.18] diff --git a/policyengine_us/tests/policy/baseline/gov/states/nj/dhs/ssp/nj_ssp_living_arrangement.yaml b/policyengine_us/tests/policy/baseline/gov/states/nj/dhs/ssp/nj_ssp_living_arrangement.yaml new file mode 100644 index 00000000000..1211707cdd0 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/nj/dhs/ssp/nj_ssp_living_arrangement.yaml @@ -0,0 +1,138 @@ +# Source: POMS SI NY01415.025. +- name: Case 1, independent individual is code B. + period: 2026-01 + input: + state_code: NJ + age: 65 + output: + nj_ssp_living_arrangement: LIVING_ALONE_OR_WITH_OTHERS + +- name: Case 2, couple with only an ineligible spouse is code C. + period: 2026-01 + input: + people: + person1: + age: 65 + person2: + age: 63 + marital_units: + couple: + members: [person1, person2] + tax_units: + unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: NJ + output: + # person2 is under 65 and not blind or disabled; no one else lives there. + nj_ssp_living_arrangement: [LIVING_ONLY_WITH_INELIGIBLE_SPOUSE, LIVING_ONLY_WITH_INELIGIBLE_SPOUSE] + +- name: Case 3, certified congregate care is code A. + period: 2026-01 + input: + state_code: NJ + age: 65 + nj_ssp_care_setting: CONGREGATE_CARE + output: + nj_ssp_living_arrangement: CONGREGATE_CARE + +- name: Case 4, certified residential health care is code I. + period: 2026-01 + input: + state_code: NJ + age: 65 + nj_ssp_care_setting: RESIDENTIAL_HEALTH_CARE + output: + nj_ssp_living_arrangement: RESIDENTIAL_HEALTH_CARE + +- name: Case 5, household of another is code D. + period: 2026-01 + input: + state_code: NJ + age: 65 + ssi_lives_in_another_persons_household: true + ssi_receives_shelter_from_others_in_household: true + ssi_others_pay_all_meals: true + output: + nj_ssp_living_arrangement: HOUSEHOLD_OF_ANOTHER + +- name: Case 6, Medicaid institution is code G. + period: 2026-01 + input: + state_code: NJ + age: 65 + ssi_lives_in_medical_treatment_facility: true + ssi_medicaid_pays_majority_of_care: true + output: + nj_ssp_living_arrangement: MEDICAID_INSTITUTION + +- name: Case 7, excluded setting is code Z with no supplement. + period: 2026-01 + input: + state_code: NJ + age: 65 + nj_ssp_care_setting: EXCLUDED + output: + nj_ssp_living_arrangement: NONE + +- name: Case 8, medical institution without Medicaid majority is code Z. + period: 2026-01 + input: + state_code: NJ + age: 65 + ssi_lives_in_medical_treatment_facility: true + output: + nj_ssp_living_arrangement: NONE + +- name: Case 9, Medicaid institution takes precedence over congregate care. + period: 2026-01 + input: + state_code: NJ + age: 65 + nj_ssp_care_setting: CONGREGATE_CARE + ssi_lives_in_medical_treatment_facility: true + ssi_medicaid_pays_majority_of_care: true + output: + # The Medicaid institution branch is checked before certified care. + nj_ssp_living_arrangement: MEDICAID_INSTITUTION + +- name: Case 10, excluded setting takes precedence over a Medicaid institution. + period: 2026-01 + input: + state_code: NJ + age: 65 + nj_ssp_care_setting: EXCLUDED + ssi_lives_in_medical_treatment_facility: true + ssi_medicaid_pays_majority_of_care: true + output: + # The excluded setting branch is checked first. + nj_ssp_living_arrangement: NONE + +- name: Case 11, code C ends when a child shares the household. + period: 2026-01 + input: + people: + person1: + age: 65 + person2: + age: 63 + person3: + age: 12 + is_tax_unit_dependent: true + marital_units: + couple: + members: [person1, person2] + child: + members: [person3] + tax_units: + unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + state_code: NJ + output: + # Three household members against a two-person marital unit. + nj_ssp_living_arrangement: [LIVING_ALONE_OR_WITH_OTHERS, LIVING_ALONE_OR_WITH_OTHERS, LIVING_ALONE_OR_WITH_OTHERS] diff --git a/policyengine_us/variables/gov/states/nj/dhs/ssp/nj_ssp.py b/policyengine_us/variables/gov/states/nj/dhs/ssp/nj_ssp.py index c7820761e0c..ce44102a3d2 100644 --- a/policyengine_us/variables/gov/states/nj/dhs/ssp/nj_ssp.py +++ b/policyengine_us/variables/gov/states/nj/dhs/ssp/nj_ssp.py @@ -14,12 +14,20 @@ class nj_ssp(Variable): reference = ( "https://secure.ssa.gov/poms.nsf/lnx/0501415058#j", "https://secure.ssa.gov/poms.nsf/lnx/0501415025NY", - "https://secure.ssa.gov/poms.nsf/lnx/0501320430#D", + "https://secure.ssa.gov/poms.nsf/lnx/0501320430#d", ) def formula(person, period, parameters): p = parameters(period).gov.states.nj.dhs.ssp.amount + # NOTE: The C rate uses the federal ineligible-spouse definition, which + # omits an aged, blind or disabled spouse who is ineligible for SSI or + # chooses not to apply (SI 01415.058 J.1); the model treats that claim + # as joint and pays half the couple rate instead. arrangement = person("nj_ssp_living_arrangement", period) + # NOTE: The shared helper averages the couple rates of spouses in + # different arrangements. SSA treats spouses who enter an institution + # as two individuals after the month of change (SI NY01415.025), so + # such couples need explicit marital-unit inputs. return ssi_state_supplement( person, period, parameters, p.individual[arrangement], p.couple[arrangement] ) diff --git a/policyengine_us/variables/gov/states/nj/dhs/ssp/nj_ssp_care_setting.py b/policyengine_us/variables/gov/states/nj/dhs/ssp/nj_ssp_care_setting.py index a30606e209a..63371e5ec2e 100644 --- a/policyengine_us/variables/gov/states/nj/dhs/ssp/nj_ssp_care_setting.py +++ b/policyengine_us/variables/gov/states/nj/dhs/ssp/nj_ssp_care_setting.py @@ -2,10 +2,10 @@ class NJSSPCareSetting(Enum): - NONE = "No certified care setting" CONGREGATE_CARE = "New Jersey certified congregate care" RESIDENTIAL_HEALTH_CARE = "New Jersey certified residential health care" EXCLUDED = "Setting excluded from New Jersey supplementation" + NONE = "No certified care setting" class nj_ssp_care_setting(Variable): 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 b2fb161ba57..45d7197ac61 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", - "nj_ssp", + "nj_ssp", # New Jersey benefits "ks_sspp", # Kansas benefits "hi_oss", "la_oss", # Louisiana benefits From e02eacf6948ad3743e15d1a2adb908aec23cddba Mon Sep 17 00:00:00 2001 From: Ziming Date: Wed, 14 Oct 2026 16:42:49 -0400 Subject: [PATCH 4/6] Address review: move New Jersey SSP to njdhs, fix descriptions and references, add tests - Move parameters, variables and tests from nj/dhs/ssp to nj/njdhs/ssp, the existing New Jersey Department of Human Services folder. - Rate-file descriptions follow the template; references point to J.2.a and J.2.b; SI 01320.430 D stays on nj_ssp only. - Cite SI 01415.058 J.1 on the living arrangement and SSA's New Jersey program description (statutory basis N.J.S.A. 44:7-86) on nj_ssp. - Note the higher individual rate under deeming for codes B and C, and the Lifeline payment in every rate except G (issue 10230). - Integration: Case 2 is the month of entry; Case 7 asserts spm_unit_benefits; Case 8 pays congregate care spouses as individuals after entry. Co-Authored-By: Claude Opus 5.5 --- .../nj/{dhs => njdhs}/ssp/amount/couple.yaml | 8 ++--- .../{dhs => njdhs}/ssp/amount/individual.yaml | 8 ++--- policyengine_us/programs.yaml | 2 +- .../nj/{dhs => njdhs}/ssp/integration.yaml | 36 ++++++++++++++++++- .../states/nj/{dhs => njdhs}/ssp/nj_ssp.yaml | 0 .../ssp/nj_ssp_living_arrangement.yaml | 0 .../states/nj/{dhs => njdhs}/ssp/nj_ssp.py | 9 ++++- .../{dhs => njdhs}/ssp/nj_ssp_care_setting.py | 0 .../ssp/nj_ssp_living_arrangement.py | 7 ++-- 9 files changed, 55 insertions(+), 15 deletions(-) rename policyengine_us/parameters/gov/states/nj/{dhs => njdhs}/ssp/amount/couple.yaml (63%) rename policyengine_us/parameters/gov/states/nj/{dhs => njdhs}/ssp/amount/individual.yaml (52%) rename policyengine_us/tests/policy/baseline/gov/states/nj/{dhs => njdhs}/ssp/integration.yaml (79%) rename policyengine_us/tests/policy/baseline/gov/states/nj/{dhs => njdhs}/ssp/nj_ssp.yaml (100%) rename policyengine_us/tests/policy/baseline/gov/states/nj/{dhs => njdhs}/ssp/nj_ssp_living_arrangement.yaml (100%) rename policyengine_us/variables/gov/states/nj/{dhs => njdhs}/ssp/nj_ssp.py (71%) rename policyengine_us/variables/gov/states/nj/{dhs => njdhs}/ssp/nj_ssp_care_setting.py (100%) rename policyengine_us/variables/gov/states/nj/{dhs => njdhs}/ssp/nj_ssp_living_arrangement.py (91%) diff --git a/policyengine_us/parameters/gov/states/nj/dhs/ssp/amount/couple.yaml b/policyengine_us/parameters/gov/states/nj/njdhs/ssp/amount/couple.yaml similarity index 63% rename from policyengine_us/parameters/gov/states/nj/dhs/ssp/amount/couple.yaml rename to policyengine_us/parameters/gov/states/nj/njdhs/ssp/amount/couple.yaml index d2c5fbc0349..957485c6360 100644 --- a/policyengine_us/parameters/gov/states/nj/dhs/ssp/amount/couple.yaml +++ b/policyengine_us/parameters/gov/states/nj/njdhs/ssp/amount/couple.yaml @@ -1,4 +1,4 @@ -description: New Jersey provides these monthly state supplementary payment rates for an eligible couple. +description: New Jersey provides this amount as the monthly couple payment under the State Supplementary Payment program. metadata: unit: currency-USD @@ -7,10 +7,8 @@ metadata: breakdown: - nj_ssp_living_arrangement reference: - - title: POMS SI 01415.058 J.2, New Jersey January 2026 payment levels - href: https://secure.ssa.gov/poms.nsf/lnx/0501415058#j - - title: POMS SI 01320.430 D, Ineligible spouse uses corresponding couple rate or higher individual rate - href: https://secure.ssa.gov/poms.nsf/lnx/0501320430#d + - title: POMS SI 01415.058 J.2.b, New Jersey January 2026 couple payment levels + href: https://secure.ssa.gov/poms.nsf/lnx/0501415058#j2b LIVING_ALONE_OR_WITH_OTHERS: 2026-01-01: 25.35 diff --git a/policyengine_us/parameters/gov/states/nj/dhs/ssp/amount/individual.yaml b/policyengine_us/parameters/gov/states/nj/njdhs/ssp/amount/individual.yaml similarity index 52% rename from policyengine_us/parameters/gov/states/nj/dhs/ssp/amount/individual.yaml rename to policyengine_us/parameters/gov/states/nj/njdhs/ssp/amount/individual.yaml index b8c675c42a5..214af0ffa08 100644 --- a/policyengine_us/parameters/gov/states/nj/dhs/ssp/amount/individual.yaml +++ b/policyengine_us/parameters/gov/states/nj/njdhs/ssp/amount/individual.yaml @@ -1,4 +1,4 @@ -description: New Jersey provides these monthly state supplementary payment rates for an eligible individual. +description: New Jersey provides this amount as the monthly individual payment under the State Supplementary Payment program. metadata: unit: currency-USD @@ -7,10 +7,8 @@ metadata: breakdown: - nj_ssp_living_arrangement reference: - - title: POMS SI 01415.058 J.2, New Jersey January 2026 payment levels - href: https://secure.ssa.gov/poms.nsf/lnx/0501415058#j - - title: POMS SI 01320.430 D, Ineligible spouse uses corresponding couple rate or higher individual rate - href: https://secure.ssa.gov/poms.nsf/lnx/0501320430#d + - title: POMS SI 01415.058 J.2.a, New Jersey January 2026 individual payment levels + href: https://secure.ssa.gov/poms.nsf/lnx/0501415058#j2a LIVING_ALONE_OR_WITH_OTHERS: 2026-01-01: 31.25 diff --git a/policyengine_us/programs.yaml b/policyengine_us/programs.yaml index fec9b10c513..a7c46b78ecc 100644 --- a/policyengine_us/programs.yaml +++ b/policyengine_us/programs.yaml @@ -1095,7 +1095,7 @@ programs: name: New Jersey SSP full_name: New Jersey State Supplementary Payment variable: nj_ssp - parameter_prefix: gov.states.nj.dhs.ssp + parameter_prefix: gov.states.nj.njdhs.ssp verified_years: "2026" notes: >- Models 2026 New Jersey optional supplement rates by living diff --git a/policyengine_us/tests/policy/baseline/gov/states/nj/dhs/ssp/integration.yaml b/policyengine_us/tests/policy/baseline/gov/states/nj/njdhs/ssp/integration.yaml similarity index 79% rename from policyengine_us/tests/policy/baseline/gov/states/nj/dhs/ssp/integration.yaml rename to policyengine_us/tests/policy/baseline/gov/states/nj/njdhs/ssp/integration.yaml index b4f8722fc65..df429dcdbd9 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/nj/dhs/ssp/integration.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/nj/njdhs/ssp/integration.yaml @@ -20,7 +20,7 @@ output: nj_ssp: [12.68, 12.68] -- name: Case 2, congregate care couple. +- name: Case 2, congregate care couple in the month of entry. period: 2026-01 absolute_error_margin: 0.001 input: @@ -172,3 +172,37 @@ household_state_benefits: 375 snap_unearned_income: 12_303 hud_unearned_income: 12_303 + # SSI 994 * 12 = 11_928. SNAP: 298 - 245 = 53 a month, raised to New + # Jersey's 95 minimum, so 95 * 12 = 1_140. 11_928 + 375 + 1_140 = 13_443. + spm_unit_benefits: 13_443 + +- name: Case 8, congregate care spouses claim as individuals after the month of entry. + period: 2026-01 + absolute_error_margin: 0.001 + input: + people: + person1: + age: 65 + nj_ssp_care_setting: CONGREGATE_CARE + person2: + age: 65 + nj_ssp_care_setting: CONGREGATE_CARE + # SI NY01415.025: after the month of entry, spouses in a congregate care + # facility are treated as two individuals, entered as separate marital units. + marital_units: + unit1: + members: [person1] + unit2: + members: [person2] + tax_units: + unit: + members: &id008 [person1, person2] + households: + household: + members: *id008 + state_code: NJ + output: + ssi: [994, 994] + nj_ssp_living_arrangement: [CONGREGATE_CARE, CONGREGATE_CARE] + # J.2.a individual code A row: 150.05 each. + nj_ssp: [150.05, 150.05] diff --git a/policyengine_us/tests/policy/baseline/gov/states/nj/dhs/ssp/nj_ssp.yaml b/policyengine_us/tests/policy/baseline/gov/states/nj/njdhs/ssp/nj_ssp.yaml similarity index 100% rename from policyengine_us/tests/policy/baseline/gov/states/nj/dhs/ssp/nj_ssp.yaml rename to policyengine_us/tests/policy/baseline/gov/states/nj/njdhs/ssp/nj_ssp.yaml diff --git a/policyengine_us/tests/policy/baseline/gov/states/nj/dhs/ssp/nj_ssp_living_arrangement.yaml b/policyengine_us/tests/policy/baseline/gov/states/nj/njdhs/ssp/nj_ssp_living_arrangement.yaml similarity index 100% rename from policyengine_us/tests/policy/baseline/gov/states/nj/dhs/ssp/nj_ssp_living_arrangement.yaml rename to policyengine_us/tests/policy/baseline/gov/states/nj/njdhs/ssp/nj_ssp_living_arrangement.yaml diff --git a/policyengine_us/variables/gov/states/nj/dhs/ssp/nj_ssp.py b/policyengine_us/variables/gov/states/nj/njdhs/ssp/nj_ssp.py similarity index 71% rename from policyengine_us/variables/gov/states/nj/dhs/ssp/nj_ssp.py rename to policyengine_us/variables/gov/states/nj/njdhs/ssp/nj_ssp.py index ce44102a3d2..1dfdc8d0890 100644 --- a/policyengine_us/variables/gov/states/nj/dhs/ssp/nj_ssp.py +++ b/policyengine_us/variables/gov/states/nj/njdhs/ssp/nj_ssp.py @@ -15,10 +15,11 @@ class nj_ssp(Variable): "https://secure.ssa.gov/poms.nsf/lnx/0501415058#j", "https://secure.ssa.gov/poms.nsf/lnx/0501415025NY", "https://secure.ssa.gov/poms.nsf/lnx/0501320430#d", + "https://www.ssa.gov/policy/docs/progdesc/ssi_st_asst/2011/nj.html", ) def formula(person, period, parameters): - p = parameters(period).gov.states.nj.dhs.ssp.amount + p = parameters(period).gov.states.nj.njdhs.ssp.amount # NOTE: The C rate uses the federal ineligible-spouse definition, which # omits an aged, blind or disabled spouse who is ineligible for SSI or # chooses not to apply (SI 01415.058 J.1); the model treats that claim @@ -28,6 +29,12 @@ def formula(person, period, parameters): # different arrangements. SSA treats spouses who enter an institution # as two individuals after the month of change (SI NY01415.025), so # such couples need explicit marital-unit inputs. + # NOTE: The individual rate exceeds the couple rate for codes B and C, + # so a claim with deemed spousal income uses the higher individual + # rate (SI 01320.430 D.2.c). + # NOTE: Every rate except the Medicaid-facility rate includes the + # state's Lifeline utility payment (SI 01415.058 J.1); issue 10230 + # tracks counting it net of the Lifeline in New Jersey LIHEAP. return ssi_state_supplement( person, period, parameters, p.individual[arrangement], p.couple[arrangement] ) diff --git a/policyengine_us/variables/gov/states/nj/dhs/ssp/nj_ssp_care_setting.py b/policyengine_us/variables/gov/states/nj/njdhs/ssp/nj_ssp_care_setting.py similarity index 100% rename from policyengine_us/variables/gov/states/nj/dhs/ssp/nj_ssp_care_setting.py rename to policyengine_us/variables/gov/states/nj/njdhs/ssp/nj_ssp_care_setting.py diff --git a/policyengine_us/variables/gov/states/nj/dhs/ssp/nj_ssp_living_arrangement.py b/policyengine_us/variables/gov/states/nj/njdhs/ssp/nj_ssp_living_arrangement.py similarity index 91% rename from policyengine_us/variables/gov/states/nj/dhs/ssp/nj_ssp_living_arrangement.py rename to policyengine_us/variables/gov/states/nj/njdhs/ssp/nj_ssp_living_arrangement.py index 15842d07fd8..f652d78b1c9 100644 --- a/policyengine_us/variables/gov/states/nj/dhs/ssp/nj_ssp_living_arrangement.py +++ b/policyengine_us/variables/gov/states/nj/njdhs/ssp/nj_ssp_living_arrangement.py @@ -1,5 +1,5 @@ from policyengine_us.model_api import * -from policyengine_us.variables.gov.states.nj.dhs.ssp.nj_ssp_care_setting import ( +from policyengine_us.variables.gov.states.nj.njdhs.ssp.nj_ssp_care_setting import ( NJSSPCareSetting, ) from policyengine_us.variables.gov.ssa.ssi.eligibility.status.ssi_federal_living_arrangement import ( @@ -25,7 +25,10 @@ class nj_ssp_living_arrangement(Variable): defined_for = StateCode.NJ possible_values = NJSSPLivingArrangement default_value = NJSSPLivingArrangement.NONE - reference = "https://secure.ssa.gov/poms.nsf/lnx/0501415025NY" + reference = ( + "https://secure.ssa.gov/poms.nsf/lnx/0501415058#j1", + "https://secure.ssa.gov/poms.nsf/lnx/0501415025NY", + ) documentation = """ A separately purchasing couple sharing an address with others, or a couple living only with foster children, can set the ineligible-spouse variation From 61f4392d39d3b4200cb0175c3e4a4b45e36906d2 Mon Sep 17 00:00:00 2001 From: Ziming Date: Wed, 14 Oct 2026 17:05:02 -0400 Subject: [PATCH 5/6] Correct New Jersey SSP facility and foster child case names, add disabled child case - Integration Case 2 pays the couple congregate care rate, which SI NY01415.025 keeps only in small household-scale facilities; the month of entry gets the couple OSS D and is not modelled. - Integration Case 6's explicit code C applies to a couple living only with a foster child. - nj_ssp Case 17: a disabled child living with parents gets code B. Co-Authored-By: Claude Opus 5.5 --- .../gov/states/nj/njdhs/ssp/integration.yaml | 8 +++-- .../gov/states/nj/njdhs/ssp/nj_ssp.yaml | 34 +++++++++++++++++++ 2 files changed, 40 insertions(+), 2 deletions(-) diff --git a/policyengine_us/tests/policy/baseline/gov/states/nj/njdhs/ssp/integration.yaml b/policyengine_us/tests/policy/baseline/gov/states/nj/njdhs/ssp/integration.yaml index df429dcdbd9..07fed757afb 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/nj/njdhs/ssp/integration.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/nj/njdhs/ssp/integration.yaml @@ -20,9 +20,11 @@ output: nj_ssp: [12.68, 12.68] -- name: Case 2, congregate care couple in the month of entry. +- name: Case 2, congregate care couple in a small household-scale facility. period: 2026-01 absolute_error_margin: 0.001 + # SI NY01415.025: couple status continues in a small Level 2 facility that + # is not an institution. input: people: person1: @@ -133,9 +135,11 @@ output: nj_ssp: [31.25, 0, 0] -- name: Case 6, explicit separate food household state determination. +- name: Case 6, explicit ineligible spouse code for a couple living only with a foster child. period: 2026-01 absolute_error_margin: 0.001 + # SI NY01415.025 allows code C with foster children (effective 7/1/90); the + # state's household determination is entered directly. input: people: person1: diff --git a/policyengine_us/tests/policy/baseline/gov/states/nj/njdhs/ssp/nj_ssp.yaml b/policyengine_us/tests/policy/baseline/gov/states/nj/njdhs/ssp/nj_ssp.yaml index 51fefc3b7b8..8fb2fbe44fb 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/nj/njdhs/ssp/nj_ssp.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/nj/njdhs/ssp/nj_ssp.yaml @@ -180,3 +180,37 @@ ssi: [0, 0] # 25.35 / 2 = 12.675 - 4.50 = 8.175, rounded up to 8.18 per spouse. nj_ssp: [8.18, 8.18] + +- name: Case 17, disabled child living with parents receives the living alone or with others rate. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 40 + own_children_in_household: 1 + person2: + age: 40 + own_children_in_household: 1 + person3: + age: 10 + meets_ssi_disability_criteria: true + marital_units: + marital_unit: + members: [person1, person2] + tax_units: + tax_unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + state_code: NJ + output: + # The parents are not aged, blind or disabled, so the child is in federal + # code C, which New Jersey pays as code B (SI 01415.058 J.1). + ssi_federal_living_arrangement: [OWN_HOUSEHOLD, OWN_HOUSEHOLD, CHILD_IN_PARENTAL_HOUSEHOLD] + nj_ssp_living_arrangement: [LIVING_ALONE_OR_WITH_OTHERS, LIVING_ALONE_OR_WITH_OTHERS, LIVING_ALONE_OR_WITH_OTHERS] + # The parents have no income, so nothing is deemed. + ssi: [0, 0, 994] + # J.2.a row C/B: 31.25. + nj_ssp: [0, 0, 31.25] From 8aefd6ce836aa43dce7915cb2dd5e29eff157824 Mon Sep 17 00:00:00 2001 From: Ziming Date: Wed, 14 Oct 2026 17:21:21 -0400 Subject: [PATCH 6/6] Add New Jersey SSP code B deeming case Integration Case 9: a spouse earning the New Jersey cashier median and a child in the household. Below the couple FBR, deeming pays the full 31.25 individual rate, not the 25.35 couple rate (SI 01320.430 D.2.c). Co-Authored-By: Claude Opus 5.5 --- .../gov/states/nj/njdhs/ssp/integration.yaml | 40 +++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/policyengine_us/tests/policy/baseline/gov/states/nj/njdhs/ssp/integration.yaml b/policyengine_us/tests/policy/baseline/gov/states/nj/njdhs/ssp/integration.yaml index 07fed757afb..025d58e702a 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/nj/njdhs/ssp/integration.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/nj/njdhs/ssp/integration.yaml @@ -210,3 +210,43 @@ nj_ssp_living_arrangement: [CONGREGATE_CARE, CONGREGATE_CARE] # J.2.a individual code A row: 150.05 each. nj_ssp: [150.05, 150.05] + +- name: Case 9, deeming in the living alone or with others code uses the higher individual rate. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 70 + person2: + age: 45 + # Full-time cashier (SOC 41-2011) at the New Jersey median wage, BLS + # OEWS May 2025: $16.63 an hour, published as $34,590 a year. + employment_income: 34_590 + person3: + age: 12 + is_tax_unit_dependent: true + marital_units: + couple: + members: [person1, person2] + child: + members: [person3] + tax_units: + unit: + members: &id009 [person1, person2, person3] + households: + household: + members: *id009 + state_code: NJ + output: + # 34_590 / 12 = 2_882.50 - 497 child allocation = 2_385.50 > 497, so + # deeming applies: (2_385.50 - 20 - 65) / 2 = 1_150.25 countable. + is_ssi_spousal_deeming_applies: [true, false, false] + ssi_countable_income: [1_150.25, 0, 0] + # 1_491 couple FBR - 1_150.25 = 340.75. + ssi: [340.75, 0, 0] + # A child shares the household, so code B. + nj_ssp_living_arrangement: [LIVING_ALONE_OR_WITH_OTHERS, LIVING_ALONE_OR_WITH_OTHERS, LIVING_ALONE_OR_WITH_OTHERS] + # Deemed: max(25.35, 31.25) - max(1_150.25 - 1_491, 0) = 31.25; own: 31.25. + # The lesser is 31.25; the couple rate would give 25.35 (SI 01320.430 D.2.c). + nj_ssp: [31.25, 0, 0]