docs: D1 finish recorded (rationale real-or-absent, reveal once-on-view, 10/80 chip coverage)

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QJs13VsyiSKYQP6rj3NNmc
This commit is contained in:
Kev
2026-07-31 06:18:42 -04:00
parent 085e8a3a63
commit a0501f99c0
2 changed files with 45 additions and 0 deletions
+19
View File
@@ -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.
+26
View File
@@ -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,