Skip to content

Count reported SSI and TANF receipt in categorical eligibility lists - #9252

Draft
hua7450 wants to merge 4 commits into
mainfrom
receives-ssi-tanf-categorical
Draft

Count reported SSI and TANF receipt in categorical eligibility lists#9252
hua7450 wants to merge 4 commits into
mainfrom
receives-ssi-tanf-categorical

Conversation

@hua7450

@hua7450 hua7450 commented Aug 6, 2026

Copy link
Copy Markdown
Collaborator

Summary

Companion to #9248, for the other two reported-receipt flags. Categorical-eligibility parameter lists referenced only the modeled amounts (ssi, tanf) and omitted the reported-receipt bare inputs (receives_ssi, receives_tanf), so a household reporting receipt whose modeled amount is $0 was dropped from categorical eligibility.

Fixes #9251

Important

Stacked on #9248 — this branch is cut from receives-flags-categorical-eligibility, not main, because four of the parameter files and four of the test files overlap on adjacent lines. Merge #9248 first; this then rebases onto main as a no-op. The diff shown against main will include #9248's commit.

Mechanism

  • receives_ssi (variables/gov/ssa/ssi/receives_ssi.py) — bare input: bool, Person, MONTH, no formula.
  • receives_tanf (variables/gov/hhs/tanf/cash/receives_tanf.py) — bare input: bool, SPMUnit, MONTH, no formula.

Entities are flipped relative to the SNAP/WIC pair (receives_snap is SPMUnit, receives_wic is Person).

The Python side was already well covered — roughly 50 formulas OR both arms, including meets_snap_categorical_eligibility (with the all-members SSI rule spm_unit.all(receives_ssi)), is_head_start_categorically_eligible, and the Medicaid category variables. The gap was confined to parameter-driven lists.

Changes

Parameter list Added Consumer
gov/usda/school_meals/categorical_eligibility.yaml receives_tanf meets_school_meal_categorical_eligibility
gov/fcc/lifeline/categorical_eligibility.yaml receives_ssi is_lifeline_eligible, is_acp_eligible
gov/fcc/lifeline/tribal_categorical_eligibility.yaml receives_tanf same, tribal branch
gov/ed/pell_grant/efc/simplified/benefits.yaml both pell_grant_simplified_formula_applies
gov/states/tx/dart/qualifying_programs.yaml receives_tanf tx_dart_reduced_fare_program_eligible
gov/states/il/dceo/ihwap/eligibility/categorical_eligibility.yaml receives_ssi il_ihwap_categorically_eligible
gov/states/dc/dhs/power/disqualifying_benefits.yaml receives_ssi dc_power_has_disqualifying_benefits

DC POWER runs the opposite direction

disqualifying_benefits is a disqualifying list, so its missing flag made the model too generous — a household reporting SSI was not disqualified from POWER. Same one-line fix, opposite sign. Please don't read that row as a widening like the others.

Checks performed

  • is_tanf_enrolled redundancy: it is defined as return spm_unit("receives_tanf", period), so any list already carrying it would not need receives_tanf. None of the seven lists carry it, so all additions are live.
  • IHWAP and DC POWER use state TANF variables (il_tanf, dc_tanf), not tanf, so only the SSI arm applied there.
  • MBTA was excluded: its list uses ma_eaedc / ma_tafdc rather than tanf. Whether those need their own receipt flags is a separate question.
  • Entity aggregation verified per file — receives_ssi is Person-entity and every consumer aggregates person → SPMUnit / Household / TaxUnit; receives_tanf is SPMUnit-entity and the Person-entity consumer (DART) projects SPMUnit → Person.

Test plan

  • 342 tests pass across school meals, FCC, Pell Grant, TX DART, IL DCEO, and DC DHS POWER
  • New cases assert the reported-receipt-with-$0-modeled-amount path in each program, including a new test file for dc_power_has_disqualifying_benefits (which had none) covering both the disqualification and the negative case
  • CI passes

hua7450 and others added 3 commits August 6, 2026 13:22
Categorical-eligibility parameter lists referenced only the modeled
benefit amounts (snap, wic), omitting the reported-receipt bare inputs
(receives_snap, receives_wic). Households reporting receipt whose
modeled amount is $0 were dropped from categorical eligibility, unlike
the hardcoded formulas (Head Start, WIC, Medicaid community engagement)
which OR both arms.

Fixes #9247

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Isolate the DART WIC case by zeroing every other qualifying program, and
add multi-person SPM unit cases to both cross-entity consumers (DART and
MBTA) so the SPMUnit-to-Person projection of receives_snap is locked in
for units with more than one member.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…into receives-flags-categorical-eligibility
Companion to the SNAP/WIC fix: categorical-eligibility parameter lists
referenced only the modeled amounts (ssi, tanf), omitting the
reported-receipt bare inputs (receives_ssi, receives_tanf). Households
reporting receipt whose modeled amount is $0 were dropped from
categorical eligibility, unlike the many formulas that OR both arms.

DC POWER runs the opposite direction: disqualifying_benefits is a
disqualifying list, so the missing flag made the model too generous.

Fixes #9251

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@hua7450
hua7450 force-pushed the receives-ssi-tanf-categorical branch from 69b3861 to 14596ed Compare August 7, 2026 15:45
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.

Categorical-eligibility parameter lists omit receives_ssi and receives_tanf

1 participant