The pass — mechanics
The fork in this look
The first screen is the whole pass, undecided: body as map, stub as mind, answer 01 printed. The first interaction is the tear: asking, or tapping an asked-here line, tears right; the tear-left verb, a corner link or scrolling off the pass tears left.
The tear is one same-document view transition under 700 ms: a solid line runs down the cut (clip-path, 280 ms) and the halves part. Right: the body slides off, the lockup shrinks into a 64 px chrome band and the stub becomes a left rail (line, asked-here, contents) beside full-measure answers at /mind/. Left: the stub folds into the perforation as the parked edge.
The map gets the paper and the quieter verb (600, 66% ink); the mind a strip, but the louder verb (800, full ink), the caret and the red of asked-here.
The standard route
The corner line is the nav, sticky past the pass as a 40 px band with the small foil and "from $299". The home is the pass plus the roll; each section is also a page: /lineup/ (role-width passes, A–Z index, /lineup/<slug>/ for portrait, bio, sessions), /agenda/ (the four-numeral spread, session stubs), /austin/, /passes/ (ticket stubs, Eventbrite unchanged), /about/. The mockup lacks partners: /partners/ is the back of the pass, 39 logos in one ink by tier.
Asking the mind
Ask in the line (Enter, or a printed [ tear ]) or tap a printed follow-up.
Thinking changes the paper: the question prints at once as the next heading, numbered in Handjet round cells, and the cut beneath punches dash by dash until the first say delta tears the stub (one 2.4° rock). Rows print as each ui object closes; on the final answer every numeral locks to square cells (ELSH 8 to 2): round is provisional, square settled.
Two scales: rows in the 300 px stub, roll pieces on the mind route.
- Text (
faq): question as label, staff answer in roman; italic stays the mind's voice. - Speakers: serial, name, organization; on the route, dithered passes;
speaker_cardopens the full pass in colour. - Sessions: time, format badge, surnames; on the route, the agenda's session stub.
- Agenda day: day numeral, summary, rows without quiet slots, as answer 01.
- Venue: "Austin", "venue announced soon" by a hollow square, hotels "TBA"; the unconfirmed Eventbrite pin never prints.
- Tickets: ticket stubs, prices breaking the cut, red only where
available_now, the as-of date. - Choices: up to four italic lines below a fresh cut, the next untorn stub; never chips.
- Sources: the footnote, built by the renderer from ids, snapshot version and placeholder flags, sample marker included.
Fallbacks: not_in_snapshot tears an honest stub with the nearest real rows; off_topic gets one italic line and no number, so numbers stay a contents page. Refused, truncated or invalid: the punching stops, the dashes fade, [ ask again ]. Resting or scriptless, asked-here lines link to the sections answering them.
The assistant in the chrome
- The composer is a rule: label, hairline, caret; no box or send button;
enterkeyhint="send". - The edge-parked card: below the pass and on inner pages, the 56 px perforation fixed right with the verb and the latest answer number; a click or
/tears it open to the 300 px stub (non-modal; Escape closes). On phones, a 48 px bottom stub opens as a sheet above any consent strip. Answers about records on the page punch them (solid cut, hole-coloured punch) or print in their home section under "torn from 02 · [ put back ]". - The state line: one 11 px label under the rule: ready, thinking, tearing 02, shown on the page, busy · [ try again ], resting · read in order →.
Data, performance and accessibility
The fixture holds what the mockup prints: 77 speakers with roles (the pass widths), 50 sessions, dated tiers, 8 FAQ answers, 39 sponsors, placeholder flags. Session ids match the mockup's anchors; speaker anchors are ids minus spk-.
Whova and WordPress must add rooms (0 of 50), descriptions (3 of 50), 41 bios, 18 portraits, real topics (tracks are invented), transparent logos (all 39 are JPEG, unprintable in one ink), the Event record and pass inclusions; a nightly job adds the foil's 96 hourly ERCOT values.
Motion rests by 5 s, then one moving thing per region: transform, opacity and clip-path only, view() timelines, no scroll listeners. Dither portraits in the snapshot sync (1-bit PNG, 1x and 2x), not in the browser. Reduced motion gets final frames, square numerals and an instant tear. The keyboard contract carries over (/, typed carry-over, [ shortcuts off ]); the roll becomes focusable. Answers are sections with numbered headings, aria-busy while streaming, announced by the role="status" state line. Meaningful text at 40% ink (3.3:1: footnotes, serials, sample state) moves to 66% (7.2:1).
Build plan
Carries over from prototype/: server.py's SSE events, incremental reader, sanitizer, append-only sessions, guards, budget and self-test; the fixture and builder; the seven-component catalogue; the renderer in mind.html and standard.html (render by id, reconcile on final, merges, status region). From the mockup: the foil builder, stub CSS, day lock, and six canned answers (pre-printed fallbacks, eval seeds).
New: a two-scale renderer for the ten-component catalogue with sources and coverage, the tear and parked edge, the thinking material, asked-here, partners, dither and foil jobs. About six engineer-weeks over the static pages; the route handler, router and limits are the brief's shared build.
Risks
- "Asked here · moderated" with minute stamps implies stored visitor text; the wiring logs none. Launch "often asked here": staff-written questions ranked by aggregate router topics, no stamps, no nine-second rotation; real visitor questions need opt-in moderation (brief decision 9).
- The stub is dense; anything needing width goes to the route scale.
- A failed ERCOT feed keeps the last good trace, dated.