PolicyEngine / PolicyEngine/policyengine-us
Disconnected disability inputs: repo-wide audit of disability gates vs their legal definitions
- Dominant language
- Python
- Stars
- 162
- Forks
- 212
- Avg merge
- 3d 3h
- Merged PRs (30d)
- 97
Description
## Summary
#9329 found that the Medicaid community-engagement exemption and the SSI disability pathway run on two disconnected inputs. A repo-wide sweep (2026-08-24; ~160 files across six program families; every confirmed finding checked against fetched statutory or manual text) shows this is a systemic class, not a one-off: **38 confirmed and 7 suspected** wiring defects where a program's legal disability test doesn't match the input the formula reads.
This umbrella documents the input taxonomy and fix patterns, tracks the high-priority findings filed as child issues, and holds the long tail as a checklist.
## The disconnected inputs
These person-level flags never imply each other — a person flagged on one side is invisible to every program wired to the other side:
| Variable | What it is |
|---|---|
| `is_disabled` | formula-less input; broad, undefined severity |
| `is_blind` | formula-less input; shared by both sides (why blind cases often escape the bug) |
| `meets_ssi_disability_criteria` | formula-less input; SSI §1614 medical criteria before the SGA screen |
| `is_ssi_disabled` | `meets_ssi_disability_criteria & ~ssi_engaged_in_sga` — the full 42 USC 1382c(a)(3) definition |
| `is_ssi_aged_blind_disabled` | aged \| blind \| SSI-disabled — does **not** include generic `is_disabled` |
| `is_permanently_and_totally_disabled` | formula-less input; the IRC §22(e)(3)-style P&T standard |
| `is_incapable_of_self_care` | formula-less input; the IRC §21 CDCC standard |
| `social_security_disability` | SSDI dollars; `> 0` is the SSDI-receipt proxy |
| `ssi` / `uncapped_ssi` | actual receipt (incl. income test + takeup) / passes the federal income test |
## Defect directions
- **A** — law cross-references the SSI/SSA definition or benefit receipt; code reads only generic `is_disabled` (the #9329 pattern)
- **B** — law has a narrower or different standard; the generic flag over-includes (or a covered group, e.g. the blind, is dropped)
- **C** — receipt-vs-definition mismatch
- **D** — sibling provisions wired differently with no legal basis
## Fix shapes (all additive or flag swaps — nothing needs generic `is_disabled` removed where the law is genuinely broad)
1. **OR in SSI-side flags** (`meets_ssi_disability_criteria` / `is_ssi_disabled`) where the law cross-references §1614 or SSA criteria
2. **Use receipt** (`ssi > 0`, `social_security_disability > 0`, `total_disability_payments`) where the law says "receives"
3. **Swap to `is_permanently_and_totally_disabled`** for "totally and permanently disabled" (§22-style) statutes
4. **Use `is_incapable_of_self_care`** for IRC §21-derived provisions
## High-priority findings (child issues)
- [ ] #9331 — SNAP unfitness exemptions (ABAWD, work registration, student rule)
- [ ] #9332 — `is_usda_disabled` receipt semantics + dropped blind SSI recipients
- [ ] #9333 — SSI student earned income exclusion
- [ ] #9334 — Medicaid home equity family exception
- [ ] #9335 — AR Medicaid work requirement (state analogue of #9329)
- [ ] #9336 — CA WDP and IL HBWD working-disabled buy-ins
- [ ] #9337 — HUD person-with-disabilities definition
- [ ] #9338 — CO AND-CS state supplement receipt gate
- [ ] #9339 — MA EAEDC SSI-eligibility exclusion (missing income test)
- [ ] #9340 — TANF classification gates (MT two-parent, VA TANF-UP, DC resource limit)
- [ ] #9329 — federal Medicaid work requirement (the original finding; still unfixed)
## Remaining confirmed findings (tracked here)
### State tax provisions
| Provision | File | Law | Fix |
|---|---|---|---|
| DE elderly/disabled exclusion | `de_elderly_or_disabled_income_exclusion_eligible_person.py:22` | [30 Del. C. §1106(b)(3)](https://delcode.delaware.gov/title30/c011/sc02/index.html): "total and permanent disability" | `is_permanently_and_totally_disabled` |
| GA retirement exclusion | `ga_retirement_exclusion_eligible_person.py:22` | [O.C.G.A. §48-7-27(a)(5)](https://codes.findlaw.com/ga/title-48-revenue-and-taxation/ga-code-sect-48-7-27/): permanent, "incapable of performing any gainful occupation" | `is_permanently_and_totally_disabled` |
| ID aged/disabled credit + deduction | `id_aged_or_disabled_credit_eligible_person.py:18`, `id_aged_or_disabled_deduction_eligible_person.py:18` | [Idaho Code §63-3025D](https://legislature.idaho.gov/statutesrules/idstat/title63/t63ch30/sect63-3025d/): **developmental disability** per §66-402 only | needs a new developmental-disability input (see below) |
| ID retirement benefits deduction | `id_retirement_benefits_eligible_person.py:16` | §63-3022A → [§63-701](https://legislature.idaho.gov/statutesrules/idstat/title63/t63ch7/sect63-701/): "recognized as disabled by the social security administration" or other listed agency | P&T flag or receipt disjunction |
| HI disabled exemption | `hi_disabled_exemptions.py:19` | HRS §235-54(c) / [Haw. Admin. R. §18-235-1.11](https://www.law.cornell.edu/regulations/hawaii/Haw-Code-R-SS-18-235-1-11): "blind, deaf, or totally disabled" — **blind never read** | `is_permanently_and_totally_disabled \| is_blind`; deaf unmodeled |
| MD pension subtraction | `md_pension_subtraction_amount.py:21` | [Tax-Gen §10-209](https://law.justia.com/codes/maryland/tax-general/title-10/subtitle-2/part-ii/section-10-209/): "totally disabled", physician-certified | P&T flag for person and spouse |
| NJ pension exclusion | `nj_eligible_pension_income.py:20` | [NJ Div. of Taxation](https://www.nj.gov/treasury/taxation/njit7.shtml): "disabled as defined by Social Security guidelines" | `is_permanently_and_totally_disabled \| is_blind` |
| OR WFHDC credit | `or_wfhdc_has_qualified_individual_eligible.py:23`, `or_wfhdc_eligibility_category.py:36` | [ORS 315.264](https://oregon.public.law/statutes/ors_315.264) keys to IRC §21; federal CDCC in-repo already reads the right flag | `is_incapable_of_self_care` |
| AR disabled-dependent credit | `ar_personal_credit_disabled_dependent.py:19` | [Ark. Code §26-51-503](https://codes.findlaw.com/ar/title-26-taxation/ar-code-sect-26-51-503.html): "child with a **developmental disability**", physician-certified | needs the same new input |
| MA child & family credit | `ma_child_and_family_credit.py:23` | [MGL c.62 §6(x)](https://malegislature.gov/Laws/GeneralLaws/PartI/TitleIX/Chapter62/Section6) incorporates IRC §21(b)(1)(C): an incapacitated **spouse** qualifies but can never satisfy the `dependent` gate | add `is_incapable_of_self_care & is_tax_unit_spouse` prong |
| KY homestead exemption | `ky_homestead_exemption_eligible.py:19` (comment admits proxy) | [KRS 132.810(2)(a)](https://apps.legislature.ky.gov/law/statutes/statute.aspx?id=39641): classified totally disabled under a federal/retirement program and "received disability payments" | receipt-based gate (SSDI/SSI/`total_disability_payments`) |
| MS homestead exemption | `ms_age_disability_homestead_exemption_eligible.py:23` | [Miss. Code §27-33-67(2)](https://law.justia.com/codes/mississippi/title-27/chapter-33/article-1/section-27-33-67/): totally disabled under the Social Security Act (42 USC 416(i)), RRA, or other federal act | P&T flag or receipt gate |
| SC homestead exemption | `sc_homestead_exemption_eligible.py:21` | [S.C. Code §12-37-250](https://www.scstatehouse.gov/code/t12c037.php): "classified as totally and permanently disabled by a state or federal agency" | `is_permanently_and_totally_disabled` |
| WA senior/disabled PTE | `wa_pte_categorical_eligible.py:26` (comment admits proxy) | [RCW 84.36.383(6)](https://app.leg.wa.gov/RCW/default.aspx?cite=84.36.383): disability "as provided in 42 U.S.C. Sec. 423(d)(1)(A)" | `is_permanently_and_totally_disabled` |
| IN blind/disabled property credit | `in_blind_disabled_property_tax_credit.py:31` (comment admits proxy) | [IC 6-1.1-12-11](https://law.justia.com/codes/indiana/title-6/article-1-1/chapter-12/section-6-1-1-12-11/): unable to engage in any SGA, 12+ months; SSA benefit eligibility is proof | `is_permanently_and_totally_disabled` |
| MN M1PR + renters credit | `mn_homestead_credit_refund_household_income.py:78`, `mn_renters_credit_household_income.py:29` | [M1PR instructions](https://www.taxformfinder.org/forms/2024/2024-minnesota-form-m1pr-instructions.pdf#page=9): SSA-certified, 12-month unable-to-work, **or blind** — blind claimants lose the $5,050 subtraction | add `\| is_blind` in both |
| MT disabled-dependent exemption | `mt_dependent_exemptions_person.py:20` | [ARM 42.15.403](https://regulations.justia.com/states/montana/department-42/chapter-42-15/subchapter-42-15-4/rule-42-15-403/): physician-certified permanent disability ≥ 50% of body (historical years; repealed 2024) | P&T flag; low priority |
### Other confirmed
- [ ] `disabled_head`/`disabled_spouse` (household/demographic/tax_unit) read `is_ssi_disabled` while siblings `head_is_disabled`/`spouse_is_disabled` read generic `is_disabled`; consumers are NJ (N.J.S.A. 54A:3-1(b) — §22-style definition, no SSI reference) and NH RSA 77:5. Direction D — rewire to generic `is_disabled` and consider consolidating the duplicate pairs.
- [ ] IL HBWD worker test (`il_hbwd_countable_earned_income.py:24`) narrower than its own eligibility test — an SSDI-receipt-only worker passes eligibility but is denied the §120.510(i) earned-income exemptions. Fix: derive from `il_hbwd_disability_eligible`. (Grouped with the buy-in child issue.)
- [ ] CalWORKs resource limit (`ca_tanf_resources_limit.py:19`): [CalWORKs 42-200](https://my.dpss.lacounty.gov/public/en/home/epolicy/program/calworks/property/property.html) / [ACL 22-66](https://cdss.ca.gov/Portals/9/Additional-Resources/Letters-and-Notices/ACLs/2022/22-66.pdf#page=2) require impairment **and** receipt (SDI, Workers' Comp TD, IHSS, SSI/SSP) for adults. Fix: receipt-based adult leg; keep broad flag for children (their definition is genuinely broad).
- [ ] DC POWER (`dc_power_head_or_spouse_eligible.py:24`): [DC Code §4-205.72](https://code.dccouncil.gov/us/dc/council/code/sections/4-205.72) is a cannot-work standard, not self-care. Fix: use `is_disabled` (or OR both) for the incapacity leg.
- [ ] Denver property tax relief (`has_co_denver_dhs_elderly_disabled.py:14`): [Denver program](https://denvergov.org/Government/Agencies-Departments-Offices/Agencies-Departments-Offices-Directory/Department-of-Housing-Stability/Resident-Resources/Property-Tax-Relief) requires SGA-inability **and** receipt of a public benefit payment. Fix: at minimum OR SSI/SSDI receipt; document unmodeled CO/Denver payment legs.
- [ ] MS CCPP special-needs child (`ms_ccpp_eligible_child.py:15`, `ms_ccpp_maximum_weekly_rate.py:40`, `ms_ccpp_minimum_fee_category.py:25`): the [CCPP manual](https://www.mdhs.ms.gov/wp-content/uploads/2026/01/CCPP-Policy-Manual_Final_1142025.pdf#page=10) defines "child with special needs" verbatim as the SSI child disability standard (42 USC 1382c(a)(3)(C)(i)), with IEP/IFSP as the alternate verification channel. Fix: `meets_ssi_disability_criteria | has_individualized_education_program` in all three gates.
## Suspected findings (needs verification before filing fixes)
- [ ] **MS Healthier Mississippi Waiver** (`ms_hmw_demographic_eligible.py:17`) ignores SSDI receipt — an SSDI recipient in the 24-month Medicare waiting period is the target population but is missed; MS's own `ms_wd_disability_eligible` accepts `ssdi > 0`. The [waiver STCs](https://medicaid.ms.gov/wp-content/uploads/2024/09/Healthier-Mississippi-Extension.pdf#page=8) don't define "disabled" — verify against MS ABD policy (Chapter 400).
- [ ] **IN RCAP** (`in_ssp_rcap_eligible.py:20`) requires `is_ssi_aged_blind_disabled`, but IC 12-10-6-2.1(a)'s condition is functional (dementia/mental illness/physical disability), not SSI's ABD categories — Medicaid recipients under 65 with dementia/mental illness are missed.
- [ ] **MT TANF blanket exemption** (`mt_tanf_meets_work_requirements.py:18`): per TANF 705-1 incapacity only re-classifies hours; only SSI recipients are excluded from work-eligible individuals. Verify whether a broader WoRC exemption list exists elsewhere in the DPHHS manual.
- [ ] **MN MFIP adult-care deduction** (`mn_mfip_dependent_care_deduction.py:23`): [MN Stat. 142G.16](https://www.revisor.mn.gov/statutes/cite/142G.16) covers children only; the adult leg rests on Combined Manual 0018.09 (bot-walled, unfetchable). ME's identical concept uses `is_incapable_of_self_care`; MN uses `is_disabled` — one is presumably mis-keyed.
- [ ] **MS CCPP activity waiver** (`ms_ccpp_activity_eligible.py:23`): the manual pairs the SSI definition with "current documentation of SSI benefits"; ambiguous whether that conditions eligibility or only priority ranking. If eligibility: `is_ssi_disabled & ((ssi > 0) | receives_ssi)`.
- [ ] **OK CCS predetermined eligibility** (`ok_ccs_predetermined_eligible.py:23`): checks only computed `ssi > 0`; siblings MD/MI/MO/LA all use `(ssi > 0) | receives_ssi`. Minor repo-consistency fix.
- [ ] **DC disabled exclusion subtraction** (`dc_disabled_exclusion_subtraction.py:21`): receipt list omits railroad/federal/DC disability benefits that the D-40 rule lists and the property-tax sibling captures via `total_disability_payments`.
## Not representable today (documented non-modeling, not defects)
- **Developmental disability**: Idaho §63-3025D/§63-3022E and Arkansas §26-51-503 cover *only* developmental disabilities. No existing input fits — either add a `has_developmental_disability`-type input or record an explicit not-modeled decision. Generic `is_disabled` is the worst available choice for both.
- **7 CFR 271.2 remainder**: government disability retirement (SSA §221(i)-permanent) and Railroad Retirement disability annuities have no model inputs (`railroad_benefits` has no disability split).
## Notes
- Three files (KY, WA, IN property tax) carry comments admitting the generic flag is a proxy — the repo has known about this class locally but has no policy. This issue is intended to be that policy reference.
- Microsimulation impact depends on which flags the dataset actually populates (e.g. whether `meets_ssi_disability_criteria` is imputed for non-recipients). Direction-A bugs bite in microsim only where SSI-side flags are set; all of them bite in household calculations and the API.
Contributor guide
Research direction
Start with the input taxonomy and the high-priority child issue #9331, then inspect the named policy modules such as de_elderly_or_disabled_income_exclusion_eligible_person.py and ms_ccpp_eligible_child.py. Compare each gate with its cited statutory or manual definition and use the listed fix direction. Done means the confirmed findings are addressed or tracked in child issues, while suspected findings remain separately verified.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- python
- Domain
- backend
- Issue type
- Bug
- Difficulty
- 5/5
- Estimated time
- Over a week
- Activity status
- Active
- Clarity
- Mostly clear
- Newbie friendliness
- 35/100