The other side — mechanics

One rule: Side A is published and the mind never edits it; Side B is the sequence the visitor cuts. The model chooses records and permitted components (brief §4–6, research/claude-wiring.md); the sleeve owns every pixel.

The fork in this look

The fork is the crease: the cover's two inks are the two routes, and "Flip to side B · Side A is published. Side B is yours." is the fork copy. Four doors open Side B: the cover flip, the spine's B and "Ask the mind", and /; the three "take this question to the mind" buttons open it with the question already on the line. Owner decision 6 becomes the remembered side: a returning visitor lands on B, composer focused.

The standard route

Side A is the standard route as sleeve objects, generated from the snapshot at publish: WHAT IF? from the theme copy with FAQ items as liner notes; MANY VOICES. as the full personnel list, featured names first; TRACK LIST. as four agenda_day renders under worded date links; BE THERE. from the venue and ticket records. Partners, absent from the mockup, become a "With thanks to" credits list in tier order in the colophon; the sleeve prints no logos. Every credit and track row carries an anchor id (#spk-…, #s-…) so deep links and Side B back-links land on records.

Asking the mind

Submit posts the message to /api/mind; the question moves at once into a new cut headed "B02 — Cutting", and the label advances to B03 only when the cut is done.

Thinking shows in the material: on phase: thinking the cut's top rule draws across the measure over 600 ms, the needle finding the groove, and rests at full width when the first say character arrives; the say then streams in, no cursor. After 2 s without words the label reads "Still cutting"; at 25 s, a retry. Reduced motion: the rule is simply there.

Each component renders by id in the sleeve's markup:

Fallbacks: max_tokens keeps what was cut, relabelled "Partial cut"; not_in_snapshot prints the say plus the nearest Side A link; refusals, busy and invalid answers print one line in the same voice; unavailable and the daily budget set the composer to "The mind is resting. Side A is complete." and disable it.

The assistant in the chrome

The dock is forbidden here: no docked input, badge or bubble. On Side A the assistant is the spine entry and /, and asking always flips to B. The five merge rules reduce to two: the flip sends the section in view and its visible record ids with the first cut, as a one-line note in the operator channel (appended role: system, allow-listed values only), so a question asked from the track list answers the row on screen; and every cut carries "Read it on Side A ↗" to the record, with "Back to side A" restoring the reading position.

Data, performance and accessibility

One versioned snapshot feeds both sides: Side A at publish, revalidated by tag; Side B from a lean client copy without bios or photo URLs, speaker_card fetching its bio by id. Fonts become subsetted WOFF2; the plate's textLength fitting survives swap. No WebGL: forty SVG arcs and a same-document view transition. Measured first words at 1.2–3.1 s sit inside the rule-draw. The #b-answers live region becomes a status region written three times per cut (a streamed live region announces fragments); focus moves to the finished cut's heading. Oxblood on paper is 6.1:1, paper on plum 13:1.

Build plan

Carries over unchanged: prototype/server.py (prefix cache, structured output, fallbacks, reader, sanitiser, sessions, budget, SSE, --selftest); data/ets.sample.json and its builder; the seven components; and mind.html's renderer logic (one function per component by id, reconcile on done, error map, SSE reader). Dropped: shared.css, the three.js opening and vendor files, standard.html's dock and merges, and recede.

New: Side A templates as functions over the snapshot, shared with Side B; the cut shell, label states and rule-draw; the "Cut next" list; anchor ids and back-links; the flip note; agenda_day, speaker_card, session_card and faq in the schema per the brief's reconciled table, plus sources and coverage. Effort: about four days to wire Side B to server.py over the existing contract, four more for Side A from the snapshot and the new components; the Next.js port, router, Turnstile and limits follow the brief's estimate.

Risks

Generating Side A from 77 names at 92 px will break the hand-fitted type: names over 22 characters step down, titles hold three lines at 390 px, tested with the full lineup. "Cut next" can read as content; keep it under four lines and labelled. The enum id schema is untested against real counts. Focus must never land on the hidden side.