Skip to content

Missouri SNAP: one adult per household may claim the student child-care exception - #9380

Merged
hua7450 merged 9 commits into
PolicyEngine:mainfrom
hua7450:mo-snap-student-caregiver
Sep 8, 2026
Merged

Missouri SNAP: one adult per household may claim the student child-care exception#9380
hua7450 merged 9 commits into
PolicyEngine:mainfrom
hua7450:mo-snap-student-caregiver

Conversation

@hua7450

@hua7450 hua7450 commented Sep 3, 2026

Copy link
Copy Markdown
Collaborator

Summary

meets_snap_parent_exception granted exception 5 (care of a dependent child under six, 7 CFR 273.5(b)(8)) to every head or spouse in the SPM unit, so two student parents with one toddler both escaped the student work rule. Missouri's SNAP manual limits that claim to one adult per household (DSS SNAP Manual § 1135.025.00: "only one adult in the household may claim this responsibility"). This PR models Missouri's cap and leaves every other state on the uncapped federal reading.

Raised by MyFriendBen during their Missouri SNAP review (Aug 19).

Changes

  • New gov/usda/snap/student/child_care_claim_cap/per_household.yaml (state breakdown): Missouri true from 2025-01-01, every other state false. The federal regulation is silent on shared care, so false entries keep the existing behavior rather than asserting that other states allow unlimited claims. The manual gives no effective date; 2025 is a modeling start, so two Missouri student parents of one toddler both qualify through 2024 and only one from 2025. Back-dating is a one-line parameter change if a source turns up.
  • meets_snap_parent_exception: where the cap applies, the single claim goes to the first-ranked head or spouse in the SPM unit. Students without another exception rank first, then member order, via get_rank; we cannot observe who provides the care. The per-household reading applies however many children under six live in the unit and across tax units within the SNAP household.
  • New meets_snap_non_parent_student_exception (defined_for higher-education students) holds the age, disability, program placement, work, and TANF exceptions, moved unchanged out of is_snap_ineligible_student, so the parent exception can read them without a dependency cycle.
  • Exception 8 (single parent, full time, child under twelve) is unchanged.
  • Exception numbers in the code comments follow 7 U.S.C. 2015(e); 7 CFR 273.5(b) orders the list differently (the under-six exception is (b)(8) there).

Tests

  • Missouri: one child → one claim; the claim goes to the student parent, and to the student without a work exception whichever is listed first; two and three children under six still yield one claim; two child-bearing tax units share one claim; a non-head student cannot take the claim; child at exactly six and just under six; childless students; a lone parent of a child under six and a single full-time student parent of an eight-year-old (exception 8) under the 2025 cap; the tie between two equally placed students going to whichever is listed first, in both orders; end-to-end is_snap_ineligible_student cases where the second student becomes ineligible; 2024 (uncapped), 2025 and 2026 (capped).
  • Other states: AK, CO, KS, and a Missouri/Texas/DC side-by-side case all keep both parents eligible.
  • Ordering cases set tanf: 0: a zero-income family is computed as receiving TANF, which gives every parent exception 6 and hides the ordering.

Not modeled

  • Other states' shared-care rules. Manuals checked during review: Illinois also caps per household (WAG 03-04-03-b); Texas, North Carolina, California (Alameda), Kansas, Colorado, Washington, Connecticut, Georgia, and Alaska cap per child; Illinois, Washington, and Alaska presume a non-working non-student parent provides the care; DC, Massachusetts, New York, and Ohio restate the federal text. Left for follow-up.
  • The 6-to-11 "adequate child care not available" exception, and extending "responsible for the care of" beyond tax-unit head or spouse.

Test plan

  • CI passes (meets_snap_parent_exception, is_snap_ineligible_student, meets_snap_non_parent_student_exception, SNAP integration)
  • Household API partner tests unchanged

🤖 Generated with Claude Code

@codecov

codecov Bot commented Sep 3, 2026

Copy link
Copy Markdown

Codecov Report

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

Additional details and impacted files
@@            Coverage Diff            @@
##              main     #9380   +/-   ##
=========================================
  Coverage   100.00%   100.00%           
=========================================
  Files            3         3           
  Lines           33        57   +24     
=========================================
+ Hits            33        57   +24     
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 hua7450 changed the title Missouri SNAP: one-adult limit on the student child-care exception SNAP student child-care exception: one adult per child (one per household in MO and IL) Sep 3, 2026
hua7450 and others added 4 commits September 4, 2026 21:50
Missouri lets only one adult in the SNAP household claim the student
exemption for caring for a dependent child under six (DSS SNAP Manual
1135.025.00), while 7 CFR 273.5(b)(8) has no cap. Add a state-level
one_adult_child_care_exception parameter (Missouri only) and give the
single claim to the first parent who is a higher-education student.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
State manuals read 7 CFR 273.5(b)(8) as letting each child under six
exempt only one adult (Texas Works Handbook B-412(7), North Carolina FNS
235.04(E), Washington EA-Z Student Status, California, Colorado,
Connecticut, Georgia, Kansas). Missouri and Illinois cap the claim at one
adult per household regardless of the number of young children; that
stricter cap stays behind the state-level parameter, now true for both.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…e cap

NY SNAP Source Book § 5 (p. 5-54, Rev. 9/2025) lists "Care for a child
under the age of 6" with no one-adult cap.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
… and give it to the student who needs it

Split the cap into per-child (AK, CA, CO, CT, GA, KS, NC, TX, WA) and
per-household (MO, IL) parameters; other states keep the uncapped
federal reading. Rank student parents without another exception first
so member order no longer decides eligibility. Move the non-parent
student exceptions into meets_snap_non_parent_student_exception.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
@hua7450
hua7450 force-pushed the mo-snap-student-caregiver branch from 0a863ba to 0df9b1c Compare September 5, 2026 02:39
hua7450 and others added 2 commits September 4, 2026 23:12
A zero-income family is computed as receiving TANF, which gives every
parent the TANF exception and hides the child-care claim ordering.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…on-student caregiver presumption

Per-child claims rank within the tax unit; Illinois, Washington and
Alaska presume a non-working non-student parent provides the care. Fix
the Alameda page anchor, propagate parameter metadata, scope the helper
to higher-education students, and add cap and tax-unit tests.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
@hua7450
hua7450 marked this pull request as ready for review September 5, 2026 06:58
…er-household cap

Drop the per-child cap and the caregiver presumption; other states keep
the uncapped federal reading. Missouri's cap is modeled from 2025.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
@hua7450 hua7450 changed the title SNAP student child-care exception: one adult per child (one per household in MO and IL) Missouri SNAP: one adult per household may claim the student child-care exception Sep 6, 2026
@hua7450
hua7450 requested a review from DTrim99 September 8, 2026 15:25
@DTrim99

DTrim99 commented Sep 8, 2026

Copy link
Copy Markdown
Collaborator

Program Review — PR #9380 (Missouri SNAP student child-care exception cap)

Scope (MO SNAP; 7 CFR 273.5(b)(8) + MO §1135.025.00; one-adult-per-household cap; parent/non-parent exception split)

8-file diff: new breakdown parameter parameters/gov/usda/snap/student/child_care_claim_cap/per_household.yaml; modified variables/.../student/is_snap_ineligible_student.py; modified variables/.../student/meets_snap_parent_exception.py; new variables/.../student/meets_snap_non_parent_student_exception.py; 3 YAML test files; 1 changelog fragment. PR head reviewed at commit 75bd74b63fe986367ae4d0f3b9fe95bcffda7920.

The PR refactors the SNAP ineligible-student test into two exception groups — child-independent exceptions (meets_snap_non_parent_student_exception, moved verbatim) and child-dependent exceptions (meets_snap_parent_exception, extended with the cap) — and adds a Missouri-only one-adult-per-household cap on the under-6 child-care caregiver exception. is_snap_ineligible_student = ~(non_parent | parent).

Regulatory verdict

CONFIRMED — MO DSS SNAP Manual §1135.025.00 states verbatim "Only one adult in the household may claim this responsibility" (and "Only one adult in the SNAP household may claim this responsibility" for the 6-11 prong). The federal baseline (7 CFR 273.5(b)(8) / 7 USC 2015(e)(5)) imposes no such cap; the MO-only layering is accurate. Exception mapping across all 8 statutory exceptions is complete with none dropped or double-counted; ~(non_parent | parent) is the correct De Morgan form and preserves pre-refactor behavior; the cap is MO-only (false all 50 states + DC, true MO from 2025-01-01) and no non-MO state's behavior changes.

Critical (Must Fix)

None.

Should Address

  1. per_household.yaml:1 — parameter description misattributes the cap and departs from the placeholder pattern. Description reads "The Department of Agriculture limits the Supplemental Nutrition Assistance Program student exemption...", but the modeled cap is a Missouri DSS manual reading — 7 CFR 273.5(b)(8) is federally silent (as the file's own header comment states). Reword so the subject matches the actual source (e.g. drop the "Department of Agriculture" agent, lead with "Limits the Supplemental Nutrition Assistance Program student exemption for caring for a dependent child under age six to one adult per household in these states."). Label is otherwise fine.

  2. per_household.yaml (MO block) — the 2025 start is a modeling choice, not a manual-sourced date; flag it in the PR body. The manual gives no effective date; the parameter's in-code comment already concedes the start is a modeling choice. Net effect: two MO student parents of one under-6 child are both eligible pre-2025 but one becomes ineligible from 2025 — a discontinuity driven purely by the modeling choice. This is disclosed in-code (meets the bar), but recommend also noting in the PR body that 2025 is a conservative start, or back-dating to the earliest year MO SNAP is otherwise modeled. Non-blocking.

  3. Exception-number labels in code comments do not line up with the CFR subparagraph order. Comments label the child-care caregiver exception "Exception 5" and the single-parent exception "Exception 8," tracking the 7 USC 2015(e) subsection numbering the files cite (#e_5, #e_8). Because the files also cite 7 CFR 273.5(b) — which enumerates differently (care-of-dependent-under-6 is (b)(8)) — a reader cross-checking the CFR list will find the labels do not align. Substance is correct; add a one-line note that the labels track the USC subsection, not the CFR list.

  4. Exception 8 (single full-time parent, child 6-11) is not re-tested under the refactor for a capped state. meets_snap_parent_exception.yaml. The moved single-parent-under-12 path is covered only by pre-existing 2024 non-MO cases. Add one MO 2025 case (single MO student-parent, one child 6-11, full-time) to prove the cap refactor did not disturb the exception-8 path.

  5. Single-parent "cap irrelevant" boundary is only indirect. meets_snap_parent_exception.yaml. No case has a lone MO student-parent with a child under six in 2025 (parent_count == 1, cap on but cannot bite). Current single-parent MO 2025 evidence is indirect via Case 20's mixed household. Add a clean lone-parent case asserting true in 2025 to lock the boundary.

  6. get_rank tie-break asserted in only one orientation. meets_snap_parent_exception.yaml Case 19 asserts person1 wins for two equally-needy bare students, but no mirror case swaps two bare students (both working=0, swap order) to confirm the claim moves with first-position. Low risk, but this is the one place the tie-break could be reversed and still pass; the existing position-flip cases (is_snap_ineligible_student 15/16) only flip because one student holds a work exception.

Suggestions

  1. meets_snap_parent_exception.py — has no defined_for = "is_snap_higher_ed_student" guard, unlike its two siblings (is_snap_ineligible_student, meets_snap_non_parent_student_exception). Behavior is correct because is_snap_ineligible_student is itself gated by is_snap_higher_ed_student, so the un-guarded parent variable never leaks into non-student eligibility; adding the guard would make the three siblings consistent and slightly cheaper.
  2. meets_snap_parent_exception.yaml Cases 42-51 — ten near-identical uncapped-state cases (AK/CA/CT/GA/IL/TX/CO/KS/NC/WA) all assert [true, true, false]. One or two uncapped states plus the vectorized cross-SPM Case 41 fully exercise the ~caps_per_household branch. Per the repo's YAML param-override memory-cost note, each distinct state_code value caches a system copy; trimming would reduce test cost. Not a correctness issue.
  3. age: 5.99 under-six probe — works with the < 6 comparison but is decorative; integer boundaries (age 5 true / age 6 false) are already covered. A plain integer boundary is cleaner.
  4. meets_snap_parent_exception.pycaps_per_household = cap.per_household[state].astype(bool) cast is defensive given unit: bool; harmless and consistent with the age_threshold cast pattern. No change needed.
  5. Parameter references are authoritative and well-formed — per_household.yaml cites both the MO manual and 7 CFR 273.5(b)(8) with title+href tuples, and the in-file comment correctly clarifies that the false entries do not assert other states allow unlimited claims. Reference quality is good.

Validation Summary

  • Regulatory: PASS — core one-adult-per-household claim CONFIRMED verbatim against MO §1135.025.00; 8-exception mapping complete; MO-only; non-MO preserved. (0 critical / 2 should / 2 suggestions)
  • Code: PASS — get_rank cap mechanism correct on all five checks (rank-0 selects exactly one parent; SPM unit is the correct household entity; vectorization safe with no cross-unit leak; ~caps | claim_rank == 0 gives one claimant when capped and all parents when uncapped; non-parents get rank -1 and are guarded by the final is_parent &). Refactor loses no exception logic — moved block reproduced verbatim including .astype(bool) and the TANF person-or-SPM-unit test. Parameter format correct. (0 critical / 1 should / 4 suggestions)
  • Tests: PASS — both cap directions tested: MO one-claim via get_rank (Cases 19-21, 31, 33-34, 38, 41-MO, 53-54), non-MO both-claim (Cases 42-51, 41-TX/DC, 52 MO-2024), vectorized cross-SPM no-leak (Case 41). New meets_snap_non_parent_student_exception and the capped branch both have real coverage (not zero). TANF zeroed in every MO cap case so the cap — not the TANF exception — drives the assertion. (0 critical / 3 should / 1 suggestion)
  • CI: Reported passing.

Out-of-scope note: per_child.yaml and non_student_parent_presumed_caregiver.yaml exist in the HEAD tree but are NOT in this PR's diff and are unreferenced by any .py at HEAD — pre-existing branch-base artifacts, not introduced or removed by #9380. Not a finding against this PR.

Branch Status

⚠ 3 commits behind main; scoped to PR changes. No merge conflicts observed in the reviewed diff.

Review Severity: APPROVE

No critical issues survive consolidation. The regulatory premise is confirmed verbatim, the cap mechanism is correct and vectorization-safe, and both cap directions plus the cross-SPM no-leak case are tested. The six SHOULD-ADDRESS items are documentation/attribution polish and additive test-coverage refinements — none blocks merge.

🤖 /review-program

@DTrim99 DTrim99 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

No critical issues — the core is confirmed correct: MO DSS SNAP Manual §1135.025.00 states verbatim "Only one adult in the household may claim this responsibility," the 7 CFR 273.5(b) exception mapping is complete, ~(non_parent | parent) preserves non-MO behavior, and both cap directions are tested (MO one-claim via get_rank, non-MO both-claim, plus a vectorized cross-SPM no-leak case). Requesting changes for 6 non-blocking should-address items: (1) per_household.yaml description misattributes the cap to USDA — it's a MO DSS reading; (2) flag in the PR body that the 2025 start is a modeling choice (manual gives no date); (3) clarify the "Exception 5/8" comment labels track USC not the CFR (b)-numbering; (4) re-test exception 8 (single parent, child 6–11) for a capped MO 2025 state; (5) add a clean single-MO-parent "cap irrelevant" boundary case; (6) add a get_rank tie-break mirror (position-swap) case. Full findings above. 🤖 /review-program

hua7450 and others added 2 commits September 8, 2026 13:39
Address review: describe the cap as a state rule rather than a USDA one,
note that exception numbers follow 7 U.S.C. 2015(e), add lone-parent,
exception-8, and tie-break mirror cases under the 2025 cap, and trim the
uncapped-state cases to AK, CO, and KS.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
@hua7450
hua7450 requested a review from DTrim99 September 8, 2026 17:59

@DTrim99 DTrim99 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Re-review — all 6 should-address items resolved. (1) per_household.yaml description reworded to attribute the cap to the MO manual (no longer USDA); (2) the 2025 modeling-choice date is disclosed in the PR body + a YAML comment; (3) the USC-vs-CFR exception-numbering note is added; (4) Case 48 re-tests Exception 8 (single full-time MO parent, child 8, capped 2025); (5) Case 49 adds the lone-MO-parent + under-6 "cap irrelevant" boundary; (6) Case 50 is the mirrored tie-break (order-swapped). Regression scan clean — the ~caps | rank==0 one-claimant-per-SPM-unit logic and the ~(non_parent | parent) refactor are intact. The core was already confirmed against MO §1135.025.00. Approving. 🤖 /review-program

@hua7450
hua7450 merged commit 7f59047 into PolicyEngine:main Sep 8, 2026
33 checks passed
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.

2 participants