# Direction 2, Tracks, pass 3

*W-design-pass3-d2-tracks, Opus 5.5, 2026-09-27 12:07 to 12:21 Beirut. Brief: `briefs/W-design-pass3-d2.md`, built on the pass 2 d2 files. Files: `situation.html`, `now.html`, `scripts/shots.cjs`, `scripts/palette_cvd.py`, `palette-cvd.txt`, `shots/`. Design choices are grade C (judgement). The verification numbers below are grade A: our own script output, re-runnable with `NODE_PATH=/home/botbox/node_modules node scripts/shots.cjs`.*

**Look first:** `shots/situation-desktop-1657.jpg` (loaded with `?t=16:57Z`), then `situation-desktop-play.jpg` (playback paused by script at 17:00Z), `situation-desktop.jpg`, `situation-phone.jpg`, `now-desktop-scrub-1657.jpg` (extra: Now scrubber at 16:57Z), `now-desktop.jpg`, `now-phone.jpg`.

## (a) What changed against pass 2 d2, item by item

1. **Market strip.** New row under the header: market cap (24 px, ice, the only ice number besides the state word), price, since first read, since you looked, liquidity, wallets entered. Every readout follows the playhead. Sticky at the top on desktop, 55 px tall, one row of six. On the phone it is not sticky (the ruler is, as in pass 2) and wraps to two rows of three, market cap first; the clocks in the captions drop on the phone to keep one caption line. Direction is words only ("up 87%", "down 25%"), all in the same ink; no arrows, no green, no red, no orange. Before 16:32Z the numbers say "not read yet". Between 16:57Z and 17:27Z "since you looked" reads 0% because no read lands in between (grade C choice; the brief only fixes the values at and before the look and at now).
2. **Moment panel.** Big number is market cap (28 px) with price beside it (20 px), then wallets entered and top-20 share. Away from now each gets a quiet second line "now $2.66M", "now $0.00266", "now 939", "now 0.59". At now the second lines are empty and hidden (checked: 0 shown).
3. **Playback.** Done; see (b). Play control sits in the ruler's label column, left of the tag, next to Back to now.
4. **Events, snapping, ghost line.** Done; see (b). Dots on the ruler at 16:32, 16:42, 16:57, 17:08 (hollow, the trader) and 17:27Z; the 16:57Z read also carries a chalk ring for your last look. Each has an SVG title. On the phone the two non-read events are labelled "your look" and "trader" in place of the 20 minute tick labels (they would collide).
5. **State band.** 16 px tall, "Developing" and "Money first" printed inside, the segment under the playhead one step brighter. On the phone the Developing segment is about 28 px wide, too narrow for the word, so it shows the grey segment without the word (grade C trade-off; the moment panel still says Developing there).
6. **Track hierarchy.** Price is the hero: 120 px (others 44 to 78), a lighter band `#19212A`, a richer three-stop area fill, and the market cap at the playhead printed inside the track, just left of the playhead so it sits on the committed past (right of it only near 16:27Z). Money out collapses to a 28 px hatched lane with "exits not read yet, needs wallet balance reads"; the code keeps a full-height form only if exits exist (none do). Holders and attention 60 px, you 44 px. Readouts 18 px / 500, captions 12 px at 60% ink.
7. **Dedupe.** Money and participants keeps the composition bar and two tiles (876 before the first profiled trader; 260, 30%, returning). Market keeps the low of the hour, the liquidity tile with its pool reserves note, and a four-row read list (clock, price, market cap). Price, market cap and percent live only in the strip and panel now.
8. **Moment in the URL.** `?t=16:57Z` sets the playhead on load; every move rewrites `?t=` with `replaceState` (debounced 120 ms, and not during playback, only when it stops). At now `t` is dropped. "Copy link" in the panel header copies the URL of the current moment and reads "Copied" for one second. The button text was shortened from "Copy link to this moment" to "Copy link" (the full phrase is its title and aria-label) because the long one wrapped to two lines in the 336 px panel.
9. **Live edge.** At now every track has a dashed now edge and a soft ice gradient at the right edge pulsing on a 2.8 s cycle; the tag reads "now · tape 12 s". Away from now the pulse stops, the dashed edge stays. No pulse under reduced motion (checked: animation `none`).
10. **Now scrubber.** Done, not cut. A range slider at the top of the list aligned to the sparkline column, the moment printed once large beside it ("16:57Z 30 min ago"). Moving it puts a hairline on all six sparklines at the same clock and dims each row's since-you-looked count when the moment is before that row's last look. Rows do not re-sort. Also: the SPRING row's link carries the moment (`situation.html?t=16:57Z`), so scrubbing the list and clicking opens the situation at the same moment.

Cut: nothing. Small fixes on the side: the money in bars' SVG class was renamed from `bar` to `mb` because `bar` is also the app bar's class and CSS geometry properties can apply to SVG rects; the CSS transition on the dimmed "after" overlay was removed (it lagged the playhead during playback), so the dim now steps by the minute while the playhead line glides.

## (b) How it behaves

- **Playback.** Play runs from 16:27Z (or from the current moment if you paused mid-hour) to now in about 8 s, eased with a half cosine. Readouts, strip, panel and state word update each minute; the state word flips at 16:32Z; money in bars are brighter once crossed and brightest while under the head; since-you-looked lines light up in order at 17:08Z and 17:27Z. Any pointer down anywhere (except the button) pauses. At now it stops and the button reads Replay. Space toggles play when the tag has focus. `?play=1` starts playback on load. Under reduced motion it steps one minute every 133 ms with no tween and finishes in 8.0 s (measured).
- **Snapping.** On pointer release within one minute of an event (16:32, 16:42, 16:57, 17:08, 17:27Z) the playhead lands on the event. A click at 17:09Z lands on 17:08Z (checked).
- **Keys on the tag.** Left and right one minute, Shift or Page ten, `[` and `]` previous and next event, Home 16:27Z, End now, Space play or pause.
- **Ghost line.** Desktop with a fine hover pointer only: hovering any track draws a 1 px hairline through all tracks and a small readout at the cursor ("16:42Z · $1.06M read 16:42Z"). It never moves the committed playhead (checked: committed stayed 17:08Z while the ghost showed 16:42Z). Hidden while dragging and on touch.
- **URL.** Load `situation.html?t=17:00Z` to open at a moment; `?t=17:00Z&play=1` plays from there. Test hooks for the shots: `window.caverio.play/pause/pauseAt/moment/playing/label`, and `setMoment` from pass 2.

## (c) Illustrative values (look real on the page; also listed in About this data)

1. Market cap at the four reads, $1.42M, $1.06M, $1.68M, $2.66M: price times a 1B supply that is assumed, not read.
2. Liquidity $84K, shown from the first read on, constant (one value, no series).
3. Your last look at 16:57Z, so "since you looked", "4 changes" and the look event.
4. The 5 minute Telegram preview cadence dots.
5. "now · tape 12 s" on the tag at now.
6. Now list: LUMEN, MARLIN, KESTREL, OBOL entirely, the since-you-looked counts except SPRING's, and the per-row last looks used by the scrubber: SPRING 16:57Z, AGRIPPA 16:47Z, LUMEN 17:02Z, MARLIN 17:12Z, KESTREL 17:17Z, OBOL 17:19Z. AGRIPPA's two reads are real; its bars spread each 30 minute count evenly.
7. "Developing until 16:32Z" is taken from build-0, not recomputed.

## (d) Verification (run 12:17 Beirut, `scripts/shots.cjs`, output excerpted)

```
situation-desktop.jpg      scrollWidth 1280 ok, overflowing none, 174 KB, fonts Geist/Geist Mono, strip 1 row of 6, 55 px
  strip ["$2.66M","$0.00266","up 87%","up 58%","$84K","939"]; panel $2.66M / $0.00266 / 939 / 0.59; "now" lines shown 0; tag "17:27Z now · tape 12 s"
situation-phone.jpg        scrollWidth 390 ok, overflowing none, 140 KB, strip 2 rows 3+3, first = market cap
situation-desktop-1657.jpg (loaded ?t=16:57Z) scrollWidth 1280 ok, 164 KB
  strip ["$1.68M","$0.00168","up 18%","this is your look","$84K","861"]; panel $1.68M "now $2.66M", $0.00168 "now $0.00266",
  861 "now 939", 0.57 "now 0.59", "tape · read 16:57Z"; state Money first; since-you-looked dimmed 4 of 4; url ?t=16%3A57Z
situation-desktop-play.jpg (?play=1, paused by pauseAt 17:00Z) 164 KB; tag 17:00Z; strip $1.68M, $0.00168, up 18%, 0%, $84K, 861; "as of 16:57Z"
now-desktop.jpg 86 KB, now-phone.jpg 71 KB, both scrollWidth ok, overflowing none
keys ] : 16:27Z > 16:32Z > 16:42Z > 16:57Z > 17:08Z > 17:27Z | [ : 17:08Z > 16:57Z | ArrowLeft 16:56Z | click 17:09Z snaps to 17:08Z
ghost shown, "16:42Z · $1.06M read 16:42Z", committed playhead unchanged 17:08Z | Space play from now ends at 17:27Z, label Replay
reduced motion (390 px) playback ends at 17:27Z, label Replay, 8.0 s, live-edge animation none, no overflow
now scrubber at 16:57Z: 6 hairlines, dimmed LUMEN, MARLIN, KESTREL, OBOL; SPRING link situation.html?t=16:57Z
```

- No U+2014 in any file in this directory (grep).
- Banned words and internal strings (`ev-`, `rel-`, `R4a`, `provisional`, `illus`, `fixture`, `T5`, `schema`, `derived`, `contract`, `provider`, smart money, alpha, edge, buy, sell, bullish, score) in rendered text with every drawer open, plus titles, aria labels and SVG titles, at now and at `?t=16:57Z`, both pages: zero hits. `ev-` is also gone from the source.
- Hex colours in the pages: only the pass 2 palette plus the hero band `#19212A`; no green or red hex anywhere. Contrast on the new surfaces (our computation, WCAG): 60% caption ink on the hero band 5.69, ice on the hero band 8.25, ice market cap on the strip ground 9.89, caption on the strip ground 6.19. CVD distances are unchanged from pass 2 (`palette-cvd.txt`, same hues).
- Nothing after 17:27Z appears. Every number sits in a track, the strip or the panel with a caption carrying source or clock.

Status: DONE
