Decompose the champion: its whole edge is a hit-rate counter

READ-ONLY. src/ and web/ untouched; 4,159 tests still green.

WHAT THE CHAMPION IS. probabilityEstimator is five lines of arithmetic: the
empirical frequency of (stat > THIS line) over the game log, blended 0.6/0.4
with the last-5 frequency, then +/-0.03 opponent, +/-0.015 home/away, a
cv>0.40 pull toward 0.50, and a clamp to [0.10, 0.95]. It reads three
features. featureCache retains a dozen more that p_win never touches.

THE ABLATION IS EXACT, NOT A REFIT. Every adjustment is closed-form from
stored features and the consistency step is linear, so each layer subtracts
algebraically out of the stored p_win -- no re-estimation, no re-fetch, no
lookahead possible. Per stat, paired bootstrap:

  removing ALL THREE adjustments changes resolution by NOTHING on every stat
  hits -0.0059  total_bases -0.0015  rbi +0.0106  runs +0.0130  walks +0.0008

and rbi's home/away is mildly HARMFUL (+0.0053, CI excludes zero). So ~100% of
the champion's resolution is base+recency: how often this player has cleared
this number lately. Everything else is decoration.

A CORRECTION. Pooled, the champion resolves 0.46; per stat it is 0.196 (hits)
to 0.499 (rbi). Pooling stats with different base rates inflates correlation,
so 0.46 should not be quoted as the champion's resolution. Last session's
paired differences remain valid; only the absolute level was inflated.

THE BIGGEST LOSS IS NOT A MISSING FEATURE -- IT IS THE CLAMP. 358 of 1,741
settled rows (20.6%) sit on the boundary, so the model emits a constant there
and cannot rank a fifth of the book at all. And that constant hides two
opposite failures: 0.900 covers home_runs-under truly winning 99.5% (9.5pts
under-confident) next to hits-under truly winning 51.9% (38.1pts over-
confident). PROB_CEIL=0.95 makes the 99.5% case inexpressible. Global
over-prediction is +3.5pts, +7.6 on total_bases. None of this needs new data.

ONE REAL MISSING-WEIGHTING LEAD: opportunity_drift, residual corr +0.156 on
hits and +0.145 on total_bases -- it REPEATS across independent stats, unlike
the weather hits on TB which sit inside the expected false-positive count (70
tests at alpha .05 expects 3-4). And we already compute it: arch-v1's
opportunity axis uses it and extracts nothing (delta +0.0001). Wrong
implementation, not a missing feature -- opportunity must scale the rate, not
nudge the probability.

ARCHETYPE IS UNMEASURABLE, NOT REFUTED. Only 2 of 41 labels (BOMBER, GHOST)
reach n>=40 settled rows and every mean residual straddles zero. That is "we
have not measured it", and it does not license acting in either direction.

Why every challenger has failed is now legible: the ladder and hits-v1 REPLACE
the frequency question with a fitted distribution; the environment axis adds
inputs the champion ignores. Asking the frequency question at the traded line
is the thing that works.

Flagged, not fixed: model_snapshots.outcome is NULL on all 22,032 rows -- the
retention table built for exactly this replay was never settled, so labels had
to be joined from ledger_entries.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01W1sivYNqY2TS5ftykmHBU9
This commit is contained in:
Kev
2026-08-02 23:54:51 -04:00
parent f897c7ec06
commit d8bf7765db
4 changed files with 663 additions and 0 deletions
+28
View File
@@ -3,6 +3,34 @@
## Last Updated
2026-08-03
## Session 78 (2026-08-03) — Champion decomposed: the edge is a hit-rate counter ✅
Spec: `specs/champion-input-diagnosis.md`. READ-ONLY (src/web untouched);
4,159 tests green.
- **The champion is 5 lines.** base = empirical frequency of (stat > THIS line),
0.6/0.4 blend with last-5, ±0.03 opponent, ±0.015 home/away, cv>0.40 pull,
clamp [0.10,0.95]. It reads 3 features; featureCache retains a dozen more that
p_win never touches.
- **Exact analytic ablation, per stat, paired bootstrap.** Removing ALL THREE
adjustments changes resolution by nothing everywhere (hits 0.0059, TB 0.0015,
rbi +0.0106, runs +0.0130, walks +0.0008) — and rbi's home/away is mildly
HARMFUL (+0.0053, CI excludes 0). ~100% of the edge is base+recency.
- **Pooled 0.46 is an artifact** — per stat 0.196 (hits) … 0.499 (rbi). Corrected
last session's reading; paired differences unaffected.
- **BIGGEST LOSS = the clamp.** 20.6% of settled rows pinned to a constant (no
ranking possible there), and `0.900` covers home_runs-under truly 99.5% AND
hits-under truly 51.9%. Global over-prediction +3.5pt (TB +7.6). No new data
needed to fix.
- **One real lead: `opportunity_drift`** (residual +0.156 hits, +0.145 TB —
repeats across stats, unlike the weather hits which sit inside the expected
false-positive count). We ALREADY compute it; arch-v1's opportunity axis
extracts nothing from it. Wrong implementation, not a missing feature.
- **Archetype: UNMEASURABLE** — 2 of 41 labels have testable n. Not refuted.
- **Next order priority:** (1) clamp + calibration, (2) opportunity as a rate
scaler, (3) prune the diluting axes, (4) get archetype coverage. Explicitly NOT
another projection variant.
- Flagged: `model_snapshots.outcome` NULL on all 22,032 rows — retention is
never settled, so replays must join the ledger for labels.
## Session 77 (2026-08-03) — Settlement was dead for two days; scoreboard now readable ✅
Specs: `specs/challenger-scoreboard.md`, `specs/odds-429-diagnosis.md`.
4,159 tests / 332 suites green, web build exit 0.