Session H (night2): design pass — §2 locks + honest waiting sweep

- QA.20: one meaning per color, locked — STEAM amber (caution), VALUE
  green (edge), red only at STALE/miss; revisions render the original
  grade struck through on slate AND ledger.
- QA.21: every new data surface (PriorReads, PlayerStreaks, ModelRecord)
  renders data in mono (tabular-nums via the .mono class).
- QA.22: waiting copy derives from the real cron schedule on every
  surface (StatStrip, dashboard, Explore) — no passive mystery anywhere.
- Explore empty state joined the honest-waiting lib.
- Sweep result: no raw brand hexes and no sans-serif data in tonight's
  components (sans only on prose/captions/hero letter — sanctioned);
  glow confined to A-tier badges + reveal chrome; 390px containment
  holds (wrapping chips, scroll-contained tables from Phase 3 rules).

Backend 2352 -> 2396 tests (205 suites), web build exit 0.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Kev
2026-07-11 02:30:41 -04:00
parent 1b4f2772d6
commit 7a35c96781
4 changed files with 123 additions and 1 deletions
+28
View File
@@ -773,6 +773,34 @@ phased plan in the Session-57 conversation / BUILD-STATE Next section).
expands in place; GAME LINES <640px = `.gl-summary` best-line row +
expander revealing `.gl-full.gl-expanded`.
## Night-2 Board (Session 60 — non-obvious)
- **SNAP_TTL is 24h ON PURPOSE** (was 6h): the overnight cron gap is 11h;
a shorter TTL silently kills the morning accuracy settle. AUTONOMY.md is
the zero-touch trace — update it when the loop's shape changes.
- **The snapshot pipeline FEEDS the aggregator**: `mergeRosterLogs` writes
`rosterlogs:{sport}` (72h TTL, cap 300) from the same stats resolve that
classifies archetypes. Streaks/hot-lists starve if you remove it — the
external prefetch (n8n/tank01) was never armed.
- **THE LENS RULE**: no raw streak renders alone — `streakLens.applyLens`
attaches built-vs / tonight's matchup (+opposing SP ERA for MLB batters)
/ difficulty / one-line read. Absent context = say less, never invent.
Streaks are FREE for every tier; hot lists keep the free top-3 gate.
- **Phase 2.5 lives in `intradayRefreshService`**: signed delta vs the
GRADED side; STEAM never re-grades; ≥1.0 against re-grades THAT prop at
the real current line; a dropped grade sets `revised_from_grade` ONCE
(the original letter is forever). `applyRevision` only touches unsettled
public rows. Scheduler skips full-snapshot slots; INTRADAY_REFRESH=0
kills it. After deploy set SNAPSHOT_EXPECTED_INTERVAL=1200.
- **/api/players/search is the canonical resolver** (nameKey fuzzy; MLB =
statsapi list, others = cached names). The Python service is a fallback
only. Never reintroduce raw-substring matching.
- **Landing renders instantly for anon**: `hasStoredSession()` sync
localStorage gate — do NOT re-block the marketing render on
`useAuth().loading`; that was the 34s LOADING THE SLATE bug.
- **QA.2022 in vyndrParityQA** lock the night's color semantics (STEAM
amber / VALUE green / red = STALE-or-miss only), mono data surfaces, and
schedule-derived waiting copy. Keep them green.
## Active Skills
- vyndr-voice (all user-facing output)
- prop-analysis (grading methodology)