From a0501f99c06b3fe1bfcec322aacc66c894591c29 Mon Sep 17 00:00:00 2001 From: Kev Date: Fri, 31 Jul 2026 06:18:42 -0400 Subject: [PATCH] docs: D1 finish recorded (rationale real-or-absent, reveal once-on-view, 10/80 chip coverage) Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_01QJs13VsyiSKYQP6rj3NNmc --- outputs/VYNDR-COMPLETION-MATRIX.md | 19 +++++++++++++++++++ specs/STATE.md | 26 ++++++++++++++++++++++++++ 2 files changed, 45 insertions(+) diff --git a/outputs/VYNDR-COMPLETION-MATRIX.md b/outputs/VYNDR-COMPLETION-MATRIX.md index 73844ac..b882763 100644 --- a/outputs/VYNDR-COMPLETION-MATRIX.md +++ b/outputs/VYNDR-COMPLETION-MATRIX.md @@ -687,3 +687,22 @@ translateY(-14px) / 6px ring). Audit correction: the `#0E0E14` card token was al 317 suites / 3,946 tests green, web build exit 0. **Not done, carried in D1:** row-hover rationale, IntersectionObserver reveal, team-gradient chips. + +--- + +# D1 FINISH — 2026-07-31 (row anatomy: rationale · reveal · team chips) + +Backend untouched. Three pure modules, unit-locked: + +- **`rowRationale.js`** — the hover "why" is the grade's OWN `reasoning` + `kill_conditions_triggered` + (VERIFIED present on live grades, built from real l5/l20/gap/home/defense/rest), or **NULL**. No + generic fallback; a locked/tier-gated reasoning counts as absent rather than paraphrased. +- **`reveal.js`** — IntersectionObserver, fires **once then unobserves**, reuses D1-A's `bootDelayMs` + (one source of truth for the 60ms stagger), and reveals immediately when the API is absent so + content is never hidden. +- **`teamChips.js`** — Rev-3 chip geometry + the 1/.86/.64/.48 ramp. **Colour coverage is 10 of ~80 + teams** (the artboard's full set, verbatim); every other team renders honest-neutral rather than a + guessed colour. + +318 suites / 3,961 tests green, web build exit 0. **Mounting the modules into the live row components +is a follow-up**; the visuals go to the Chrome audit. diff --git a/specs/STATE.md b/specs/STATE.md index a852cdb..c3ef229 100644 --- a/specs/STATE.md +++ b/specs/STATE.md @@ -904,6 +904,32 @@ > IntersectionObserver reveal (Phase 3.8) and team-gradient chips (Phase 4.10)** — both need the > System artboard's row anatomy ported, which is a larger job than the rest of D1-A. They stay in D1. +> ## 🧩 D1 FINISH SHIPPED 2026-07-31 — row-hover rationale · reveal · team-gradient chips +> Additive frontend. **Backend untouched** (`git diff src/` empty). Scope held to the row anatomy +> these three need — **no System-wide rebuild**. +> **0.2 RATIONALE SOURCE — VERIFIED REAL.** Live snapshot grades carry **`reasoning` + +> `kill_conditions_triggered`**; the summary is built by `analyzeViaEngine1` from the actual feature +> vector (l5/l20 averages, gap to the line, home/away, opponent defensive rank, rest) and kills carry +> real codes + reasons. **So the hover shows genuine grade truth** — not a placeholder. +> **0.3 TEAM COLOURS — PARTIAL, DELIBERATELY.** The artboard defines a pair for **only 10 teams** +> (BOS · CHC · CHI · DEN · LAD · MIL · MIN · NYY · PIT · SD), **lifted verbatim**; `lib/teams.js` +> holds ~80. **The other ~70 are NOT invented** — a wrong team colour is a recognition error the user +> reads as fact. Unknown teams get the **honest-neutral chip** (muted border, no colour claim), never +> a guess and never a blank gap; `coverage()` reports the shortfall rather than hiding it. +> **SHIPPED (3 pure, unit-locked modules):** **`lib/rowRationale.js`** — returns the real summary + +> kills or **NULL**; **no generic fallback** (an empty hover is honest; a manufactured "why" is a +> fabricated model explanation). A **locked/tier-gated reasoning is treated as ABSENT**, never +> paraphrased or leaked; a kill with no reason explains nothing and is dropped. · +> **`lib/reveal.js`** — fires **ONCE then unobserves** ("react to truth, then rest"), **reuses D1-A's +> `bootDelayMs`** so the 60ms stagger has ONE source of truth, and **reveals IMMEDIATELY when +> IntersectionObserver is absent** (SSR/test) so a missing API can never hide real content; +> reduced-motion handled by the existing CSS so the row is visible either way. · +> **`lib/teamChips.js`** — Rev-3 geometry (10px, 135deg, before the abbr, inside the row) + the +> ranked opacity ramp **1/.86/.64/.48** so chips dim with their row; swap-ready for licensed logos. +> **FLOOR: 318 suites / 3,961 tests green (15 new), web build exit 0.** +> **⚠️ HONEST SCOPE NOTE: the three modules are built and unit-locked, but MOUNTING them into the +> live row components is a follow-up** — the visual result belongs in the Chrome audit. + - **Redirect EXISTS + WIRED:** `closingCapture.buildCaptureRows`→`closing_captures` (append-only, provenance: captured_at/book/line_type/both-prices/missed_reason) via `intradayRefreshService:221` + internal endpoint; `ledgerService.attachClosingProb`→`closing_prob` (de-vigs both raw sides,