The skin of the programme — mechanics

The fork in this look

The poster prints two verbs of unequal weight. Type heads a 730 px rule across the bottom right; Scroll ↓ is one label line under the head. The first interaction is focus (a click, /, or typing on the poster): the head turns 17° toward you and reprints against its new silhouette before you ask.

Both routes share one document: scrolling reads it in order; asking rearranges it, each answer a numbered section above the dates screen. The mind owns the first screen; the standard route, the rest.

When an answer finishes, a view transition carries the question from the rule into the section's heading while the poster leaves through a 16-step noise mask, never a crossfade. Between pages the band holds still (view-transition-name: band).

The standard route

Asking the mind

Type on the rule or pick a verb; Enter sends; stop replaces the verbs mid-stream. Thinking is the material emptying: the head keeps facing you as its interior falls to the 1.8 % ghost, leaving the rim. say streams in orange at width 75 where you asked (the intro's slot on the poster); each ui event adds its records' words to the head (one reprint per 400 ms at most); done reprints from the sanitised answer and the head turns back. Answer 01 stays precomposed per snapshot, seeded server-side into each session so "and Wednesday?" follows on.

Record-bearing components print into the head first, then render as rows linking to their page.

Fallbacks: off_topic is one unnumbered line in the card, no reprint; not_in_snapshot prints the nearest real thing (student rates: the tiers and the not-published list); emptied components drop; errors keep the prototype's codes and leave the question on the rule. With the proxy down, the mockup's rule-based composer, rewritten to emit {say, ui}, answers and says so.

The assistant in the chrome

Data, performance and accessibility

The fixture holds everything the head and rows print (77 speakers, 50 sessions, tickets, venue, partners, FAQ), all flagged placeholder. Still needed: base prices (the fixture has only fee-inclusive ones) and one phase 2 date (Government 19 November, Industry 20); from Whova, rooms, descriptions (3 of 50) and permission to re-host 33 portraits; seven unconfirmed FAQ answers. Visitor text is never logged, so "asked on this page" becomes a staff-written WordPress field fed by not_in_snapshot counts.

Motion: one loop, only while the poster is visible; 1.3 s per reprint; the SVG develop on numeral and heading only, never a whole article. Without WebGL2 the left half is black today: bake a per-breakpoint light map for the dates screen's 2D painter, plus a no-JS still. Reduced motion: one frame, instant reprints, no transitions.

Keyboard: /, type-to-ask, Escape, and visible focus (the mockup strips outlines). Screen readers: the canvas stays hidden (its words are in the page); summarize() announces each answer once. Unmeant names dim to 2.4:1; 50 % cream gives 4.6:1.

Build plan

Carries over: server.py (stream, cache, sanitiser, sessions, budget, guards, self-test), the fixture and builder (not the mockup's position-indexed copy), the seven-component catalogue, and the renderer spine (streamAnswer(), reconcile(), summarize(), mergeIntoPage()); from the concept, both WebGL2 passes, compose(), setRun(), setStream(), the dates painter, filterLineup(), bake-portraits.py and the rule-based composer.

New: speaker_card, session_card, agenda_day, faq, sources, coverage; the page-aware surface note; streamFromUi(); empty-and-refill, holding the turn until done; band rule, card, state line, keys; static pages; fallbacks. Effort: a local demo in three days; about three and a half weeks of front-end work beside the shared backend; a sculpted bust adds a week.

Risks