PolicyEngine / PolicyEngine/policyengine-us
Decide whether SNAP BBCE limits should follow per-state published chart conventions
- Dominant language
- Python
- Stars
- 162
- Forks
- 212
- Avg merge
- 3d 3h
- Merged PRs (30d)
- 97
Description
## Summary
`tanf_non_cash_gross_income_limit` returns the exact percentage of the monthly poverty guideline. States publish their BBCE standards as whole dollars, so the model differs from a published chart by up to about $2.
Split out of #9243, which fixes the state-specific poverty-guideline update months. That PR briefly encoded per-state rounding and then removed it — see its "Rounding" section.
## Why the model does not round today
7 CFR 273.9(a)(3) directs that the federal gross and net income standards be divided by 12 and rounded up, and `meets_snap_gross_income_test` implements that. It does not reach the BBCE limit: categorically eligible households under 7 CFR 273.2(j)(2) are exempt from the §273.9 standards, and the BBCE threshold is the income limit of the state's own TANF-funded non-cash benefit. FNS caps it at 200% FPL but prescribes no derivation. Any rounding rule we adopt is therefore a claim about a state's published chart, not about a regulation.
## What states actually publish (one person, 2025 guidelines, 200%)
Exact computation: 15,650 / 12 x 2 = $2,608.33.
| State | Published | Consistent with |
|---|---|---|
| WA | $2,660 (Apr 2026, 2026 guidelines) | exact; the 2026 guideline divides evenly |
| CA, CO, DC | $2,610 | 200% of the whole-dollar guideline ($1,305) |
| AZ | $2,610 (from Mar 2026) | same |
| MA | $2,608 | nearest |
| VA | $2,608 | down |
| IL | $2,608 at 200%, $2,152 at 165% | nearest, both tiers |
| TX | $2,152 at 165% | nearest |
| ME, CT, LA, MN, NH, NJ, OR, VT | $2,609 and equivalents | up |
Two derivations are in play. Most states round the computed limit. California, Colorado, DC, and Arizona instead apply the percentage to the guideline already rounded to a whole dollar -- $1,305 x 2 = $2,610 -- which no rounding of $2,608.33 can reach, so it needs its own step rather than another rounding mode. That is plausibly them reusing the FNS-published 100% net standard, which §273.9(a)(3) rounds up.
## Options
1. **Leave as is.** Claims nothing unverified; never matches a chart exactly.
2. **Per-state conventions.** Conceptually right, since the rounding genuinely is state discretion. Requires a verified chart per state and re-verification as charts are republished. An earlier draft of #9243 implemented this with `rounded_up` / `whole_dollar` / `rounded_down` state lists plus an `fpg_rounded_first_states` list applied before the percentage; that approach worked and can be recovered from the PR history.
3. **One uniform rule.** Simplest, but no rule fits every state, and borrowing §273.9(a)(3)'s round-up would apply a regulation that expressly does not govern this path.
## Evidence needed before option 2
Per-state published charts, at more than one household size (a single size cannot distinguish nearest from up when the cents happen to agree), and the years each convention covers. The figures above are evidenced for FY2026 only.
## Why it may be worth doing
Negligible for the microsimulation: a dollar changes eligibility only for a household whose monthly income lands inside a $1 window. It matters for API partners reconciling PolicyEngine against state charts household by household, where each $1 gap costs a support round-trip. Partner demand is the main argument for option 2.
Contributor guide
Research direction
Start with the tanf_non_cash_gross_income_limit and meets_snap_gross_income_test entry points, then review the Rounding section and history of PR #9243. Gather published charts across states, household sizes, and years before choosing whether to leave the model unchanged or encode conventions. Done means a documented, evidence-backed decision with its scope and verification requirements.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- python
- Domain
- backend
- Issue type
- Feature
- Difficulty
- 5/5
- Estimated time
- Over a week
- Activity status
- Quiet
- Clarity
- Needs clarification
- Newbie friendliness
- 30/100