From 91911cfb1ce728f5135a932202d1129e47f7083d Mon Sep 17 00:00:00 2001 From: Kev Date: Fri, 31 Jul 2026 05:35:10 -0400 Subject: [PATCH] =?UTF-8?q?docs:=20Wave=203=20recorded=20=E2=80=94=20/comp?= =?UTF-8?q?are=20live-verified;=20resolution=20tail=20scoped?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_01QJs13VsyiSKYQP6rj3NNmc --- outputs/VYNDR-COMPLETION-MATRIX.md | 18 ++++++++++++ specs/STATE.md | 32 ++++++++++++++++++++++ specs/wave3-compare-and-resolution-tail.md | 22 +++++++++++++++ 3 files changed, 72 insertions(+) diff --git a/outputs/VYNDR-COMPLETION-MATRIX.md b/outputs/VYNDR-COMPLETION-MATRIX.md index 65e6d24..46244b0 100644 --- a/outputs/VYNDR-COMPLETION-MATRIX.md +++ b/outputs/VYNDR-COMPLETION-MATRIX.md @@ -630,3 +630,21 @@ No grade/ledger/model/scoring change. Matrix effect: rows 16 (Parlay lab), 22 (Slip reader) and 25 (`/intelligence` half) move from **WIRED: NO → YES**. 315 suites / 3,920 tests green, web build exit 0. + +--- + +# WAVE 3 — 2026-07-31 → `specs/wave3-compare-and-resolution-tail.md` + +**`/compare` BUILT** (row 20 → real). A same-market head-to-head on the live player feed: rows aligned +on measures both sides share, `NO DATA` for an unresolved side, `—` never 0 for a one-sided measure, +refusal when neither resolves, and **NO VERDICT**. Live-verified: Judge vs Ohtani, 5 of 5 shared +measures; bogus name → NO DATA. + +**Resolution tail — ALL FIVE outputs scoped, none shipped** (rows 23 ShareCard, `/notifications`, +result posts, recap): share-card generation **SPEC'D-NOT-BUILT** (absent from the resolve fanout; +renderer has zero callers) · push/Telegram/Discord **BUILT-NOT-FIRING** (env-gated; `push_subscriptions` +and `user_notifications` both **0 rows**) · recap **SPEC'D-NOT-BUILT** (no file). **And nothing calls +`/api/grading/resolve` — there is no ESPN poller in the repo**, so the tail is unreachable regardless. +The live settle path emits ops alerts only, with zero user-facing output. + +316 suites / 3,930 tests green, web build exit 0. diff --git a/specs/STATE.md b/specs/STATE.md index d60d0be..3ccb39b 100644 --- a/specs/STATE.md +++ b/specs/STATE.md @@ -803,6 +803,38 @@ > failure → **added to the Chrome manifest** (confirm the dropdown shows the four entries, and that a > signed-out Intelligence click lands on `/login`). +> ## 🔀 WAVE 3 — /compare BUILT · RESOLUTION TAIL **SCOPED, NOT SHIPPED** 2026-07-31 → `specs/wave3-compare-and-resolution-tail.md` +> No grade/ledger/scoring change (diff empty across `intelligence/`, `ledgerService`, `outcomeService`). +> **🔴 0.3/0.4 — THE RESOLUTION TAIL DOES NOT FIRE.** The resolver is `POST /api/grading/resolve` +> (`routes/grading.js:208`, "called by the ESPN poller at FINAL"); its fanout at `:356-371` holds +> webPush + telegram + discord. State of all five outputs: **share-card generation = SPEC'D-NOT-BUILT** +> (`grep shareCard grading.js` = **0** — not in the fanout at all; `shareCards/renderer.js` has **zero +> callers**) · **push = BUILT-NOT-FIRING** (gated on `webPush.configured()`; **`push_subscriptions` 0 +> rows, `user_notifications` 0 rows** — nothing ever subscribed or delivered) · **Telegram = BUILT-NOT- +> FIRING** · **Discord = BUILT-NOT-FIRING** · **recap = SPEC'D-NOT-BUILT** (no recap file in `src/`). +> **AND THE WHOLE TAIL IS UNREACHABLE — nothing calls `/api/grading/resolve`; there is NO ESPN poller +> in the repo.** The live settle path is the scheduler's `settleAllOutcomes`/`settleAllLedgers`, which +> fans out to **`opsNotify` only** (ops alerts), with **zero user-facing output**. Per the order's own +> rule, **ShareCard · /notifications · result posts · recap are ALL SCOPED, none shipped** — no dead +> shells over a silent pipeline. +> **✅ /compare BUILT.** Semantics (0.2): a **same-market head-to-head** — two players, every row a +> measure BOTH sides are scored on, aligned by `alignRows`; deliberately NOT two disconnected graded +> props. Reads the live `/api/stats/player/:name?sport=` aggregate. **Honest-absent three ways:** an +> unresolved side reads **NO DATA** while the other still renders · a measure only one side has renders +> **`—`, never 0** · if NEITHER resolves the page **refuses to compare**. **NO VERDICT** — it shows the +> measures and says the reader draws the call. +> **FINGERPRINT:** deploy boundary captured (attempts 1-4 `IN DEVELOPMENT`, attempt 5 gone). Live +> head-to-head through the deployed proxy — **Judge vs Ohtani: AVG .248/.289 · HR 17/23 · RBI 38/65 · +> OPS .908/.931 · GP 59/103, 5 of 5 shared measures**; bogus name → `found:false` → NO DATA. +> **⚠️ HARNESS ERROR RECORDED:** my first live check reported `found=false` for both real players — +> that was **my script's bare `except` returning a fabricated negative**, not the service (curl via +> both proxy and Express: `found:true`, 3/3). Same class as `Number(null)===0`: a verification harness +> must fail loudly, never return a plausible-looking false. +> **FLOOR: 316 suites / 3,930 tests green (10 new), web build exit 0.** Two pre-existing tests +> (`vyndrPhaseE`, `vyndrParityQA`) asserted the in-dev placeholder — **superseded, not deleted**; they +> now assert the stronger properties on the real page (live fetch, no sample players, NO VERDICT, +> NO DATA, "not a zero"). + - **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, diff --git a/specs/wave3-compare-and-resolution-tail.md b/specs/wave3-compare-and-resolution-tail.md index fa516f1..f576377 100644 --- a/specs/wave3-compare-and-resolution-tail.md +++ b/specs/wave3-compare-and-resolution-tail.md @@ -70,3 +70,25 @@ and that a misspelled name reads NO DATA rather than a fabricated card. VERIFIED: all five tail states; /compare built on the live feed. CANNOT DETERMINE: whether VAPID / Telegram / Discord env is configured in prod (not visible externally) — moot while no trigger exists. **BLOCKED: ShareCard, /notifications, result posts, recap — all on a resolution tail that never fires.** + +## POST-DEPLOY FINGERPRINT (commit `bf7c0a3`) + +**Deploy boundary captured:** attempts 1-4 still served `IN DEVELOPMENT`, attempt 5 flipped — the +real page is live (`Enter two players`, `nothing here is modelled`), placeholder gone. + +**Live head-to-head, through the deployed proxy (Aaron Judge vs Shohei Ohtani, MLB):** + + .248 AVG .289 + 17 HR 23 + 38 RBI 65 + .908 OPS .931 + 59 GP 103 → 5 of 5 shared measures, both found:true + +**Honest-absent verified live:** a bogus name returns `found:false` → renders NO DATA, no fabricated card. + +**⚠️ Verification-harness error worth recording:** my first check reported `found=false` for both real +players. That was **my script**, not the service — its `except` branch returned `{found:False}` and +swallowed a urllib-side failure. curl through **both** the proxy and Express returns `found:true` with +5 season rows, 3/3 repeats. Lesson: a bare except in a verification harness fabricates a negative +result, which is the same class of bug as `Number(null) === 0` — the harness must fail loudly, not +return a plausible-looking false.