PolicyEngine / PolicyEngine/microcosm

QBI base −31%/−40% vs targets and JCT; add per-component repeal-revenue benchmarks (amount residuals can't see yield gaps)

Open
#298 2 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

Summary

Two related findings from validating deduction/credit repeal scoring on the dense release populace-us-2024-f0af251-703bd81a565c-20260620 (bundle 4.18.7), against external scorekeeper estimates:

  1. The QBI base runs well below external benchmarks. The release's own diagnostics show the QBI-linked target residual at −31% (relative_error on the JCT qualified_business_income_deduction revenue-loss target), and repealing §199A in isolation yields $45.9B (TY2026) vs JCT's $76.4B FY2026 individuals line (JCX-45-25) — a −40% gap, the largest among the deduction toggles after tips/overtime (which have no input base at all).

  2. On-surface amount residuals cannot see repeal-revenue gaps — propose adding per-component repeal-revenue benchmarks to the validation surface. The itemized-deduction amount calibrates to +1.8% on this release, yet repealing each Schedule A line in isolation scores far below its own JCT line:

Component repealed alone PE TY2026 ($B) JCX-45-25 FY2026 ($B) Diff
SALT (cap → $0) 23.9 59.5 −60%
Mortgage interest 23.0 53.0 −57%
Charitable 60.1 81.5 −26%
Medical 9.1 13.8 −34%
Casualty/theft 0.0 0.2 no base in data

The claimed bases are plausible in level (SALT $288.5B under the $40k cap; mortgage $215.7B among 17.7M itemizers), so the shortfall is yield per dollar of base — the marginal-rate composition of who holds the deductions, plus the un-aged TY2022/23 target vintage (aging tracked in PolicyEngine/ledger#71). A benchmark family of "repeal component X → revenue vs the JCT line" (computed per release, like the reform-validation checks in calibration-diagnostics) would catch this class directly, where amount residuals structurally cannot.

Suggested actions

  1. Investigate the −31% QBI target residual on the dense build (it was −81% on June builds — improved but far from closed).
  2. Add per-component repeal-revenue benchmarks (SALT / mortgage / charitable / medical / QBI vs their JCX-45-25 lines; full-itemized vs TPC's interaction-adjusted estimate, since JCT lines are non-additive) to the release validation surface.
  3. Casualty-loss inputs are absent entirely (immaterial at ~$0.2B/yr, but a completeness note alongside #278's input-coverage findings).

Related: #278 (sparse-release input coverage), #257 (degenerate-input gates), #272 (validation-config input checks).

Repro: policyengine[us]==4.18.7, managed_microsimulation, zero each component's cap/ceiling (or medical.floor→1.0, casualty.active→false) for 2026+, sum the income_tax delta.

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 managed_microsimulation reproduction using policyengine[us]==4.18.7, zeroing each listed component for 2026+ and measuring the income_tax delta. Read the calibration-diagnostics reform-validation checks and related issues #278, #257, and #272; done means explaining or addressing the QBI residual and adding per-component repeal-revenue benchmarks to the release validation surface.

Written by the indexing model from the issue text.

Assessment

Tech stack
python
Domain
data, testing-qa
Issue type
Feature
Difficulty
4/5
Estimated time
3-5 days
Activity status
Quiet
Clarity
Mostly clear
Newbie friendliness
45/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.