Fix round 2 — the opening (index.html, shared.css)

Fixer for the opening group · 2026-10-13 · files owned: prototype/index.html, prototype/shared.css (plus the new prototype/vendor/ pair). Captures: headless Chrome for Testing via Playwright, python3 -m http.server 8703 inside prototype/, 1440x900 and 390x844 at DPR 1, shot prefix r2-opening-. Every capture below was read as pixels before judging; the luminance numbers come from a stdlib PNG probe (L = 0.2126 R + 0.7152 G + 0.0722 B on stored values, the same measure the round-2 visual critique used).

1. The head (decision 5) — six iterations, locked at iteration 6

Before (round 1, c2v-opening-head-1440.png): a skull by shape. Oversized orbits at y 0.05 that sat half inside the dissolve band and read as open cavities, a second bridge lobe below the cut descending as a lone column (the tooth), a cheekbone flare where the socket and temple subtractions met, grey noisy tendrils in the fade (noise amplitude 0.22), putty albedo with orange rims.

After (r2-opening-head-1440.png, r2-opening-1440x900.png, r2-opening-390x844.png): a smooth matte display-mannequin cranium from the nose bridge up.

2. Fork, lockup, keys (decisions 1, 2, 4)

Before: // 01 / // 02 eyebrows, ENTER THE SITE / ASK THE MIND in Unbounded 800 caps, old explainers, a hint with a key legend, no corner tags, no accessible names, lockup // AUSTIN, TX // 2027, slash and printable keys inert, card-lift hover with a peach ring and backdrop blur, Space on a door did nothing.

After (r2-opening-1440x900.png, r2-opening-390x844.png, r2-opening-hover-mind-1440.png, r2-opening-focus-map-1440.png): - One eyebrow // two ways in above the fork. Door A: Open the map / Everything laid out: agenda, lineup, venue, tickets. / tag [ browse ] / aria-label Open the map: the full site with pages and navigation. Door B: Ask the mind / Say what you came for. Only that appears. / [ ask ] / Ask the mind: a conversational guide that shows only what you ask for. Under both: // you can switch any time. Strings live in CONFIG.copy and CONFIG.doors and in the static markup (no-JS carries them: r2-opening-nojs-1440.png). - Lockup: // MAY 3-6, 2027 // AUSTIN, TX as real text in both CONFIG and markup; .tag--caps keeps the caps on that line only. - Labels Unbounded 400 at clamp(1.25rem, 1rem + 1vw, 1.75rem); explainers Unbounded 300 at 15 px; corner tags top-right, opacity 0 → 1 on hover and focus-visible, always visible under (hover: none) (measured opacity 1 at 390). - States per §3.3: rest 1 px --line-ui outline, no fill, no shadow, no backdrop-filter, square corners; hover/focus border → ink plus a 1 px inset ink shadow (2 px total, nothing shifts); explainer → ink; door B grows a raspberry hairline along its top edge over 240 ms (::before, measured matrix(1,0,0,1,0,0), rgb(193,17,90)); active scale 0.985; focus ring 2 px raspberry, 4 px offset (measured). Tab order map → mind → shortcuts toggle; arrows wrap; Tab is never intercepted; Space on a focused door opens it (measured → standard.html). - Keys (one document keydown handler): ignores defaultPrevented, isComposing, ctrl/meta/alt and editable targets. / → mind.html#compose. Any other single printable key → the key is stored in sessionStorage['ets27.draft'] and the page goes to mind.html#compose; nothing typed ever travels in a URL, so no server log carries it. mind.html (the other group's 02:54 version) already reads and removes the draft: measured after pressing w on the fork, #q value w, focused, caret at 1, zero turns sent, storage cleared. The 1 and 2 door shortcuts from §3.3 are dropped on purpose (decision 1 makes every printable key a draft). - WCAG 2.1.4: a [ shortcuts off ] / [ shortcuts on ] mono button in the hint line, remembered in localStorage['ets27.shortcuts']; with it off, w and / do nothing (r2-opening-shortcuts-off-1440.png, measured URL unchanged, draft null, label survives reload). - The storyboard's 10 s line > pick a door, or just start typing. appears once per session on hover-capable devices with shortcuts on (r2-opening-nudge-1440.png, measured at t 10.0).

3. Intro, skip, focus before the reveal

Before: no skip, no shortcut out of the 5.6 s intro, Tab at 0.95 s focused an invisible door (c2i-fork-focus-before-reveal-1440.png).

After: [ skip ] mono button bottom-right, visible from 0.4 s (r2-opening-skip-visible-1440.png, measured opacity 1 at t 0.71) and hidden once settled; the first keydown, pointerdown, wheel or touchstart, a focusin inside #fork, or the skip click adds intro-done, which forces every .reveal to its final state and jumps the realm clock to settledAtMs (accumulation restarts so no ghost of the rise lingers). Measured: two Tabs at t≈1 s → intro-done, door A focused at opacity 1, filter none, raspberry outline (r2-opening-focus-early-1440.png); skip click → phase settled, intro 1 (r2-opening-after-skip-1440.png). Reduced motion and ?still=1 keep the doors present from the first frame and never show the skip (r2-opening-reduced-motion-1440.png, r2-opening-still-1440.png).

4. Realm loading, fallbacks, render loop

5. Phone and short viewports

Before: two 173 px doors side by side with wrapped labels, 125 px of empty deck between the head and the mark, and the desktop grid inflated to 1804 px when an indefinite-height grid met a 2fr filler row.

After: at 390x844 the doors stack full width (358 px), 12 px apart, 102 px tall (min 64), map above mind, tags always visible; lookYTall −0.62 → −0.50 puts the cut at 335 px and the lockup follows --head-bottom (369 px) directly; scrollHeight 844 (no scroll). The stage has a definite height (100dvh) so spare space splits 1:2 between the head's room and the bottom. On wide-but-short screens the DOM stack scales with height (mark min(…, 10.7vh), door padding min(1.75rem, 3.1vh), gaps in vh) and the head lifts and shrinks a little (shortBelowPx 900, shortLift 1.0, shortShrink 0.6): measured no scroll at 1024x680, 1280x720, 1366x768, 1920x1080, head clear of the corner tags.

6. Tokens (shared.css) — decisions 3 and the palette findings

7. Captures (all in prototype/shots/, prefix r2-opening-)

1440x900, head-1440, 390x844, mid-intro-1440, focus-early-1440, skip-visible-1440, after-skip-1440, hover-mind-1440, focus-map-1440, shortcuts-off-1440, nudge-1440, reduced-motion-1440, still-1440, nowebgl-1440, nowebgl-390, nojs-1440, nojs-390, stall-1440. Round-1 shots untouched.

Console: zero errors and zero warnings on every index.html load in the run except the deliberate [ets27] CSS realm: … warning in the forced-fallback cases. The only "failed request" entries are Playwright reporting the two modulepreload fetches as blocked inside its JavaScript-disabled context (reason csp); a real no-JS browser simply does not fetch them, and the no-JS page renders fully.

8. Not applied, and why

9. For the other group