PolicyEngine / PolicyEngine/microcosm
Sparse national-only release never persists input columns for tips/overtime/auto-loan/education/retirement-contribution/casualty/misc bases (absent-from-H5, engine defaults to 0)
Nobody has claimed this yet.
- Dominant language
- Python
- Stars
- 0
- Forks
- 4
- Avg merge
- 1d 3h
- Merged PRs (30d)
- 94
Description
Follow-up to #278 with a refined mechanism and a larger column list, proven by reading the release H5 directly (populace-us-2024-sparse-l0-refit-57k-71a0887-national-only-20260701, 338MB, person 166,302 × 222 cols / tax_unit 79,736 × 13 cols).
Mechanism refinement vs #278
These bases are not present-but-zeroed — they were never persisted as H5 keys at all, so the engine falls back to each variable's default (0) at runtime. That's a build/persistence-scope mechanism, distinct from a zeroing bug, and it's invisible to any weights-side gate: only a column-manifest check catches it.
Columns proven ABSENT-FROM-H5 (beyond #278's list)
| base | downstream validation row(s) scoring ~$0 |
|---|---|
tip_income (all *tip*) |
OBBBA no-tax-on-tips (JCT FY2027 −$7.7B) |
| all overtime/FSLA variables | OBBBA no-tax-on-overtime (−$25.7B) |
auto_loan_interest, auto_loan_balance |
OBBBA auto-loan-interest deduction (−$8.1B) |
qualified_tuition_expenses + all education-credit inputs |
SOI education credits (actual $7.55B) |
ALL retirement-contribution columns (roth_ira_contributions, 401k/403b/457/elective deferrals — #278 listed only traditional_ira_contributions) |
SOI saver's credit (actual $2.04B) |
casualty_loss |
OBBBA casualty-loss line ($0.13B) |
misc itemized inputs (unreimbursed_business_employee_expenses, tax_preparation_fees, …) |
OBBBA misc-itemized termination ($23.7B) |
childcare (tax_unit_childcare_expenses, care_expenses) — confirms #278 |
CDCC rows (Treasury $3.69B; SOI $3.47B; OBBBA CDCC; IA HF1020 fiscal note) |
Notable: the childcare signal exists in the file as raw CPS SPM_CHILDCAREXPNS ($242.8B weighted, 11.0% nonzero) — the survey data is there; it just never reaches a PolicyEngine input.
Degraded (present but short)
| base | this release | reference |
|---|---|---|
charitable_cash_donations |
$230.7B | dense ~$345B; #278 recorded $264B — worth updating |
student_loan_interest |
$10.4B | SOI deduction base ~$13-14B |
self_employment_income_before_lsr |
$419.6B | SOI nonfarm sole-prop ≈ $480-500B → explains the SOI SE-tax backtest running −14% ($69.5B vs $81.1B) |
Healthy for the record: medical component inputs are all populated (premiums $339.6B + Part B $120.7B + other $283.6B + OTC $63.8B) — the medical JCT-target miss is #298's yield mechanism, not a base problem.
Suggested action
Same as #278's gate proposal, but keyed on the column manifest: fail release (or require explicit waiver) when a PolicyEngine input variable consumed by any validation-suite reform/backtest is absent from the persisted H5. The reform-validation suite now exercises exactly these bases, so the missing-column → $0-score path is mechanically detectable at build time.
Found during the 2026-07-06 external-benchmark audit (all 94 dashboard benchmarks verified against primary sources).
🤖 Generated with Claude Code
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 by tracing how national-only releases persist H5 columns and how the reform-validation suite identifies consumed PolicyEngine inputs. Add a column-manifest check that fails the release or requires an explicit waiver when a required input is absent, and verify that the listed missing bases no longer silently score as zero.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- python
- Domain
- build-system, data-engineering, release
- Issue type
- Feature
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Quiet
- Clarity
- Mostly clear
- Newbie friendliness
- 38/100