# VYNDR — ROW-GRAMMAR.md v1.0 ### The row grammar law. Density is unlimited when grammar is fixed: every element is DATA with ONE meaning in the SAME slot on every row of its type. Locked by `tests/unit/rowGrammar.test.js` — a slot-order change that isn't a deliberate spec amendment fails the suite. ## 1. THE LAW 1. **One meaning per element.** A mark (dot, chip, strikethrough, color) means exactly one thing, everywhere it appears. 2. **One slot per element.** The same element renders in the same position on every row of its type. A reader who learns one row has learned every row. 3. **All data is mono** (`var(--mono)` / `.mono`) with `tabular-nums` where numbers align. Data never glitches. 4. **No truncation, ever, of a player name, a game time, or a pitcher line.** Rows wrap or stack; they do not ellipsize identity or schedule facts. (`text-overflow: ellipsis` is banned on those elements.) 5. **Absent beats wrong.** A slot with no real data renders nothing — never a placeholder value, never a fabricated zero. ## 2. CANONICAL PROP-ROW SLOT ORDER Every prop row (StatStrip snapshot mode, and any future surface that renders a graded prop inline) reads left → right in this fixed order: ``` [1 identity] [2 viability] [3 stat+line+side] [4 market context] [5 model output] [6 outcome] [7 actions] [8 provenance] ``` | slot | contents | notes | |---|---|---| | 1 identity | player name · team · archetype badge | strip header — name appears ONCE per strip (S42 law) | | 2 viability | lineup chip (CONFIRMED / NOT IN LINEUP / PROJ) · injury chip | real feeds only; absent feeds → no chips | | 3 stat+line+side | `TB O1.5` | white, mono — the subject of the row | | 4 market context | best-price dot · movement chip (STEAM ▲ / VALUE ▲) | what the MARKET is doing, before what the model says | | 5 model output | revision strikethrough (original grade) → current grade badge | history then present: `A̶ B` reads "was A, now B" | | 6 outcome | live TRACKING mark (`1/2 TB · ▲6th` + progress bar + state chip), then settled chip (✓ HIT / ✕ MISS / PUSH + actual) | S11 amendment: live progress is a PROTO-OUTCOME and lives in this slot; the two are mutually exclusive (a settled prop shows only the settled chip). Once settled, actions (slot 7) disappear — the bet is over | | 7 actions | parlay `+` · BOOK IT ⟶ | suppressed when live, dead or settled (the pre-game market for a locked line closes at first pitch) | | 8 provenance | `Graded 2h ago at -115` | the receipt, always last | **Sub-line (stat + market context, one line under the row, in this order):** `[last-10 dot strip] [line-movement sparkline] [current-line delta]` - Each sub-line element renders only when its real data exists (dots need a real game log; the sparkline needs ≥3 captured history points; the delta needs a previous snapshot). Zero real data → no sub-line. **Strip header order (slot 1 + 2):** name → team → archetype → viability chips. Identity is one contiguous run; status chips follow it. ## 3. COLOR LAW — one meaning per color | color | meaning | examples | |---|---|---| | **signal green** `--g-a` / `--hit` | edge / best / confirmed-positive | grade-A badge, best-price dot, VALUE chip, HIT chip, CONFIRMED lineup, delta TOWARD, CLV beat, dot-strip filled ● (cleared the line) | | **amber** `--amber` | caution / steam / building | STEAM chip, GTD injury, delta AWAY, RECORD BUILDING, SYNC at 1.5× | | **red** `--miss` | settled-negative truth ONLY: miss / dead / stale / faded close | MISS chip, NOT IN LINEUP, OUT, SYNC STALE, CLV faded | | **dim** `--text-1/2` | absent / projected / neutral | PROJ lineup, awaiting copy, PUSH, dot-strip hollow ○ (didn't clear) | Red is never used for mere movement-against or a lower price — those are amber (caution) and plain (fact). The line-movement sparkline is therefore green when the net move is TOWARD the graded side, amber when net AGAINST, dim when flat — never red (nothing has settled). **S11 amendment — live TRACKING marks (slot 6 proto-outcomes):** green = already-cleared over (HIT ✓, filled), on-pace over, or an under still holding; amber = NEEDS N or an under whose line has been passed. An IN-PROGRESS prop is NEVER red — red stays reserved for the settled miss and the NOT-IN-LINEUP dead read. The read is locked pre-game and never re-grades; every live card carries "TRACKING — read locked pre-game" exactly once (specs/LIVE-TRACKING.md). ## 4. MARK LAW — the micro-vocabulary - **● / ○ dot strip** — last 10 games vs TONIGHT'S locked line, newest first. Filled green = that game's stat cleared the line; hollow dim = it didn't. Real game logs only; no log → no dots. - **sparkline** — the REAL captured line over time (intraday refresh history, {t, line} points, capped 24). Never rendered under 3 real points. - **strikethrough** — a dead or superseded model read (NOT IN LINEUP grade, revised-from grade). The original is preserved, struck, never deleted. - **▲ ▼** — line movement direction (market fact). **✓ ✕** — settled result. - **glow** — A-tier only (NORTH STAR rule). Chrome may glitch; data never. ## 5. MOBILE STACKING (≤390px physics) - A prop row WRAPS (`flexWrap`) — slots keep their order, overflowing slots continue on the next visual line. Order is never re-shuffled for width. - The sub-line always stacks BELOW its row, full width. - Strip header wraps after the identity run; viability chips may drop to a second line but stay ahead of the stats run. - Wide data grids (`game-lines-grid`) scroll horizontally inside their own container; the page never scrolls horizontally. - Names, game times, and pitcher lines wrap to a new line rather than truncate (law §1.4). ## 6. AUDIT (Session 6, A1 board) — violations found and fixed 1. **MovementChip rendered AFTER the grade** (market context inside the model slot). Moved to slot 4, before the revision/grade pair. 2. **ViabilityChips rendered between team and archetype**, splitting the identity run. Moved after the archetype badge (identity → viability). 3. `fade-up` keyframe started at `opacity: 0` — violating the S33 "entrance keyframes floor at the visible state" rule (a paused frame was invisible, and the hero LCP paint was delayed by the animation). Floored at `.6`. Everything else already conformed: best-price dot precedes the grade, the outcome chip suppresses actions, provenance is last, awaiting rows carry the honest schedule copy. — ROW-GRAMMAR v1.0 · July 2026 —