# Direction 2, Tracks, pass 4: the instrument pass

*W-design-pass4-d2-tracks, Opus 5.5, 2026-09-27 13:24 to 13:40 Beirut. Brief: `briefs/W-design-pass4-d2.md`. Built on copies of the pass 3 files. Files: `situation.html`, `now.html`, `scripts/shots.cjs`, `scripts/verify-output.txt`, `scripts/palette_cvd.py`, `palette-cvd.txt`, `shots/`. Design choices are grade C (judgement). Verification numbers 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-compare.jpg`, then `situation-desktop-1708.jpg`, `situation-desktop-event.jpg`, `situation-desktop.jpg`, `situation-phone.jpg`, `situation-phone-compare.jpg`, `now-desktop.jpg` (plus `now-phone.jpg`).

## (a) What changed against pass 3

All four blocks are done. Block D was built because A to C were verified by minute 12 of the build. Nothing was cut.

**A1 Token header.** The left side has `SPRING` at 34 px, `Robinhood Chain · 60 min tracked` under it, then the address in mono (a button: clicking it copies), a Copy control (icon plus "Copy"; it reads "Copied" for one second), a hairline, and `DexScreener ↗` and `Explorer ↗` as quiet caption-ink text links (exact hrefs, `target="_blank"`, `rel="noopener"`). The right side is one segmented group: Following (on), I'm in, Share. `Back to now` sits left of the group while away from now. On the phone the right group drops under the left one as a single full-width row, and the Copy control keeps only its icon and title (the word comes back as "Copied"). The state line is now two lines: the state word plus the tightened sentence, and a caption `Money has led public attention for 60 min.` The "60 min tracked" also follows the moment ("41 min tracked" at 17:08Z). **A2 Money and Participants.** These are now two lanes. Money has the bars and `939 entered`. Money out is now a **caption** in the Money label ("exits not read"), not a hatched lane, so that the eight lanes stay in the order the brief asks for. Participants holds only the 17:08Z hollow mark, with `1 profiled` / `none yet` and the caption `260 returning, timing not read`. The Safety lane is new: hatched full width, reading `not read`. The pass 3 "No safety change seen" line under the tracks is gone. In the evidence, "Money and participants" is split into Money and Participants, and a hatched Safety tile is added. **A3 Readouts.** Every lane label shows its readout at one x and one size (checked: all at x 51, 18 px): `939 entered`, `1 profiled`, `top 20: 0.59`, `none seen`, `not read`, `looked 16:57Z`. Not-known values use the muted ink. The label column went from 176 to 196 px so that captions stay on one line. **A4 Names.** "Playhead" appears nowhere: not in rendered text, titles, aria, the source or comments. The inspector title is dynamic (see b). The whole-page cue for historical mode is **a 2 px ice rule under the market strip** (grade C), together with `Situation at 17:08Z` above the state word, as-of clocks in the strip captions, and `Back to now` in the header.

**B1 Pin A, Compare.** There is a Pin A button in the inspector header and a small Pin A button inside the ruler tag. A is a filled chalk pin with the letter A on the ruler, plus a chalk dashed line through every lane and a faint band between A and B. You can drag either the A pin (arrow keys also work when it has focus) or the moment tag. Swap, Unpin and Copy comparison sit in the inspector header. The compare table, What changed, the captions, and the strip's "A over B, delta in words" all behave as specified. **B2** The chip is a button that opens last look vs now. **B3** URLs carry `?t=` and `?a=`. Share copies the comparison URL in compare mode and the moment URL otherwise; the Now SPRING row still carries `?t=`. **B4** Every mark is clickable: the four reads (ruler and Price lane), the trader (ruler and Participants), your look (You lane), and the state change (an ice tick on the state band at 16:32Z, and the state word in the header). Marks have a hover ring on desktop, a 44 px hit area on touch, and are focusable with Enter. A click never moves the moment.

**C1 Material rule** is in the page data (`RULE`), printed in About this data. Deviation (C): **a change of state also counts as material**. It does not fire at the fixture's look vs now, so the brief's 3 + 1 still holds. **C2** The inspector has separate `Waiting for` (○) and `Not yet known` (?) lists. Before 17:08Z, Waiting for also lists "A first profiled trader". **C3** The header sentence, caption, chip, tracked age, and every evidence section and summary follow the moment. **D1** "I'm in" records the moment, price, market cap, wallets and state in `localStorage`. It then draws a chalk diamond "entered" on You, switches the button to `In since 17:27Z`, adds a `since you entered` chip and the `Entry vs now` preset, and puts `Not in` in the entry's event detail. **D2** Clicking a lane title grows that lane 1.6x and fades the others to 60%. Clicking the title again, clicking blank space or pressing Escape restores it.

**Now page:** only the SPRING row sentence changed, to the tightened form, and its count went from 4 to 3 (material changes). The other rows' counts stay illustrative "changes".

## (b) How it behaves

- **Inspector modes.** `Now · Situation` at now. `Situation at 17:08Z` away from now (ice title). Pinned with A = B: the title stays, a hint says "A pinned at 16:57Z. Move the moment to choose B." Once B differs from A: `Compare · 16:57Z vs 17:27Z`. With an event open: the event name and clock. `Back` restores whichever mode was underneath. Moving the moment closes an open event. Escape closes an event, then leaves compare, then clears lane focus.
- **Compare.** Rows: State, Market cap, Price, Wallets entered, Profiled traders, Public attention, Top-20 share. Each value is `last(m)`, exactly as the moment panel computes it. A value with no read shows `not known at 16:27Z` in muted ink. What changed has Material and Observations, each sorted by clock, plus captions `Still no public mention` and, when the top-20 move is under 0.05, `Holder concentration little changed`. On the phone the table **stays at three columns** (label, A, B) and fits at 390 without overflow; "not known at" wraps inside its cell.
- **Event mode.** Name and clock, then the facts the fixture holds, then the source, then Back. If the event lies after the current moment, a chalk line says so ("After this moment: 11 min later than 16:57Z"); this is the only place a future fact can appear, and only after a deliberate click. The state event brightens the 16:32Z read marks and outlines the Attention lane while open.
- **URL grammar.** No query means now. `?t=17:08Z` is a moment. `?a=16:57Z&t=17:27Z` is a comparison (t is kept even at now when a is present). `?play=1` still plays. `replaceState`, debounced 120 ms, never during playback.
- **Material rule** (grade C placeholders): a first of something (first read, first profiled trader, first public mention), a price move of 25% or more, wallets moving 50 or more, top-20 share moving 0.05 or more, any safety change, any state change. Everything else is an observation. Each material line in the since-you-looked list carries its reason on hover (title) and on tap (inline), for example "price moved 58% against your look". On the phone, observations sit behind `View all observations (1)`.
- **Longer windows (architecture only, no control).** `?w=6h` would keep the same ruler and the same `last(m)` lookups but change the unit: ticks per 30 min, reads collapse to one hollow point per read cluster, wallet bars become waves (one bar per contiguous entry burst), attention becomes bursts, and only material events keep their own marks. Observations fold into a count on the cluster, and clicking a cluster zooms the ruler to its 1H span. The state band is the one layer that never compresses, because it is already the summary. `?w=24h` and `?w=all` would repeat the fold one level up. Compare and event modes are unchanged, because they only read moments.

## (c) Missing-data grammar on this page (reviewer 42)

| Case | Visual here | Instance on this page |
|---|---|---|
| Known, fresh | solid ink readout, ice mark, "read 17:27Z" caption | reads at 16:32, 16:42, 16:57, 17:27Z |
| Known, stale | same value, caption "as of 16:57Z", dotted line between reads | every readout between reads |
| Unknown, not read | 45° hatching plus muted "not read" | Safety lane and tile, early wallets still holding, exits, before 16:32Z on Price and Holders |
| No event observed (working coverage) | normal ground, normal ink, "none seen" | Attention (Telegram preview every 5 min) |
| Source unavailable | muted caption naming the source, no mark | X ("X not read"). There is no outage in this tape, so no error marker is drawn. |

## (d) Illustrative values (on the page and in About this data)

1. Market cap at the four reads, $1.42M, $1.06M, $1.68M, $2.66M: price times an assumed 1B supply. 2. Liquidity $84K, constant. 3. Your last look at 16:57Z, and with it the whole since-you-looked set, the chip counts and the look event's "what you saw". 4. The 5 minute Telegram cadence dots. 5. "now · tape 12 s". 6. Now list: LUMEN, MARLIN, KESTREL, OBOL entirely, the other rows' counts, and the per-row last looks. 7. "Developing until 16:32Z", taken from build-0. **New:** 8. The material thresholds (25%, 50, 0.05). 9. The look event's source line "this page, your last visit". 10. The read events' source line "our tape, wallet balance read" is used **verbatim from the brief**. Vesper, please check it: About this data also says holders are counted from the tape until balances are read, and the two read slightly at odds. 11. The entry checkpoint is saved only in this browser.

## (e) Verification (13:38 Beirut, full output in `scripts/verify-output.txt`)

```
shots: situation-desktop 205 KB, -1708 199 KB, -compare 202 KB, -event 182 KB, situation-phone 162 KB, -phone-compare 162 KB,
       now-desktop 86 KB, now-phone 71 KB; scrollWidth ok on all, overflowing none, fonts Geist/Geist Mono; no page errors
address copy: control -> full address ok | label Copied then Copy | address click -> full address ok   (clipboard stub)
links: DexScreener exact href, _blank, noopener | Explorer exact href, _blank, noopener
lanes: state history, Price, Money, Participants, Holders, Attention, Safety, You; readouts all x 51 / 18 px
  Participants marks: ["First profiled trader, 17:08Z"] only; Safety "not read"
?t=17:08Z title "Situation at 17:08Z", header "Situation at 17:08Z" + Back to now, chip "1 material change since you looked at 16:57Z"
?t=16:57Z sentence "861 wallets entered; no profiled trader yet, no public mention seen yet.", chip "this is your look, 16:57Z",
  page text contains 876: false; evidence "861 entered by 16:57Z", "No profiled trader by 16:57Z", "Top 20 hold 0.57 ..., read 16:57Z"
?t=16:42Z chip "this is before your look at 16:57Z"; strip $1.06M, down 25%, 759; You "no look yet"
?a=16:57Z&t=17:27Z title "Compare · 16:57Z vs 17:27Z"; rows State Money first/Money first, Market cap $1.68M/$2.66M,
  Price $0.00168/$0.00266, Wallets 861/939, Profiled 0/1, Attention none seen/none seen, Top-20 0.57/0.59
  Material: 17:08 First profiled trader entered | 17:27 Price up 58% | 17:27 78 more wallets entered; Observations: Top-20 share 0.57 to 0.59
  notes "Still no public mention · Holder concentration little changed"; strip "16:57Z $1.68M > $2.66M (market cap · up 58%)", "861 > 939 (+78)"
  "now" second lines visible: 0 | Copy comparison copies ?a=16:57Z&t=17:27Z | Share in compare copies the same
dragged A pin to 16:42Z: title "Compare · 16:42Z vs 17:27Z", first column $1.06M, 759, 0.60 ... url ?a=16:42Z&t=17:27Z
chip click at 17:08Z -> compare, A 16:57Z, B 17:27Z | Escape -> moment | Pin A on tag at 16:57Z, move to now -> compare
every mark clicked at 17:08Z: 7 event titles, moment stayed 17:08Z each time
trader event: "Entered after 876 wallets, 260 of them returning from earlier launches." / "Public attention: no public mention seen." /
  "Historical context: not read" / "Source: Fomo profile, tape read"; Back -> compare restored
state word -> "State became Money first · 16:32Z", cites r1632 marks and the Attention lane
since you looked at now: M trader, M price, M wallets, then O top-20; tap shows "Material: a first of something: the first profiled trader"
I'm in -> "In since 17:27Z", entered mark, second chip; Not in -> removed, storage cleared
lane focus Holders -> others at 0.6, Holders 64 -> 102 px; blank click -> 0 faded
phone 390: observations hidden 0 -> 2 after View all; compare via chip no overflow; reduced-motion playback ends 17:27Z Replay in 8.0 s
```

- **No U+2014** in any file in this directory (grep -P).
- **Banned words and internal strings** were checked in the rendered DOM with every drawer open, plus titles, aria labels, aria-valuetext and SVG titles, at now, 17:08Z, 16:57Z and 16:42Z on both pages. The **only hits are two uses of "contract"**, both mandated word for word by the brief: the Safety evidence tile ("contract, deployer and liquidity changes need a reader...") and the Not yet known line. Both mean the token's contract, not an internal term. `playhead`: zero in rendered DOM and in source.
- **Hex colours**: only the pass 2 palette plus the pass 3 hero band `#19212A`. No green or red. Change is told in words ("up 58%", "+78"). CVD distances are unchanged (`palette-cvd.txt`, same hues).
- **Contrast** on new surfaces (WCAG, our computation): address 74% ink on s1 8.65; DexScreener/Explorer 60% ink on ground 6.19; Copy 8.98; "Situation at" ice on ground 9.89; chip text 8.51, chip count chalk 13.63; Back to now ice on its tint 8.16; strip A line 8.98; A pin letter on chalk 14.83; Pin A on the tag 13.05; inspector title ice on s3 8.05; compare A header chalk on s3 12.07; "not known at" 60% on s3 5.61; Participants caption 5.87; Safety lane text 6.18; Waiting/Not yet known glyphs 7.78. **One below AA**: a caption on a lane faded by track focus is 2.93. That is the 60% fade the brief specifies, it is temporary and user-invoked, and the faded readout stays at 5.83.

Status: DONE
