# v1 · the sheet on the desk

One sheet of paper, three lanes wide, laid at its natural size on a desk you only see when the camera lifts: every section of the ETS27 site is a place on the sheet, the camera rolls down a lane and lifts across to another, a zoom-out shows the whole sheet as the site map with nothing hidden, and whatever you draw anywhere stays on the sheet, travels in a link and goes to the printer as your poster. The name in one line: the desk tone around the sheet is what makes a scrolling page read as one sheet lying on a table rather than a site with a background.

## The mind pass (2026-10-23, Opus 5.5)

The mind is now the model and it acts on the sheet: asked anything, Opus 5.5 answers in the hand and, once the answer is whole, moves the camera, opens a speaker's card, points at a session, circles and un-circles with its own cobalt rings (drawn from its picks), turns on "only my picks", offers the calendar, holds out its pen at your drawing, and asks before it clears anything. A change you did not ask for comes as an offer; every change gets a receipt and "undo that". It knows your journey as ids and flags (never your strokes or your earlier words), is coy by default and plain on the "coy · plain" toggle, and when it is away the page answers from its notes and says so. Every major choice went through PAL first; the record, the twenty-question evaluation with a verdict per answer and the measured cost (about a cent an answer) are in `mind-pass.md`.

## The second pass (2026-10-23, Opus 5.5)

The first pass's not-done list and THE-MIND.md's tonight list are closed, and the owner's notes of the night are in (the details, with evidence, open `HANDOVER.md`):

- Every typed block plays once per journey, with a skip arrow while it types and a replay arrow after, through round 01's typewriter as it is.
- The agenda filters to "only my picks" without moving them, offers the calendar at two picks, takes a checkbox, marks clashes and writes a real sample `.ics`; a circled face picks its speaker's sessions.
- The journey: the device keeps it, a sketched disc offers the link once there is something to keep, the link carries the whole journey and forks when shared, each place resets on its own (undoable), and the seed varies the wording and the pace.
- The poster prints as a pdf (the whole sheet on 24 x 36 in, then a letter page per place), and "your poster" carries the mail-out offer.
- The mind lists what it can do (pressable, without the model), hints once per place per visit, speaks THE-MIND.md's voice lines, and the bot asks "may i add to this?".
- The speakers are the owner's chosen avatars, turned into ink in the paper, with a bio card listing each speaker's sessions and role; no photograph.
- The titles speak in the site's voice ("who's talking", "four days in may", "where we'll be"), the cursor is heavier, and a soft band of paper keeps the scrolling type off the chrome.

## What it does

- The sheet. Three lanes, each one screen wide; cells as tall as their content and never shorter than a screen, so nothing scrolls inside a cell and the zoom-out shows every word and every mark. Speakers, through the years and the mind in the left lane; agenda, home (the opening) and tickets in the middle; venue, about and a blank cell, "your poster", on the right. Phones get the same lanes at 390 px; the cells reflow inside.
- The camera. Rolling down a lane is the viewport's native scroll smoothed by Lenis, with a hand-drawn scrollbar line at the right edge, grey at 45 % until hovered, that follows Lenis's progress and scrolls when dragged. Moving to another place is a dolly: the sheet lifts (scale 0.87 to 0.5 mid-flight on a laptop) so both places are on screen, slides and settles in about 0.9 s; a new target mid-flight retargets; under reduced motion a move is a cut. The zoom-out scales the live sheet to fit (0.307 on a laptop) with the desk around it and a big written label on every cell; a click on a cell dollies in. The same DOM, not thumbnails.
- The routes. Nine real pages built from one template: `index.html`, `agenda`, `speakers`, `venue`, `tickets`, `years`, `mind`, `about` and `poster.html` (opens zoomed out). Moving pushes history, scrolling into the next cell replaces the URL once the camera's centre crosses, back and forward move the camera, every page carries a `<noscript>` block with the facts and the eight links. Arrow keys move between neighbours, Escape closes the innermost thing first and only then zooms out, a letter or `/` summons the mind.
- The ink everywhere and the link. Each cell owns an ink layer sized to itself; strokes persist per place (`ets27-paper:<place>`); the other cells' layers sit at a quarter resolution so the zoom-out shows every mark in about 16 MB rather than 93; the link is one `#paper=` payload for the whole poster (deflate, base64url) and the current place replays with the marker's sound once per load. The canvases take no pointer events: a press on the paper or on typed text draws at once, a press on a link or a button becomes a stroke only after 6 px (the click is then swallowed), a press on something lying on the paper belongs to it. On touch the finger scrolls; the pen is a drawn button in the chrome or a 300 ms hold.
- The bot that draws back. 1.2 s after you finish a drawing with the pointer up, a small drawn bot (box head, two dots, a smile, one antenna) appears at the edge of that group of strokes; resting the pointer on your ink shows the group as a dashed box. A click sends the group as polylines and a 512 px crop to `POST /api/draw` on this folder's copy of the proxy, which asks the model (Sonnet 5.5, at most twelve strokes) for complementary strokes and paints them with the brush on the cell's bot layer, which has its own record and its own undo (a bot head beside undo). Without the proxy a rule set answers in about 45 ms: a circle gets two dots and a smile, two circles glasses, a box a roof and a door, a level line a boat, a zigzag a sun, a nearly closed shape is closed and given a face, anything else is echoed smaller beside itself in another ink; the honest note is written once per session.
- The bubbles. Two silhouettes drawn by the hand: an irregular speech outline for a tip (ink only) or a nudge (a light hatch in a tin colour under the ink), and a cobalt cloud with three trailing circles when the mind speaks, carrying action lines you can click or reach with Tab. One at a time; a tip soaks away in writing order, a nudge about 4 s after it is written, a bubble with actions stays until acted on or dismissed.
- ~~The sketches. Every portrait is traced offline (`tools/sketch.py`: two-scale difference of Gaussians, a skeleton, marker-width lines) into three styles, contour, hatch and loose, and drawn in the browser by the same brush with the tooth; hover fades the photograph up as a print in 180 ms, a tap soaks the sketch away under it. `sketches.html` shows the same four faces in the three styles with the stroke counts typed under each; the pick is one constant in `faces.js` (contour until he picks). On the speakers' place the 77 faces lie in loose rows (featured first, then by last name, each turned up to 3 degrees), every face a fling body that remembers where it was left across a reload, a typed filter line (all · keynotes · panels) lighting a set and dimming the rest; the 18 speakers without a photo get a drawn placeholder and "no photo yet".~~ The second pass replaced the traced sketches on the speakers' place with the chosen avatars as ink (`shots/pass2/faces/`); `sketches.html` keeps the record.
- The agenda's circles and calendar. The programme printed as four day columns (stacked on a phone), every session a typed block whose title opens its card. A closed stroke around a block circles it (ten of sixteen grid points of the block inside the stroke's polygon); a cobalt tick lands beside it at once; the first circle brings the mind's cloud, "i'll keep those", and a "your picks" card you can move, with a real `.ics` (UTC times, "sample" in every event), "save here" and "clear picks"; picks are recomputed from the strokes after undo, clear, a decoded link and a reload, so the geometry is the truth. Written in `sections/agenda.js`; the capture `[to confirm]`.
- The deck in its frame. Round 02 v10 copied file for file into `years/` with an embed mode (transparent paper, no chrome, messages to the parent for the cursor hand-off, the print lock, pause and resume); the photographs are read from round 02's folder; every physics number is untouched; the title is written above the frame and the pen works on the paper above and below it.
- The mind summonable anywhere. A letter or `/` on any page writes the question line above the mark in the place you are in ("what can i do for you?"; the opening's own line is "what are you looking for?"); Enter writes the answer under it in the hand. With the proxy, `POST /api/mind` streams: the say in the hand where you asked, "see it on the mind's page" when the answer carries components, and on the mind's own place the thread as notes, newest first, the components lying under each answer as cards you can move. Without it the honest note, "i answer in the build round; meanwhile, the pages", and the menu. Written in `sections/mind.js`; the capture `[to confirm]`.
- The typewriter. `Typed.block` (in `about.js`) types a block character by character with the ElevenLabs clips in `sfx/typewriter/` (four strikes, a space, two bells, a return) through the shared audio graph, so the squiggle mutes it, and fills the block at once when there is no sound yet or under reduced motion. About types its column once per load with the hand writing each heading as the typist reaches it; the venue types its blocks after "austin, texas" and the dates in the hand; the tickets' hand circles the lines on sale (a squared oval with its own tremor, 0.6 s, the marker heard) and draws an arrow at "get tickets" (`shots/tickets/NOTES.md`). The venue's and about's captures `[to confirm]`.
- Save and the pdf. Save asks in the hand, "this place · the whole poster · as a pdf"; the first two export the place (2880 x 1800) and the sheet (2000 x 1250) with the art and the mark; the pdf is the browser's print: `print.css` lays page one as the whole sheet on a 24 x 36 in page and then a letter page per place, the pages built by `margin.js` at `beforeprint` (the stylesheet landed at 22:13; the `margin.js` half and the capture `[to confirm]`).
- Both ways. Nine addressable pages, `<noscript>` facts and links, keyboard paths (arrows, Escape, Enter, a letter, `/`), `?rm=1` or the system setting for cuts and instant writing, phones with the two-column menu and the pen button.

## From the owner's words to the build

- "I wanna stick with kinda like the papery feel": the sheet carries the tooth and the mottle, the lens the vignette and the grain, every ink the mask (`app.css`, `opening.css`, `paper.js`).
- "everything is on one giant poster … you're zooming around one giant poster sheet": `poster.js`, the three lanes, the dolly and the routes.
- "zoom out and see the whole website like a site map but really everything laid out graphically": `Poster.zoomOut()`, `poster.html`, "the whole poster" in the chrome, Escape; the big labels exist only in that view.
- "you could hover over it and it'll show maybe like a bot icon … make it somewhat obvious": `bot.js`, the drawn bot that appears after a drawing on every device, the bot cursor and the dashed box on fine pointers.
- "if you drew a circle it could draw two dots and a smile": the first rule, and with the proxy the model's reply (`shots/bot/proxy-face.png`: three strokes, the note "two dot eyes and a smile").
- "an undo button where you undo what the bot did versus what you did": the bot layer with its own record; `#undo-bot` beside undo, shown only while the mind has strokes to undo.
- "the speech bubbles, maybe for tool tips … a couple of the speech bubble shapes … tastefully, not too much": `bubbles.js`, two silhouettes, the pulp through the colour, one at a time, each nudge once per session.
- "the menu can be dragged around … each speaker's face … a paper sketch as if it's drawn with the same marker … until you hover, which can reveal the supplied photo": `faces.js` and `sketches.html` for the sketch and the hover print; `sections/speakers.js` seats each face as a fling body that remembers its place. The menu itself is not draggable in this build (see Not done). Since the second pass: the chosen avatars as ink, a bio card with the sessions and the role, no photograph (DECISIONS 2026-10-23).
- "draw little annotations to your own agenda … circle the things you want to see … feel free to circle what you're interested in … offer to give you a calendar": `sections/agenda.js`, the nudge in those words, the tick, the cloud and the `.ics`; the "filter to only view the things they've circled" is not built.
- "save it as a PDF, and we could even offer … to mail out their own copy": save asks "as a pdf" (`shots/core-a/save-choice.png`); `print.css` and the mail-out words in the blank cell `[to confirm]`.
- "What are you looking for? Or what can I do for you?": both lines live on the site; the opening writes the first, the summoned line anywhere else writes the second (`opening.js`); `?prompt=` writes any line.
- "we can have it typed out, and please use Eleven Labs API to generate typewriter sounds, including the carriage return for next line and bell ring": `typewriter.js` with `sfx/typewriter/`; about and the venue type their blocks through `Typed.block`.
- "a little replay arrow … a little arrow or suggestive icon that makes it all appear": the home's "replay" link replays the opening; the typed blocks have neither yet (see Not done).
- "where it becomes like your personal site … a small little sketched disc icon": strokes per place, picks and positions stay on the device; the sketched disc and the journey link are not built (see Not done). Built in the second pass: the disc, the journey link with its forks, the resets per place (`shots/pass2/journey/`).
- "I want the interface to be usable both ways": the nine pages, `<noscript>`, the keyboard paths, `?rm=1`, the phone.

## The decisions that were not his

- Lanes and natural heights: three lanes of natural-height cells instead of nine equal screens, because nine screens zoom out to clipped panels and an inner scroll would hide most of the agenda and the speakers from the poster view and from the print (plan section 2; Astra's first refutation).
- No partners cell: the brief's scope has none and the refuters called it an invention protecting itself from the cut list; the right lane's third cell is blank paper, "your poster", where the mail-out words belong.
- The frame for the deck: v10 in an iframe with an embed mode, because its measured physics are the one thing the brief forbids changing and a scoped rewrite of `timeline.js` would risk them in one night; an admitted seam, the direct mount is the build round's.
- ~~Edge tracing for the sketches, not an image model: the same brush guarantees the same hand, it is deterministic and free per face, nothing third-party enters the repo and no face is generated, only traced from the supplied portrait; the photocopy risk is answered by the loose style and the owner's pick.~~ Superseded: the owner chose the generated avatars (2026-10-23).
- Two bubble shapes, not three: the speech outline (plain for a tip, hatched in a tin colour for a nudge) and the cloud for the mind; colours from the tin only, since yellow is not a tin colour; frequency and lettering matter more than taxonomy.
- Touch gesture ownership: the finger scrolls by default, the pen is a state (the drawn pen button or a 300 ms hold), and a swipe that starts on a face still flings it; without this every swipe on a tall cell would have been a stroke.
- The pointer policy: the ink canvases take no pointer events; a press on paper or typed text draws at once, on a control after 6 px, on a body never. The cost is double-click word selection on typed text (the second press is a stroke), kept knowingly.
- The twelve-megapixel cap: every full-resolution layer is capped at 12 MP with the device ratio stepped down (a 1440 x 3000 cell runs at 1.5, 1440 x 6000 at 1), and inactive layers sit at a quarter, so nine retina layers do not cost 93 MB.
- The UTC calendar: the `.ics` writes its times in UTC (CDT is UTC minus 5) with stable ids, `METHOD:PUBLISH` and "sample" in its name and every summary, rather than a TZID with its rules, so every calendar reads the same instant and no sample session reads as a commitment; the agenda builder's capture `[to confirm]`.
- The desk tone: `--desk #cfc8bb` around the sheet with a soft shadow, seen only when the camera lifts or zooms out, so the poster reads as a sheet on a table.

## Verified

Headless Chrome only, 1440 x 900 and 390 x 844 at 2x as the phone's proxy. Only what a builder's NOTES.md and its captures show:

- The second pass: `shots/pass2/typed/`, `agenda/`, `journey/`, `print/`, `mind/`, `faces/` and `coordinator/`, each with its `NOTES.md`; all nine pages on both screens with no page or console errors, the hints on and off; an independent verifier re-ran the claims, confirmed the typed blocks, the journey, the mind and the errors, and refuted three things that are now fixed and re-measured (the band printing, the circle's closure, the phone's picks card; `shots/pass2/coordinator/NOTES.md`).

- The opening, the camera, the routes, the zoom-out, the scrollbar, the question line, save's three choices and the exports, the back button, reduced motion, the phone's menu and pen link: `shots/core-a/NOTES.md`, `home-live.png`, `opening-*.png`, `agenda-midflight.png`, `agenda-arrived.png`, `poster-view.png`, `scrollbar-hover.png`, `question-answer.png`, `save-choice.png`, `mobile-home-live.png`, `mobile-menu-open.png`, `mobile-poster-view.png`, `meta-*.json`. `agenda.html` opened directly gives `Poster.current === 'agenda'`; `go('agenda')` takes 0.9 s; `zoomOut()` fits at 0.307.
- The ink layers, the gesture controller, the closed-stroke event, the bot layer and its undo, the whole-poster link, the quarter-resolution memory and the 12 MP cap, the phone's pen state and the 300 ms hold: `shots/core-b/NOTES.md`, `desktop-strokes.png`, `desktop-circle.png`, `desktop-bot.png`, `mobile-pen-on.png`, `meta.json`, `meta-mobile.json` (a harness with the contract's DOM, not the real pages).
- The sketches in three styles, the hover print in 180 ms, the tap soak, 77 faces in 24 s with four pens, the 19 placeholders: `shots/faces/NOTES.md`, `desktop.png`, `desktop-hover.png`, `mobile.png`, `mobile-tap.png`, `desktop-all-loose-done.png`, `sheet-*.png` (on `sketches.html`; the speakers' place itself is not captured).
- The two bubble shapes, the soak in writing order, the flipped nudge, the cloud with actions by click and by Tab, `once`, reduced motion, the phone sizes: `shots/bubbles/NOTES.md`, `tip.png`, `soak-0*.png`, `nudge-flipped.png`, `mind-actions.png`, `mind-hover.png`, `mobile-*.png` (a demo page, not the site).
- The deck in its frame, byte-identical engines, the embed messages, the print lock, pause and resume, and the frame on the real `years.html` and in the zoom-out: `shots/years/NOTES.md`, `deck-embed*.png`, `print-open.png`, `print-closed.png`, `poster-years.png`, `poster-print-open.png`, `poster-zoom-out.png`, `poster-years-mobile.png`.
- The bot's invitation after 1.2 s, the dashed box, the seven rules, the proxied replies (a face, a house, a line's sprouts) in 2.4 to 3.9 s, the fallback with the honest note, the validator's self-test: `shots/bot/NOTES.md`, `button-*.png`, `hover-box.png`, `rule-*.png`, `proxy-*.png`, `meta.json` (a harness under the docs origin).
- The tickets' typed list, the hand's loop around the phase on sale (clear of the next phase on both screens), the arrow at "get tickets", the finger and the focus ring on the link, reduced motion at once: `shots/tickets/NOTES.md`, `arrived-desktop.png`, `arrived-mobile.png`, `circling-mid-desktop.png`, `hover-link-desktop.png`, `focus-link-desktop.png`, `arrived-reduced-desktop.png`, `meta-*.json` (on the real `tickets.html`).
- The speakers' place on the real `speakers.html`: 77 faces in nine columns, the filter, the hover print, the tap and the second tap, a face dragged 120 px and back at the same rect after a reload, a 440 ms touch hold grabbing and a quick swipe scrolling, a stroke in a gap between faces, reduced motion, the tall column in the zoom-out (0.209): `shots/speakers/NOTES.md`, `desktop-arrived.png`, `desktop-hover.png`, `desktop-keynotes.png`, `desktop-dragged.png`, `desktop-reloaded.png`, `desktop-stroke.png`, `desktop-poster-view.png`, `mobile-tap.png`, `mobile-held-and-dropped.png`, `mobile-reloaded.png`, `meta-*.json`.
- ~~Not verified: the agenda's nudge, circles, card and calendar; the faces' marker sound; the venue's and about's typing; the mind's proxied answer and its thread; the mail-out words; the pdf; the bot and the bubbles on the real pages; the Pages deployment. Each is `[to confirm]` until its builder's NOTES.md lands under `shots/<section>/`.~~ All verified in the second pass.

## Not done

- Not tested on a real phone, in Safari or in Firefox; the share sheets were stubbed; iOS may ignore the pdf's page size; a phone's printed sheet is a narrow strip on the 24 x 36 page.
- The link is a snapshot in the fragment (about 8 KB for a full evening); the Worker record with the key in the fragment is the build round's.
- THE-MIND.md's "which one?" and "all of these?" for an ambiguous circle are not built; the two-pick offer says "circled" even when the picks came by checkbox or face.
- The about column types for about two minutes, and its skip arrow leaves the screen with the typing; the years deck keeps round 02's own title; on a phone the zoom-out's labels hang off the strip; the menu is fixed chrome, not a body.
- The drawn second frames on hover and the bleach-and-type bio are the studio's trials, not built here.
- The ambient track's and Chapter 11's licences are open.
