# Defect report — the A-block headline does not reproduce

**Found 2026-08-23, at the start of Phase 3, while trying to put the money finding at the
top of the predictions page as a fact. Severity: FATAL to A1a and A1b as registered.**

---

## What was published

Every version of this claim — the handoff brief, `CONCEPT_VALIDATION_PLAN.md` test E1,
the Source Log row registered 2026-08-21, `PREDICTIONS_registered_2026-08-22.md` (v1) and
`PREDICTIONS_v2_2026-08-22.md` — carries the same basis figure:

> *Basis:* r = 0.82 all / 0.70 incumbents-only on receipts through 2026-06-30.
> Permutation p < 0.0001. Within-party r = 0.81 (D) / 0.63 (R). n = 92 pooled, n = 38 incumbents.

## What the frozen data actually gives

Computed under `ANALYSIS_SPEC_v1.md` §0/§1, from `scripts/finance_nominees.csv` and
`AGE_TENURE` — the two artifacts the spec names as the source of truth:

| Quantity | Published | Reproduced | n published | n actual |
|---|---|---|---|---|
| Pooled Pearson r | **0.82** | **0.576** | 92 | 112 |
| Incumbents-only Pearson r | **0.70** | **0.311** | 38 | 48 |
| Pooled Spearman ρ | 0.86 | 0.831 | | |
| Within-party, incumbents, D | 0.81 | 0.255 | | |
| Within-party, incumbents, R | 0.63 | 0.430 | | |
| Incumbents minus 3 longest tenures | 0.54 | 0.355 | | |

Bootstrap 95% CI on the incumbents-only figure, 10k resamples: **[0.058, 0.683]**.

### Consequence for the register

- **A1a** — *"incumbents-only r ≥ 0.60"*, registered at **92% confidence**. The June data it
  was registered against gives **0.31**. As written this is a near-certain MISS, and 92% was
  not a forecast, it was an error.
- **A1b** — *"pooled r in [0.70, 0.90]"*, registered at **88% confidence**. June gives **0.576**.
  Also a MISS. The two party signs are both positive, so that conjunct holds; the band does not.
- **A2, A3, A4** all take A1a's quantity as their referent, so all three inherit the problem.

## What is *not* wrong

The underlying money data is fine. The corp-share values reproduce to two decimals against
every mean that was published alongside them:

| | Published | Reproduced |
|---|---|---|
| Challenger mean corp share | 0.3% | 0.26% |
| Open-seat mean | 1.3% | 1.28% |
| Republican incumbent mean | 12.6% | 12.58% |
| Democratic incumbent mean | 13.2% | 12.22% |

The tenure values are also fine — spot-checked against first-election years for Kaptur (1982),
Turner (2002), Costa (2004), Cuellar (2004), Perry (2012), Fitzpatrick (2016). All correct.

**The inputs are right. Only the correlation is wrong.**

## Root cause

**The figure was never in a saved script.** It was computed in an ad-hoc session, written into
prose, and cited from prose thereafter — so when the district universe expanded it could not be
re-run, and nobody noticed it had gone stale. This is the identical failure mode as the ALL-CAPS
register feature, which was caught the same way ten days ago.

Two mechanisms are consistent with the gap and I can distinguish neither now that the FEC bulk
files are gone from the container:

1. **A smaller universe.** n = 92 → 112 and n = 38 → 48 says roughly twenty candidates were added
   after the figure was computed, and the redistricted states (CA, OH, TX, UT, NC, FL, LA, MO, TN)
   are the obvious late arrivals. They brought Kaptur (43.8 years, 8.4% corp share) — a huge
   high-leverage point that pulls Pearson down hard — plus Costa, Cuellar, Valadao and Gonzalez.
   Dropping the redistricted states from today's data moves pooled r from 0.576 to **0.684**,
   in the right direction but not all the way to 0.82.
2. **A rank/linear mix-up.** Today's pooled **Spearman is 0.831**, which is within a rounding
   error of the published "Pearson 0.82". Pearson is sensitive to the tenure scale and Spearman
   is not, which is exactly the pattern in the table above: the rank statistic survived the
   universe change almost intact while the linear one collapsed. Suggestive, not provable.

I am recording both and asserting neither.

## The reviewer was more right than we credited

The statistician's zero-inflation charge — that a pooled r near 0.75 can arise from the
challenger/incumbent split with a true within-incumbent gradient of zero — is now not a
simulation. It is what the data does:

- 64 non-incumbents at tenure 0, mean corp share **0.51%**
- 48 incumbents, mean corp share **12.40%**
- pooled r **0.576**, within-incumbent r **0.311**

Moving to incumbents-only as the primary specification (Phase 1) was the correct call. It just
did not go far enough, because the number attached to that specification was never recomputed.

## Fixed at the root

`scripts/money_analysis.py` now implements the A-block to spec — Pearson, Spearman, bootstrap CI,
Fisher z, partial correlation, the party-sign test and the zero-inflation contrast — and prints
the hit/miss verdict against the registered thresholds. Every future A-block figure comes from
running that file. No A-block number gets published again from prose.
