PolicyEngine / PolicyEngine/microcosm
SNAP target surface is dollars-only: add FNS state/national caseload targets
Nobody has claimed this yet.
- Dominant language
- Python
- Stars
- 0
- Forks
- 4
- Avg merge
- 1d 3h
- Merged PRs (30d)
- 94
Description
Problem
The calibration's SNAP surface is 52 FY2024 USDA benefit-dollar targets (national + 50 states + DC) and nothing else. Two consequences, verified against the current default release (populace-us-2024-buildi-sparse-rmloss100-6e8e929-20260709T034135Z):
- Dollar targets lose loss-weight trades. 10 states undershoot by 7–43% (DC −43%, IL −35%, NM −32%, LA −27%, CA −25%, UT −21%, MA −20%, NC −10%, FL −9%, PA −7%; national −8.4%, $86.0B vs $93.8B). A per-state feasibility audit (5 × initial_weight · simulated snap vs target, reproducing published diagnostics exactly) shows every state except CA is reachable within the 5× weight cap — DC has 1.6× ceiling headroom, IL 2.6×. The misses are trade-offs: under the sqrt-value weighting the whole
usda_snapfamily holds ~0.9% of total loss weight, so small-dollar state targets lose against national income aggregates. - Nothing pins recipient composition. A build can hit a state's benefit total by overweighting a thin recipient set (UT carries its $0.38B target on 44 SNAP-positive records). Dollars + caseload jointly pin average benefit per household; dollars alone do not.
Proposal
Compile the FNS average-monthly caseload measures that the ledger usda-snap-fy69-to-current package already ships at national and per-state grain:
average_monthly_households→ indicator sum over SPM units with positive annualsnapaverage_monthly_persons→ the same indicator projected to person grain
The take-up assignment (#294) seeds takers to reproduce the FNS participation rate, so the simulated taker set is the model counterpart of the average monthly caseload (not an annual-ever count).
Count targets land in the count basis, which holds its own half of the loss budget under the existing 50/50 amount/count weighting — this raises SNAP's effective loss share within the standard scheme, without hand-tuned family multipliers.
Notes
- FNS caseload facts carry
aggregation: mean(fiscal-year mean of monthly stock counts); the ledger compile guard currently rejects all non-sum facts. A time-mean of a stock count is still a linear level target — the guard needs a scoped opt-in that keeps rejecting per-unit ratios such asaverage_monthly_benefit_per_person. - Targets compile only for facts present in the consumer feed. If the current feed (
consumer_facts_buildh_v8.jsonl, 37,260 rows) filters out the caseload measures, the consumer bundle needs regeneration before these targets appear in a build. - CA misses its dollar target even at the feasibility ceiling (1.11×) and undershot in the 224k dense build too — caseload targets alone will not fix CA; see the companion take-up issue.
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start with the usda-snap-fy69-to-current ledger package and the ledger compile guard, then inspect whether consumer_facts_buildh_v8.jsonl contains the caseload facts. The work is complete when mean stock counts compile as level targets at household and person grain while per-unit ratios remain rejected, and the regenerated consumer bundle exposes the targets.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- python
- Domain
- data
- Issue type
- Feature
- Difficulty
- 5/5
- Estimated time
- Over a week
- Activity status
- Quiet
- Clarity
- Mostly clear
- Newbie friendliness
- 48/100