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:
@@ -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.
|
||||
|
||||
Reference in New Issue
Block a user