/t27f/live/ -- where every byte on the page comes from ====================================================== The T27F live surface (issue Trinity-S-AI-DNA/trinity#1717, milestone M3 of T27F Live, t27#10262). The page replays a recorded log of actor events through the law compiled to WebAssembly. It holds no HUD, no layout, no colour and no replay state of its own: live.js the loader (21 lines, comments included): fetch the recorded log, import the glue, hand it the canvas and the log, print the status. FR-004: no layout, no colour, no state logic. When the glue or the wasm is missing it catches the failure and names the state. logs/recorded_log.json the recorded log, format t27f-live-recorded-log-v1, 24 events. The law (in gHashTag/t27, compiled to t27f.wasm -- none of it is vendored here): work_graph.t27 the work graph the events land in master 164705e28f live_graph_export.t27 the gx_ surface the page reads master 7273ad30b5 hud.t27 the HUD, a pure function of the graph master ed6dcf00af live_mode.t27 the frame clock and the replay master b086799248 display_list.t27 the ops the graph and HUD emit master e356cfb589 live_stream.t27 the event stream contract master d800c56d1a scene.t27 the scene the ops paint into master e356cfb589 motion.t27 the motion between frames master e356cfb589 (gHashTag/t27 master commit shas, the last commit that touched each file, read from the GitHub API on 2026-10-24.) The recorded log Extracted deterministically from specs/t27f/work_graph_fixture.t27 KIND[0..23] at gHashTag/t27 master 50ea972f7e. Verified against the fixture's own REPLAY_KIND_REF : [24]u8 = [0,0,0,0,0,0,0,4,4,4,4,4,4,4,2,3,1,4,5,4,4,4,5,2]: 0=spawn x7, 4=deliver x7, 2=down, 3=restart, 1=exit, then deliver/delivers to the final down at tick 23. The log's 24 events match that sequence one for one. The state of the replay: the scalar plane (2026-10-24) t27f_live.js (81 lines, comments included) instantiates t27f.wasm and replays the recorded log's SCALAR PLANE as an animated timeline: a playhead walks the frame axis one window at a time, arrival_frame places each event on the axis, paints_due says whether the window owes its one paint, and latency_ms prices every event the paint first shows. It renders a frame axis, a per-event table (kind, t ms, arrival frame, painted at, latency) and a caption, all coloured from the page's own tokens, and it answers prefers-reduced-motion by painting every window at once. What it does NOT render: the HUD scene, the work graph, display-list ops -- the struct path (WorkGraph -> HUD scene -> display-list ops) is the named next step, blocked on t27#11983 landing (the 1509 added Rust lines of the M-B emitter need the owner's own-language decision), then the export glue v2 for live_frame's *WorkGraph/*Batch arguments. A bad wasm, a missing export or an unreadable log is refused by name, never faked. The wasm's origin is a PREVIEW, honestly named: t27b built it from specs/t27f/live_scalar_closure.t27 on branch lane/ma-params (the transcription of live_mode.t27's scalar trio, pinned test by test against the law). The lab rebuild from landed master shas replaces it the moment #11983 merges; this file and t27f.build name that state until then. Proven earlier (t27#1717 comment, 2026-10-23): the wasm32 blocker is fixed upstream (gHashTag/t27#11815), and all six live-closure specs compile clean under zig wasm32-freestanding; the scalar trio above is the slice the branch emitter lowers today. A loader without its wasm is a page that renders its chrome and names its state -- never a fake replay. Compiler and lab t27c 0.5.2 (sha256 83e85f6d11ba8acb36890514f4fb21de2c3e808c5918515724f11d8609d1b8c1, the owner's Mac binary), zig 0.16.0. The closure build runs on the T27 OS lab per the lab contract Trinity-S-AI-DNA/t27os specs/os/lab.t27, executor Trinity-S-AI-DNA/t27os .github/workflows/lab.yml (challenge-verified receipts). The lab's own t27c sha and the closure digest are recorded in t27f.build when the build lands. Checksums t27f.build, next to this file, is the record: `#` lines hold the closure (the spec list above), the zig version, the t27c sha256 and the build state, and every other line is ` ` for what is published here today -- live.js, logs/recorded_log.json, index.html, PROVENANCE.txt, and the preview t27f.wasm and t27f_live.js with their origin named in the comments beside them. Update 2026-10-24: the glue above landed in two passes -- PR #1731 put a static table where the wasm's answers go and #1734 clarified it; this pass replaces both with the animated scalar-plane replay described in "The state of the replay" (verified in Node against the committed wasm and the law's own pinned numbers, scripts/live-glue.test.mjs in gHashTag/trinity). The struct-path export glue v2 is still the named remaining step for the full replay. Update 2026-10-25: queen-live.mp4 (328428 bytes) is the lab's own film -- 900 frames rendered from specs/t27f/frame_render.t27 and specs/t27f/export_video.t27 on the T27 OS lab (Trinity-S-AI-DNA/t27os, runs/queen-live.mp4 with its sha256 beside it), render stats measured by the lab: 110.11 fps, 9.08 ms/frame. Vendored here because raw.githubusercontent serves it as octet-stream; refresh it from the receipt when a newer lab run publishes one. Update 2026-10-25 (the gx consumer): t27f_live.js now carries the consumer of the law's own graph export, specs/t27f/live_graph_export.t27 (gHashTag/t27#12148, MERGED at master 7273ad30b5). After instantiating the module it feature-detects gx_node_count; when the module exports the gx_ surface AND answers nodes, the page feeds the loader's log JSON re-encoded as the law's own 32-byte records through gx_replay (the load path), or, if the module refuses that, through gx_apply_event per event on the tick grid (the live path) -- and draws the graph the module answers: nodes from gx_node_* colored by kind (SPEC amber, AGENT the page's lifecycle blue, TASK violet, ACTION grey, ARTIFACT green), edges from gx_edge_* as thin polylines with the particle color on PRODUCES, names read from linear memory at gx_node_name_ptr/len (a spec path, or the tagged form whose id bytes the PAGE renders as a number -- the module converts none). Any gx_ refusal, missing export or throw falls back silently to the agent simulation, byte for byte what ran before. THE SWITCHOVER IS DORMANT. The t27f.wasm published here today (see t27f.build) exports only the scalar trio -- arrival_frame, latency_ms, paints_due -- so the feature-detect fails and every visitor still sees the simulation. The branch lights up the day the stateful-floor lane lands and t27f.build serves a module carrying the gx_ exports: no further PR on this page, the graph becomes the law's own topology by itself. Verified in Node against a mock module answering the gx_ surface with work_graph.t27's own semantics: the load path builds 12 nodes / 11 edges from today's 24-event log, the live path grows the same graph per event, the joins of a richer log (task, deliver, spec, pids) draw TASK/SPEC/ARTIFACT nodes and particle-colored PRODUCES edges, and a refusing, memory-less or throwing module falls back to the simulation without a word. Update 2026-10-25 (the layout discovery surface): layout.wasm (683 bytes) lands beside t27f.wasm -- the 23 CONSTANT gx_ exports of specs/t27f/live_glue_layout.t27 (gHashTag/t27#12040), the struct-path's const plane the wasm32 emitter's M-A cut lowers today: the ptr/len pairs of the fixed 143,692-byte layout the contract card #12005 pins (the image, the ten node/edge columns, the digest, the record and batch regions, the stream). t27f_live.js instantiates it at load as a DISCOVERY surface: it reads the 23 constants off the module and reports one line in the page's status; a missing or misshaped module is refused by name, never faked, and the scalar replay stays the main event either way. No layout number is hardcoded in the glue -- that is the point of reading them off the artifact. Built from landed gHashTag/t27 master with `t27b build --target wasm32` (no local patches; byte-identical to the sha256 the #12040 PR body recorded), and Node-verified before publishing: 23/23 exports present, every value equal to the spec's own test constants, all 12 tiling invariants holding. The 10 stateful gx_ names wait for the stateful emitter floors (t27#5980); the struct path itself remains the named next step.