#!/usr/bin/env python3 """Build the livepass harnesses — render real hatch dialogs/shelves headlessly. The livepass is how converted modal surfaces get verified without booting a server: a minimal page that symlinks the REAL stylesheets and scripts, embeds the REAL markup (extracted fresh from the index files at build time), stubs ``window.authFetch`` with canned fixtures, and drives surfaces via ``?open=`` query params — including click-driving submits so dead buttons can't hide (the model-Save bug class). Usage: python3 scripts/livepass.py # build into /tmp/livepass/ python3 scripts/livepass.py --out DIR # build elsewhere python3 scripts/livepass.py --serve 8950 # build + serve (Ctrl+C stops) Then screenshot states (file:// blocks ES modules — always serve over http; the reduced-motion flag is REQUIRED, entrance animations race the capture): google-chrome --headless --disable-gpu --hide-scrollbars \\ --force-prefers-reduced-motion --window-size=1440,900 \\ --virtual-time-budget=9000 --screenshot=out.png \\ "http://localhost:8950/ui/livepass.html?open=new-ws&theme=light" UI harness (?open=): new-ws · new-ws-fork · edit-title · delete-ws · revoke-mcp · ws-delete · ws-delete-results (+ &theme=light, &busy=1) Console harness (?open=): schedule-create · schedule-edit · model-create · model-edit · model-save (drives a Save click; document.title becomes PUT-OK- on success) · policy · confirm · token Plus &tall=1 (90-row users panel — the .admin-content scroll state; the synthetic rows wrap to two lines, so judge overflow geometry, not row cadence) · &scrolled=1 lands mid-list, &scrolled=bottom shows the 24px scroll tail · &focuslast=1 focuses the last shelf-body control (the displaced-dock regression probe: only .sh-body may scroll; head/foot stay pinned). All combinable with ?open=. The console page wraps the fragment in the REAL L-shell chain — pane-pinned height, interior scroller — so scroll/dock geometry matches production; keep it that way. Body-level dialogs (confirm/install/coord-delete) are injected as riders; a driven ?open= that ends with no open dialog stamps OPEN-FAILED- into the title instead of passing silently. Governance surfaces (roles/HR/OGP/memory/skill) need fixtures that are not canned yet — add a fixture + driver branch below when you need one. Shell harness (?split=): right (default) · down · three · none — boots the REAL shell.js + pane.js split-view engine over stubbed seams (two demo conversational panes; ?split=three adds the Dashboard cell). + &theme=light. document.title stamps SPLIT-READY- on success and SPLIT-FAILED- when a driven split was denied — judge the focused cell's top accent bar, the separators, and the .shown tab marker. Attachments harness (/attachments/livepass.html): the composer attachment chips + the sent-message attachment pills, both driven through the REAL code paths — createAttachmentController.rehydrate() builds the chips and Pane.addUserMessage() builds the pills, so the preview nodes (image/pdf thumbnail,