PolicyEngine / PolicyEngine/policyengine-us
TANF disability classification gates ignore benefit receipt (MT two-parent, VA TANF-UP, DC resource limit)
- Dominant language
- Python
- Stars
- 162
- Forks
- 212
- Avg merge
- 3d 3h
- Merged PRs (30d)
- 97
Description
Part of #9330 (disconnected disability inputs audit).
## Summary
Three TANF-family classification/resource gates key on generic `is_disabled` where the state's rule keys on **benefit receipt** — so SSI/SSDI recipients not flagged `is_disabled` are misclassified.
## MT — two-parent classification ignores SSI receipt (CONFIRMED)
`policyengine_us/variables/gov/states/mt/dhs/tanf/work_requirement/mt_tanf_is_working.py:17`:
```python
able_parents = is_head_or_spouse & ~is_disabled
```
[ARM 37.78.103](https://www.law.cornell.edu/regulations/montana/Mont-Admin-r-37.78.103): a two-parent household "is considered a single-parent household for work participation hours if one or both of the parents **receives Supplemental Security Income (SSI)** benefits or is incapacitated"; SSI recipients are also excluded from work-eligible individuals.
Impact: a parent with `ssi > 0` not flagged `is_disabled` counts as able-bodied → the unit gets the flat two-parent 132-hour requirement instead of the single-parent age-scaled hours.
**Fix**: also exclude parents with `ssi > 0`.
**Related, SUSPECTED**: `mt_tanf_meets_work_requirements.py:18` fully exempts any `is_disabled` parent, but per TANF 705-1 incapacity only re-classifies hours, and only SSI recipients are excluded from work-eligible individuals. Verify whether a broader WoRC exemption list exists elsewhere in the DPHHS manual before changing.
## VA — TANF-UP "able-bodied" test misses SSDI/SSI receipt (CONFIRMED)
`policyengine_us/variables/gov/states/va/dss/tanf/eligibility/va_up_tanf_eligibility.py:15`:
```python
able_bodied_adult = head_or_spouse & ~is_disabled
```
VA TANF Manual [ch. 700 §701.3](https://www.dss.virginia.gov/media/vdss/benefit-programs/documents/tanfx2fview/tanf/Chapter-700---TANF-UP-Unemployed-Parent-Program.pdf#page=3) and [ch. 900 §901.2 E](https://www.dss.virginia.gov/media/vdss/benefit-programs/documents/tanfx2fview/view/Chapter-900---The-Virginia-Initiative-for-Education-and-Work-(VIEW)-Program.pdf#page=4): "Individuals who are incapacitated, **as determined by receipt of** Social Security Disability (SSDI) benefits or Supplemental Security Income (SSI) … the case is a TANF case rather than a TANF-UP case."
**Fix**: `is_disabled | (social_security_disability > 0) | (ssi > 0)`. Also unmodeled in the same test: the §901.2 F age-60+ exemption, which likewise converts the case to TANF.
## DC — resource limit should use SNAP's receipt-based disabled definition (CONFIRMED)
`policyengine_us/variables/gov/states/dc/dhs/tanf/eligibility/dc_tanf_resources_eligible.py:20`:
```python
has_disabled = spm_unit.any(person("is_disabled", period))
```
[DC TANF State Plan (Oct 2023), p. 40](https://dhs.dc.gov/sites/default/files/dc/sites/dhs/service_content/attachments/DC%20TANF%20State%20Plan_Oct-2023.pdf#page=40): "Countable Resources must be less than the SNAP Resource Limit", with the SNAP elderly/disabled table — SNAP's "disabled" is the federal receipt-based definition already modeled as `is_usda_disabled` (whose own receipt-semantics defect is tracked separately; the two fixes compose).
**Fix**: `spm_unit.any(person("is_usda_disabled", period.this_year))`.
Contributor guide
Research direction
Read the three named variable files and compare their existing disability predicates with the linked Montana, Virginia, and DC rules. Verify the suspected Montana work-requirement behavior and the existing is_usda_disabled semantics before changing anything. Done means the TANF gates use the stated receipt-based definitions, including SSI/SSDI and the SNAP-aligned DC resource test.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- python
- Domain
- backend
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Active
- Clarity
- Clearly specified
- Newbie friendliness
- 68/100