Files
vyndr/specs/BOARD-2026-08-07.md
builtbykev 08791520fc Board: mechanical inventory of every outstanding item, read from the repo
Inventory only, no build. Every line cites a file or a query; unverifiable
items are marked UNKNOWN rather than asserted.

Corrections to the assumed board:
- Scanner is DONE on the blue-boundary format (scan/page.tsx:715-717), not
  still amber.
- Screen conversion is DONE except ONE file -- RouteStub survives only in
  app/notifications/page.tsx across 47 route dirs.
- Terminal is deliberately retired (S57 redirect), not debt.
- ev_pct DOES render, in 5 frontend files. That flag was stale.
- edge_pct is NOT a scale bug: (model-line)/line is correct arithmetic that
  explodes on small lines (a 5.5 projection on a 0.5 line is a legitimate
  1000%). Live top values 900/860/700 on 68,364 rows. It is a display
  defect, not a broken computation, and it reaches a user only via
  alt_lines typing -- the grade card computes edge independently.
- All FOUR sports have real archetype registries (nba 15, mlb 15, soccer 6,
  wnba 5) and ACTIVE_SPORTS runs all four. Only MLB BATTERS is MODELED;
  everything else is scaffolding with a sound base rate and no proven
  factors. MLB pitchers: pitcherEngine.js exists at 261 lines and is read
  by ZERO serving code.
- Book comparison is built and mounted NOWHERE -- the same built-but-unread
  class the reachability guard exists for, and NOT covered by it, since
  that contract is grade fields only.

UNKNOWN and marked as such: opp_rank_stat prod population, internal-key
rotation, the ~9% void/DNP rate, and whether MovementStrip is a distinct
spec item or satisfied by GradeShift/MarketBreadth.

The ordered board puts five PARTIAL items first and flags accrual
sensitivity: seven items are isolated design/guard work buildable today
with zero clock impact; five touch the serving path and would muddy the
accruing repaired-champion dates. edge_pct is the sharpest tension -- a
real honesty defect a user can see, whose fix touches serving mid-accrual.

Clock today: 0 eligible dates, all four re-audit items WAITING.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01W1sivYNqY2TS5ftykmHBU9
2026-08-07 15:13:02 -04:00

133 lines
7.1 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# The real board — read from the repo, 2026-08-07
Inventory only. Every line cites a file or a query. Anything unverifiable is
marked UNKNOWN rather than asserted.
---
## PHASE 0 — Design / terminal
| item | state | evidence |
|---|---|---|
| **Scanner blue-boundary format** | **DONE** | `scan/page.tsx:715-717`*"the blue boundary channel (`--priced-out`): line · BK odds · ◆ fair"* and *"renders NEUTRAL, not amber (blue-boundary law)"*. Amber survives only as an unrelated CTA (`:983`) and a status line (`:846`). |
| **MovementStrip** | **NOT-STARTED** *(as named)* | No component by that name. Movement renders via `GradeShift.tsx`, `GameCard.tsx`, `MarketBreadth.tsx`, `FuturesBoard.tsx`. **UNKNOWN whether the spec wants a distinct strip or is satisfied by these.** |
| **THE WIRE** | **PARTIAL** | `components/vyndr/NewsWire.tsx` exists and is mounted — but only inside `ExploreHub.tsx`. No standalone wire surface. |
| **Book comparison** | **PARTIAL — built, unmounted** | `vyndr/BookComparisonPanel.tsx` + `components/BookComparison.tsx` both exist; grep of `web/src/app` returns **zero** mounting pages. Same built-but-unread class the reachability guard was written for; **not covered by that guard** (contract is grade fields only). |
| **Article media** | **NOT-STARTED** | No component. `/blog` exists. |
| **Offseason hub** | **NOT-STARTED** | No component, no route. |
| **Terminal** | **DONE — deliberately retired** | `app/terminal/page.tsx` redirects to `/dashboard`; layouts preserved unrouted in `components/intel/TerminalTemplates.tsx` (S57). Not debt. |
| **Screen conversion (S3639 arc)** | **DONE except one** | 47 route dirs under `app/`. `RouteStub` survives in exactly **one** file: `app/notifications/page.tsx`. Every other screen has a real page. |
**Sports surfaces that exist as pages:** `soccer` (414 lines), `desk` (160),
`intelligence` (160), `marketplace` (123). No `fight` route.
---
## PHASE 1 — Sports × role
Archetype registry (`archetypeService.ARCHETYPES`): **nba 15, mlb 15, soccer 6,
wnba 5** — all four sports have real archetype registries, not names only.
`snapshotService.ACTIVE_SPORTS = ['mlb','nba','wnba','soccer']` — the pipeline
runs all four.
| sport · role | state | evidence |
|---|---|---|
| **MLB · batters** | **MODELED** | The whole session. `hitsFactors` (3 proven factors, transmitting), `servedGrade`, repaired champion, settled ledger. |
| **MLB · pitchers** | **SCAFFOLDED** | `model/pitcherEngine.js` (261 lines, own FLAME/SCALPEL/SINKER archetypes) — **read by no serving code** (grep: zero non-test consumers). Strikeouts n=57 settled vs a 500 gate. Base rate repaired by the shared `getStatRows` MLB fix. |
| **WNBA** | **SCAFFOLDED** | Archetypes exist; settles via ESPN box scores (376 rows historically); no factor model. Base-rate path fixed this session. |
| **NBA** | **SCAFFOLDED, dormant** | Archetypes exist; offline (Python service down, off-season). Base-rate paths fixed dormant at `55b210c`. |
| **Soccer** | **SCAFFOLDED** | 6 archetypes, a real `/soccer` page, feature extractor exists. No factor model, no settled outcomes. |
**Nothing but MLB batters is MODELED.** Everything else is scaffolding with a
sound base rate and no proven factors.
---
## PHASE 2 — Wiring / data-integrity debt
### `edge_pct` — the flag is half right, and the diagnosis was wrong
**Not a scale bug.** `analyzeViaEngine1.edgePctFor` computes
`(model line) / line`, signed by direction — arithmetically correct. It
*explodes on small lines*: a 5.5 projection against a 0.5 line is a legitimate
1000%. Live top values: **900, 860, 700, 700, 660** on **68,364 rows**.
**Consuming surfaces: 15 backend files + 10 frontend files.** But
`edge_pct` itself reaches a user only through `alt_lines` typing in
`scan/page.tsx:64` — the grade card's `edge` is computed independently in
`gradeAdapter` via `computeEdge`. So the blast radius is smaller than the file
count implies.
**`ev_pct` DOES render** — 5 frontend files (`PriceTriplet`, `GradeResultCard`,
`LiveHeroProp`, scan page + route). The "ev_pct renders nowhere" flag is **stale**.
45,125 rows carry it.
**Classification: PARTIAL — a real display defect (a 900% edge is not a sentence
we can defend), not a broken computation.**
### `opp_rank_stat`
`refreshTeamStats` is wired into `snapshotService:361`. **UNKNOWN whether it
populates in production** — not verifiable from the repo, needs a live probe.
### A-emit
**Resolved.** `servedGrade.UNISSUABLE = ['A+','A','A-']`; post-cutover serving
cannot emit one. Historical snapshot rows still carry engine1 A's — that is
retired data, not live behaviour.
### Other
| item | state |
|---|---|
| `VYNDR_INTERNAL_KEY` | present in `app.js`, `preflight.js`. **Rotation status UNKNOWN** from the repo. |
| void / DNP handling | handled in `ledgerService` (`:64`, `:698`) — absence means DNP/postponed/not-final. **The ~9% rate is UNVERIFIED** here. |
| **Guard coverage gap** | reachability contract covers **grade fields only** — 0 references to `edge_pct`/`ev_pct`. Book comparison and other unmounted components are **not** guarded. |
---
## PHASE 3 — THE BOARD, ordered (half-done first)
| # | item | lane | state | serving-path? |
|---|---|---|---|---|
| 1 | **Book comparison — built, unmounted** | design | PARTIAL | **N** |
| 2 | **`edge_pct` display defect (900%)** | integrity | PARTIAL | **Y** |
| 3 | **THE WIRE — only inside ExploreHub** | design | PARTIAL | **N** |
| 4 | **MLB pitchers — engine unwired** | sports | PARTIAL | **Y** |
| 5 | **`/notifications` RouteStub** | design | PARTIAL | **N** |
| 6 | Guard coverage → non-grade surfaces | integrity | NOT-STARTED | **N** |
| 7 | Article media | design | NOT-STARTED | **N** |
| 8 | Offseason hub | design | NOT-STARTED | **N** |
| 9 | MovementStrip *(if distinct from GradeShift)* | design | UNKNOWN | **N** |
| 10 | WNBA / NBA / Soccer factor models | sports | NOT-STARTED | **Y** |
| 11 | `opp_rank_stat` prod population | integrity | UNKNOWN | **Y** |
| 12 | Internal-key rotation | ops | UNKNOWN | **N** |
### Accrual sensitivity
**Isolated — buildable now without touching the re-audit clock (7 items):**
1, 3, 5, 6, 7, 8, 9 — all design/guard work, zero serving-path contact.
**Serving-path — will muddy the accruing repaired-champion dates (5 items):**
2, 4, 10, 11, and any model work. Every one changes what a snapshot writes, so
rows produced after the change are not comparable to rows before it. **If any of
these ship, the eligible-date clock arguably restarts** — the same reasoning that
voided the shadow duel.
**#2 (`edge_pct`) is the sharpest tension on the board:** it is a real honesty
defect a user can see, and fixing it touches the serving path mid-accrual.
### The clock, today
```
eligible dates: 0 — no settled rows carry engine1@2026-08-07-fullwindow
calibration_refit 0/10 WAITING (~2 weeks)
hits_factor_lift 0/10 WAITING (~2 weeks)
prior_verdict_reaudit 0/14 WAITING (3+ weeks)
rbi_lineup_slot_gate 0/14 WAITING (3+ weeks)
```
Two tracks are now visible: **modeling is date-blocked**; **seven design/guard
items are buildable today with no clock impact.**