PolicyEngine / PolicyEngine/microcosm
Pool default-value holes: engine-consumed input leaves with checkpoint sources the pool never populates (is_tanf_enrolled, strike_benefits, receives_medicaid/snap/wic)
Nobody has claimed this yet.
- Dominant language
- Python
- Stars
- 0
- Forks
- 4
- Avg merge
- 1d 3h
- Merged PRs (30d)
- 94
Description
The #578 consumer-existence audit (2026-08-01, engine 1.764.6, receipts in the epic thread) swept all 137 pool input variables for demonstrated consumers. Two imputed variables had none and are being removed (medicare_part_b_premiums_reported, has_marketplace_health_coverage — the latter deprecated by the engine in favor of _at_interview). This issue tracks the REVERSE findings: engine input leaves with live formula consumers that the pool never populates, so the engine silently uses defaults despite a demonstrable checkpoint source.
| Variable | Engine consumers | Checkpoint source | Note |
|---|---|---|---|
is_tanf_enrolled |
65 | PAW_VAL (frozen in plan tests) |
Highest impact; take-up contract explicitly says reported TANF receipt is not threaded through the base spine; seeding takes_up_tanf_if_eligible does not populate this separate current-enrollment input |
strike_benefits |
7 (incl. market_income) |
OI_OFF/OI_VAL code 12 |
alimony.py recognizes code 12, strips it from miscellaneous_income, then discards the amount |
receives_medicaid |
5 | NOW_MCAID |
Sibling has_medicaid_health_coverage_at_interview is emitted; this leaf never is |
receives_snap |
1 | SPM_SNAPSUB |
snap_take_up.py already defines positive SPM_SNAPSUB as reported receipt but emits only the take-up seed |
receives_wic |
2 | WICYN |
Adult-female reporting universe; person-recipient allocation needs review before wiring |
Partial: ssi_reported is produced on the ACS spine from SSIP but not on the ASEC half despite SSI_VAL feeding take-up/disability anchors there.
Implementation cautions from the audit: receives_snap, is_tanf_enrolled, and receives_wic are monthly engine inputs — annual checkpoint-to-month propagation must be explicit; WIC needs the allocation review above. Each wiring follows the standard lane discipline (producer + phase registry + dtype/ownership/consumer guards + tests).
Part of #578 increment 2's tail. The permanent consumer-existence CI guard (design in the audit receipt) lands separately and would have caught both drop candidates; these reverse holes are its complement — fidelity the pool is leaving on the table.
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 reverse-findings table in this issue and the #578 increment 2 audit thread, then trace each checkpoint source to its pool producer and phase registry. Review the monthly propagation and WIC allocation cautions before changing the five listed inputs. Done means the required producer, dtype, ownership, consumer guards, and tests are present, with the partial SSI case assessed separately.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- python
- Domain
- data
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Quiet
- Clarity
- Mostly clear
- Newbie friendliness
- 48/100