Repository navigation
ALD-stack repeal scores −53% of JCX line-sum on Build P: #519 targets bind but per-component bases under-mass #579
Description
Follow-up to #519 (target additions) and #535 (per-component repeal-revenue validation surface). Surfaced on the RCC dashboard's Build P validation refresh: https://github.com/PolicyEngine/refundable-credit-conversion/pull/72
Observation (Build P, TY2026)
The RCC ald toggle repeals every above-the-line deduction except alimony (drops all entries from gov.irs.ald.deductions except alimony_expense). Modal endpoint on policyengine 5.0.1 bundling populace-us-2024-buildp-sparse-rmloss100-cae8640-20260728T011454Z scores:
| ALD-stack repeal (TY2026) | PE Build P | JCX-45-25 line-sum (indicative) | gap |
|---|---|---|---|
| federal tax revenue impact | $54.4B | $116.0B | −53% |
Per the caveat already in scripts/scoring_validation/build_comparison.py and #298, the JCX line-sum is non-additive and should not be summed as a hard benchmark — but the gap direction is consistent with per-component under-scoring against each individual JCT line: #519's target additions all bind on Build P but sit under-fit (base-builder mass thin, not target-side).
Per-component fit on Build P
calibration_diagnostics.json at cae8640:
| ALD component | #519 target | notes |
|---|---|---|
| SE-health insurance | bound, under-fit | health_insurance_premiums $16.5B on 1,402 records ≈ 55% of SOI Table 1.4 |
| HSA | bound, under-fit | single target, 74% off |
| Traditional IRA | bound, under-fit | contribution columns thin on sparse |
| SE pension (Keogh/SEP) | bound, under-fit | biggest uncertain component per build_comparison.py caveat (~$30B est) |
| Student loan interest | bound, under-fit | single target, 49% off |
| Alimony | (excluded from RCC repeal toggle) | — |
Base-side context: retirement-contribution columns are enumerated as absent-from-H5 in #340 and #361; SE-health upstream flagged in #38.
Reproducer
reform = {
"gov.irs.ald.deductions": {"2026-01-01.2100-12-31": ["alimony_expense"]},
}
# expected: ~$116B (JCX line-sum, non-additive caveat)
# observed on Build P (Modal endpoint, PE 5.0.1): $54.4BAsk
Two options, non-exclusive:
- Extend Standing per-component repeal-revenue validation surface (#298) #535's
repeal_revenue_benchmarks.jsonwith per-ALD-component rows so the yield gap is visible per component (matches how QBI / itemized components are handled via Standing per-component repeal-revenue validation surface (#298) #535's per-component surface). - Base-builder pass on the six ALD components — the Add JCT tax-expenditure target references: ALD components + CDCC (supersedes #514) #519 targets bind, so the under-fit is a base-mass ask, not a target-shape ask. Related base issues: Populate remaining US tax-input and reported-observation layers #38 (SE-health upstream path), 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) #340 (retirement-contribution columns absent from H5), US: pin raw PUF; move all processed-PUF derivations (aging + Section 199A simulation + carried leaves) into populace #530 (raw-PUF pin that also touches SE income).
Refs
- RCC validation surface refresh: refundable-credit-conversion#72
- Target additions: Add JCT tax-expenditure target references: ALD components + CDCC (supersedes #514) #519
- Per-component validation mechanism: Standing per-component repeal-revenue validation surface (#298) #535
- Related base issues: Populate remaining US tax-input and reported-observation layers #38, 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) #340, Sparse-57k export drops 94 no-formula input columns from the dense parent (tips, overtime, disability flags, ESI premiums, rent, QBI basis) #361
- Parallel per-component gap already tracked: QBI base −31%/−40% vs targets and JCT; add per-component repeal-revenue benchmarks (amount residuals can't see yield gaps) #298 (QBI)
Activity
MaxGhenis commentedon Jul 30, 2026
Triage (populace owner): diagnosis confirmed — the six #519 targets bind on Build P and the residual is base mass, matching what the RCC component decomposition shows from the outside. Two-track plan: (1) near term, your ask 1 — per-ALD-component rows in #535's
repeal_revenue_benchmarks.json— is cheap and scorecard-side; queued. (2) Durable, the base-mass work is exactly what #578 (US base v2: CPS+ACS household spines + PUF detail channel) charters — the absent-input-column families you cite (#340/#361) are base-builder items that get rebuilt once under #578's operator ordering (#395) rather than patched per column on the current lineage. Cross-linking so the epic absorbs this. The SE-pension (~$30B est) row stays the flagged largest-uncertainty component per the build_comparison caveat.