docs: Wave 3 recorded — /compare live-verified; resolution tail scoped

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 05:35:10 -04:00
parent bf7c0a3c08
commit 91911cfb1c
3 changed files with 72 additions and 0 deletions
+32
View File
@@ -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,