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