Break Open — mechanics
The fork in this look
There are no two doors. The fork is the cut: the question field sits inside the opening of MIND on the −1.85° diagonal it shares with FREE YOUR, and "Or, go your own way ↓" sits above the fold. Typing into the cut and pressing ↵ asks the mind; scrolling is the standard route. Focusing the field widens the slices by 12 px, so the material answers before a word exists. / opens the mind anywhere; Escape returns with scroll and focus preserved. The session cookie keeps the thread.
The standard route
The reading page is the snapshot rendered at build time: 01 MAKE ROOM with a sourced answer in the gap, 02 OPEN MINDS as numbered Dela names in <details> rows, 03 the 03/04/05/06 tablist with Monday selected, 04 AUSTIN with the pass link, 05 ASK. Production adds all four days to the DOM (only Monday exists without JavaScript), the full lineup with the 0/55/110/165 px stagger cycling, and #day-2 hashes that select a tab, so day links round-trip. Partners become a rule-separated name list by tier, no logos; FAQ answers become already-opened sections under ASK.
Asking the mind
Asking. The cut, the ASK. composer, the rail invitation and the two "Ask about…" links open the <dialog>, focus its composer and POST {messages, mode, session} to /api/mind, reading SSE frames like mind.html.
Thinking as material. Each question draws a new numbered section. On submit, two rules drift apart along the cut with the cut-top easing and hold open until the first text frame lands in the gap; the trigger is the submit, not phase: thinking, because a Sonnet arm at between_tools emits none. Waiting lines at 2, 8 and 25 s share the gap.
The big word is renderer-owned. Coverage picks it first (not_in_snapshot → NOT YET, off_topic → STILL OPEN), then the first component (venue → AUSTIN, a day → its numeral, people → OPEN MINDS or the person's name).
Components (no cards, chips, photographs or boxes):
- Text:
saystreams as the Alegreya paragraph under the word;faqadds its question as a label and its answer beneath. - Speakers:
speaker_gridreuses the chapter-02 row (index, Dela name, organisation, title);speaker_cardis that row opened along the cut, bio in the gap, "Not confirmed for ETS27" when sample. - Sessions: timetable rows (time, type · Sample, bold title, names);
session_cardadds the description when one exists. - Agenda day: the four stepped dates, the asked day selected, its rows beneath; switching days is local.
- Venue: AUSTIN, MAY 3–6, the status line dated from the snapshot.
- Tickets: tier, phase, price with fees, phase end, then the italic "→ Find your pass".
- Choices: never chips; up to four italic question lines with ↵ under the asked question.
- Sources: the 16 px
Source:line under every answer, from page ids and the snapshot date. - Fallbacks:
mind.html'sERRtable in the section grammar:refusedandinvalidkeep the word slot and say "Try again";busyandunavailablesay "The mind is quiet right now. The page still works.";resetsays "Picking up fresh". The "· Sample" marker is renderer-owned.
The assistant in the chrome
The dock is the rail. It appears when the hero leaves the viewport and leads with the writing invitation, a live field in production. Because the modal dialog covers the page, the brief's five merge rules collapse to one: each answer links back to its chapter; the link closes the dialog, scrolls, and merges on return by selecting the asked day's tab or opening the named person's <details>. Page requests send mode: "standard" and page.visibleIds (the open speaker, the selected day's sessions), so "What's this one about?" works from the timetable. The thread survives close and reopen.
Data, performance and accessibility
One snapshot, two readers: the build renders the chapters; the dialog fetches a renderer subset on first open. No WebGL and no photographs, so first paint is fonts: subset Dela and the three Alegreya faces to woff2, and size the word slot in vw so font-display: swap cannot reflow it. The thread is not a live region: keep mind.html's single role="status" line. showModal supplies the focus trap, tabs keep arrow keys, split names stay aria-hidden duplicates of a whole name, and motion off removes every animation including the thinking gap. Without JavaScript the page reads completely; the field posts to a server-rendered /ask.
Build plan
Carries over: server.py (POST /api/mind, the SSE frames, the cached prefix, the incremental reader, the sanitizer, append-only sessions, the budget), ported to the wiring's route handler; build_digest and CORE_INSTRUCTIONS; data/ets.sample.json and data/tools/build_fixture.py as snapshot and capture mapping; the catalogue schema, extended with agenda_day, speaker_card, session_card, faq, sources and coverage; and mind.html's non-visual code: streamAnswer, reconcile, the ERR table, the escape link.
New: the visual renderer R in the two-ink grammar; the word map; the cut-open thinking state; the dialog wired to the stream (the keyword table becomes the offline script); the rail field, question links and visibleIds; choices as lines; partners and FAQ chapters; day hashes; the no-JS /ask; font subsets.
Effort: renderer and thread 3–4 days, thinking motion 1, chapters 2, rail and hashes 1, QA at six widths with motion off and no JavaScript 2: two front-end weeks, plus the server port the brief scopes.
Risks
- Dela is dense: the cut assumes a one-line name and long names wrap; fit them by measured width, cap grids at eight, widen the subset for international names.
- The modal dialog hides the page, so merges become return links; "shown on the page" would need a sheet.
- The renderer-owned word can contradict
say; coverage wins and the evals check it. - 4.69:1 is AA for regular text only; nothing lighter or smaller, and the brand test is owed.
- Partners as text, not logos, is a sponsor conversation; the thinking gap must not flash on sub-second answers.