# REPORT · synth-d8-synthesis-20260917 · direction 8 "synthesis"

*Rook worker, 2026-09-17 21:24 Beirut. Folder `projects/caverio/mockups/2026-09-17-synthesis/d8-synthesis/`. Renders standalone from this folder plus `../fixtures/fixtures.js` (snapshot 2026-09-17T13:11:15Z). Nothing written to `signal-room/public/`, no sibling folder edited, `/var/tmp/caverio-design-v3/` untouched, no commit, no network beyond the Google Fonts link the seven pages also carry (fallback fonts render if offline). Budget 120 min; this job took ~15 min wall clock (started 21:09).*

## The direction

The deliberate assembly of the picks: **D5 is the skeleton, D4 the voice, D2 the sequence, D1 the deep timeline, D7 the people module, D6 the money / attention module, D3 is out.** Two systems on the same facts: the card is fast (header, cap block, one serif lead line, five setup rows with the flow bars inside the money-in row, the arrival strip, the case's own "changes the read" sentence), the situation view is deep (the decision brief, the full sheet, the tape and the arrival strip on one clock, the people module, money versus attention, exposure, the comparable, the unknowns with clocks). Nothing on the card that the situation does not carry in full.

## Files

`index.html` (board, 9 cards, 3x3 at 1440, one column at 390), `situation.html` (hash-routed, any of the nine), `d8.js` (the assembly only), `d8.css` (one stylesheet: D5's `setup.css` as the base, the other five modules scoped under `.m-story .m-arr .m-tape .m-ppl .m-race`), `caverio.css` (one copy of the token sheet), `lib/setup.js` (D5), `lib/story.js` (D4), `lib/arrival.js` (D2), `lib/tape.js` (D1), `lib/people.js` (D7), `lib/race.js` (D6), `logo/`, `capture.cjs` + `shrink.py` (from d5-setup, the capture extended with the D5 card-height reference and a verdict-word count), `shots/` (+ `CAPTURE.json`), `NOTES.md`, `PROGRESS.md`, this file. Folder total 1.6 MB, largest file 466 KB, nothing over 5 MB.

## Provenance

Every element of the card and the situation view, where it came from and what the assembly changed. "as is" = the sibling's function called unchanged.

| Element | From | Changed |
|---|---|---|
| **Card** | | |
| Header (symbol, chain, pool age, stage pill, copy, pin) | D5 `header()` | as is |
| Cap block (big cap, change since first seen, cap line from ticks, price, liquidity) | D5 `capBlock()` + `capLine()` | as is |
| Lead line | D4 `story(key).lead` | as is (the window is D4's own clock: "1.6 h left in the 120 min window", "Window closed 2.7 h ago", "No quick-trade window at this cap") |
| Setup rows: glyph grammar, row states, row renderer | D5 `model()`, `sheetRow()`, `G` | as is; the context row is dropped from the card (its cap facts are the cap block, its window is the lead line) |
| People row text | D7 `peopleLine()` | D5's row text replaced by D7's counted summary, D5's glyph state kept |
| Money-in row | D5 money row state + text, D5 `flowBars()` + `latestLabel()` | the constant bars ride inside the row (drawn once per card); when the life row is the previous selection's (musebook) the label says so with its clock; absent flow is a hatch labelled "bars absent, not zero" |
| Early-buyer-out row | D5 exit row | wording changed from "3 of 3 intact" to counts of verified balances ("none seen · 3 balances verified", "1 verified, 1 unchecked (no SOL wallet on file)"); reduced / out names as D5 |
| Money-out row | D5 money-out row (case `last3`, flow read) | when the bars' latest priced cell (life row) is a different interval, both clocks are appended: "(read 13:09Z; bars 13:10Z +$167 in)" (MEME BSC) |
| Risk row | D5 `risk` facts | rewritten as numbers against the floor on every card: "liq 1.4% of cap, floor 3% · pool 66 d · 3 holders unchecked · top holders unknown (hatch)"; the floor is read off the ladder's rung-5 reason |
| Arrival strip | D2 `events()`, `strip()`, `mountStrip()` | strip only, 58 px, D2's own scale on the card; the written list and NOT YET are not on the card |
| Waiting-for line | D5 `.ft` "changes the read" (`lines.change.sentence`) | as is; printed once (NOT YET is not on the card) |
| Card wiring (copy, pin, click to open) | D5 `wire()` | as is; D2's document-level copy/pin listeners removed so nothing fires twice |
| **Situation view** | | |
| Header + last change + cap block with axis labels | D5 `header(md,true)`, `.last`, `capBlock(...,{axis:true})` | as is, cap block in the left column |
| Decision brief | D4 `story(key)` lead + `p1`/`p2`/`p3`, `attentionClause()` | as is (D4's situation composition: attention clause appended to "what happened") |
| Setup sheet, full | D5 `sheet()` rows with `depth=true`, `peopleTable()`, totals since first sight | context row kept here (with the window clock capitalised), people row = D7 text, exit / money-out / risk rows as on the card, each with D5's reason + sentence detail |
| Timeline: tape | D1 `model()`, `tape(M,{depth:'situation'})` | `now` = the fixture snapshot instead of `readAt` (one clock with D2); `tape()` exposes its x scale through `opts.out` |
| Timeline: arrival strip beneath | D2 `strip()`, `mountStrip()` | takes the tape's scale: same `xOf`, same width, same left / right bounds, "now" at the same pixel (verified: tape now x == strip now x on all nine at 1440, incl. OPEN's future zone at x=1031) |
| Timeline: written order + NOT YET | D2 `list()`, `notYet()` | as is |
| People | D7 `peopleSection(key)` | the people block lifted out of D7's `situationView()` into its own function, body unchanged |
| Money versus attention | D6 `derive()`, `raceChart(d,W,H,true)`, lead label, legend, read line | as is; the dashed unknown crowd span kept |
| Exposure and tradability | D5 risk facts + `lines.tradability.sentence` + `exposureSummary` sentence and qualification + tradability unknowns | composed here |
| Comparable | D5 `comparable.sentence` + D6 `pathLine()` for `pathAfterFirstBuy` | composed here; stated absence when no pattern / no path |
| Unknowns and clocks | D5 unknown list + clocks; D4's collapsed `<details>` of the seven source lines | sources per line stay collapsed as D4 did it; each line also prints its own clocks |
| CSS | D5 `setup.css` base; D2 / D4 / D6 / D7 rules copied under module prefixes; D1 draws inline | D5's glyph rule `.g` scoped to `i.g` so D2's list svgs are untouched; D1's 12 px floor on the brand line added; the D5 people table stacks on a phone |
| `caverio.css` | one copy | one comment word changed ("strong rule" to "heavy rule") so the verdict-word grep is clean; no token changed |

## Screenshots

Captured with `node capture.cjs` (Playwright, headless Chromium, `deviceScaleFactor` 1, full page, `shrink.py` palette-quantises anything over 480 KB). Situation shots use the default key `robinhood:0x0ff9…e2b2` (OPTIMUS), as the seven did.

| shot | viewport | bytes | check |
|---|---|---|---|
| `shots/board-desktop.png` | 1440x1000 | 423,474 | 9 cards, 3x3 |
| `shots/board-phone.png` | 390x844 | 204,182 | 9 cards, one column, `scrollWidth` 390, no element past 390 |
| `shots/situation-desktop.png` | 1440x1000 | 213,562 | 7 panels + brief |
| `shots/situation-phone.png` | 390x844 | 465,633 | `scrollWidth` 390, no element past 390 |

All four under 0.5 MB.

## Zero errors

`shots/CAPTURE.json` (2026-09-17T18:21:02Z): `"errors": []`, `"console": []` across all four captures (page errors and console errors / warnings both collected). Fonts: Instrument Sans, IBM Plex Mono and Newsreader all report loaded on all four. Smallest rendered text on each page: 12 px (`SPAN.cv-tagline` on desktop, `SPAN.cv-wordmark` on phone). A separate check loaded `situation.html#<key>` for each of the nine at 1440: 0 page errors, 0 console errors on every key, 7 panels each.

## The three-second test, nine cards

What a trader reads without a legend: the lead line, the filled / hollow / struck rows, the strip.

1. **PONS**: "Confirming, 19 min. No quick-trade window at this cap." People filled (3 in, all holding, no shared history), money hollow (net in, not accelerating, +$193k), nothing struck. Strip: call 02:43Z, 5.1 h gap, three buyers, flow in at 13:00Z. What is happening: three independent buyers holding at a flat cap. Early or late: late to the call, level with the buyers. Watch: a third buyer or the first reducing.
2. **AI**: "Forming, 20 min. No quick-trade window at this cap." People hollow (2 in, 2 move together), money filled (+$109k, accelerating), nothing struck; strip ends with an earlier holder's sell 1 min ago. Happening: money in, but the two buyers are one voice. Late to the call, early to the second buyer. Watch: an independent second buyer.
3. **MEME (BSC)**: "Fading, 3.4 h. Past Confirming, no entry window." People filled but "none checked", exit row hatched (no BSC wallet), money-out struck (−$1.8k, with both clocks), cap −78%. Strip: everything inside the first 20 min, then 3.8 h of nothing. Late. Watch: a new covered buy.
4. **OPTIMUS**: "Forming, 20 min. Window closed 2.7 h ago." People filled (2 in, holding), money hollow (latest out −$673), money-out struck, liq 2.9% against the 3% floor, cap +119%. Strip: two buyers first, the call 12 min after, a thesis, flow out. Late in the move. Watch: an independent buyer inside a window or the first reducing.
5. **musebook**: "Active, opened just now. Past Confirming, no entry window." People hollow (4 in, 1 of 4 holding, 3 move together), exit struck rose (3 of 4 reduced or out, named), money rows hatched (no flow row for the new stage; the bars carry the previous selection's row and say so). Strip: the busiest of the nine. Late and deteriorating. Watch: another early seller or two intervals out.
6. **BONER**: "Forming, 10 min. No quick-trade window at this cap." People filled (1 in), money filled (+$5.9k, non-contiguous), nothing struck. Strip nearly empty: flow in since 11:15Z, one buyer at 13:00Z. Early, money arrived alone. Watch: a second buyer.
7. **OPEN**: "Confirming, 4 min. 1.6 h left in the 120 min window." People hollow (1 in at usual size), money hatched (2 priced intervals only), nothing struck, cap +58.7% in 24 min; the strip has the amber tail to 14:46Z. Early inside its window, unconfirmed. Watch: a third buyer.
8. **MEME (RH)**: "Forming, 9 min. No quick-trade window at this cap." People filled (1 in), money hollow (latest out −$4.2k), money-out struck. Strip: flow out since 10:45Z, the buyer at 13:01Z. Early in the order, unconfirmed by money. Watch: a second buyer or flow turning in.
9. **ELON**: "Confirming, 1 min. Window closed 2.4 h ago." People hollow (2 in, 1 of 2 holding, 2 move together), money hatched on both rows (no swap observed, bars absent not zero), exit hatched (1 unchecked, no SOL wallet). Strip: call 03:34Z, first sight 5.2 h later, two buyers 1.8 h apart. Late and mostly unknown. Watch: a third buyer.

## Section 3 constants, checklist

- [x] Header on every card: symbol, chain, pool age, stage pill, copy-address button, pin (D5's, as on the live card).
- [x] Big market cap with the change since Caverio first saw it, and the since-first-seen cap line from `ticks`; price and liquidity under it.
- [x] Net flow per cap-scaled interval as bars from `life` buckets, latest interval labelled in dollars, once per card (inside the money-in row). Unpriced = hatch, absent = "bars absent, not zero" (ELON).
- [x] No letter codes, no composite score, no confidence number, no buy / sell / long / short as instructions. The only hits of those words are the case's own fact words ("covered buy", "sold").
- [x] Palette and type from `caverio.css` (one copy). Green only on observed inflow, rose only on observed outflow or an observed exit.
- [x] Type 12 px minimum for anything a user reads (measured: 12 px on all four captures).
- [x] Every drawn element is a case fact or its stated unknown (hatch on top-holder share on all nine, on BSC / SOL wallets, on the unread flow row; "time not on file" for unclocked sells).

## Section 2 overrides, checklist

- [x] **No adjectives standing in for facts.** No EVIDENCE / ACTIONABILITY rows. Money = the bars with the latest interval in dollars; people = D7's counted line; window = a clock in the lead line ("1.6 h left", "closed 2.7 h ago", "no quick-trade window at this cap"); liquidity = "liq 4.1% of cap, floor 3%". Rendered text of all four captures counted for weak / strong / clears / blocked / tradable: 0 / 0 / 0 / 0 / 0 on each (`CAPTURE.json.words`); the same count on every one of the nine situation pages: 0. `grep -rniwE "weak|strong|clears|blocked|tradable"` over the folder's html / js / css: no hits. "intact" appears only as the case's own wallet-read state on the situation view (D4's "Balance verified intact", D5's people table), never as a row verdict.
- [x] **D1 and D2 adjacent, not fused.** The tape at full width, the arrival strip directly beneath, drawn with the tape's own x function (same zones, same bounds, same "now"); two drawings, one axis, no merged visual.
- [x] **D3 absent.** No map, no dot, no axes anywhere; `d3-map/` was not read.
- [x] **No composite anything.** No score, no confidence, no letter, no posture label as a badge, no buy / sell / long / short instruction. Posture stays a builder field and is not on either view.

## Card height at 1440 vs D5

Measured in the same capture (`CAPTURE.json.cardHeights.desktop` vs `d5CardHeights`, D5's `index.html` loaded in the same browser): D5 rows 699 / 701 / 701 px; D8 rows 698 / 727 / 682 px. Tallest D8 row 727 px against D5's 701 px = **+3.7%**, inside the ~25% allowance, so nothing had to give: the arrival strip keeps its labels and the lead line wraps to two lines on some cards, never more. The card dropped D5's "last change" line and context row (both facts are elsewhere on the card) and gained the lead line and the strip.

## Honest notes

- The money-in row and the money-out row both read the flow, one from the life bars (13:10Z on BSC) and one from the case's last priced interval (13:09Z); where they disagree (MEME BSC) the card prints both with their clocks rather than picking one, as the brief asks.
- On musebook the flow row for the new stage is not published; the bars come from the previous selection's life row and the label says so with its clock.
- The situation view repeats the flow bars in two forms: the tape's bars on the clock (D1 needs them to read) and the totals line under the sheet; the D5 grid of bars is not repeated there.
- The tape is crowded on musebook and on a phone, as D1's notes warned; the strip is nearly empty on BONER and MEME (RH), as D2's notes warned. Both are the honest picture.

Status: DONE
