diff --git a/changelog_entry.yaml b/changelog_entry.yaml new file mode 100644 index 00000000000..526fe2f9d6a --- /dev/null +++ b/changelog_entry.yaml @@ -0,0 +1,4 @@ +- bump: minor + changes: + added: + - Implement DC Optional State Supplemental Payment (OSSP) program. diff --git a/policyengine_us/parameters/gov/household/household_state_benefits.yaml b/policyengine_us/parameters/gov/household/household_state_benefits.yaml index 9ad7c2dae5d..f7f5f7ab1bc 100644 --- a/policyengine_us/parameters/gov/household/household_state_benefits.yaml +++ b/policyengine_us/parameters/gov/household/household_state_benefits.yaml @@ -22,6 +22,8 @@ values: # Massachusetts benefits - ma_eaedc - ma_tafdc + # DC benefits + - dc_ossp 2024-01-01: # Massachusetts benefits - ma_state_supplement @@ -46,6 +48,8 @@ values: # Massachusetts benefits - ma_eaedc - ma_tafdc + # DC benefits + - dc_ossp metadata: unit: list period: year diff --git a/policyengine_us/parameters/gov/states/dc/dhcf/ossp/facility_size_threshold/amount.yaml b/policyengine_us/parameters/gov/states/dc/dhcf/ossp/facility_size_threshold/amount.yaml new file mode 100644 index 00000000000..318f393deca --- /dev/null +++ b/policyengine_us/parameters/gov/states/dc/dhcf/ossp/facility_size_threshold/amount.yaml @@ -0,0 +1,12 @@ +description: >- + Bed count threshold distinguishing OS-A (at or below) from OS-B + (above) adult foster care facilities in DC OSSP. +metadata: + unit: /1 + period: year + label: DC OSSP facility size threshold + reference: + - title: SSA POMS SI PHI01415.009 - District of Columbia + href: https://secure.ssa.gov/poms.nsf/lnx/0501415009 +values: + 2026-01-01: 50 diff --git a/policyengine_us/parameters/gov/states/dc/dhcf/ossp/payment/os_a/couple/amount.yaml b/policyengine_us/parameters/gov/states/dc/dhcf/ossp/payment/os_a/couple/amount.yaml new file mode 100644 index 00000000000..1f59d858413 --- /dev/null +++ b/policyengine_us/parameters/gov/states/dc/dhcf/ossp/payment/os_a/couple/amount.yaml @@ -0,0 +1,14 @@ +description: >- + DC Optional State Supplemental Payment for OS-A (adult foster care + facility with 50 or fewer beds) for a couple. +metadata: + unit: currency-USD + period: month + label: DC OSSP OS-A couple payment + reference: + - title: DC Code § 4-205.49 - Optional State Supplemental Payment + href: https://code.dccouncil.gov/us/dc/council/code/sections/4-205.49 + - title: SSA POMS SI PHI01415.009 - District of Columbia + href: https://secure.ssa.gov/poms.nsf/lnx/0501415009 +values: + 2026-01-01: 1717 diff --git a/policyengine_us/parameters/gov/states/dc/dhcf/ossp/payment/os_a/individual/amount.yaml b/policyengine_us/parameters/gov/states/dc/dhcf/ossp/payment/os_a/individual/amount.yaml new file mode 100644 index 00000000000..6c4117d3101 --- /dev/null +++ b/policyengine_us/parameters/gov/states/dc/dhcf/ossp/payment/os_a/individual/amount.yaml @@ -0,0 +1,14 @@ +description: >- + DC Optional State Supplemental Payment for OS-A (adult foster care + facility with 50 or fewer beds) for an individual. +metadata: + unit: currency-USD + period: month + label: DC OSSP OS-A individual payment + reference: + - title: DC Code § 4-205.49 - Optional State Supplemental Payment + href: https://code.dccouncil.gov/us/dc/council/code/sections/4-205.49 + - title: SSA POMS SI PHI01415.009 - District of Columbia + href: https://secure.ssa.gov/poms.nsf/lnx/0501415009 +values: + 2026-01-01: 681 diff --git a/policyengine_us/parameters/gov/states/dc/dhcf/ossp/payment/os_b/couple/amount.yaml b/policyengine_us/parameters/gov/states/dc/dhcf/ossp/payment/os_b/couple/amount.yaml new file mode 100644 index 00000000000..d426f124a23 --- /dev/null +++ b/policyengine_us/parameters/gov/states/dc/dhcf/ossp/payment/os_b/couple/amount.yaml @@ -0,0 +1,14 @@ +description: >- + DC Optional State Supplemental Payment for OS-B (adult foster care + facility with more than 50 beds) for a couple. +metadata: + unit: currency-USD + period: month + label: DC OSSP OS-B couple payment + reference: + - title: DC Code § 4-205.49 - Optional State Supplemental Payment + href: https://code.dccouncil.gov/us/dc/council/code/sections/4-205.49 + - title: SSA POMS SI PHI01415.009 - District of Columbia + href: https://secure.ssa.gov/poms.nsf/lnx/0501415009 +values: + 2026-01-01: 1937 diff --git a/policyengine_us/parameters/gov/states/dc/dhcf/ossp/payment/os_b/individual/amount.yaml b/policyengine_us/parameters/gov/states/dc/dhcf/ossp/payment/os_b/individual/amount.yaml new file mode 100644 index 00000000000..04ac4d19beb --- /dev/null +++ b/policyengine_us/parameters/gov/states/dc/dhcf/ossp/payment/os_b/individual/amount.yaml @@ -0,0 +1,14 @@ +description: >- + DC Optional State Supplemental Payment for OS-B (adult foster care + facility with more than 50 beds) for an individual. +metadata: + unit: currency-USD + period: month + label: DC OSSP OS-B individual payment + reference: + - title: DC Code § 4-205.49 - Optional State Supplemental Payment + href: https://code.dccouncil.gov/us/dc/council/code/sections/4-205.49 + - title: SSA POMS SI PHI01415.009 - District of Columbia + href: https://secure.ssa.gov/poms.nsf/lnx/0501415009 +values: + 2026-01-01: 791 diff --git a/policyengine_us/parameters/gov/states/dc/dhcf/ossp/payment/os_g/couple/amount.yaml b/policyengine_us/parameters/gov/states/dc/dhcf/ossp/payment/os_g/couple/amount.yaml new file mode 100644 index 00000000000..b8dbaae07f9 --- /dev/null +++ b/policyengine_us/parameters/gov/states/dc/dhcf/ossp/payment/os_g/couple/amount.yaml @@ -0,0 +1,14 @@ +description: >- + DC Optional State Supplemental Payment for OS-G (nursing facility) + for a couple. +metadata: + unit: currency-USD + period: month + label: DC OSSP OS-G couple payment + reference: + - title: DC Code § 4-205.49 - Optional State Supplemental Payment + href: https://code.dccouncil.gov/us/dc/council/code/sections/4-205.49 + - title: SSA POMS SI PHI01415.009 - District of Columbia + href: https://secure.ssa.gov/poms.nsf/lnx/0501415009 +values: + 2026-01-01: 158 diff --git a/policyengine_us/parameters/gov/states/dc/dhcf/ossp/payment/os_g/individual/amount.yaml b/policyengine_us/parameters/gov/states/dc/dhcf/ossp/payment/os_g/individual/amount.yaml new file mode 100644 index 00000000000..3162ca85ba5 --- /dev/null +++ b/policyengine_us/parameters/gov/states/dc/dhcf/ossp/payment/os_g/individual/amount.yaml @@ -0,0 +1,14 @@ +description: >- + DC Optional State Supplemental Payment for OS-G (nursing facility) + for an individual. +metadata: + unit: currency-USD + period: month + label: DC OSSP OS-G individual payment + reference: + - title: DC Code § 4-205.49 - Optional State Supplemental Payment + href: https://code.dccouncil.gov/us/dc/council/code/sections/4-205.49 + - title: SSA POMS SI PHI01415.009 - District of Columbia + href: https://secure.ssa.gov/poms.nsf/lnx/0501415009 +values: + 2026-01-01: 79 diff --git a/policyengine_us/parameters/gov/states/dc/dhcf/ossp/personal_needs_allowance/adult_foster_care/amount.yaml b/policyengine_us/parameters/gov/states/dc/dhcf/ossp/personal_needs_allowance/adult_foster_care/amount.yaml new file mode 100644 index 00000000000..f91b15ae38d --- /dev/null +++ b/policyengine_us/parameters/gov/states/dc/dhcf/ossp/personal_needs_allowance/adult_foster_care/amount.yaml @@ -0,0 +1,11 @@ +description: >- + Personal needs allowance for DC OSSP recipients in adult foster care. +metadata: + unit: currency-USD + period: month + label: DC OSSP adult foster care personal needs allowance + reference: + - title: DC Code § 4-208.02 - Personal needs allowance + href: https://code.dccouncil.gov/us/dc/council/code/sections/4-208.02 +values: + 2026-01-01: 100 diff --git a/policyengine_us/parameters/gov/states/dc/dhcf/ossp/personal_needs_allowance/nursing_facility/amount.yaml b/policyengine_us/parameters/gov/states/dc/dhcf/ossp/personal_needs_allowance/nursing_facility/amount.yaml new file mode 100644 index 00000000000..0f6c9fc1ed4 --- /dev/null +++ b/policyengine_us/parameters/gov/states/dc/dhcf/ossp/personal_needs_allowance/nursing_facility/amount.yaml @@ -0,0 +1,13 @@ +description: >- + Personal needs allowance for DC OSSP recipients in nursing facilities. +metadata: + unit: currency-USD + period: month + label: DC OSSP nursing facility personal needs allowance + reference: + - title: DC Code § 4-208.02 - Personal needs allowance + href: https://code.dccouncil.gov/us/dc/council/code/sections/4-208.02 + - title: DHCF Transmittal 26-02 - 2026 PNA increase + href: https://dhcf.dc.gov/ +values: + 2026-01-01: 109 diff --git a/policyengine_us/parameters/gov/states/dc/dhcf/ossp/resource_limit/couple/amount.yaml b/policyengine_us/parameters/gov/states/dc/dhcf/ossp/resource_limit/couple/amount.yaml new file mode 100644 index 00000000000..5f41d081e3b --- /dev/null +++ b/policyengine_us/parameters/gov/states/dc/dhcf/ossp/resource_limit/couple/amount.yaml @@ -0,0 +1,11 @@ +description: >- + Resource limit for DC OSSP eligibility for a couple. +metadata: + unit: currency-USD + period: year + label: DC OSSP couple resource limit + reference: + - title: SSA POMS SI PHI01415.009 - District of Columbia + href: https://secure.ssa.gov/poms.nsf/lnx/0501415009 +values: + 2026-01-01: 3000 diff --git a/policyengine_us/parameters/gov/states/dc/dhcf/ossp/resource_limit/individual/amount.yaml b/policyengine_us/parameters/gov/states/dc/dhcf/ossp/resource_limit/individual/amount.yaml new file mode 100644 index 00000000000..ab0aa72e770 --- /dev/null +++ b/policyengine_us/parameters/gov/states/dc/dhcf/ossp/resource_limit/individual/amount.yaml @@ -0,0 +1,11 @@ +description: >- + Resource limit for DC OSSP eligibility for an individual. +metadata: + unit: currency-USD + period: year + label: DC OSSP individual resource limit + reference: + - title: SSA POMS SI PHI01415.009 - District of Columbia + href: https://secure.ssa.gov/poms.nsf/lnx/0501415009 +values: + 2026-01-01: 2000 diff --git a/policyengine_us/tests/policy/baseline/gov/states/dc/dhcf/ossp/dc_ossp.yaml b/policyengine_us/tests/policy/baseline/gov/states/dc/dhcf/ossp/dc_ossp.yaml new file mode 100644 index 00000000000..dff1028cb2c --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/dc/dhcf/ossp/dc_ossp.yaml @@ -0,0 +1,120 @@ +- name: Individual in OS-A facility receives DC OSSP + period: 2026 + input: + people: + person: + dc_ossp_living_arrangement: OS_A + is_ssi_eligible_individual: true + ssi_countable_resources: {2026: 1_500} + families: + family: + members: [person] + is_married: {2026: false} + households: + household: + members: [person] + state_code: DC + output: + dc_ossp_eligible: [true] + dc_ossp: [8_172] # $681/month * 12 + +- name: Couple in OS-A facility receives DC OSSP + period: 2026 + input: + people: + person1: + is_ssi_eligible_individual: true + ssi_countable_resources: {2026: 1_500} + dc_ossp_living_arrangement: OS_A + person2: + is_ssi_eligible_individual: true + ssi_countable_resources: {2026: 1_500} + dc_ossp_living_arrangement: OS_A + families: + family: + members: [person1, person2] + is_married: {2026: true} + households: + household: + members: [person1, person2] + state_code: DC + output: + dc_ossp: [10_302, 10_302] # $1717/2 * 12 + +- name: Individual in OS-B facility receives DC OSSP + period: 2026 + input: + people: + person: + dc_ossp_living_arrangement: OS_B + is_ssi_eligible_individual: true + ssi_countable_resources: {2026: 1_000} + families: + family: + members: [person] + is_married: {2026: false} + households: + household: + members: [person] + state_code: DC + output: + dc_ossp: [9_492] # $791/month * 12 + +- name: Excess resources makes person ineligible for DC OSSP + period: 2026 + input: + people: + person: + dc_ossp_living_arrangement: OS_A + is_ssi_eligible_individual: true + ssi_countable_resources: {2026: 2_500} + families: + family: + members: [person] + is_married: {2026: false} + households: + household: + members: [person] + state_code: DC + output: + dc_ossp_resource_eligible: [false] + dc_ossp: [0] + +- name: Individual in OS-G nursing facility receives DC OSSP + period: 2026 + input: + people: + person: + dc_ossp_living_arrangement: OS_G + is_ssi_eligible_individual: true + ssi_countable_resources: {2026: 500} + families: + family: + members: [person] + is_married: {2026: false} + households: + household: + members: [person] + state_code: DC + output: + dc_ossp: [948] # $79/month * 12 + +- name: Person not in qualifying facility is ineligible + period: 2026 + input: + people: + person: + dc_ossp_living_arrangement: NONE + is_ssi_eligible_individual: true + ssi_countable_resources: {2026: 500} + families: + family: + members: [person] + is_married: {2026: false} + households: + household: + members: [person] + state_code: DC + output: + dc_ossp_eligible: [false] + dc_ossp: [0] diff --git a/policyengine_us/variables/gov/states/dc/dhcf/ossp/dc_ossp.py b/policyengine_us/variables/gov/states/dc/dhcf/ossp/dc_ossp.py new file mode 100644 index 00000000000..62146c8ec7f --- /dev/null +++ b/policyengine_us/variables/gov/states/dc/dhcf/ossp/dc_ossp.py @@ -0,0 +1,18 @@ +from policyengine_us.model_api import * + + +class dc_ossp(Variable): + value_type = float + entity = Person + label = "DC Optional State Supplemental Payment" + unit = USD + definition_period = YEAR + defined_for = "dc_ossp_eligible" + reference = ( + "https://code.dccouncil.gov/us/dc/council/code/sections/4-205.49", + "https://secure.ssa.gov/poms.nsf/lnx/0501415009", + ) + + def formula(person, period, parameters): + monthly_amount = person("dc_ossp_payment_amount", period) + return monthly_amount * MONTHS_IN_YEAR diff --git a/policyengine_us/variables/gov/states/dc/dhcf/ossp/dc_ossp_eligible.py b/policyengine_us/variables/gov/states/dc/dhcf/ossp/dc_ossp_eligible.py new file mode 100644 index 00000000000..9aa043fe410 --- /dev/null +++ b/policyengine_us/variables/gov/states/dc/dhcf/ossp/dc_ossp_eligible.py @@ -0,0 +1,23 @@ +from policyengine_us.model_api import * +from policyengine_us.variables.gov.states.dc.dhcf.ossp.dc_ossp_living_arrangement import ( + DCOSSPLivingArrangement, +) + + +class dc_ossp_eligible(Variable): + value_type = bool + entity = Person + label = "Whether the person is eligible for DC OSSP" + definition_period = YEAR + defined_for = StateCode.DC + reference = ( + "https://code.dccouncil.gov/us/dc/council/code/sections/4-205.49", + "https://secure.ssa.gov/poms.nsf/lnx/0501415009", + ) + + def formula(person, period, parameters): + ssi_eligible = person("dc_ossp_ssi_eligible", period) + resource_eligible = person("dc_ossp_resource_eligible", period) + living_arrangement = person("dc_ossp_living_arrangement", period) + in_qualifying_facility = living_arrangement != DCOSSPLivingArrangement.NONE + return ssi_eligible & resource_eligible & in_qualifying_facility diff --git a/policyengine_us/variables/gov/states/dc/dhcf/ossp/dc_ossp_facility_size.py b/policyengine_us/variables/gov/states/dc/dhcf/ossp/dc_ossp_facility_size.py new file mode 100644 index 00000000000..faa8cee9ed7 --- /dev/null +++ b/policyengine_us/variables/gov/states/dc/dhcf/ossp/dc_ossp_facility_size.py @@ -0,0 +1,11 @@ +from policyengine_us.model_api import * + + +class dc_ossp_facility_size(Variable): + value_type = int + entity = Person + label = "Number of beds in the adult foster care facility" + definition_period = YEAR + defined_for = StateCode.DC + default_value = 0 + reference = ("https://secure.ssa.gov/poms.nsf/lnx/0501415009",) diff --git a/policyengine_us/variables/gov/states/dc/dhcf/ossp/dc_ossp_in_adult_foster_care.py b/policyengine_us/variables/gov/states/dc/dhcf/ossp/dc_ossp_in_adult_foster_care.py new file mode 100644 index 00000000000..874a0af2ffe --- /dev/null +++ b/policyengine_us/variables/gov/states/dc/dhcf/ossp/dc_ossp_in_adult_foster_care.py @@ -0,0 +1,11 @@ +from policyengine_us.model_api import * + + +class dc_ossp_in_adult_foster_care(Variable): + value_type = bool + entity = Person + label = "Whether the person resides in an adult foster care facility" + definition_period = YEAR + defined_for = StateCode.DC + default_value = False + reference = ("https://code.dccouncil.gov/us/dc/council/code/sections/4-205.49",) diff --git a/policyengine_us/variables/gov/states/dc/dhcf/ossp/dc_ossp_in_nursing_facility.py b/policyengine_us/variables/gov/states/dc/dhcf/ossp/dc_ossp_in_nursing_facility.py new file mode 100644 index 00000000000..b5e62a38700 --- /dev/null +++ b/policyengine_us/variables/gov/states/dc/dhcf/ossp/dc_ossp_in_nursing_facility.py @@ -0,0 +1,11 @@ +from policyengine_us.model_api import * + + +class dc_ossp_in_nursing_facility(Variable): + value_type = bool + entity = Person + label = "Whether the person resides in a nursing facility" + definition_period = YEAR + defined_for = StateCode.DC + default_value = False + reference = ("https://code.dccouncil.gov/us/dc/council/code/sections/4-205.49",) diff --git a/policyengine_us/variables/gov/states/dc/dhcf/ossp/dc_ossp_living_arrangement.py b/policyengine_us/variables/gov/states/dc/dhcf/ossp/dc_ossp_living_arrangement.py new file mode 100644 index 00000000000..f1c29db7e79 --- /dev/null +++ b/policyengine_us/variables/gov/states/dc/dhcf/ossp/dc_ossp_living_arrangement.py @@ -0,0 +1,22 @@ +from policyengine_us.model_api import * + + +class DCOSSPLivingArrangement(Enum): + OS_A = "Adult foster care facility with 50 or fewer beds" + OS_B = "Adult foster care facility with more than 50 beds" + OS_G = "Nursing facility" + NONE = "Not in a qualifying facility" + + +class dc_ossp_living_arrangement(Variable): + value_type = Enum + entity = Person + label = "DC OSSP living arrangement" + definition_period = YEAR + defined_for = StateCode.DC + possible_values = DCOSSPLivingArrangement + default_value = DCOSSPLivingArrangement.NONE + reference = ( + "https://code.dccouncil.gov/us/dc/council/code/sections/4-205.49", + "https://secure.ssa.gov/poms.nsf/lnx/0501415009", + ) diff --git a/policyengine_us/variables/gov/states/dc/dhcf/ossp/dc_ossp_payment_amount.py b/policyengine_us/variables/gov/states/dc/dhcf/ossp/dc_ossp_payment_amount.py new file mode 100644 index 00000000000..83714a171d7 --- /dev/null +++ b/policyengine_us/variables/gov/states/dc/dhcf/ossp/dc_ossp_payment_amount.py @@ -0,0 +1,43 @@ +from policyengine_us.model_api import * +from policyengine_us.variables.gov.states.dc.dhcf.ossp.dc_ossp_living_arrangement import ( + DCOSSPLivingArrangement, +) + + +class dc_ossp_payment_amount(Variable): + value_type = float + entity = Person + label = "DC OSSP monthly payment amount" + unit = USD + definition_period = YEAR + defined_for = StateCode.DC + reference = ( + "https://code.dccouncil.gov/us/dc/council/code/sections/4-205.49", + "https://secure.ssa.gov/poms.nsf/lnx/0501415009", + ) + + def formula(person, period, parameters): + living_arrangement = person("dc_ossp_living_arrangement", period) + is_married = person.family("is_married", period.this_year) + p = parameters(period).gov.states.dc.dhcf.ossp.payment + # Individual amounts + os_a_ind = p.os_a.individual.amount + os_b_ind = p.os_b.individual.amount + os_g_ind = p.os_g.individual.amount + # Couple amounts (per person = couple amount / 2) + os_a_couple = p.os_a.couple.amount / 2 + os_b_couple = p.os_b.couple.amount / 2 + os_g_couple = p.os_g.couple.amount / 2 + # Select individual or couple amount + os_a_amount = where(is_married, os_a_couple, os_a_ind) + os_b_amount = where(is_married, os_b_couple, os_b_ind) + os_g_amount = where(is_married, os_g_couple, os_g_ind) + return select( + [ + living_arrangement == DCOSSPLivingArrangement.OS_A, + living_arrangement == DCOSSPLivingArrangement.OS_B, + living_arrangement == DCOSSPLivingArrangement.OS_G, + ], + [os_a_amount, os_b_amount, os_g_amount], + default=0, + ) diff --git a/policyengine_us/variables/gov/states/dc/dhcf/ossp/dc_ossp_resource_eligible.py b/policyengine_us/variables/gov/states/dc/dhcf/ossp/dc_ossp_resource_eligible.py new file mode 100644 index 00000000000..4af1de6cf0e --- /dev/null +++ b/policyengine_us/variables/gov/states/dc/dhcf/ossp/dc_ossp_resource_eligible.py @@ -0,0 +1,21 @@ +from policyengine_us.model_api import * + + +class dc_ossp_resource_eligible(Variable): + value_type = bool + entity = Person + label = "Whether the person meets resource limits for DC OSSP" + definition_period = YEAR + defined_for = StateCode.DC + reference = ("https://secure.ssa.gov/poms.nsf/lnx/0501415009",) + + def formula(person, period, parameters): + resources = person("ssi_countable_resources", period.this_year) + is_married = person.family("is_married", period.this_year) + p = parameters(period).gov.states.dc.dhcf.ossp.resource_limit + limit = where( + is_married, + p.couple.amount, + p.individual.amount, + ) + return resources <= limit diff --git a/policyengine_us/variables/gov/states/dc/dhcf/ossp/dc_ossp_ssi_eligible.py b/policyengine_us/variables/gov/states/dc/dhcf/ossp/dc_ossp_ssi_eligible.py new file mode 100644 index 00000000000..be4067dac8d --- /dev/null +++ b/policyengine_us/variables/gov/states/dc/dhcf/ossp/dc_ossp_ssi_eligible.py @@ -0,0 +1,13 @@ +from policyengine_us.model_api import * + + +class dc_ossp_ssi_eligible(Variable): + value_type = bool + entity = Person + label = "Whether the person meets SSI eligibility for DC OSSP" + definition_period = YEAR + defined_for = StateCode.DC + reference = ("https://code.dccouncil.gov/us/dc/council/code/sections/4-205.49",) + + def formula(person, period, parameters): + return person("is_ssi_eligible_individual", period)