# Design pass 12: cap leads, no estimated caps, three labels, Board frozen

Built on the pass 11 files (`design-pass11-2026-09-27/d2-tracks/`). Four string changes and the CSS they force. `market.html` is byte-equal to pass 11 (sha256 `906a21d5...`). Situation architecture and the Board layout are unchanged. The Market band on Now is unchanged; it is the reference.

The edits are scripted and replayable: `scripts/patch12.py` and `scripts/patch12b.py` assert the count of every replacement against the pass 11 text. The script diff after them was small: the Evidence heading, the two Attention strings, and the chart label colour. Those were done by hand and are listed below.

**ALERT: every fixture falls to `cap not read`.** No row, card or Situation in the fixtures has a read supply (`supplyRead:false` on all six tokens; Situation's cap was price times an assumed 1B). At 1280 with no entry:
- Now: live 6 of 6 rows, 16:57Z 3 of 3, 16:42Z 2 of 2, 17:15Z 4 of 4.
- Board: live 4 of 4 cards, 16:57Z 2 of 2, 17:15Z 3 of 3 (16:42Z has no cards).
- Situation: the cap slot, at every moment after the first read.
- Board with an entry: the entry figure is `entry cap not read`.

As shipped, the demo shows no market cap anywhere until supply reads land (B8, coverage). To show the cap form, the pages take a verify-only switch, `?supply=read`, which treats every supply as read. The `*-cap-form.jpg` shots use it. The default pages do not.

## (a) Changes, with file and line (pass 12 files)

**1. Cap leads (the scale line).**
- `now.html:437` and `board.html:543`: the scale line. Order: cap slot, then price (new `span.pxl`, title `Price at the last read, HH:MMZ`), then change. With a read supply the cap slot is `MC $X`. With an estimate it is `span.mcl.nr` `cap not read`, title `supply not read at HH:MMZ`, where HH:MMZ is the moment shown. The condition is now `id.price` (was `id.mc`), so a row with a price and no read supply still prints its price and change. The no-price form (`MC not read`) is unchanged.
- `now.html:317`, `board.html:359`: `ident()` returns `mc` only when the supply is read, and never with a tilde.
- `now.html:95-97`, `board.html:95-97` (CSS forced by the width): `.scl .pxl` in ink and `.scl .nr` in the missing-data colour `--n`. The scale line may break only between its three parts (`.scl{white-space:normal}.scl>span{white-space:nowrap}`); pass 11 had `nowrap` on the whole line.
- Situation header: the header's size display is the Market strip under the state line. It already reads market cap, price, then since first read, so the order needed no change. Only the cap slot changed (item 2).
- Phone: `.mck` (`MC `) stays hidden as in pass 10, so the phone line reads `$121K · $0.000121 · -50% since seen`, or `cap not read · $0.000121 · -50% since seen`. The line no longer fits beside the symbol at 390 and 360, so pass 11's own `fitName()` rule (unchanged) moves it to its own line, whole. That gives the name its room back: `Marlin Finance` and `Lumen Network` now print at 390 and 360 where pass 11 hid them. This is the one text change outside the listed elements, and it comes from the width. The verify allows it only for names on rows in that mode (`.tk.scw`).

**2. No estimated caps.**
- `now.html:302,314`, `board.html:344,356`: the verify-only `?supply=read` switch.
- `board.html:519`: the Board entry figure is `entry cap not read`, with title `supply not read at <entry time>`. With a read supply it is `entry $X` (the tilde form is gone). CSS: `board.html:196` `.h1l b .nr` (missing-data colour, weight 400).
- `now.html:541`, `board.html:660`: the legend line `~ market cap is estimated, supply assumed` becomes `cap not read: no supply read, so no market cap is printed`.
- `now.html:242-243`, `board.html:283`: About. The scale line sentence names the price as second, and the tilde sentence is replaced by the never-estimated rule.
- `now.html:301`, `board.html:343`: the source comment on price reads.
- `now.html:572`: the test hook reports `cap not read` and the new `pxl`.
- `situation.html:461,469-470`: `SUPPLY_READ` (the same switch) and `CNR`. `fm()` returns `cap not read` unless the supply is read. Every Situation cap print goes through `fm()`: the strip, the price-lane chart label, the moment panel, the compare table's Market cap row, the Market reads table, the hover readout, and the look and entry events.
- `situation.html:630`: strip cap cell. The value is `cap not read` in the muted `.q` form. In compare mode the caption delta is `market cap · not read`, where pass 11 had a percent.
- `situation.html:647`: strip cap cell title `supply not read at HH:MMZ`.
- `situation.html:536-537`: price-lane chart label. `cap not read` in the missing-data colour, with no `market cap` suffix.
- `situation.html:729-730`: moment panel. `cap not read` in the `.q` form, with no `now $X` hint.
- `situation.html:857`: hover readout. `HH:MMZ · cap not read · $price`.
- `situation.html:764`: look event. `state Money first, cap not read, 861 entered` (pass 11 had a hard-coded `$1.68M`).
- `situation.html:768`: entry event. `Price then $X, cap not read, N wallets entered`.
- `situation.html:446`: About, Example values. `Liquidity ($84K).` The line `Market cap at every read (...), 1B supply assumed` is removed.
- `situation.html:440`: About, What we leave out. New line: `Market cap: SPRING's supply is not read, so the cap slot says cap not read. A cap is never estimated from an assumed supply.`
- `contract/nowat.py` is not touched. The v3.5 display line is to be ordered separately.

**3. Three labels.** Every occurrence, pass 12 file and line:

`Wallets in` (was `Money`, the lane):
- `situation.html:539`: lane label.
- `situation.html:406`: Evidence section heading, which names the same lane.

`No material changes detected since entry`:
- `situation.html:709`: entry chip, zero changes. Was `no change since you entered at HH:MMZ`.
- `situation.html:751`: compare panel, material list empty with A on the entry anchor. Was `No material change between A and B.`, which still prints for any other A.
- `now.html:386`, `board.html:428`: For you entry form, zero material. `In · No material changes detected since entry`. Was `In · 0 material since entry`.
- `board.html:537`: Board card Latest with an entry and no lines. `No material changes detected since entry; still <state>`. Was `Reasons at entry still hold: <state at entry>, as at HH:MMZ`.

`No mentions in tracked Telegram sources`. The label starts with a capital, so each sentence is split at it:
- `now.html:262`, `board.html:304`: About sources. `Telegram public preview. No mentions in tracked Telegram sources. X is not read.` Was `Telegram public preview; no public mention seen.`
- `now.html:327`, `board.html:369`, `situation.html:493`: SPRING sentence before the trader. `...; no profiled trader yet. No mentions in tracked Telegram sources.` Was `..., no public mention seen yet.`
- `now.html:327`, `board.html:369`, `situation.html:494`: SPRING sentence after the trader. `...before the first profiled trader. No mentions in tracked Telegram sources.`
- `now.html:328`, `board.html:370`: SPRING Why here. `...in five minutes. No mentions in tracked Telegram sources.`
- `now.html:334`, `board.html:376`: AGRIPPA sentence. `...at a steady pace; no profiled trader. No mentions in tracked Telegram sources.`
- `now.html:336`, `board.html:378`: AGRIPPA Why here. Was `...with no public mention.`; the variant without `seen`.
- `situation.html:753`: compare notes. Was `Still no public mention`.
- `situation.html:763`: first profiled trader event. `Public attention: No mentions in tracked Telegram sources.`
- `situation.html:764`: look event. Was `no public mention.`, the variant.
- `situation.html:765`: state event. `Why: first read showed 638 wallets entered. No mentions in tracked Telegram sources.`
- `situation.html:796`: Attention summary. `No mentions in tracked Telegram sources · money ahead by N min`. Was `No public mention seen · ...`.
- `situation.html:797`: Attention body. `No mentions in tracked Telegram sources, as of HH:MMZ.` Was `No public mention seen by HH:MMZ.`

The look form of For you (`No material change · since look HH:MMZ`) is not touched. It is a separate branch of `forYou()` and does not share the element.

**4. Board frozen.** See (f). Board's strings changed through items 1 to 3 only.

## (b) Amended string specification

**Scale line** (Now identity cell, Board card identity, one line, tabular figures, no tilde):
- Supply read: `MC $1.68M · $0.00168 · +12% since seen`. Cap first, price second, change third. On the phone the `MC ` key is hidden: `$1.68M · $0.00168 · +12% since seen`.
- Supply not read at t: `cap not read · $0.00168 · +12% since seen`. The cap slot is in the missing-data colour, with title `supply not read at HH:MMZ` (t). The price and the change still print.
- No price read: `MC not read` (unchanged from pass 10).
- One read: no change part (unchanged).
- Phone: the line breaks only between parts. When it cannot share the symbol line it takes its own line, whole. At 390 and 360 it fits on one line in every fixture (verify: one line on every row and card, two at most).

**Board entry figure:** `entry $X · +N% since entry · held T · ...`, or `entry cap not read · ...` with title `supply not read at <entry time>`.

**Situation header (the Market strip):** market cap, price, since first read, in that order (unchanged). The cap cell reads `cap not read` (muted), with title `supply not read at HH:MMZ`. Every other Situation cap print follows the same rule.

**Labels, byte-equal to the site:**
- `Wallets in`: the Money lane, wherever the lane is named.
- `No material changes detected since entry`: the entry checkpoint's null Latest. That covers the Situation entry chip, compare against the entry anchor, the For you entry form with zero material (`In · ` prefix kept) and the Board entry card's intact line.
- `No mentions in tracked Telegram sources`: the observed-absence mention string, as its own sentence. The About source list keeps naming the source (`Telegram public preview`).

## (c) Verify output

`NODE_PATH=/home/botbox/node_modules node scripts/verify.cjs > scripts/verify-output.txt 2>&1`, foreground, 147 s, exit 0. The full output (518 lines) is in `scripts/verify-output.txt`. Pass 11 is opened in the same run.

The diff check: every rendered string is collected from pass 11 and from pass 12, at 1280, 390 and 360, at live, 16:57Z, 16:42Z and 17:15Z, with and without an entry. That covers body text with details, legend and archive open, Why here, and titles, labels and SVG titles. The pass 11 text is carried through the three label mappings. Every line that still differs must be a scale line element (cap, price, cap slot, entry figure, their titles, and the About and legend lines that describe them). Market is checked byte-equal.

```
PASS 1280 now.html live 288 lines: every line outside the listed elements byte-equal after the three label changes; scale line lines changed: 15 out, 21 in
PASS 1280 now.html live scale line order cap · price · change on 6 rows: MARLIN "cap not read · $0.000121 · -50% since seen", LUMEN "cap not read · $0.000627 · -31% since seen", AGRIPPA "cap not read · $0.00338 · +445% since seen", SPRING "cap not read · $0.00266 · +87% since seen", OBOL "cap not read · $0.000228 · +23% since seen", KESTREL "cap not read · $0.0000618 · +1% since seen"
PASS 1280 now.html live cap not read title: supply not read at 17:27Z
PASS 1280 now.html live tabular figures on the scale line
PASS 1280 now.html live AA contrast, new scale line strings: min 8.26 (12 runs)
PASS 1280 situation.html+in live 262 lines: every line outside the listed elements byte-equal after the three label changes; scale line lines changed: 8 out, 10 in
PASS 1280 situation.html+in live Situation header strip order: market cap · price · since first read
PASS 1280 situation.html+in live Situation cap slot "cap not read", title "supply not read at 17:27Z"
PASS 1280 situation.html+in live lane label "Wallets in"
PASS 1280 situation.html+in live AA contrast, cap slot, lane label, chips: "3 material changes · 1 observation since you" 8.51, "2 material changes · 1 observation since you" 8.51, "cap not read" 8.98, "Wallets in" 8.26
PASS 1280 board.html+in live 260 lines: every line outside the listed elements byte-equal after the three label changes; scale line lines changed: 11 out, 16 in
PASS 1280 board.html+in live Board entry figure: "entry cap not read · +58% since entry · held 16 min · at the high since entry" [supply not read at 17:11Z]
PASS 1280 market.html live innerText byte-equal to pass 11 (3775 chars)
     390 now.html live: names back beside the symbol once the scale line takes its own line: Marlin Finance, Lumen Network
PASS 390 now.html live phone: scale line within two lines, no truncation, inside the row: MARLIN 1, LUMEN 1, AGRIPPA 1, SPRING 1, OBOL 1, KESTREL 1
PASS 360 board.html+in live phone: scale line within two lines, no truncation, inside the card: SPRING 1, MARLIN 1, LUMEN 1, AGRIPPA 1
... (every width x page x moment PASS, page errors none)
== The cap form, with the verify-only supply switch (?supply=read); the default fixtures read no supply
PASS 1280 now.html supply=read scale line: MARLIN "MC $121K · $0.000121 · -50% since seen", ... SPRING "MC $2.66M · $0.00266 · +87% since seen", ...
PASS 360 now.html supply=read phone: two lines or fewer, no truncation: MARLIN 1, LUMEN 1, AGRIPPA 1, SPRING 1, OBOL 1, KESTREL 1
PASS 390 board.html+in supply=read entry figure: entry $1.68M · +58% since entry · held 16 min · at the high since entry
PASS 360 situation.html supply=read Situation cap slot "$2.66M", no title
== Entry with nothing since (entered at 17:27Z): the entry label
PASS 1280 situation.html+entry 17:27Z entry chip "No material changes detected since entry"
PASS 1280 now.html+entry 17:27Z For you, entry form, zero material: "In · No material changes detected since entry"
PASS 1280 board.html+entry 17:27Z card: "In · No material changes detected since entry | No material changes detected since entry; still Money first"
PASS 1280 situation.html+in compare A 17:11Z (the entry) vs B 17:20Z: "No material changes detected since entry"
PASS 1280 situation.html+in compare A 16:57Z (not the entry) does not print the entry label: "17:08..."
== Labels in the built pages, old phrasings absent everywhere
PASS "Wallets in" present (48 renders)
PASS "No mentions in tracked Telegram sources" present (204 renders)
PASS "No material changes detected since entry" present (9 renders in the fixture sweep, plus the 17:27Z entry checks above)
PASS old phrasings in built pages: none (9 patterns, 75 renders)
PASS old phrasings in page sources: none
PASS pages: banned words and internal names zero, em dashes 0
PASS NOTES.md: banned words zero, em dashes 0
== Alert: cap not read in the fixtures (1280, no entry)
     now.html live: 6 of 6 rows print cap not read
     board.html live: 4 of 4 cards print cap not read
ALL PASS (464 passed, 0 failed) in 147 s
```

The old phrasings checked: `no public mention` (any case), a bare `Money` line, `no change since you entered`, `Reasons at entry still hold`, `~$`, `~ market cap`, `estimated, supply assumed`, `supply assumed at 1B`, `1B supply assumed`.

Shots (`scripts/shots.cjs`, JPEG, all under 500 KB, largest 214 KB):
- `shots/now-1280-live.jpg`: Now 1280, live.
- `shots/situation-1280.jpg`: Situation 1280, live, with an entry.
- `shots/board-1280.jpg`: Board 1280, live, with an entry.
- `shots/now-390.jpg`: Now 390, live.
- `shots/now-1280-cap-form.jpg` and `shots/now-390-cap-form.jpg`: the cap form under `?supply=read`.

Hashes:
```
cfe6d9541bad5ecab014b5a2d16e11bcbdca4d51114494debaac0e7a93881886  now.html
efe3dd84e2c7e71e08c1e624431a60521798cd02b4fbceaf08b83d6aeddaf980  situation.html
1dba6add61f231fb74870cacb7a24dad0f751d94bab9ff598e395e12c7a05989  board.html
906a21d5aeeac8fea6a73d2a371472a4985b199c2836423937e3eaff19f4d2ac  market.html (byte-equal to pass 11)
```

## (d) What pass 11 printed that no longer prints

- Every estimated cap: `MC ~$121K`, `~$627K`, `~$3.38M`, `~$2.66M`, `~$228K` and `~$61.8K` on Now rows and Board cards. The tilde is gone everywhere.
- The Board entry figure `entry ~$1.68M`.
- The title `~ means estimated: supply assumed at 1B, not read yet`.
- The legend part `~ market cap is estimated, supply assumed`, and the About sentences on the tilde and the assumed 1 billion supply (Now and Board).
- Situation cap figures:
  - `$2.66M` and the rest in the strip, the price-lane label (`$2.66M market cap`), the moment panel and its `now $2.66M` hint, the compare table's Market cap row, the Market reads table and the hover readout.
  - `$1.68M` in the look event, and `Market cap $1.68M` in the entry event.
  - The compare caption percent on the market cap cell (`market cap · up 58%`), now `market cap · not read`.
- Situation About: `Market cap at every read ($1.42M, $1.06M, $1.68M, $2.66M), 1B supply assumed, and liquidity ($84K).`
- `Money` as the lane label and the Evidence heading.
- `no public mention seen` (and `seen yet`), `no public mention.`, `Still no public mention`, `No public mention seen · ...` and `No public mention seen by HH:MMZ.`, including the word `yet` that closed the first two.
- `no change since you entered at 17:11Z` on the Situation entry chip.
- `In · 0 material since entry`.
- On the Board entry card, `Reasons at entry still hold: <state at entry>, as at HH:MMZ`. The state at entry and its time no longer print there. The line now gives the current state.

## (e) Open questions

1. **Fixtures carry no read supply**, so the reference pages show `cap not read` on every row, card and Situation (the alert above). Do we give some demo tokens a read supply so the cap-first form shows by default, or keep the pages honest until B8 lands? For now `?supply=read` shows the form.
2. **Price prints twice on Now rows at 1280**: on the scale line and first in the Mini Clock readout (`$0.000121 · 230 entered · ...`). The readout was not a listed element, so it is unchanged. Do we drop the price from the readout in a later pass?
3. **The no-price form** still reads `MC not read` (pass 10) next to `cap not read`. Unify to `cap not read`?
4. **The Situation header**: pass 12 treats the Market strip as the header's scale line. It already led with the cap, so no new line was added under `SPRING`. Is a one-line scale string wanted in the identity block as well?
5. **Shorter absence forms left as they were**: `none seen` (Attention lane readout, compare table Public attention row), `nothing public seen` (the 16:27Z lead line) and `Waiting for: A first public mention.` These are not the observed-absence sentence. Should `none seen` follow the new wording?
6. **Board entry card with nothing since** prints the label twice, in the For you line and in the Latest line. Pass 11's look form repeats itself the same way (`No material change` and `Nothing material since your look; still ...`).
7. **Contract**: the display rule (estimate basis prints `cap not read`, never a figure) goes to contract v3.5 as a separate order. `contract/nowat.py` is unchanged.

## (f) Freeze statement

Board is frozen at the pass 12 files (`design-pass12-2026-09-28/d2-tracks/board.html`, sha256 `1dba6add...`). There is no layout, control or order change from pass 11. The grouping, sort, card grid, sheet, Details control, group toggles and archive are the pass 11 code. The changes are the strings in (a), the scale line's price part, its line-break rule and the `.nr` colour. The phone line-break rule is `fitName()`, byte-equal to pass 11. Any later Board change is a new pass on Thomas's word. Now and Situation keep their pass 11 architecture, and the Market band on Now is the reference.

Status: DONE
