diff --git a/specs/STATE.md b/specs/STATE.md index 83df910..0283a1f 100644 --- a/specs/STATE.md +++ b/specs/STATE.md @@ -1,5 +1,5 @@ # VYNDR โ€” STATE OF THE WORLD -### As of `7b25d97` (main, DEPLOYED), 2026-07-21. This file opens every future session. **Start with the CURRENT STATUS + OPEN ITEMS block below.** +### As of `e311f53` (main, DEPLOYED + fingerprinted live), 2026-07-22. This file opens every future session. **Start with the CURRENT STATUS + OPEN ITEMS block below.** --- @@ -131,6 +131,55 @@ exist locally; harmless, the data restores completely. `specs/snapshot-retention.md` (Phase 2 report + schema) ยท `specs/audit-data/grade-collapse.md` ยท `specs/audit-data/gate-simulation.md`. +--- + +# ๐ŸŸข SESSION 79 โ€” READ-CARD NO-MARKET EMPTY STATE + PRICED-LINE SURFACER (2026-07-22) +The S78 diagnosis (join works, marketless scans rightly self-hide) โ†’ made the +absence LEGIBLE without fabricating a market. + +## Phase 0 gate (all clear) +- **Design-check:** built to the triplet's own REFUSAL honesty language + the + existing `EmptyState` path-forward pattern โ€” NOT freelanced. +- **Reachability:** scanner already fetches games/odds/search; snapshot is ONE + more public 30s-cached fetch per sport. +- **Staleness = inherent guard:** every scan re-validates the market + server-side at submit, so a surfaced line that rotates โ†’ honest empty state on + tap, never a vanishing triplet. + +## What shipped +- **`web/src/lib/pricedLines.js`** (pure, tested) โ€” `indexPricedLines` keeps + ONLY snapshot rows with a real `book_odds`, keyed by exact `nameKey|stat`. + Wrong stat โ†’ []; off-slate โ†’ []; nothing suggested/interpolated/nearest. +- **`web/src/components/vyndr/NoMarketState.tsx`** โ€” honest empty state: no + market numbers of its own; real priced lines as one-tap chips OR a link to the + board. Path forward, not a wall. +- **`scan/page.tsx`** โ€” snapshot fetch + "PRICED TONIGHT" help chips under the + free-typed line input (help, not restriction โ€” any prop still scannable) + + the empty state when `book_odds==null || fair_odds==null`. Tapping a chip + pre-fills + re-scans (market re-resolved server-side). + +## ๐Ÿ”ด REVERSIBILITY (the design constraint) โ€” VERIFIED +`GradeResultCard.tsx`, `PriceTriplet.tsx`, `gradeAdapter.js`, `valueState.js`, +`routes/scan.js` and the Next `api/scan/route.ts` are **BYTE-IDENTICAL** (a test +asserts none reference the new UI). All new behavior is in 2 added files + one +additive scan-page block. **Scan A untouched; free-tier model-lock intact.** + +## Proven live +- Surfacer on live snapshot: `Sam Huff hits` โ†’ exact match returns + `[o0.5? no โ€” u0.5 @105]`; wrong stat โ†’ `[]`; Aaron Judge (off-slate) โ†’ `[]`. +- Scan A (Sam Huff hits 0.5 under): `book 105 ยท fair 120` โ†’ triplet renders, + empty state hidden. +- Scan B (Sam Huff hits **3.5** over): grade D, no market โ†’ **empty state shows** + + surfacer offers the real o0.5 line. + +## Still open (unchanged; NOT this order) +- No settled `p_win` yet โ†’ adjuster measurement not begun. +- env_multiplier on a ledger row pending next MLB lock. +- mappingHarness nomination flow ยท A/D emission ยท EV overconfidence ยท + edge_pct surfaces ยท 3 key rotations (PAT stripped locally S-runbook; Kev must + still REVOKE on GitHub + rotate internal key + Storage Box password). + + --- # ๐ŸŸข SESSION 77 โ€” DORMANT ADJUSTERS WIRED LIVE (2026-07-21)