From 649e9c76ad844e269d132ba5ef69d5840ff593a9 Mon Sep 17 00:00:00 2001 From: Matt Unrath Date: Sat, 7 Mar 2026 13:43:06 -0800 Subject: [PATCH 1/4] Implement Idaho AABD (Aid to the Aged, Blind, and Disabled) cash assistance program Co-Authored-By: Claude Opus 4.6 --- changelog_entry.yaml | 4 + .../household/household_state_benefits.yaml | 4 + .../states/id/dhw/aabd/payment/amount.yaml | 25 ++++++ .../gov/states/id/dhw/aabd/id_aabd.yaml | 74 +++++++++++++++ .../gov/states/id/dhw/aabd/id_aabd.py | 20 +++++ .../states/id/dhw/aabd/id_aabd_eligible.py | 23 +++++ .../id/dhw/aabd/id_aabd_living_arrangement.py | 25 ++++++ sources/working_references.md | 90 +++++++++++++++++++ 8 files changed, 265 insertions(+) create mode 100644 changelog_entry.yaml create mode 100644 policyengine_us/parameters/gov/states/id/dhw/aabd/payment/amount.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/id/dhw/aabd/id_aabd.yaml create mode 100644 policyengine_us/variables/gov/states/id/dhw/aabd/id_aabd.py create mode 100644 policyengine_us/variables/gov/states/id/dhw/aabd/id_aabd_eligible.py create mode 100644 policyengine_us/variables/gov/states/id/dhw/aabd/id_aabd_living_arrangement.py create mode 100644 sources/working_references.md diff --git a/changelog_entry.yaml b/changelog_entry.yaml new file mode 100644 index 00000000000..dd84d1431d1 --- /dev/null +++ b/changelog_entry.yaml @@ -0,0 +1,4 @@ +- bump: minor + changes: + added: + - Implement Idaho AABD (Aid to the Aged, Blind, and Disabled) cash assistance program. diff --git a/policyengine_us/parameters/gov/household/household_state_benefits.yaml b/policyengine_us/parameters/gov/household/household_state_benefits.yaml index 9ad7c2dae5d..78e3ea265fa 100644 --- a/policyengine_us/parameters/gov/household/household_state_benefits.yaml +++ b/policyengine_us/parameters/gov/household/household_state_benefits.yaml @@ -3,6 +3,8 @@ values: 2023-01-01: # Massachusetts benefits - ma_state_supplement + # Idaho benefits + - id_aabd # Colorado benefits - co_state_supplement - co_oap @@ -25,6 +27,8 @@ values: 2024-01-01: # Massachusetts benefits - ma_state_supplement + # Idaho benefits + - id_aabd # Colorado benefits - co_state_supplement - co_oap diff --git a/policyengine_us/parameters/gov/states/id/dhw/aabd/payment/amount.yaml b/policyengine_us/parameters/gov/states/id/dhw/aabd/payment/amount.yaml new file mode 100644 index 00000000000..110444cf5bb --- /dev/null +++ b/policyengine_us/parameters/gov/states/id/dhw/aabd/payment/amount.yaml @@ -0,0 +1,25 @@ +description: >- + Idaho provides this maximum monthly AABD cash payment amount based on + the participant's living arrangement. +metadata: + unit: currency-USD + period: month + label: Idaho AABD maximum monthly cash payment + breakdown: + - id_aabd_living_arrangement + reference: + - title: IDAPA 16.03.05.514 - AABD Cash Payments + href: https://adminrules.idaho.gov/rules/current/16/160305.pdf#page=41 + - title: Idaho Admin. Code r. 16.03.05.514 + href: https://www.law.cornell.edu/regulations/idaho/IDAPA-16.03.05.514 + +SINGLE: + 2024-07-01: 53 +COUPLE: + 2024-07-01: 20 +ESSENTIAL_PERSON: + 2024-07-01: 18 +SIGRIF: + 2024-07-01: 169 +ROOM_AND_BOARD: + 2024-07-01: 198 diff --git a/policyengine_us/tests/policy/baseline/gov/states/id/dhw/aabd/id_aabd.yaml b/policyengine_us/tests/policy/baseline/gov/states/id/dhw/aabd/id_aabd.yaml new file mode 100644 index 00000000000..12a5c908206 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/id/dhw/aabd/id_aabd.yaml @@ -0,0 +1,74 @@ +- name: Single SSI recipient in Idaho receives AABD cash payment + period: 2025 + input: + state_code: ID + ssi: 11_604 + id_aabd_living_arrangement: SINGLE + output: + id_aabd_eligible: true + id_aabd: 636 # $53/month * 12 + +- name: Idaho couple on SSI receives AABD couple payment + period: 2025 + input: + state_code: ID + ssi: 8_700 + id_aabd_living_arrangement: COUPLE + output: + id_aabd: 240 # $20/month * 12 + +- name: Idaho AABD participant with essential person + period: 2025 + input: + state_code: ID + ssi: 11_604 + id_aabd_living_arrangement: ESSENTIAL_PERSON + output: + id_aabd: 216 # $18/month * 12 + +- name: Idaho AABD participant in SIGRIF + period: 2025 + input: + state_code: ID + ssi: 11_604 + id_aabd_living_arrangement: SIGRIF + output: + id_aabd: 2_028 # $169/month * 12 + +- name: Idaho AABD participant in room and board + period: 2025 + input: + state_code: ID + ssi: 11_604 + id_aabd_living_arrangement: ROOM_AND_BOARD + output: + id_aabd: 2_376 # $198/month * 12 + +- name: Idaho AABD participant in RALF is ineligible + period: 2025 + input: + state_code: ID + ssi: 11_604 + id_aabd_living_arrangement: RALF_CFH + output: + id_aabd_eligible: false + id_aabd: 0 + +- name: Idaho resident not receiving SSI is ineligible for AABD + period: 2025 + input: + state_code: ID + ssi: 0 + id_aabd_living_arrangement: SINGLE + output: + id_aabd_eligible: false + id_aabd: 0 + +- name: Non-Idaho resident not eligible for AABD + period: 2025 + input: + state_code: CA + ssi: 11_604 + id_aabd_living_arrangement: SINGLE + output: + id_aabd: 0 diff --git a/policyengine_us/variables/gov/states/id/dhw/aabd/id_aabd.py b/policyengine_us/variables/gov/states/id/dhw/aabd/id_aabd.py new file mode 100644 index 00000000000..74864aee83f --- /dev/null +++ b/policyengine_us/variables/gov/states/id/dhw/aabd/id_aabd.py @@ -0,0 +1,20 @@ +from policyengine_us.model_api import * + + +class id_aabd(Variable): + value_type = float + entity = Person + label = "Idaho AABD cash payment" + unit = USD + definition_period = YEAR + defined_for = "id_aabd_eligible" + reference = ( + "https://adminrules.idaho.gov/rules/current/16/160305.pdf#page=41", + "https://www.law.cornell.edu/regulations/idaho/IDAPA-16.03.05.514", + ) + + def formula(person, period, parameters): + living_arrangement = person("id_aabd_living_arrangement", period) + p = parameters(period).gov.states.id.dhw.aabd.payment.amount + monthly_amount = p[living_arrangement] + return monthly_amount * MONTHS_IN_YEAR diff --git a/policyengine_us/variables/gov/states/id/dhw/aabd/id_aabd_eligible.py b/policyengine_us/variables/gov/states/id/dhw/aabd/id_aabd_eligible.py new file mode 100644 index 00000000000..be7eb0fb810 --- /dev/null +++ b/policyengine_us/variables/gov/states/id/dhw/aabd/id_aabd_eligible.py @@ -0,0 +1,23 @@ +from policyengine_us.model_api import * +from policyengine_us.variables.gov.states.id.dhw.aabd.id_aabd_living_arrangement import ( + IDAAbdLivingArrangement, +) + + +class id_aabd_eligible(Variable): + value_type = bool + entity = Person + label = "Idaho AABD eligible" + definition_period = YEAR + defined_for = StateCode.ID + reference = ( + "https://adminrules.idaho.gov/rules/current/16/160305.pdf#page=41", + "https://www.law.cornell.edu/regulations/idaho/IDAPA-16.03.05.514", + ) + + def formula(person, period, parameters): + receives_ssi = person("ssi", period) > 0 + living_arrangement = person("id_aabd_living_arrangement", period) + not_in_ralf_cfh = living_arrangement != IDAAbdLivingArrangement.RALF_CFH + not_none = living_arrangement != IDAAbdLivingArrangement.NONE + return receives_ssi & not_in_ralf_cfh & not_none diff --git a/policyengine_us/variables/gov/states/id/dhw/aabd/id_aabd_living_arrangement.py b/policyengine_us/variables/gov/states/id/dhw/aabd/id_aabd_living_arrangement.py new file mode 100644 index 00000000000..d0b00c47e6c --- /dev/null +++ b/policyengine_us/variables/gov/states/id/dhw/aabd/id_aabd_living_arrangement.py @@ -0,0 +1,25 @@ +from policyengine_us.model_api import * + + +class IDAAbdLivingArrangement(Enum): + SINGLE = "Single participant" + COUPLE = "Couple" + ESSENTIAL_PERSON = "Participant with essential person" + SIGRIF = "Semi-independent group residential facility" + ROOM_AND_BOARD = "Room and board" + RALF_CFH = "Residential assisted living facility or certified family home" + NONE = "Not applicable" + + +class id_aabd_living_arrangement(Variable): + value_type = Enum + entity = Person + label = "Idaho AABD living arrangement" + definition_period = YEAR + defined_for = StateCode.ID + possible_values = IDAAbdLivingArrangement + default_value = IDAAbdLivingArrangement.SINGLE + reference = ( + "https://adminrules.idaho.gov/rules/current/16/160305.pdf#page=39", + "https://www.law.cornell.edu/regulations/idaho/IDAPA-16.03.05.514", + ) diff --git a/sources/working_references.md b/sources/working_references.md new file mode 100644 index 00000000000..1941798aa1f --- /dev/null +++ b/sources/working_references.md @@ -0,0 +1,90 @@ +# Idaho AABD Cash Assistance (State Supplemental Payment) + +## Official Program Name + +**Federal Program**: State Supplemental Payment (SSP) to SSI +**State's Official Name**: Aid to the Aged, Blind, and Disabled (AABD) Cash Assistance +**Abbreviation**: AABD +**Source**: IDAPA 16.03.05 - Eligibility for Aid to the Aged, Blind, and Disabled +**Administering Agency**: Idaho Department of Health and Welfare (DHW) +**Administration Type**: State-administered + +**Variable Prefix**: `id_aabd` + +## Program Overview + +Idaho's AABD Cash Assistance program provides monthly cash payments to SSI recipients +based on their living arrangement. The program is governed by IDAPA 16.03.05, Sections +500-514. + +Key requirement: "Only a participant who receives an SSI payment for the month is +eligible for an AABD cash payment in the same month." (IDAPA 16.03.05.514) + +## Payment Amounts (IDAPA 16.03.05.514, effective 7-1-24) + +### Maximum Monthly AABD Cash Payments + +| Living Arrangement | Max Payment | Reference | +|---|---|---| +| Single participant (Sec 501.01) | $53 | IDAPA 16.03.05.514.01 | +| Couple (Sec 501.02) | $20 | IDAPA 16.03.05.514.02.a | +| Participant w/ essential person (Sec 501.02) | $18 | IDAPA 16.03.05.514.02.b | +| Semi-Independent Group (SIGRIF) (Sec 501.03) | $169 | IDAPA 16.03.05.514.03 | +| Room and Board (Sec 512) | $198 | IDAPA 16.03.05.514.04 | +| RALF or CFH | $0 (ineligible) | IDAPA 16.03.05.514.05 | + +### Basic Allowances (IDAPA 16.03.05.501) + +These are the "financial need" amounts used to determine if a participant qualifies: + +| Living Arrangement | Basic Allowance | COLA Adjustment | +|---|---|---| +| Single participant | $545 (base) + annual SSI COLA $ amount | Yes, by SSI individual COLA $ | +| Couple/essential person | $768 (base) + annual SSI couple COLA $ | Yes, by SSI couple COLA $ | +| SIGRIF | $349 | No annual adjustment | +| Room and Board | $77 basic + $693 R&B allowance = $770 total | Yes, by SSI individual COLA % | + +### Payment Calculation + +AABD cash payment = min(max_payment, max(0, allowances - countable_income)) + +Where: +- allowances = basic allowance + any special needs allowances +- countable_income = income after SSI-style disregards +- max_payment = maximum from table above + +## Eligibility Criteria + +1. **SSI Receipt Required**: Must receive an SSI payment for the month (IDAPA 16.03.05.514) +2. **Age/Disability**: Must be aged (65+), blind, or disabled (IDAPA 16.03.05, general) +3. **Residency**: Idaho resident +4. **Living Arrangement**: Must NOT reside in RALF or CFH (IDAPA 16.03.05.514.05) + +## Living Arrangement Definitions (IDAPA 16.03.05.501) + +- **501.01 Single**: Living alone, with ineligible spouse, with another participant (not spouse), in another's household, or with TAFI child +- **501.02 Couple/Essential Person**: Living with participant spouse or essential person +- **501.03 SIGRIF**: Living in semi-independent group residential facility +- **512 Room and Board**: Purchasing lodging and meals from non-relative they live with +- **513 RALF/CFH**: Residential Assisted Living Facility or Certified Family Home (NOT eligible for AABD cash) + +## Special Needs Allowances (IDAPA 16.03.05.502) + +- Restaurant meals: $50/month (physician must certify inability to prepare food) +- Service animal food: Amount varies + +## Income Disregards (IDAPA 16.03.05.540-546) + +- $20 standard disregard (Section 540) +- $65 earned income disregard (Section 542) +- 1/2 remaining earned income (Section 544) +- Impairment-related work expenses (Section 543) +- Blindness work expenses (Section 545) +- PASS deductions (Section 546) + +## Key Sources + +1. IDAPA 16.03.05 (full text): https://adminrules.idaho.gov/rules/current/16/160305.pdf +2. Cornell Law - Section 514: https://www.law.cornell.edu/regulations/idaho/IDAPA-16.03.05.514 +3. Idaho DHW AABD page: https://healthandwelfare.idaho.gov/services-programs/financial-assistance/about-aabd-cash-assistance +4. SSA State Assistance Programs (2011): https://www.ssa.gov/policy/docs/progdesc/ssi_st_asst/2011/id.html From 76aadd1f04e4cfc273cb5fc075c316fc64faa6b6 Mon Sep 17 00:00:00 2001 From: Ziming Date: Wed, 15 Apr 2026 19:11:11 -0400 Subject: [PATCH 2/4] Clean up changelog, sources, and household_state_benefits for merge - Delete deprecated changelog_entry.yaml, add changelog.d fragment - Delete sources/working_references.md - Revert household_state_benefits.yaml to master and add id_aabd Co-Authored-By: Claude Opus 4.6 (1M context) --- changelog.d/id-ssp.added.md | 1 + changelog_entry.yaml | 4 - .../household/household_state_benefits.yaml | 26 +++++- sources/working_references.md | 90 ------------------- 4 files changed, 23 insertions(+), 98 deletions(-) create mode 100644 changelog.d/id-ssp.added.md delete mode 100644 changelog_entry.yaml delete mode 100644 sources/working_references.md diff --git a/changelog.d/id-ssp.added.md b/changelog.d/id-ssp.added.md new file mode 100644 index 00000000000..bd7cd3c0e6d --- /dev/null +++ b/changelog.d/id-ssp.added.md @@ -0,0 +1 @@ +Added Idaho Aid to the Aged, Blind, and Disabled (AABD) cash assistance program. diff --git a/changelog_entry.yaml b/changelog_entry.yaml deleted file mode 100644 index dd84d1431d1..00000000000 --- a/changelog_entry.yaml +++ /dev/null @@ -1,4 +0,0 @@ -- bump: minor - changes: - added: - - Implement Idaho AABD (Aid to the Aged, Blind, and Disabled) cash assistance program. diff --git a/policyengine_us/parameters/gov/household/household_state_benefits.yaml b/policyengine_us/parameters/gov/household/household_state_benefits.yaml index 78e3ea265fa..6814e3880bf 100644 --- a/policyengine_us/parameters/gov/household/household_state_benefits.yaml +++ b/policyengine_us/parameters/gov/household/household_state_benefits.yaml @@ -1,10 +1,13 @@ description: The government counts these sources as benefits paid by state agencies. values: 2023-01-01: + # Delaware benefits + - de_ssp + - de_child_care_subsidies + # Georgia benefits + - ga_ssp # Massachusetts benefits - ma_state_supplement - # Idaho benefits - - id_aabd # Colorado benefits - co_state_supplement - co_oap @@ -19,16 +22,25 @@ values: - ca_la_expectant_parent_payment - ca_capi - ca_state_supplement + # Alabama benefits + - al_ssp + # Alaska benefits + - ak_ssp + # Idaho benefits + - id_aabd # Nebraska benefits - ne_child_care_subsidies # Massachusetts benefits - ma_eaedc - ma_tafdc 2024-01-01: + # Delaware benefits + - de_ssp + - de_child_care_subsidies + # Georgia benefits + - ga_ssp # Massachusetts benefits - ma_state_supplement - # Idaho benefits - - id_aabd # Colorado benefits - co_state_supplement - co_oap @@ -43,6 +55,12 @@ values: - ca_la_expectant_parent_payment - ca_capi - ca_state_supplement + # Alabama benefits + - al_ssp + # Alaska benefits + - ak_ssp + # Idaho benefits + - id_aabd # Nebraska benefits - ne_child_care_subsidies # North Carolina benefits diff --git a/sources/working_references.md b/sources/working_references.md deleted file mode 100644 index 1941798aa1f..00000000000 --- a/sources/working_references.md +++ /dev/null @@ -1,90 +0,0 @@ -# Idaho AABD Cash Assistance (State Supplemental Payment) - -## Official Program Name - -**Federal Program**: State Supplemental Payment (SSP) to SSI -**State's Official Name**: Aid to the Aged, Blind, and Disabled (AABD) Cash Assistance -**Abbreviation**: AABD -**Source**: IDAPA 16.03.05 - Eligibility for Aid to the Aged, Blind, and Disabled -**Administering Agency**: Idaho Department of Health and Welfare (DHW) -**Administration Type**: State-administered - -**Variable Prefix**: `id_aabd` - -## Program Overview - -Idaho's AABD Cash Assistance program provides monthly cash payments to SSI recipients -based on their living arrangement. The program is governed by IDAPA 16.03.05, Sections -500-514. - -Key requirement: "Only a participant who receives an SSI payment for the month is -eligible for an AABD cash payment in the same month." (IDAPA 16.03.05.514) - -## Payment Amounts (IDAPA 16.03.05.514, effective 7-1-24) - -### Maximum Monthly AABD Cash Payments - -| Living Arrangement | Max Payment | Reference | -|---|---|---| -| Single participant (Sec 501.01) | $53 | IDAPA 16.03.05.514.01 | -| Couple (Sec 501.02) | $20 | IDAPA 16.03.05.514.02.a | -| Participant w/ essential person (Sec 501.02) | $18 | IDAPA 16.03.05.514.02.b | -| Semi-Independent Group (SIGRIF) (Sec 501.03) | $169 | IDAPA 16.03.05.514.03 | -| Room and Board (Sec 512) | $198 | IDAPA 16.03.05.514.04 | -| RALF or CFH | $0 (ineligible) | IDAPA 16.03.05.514.05 | - -### Basic Allowances (IDAPA 16.03.05.501) - -These are the "financial need" amounts used to determine if a participant qualifies: - -| Living Arrangement | Basic Allowance | COLA Adjustment | -|---|---|---| -| Single participant | $545 (base) + annual SSI COLA $ amount | Yes, by SSI individual COLA $ | -| Couple/essential person | $768 (base) + annual SSI couple COLA $ | Yes, by SSI couple COLA $ | -| SIGRIF | $349 | No annual adjustment | -| Room and Board | $77 basic + $693 R&B allowance = $770 total | Yes, by SSI individual COLA % | - -### Payment Calculation - -AABD cash payment = min(max_payment, max(0, allowances - countable_income)) - -Where: -- allowances = basic allowance + any special needs allowances -- countable_income = income after SSI-style disregards -- max_payment = maximum from table above - -## Eligibility Criteria - -1. **SSI Receipt Required**: Must receive an SSI payment for the month (IDAPA 16.03.05.514) -2. **Age/Disability**: Must be aged (65+), blind, or disabled (IDAPA 16.03.05, general) -3. **Residency**: Idaho resident -4. **Living Arrangement**: Must NOT reside in RALF or CFH (IDAPA 16.03.05.514.05) - -## Living Arrangement Definitions (IDAPA 16.03.05.501) - -- **501.01 Single**: Living alone, with ineligible spouse, with another participant (not spouse), in another's household, or with TAFI child -- **501.02 Couple/Essential Person**: Living with participant spouse or essential person -- **501.03 SIGRIF**: Living in semi-independent group residential facility -- **512 Room and Board**: Purchasing lodging and meals from non-relative they live with -- **513 RALF/CFH**: Residential Assisted Living Facility or Certified Family Home (NOT eligible for AABD cash) - -## Special Needs Allowances (IDAPA 16.03.05.502) - -- Restaurant meals: $50/month (physician must certify inability to prepare food) -- Service animal food: Amount varies - -## Income Disregards (IDAPA 16.03.05.540-546) - -- $20 standard disregard (Section 540) -- $65 earned income disregard (Section 542) -- 1/2 remaining earned income (Section 544) -- Impairment-related work expenses (Section 543) -- Blindness work expenses (Section 545) -- PASS deductions (Section 546) - -## Key Sources - -1. IDAPA 16.03.05 (full text): https://adminrules.idaho.gov/rules/current/16/160305.pdf -2. Cornell Law - Section 514: https://www.law.cornell.edu/regulations/idaho/IDAPA-16.03.05.514 -3. Idaho DHW AABD page: https://healthandwelfare.idaho.gov/services-programs/financial-assistance/about-aabd-cash-assistance -4. SSA State Assistance Programs (2011): https://www.ssa.gov/policy/docs/progdesc/ssi_st_asst/2011/id.html From 34d28e54e2fce1354598d22495b38358b741dd68 Mon Sep 17 00:00:00 2001 From: Ziming Date: Wed, 15 Apr 2026 21:58:41 -0400 Subject: [PATCH 3/4] Fix Idaho AABD to follow IDAPA 16.03.05 regulation - Change definition_period to MONTH (regulation says "for the month") - Implement income-reduced supplement per Section 514 (AABD cash = basic allowance - countable income, capped at max payment) - Add basic_allowance parameter from Section 501 (verified against PDF) - Add RALF_CFH and NONE entries ($0) to payment amount parameter - Add medical facility exclusion to eligibility (Section 501) - Handle couple per-person split (Section 501.02: $20 combined) - Change default living arrangement to NONE - Add id_aabd to spm_unit_benefits - Rewrite tests with real income sources and integration tests Co-Authored-By: Claude Opus 4.6 (1M context) --- .../states/id/dhw/aabd/payment/amount.yaml | 4 + .../id/dhw/aabd/payment/basic_allowance.yaml | 30 +++ .../gov/states/id/dhw/aabd/id_aabd.yaml | 126 +++++------ .../gov/states/id/dhw/aabd/integration.yaml | 195 ++++++++++++++++++ .../gov/states/id/dhw/aabd/id_aabd.py | 27 ++- .../states/id/dhw/aabd/id_aabd_eligible.py | 14 +- .../id/dhw/aabd/id_aabd_living_arrangement.py | 4 +- .../income/spm_unit/spm_unit_benefits.py | 1 + 8 files changed, 329 insertions(+), 72 deletions(-) create mode 100644 policyengine_us/parameters/gov/states/id/dhw/aabd/payment/basic_allowance.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/id/dhw/aabd/integration.yaml diff --git a/policyengine_us/parameters/gov/states/id/dhw/aabd/payment/amount.yaml b/policyengine_us/parameters/gov/states/id/dhw/aabd/payment/amount.yaml index 110444cf5bb..993ab86c3ca 100644 --- a/policyengine_us/parameters/gov/states/id/dhw/aabd/payment/amount.yaml +++ b/policyengine_us/parameters/gov/states/id/dhw/aabd/payment/amount.yaml @@ -23,3 +23,7 @@ SIGRIF: 2024-07-01: 169 ROOM_AND_BOARD: 2024-07-01: 198 +RALF_CFH: + 2024-07-01: 0 +NONE: + 2024-07-01: 0 diff --git a/policyengine_us/parameters/gov/states/id/dhw/aabd/payment/basic_allowance.yaml b/policyengine_us/parameters/gov/states/id/dhw/aabd/payment/basic_allowance.yaml new file mode 100644 index 00000000000..b1862a7c411 --- /dev/null +++ b/policyengine_us/parameters/gov/states/id/dhw/aabd/payment/basic_allowance.yaml @@ -0,0 +1,30 @@ +description: >- + Idaho sets this amount as the monthly basic living allowance for AABD + participants based on living arrangement under the Aid to the Aged, + Blind, and Disabled program. +metadata: + unit: currency-USD + period: month + label: Idaho AABD basic living allowance + breakdown: + - id_aabd_living_arrangement + reference: + - title: IDAPA 16.03.05.501 - Basic Living Allowance + href: https://adminrules.idaho.gov/rules/current/16/160305.pdf#page=39 + - title: IDAPA 16.03.05.512 - Room and Board Allowance + href: https://adminrules.idaho.gov/rules/current/16/160305.pdf#page=40 + +SINGLE: + 2024-07-01: 545 +COUPLE: + 2024-07-01: 768 +ESSENTIAL_PERSON: + 2024-07-01: 768 +SIGRIF: + 2024-07-01: 349 +ROOM_AND_BOARD: + 2024-07-01: 770 +RALF_CFH: + 2024-07-01: 96 +NONE: + 2024-07-01: 0 diff --git a/policyengine_us/tests/policy/baseline/gov/states/id/dhw/aabd/id_aabd.yaml b/policyengine_us/tests/policy/baseline/gov/states/id/dhw/aabd/id_aabd.yaml index 12a5c908206..5113f7c32c9 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/id/dhw/aabd/id_aabd.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/id/dhw/aabd/id_aabd.yaml @@ -1,74 +1,80 @@ -- name: Single SSI recipient in Idaho receives AABD cash payment - period: 2025 +- name: Case 1, RALF/CFH resident ineligible for AABD cash. + period: 2025-01 input: - state_code: ID - ssi: 11_604 - id_aabd_living_arrangement: SINGLE + people: + person1: + age: 70 + social_security: 4_800 + id_aabd_living_arrangement: RALF_CFH + households: + household: + members: [person1] + state_code: ID output: - id_aabd_eligible: true - id_aabd: 636 # $53/month * 12 + id_aabd_eligible: [false] + id_aabd: [0] -- name: Idaho couple on SSI receives AABD couple payment - period: 2025 +- name: Case 2, NONE arrangement ineligible. + period: 2025-01 input: - state_code: ID - ssi: 8_700 - id_aabd_living_arrangement: COUPLE + people: + person1: + age: 70 + social_security: 4_800 + households: + household: + members: [person1] + state_code: ID output: - id_aabd: 240 # $20/month * 12 + id_aabd_eligible: [false] + id_aabd: [0] -- name: Idaho AABD participant with essential person - period: 2025 +- name: Case 3, no SSI ineligible. + period: 2025-01 input: - state_code: ID - ssi: 11_604 - id_aabd_living_arrangement: ESSENTIAL_PERSON + people: + person1: + age: 70 + social_security: 12_000 + id_aabd_living_arrangement: SINGLE + households: + household: + members: [person1] + state_code: ID output: - id_aabd: 216 # $18/month * 12 + id_aabd_eligible: [false] + id_aabd: [0] -- name: Idaho AABD participant in SIGRIF - period: 2025 +- name: Case 4, non-Idaho resident. + period: 2025-01 input: - state_code: ID - ssi: 11_604 - id_aabd_living_arrangement: SIGRIF + people: + person1: + age: 70 + social_security: 4_800 + id_aabd_living_arrangement: SINGLE + households: + household: + members: [person1] + state_code: CA output: - id_aabd: 2_028 # $169/month * 12 + id_aabd: [0] -- name: Idaho AABD participant in room and board - period: 2025 +- name: Case 5, nursing facility resident excluded from AABD. + period: 2025-01 input: - state_code: ID - ssi: 11_604 - id_aabd_living_arrangement: ROOM_AND_BOARD + people: + person1: + age: 70 + social_security: 1_200 + ssi_lives_in_medical_treatment_facility: true + ssi_medicaid_pays_majority_of_care: true + id_aabd_living_arrangement: SINGLE + households: + household: + members: [person1] + state_code: ID output: - id_aabd: 2_376 # $198/month * 12 - -- name: Idaho AABD participant in RALF is ineligible - period: 2025 - input: - state_code: ID - ssi: 11_604 - id_aabd_living_arrangement: RALF_CFH - output: - id_aabd_eligible: false - id_aabd: 0 - -- name: Idaho resident not receiving SSI is ineligible for AABD - period: 2025 - input: - state_code: ID - ssi: 0 - id_aabd_living_arrangement: SINGLE - output: - id_aabd_eligible: false - id_aabd: 0 - -- name: Non-Idaho resident not eligible for AABD - period: 2025 - input: - state_code: CA - ssi: 11_604 - id_aabd_living_arrangement: SINGLE - output: - id_aabd: 0 + # Federal LA = MEDICAL_TREATMENT_FACILITY, excluded by eligibility + id_aabd_eligible: [false] + id_aabd: [0] diff --git a/policyengine_us/tests/policy/baseline/gov/states/id/dhw/aabd/integration.yaml b/policyengine_us/tests/policy/baseline/gov/states/id/dhw/aabd/integration.yaml new file mode 100644 index 00000000000..53f0acf714f --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/id/dhw/aabd/integration.yaml @@ -0,0 +1,195 @@ +- name: Case 1, single with low income gets max AABD. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 70 + social_security: 4_800 + id_aabd_living_arrangement: SINGLE + households: + household: + members: [person1] + state_code: ID + output: + # Countable: ($4,800 - $240 disregard) / 12 = $380/mo + ssi_countable_income: [380] + # SSI: ($11,604 - $4,560) / 12 = $587/mo + ssi: [587] + id_aabd_eligible: [true] + # Need: $545 - $380 = $165; min($165, $53) = $53 + id_aabd: [53] + +- name: Case 2, single with moderate income gets reduced AABD. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 70 + social_security: 6_240 + id_aabd_living_arrangement: SINGLE + households: + household: + members: [person1] + state_code: ID + output: + # Countable: ($6,240 - $240) / 12 = $500/mo + ssi_countable_income: [500] + # SSI: ($11,604 - $6,000) / 12 = $467/mo + ssi: [467] + id_aabd_eligible: [true] + # Need: $545 - $500 = $45; min($45, $53) = $45 + id_aabd: [45] + +- name: Case 3, single with high income receives SSI but no AABD need. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 70 + social_security: 7_200 + id_aabd_living_arrangement: SINGLE + households: + household: + members: [person1] + state_code: ID + output: + # Countable: ($7,200 - $240) / 12 = $580/mo + ssi_countable_income: [580] + # SSI: ($11,604 - $6,960) / 12 = $387/mo + ssi: [387] + id_aabd_eligible: [true] + # Need: max(0, $545 - $580) = $0 + id_aabd: [0] + +- name: Case 4, couple both SSI recipients. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 70 + social_security: 2_400 + id_aabd_living_arrangement: COUPLE + person2: + age: 70 + social_security: 2_400 + id_aabd_living_arrangement: COUPLE + marital_units: + marital_unit: + members: [person1, person2] + marital_unit_id: 0 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: ID + output: + # Combined SS: $4,800/yr, disregard $240 once + # Combined countable: $4,560/yr, per person: $2,280/yr = $190/mo + ssi_countable_income: [190, 190] + # Couple FBR: $17,400/yr, SSI: $12,840/yr, per person: $535/mo + ssi: [535, 535] + id_aabd_eligible: [true, true] + # Per-person allowance: $768/2 = $384 + # Need: $384 - $190 = $194; max per person: $20/2 = $10 + # AABD: min($194, $10) = $10 + id_aabd: [10, 10] + +- name: Case 5, SIGRIF resident with low income. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 70 + social_security: 2_400 + id_aabd_living_arrangement: SIGRIF + households: + household: + members: [person1] + state_code: ID + output: + # Countable: ($2,400 - $240) / 12 = $180/mo + ssi_countable_income: [180] + # SSI: ($11,604 - $2,160) / 12 = $787/mo + ssi: [787] + id_aabd_eligible: [true] + # Need: $349 - $180 = $169; min($169, $169) = $169 + id_aabd: [169] + +- name: Case 6, room and board resident with low income. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 70 + social_security: 4_800 + id_aabd_living_arrangement: ROOM_AND_BOARD + households: + household: + members: [person1] + state_code: ID + output: + # Countable: $380/mo + ssi_countable_income: [380] + # SSI: $587/mo + ssi: [587] + id_aabd_eligible: [true] + # Need: $770 - $380 = $390; min($390, $198) = $198 + id_aabd: [198] + +- name: Case 7, essential person arrangement with low income. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 70 + social_security: 4_800 + id_aabd_living_arrangement: ESSENTIAL_PERSON + households: + household: + members: [person1] + state_code: ID + output: + # Countable: $380/mo (individual, not couple) + ssi_countable_income: [380] + # SSI: $587/mo + ssi: [587] + id_aabd_eligible: [true] + # Need: $768 - $380 = $388; min($388, $18) = $18 + id_aabd: [18] + +- name: Case 8, asymmetric couple, one not ABD gets individual rate. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 70 + social_security: 4_800 + id_aabd_living_arrangement: SINGLE + person2: + age: 30 + marital_units: + marital_unit: + members: [person1, person2] + marital_unit_id: 0 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: ID + output: + id_aabd_eligible: [true, false] + # Person1: individual, countable $380/mo + # Need: $545 - $380 = $165; min($165, $53) = $53 + id_aabd: [53, 0] diff --git a/policyengine_us/variables/gov/states/id/dhw/aabd/id_aabd.py b/policyengine_us/variables/gov/states/id/dhw/aabd/id_aabd.py index 74864aee83f..822990e39b4 100644 --- a/policyengine_us/variables/gov/states/id/dhw/aabd/id_aabd.py +++ b/policyengine_us/variables/gov/states/id/dhw/aabd/id_aabd.py @@ -1,4 +1,7 @@ from policyengine_us.model_api import * +from policyengine_us.variables.gov.states.id.dhw.aabd.id_aabd_living_arrangement import ( + IDAAbdLivingArrangement, +) class id_aabd(Variable): @@ -6,7 +9,7 @@ class id_aabd(Variable): entity = Person label = "Idaho AABD cash payment" unit = USD - definition_period = YEAR + definition_period = MONTH defined_for = "id_aabd_eligible" reference = ( "https://adminrules.idaho.gov/rules/current/16/160305.pdf#page=41", @@ -14,7 +17,21 @@ class id_aabd(Variable): ) def formula(person, period, parameters): - living_arrangement = person("id_aabd_living_arrangement", period) - p = parameters(period).gov.states.id.dhw.aabd.payment.amount - monthly_amount = p[living_arrangement] - return monthly_amount * MONTHS_IN_YEAR + la = person("id_aabd_living_arrangement", period) + p = parameters(period).gov.states.id.dhw.aabd.payment + LA = IDAAbdLivingArrangement + + basic_allowance = p.basic_allowance[la] + max_payment = p.amount[la] + + # Couples: regulation defines combined amounts (Section 501.02) + # Both spouses are AABD participants, each gets half + is_couple = la == LA.COUPLE + per_person_allowance = where(is_couple, basic_allowance / 2, basic_allowance) + per_person_max = where(is_couple, max_payment / 2, max_payment) + + # AABD cash = basic allowance - countable income, capped at max + # (Section 514). Idaho mirrors SSI disregards (Sections 540-546). + countable_income = person("ssi_countable_income", period) + financial_need = max_(0, per_person_allowance - countable_income) + return min_(financial_need, per_person_max) diff --git a/policyengine_us/variables/gov/states/id/dhw/aabd/id_aabd_eligible.py b/policyengine_us/variables/gov/states/id/dhw/aabd/id_aabd_eligible.py index be7eb0fb810..2457160fe18 100644 --- a/policyengine_us/variables/gov/states/id/dhw/aabd/id_aabd_eligible.py +++ b/policyengine_us/variables/gov/states/id/dhw/aabd/id_aabd_eligible.py @@ -8,7 +8,7 @@ class id_aabd_eligible(Variable): value_type = bool entity = Person label = "Idaho AABD eligible" - definition_period = YEAR + definition_period = MONTH defined_for = StateCode.ID reference = ( "https://adminrules.idaho.gov/rules/current/16/160305.pdf#page=41", @@ -17,7 +17,11 @@ class id_aabd_eligible(Variable): def formula(person, period, parameters): receives_ssi = person("ssi", period) > 0 - living_arrangement = person("id_aabd_living_arrangement", period) - not_in_ralf_cfh = living_arrangement != IDAAbdLivingArrangement.RALF_CFH - not_none = living_arrangement != IDAAbdLivingArrangement.NONE - return receives_ssi & not_in_ralf_cfh & not_none + la = person("id_aabd_living_arrangement", period) + LA = IDAAbdLivingArrangement + # Nursing facility residents excluded (Section 501) + federal_la = person("ssi_federal_living_arrangement", period.this_year) + not_in_medical = ( + federal_la != federal_la.possible_values.MEDICAL_TREATMENT_FACILITY + ) + return receives_ssi & not_in_medical & (la != LA.RALF_CFH) & (la != LA.NONE) diff --git a/policyengine_us/variables/gov/states/id/dhw/aabd/id_aabd_living_arrangement.py b/policyengine_us/variables/gov/states/id/dhw/aabd/id_aabd_living_arrangement.py index d0b00c47e6c..57c242d0cdc 100644 --- a/policyengine_us/variables/gov/states/id/dhw/aabd/id_aabd_living_arrangement.py +++ b/policyengine_us/variables/gov/states/id/dhw/aabd/id_aabd_living_arrangement.py @@ -15,10 +15,10 @@ class id_aabd_living_arrangement(Variable): value_type = Enum entity = Person label = "Idaho AABD living arrangement" - definition_period = YEAR + definition_period = MONTH defined_for = StateCode.ID possible_values = IDAAbdLivingArrangement - default_value = IDAAbdLivingArrangement.SINGLE + default_value = IDAAbdLivingArrangement.NONE reference = ( "https://adminrules.idaho.gov/rules/current/16/160305.pdf#page=39", "https://www.law.cornell.edu/regulations/idaho/IDAPA-16.03.05.514", diff --git a/policyengine_us/variables/household/income/spm_unit/spm_unit_benefits.py b/policyengine_us/variables/household/income/spm_unit/spm_unit_benefits.py index 84cb7e78d39..edc8eb29f77 100644 --- a/policyengine_us/variables/household/income/spm_unit/spm_unit_benefits.py +++ b/policyengine_us/variables/household/income/spm_unit/spm_unit_benefits.py @@ -15,6 +15,7 @@ def formula(spm_unit, period, parameters): "ga_ssp", "al_ssp", "ak_ssp", + "id_aabd", # Idaho benefits "de_ssp", # Delaware benefits "ma_state_supplement", # Massachusetts benefits # California programs. From 1a60810ec427b5bd6a970a1a9c1d4a539377ff77 Mon Sep 17 00:00:00 2001 From: Ziming Date: Wed, 15 Apr 2026 22:19:26 -0400 Subject: [PATCH 4/4] Backdate parameters to 2022-07-01, add archive references and invariant test - Backdate amount and basic_allowance parameters to 2022-07-01 (regulation text unchanged since 3-17-22, verified via archived PDFs) - Add 2022 archive PDF references for both parameter files - Add test documenting that eligible person with ineligible spouse uses SINGLE (501.01), not COUPLE (501.02) Co-Authored-By: Claude Opus 4.6 (1M context) --- .../states/id/dhw/aabd/payment/amount.yaml | 16 ++++++----- .../id/dhw/aabd/payment/basic_allowance.yaml | 16 ++++++----- .../gov/states/id/dhw/aabd/id_aabd.yaml | 28 +++++++++++++++++++ 3 files changed, 46 insertions(+), 14 deletions(-) diff --git a/policyengine_us/parameters/gov/states/id/dhw/aabd/payment/amount.yaml b/policyengine_us/parameters/gov/states/id/dhw/aabd/payment/amount.yaml index 993ab86c3ca..46ac8e94f92 100644 --- a/policyengine_us/parameters/gov/states/id/dhw/aabd/payment/amount.yaml +++ b/policyengine_us/parameters/gov/states/id/dhw/aabd/payment/amount.yaml @@ -10,20 +10,22 @@ metadata: reference: - title: IDAPA 16.03.05.514 - AABD Cash Payments href: https://adminrules.idaho.gov/rules/current/16/160305.pdf#page=41 + - title: IDAPA 16.03.05.514 - AABD Cash Payments (2022 Archive) + href: https://adminrules.idaho.gov/rules/2022%20Archive/16/160305.pdf#page=55 - title: Idaho Admin. Code r. 16.03.05.514 href: https://www.law.cornell.edu/regulations/idaho/IDAPA-16.03.05.514 SINGLE: - 2024-07-01: 53 + 2022-07-01: 53 COUPLE: - 2024-07-01: 20 + 2022-07-01: 20 ESSENTIAL_PERSON: - 2024-07-01: 18 + 2022-07-01: 18 SIGRIF: - 2024-07-01: 169 + 2022-07-01: 169 ROOM_AND_BOARD: - 2024-07-01: 198 + 2022-07-01: 198 RALF_CFH: - 2024-07-01: 0 + 2022-07-01: 0 NONE: - 2024-07-01: 0 + 2022-07-01: 0 diff --git a/policyengine_us/parameters/gov/states/id/dhw/aabd/payment/basic_allowance.yaml b/policyengine_us/parameters/gov/states/id/dhw/aabd/payment/basic_allowance.yaml index b1862a7c411..83ba8660df7 100644 --- a/policyengine_us/parameters/gov/states/id/dhw/aabd/payment/basic_allowance.yaml +++ b/policyengine_us/parameters/gov/states/id/dhw/aabd/payment/basic_allowance.yaml @@ -11,20 +11,22 @@ metadata: reference: - title: IDAPA 16.03.05.501 - Basic Living Allowance href: https://adminrules.idaho.gov/rules/current/16/160305.pdf#page=39 + - title: IDAPA 16.03.05.501 - Basic Living Allowance (2022 Archive) + href: https://adminrules.idaho.gov/rules/2022%20Archive/16/160305.pdf#page=53 - title: IDAPA 16.03.05.512 - Room and Board Allowance href: https://adminrules.idaho.gov/rules/current/16/160305.pdf#page=40 SINGLE: - 2024-07-01: 545 + 2022-07-01: 545 COUPLE: - 2024-07-01: 768 + 2022-07-01: 768 ESSENTIAL_PERSON: - 2024-07-01: 768 + 2022-07-01: 768 SIGRIF: - 2024-07-01: 349 + 2022-07-01: 349 ROOM_AND_BOARD: - 2024-07-01: 770 + 2022-07-01: 770 RALF_CFH: - 2024-07-01: 96 + 2022-07-01: 96 NONE: - 2024-07-01: 0 + 2022-07-01: 0 diff --git a/policyengine_us/tests/policy/baseline/gov/states/id/dhw/aabd/id_aabd.yaml b/policyengine_us/tests/policy/baseline/gov/states/id/dhw/aabd/id_aabd.yaml index 5113f7c32c9..8bf652af1ce 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/id/dhw/aabd/id_aabd.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/id/dhw/aabd/id_aabd.yaml @@ -78,3 +78,31 @@ # Federal LA = MEDICAL_TREATMENT_FACILITY, excluded by eligibility id_aabd_eligible: [false] id_aabd: [0] + +- name: Case 6, eligible person with ineligible spouse uses SINGLE not COUPLE. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 70 + social_security: 4_800 + id_aabd_living_arrangement: SINGLE + person2: + age: 30 + marital_units: + marital_unit: + members: [person1, person2] + marital_unit_id: 0 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: ID + output: + # Per 501.01: "living with their ineligible spouse" = SINGLE + # Per 501.02: COUPLE requires both to be AABD participants + # Person1 gets individual rate ($53), not couple rate ($10) + id_aabd: [53, 0]