PolicyEngine / PolicyEngine/microcosm

SNAP target surface is dollars-only: add FNS state/national caseload targets

Open
#370 0 comments 0 reactions 0 assignees View on GitHub

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):

  1. 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_snap family holds ~0.9% of total loss weight, so small-dollar state targets lose against national income aggregates.
  2. 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 annual snap
  • average_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 as average_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

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. 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

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.