Implement Idaho AABD cash assistance program#7729
Implement Idaho AABD cash assistance program#7729MaxGhenis merged 5 commits intoPolicyEngine:mainfrom
Conversation
…stance program Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## main #7729 +/- ##
==========================================
- Coverage 94.54% 91.42% -3.12%
==========================================
Files 7 4 -3
Lines 110 70 -40
Branches 2 2
==========================================
- Hits 104 64 -40
Misses 6 6
Flags with carried forward coverage won't be shown. Click here to find out more. ☔ View full report in Codecov by Sentry. 🚀 New features to boost your workflow:
|
- 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) <noreply@anthropic.com>
…into id-ssp # Conflicts: # policyengine_us/parameters/gov/household/household_state_benefits.yaml
- 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) <noreply@anthropic.com>
…nt 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) <noreply@anthropic.com>
PavelMakarchuk
left a comment
There was a problem hiding this comment.
Program Review: PR #7729 -- Idaho AABD Cash Assistance
Source Documents Consulted
| Source | URL | Accessible | Notes |
|---|---|---|---|
| IDAPA 16.03.05.514 (Cash Payments) | law.cornell.edu | Yes | Amounts match: $53/$20/$18/$169/$198 |
| IDAPA 16.03.05.501 (Basic Allowance) | law.cornell.edu | Yes | Amounts match: $545/$768/$349 |
| IDAPA 16.03.05.512 (Room & Board) | law.cornell.edu | Yes | $693 budgeted + $77 basic = $770 |
| IDAPA 16.03.05.513 (RALF/CFH) | law.cornell.edu | Yes | $96 basic allowance confirmed |
| IDAPA 16.03.05.540 (Standard Disregard) | law.cornell.edu | Yes | $20 standard disregard |
| IDAPA 16.03.05.541 (Earned Income) | law.cornell.edu | Yes | Disregards per Sections 542-547 |
| SSA State Assistance - Idaho | ssa.gov | No (403) | Blocked by SSA |
| IDAPA PDF (current) | adminrules.idaho.gov | Redirect/PDF | Not fully extractable |
| IDAPA PDF (2022 Archive) | adminrules.idaho.gov/rules/2022%20Archive/16/160305.pdf | Redirect/PDF | Not fully extractable |
| POMS SI 01415.010 (Idaho) | secure.ssa.gov | Yes | Limited admin detail only |
Critical Issues (Must Fix)
C1. Missing rounding-up rule (Section 514)
The regulation states: "If the remainder isn't a whole dollar amount, the benefit rounds up to the next dollar." The formula in id_aabd.py does not implement ceiling rounding. The formula computes min_(financial_need, per_person_max) and returns a raw float.
Fix: Add np.ceil() or equivalent rounding to the final payment:
import numpy as np
payment = min_(financial_need, per_person_max)
return np.ceil(payment)Impact: For most test cases the result is already a whole dollar, so tests pass. But real-world scenarios with non-integer countable income would produce incorrect (under-paid) results.
C2. Parameter effective dates use 2022-07-01 without year-by-year COLA updates
The regulation (Section 501) states that the Single and Couple basic allowances increase annually by "the dollar amount of the annual cost-of-living increase in the federal SSI benefit rate" effective January 1 each year. The PR hardcodes all amounts at 2022-07-01 with no subsequent yearly entries.
- If $545/$768 are the current regulation-text amounts (shown as effective July 1, 2024), then the start date of
2022-07-01is wrong -- amounts could have been different in 2022 and 2023. - The amounts for SINGLE and COUPLE should have entries for each year reflecting COLA adjustments (e.g., 2022, 2023, 2024, 2025).
- SIGRIF, RALF/CFH, and potentially the cash payment maximums are fixed and do not adjust (confirmed by regulation), so a single entry is acceptable for those.
Recommended fix:
- Determine the actual amounts for 2022, 2023, 2024, and 2025 using the SSI COLA dollar increases
- Add year-by-year entries for SINGLE and COUPLE basic allowances
- Alternatively, if these amounts have truly been static since 2022, document the evidence with a comment
Note: Room and Board amounts ($693 budgeted + $77 basic) also have a COLA adjustment per Section 512. The combined $770 in the parameter may not reflect the current COLA-adjusted value.
Should Address
S1. programs.yaml not updated
The entry at line 636-639 of programs.yaml has status: in_progress and lacks a variable field. Since this PR implements the program, it should be updated:
- state: ID
status: complete # or partial
name: Idaho AABD
full_name: Idaho AABD cash assistance
variable: id_aabdS2. Idaho income disregards may differ from SSI
The formula comment says "Idaho mirrors SSI disregards (Sections 540-546)." However, IDAPA 16.03.05.540 defines its own $20 standard disregard independently, and Sections 541-547 define earned income disregards in a specific order. The regulation does NOT explicitly state that Idaho uses the same income counting methodology as SSI. While the $20 general disregard matches SSI, there may be differences in earned income treatment (Sections 542-547).
Using ssi_countable_income is a reasonable approximation and follows the pattern used by other state SSP implementations (CA, CO, SC). However, the comment should be more precise: Idaho has its own disregard rules that happen to mirror SSI's structure.
S3. Missing __init__.py or directory structure consideration
The new files are placed under policyengine_us/variables/gov/states/id/dhw/aabd/. The dhw directory is new (no existing files under gov/states/id/dhw/). While policyengine uses auto-discovery and doesn't strictly need __init__.py, verify the directory is created and auto-discovery works. Other states (e.g., al/dhr/ssp/) follow the same pattern without __init__.py, so this should be fine.
S4. spm_unit_benefits.py placement
The id_aabd entry is inserted between ak_ssp and de_ssp with a comment # Idaho benefits. This is fine but breaks the existing alphabetical-ish ordering (AK comes before DE, and ID fits between them). The comment style (# Idaho benefits) is consistent with the existing # Delaware benefits comment.
Suggestions (Non-Blocking)
G1. Consider using is_ssi_eligible instead of or in addition to ssi > 0
The eligibility check receives_ssi = person("ssi", period) > 0 is regulation-accurate ("receives an SSI payment"). However, ssi incorporates takeup adjustments, meaning some SSI-eligible individuals will show ssi = 0 due to non-takeup. This is correct for the regulatory check but may cause unexpected behavior in microsimulation. Alabama's implementation uses both is_ssi_eligible and uncapped_ssi > 0 for a more robust check.
G2. Test coverage gaps
Missing test scenarios:
- Boundary case: Income exactly equal to basic allowance (need = 0)
- Blind/disabled under 65: Regulation mentions specific rules for blind/disabled participants
- COLA year boundaries: Tests only cover 2025-01; no tests for different years to verify parameter lookup
- Non-integer income: Would exercise the rounding-up rule (Critical C1)
- Essential person countable income interaction: Whether the essential person's income is counted
- Person receiving both SSI and earned income: Tests only use Social Security (unearned)
G3. Direct Enum import pattern
The files use a direct import of the Enum class:
from policyengine_us.variables.gov.states.id.dhw.aabd.id_aabd_living_arrangement import (
IDAAbdLivingArrangement,
)This creates a cross-file dependency that could break if the module is restructured. Consider accessing via la.possible_values (as used in al_ssp_eligible.py and ga_ssp_eligible_person.py), which is more resilient:
la = person("id_aabd_living_arrangement", period)
LA = la.possible_valuesG4. Parameter breakdown metadata
The parameters use breakdown: [id_aabd_living_arrangement]. This should match the variable name exactly and work with the parameter validation system. Verify this doesn't trigger the breakdown metadata validation issues noted in CLAUDE.md.
G5. Changelog fragment
The changelog entry changelog.d/id-ssp.added.md uses the branch name id-ssp while the program is called AABD. The content is fine ("Added Idaho Aid to the Aged, Blind, and Disabled (AABD) cash assistance program.") and the type added (minor bump) is correct.
Validation Summary
| Check | Status | Notes |
|---|---|---|
| Payment amounts vs. regulation | PASS | $53/$20/$18/$169/$198 match IDAPA 16.03.05.514 |
| Basic allowances vs. regulation | PARTIAL | $545/$768/$349 match current text; COLA yearly entries missing |
| Room & Board allowance | PARTIAL | $770 = $693+$77 from Section 512; may need COLA update |
| RALF/CFH basic allowance | PASS | $96 matches IDAPA 16.03.05.513 |
| RALF/CFH exclusion | PASS | Section 514.05 correctly implemented |
| Nursing facility exclusion | PASS | Uses ssi_federal_living_arrangement MEDICAL_TREATMENT_FACILITY |
| SSI receipt requirement | PASS | Section 514 requires SSI payment in same month |
| Couple amount division | PASS | $20 total / 2 = $10 per person; $768 / 2 = $384 per person |
| Essential person treatment | PASS | $18 and $768 not divided (only participant receives) |
| Income counting approach | PASS | Reuses ssi_countable_income; mirrors SSI disregards per Sections 540-546 |
| Rounding up to next dollar | FAIL | Regulation requires ceiling rounding; not implemented |
| Period handling (MONTH/YEAR) | PASS | Auto-conversion works; consistent with AL/GA SSP patterns |
| Entity level (Person) | PASS | Correct for individual-level benefit |
defined_for usage |
PASS | Uses both StateCode.ID and "id_aabd_eligible" appropriately |
| Variable naming convention | PASS | id_aabd_* prefix is clear and consistent |
| Changelog fragment | PASS | id-ssp.added.md with correct type |
household_state_benefits.yaml |
PASS | Added to both 2023 and 2024 lists |
spm_unit_benefits.py |
PASS | Added to BENEFITS list |
| Test coverage breadth | PARTIAL | Good coverage of arrangements; missing boundary/earned income cases |
| Existing variable reuse | PASS | Correctly reuses ssi_countable_income, ssi, ssi_federal_living_arrangement |
| Reference URLs | PASS | All law.cornell.edu and adminrules.idaho.gov URLs are valid |
programs.yaml update |
FAIL | Status still in_progress; missing variable field |
Review Severity: REQUEST_CHANGES
Two critical issues require resolution:
- C1 (rounding): The regulation mandates ceiling rounding; omitting it produces under-payments for non-integer results.
- C2 (COLA dates): Parameter effective dates of
2022-07-01may produce incorrect amounts for years before or after the regulation-text snapshot, since the Single and Couple basic allowances adjust annually with SSI COLA.
Additionally, programs.yaml should be updated (S1) to reflect the completed implementation.
Generated with Claude Code
Summary
Implements Idaho's Aid to the Aged, Blind, and Disabled (AABD) cash assistance program — a state-administered supplemental payment to SSI recipients based on living arrangement, with income-reduced benefits per IDAPA 16.03.05.
Closes #7729
Regulatory Authority
Program Overview
Eligibility
ssi > 0defined_for = StateCode.IDssi_federal_living_arrangement != MEDICAL_TREATMENT_FACILITYla != RALF_CFHBenefit Calculation (Section 514)
AABD cash = min(max(0, basic_allowance - countable_income), max_payment)
Idaho mirrors SSI disregards (Sections 540-546), so
ssi_countable_incomeis reused.Basic Allowances (Section 501, verified against PDF)
Couple treatment: $768 combined basic allowance and $20 combined max, each spouse gets half.
Not Modeled (by design)
Files
parameters/gov/states/id/dhw/aabd/payment/amount.yaml— max AABD cash by arrangementparameters/gov/states/id/dhw/aabd/payment/basic_allowance.yaml— basic living allowance by arrangement (NEW)variables/gov/states/id/dhw/aabd/id_aabd.py— benefit formula with income-reduced modelvariables/gov/states/id/dhw/aabd/id_aabd_eligible.py— eligibility (SSI receipt + medical facility exclusion)variables/gov/states/id/dhw/aabd/id_aabd_living_arrangement.py— living arrangement enumvariables/household/income/spm_unit/spm_unit_benefits.py— added id_aabdparameters/gov/household/household_state_benefits.yaml— added id_aabdtests/policy/baseline/gov/states/id/dhw/aabd/id_aabd.yaml— 5 unit teststests/policy/baseline/gov/states/id/dhw/aabd/integration.yaml— 8 integration tests (NEW)Verification TODO
Test plan
🤖 Generated with Claude Code