From 1f5a0552ca1955621ce2ee5f131a1c70d83bb21e Mon Sep 17 00:00:00 2001 From: Kev Date: Sun, 12 Jul 2026 13:44:36 -0400 Subject: [PATCH] =?UTF-8?q?STATE.md:=20P0=20resolved=20=E2=80=94=20API=20o?= =?UTF-8?q?n=2017fb981,=20all=20fingerprints=20confirmed=20live?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 4.8 (1M context) --- specs/STATE.md | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/specs/STATE.md b/specs/STATE.md index 0d5d688..2fe9614 100644 --- a/specs/STATE.md +++ b/specs/STATE.md @@ -22,10 +22,23 @@ the single gate. WNBA/soccer rows pend honestly until Phase 4.5. | #2 | `219167e → 14dc9cf` | S6 display (ROW-GRAMMAR.md + slot-order fixes, line sparklines from intraday history, last-10 ●●○ dots, CLV distribution on MODEL tab, ⌘K SearchModal + mobile search, landing LCP fixes) | | #3 | `14dc9cf → ec5ee3d` | S11 live tracking (statsapi/ESPN live box lines → ON PACE / NEEDS N / HIT ✓ in the outcome slot, live games float up, "TRACKING — READ LOCKED PRE-GAME"; real-live acceptance: Harper 3/1.5 TB ▼8th → HIT ✓). Grades never change in-game. | -**Deploy status at write time:** trains #1+#2 verified live (`/methodology` -200 on vyndr.app). Train #3 pushed; API deploy was still building — verify -with `curl -s https://api.vyndr.app/api/live/mlb` (expect JSON `hasLive`, -not "Cannot GET"). +**Deploy status:** ALL LIVE as of `17fb981` (Jul 12 17:43 UTC). Fingerprints +confirmed in prod: `/api/live/mlb` serves JSON with `hasLive:true` (S11 live +tracking working — a real game was tracked at confirm time), `/api/health` +healthy, `/api/snapshot/summary` → `expected_interval_s:1200` (env var now set). + +**P0 postmortem (`17fb981`):** the API silently served a 14h-old image +(`4d2b27d`) from Jul 11 ~20:00 to Jul 12 17:43. Root cause: the Dockerfile +never copied `content/`, and `mediaEngine.js` read `content/stark-lines.json` +with an unguarded module-load `readFileSync` → ENOENT at require time crashed +`app.js`'s eager route chain (app → routes/desk → deskService → mediaEngine) +→ boot failed → Coolify healthcheck rolled back. Every merge from S6 onward +was merged-but-not-running for 14h. Fixed: Dockerfile COPYs content/; +mediaEngine treats the file as optional garnish (loadStark try/catch → {}); +`src/preflight.js` now prints `[preflight] OK|DEGRADED` at boot so a missing +file/env is legible instead of masked by a rollback. LESSON: any module-load +file read is a boot-crash risk — keep them lazy + try/catch, and the +Dockerfile must copy every dir the runtime reads. ## LIVE INFRA MAP (verified in prod)