From 6def5b0fc8d552ab0ef6bf753f19a17e45789688 Mon Sep 17 00:00:00 2001 From: Ziming Date: Thu, 26 Mar 2026 18:45:15 -0400 Subject: [PATCH 01/14] Add changelog fragment for Florida SSP Co-Authored-By: Claude Opus 4.6 (1M context) --- changelog.d/fl-ssp.added.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 changelog.d/fl-ssp.added.md diff --git a/changelog.d/fl-ssp.added.md b/changelog.d/fl-ssp.added.md new file mode 100644 index 00000000000..8dba3a16e2b --- /dev/null +++ b/changelog.d/fl-ssp.added.md @@ -0,0 +1 @@ +Implements Florida State Supplementary Payment (SSP). From d95b94ef1b771593c079f05f20485c231b756219 Mon Sep 17 00:00:00 2001 From: Ziming Date: Thu, 26 Mar 2026 20:05:48 -0400 Subject: [PATCH 02/14] Implement Florida OSS (Optional State Supplementation) (ref #7890) Co-Authored-By: Claude Opus 4.6 (1M context) --- .../oss/couple_provider_rate_reduction.yaml | 13 + .../parameters/gov/states/fl/dcf/oss/pna.yaml | 16 + .../fl/dcf/oss/protected/max_oss/couple.yaml | 12 + .../dcf/oss/protected/max_oss/individual.yaml | 12 + .../oss/protected/provider_rate_offset.yaml | 12 + .../redesign/income_standard_pna_offset.yaml | 13 + .../fl/dcf/oss/redesign/max_oss/couple.yaml | 14 + .../dcf/oss/redesign/max_oss/individual.yaml | 14 + .../oss/redesign/provider_rate_offset.yaml | 14 + .../gov/states/fl/dcf/oss/edge_cases.yaml | 815 ++++++++++++++++++ .../gov/states/fl/dcf/oss/fl_oss.yaml | 188 ++++ .../states/fl/dcf/oss/fl_oss_eligible.yaml | 115 +++ .../fl/dcf/oss/fl_oss_income_standard.yaml | 77 ++ .../gov/states/fl/dcf/oss/fl_oss_max_oss.yaml | 104 +++ .../fl/dcf/oss/fl_oss_program_track.yaml | 50 ++ .../fl/dcf/oss/fl_oss_provider_rate.yaml | 128 +++ .../gov/states/fl/dcf/oss/integration.yaml | 302 +++++++ .../variables/gov/states/fl/dcf/oss/fl_oss.py | 22 + .../gov/states/fl/dcf/oss/fl_oss_eligible.py | 28 + .../states/fl/dcf/oss/fl_oss_facility_type.py | 22 + .../fl/dcf/oss/fl_oss_income_standard.py | 25 + .../gov/states/fl/dcf/oss/fl_oss_max_oss.py | 31 + .../states/fl/dcf/oss/fl_oss_program_track.py | 18 + .../states/fl/dcf/oss/fl_oss_provider_rate.py | 29 + sources/working_references.md | 247 ++++++ 25 files changed, 2321 insertions(+) create mode 100644 policyengine_us/parameters/gov/states/fl/dcf/oss/couple_provider_rate_reduction.yaml create mode 100644 policyengine_us/parameters/gov/states/fl/dcf/oss/pna.yaml create mode 100644 policyengine_us/parameters/gov/states/fl/dcf/oss/protected/max_oss/couple.yaml create mode 100644 policyengine_us/parameters/gov/states/fl/dcf/oss/protected/max_oss/individual.yaml create mode 100644 policyengine_us/parameters/gov/states/fl/dcf/oss/protected/provider_rate_offset.yaml create mode 100644 policyengine_us/parameters/gov/states/fl/dcf/oss/redesign/income_standard_pna_offset.yaml create mode 100644 policyengine_us/parameters/gov/states/fl/dcf/oss/redesign/max_oss/couple.yaml create mode 100644 policyengine_us/parameters/gov/states/fl/dcf/oss/redesign/max_oss/individual.yaml create mode 100644 policyengine_us/parameters/gov/states/fl/dcf/oss/redesign/provider_rate_offset.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/fl/dcf/oss/edge_cases.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/fl/dcf/oss/fl_oss.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/fl/dcf/oss/fl_oss_eligible.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/fl/dcf/oss/fl_oss_income_standard.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/fl/dcf/oss/fl_oss_max_oss.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/fl/dcf/oss/fl_oss_program_track.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/fl/dcf/oss/fl_oss_provider_rate.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/fl/dcf/oss/integration.yaml create mode 100644 policyengine_us/variables/gov/states/fl/dcf/oss/fl_oss.py create mode 100644 policyengine_us/variables/gov/states/fl/dcf/oss/fl_oss_eligible.py create mode 100644 policyengine_us/variables/gov/states/fl/dcf/oss/fl_oss_facility_type.py create mode 100644 policyengine_us/variables/gov/states/fl/dcf/oss/fl_oss_income_standard.py create mode 100644 policyengine_us/variables/gov/states/fl/dcf/oss/fl_oss_max_oss.py create mode 100644 policyengine_us/variables/gov/states/fl/dcf/oss/fl_oss_program_track.py create mode 100644 policyengine_us/variables/gov/states/fl/dcf/oss/fl_oss_provider_rate.py diff --git a/policyengine_us/parameters/gov/states/fl/dcf/oss/couple_provider_rate_reduction.yaml b/policyengine_us/parameters/gov/states/fl/dcf/oss/couple_provider_rate_reduction.yaml new file mode 100644 index 00000000000..ea78ac289a0 --- /dev/null +++ b/policyengine_us/parameters/gov/states/fl/dcf/oss/couple_provider_rate_reduction.yaml @@ -0,0 +1,13 @@ +description: Florida reduces the couple provider rate by this amount under the Optional State Supplementation program. +values: + 2011-01-01: 97 + +metadata: + unit: currency-USD + period: month + label: Florida OSS couple provider rate reduction + reference: + - title: SSA State Assistance Programs for SSI Recipients, January 2011 - Florida, Table 1 + href: https://www.ssa.gov/policy/docs/progdesc/ssi_st_asst/2011/fl.html + - title: FL DCF Appendix A-12, Optional State Supplementation Payment Standards + href: https://www.myflfamilies.com/sites/default/files/2024-10/Appendix%20A-12%20OSS%20Payment%20Standards.pdf diff --git a/policyengine_us/parameters/gov/states/fl/dcf/oss/pna.yaml b/policyengine_us/parameters/gov/states/fl/dcf/oss/pna.yaml new file mode 100644 index 00000000000..0dbacebbbe9 --- /dev/null +++ b/policyengine_us/parameters/gov/states/fl/dcf/oss/pna.yaml @@ -0,0 +1,16 @@ +description: Florida provides this amount as the Personal Needs Allowance per person under the Optional State Supplementation program. +values: + 2011-01-01: 54 + 2024-07-01: 160 + +metadata: + unit: currency-USD + period: month + label: Florida OSS Personal Needs Allowance + reference: + - title: SSA State Assistance Programs for SSI Recipients, January 2011 - Florida, Table 1 + href: https://www.ssa.gov/policy/docs/progdesc/ssi_st_asst/2011/fl.html + - title: FL DCF Appendix A-12, Optional State Supplementation Payment Standards + href: https://www.myflfamilies.com/sites/default/files/2024-10/Appendix%20A-12%20OSS%20Payment%20Standards.pdf + - title: Florida HB 5001, 2024-25 General Appropriations Act + href: https://www.flsenate.gov/Session/Bill/2024/5001 diff --git a/policyengine_us/parameters/gov/states/fl/dcf/oss/protected/max_oss/couple.yaml b/policyengine_us/parameters/gov/states/fl/dcf/oss/protected/max_oss/couple.yaml new file mode 100644 index 00000000000..5cc517748a0 --- /dev/null +++ b/policyengine_us/parameters/gov/states/fl/dcf/oss/protected/max_oss/couple.yaml @@ -0,0 +1,12 @@ +description: Florida limits the couple Protected payment to this amount under the Optional State Supplementation program. +values: + 2011-01-01: 0 + 2024-07-01: 690 + +metadata: + unit: currency-USD + period: month + label: Florida OSS Protected maximum couple payment + reference: + - title: FL DCF Appendix A-12, Optional State Supplementation Payment Standards + href: https://www.myflfamilies.com/sites/default/files/2024-10/Appendix%20A-12%20OSS%20Payment%20Standards.pdf diff --git a/policyengine_us/parameters/gov/states/fl/dcf/oss/protected/max_oss/individual.yaml b/policyengine_us/parameters/gov/states/fl/dcf/oss/protected/max_oss/individual.yaml new file mode 100644 index 00000000000..51164299fdc --- /dev/null +++ b/policyengine_us/parameters/gov/states/fl/dcf/oss/protected/max_oss/individual.yaml @@ -0,0 +1,12 @@ +description: Florida limits the individual Protected payment to this amount under the Optional State Supplementation program. +values: + 2011-01-01: 0 + 2024-07-01: 345 + +metadata: + unit: currency-USD + period: month + label: Florida OSS Protected maximum individual payment + reference: + - title: FL DCF Appendix A-12, Optional State Supplementation Payment Standards + href: https://www.myflfamilies.com/sites/default/files/2024-10/Appendix%20A-12%20OSS%20Payment%20Standards.pdf diff --git a/policyengine_us/parameters/gov/states/fl/dcf/oss/protected/provider_rate_offset.yaml b/policyengine_us/parameters/gov/states/fl/dcf/oss/protected/provider_rate_offset.yaml new file mode 100644 index 00000000000..ffbb65eaff1 --- /dev/null +++ b/policyengine_us/parameters/gov/states/fl/dcf/oss/protected/provider_rate_offset.yaml @@ -0,0 +1,12 @@ +description: Florida sets this amount as the offset added to the federal SSI benefit rate to determine the Protected provider rate under the Optional State Supplementation program. +values: + 2011-01-01: 0 + 2024-07-01: 185 + +metadata: + unit: currency-USD + period: month + label: Florida OSS Protected provider rate offset + reference: + - title: FL DCF Appendix A-12, Optional State Supplementation Payment Standards + href: https://www.myflfamilies.com/sites/default/files/2024-10/Appendix%20A-12%20OSS%20Payment%20Standards.pdf diff --git a/policyengine_us/parameters/gov/states/fl/dcf/oss/redesign/income_standard_pna_offset.yaml b/policyengine_us/parameters/gov/states/fl/dcf/oss/redesign/income_standard_pna_offset.yaml new file mode 100644 index 00000000000..4e1a78621e0 --- /dev/null +++ b/policyengine_us/parameters/gov/states/fl/dcf/oss/redesign/income_standard_pna_offset.yaml @@ -0,0 +1,13 @@ +description: Florida sets this amount as the offset added to the provider rate to determine the Redesign income standard under the Optional State Supplementation program. +values: + 2011-01-01: 54 + +metadata: + unit: currency-USD + period: month + label: Florida OSS Redesign income standard PNA offset + reference: + - title: SSA State Assistance Programs for SSI Recipients, January 2011 - Florida, Table 1 + href: https://www.ssa.gov/policy/docs/progdesc/ssi_st_asst/2011/fl.html + - title: FL DCF Appendix A-12, Optional State Supplementation Payment Standards + href: https://www.myflfamilies.com/sites/default/files/2024-10/Appendix%20A-12%20OSS%20Payment%20Standards.pdf diff --git a/policyengine_us/parameters/gov/states/fl/dcf/oss/redesign/max_oss/couple.yaml b/policyengine_us/parameters/gov/states/fl/dcf/oss/redesign/max_oss/couple.yaml new file mode 100644 index 00000000000..5e334277cb6 --- /dev/null +++ b/policyengine_us/parameters/gov/states/fl/dcf/oss/redesign/max_oss/couple.yaml @@ -0,0 +1,14 @@ +description: Florida limits the couple Redesign payment to this amount under the Optional State Supplementation program. +values: + 2011-01-01: 396.8 + 2024-07-01: 386.8 + +metadata: + unit: currency-USD + period: month + label: Florida OSS Redesign maximum couple payment + reference: + - title: SSA State Assistance Programs for SSI Recipients, January 2011 - Florida, Table 1 ($396.80 value only) + href: https://www.ssa.gov/policy/docs/progdesc/ssi_st_asst/2011/fl.html + - title: FL DCF Appendix A-12, Optional State Supplementation Payment Standards + href: https://www.myflfamilies.com/sites/default/files/2024-10/Appendix%20A-12%20OSS%20Payment%20Standards.pdf diff --git a/policyengine_us/parameters/gov/states/fl/dcf/oss/redesign/max_oss/individual.yaml b/policyengine_us/parameters/gov/states/fl/dcf/oss/redesign/max_oss/individual.yaml new file mode 100644 index 00000000000..2ba407fcb65 --- /dev/null +++ b/policyengine_us/parameters/gov/states/fl/dcf/oss/redesign/max_oss/individual.yaml @@ -0,0 +1,14 @@ +description: Florida limits the individual Redesign payment to this amount under the Optional State Supplementation program. +values: + 2011-01-01: 78.4 + 2024-07-01: 184.4 + +metadata: + unit: currency-USD + period: month + label: Florida OSS Redesign maximum individual payment + reference: + - title: SSA State Assistance Programs for SSI Recipients, January 2011 - Florida, Table 1 ($78.40 value only) + href: https://www.ssa.gov/policy/docs/progdesc/ssi_st_asst/2011/fl.html + - title: FL DCF Appendix A-12, Optional State Supplementation Payment Standards + href: https://www.myflfamilies.com/sites/default/files/2024-10/Appendix%20A-12%20OSS%20Payment%20Standards.pdf diff --git a/policyengine_us/parameters/gov/states/fl/dcf/oss/redesign/provider_rate_offset.yaml b/policyengine_us/parameters/gov/states/fl/dcf/oss/redesign/provider_rate_offset.yaml new file mode 100644 index 00000000000..429ad0b7a61 --- /dev/null +++ b/policyengine_us/parameters/gov/states/fl/dcf/oss/redesign/provider_rate_offset.yaml @@ -0,0 +1,14 @@ +description: Florida sets this amount as the offset added to the federal SSI benefit rate to determine the Redesign provider rate under the Optional State Supplementation program. +values: + 2011-01-01: 78.4 + 2024-07-01: 24.4 + +metadata: + unit: currency-USD + period: month + label: Florida OSS Redesign provider rate offset + reference: + - title: SSA State Assistance Programs for SSI Recipients, January 2011 - Florida, Table 1 + href: https://www.ssa.gov/policy/docs/progdesc/ssi_st_asst/2011/fl.html + - title: FL DCF Appendix A-12, Optional State Supplementation Payment Standards + href: https://www.myflfamilies.com/sites/default/files/2024-10/Appendix%20A-12%20OSS%20Payment%20Standards.pdf diff --git a/policyengine_us/tests/policy/baseline/gov/states/fl/dcf/oss/edge_cases.yaml b/policyengine_us/tests/policy/baseline/gov/states/fl/dcf/oss/edge_cases.yaml new file mode 100644 index 00000000000..0677e2d2abc --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/fl/dcf/oss/edge_cases.yaml @@ -0,0 +1,815 @@ +# Edge case tests for Florida OSS (Optional State Supplementation). +# All FL OSS variables are MONTH-defined (Person entity). +# ssi_countable_income and uncapped_ssi are YEAR-defined: +# in MONTH tests, provide ANNUAL input, formula reads monthly = annual / 12. + +# ────────────────────────────────────────────────────────────── +# Income threshold boundary tests (Redesign, individual, 2025) +# Income standard = $1,045.40/month = $12,544.80/year. +# ────────────────────────────────────────────────────────────── + +- name: Case 1, income exactly at income standard boundary, Group 2 eligible. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 70 + is_ssi_eligible: true + ssi_claim_is_joint: false + # Not an SSI recipient, but income exactly at income standard. + uncapped_ssi: -940 + # $1,045.40/month * 12 = $12,544.80/year. + # Formula: countable_income ($1,045.40) <= income_standard ($1,045.40) → true. + ssi_countable_income: 12_544.80 + households: + household: + members: [person1] + state_code: FL + fl_oss_facility_type: ALF + fl_oss_program_track: REDESIGN + output: + fl_oss_eligible: [true] + # Total needs = $1,151.40/month. + # OSS = min(max(0, $1,151.40 - $1,045.40), $184.40) = min($106, $184.40) = $106. + fl_oss: [106] + +- name: Case 2, income one cent above income standard, Group 2 ineligible. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 70 + is_ssi_eligible: true + ssi_claim_is_joint: false + uncapped_ssi: -950 + # ($1,045.40 + $0.01)/month * 12 = $12,544.92/year. + # Formula: countable_income ($1,045.41) > income_standard ($1,045.40) → false. + # Also uncapped_ssi < 0 → not SSI recipient. Both groups fail → ineligible. + ssi_countable_income: 12_544.92 + households: + household: + members: [person1] + state_code: FL + fl_oss_facility_type: ALF + fl_oss_program_track: REDESIGN + output: + fl_oss_eligible: [false] + fl_oss: [0] + +- name: Case 3, income one cent below income standard, Group 2 eligible. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 70 + is_ssi_eligible: true + ssi_claim_is_joint: false + uncapped_ssi: -930 + # ($1,045.40 - $0.01)/month * 12 = $12,544.68/year. + # Formula: countable_income ($1,045.39) <= income_standard ($1,045.40) → true. + ssi_countable_income: 12_544.68 + households: + household: + members: [person1] + state_code: FL + fl_oss_facility_type: ALF + fl_oss_program_track: REDESIGN + output: + fl_oss_eligible: [true] + # OSS = min(max(0, $1,151.40 - $1,045.39), $184.40) = min($106.01, $184.40) = $106.01. + fl_oss: [106.01] + +# ────────────────────────────────────────────────────────────── +# Income = total_needs exactly → $0 benefit +# Total needs (Redesign, I) = $1,151.40/month = $13,816.80/year. +# ────────────────────────────────────────────────────────────── + +- name: Case 4, income equals total needs exactly, zero benefit. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 70 + is_ssi_eligible: true + ssi_claim_is_joint: false + # SSI recipient (positive uncapped_ssi) to ensure eligibility via Group 1. + uncapped_ssi: 12 + # $1,151.40/month * 12 = $13,816.80/year. + # Formula: max(0, $1,151.40 - $1,151.40) = $0. + ssi_countable_income: 13_816.80 + households: + household: + members: [person1] + state_code: FL + fl_oss_facility_type: ALF + fl_oss_program_track: REDESIGN + output: + fl_oss_eligible: [true] + fl_oss: [0] + +# ────────────────────────────────────────────────────────────── +# Income = total_needs - max_oss exactly → benefit = max_oss +# Redesign I: total_needs - max_oss = $1,151.40 - $184.40 = $967/month. +# $967/month * 12 = $11,604/year. +# ────────────────────────────────────────────────────────────── + +- name: Case 5, income at total needs minus max OSS, benefit exactly equals max OSS. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 70 + is_ssi_eligible: true + ssi_claim_is_joint: false + uncapped_ssi: 12 + # $967/month * 12 = $11,604/year. + # Formula: min(max(0, $1,151.40 - $967), $184.40) = min($184.40, $184.40) = $184.40. + ssi_countable_income: 11_604 + households: + household: + members: [person1] + state_code: FL + fl_oss_facility_type: ALF + fl_oss_program_track: REDESIGN + output: + fl_oss_eligible: [true] + fl_oss: [184.40] + +- name: Case 6, income one cent above transition point, benefit just below max OSS. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 70 + is_ssi_eligible: true + ssi_claim_is_joint: false + uncapped_ssi: 12 + # ($967 + $0.01)/month * 12 = $11,604.12/year. + # Formula: min(max(0, $1,151.40 - $967.01), $184.40) = min($184.39, $184.40) = $184.39. + ssi_countable_income: 11_604.12 + households: + household: + members: [person1] + state_code: FL + fl_oss_facility_type: ALF + fl_oss_program_track: REDESIGN + output: + fl_oss_eligible: [true] + fl_oss: [184.39] + +# ────────────────────────────────────────────────────────────── +# Zero income → capped at max OSS +# ────────────────────────────────────────────────────────────── + +- name: Case 7, zero income Protected individual, capped at max OSS. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 45 + is_ssi_eligible: true + ssi_claim_is_joint: false + uncapped_ssi: 11_604 + ssi_countable_income: 0 + households: + household: + members: [person1] + state_code: FL + fl_oss_facility_type: MHRTF + fl_oss_program_track: PROTECTED + output: + fl_oss_eligible: [true] + # Total needs (Protected, I) = $1,312/month. Income = $0. + # Calculated = $1,312. Max = $345. Capped at $345. + fl_oss: [345] + +- name: Case 8, zero income Redesign couple, capped at max OSS per person. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 72 + is_ssi_eligible: true + ssi_claim_is_joint: true + uncapped_ssi: 10_000 + ssi_countable_income: 0 + person2: + age: 68 + is_ssi_eligible: true + ssi_claim_is_joint: true + uncapped_ssi: 10_000 + ssi_countable_income: 0 + marital_units: + marital_unit: + members: [person1, person2] + tax_units: + tax_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: FL + fl_oss_facility_type: AFCH + fl_oss_program_track: REDESIGN + output: + fl_oss_eligible: [true, true] + # Per person total needs = $1,102.90. Income = $0. + # Calculated per person = $1,102.90. Max per person = $193.40. + # Capped at $193.40 each. + fl_oss: [193.40, 193.40] + +# ────────────────────────────────────────────────────────────── +# Very high income → $0 benefit (well above income standard) +# ────────────────────────────────────────────────────────────── + +- name: Case 9, very high income SSI recipient, income well above total needs. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 70 + is_ssi_eligible: true + ssi_claim_is_joint: false + # Still an SSI recipient (Group 1) but income very high. + uncapped_ssi: 12 + # $5,000/month * 12 = $60,000/year. + ssi_countable_income: 60_000 + households: + household: + members: [person1] + state_code: FL + fl_oss_facility_type: ALF + fl_oss_program_track: REDESIGN + output: + fl_oss_eligible: [true] + # Total needs = $1,151.40. Income = $5,000. max(0, $1,151.40 - $5,000) = $0. + fl_oss: [0] + +# ────────────────────────────────────────────────────────────── +# PNA transition boundary: 2024-01 (PNA=$54) vs 2025-01 (PNA=$160) +# The PNA changed 2024-07-01 from $54 to $160. +# Jan 2024 test: PNA=$54. Jan 2025 test: PNA=$160. +# ────────────────────────────────────────────────────────────── + +- name: Case 10, PNA at old rate (2024-01), Redesign individual. + period: 2024-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 70 + is_ssi_eligible: true + ssi_claim_is_joint: false + uncapped_ssi: 2_916 + ssi_countable_income: 8_400 + households: + household: + members: [person1] + state_code: FL + fl_oss_facility_type: ALF + fl_oss_program_track: REDESIGN + output: + fl_oss_eligible: [true] + # SSI FBR (I) 2024 = $943. Redesign offset pre-Jul-2024 = $78.40. + # Provider rate = $943 + $78.40 = $1,021.40/month. + fl_oss_provider_rate: [1_021.40] + # PNA = $54. Total needs = $1,021.40 + $54 = $1,075.40/month. + # Max OSS (Redesign, I, pre-Jul-2024) = $78.40. + # Income = $700/month. OSS = min(max(0, $1,075.40 - $700), $78.40) + # = min($375.40, $78.40) = $78.40. + fl_oss: [78.40] + +- name: Case 11, PNA at new rate (2025-01), same income scenario for comparison. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 70 + is_ssi_eligible: true + ssi_claim_is_joint: false + uncapped_ssi: 2_004 + ssi_countable_income: 8_400 + households: + household: + members: [person1] + state_code: FL + fl_oss_facility_type: ALF + fl_oss_program_track: REDESIGN + output: + fl_oss_eligible: [true] + # SSI FBR (I) 2025 = $967. Redesign offset = $24.40. + # Provider rate = $967 + $24.40 = $991.40/month. + fl_oss_provider_rate: [991.40] + # PNA = $160. Total needs = $991.40 + $160 = $1,151.40/month. + # Max OSS (Redesign, I) = $184.40. + # Income = $700/month. OSS = min(max(0, $1,151.40 - $700), $184.40) + # = min($451.40, $184.40) = $184.40. + fl_oss: [184.40] + +# ────────────────────────────────────────────────────────────── +# Protected track: params are 0 before 2024-07-01 +# Provider rate offset = $0, max OSS individual = $0, couple = $0. +# This means Protected track effectively didn't exist before Jul 2024. +# ────────────────────────────────────────────────────────────── + +- name: Case 12, Protected track before Jul 2024, zero max OSS. + period: 2024-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 45 + is_ssi_eligible: true + ssi_claim_is_joint: false + uncapped_ssi: 2_916 + ssi_countable_income: 8_400 + households: + household: + members: [person1] + state_code: FL + fl_oss_facility_type: MHRTF + fl_oss_program_track: PROTECTED + output: + fl_oss_eligible: [true] + # SSI FBR (I) 2024 = $943. Protected offset pre-Jul-2024 = $0. + # Provider rate = $943 + $0 = $943/month. + fl_oss_provider_rate: [943] + # Max OSS (Protected, I, pre-Jul-2024) = $0. + fl_oss_max_oss: [0] + # OSS = min(max(0, total_needs - income), $0) = $0. + fl_oss: [0] + +- name: Case 13, Protected couple before Jul 2024, zero max OSS. + period: 2024-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 45 + is_ssi_eligible: true + ssi_claim_is_joint: true + uncapped_ssi: 2_000 + ssi_countable_income: 7_200 + person2: + age: 42 + is_ssi_eligible: true + ssi_claim_is_joint: true + uncapped_ssi: 2_000 + ssi_countable_income: 7_200 + marital_units: + marital_unit: + members: [person1, person2] + tax_units: + tax_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: FL + fl_oss_facility_type: MHRTF + fl_oss_program_track: PROTECTED + output: + fl_oss_eligible: [true, true] + # Max OSS (Protected, C, pre-Jul-2024) = $0. Per person = $0. + fl_oss_max_oss: [0, 0] + fl_oss: [0, 0] + +# ────────────────────────────────────────────────────────────── +# Protected track post Jul 2024 → nonzero max OSS +# ────────────────────────────────────────────────────────────── + +- name: Case 14, Protected individual after Jul 2024, full benefit. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 45 + is_ssi_eligible: true + ssi_claim_is_joint: false + uncapped_ssi: 11_604 + ssi_countable_income: 0 + households: + household: + members: [person1] + state_code: FL + fl_oss_facility_type: MHRTF + fl_oss_program_track: PROTECTED + output: + fl_oss_eligible: [true] + # Provider rate = $967 + $185 = $1,152/month. + fl_oss_provider_rate: [1_152] + # Max OSS (Protected, I) = $345/month. + fl_oss_max_oss: [345] + # Total needs = $1,152 + $160 = $1,312. Income = $0. + # OSS = min($1,312, $345) = $345. + fl_oss: [345] + +# ────────────────────────────────────────────────────────────── +# Protected track income standard boundary +# Protected income standard = provider rate = $1,152/month = $13,824/year. +# ────────────────────────────────────────────────────────────── + +- name: Case 15, Protected income exactly at income standard, Group 2 eligible. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 45 + is_ssi_eligible: true + ssi_claim_is_joint: false + uncapped_ssi: -200 + # $1,152/month * 12 = $13,824/year. + # countable_income ($1,152) <= income_standard ($1,152) → Group 2 eligible. + ssi_countable_income: 13_824 + households: + household: + members: [person1] + state_code: FL + fl_oss_facility_type: MHRTF + fl_oss_program_track: PROTECTED + output: + fl_oss_eligible: [true] + fl_oss_income_standard: [1_152] + # Total needs = $1,312. Income = $1,152. + # OSS = min(max(0, $1,312 - $1,152), $345) = min($160, $345) = $160. + fl_oss: [160] + +- name: Case 16, Protected income one cent above income standard, ineligible. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 45 + is_ssi_eligible: true + ssi_claim_is_joint: false + uncapped_ssi: -210 + # ($1,152 + $0.01)/month * 12 = $13,824.12/year. + # countable_income ($1,152.01) > income_standard ($1,152) → Group 2 fails. + # Also uncapped_ssi < 0 → not Group 1. Ineligible. + ssi_countable_income: 13_824.12 + households: + household: + members: [person1] + state_code: FL + fl_oss_facility_type: MHRTF + fl_oss_program_track: PROTECTED + output: + fl_oss_eligible: [false] + fl_oss: [0] + +# ────────────────────────────────────────────────────────────── +# All three facility types +# ────────────────────────────────────────────────────────────── + +- name: Case 17, AFCH facility type, Redesign individual. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 70 + is_ssi_eligible: true + ssi_claim_is_joint: false + uncapped_ssi: 11_604 + ssi_countable_income: 0 + households: + household: + members: [person1] + state_code: FL + fl_oss_facility_type: AFCH + fl_oss_program_track: REDESIGN + output: + fl_oss_eligible: [true] + fl_oss: [184.40] + +- name: Case 18, MHRTF facility type, Redesign individual. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 45 + is_ssi_eligible: true + ssi_claim_is_joint: false + uncapped_ssi: 11_604 + ssi_countable_income: 0 + households: + household: + members: [person1] + state_code: FL + fl_oss_facility_type: MHRTF + fl_oss_program_track: REDESIGN + output: + fl_oss_eligible: [true] + fl_oss: [184.40] + +# ────────────────────────────────────────────────────────────── +# Couple with Protected track, both eligible, post Jul 2024 +# ────────────────────────────────────────────────────────────── + +- name: Case 19, Protected couple, zero income, max benefit. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 72 + is_ssi_eligible: true + ssi_claim_is_joint: true + uncapped_ssi: 10_000 + ssi_countable_income: 0 + person2: + age: 68 + is_ssi_eligible: true + ssi_claim_is_joint: true + uncapped_ssi: 10_000 + ssi_countable_income: 0 + marital_units: + marital_unit: + members: [person1, person2] + tax_units: + tax_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: FL + fl_oss_facility_type: MHRTF + fl_oss_program_track: PROTECTED + output: + fl_oss_eligible: [true, true] + # Protected couple provider rate = 2 * $1,152 - $97 = $2,207/month. + # Per person = $2,207 / 2 = $1,103.50/month. + fl_oss_provider_rate: [1_103.50, 1_103.50] + # Max OSS (Protected, C) = $690. Per person = $345. + fl_oss_max_oss: [345, 345] + # Total needs per person = $1,103.50 + $160 = $1,263.50. Income = $0. + # OSS per person = min($1,263.50, $345) = $345. + fl_oss: [345, 345] + +# ────────────────────────────────────────────────────────────── +# Couple: income at total_needs - max_oss boundary (Redesign) +# Per person: total_needs = $1,102.90, max_oss = $193.40. +# Boundary income = $1,102.90 - $193.40 = $909.50/month per person. +# Annual per person = $909.50 * 12 = $10,914. +# ────────────────────────────────────────────────────────────── + +- name: Case 20, couple income at total needs minus max OSS, benefit exactly equals max. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 72 + is_ssi_eligible: true + ssi_claim_is_joint: true + uncapped_ssi: 12 + # $909.50/month * 12 = $10,914/year. + ssi_countable_income: 10_914 + person2: + age: 68 + is_ssi_eligible: true + ssi_claim_is_joint: true + uncapped_ssi: 12 + ssi_countable_income: 10_914 + marital_units: + marital_unit: + members: [person1, person2] + tax_units: + tax_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: FL + fl_oss_facility_type: AFCH + fl_oss_program_track: REDESIGN + output: + fl_oss_eligible: [true, true] + # Per person: min(max(0, $1,102.90 - $909.50), $193.40) = min($193.40, $193.40) = $193.40. + fl_oss: [193.40, 193.40] + +# ────────────────────────────────────────────────────────────── +# Couple income standard boundary (Redesign) +# Per person income standard = $996.90/month = $11,962.80/year. +# ────────────────────────────────────────────────────────────── + +- name: Case 21, couple income exactly at income standard, Group 2 eligible. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 72 + is_ssi_eligible: true + ssi_claim_is_joint: true + uncapped_ssi: -100 + # $996.90/month * 12 = $11,962.80/year. + ssi_countable_income: 11_962.80 + person2: + age: 68 + is_ssi_eligible: true + ssi_claim_is_joint: true + uncapped_ssi: -100 + ssi_countable_income: 11_962.80 + marital_units: + marital_unit: + members: [person1, person2] + tax_units: + tax_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: FL + fl_oss_facility_type: AFCH + fl_oss_program_track: REDESIGN + output: + # Income ($996.90) <= income standard ($996.90) → Group 2 eligible. + fl_oss_eligible: [true, true] + fl_oss_income_standard: [996.90, 996.90] + # Per person: min(max(0, $1,102.90 - $996.90), $193.40) = min($106, $193.40) = $106. + fl_oss: [106, 106] + +# ────────────────────────────────────────────────────────────── +# 2011 historical Protected track (offset=0, max=0 before Jul 2024) +# ────────────────────────────────────────────────────────────── + +- name: Case 22, 2011 Protected track, zero benefit due to zero max OSS. + period: 2011-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 45 + is_ssi_eligible: true + ssi_claim_is_joint: false + uncapped_ssi: 2_088 + ssi_countable_income: 6_000 + households: + household: + members: [person1] + state_code: FL + fl_oss_facility_type: MHRTF + fl_oss_program_track: PROTECTED + output: + fl_oss_eligible: [true] + # SSI FBR (I) 2011 = $674. Protected offset 2011 = $0. + # Provider rate = $674 + $0 = $674/month. + fl_oss_provider_rate: [674] + # Protected income standard = provider rate = $674/month. + fl_oss_income_standard: [674] + # Max OSS (Protected, I) = $0. + fl_oss_max_oss: [0] + # OSS = min(max(0, total_needs - income), $0) = $0. + fl_oss: [0] + +# ────────────────────────────────────────────────────────────── +# Partial benefit: income between (total_needs - max_oss) and total_needs +# Redesign I: total_needs = $1,151.40, max_oss = $184.40. +# Transition at $967/month. Test $1,050/month → partial benefit. +# ────────────────────────────────────────────────────────────── + +- name: Case 23, partial benefit between threshold and total needs. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 70 + is_ssi_eligible: true + ssi_claim_is_joint: false + uncapped_ssi: 12 + # $1,050/month * 12 = $12,600/year. + # Income standard = $1,045.40, but Group 1 (SSI recipient) so still eligible. + ssi_countable_income: 12_600 + households: + household: + members: [person1] + state_code: FL + fl_oss_facility_type: ALF + fl_oss_program_track: REDESIGN + output: + fl_oss_eligible: [true] + # Total needs = $1,151.40. Income = $1,050. + # OSS = min(max(0, $1,151.40 - $1,050), $184.40) = min($101.40, $184.40) = $101.40. + fl_oss: [101.40] + +# ────────────────────────────────────────────────────────────── +# Group 1 SSI recipient with income above Group 2 income standard +# SSI recipients (Group 1) can still receive OSS even if income > income standard, +# because the eligibility formula is: receives_ssi | income_within_standard. +# ────────────────────────────────────────────────────────────── + +- name: Case 24, SSI recipient with income above income standard but below total needs. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 70 + is_ssi_eligible: true + ssi_claim_is_joint: false + # Income = $1,050/month > income standard $1,045.40 (would fail Group 2). + # But uncapped_ssi > 0 → SSI recipient → Group 1 eligible. + uncapped_ssi: 12 + ssi_countable_income: 12_600 + households: + household: + members: [person1] + state_code: FL + fl_oss_facility_type: ALF + fl_oss_program_track: REDESIGN + output: + fl_oss_eligible: [true] + # Income ($1,050) > income standard ($1,045.40) but Group 1 applies. + fl_oss_income_standard: [1_045.40] + # Total needs = $1,151.40. OSS = min(max(0, $1,151.40 - $1,050), $184.40) + # = min($101.40, $184.40) = $101.40. + fl_oss: [101.40] + +# ────────────────────────────────────────────────────────────── +# Not SSI eligible (fails categorically_eligible) +# ────────────────────────────────────────────────────────────── + +- name: Case 25, not SSI eligible even with low income, ineligible. + period: 2025-01 + input: + people: + person1: + age: 40 + # Not aged/blind/disabled → is_ssi_eligible = false. + is_ssi_eligible: false + ssi_claim_is_joint: false + uncapped_ssi: 0 + ssi_countable_income: 0 + households: + household: + members: [person1] + state_code: FL + fl_oss_facility_type: ALF + fl_oss_program_track: REDESIGN + output: + fl_oss_eligible: [false] + fl_oss: [0] + +# ────────────────────────────────────────────────────────────── +# Facility type set but track is NONE → has_track fails +# ────────────────────────────────────────────────────────────── + +- name: Case 26, facility type set but program track NONE, ineligible. + period: 2025-01 + input: + people: + person1: + age: 70 + is_ssi_eligible: true + ssi_claim_is_joint: false + uncapped_ssi: 2_004 + ssi_countable_income: 9_600 + households: + household: + members: [person1] + state_code: FL + fl_oss_facility_type: ALF + fl_oss_program_track: NONE + output: + fl_oss_eligible: [false] + fl_oss: [0] + +# ────────────────────────────────────────────────────────────── +# Track set but facility type NONE → in_facility fails +# ────────────────────────────────────────────────────────────── + +- name: Case 27, program track set but facility type NONE, ineligible. + period: 2025-01 + input: + people: + person1: + age: 70 + is_ssi_eligible: true + ssi_claim_is_joint: false + uncapped_ssi: 2_004 + ssi_countable_income: 9_600 + households: + household: + members: [person1] + state_code: FL + fl_oss_facility_type: NONE + fl_oss_program_track: REDESIGN + output: + fl_oss_eligible: [false] + fl_oss: [0] diff --git a/policyengine_us/tests/policy/baseline/gov/states/fl/dcf/oss/fl_oss.yaml b/policyengine_us/tests/policy/baseline/gov/states/fl/dcf/oss/fl_oss.yaml new file mode 100644 index 00000000000..c0153f6ab69 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/fl/dcf/oss/fl_oss.yaml @@ -0,0 +1,188 @@ +# Tests for fl_oss variable (final OSS payment). +# Formula: fl_oss = min(max(0, total_needs - countable_income), max_oss) + +- name: Case 1, SSI recipient Redesign individual with typical income. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 70 + is_ssi_eligible: true + ssi_claim_is_joint: false + # uncapped_ssi > 0 means person receives SSI (Group 1). + # $967/month FBR - $800/month income = $167/month uncapped. + # Annual: $167 * 12 = $2,004. + uncapped_ssi: 2_004 + # Annual countable income = $800 * 12 = $9,600. + ssi_countable_income: 9_600 + households: + household: + members: [person1] + state_code: FL + fl_oss_facility_type: ALF + fl_oss_program_track: REDESIGN + output: + # Total needs (I, Redesign) = $991.40 + $160 = $1,151.40/month = $13,816.80/year. + # Countable income = $9,600/year. + # Calculated OSS = $13,816.80 - $9,600 = $4,216.80/year. + # Max OSS (Redesign, I) = $184.40/month = $2,212.80/year. + # OSS = min($4,216.80, $2,212.80) = $2,212.80/year. + # Monthly output = $2,212.80 / 12 = $184.40. + fl_oss: [184.40] + +- name: Case 2, SSI recipient Protected individual with typical income. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 70 + is_ssi_eligible: true + ssi_claim_is_joint: false + uncapped_ssi: 2_004 + ssi_countable_income: 9_600 + households: + household: + members: [person1] + state_code: FL + fl_oss_facility_type: MHRTF + fl_oss_program_track: PROTECTED + output: + # Total needs (I, Protected) = $1,152 + $160 = $1,312/month = $15,744/year. + # Countable income = $9,600/year. + # Calculated OSS = $15,744 - $9,600 = $6,144/year. + # Max OSS (Protected, I) = $345/month = $4,140/year. + # OSS = min($6,144, $4,140) = $4,140/year. + # Monthly output = $4,140 / 12 = $345. + fl_oss: [345] + +- name: Case 3, income exceeds total needs, zero benefit. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 70 + is_ssi_eligible: true + ssi_claim_is_joint: false + # Income exceeds total needs, so max(0, total_needs - income) = 0. + uncapped_ssi: -2_000 + # $1,200/month countable income = $14,400/year. + # Total needs Redesign (I) = $13,816.80/year. + # $14,400 > $13,816.80, so benefit = 0. + ssi_countable_income: 14_400 + households: + household: + members: [person1] + state_code: FL + fl_oss_facility_type: ALF + fl_oss_program_track: REDESIGN + output: + fl_oss: [0] + +- name: Case 4, zero countable income, capped at max OSS. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 70 + is_ssi_eligible: true + ssi_claim_is_joint: false + uncapped_ssi: 11_604 + ssi_countable_income: 0 + households: + household: + members: [person1] + state_code: FL + fl_oss_facility_type: ALF + fl_oss_program_track: REDESIGN + output: + # Total needs (I, Redesign) = $13,816.80/year. + # Countable income = $0. + # Calculated OSS = $13,816.80/year. + # Max OSS (Redesign, I) = $2,212.80/year. + # OSS = min($13,816.80, $2,212.80) = $2,212.80/year. + # Monthly output = $2,212.80 / 12 = $184.40. + fl_oss: [184.40] + +- name: Case 5, income just below total needs, partial benefit under max. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 70 + is_ssi_eligible: true + ssi_claim_is_joint: false + uncapped_ssi: -500 + # $1,100/month = $13,200/year. + # Total needs Redesign (I) = $13,816.80/year. + # Calculated = $13,816.80 - $13,200 = $616.80/year. + # But income standard (I, Redesign) = $1,045.40/month = $12,544.80/year. + # $13,200 > $12,544.80 so Group 2 check fails. + # Also uncapped_ssi < 0 so not Group 1. + # Person is INELIGIBLE (income above income standard for Group 2). + ssi_countable_income: 13_200 + households: + household: + members: [person1] + state_code: FL + fl_oss_facility_type: ALF + fl_oss_program_track: REDESIGN + output: + # Ineligible: uncapped_ssi <= 0 AND income > income standard. + fl_oss: [0] + +- name: Case 6, Group 2 eligible with income below income standard, small benefit. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 70 + is_ssi_eligible: true + ssi_claim_is_joint: false + # Not an SSI recipient (income too high for SSI), but within OSS income standard. + uncapped_ssi: -100 + # $1,000/month = $12,000/year. + # Income standard (Redesign, I) = $1,045.40/month = $12,544.80/year. + # $12,000 < $12,544.80 → Group 2 eligible. + ssi_countable_income: 12_000 + households: + household: + members: [person1] + state_code: FL + fl_oss_facility_type: ALF + fl_oss_program_track: REDESIGN + output: + # Total needs (Redesign, I) = $13,816.80/year. + # Countable income = $12,000/year. + # Calculated = $13,816.80 - $12,000 = $1,816.80/year. + # Max OSS (Redesign, I) = $2,212.80/year. + # OSS = min($1,816.80, $2,212.80) = $1,816.80/year. + # Monthly output = $1,816.80 / 12 = $151.40. + fl_oss: [151.40] + +- name: Case 7, negative countable income does not inflate benefit beyond max. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 70 + is_ssi_eligible: true + ssi_claim_is_joint: false + uncapped_ssi: 60_000_000 + ssi_countable_income: -60_000_000 + households: + household: + members: [person1] + state_code: FL + fl_oss_facility_type: ALF + fl_oss_program_track: REDESIGN + output: + # Even with hugely negative income, OSS is capped at max. + # Max OSS (Redesign, I) = $184.40/month. + fl_oss: [184.40] diff --git a/policyengine_us/tests/policy/baseline/gov/states/fl/dcf/oss/fl_oss_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/fl/dcf/oss/fl_oss_eligible.yaml new file mode 100644 index 00000000000..929fce337aa --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/fl/dcf/oss/fl_oss_eligible.yaml @@ -0,0 +1,115 @@ +# Tests for fl_oss_eligible variable. +# Eligibility requires: is_ssi_eligible AND facility type != NONE AND +# (uncapped_ssi > 0 [Group 1 SSI recipient] OR income <= income_standard [Group 2]) + +- name: Case 1, SSI recipient in ALF (Redesign) is eligible. + period: 2025-01 + input: + people: + person1: + age: 70 + is_ssi_eligible: true + # uncapped_ssi is YEAR-defined; $967 annual = $80.58/month output. + # >0 means person receives SSI (Group 1). + uncapped_ssi: 967 + households: + household: + members: [person1] + state_code: FL + fl_oss_facility_type: ALF + fl_oss_program_track: REDESIGN + output: + fl_oss_eligible: [true] + +- name: Case 2, person not SSI eligible is ineligible. + period: 2025-01 + input: + people: + person1: + age: 40 + is_ssi_eligible: false + uncapped_ssi: 0 + households: + household: + members: [person1] + state_code: FL + fl_oss_facility_type: ALF + fl_oss_program_track: REDESIGN + output: + fl_oss_eligible: [false] + +- name: Case 3, wrong state is ineligible. + period: 2025-01 + input: + people: + person1: + age: 70 + is_ssi_eligible: true + uncapped_ssi: 967 + households: + household: + members: [person1] + state_code: CA + fl_oss_facility_type: ALF + fl_oss_program_track: REDESIGN + output: + fl_oss_eligible: [false] + +- name: Case 4, no facility placement (NONE) is ineligible. + period: 2025-01 + input: + people: + person1: + age: 70 + is_ssi_eligible: true + uncapped_ssi: 967 + households: + household: + members: [person1] + state_code: FL + fl_oss_facility_type: NONE + fl_oss_program_track: NONE + output: + fl_oss_eligible: [false] + +- name: Case 5, Group 2 non-SSI recipient with income below income standard is eligible. + period: 2025-01 + input: + people: + person1: + age: 70 + is_ssi_eligible: true + # uncapped_ssi <= 0 means not an SSI recipient (income too high for SSI). + # But if income <= OSS income standard, Group 2 applies. + uncapped_ssi: -100 + # ssi_countable_income is YEAR-defined. + # Redesign income standard (I) 2025 = $991.40 + $54 = $1,045.40/month + # = $12,544.80/year. Set income below that. + ssi_countable_income: 12_000 + households: + household: + members: [person1] + state_code: FL + fl_oss_facility_type: ALF + fl_oss_program_track: REDESIGN + output: + fl_oss_eligible: [true] + +- name: Case 6, Group 2 non-SSI recipient with income above income standard is ineligible. + period: 2025-01 + input: + people: + person1: + age: 70 + is_ssi_eligible: true + uncapped_ssi: -500 + # Income well above income standard of $12,544.80/year. + ssi_countable_income: 15_000 + households: + household: + members: [person1] + state_code: FL + fl_oss_facility_type: ALF + fl_oss_program_track: REDESIGN + output: + fl_oss_eligible: [false] diff --git a/policyengine_us/tests/policy/baseline/gov/states/fl/dcf/oss/fl_oss_income_standard.yaml b/policyengine_us/tests/policy/baseline/gov/states/fl/dcf/oss/fl_oss_income_standard.yaml new file mode 100644 index 00000000000..ebe47ad48de --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/fl/dcf/oss/fl_oss_income_standard.yaml @@ -0,0 +1,77 @@ +# Tests for fl_oss_income_standard variable. +# Redesign income standard = provider rate + $54 (frozen old PNA offset). +# Protected income standard = provider rate (same value). + +- name: Case 1, Redesign individual income standard Jan 2025. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 70 + is_ssi_eligible: true + ssi_claim_is_joint: false + households: + household: + members: [person1] + state_code: FL + fl_oss_program_track: REDESIGN + output: + # Redesign provider rate (I) = $991.40/month. + # Income standard PNA offset = $54/month. + # Income standard = $991.40 + $54 = $1,045.40/month. + # Annual = $1,045.40 * 12 = $12,544.80. + # Monthly output = $12,544.80 / 12 = $1,045.40. + fl_oss_income_standard: [1_045.40] + +- name: Case 2, Protected individual income standard Jan 2025. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 70 + is_ssi_eligible: true + ssi_claim_is_joint: false + households: + household: + members: [person1] + state_code: FL + fl_oss_program_track: PROTECTED + output: + # Protected income standard = provider rate = $1,152/month. + # Annual = $1,152 * 12 = $13,824. + # Monthly output = $13,824 / 12 = $1,152. + fl_oss_income_standard: [1_152] + +- name: Case 3, Redesign couple income standard Jan 2025. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 70 + is_ssi_eligible: true + ssi_claim_is_joint: true + person2: + age: 68 + is_ssi_eligible: true + ssi_claim_is_joint: true + marital_units: + marital_unit: + members: [person1, person2] + tax_units: + tax_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: FL + fl_oss_program_track: REDESIGN + output: + # Couple provider rate (Redesign) = $1,885.80/month. + # Couple income standard = couple provider rate + 2 * $54 = $1,885.80 + $108 = $1,993.80/month. + # Per person = $1,993.80 / 2 = $996.90/month. + # Annual per person = $996.90 * 12 = $11,962.80. + # Monthly output = $11,962.80 / 12 = $996.90. + fl_oss_income_standard: [996.90, 996.90] diff --git a/policyengine_us/tests/policy/baseline/gov/states/fl/dcf/oss/fl_oss_max_oss.yaml b/policyengine_us/tests/policy/baseline/gov/states/fl/dcf/oss/fl_oss_max_oss.yaml new file mode 100644 index 00000000000..00e2ff55f48 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/fl/dcf/oss/fl_oss_max_oss.yaml @@ -0,0 +1,104 @@ +# Tests for fl_oss_max_oss variable. +# Max OSS caps by track and individual/couple status. + +- name: Case 1, Redesign individual max OSS Jan 2025. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 70 + is_ssi_eligible: true + ssi_claim_is_joint: false + households: + household: + members: [person1] + state_code: FL + fl_oss_program_track: REDESIGN + output: + # Max OSS (Redesign, I) = $184.40/month (frozen). + # Annual = $184.40 * 12 = $2,212.80. + # Monthly output = $2,212.80 / 12 = $184.40. + fl_oss_max_oss: [184.40] + +- name: Case 2, Protected individual max OSS Jan 2025. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 70 + is_ssi_eligible: true + ssi_claim_is_joint: false + households: + household: + members: [person1] + state_code: FL + fl_oss_program_track: PROTECTED + output: + # Max OSS (Protected, I) = $345/month (frozen). + # Annual = $345 * 12 = $4,140. + # Monthly output = $4,140 / 12 = $345. + fl_oss_max_oss: [345] + +- name: Case 3, Redesign couple max OSS Jan 2025. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 70 + is_ssi_eligible: true + ssi_claim_is_joint: true + person2: + age: 68 + is_ssi_eligible: true + ssi_claim_is_joint: true + marital_units: + marital_unit: + members: [person1, person2] + tax_units: + tax_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: FL + fl_oss_program_track: REDESIGN + output: + # Max OSS (Redesign, C) = $386.80/month (frozen). + # Per person = $386.80 / 2 = $193.40/month. + # Annual per person = $193.40 * 12 = $2,320.80. + # Monthly output = $2,320.80 / 12 = $193.40. + fl_oss_max_oss: [193.40, 193.40] + +- name: Case 4, Protected couple max OSS Jan 2025. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 70 + is_ssi_eligible: true + ssi_claim_is_joint: true + person2: + age: 68 + is_ssi_eligible: true + ssi_claim_is_joint: true + marital_units: + marital_unit: + members: [person1, person2] + tax_units: + tax_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: FL + fl_oss_program_track: PROTECTED + output: + # Max OSS (Protected, C) = $690/month (frozen). + # Per person = $690 / 2 = $345/month. + # Annual per person = $345 * 12 = $4,140. + # Monthly output = $4,140 / 12 = $345. + fl_oss_max_oss: [345, 345] diff --git a/policyengine_us/tests/policy/baseline/gov/states/fl/dcf/oss/fl_oss_program_track.yaml b/policyengine_us/tests/policy/baseline/gov/states/fl/dcf/oss/fl_oss_program_track.yaml new file mode 100644 index 00000000000..9c36fbba81a --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/fl/dcf/oss/fl_oss_program_track.yaml @@ -0,0 +1,50 @@ +# Tests for fl_oss_program_track variable. +# Input enum: REDESIGN, PROTECTED, NONE. +# REDESIGN = ALF, AFCH, RTF enrolled for ACS. +# PROTECTED = RTF not enrolled for ACS + 2001 "Gap" Group. +# NONE = no facility / not in program. + +- name: Case 1, Redesign track (ALF). + period: 2025-01 + input: + people: + person1: + age: 70 + households: + household: + members: [person1] + state_code: FL + fl_oss_facility_type: ALF + fl_oss_program_track: REDESIGN + output: + fl_oss_program_track: REDESIGN + +- name: Case 2, Protected track (RTF not enrolled for ACS). + period: 2025-01 + input: + people: + person1: + age: 70 + households: + household: + members: [person1] + state_code: FL + fl_oss_facility_type: MHRTF + fl_oss_program_track: PROTECTED + output: + fl_oss_program_track: PROTECTED + +- name: Case 3, NONE (no facility). + period: 2025-01 + input: + people: + person1: + age: 70 + households: + household: + members: [person1] + state_code: FL + fl_oss_facility_type: NONE + fl_oss_program_track: NONE + output: + fl_oss_program_track: NONE diff --git a/policyengine_us/tests/policy/baseline/gov/states/fl/dcf/oss/fl_oss_provider_rate.yaml b/policyengine_us/tests/policy/baseline/gov/states/fl/dcf/oss/fl_oss_provider_rate.yaml new file mode 100644 index 00000000000..b8c70dfc6eb --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/fl/dcf/oss/fl_oss_provider_rate.yaml @@ -0,0 +1,128 @@ +# Tests for fl_oss_provider_rate variable. +# Redesign (I) = SSI FBR (individual) + offset. +# Protected (I) = SSI FBR (individual) + offset. +# Couple = 2 * individual rate - $97 couple reduction. + +- name: Case 1, individual Redesign provider rate Jan 2025. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 70 + is_ssi_eligible: true + ssi_claim_is_joint: false + households: + household: + members: [person1] + state_code: FL + fl_oss_program_track: REDESIGN + output: + # SSI FBR (I) 2025 = $967/month = $11,604/year. + # Redesign offset = $24.40/month = $292.80/year. + # Provider rate = $11,604 + $292.80 = $11,896.80/year. + # Monthly output = $11,896.80 / 12 = $991.40. + fl_oss_provider_rate: [991.40] + +- name: Case 2, individual Protected provider rate Jan 2025. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 70 + is_ssi_eligible: true + ssi_claim_is_joint: false + households: + household: + members: [person1] + state_code: FL + fl_oss_program_track: PROTECTED + output: + # SSI FBR (I) 2025 = $967/month = $11,604/year. + # Protected offset = $185/month = $2,220/year. + # Provider rate = $11,604 + $2,220 = $13,824/year. + # Monthly output = $13,824 / 12 = $1,152. + fl_oss_provider_rate: [1_152] + +- name: Case 3, couple Redesign provider rate Jan 2025. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 70 + is_ssi_eligible: true + ssi_claim_is_joint: true + person2: + age: 68 + is_ssi_eligible: true + ssi_claim_is_joint: true + marital_units: + marital_unit: + members: [person1, person2] + tax_units: + tax_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: FL + fl_oss_program_track: REDESIGN + output: + # Individual rate = $991.40/month. + # Couple rate = 2 * $991.40 - $97 = $1,885.80/month. + # Per person = $1,885.80 / 2 = $942.90/month. + # Annual per person = $942.90 * 12 = $11,314.80. + # Monthly output = $11,314.80 / 12 = $942.90. + fl_oss_provider_rate: [942.90, 942.90] + +- name: Case 4, couple Protected provider rate Jan 2025. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 70 + is_ssi_eligible: true + ssi_claim_is_joint: true + person2: + age: 68 + is_ssi_eligible: true + ssi_claim_is_joint: true + marital_units: + marital_unit: + members: [person1, person2] + tax_units: + tax_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: FL + fl_oss_program_track: PROTECTED + output: + # Individual Protected rate = $1,152/month. + # Couple rate = 2 * $1,152 - $97 = $2,207/month. + # Per person = $2,207 / 2 = $1,103.50/month. + fl_oss_provider_rate: [1_103.50, 1_103.50] + +- name: Case 5, individual Redesign provider rate 2024-01 (pre-restructuring era). + period: 2024-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 70 + is_ssi_eligible: true + ssi_claim_is_joint: false + households: + household: + members: [person1] + state_code: FL + fl_oss_program_track: REDESIGN + output: + # SSI FBR (I) 2024 = $943/month. + # Jan 2024 uses pre-Jul-2024 Redesign offset = $78.40/month. + # Provider rate = $943 + $78.40 = $1,021.40/month. + fl_oss_provider_rate: [1_021.40] diff --git a/policyengine_us/tests/policy/baseline/gov/states/fl/dcf/oss/integration.yaml b/policyengine_us/tests/policy/baseline/gov/states/fl/dcf/oss/integration.yaml new file mode 100644 index 00000000000..78e93dc174a --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/fl/dcf/oss/integration.yaml @@ -0,0 +1,302 @@ +# Integration tests for Florida OSS (Optional State Supplementation). +# Verifies intermediate and final values across the full calculation pipeline. + +- name: Case 1, SSI recipient in ALF (Redesign), individual, income $800/month. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 70 + is_ssi_eligible: true + ssi_claim_is_joint: false + # SSI FBR (I) 2025 = $967/month. Income = $800/month. + # uncapped_ssi = ($967 - $800) * 12 = $167 * 12 = $2,004/year. + uncapped_ssi: 2_004 + # $800/month * 12 = $9,600/year. + ssi_countable_income: 9_600 + households: + household: + members: [person1] + state_code: FL + fl_oss_facility_type: ALF + fl_oss_program_track: REDESIGN + output: + fl_oss_eligible: [true] + # Provider rate (I, Redesign) = $967 + $24.40 = $991.40/month. + fl_oss_provider_rate: [991.40] + # Income standard (I, Redesign) = $991.40 + $54 = $1,045.40/month. + fl_oss_income_standard: [1_045.40] + # Max OSS (Redesign, I) = $184.40/month. + fl_oss_max_oss: [184.40] + # Calculated = ($1,151.40 - $800) = $351.40/month → capped at $184.40. + # OSS = min($351.40, $184.40) = $184.40/month. + fl_oss: [184.40] + +- name: Case 2, SSI recipient in AFCH (Redesign), couple, both eligible, income $1,500/month combined. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 72 + is_ssi_eligible: true + ssi_claim_is_joint: true + # Couple SSI: each spouse has $600/month countable income. + # SSI FBR couple 2025 = $1,450/month. Per person = $725/month = $8,700/year. + # uncapped_ssi per person = $8,700 - $7,200 = $1,500/year > 0 → SSI recipients. + uncapped_ssi: 1_500 + ssi_countable_income: 7_200 + person2: + age: 68 + is_ssi_eligible: true + ssi_claim_is_joint: true + uncapped_ssi: 1_500 + ssi_countable_income: 7_200 + marital_units: + marital_unit: + members: [person1, person2] + tax_units: + tax_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: FL + fl_oss_facility_type: AFCH + fl_oss_program_track: REDESIGN + output: + fl_oss_eligible: [true, true] + # Couple provider rate (Redesign) = 2 * $991.40 - $97 = $1,885.80/month. + # Per person = $1,885.80 / 2 = $942.90/month. + fl_oss_provider_rate: [942.90, 942.90] + # Couple income standard (Redesign) = $1,885.80 + 2 * $54 = $1,993.80/month. + # Per person = $1,993.80 / 2 = $996.90/month. + fl_oss_income_standard: [996.90, 996.90] + # Couple max OSS (Redesign) = $386.80/month. + # Per person = $386.80 / 2 = $193.40/month. + fl_oss_max_oss: [193.40, 193.40] + # Per person: total_needs = $1,102.90, countable_income = $600/month. + # Calculated = $1,102.90 - $600 = $502.90/month. + # Capped at $193.40/month per person. + # OSS per person = $193.40/month. + fl_oss: [193.40, 193.40] + +- name: Case 3, Group 2 non-SSI recipient with income just below Redesign income standard. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 70 + is_ssi_eligible: true + ssi_claim_is_joint: false + # Not SSI recipient (income above FBR), but within OSS income standard. + # Income = $1,040/month. SSI FBR = $967/month. + # uncapped_ssi = ($967 - $1,040) * 12 = -$73 * 12 = -$876 < 0 → not SSI recipient. + uncapped_ssi: -876 + # $1,040/month * 12 = $12,480/year. + # Income standard (Redesign, I) = $1,045.40/month = $12,544.80/year. + # $12,480 < $12,544.80 → Group 2 eligible. + ssi_countable_income: 12_480 + households: + household: + members: [person1] + state_code: FL + fl_oss_facility_type: ALF + fl_oss_program_track: REDESIGN + output: + fl_oss_eligible: [true] + fl_oss_provider_rate: [991.40] + fl_oss_income_standard: [1_045.40] + fl_oss_max_oss: [184.40] + # Total needs = $1,151.40/month. Income = $1,040/month. + # Calculated = $1,151.40 - $1,040 = $111.40/month. + # Max = $184.40/month. $111.40 < $184.40 → not capped. + # OSS = $111.40/month. + fl_oss: [111.40] + +- name: Case 4, income above income standard, zero benefit. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 70 + is_ssi_eligible: true + ssi_claim_is_joint: false + # Income = $1,100/month > income standard of $1,045.40. + # uncapped_ssi = ($967 - $1,100) * 12 = -$1,596 → not SSI recipient. + # Income > income standard → not Group 2 either → ineligible. + uncapped_ssi: -1_596 + ssi_countable_income: 13_200 + households: + household: + members: [person1] + state_code: FL + fl_oss_facility_type: ALF + fl_oss_program_track: REDESIGN + output: + fl_oss_eligible: [false] + fl_oss: [0] + +- name: Case 5, SSI recipient in RTF (Protected track), individual, larger benefit. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 45 + is_ssi_eligible: true + ssi_claim_is_joint: false + # Disabled person in RTF not enrolled for ACS → Protected track. + # Income = $700/month. FBR = $967. + # uncapped_ssi = ($967 - $700) * 12 = $267 * 12 = $3,204 > 0 → SSI recipient. + uncapped_ssi: 3_204 + ssi_countable_income: 8_400 + households: + household: + members: [person1] + state_code: FL + fl_oss_facility_type: MHRTF + fl_oss_program_track: PROTECTED + output: + fl_oss_eligible: [true] + # Protected provider rate (I) = $967 + $185 = $1,152/month. + fl_oss_provider_rate: [1_152] + # Protected income standard = provider rate = $1,152/month. + fl_oss_income_standard: [1_152] + # Max OSS (Protected, I) = $345/month. + fl_oss_max_oss: [345] + # Calculated = $1,312 - $700 = $612/month → capped at $345. + # OSS = $345/month. + fl_oss: [345] + +- name: Case 6, person not in facility, zero benefit. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 70 + is_ssi_eligible: true + ssi_claim_is_joint: false + uncapped_ssi: 2_004 + ssi_countable_income: 9_600 + households: + household: + members: [person1] + state_code: FL + # No facility → no OSS for independent living. + fl_oss_facility_type: NONE + fl_oss_program_track: NONE + output: + fl_oss_eligible: [false] + fl_oss: [0] + +- name: Case 7, asymmetric couple, one eligible one not, individual rates apply. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 70 + is_ssi_eligible: true + ssi_claim_is_joint: false + uncapped_ssi: 2_004 + ssi_countable_income: 9_600 + person2: + age: 40 + # Not SSI eligible (not aged/blind/disabled). + is_ssi_eligible: false + ssi_claim_is_joint: false + uncapped_ssi: 0 + ssi_countable_income: 0 + marital_units: + marital_unit: + members: [person1, person2] + tax_units: + tax_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: FL + fl_oss_facility_type: ALF + fl_oss_program_track: REDESIGN + output: + # Person1 is eligible (SSI recipient, in facility). + # Person2 is NOT eligible (not SSI eligible). + # Since ssi_claim_is_joint = false, individual rates apply. + fl_oss_eligible: [true, false] + # Provider rate and max OSS compute for all FL residents (defined_for = StateCode.FL). + # Person1: individual provider rate = $991.40/month. + # Person2: also gets $991.40 (computed but unused since ineligible). + fl_oss_provider_rate: [991.40, 991.40] + fl_oss_max_oss: [184.40, 184.40] + # Person1 OSS: min(max(0, $1,151.40 - $800), $184.40) = $184.40/month. + # Person2 OSS: $0 (ineligible, defined_for = "fl_oss_eligible" filters). + fl_oss: [184.40, 0] + +- name: Case 8, 2024-01 period, before PNA change (PNA = $54). + period: 2024-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 70 + is_ssi_eligible: true + ssi_claim_is_joint: false + # SSI FBR (I) 2024 = $943/month. + # Income = $700/month. uncapped_ssi = ($943 - $700) * 12 = $2,916/year. + uncapped_ssi: 2_916 + ssi_countable_income: 8_400 + households: + household: + members: [person1] + state_code: FL + fl_oss_facility_type: ALF + fl_oss_program_track: REDESIGN + output: + # Before Jul 2024: PNA = $54, Redesign offset = $78.40 (pre-restructuring single track). + # Provider rate (I) = $943 + $78.40 = $1,021.40/month. + fl_oss_provider_rate: [1_021.40] + # Income standard (Redesign) = $1,021.40 + $54 = $1,075.40/month. + fl_oss_income_standard: [1_075.40] + # Max OSS (Redesign, I pre-Jul 2024) = $78.40/month. + fl_oss_max_oss: [78.40] + # Calculated = $1,075.40 - $700 = $375.40/month → capped at $78.40. + # OSS = $78.40/month. + fl_oss: [78.40] + +- name: Case 9, 2011 historical period, pre-restructuring single track. + period: 2011-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 70 + is_ssi_eligible: true + ssi_claim_is_joint: false + # SSI FBR (I) 2011 = $674/month. + # Income = $500/month. uncapped_ssi = ($674 - $500) * 12 = $2,088/year. + uncapped_ssi: 2_088 + ssi_countable_income: 6_000 + households: + household: + members: [person1] + state_code: FL + fl_oss_facility_type: ALF + fl_oss_program_track: REDESIGN + output: + fl_oss_eligible: [true] + # 2011 values (pre-restructuring): Redesign offset = $78.40, PNA = $54. + # Provider rate (I) = $674 + $78.40 = $752.40/month. + fl_oss_provider_rate: [752.40] + # Income standard (Redesign) = $752.40 + $54 = $806.40/month. + fl_oss_income_standard: [806.40] + # Max OSS (Redesign, I, 2011) = $78.40/month. + fl_oss_max_oss: [78.40] + # Calculated = $806.40 - $500 = $306.40/month → capped at $78.40. + # OSS = $78.40/month. + fl_oss: [78.40] diff --git a/policyengine_us/variables/gov/states/fl/dcf/oss/fl_oss.py b/policyengine_us/variables/gov/states/fl/dcf/oss/fl_oss.py new file mode 100644 index 00000000000..e82ef4c0f1d --- /dev/null +++ b/policyengine_us/variables/gov/states/fl/dcf/oss/fl_oss.py @@ -0,0 +1,22 @@ +from policyengine_us.model_api import * + + +class fl_oss(Variable): + value_type = float + entity = Person + label = "Florida Optional State Supplementation" + unit = USD + definition_period = MONTH + defined_for = "fl_oss_eligible" + reference = ( + "https://www.flrules.org/gateway/RuleNo.asp?title=PUBLIC%20ASSISTANCE&ID=65A-2.036", + "https://www.myflfamilies.com/sites/default/files/2024-10/Appendix%20A-12%20OSS%20Payment%20Standards.pdf", + ) + + def formula(person, period, parameters): + pna = parameters(period).gov.states.fl.dcf.oss.pna + provider_rate = person("fl_oss_provider_rate", period) + total_needs = provider_rate + pna + countable_income = person("ssi_countable_income", period) + max_oss = person("fl_oss_max_oss", period) + return min_(max_(total_needs - countable_income, 0), max_oss) diff --git a/policyengine_us/variables/gov/states/fl/dcf/oss/fl_oss_eligible.py b/policyengine_us/variables/gov/states/fl/dcf/oss/fl_oss_eligible.py new file mode 100644 index 00000000000..90118fdd47c --- /dev/null +++ b/policyengine_us/variables/gov/states/fl/dcf/oss/fl_oss_eligible.py @@ -0,0 +1,28 @@ +from policyengine_us.model_api import * + + +class fl_oss_eligible(Variable): + value_type = bool + entity = Person + label = "Florida OSS eligible" + definition_period = MONTH + defined_for = StateCode.FL + reference = ( + "https://www.flrules.org/gateway/RuleNo.asp?title=PUBLIC%20ASSISTANCE&ID=65A-2.032", + "https://www.flrules.org/gateway/RuleNo.asp?title=PUBLIC%20ASSISTANCE&ID=65A-2.033", + ) + + def formula(person, period, parameters): + categorically_eligible = person("is_ssi_eligible", period) + facility_type = person.household("fl_oss_facility_type", period) + in_facility = facility_type != facility_type.possible_values.NONE + program_track = person.household("fl_oss_program_track", period) + has_track = program_track != program_track.possible_values.NONE + # Coverage Group 1: SSI recipients + receives_ssi = person("uncapped_ssi", period) > 0 + # Coverage Group 2: non-SSI recipients within income standard + income_standard = person("fl_oss_income_standard", period) + countable_income = person("ssi_countable_income", period) + income_within_standard = countable_income <= income_standard + income_eligible = receives_ssi | income_within_standard + return categorically_eligible & in_facility & has_track & income_eligible diff --git a/policyengine_us/variables/gov/states/fl/dcf/oss/fl_oss_facility_type.py b/policyengine_us/variables/gov/states/fl/dcf/oss/fl_oss_facility_type.py new file mode 100644 index 00000000000..995aca1b59e --- /dev/null +++ b/policyengine_us/variables/gov/states/fl/dcf/oss/fl_oss_facility_type.py @@ -0,0 +1,22 @@ +from policyengine_us.model_api import * + + +class FLOSSFacilityType(Enum): + ALF = "Assisted Living Facility" + AFCH = "Adult Family Care Home" + MHRTF = "Mental Health Residential Treatment Facility" + NONE = "None" + + +class fl_oss_facility_type(Variable): + value_type = Enum + entity = Household + label = "Florida OSS facility type" + definition_period = MONTH + defined_for = StateCode.FL + possible_values = FLOSSFacilityType + default_value = FLOSSFacilityType.NONE + reference = ( + "https://www.flrules.org/gateway/RuleNo.asp?title=PUBLIC%20ASSISTANCE&ID=65A-2.032", + "https://www.myflfamilies.com/sites/default/files/2024-10/Appendix%20A-12%20OSS%20Payment%20Standards.pdf", + ) diff --git a/policyengine_us/variables/gov/states/fl/dcf/oss/fl_oss_income_standard.py b/policyengine_us/variables/gov/states/fl/dcf/oss/fl_oss_income_standard.py new file mode 100644 index 00000000000..bc598959644 --- /dev/null +++ b/policyengine_us/variables/gov/states/fl/dcf/oss/fl_oss_income_standard.py @@ -0,0 +1,25 @@ +from policyengine_us.model_api import * + + +class fl_oss_income_standard(Variable): + value_type = float + entity = Person + label = "Florida OSS income standard" + unit = USD + definition_period = MONTH + defined_for = StateCode.FL + reference = "https://www.myflfamilies.com/sites/default/files/2024-10/Appendix%20A-12%20OSS%20Payment%20Standards.pdf" + + def formula(person, period, parameters): + p = parameters(period).gov.states.fl.dcf.oss + track = person.household("fl_oss_program_track", period) + is_redesign = track == track.possible_values.REDESIGN + provider_rate = person("fl_oss_provider_rate", period) + # Redesign: income standard = provider rate + PNA offset + # Protected: income standard = provider rate + pna_offset = where( + is_redesign, + p.redesign.income_standard_pna_offset, + 0, + ) + return provider_rate + pna_offset diff --git a/policyengine_us/variables/gov/states/fl/dcf/oss/fl_oss_max_oss.py b/policyengine_us/variables/gov/states/fl/dcf/oss/fl_oss_max_oss.py new file mode 100644 index 00000000000..ab0a040e70a --- /dev/null +++ b/policyengine_us/variables/gov/states/fl/dcf/oss/fl_oss_max_oss.py @@ -0,0 +1,31 @@ +from policyengine_us.model_api import * + + +class fl_oss_max_oss(Variable): + value_type = float + entity = Person + label = "Florida OSS maximum payment" + unit = USD + definition_period = MONTH + defined_for = StateCode.FL + reference = "https://www.myflfamilies.com/sites/default/files/2024-10/Appendix%20A-12%20OSS%20Payment%20Standards.pdf" + + def formula(person, period, parameters): + p = parameters(period).gov.states.fl.dcf.oss + track = person.household("fl_oss_program_track", period) + is_redesign = track == track.possible_values.REDESIGN + joint_claim = person("ssi_claim_is_joint", period) + # Select the max OSS cap by track and couple status. + # Couple caps are total for both spouses; divide by 2 + # for per-person amount. + individual_cap = where( + is_redesign, + p.redesign.max_oss.individual, + p.protected.max_oss.individual, + ) + couple_cap = where( + is_redesign, + p.redesign.max_oss.couple, + p.protected.max_oss.couple, + ) + return where(joint_claim, couple_cap / 2, individual_cap) diff --git a/policyengine_us/variables/gov/states/fl/dcf/oss/fl_oss_program_track.py b/policyengine_us/variables/gov/states/fl/dcf/oss/fl_oss_program_track.py new file mode 100644 index 00000000000..636cb156596 --- /dev/null +++ b/policyengine_us/variables/gov/states/fl/dcf/oss/fl_oss_program_track.py @@ -0,0 +1,18 @@ +from policyengine_us.model_api import * + + +class FLOSSProgramTrack(Enum): + REDESIGN = "Redesign" + PROTECTED = "Protected" + NONE = "None" + + +class fl_oss_program_track(Variable): + value_type = Enum + entity = Household + label = "Florida OSS program track" + definition_period = MONTH + defined_for = StateCode.FL + possible_values = FLOSSProgramTrack + default_value = FLOSSProgramTrack.NONE + reference = "https://www.myflfamilies.com/sites/default/files/2024-10/Appendix%20A-12%20OSS%20Payment%20Standards.pdf" diff --git a/policyengine_us/variables/gov/states/fl/dcf/oss/fl_oss_provider_rate.py b/policyengine_us/variables/gov/states/fl/dcf/oss/fl_oss_provider_rate.py new file mode 100644 index 00000000000..d1a813b7800 --- /dev/null +++ b/policyengine_us/variables/gov/states/fl/dcf/oss/fl_oss_provider_rate.py @@ -0,0 +1,29 @@ +from policyengine_us.model_api import * + + +class fl_oss_provider_rate(Variable): + value_type = float + entity = Person + label = "Florida OSS provider rate" + unit = USD + definition_period = MONTH + defined_for = StateCode.FL + reference = "https://www.myflfamilies.com/sites/default/files/2024-10/Appendix%20A-12%20OSS%20Payment%20Standards.pdf" + + def formula(person, period, parameters): + p = parameters(period).gov.states.fl.dcf.oss + track = person.household("fl_oss_program_track", period) + is_redesign = track == track.possible_values.REDESIGN + # Individual provider rate = SSI FBR + track-specific offset + fbr_individual = parameters(period).gov.ssa.ssi.amount.individual + offset = where( + is_redesign, + p.redesign.provider_rate_offset, + p.protected.provider_rate_offset, + ) + individual_rate = fbr_individual + offset + # Couple provider rate = 2 * individual - reduction + joint_claim = person("ssi_claim_is_joint", period) + couple_rate = 2 * individual_rate - p.couple_provider_rate_reduction + # Per person: couple rate / 2 for joint claims + return where(joint_claim, couple_rate / 2, individual_rate) diff --git a/sources/working_references.md b/sources/working_references.md index 6567b9debfb..b6a44cc9373 100644 --- a/sources/working_references.md +++ b/sources/working_references.md @@ -228,3 +228,250 @@ The state-administered portion is specifically for: - **March 1, 2003**: "Residential Care Homes" definition expanded to include Adult Foster Care Homes, Adult Residential Care Facilities, and Assisted Living Facilities - **September 1, 2008**: MAT coverage extended + + +# Florida Optional State Supplementation (OSS) - Working References + +## Primary Regulatory Sources + +### Florida Administrative Code Chapter 65A-2 (Optional State Supplementation) +- **65A-2.032** - Eligibility Criteria (eff. 10/26/2021): http://flrules.elaws.us/fac/65a-2.032 +- **65A-2.033** - Coverage Groups (eff. 5/14/2002): http://flrules.elaws.us/fac/65a-2.033 +- **65A-2.035** - Income Calculation (eff. 12/16/2001): http://flrules.elaws.us/fac/65a-2.035 +- **65A-2.036** - Base Provider Rates and Program Standards (eff. 6/24/2025): http://flrules.elaws.us/fac/65a-2.036 +- Chapter index: https://flrules.org/gateway/ChapterHome.asp?Chapter=65A-2 + +### Florida Statute 409.212 - Optional Supplementation +- 2025 text: https://www.flsenate.gov/Laws/Statutes/2025/409.212 +- 2024 text: https://m.flsenate.gov/Statutes/409.212 +- Key provisions: authorizes OSS program, sets base rate within appropriated funds, COLA adjustment mechanism, third-party supplementation rules (max 4x provider rate) + +### DCF Appendix A-12 - State Funded Programs Eligibility Standards +- Current (01/01/2026): https://www.myflfamilies.com/sites/default/files/2025-12/Appendix%20A-12%20-%20State%20Funded%20Programs%20Eligibility%20Standards.pdf +- Previous (01/01/2025): https://www.myflfamilies.com/sites/default/files/2025-05/Appendix%20A-12%20-%20State%20Funded%20Programs%20Eligibility%20Standards.pdf +- Document link: https://www.myflfamilies.com/document/30456 + +## SSA Sources + +### SSA State Assistance Programs for SSI Recipients (2011) - Florida +- URL: https://www.ssa.gov/policy/docs/progdesc/ssi_st_asst/2011/fl.html +- **STATUS: 403 Forbidden** - SSA blocks automated access. Must download in browser. +- Last published edition: 2011 (discontinued) +- Available years: 2002, 2004, 2006, 2010, 2011 + +### SSA POMS - State Supplementation +- General info: https://secure.ssa.gov/apps10/poms.nsf/lnx/0501401001 +- Methods of administration: https://secure.ssa.gov/apps10/poms.nsf/lnx/0501405001 +- State listing: https://secure.ssa.gov/apps10/poms.nsf/lnx/0501415010 + +### SSI Federal Benefit Rate History +- Current year: https://www.ssa.gov/oact/cola/SSI.html (403 to automated tools) +- Historical table: https://www.ssa.gov/oact/cola/SSIamts.html (403 to automated tools) +- SSI ASR 2023 Section 1: https://www.ssa.gov/policy/docs/statcomps/ssi_asr/2023/sect01.html (403) + +## Secondary/Informational Sources + +### WorkWorld - Florida SSI State Supplement +- URL: https://help.workworldapp.com/wwwebhelp/ssi_state_supplement_florida.htm +- Contains 2010 payment amounts by category +- Confirms state-administered, DCF-run program + +### Medicaid Planning Assistance - SSI and OSS +- URL: https://www.medicaidplanningassistance.org/ssi-and-oss/ +- State-by-state chart with FL amounts: $184.40-$345 (I), $386.80-$690 (C) for 2026 +- Confirms FL does NOT provide OSS for nursing home/Medicaid facility residents + +### Brendan Conley Law - State Supplements by State +- URL: https://brendanconley.com/faq/questions-about-benefits/optional-state-supplements-for-ssi-in-each-state/ +- Confirms FL is state-administered, $78.40 supplement (2017 data), facility residents only, NO independent living supplement + +### MyAccessFlorida - OSS +- URL: https://imyaccessflorida.com/optional-state-supplementation-oss/ +- Application requirements, documentation needed + +--- + +## Extracted Data + +### Program Administration +- **Official name**: Optional State Supplementation (OSS) +- **Administration**: State-administered by FL Department of Children and Families (DCF) +- **Funding**: State funds +- **Authority**: Florida Statute 409.212; FAC Chapter 65A-2 +- **COLA mechanism**: Per F.S. 409.212, "the optional state supplementation rate shall be increased by the cost-of-living adjustment to the federal benefits rate provided the average state optional supplementation contribution does not increase as a result" + +### Eligibility (FAC 65A-2.032) +1. Aged 65+, or aged 18+ and blind/disabled per Title XVI SSA +2. Florida resident with intent to remain +3. US citizen or qualified noncitizen per 8 USC 1641(b) +4. Income within limits per 65A-2.036(3) +5. Assets within SSI Title XVI standards ($2,000 individual / $3,000 couple) +6. Must reside in licensed ALF, AFCH, or MHRTF +7. Must apply for all other monetary benefits (20 CFR 416.210, 42 CFR 435.608) + +### Coverage Groups (FAC 65A-2.033) +1. **Group 1**: Current SSI recipients (automatic, verify age + facility placement) +2. **Group 2**: Meet all SSI/OSS criteria except income, income <= OSS income standard +3. **Group 3**: Historical AABD recipients (as of Dec 1973) - exempt from facility placement +4. **Group 4**: Facility residents who lost OSS due to income exceeding thresholds, but maintain all other criteria + +### Two Program Tracks (from Appendix A-12) + +#### OSS Redesign Standards (ALF, AFCH, RTF enrolled for ACS) +| Parameter | Jul 2024 | Jan 2025 | Jan 2026 | +|---|---|---|---| +| Income Standard (I) | $1,021.40 | $1,045.40 | $1,072.40 | +| Income Standard (C) | $1,969.80 | $1,993.80 | $2,047.80 | +| Provider Rate (I) | $967.40 | $991.40 | $1,018.40 | +| Provider Rate (C) | $1,861.80 | $1,885.80 | $1,939.80 | +| PNA | $160/person | $160/person | $160/person | +| Asset Limit (I/C) | $2,000/$3,000 | $2,000/$3,000 | $2,000/$3,000 | +| Max OSS (I) | $184.40 | $184.40 | $184.40 | +| Max OSS (C) | $386.80 | $386.80 | $386.80 | + +#### OSS Protected Standards (RTF not enrolled for ACS + 2001 "Gap" Group) +| Parameter | Jul 2024 | Jan 2025 | Jan 2026 | +|---|---|---|---| +| Income Standard (I) | $1,128 | $1,152 | $1,179 | +| Income Standard (C) | $2,183 | $2,207 | $2,261 | +| Provider Rate (I) | $1,128 | $1,152 | $1,179 | +| Provider Rate (C) | $2,183 | $2,207 | $2,261 | +| PNA | $160/person | $160/person | $160/person | +| Asset Limit (I/C) | $2,000/$3,000 | $2,000/$3,000 | $2,000/$3,000 | +| Max OSS (I) | $345 | $345 | $345 | +| Max OSS (C) | $690 | $690 | $690 | + +### Rate Formulas (derived from data) +- **Redesign provider rate (I)** = SSI FBR (individual) + $24.40 +- **Protected provider rate (I)** = SSI FBR (individual) + $185.00 +- **Protected: income standard = provider rate** (same value) +- **Redesign: income standard = provider rate + $54** (uses old PNA of $54) +- **Couple provider rate** = 2 * individual provider rate - $97.00 (verified for Jan 2025 and Jan 2026) +- **Max OSS (individual)** = fixed offset + PNA = constant + - Redesign: $24.40 + $160.00 = $184.40 + - Protected: $185.00 + $160.00 = $345.00 +- **Max OSS (couple)**: Protected = 2 * individual max ($690); Redesign = $386.80 + +### OSS Payment Calculation (FAC 65A-2.036) +``` +Total Needs = Base Provider Rate + PNA +OSS Payment = Total Needs - (Gross Income - Allowable Exclusions) +OSS Payment = min(calculated amount, Max OSS) +``` + +### Income Exclusions (FAC 65A-2.035) +- Earned income: $65 exclusion + 1/2 of remainder +- Federal SSI exclusions per 20 CFR 416 +- State exclusions per F.S. 409.212(5) + +### Personal Needs Allowance History +- Pre-July 2024: $54/month +- July 2024 onward: $160/month (HB 5001, 2024-25 GAA, $6.67M appropriation) + +### SSI Federal Benefit Rate Reference (for formula verification) +| Year | Individual | Couple | +|---|---|---| +| 2017 | $735 | $1,103 | +| 2018 | $750 | $1,125 | +| 2019 | $771 | $1,157 | +| 2020 | $783 | $1,175 | +| 2021 | $794 | $1,191 | +| 2022 | $841 | $1,261 | +| 2023 | $914 | $1,371 | +| 2024 | $943 | $1,415 | +| 2025 | $967 | $1,450 | +| 2026 | $994 | $1,491 | + +### What FL Does NOT Provide +- No supplement for independent living (community residents) +- No supplement for Medicaid facility/nursing home residents +- No federally-administered supplement (all state-administered) + +### Recipient Counts +- **Not found in automated searches.** SSA's SSI Recipients by State reports (403 to automated tools) and FL DCF ESS Standard Reports may contain this data. Total FL SSI recipients ~539,276 (Dec 2023), but OSS-specific counts not available. + +### Rule Amendment History (65A-2.036) +- Original: 1-1-77 +- Recent amendments: 11/26/2018, 6/30/2019, 6/11/2020, 10/26/2021, 6/24/2025 + +--- + +## SSA State Assistance Programs for SSI Recipients — Florida (January 2011) +Source: https://www.ssa.gov/policy/docs/progdesc/ssi_st_asst/2011/fl.html (downloaded manually — SSA blocks automated access) + +### Key Values for Cross-Referencing + +> **IMPORTANT DISCREPANCY**: The 2011 SSA report shows the state supplement = **$78.40** (with SSI FBR individual = $674.00, combined = $752.40). The current (2024+) Redesign supplement offset is **$24.40**. This means the offset **changed between 2011 and the current program**. The 2011 report predates the Redesign/Protected split — the entire program used a single $78.40 supplement at that time. + +- SSI FBR individual (Jan 2011) = $674.00 +- Combined individual (community care) = $752.40 +- State supplement = $752.40 - $674.00 = **$78.40** +- Medicaid facility: $5.00 individual, $10.00 couple (personal needs allowance supplement) +- PNA in 2011 = $54 + +### Program Administration +- **Administration**: State Department of Children and Families +- **Effective date**: January 1, 1974 +- **Statutory basis**: Florida Statutes, chapter 409.212 +- **Funding**: Administration — State funds; Assistance — State funds +- **Passalong method**: Maintaining payment levels +- **Place of application**: Local offices of the state Department of Children and Families +- **Interim assistance**: State participates +- **Financial responsibility of relatives**: None +- **Mandatory Minimum Supplementation**: No recipients + +### Resource & Income Rules +- **Resource limitations**: Federal SSI regulations apply +- **Income exclusions**: Federal SSI regulations apply + +### Recoveries, Liens, and Assignments +Amount of public assistance received after August 31, 1967, creates a debt against the estate of the aged, blind, or disabled recipient. The state can file a claim after death. Homestead is exempt if it passes to a qualified heir. Claims are filed against the estate of individuals who received Medicaid on or after their 55th birthday. Florida does not seek recovery if there is a surviving spouse, minor child, or blind or disabled child. + +### Payment Calculation Method +The recipient's gross monthly countable income is subtracted from the sum of the standard provider rate and the personal needs allowance. The difference, up to $78.40, is the state optional payment amount. + +### Scope of Coverage +Under the community care programs, an optional state supplement is provided to all aged, blind, or disabled persons who either receive SSI payments or have been grandfathered because they meet all SSI criteria except for income. Income may not exceed $752.40. + +### Table 1: Optional State Supplementation Payment Levels, January 2011 (in dollars) + +| Living Arrangement | Combined Federal & State (I) | Combined Federal & State (C) | State Supplementation (I) | State Supplementation (C) | +|---|---|---|---|---| +| **Community care programs** | | | | | +| Adult family care home ^a | $752.40 | ^b | $78.40 | ^b | +| Assisted living facility | $752.40 | ^b | $78.40 | ^b | +| **Medicaid facility** ^c | $35.00 | $70.00 | $5.00 | $10.00 | + +**Sources**: Social Security Administration, Office of Income Security Programs; state information. + +**Footnotes**: +- ^a Payments include $54 personal needs allowance. Recipients who lose SSI eligibility because of Social Security (Title II) benefit increases may continue to be eligible for state supplementation if they reside in a specific living arrangement and have income below income limits. +- ^b Couples are treated as two individuals the month after leaving an independent living arrangement. +- ^c Community providers enrolled to provide assistive care services can receive an additional payment from Medicaid recipients residing in their facilities. + +**Definitions**: +- **Adult family care home**: Serves up to five persons aged 18 or older, providing housing, food, and personal services. +- **Assisted living facility**: Serves four or more persons aged 18 or older, providing housing, food, and personal services. +- **Medicaid facility**: Includes recipients residing in a federal Code D living arrangement. + +### Table 2: Number of Persons Receiving Optional State Supplementation, January 2011 + +| Living Arrangement | Total | Aged | Blind | Disabled | +|---|---|---|---|---| +| **All recipients** | **13,160** | **5,239** | **14** | **7,907** | +| **Community care programs** | | | | | +| Adult family care home | 242 | 44 | 0 | 198 | +| Assisted living facility | 7,859 | 2,944 | 6 | 4,909 | +| **Medicaid facility** | 5,059 | 2,251 | 8 | 2,800 | + +**Source**: State information. +**Note**: Includes some non-SSI recipients who meet state eligibility criteria, but do not meet federal SSI eligibility guidelines. + +### Expenditures +The state reported expenditures of $7,585,541.72 for calendar year 2010 in state-administered payments to SSI recipients. (Includes payments made to some non-SSI recipients who meet state eligibility criteria, but do not meet federal SSI eligibility guidelines.) + +### Other Programs (from same report) +- **State Assistance for Special Needs**: State does not provide assistance for special needs. +- **Medicaid Eligibility**: Criteria — SSI program guidelines (Title XVI). Determined by Social Security Administration. +- **Medically Needy Program**: State provides a program for the aged, blind, and disabled medically needy. +- **Unpaid Medical Expenses**: The Social Security Administration does not obtain this information. From 4f97e8e44ad0ac78b14513aff9f0e3bfc15163ad Mon Sep 17 00:00:00 2001 From: Ziming Date: Thu, 26 Mar 2026 20:06:41 -0400 Subject: [PATCH 03/14] Update changelog fragment for Florida OSS Co-Authored-By: Claude Opus 4.6 (1M context) --- changelog.d/fl-ssp.added.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/changelog.d/fl-ssp.added.md b/changelog.d/fl-ssp.added.md index 8dba3a16e2b..8ab36fb7451 100644 --- a/changelog.d/fl-ssp.added.md +++ b/changelog.d/fl-ssp.added.md @@ -1 +1 @@ -Implements Florida State Supplementary Payment (SSP). +Add Florida Optional State Supplementation (OSS). From cbd9f1fb9cd4d80068e10d04a581d8e1b3776d2d Mon Sep 17 00:00:00 2001 From: Ziming Date: Thu, 26 Mar 2026 20:30:53 -0400 Subject: [PATCH 04/14] Review-fix round 1: fix 2011 offset, couple max, broken URLs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Fix redesign/provider_rate_offset 2011 value: $78.40 → $24.40 (was max OSS cap, not offset; SSA 2011 income limit $752.40 confirms) - Fix redesign/max_oss/couple 2011 value: $396.80 → $156.80 (SSA 2011 footnote b: couples treated as two individuals) - Replace broken 404 Appendix A-12 URL in all 9 parameter files - Update affected test expected values Co-Authored-By: Claude Opus 4.6 (1M context) --- .../oss/couple_provider_rate_reduction.yaml | 2 +- .../parameters/gov/states/fl/dcf/oss/pna.yaml | 2 +- .../fl/dcf/oss/protected/max_oss/couple.yaml | 2 +- .../dcf/oss/protected/max_oss/individual.yaml | 2 +- .../oss/protected/provider_rate_offset.yaml | 2 +- .../redesign/income_standard_pna_offset.yaml | 2 +- .../fl/dcf/oss/redesign/max_oss/couple.yaml | 6 ++--- .../dcf/oss/redesign/max_oss/individual.yaml | 2 +- .../oss/redesign/provider_rate_offset.yaml | 4 ++-- .../gov/states/fl/dcf/oss/edge_cases.yaml | 12 +++++----- .../fl/dcf/oss/fl_oss_provider_rate.yaml | 6 ++--- .../gov/states/fl/dcf/oss/integration.yaml | 24 +++++++++---------- 12 files changed, 33 insertions(+), 33 deletions(-) diff --git a/policyengine_us/parameters/gov/states/fl/dcf/oss/couple_provider_rate_reduction.yaml b/policyengine_us/parameters/gov/states/fl/dcf/oss/couple_provider_rate_reduction.yaml index ea78ac289a0..3549ef9ac35 100644 --- a/policyengine_us/parameters/gov/states/fl/dcf/oss/couple_provider_rate_reduction.yaml +++ b/policyengine_us/parameters/gov/states/fl/dcf/oss/couple_provider_rate_reduction.yaml @@ -10,4 +10,4 @@ metadata: - title: SSA State Assistance Programs for SSI Recipients, January 2011 - Florida, Table 1 href: https://www.ssa.gov/policy/docs/progdesc/ssi_st_asst/2011/fl.html - title: FL DCF Appendix A-12, Optional State Supplementation Payment Standards - href: https://www.myflfamilies.com/sites/default/files/2024-10/Appendix%20A-12%20OSS%20Payment%20Standards.pdf + href: https://www.myflfamilies.com/sites/default/files/2025-05/Appendix%20A-12%20-%20State%20Funded%20Programs%20Eligibility%20Standards.pdf diff --git a/policyengine_us/parameters/gov/states/fl/dcf/oss/pna.yaml b/policyengine_us/parameters/gov/states/fl/dcf/oss/pna.yaml index 0dbacebbbe9..05bd869a401 100644 --- a/policyengine_us/parameters/gov/states/fl/dcf/oss/pna.yaml +++ b/policyengine_us/parameters/gov/states/fl/dcf/oss/pna.yaml @@ -11,6 +11,6 @@ metadata: - title: SSA State Assistance Programs for SSI Recipients, January 2011 - Florida, Table 1 href: https://www.ssa.gov/policy/docs/progdesc/ssi_st_asst/2011/fl.html - title: FL DCF Appendix A-12, Optional State Supplementation Payment Standards - href: https://www.myflfamilies.com/sites/default/files/2024-10/Appendix%20A-12%20OSS%20Payment%20Standards.pdf + href: https://www.myflfamilies.com/sites/default/files/2025-05/Appendix%20A-12%20-%20State%20Funded%20Programs%20Eligibility%20Standards.pdf - title: Florida HB 5001, 2024-25 General Appropriations Act href: https://www.flsenate.gov/Session/Bill/2024/5001 diff --git a/policyengine_us/parameters/gov/states/fl/dcf/oss/protected/max_oss/couple.yaml b/policyengine_us/parameters/gov/states/fl/dcf/oss/protected/max_oss/couple.yaml index 5cc517748a0..29773bab208 100644 --- a/policyengine_us/parameters/gov/states/fl/dcf/oss/protected/max_oss/couple.yaml +++ b/policyengine_us/parameters/gov/states/fl/dcf/oss/protected/max_oss/couple.yaml @@ -9,4 +9,4 @@ metadata: label: Florida OSS Protected maximum couple payment reference: - title: FL DCF Appendix A-12, Optional State Supplementation Payment Standards - href: https://www.myflfamilies.com/sites/default/files/2024-10/Appendix%20A-12%20OSS%20Payment%20Standards.pdf + href: https://www.myflfamilies.com/sites/default/files/2025-05/Appendix%20A-12%20-%20State%20Funded%20Programs%20Eligibility%20Standards.pdf diff --git a/policyengine_us/parameters/gov/states/fl/dcf/oss/protected/max_oss/individual.yaml b/policyengine_us/parameters/gov/states/fl/dcf/oss/protected/max_oss/individual.yaml index 51164299fdc..9c693ba2ae4 100644 --- a/policyengine_us/parameters/gov/states/fl/dcf/oss/protected/max_oss/individual.yaml +++ b/policyengine_us/parameters/gov/states/fl/dcf/oss/protected/max_oss/individual.yaml @@ -9,4 +9,4 @@ metadata: label: Florida OSS Protected maximum individual payment reference: - title: FL DCF Appendix A-12, Optional State Supplementation Payment Standards - href: https://www.myflfamilies.com/sites/default/files/2024-10/Appendix%20A-12%20OSS%20Payment%20Standards.pdf + href: https://www.myflfamilies.com/sites/default/files/2025-05/Appendix%20A-12%20-%20State%20Funded%20Programs%20Eligibility%20Standards.pdf diff --git a/policyengine_us/parameters/gov/states/fl/dcf/oss/protected/provider_rate_offset.yaml b/policyengine_us/parameters/gov/states/fl/dcf/oss/protected/provider_rate_offset.yaml index ffbb65eaff1..9ac46dc94af 100644 --- a/policyengine_us/parameters/gov/states/fl/dcf/oss/protected/provider_rate_offset.yaml +++ b/policyengine_us/parameters/gov/states/fl/dcf/oss/protected/provider_rate_offset.yaml @@ -9,4 +9,4 @@ metadata: label: Florida OSS Protected provider rate offset reference: - title: FL DCF Appendix A-12, Optional State Supplementation Payment Standards - href: https://www.myflfamilies.com/sites/default/files/2024-10/Appendix%20A-12%20OSS%20Payment%20Standards.pdf + href: https://www.myflfamilies.com/sites/default/files/2025-05/Appendix%20A-12%20-%20State%20Funded%20Programs%20Eligibility%20Standards.pdf diff --git a/policyengine_us/parameters/gov/states/fl/dcf/oss/redesign/income_standard_pna_offset.yaml b/policyengine_us/parameters/gov/states/fl/dcf/oss/redesign/income_standard_pna_offset.yaml index 4e1a78621e0..275084eebbe 100644 --- a/policyengine_us/parameters/gov/states/fl/dcf/oss/redesign/income_standard_pna_offset.yaml +++ b/policyengine_us/parameters/gov/states/fl/dcf/oss/redesign/income_standard_pna_offset.yaml @@ -10,4 +10,4 @@ metadata: - title: SSA State Assistance Programs for SSI Recipients, January 2011 - Florida, Table 1 href: https://www.ssa.gov/policy/docs/progdesc/ssi_st_asst/2011/fl.html - title: FL DCF Appendix A-12, Optional State Supplementation Payment Standards - href: https://www.myflfamilies.com/sites/default/files/2024-10/Appendix%20A-12%20OSS%20Payment%20Standards.pdf + href: https://www.myflfamilies.com/sites/default/files/2025-05/Appendix%20A-12%20-%20State%20Funded%20Programs%20Eligibility%20Standards.pdf diff --git a/policyengine_us/parameters/gov/states/fl/dcf/oss/redesign/max_oss/couple.yaml b/policyengine_us/parameters/gov/states/fl/dcf/oss/redesign/max_oss/couple.yaml index 5e334277cb6..5d5a11cd588 100644 --- a/policyengine_us/parameters/gov/states/fl/dcf/oss/redesign/max_oss/couple.yaml +++ b/policyengine_us/parameters/gov/states/fl/dcf/oss/redesign/max_oss/couple.yaml @@ -1,6 +1,6 @@ description: Florida limits the couple Redesign payment to this amount under the Optional State Supplementation program. values: - 2011-01-01: 396.8 + 2011-01-01: 156.8 2024-07-01: 386.8 metadata: @@ -8,7 +8,7 @@ metadata: period: month label: Florida OSS Redesign maximum couple payment reference: - - title: SSA State Assistance Programs for SSI Recipients, January 2011 - Florida, Table 1 ($396.80 value only) + - title: SSA State Assistance Programs for SSI Recipients, January 2011 - Florida, Table 1 ($156.80 value only) href: https://www.ssa.gov/policy/docs/progdesc/ssi_st_asst/2011/fl.html - title: FL DCF Appendix A-12, Optional State Supplementation Payment Standards - href: https://www.myflfamilies.com/sites/default/files/2024-10/Appendix%20A-12%20OSS%20Payment%20Standards.pdf + href: https://www.myflfamilies.com/sites/default/files/2025-05/Appendix%20A-12%20-%20State%20Funded%20Programs%20Eligibility%20Standards.pdf diff --git a/policyengine_us/parameters/gov/states/fl/dcf/oss/redesign/max_oss/individual.yaml b/policyengine_us/parameters/gov/states/fl/dcf/oss/redesign/max_oss/individual.yaml index 2ba407fcb65..dd7fb27458e 100644 --- a/policyengine_us/parameters/gov/states/fl/dcf/oss/redesign/max_oss/individual.yaml +++ b/policyengine_us/parameters/gov/states/fl/dcf/oss/redesign/max_oss/individual.yaml @@ -11,4 +11,4 @@ metadata: - title: SSA State Assistance Programs for SSI Recipients, January 2011 - Florida, Table 1 ($78.40 value only) href: https://www.ssa.gov/policy/docs/progdesc/ssi_st_asst/2011/fl.html - title: FL DCF Appendix A-12, Optional State Supplementation Payment Standards - href: https://www.myflfamilies.com/sites/default/files/2024-10/Appendix%20A-12%20OSS%20Payment%20Standards.pdf + href: https://www.myflfamilies.com/sites/default/files/2025-05/Appendix%20A-12%20-%20State%20Funded%20Programs%20Eligibility%20Standards.pdf diff --git a/policyengine_us/parameters/gov/states/fl/dcf/oss/redesign/provider_rate_offset.yaml b/policyengine_us/parameters/gov/states/fl/dcf/oss/redesign/provider_rate_offset.yaml index 429ad0b7a61..3c7c95af78f 100644 --- a/policyengine_us/parameters/gov/states/fl/dcf/oss/redesign/provider_rate_offset.yaml +++ b/policyengine_us/parameters/gov/states/fl/dcf/oss/redesign/provider_rate_offset.yaml @@ -1,6 +1,6 @@ description: Florida sets this amount as the offset added to the federal SSI benefit rate to determine the Redesign provider rate under the Optional State Supplementation program. values: - 2011-01-01: 78.4 + 2011-01-01: 24.4 2024-07-01: 24.4 metadata: @@ -11,4 +11,4 @@ metadata: - title: SSA State Assistance Programs for SSI Recipients, January 2011 - Florida, Table 1 href: https://www.ssa.gov/policy/docs/progdesc/ssi_st_asst/2011/fl.html - title: FL DCF Appendix A-12, Optional State Supplementation Payment Standards - href: https://www.myflfamilies.com/sites/default/files/2024-10/Appendix%20A-12%20OSS%20Payment%20Standards.pdf + href: https://www.myflfamilies.com/sites/default/files/2025-05/Appendix%20A-12%20-%20State%20Funded%20Programs%20Eligibility%20Standards.pdf diff --git a/policyengine_us/tests/policy/baseline/gov/states/fl/dcf/oss/edge_cases.yaml b/policyengine_us/tests/policy/baseline/gov/states/fl/dcf/oss/edge_cases.yaml index 0677e2d2abc..4cbcb2603c0 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/fl/dcf/oss/edge_cases.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/fl/dcf/oss/edge_cases.yaml @@ -279,13 +279,13 @@ fl_oss_program_track: REDESIGN output: fl_oss_eligible: [true] - # SSI FBR (I) 2024 = $943. Redesign offset pre-Jul-2024 = $78.40. - # Provider rate = $943 + $78.40 = $1,021.40/month. - fl_oss_provider_rate: [1_021.40] - # PNA = $54. Total needs = $1,021.40 + $54 = $1,075.40/month. + # SSI FBR (I) 2024 = $943. Redesign offset = $24.40. + # Provider rate = $943 + $24.40 = $967.40/month. + fl_oss_provider_rate: [967.40] + # PNA = $54. Total needs = $967.40 + $54 = $1,021.40/month. # Max OSS (Redesign, I, pre-Jul-2024) = $78.40. - # Income = $700/month. OSS = min(max(0, $1,075.40 - $700), $78.40) - # = min($375.40, $78.40) = $78.40. + # Income = $700/month. OSS = min(max(0, $1,021.40 - $700), $78.40) + # = min($321.40, $78.40) = $78.40. fl_oss: [78.40] - name: Case 11, PNA at new rate (2025-01), same income scenario for comparison. diff --git a/policyengine_us/tests/policy/baseline/gov/states/fl/dcf/oss/fl_oss_provider_rate.yaml b/policyengine_us/tests/policy/baseline/gov/states/fl/dcf/oss/fl_oss_provider_rate.yaml index b8c70dfc6eb..8693728f2f8 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/fl/dcf/oss/fl_oss_provider_rate.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/fl/dcf/oss/fl_oss_provider_rate.yaml @@ -123,6 +123,6 @@ fl_oss_program_track: REDESIGN output: # SSI FBR (I) 2024 = $943/month. - # Jan 2024 uses pre-Jul-2024 Redesign offset = $78.40/month. - # Provider rate = $943 + $78.40 = $1,021.40/month. - fl_oss_provider_rate: [1_021.40] + # Redesign offset = $24.40/month. + # Provider rate = $943 + $24.40 = $967.40/month. + fl_oss_provider_rate: [967.40] diff --git a/policyengine_us/tests/policy/baseline/gov/states/fl/dcf/oss/integration.yaml b/policyengine_us/tests/policy/baseline/gov/states/fl/dcf/oss/integration.yaml index 78e93dc174a..73f71bbd641 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/fl/dcf/oss/integration.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/fl/dcf/oss/integration.yaml @@ -258,14 +258,14 @@ fl_oss_facility_type: ALF fl_oss_program_track: REDESIGN output: - # Before Jul 2024: PNA = $54, Redesign offset = $78.40 (pre-restructuring single track). - # Provider rate (I) = $943 + $78.40 = $1,021.40/month. - fl_oss_provider_rate: [1_021.40] - # Income standard (Redesign) = $1,021.40 + $54 = $1,075.40/month. - fl_oss_income_standard: [1_075.40] + # Before Jul 2024: PNA = $54, Redesign offset = $24.40. + # Provider rate (I) = $943 + $24.40 = $967.40/month. + fl_oss_provider_rate: [967.40] + # Income standard (Redesign) = $967.40 + $54 = $1,021.40/month. + fl_oss_income_standard: [1_021.40] # Max OSS (Redesign, I pre-Jul 2024) = $78.40/month. fl_oss_max_oss: [78.40] - # Calculated = $1,075.40 - $700 = $375.40/month → capped at $78.40. + # Calculated = $1,021.40 - $700 = $321.40/month → capped at $78.40. # OSS = $78.40/month. fl_oss: [78.40] @@ -290,13 +290,13 @@ fl_oss_program_track: REDESIGN output: fl_oss_eligible: [true] - # 2011 values (pre-restructuring): Redesign offset = $78.40, PNA = $54. - # Provider rate (I) = $674 + $78.40 = $752.40/month. - fl_oss_provider_rate: [752.40] - # Income standard (Redesign) = $752.40 + $54 = $806.40/month. - fl_oss_income_standard: [806.40] + # 2011 values (pre-restructuring): Redesign offset = $24.40, PNA = $54. + # Provider rate (I) = $674 + $24.40 = $698.40/month. + fl_oss_provider_rate: [698.40] + # Income standard (Redesign) = $698.40 + $54 = $752.40/month. + fl_oss_income_standard: [752.40] # Max OSS (Redesign, I, 2011) = $78.40/month. fl_oss_max_oss: [78.40] - # Calculated = $806.40 - $500 = $306.40/month → capped at $78.40. + # Calculated = $752.40 - $500 = $252.40/month → capped at $78.40. # OSS = $78.40/month. fl_oss: [78.40] From e3819c7dd09a4b48a49a86299830481a387f85f9 Mon Sep 17 00:00:00 2001 From: Ziming Date: Thu, 26 Mar 2026 20:42:18 -0400 Subject: [PATCH 05/14] Replace Protected zero-sentinel with in_effect toggle parameter Add protected/in_effect.yaml (false before 2024-07-01, true after) to properly gate the Protected track instead of using $0 values as sentinels. Formulas now use `if p.protected.in_effect:` to avoid accessing Protected parameters in pre-2024 periods. Co-Authored-By: Claude Opus 4.6 (1M context) --- .../fl/dcf/oss/protected/in_effect.yaml | 12 +++++++ .../fl/dcf/oss/protected/max_oss/couple.yaml | 1 - .../dcf/oss/protected/max_oss/individual.yaml | 1 - .../oss/protected/provider_rate_offset.yaml | 1 - .../gov/states/fl/dcf/oss/edge_cases.yaml | 31 ++++++------------- .../gov/states/fl/dcf/oss/fl_oss_eligible.py | 7 ++++- .../gov/states/fl/dcf/oss/fl_oss_max_oss.py | 27 ++++++++-------- .../states/fl/dcf/oss/fl_oss_provider_rate.py | 16 +++++----- 8 files changed, 49 insertions(+), 47 deletions(-) create mode 100644 policyengine_us/parameters/gov/states/fl/dcf/oss/protected/in_effect.yaml diff --git a/policyengine_us/parameters/gov/states/fl/dcf/oss/protected/in_effect.yaml b/policyengine_us/parameters/gov/states/fl/dcf/oss/protected/in_effect.yaml new file mode 100644 index 00000000000..5f1d3247fe2 --- /dev/null +++ b/policyengine_us/parameters/gov/states/fl/dcf/oss/protected/in_effect.yaml @@ -0,0 +1,12 @@ +description: Whether Florida's OSS Protected program track is in effect. The Protected track (RTF not enrolled for ACS + 2001 Gap Group) was introduced as part of the OSS Redesign restructuring; the exact start date is unknown but documented from July 2024 onward. +values: + 2011-01-01: false + 2024-07-01: true + +metadata: + unit: bool + period: month + label: Florida OSS Protected track in effect + reference: + - title: FL DCF Appendix A-12, Optional State Supplementation Payment Standards + href: https://www.myflfamilies.com/sites/default/files/2025-05/Appendix%20A-12%20-%20State%20Funded%20Programs%20Eligibility%20Standards.pdf diff --git a/policyengine_us/parameters/gov/states/fl/dcf/oss/protected/max_oss/couple.yaml b/policyengine_us/parameters/gov/states/fl/dcf/oss/protected/max_oss/couple.yaml index 29773bab208..6f35b45dc58 100644 --- a/policyengine_us/parameters/gov/states/fl/dcf/oss/protected/max_oss/couple.yaml +++ b/policyengine_us/parameters/gov/states/fl/dcf/oss/protected/max_oss/couple.yaml @@ -1,6 +1,5 @@ description: Florida limits the couple Protected payment to this amount under the Optional State Supplementation program. values: - 2011-01-01: 0 2024-07-01: 690 metadata: diff --git a/policyengine_us/parameters/gov/states/fl/dcf/oss/protected/max_oss/individual.yaml b/policyengine_us/parameters/gov/states/fl/dcf/oss/protected/max_oss/individual.yaml index 9c693ba2ae4..3d6446b0886 100644 --- a/policyengine_us/parameters/gov/states/fl/dcf/oss/protected/max_oss/individual.yaml +++ b/policyengine_us/parameters/gov/states/fl/dcf/oss/protected/max_oss/individual.yaml @@ -1,6 +1,5 @@ description: Florida limits the individual Protected payment to this amount under the Optional State Supplementation program. values: - 2011-01-01: 0 2024-07-01: 345 metadata: diff --git a/policyengine_us/parameters/gov/states/fl/dcf/oss/protected/provider_rate_offset.yaml b/policyengine_us/parameters/gov/states/fl/dcf/oss/protected/provider_rate_offset.yaml index 9ac46dc94af..63bed6cf289 100644 --- a/policyengine_us/parameters/gov/states/fl/dcf/oss/protected/provider_rate_offset.yaml +++ b/policyengine_us/parameters/gov/states/fl/dcf/oss/protected/provider_rate_offset.yaml @@ -1,6 +1,5 @@ description: Florida sets this amount as the offset added to the federal SSI benefit rate to determine the Protected provider rate under the Optional State Supplementation program. values: - 2011-01-01: 0 2024-07-01: 185 metadata: diff --git a/policyengine_us/tests/policy/baseline/gov/states/fl/dcf/oss/edge_cases.yaml b/policyengine_us/tests/policy/baseline/gov/states/fl/dcf/oss/edge_cases.yaml index 4cbcb2603c0..a0e54b17cd5 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/fl/dcf/oss/edge_cases.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/fl/dcf/oss/edge_cases.yaml @@ -322,7 +322,7 @@ # This means Protected track effectively didn't exist before Jul 2024. # ────────────────────────────────────────────────────────────── -- name: Case 12, Protected track before Jul 2024, zero max OSS. +- name: Case 12, Protected track before Jul 2024, ineligible (track not in effect). period: 2024-01 absolute_error_margin: 0.01 input: @@ -340,16 +340,11 @@ fl_oss_facility_type: MHRTF fl_oss_program_track: PROTECTED output: - fl_oss_eligible: [true] - # SSI FBR (I) 2024 = $943. Protected offset pre-Jul-2024 = $0. - # Provider rate = $943 + $0 = $943/month. - fl_oss_provider_rate: [943] - # Max OSS (Protected, I, pre-Jul-2024) = $0. - fl_oss_max_oss: [0] - # OSS = min(max(0, total_needs - income), $0) = $0. + # Protected track not in effect before Jul 2024. + fl_oss_eligible: [false] fl_oss: [0] -- name: Case 13, Protected couple before Jul 2024, zero max OSS. +- name: Case 13, Protected couple before Jul 2024, ineligible (track not in effect). period: 2024-01 absolute_error_margin: 0.01 input: @@ -379,9 +374,8 @@ fl_oss_facility_type: MHRTF fl_oss_program_track: PROTECTED output: - fl_oss_eligible: [true, true] - # Max OSS (Protected, C, pre-Jul-2024) = $0. Per person = $0. - fl_oss_max_oss: [0, 0] + # Protected track not in effect before Jul 2024. + fl_oss_eligible: [false, false] fl_oss: [0, 0] # ────────────────────────────────────────────────────────────── @@ -648,7 +642,7 @@ # 2011 historical Protected track (offset=0, max=0 before Jul 2024) # ────────────────────────────────────────────────────────────── -- name: Case 22, 2011 Protected track, zero benefit due to zero max OSS. +- name: Case 22, 2011 Protected track, ineligible (track not in effect). period: 2011-01 absolute_error_margin: 0.01 input: @@ -666,15 +660,8 @@ fl_oss_facility_type: MHRTF fl_oss_program_track: PROTECTED output: - fl_oss_eligible: [true] - # SSI FBR (I) 2011 = $674. Protected offset 2011 = $0. - # Provider rate = $674 + $0 = $674/month. - fl_oss_provider_rate: [674] - # Protected income standard = provider rate = $674/month. - fl_oss_income_standard: [674] - # Max OSS (Protected, I) = $0. - fl_oss_max_oss: [0] - # OSS = min(max(0, total_needs - income), $0) = $0. + # Protected track not in effect before Jul 2024. + fl_oss_eligible: [false] fl_oss: [0] # ────────────────────────────────────────────────────────────── diff --git a/policyengine_us/variables/gov/states/fl/dcf/oss/fl_oss_eligible.py b/policyengine_us/variables/gov/states/fl/dcf/oss/fl_oss_eligible.py index 90118fdd47c..d326a89f7db 100644 --- a/policyengine_us/variables/gov/states/fl/dcf/oss/fl_oss_eligible.py +++ b/policyengine_us/variables/gov/states/fl/dcf/oss/fl_oss_eligible.py @@ -13,11 +13,16 @@ class fl_oss_eligible(Variable): ) def formula(person, period, parameters): + p = parameters(period).gov.states.fl.dcf.oss categorically_eligible = person("is_ssi_eligible", period) facility_type = person.household("fl_oss_facility_type", period) in_facility = facility_type != facility_type.possible_values.NONE program_track = person.household("fl_oss_program_track", period) has_track = program_track != program_track.possible_values.NONE + # Protected track must be in effect + is_protected = program_track == program_track.possible_values.PROTECTED + protected_in_effect = p.protected.in_effect + track_valid = where(is_protected, protected_in_effect, has_track) # Coverage Group 1: SSI recipients receives_ssi = person("uncapped_ssi", period) > 0 # Coverage Group 2: non-SSI recipients within income standard @@ -25,4 +30,4 @@ def formula(person, period, parameters): countable_income = person("ssi_countable_income", period) income_within_standard = countable_income <= income_standard income_eligible = receives_ssi | income_within_standard - return categorically_eligible & in_facility & has_track & income_eligible + return categorically_eligible & in_facility & track_valid & income_eligible diff --git a/policyengine_us/variables/gov/states/fl/dcf/oss/fl_oss_max_oss.py b/policyengine_us/variables/gov/states/fl/dcf/oss/fl_oss_max_oss.py index ab0a040e70a..551e3bd5113 100644 --- a/policyengine_us/variables/gov/states/fl/dcf/oss/fl_oss_max_oss.py +++ b/policyengine_us/variables/gov/states/fl/dcf/oss/fl_oss_max_oss.py @@ -15,17 +15,18 @@ def formula(person, period, parameters): track = person.household("fl_oss_program_track", period) is_redesign = track == track.possible_values.REDESIGN joint_claim = person("ssi_claim_is_joint", period) - # Select the max OSS cap by track and couple status. - # Couple caps are total for both spouses; divide by 2 - # for per-person amount. - individual_cap = where( - is_redesign, - p.redesign.max_oss.individual, - p.protected.max_oss.individual, - ) - couple_cap = where( - is_redesign, - p.redesign.max_oss.couple, - p.protected.max_oss.couple, - ) + if p.protected.in_effect: + individual_cap = where( + is_redesign, + p.redesign.max_oss.individual, + p.protected.max_oss.individual, + ) + couple_cap = where( + is_redesign, + p.redesign.max_oss.couple, + p.protected.max_oss.couple, + ) + else: + individual_cap = p.redesign.max_oss.individual + couple_cap = p.redesign.max_oss.couple return where(joint_claim, couple_cap / 2, individual_cap) diff --git a/policyengine_us/variables/gov/states/fl/dcf/oss/fl_oss_provider_rate.py b/policyengine_us/variables/gov/states/fl/dcf/oss/fl_oss_provider_rate.py index d1a813b7800..51d65805ff9 100644 --- a/policyengine_us/variables/gov/states/fl/dcf/oss/fl_oss_provider_rate.py +++ b/policyengine_us/variables/gov/states/fl/dcf/oss/fl_oss_provider_rate.py @@ -14,16 +14,16 @@ def formula(person, period, parameters): p = parameters(period).gov.states.fl.dcf.oss track = person.household("fl_oss_program_track", period) is_redesign = track == track.possible_values.REDESIGN - # Individual provider rate = SSI FBR + track-specific offset fbr_individual = parameters(period).gov.ssa.ssi.amount.individual - offset = where( - is_redesign, - p.redesign.provider_rate_offset, - p.protected.provider_rate_offset, - ) + if p.protected.in_effect: + offset = where( + is_redesign, + p.redesign.provider_rate_offset, + p.protected.provider_rate_offset, + ) + else: + offset = p.redesign.provider_rate_offset individual_rate = fbr_individual + offset - # Couple provider rate = 2 * individual - reduction joint_claim = person("ssi_claim_is_joint", period) couple_rate = 2 * individual_rate - p.couple_provider_rate_reduction - # Per person: couple rate / 2 for joint claims return where(joint_claim, couple_rate / 2, individual_rate) From 1d9273d04717e3d4b12a44b77ef971368fa870c3 Mon Sep 17 00:00:00 2001 From: Ziming Date: Tue, 14 Apr 2026 23:41:26 -0400 Subject: [PATCH 06/14] remove --- sources/working_references.md | 477 ---------------------------------- 1 file changed, 477 deletions(-) delete mode 100644 sources/working_references.md diff --git a/sources/working_references.md b/sources/working_references.md deleted file mode 100644 index b6a44cc9373..00000000000 --- a/sources/working_references.md +++ /dev/null @@ -1,477 +0,0 @@ -# Delaware State Supplementary Payment (SSP) - Working References - -## Program Overview - -Delaware provides an optional State Supplementary Payment (SSP) to SSI recipients -residing in certified adult residential care facilities. The program has dual -administration: SSA administers the federally-administered optional supplement for -facility residents, and the Delaware Division of Social Services (DSS) administers -a separate $5/month supplement for individuals losing SSI due to SSDI (MAT program). - -**Official program name**: State Supplement Payment / Optional State Supplementary Payment -**Administering agency**: SSA (federal portion) + Delaware DSS (state portion) -**Administration classification**: F (mandatory) / F/S (optional) per SI 01415.010 - -## Primary Sources - -### 1. SSA POMS SI PHI01415.008 - Delaware-Specific Administration -- **URL**: https://secure.ssa.gov/poms.nsf/lnx/0501415008PHI -- **Title**: Administration of State Supplementary Programs -- Delaware (RTN 61 -- 12/2015) -- **Content**: Complete historical payment levels from 1992-2016, living arrangement - definitions, certification requirements, income limitation rules -- **Key data**: - - State supplement for certified residential care home: $140/month (individual), $448/month (couple) - - These amounts have been frozen since at least 1992 - - Effective March 1, 2003: "Residential Care Homes" include Adult Foster Care Homes, - Adult Residential Care Facilities, and Assisted Living Facilities - - Eligibility requires Adult Residential Care Certification Form - -### 2. SSA POMS SI 01415.058 - January 2026 Payment Levels -- **URL**: https://secure.ssa.gov/poms.nsf/lnx/0501415058 -- **Title**: Federally Administered Optional Supplementary Payment Programs for January 2026 -- **Content**: Current payment levels effective January 1, 2026 -- **Delaware data**: - - Individual (OS Code A): FBR $994 + supplement $140 = $1,134 total - - Couple (OS Code A): FBR $1,491 + supplement $448 = $1,939 total - - OS Code Z (non-facility): $0 supplement - - OS Code Y: waived supplementation - -### 3. SSA POMS SI 01415.057 - January 2025 Payment Levels -- **URL**: https://secure.ssa.gov/POMS.NSF/lnx/0501415057 -- **Title**: Federally Administered Optional Supplementary Payment Programs for January 2025 -- **Content**: Payment levels effective January 1, 2025 -- **Delaware data**: - - Individual (OS Code A): FBR $967 + supplement $140 = $1,107 total - - Couple (OS Code A): FBR $1,450 + supplement $448 = $1,898 total - -### 4. SSA POMS SI 01415.056 - January 2024 Payment Levels -- **URL**: https://secure.ssa.gov/apps10/poms.nsf/lnx/0501415056 -- **Title**: Federally Administered Optional Supplementary Payment Programs for January 2024 -- **Delaware data**: - - Individual (OS Code A): FBR $943 + supplement $140 = $1,083 total - - Couple (OS Code A): FBR $1,415 + supplement $448 = $1,863 total - -### 5. SSA POMS SI 01415.055 - January 2023 Payment Levels -- **URL**: https://secure.ssa.gov/poms.NSF/lnx/0501415055 -- **Delaware data**: - - Individual (OS Code A): FBR $914 + supplement $140 = $1,054 total - - Couple (OS Code A): FBR $1,371 + supplement $448 = $1,819 total - -### 6. SSA POMS SI 01415.054 - January 2022 Payment Levels -- **URL**: https://secure.ssa.gov/apps10/poms.nsf/lnx/0501415054 -- **Delaware data**: - - Individual (OS Code A): FBR $841 + supplement $140 = $981 total - - Couple (OS Code A): FBR $1,261 + supplement $448 = $1,709 total - -### 7. SSA POMS SI 01415.053 - January 2021 Payment Levels -- **URL**: https://secure.ssa.gov/apps10/poms.nsf/lnx/0501415053 -- **Delaware data**: - - Individual (OS Code A): FBR $794 + supplement $140 = $934 total - - Couple (OS Code A): FBR $1,191 + supplement $448 = $1,639 total - -### 8. SSA POMS SI 01415.052 - January 2020 Payment Levels -- **URL**: https://secure.ssa.gov/poms.nsf/lnx/0501415052 -- **Delaware data**: - - Individual (OS Code A): FBR $783 + supplement $140 = $923 total - - Couple (OS Code A): FBR $1,175 + supplement $448 = $1,623 total - -### 9. SSA POMS SI 01415.051 - January 2019 Payment Levels -- **URL**: https://secure.ssa.gov/apps10/poms.nsf/lnx/0501415051 -- **Delaware data**: - - Individual (OS Code A): FBR $771 + supplement $140 = $911 total - - Couple (OS Code A): FBR $1,157 + supplement $448 = $1,605 total - -### 10. SSA POMS SI 01415.050 - January 2018 Payment Levels -- **URL**: https://secure.ssa.gov/poms.nsf/lnx/0501415050 -- **Delaware data**: - - Individual (OS Code A): FBR $750 + supplement $140 = $890 total - - Couple (OS Code A): FBR $1,125 + supplement $448 = $1,573 total - -### 11. SSA POMS SI 01415.049 - January 2017 Payment Levels -- **URL**: https://secure.ssa.gov/poms.nsf/lnx/0501415049 -- **Delaware data**: - - Individual (OS Code A): FBR $735 + supplement $140 = $875 total - - Couple (OS Code A): FBR $1,103 + supplement $448 = $1,551 total - -### 12. SSA POMS SI 01415.047 - January 2015 Payment Levels -- **URL**: https://secure.ssa.gov/poms.nsf/lnx/0501415047 -- **Delaware data**: - - Individual (OS Code A): FBR $733 + supplement $140 = $873 total - - Couple (OS Code A): FBR $1,100 + supplement $448 = $1,548 total - -### 13. SSA POMS SI 01415.046 - January 2014 Payment Levels -- **URL**: https://secure.ssa.gov/poms.nsf/lnx/0501415046 -- **Delaware data**: - - Individual (OS Code A): FBR $721 + supplement $140 = $861 total - - Couple (OS Code A): FBR $1,082 + supplement $448 = $1,530 total - -### 14. SSA POMS SI 01415.045 - January 2013 Payment Levels -- **URL**: https://secure.ssa.gov/apps10/poms.nsf/links/0501415045 -- **Delaware data**: - - Individual (OS Code A): FBR $710 + supplement $140 = $850 total - - Couple (OS Code A): FBR $1,066 + supplement $448 = $1,514 total - -### 15. SSA POMS SI 01415.044 - January 2012 Payment Levels -- **URL**: https://secure.ssa.gov/poms.nsf/lnx/0501415044 -- **Delaware data**: - - Individual (OS Code A): FBR $698 + supplement $140 = $838 total - - Couple (OS Code A): FBR $1,048 + supplement $448 = $1,496 total - -### 16. SSA POMS SI 01415.040 - January 2008 Payment Levels -- **URL**: https://secure.ssa.gov/POMS.nsf/lnx/0501415040 -- **Delaware data**: - - Individual (OS Code A): FBR $637 + supplement $140 = $777 total - - Couple (OS Code A): FBR $956 + supplement $448 = $1,404 total - -### 17. SSA POMS SI 01415.036 - January 2004 Payment Levels -- **URL**: https://secure.ssa.gov/poms.nsf/lnx/0501415036 -- **Delaware data**: - - Individual (OS Code A): FBR $564 + supplement $140 = $704 total - - Couple (OS Code A): FBR $846 + supplement $448 = $1,294 total - -### 18. SSA POMS SI 01415.032 - January 2000 Payment Levels -- **URL**: https://secure.ssa.gov/poms.nsf/lnx/0501415032 -- **Delaware data**: - - Individual (OS Code A): FBR $512 + supplement $140 = $652 total - - Couple (OS Code A): FBR $769 + supplement $448 = $1,217 total - -### 19. SSA POMS SI 01415.031 - January 1999 Payment Levels -- **URL**: https://secure.ssa.gov/apps10/poms.nsf/lnx/0501415031 -- **Delaware data**: - - Individual (OS Code A): FBR $500 + supplement $140 = $640 total - - Couple (OS Code A): FBR $751 + supplement $448 = $1,199 total - -### 20. SSA POMS SI 01415.010 - Administration Classification -- **URL**: https://secure.ssa.gov/poms.nsf/lnx/0501415010 -- **Title**: Administration of State Supplementary Programs -- **Delaware classification**: F (mandatory) / F/S (optional) - -## Secondary Sources - -### 21. WorkWorld - SSI State Supplement Delaware -- **URL**: https://help.workworldapp.com/wwwebhelp/ssi_state_supplement_delaware.htm -- **Content**: Program overview with 2010 payment amounts -- **Key data**: - - Adult Residential Care Facility: Individual $140 supplement / Couple $448 supplement - - Special category (losing SSI due to SSDI): Individual $5 supplement (state-administered) - - Children under 18 are ineligible - - No additional income disregards beyond federal SSI limits - - Federal resource limitations apply - - Data reflects CY2010 payment levels - -### 22. Delaware Admin Code 16 Del. Admin. Code SS 13000-13640 -- **URL**: https://www.law.cornell.edu/regulations/delaware/16-Del-Admin-Code-SS-13000-13640 -- **Title**: The Social Security Administration (SSA) -- Delaware Social Services Manual -- **Content**: SSA determines eligibility for SSP for individuals in adult residential care -- **Source regulation**: 15 DE Reg. 202, 08/01/11 - -### 23. SSA State Assistance Programs for SSI Recipients, January 2011 - Delaware -- **URL**: https://www.ssa.gov/policy/docs/progdesc/ssi_st_asst/2011/de.html -- **Status**: 403 FORBIDDEN (SSA blocks automated access -- per memory note) -- **Note**: This is the discontinued 2011 SSA report. Last published edition. - -## Summary of State Supplement Amounts (FROZEN) - -The Delaware state supplement amounts have been unchanged since at least 1992: - -| Claim Type | Monthly Supplement | -|---|---| -| Individual in certified residential care | $140 | -| Couple (both eligible) in certified residential care | $448 | -| Individual losing SSI due to SSDI (MAT, state-administered) | $5 | - -## Living Arrangement / OS Code Definitions - -| OS Code | Description | Supplement? | -|---|---|---| -| A | Adult residential care facility, assisted living facility, or adult foster care home | Yes ($140 individual / $448 couple) | -| Y | Eligible but waived supplementation | No | -| Z | All other recipients (independent living, household of another, Medicaid facility) | No | - -## Federal Living Arrangement Code Mapping - -| Federal Code | Description | State Supplement When OS=A | -|---|---|---| -| A | Own household / independent living | $140 / $448 | -| B | Household of another (reduced FBR) | N/A (only OS=Z) | -| C | Parental household (child) | N/A (children ineligible) | -| D | Medicaid facility ($30 personal needs) | N/A (only OS=Z) | - -Note: Federal Code A with OS Code A is the only combination that receives a state supplement. -This means the recipient must be in a certified residential care facility AND classified as -independent living (Federal Code A) rather than in a Medicaid facility (Federal Code D). - -## Eligibility Requirements - -1. Must be SSI-eligible (aged, blind, or disabled) -- adults only (18+) -2. Must reside in Delaware -3. Must reside in a certified adult residential care facility, assisted living facility, - or adult foster care home -4. State must provide certification documentation (Adult Residential Care Certification Form) -5. No additional state income disregards beyond federal SSI rules -6. Federal SSI resource limits apply ($2,000 individual / $3,000 couple) - -## State-Administered Portion (MAT) - -The state-administered portion is specifically for: -- Individuals who lost SSI eligibility due to SSDI receipt -- $5/month supplement to maintain Medicaid eligibility during transition to Medicare -- Administered by Delaware Division of Social Services (DSS) -- Established March 1, 2001 per DSSM 17800 -- Extended September 1, 2008 to cover individuals who lost Medicaid on/after January 1, 2008 - -## Key Dates - -- **Pre-1992**: Program existed but specific amounts before 1992 not documented in POMS -- **1992-present**: $140 individual / $448 couple (frozen, no COLA) -- **March 1, 2001**: MAT program established ($5 state supplement) -- **March 1, 2003**: "Residential Care Homes" definition expanded to include Adult Foster - Care Homes, Adult Residential Care Facilities, and Assisted Living Facilities -- **September 1, 2008**: MAT coverage extended - - -# Florida Optional State Supplementation (OSS) - Working References - -## Primary Regulatory Sources - -### Florida Administrative Code Chapter 65A-2 (Optional State Supplementation) -- **65A-2.032** - Eligibility Criteria (eff. 10/26/2021): http://flrules.elaws.us/fac/65a-2.032 -- **65A-2.033** - Coverage Groups (eff. 5/14/2002): http://flrules.elaws.us/fac/65a-2.033 -- **65A-2.035** - Income Calculation (eff. 12/16/2001): http://flrules.elaws.us/fac/65a-2.035 -- **65A-2.036** - Base Provider Rates and Program Standards (eff. 6/24/2025): http://flrules.elaws.us/fac/65a-2.036 -- Chapter index: https://flrules.org/gateway/ChapterHome.asp?Chapter=65A-2 - -### Florida Statute 409.212 - Optional Supplementation -- 2025 text: https://www.flsenate.gov/Laws/Statutes/2025/409.212 -- 2024 text: https://m.flsenate.gov/Statutes/409.212 -- Key provisions: authorizes OSS program, sets base rate within appropriated funds, COLA adjustment mechanism, third-party supplementation rules (max 4x provider rate) - -### DCF Appendix A-12 - State Funded Programs Eligibility Standards -- Current (01/01/2026): https://www.myflfamilies.com/sites/default/files/2025-12/Appendix%20A-12%20-%20State%20Funded%20Programs%20Eligibility%20Standards.pdf -- Previous (01/01/2025): https://www.myflfamilies.com/sites/default/files/2025-05/Appendix%20A-12%20-%20State%20Funded%20Programs%20Eligibility%20Standards.pdf -- Document link: https://www.myflfamilies.com/document/30456 - -## SSA Sources - -### SSA State Assistance Programs for SSI Recipients (2011) - Florida -- URL: https://www.ssa.gov/policy/docs/progdesc/ssi_st_asst/2011/fl.html -- **STATUS: 403 Forbidden** - SSA blocks automated access. Must download in browser. -- Last published edition: 2011 (discontinued) -- Available years: 2002, 2004, 2006, 2010, 2011 - -### SSA POMS - State Supplementation -- General info: https://secure.ssa.gov/apps10/poms.nsf/lnx/0501401001 -- Methods of administration: https://secure.ssa.gov/apps10/poms.nsf/lnx/0501405001 -- State listing: https://secure.ssa.gov/apps10/poms.nsf/lnx/0501415010 - -### SSI Federal Benefit Rate History -- Current year: https://www.ssa.gov/oact/cola/SSI.html (403 to automated tools) -- Historical table: https://www.ssa.gov/oact/cola/SSIamts.html (403 to automated tools) -- SSI ASR 2023 Section 1: https://www.ssa.gov/policy/docs/statcomps/ssi_asr/2023/sect01.html (403) - -## Secondary/Informational Sources - -### WorkWorld - Florida SSI State Supplement -- URL: https://help.workworldapp.com/wwwebhelp/ssi_state_supplement_florida.htm -- Contains 2010 payment amounts by category -- Confirms state-administered, DCF-run program - -### Medicaid Planning Assistance - SSI and OSS -- URL: https://www.medicaidplanningassistance.org/ssi-and-oss/ -- State-by-state chart with FL amounts: $184.40-$345 (I), $386.80-$690 (C) for 2026 -- Confirms FL does NOT provide OSS for nursing home/Medicaid facility residents - -### Brendan Conley Law - State Supplements by State -- URL: https://brendanconley.com/faq/questions-about-benefits/optional-state-supplements-for-ssi-in-each-state/ -- Confirms FL is state-administered, $78.40 supplement (2017 data), facility residents only, NO independent living supplement - -### MyAccessFlorida - OSS -- URL: https://imyaccessflorida.com/optional-state-supplementation-oss/ -- Application requirements, documentation needed - ---- - -## Extracted Data - -### Program Administration -- **Official name**: Optional State Supplementation (OSS) -- **Administration**: State-administered by FL Department of Children and Families (DCF) -- **Funding**: State funds -- **Authority**: Florida Statute 409.212; FAC Chapter 65A-2 -- **COLA mechanism**: Per F.S. 409.212, "the optional state supplementation rate shall be increased by the cost-of-living adjustment to the federal benefits rate provided the average state optional supplementation contribution does not increase as a result" - -### Eligibility (FAC 65A-2.032) -1. Aged 65+, or aged 18+ and blind/disabled per Title XVI SSA -2. Florida resident with intent to remain -3. US citizen or qualified noncitizen per 8 USC 1641(b) -4. Income within limits per 65A-2.036(3) -5. Assets within SSI Title XVI standards ($2,000 individual / $3,000 couple) -6. Must reside in licensed ALF, AFCH, or MHRTF -7. Must apply for all other monetary benefits (20 CFR 416.210, 42 CFR 435.608) - -### Coverage Groups (FAC 65A-2.033) -1. **Group 1**: Current SSI recipients (automatic, verify age + facility placement) -2. **Group 2**: Meet all SSI/OSS criteria except income, income <= OSS income standard -3. **Group 3**: Historical AABD recipients (as of Dec 1973) - exempt from facility placement -4. **Group 4**: Facility residents who lost OSS due to income exceeding thresholds, but maintain all other criteria - -### Two Program Tracks (from Appendix A-12) - -#### OSS Redesign Standards (ALF, AFCH, RTF enrolled for ACS) -| Parameter | Jul 2024 | Jan 2025 | Jan 2026 | -|---|---|---|---| -| Income Standard (I) | $1,021.40 | $1,045.40 | $1,072.40 | -| Income Standard (C) | $1,969.80 | $1,993.80 | $2,047.80 | -| Provider Rate (I) | $967.40 | $991.40 | $1,018.40 | -| Provider Rate (C) | $1,861.80 | $1,885.80 | $1,939.80 | -| PNA | $160/person | $160/person | $160/person | -| Asset Limit (I/C) | $2,000/$3,000 | $2,000/$3,000 | $2,000/$3,000 | -| Max OSS (I) | $184.40 | $184.40 | $184.40 | -| Max OSS (C) | $386.80 | $386.80 | $386.80 | - -#### OSS Protected Standards (RTF not enrolled for ACS + 2001 "Gap" Group) -| Parameter | Jul 2024 | Jan 2025 | Jan 2026 | -|---|---|---|---| -| Income Standard (I) | $1,128 | $1,152 | $1,179 | -| Income Standard (C) | $2,183 | $2,207 | $2,261 | -| Provider Rate (I) | $1,128 | $1,152 | $1,179 | -| Provider Rate (C) | $2,183 | $2,207 | $2,261 | -| PNA | $160/person | $160/person | $160/person | -| Asset Limit (I/C) | $2,000/$3,000 | $2,000/$3,000 | $2,000/$3,000 | -| Max OSS (I) | $345 | $345 | $345 | -| Max OSS (C) | $690 | $690 | $690 | - -### Rate Formulas (derived from data) -- **Redesign provider rate (I)** = SSI FBR (individual) + $24.40 -- **Protected provider rate (I)** = SSI FBR (individual) + $185.00 -- **Protected: income standard = provider rate** (same value) -- **Redesign: income standard = provider rate + $54** (uses old PNA of $54) -- **Couple provider rate** = 2 * individual provider rate - $97.00 (verified for Jan 2025 and Jan 2026) -- **Max OSS (individual)** = fixed offset + PNA = constant - - Redesign: $24.40 + $160.00 = $184.40 - - Protected: $185.00 + $160.00 = $345.00 -- **Max OSS (couple)**: Protected = 2 * individual max ($690); Redesign = $386.80 - -### OSS Payment Calculation (FAC 65A-2.036) -``` -Total Needs = Base Provider Rate + PNA -OSS Payment = Total Needs - (Gross Income - Allowable Exclusions) -OSS Payment = min(calculated amount, Max OSS) -``` - -### Income Exclusions (FAC 65A-2.035) -- Earned income: $65 exclusion + 1/2 of remainder -- Federal SSI exclusions per 20 CFR 416 -- State exclusions per F.S. 409.212(5) - -### Personal Needs Allowance History -- Pre-July 2024: $54/month -- July 2024 onward: $160/month (HB 5001, 2024-25 GAA, $6.67M appropriation) - -### SSI Federal Benefit Rate Reference (for formula verification) -| Year | Individual | Couple | -|---|---|---| -| 2017 | $735 | $1,103 | -| 2018 | $750 | $1,125 | -| 2019 | $771 | $1,157 | -| 2020 | $783 | $1,175 | -| 2021 | $794 | $1,191 | -| 2022 | $841 | $1,261 | -| 2023 | $914 | $1,371 | -| 2024 | $943 | $1,415 | -| 2025 | $967 | $1,450 | -| 2026 | $994 | $1,491 | - -### What FL Does NOT Provide -- No supplement for independent living (community residents) -- No supplement for Medicaid facility/nursing home residents -- No federally-administered supplement (all state-administered) - -### Recipient Counts -- **Not found in automated searches.** SSA's SSI Recipients by State reports (403 to automated tools) and FL DCF ESS Standard Reports may contain this data. Total FL SSI recipients ~539,276 (Dec 2023), but OSS-specific counts not available. - -### Rule Amendment History (65A-2.036) -- Original: 1-1-77 -- Recent amendments: 11/26/2018, 6/30/2019, 6/11/2020, 10/26/2021, 6/24/2025 - ---- - -## SSA State Assistance Programs for SSI Recipients — Florida (January 2011) -Source: https://www.ssa.gov/policy/docs/progdesc/ssi_st_asst/2011/fl.html (downloaded manually — SSA blocks automated access) - -### Key Values for Cross-Referencing - -> **IMPORTANT DISCREPANCY**: The 2011 SSA report shows the state supplement = **$78.40** (with SSI FBR individual = $674.00, combined = $752.40). The current (2024+) Redesign supplement offset is **$24.40**. This means the offset **changed between 2011 and the current program**. The 2011 report predates the Redesign/Protected split — the entire program used a single $78.40 supplement at that time. - -- SSI FBR individual (Jan 2011) = $674.00 -- Combined individual (community care) = $752.40 -- State supplement = $752.40 - $674.00 = **$78.40** -- Medicaid facility: $5.00 individual, $10.00 couple (personal needs allowance supplement) -- PNA in 2011 = $54 - -### Program Administration -- **Administration**: State Department of Children and Families -- **Effective date**: January 1, 1974 -- **Statutory basis**: Florida Statutes, chapter 409.212 -- **Funding**: Administration — State funds; Assistance — State funds -- **Passalong method**: Maintaining payment levels -- **Place of application**: Local offices of the state Department of Children and Families -- **Interim assistance**: State participates -- **Financial responsibility of relatives**: None -- **Mandatory Minimum Supplementation**: No recipients - -### Resource & Income Rules -- **Resource limitations**: Federal SSI regulations apply -- **Income exclusions**: Federal SSI regulations apply - -### Recoveries, Liens, and Assignments -Amount of public assistance received after August 31, 1967, creates a debt against the estate of the aged, blind, or disabled recipient. The state can file a claim after death. Homestead is exempt if it passes to a qualified heir. Claims are filed against the estate of individuals who received Medicaid on or after their 55th birthday. Florida does not seek recovery if there is a surviving spouse, minor child, or blind or disabled child. - -### Payment Calculation Method -The recipient's gross monthly countable income is subtracted from the sum of the standard provider rate and the personal needs allowance. The difference, up to $78.40, is the state optional payment amount. - -### Scope of Coverage -Under the community care programs, an optional state supplement is provided to all aged, blind, or disabled persons who either receive SSI payments or have been grandfathered because they meet all SSI criteria except for income. Income may not exceed $752.40. - -### Table 1: Optional State Supplementation Payment Levels, January 2011 (in dollars) - -| Living Arrangement | Combined Federal & State (I) | Combined Federal & State (C) | State Supplementation (I) | State Supplementation (C) | -|---|---|---|---|---| -| **Community care programs** | | | | | -| Adult family care home ^a | $752.40 | ^b | $78.40 | ^b | -| Assisted living facility | $752.40 | ^b | $78.40 | ^b | -| **Medicaid facility** ^c | $35.00 | $70.00 | $5.00 | $10.00 | - -**Sources**: Social Security Administration, Office of Income Security Programs; state information. - -**Footnotes**: -- ^a Payments include $54 personal needs allowance. Recipients who lose SSI eligibility because of Social Security (Title II) benefit increases may continue to be eligible for state supplementation if they reside in a specific living arrangement and have income below income limits. -- ^b Couples are treated as two individuals the month after leaving an independent living arrangement. -- ^c Community providers enrolled to provide assistive care services can receive an additional payment from Medicaid recipients residing in their facilities. - -**Definitions**: -- **Adult family care home**: Serves up to five persons aged 18 or older, providing housing, food, and personal services. -- **Assisted living facility**: Serves four or more persons aged 18 or older, providing housing, food, and personal services. -- **Medicaid facility**: Includes recipients residing in a federal Code D living arrangement. - -### Table 2: Number of Persons Receiving Optional State Supplementation, January 2011 - -| Living Arrangement | Total | Aged | Blind | Disabled | -|---|---|---|---|---| -| **All recipients** | **13,160** | **5,239** | **14** | **7,907** | -| **Community care programs** | | | | | -| Adult family care home | 242 | 44 | 0 | 198 | -| Assisted living facility | 7,859 | 2,944 | 6 | 4,909 | -| **Medicaid facility** | 5,059 | 2,251 | 8 | 2,800 | - -**Source**: State information. -**Note**: Includes some non-SSI recipients who meet state eligibility criteria, but do not meet federal SSI eligibility guidelines. - -### Expenditures -The state reported expenditures of $7,585,541.72 for calendar year 2010 in state-administered payments to SSI recipients. (Includes payments made to some non-SSI recipients who meet state eligibility criteria, but do not meet federal SSI eligibility guidelines.) - -### Other Programs (from same report) -- **State Assistance for Special Needs**: State does not provide assistance for special needs. -- **Medicaid Eligibility**: Criteria — SSI program guidelines (Title XVI). Determined by Social Security Administration. -- **Medically Needy Program**: State provides a program for the aged, blind, and disabled medically needy. -- **Unpaid Medical Expenses**: The Social Security Administration does not obtain this information. From cb11306310900f30679a61088d913ec75d3cb138 Mon Sep 17 00:00:00 2001 From: Ziming Date: Wed, 15 Apr 2026 00:26:40 -0400 Subject: [PATCH 07/14] fix --- .../household/household_state_benefits.yaml | 4 + .../oss/couple_provider_rate_reduction.yaml | 4 +- .../medicaid_facility/supplement/couple.yaml | 11 ++ .../supplement/individual.yaml | 11 ++ .../gov/states/fl/dcf/oss/edge_cases.yaml | 118 ++++++++++-------- .../gov/states/fl/dcf/oss/fl_oss.yaml | 28 ++--- .../states/fl/dcf/oss/fl_oss_eligible.yaml | 24 ++-- .../fl/dcf/oss/fl_oss_income_standard.yaml | 7 +- .../gov/states/fl/dcf/oss/fl_oss_max_oss.yaml | 10 +- .../fl/dcf/oss/fl_oss_program_track.yaml | 12 +- .../fl/dcf/oss/fl_oss_provider_rate.yaml | 12 +- .../gov/states/fl/dcf/oss/integration.yaml | 105 +++++++++++++--- .../variables/gov/states/fl/dcf/oss/fl_oss.py | 18 ++- ..._type.py => fl_oss_community_care_type.py} | 12 +- .../gov/states/fl/dcf/oss/fl_oss_eligible.py | 21 ++-- .../fl/dcf/oss/fl_oss_income_standard.py | 2 +- .../fl/dcf/oss/fl_oss_living_arrangement.py | 47 +++++++ .../gov/states/fl/dcf/oss/fl_oss_max_oss.py | 2 +- .../states/fl/dcf/oss/fl_oss_program_track.py | 2 +- .../states/fl/dcf/oss/fl_oss_provider_rate.py | 2 +- .../income/spm_unit/spm_unit_benefits.py | 1 + 21 files changed, 315 insertions(+), 138 deletions(-) create mode 100644 policyengine_us/parameters/gov/states/fl/dcf/oss/medicaid_facility/supplement/couple.yaml create mode 100644 policyengine_us/parameters/gov/states/fl/dcf/oss/medicaid_facility/supplement/individual.yaml rename policyengine_us/variables/gov/states/fl/dcf/oss/{fl_oss_facility_type.py => fl_oss_community_care_type.py} (67%) create mode 100644 policyengine_us/variables/gov/states/fl/dcf/oss/fl_oss_living_arrangement.py diff --git a/policyengine_us/parameters/gov/household/household_state_benefits.yaml b/policyengine_us/parameters/gov/household/household_state_benefits.yaml index eb8c9cd5676..1be6dabae36 100644 --- a/policyengine_us/parameters/gov/household/household_state_benefits.yaml +++ b/policyengine_us/parameters/gov/household/household_state_benefits.yaml @@ -24,6 +24,8 @@ values: - al_ssp # Alaska benefits - ak_ssp + # Florida benefits + - fl_oss # Nebraska benefits - ne_child_care_subsidies # Massachusetts benefits @@ -53,6 +55,8 @@ values: - al_ssp # Alaska benefits - ak_ssp + # Florida benefits + - fl_oss # Nebraska benefits - ne_child_care_subsidies # North Carolina benefits diff --git a/policyengine_us/parameters/gov/states/fl/dcf/oss/couple_provider_rate_reduction.yaml b/policyengine_us/parameters/gov/states/fl/dcf/oss/couple_provider_rate_reduction.yaml index 3549ef9ac35..f941868b31d 100644 --- a/policyengine_us/parameters/gov/states/fl/dcf/oss/couple_provider_rate_reduction.yaml +++ b/policyengine_us/parameters/gov/states/fl/dcf/oss/couple_provider_rate_reduction.yaml @@ -1,6 +1,8 @@ description: Florida reduces the couple provider rate by this amount under the Optional State Supplementation program. values: - 2011-01-01: 97 + 2011-01-01: 0 + 2024-07-01: 73 + 2025-01-01: 97 metadata: unit: currency-USD diff --git a/policyengine_us/parameters/gov/states/fl/dcf/oss/medicaid_facility/supplement/couple.yaml b/policyengine_us/parameters/gov/states/fl/dcf/oss/medicaid_facility/supplement/couple.yaml new file mode 100644 index 00000000000..0f014b9df16 --- /dev/null +++ b/policyengine_us/parameters/gov/states/fl/dcf/oss/medicaid_facility/supplement/couple.yaml @@ -0,0 +1,11 @@ +description: Florida provides this amount as the couple state supplement for Medicaid facility residents under the Optional State Supplementation program. +values: + 2011-01-01: 10 + +metadata: + unit: currency-USD + period: month + label: Florida OSS Medicaid facility couple supplement + reference: + - title: SSA State Assistance Programs for SSI Recipients, January 2011 - Florida, Table 1 + href: https://www.ssa.gov/policy/docs/progdesc/ssi_st_asst/2011/fl.html diff --git a/policyengine_us/parameters/gov/states/fl/dcf/oss/medicaid_facility/supplement/individual.yaml b/policyengine_us/parameters/gov/states/fl/dcf/oss/medicaid_facility/supplement/individual.yaml new file mode 100644 index 00000000000..91fed03cc80 --- /dev/null +++ b/policyengine_us/parameters/gov/states/fl/dcf/oss/medicaid_facility/supplement/individual.yaml @@ -0,0 +1,11 @@ +description: Florida provides this amount as the individual state supplement for Medicaid facility residents under the Optional State Supplementation program. +values: + 2011-01-01: 5 + +metadata: + unit: currency-USD + period: month + label: Florida OSS Medicaid facility individual supplement + reference: + - title: SSA State Assistance Programs for SSI Recipients, January 2011 - Florida, Table 1 + href: https://www.ssa.gov/policy/docs/progdesc/ssi_st_asst/2011/fl.html diff --git a/policyengine_us/tests/policy/baseline/gov/states/fl/dcf/oss/edge_cases.yaml b/policyengine_us/tests/policy/baseline/gov/states/fl/dcf/oss/edge_cases.yaml index a0e54b17cd5..fba44c75fb3 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/fl/dcf/oss/edge_cases.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/fl/dcf/oss/edge_cases.yaml @@ -14,6 +14,8 @@ input: people: person1: + fl_oss_community_care_type: ALF + fl_oss_program_track: REDESIGN age: 70 is_ssi_eligible: true ssi_claim_is_joint: false @@ -26,8 +28,6 @@ household: members: [person1] state_code: FL - fl_oss_facility_type: ALF - fl_oss_program_track: REDESIGN output: fl_oss_eligible: [true] # Total needs = $1,151.40/month. @@ -40,6 +40,8 @@ input: people: person1: + fl_oss_community_care_type: ALF + fl_oss_program_track: REDESIGN age: 70 is_ssi_eligible: true ssi_claim_is_joint: false @@ -52,8 +54,6 @@ household: members: [person1] state_code: FL - fl_oss_facility_type: ALF - fl_oss_program_track: REDESIGN output: fl_oss_eligible: [false] fl_oss: [0] @@ -64,6 +64,8 @@ input: people: person1: + fl_oss_community_care_type: ALF + fl_oss_program_track: REDESIGN age: 70 is_ssi_eligible: true ssi_claim_is_joint: false @@ -75,8 +77,6 @@ household: members: [person1] state_code: FL - fl_oss_facility_type: ALF - fl_oss_program_track: REDESIGN output: fl_oss_eligible: [true] # OSS = min(max(0, $1,151.40 - $1,045.39), $184.40) = min($106.01, $184.40) = $106.01. @@ -93,6 +93,8 @@ input: people: person1: + fl_oss_community_care_type: ALF + fl_oss_program_track: REDESIGN age: 70 is_ssi_eligible: true ssi_claim_is_joint: false @@ -105,8 +107,6 @@ household: members: [person1] state_code: FL - fl_oss_facility_type: ALF - fl_oss_program_track: REDESIGN output: fl_oss_eligible: [true] fl_oss: [0] @@ -123,6 +123,8 @@ input: people: person1: + fl_oss_community_care_type: ALF + fl_oss_program_track: REDESIGN age: 70 is_ssi_eligible: true ssi_claim_is_joint: false @@ -134,8 +136,6 @@ household: members: [person1] state_code: FL - fl_oss_facility_type: ALF - fl_oss_program_track: REDESIGN output: fl_oss_eligible: [true] fl_oss: [184.40] @@ -146,6 +146,8 @@ input: people: person1: + fl_oss_community_care_type: ALF + fl_oss_program_track: REDESIGN age: 70 is_ssi_eligible: true ssi_claim_is_joint: false @@ -157,8 +159,6 @@ household: members: [person1] state_code: FL - fl_oss_facility_type: ALF - fl_oss_program_track: REDESIGN output: fl_oss_eligible: [true] fl_oss: [184.39] @@ -173,6 +173,8 @@ input: people: person1: + fl_oss_community_care_type: MHRTF + fl_oss_program_track: PROTECTED age: 45 is_ssi_eligible: true ssi_claim_is_joint: false @@ -182,8 +184,6 @@ household: members: [person1] state_code: FL - fl_oss_facility_type: MHRTF - fl_oss_program_track: PROTECTED output: fl_oss_eligible: [true] # Total needs (Protected, I) = $1,312/month. Income = $0. @@ -196,12 +196,16 @@ input: people: person1: + fl_oss_community_care_type: AFCH + fl_oss_program_track: REDESIGN age: 72 is_ssi_eligible: true ssi_claim_is_joint: true uncapped_ssi: 10_000 ssi_countable_income: 0 person2: + fl_oss_community_care_type: AFCH + fl_oss_program_track: REDESIGN age: 68 is_ssi_eligible: true ssi_claim_is_joint: true @@ -217,8 +221,6 @@ household: members: [person1, person2] state_code: FL - fl_oss_facility_type: AFCH - fl_oss_program_track: REDESIGN output: fl_oss_eligible: [true, true] # Per person total needs = $1,102.90. Income = $0. @@ -236,6 +238,8 @@ input: people: person1: + fl_oss_community_care_type: ALF + fl_oss_program_track: REDESIGN age: 70 is_ssi_eligible: true ssi_claim_is_joint: false @@ -247,8 +251,6 @@ household: members: [person1] state_code: FL - fl_oss_facility_type: ALF - fl_oss_program_track: REDESIGN output: fl_oss_eligible: [true] # Total needs = $1,151.40. Income = $5,000. max(0, $1,151.40 - $5,000) = $0. @@ -266,6 +268,8 @@ input: people: person1: + fl_oss_community_care_type: ALF + fl_oss_program_track: REDESIGN age: 70 is_ssi_eligible: true ssi_claim_is_joint: false @@ -275,8 +279,6 @@ household: members: [person1] state_code: FL - fl_oss_facility_type: ALF - fl_oss_program_track: REDESIGN output: fl_oss_eligible: [true] # SSI FBR (I) 2024 = $943. Redesign offset = $24.40. @@ -294,6 +296,8 @@ input: people: person1: + fl_oss_community_care_type: ALF + fl_oss_program_track: REDESIGN age: 70 is_ssi_eligible: true ssi_claim_is_joint: false @@ -303,8 +307,6 @@ household: members: [person1] state_code: FL - fl_oss_facility_type: ALF - fl_oss_program_track: REDESIGN output: fl_oss_eligible: [true] # SSI FBR (I) 2025 = $967. Redesign offset = $24.40. @@ -328,6 +330,8 @@ input: people: person1: + fl_oss_community_care_type: MHRTF + fl_oss_program_track: PROTECTED age: 45 is_ssi_eligible: true ssi_claim_is_joint: false @@ -337,8 +341,6 @@ household: members: [person1] state_code: FL - fl_oss_facility_type: MHRTF - fl_oss_program_track: PROTECTED output: # Protected track not in effect before Jul 2024. fl_oss_eligible: [false] @@ -350,12 +352,16 @@ input: people: person1: + fl_oss_community_care_type: MHRTF + fl_oss_program_track: PROTECTED age: 45 is_ssi_eligible: true ssi_claim_is_joint: true uncapped_ssi: 2_000 ssi_countable_income: 7_200 person2: + fl_oss_community_care_type: MHRTF + fl_oss_program_track: PROTECTED age: 42 is_ssi_eligible: true ssi_claim_is_joint: true @@ -371,8 +377,6 @@ household: members: [person1, person2] state_code: FL - fl_oss_facility_type: MHRTF - fl_oss_program_track: PROTECTED output: # Protected track not in effect before Jul 2024. fl_oss_eligible: [false, false] @@ -388,6 +392,8 @@ input: people: person1: + fl_oss_community_care_type: MHRTF + fl_oss_program_track: PROTECTED age: 45 is_ssi_eligible: true ssi_claim_is_joint: false @@ -397,8 +403,6 @@ household: members: [person1] state_code: FL - fl_oss_facility_type: MHRTF - fl_oss_program_track: PROTECTED output: fl_oss_eligible: [true] # Provider rate = $967 + $185 = $1,152/month. @@ -420,6 +424,8 @@ input: people: person1: + fl_oss_community_care_type: MHRTF + fl_oss_program_track: PROTECTED age: 45 is_ssi_eligible: true ssi_claim_is_joint: false @@ -431,8 +437,6 @@ household: members: [person1] state_code: FL - fl_oss_facility_type: MHRTF - fl_oss_program_track: PROTECTED output: fl_oss_eligible: [true] fl_oss_income_standard: [1_152] @@ -446,6 +450,8 @@ input: people: person1: + fl_oss_community_care_type: MHRTF + fl_oss_program_track: PROTECTED age: 45 is_ssi_eligible: true ssi_claim_is_joint: false @@ -458,8 +464,6 @@ household: members: [person1] state_code: FL - fl_oss_facility_type: MHRTF - fl_oss_program_track: PROTECTED output: fl_oss_eligible: [false] fl_oss: [0] @@ -474,6 +478,8 @@ input: people: person1: + fl_oss_community_care_type: AFCH + fl_oss_program_track: REDESIGN age: 70 is_ssi_eligible: true ssi_claim_is_joint: false @@ -483,8 +489,6 @@ household: members: [person1] state_code: FL - fl_oss_facility_type: AFCH - fl_oss_program_track: REDESIGN output: fl_oss_eligible: [true] fl_oss: [184.40] @@ -495,6 +499,8 @@ input: people: person1: + fl_oss_community_care_type: MHRTF + fl_oss_program_track: REDESIGN age: 45 is_ssi_eligible: true ssi_claim_is_joint: false @@ -504,8 +510,6 @@ household: members: [person1] state_code: FL - fl_oss_facility_type: MHRTF - fl_oss_program_track: REDESIGN output: fl_oss_eligible: [true] fl_oss: [184.40] @@ -520,12 +524,16 @@ input: people: person1: + fl_oss_community_care_type: MHRTF + fl_oss_program_track: PROTECTED age: 72 is_ssi_eligible: true ssi_claim_is_joint: true uncapped_ssi: 10_000 ssi_countable_income: 0 person2: + fl_oss_community_care_type: MHRTF + fl_oss_program_track: PROTECTED age: 68 is_ssi_eligible: true ssi_claim_is_joint: true @@ -541,8 +549,6 @@ household: members: [person1, person2] state_code: FL - fl_oss_facility_type: MHRTF - fl_oss_program_track: PROTECTED output: fl_oss_eligible: [true, true] # Protected couple provider rate = 2 * $1,152 - $97 = $2,207/month. @@ -567,6 +573,8 @@ input: people: person1: + fl_oss_community_care_type: AFCH + fl_oss_program_track: REDESIGN age: 72 is_ssi_eligible: true ssi_claim_is_joint: true @@ -574,6 +582,8 @@ # $909.50/month * 12 = $10,914/year. ssi_countable_income: 10_914 person2: + fl_oss_community_care_type: AFCH + fl_oss_program_track: REDESIGN age: 68 is_ssi_eligible: true ssi_claim_is_joint: true @@ -589,8 +599,6 @@ household: members: [person1, person2] state_code: FL - fl_oss_facility_type: AFCH - fl_oss_program_track: REDESIGN output: fl_oss_eligible: [true, true] # Per person: min(max(0, $1,102.90 - $909.50), $193.40) = min($193.40, $193.40) = $193.40. @@ -607,6 +615,8 @@ input: people: person1: + fl_oss_community_care_type: AFCH + fl_oss_program_track: REDESIGN age: 72 is_ssi_eligible: true ssi_claim_is_joint: true @@ -614,6 +624,8 @@ # $996.90/month * 12 = $11,962.80/year. ssi_countable_income: 11_962.80 person2: + fl_oss_community_care_type: AFCH + fl_oss_program_track: REDESIGN age: 68 is_ssi_eligible: true ssi_claim_is_joint: true @@ -629,8 +641,6 @@ household: members: [person1, person2] state_code: FL - fl_oss_facility_type: AFCH - fl_oss_program_track: REDESIGN output: # Income ($996.90) <= income standard ($996.90) → Group 2 eligible. fl_oss_eligible: [true, true] @@ -648,6 +658,8 @@ input: people: person1: + fl_oss_community_care_type: MHRTF + fl_oss_program_track: PROTECTED age: 45 is_ssi_eligible: true ssi_claim_is_joint: false @@ -657,8 +669,6 @@ household: members: [person1] state_code: FL - fl_oss_facility_type: MHRTF - fl_oss_program_track: PROTECTED output: # Protected track not in effect before Jul 2024. fl_oss_eligible: [false] @@ -676,6 +686,8 @@ input: people: person1: + fl_oss_community_care_type: ALF + fl_oss_program_track: REDESIGN age: 70 is_ssi_eligible: true ssi_claim_is_joint: false @@ -687,8 +699,6 @@ household: members: [person1] state_code: FL - fl_oss_facility_type: ALF - fl_oss_program_track: REDESIGN output: fl_oss_eligible: [true] # Total needs = $1,151.40. Income = $1,050. @@ -707,6 +717,8 @@ input: people: person1: + fl_oss_community_care_type: ALF + fl_oss_program_track: REDESIGN age: 70 is_ssi_eligible: true ssi_claim_is_joint: false @@ -718,8 +730,6 @@ household: members: [person1] state_code: FL - fl_oss_facility_type: ALF - fl_oss_program_track: REDESIGN output: fl_oss_eligible: [true] # Income ($1,050) > income standard ($1,045.40) but Group 1 applies. @@ -737,6 +747,8 @@ input: people: person1: + fl_oss_community_care_type: ALF + fl_oss_program_track: REDESIGN age: 40 # Not aged/blind/disabled → is_ssi_eligible = false. is_ssi_eligible: false @@ -747,8 +759,6 @@ household: members: [person1] state_code: FL - fl_oss_facility_type: ALF - fl_oss_program_track: REDESIGN output: fl_oss_eligible: [false] fl_oss: [0] @@ -762,6 +772,8 @@ input: people: person1: + fl_oss_community_care_type: ALF + fl_oss_program_track: NONE age: 70 is_ssi_eligible: true ssi_claim_is_joint: false @@ -771,8 +783,6 @@ household: members: [person1] state_code: FL - fl_oss_facility_type: ALF - fl_oss_program_track: NONE output: fl_oss_eligible: [false] fl_oss: [0] @@ -786,6 +796,8 @@ input: people: person1: + fl_oss_community_care_type: NONE + fl_oss_program_track: REDESIGN age: 70 is_ssi_eligible: true ssi_claim_is_joint: false @@ -795,8 +807,6 @@ household: members: [person1] state_code: FL - fl_oss_facility_type: NONE - fl_oss_program_track: REDESIGN output: fl_oss_eligible: [false] fl_oss: [0] diff --git a/policyengine_us/tests/policy/baseline/gov/states/fl/dcf/oss/fl_oss.yaml b/policyengine_us/tests/policy/baseline/gov/states/fl/dcf/oss/fl_oss.yaml index c0153f6ab69..41ae5ff7357 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/fl/dcf/oss/fl_oss.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/fl/dcf/oss/fl_oss.yaml @@ -7,6 +7,8 @@ input: people: person1: + fl_oss_community_care_type: ALF + fl_oss_program_track: REDESIGN age: 70 is_ssi_eligible: true ssi_claim_is_joint: false @@ -20,8 +22,6 @@ household: members: [person1] state_code: FL - fl_oss_facility_type: ALF - fl_oss_program_track: REDESIGN output: # Total needs (I, Redesign) = $991.40 + $160 = $1,151.40/month = $13,816.80/year. # Countable income = $9,600/year. @@ -37,6 +37,8 @@ input: people: person1: + fl_oss_community_care_type: MHRTF + fl_oss_program_track: PROTECTED age: 70 is_ssi_eligible: true ssi_claim_is_joint: false @@ -46,8 +48,6 @@ household: members: [person1] state_code: FL - fl_oss_facility_type: MHRTF - fl_oss_program_track: PROTECTED output: # Total needs (I, Protected) = $1,152 + $160 = $1,312/month = $15,744/year. # Countable income = $9,600/year. @@ -63,6 +63,8 @@ input: people: person1: + fl_oss_community_care_type: ALF + fl_oss_program_track: REDESIGN age: 70 is_ssi_eligible: true ssi_claim_is_joint: false @@ -76,8 +78,6 @@ household: members: [person1] state_code: FL - fl_oss_facility_type: ALF - fl_oss_program_track: REDESIGN output: fl_oss: [0] @@ -87,6 +87,8 @@ input: people: person1: + fl_oss_community_care_type: ALF + fl_oss_program_track: REDESIGN age: 70 is_ssi_eligible: true ssi_claim_is_joint: false @@ -96,8 +98,6 @@ household: members: [person1] state_code: FL - fl_oss_facility_type: ALF - fl_oss_program_track: REDESIGN output: # Total needs (I, Redesign) = $13,816.80/year. # Countable income = $0. @@ -113,6 +113,8 @@ input: people: person1: + fl_oss_community_care_type: ALF + fl_oss_program_track: REDESIGN age: 70 is_ssi_eligible: true ssi_claim_is_joint: false @@ -129,8 +131,6 @@ household: members: [person1] state_code: FL - fl_oss_facility_type: ALF - fl_oss_program_track: REDESIGN output: # Ineligible: uncapped_ssi <= 0 AND income > income standard. fl_oss: [0] @@ -141,6 +141,8 @@ input: people: person1: + fl_oss_community_care_type: ALF + fl_oss_program_track: REDESIGN age: 70 is_ssi_eligible: true ssi_claim_is_joint: false @@ -154,8 +156,6 @@ household: members: [person1] state_code: FL - fl_oss_facility_type: ALF - fl_oss_program_track: REDESIGN output: # Total needs (Redesign, I) = $13,816.80/year. # Countable income = $12,000/year. @@ -171,6 +171,8 @@ input: people: person1: + fl_oss_community_care_type: ALF + fl_oss_program_track: REDESIGN age: 70 is_ssi_eligible: true ssi_claim_is_joint: false @@ -180,8 +182,6 @@ household: members: [person1] state_code: FL - fl_oss_facility_type: ALF - fl_oss_program_track: REDESIGN output: # Even with hugely negative income, OSS is capped at max. # Max OSS (Redesign, I) = $184.40/month. diff --git a/policyengine_us/tests/policy/baseline/gov/states/fl/dcf/oss/fl_oss_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/fl/dcf/oss/fl_oss_eligible.yaml index 929fce337aa..4642a157b07 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/fl/dcf/oss/fl_oss_eligible.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/fl/dcf/oss/fl_oss_eligible.yaml @@ -7,6 +7,8 @@ input: people: person1: + fl_oss_community_care_type: ALF + fl_oss_program_track: REDESIGN age: 70 is_ssi_eligible: true # uncapped_ssi is YEAR-defined; $967 annual = $80.58/month output. @@ -16,8 +18,6 @@ household: members: [person1] state_code: FL - fl_oss_facility_type: ALF - fl_oss_program_track: REDESIGN output: fl_oss_eligible: [true] @@ -26,6 +26,8 @@ input: people: person1: + fl_oss_community_care_type: ALF + fl_oss_program_track: REDESIGN age: 40 is_ssi_eligible: false uncapped_ssi: 0 @@ -33,8 +35,6 @@ household: members: [person1] state_code: FL - fl_oss_facility_type: ALF - fl_oss_program_track: REDESIGN output: fl_oss_eligible: [false] @@ -43,6 +43,8 @@ input: people: person1: + fl_oss_community_care_type: ALF + fl_oss_program_track: REDESIGN age: 70 is_ssi_eligible: true uncapped_ssi: 967 @@ -50,8 +52,6 @@ household: members: [person1] state_code: CA - fl_oss_facility_type: ALF - fl_oss_program_track: REDESIGN output: fl_oss_eligible: [false] @@ -60,6 +60,8 @@ input: people: person1: + fl_oss_community_care_type: NONE + fl_oss_program_track: NONE age: 70 is_ssi_eligible: true uncapped_ssi: 967 @@ -67,8 +69,6 @@ household: members: [person1] state_code: FL - fl_oss_facility_type: NONE - fl_oss_program_track: NONE output: fl_oss_eligible: [false] @@ -77,6 +77,8 @@ input: people: person1: + fl_oss_community_care_type: ALF + fl_oss_program_track: REDESIGN age: 70 is_ssi_eligible: true # uncapped_ssi <= 0 means not an SSI recipient (income too high for SSI). @@ -90,8 +92,6 @@ household: members: [person1] state_code: FL - fl_oss_facility_type: ALF - fl_oss_program_track: REDESIGN output: fl_oss_eligible: [true] @@ -100,6 +100,8 @@ input: people: person1: + fl_oss_community_care_type: ALF + fl_oss_program_track: REDESIGN age: 70 is_ssi_eligible: true uncapped_ssi: -500 @@ -109,7 +111,5 @@ household: members: [person1] state_code: FL - fl_oss_facility_type: ALF - fl_oss_program_track: REDESIGN output: fl_oss_eligible: [false] diff --git a/policyengine_us/tests/policy/baseline/gov/states/fl/dcf/oss/fl_oss_income_standard.yaml b/policyengine_us/tests/policy/baseline/gov/states/fl/dcf/oss/fl_oss_income_standard.yaml index ebe47ad48de..1d9f5ae1fb4 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/fl/dcf/oss/fl_oss_income_standard.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/fl/dcf/oss/fl_oss_income_standard.yaml @@ -8,6 +8,7 @@ input: people: person1: + fl_oss_program_track: REDESIGN age: 70 is_ssi_eligible: true ssi_claim_is_joint: false @@ -15,7 +16,6 @@ household: members: [person1] state_code: FL - fl_oss_program_track: REDESIGN output: # Redesign provider rate (I) = $991.40/month. # Income standard PNA offset = $54/month. @@ -30,6 +30,7 @@ input: people: person1: + fl_oss_program_track: PROTECTED age: 70 is_ssi_eligible: true ssi_claim_is_joint: false @@ -37,7 +38,6 @@ household: members: [person1] state_code: FL - fl_oss_program_track: PROTECTED output: # Protected income standard = provider rate = $1,152/month. # Annual = $1,152 * 12 = $13,824. @@ -50,10 +50,12 @@ input: people: person1: + fl_oss_program_track: REDESIGN age: 70 is_ssi_eligible: true ssi_claim_is_joint: true person2: + fl_oss_program_track: REDESIGN age: 68 is_ssi_eligible: true ssi_claim_is_joint: true @@ -67,7 +69,6 @@ household: members: [person1, person2] state_code: FL - fl_oss_program_track: REDESIGN output: # Couple provider rate (Redesign) = $1,885.80/month. # Couple income standard = couple provider rate + 2 * $54 = $1,885.80 + $108 = $1,993.80/month. diff --git a/policyengine_us/tests/policy/baseline/gov/states/fl/dcf/oss/fl_oss_max_oss.yaml b/policyengine_us/tests/policy/baseline/gov/states/fl/dcf/oss/fl_oss_max_oss.yaml index 00e2ff55f48..892af8684f5 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/fl/dcf/oss/fl_oss_max_oss.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/fl/dcf/oss/fl_oss_max_oss.yaml @@ -7,6 +7,7 @@ input: people: person1: + fl_oss_program_track: REDESIGN age: 70 is_ssi_eligible: true ssi_claim_is_joint: false @@ -14,7 +15,6 @@ household: members: [person1] state_code: FL - fl_oss_program_track: REDESIGN output: # Max OSS (Redesign, I) = $184.40/month (frozen). # Annual = $184.40 * 12 = $2,212.80. @@ -27,6 +27,7 @@ input: people: person1: + fl_oss_program_track: PROTECTED age: 70 is_ssi_eligible: true ssi_claim_is_joint: false @@ -34,7 +35,6 @@ household: members: [person1] state_code: FL - fl_oss_program_track: PROTECTED output: # Max OSS (Protected, I) = $345/month (frozen). # Annual = $345 * 12 = $4,140. @@ -47,10 +47,12 @@ input: people: person1: + fl_oss_program_track: REDESIGN age: 70 is_ssi_eligible: true ssi_claim_is_joint: true person2: + fl_oss_program_track: REDESIGN age: 68 is_ssi_eligible: true ssi_claim_is_joint: true @@ -64,7 +66,6 @@ household: members: [person1, person2] state_code: FL - fl_oss_program_track: REDESIGN output: # Max OSS (Redesign, C) = $386.80/month (frozen). # Per person = $386.80 / 2 = $193.40/month. @@ -78,10 +79,12 @@ input: people: person1: + fl_oss_program_track: PROTECTED age: 70 is_ssi_eligible: true ssi_claim_is_joint: true person2: + fl_oss_program_track: PROTECTED age: 68 is_ssi_eligible: true ssi_claim_is_joint: true @@ -95,7 +98,6 @@ household: members: [person1, person2] state_code: FL - fl_oss_program_track: PROTECTED output: # Max OSS (Protected, C) = $690/month (frozen). # Per person = $690 / 2 = $345/month. diff --git a/policyengine_us/tests/policy/baseline/gov/states/fl/dcf/oss/fl_oss_program_track.yaml b/policyengine_us/tests/policy/baseline/gov/states/fl/dcf/oss/fl_oss_program_track.yaml index 9c36fbba81a..53168e9e187 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/fl/dcf/oss/fl_oss_program_track.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/fl/dcf/oss/fl_oss_program_track.yaml @@ -9,13 +9,13 @@ input: people: person1: + fl_oss_community_care_type: ALF + fl_oss_program_track: REDESIGN age: 70 households: household: members: [person1] state_code: FL - fl_oss_facility_type: ALF - fl_oss_program_track: REDESIGN output: fl_oss_program_track: REDESIGN @@ -24,13 +24,13 @@ input: people: person1: + fl_oss_community_care_type: MHRTF + fl_oss_program_track: PROTECTED age: 70 households: household: members: [person1] state_code: FL - fl_oss_facility_type: MHRTF - fl_oss_program_track: PROTECTED output: fl_oss_program_track: PROTECTED @@ -39,12 +39,12 @@ input: people: person1: + fl_oss_community_care_type: NONE + fl_oss_program_track: NONE age: 70 households: household: members: [person1] state_code: FL - fl_oss_facility_type: NONE - fl_oss_program_track: NONE output: fl_oss_program_track: NONE diff --git a/policyengine_us/tests/policy/baseline/gov/states/fl/dcf/oss/fl_oss_provider_rate.yaml b/policyengine_us/tests/policy/baseline/gov/states/fl/dcf/oss/fl_oss_provider_rate.yaml index 8693728f2f8..dfcecb48bdc 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/fl/dcf/oss/fl_oss_provider_rate.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/fl/dcf/oss/fl_oss_provider_rate.yaml @@ -9,6 +9,7 @@ input: people: person1: + fl_oss_program_track: REDESIGN age: 70 is_ssi_eligible: true ssi_claim_is_joint: false @@ -16,7 +17,6 @@ household: members: [person1] state_code: FL - fl_oss_program_track: REDESIGN output: # SSI FBR (I) 2025 = $967/month = $11,604/year. # Redesign offset = $24.40/month = $292.80/year. @@ -30,6 +30,7 @@ input: people: person1: + fl_oss_program_track: PROTECTED age: 70 is_ssi_eligible: true ssi_claim_is_joint: false @@ -37,7 +38,6 @@ household: members: [person1] state_code: FL - fl_oss_program_track: PROTECTED output: # SSI FBR (I) 2025 = $967/month = $11,604/year. # Protected offset = $185/month = $2,220/year. @@ -51,10 +51,12 @@ input: people: person1: + fl_oss_program_track: REDESIGN age: 70 is_ssi_eligible: true ssi_claim_is_joint: true person2: + fl_oss_program_track: REDESIGN age: 68 is_ssi_eligible: true ssi_claim_is_joint: true @@ -68,7 +70,6 @@ household: members: [person1, person2] state_code: FL - fl_oss_program_track: REDESIGN output: # Individual rate = $991.40/month. # Couple rate = 2 * $991.40 - $97 = $1,885.80/month. @@ -83,10 +84,12 @@ input: people: person1: + fl_oss_program_track: PROTECTED age: 70 is_ssi_eligible: true ssi_claim_is_joint: true person2: + fl_oss_program_track: PROTECTED age: 68 is_ssi_eligible: true ssi_claim_is_joint: true @@ -100,7 +103,6 @@ household: members: [person1, person2] state_code: FL - fl_oss_program_track: PROTECTED output: # Individual Protected rate = $1,152/month. # Couple rate = 2 * $1,152 - $97 = $2,207/month. @@ -113,6 +115,7 @@ input: people: person1: + fl_oss_program_track: REDESIGN age: 70 is_ssi_eligible: true ssi_claim_is_joint: false @@ -120,7 +123,6 @@ household: members: [person1] state_code: FL - fl_oss_program_track: REDESIGN output: # SSI FBR (I) 2024 = $943/month. # Redesign offset = $24.40/month. diff --git a/policyengine_us/tests/policy/baseline/gov/states/fl/dcf/oss/integration.yaml b/policyengine_us/tests/policy/baseline/gov/states/fl/dcf/oss/integration.yaml index 73f71bbd641..dfe5fc7ec86 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/fl/dcf/oss/integration.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/fl/dcf/oss/integration.yaml @@ -15,12 +15,12 @@ uncapped_ssi: 2_004 # $800/month * 12 = $9,600/year. ssi_countable_income: 9_600 + fl_oss_community_care_type: ALF + fl_oss_program_track: REDESIGN households: household: members: [person1] state_code: FL - fl_oss_facility_type: ALF - fl_oss_program_track: REDESIGN output: fl_oss_eligible: [true] # Provider rate (I, Redesign) = $967 + $24.40 = $991.40/month. @@ -47,12 +47,16 @@ # uncapped_ssi per person = $8,700 - $7,200 = $1,500/year > 0 → SSI recipients. uncapped_ssi: 1_500 ssi_countable_income: 7_200 + fl_oss_community_care_type: AFCH + fl_oss_program_track: REDESIGN person2: age: 68 is_ssi_eligible: true ssi_claim_is_joint: true uncapped_ssi: 1_500 ssi_countable_income: 7_200 + fl_oss_community_care_type: AFCH + fl_oss_program_track: REDESIGN marital_units: marital_unit: members: [person1, person2] @@ -63,8 +67,6 @@ household: members: [person1, person2] state_code: FL - fl_oss_facility_type: AFCH - fl_oss_program_track: REDESIGN output: fl_oss_eligible: [true, true] # Couple provider rate (Redesign) = 2 * $991.40 - $97 = $1,885.80/month. @@ -99,12 +101,12 @@ # Income standard (Redesign, I) = $1,045.40/month = $12,544.80/year. # $12,480 < $12,544.80 → Group 2 eligible. ssi_countable_income: 12_480 + fl_oss_community_care_type: ALF + fl_oss_program_track: REDESIGN households: household: members: [person1] state_code: FL - fl_oss_facility_type: ALF - fl_oss_program_track: REDESIGN output: fl_oss_eligible: [true] fl_oss_provider_rate: [991.40] @@ -130,12 +132,12 @@ # Income > income standard → not Group 2 either → ineligible. uncapped_ssi: -1_596 ssi_countable_income: 13_200 + fl_oss_community_care_type: ALF + fl_oss_program_track: REDESIGN households: household: members: [person1] state_code: FL - fl_oss_facility_type: ALF - fl_oss_program_track: REDESIGN output: fl_oss_eligible: [false] fl_oss: [0] @@ -154,12 +156,12 @@ # uncapped_ssi = ($967 - $700) * 12 = $267 * 12 = $3,204 > 0 → SSI recipient. uncapped_ssi: 3_204 ssi_countable_income: 8_400 + fl_oss_community_care_type: MHRTF + fl_oss_program_track: PROTECTED households: household: members: [person1] state_code: FL - fl_oss_facility_type: MHRTF - fl_oss_program_track: PROTECTED output: fl_oss_eligible: [true] # Protected provider rate (I) = $967 + $185 = $1,152/month. @@ -183,13 +185,13 @@ ssi_claim_is_joint: false uncapped_ssi: 2_004 ssi_countable_income: 9_600 + # No facility → no OSS for independent living. + fl_oss_community_care_type: NONE + fl_oss_program_track: NONE households: household: members: [person1] state_code: FL - # No facility → no OSS for independent living. - fl_oss_facility_type: NONE - fl_oss_program_track: NONE output: fl_oss_eligible: [false] fl_oss: [0] @@ -205,6 +207,8 @@ ssi_claim_is_joint: false uncapped_ssi: 2_004 ssi_countable_income: 9_600 + fl_oss_community_care_type: ALF + fl_oss_program_track: REDESIGN person2: age: 40 # Not SSI eligible (not aged/blind/disabled). @@ -212,6 +216,8 @@ ssi_claim_is_joint: false uncapped_ssi: 0 ssi_countable_income: 0 + fl_oss_community_care_type: ALF + fl_oss_program_track: REDESIGN marital_units: marital_unit: members: [person1, person2] @@ -222,8 +228,6 @@ household: members: [person1, person2] state_code: FL - fl_oss_facility_type: ALF - fl_oss_program_track: REDESIGN output: # Person1 is eligible (SSI recipient, in facility). # Person2 is NOT eligible (not SSI eligible). @@ -251,12 +255,12 @@ # Income = $700/month. uncapped_ssi = ($943 - $700) * 12 = $2,916/year. uncapped_ssi: 2_916 ssi_countable_income: 8_400 + fl_oss_community_care_type: ALF + fl_oss_program_track: REDESIGN households: household: members: [person1] state_code: FL - fl_oss_facility_type: ALF - fl_oss_program_track: REDESIGN output: # Before Jul 2024: PNA = $54, Redesign offset = $24.40. # Provider rate (I) = $943 + $24.40 = $967.40/month. @@ -282,12 +286,12 @@ # Income = $500/month. uncapped_ssi = ($674 - $500) * 12 = $2,088/year. uncapped_ssi: 2_088 ssi_countable_income: 6_000 + fl_oss_community_care_type: ALF + fl_oss_program_track: REDESIGN households: household: members: [person1] state_code: FL - fl_oss_facility_type: ALF - fl_oss_program_track: REDESIGN output: fl_oss_eligible: [true] # 2011 values (pre-restructuring): Redesign offset = $24.40, PNA = $54. @@ -300,3 +304,66 @@ # Calculated = $752.40 - $500 = $252.40/month → capped at $78.40. # OSS = $78.40/month. fl_oss: [78.40] + +- name: Case 10, Medicaid facility individual, 2011, federal-state connection. + period: 2011-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 70 + is_ssi_eligible: true + ssi_claim_is_joint: false + # Person is in a Medicaid facility (federal Code D). + # Federal SSI pays $30/month medical facility rate. + ssi_lives_in_medical_treatment_facility: true + ssi_medicaid_pays_majority_of_care: true + households: + household: + members: [person1] + state_code: FL + output: + # Federal SSI: $30/month medical facility rate. + # ssi_amount_if_eligible = $30/month = $360/year. + # With $0 income, uncapped_ssi = $360/year. + ssi: 30 + # Living arrangement derived from federal: + # ssi_federal_living_arrangement = MEDICAL_TREATMENT_FACILITY + # → fl_oss_living_arrangement = MEDICAID_FACILITY + fl_oss_eligible: [true] + # State supplement: $5/month (flat, from SSA 2011 Table 1). + fl_oss: [5] + +- name: Case 11, Medicaid facility couple, 2011, federal-state connection. + period: 2011-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 72 + is_ssi_eligible: true + ssi_claim_is_joint: true + ssi_lives_in_medical_treatment_facility: true + ssi_medicaid_pays_majority_of_care: true + person2: + age: 68 + is_ssi_eligible: true + ssi_claim_is_joint: true + ssi_lives_in_medical_treatment_facility: true + ssi_medicaid_pays_majority_of_care: true + marital_units: + marital_unit: + members: [person1, person2] + tax_units: + tax_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: FL + output: + # Federal SSI: $30/month each (medical facility rate). + ssi: [30, 30] + fl_oss_eligible: [true, true] + # State supplement: $10/month couple, $5/month per person. + fl_oss: [5, 5] diff --git a/policyengine_us/variables/gov/states/fl/dcf/oss/fl_oss.py b/policyengine_us/variables/gov/states/fl/dcf/oss/fl_oss.py index e82ef4c0f1d..a857e4325ba 100644 --- a/policyengine_us/variables/gov/states/fl/dcf/oss/fl_oss.py +++ b/policyengine_us/variables/gov/states/fl/dcf/oss/fl_oss.py @@ -14,9 +14,21 @@ class fl_oss(Variable): ) def formula(person, period, parameters): - pna = parameters(period).gov.states.fl.dcf.oss.pna + p = parameters(period).gov.states.fl.dcf.oss + living_arrangement = person("fl_oss_living_arrangement", period) + LA = living_arrangement.possible_values + in_medicaid_facility = living_arrangement == LA.MEDICAID_FACILITY + # Medicaid facility: flat state supplement + joint_claim = person("ssi_claim_is_joint", period) + medicaid_supplement = where( + joint_claim, + p.medicaid_facility.supplement.couple / 2, + p.medicaid_facility.supplement.individual, + ) + # Community care: provider rate + PNA - income, capped at max OSS provider_rate = person("fl_oss_provider_rate", period) - total_needs = provider_rate + pna + total_needs = provider_rate + p.pna countable_income = person("ssi_countable_income", period) max_oss = person("fl_oss_max_oss", period) - return min_(max_(total_needs - countable_income, 0), max_oss) + community_benefit = min_(max_(total_needs - countable_income, 0), max_oss) + return where(in_medicaid_facility, medicaid_supplement, community_benefit) diff --git a/policyengine_us/variables/gov/states/fl/dcf/oss/fl_oss_facility_type.py b/policyengine_us/variables/gov/states/fl/dcf/oss/fl_oss_community_care_type.py similarity index 67% rename from policyengine_us/variables/gov/states/fl/dcf/oss/fl_oss_facility_type.py rename to policyengine_us/variables/gov/states/fl/dcf/oss/fl_oss_community_care_type.py index 995aca1b59e..4389602c79f 100644 --- a/policyengine_us/variables/gov/states/fl/dcf/oss/fl_oss_facility_type.py +++ b/policyengine_us/variables/gov/states/fl/dcf/oss/fl_oss_community_care_type.py @@ -1,21 +1,21 @@ from policyengine_us.model_api import * -class FLOSSFacilityType(Enum): +class FLOSSCommunityCareType(Enum): ALF = "Assisted Living Facility" AFCH = "Adult Family Care Home" MHRTF = "Mental Health Residential Treatment Facility" NONE = "None" -class fl_oss_facility_type(Variable): +class fl_oss_community_care_type(Variable): value_type = Enum - entity = Household - label = "Florida OSS facility type" + entity = Person + label = "Florida OSS community care facility type" definition_period = MONTH defined_for = StateCode.FL - possible_values = FLOSSFacilityType - default_value = FLOSSFacilityType.NONE + possible_values = FLOSSCommunityCareType + default_value = FLOSSCommunityCareType.NONE reference = ( "https://www.flrules.org/gateway/RuleNo.asp?title=PUBLIC%20ASSISTANCE&ID=65A-2.032", "https://www.myflfamilies.com/sites/default/files/2024-10/Appendix%20A-12%20OSS%20Payment%20Standards.pdf", diff --git a/policyengine_us/variables/gov/states/fl/dcf/oss/fl_oss_eligible.py b/policyengine_us/variables/gov/states/fl/dcf/oss/fl_oss_eligible.py index d326a89f7db..4bf88c40902 100644 --- a/policyengine_us/variables/gov/states/fl/dcf/oss/fl_oss_eligible.py +++ b/policyengine_us/variables/gov/states/fl/dcf/oss/fl_oss_eligible.py @@ -15,14 +15,16 @@ class fl_oss_eligible(Variable): def formula(person, period, parameters): p = parameters(period).gov.states.fl.dcf.oss categorically_eligible = person("is_ssi_eligible", period) - facility_type = person.household("fl_oss_facility_type", period) - in_facility = facility_type != facility_type.possible_values.NONE - program_track = person.household("fl_oss_program_track", period) + living_arrangement = person("fl_oss_living_arrangement", period) + LA = living_arrangement.possible_values + in_facility = living_arrangement != LA.NONE + in_medicaid_facility = living_arrangement == LA.MEDICAID_FACILITY + # Medicaid facility: only requires SSI eligibility + facility + # Community care: also requires valid program track + income check + program_track = person("fl_oss_program_track", period) has_track = program_track != program_track.possible_values.NONE - # Protected track must be in effect is_protected = program_track == program_track.possible_values.PROTECTED - protected_in_effect = p.protected.in_effect - track_valid = where(is_protected, protected_in_effect, has_track) + track_valid = where(is_protected, p.protected.in_effect, has_track) # Coverage Group 1: SSI recipients receives_ssi = person("uncapped_ssi", period) > 0 # Coverage Group 2: non-SSI recipients within income standard @@ -30,4 +32,9 @@ def formula(person, period, parameters): countable_income = person("ssi_countable_income", period) income_within_standard = countable_income <= income_standard income_eligible = receives_ssi | income_within_standard - return categorically_eligible & in_facility & track_valid & income_eligible + community_eligible = track_valid & income_eligible + return ( + categorically_eligible + & in_facility + & where(in_medicaid_facility, receives_ssi, community_eligible) + ) diff --git a/policyengine_us/variables/gov/states/fl/dcf/oss/fl_oss_income_standard.py b/policyengine_us/variables/gov/states/fl/dcf/oss/fl_oss_income_standard.py index bc598959644..46320e985ff 100644 --- a/policyengine_us/variables/gov/states/fl/dcf/oss/fl_oss_income_standard.py +++ b/policyengine_us/variables/gov/states/fl/dcf/oss/fl_oss_income_standard.py @@ -12,7 +12,7 @@ class fl_oss_income_standard(Variable): def formula(person, period, parameters): p = parameters(period).gov.states.fl.dcf.oss - track = person.household("fl_oss_program_track", period) + track = person("fl_oss_program_track", period) is_redesign = track == track.possible_values.REDESIGN provider_rate = person("fl_oss_provider_rate", period) # Redesign: income standard = provider rate + PNA offset diff --git a/policyengine_us/variables/gov/states/fl/dcf/oss/fl_oss_living_arrangement.py b/policyengine_us/variables/gov/states/fl/dcf/oss/fl_oss_living_arrangement.py new file mode 100644 index 00000000000..a1eea325eb1 --- /dev/null +++ b/policyengine_us/variables/gov/states/fl/dcf/oss/fl_oss_living_arrangement.py @@ -0,0 +1,47 @@ +from policyengine_us.model_api import * + + +class FLOSSLivingArrangement(Enum): + ALF = "Assisted Living Facility" + AFCH = "Adult Family Care Home" + MHRTF = "Mental Health Residential Treatment Facility" + MEDICAID_FACILITY = "Medicaid facility" + NONE = "None" + + +class fl_oss_living_arrangement(Variable): + value_type = Enum + entity = Person + label = "Florida OSS living arrangement" + definition_period = MONTH + defined_for = StateCode.FL + possible_values = FLOSSLivingArrangement + default_value = FLOSSLivingArrangement.NONE + reference = ( + "https://www.flrules.org/gateway/RuleNo.asp?title=PUBLIC%20ASSISTANCE&ID=65A-2.032", + "https://www.ssa.gov/policy/docs/progdesc/ssi_st_asst/2011/fl.html", + ) + + def formula(person, period): + federal_la = person("ssi_federal_living_arrangement", period) + in_medical_facility = ( + federal_la == federal_la.possible_values.MEDICAL_TREATMENT_FACILITY + ) + community_care = person("fl_oss_community_care_type", period) + CC = community_care.possible_values + LA = FLOSSLivingArrangement + return select( + [ + in_medical_facility, + community_care == CC.ALF, + community_care == CC.AFCH, + community_care == CC.MHRTF, + ], + [ + LA.MEDICAID_FACILITY, + LA.ALF, + LA.AFCH, + LA.MHRTF, + ], + default=LA.NONE, + ) diff --git a/policyengine_us/variables/gov/states/fl/dcf/oss/fl_oss_max_oss.py b/policyengine_us/variables/gov/states/fl/dcf/oss/fl_oss_max_oss.py index 551e3bd5113..d6dca602a02 100644 --- a/policyengine_us/variables/gov/states/fl/dcf/oss/fl_oss_max_oss.py +++ b/policyengine_us/variables/gov/states/fl/dcf/oss/fl_oss_max_oss.py @@ -12,7 +12,7 @@ class fl_oss_max_oss(Variable): def formula(person, period, parameters): p = parameters(period).gov.states.fl.dcf.oss - track = person.household("fl_oss_program_track", period) + track = person("fl_oss_program_track", period) is_redesign = track == track.possible_values.REDESIGN joint_claim = person("ssi_claim_is_joint", period) if p.protected.in_effect: diff --git a/policyengine_us/variables/gov/states/fl/dcf/oss/fl_oss_program_track.py b/policyengine_us/variables/gov/states/fl/dcf/oss/fl_oss_program_track.py index 636cb156596..2db27d1a7b2 100644 --- a/policyengine_us/variables/gov/states/fl/dcf/oss/fl_oss_program_track.py +++ b/policyengine_us/variables/gov/states/fl/dcf/oss/fl_oss_program_track.py @@ -9,7 +9,7 @@ class FLOSSProgramTrack(Enum): class fl_oss_program_track(Variable): value_type = Enum - entity = Household + entity = Person label = "Florida OSS program track" definition_period = MONTH defined_for = StateCode.FL diff --git a/policyengine_us/variables/gov/states/fl/dcf/oss/fl_oss_provider_rate.py b/policyengine_us/variables/gov/states/fl/dcf/oss/fl_oss_provider_rate.py index 51d65805ff9..398ef126047 100644 --- a/policyengine_us/variables/gov/states/fl/dcf/oss/fl_oss_provider_rate.py +++ b/policyengine_us/variables/gov/states/fl/dcf/oss/fl_oss_provider_rate.py @@ -12,7 +12,7 @@ class fl_oss_provider_rate(Variable): def formula(person, period, parameters): p = parameters(period).gov.states.fl.dcf.oss - track = person.household("fl_oss_program_track", period) + track = person("fl_oss_program_track", period) is_redesign = track == track.possible_values.REDESIGN fbr_individual = parameters(period).gov.ssa.ssi.amount.individual if p.protected.in_effect: 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 a81e0b8bbd0..25643c0d833 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 @@ -15,6 +15,7 @@ def formula(spm_unit, period, parameters): "al_ssp", "ak_ssp", "de_ssp", # Delaware benefits + "fl_oss", "ma_state_supplement", # Massachusetts benefits # California programs. "ca_cvrp", # California Clean Vehicle Rebate Project. From 97359718e357b962491d7119bdb3e61d96a86461 Mon Sep 17 00:00:00 2001 From: Ziming Date: Wed, 15 Apr 2026 01:21:05 -0400 Subject: [PATCH 08/14] Require both spouses eligible before applying FL OSS couple rates Replace bare ssi_claim_is_joint with fl_oss_couple_rate_applies that checks both spouses are is_ssi_eligible AND in a qualifying facility. Also align eligibility with FAC 65A-2.033: use ssi > 0 (actual SSI receipt per statute) instead of uncapped_ssi > 0, and allow Medicaid facility residents to qualify via Group 2 (income standard). Co-Authored-By: Claude Opus 4.6 (1M context) --- .../fl/dcf/oss/fl_oss_income_standard.yaml | 2 ++ .../gov/states/fl/dcf/oss/fl_oss_max_oss.yaml | 4 ++++ .../fl/dcf/oss/fl_oss_provider_rate.yaml | 4 ++++ .../variables/gov/states/fl/dcf/oss/fl_oss.py | 4 ++-- .../fl/dcf/oss/fl_oss_couple_rate_applies.py | 23 +++++++++++++++++++ .../gov/states/fl/dcf/oss/fl_oss_eligible.py | 18 ++++++--------- .../gov/states/fl/dcf/oss/fl_oss_max_oss.py | 4 ++-- .../states/fl/dcf/oss/fl_oss_provider_rate.py | 4 ++-- 8 files changed, 46 insertions(+), 17 deletions(-) create mode 100644 policyengine_us/variables/gov/states/fl/dcf/oss/fl_oss_couple_rate_applies.py diff --git a/policyengine_us/tests/policy/baseline/gov/states/fl/dcf/oss/fl_oss_income_standard.yaml b/policyengine_us/tests/policy/baseline/gov/states/fl/dcf/oss/fl_oss_income_standard.yaml index 1d9f5ae1fb4..076e4db6b5a 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/fl/dcf/oss/fl_oss_income_standard.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/fl/dcf/oss/fl_oss_income_standard.yaml @@ -50,11 +50,13 @@ input: people: person1: + fl_oss_community_care_type: ALF fl_oss_program_track: REDESIGN age: 70 is_ssi_eligible: true ssi_claim_is_joint: true person2: + fl_oss_community_care_type: ALF fl_oss_program_track: REDESIGN age: 68 is_ssi_eligible: true diff --git a/policyengine_us/tests/policy/baseline/gov/states/fl/dcf/oss/fl_oss_max_oss.yaml b/policyengine_us/tests/policy/baseline/gov/states/fl/dcf/oss/fl_oss_max_oss.yaml index 892af8684f5..6710fc92381 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/fl/dcf/oss/fl_oss_max_oss.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/fl/dcf/oss/fl_oss_max_oss.yaml @@ -47,11 +47,13 @@ input: people: person1: + fl_oss_community_care_type: ALF fl_oss_program_track: REDESIGN age: 70 is_ssi_eligible: true ssi_claim_is_joint: true person2: + fl_oss_community_care_type: ALF fl_oss_program_track: REDESIGN age: 68 is_ssi_eligible: true @@ -79,11 +81,13 @@ input: people: person1: + fl_oss_community_care_type: MHRTF fl_oss_program_track: PROTECTED age: 70 is_ssi_eligible: true ssi_claim_is_joint: true person2: + fl_oss_community_care_type: MHRTF fl_oss_program_track: PROTECTED age: 68 is_ssi_eligible: true diff --git a/policyengine_us/tests/policy/baseline/gov/states/fl/dcf/oss/fl_oss_provider_rate.yaml b/policyengine_us/tests/policy/baseline/gov/states/fl/dcf/oss/fl_oss_provider_rate.yaml index dfcecb48bdc..1f2b4fcccf4 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/fl/dcf/oss/fl_oss_provider_rate.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/fl/dcf/oss/fl_oss_provider_rate.yaml @@ -51,11 +51,13 @@ input: people: person1: + fl_oss_community_care_type: ALF fl_oss_program_track: REDESIGN age: 70 is_ssi_eligible: true ssi_claim_is_joint: true person2: + fl_oss_community_care_type: ALF fl_oss_program_track: REDESIGN age: 68 is_ssi_eligible: true @@ -84,11 +86,13 @@ input: people: person1: + fl_oss_community_care_type: MHRTF fl_oss_program_track: PROTECTED age: 70 is_ssi_eligible: true ssi_claim_is_joint: true person2: + fl_oss_community_care_type: MHRTF fl_oss_program_track: PROTECTED age: 68 is_ssi_eligible: true diff --git a/policyengine_us/variables/gov/states/fl/dcf/oss/fl_oss.py b/policyengine_us/variables/gov/states/fl/dcf/oss/fl_oss.py index a857e4325ba..862ff0343b8 100644 --- a/policyengine_us/variables/gov/states/fl/dcf/oss/fl_oss.py +++ b/policyengine_us/variables/gov/states/fl/dcf/oss/fl_oss.py @@ -19,9 +19,9 @@ def formula(person, period, parameters): LA = living_arrangement.possible_values in_medicaid_facility = living_arrangement == LA.MEDICAID_FACILITY # Medicaid facility: flat state supplement - joint_claim = person("ssi_claim_is_joint", period) + couple_rate_applies = person("fl_oss_couple_rate_applies", period) medicaid_supplement = where( - joint_claim, + couple_rate_applies, p.medicaid_facility.supplement.couple / 2, p.medicaid_facility.supplement.individual, ) diff --git a/policyengine_us/variables/gov/states/fl/dcf/oss/fl_oss_couple_rate_applies.py b/policyengine_us/variables/gov/states/fl/dcf/oss/fl_oss_couple_rate_applies.py new file mode 100644 index 00000000000..81e935727cb --- /dev/null +++ b/policyengine_us/variables/gov/states/fl/dcf/oss/fl_oss_couple_rate_applies.py @@ -0,0 +1,23 @@ +from policyengine_us.model_api import * + + +class fl_oss_couple_rate_applies(Variable): + value_type = bool + entity = Person + label = "Florida OSS couple rate applies" + definition_period = MONTH + defined_for = StateCode.FL + reference = "https://www.myflfamilies.com/sites/default/files/2025-05/Appendix%20A-12%20-%20State%20Funded%20Programs%20Eligibility%20Standards.pdf" + + def formula(person, period, parameters): + joint_claim = person("ssi_claim_is_joint", period) + both_ssi_eligible = ( + person.marital_unit.sum(person("is_ssi_eligible", period)) + == person.marital_unit.nb_persons() + ) + living_arrangement = person("fl_oss_living_arrangement", period) + in_facility = living_arrangement != living_arrangement.possible_values.NONE + both_in_facility = ( + person.marital_unit.sum(in_facility) == person.marital_unit.nb_persons() + ) + return joint_claim & both_ssi_eligible & both_in_facility diff --git a/policyengine_us/variables/gov/states/fl/dcf/oss/fl_oss_eligible.py b/policyengine_us/variables/gov/states/fl/dcf/oss/fl_oss_eligible.py index 4bf88c40902..45b4bd8313b 100644 --- a/policyengine_us/variables/gov/states/fl/dcf/oss/fl_oss_eligible.py +++ b/policyengine_us/variables/gov/states/fl/dcf/oss/fl_oss_eligible.py @@ -19,22 +19,18 @@ def formula(person, period, parameters): LA = living_arrangement.possible_values in_facility = living_arrangement != LA.NONE in_medicaid_facility = living_arrangement == LA.MEDICAID_FACILITY - # Medicaid facility: only requires SSI eligibility + facility - # Community care: also requires valid program track + income check + # Community care requires a valid program track program_track = person("fl_oss_program_track", period) has_track = program_track != program_track.possible_values.NONE is_protected = program_track == program_track.possible_values.PROTECTED track_valid = where(is_protected, p.protected.in_effect, has_track) - # Coverage Group 1: SSI recipients - receives_ssi = person("uncapped_ssi", period) > 0 - # Coverage Group 2: non-SSI recipients within income standard + # Medicaid facility has no track requirement + track_ok = where(in_medicaid_facility, True, track_valid) + # FAC 65A-2.033(1): "receiving SSI checks" + receives_ssi = person("ssi", period) > 0 + # FAC 65A-2.033(2): meets all criteria except income ≤ income standard income_standard = person("fl_oss_income_standard", period) countable_income = person("ssi_countable_income", period) income_within_standard = countable_income <= income_standard income_eligible = receives_ssi | income_within_standard - community_eligible = track_valid & income_eligible - return ( - categorically_eligible - & in_facility - & where(in_medicaid_facility, receives_ssi, community_eligible) - ) + return categorically_eligible & in_facility & track_ok & income_eligible diff --git a/policyengine_us/variables/gov/states/fl/dcf/oss/fl_oss_max_oss.py b/policyengine_us/variables/gov/states/fl/dcf/oss/fl_oss_max_oss.py index d6dca602a02..7fbd1c82ebc 100644 --- a/policyengine_us/variables/gov/states/fl/dcf/oss/fl_oss_max_oss.py +++ b/policyengine_us/variables/gov/states/fl/dcf/oss/fl_oss_max_oss.py @@ -14,7 +14,7 @@ def formula(person, period, parameters): p = parameters(period).gov.states.fl.dcf.oss track = person("fl_oss_program_track", period) is_redesign = track == track.possible_values.REDESIGN - joint_claim = person("ssi_claim_is_joint", period) + couple_rate_applies = person("fl_oss_couple_rate_applies", period) if p.protected.in_effect: individual_cap = where( is_redesign, @@ -29,4 +29,4 @@ def formula(person, period, parameters): else: individual_cap = p.redesign.max_oss.individual couple_cap = p.redesign.max_oss.couple - return where(joint_claim, couple_cap / 2, individual_cap) + return where(couple_rate_applies, couple_cap / 2, individual_cap) diff --git a/policyengine_us/variables/gov/states/fl/dcf/oss/fl_oss_provider_rate.py b/policyengine_us/variables/gov/states/fl/dcf/oss/fl_oss_provider_rate.py index 398ef126047..57030cb70ed 100644 --- a/policyengine_us/variables/gov/states/fl/dcf/oss/fl_oss_provider_rate.py +++ b/policyengine_us/variables/gov/states/fl/dcf/oss/fl_oss_provider_rate.py @@ -24,6 +24,6 @@ def formula(person, period, parameters): else: offset = p.redesign.provider_rate_offset individual_rate = fbr_individual + offset - joint_claim = person("ssi_claim_is_joint", period) + couple_rate_applies = person("fl_oss_couple_rate_applies", period) couple_rate = 2 * individual_rate - p.couple_provider_rate_reduction - return where(joint_claim, couple_rate / 2, individual_rate) + return where(couple_rate_applies, couple_rate / 2, individual_rate) From 224226d440dff66a55e12534c7b5ff413417012c Mon Sep 17 00:00:00 2001 From: Ziming Date: Wed, 15 Apr 2026 01:39:31 -0400 Subject: [PATCH 09/14] Add tests for fl_oss_living_arrangement and fl_oss_couple_rate_applies Co-Authored-By: Claude Opus 4.6 (1M context) --- .../dcf/oss/fl_oss_couple_rate_applies.yaml | 158 ++++++++++++++++++ .../fl/dcf/oss/fl_oss_living_arrangement.yaml | 108 ++++++++++++ 2 files changed, 266 insertions(+) create mode 100644 policyengine_us/tests/policy/baseline/gov/states/fl/dcf/oss/fl_oss_couple_rate_applies.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/fl/dcf/oss/fl_oss_living_arrangement.yaml diff --git a/policyengine_us/tests/policy/baseline/gov/states/fl/dcf/oss/fl_oss_couple_rate_applies.yaml b/policyengine_us/tests/policy/baseline/gov/states/fl/dcf/oss/fl_oss_couple_rate_applies.yaml new file mode 100644 index 00000000000..5f788905acb --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/fl/dcf/oss/fl_oss_couple_rate_applies.yaml @@ -0,0 +1,158 @@ +# Tests for fl_oss_couple_rate_applies variable. +# Couple rate requires: ssi_claim_is_joint AND both spouses is_ssi_eligible +# AND both spouses in a qualifying facility (living_arrangement != NONE). + +- name: Case 1, both spouses eligible and in facility, couple rate applies. + period: 2025-01 + input: + people: + person1: + fl_oss_community_care_type: ALF + age: 70 + is_ssi_eligible: true + ssi_claim_is_joint: true + person2: + fl_oss_community_care_type: ALF + age: 68 + is_ssi_eligible: true + ssi_claim_is_joint: true + marital_units: + marital_unit: + members: [person1, person2] + tax_units: + tax_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: FL + output: + fl_oss_couple_rate_applies: [true, true] + +- name: Case 2, one spouse not SSI eligible, couple rate does not apply. + period: 2025-01 + input: + people: + person1: + fl_oss_community_care_type: ALF + age: 70 + is_ssi_eligible: true + ssi_claim_is_joint: false + person2: + fl_oss_community_care_type: ALF + age: 40 + is_ssi_eligible: false + ssi_claim_is_joint: false + marital_units: + marital_unit: + members: [person1, person2] + tax_units: + tax_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: FL + output: + fl_oss_couple_rate_applies: [false, false] + +- name: Case 3, one spouse not in facility, couple rate does not apply. + period: 2025-01 + input: + people: + person1: + fl_oss_community_care_type: ALF + age: 70 + is_ssi_eligible: true + ssi_claim_is_joint: true + person2: + age: 68 + is_ssi_eligible: true + ssi_claim_is_joint: true + # No facility type → living arrangement = NONE + marital_units: + marital_unit: + members: [person1, person2] + tax_units: + tax_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: FL + output: + fl_oss_couple_rate_applies: [false, false] + +- name: Case 4, single person, couple rate does not apply. + period: 2025-01 + input: + people: + person1: + fl_oss_community_care_type: ALF + age: 70 + is_ssi_eligible: true + ssi_claim_is_joint: false + households: + household: + members: [person1] + state_code: FL + output: + fl_oss_couple_rate_applies: [false] + +- name: Case 5, both in Medicaid facility, couple rate applies. + period: 2025-01 + input: + people: + person1: + age: 72 + is_ssi_eligible: true + ssi_claim_is_joint: true + ssi_lives_in_medical_treatment_facility: true + ssi_medicaid_pays_majority_of_care: true + person2: + age: 68 + is_ssi_eligible: true + ssi_claim_is_joint: true + ssi_lives_in_medical_treatment_facility: true + ssi_medicaid_pays_majority_of_care: true + marital_units: + marital_unit: + members: [person1, person2] + tax_units: + tax_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: FL + output: + fl_oss_couple_rate_applies: [true, true] + +- name: Case 6, mixed arrangement, one ALF one Medicaid facility, couple rate applies. + period: 2025-01 + input: + people: + person1: + fl_oss_community_care_type: ALF + age: 70 + is_ssi_eligible: true + ssi_claim_is_joint: true + person2: + age: 68 + is_ssi_eligible: true + ssi_claim_is_joint: true + ssi_lives_in_medical_treatment_facility: true + ssi_medicaid_pays_majority_of_care: true + marital_units: + marital_unit: + members: [person1, person2] + tax_units: + tax_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: FL + output: + # Both in qualifying facilities (ALF and Medicaid), both SSI eligible. + fl_oss_couple_rate_applies: [true, true] diff --git a/policyengine_us/tests/policy/baseline/gov/states/fl/dcf/oss/fl_oss_living_arrangement.yaml b/policyengine_us/tests/policy/baseline/gov/states/fl/dcf/oss/fl_oss_living_arrangement.yaml new file mode 100644 index 00000000000..77ceb01fa3d --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/fl/dcf/oss/fl_oss_living_arrangement.yaml @@ -0,0 +1,108 @@ +# Tests for fl_oss_living_arrangement variable. +# Formula derives from federal ssi_federal_living_arrangement (Medicaid facility) +# and state fl_oss_community_care_type (ALF, AFCH, MHRTF). + +- name: Case 1, ALF community care type maps to ALF. + period: 2025-01 + input: + people: + person1: + fl_oss_community_care_type: ALF + age: 70 + households: + household: + members: [person1] + state_code: FL + output: + fl_oss_living_arrangement: ALF + +- name: Case 2, AFCH community care type maps to AFCH. + period: 2025-01 + input: + people: + person1: + fl_oss_community_care_type: AFCH + age: 70 + households: + household: + members: [person1] + state_code: FL + output: + fl_oss_living_arrangement: AFCH + +- name: Case 3, MHRTF community care type maps to MHRTF. + period: 2025-01 + input: + people: + person1: + fl_oss_community_care_type: MHRTF + age: 45 + households: + household: + members: [person1] + state_code: FL + output: + fl_oss_living_arrangement: MHRTF + +- name: Case 4, no facility defaults to NONE. + period: 2025-01 + input: + people: + person1: + age: 70 + households: + household: + members: [person1] + state_code: FL + output: + fl_oss_living_arrangement: NONE + +- name: Case 5, federal Code D derives MEDICAID_FACILITY. + period: 2025-01 + input: + people: + person1: + age: 70 + ssi_lives_in_medical_treatment_facility: true + ssi_medicaid_pays_majority_of_care: true + households: + household: + members: [person1] + state_code: FL + output: + fl_oss_living_arrangement: MEDICAID_FACILITY + +- name: Case 6, federal Code D takes priority over community care type. + period: 2025-01 + input: + people: + person1: + age: 70 + ssi_lives_in_medical_treatment_facility: true + ssi_medicaid_pays_majority_of_care: true + fl_oss_community_care_type: ALF + households: + household: + members: [person1] + state_code: FL + output: + # Federal Medicaid facility detection overrides state community care input. + fl_oss_living_arrangement: MEDICAID_FACILITY + +- name: Case 7, medical facility without Medicaid paying majority is not Code D. + period: 2025-01 + input: + people: + person1: + age: 70 + ssi_lives_in_medical_treatment_facility: true + ssi_medicaid_pays_majority_of_care: false + households: + household: + members: [person1] + state_code: FL + output: + # Without Medicaid paying majority of care, federal living arrangement + # is not MEDICAL_TREATMENT_FACILITY, so falls through to community care + # type (default NONE). + fl_oss_living_arrangement: NONE From 100ed4c114cf3d3a03c37e52d66bb049c1b3e516 Mon Sep 17 00:00:00 2001 From: Ziming Date: Wed, 15 Apr 2026 01:43:19 -0400 Subject: [PATCH 10/14] Fix review items: broken URLs, duplicate date, description/label cleanup MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Update 404 Appendix A-12 URL in 3 variable files (2024-10 → 2025-05) - Remove duplicate date entry in redesign/provider_rate_offset.yaml - Remove value annotations from reference titles in max_oss files - Fix descriptions: use allowed verbs and "this indicator" pattern - Spell out PNA acronym in label Co-Authored-By: Claude Opus 4.6 (1M context) --- .../gov/states/fl/dcf/oss/couple_provider_rate_reduction.yaml | 2 +- .../parameters/gov/states/fl/dcf/oss/protected/in_effect.yaml | 2 +- .../states/fl/dcf/oss/redesign/income_standard_pna_offset.yaml | 2 +- .../gov/states/fl/dcf/oss/redesign/max_oss/couple.yaml | 2 +- .../gov/states/fl/dcf/oss/redesign/max_oss/individual.yaml | 2 +- .../gov/states/fl/dcf/oss/redesign/provider_rate_offset.yaml | 1 - .../variables/gov/states/fl/dcf/oss/fl_oss_income_standard.py | 2 +- .../variables/gov/states/fl/dcf/oss/fl_oss_max_oss.py | 2 +- .../variables/gov/states/fl/dcf/oss/fl_oss_provider_rate.py | 2 +- 9 files changed, 8 insertions(+), 9 deletions(-) diff --git a/policyengine_us/parameters/gov/states/fl/dcf/oss/couple_provider_rate_reduction.yaml b/policyengine_us/parameters/gov/states/fl/dcf/oss/couple_provider_rate_reduction.yaml index f941868b31d..3f1925e613f 100644 --- a/policyengine_us/parameters/gov/states/fl/dcf/oss/couple_provider_rate_reduction.yaml +++ b/policyengine_us/parameters/gov/states/fl/dcf/oss/couple_provider_rate_reduction.yaml @@ -1,4 +1,4 @@ -description: Florida reduces the couple provider rate by this amount under the Optional State Supplementation program. +description: Florida deducts this amount from the couple provider rate under the Optional State Supplementation program. values: 2011-01-01: 0 2024-07-01: 73 diff --git a/policyengine_us/parameters/gov/states/fl/dcf/oss/protected/in_effect.yaml b/policyengine_us/parameters/gov/states/fl/dcf/oss/protected/in_effect.yaml index 5f1d3247fe2..364800ebef4 100644 --- a/policyengine_us/parameters/gov/states/fl/dcf/oss/protected/in_effect.yaml +++ b/policyengine_us/parameters/gov/states/fl/dcf/oss/protected/in_effect.yaml @@ -1,4 +1,4 @@ -description: Whether Florida's OSS Protected program track is in effect. The Protected track (RTF not enrolled for ACS + 2001 Gap Group) was introduced as part of the OSS Redesign restructuring; the exact start date is unknown but documented from July 2024 onward. +description: Florida uses this indicator to determine whether the Protected program track applies under the Optional State Supplementation program. values: 2011-01-01: false 2024-07-01: true diff --git a/policyengine_us/parameters/gov/states/fl/dcf/oss/redesign/income_standard_pna_offset.yaml b/policyengine_us/parameters/gov/states/fl/dcf/oss/redesign/income_standard_pna_offset.yaml index 275084eebbe..008093f7aed 100644 --- a/policyengine_us/parameters/gov/states/fl/dcf/oss/redesign/income_standard_pna_offset.yaml +++ b/policyengine_us/parameters/gov/states/fl/dcf/oss/redesign/income_standard_pna_offset.yaml @@ -5,7 +5,7 @@ values: metadata: unit: currency-USD period: month - label: Florida OSS Redesign income standard PNA offset + label: Florida OSS Redesign income standard personal needs allowance offset reference: - title: SSA State Assistance Programs for SSI Recipients, January 2011 - Florida, Table 1 href: https://www.ssa.gov/policy/docs/progdesc/ssi_st_asst/2011/fl.html diff --git a/policyengine_us/parameters/gov/states/fl/dcf/oss/redesign/max_oss/couple.yaml b/policyengine_us/parameters/gov/states/fl/dcf/oss/redesign/max_oss/couple.yaml index 5d5a11cd588..8eceec6bfeb 100644 --- a/policyengine_us/parameters/gov/states/fl/dcf/oss/redesign/max_oss/couple.yaml +++ b/policyengine_us/parameters/gov/states/fl/dcf/oss/redesign/max_oss/couple.yaml @@ -8,7 +8,7 @@ metadata: period: month label: Florida OSS Redesign maximum couple payment reference: - - title: SSA State Assistance Programs for SSI Recipients, January 2011 - Florida, Table 1 ($156.80 value only) + - title: SSA State Assistance Programs for SSI Recipients, January 2011 - Florida, Table 1 href: https://www.ssa.gov/policy/docs/progdesc/ssi_st_asst/2011/fl.html - title: FL DCF Appendix A-12, Optional State Supplementation Payment Standards href: https://www.myflfamilies.com/sites/default/files/2025-05/Appendix%20A-12%20-%20State%20Funded%20Programs%20Eligibility%20Standards.pdf diff --git a/policyengine_us/parameters/gov/states/fl/dcf/oss/redesign/max_oss/individual.yaml b/policyengine_us/parameters/gov/states/fl/dcf/oss/redesign/max_oss/individual.yaml index dd7fb27458e..5124b88bd3c 100644 --- a/policyengine_us/parameters/gov/states/fl/dcf/oss/redesign/max_oss/individual.yaml +++ b/policyengine_us/parameters/gov/states/fl/dcf/oss/redesign/max_oss/individual.yaml @@ -8,7 +8,7 @@ metadata: period: month label: Florida OSS Redesign maximum individual payment reference: - - title: SSA State Assistance Programs for SSI Recipients, January 2011 - Florida, Table 1 ($78.40 value only) + - title: SSA State Assistance Programs for SSI Recipients, January 2011 - Florida, Table 1 href: https://www.ssa.gov/policy/docs/progdesc/ssi_st_asst/2011/fl.html - title: FL DCF Appendix A-12, Optional State Supplementation Payment Standards href: https://www.myflfamilies.com/sites/default/files/2025-05/Appendix%20A-12%20-%20State%20Funded%20Programs%20Eligibility%20Standards.pdf diff --git a/policyengine_us/parameters/gov/states/fl/dcf/oss/redesign/provider_rate_offset.yaml b/policyengine_us/parameters/gov/states/fl/dcf/oss/redesign/provider_rate_offset.yaml index 3c7c95af78f..fbbf10e3ea1 100644 --- a/policyengine_us/parameters/gov/states/fl/dcf/oss/redesign/provider_rate_offset.yaml +++ b/policyengine_us/parameters/gov/states/fl/dcf/oss/redesign/provider_rate_offset.yaml @@ -1,7 +1,6 @@ description: Florida sets this amount as the offset added to the federal SSI benefit rate to determine the Redesign provider rate under the Optional State Supplementation program. values: 2011-01-01: 24.4 - 2024-07-01: 24.4 metadata: unit: currency-USD diff --git a/policyengine_us/variables/gov/states/fl/dcf/oss/fl_oss_income_standard.py b/policyengine_us/variables/gov/states/fl/dcf/oss/fl_oss_income_standard.py index 46320e985ff..0ad1d6a30a5 100644 --- a/policyengine_us/variables/gov/states/fl/dcf/oss/fl_oss_income_standard.py +++ b/policyengine_us/variables/gov/states/fl/dcf/oss/fl_oss_income_standard.py @@ -8,7 +8,7 @@ class fl_oss_income_standard(Variable): unit = USD definition_period = MONTH defined_for = StateCode.FL - reference = "https://www.myflfamilies.com/sites/default/files/2024-10/Appendix%20A-12%20OSS%20Payment%20Standards.pdf" + reference = "https://www.myflfamilies.com/sites/default/files/2025-05/Appendix%20A-12%20-%20State%20Funded%20Programs%20Eligibility%20Standards.pdf" def formula(person, period, parameters): p = parameters(period).gov.states.fl.dcf.oss diff --git a/policyengine_us/variables/gov/states/fl/dcf/oss/fl_oss_max_oss.py b/policyengine_us/variables/gov/states/fl/dcf/oss/fl_oss_max_oss.py index 7fbd1c82ebc..888363d0281 100644 --- a/policyengine_us/variables/gov/states/fl/dcf/oss/fl_oss_max_oss.py +++ b/policyengine_us/variables/gov/states/fl/dcf/oss/fl_oss_max_oss.py @@ -8,7 +8,7 @@ class fl_oss_max_oss(Variable): unit = USD definition_period = MONTH defined_for = StateCode.FL - reference = "https://www.myflfamilies.com/sites/default/files/2024-10/Appendix%20A-12%20OSS%20Payment%20Standards.pdf" + reference = "https://www.myflfamilies.com/sites/default/files/2025-05/Appendix%20A-12%20-%20State%20Funded%20Programs%20Eligibility%20Standards.pdf" def formula(person, period, parameters): p = parameters(period).gov.states.fl.dcf.oss diff --git a/policyengine_us/variables/gov/states/fl/dcf/oss/fl_oss_provider_rate.py b/policyengine_us/variables/gov/states/fl/dcf/oss/fl_oss_provider_rate.py index 57030cb70ed..080a3c13263 100644 --- a/policyengine_us/variables/gov/states/fl/dcf/oss/fl_oss_provider_rate.py +++ b/policyengine_us/variables/gov/states/fl/dcf/oss/fl_oss_provider_rate.py @@ -8,7 +8,7 @@ class fl_oss_provider_rate(Variable): unit = USD definition_period = MONTH defined_for = StateCode.FL - reference = "https://www.myflfamilies.com/sites/default/files/2024-10/Appendix%20A-12%20OSS%20Payment%20Standards.pdf" + reference = "https://www.myflfamilies.com/sites/default/files/2025-05/Appendix%20A-12%20-%20State%20Funded%20Programs%20Eligibility%20Standards.pdf" def formula(person, period, parameters): p = parameters(period).gov.states.fl.dcf.oss From 03f7f5a2b15c17de54d58a723d0c109b69147637 Mon Sep 17 00:00:00 2001 From: Ziming Date: Wed, 15 Apr 2026 02:14:13 -0400 Subject: [PATCH 11/14] Fix Medicaid facility eligibility and simplify couple rate gate MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Medicaid facility: Group 1 only (ssi > 0), no Group 2 path — FAC 65A-2.036 defines no income standard for Medicaid facility residents - Simplify fl_oss_couple_rate_applies: rely on ssi_claim_is_joint for Title XIX separation (see #8003) instead of inline same_category check - Add integration Cases 12-14: Medicaid facility negative path, couple with SSI equal-split, and earnings with SSI exclusions - Fix couple_rate_applies Case 6: mixed ALF/Medicaid simulates fixed federal behavior per 20 CFR 416.1149 Co-Authored-By: Claude Opus 4.6 (1M context) --- .../dcf/oss/fl_oss_couple_rate_applies.yaml | 12 +- .../gov/states/fl/dcf/oss/integration.yaml | 316 ++++++++++-------- .../fl/dcf/oss/fl_oss_couple_rate_applies.py | 5 + .../gov/states/fl/dcf/oss/fl_oss_eligible.py | 22 +- 4 files changed, 198 insertions(+), 157 deletions(-) diff --git a/policyengine_us/tests/policy/baseline/gov/states/fl/dcf/oss/fl_oss_couple_rate_applies.yaml b/policyengine_us/tests/policy/baseline/gov/states/fl/dcf/oss/fl_oss_couple_rate_applies.yaml index 5f788905acb..3a60a241f7e 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/fl/dcf/oss/fl_oss_couple_rate_applies.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/fl/dcf/oss/fl_oss_couple_rate_applies.yaml @@ -128,7 +128,7 @@ output: fl_oss_couple_rate_applies: [true, true] -- name: Case 6, mixed arrangement, one ALF one Medicaid facility, couple rate applies. +- name: Case 6, mixed arrangement, one ALF one Medicaid facility, no couple rate. period: 2025-01 input: people: @@ -136,11 +136,13 @@ fl_oss_community_care_type: ALF age: 70 is_ssi_eligible: true - ssi_claim_is_joint: true + # Per 20 CFR 416.1149 (see #8003), SSI stops treating the + # couple as married when one enters a Title XIX institution. + ssi_claim_is_joint: false person2: age: 68 is_ssi_eligible: true - ssi_claim_is_joint: true + ssi_claim_is_joint: false ssi_lives_in_medical_treatment_facility: true ssi_medicaid_pays_majority_of_care: true marital_units: @@ -154,5 +156,5 @@ members: [person1, person2] state_code: FL output: - # Both in qualifying facilities (ALF and Medicaid), both SSI eligible. - fl_oss_couple_rate_applies: [true, true] + # ssi_claim_is_joint = false → couple rate does not apply. + fl_oss_couple_rate_applies: [false, false] diff --git a/policyengine_us/tests/policy/baseline/gov/states/fl/dcf/oss/integration.yaml b/policyengine_us/tests/policy/baseline/gov/states/fl/dcf/oss/integration.yaml index dfe5fc7ec86..565724a26a4 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/fl/dcf/oss/integration.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/fl/dcf/oss/integration.yaml @@ -1,20 +1,14 @@ # Integration tests for Florida OSS (Optional State Supplementation). -# Verifies intermediate and final values across the full calculation pipeline. +# Uses real income sources and verifies the full federal SSI → state OSS chain. -- name: Case 1, SSI recipient in ALF (Redesign), individual, income $800/month. +- name: Case 1, SSI recipient in ALF (Redesign), $800/month Social Security. period: 2025-01 absolute_error_margin: 0.01 input: people: person1: age: 70 - is_ssi_eligible: true - ssi_claim_is_joint: false - # SSI FBR (I) 2025 = $967/month. Income = $800/month. - # uncapped_ssi = ($967 - $800) * 12 = $167 * 12 = $2,004/year. - uncapped_ssi: 2_004 - # $800/month * 12 = $9,600/year. - ssi_countable_income: 9_600 + social_security: 9_600 fl_oss_community_care_type: ALF fl_oss_program_track: REDESIGN households: @@ -22,39 +16,32 @@ members: [person1] state_code: FL output: + # Federal SSI: $800 - $20 general exclusion = $780 countable. + # SSI = $967 FBR - $780 = $187/month. + is_ssi_eligible: [true] + ssi_countable_income: [780] + ssi: [187] + # State OSS: provider rate $991.40 + PNA $160 = $1,151.40 total needs. + # OSS = min(max($1,151.40 - $780, 0), $184.40) = min($371.40, $184.40) = $184.40. fl_oss_eligible: [true] - # Provider rate (I, Redesign) = $967 + $24.40 = $991.40/month. fl_oss_provider_rate: [991.40] - # Income standard (I, Redesign) = $991.40 + $54 = $1,045.40/month. fl_oss_income_standard: [1_045.40] - # Max OSS (Redesign, I) = $184.40/month. fl_oss_max_oss: [184.40] - # Calculated = ($1,151.40 - $800) = $351.40/month → capped at $184.40. - # OSS = min($351.40, $184.40) = $184.40/month. fl_oss: [184.40] -- name: Case 2, SSI recipient in AFCH (Redesign), couple, both eligible, income $1,500/month combined. +- name: Case 2, couple in AFCH (Redesign), $600/month Social Security each. period: 2025-01 absolute_error_margin: 0.01 input: people: person1: age: 72 - is_ssi_eligible: true - ssi_claim_is_joint: true - # Couple SSI: each spouse has $600/month countable income. - # SSI FBR couple 2025 = $1,450/month. Per person = $725/month = $8,700/year. - # uncapped_ssi per person = $8,700 - $7,200 = $1,500/year > 0 → SSI recipients. - uncapped_ssi: 1_500 - ssi_countable_income: 7_200 + social_security: 7_200 fl_oss_community_care_type: AFCH fl_oss_program_track: REDESIGN person2: age: 68 - is_ssi_eligible: true - ssi_claim_is_joint: true - uncapped_ssi: 1_500 - ssi_countable_income: 7_200 + social_security: 7_200 fl_oss_community_care_type: AFCH fl_oss_program_track: REDESIGN marital_units: @@ -68,39 +55,28 @@ members: [person1, person2] state_code: FL output: + # Federal SSI (couple): each $600 - $10 exclusion = $590 countable. + # SSI per person = $725 (half couple FBR $1,450) - $590 = $135/month. + is_ssi_eligible: [true, true] + ssi_countable_income: [590, 590] + ssi: [135, 135] + # State OSS: couple provider rate = 2 * $991.40 - $97 = $1,885.80. + # Per person = $942.90. Total needs = $942.90 + $160 = $1,102.90. + # OSS per person = min(max($1,102.90 - $590, 0), $193.40) = $193.40. fl_oss_eligible: [true, true] - # Couple provider rate (Redesign) = 2 * $991.40 - $97 = $1,885.80/month. - # Per person = $1,885.80 / 2 = $942.90/month. + fl_oss_couple_rate_applies: [true, true] fl_oss_provider_rate: [942.90, 942.90] - # Couple income standard (Redesign) = $1,885.80 + 2 * $54 = $1,993.80/month. - # Per person = $1,993.80 / 2 = $996.90/month. - fl_oss_income_standard: [996.90, 996.90] - # Couple max OSS (Redesign) = $386.80/month. - # Per person = $386.80 / 2 = $193.40/month. fl_oss_max_oss: [193.40, 193.40] - # Per person: total_needs = $1,102.90, countable_income = $600/month. - # Calculated = $1,102.90 - $600 = $502.90/month. - # Capped at $193.40/month per person. - # OSS per person = $193.40/month. fl_oss: [193.40, 193.40] -- name: Case 3, Group 2 non-SSI recipient with income just below Redesign income standard. +- name: Case 3, Group 2 non-SSI recipient, $1,000/month Social Security. period: 2025-01 absolute_error_margin: 0.01 input: people: person1: age: 70 - is_ssi_eligible: true - ssi_claim_is_joint: false - # Not SSI recipient (income above FBR), but within OSS income standard. - # Income = $1,040/month. SSI FBR = $967/month. - # uncapped_ssi = ($967 - $1,040) * 12 = -$73 * 12 = -$876 < 0 → not SSI recipient. - uncapped_ssi: -876 - # $1,040/month * 12 = $12,480/year. - # Income standard (Redesign, I) = $1,045.40/month = $12,544.80/year. - # $12,480 < $12,544.80 → Group 2 eligible. - ssi_countable_income: 12_480 + social_security: 12_000 fl_oss_community_care_type: ALF fl_oss_program_track: REDESIGN households: @@ -108,30 +84,24 @@ members: [person1] state_code: FL output: + # Federal SSI: $1,000 - $20 = $980 countable > $967 FBR → SSI = $0. + # But $980 < income standard $1,045.40 → Group 2 eligible. + is_ssi_eligible: [true] + ssi_countable_income: [980] + ssi: [0] fl_oss_eligible: [true] - fl_oss_provider_rate: [991.40] fl_oss_income_standard: [1_045.40] - fl_oss_max_oss: [184.40] - # Total needs = $1,151.40/month. Income = $1,040/month. - # Calculated = $1,151.40 - $1,040 = $111.40/month. - # Max = $184.40/month. $111.40 < $184.40 → not capped. - # OSS = $111.40/month. - fl_oss: [111.40] + # OSS = min(max($1,151.40 - $980, 0), $184.40) = min($171.40, $184.40) = $171.40. + fl_oss: [171.40] -- name: Case 4, income above income standard, zero benefit. +- name: Case 4, income above income standard, ineligible. period: 2025-01 absolute_error_margin: 0.01 input: people: person1: age: 70 - is_ssi_eligible: true - ssi_claim_is_joint: false - # Income = $1,100/month > income standard of $1,045.40. - # uncapped_ssi = ($967 - $1,100) * 12 = -$1,596 → not SSI recipient. - # Income > income standard → not Group 2 either → ineligible. - uncapped_ssi: -1_596 - ssi_countable_income: 13_200 + social_security: 13_200 fl_oss_community_care_type: ALF fl_oss_program_track: REDESIGN households: @@ -139,23 +109,23 @@ members: [person1] state_code: FL output: + # $1,100 - $20 = $1,080 countable > $1,045.40 standard → ineligible. + # SSI = $0 (income > FBR). Not Group 1 or Group 2. + is_ssi_eligible: [true] + ssi_countable_income: [1_080] + ssi: [0] fl_oss_eligible: [false] fl_oss: [0] -- name: Case 5, SSI recipient in RTF (Protected track), individual, larger benefit. +- name: Case 5, disabled person in MHRTF (Protected), $700/month Social Security. period: 2025-01 absolute_error_margin: 0.01 input: people: person1: age: 45 - is_ssi_eligible: true - ssi_claim_is_joint: false - # Disabled person in RTF not enrolled for ACS → Protected track. - # Income = $700/month. FBR = $967. - # uncapped_ssi = ($967 - $700) * 12 = $267 * 12 = $3,204 > 0 → SSI recipient. - uncapped_ssi: 3_204 - ssi_countable_income: 8_400 + is_disabled: true + social_security: 8_400 fl_oss_community_care_type: MHRTF fl_oss_program_track: PROTECTED households: @@ -163,59 +133,48 @@ members: [person1] state_code: FL output: + # Federal SSI: $700 - $20 = $680 countable. + # SSI = $967 - $680 = $287/month. + is_ssi_eligible: [true] + ssi_countable_income: [680] + ssi: [287] + # State OSS (Protected): provider rate $1,152 + PNA $160 = $1,312. + # OSS = min(max($1,312 - $680, 0), $345) = min($632, $345) = $345. fl_oss_eligible: [true] - # Protected provider rate (I) = $967 + $185 = $1,152/month. fl_oss_provider_rate: [1_152] - # Protected income standard = provider rate = $1,152/month. - fl_oss_income_standard: [1_152] - # Max OSS (Protected, I) = $345/month. fl_oss_max_oss: [345] - # Calculated = $1,312 - $700 = $612/month → capped at $345. - # OSS = $345/month. fl_oss: [345] -- name: Case 6, person not in facility, zero benefit. +- name: Case 6, SSI-eligible but no facility, not OSS eligible. period: 2025-01 absolute_error_margin: 0.01 input: people: person1: age: 70 - is_ssi_eligible: true - ssi_claim_is_joint: false - uncapped_ssi: 2_004 - ssi_countable_income: 9_600 - # No facility → no OSS for independent living. - fl_oss_community_care_type: NONE - fl_oss_program_track: NONE + social_security: 9_600 households: household: members: [person1] state_code: FL output: + is_ssi_eligible: [true] + ssi: [187] fl_oss_eligible: [false] fl_oss: [0] -- name: Case 7, asymmetric couple, one eligible one not, individual rates apply. +- name: Case 7, asymmetric couple, one eligible one not, individual rates. period: 2025-01 absolute_error_margin: 0.01 input: people: person1: age: 70 - is_ssi_eligible: true - ssi_claim_is_joint: false - uncapped_ssi: 2_004 - ssi_countable_income: 9_600 + social_security: 9_600 fl_oss_community_care_type: ALF fl_oss_program_track: REDESIGN person2: age: 40 - # Not SSI eligible (not aged/blind/disabled). - is_ssi_eligible: false - ssi_claim_is_joint: false - uncapped_ssi: 0 - ssi_countable_income: 0 fl_oss_community_care_type: ALF fl_oss_program_track: REDESIGN marital_units: @@ -229,32 +188,23 @@ members: [person1, person2] state_code: FL output: - # Person1 is eligible (SSI recipient, in facility). - # Person2 is NOT eligible (not SSI eligible). - # Since ssi_claim_is_joint = false, individual rates apply. + # Person2 is not aged/blind/disabled → not SSI eligible. + # fl_oss_couple_rate_applies = false (both must be is_ssi_eligible). + # Person1 gets individual rates. + is_ssi_eligible: [true, false] + fl_oss_couple_rate_applies: [false, false] fl_oss_eligible: [true, false] - # Provider rate and max OSS compute for all FL residents (defined_for = StateCode.FL). - # Person1: individual provider rate = $991.40/month. - # Person2: also gets $991.40 (computed but unused since ineligible). fl_oss_provider_rate: [991.40, 991.40] - fl_oss_max_oss: [184.40, 184.40] - # Person1 OSS: min(max(0, $1,151.40 - $800), $184.40) = $184.40/month. - # Person2 OSS: $0 (ineligible, defined_for = "fl_oss_eligible" filters). fl_oss: [184.40, 0] -- name: Case 8, 2024-01 period, before PNA change (PNA = $54). +- name: Case 8, 2024-01, before PNA change, $700/month Social Security. period: 2024-01 absolute_error_margin: 0.01 input: people: person1: age: 70 - is_ssi_eligible: true - ssi_claim_is_joint: false - # SSI FBR (I) 2024 = $943/month. - # Income = $700/month. uncapped_ssi = ($943 - $700) * 12 = $2,916/year. - uncapped_ssi: 2_916 - ssi_countable_income: 8_400 + social_security: 8_400 fl_oss_community_care_type: ALF fl_oss_program_track: REDESIGN households: @@ -262,30 +212,27 @@ members: [person1] state_code: FL output: - # Before Jul 2024: PNA = $54, Redesign offset = $24.40. - # Provider rate (I) = $943 + $24.40 = $967.40/month. + # Federal SSI 2024: FBR $943. $700 - $20 = $680 countable. + # SSI = $943 - $680 = $263/month. + is_ssi_eligible: [true] + ssi_countable_income: [680] + ssi: [263] + # Pre-Jul 2024: PNA = $54, max OSS = $78.40. + # Provider rate = $943 + $24.40 = $967.40. fl_oss_provider_rate: [967.40] - # Income standard (Redesign) = $967.40 + $54 = $1,021.40/month. fl_oss_income_standard: [1_021.40] - # Max OSS (Redesign, I pre-Jul 2024) = $78.40/month. fl_oss_max_oss: [78.40] - # Calculated = $1,021.40 - $700 = $321.40/month → capped at $78.40. - # OSS = $78.40/month. + # OSS = min(max($1,021.40 - $680, 0), $78.40) = $78.40. fl_oss: [78.40] -- name: Case 9, 2011 historical period, pre-restructuring single track. +- name: Case 9, 2011 historical, $500/month Social Security. period: 2011-01 absolute_error_margin: 0.01 input: people: person1: age: 70 - is_ssi_eligible: true - ssi_claim_is_joint: false - # SSI FBR (I) 2011 = $674/month. - # Income = $500/month. uncapped_ssi = ($674 - $500) * 12 = $2,088/year. - uncapped_ssi: 2_088 - ssi_countable_income: 6_000 + social_security: 6_000 fl_oss_community_care_type: ALF fl_oss_program_track: REDESIGN households: @@ -293,16 +240,16 @@ members: [person1] state_code: FL output: - fl_oss_eligible: [true] - # 2011 values (pre-restructuring): Redesign offset = $24.40, PNA = $54. - # Provider rate (I) = $674 + $24.40 = $698.40/month. + # Federal SSI 2011: FBR $674. $500 - $20 = $480 countable. + # SSI = $674 - $480 = $194/month. + is_ssi_eligible: [true] + ssi_countable_income: [480] + ssi: [194] + # 2011: offset $24.40, PNA $54, max OSS $78.40. fl_oss_provider_rate: [698.40] - # Income standard (Redesign) = $698.40 + $54 = $752.40/month. fl_oss_income_standard: [752.40] - # Max OSS (Redesign, I, 2011) = $78.40/month. fl_oss_max_oss: [78.40] - # Calculated = $752.40 - $500 = $252.40/month → capped at $78.40. - # OSS = $78.40/month. + # OSS = min(max($752.40 - $480, 0), $78.40) = $78.40. fl_oss: [78.40] - name: Case 10, Medicaid facility individual, 2011, federal-state connection. @@ -312,10 +259,6 @@ people: person1: age: 70 - is_ssi_eligible: true - ssi_claim_is_joint: false - # Person is in a Medicaid facility (federal Code D). - # Federal SSI pays $30/month medical facility rate. ssi_lives_in_medical_treatment_facility: true ssi_medicaid_pays_majority_of_care: true households: @@ -323,15 +266,11 @@ members: [person1] state_code: FL output: - # Federal SSI: $30/month medical facility rate. - # ssi_amount_if_eligible = $30/month = $360/year. - # With $0 income, uncapped_ssi = $360/year. + # Federal SSI: $30/month medical facility rate (no other income). ssi: 30 - # Living arrangement derived from federal: - # ssi_federal_living_arrangement = MEDICAL_TREATMENT_FACILITY - # → fl_oss_living_arrangement = MEDICAID_FACILITY fl_oss_eligible: [true] - # State supplement: $5/month (flat, from SSA 2011 Table 1). + # State supplement: $5/month flat (SSA 2011 Table 1). + # Combined: $30 + $5 = $35/month. fl_oss: [5] - name: Case 11, Medicaid facility couple, 2011, federal-state connection. @@ -362,8 +301,97 @@ members: [person1, person2] state_code: FL output: - # Federal SSI: $30/month each (medical facility rate). + # Federal SSI: $30/month each. ssi: [30, 30] fl_oss_eligible: [true, true] - # State supplement: $10/month couple, $5/month per person. + # State supplement: $10/month couple = $5/month each. fl_oss: [5, 5] + +- name: Case 12, Medicaid facility with high income, no SSI, ineligible. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 70 + social_security: 12_000 + ssi_lives_in_medical_treatment_facility: true + ssi_medicaid_pays_majority_of_care: true + households: + household: + members: [person1] + state_code: FL + output: + # SSI medical facility rate = $30. Countable = $980 > $30 → SSI = $0. + # Medicaid facility requires Group 1 (ssi > 0) — no Group 2 path + # because FAC 65A-2.036 defines no income standard for Medicaid facility. + ssi: [0] + fl_oss_eligible: [false] + fl_oss: [0] + +- name: Case 13, couple with high combined income, SSI equal split. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 70 + social_security: 9_600 + fl_oss_community_care_type: ALF + fl_oss_program_track: REDESIGN + person2: + age: 68 + social_security: 13_200 + fl_oss_community_care_type: ALF + fl_oss_program_track: REDESIGN + marital_units: + marital_unit: + members: [person1, person2] + tax_units: + tax_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: FL + output: + # SSI couple: combined $1,900 - $20 exclusion = $1,880 countable. + # Per person = $940 (equal split). Couple FBR per person = $725. + # SSI = max($725 - $940, 0) = $0 each. Both fail Group 1. + is_ssi_eligible: [true, true] + ssi_countable_income: [940, 940] + ssi: [0, 0] + # Group 2: $940 < $996.90 (couple income standard) → both eligible. + # SSI equal-split ensures symmetric eligibility. + fl_oss_couple_rate_applies: [true, true] + fl_oss_eligible: [true, true] + fl_oss_provider_rate: [942.90, 942.90] + fl_oss_income_standard: [996.90, 996.90] + fl_oss_max_oss: [193.40, 193.40] + # OSS per person = min(max($1,102.90 - $940, 0), $193.40) = min($162.90, $193.40) = $162.90. + fl_oss: [162.90, 162.90] + +- name: Case 14, earnings with SSI earned income exclusions. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 70 + employment_income: 6_000 + fl_oss_community_care_type: ALF + fl_oss_program_track: REDESIGN + households: + household: + members: [person1] + state_code: FL + output: + # Earned: $500/month. SSI exclusions: $500 - $20 - $65 = $415. + # 50% of $415 = $207.50 countable. + # SSI = $967 - $207.50 = $759.50/month. + is_ssi_eligible: [true] + ssi_countable_income: [207.50] + ssi: [759.50] + fl_oss_eligible: [true] + # OSS = min(max($1,151.40 - $207.50, 0), $184.40) = $184.40. + fl_oss: [184.40] diff --git a/policyengine_us/variables/gov/states/fl/dcf/oss/fl_oss_couple_rate_applies.py b/policyengine_us/variables/gov/states/fl/dcf/oss/fl_oss_couple_rate_applies.py index 81e935727cb..bff8a750a81 100644 --- a/policyengine_us/variables/gov/states/fl/dcf/oss/fl_oss_couple_rate_applies.py +++ b/policyengine_us/variables/gov/states/fl/dcf/oss/fl_oss_couple_rate_applies.py @@ -10,6 +10,11 @@ class fl_oss_couple_rate_applies(Variable): reference = "https://www.myflfamilies.com/sites/default/files/2025-05/Appendix%20A-12%20-%20State%20Funded%20Programs%20Eligibility%20Standards.pdf" def formula(person, period, parameters): + # Requires: both spouses are an SSI eligible couple + # (ssi_claim_is_joint handles Title XIX separation per + # 20 CFR 416.1149 — see #8003), both pass SSI categorical + # eligibility (resources + immigration), and both reside + # in a qualifying OSS facility. joint_claim = person("ssi_claim_is_joint", period) both_ssi_eligible = ( person.marital_unit.sum(person("is_ssi_eligible", period)) diff --git a/policyengine_us/variables/gov/states/fl/dcf/oss/fl_oss_eligible.py b/policyengine_us/variables/gov/states/fl/dcf/oss/fl_oss_eligible.py index 45b4bd8313b..a3767224fb2 100644 --- a/policyengine_us/variables/gov/states/fl/dcf/oss/fl_oss_eligible.py +++ b/policyengine_us/variables/gov/states/fl/dcf/oss/fl_oss_eligible.py @@ -19,18 +19,24 @@ def formula(person, period, parameters): LA = living_arrangement.possible_values in_facility = living_arrangement != LA.NONE in_medicaid_facility = living_arrangement == LA.MEDICAID_FACILITY - # Community care requires a valid program track + # FAC 65A-2.033(1): "receiving SSI checks" + receives_ssi = person("ssi", period) > 0 + # Medicaid facility: Group 1 only (no income standard defined + # in FAC 65A-2.036 for Medicaid facility; the $30 medical + # facility SSI rate is the only payment path). + # Community care: Group 1 OR Group 2 (income ≤ income standard), + # plus requires a valid program track. program_track = person("fl_oss_program_track", period) has_track = program_track != program_track.possible_values.NONE is_protected = program_track == program_track.possible_values.PROTECTED track_valid = where(is_protected, p.protected.in_effect, has_track) - # Medicaid facility has no track requirement - track_ok = where(in_medicaid_facility, True, track_valid) - # FAC 65A-2.033(1): "receiving SSI checks" - receives_ssi = person("ssi", period) > 0 - # FAC 65A-2.033(2): meets all criteria except income ≤ income standard + # FAC 65A-2.033(2): income ≤ OSS income standard income_standard = person("fl_oss_income_standard", period) countable_income = person("ssi_countable_income", period) income_within_standard = countable_income <= income_standard - income_eligible = receives_ssi | income_within_standard - return categorically_eligible & in_facility & track_ok & income_eligible + community_eligible = track_valid & (receives_ssi | income_within_standard) + return ( + categorically_eligible + & in_facility + & where(in_medicaid_facility, receives_ssi, community_eligible) + ) From fba946489cf709a73c2fa14e4fcecd1b5036c077 Mon Sep 17 00:00:00 2001 From: Ziming Date: Tue, 21 Apr 2026 18:54:23 -0400 Subject: [PATCH 12/14] Remove Medicaid facility from FL OSS; register variable in programs.yaml FAC 65A-2.032/.033/.036 (current) cover only ALF, AFCH, and MHRTF. Medicaid facility is not an OSS coverage group. The $5/$10 supplement in the 2011 SSA report reflects an older FL program structure that has since been restructured; Medicaid institutional PNA is administered separately from OSS. Also: standardize Appendix A-12 URLs to the 2025-05 version; mark FL OSS as complete in programs.yaml with variable: fl_oss. --- .../medicaid_facility/supplement/couple.yaml | 11 --- .../supplement/individual.yaml | 11 --- policyengine_us/programs.yaml | 3 +- .../dcf/oss/fl_oss_couple_rate_applies.yaml | 42 ++-------- .../fl/dcf/oss/fl_oss_living_arrangement.yaml | 54 +------------ .../gov/states/fl/dcf/oss/integration.yaml | 81 +------------------ .../variables/gov/states/fl/dcf/oss/fl_oss.py | 16 +--- .../fl/dcf/oss/fl_oss_community_care_type.py | 2 +- .../gov/states/fl/dcf/oss/fl_oss_eligible.py | 16 ++-- .../fl/dcf/oss/fl_oss_living_arrangement.py | 12 +-- .../states/fl/dcf/oss/fl_oss_program_track.py | 2 +- 11 files changed, 21 insertions(+), 229 deletions(-) delete mode 100644 policyengine_us/parameters/gov/states/fl/dcf/oss/medicaid_facility/supplement/couple.yaml delete mode 100644 policyengine_us/parameters/gov/states/fl/dcf/oss/medicaid_facility/supplement/individual.yaml diff --git a/policyengine_us/parameters/gov/states/fl/dcf/oss/medicaid_facility/supplement/couple.yaml b/policyengine_us/parameters/gov/states/fl/dcf/oss/medicaid_facility/supplement/couple.yaml deleted file mode 100644 index 0f014b9df16..00000000000 --- a/policyengine_us/parameters/gov/states/fl/dcf/oss/medicaid_facility/supplement/couple.yaml +++ /dev/null @@ -1,11 +0,0 @@ -description: Florida provides this amount as the couple state supplement for Medicaid facility residents under the Optional State Supplementation program. -values: - 2011-01-01: 10 - -metadata: - unit: currency-USD - period: month - label: Florida OSS Medicaid facility couple supplement - reference: - - title: SSA State Assistance Programs for SSI Recipients, January 2011 - Florida, Table 1 - href: https://www.ssa.gov/policy/docs/progdesc/ssi_st_asst/2011/fl.html diff --git a/policyengine_us/parameters/gov/states/fl/dcf/oss/medicaid_facility/supplement/individual.yaml b/policyengine_us/parameters/gov/states/fl/dcf/oss/medicaid_facility/supplement/individual.yaml deleted file mode 100644 index 91fed03cc80..00000000000 --- a/policyengine_us/parameters/gov/states/fl/dcf/oss/medicaid_facility/supplement/individual.yaml +++ /dev/null @@ -1,11 +0,0 @@ -description: Florida provides this amount as the individual state supplement for Medicaid facility residents under the Optional State Supplementation program. -values: - 2011-01-01: 5 - -metadata: - unit: currency-USD - period: month - label: Florida OSS Medicaid facility individual supplement - reference: - - title: SSA State Assistance Programs for SSI Recipients, January 2011 - Florida, Table 1 - href: https://www.ssa.gov/policy/docs/progdesc/ssi_st_asst/2011/fl.html diff --git a/policyengine_us/programs.yaml b/policyengine_us/programs.yaml index 8e1dedf0f8f..801129254f1 100644 --- a/policyengine_us/programs.yaml +++ b/policyengine_us/programs.yaml @@ -619,9 +619,10 @@ programs: full_name: Delaware State Supplementary Payment variable: de_ssp - state: FL - status: in_progress + status: complete name: Florida OSS full_name: Florida Optional State Supplementation + variable: fl_oss - state: GA status: complete name: Georgia SSP diff --git a/policyengine_us/tests/policy/baseline/gov/states/fl/dcf/oss/fl_oss_couple_rate_applies.yaml b/policyengine_us/tests/policy/baseline/gov/states/fl/dcf/oss/fl_oss_couple_rate_applies.yaml index 3a60a241f7e..9ab525fbcb6 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/fl/dcf/oss/fl_oss_couple_rate_applies.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/fl/dcf/oss/fl_oss_couple_rate_applies.yaml @@ -99,22 +99,20 @@ output: fl_oss_couple_rate_applies: [false] -- name: Case 5, both in Medicaid facility, couple rate applies. +- name: Case 5, different facility types (ALF and MHRTF), couple rate applies. period: 2025-01 input: people: person1: + fl_oss_community_care_type: ALF age: 72 is_ssi_eligible: true ssi_claim_is_joint: true - ssi_lives_in_medical_treatment_facility: true - ssi_medicaid_pays_majority_of_care: true person2: - age: 68 + fl_oss_community_care_type: MHRTF + age: 50 is_ssi_eligible: true ssi_claim_is_joint: true - ssi_lives_in_medical_treatment_facility: true - ssi_medicaid_pays_majority_of_care: true marital_units: marital_unit: members: [person1, person2] @@ -126,35 +124,5 @@ members: [person1, person2] state_code: FL output: + # Both in OSS facilities (even if different types) → couple rate applies. fl_oss_couple_rate_applies: [true, true] - -- name: Case 6, mixed arrangement, one ALF one Medicaid facility, no couple rate. - period: 2025-01 - input: - people: - person1: - fl_oss_community_care_type: ALF - age: 70 - is_ssi_eligible: true - # Per 20 CFR 416.1149 (see #8003), SSI stops treating the - # couple as married when one enters a Title XIX institution. - ssi_claim_is_joint: false - person2: - age: 68 - is_ssi_eligible: true - ssi_claim_is_joint: false - ssi_lives_in_medical_treatment_facility: true - ssi_medicaid_pays_majority_of_care: true - marital_units: - marital_unit: - members: [person1, person2] - tax_units: - tax_unit: - members: [person1, person2] - households: - household: - members: [person1, person2] - state_code: FL - output: - # ssi_claim_is_joint = false → couple rate does not apply. - fl_oss_couple_rate_applies: [false, false] diff --git a/policyengine_us/tests/policy/baseline/gov/states/fl/dcf/oss/fl_oss_living_arrangement.yaml b/policyengine_us/tests/policy/baseline/gov/states/fl/dcf/oss/fl_oss_living_arrangement.yaml index 77ceb01fa3d..2e1c01b53bf 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/fl/dcf/oss/fl_oss_living_arrangement.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/fl/dcf/oss/fl_oss_living_arrangement.yaml @@ -1,6 +1,6 @@ # Tests for fl_oss_living_arrangement variable. -# Formula derives from federal ssi_federal_living_arrangement (Medicaid facility) -# and state fl_oss_community_care_type (ALF, AFCH, MHRTF). +# FAC 65A-2.032/.033/.036 cover ALF, AFCH, and MHRTF only. +# Medicaid facility residents are not an OSS coverage group. - name: Case 1, ALF community care type maps to ALF. period: 2025-01 @@ -56,53 +56,3 @@ state_code: FL output: fl_oss_living_arrangement: NONE - -- name: Case 5, federal Code D derives MEDICAID_FACILITY. - period: 2025-01 - input: - people: - person1: - age: 70 - ssi_lives_in_medical_treatment_facility: true - ssi_medicaid_pays_majority_of_care: true - households: - household: - members: [person1] - state_code: FL - output: - fl_oss_living_arrangement: MEDICAID_FACILITY - -- name: Case 6, federal Code D takes priority over community care type. - period: 2025-01 - input: - people: - person1: - age: 70 - ssi_lives_in_medical_treatment_facility: true - ssi_medicaid_pays_majority_of_care: true - fl_oss_community_care_type: ALF - households: - household: - members: [person1] - state_code: FL - output: - # Federal Medicaid facility detection overrides state community care input. - fl_oss_living_arrangement: MEDICAID_FACILITY - -- name: Case 7, medical facility without Medicaid paying majority is not Code D. - period: 2025-01 - input: - people: - person1: - age: 70 - ssi_lives_in_medical_treatment_facility: true - ssi_medicaid_pays_majority_of_care: false - households: - household: - members: [person1] - state_code: FL - output: - # Without Medicaid paying majority of care, federal living arrangement - # is not MEDICAL_TREATMENT_FACILITY, so falls through to community care - # type (default NONE). - fl_oss_living_arrangement: NONE diff --git a/policyengine_us/tests/policy/baseline/gov/states/fl/dcf/oss/integration.yaml b/policyengine_us/tests/policy/baseline/gov/states/fl/dcf/oss/integration.yaml index 565724a26a4..a7d4e3aec05 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/fl/dcf/oss/integration.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/fl/dcf/oss/integration.yaml @@ -252,84 +252,7 @@ # OSS = min(max($752.40 - $480, 0), $78.40) = $78.40. fl_oss: [78.40] -- name: Case 10, Medicaid facility individual, 2011, federal-state connection. - period: 2011-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 - households: - household: - members: [person1] - state_code: FL - output: - # Federal SSI: $30/month medical facility rate (no other income). - ssi: 30 - fl_oss_eligible: [true] - # State supplement: $5/month flat (SSA 2011 Table 1). - # Combined: $30 + $5 = $35/month. - fl_oss: [5] - -- name: Case 11, Medicaid facility couple, 2011, federal-state connection. - period: 2011-01 - absolute_error_margin: 0.01 - input: - people: - person1: - age: 72 - is_ssi_eligible: true - ssi_claim_is_joint: true - ssi_lives_in_medical_treatment_facility: true - ssi_medicaid_pays_majority_of_care: true - person2: - age: 68 - is_ssi_eligible: true - ssi_claim_is_joint: true - ssi_lives_in_medical_treatment_facility: true - ssi_medicaid_pays_majority_of_care: true - marital_units: - marital_unit: - members: [person1, person2] - tax_units: - tax_unit: - members: [person1, person2] - households: - household: - members: [person1, person2] - state_code: FL - output: - # Federal SSI: $30/month each. - ssi: [30, 30] - fl_oss_eligible: [true, true] - # State supplement: $10/month couple = $5/month each. - fl_oss: [5, 5] - -- name: Case 12, Medicaid facility with high income, no SSI, ineligible. - period: 2025-01 - absolute_error_margin: 0.01 - input: - people: - person1: - age: 70 - social_security: 12_000 - ssi_lives_in_medical_treatment_facility: true - ssi_medicaid_pays_majority_of_care: true - households: - household: - members: [person1] - state_code: FL - output: - # SSI medical facility rate = $30. Countable = $980 > $30 → SSI = $0. - # Medicaid facility requires Group 1 (ssi > 0) — no Group 2 path - # because FAC 65A-2.036 defines no income standard for Medicaid facility. - ssi: [0] - fl_oss_eligible: [false] - fl_oss: [0] - -- name: Case 13, couple with high combined income, SSI equal split. +- name: Case 10, couple with high combined income, SSI equal split. period: 2025-01 absolute_error_margin: 0.01 input: @@ -371,7 +294,7 @@ # OSS per person = min(max($1,102.90 - $940, 0), $193.40) = min($162.90, $193.40) = $162.90. fl_oss: [162.90, 162.90] -- name: Case 14, earnings with SSI earned income exclusions. +- name: Case 11, earnings with SSI earned income exclusions. period: 2025-01 absolute_error_margin: 0.01 input: diff --git a/policyengine_us/variables/gov/states/fl/dcf/oss/fl_oss.py b/policyengine_us/variables/gov/states/fl/dcf/oss/fl_oss.py index 862ff0343b8..d69da4423b2 100644 --- a/policyengine_us/variables/gov/states/fl/dcf/oss/fl_oss.py +++ b/policyengine_us/variables/gov/states/fl/dcf/oss/fl_oss.py @@ -10,25 +10,13 @@ class fl_oss(Variable): defined_for = "fl_oss_eligible" reference = ( "https://www.flrules.org/gateway/RuleNo.asp?title=PUBLIC%20ASSISTANCE&ID=65A-2.036", - "https://www.myflfamilies.com/sites/default/files/2024-10/Appendix%20A-12%20OSS%20Payment%20Standards.pdf", + "https://www.myflfamilies.com/sites/default/files/2025-05/Appendix%20A-12%20-%20State%20Funded%20Programs%20Eligibility%20Standards.pdf", ) def formula(person, period, parameters): p = parameters(period).gov.states.fl.dcf.oss - living_arrangement = person("fl_oss_living_arrangement", period) - LA = living_arrangement.possible_values - in_medicaid_facility = living_arrangement == LA.MEDICAID_FACILITY - # Medicaid facility: flat state supplement - couple_rate_applies = person("fl_oss_couple_rate_applies", period) - medicaid_supplement = where( - couple_rate_applies, - p.medicaid_facility.supplement.couple / 2, - p.medicaid_facility.supplement.individual, - ) - # Community care: provider rate + PNA - income, capped at max OSS provider_rate = person("fl_oss_provider_rate", period) total_needs = provider_rate + p.pna countable_income = person("ssi_countable_income", period) max_oss = person("fl_oss_max_oss", period) - community_benefit = min_(max_(total_needs - countable_income, 0), max_oss) - return where(in_medicaid_facility, medicaid_supplement, community_benefit) + return min_(max_(total_needs - countable_income, 0), max_oss) diff --git a/policyengine_us/variables/gov/states/fl/dcf/oss/fl_oss_community_care_type.py b/policyengine_us/variables/gov/states/fl/dcf/oss/fl_oss_community_care_type.py index 4389602c79f..289e22de37f 100644 --- a/policyengine_us/variables/gov/states/fl/dcf/oss/fl_oss_community_care_type.py +++ b/policyengine_us/variables/gov/states/fl/dcf/oss/fl_oss_community_care_type.py @@ -18,5 +18,5 @@ class fl_oss_community_care_type(Variable): default_value = FLOSSCommunityCareType.NONE reference = ( "https://www.flrules.org/gateway/RuleNo.asp?title=PUBLIC%20ASSISTANCE&ID=65A-2.032", - "https://www.myflfamilies.com/sites/default/files/2024-10/Appendix%20A-12%20OSS%20Payment%20Standards.pdf", + "https://www.myflfamilies.com/sites/default/files/2025-05/Appendix%20A-12%20-%20State%20Funded%20Programs%20Eligibility%20Standards.pdf", ) diff --git a/policyengine_us/variables/gov/states/fl/dcf/oss/fl_oss_eligible.py b/policyengine_us/variables/gov/states/fl/dcf/oss/fl_oss_eligible.py index a3767224fb2..56b42aae9e3 100644 --- a/policyengine_us/variables/gov/states/fl/dcf/oss/fl_oss_eligible.py +++ b/policyengine_us/variables/gov/states/fl/dcf/oss/fl_oss_eligible.py @@ -18,25 +18,19 @@ def formula(person, period, parameters): living_arrangement = person("fl_oss_living_arrangement", period) LA = living_arrangement.possible_values in_facility = living_arrangement != LA.NONE - in_medicaid_facility = living_arrangement == LA.MEDICAID_FACILITY - # FAC 65A-2.033(1): "receiving SSI checks" - receives_ssi = person("ssi", period) > 0 - # Medicaid facility: Group 1 only (no income standard defined - # in FAC 65A-2.036 for Medicaid facility; the $30 medical - # facility SSI rate is the only payment path). - # Community care: Group 1 OR Group 2 (income ≤ income standard), - # plus requires a valid program track. program_track = person("fl_oss_program_track", period) has_track = program_track != program_track.possible_values.NONE is_protected = program_track == program_track.possible_values.PROTECTED track_valid = where(is_protected, p.protected.in_effect, has_track) - # FAC 65A-2.033(2): income ≤ OSS income standard + # FAC 65A-2.033(1): "receiving SSI checks" (Group 1). + receives_ssi = person("ssi", period) > 0 + # FAC 65A-2.033(2): income within OSS income standard (Group 2). income_standard = person("fl_oss_income_standard", period) countable_income = person("ssi_countable_income", period) income_within_standard = countable_income <= income_standard - community_eligible = track_valid & (receives_ssi | income_within_standard) return ( categorically_eligible & in_facility - & where(in_medicaid_facility, receives_ssi, community_eligible) + & track_valid + & (receives_ssi | income_within_standard) ) diff --git a/policyengine_us/variables/gov/states/fl/dcf/oss/fl_oss_living_arrangement.py b/policyengine_us/variables/gov/states/fl/dcf/oss/fl_oss_living_arrangement.py index a1eea325eb1..e65e3f59246 100644 --- a/policyengine_us/variables/gov/states/fl/dcf/oss/fl_oss_living_arrangement.py +++ b/policyengine_us/variables/gov/states/fl/dcf/oss/fl_oss_living_arrangement.py @@ -5,7 +5,6 @@ class FLOSSLivingArrangement(Enum): ALF = "Assisted Living Facility" AFCH = "Adult Family Care Home" MHRTF = "Mental Health Residential Treatment Facility" - MEDICAID_FACILITY = "Medicaid facility" NONE = "None" @@ -17,28 +16,19 @@ class fl_oss_living_arrangement(Variable): defined_for = StateCode.FL possible_values = FLOSSLivingArrangement default_value = FLOSSLivingArrangement.NONE - reference = ( - "https://www.flrules.org/gateway/RuleNo.asp?title=PUBLIC%20ASSISTANCE&ID=65A-2.032", - "https://www.ssa.gov/policy/docs/progdesc/ssi_st_asst/2011/fl.html", - ) + reference = "https://www.flrules.org/gateway/RuleNo.asp?title=PUBLIC%20ASSISTANCE&ID=65A-2.032" def formula(person, period): - federal_la = person("ssi_federal_living_arrangement", period) - in_medical_facility = ( - federal_la == federal_la.possible_values.MEDICAL_TREATMENT_FACILITY - ) community_care = person("fl_oss_community_care_type", period) CC = community_care.possible_values LA = FLOSSLivingArrangement return select( [ - in_medical_facility, community_care == CC.ALF, community_care == CC.AFCH, community_care == CC.MHRTF, ], [ - LA.MEDICAID_FACILITY, LA.ALF, LA.AFCH, LA.MHRTF, diff --git a/policyengine_us/variables/gov/states/fl/dcf/oss/fl_oss_program_track.py b/policyengine_us/variables/gov/states/fl/dcf/oss/fl_oss_program_track.py index 2db27d1a7b2..3d166e878a3 100644 --- a/policyengine_us/variables/gov/states/fl/dcf/oss/fl_oss_program_track.py +++ b/policyengine_us/variables/gov/states/fl/dcf/oss/fl_oss_program_track.py @@ -15,4 +15,4 @@ class fl_oss_program_track(Variable): defined_for = StateCode.FL possible_values = FLOSSProgramTrack default_value = FLOSSProgramTrack.NONE - reference = "https://www.myflfamilies.com/sites/default/files/2024-10/Appendix%20A-12%20OSS%20Payment%20Standards.pdf" + reference = "https://www.myflfamilies.com/sites/default/files/2025-05/Appendix%20A-12%20-%20State%20Funded%20Programs%20Eligibility%20Standards.pdf" From 82b01b0b2a42d4717eec32972426b5420b86f0da Mon Sep 17 00:00:00 2001 From: Ziming Date: Wed, 22 Apr 2026 11:39:17 -0400 Subject: [PATCH 13/14] Address PR review: gate couple rate on shared track; backdate Protected Couple rate gating (P1): - fl_oss_couple_rate_applies now requires both spouses on the same non-NONE program track. Appendix A-12 defines couple rates separately for Redesign and Protected; there is no mixed-track couple rate. - Added integration Case 12 (mixed-track MHRTF couple) that pins provider rate, max OSS, and fl_oss to individual-rate values; locks down the original bug directly. Protected track backdating (P2): - The 2024-06 Appendix A-12 shows Protected Program Standards columns for Jan 2023 and Jan 2024, proving Protected took effect before the previously modeled Jul 2024 date. - protected/in_effect.yaml: 2024-07-01 -> 2023-01-01. - protected/provider_rate_offset.yaml: 2024-07-01 -> 2023-01-01 ($185). - protected/max_oss: added 2023-01-01 values ($239 I, $478 C). - couple_provider_rate_reduction.yaml: 2024-07-01 -> 2023-01-01 ($73). - Redesign max_oss couple corrected from $386.80 to $368.80 for 2024-07-01 (matches 2024-06 Appendix and the 2x-individual rule that holds for every other max_oss pair in both Appendices; $386.80 in the 2025-05 Appendix appears to be a typo). - Every reference annotation now specifies which column / value each source document shows, so clicking each link lands on a PDF where the cited number is visibly present. - Tests updated: edge_cases Cases 8, 12, 13, 20, 28; fl_oss_max_oss Case 3; integration Cases 2 and 10. All 80 FL OSS tests pass. --- .../oss/couple_provider_rate_reduction.yaml | 8 +- .../parameters/gov/states/fl/dcf/oss/pna.yaml | 6 +- .../fl/dcf/oss/protected/in_effect.yaml | 6 +- .../fl/dcf/oss/protected/max_oss/couple.yaml | 5 +- .../dcf/oss/protected/max_oss/individual.yaml | 5 +- .../oss/protected/provider_rate_offset.yaml | 6 +- .../redesign/income_standard_pna_offset.yaml | 4 +- .../fl/dcf/oss/redesign/max_oss/couple.yaml | 8 +- .../dcf/oss/redesign/max_oss/individual.yaml | 6 +- .../oss/redesign/provider_rate_offset.yaml | 6 +- .../gov/states/fl/dcf/oss/edge_cases.yaml | 64 ++++++++--- .../dcf/oss/fl_oss_couple_rate_applies.yaml | 108 +++++++++++++++++- .../gov/states/fl/dcf/oss/fl_oss_max_oss.yaml | 8 +- .../gov/states/fl/dcf/oss/integration.yaml | 58 +++++++++- .../fl/dcf/oss/fl_oss_couple_rate_applies.py | 25 ++-- 15 files changed, 268 insertions(+), 55 deletions(-) diff --git a/policyengine_us/parameters/gov/states/fl/dcf/oss/couple_provider_rate_reduction.yaml b/policyengine_us/parameters/gov/states/fl/dcf/oss/couple_provider_rate_reduction.yaml index 3f1925e613f..15fe3c3e9fa 100644 --- a/policyengine_us/parameters/gov/states/fl/dcf/oss/couple_provider_rate_reduction.yaml +++ b/policyengine_us/parameters/gov/states/fl/dcf/oss/couple_provider_rate_reduction.yaml @@ -1,7 +1,7 @@ description: Florida deducts this amount from the couple provider rate under the Optional State Supplementation program. values: 2011-01-01: 0 - 2024-07-01: 73 + 2023-01-01: 73 2025-01-01: 97 metadata: @@ -9,7 +9,9 @@ metadata: period: month label: Florida OSS couple provider rate reduction reference: - - title: SSA State Assistance Programs for SSI Recipients, January 2011 - Florida, Table 1 + - title: SSA State Assistance Programs for SSI Recipients, January 2011 - Florida, Table 1 (shows "b" for couple amounts = treated as two individuals, i.e., reduction = $0) href: https://www.ssa.gov/policy/docs/progdesc/ssi_st_asst/2011/fl.html - - title: FL DCF Appendix A-12, Optional State Supplementation Payment Standards + - title: FL DCF Appendix A-12, Optional State Supplementation Payment Standards (effective 2024-07-01 — back-calculation 2×$938.40-$1,803.80 = $73 for Jan 2023 Redesign; 2×$1,099-$2,125 = $73 for Jan 2023 Protected) + href: https://www.myflfamilies.com/sites/default/files/2024-06/Appendix%20A-12.pdf + - title: FL DCF Appendix A-12, Optional State Supplementation Payment Standards (effective 2025-01-01 — back-calculation 2×$991.40-$1,885.80 = $97 for Jan 2025 Redesign; 2×$1,152-$2,207 = $97 for Jan 2025 Protected) href: https://www.myflfamilies.com/sites/default/files/2025-05/Appendix%20A-12%20-%20State%20Funded%20Programs%20Eligibility%20Standards.pdf diff --git a/policyengine_us/parameters/gov/states/fl/dcf/oss/pna.yaml b/policyengine_us/parameters/gov/states/fl/dcf/oss/pna.yaml index 05bd869a401..bf5563f6181 100644 --- a/policyengine_us/parameters/gov/states/fl/dcf/oss/pna.yaml +++ b/policyengine_us/parameters/gov/states/fl/dcf/oss/pna.yaml @@ -8,9 +8,11 @@ metadata: period: month label: Florida OSS Personal Needs Allowance reference: - - title: SSA State Assistance Programs for SSI Recipients, January 2011 - Florida, Table 1 + - title: SSA State Assistance Programs for SSI Recipients, January 2011 - Florida, Table 1 (PNA $54) href: https://www.ssa.gov/policy/docs/progdesc/ssi_st_asst/2011/fl.html - - title: FL DCF Appendix A-12, Optional State Supplementation Payment Standards + - title: FL DCF Appendix A-12, Optional State Supplementation Payment Standards (effective 2024-07-01 — PNA $54 per person for Jan 2023 and Jan 2024; $160 per person for Jul 2024) + href: https://www.myflfamilies.com/sites/default/files/2024-06/Appendix%20A-12.pdf + - title: FL DCF Appendix A-12, Optional State Supplementation Payment Standards (effective 2025-01-01 — PNA $160 per person for Jul 2024 and Jan 2025) href: https://www.myflfamilies.com/sites/default/files/2025-05/Appendix%20A-12%20-%20State%20Funded%20Programs%20Eligibility%20Standards.pdf - title: Florida HB 5001, 2024-25 General Appropriations Act href: https://www.flsenate.gov/Session/Bill/2024/5001 diff --git a/policyengine_us/parameters/gov/states/fl/dcf/oss/protected/in_effect.yaml b/policyengine_us/parameters/gov/states/fl/dcf/oss/protected/in_effect.yaml index 364800ebef4..a68b2a5eef4 100644 --- a/policyengine_us/parameters/gov/states/fl/dcf/oss/protected/in_effect.yaml +++ b/policyengine_us/parameters/gov/states/fl/dcf/oss/protected/in_effect.yaml @@ -1,12 +1,14 @@ description: Florida uses this indicator to determine whether the Protected program track applies under the Optional State Supplementation program. values: 2011-01-01: false - 2024-07-01: true + 2023-01-01: true metadata: unit: bool period: month label: Florida OSS Protected track in effect reference: - - title: FL DCF Appendix A-12, Optional State Supplementation Payment Standards + - title: FL DCF Appendix A-12, Optional State Supplementation Payment Standards (effective 2024-07-01, shows Protected columns for Jan 2023, Jan 2024, Jul 2024) + href: https://www.myflfamilies.com/sites/default/files/2024-06/Appendix%20A-12.pdf + - title: FL DCF Appendix A-12, Optional State Supplementation Payment Standards (effective 2025-01-01) href: https://www.myflfamilies.com/sites/default/files/2025-05/Appendix%20A-12%20-%20State%20Funded%20Programs%20Eligibility%20Standards.pdf diff --git a/policyengine_us/parameters/gov/states/fl/dcf/oss/protected/max_oss/couple.yaml b/policyengine_us/parameters/gov/states/fl/dcf/oss/protected/max_oss/couple.yaml index 6f35b45dc58..281cad2df63 100644 --- a/policyengine_us/parameters/gov/states/fl/dcf/oss/protected/max_oss/couple.yaml +++ b/policyengine_us/parameters/gov/states/fl/dcf/oss/protected/max_oss/couple.yaml @@ -1,5 +1,6 @@ description: Florida limits the couple Protected payment to this amount under the Optional State Supplementation program. values: + 2023-01-01: 478 2024-07-01: 690 metadata: @@ -7,5 +8,7 @@ metadata: period: month label: Florida OSS Protected maximum couple payment reference: - - title: FL DCF Appendix A-12, Optional State Supplementation Payment Standards + - title: FL DCF Appendix A-12, Optional State Supplementation Payment Standards (effective 2024-07-01 — Protected Max OSS $478(C) for Jan 2023 and Jan 2024; $690(C) for Jul 2024) + href: https://www.myflfamilies.com/sites/default/files/2024-06/Appendix%20A-12.pdf + - title: FL DCF Appendix A-12, Optional State Supplementation Payment Standards (effective 2025-01-01 — Protected Max OSS $690(C) for Jul 2024 and Jan 2025) href: https://www.myflfamilies.com/sites/default/files/2025-05/Appendix%20A-12%20-%20State%20Funded%20Programs%20Eligibility%20Standards.pdf diff --git a/policyengine_us/parameters/gov/states/fl/dcf/oss/protected/max_oss/individual.yaml b/policyengine_us/parameters/gov/states/fl/dcf/oss/protected/max_oss/individual.yaml index 3d6446b0886..0b897d62ae1 100644 --- a/policyengine_us/parameters/gov/states/fl/dcf/oss/protected/max_oss/individual.yaml +++ b/policyengine_us/parameters/gov/states/fl/dcf/oss/protected/max_oss/individual.yaml @@ -1,5 +1,6 @@ description: Florida limits the individual Protected payment to this amount under the Optional State Supplementation program. values: + 2023-01-01: 239 2024-07-01: 345 metadata: @@ -7,5 +8,7 @@ metadata: period: month label: Florida OSS Protected maximum individual payment reference: - - title: FL DCF Appendix A-12, Optional State Supplementation Payment Standards + - title: FL DCF Appendix A-12, Optional State Supplementation Payment Standards (effective 2024-07-01 — Protected Max OSS $239(I) for Jan 2023 and Jan 2024; $345(I) for Jul 2024) + href: https://www.myflfamilies.com/sites/default/files/2024-06/Appendix%20A-12.pdf + - title: FL DCF Appendix A-12, Optional State Supplementation Payment Standards (effective 2025-01-01 — Protected Max OSS $345(I) for Jul 2024 and Jan 2025) href: https://www.myflfamilies.com/sites/default/files/2025-05/Appendix%20A-12%20-%20State%20Funded%20Programs%20Eligibility%20Standards.pdf diff --git a/policyengine_us/parameters/gov/states/fl/dcf/oss/protected/provider_rate_offset.yaml b/policyengine_us/parameters/gov/states/fl/dcf/oss/protected/provider_rate_offset.yaml index 63bed6cf289..5982a5e642e 100644 --- a/policyengine_us/parameters/gov/states/fl/dcf/oss/protected/provider_rate_offset.yaml +++ b/policyengine_us/parameters/gov/states/fl/dcf/oss/protected/provider_rate_offset.yaml @@ -1,11 +1,13 @@ description: Florida sets this amount as the offset added to the federal SSI benefit rate to determine the Protected provider rate under the Optional State Supplementation program. values: - 2024-07-01: 185 + 2023-01-01: 185 metadata: unit: currency-USD period: month label: Florida OSS Protected provider rate offset reference: - - title: FL DCF Appendix A-12, Optional State Supplementation Payment Standards + - title: FL DCF Appendix A-12, Optional State Supplementation Payment Standards (effective 2024-07-01 — Protected provider rate $1,099 at Jan 2023, $1,128 at Jan 2024 / Jul 2024; SSI FBR $914 at Jan 2023, $943 at Jan 2024) + href: https://www.myflfamilies.com/sites/default/files/2024-06/Appendix%20A-12.pdf + - title: FL DCF Appendix A-12, Optional State Supplementation Payment Standards (effective 2025-01-01 — Protected provider rate $1,152 at Jan 2025; SSI FBR $967) href: https://www.myflfamilies.com/sites/default/files/2025-05/Appendix%20A-12%20-%20State%20Funded%20Programs%20Eligibility%20Standards.pdf diff --git a/policyengine_us/parameters/gov/states/fl/dcf/oss/redesign/income_standard_pna_offset.yaml b/policyengine_us/parameters/gov/states/fl/dcf/oss/redesign/income_standard_pna_offset.yaml index 008093f7aed..d1c0c791747 100644 --- a/policyengine_us/parameters/gov/states/fl/dcf/oss/redesign/income_standard_pna_offset.yaml +++ b/policyengine_us/parameters/gov/states/fl/dcf/oss/redesign/income_standard_pna_offset.yaml @@ -9,5 +9,7 @@ metadata: reference: - title: SSA State Assistance Programs for SSI Recipients, January 2011 - Florida, Table 1 href: https://www.ssa.gov/policy/docs/progdesc/ssi_st_asst/2011/fl.html - - title: FL DCF Appendix A-12, Optional State Supplementation Payment Standards + - title: FL DCF Appendix A-12, Optional State Supplementation Payment Standards (effective 2024-07-01 — Redesign income standard $992.40(I) - provider rate $938.40 = $54 offset at Jan 2023; $1,021.40 - $967.40 = $54 at Jan 2024 / Jul 2024) + href: https://www.myflfamilies.com/sites/default/files/2024-06/Appendix%20A-12.pdf + - title: FL DCF Appendix A-12, Optional State Supplementation Payment Standards (effective 2025-01-01 — Redesign income standard $1,045.40(I) - provider rate $991.40 = $54 offset at Jan 2025) href: https://www.myflfamilies.com/sites/default/files/2025-05/Appendix%20A-12%20-%20State%20Funded%20Programs%20Eligibility%20Standards.pdf diff --git a/policyengine_us/parameters/gov/states/fl/dcf/oss/redesign/max_oss/couple.yaml b/policyengine_us/parameters/gov/states/fl/dcf/oss/redesign/max_oss/couple.yaml index 8eceec6bfeb..04e9ae6d15e 100644 --- a/policyengine_us/parameters/gov/states/fl/dcf/oss/redesign/max_oss/couple.yaml +++ b/policyengine_us/parameters/gov/states/fl/dcf/oss/redesign/max_oss/couple.yaml @@ -1,14 +1,14 @@ description: Florida limits the couple Redesign payment to this amount under the Optional State Supplementation program. values: 2011-01-01: 156.8 - 2024-07-01: 386.8 + 2024-07-01: 368.8 metadata: unit: currency-USD period: month label: Florida OSS Redesign maximum couple payment reference: - - title: SSA State Assistance Programs for SSI Recipients, January 2011 - Florida, Table 1 + - title: SSA State Assistance Programs for SSI Recipients, January 2011 - Florida, Table 1 (Redesign Max OSS $156.80(C), = 2 × $78.40(I)) href: https://www.ssa.gov/policy/docs/progdesc/ssi_st_asst/2011/fl.html - - title: FL DCF Appendix A-12, Optional State Supplementation Payment Standards - href: https://www.myflfamilies.com/sites/default/files/2025-05/Appendix%20A-12%20-%20State%20Funded%20Programs%20Eligibility%20Standards.pdf + - title: FL DCF Appendix A-12, Optional State Supplementation Payment Standards (effective 2024-07-01 — Redesign Max OSS $156.80(C) at Jan 2023 / Jan 2024 = 2×$78.40; $368.80(C) at Jul 2024 = 2×$184.40) + href: https://www.myflfamilies.com/sites/default/files/2024-06/Appendix%20A-12.pdf diff --git a/policyengine_us/parameters/gov/states/fl/dcf/oss/redesign/max_oss/individual.yaml b/policyengine_us/parameters/gov/states/fl/dcf/oss/redesign/max_oss/individual.yaml index 5124b88bd3c..97384aed4e4 100644 --- a/policyengine_us/parameters/gov/states/fl/dcf/oss/redesign/max_oss/individual.yaml +++ b/policyengine_us/parameters/gov/states/fl/dcf/oss/redesign/max_oss/individual.yaml @@ -8,7 +8,9 @@ metadata: period: month label: Florida OSS Redesign maximum individual payment reference: - - title: SSA State Assistance Programs for SSI Recipients, January 2011 - Florida, Table 1 + - title: SSA State Assistance Programs for SSI Recipients, January 2011 - Florida, Table 1 (Redesign Max OSS $78.40(I)) href: https://www.ssa.gov/policy/docs/progdesc/ssi_st_asst/2011/fl.html - - title: FL DCF Appendix A-12, Optional State Supplementation Payment Standards + - title: FL DCF Appendix A-12, Optional State Supplementation Payment Standards (effective 2024-07-01 — Redesign Max OSS $78.40(I) at Jan 2023 / Jan 2024; $184.40(I) at Jul 2024) + href: https://www.myflfamilies.com/sites/default/files/2024-06/Appendix%20A-12.pdf + - title: FL DCF Appendix A-12, Optional State Supplementation Payment Standards (effective 2025-01-01 — Redesign Max OSS $184.40(I) at Jul 2024 / Jan 2025) href: https://www.myflfamilies.com/sites/default/files/2025-05/Appendix%20A-12%20-%20State%20Funded%20Programs%20Eligibility%20Standards.pdf diff --git a/policyengine_us/parameters/gov/states/fl/dcf/oss/redesign/provider_rate_offset.yaml b/policyengine_us/parameters/gov/states/fl/dcf/oss/redesign/provider_rate_offset.yaml index fbbf10e3ea1..f1ad721bb51 100644 --- a/policyengine_us/parameters/gov/states/fl/dcf/oss/redesign/provider_rate_offset.yaml +++ b/policyengine_us/parameters/gov/states/fl/dcf/oss/redesign/provider_rate_offset.yaml @@ -7,7 +7,9 @@ metadata: period: month label: Florida OSS Redesign provider rate offset reference: - - title: SSA State Assistance Programs for SSI Recipients, January 2011 - Florida, Table 1 + - title: SSA State Assistance Programs for SSI Recipients, January 2011 - Florida, Table 1 (Redesign base rate $698.40 - FBR $674 = $24.40 offset) href: https://www.ssa.gov/policy/docs/progdesc/ssi_st_asst/2011/fl.html - - title: FL DCF Appendix A-12, Optional State Supplementation Payment Standards + - title: FL DCF Appendix A-12, Optional State Supplementation Payment Standards (effective 2024-07-01 — Redesign provider rate $938.40(I) at Jan 2023 / FBR $914 = $24.40 offset; $967.40 at Jan 2024 / Jul 2024 / FBR $943 = $24.40 offset) + href: https://www.myflfamilies.com/sites/default/files/2024-06/Appendix%20A-12.pdf + - title: FL DCF Appendix A-12, Optional State Supplementation Payment Standards (effective 2025-01-01 — Redesign provider rate $991.40(I) at Jan 2025 / FBR $967 = $24.40 offset) href: https://www.myflfamilies.com/sites/default/files/2025-05/Appendix%20A-12%20-%20State%20Funded%20Programs%20Eligibility%20Standards.pdf diff --git a/policyengine_us/tests/policy/baseline/gov/states/fl/dcf/oss/edge_cases.yaml b/policyengine_us/tests/policy/baseline/gov/states/fl/dcf/oss/edge_cases.yaml index fba44c75fb3..42aa9265acd 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/fl/dcf/oss/edge_cases.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/fl/dcf/oss/edge_cases.yaml @@ -224,9 +224,9 @@ output: fl_oss_eligible: [true, true] # Per person total needs = $1,102.90. Income = $0. - # Calculated per person = $1,102.90. Max per person = $193.40. - # Capped at $193.40 each. - fl_oss: [193.40, 193.40] + # Uncapped per person = $1,102.90. Max per person = $368.80/2 = $184.40. + # Capped at $184.40 each. + fl_oss: [184.40, 184.40] # ────────────────────────────────────────────────────────────── # Very high income → $0 benefit (well above income standard) @@ -324,8 +324,8 @@ # This means Protected track effectively didn't exist before Jul 2024. # ────────────────────────────────────────────────────────────── -- name: Case 12, Protected track before Jul 2024, ineligible (track not in effect). - period: 2024-01 +- name: Case 12, Protected track before Jan 2023, ineligible (track not in effect). + period: 2022-01 absolute_error_margin: 0.01 input: people: @@ -342,12 +342,13 @@ members: [person1] state_code: FL output: - # Protected track not in effect before Jul 2024. + # Protected track not in effect before Jan 2023 (see 2024-06 Appendix A-12 + # earliest shown column is Jan 2023). fl_oss_eligible: [false] fl_oss: [0] -- name: Case 13, Protected couple before Jul 2024, ineligible (track not in effect). - period: 2024-01 +- name: Case 13, Protected couple before Jan 2023, ineligible (track not in effect). + period: 2022-01 absolute_error_margin: 0.01 input: people: @@ -378,7 +379,7 @@ members: [person1, person2] state_code: FL output: - # Protected track not in effect before Jul 2024. + # Protected track not in effect before Jan 2023. fl_oss_eligible: [false, false] fl_oss: [0, 0] @@ -579,8 +580,10 @@ is_ssi_eligible: true ssi_claim_is_joint: true uncapped_ssi: 12 - # $909.50/month * 12 = $10,914/year. - ssi_countable_income: 10_914 + # Per-person max couple OSS = $368.80/2 = $184.40. + # Target income = total_needs - max = $1,102.90 - $184.40 = $918.50/month. + # $918.50/month * 12 = $11,022/year. + ssi_countable_income: 11_022 person2: fl_oss_community_care_type: AFCH fl_oss_program_track: REDESIGN @@ -588,7 +591,7 @@ is_ssi_eligible: true ssi_claim_is_joint: true uncapped_ssi: 12 - ssi_countable_income: 10_914 + ssi_countable_income: 11_022 marital_units: marital_unit: members: [person1, person2] @@ -601,8 +604,8 @@ state_code: FL output: fl_oss_eligible: [true, true] - # Per person: min(max(0, $1,102.90 - $909.50), $193.40) = min($193.40, $193.40) = $193.40. - fl_oss: [193.40, 193.40] + # Per person: min(max(0, $1,102.90 - $918.50), $184.40) = min($184.40, $184.40) = $184.40. + fl_oss: [184.40, 184.40] # ────────────────────────────────────────────────────────────── # Couple income standard boundary (Redesign) @@ -810,3 +813,36 @@ output: fl_oss_eligible: [false] fl_oss: [0] + +# ────────────────────────────────────────────────────────────── +# Protected track in effect Jan 2023 through Jun 2024 (pre-Jul-2024 rates) +# 2024-06 Appendix A-12: provider rate $1,128(I), max OSS $239(I), PNA $54. +# ────────────────────────────────────────────────────────────── + +- name: Case 28, Protected individual Jan 2024, pre-Jul-2024 rates apply. + period: 2024-01 + absolute_error_margin: 0.01 + input: + people: + person1: + fl_oss_community_care_type: MHRTF + fl_oss_program_track: PROTECTED + age: 45 + is_ssi_eligible: true + ssi_claim_is_joint: false + uncapped_ssi: 1_200 + ssi_countable_income: 0 + households: + household: + members: [person1] + state_code: FL + output: + # Protected in effect from Jan 2023 (per 2024-06 Appendix A-12). + fl_oss_eligible: [true] + # Provider rate = FBR 2024 $943 + $185 offset = $1,128. + fl_oss_provider_rate: [1_128] + # Max OSS (Protected, I) Jan 2024 = $239. + fl_oss_max_oss: [239] + # Total needs = $1,128 + $54 PNA = $1,182. Income = $0. + # OSS = min(max($1,182, 0), $239) = $239. + fl_oss: [239] diff --git a/policyengine_us/tests/policy/baseline/gov/states/fl/dcf/oss/fl_oss_couple_rate_applies.yaml b/policyengine_us/tests/policy/baseline/gov/states/fl/dcf/oss/fl_oss_couple_rate_applies.yaml index 9ab525fbcb6..9cda4295933 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/fl/dcf/oss/fl_oss_couple_rate_applies.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/fl/dcf/oss/fl_oss_couple_rate_applies.yaml @@ -1,18 +1,22 @@ # Tests for fl_oss_couple_rate_applies variable. # Couple rate requires: ssi_claim_is_joint AND both spouses is_ssi_eligible -# AND both spouses in a qualifying facility (living_arrangement != NONE). +# AND both spouses in a qualifying facility (living_arrangement != NONE) +# AND both spouses on the same non-NONE program track (Appendix A-12 +# defines couple rates per track). -- name: Case 1, both spouses eligible and in facility, couple rate applies. +- name: Case 1, both spouses eligible and in facility on Redesign, couple rate applies. period: 2025-01 input: people: person1: fl_oss_community_care_type: ALF + fl_oss_program_track: REDESIGN age: 70 is_ssi_eligible: true ssi_claim_is_joint: true person2: fl_oss_community_care_type: ALF + fl_oss_program_track: REDESIGN age: 68 is_ssi_eligible: true ssi_claim_is_joint: true @@ -35,11 +39,13 @@ people: person1: fl_oss_community_care_type: ALF + fl_oss_program_track: REDESIGN age: 70 is_ssi_eligible: true ssi_claim_is_joint: false person2: fl_oss_community_care_type: ALF + fl_oss_program_track: REDESIGN age: 40 is_ssi_eligible: false ssi_claim_is_joint: false @@ -62,6 +68,7 @@ people: person1: fl_oss_community_care_type: ALF + fl_oss_program_track: REDESIGN age: 70 is_ssi_eligible: true ssi_claim_is_joint: true @@ -89,6 +96,7 @@ people: person1: fl_oss_community_care_type: ALF + fl_oss_program_track: REDESIGN age: 70 is_ssi_eligible: true ssi_claim_is_joint: false @@ -99,17 +107,19 @@ output: fl_oss_couple_rate_applies: [false] -- name: Case 5, different facility types (ALF and MHRTF), couple rate applies. +- name: Case 5, different facility types on same Redesign track, couple rate applies. period: 2025-01 input: people: person1: fl_oss_community_care_type: ALF + fl_oss_program_track: REDESIGN age: 72 is_ssi_eligible: true ssi_claim_is_joint: true person2: fl_oss_community_care_type: MHRTF + fl_oss_program_track: REDESIGN age: 50 is_ssi_eligible: true ssi_claim_is_joint: true @@ -124,5 +134,95 @@ members: [person1, person2] state_code: FL output: - # Both in OSS facilities (even if different types) → couple rate applies. + # Both on REDESIGN even if in different facility types → couple rate applies. fl_oss_couple_rate_applies: [true, true] + +- name: Case 6, both spouses in MHRTF on Protected track, couple rate applies. + period: 2025-01 + input: + people: + person1: + fl_oss_community_care_type: MHRTF + fl_oss_program_track: PROTECTED + age: 50 + is_ssi_eligible: true + ssi_claim_is_joint: true + person2: + fl_oss_community_care_type: MHRTF + fl_oss_program_track: PROTECTED + age: 48 + is_ssi_eligible: true + ssi_claim_is_joint: true + marital_units: + marital_unit: + members: [person1, person2] + tax_units: + tax_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: FL + output: + fl_oss_couple_rate_applies: [true, true] + +- name: Case 7, one spouse missing a program track, couple rate does not apply. + period: 2025-01 + input: + people: + person1: + fl_oss_community_care_type: ALF + fl_oss_program_track: REDESIGN + age: 70 + is_ssi_eligible: true + ssi_claim_is_joint: true + person2: + fl_oss_community_care_type: ALF + # fl_oss_program_track defaults to NONE + age: 68 + is_ssi_eligible: true + ssi_claim_is_joint: true + marital_units: + marital_unit: + members: [person1, person2] + tax_units: + tax_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: FL + output: + # Spouse2 has no track → no shared track → couple rate does not apply. + fl_oss_couple_rate_applies: [false, false] + +- name: Case 8, spouses on mismatched tracks, couple rate does not apply. + period: 2025-01 + input: + people: + person1: + fl_oss_community_care_type: MHRTF + fl_oss_program_track: REDESIGN + age: 50 + is_ssi_eligible: true + ssi_claim_is_joint: true + person2: + fl_oss_community_care_type: MHRTF + fl_oss_program_track: PROTECTED + age: 48 + is_ssi_eligible: true + ssi_claim_is_joint: true + marital_units: + marital_unit: + members: [person1, person2] + tax_units: + tax_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: FL + output: + # Appendix A-12 defines couple rates per track; no rate exists for + # mixed REDESIGN/PROTECTED couples → couple rate does not apply. + fl_oss_couple_rate_applies: [false, false] diff --git a/policyengine_us/tests/policy/baseline/gov/states/fl/dcf/oss/fl_oss_max_oss.yaml b/policyengine_us/tests/policy/baseline/gov/states/fl/dcf/oss/fl_oss_max_oss.yaml index 6710fc92381..59b3e923bb3 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/fl/dcf/oss/fl_oss_max_oss.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/fl/dcf/oss/fl_oss_max_oss.yaml @@ -69,11 +69,9 @@ members: [person1, person2] state_code: FL output: - # Max OSS (Redesign, C) = $386.80/month (frozen). - # Per person = $386.80 / 2 = $193.40/month. - # Annual per person = $193.40 * 12 = $2,320.80. - # Monthly output = $2,320.80 / 12 = $193.40. - fl_oss_max_oss: [193.40, 193.40] + # Max OSS (Redesign, C) = $368.80/month (= 2 * $184.40; 2024-06 Appendix A-12). + # Per person = $368.80 / 2 = $184.40/month (same as individual cap). + fl_oss_max_oss: [184.40, 184.40] - name: Case 4, Protected couple max OSS Jan 2025. period: 2025-01 diff --git a/policyengine_us/tests/policy/baseline/gov/states/fl/dcf/oss/integration.yaml b/policyengine_us/tests/policy/baseline/gov/states/fl/dcf/oss/integration.yaml index a7d4e3aec05..b0415cf6999 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/fl/dcf/oss/integration.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/fl/dcf/oss/integration.yaml @@ -62,12 +62,13 @@ ssi: [135, 135] # State OSS: couple provider rate = 2 * $991.40 - $97 = $1,885.80. # Per person = $942.90. Total needs = $942.90 + $160 = $1,102.90. - # OSS per person = min(max($1,102.90 - $590, 0), $193.40) = $193.40. + # Couple max = $368.80, per person $184.40 (same as individual cap). + # OSS per person = min(max($1,102.90 - $590, 0), $184.40) = $184.40. fl_oss_eligible: [true, true] fl_oss_couple_rate_applies: [true, true] fl_oss_provider_rate: [942.90, 942.90] - fl_oss_max_oss: [193.40, 193.40] - fl_oss: [193.40, 193.40] + fl_oss_max_oss: [184.40, 184.40] + fl_oss: [184.40, 184.40] - name: Case 3, Group 2 non-SSI recipient, $1,000/month Social Security. period: 2025-01 @@ -290,8 +291,9 @@ fl_oss_eligible: [true, true] fl_oss_provider_rate: [942.90, 942.90] fl_oss_income_standard: [996.90, 996.90] - fl_oss_max_oss: [193.40, 193.40] - # OSS per person = min(max($1,102.90 - $940, 0), $193.40) = min($162.90, $193.40) = $162.90. + # Couple max = $368.80, per person $184.40 (same as individual cap). + fl_oss_max_oss: [184.40, 184.40] + # OSS per person = min(max($1,102.90 - $940, 0), $184.40) = min($162.90, $184.40) = $162.90. fl_oss: [162.90, 162.90] - name: Case 11, earnings with SSI earned income exclusions. @@ -318,3 +320,49 @@ fl_oss_eligible: [true] # OSS = min(max($1,151.40 - $207.50, 0), $184.40) = $184.40. fl_oss: [184.40] + +- name: Case 12, mixed-track MHRTF couple, each gets individual rates (regression). + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 45 + is_disabled: true + social_security: 12_120 + fl_oss_community_care_type: MHRTF + fl_oss_program_track: REDESIGN + person2: + age: 42 + is_disabled: true + social_security: 12_120 + fl_oss_community_care_type: MHRTF + fl_oss_program_track: PROTECTED + marital_units: + marital_unit: + members: [person1, person2] + tax_units: + tax_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: FL + output: + # Combined SS $2,020/mo - $20 exclusion = $2,000 countable, equal-split + # = $1,000 per person. Both fail Group 1 ($725 couple FBR < $1,000). + # Both pass Group 2 ($1,000 ≤ Redesign $1,045.40 and ≤ Protected $1,152). + is_ssi_eligible: [true, true] + ssi_countable_income: [1_000, 1_000] + ssi: [0, 0] + fl_oss_eligible: [true, true] + # Tracks mismatch → couple rate does not apply → each spouse takes + # their own individual provider rate and max OSS cap. + # Bug (pre-fix) would have halved couple rates: provider + # = [942.90, 1103.50], max_oss = [193.40, 345], fl_oss = [102.90, 263.50]. + fl_oss_couple_rate_applies: [false, false] + fl_oss_provider_rate: [991.40, 1_152] + fl_oss_max_oss: [184.40, 345] + # person1 OSS = min(max($991.40 + $160 - $1,000, 0), $184.40) = $151.40. + # person2 OSS = min(max($1,152 + $160 - $1,000, 0), $345) = $312. + fl_oss: [151.40, 312] diff --git a/policyengine_us/variables/gov/states/fl/dcf/oss/fl_oss_couple_rate_applies.py b/policyengine_us/variables/gov/states/fl/dcf/oss/fl_oss_couple_rate_applies.py index bff8a750a81..8f2b2ecb55f 100644 --- a/policyengine_us/variables/gov/states/fl/dcf/oss/fl_oss_couple_rate_applies.py +++ b/policyengine_us/variables/gov/states/fl/dcf/oss/fl_oss_couple_rate_applies.py @@ -13,16 +13,27 @@ def formula(person, period, parameters): # Requires: both spouses are an SSI eligible couple # (ssi_claim_is_joint handles Title XIX separation per # 20 CFR 416.1149 — see #8003), both pass SSI categorical - # eligibility (resources + immigration), and both reside - # in a qualifying OSS facility. + # eligibility (resources + immigration), both reside in + # a qualifying OSS facility, and both are on the same + # non-NONE program track. Appendix A-12 defines couple + # rates separately per track (Redesign vs Protected); a + # couple with mismatched or missing tracks has no valid + # couple rate. joint_claim = person("ssi_claim_is_joint", period) + unit_size = person.marital_unit.nb_persons() both_ssi_eligible = ( - person.marital_unit.sum(person("is_ssi_eligible", period)) - == person.marital_unit.nb_persons() + person.marital_unit.sum(person("is_ssi_eligible", period)) == unit_size ) living_arrangement = person("fl_oss_living_arrangement", period) in_facility = living_arrangement != living_arrangement.possible_values.NONE - both_in_facility = ( - person.marital_unit.sum(in_facility) == person.marital_unit.nb_persons() + both_in_facility = person.marital_unit.sum(in_facility) == unit_size + program_track = person("fl_oss_program_track", period) + TRACK = program_track.possible_values + both_on_redesign = ( + person.marital_unit.sum(program_track == TRACK.REDESIGN) == unit_size ) - return joint_claim & both_ssi_eligible & both_in_facility + both_on_protected = ( + person.marital_unit.sum(program_track == TRACK.PROTECTED) == unit_size + ) + both_on_same_track = both_on_redesign | both_on_protected + return joint_claim & both_ssi_eligible & both_in_facility & both_on_same_track From ccf0d87f4d363749eca8f142e3af2bd6bdfb53ec Mon Sep 17 00:00:00 2001 From: Ziming Date: Wed, 22 Apr 2026 12:02:12 -0400 Subject: [PATCH 14/14] Document implicit OSS / SSI living-arrangement invariant MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add a comment block above fl_oss_eligible explaining that OSS-eligible persons are always classified as OWN_HOUSEHOLD in ssi_federal_living_arrangement because none of the three reduction triggers (MEDICAL_TREATMENT_FACILITY, CHILD_IN_PARENTAL_HOUSEHOLD, ANOTHER_PERSONS_HOUSEHOLD) fires for a legitimate ALF/AFCH/MHRTF resident. The formula deliberately does not cross-check — FAC 65A-2 gates eligibility on facility type, not on SSI code — so inconsistent inputs are treated as user error. --- .../gov/states/fl/dcf/oss/fl_oss_eligible.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/policyengine_us/variables/gov/states/fl/dcf/oss/fl_oss_eligible.py b/policyengine_us/variables/gov/states/fl/dcf/oss/fl_oss_eligible.py index 56b42aae9e3..e8d4927a0b2 100644 --- a/policyengine_us/variables/gov/states/fl/dcf/oss/fl_oss_eligible.py +++ b/policyengine_us/variables/gov/states/fl/dcf/oss/fl_oss_eligible.py @@ -1,6 +1,19 @@ from policyengine_us.model_api import * +# Implicit SSI living-arrangement invariant: an OSS-eligible person is +# always OWN_HOUSEHOLD in ssi_federal_living_arrangement. None of the +# three reduction triggers fires for a legitimate ALF/AFCH/MHRTF +# resident: MEDICAL_TREATMENT_FACILITY requires Medicaid paying >50% +# (OSS exists because it is not); CHILD_IN_PARENTAL_HOUSEHOLD requires +# under-18 (OSS requires aged/blind/disabled); ANOTHER_PERSONS_HOUSEHOLD +# requires free shelter and meals from a private household (OSS +# residents pay the provider). FAC 65A-2 gates eligibility on facility +# type, not on SSI code, so this formula does not cross-check against +# ssi_federal_living_arrangement; inconsistent inputs (e.g. setting +# both fl_oss_community_care_type = ALF and +# ssi_lives_in_medical_treatment_facility = True) will produce +# nonsensical results. class fl_oss_eligible(Variable): value_type = bool entity = Person