STATE: Session 79 — read-card no-market empty state + priced-line surfacer, live
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VCNgGSt5qvcLxaeQqa7Zpj
This commit is contained in:
+50
-1
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user