docs: edge-shading challenger measured — flooding persists, input scale is the bug

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QJs13VsyiSKYQP6rj3NNmc
This commit is contained in:
Kev
2026-07-31 00:39:51 -04:00
parent c2c7abbb65
commit 1e9c808d99
2 changed files with 71 additions and 0 deletions
+45
View File
@@ -617,6 +617,51 @@
> **FLOOR: 312 suites / 3,890 tests green (8 new), web build exit 0.** Grade visuals auth-gated →
> Chrome audit; this order changed nothing visual.
> ## 🧪 EDGE-SHADING CHALLENGER BUILT + MEASURED 2026-07-31 → `specs/edge-shading-challenger.md`
> **Verdict: the mechanic is sound and built — but it does NOT fix the flooding, and the measurement
> proves the bug was never the multiply's placement.** Champion byte-identical (diff empty across
> `intelligence/`, `gradeSlateService`, `gradeAdapter`, `snapshotService`, `grade_thresholds.json`).
> Nothing promoted, nothing re-lettered.
> **0.1 THIRD RE-CHECK: the flat additive ±0.05 efficiency nudge STILL DOES NOT EXIST** — no
> `efficiency` reference anywhere in `src/services/intelligence/` or `gradeAdapter`. There was nothing
> to remove. **0.2 no live base threshold exists**, so the challenger DEFINES one that never moves
> (A+≥10, A≥5, B≥3, C≥1, D≥0, F<0), identical for every market — the spec's per-sport 5%/7% variant is
> deliberately unused because a bar differing by sport IS a moving bar.
> **BUILT** (`src/services/challengers/efficiencyShading.js`, measured-never-served, fence-tested):
> `adjusted = raw_edge × f(e)`, `f(e) = E_SOFTEST/e` **bounded to (0,1]** — soft intact (never
> amplified), sharp shaded toward but not past zero (`f(.60)=.917`, `f(.80)=.688`, `f(.85)=.647`),
> unscored → `f=1` FLAGGED, absent edge → null. **Cross-market behaviour is unit-proven: the same raw
> 6% edge grades A in soft `mlb:total_bases` and B in sharp `nba:points`.**
> **🔴 PHASE 2.5 ANSWER: THE FLOODING IS NOT GONE.** On 1,250 live rows the challenger grades **79.0%
> A / 80.9% A-or-B** (MLB **93.4% A**) against the champion's 0.2% A / 58.1% A-B. The naive formula's
> 86% A/B is not meaningfully improved on.
> **TWO FINDINGS EXPLAIN IT — and they are the point of the order. (1) THE SHADING IS A NO-OP ON THE
> LIVE BOARD: `rows_actually_shaded = 0` of 1,250.** 96.5% (1,206) of rows are **UNSCORED** → `f=1`,
> and the one scored market present (`mlb:total_bases`) is the ANCHOR so its `f` is 1.0 by
> construction. `mlb:strikeouts` and `nba:points` **do not appear in the ledger at all** — our
> basketball is **wnba**, not `nba`. **Challenger vs baseline: 0 rows changed.**
> **(2) PLACEMENT WAS NEVER THE BUG — THE INPUT SCALE IS.** Against a fixed 5% bar the **RAW** edge
> already clears A on **100% of MLB doubles, 100% stolen_bases, 89.6% hits, 88.6% total_bases —
> before any shading**. MLB's median raw edge is **60%, twelve times the bar**. **DECISIVE TEST: apply
> the SHARPEST score in the whole spec (f=0.647) to EVERY row — the maximum the design permits — and
> 75.8% STILL clear A (MLB 91.7%).** Since `f` is bounded ≤1, **no achievable shading can close a 12×
> overshoot**; moving the multiply from threshold to edge cannot change that. This is `edge_pct`
> behaving exactly as the 07-29 diagnosis described — a price-free `(projline)/line` gap whose scale
> is a FUNCTION OF LINE SIZE. **It is not a betting edge, so no fixed betting-edge bar is meaningful
> against it.**
> **2.6 efficient-market over-suppression: CANNOT DETERMINE** — zero live rows are shaded, so there is
> no efficient market in the data to over-suppress.
> **PHASE 3:** takeable tagging was completed in the PREVIOUS order (migration 034, 1,246/1,254 rows,
> floor 160 recorded per row) — **not repeated, it would be a no-op**. The model-version boundary is
> **again NOT applied**: nothing promoted, so no boundary exists; stamping one would record a
> transition that never happened.
> **UNBLOCKING NEEDS THE INPUT REPLACED, NOT THE MULTIPLY MOVED:** a bar-based grade needs a real edge
> — model probability vs the de-vigged market price (**`p_win` vs `fair_prob`, both already computed
> and stored**) — plus scores **FIT from our own record** for the markets we actually grade (9 of 11
> live markets have none; inventing them would be fabricated calibration). The mechanic itself is
> sound and already built, so that re-run is cheap.
> **FLOOR: 313 suites / 3,899 tests green (9 new), web build exit 0.**
- **Redirect EXISTS + WIRED:** `closingCapture.buildCaptureRows``closing_captures` (append-only,
provenance: captured_at/book/line_type/both-prices/missed_reason) via `intradayRefreshService:221`
+ internal endpoint; `ledgerService.attachClosingProb``closing_prob` (de-vigs both raw sides,