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:
@@ -1183,6 +1183,47 @@ phased plan in the Session-57 conversation / BUILD-STATE Next section).
|
||||
DFS pick'em is excluded from PRICING/consensus (`EXCLUDED_FROM_PRICING`) — a
|
||||
fixed-payout shaded number is not a market price. Never "clean up" breadth.
|
||||
|
||||
## Champion decomposition — the edge is a hit-rate counter (Session 78 — non-obvious)
|
||||
- **`specs/champion-input-diagnosis.md`.** `probabilityEstimator` IS the champion
|
||||
and it is five lines: `base` = empirical frequency of (stat > THIS line) over
|
||||
the game log, blended 0.6/0.4 with the last-5 frequency, then oppAdj(±0.03) +
|
||||
homeAdj(±0.015) + a cv>0.40 pull toward 0.50, then clamp [0.10, 0.95].
|
||||
- **EXACT ANALYTIC ABLATION (no refit):** every adjustment is closed-form from
|
||||
stored features and the consistency step is linear (`f(x)=0.9x+0.05` ⟹
|
||||
`f(a+b)=f(a)+0.9b`), so layers subtract algebraically out of the stored p_win.
|
||||
Result: **removing ALL THREE adjustments changes resolution by nothing on every
|
||||
stat**, and on rbi/runs it IMPROVES it (rbi home/away removal +0.0053, CI
|
||||
excludes zero = mildly HARMFUL). ~100% of the edge is base+recency.
|
||||
- **POOLED RESOLUTION IS INFLATED — do not quote 0.46.** Per stat the champion is
|
||||
0.196 (hits) to 0.499 (rbi); pooling stats with different base rates adds
|
||||
correlation because p_win tracks the base rate across stats. Paired DIFFERENCES
|
||||
(the scoreboard) stay valid; the absolute level does not. Always per-stat.
|
||||
- **THE CLAMP IS THE BIGGEST LOSS, not a missing feature.** 358/1,741 settled rows
|
||||
(20.6%) sit ON the boundary, so the model emits a CONSTANT there and cannot rank
|
||||
within a fifth of the book. And `0.900` hides home_runs-under truly 99.5%
|
||||
(−9.5pt under-confident) next to hits-under truly 51.9% (+38.1pt over-confident).
|
||||
`PROB_CEIL=0.95` makes the 99.5% case inexpressible. Global over-prediction
|
||||
+3.5pt (total_bases +7.6). Fixable with NO new data.
|
||||
- **`opportunity_drift` is the ONE real missing-weighting lead** — residual corr
|
||||
+0.156 (hits) and +0.145 (total_bases), i.e. it REPEATS across independent
|
||||
stats. Discipline: 14 features × 5 stats = 70 tests, so 3–4 CI-excludes-zero
|
||||
results are expected BY CHANCE; a single hit (weather on TB) is noise. 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 VERDICT: unmeasurable, not refuted.** Only 2 of 41 archetypes
|
||||
(BOMBER, GHOST) reach n≥40 settled rows; all mean residuals straddle zero. That
|
||||
is "we have not measured it", NOT "archetypes carry no signal". Don't act
|
||||
either way. (Their uniformly negative residuals are the global over-prediction,
|
||||
not an archetype effect.)
|
||||
- **Why every challenger has failed:** the ladder/hits-v1 REPLACE the frequency
|
||||
question with a fitted distribution; arch-v1's env axis adds park/weather the
|
||||
champion ignores. Asking "how often has he cleared THIS number" directly is the
|
||||
thing that works — improve its inputs, never substitute it.
|
||||
- **`model_snapshots.outcome` is NULL on all 22,032 rows.** The retention table
|
||||
built for exactly this kind of replay was never settled, so ablations must join
|
||||
outcomes from `ledger_entries` on (player_key, stat, line, side, game_date).
|
||||
|
||||
## Active Skills
|
||||
- vyndr-voice (all user-facing output)
|
||||
- prop-analysis (grading methodology)
|
||||
|
||||
Reference in New Issue
Block a user