Skip to content

Prorate income and expenses of SNAP-ineligible household members (7 CFR 273.11(c))#8892

Draft
hua7450 wants to merge 4 commits into
PolicyEngine:mainfrom
hua7450:snap-ineligible-member-income
Draft

Prorate income and expenses of SNAP-ineligible household members (7 CFR 273.11(c))#8892
hua7450 wants to merge 4 commits into
PolicyEngine:mainfrom
hua7450:snap-ineligible-member-income

Conversation

@hua7450

@hua7450 hua7450 commented Jul 4, 2026

Copy link
Copy Markdown
Collaborator

Summary

Implements 7 CFR 273.11(c) and (d): the treatment of income and deductible expenses of household members who are ineligible for SNAP. Previously the model removed ineligible members from the household size but counted 100% of their income, and prorated only the employment income of work-requirement-failing members.

Addresses #6531; supersedes closed PR #6526.

Regulatory authority

What this implements

Member type Legal treatment How modeled
Ineligible alien, excepted categories of 273.11(c)(3)(i)(A)–(G) (post-OBBBA refugees, asylees, parolees, withholding) (c)(3)(ii): all 53 state agencies elect proration Income counted share = eligible members / household members
Ineligible alien, other statuses (undocumented, DACA, TPS, conditional entrant) (c)(3)(i): state option Prorate (40 states, default); count all (9 states: AZ GU ID IN KS ME MA TN UT); count all for gross test, prorate for net (4 states: AR HI KY NC)
Ineligible student 273.11(d) + 273.1(b)(7): nonhousehold member Income counted share = 0; excluded from proration denominator
Fails work requirements (general or ABAWD) (c)(2) proration for ABAWDs Prorated (all income types, not just employment income as before)
  • Proration fraction per (c)(2)(ii): divide the member's income evenly among household members (excluding ineligible students); count all but the ineligible members' shares.
  • The 20% earned income deduction automatically applies to the prorated earnings (deduction is computed from the prorated snap_earned_income).
  • Expenses per (c)(2)(iii): child support scales by the payer's counted share (payer is known); shelter, utility allowance, and dependent care scale by a unit-level counted share under a stated per-capita payment assumption; medical expenses of students and prorated members are excluded.
  • Resources continue to count in full (asset test unchanged).
  • Household size treatment (snap_unit_size) was already correct and is unchanged.
  • CA's OBBBA delay (ACL 25-92, to 2026-04-01) carries through automatically via is_snap_immigration_status_eligible.

Structural changes

  • snap_earned_income_person becomes a true Person-level variable (was SPMUnit with a unit-level defined_for gate). This fixes a pre-existing bug: an excluded K-12 child earner's income was counted whenever any countable earner existed in the unit.
  • New snap_unearned_income_person; unearned source list split into sources/unearned_person.yaml + sources/unearned_spm_unit.yaml (tanf stays fully counted at the unit level — cannot be attributed to a member). sources/earned.yaml replaced by sources/earned_person.yaml; unit-level self-employment income (after expense deduction) is attributed to members in proportion to gross self-employment income.
  • New snap_gross_test_income feeds snap_gross_income_fpg_ratio (differs from net-side gross income only in AR/HI/KY/NC with undocumented-type members). This also flows to the TANF non-cash (BBCE) gross test, which mirrors SNAP rules.
  • snap_work_requirement_income_proration_fraction removed; replaced by snap_prorated_income_fraction + snap_income_counted_share (only internal consumers).

Behavior changes (all intentional)

  1. Ineligible aliens' income is prorated (or fully counted / hybrid per state election) instead of 100% counted → higher benefits for mixed-status households in prorating states.
  2. Ineligible students' income is excluded entirely (was fully counted).
  3. Work-requirement-failing members: proration now covers all their income (was employment income only) and the denominator excludes ineligible students.
  4. Excluded child earner leak fixed (see above).
  5. Deductible expenses are reduced by ineligible members' shares (was: full deductions).

Not modeled (by design)

What Authority Why
Full income counting for work-sanction disqualifications 273.11(c)(1) Deferred to a follow-up PR so its benefit-reducing microsim impact is separately attributable; members failing work requirements stay in the prorate bucket here
IPV / felony / fleeing felon / SSN-refusal / child support disqualifications 273.11(c)(1)–(2) No model inputs for these statuses
Count-none-with-benefit-cap option for excepted-category aliens 273.11(c)(3)(ii)(B) Zero state agencies elect it (State Options Report 16th ed.)
Sponsor deeming exclusion 273.11(c)(3)(v) Sponsor deeming is not modeled at all
ABAWD 3-months-in-36 clock 273.24 Existing instant-ineligibility approximation retained

⚠️ Partner-facing impact — CI partner tests will fail intentionally

Per team decision, the partner contract tests under tests/policy/baseline/partners/ are deliberately not updated in this PR. 17 expected values in analytics_coverage/edge_cases/federal/nutrition/snap/*.yaml will fail CI. All changes raise SNAP for mixed-status households; LPR cases are unchanged; MA's undocumented case is unchanged (count-all state), validating the state-option wiring:

Case (annual SNAP) Old New
refugee head — federal/CO/IL/LA/MA/NC/TX 2,912.22 4,517.82
undocumented head — federal/CO/IL/LA/NC/TX 2,912.22 4,517.82
undocumented head — MA (count-all state) 2,912.22 2,912.22 (unchanged)
refugee head — WA 2,249.82 3,855.42
undocumented head — WA 2,249.82 3,855.42
refugee head — CA (OBBBA delay to April) 999.36 2,155.02
undocumented head — CA 1,006.02 2,608.02
LPR head — all states unchanged

Partner test updates and partner notification to follow as a separate step before merge.

Verification TODO

  • Verify state option elections for earlier years (15th edition backdating); current lists dated 2018-01-01 from the 16th edition (elections as of Oct 1, 2023)
  • Check whether enhanced CPS imputes non-citizen immigration_status (microsim aggregate impact) — default is CITIZEN
  • Decide conditional-entrant classification: this PR follows the literal 273.11(c)(3)(i)(A)–(G) list, which omits conditional entrants from the excepted categories
  • Follow-up PR: split general work-requirement sanctions ((c)(1) full counting) from ABAWD time-limit ineligibility ((c)(2) proration)
  • Update partner contract tests after partner notification

Test plan

  • 6 new unit test files + 9-case integration test (prorating/count-all/hybrid states, student exclusion, CA delay, expense proration, all-ineligible household); expected values hand-verified against simulation
  • Existing work-requirement proration test updated to the new variables (same $500 result)
  • CI passes (except the intentional partner test failures above)

🤖 Generated with Claude Code

…11(c)

Implements the treatment of income and deductible expenses of ineligible
household members: proration for ineligible aliens (with state count-all
and gross-test-only options), full exclusion of ineligible students'
income under 273.11(d), and person-level income counting that also fixes
the excluded child earner leak.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@codecov

codecov Bot commented Jul 4, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 100.00%. Comparing base (f9e58e7) to head (6c16db0).
⚠️ Report is 49 commits behind head on main.

Additional details and impacted files
@@            Coverage Diff             @@
##              main     #8892    +/-   ##
==========================================
  Coverage   100.00%   100.00%            
==========================================
  Files            3        17    +14     
  Lines           55       258   +203     
==========================================
+ Hits            55       258   +203     
Flag Coverage Δ
unittests 100.00% <100.00%> (ø)

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

☔ View full report in Codecov by Harness.
📢 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 3 commits July 4, 2026 19:54
…rence

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
… unit level

person.spm_unit projections inside the person-level earned income formula
produced MicroSeries with mismatched weights under Microsimulation. Keep
snap_earned_income_person as a pure person-level adds variable and perform
the self-employment attribution inside the SPM unit formulas.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
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.

1 participant