build-0: the first real front end of the companion
A browser-side runtime that reads the contract v3 fixture JSON and draws the component library (MASTER section 4.4, P1 and P2) and four pages from it. No framework, no bundler, no build step: static HTML, tokens.css, components.css, ES modules in lib/. Every value on every page comes from fixtures/*.json; where a fixture has no value the page prints the fixture's reason instead of a number.
Built 2026-09-27 overnight by W-build0. Direction A ("Instrument") is provisional: Thomas, 01:41, "option A is much closer, still needs some work". Verification, fixture gaps and the choices made are in CHECKS.md.
The four pages
- Now (G2,
fixtures/now.json): weather strip, then Happening now, Newly developing, Changed since you looked, Cooling. A row is symbol and age, cap and change with their captions, the state word, the why-now line with its clock, a two-lane mini clock and the waiting-for line. No lights row, no ranking number. - Situation room (G3), one page, three fixtures: SPRING (Money first, frozen at minute 60 of our tape), AGRIPPA (Early money leaving, day 2, Holders leads), MOSSY (Developing on Solana, the refusal case). State word and evidence sentence first, then the clock; since you looked and waiting for above the fold; evidence sections below with the lead section open; data notes as a drawer.
- Hold view (G4, SPRING with the entry snapshot from the fixture): entry facts and state at entry, then Changed, Still intact, Unknown or degraded against the snapshot, the clock with the since-entry region.
- Board (G4,
fixtures/board.json): In, Watching, Changed, Archived; a row is the diff count, the top two changes and one still-intact line.
The gallery and the token file
- Component gallery: every shipped component (C01 to C09, C14 to C18, C22, C23) rendered from SPRING, AGRIPPA and MOSSY, with its id, name, the T7 rule line and the fixture path it drew from, plus a motion demo. This is the page the design session edits against.
- tokens.css: every colour, size, weight, tracking, spacing step, radius, hairline, motion duration and clock geometry value, grouped by the role names of OPTIONS.md section 2 (ground, surface, ink, evidence, weakening, neutral, unknown, stale, safety, user). A complete option B block ships too: add
?theme=bto any page address (SPRING in B, gallery in B) to see the same components under the other token set. - components.css: one class per component,
c-01-statetoc-23-end, colour and type only through tokens. assets/caverio-mark.svg: the 09-16 arc and ochre mark, kept untouched. A's wordmark does not use it; that needs Thomas's nod.
How to open it
Over http (the Cloudflare Pages path /build-0/, or python3 -m http.server from the folder above) everything works. From file://: this index works in any browser; the other pages need their ES modules, which Chrome refuses on file:// unless started with --allow-file-access-from-files. With that flag every page builds, and the fixtures load through a script-tag fallback because browsers refuse fetch on file://. All links and imports are relative.
What is provisional
- Every value in
tokens.css(direction A, awaiting the design session). - The wordmark: A's mono CAVERIO with the reading square replaces the 09-16 arc mark on screen, pending Thomas.
- The hero choice per state (
lib/model.js,heroFor): the contract carries no hero field yet. - The projection (
p0-provisional), materiality (m0-provisional) and lights (l0-unfitted) versions printed on every page. - Search, Watch, In and the alert switches are stubs.
- Provider fields (market cap, liquidity, band) render with a "provider" tag; they are replaced at the Q1 switch date and nothing depends on them.
What is illustrative
Carried from the fixtures' illustrative flags. Every one of these is also tagged "illus." where it renders.
182 fields across the five fixtures carry illustrative: true. Generated from the fixtures by scripts/build0-fixtures.py; every one of them is also tagged "illus." where it renders.
fixtures/spring.json 35 illustrative fields
situations[0].lights[4] | 638 wallets in within 5 min of tape start |
|---|---|
situations[0].lights[5] | recurring launch wallets in the early cohort |
situations[0].lights[6] | a new 1 h high on our tape |
situations[0].band | value 1m_10m (band follows the illustrative cap (design-options fixture assumes 1B supply)) |
situations[0].market.provider.marketCap | value 2660000 (design-options fixture: assumes 1B supply) |
situations[0].market.provider.liquidity | value 84000 |
situations[0].diffs[0].changed[1] | Holders light on: recurring launch wallets in the early cohort. |
situations[0].diffs[0].changed[2] | Momentum light on: a new 1 h high on our tape. |
situations[0].diffs[0].stillIntact[0] | No caller call yet; the five caller channels were read 2 min ago. |
situations[0].diffs[0].stillIntact[2] | Safety checks unchanged since the first read. |
situations[0].diffs[0].stillIntact[2].before | value mint renounced, LP locked |
situations[0].diffs[0].stillIntact[2].after | value mint renounced, LP locked |
situations[0].diffs[0].unknown[0] | Early-cohort retention unknown: balance reads not run this hour. |
situations[0].diffs[1].checkpoint.snapshot.measures.price | value 0.00204 |
situations[0].diffs[1].changed[0] | Momentum light on: a new 1 h high on our tape. |
situations[0].diffs[1].changed[1] | Price 0.00204 at entry to 0.00266 on our tape. |
situations[0].diffs[1].changed[1].before | value 0.00204 |
situations[0].diffs[1].stillIntact[2] | No caller call yet. |
situations[0].diffs[1].unknown[0] | Early-cohort retention unknown: balance reads not run this hour. |
situations[0].pools[0].coveredBlock | value 4818203 |
situations[0].pools[0].sourceHead | value 4818205 (measured 2026-09-14T17:27:29Z) |
situations[0].pools[0].lagSec | value 2 |
situations[0].pools[0].lastTradeAt | value 2026-09-14T17:26:58Z |
situations[0].events[0] | balance reads not run this hour |
situations[0].events[4] | contract checks read: mint renounced, LP locked 30 d |
situations[0].events[4].values.mint | value renounced |
situations[0].events[4].values.lp | value locked 30 d |
situations[0].events[7] | no changed provider print for 6 min |
situations[0].events[8] | you looked |
situations[0].events[10] | recurring launch wallets in the first-30-minute cohort |
situations[0].events[10].values.recurring | value 260 (T5 count over the 876 wallets before 17:08, computed 25 Sep over later launches too; the 16:57 count is not stored) |
situations[0].events[12] | you marked in |
situations[0].events[12].values.price | value 0.00204 |
situations[0].events[14] | caller channels read, no call |
situations[0].events[15] | a new 1 h high on our tape |
fixtures/agrippa.json 56 illustrative fields
situations[0].lights[3] | mentions per hour at the band's p90 |
|---|---|
situations[0].lights[4] | wallets in per minute above the band's p90 |
situations[0].lights[5] | top-20 share falling fast while the early cohort held, and recurring wallets present |
situations[0].lights[6] | a new high on our tape |
situations[0].band | value 1m_10m |
situations[0].market.provider.marketCap | value 1900000 |
situations[0].market.provider.liquidity | value 140000 |
situations[0].holders.earlyCohortRetention | value 31 (RPC truth on 22 Sep was 8 held, 13 reduced, 117 exited of 142; the 19 Sep reads are not stored) |
situations[0].diffs[0].checkpoint.snapshot.measures.earlyCohortRetention | value 64 |
situations[0].diffs[0].checkpoint.snapshot.measures.callerStance | value positive |
situations[0].diffs[0].changed[0] | State: Attention first to Early money leaving. |
situations[0].diffs[0].changed[1] | Early-cohort retention 64% to 31% of 142 wallets, by RPC read. |
situations[0].diffs[0].changed[1].before | value 64 |
situations[0].diffs[0].changed[1].after | value 31 |
situations[0].diffs[0].changed[2] | The first caller's stance: positive to neutral. |
situations[0].diffs[0].changed[2].before | value positive |
situations[0].diffs[0].changed[2].after | value neutral |
situations[0].diffs[0].changed[3] | Attention light on again: mentions per hour at the band's p90. |
situations[0].diffs[0].changed[6] | Tape light off: wallets in per minute back under the band's p90. |
situations[0].diffs[0].changed[7] | Momentum light off: no new high since the first hour. |
situations[0].diffs[0].changed[9] | A Fomo-profiled trader reduced by half. |
situations[0].diffs[0].changed[9].before | value in |
situations[0].diffs[0].changed[9].after | value reduced by half |
situations[0].diffs[0].stillIntact[0] | Safety checks unchanged. |
situations[0].diffs[0].stillIntact[0].before | value mint renounced, LP locked |
situations[0].diffs[0].stillIntact[0].after | value mint renounced, LP locked |
situations[0].diffs[0].stillIntact[1] | Holders light still on: top-20 share fell 1.00 to 0.37 in the first hour. |
situations[0].diffs[0].unknown[0] | Telegram preview missed an hour of messages overnight; mentions may be under-counted. |
situations[0].diffs[0].unknown[2] | One provider print did not trade on our tape; it is left out of the range. |
situations[0].diffs[0].unknown[2].after | value 0.000121 |
situations[0].pools[0].coveredBlock | value 4990110 |
situations[0].pools[0].sourceHead | value 4990118 (measured 2026-09-19T18:09:55Z) |
situations[0].pools[0].lagSec | value 8 |
situations[0].pools[0].lastTradeAt | value 2026-09-19T18:02:10Z |
situations[0].events[1] | contract checks read: mint renounced, LP locked 30 d |
situations[0].events[6] | mentions per hour at the band's p90 |
situations[0].events[8] | a second caller call |
situations[0].events[12] | recurring launch wallets among the wallets in after the call |
situations[0].events[12].values.recurringAfter | value 157 (T5 count, computed 25 Sep over later launches too) |
situations[0].events[14] | early cohort (142 wallets) 64% holding |
situations[0].events[14].values.retention | value 64 |
situations[0].events[15] | you started watching |
situations[0].events[18] | Telegram preview missed messages for an hour |
situations[0].events[19] | early cohort 61% holding |
situations[0].events[19].values.retention | value 61 |
situations[0].events[20] | a provider print at 0.29x of both neighbours; no swap at that price on our tape |
situations[0].events[20].values.print | value 0.000121 |
situations[0].events[21] | early cohort 61% to 39% holding, a 22-point step |
situations[0].events[21].values.retention | value 39 |
situations[0].events[21].values.stepPts | value 22 |
situations[0].events[22] | the first caller's stance: positive to neutral |
situations[0].events[23] | a Fomo-profiled trader reduced by half |
situations[0].events[24] | mentions per hour at the band's p90 again |
situations[0].events[25] | early cohort 31% holding |
situations[0].events[25].values.retention | value 31 |
situations[0].events[26] | contract checks re-read: unchanged |
fixtures/mossy.json 26 illustrative fields
situations[0].lights[0] | a tracked wallet in |
|---|---|
situations[0].identity | row MOSSY |
situations[0].band | value under_250k |
situations[0].age.poolAge | value 22 |
situations[0].market.price | value 0.000186 |
situations[0].market.changeFromFirstSeen | value 35 |
situations[0].market.drawdownFromHigh | value -4 |
situations[0].market.volume1h | value 52000 |
situations[0].market.netFlow1h | value 9100 |
situations[0].market.walletsIn1h | value 212 |
situations[0].market.provider.marketCap | value 180000 |
situations[0].market.provider.liquidity | value 31000 |
situations[0].diffs[0].stillIntact[0] | One tracked wallet in; nothing else lit. |
situations[0].diffs[0].unknown[0] | Holders: cannot see on this chain. |
situations[0].pools[0].coveredBlock | value 372004410 |
situations[0].pools[0].sourceHead | value 372004512 (measured 2026-09-27T07:19:59Z) |
situations[0].pools[0].lagSec | value 40 |
situations[0].pools[0].lastTradeAt | value 2026-09-27T07:19:20Z |
situations[0].pools[0].firstSeenAt | value 2026-09-27T06:58:06Z |
situations[0].events[1] | first swap on our tape |
situations[0].events[2] | Holders: cannot see on this chain. |
situations[0].events[3] | contract checks read: mint and freeze renounced |
situations[0].events[4] | a tracked wallet in |
situations[0].events[4].values.sizeUsd | value 1400 |
situations[0].events[5] | you started watching |
situations[0].events[6] | Telegram preview sweep, no mention |
fixtures/now.json 58 illustrative fields
now.value.sections.happening_now[0].headline.marketCap | value 2660000 (design-options fixture: assumes 1B supply) |
|---|---|
now.value.sections.happening_now[1].headline.marketCap | value 1900000 |
now.value.sections.happening_now[2] | row KESTREL |
now.value.sections.happening_now[2].headline.age | value 360 |
now.value.sections.happening_now[2].headline.marketCap | value 2300000 |
now.value.sections.happening_now[2].headline.change | value 44 |
now.value.sections.happening_now[3] | row LANTERN |
now.value.sections.happening_now[3].headline.age | value 180 |
now.value.sections.happening_now[3].headline.marketCap | value 410000 |
now.value.sections.happening_now[3].headline.change | value 18 |
now.value.sections.happening_now[4] | row QUILL |
now.value.sections.happening_now[4].headline.age | value 540 |
now.value.sections.happening_now[4].headline.marketCap | value 1100000 |
now.value.sections.happening_now[4].headline.change | value 12 |
now.value.sections.newly_developing[0].headline.marketCap | value 180000 |
now.value.sections.newly_developing[0].headline.change | value 35 |
now.value.sections.newly_developing[1] | row TOLLAN |
now.value.sections.newly_developing[1].headline.age | value 41 |
now.value.sections.newly_developing[1].headline.marketCap | value 96000 |
now.value.sections.newly_developing[1].headline.change | value 8 |
now.value.sections.newly_developing[2] | row BRAMBLE |
now.value.sections.newly_developing[2].headline.age | value 60 |
now.value.sections.newly_developing[2].headline.marketCap | value 220000 |
now.value.sections.newly_developing[2].headline.change | value -9 |
now.value.sections.newly_developing[3] | row ORRIS |
now.value.sections.newly_developing[3].headline.age | value 120 |
now.value.sections.newly_developing[3].headline.marketCap | value 340000 |
now.value.sections.newly_developing[3].headline.change | value 3 |
now.value.sections.changed_since_you_looked[0] | row PLUMB |
now.value.sections.changed_since_you_looked[0].headline.age | value 2880 |
now.value.sections.changed_since_you_looked[0].headline.marketCap | value 2700000 |
now.value.sections.changed_since_you_looked[0].headline.change | value -22 |
now.value.sections.changed_since_you_looked[0].changes | value 1 |
now.value.sections.cooling[0] | row FENNEL |
now.value.sections.cooling[0].headline.age | value 1500 |
now.value.sections.cooling[0].headline.marketCap | value 140000 |
now.value.sections.cooling[0].headline.change | value -40 |
now.value.sections.cooling[1] | row LUMEN |
now.value.sections.cooling[1].headline.age | value 2100 |
now.value.sections.cooling[1].headline.marketCap | value 520000 |
now.value.sections.cooling[1].headline.change | value -18 |
now.value.hiddenCount | value 19 (newly developing rows below the list ceiling) |
market.value.lines[0] | {"value": 44, "reason": null, "unit": "count", "basis": "tape", "illustrative": |
market.value.lines[0].value | value 44 |
market.value.lines[1] | {"value": 1.4, "reason": null, "unit": "ratio", "basis": "tape", "illustrative": |
market.value.lines[1].value | value 1.4 |
market.value.lines[2] | {"value": 31, "reason": null, "unit": "pct", "basis": "tape", "illustrative": tr |
market.value.lines[2].value | value 31 |
market.value.lines[3] | {"value": -19, "reason": null, "unit": "pct", "basis": "provider:geckoterminal", |
market.value.lines[3].value | value -19 |
market.value.lines[4] | {"value": 21000, "reason": null, "unit": "count", "basis": "rpc", "illustrative" |
market.value.lines[4].value | value 21000 |
market.value.lines[5] | {"value": 1200000000.0, "reason": null, "unit": "usd", "basis": "rpc", "illustra |
market.value.lines[5].value | value 1200000000.0 |
market.value.lines[6] | {"value": 58.1, "reason": null, "unit": "pct", "basis": "provider:coingecko", "s |
market.value.lines[6].value | value 58.1 |
market.value.lines[7] | {"value": 0.01, "reason": null, "unit": "pct", "basis": "provider:exchanges", "s |
market.value.lines[7].value | value 0.01 |
fixtures/board.json 7 illustrative fields
board.value.rows[0].checkpoint.snapshot.measures.price | value 0.00204 |
|---|---|
board.value.rows[1].checkpoint.snapshot.measures.earlyCohortRetention | value 64 |
board.value.rows[1].checkpoint.snapshot.measures.callerStance | value positive |
board.value.rows[3].checkpoint.snapshot.measures.earlyCohortRetention | value 64 |
board.value.rows[3].checkpoint.snapshot.measures.callerStance | value positive |
board.value.rows[5] | row PLUMB |
board.value.rows[5].frozenRoom | value /record/frozen/robinhood:ILLUSPLUMB#2026-09-23T08:02:00Z~cca44834 |
Screenshots
shots/ holds 1280 and 390 wide JPEGs of now, situation x3, hold, board, gallery and this index, plus SPRING under theme B. Regenerate with NODE_PATH=/home/botbox/node_modules node scripts/build0-shots.cjs; resync fixtures with python3 scripts/build0-fixtures.py.