PolicyEngine / PolicyEngine/microcosm

Published release exports can no longer serve as --base-h5: QBI input reconciliation requires base-only PUF columns

Open
#412 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

Found during the Build K staging run (2026-07-13). Fail-closed catch #3 of 3 — this one is structural, not feed drift.

What happened

Passing the published Build J export (populace_us_2024.h5, sha 9d1e460d…) as --base-h5 fails at with_us_qbi_input_reconciliation (release tool, unconditional since the QBI/SOI wiring): it requires 15 PUF-imputed columns (business_is_sstb, w2_wages_from_qualified_business, unadjusted_basis_qualified_property, …) that only exist on the 337k base produced by build_us_puf_support_base.py — the release export's column surface never carried them.

Why it matters

--base-h5 documents itself as "Existing Populace US H5 to recalibrate. Defaults to HF latest." That default path — recalibrate the published artifact — now fails unconditionally, since HF latest is a release export. Anyone without a base h5 is blocked; until 2026-07-13 the base existed only on the build machine (now mitigated: populace-us-staging carries bases/build-j/… with a MANIFEST, and #406's checkpointed base builder makes rebuilds feasible).

Options

  1. Carry the 15 QBI columns in release exports (they are person-level inputs; cost is export width).
  2. Make the reconciliation conditional on the columns being present, with a loud gate downgrade recorded in the manifest when absent (weakens the SSTB identity guarantee — probably wrong).
  3. Keep it hard, but fix the --base-h5 help text and fail with a message that names the staging bases/ path — recalibration simply requires a base, not an export.

(3) is the minimal truth-telling fix; (1) is the one that restores the "recalibrate HF latest" default.

🤖 Generated with Claude Code

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 --base-h5 handling and the with_us_qbi_input_reconciliation entry point, then inspect build_us_puf_support_base.py and the published export path. Reproduce the Build K failure using the published Build J export and compare its columns with the staging base under bases/build-j/. Done means the chosen compatibility or messaging behavior is implemented and the recalibration path reports the required outcome clearly.

Written by the indexing model from the issue text.

Assessment

Tech stack
python
Domain
build-system, data, release
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Quiet
Clarity
Mostly clear
Newbie friendliness
38/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.