From 6def5b0fc8d552ab0ef6bf753f19a17e45789688 Mon Sep 17 00:00:00 2001 From: Ziming Date: Thu, 26 Mar 2026 18:45:15 -0400 Subject: [PATCH 1/5] 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 2/5] 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 3/5] 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 4/5] 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 5/5] 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)