From 896e6e1a00a442b55e1bffaea3398b1bc503e661 Mon Sep 17 00:00:00 2001 From: Kev Date: Fri, 31 Jul 2026 00:20:18 -0400 Subject: [PATCH] docs: takeable tagging shipped, efficiency challenger blocked (board + state) Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_01QJs13VsyiSKYQP6rj3NNmc --- outputs/VYNDR-COMPLETION-MATRIX.md | 27 +++++++++++++++++ specs/STATE.md | 48 ++++++++++++++++++++++++++++++ 2 files changed, 75 insertions(+) diff --git a/outputs/VYNDR-COMPLETION-MATRIX.md b/outputs/VYNDR-COMPLETION-MATRIX.md index 627e959..801edbe 100644 --- a/outputs/VYNDR-COMPLETION-MATRIX.md +++ b/outputs/VYNDR-COMPLETION-MATRIX.md @@ -489,3 +489,30 @@ CLV edge (which measured `p_win`, never the letter), so it is not a third shadow **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. + +--- + +# TAKEABLE TAGGING BUILT · EFFICIENCY CHALLENGER BLOCKED — 2026-07-31 → `specs/takeable-tagging.md` + +**Champion grade byte-identical (verified by diff).** Additive tags only. + +**BLOCKED — the efficiency challenger.** Review Zero found all three inputs ABSENT: efficiency scores +(zero occurrences anywhere), base edge thresholds (`engine1.js` has zero `edge` references — the grade +is not edge-vs-threshold), and the claimed ±0.05 additive nudge (the only 0.05s on the grade path are a +teammate-absence feature, a bvp cutoff, and the shrink-toward-0.5 term). With no additive scaling to +swap, no threshold to multiply, and **zero `sport` references in `engine1.js`**, a +differs-in-exactly-one-thing challenger cannot be constructed. It needs **R1 probability grading** +first (`specs/full-output-grade-mapping.md`); shipping R1+R4 together would attribute an R1-driven +re-letter to the efficiency fix. Coverage compounds it: **9 of 11 live markets have no specced score.** + +**BUILT — ledger takeable tagging (deferred C2).** `src/config/takeableStandard.js`: floor on the minus +side, **uncapped plus** — deliberately NOT `valueEngine.isTakeable` (the −160..+200 promotion band). A ++400 prop is not promotable but IS takeable; a test locks the divergence. Absent price → `null`, never +`false`. The floor is **policy, not derived**, and each row records `takeable_floor` so a re-derivation +can re-tag. Migration 034 applied + tracked. **Backfill: 1,254 rows → 1,246 tagged (781 takeable / 465 +below floor), 8 NULL with `null_despite_price = 0`; settled 1,163 and graded 1,254 unchanged.** + +**NOT applied — the model-version boundary tag:** no scaling change shipped, so no boundary exists; +stamping one would record a model transition that never happened. + +312 suites / 3,890 tests green, web build exit 0. diff --git a/specs/STATE.md b/specs/STATE.md index 55e6a28..4f6b787 100644 --- a/specs/STATE.md +++ b/specs/STATE.md @@ -569,6 +569,54 @@ > 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. +> ## 🏷️ TAKEABLE TAGGING BUILT · EFFICIENCY CHALLENGER **BLOCKED** 2026-07-31 → `specs/takeable-tagging.md` +> **Champion grade UNCHANGED — verified byte-identical by diff** (`src/services/intelligence/`, +> `gradeSlateService`, `gradeAdapter`, `grade_thresholds.json` = zero diff). Additive tags only. +> **🔴 PART A — THE EFFICIENCY CHALLENGER COULD NOT BE BUILT. Review Zero came back ABSENT on all +> THREE inputs.** (0.1) efficiency scores **DO NOT EXIST** — zero occurrences of +> `market_efficiency`/`marketEfficiency`/`efficiency_score` in `src/` or `web/src/`; `src/config/` has +> no efficiency file (its one `0.80` is `providers.js WARN_PCT`, a quota warning). (0.2) base +> thresholds **DO NOT EXIST** — no "MLB A:5% / NBA A:7%" table; **`engine1.js` has zero `edge` +> references**, so the grade is not an edge-vs-threshold comparison at all. (0.3) **the ±0.05 additive +> efficiency nudge DOES NOT EXIST** — searched the whole grade path; the only `0.05`s are +> `featureCache.teammate_absence_bump` (a feature), a `bvp_advantage` matchup cutoff, and +> `p*0.9 + 0.05` in `probabilityEstimator` (the `0.5×0.1` term of the shrink-toward-0.5). **There is +> no additive efficiency application to replace.** +> **WHY IT STOPPED RATHER THAN GUESSED:** the order requires a challenger differing from the champion +> in EXACTLY ONE thing (multiplicative vs additive). There is no additive scaling to swap, no base +> threshold to multiply, and **`engine1.js` has zero `sport` references** so market cannot reach the +> grade. A threshold must exist FIRST — that is **R1 of `specs/full-output-grade-mapping.md`**, an +> explicitly held separate order. Shipping R1+R4 together would make the Phase-3 delta report +> **actively misleading**: the re-letter would be driven mostly by the switch to probability grading +> while being presented to Kev as the efficiency fix. **(0.4) COVERAGE would sink it anyway** — the +> spec names 5 scores; the live ledger has **11 markets** (MLB hits 376 · doubles 247 · total_bases 44 +> · stolen_bases 17 · earned_runs 6 · home_runs 4 · outs 2; WNBA points 246 · rebounds 156 · assists +> 142 · threes 10) and **only MLB total_bases maps to a specced score**. MLB K's and NFL passing don't +> appear at all. **9 of 11 markets have NO score**, so "all scored markets" can't be met without +> inventing 9 numbers — fabricated calibration. +> **✅ PART B — LEDGER TAKEABLE TAGGING SHIPPED (the deferred C2).** New +> `src/config/takeableStandard.js`: `isLedgerTakeable(p) = p >= floor` — **FLOOR on the minus side, +> UNCAPPED plus**. **🔴 Deliberately NOT `valueEngine.isTakeable`**: that is the −160..+200 PROMOTION +> band ("may we hero it?"); this is the RECORD standard ("could a bettor have taken it?"). **A +400 +> prop is NOT promotable but IS takeable — both true at once**, and a test asserts the two diverge on +> the plus side and agree at the minus floor so they can never quietly merge. **Absent price → `null`, +> never `false`** (without the strict guard `Number(null) === 0` is ≥ −160 and a MISSING price would be +> tagged takeable — fabricated data in the record). **The floor is POLICY, not derived, and is labelled +> so everywhere** (C1 could not derive one: every bucket's 95% ROI interval contained zero, the curve +> was non-monotone, and 661-2,285 rows/bucket are needed vs 8-71 actual). Each row stores +> **`takeable_floor`** so a re-derivation can re-tag safely instead of guessing the standard. +> **Migration 034 applied + tracked** (`takeable boolean`, `takeable_floor numeric`, partial index). +> Forward tagging in `ledgerService` at row build; backfill in one statement. +> **BACKFILL VERIFIED IN PROD: 1,254 rows → 1,246 tagged (781 takeable / 465 below floor), 8 NULL, and +> `null_despite_price = 0`** — every priced row tagged, the 8 NULLs genuinely priceless. One distinct +> floor (−160). **Settled 1,163 and graded 1,254 both unchanged** — no outcome, grade, or price touched. +> **🚫 PART C — THE MODEL-VERSION BOUNDARY TAG WAS DELIBERATELY NOT APPLIED.** It is meant to separate +> pre-fix (additive) from post-fix (multiplicative) grades — **no scaling change shipped, so no such +> boundary exists**, and stamping one would mark a model transition that never happened: a fabricated +> era in the permanent record. `src/config/modelEras.js` (S64) is its home the day a real one promotes. +> **FLOOR: 312 suites / 3,890 tests green (8 new), web build exit 0.** Grade visuals auth-gated → +> Chrome audit; this order changed nothing visual. + - **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,