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:
- Text (
faq, the only free-text panel): a liner-note passage under the say. - Speakers (
speaker_grid): personnel credits numbered 01–, uppercase names alternating left and right; above six names the type steps down, at most eight per cut with "All personnel on Side A ↗". No photographs.speaker_card: one full-width credit with role, honours and sessions as track references. - Sessions (
session_list,session_card): track rows under day labels; a card adds the description and the speakers as credit links. - Agenda day (
agenda_day): the day's whole running order, the same render as Side A; a track filter narrows the rows. - Venue (
venue_card): the B01 block itself; focus adds the hotel, travel or prior-venue line. Never a statistic row. - Tickets (
ticket_cta): one ruled strip per tier (class, phase, price with fees), the refund line, "Get tickets ↗". - Choices: not chips. "Cut next" is a short ruled list ("B03 Who is on Tuesday? ↗"); a line writes its question onto the composer and submits.
- Sources: the
Source:line is renderer-owned, built from the answer'ssourcesids, the snapshot date and the sample disclosure whenever a record carriesplaceholder. The model cannot write or remove it.
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.