Challenger only. Champion grade byte-identical (verified by diff). Nothing
promoted, no live grade re-lettered, no ledger row deleted or re-settled.
BUILT src/services/challengers/efficiencyShading.js (measured-never-served):
adjusted_edge = raw_edge * f(efficiency); grade = band(adjusted_edge) against
ONE fixed bar (A+>=10, A>=5, B>=3, C>=1, D>=0, F<0) that never moves.
f(e) = E_SOFTEST/e bounded to (0,1] — soft markets intact (never amplified),
sharp shaded toward but not past zero, unscored -> f=1 and FLAGGED.
A fence test asserts no production grade path imports it.
Cross-market behaviour is unit-proven: the same raw 6% edge grades A in soft
mlb:total_bases and B in sharp nba:points.
MEASURED on 1250 live ledger rows — Phase 2.5's answer is NO, the flooding is
not gone: challenger 79.0% A and 80.9% A/B (MLB 93.4% A) vs champion 0.2% A.
TWO findings explain why, and they are the point of the order:
1. The shading is a NO-OP on the live board: rows_actually_shaded = 0 of 1250.
96.5% 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, 89.6% of hits, before any
shading. MLB median raw edge is 60%, twelve times the bar. Decisive test:
apply the sharpest score in the 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 12x overshoot. Moving the multiply
from the threshold to the edge does not change the outcome.
This is edge_pct behaving as the 2026-07-29 diagnosis described: a price-free
(proj-line)/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,
1246/1254 rows) and is not repeated. The model-version boundary is again NOT
applied: nothing promoted, so no boundary exists.
Unblocking needs the input replaced, not the multiply moved: p_win vs
fair_prob (both already computed) instead of edge_pct, plus scores FIT from our
own record for the markets we actually grade.
Floor: 313 suites / 3899 tests green (9 new), web build exit 0.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QJs13VsyiSKYQP6rj3NNmc