report: market-efficiency scaling check — FLAT, mechanism structurally absent

Report-only. No threshold, grade, or efficiency value changed.

VERDICT: FLAT. marketEfficiency.js does not exist (zero occurrences of
market_efficiency / efficiency_score in src/ or web/src/). The spec's
0.85/0.60/0.55 values appear in grade_thresholds.json only as PROBABILITY
BANDS - a coincidental numeric overlap, not efficiency scores.

The base edge thresholds (MLB A:5%, NBA A:7%) do not exist either: engine1.js
has zero `edge` references, so the live grade is not an edge-vs-threshold
comparison at all. The specced rule threshold = base x efficiency has no host.

DISPOSITIVE: engine1.js contains ZERO `sport` references. computeFactors
receives no sport or market, so per-market OR per-sport scaling is structurally
impossible in the live grader - not merely unwired.

Phase 2: the matched-edge test is confounded (edge is not the grading input -
the same market emits both B and C at one edge). The aggregate that
discriminates: mean grade index wnba points 4.71 at mean edge 10.2 vs mlb hits
4.58 at 69.5 vs mlb total_bases 4.32 at 84.9 - the efficient market earns the
highest grades on one-eighth the edge, the opposite of spec.

PREMISE CORRECTION (measured): this order's opening claim that full-output and
collapsed grades "agree 100%" does not hold - on 512 rows carrying both they
agree 17.8%, with 33.8% differing by 3+ tiers. The prior discrimination result
stands (champion r=0.0050 null vs probability r=0.1313; MLB 0.0686 n.s. vs
0.2356 p~0.0004). Repo unchanged between orders. The collapse was not a
phantom and the re-adjudication list stays open.

Scope: flat thresholds are a grade-CALIBRATION gap only - the projection and
the CLV edge (which measured p_win, never the letter) are untouched, so this is
not a third shadow-model alarm. But the fix is NOT independently bounded: with
no threshold step to multiply, efficiency scaling presupposes probability
grading. It is rule R4 of specs/full-output-grade-mapping.md and belongs to
that MLB-first challenger.

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-30 23:56:48 -04:00
parent 708f0fde5c
commit a6afac43cc
2 changed files with 84 additions and 0 deletions
+51
View File
@@ -518,6 +518,57 @@
> inverted, "MLB-C is the +4.57% profitable segment" is very likely an artifact of a meaningless
> letter, not a real segment** · `confidence` on every historical row (never use it as a weight).
> ## ⚖️ MARKET-EFFICIENCY SCALING CHECK 2026-07-30 (report-only): **VERDICT — FLAT. The specced mechanism is STRUCTURALLY ABSENT.**
> **⚠️ FIRST, A PREMISE CORRECTION (measured, not asserted).** This order opens with "the collapse
> concern was disproven — full-output and collapsed grades agree 100%." **That is not what the data
> shows.** On the 512 public ledger rows carrying both, collapsed (champion letter) and full-output
> (probability letter) agree on **17.8%**, and **33.8% differ by THREE OR MORE tiers**. The prior
> order's discrimination result stands unchanged: champion letter→outcome **r=0.0050 (p≈0.93, null)**
> vs probability letter **r=0.1313 (p≈0.013)**; MLB **0.0686 n.s. vs 0.2356 (p≈0.0004)**. Nothing in
> the repo changed between the two orders (HEAD is still `708f0fd`, clean tree), so this is not a
> stale reading — **the collapse was NOT a phantom, and the Phase-4 re-adjudication list stays open.**
> Reporting this straight because Phase 3.7 ("the model-soundness thread closes") is gated on an input
> that does not hold.
> **0.1 `marketEfficiency.js` DOES NOT EXIST — VERIFIED.** Zero occurrences of `market_efficiency`,
> `marketEfficiency`, or `efficiency_score` in `src/` or `web/src/`. **TRAP FLAGGED:** the spec's
> values 0.85 / 0.60 / 0.55 DO appear in `grade_thresholds.json` — but those are the **probability
> bands** (`A+ low 0.85`, `B low 0.60`, `B- low 0.55`), a coincidental numeric overlap, **not**
> efficiency scores. Do not mistake them for a wired implementation.
> **0.2 THE BASE THRESHOLDS DO NOT EXIST EITHER — VERIFIED.** There is no "MLB A: 5% edge / NBA A: 7%
> edge" table anywhere. **`engine1.js` contains ZERO references to `edge`** — the live grade is not an
> edge-%-vs-threshold comparison at all; it is the additive factor index
> (`idx = NEUTRAL_INDEX(3); idx += f.delta`). The specced rule
> `threshold = base_threshold × market_efficiency_score` therefore has **no host**: no base threshold,
> no efficiency score, and no threshold comparison to scale.
> **PHASE 1 — DISPOSITIVE: `engine1.js` contains ZERO references to `sport`.** `computeFactors({
> features, trap, consistency, prop })` receives no sport and no market; `prop` supplies only
> line/direction. **Sport cannot influence the grade, so per-market OR per-sport scaling is
> structurally impossible in the live grader** — this is not "specced but unwired", it is
> "the input isn't even in the function." It applies to the CHAMPION (what users see).
> **PHASE 2 — the matched-edge test is CONFOUNDED BY CONSTRUCTION (stated, not hidden).** Same-edge
> pairs return a mix of same/different grades, but that cannot discriminate flat-vs-scaled because
> **edge is not the grading input** — the SAME market emits both B and C at the same edge (mlb
> total_bases @ edge 20 → B n=5 AND C n=4). The aggregate that CAN discriminate: mean grade index by
> market — **wnba points 4.71 (mean edge 10.2) · mlb hits 4.58 (69.5) · mlb total_bases 4.32 (84.9)**.
> **WNBA points earns the HIGHEST mean grade on ONE-EIGHTH the edge.** Under the spec, the efficient
> market (NBA/WNBA points, 0.80) should grade TIGHTER than the lazy one (MLB total bases, 0.55) — the
> observed pattern is the OPPOSITE, and confirms the grade is untethered from both edge and market.
> **VERDICT: FLAT — one grading rule applied to every sport and every market.** An A does NOT mean the
> same thing across markets; it does not currently mean anything market-relative at all.
> **PHASE 3.6 — SCOPE, with an honest correction to "bounded".** The guardrail's framing is CORRECT
> and worth stating plainly: **a flat threshold is a grade-CALIBRATION gap. It does NOT touch the
> projection, and it does NOT touch the CLV edge** (the CLV/skew work measured `p_win`, never the
> letter), so this is **not** a third shadow-model alarm. **BUT the fix is NOT an independent bounded
> change in the current architecture:** since there is no edge-vs-threshold step to multiply, wiring
> efficiency scaling presupposes probability-based grading first. **It is exactly rule R4 of
> `specs/full-output-grade-mapping.md` and should ship as part of that MLB-first challenger, not as a
> standalone order** — with `E_sport` FIT from each sport's own accrued record, never hand-set, and
> success defined as equal realized hit-rate per letter across sports.
> **GATING NOTE FOR THE MULTI-SPORT VISION:** the premise is right that a new sport would grade wrong
> from day one — but the cause is broader than missing efficiency scaling. The grader takes no sport
> input at all, so NFL passing yards and MLB total bases would receive the identical rule. Sequence:
> probability grading (R1) → per-sport efficiency (R4) → then a new sport module.
- **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,