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)

Open
#340 1 comment 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

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

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

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.