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
+18
View File
@@ -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 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. **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.
+32
View File
@@ -803,6 +803,38 @@
> failure → **added to the Chrome manifest** (confirm the dropdown shows the four entries, and that a > failure → **added to the Chrome manifest** (confirm the dropdown shows the four entries, and that a
> signed-out Intelligence click lands on `/login`). > 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, - **Redirect EXISTS + WIRED:** `closingCapture.buildCaptureRows``closing_captures` (append-only,
provenance: captured_at/book/line_type/both-prices/missed_reason) via `intradayRefreshService:221` provenance: captured_at/book/line_type/both-prices/missed_reason) via `intradayRefreshService:221`
+ internal endpoint; `ledgerService.attachClosingProb``closing_prob` (de-vigs both raw sides, + internal endpoint; `ledgerService.attachClosingProb``closing_prob` (de-vigs both raw sides,
@@ -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 / 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. 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.** **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.