docs: takeable tagging shipped, efficiency challenger blocked (board + state)

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:20:18 -04:00
parent 2bfaeff572
commit 896e6e1a00
2 changed files with 75 additions and 0 deletions
+48
View File
@@ -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,