← All findingssource · memory/project_board_warnings.md
The gap: the verdict engine could say "she hasn't played in 16 days" and
"Pinnacle has -106" only through POST /verdict/slip, which a reader reaches
only by BUILDING a slip. The board — the site's main page — surfaced nothing.
Live HTML carried no stale_window, inactive_player OR windows_disagree;
the last two had shipped months earlier and were invisible the whole time.
Shipped 2026-08-25 (committed + pushed + deployed)
- grading-service
8937615+b2d4c05:GET /api/v1/verdict/card?league=&date= - nightly-picks
a7a4cf3:board-verdict.ts/board-verdict-join.ts, BoardView wiring, Slip rendering, dime.css
Why a new GET, not the frontend POSTing /verdict/slip — all three MEASURED
- POST is uncacheable at every layer. Board views map 1:1 onto verdict builds. Measured 3.42s cold / 0.25s warm on 17 legs, cold cliff recurring at every 60s odds-TTL rollover (BuildBoardAsOf refetches; EnrichWindowProvenance loads a snapshot per game).
game_startedwould paint every card red ~5h nightly. Tips 23:00Z,todayET()holds the date to 04:00Z. Verified on the completed 2026-08-24 slate: 6 of 6 legs returnedgame_startedfirst. It's a SLATE fact → hoisted totipped/tipped_text.slip_issueswould fire on a board. 17 live rows producedsame_player ×5+same_game_same_side→ envelope red for being a board.CheckSlipis never called by/verdict/card.
Facts worth keeping
- Join key
player_id|prop_type|line|side. Live card: 85 picks → 69 distinct; 16 duplicated across core/list tiers (0 conflicting verdicts, but separate formulas CAN carry different captured prices) → deduped server-side, core wins. Leg.Bookis left EMPTY on purpose. The card records the price, not the book.CheckPricethen skips its self-exclusion so every book votes on consensus, andBestOfferstill reports a better number. Correct input, not a missing one.no_marketfires on ~60% of card rows and is GENUINE — the line moved (card wants Engstler assists 1.5; board offers 2.5). Most actionable thing on the page, not noise.better_bookis rare on the served board: 6 of 85 rows, and mostlykelly_stake_units: 0rows the board doesn't serve. Keep it (+2.84pp is the only validated price edge) but don't build the value story on it.- Render every non-green reason, in engine order — a live card returned
[amber stale_window, red bad_price], so highest-severity-only would delete the staleness flag.CheckLegruns structural rungs before the price rung. - The site has ONE theme.
color-scheme: lightin globals.css:33 is the only match forprefers-color-scheme|data-theme|color-schemeinsrc/. - Scope: nightly CORE board only.
/clv/pickscarries noplayer_id, so the?lens=/?formula=slates have no safe key — a name match would hand one player's warning to another. - Failure →
null→ board renders as today plus "Risk check unavailable". Silence must never read as absence of risk.
Related: project_window_provenance, project_conditional_minutes_refuted, project_roi_guard_nightly_tiers, feedback_pinnacle_default