From 4dc22c9bc91af9dd448653c3bc7a0ba1c5d30247 Mon Sep 17 00:00:00 2001 From: Kev Date: Sun, 12 Jul 2026 01:17:34 -0400 Subject: [PATCH] =?UTF-8?q?specs/STATE.md=20=E2=80=94=20state=20of=20the?= =?UTF-8?q?=20world=20as=20of=20ec5ee3d=20(A1=20board=20complete)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The session-opening doc: 3 trains shipped (2757 tests), live infra map, pending Coolify env vars + entity placeholders, honest open items. Co-Authored-By: Claude Fable 5 --- specs/STATE.md | 94 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 94 insertions(+) create mode 100644 specs/STATE.md diff --git a/specs/STATE.md b/specs/STATE.md new file mode 100644 index 0000000..0d5d688 --- /dev/null +++ b/specs/STATE.md @@ -0,0 +1,94 @@ +# VYNDR — STATE OF THE WORLD +### As of `ec5ee3d` (main, 2026-07-12). This file opens every future session. Update it when a train ships. + +## WHERE THINGS STAND + +**Tests: 2757 / 229 suites, all green. Web build exit 0.** Baseline at the A1 +board's start was 2398. Governing docs: `specs/VYNDR-NORTH-STAR.md` (v1.1) + +`specs/VOICE.md` (v1.1) + `specs/ROW-GRAMMAR.md` — read them before building +anything. + +**The record is live and writing itself.** Day one (Jul 11): 24→25 MLB rows, +real locks (line/odds/book), closing capture every snapshot + every 20-min +intraday refresh, settlement each morning slot with signed CLV. No percentage +renders anywhere under n≥20 — enforced in `ledgerService.getModelAggregate`, +the single gate. WNBA/soccer rows pend honestly until Phase 4.5. + +## THE THREE A1 TRAINS (all merged to main, all pushed) + +| Train | Range | Carried | +|---|---|---| +| #1 | `4d2b27d → 219167e` | S0 verify · S1 promise audit (`PROMISE-AUDIT.md`: alt ladder + quarter-Kelly BUILT, analyst unlimited, "40+" claims made honest) · S2 compliance (/responsible-gambling rebuilt, /terms /privacy drafts, /methodology, 5 seed articles in `content/articles/`) · S3 affiliate (BOOK IT deep links organic-until-config-flip, best-price dots, ?ref= partner attribution) · S4 media engine (`mediaEngine` + executable VOICE lint, `/desk` arsenal + DATA BRIEF, Ghost DRAFTS-only publisher) · S5 viability (statsapi lineups → CONFIRMED/NOT-IN kills grades visibly; ESPN injury wire; Yesterday/Today/Tomorrow nav + Settle panel) · S7 newsletter (Listmonk capture + THE VYNDR REPORT assembly, env-gated) · S8 ops (settle alarm, 3-slot failure pager, quota/disk/mem, 9AM pulse — test alert delivered to the real ntfy channel) · S9 slip reader (tesseract.js OCR + per-book parsers, /slip page; synthetic-image acceptance passed) · S10 public profiles (/u/{handle}, private-by-default, no-existence-leak) · migrations 021/022 | +| #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"). + +## LIVE INFRA MAP (verified in prod) + +- **VYNDR Web** — Next.js :3000, vyndr.app. **VYNDR API** — Express :3001, + api.vyndr.app (`/api/internal/*` behind `VYNDR_INTERNAL_KEY`). +- **Scheduler (in-process, API app, `SNAPSHOT_CRON=1`)** — snapshot slots + 14,19,22,1,3 UTC; settle pass (outcomes + ledger, idempotent) runs FIRST + each slot; 20-min intraday odds refresh during slate hours + (`INTRADAY_REFRESH=0` kills); desk-ready ping after the day's first slot; + daily pulse 13:00 UTC; missed-cron + 3-slot-failure + quota pagers → ntfy + `vyndr-pipeline-kev2026`. Boot logs: `[snapshotScheduler] armed` + + `[settlement] armed`. +- **Data**: Redis (mastermind-cache) for all pipeline caches (SNAP_TTL 24h — + do NOT shorten; the 11h overnight gap killed morning settles once). + **Supabase = the ledger** (`ledger_entries` + `public_profiles` + + `user_profiles.partner_ref`; RLS everywhere, service-role-only writes; + migrations 001–022 applied, files in `supabase/migrations/`). +- **Deploys**: gitea `git.builtbykev.com/builtbykev/vyndr` → Coolify webhook + (HMAC secret fixed Jul 11; auto-deploy proven). GitHub `origin` remote is + dead-PAT hygiene debt only. +- **Free feeds** (zero out-of-pocket law): PropLine ×3 keys (9k/day capacity; + intraday uses ≤144/day), odds-api backup (quota-gated), statsapi.mlb.com, + ESPN site API. tesseract.js OCR self-hosted (traineddata caches on first + call — needs outbound network once). + +## ENV VARS STILL PENDING ON KEV'S SIDE (Coolify, API app) + +1. `SNAPSHOT_EXPECTED_INTERVAL=1200` — **confirmed absent** (fresh restart + still served the 18000 default). SYNC badge tracks intraday cadence once set. +2. `DESK_OWNERS=kevdevelops@gmail.com` — /desk 403s everyone until set. +3. `LISTMONK_URL` / `LISTMONK_USER` / `LISTMONK_TOKEN` / `LISTMONK_LIST_ID` + (all four together) — newsletter no-ops politely without them; box-side + setup in `docs/NEWSLETTER.md`. +4. Optional: `GHOST_URL` + `GHOST_ADMIN_API_KEY` (drafts), `PULSE_HOUR_UTC`. + +**Entity placeholders** (S2, blocked on Kev's values): `[ENTITY NAME]`, +`[STATE OF FORMATION]`, `[ARBITRATION VENUE]`, `[CONTACT EMAIL]` in +`web/src/app/terms/page.tsx` (6×) + `web/src/app/privacy/page.tsx` (5×). +A test keeps unverified entity names out until replaced. + +## HONEST OPEN ITEMS + +- **Phase 4.5 — WNBA settlement via ESPN box scores. DUE ~Jul 24** (hard + date). Until then WNBA/soccer/NBA ledger rows pend forever; accuracy = MLB only. +- **The record needs time**: no percentage anywhere before n≥20 settles, by + design. First percentages expected ~day 3–4 of MLB volume. +- **Slip reader**: acceptance was a clean synthetic image; needs one real + phone screenshot (DK) to validate OCR robustness. +- **Landing LCP**: S6's fixes are static-analysis-provable but unmeasured — + run PageSpeed mobile vs the 3.8s baseline; next suspect is the + LiveHeroProp post-fetch swap. +- **Partner report endpoint** returns real numbers only for signups AFTER + migration 021 (metadata path live; OAuth signups carry no ref — known gap + in `docs/PARTNERS.md`). +- **NBA Oct / NFL Sep readiness** + soccer end-to-end: `specs/vyndr-roadmap.md`. +- **Killed permanently** (founder ruling): AI chat assistant, light mode. + +## OPERATING LAWS (never relax) + +Zero out-of-pocket · absent beats wrong, refusal beats hollow · n≥20 before +any percentage · nothing auto-posts anywhere, ever · grades never change +in-game (revisions are public via `revised_from_grade`) · one meaning per +color, data in mono · no exclamation points, anywhere · the pipeline is the +only source of numbers, including in marketing (`mediaEngine` lint enforces). + +— STATE as of ec5ee3d · the record is writing —