Skip to content

Implement Idaho AABD cash assistance program#7729

Merged
MaxGhenis merged 5 commits intoPolicyEngine:mainfrom
mattunrath:id-ssp
Apr 17, 2026
Merged

Implement Idaho AABD cash assistance program#7729
MaxGhenis merged 5 commits intoPolicyEngine:mainfrom
mattunrath:id-ssp

Conversation

@mattunrath
Copy link
Copy Markdown
Contributor

@mattunrath mattunrath commented Mar 7, 2026

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

  • Administration: State Department of Health and Welfare
  • Funding: State funds
  • Effective date: January 1, 1974

Eligibility

Requirement Source How Modeled
Must receive SSI payment for the month Section 514 ssi > 0
Must reside in Idaho State program defined_for = StateCode.ID
Not in nursing/medical facility Section 501 ssi_federal_living_arrangement != MEDICAL_TREATMENT_FACILITY
Not in RALF/CFH Section 514.05 la != RALF_CFH

Benefit Calculation (Section 514)

AABD cash = min(max(0, basic_allowance - countable_income), max_payment)

Idaho mirrors SSI disregards (Sections 540-546), so ssi_countable_income is reused.

Basic Allowances (Section 501, verified against PDF)

Arrangement Basic Allowance Max AABD Cash
Single (501.01) $545 $53
Couple (501.02) $768 combined $20 combined
Essential Person (501.02) $768 $18
SIGRIF (501.03) $349 $169
Room & Board (512) $770 ($693+$77) $198
RALF/CFH (513) $96 Not eligible

Couple treatment: $768 combined basic allowance and $20 combined max, each spouse gets half.

Not Modeled (by design)

What Source Why Excluded
Care level allowances ($835–$969/mo for RALF/CFH) Section 513 Provider payment, not cash to individual
Restaurant meals allowance ($50/mo) Section 502.01 Special needs, requires physician statement
Service animal food allowance ($17/mo) Section 502.02 Special needs

Files

  • parameters/gov/states/id/dhw/aabd/payment/amount.yaml — max AABD cash by arrangement
  • parameters/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 model
  • variables/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 enum
  • variables/household/income/spm_unit/spm_unit_benefits.py — added id_aabd
  • parameters/gov/household/household_state_benefits.yaml — added id_aabd
  • tests/policy/baseline/gov/states/id/dhw/aabd/id_aabd.yaml — 5 unit tests
  • tests/policy/baseline/gov/states/id/dhw/aabd/integration.yaml — 8 integration tests (NEW)

Verification TODO

  • Verify payment amounts against IDAPA 16.03.05.514 PDF page 41
  • Verify basic allowances against IDAPA 16.03.05.501 PDF page 39
  • Verify amounts current for 2025 — COLA adjustments may update values effective Jan 1, 2025
  • CI passes

Test plan

  • 13 tests pass (5 unit + 8 integration with real income through SSI chain)
  • CI passes

🤖 Generated with Claude Code

…stance program

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@codecov
Copy link
Copy Markdown

codecov bot commented Mar 7, 2026

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 91.42%. Comparing base (d51a2e2) to head (1a60810).
⚠️ Report is 155 commits behind head on main.

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              
Flag Coverage Δ
unittests 91.42% <100.00%> (-3.12%) ⬇️

Flags with carried forward coverage won't be shown. Click here to find out more.

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

hua7450 and others added 4 commits April 15, 2026 19:11
- 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>
@hua7450 hua7450 marked this pull request as ready for review April 16, 2026 02:20
@hua7450 hua7450 requested a review from PavelMakarchuk April 17, 2026 23:08
@MaxGhenis MaxGhenis merged commit cbcbbea into PolicyEngine:main Apr 17, 2026
8 of 9 checks passed
Copy link
Copy Markdown
Collaborator

@PavelMakarchuk PavelMakarchuk left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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-01 is 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_aabd

S2. 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_values

G4. 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:

  1. C1 (rounding): The regulation mandates ceiling rounding; omitting it produces under-payments for non-integer results.
  2. C2 (COLA dates): Parameter effective dates of 2022-07-01 may 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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants