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)

Open
#591 5 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

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

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

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.