Skip to content

Seed take-up inputs across programs (parity with policyengine-us-data's stochastic flags) #312

Description

@MaxGhenis

Problem

policyengine-us-data seeded stochastic take-up flags (takes_up_*) so that take-up-gated programs didn't ship at 100% participation. populace produces essentially none of them today (grep -r "takes_up" packages/populace-build/src → 2 incidental hits), so H5 consumers fall back to PE-US defaults. Two release findings are already symptoms of this class:

us-data's parity reference: policyengine_us_data/tests/test_stochastic_variables.py covers at least takes_up_tanf_if_eligible, takes_up_medicaid_if_eligible, takes_up_snap_if_eligible, takes_up_eitc, takes_up_dc_ptc, takes_up_aca_if_eligible, takes_up_head_start_if_eligible; the PE-US variables tree additionally carries CHIP, Basic Health Program, and Early Head Start flags.

Why this is not a straight port

PE-US is mid-migration to model-side take-up for some programs (chip_take_up_seed + gov/hhs/chip/takeup_rate.yaml, aca_take_up_seed; see #76 for the ACA contract change). For those programs the data package must NOT seed flags (it would fight the model's own draw); its job is at most calibrating the rate parameters. For programs still on the data-seeded contract (flag defaults that imply 100% take-up unless the dataset provides them), populace MUST seed or ship known-wrong participation.

Plan

  1. Contract inventory (first, blocking): for every takes_up_* / *_take_up_seed variable in the pinned PE-US version, classify: (a) model-simulated (has its own seed + rate parameter), (b) data-seeded (input flag, no formula or default-True), (c) dead/unused. Output: a checked-in table the build reads, so the classification is asserted against the engine version rather than remembered (same metadata-derivation doctrine as Derive the formula-owned-output rejection set from engine metadata (blocklist can go stale) #301).
  2. Seeding doctrine for class (b): reported-receipt-anchored where the survey reports receipt (the Assign SNAP take-up from reported receipt and the FNS participation rate #294 SNAP pattern: reported units take up; top up to the administrative participation rate), calibrated Bernoulli by admin rate elsewhere; deterministic seeds keyed on stable record ids for reproducibility; implemented as declared source stages so the No check that validation-config input variables are actually produced by the dataset #272 validation-input gate covers them and the Build-level weights audit: record resolved weight kinds per fit; fail release on unlisted unweighted fits #300 weights audit sees the fits where models are involved.
  3. Rate calibration for class (a): where PE-US simulates take-up from a rate parameter, decide per program whether populace calibrates that rate to admin totals (ties into Jointly calibrate ACA take-up to CMS APTC people and SOI PTC returns #168's joint-calibration question) — no flag seeding.
  4. Land per-program via the existing children where they exist: SNAP Carry SNAP reported amounts and take-up inputs through Populace US outputs #243/Assign SNAP take-up from reported receipt and the FNS participation rate #294 (in flight), ACA Investigate ACA take-up and plan-choice inputs driving high PTC estimates #70/Implement ACA marketplace take-up input materialization #74/Materialize Marketplace selected-plan benchmark ratios and metal-level diagnostics #75/Migrate ACA health-input gates after PE-US take-up contract changes #76/Jointly calibrate ACA take-up to CMS APTC people and SOI PTC returns #168, Medicaid/CHIP Add Medicaid and CHIP eligibility-to-enrollment diagnostics #170. New children needed for at least TANF, EITC, DC PTC, Head Start / Early Head Start, BHP, and whatever else the step-1 inventory surfaces (WIC/SSI candidates).

Acceptance

  • The step-1 contract table exists and is engine-version-asserted.
  • No take-up-gated program in the release ships at mechanical 100% unless the contract table documents that PE-US simulates it model-side.
  • Release diagnostics report participation vs administrative counts for every program in the table (extends the Add Medicaid and CHIP eligibility-to-enrollment diagnostics #170 diagnostic pattern).

Metadata

Metadata

Assignees

No one assigned

    Labels

    tier:standardSpec'd build/assembly with acceptance tests; suitable for Opus/GPT-class agents

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions