PR: https://git.cafe/pingdotgg/t3code/pulls/26717 Exact head: 8a93dd27f1d7b832a97796305d1d9853f19dfe2b Baseline: github/main 5fe18d79ac Browser: repo Playwright 1.60.0, /usr/bin/google-chrome, Linux, 1440x1000 State: created project /home/user/t3code through Add project > Local folder. Provider: selected Codex GPT-6.1-Sol in composer; sent read-only pwd/git verification request. Baseline: real provider turn completed in 8.7s with TERMINAL_PROVIDER_OK. Terminal: opened toolbar terminal drawer, typed a Node shell command producing 2000 numbered ANSI-colored lines, bold, CJK, emoji and combining marks over 2s. Baseline output: STREAM_COMPLETE and prompt returned. Screenshot inspected. Baseline scroll: 80 actual mouse-wheel events, 40 up then 40 down, 30ms between events; instrumented existing GhosttyTerminalCore.snapshot on the active UI instance. Baseline geometry: 150 columns x 15 rows. Dirty snapshots: 80. Median snapshot 0.70ms; p95 1.10ms. WASM memory 15073280 bytes. Baseline neighboring behavior: mouse selection returned ROW 01987; viewport resize 1440 -> 1100 yielded 150 -> 107 terminal columns; restored viewport. Main dev runner captured PID 29762; stopped its process group and confirmed ports 16733/8693 closed before PR server. PR root checkout initially selected default home; stopped before server startup and restarted with explicit isolated T3CODE_HOME=/home/user/t3code/.t3. PR fresh state: recreated same project and request through UI, Codex GPT-6.1-Sol returned TERMINAL_PROVIDER_OK in 7.8s. PR neighboring behaviors: selection returned ROW 01987; resize reduced columns to 107 and restored 150. Diagnostic on active UI terminal: explicitly memory.grow(1); cached Uint8Array detached to byteLength=0; next memoryBytes() returned a new 15204352-byte view (previous 15138816). Typed through real terminal after growth: printf truecolor bold GROWTH_OK with CJK/emoji/combining text. Snapshot and visible canvas stayed correct: RGB 123,45,67, bold=true; three wide-cell spacer tails. Prompt returned. Blacksmith: vp test run apps/web/src/terminal/ghostty/core.test.ts apps/web/src/terminal/ghostty/runtimeAbi.test.ts apps/web/src/terminal/ghostty/surface.test.ts: 3 files, 47 tests passed. Includes existing memory-growth case. No new test files. Warmed real-client measurements, same 150x15 geometry, 4 batches x 80 mouse-wheel frames (40 up/40 down; 30ms between events): main medians: 0.60, 0.70, 0.60, 0.60ms; p95: 0.90, 1.00, 0.90, 0.90ms. PR medians: 0.40, 0.40, 0.40, 0.40ms; p95: 0.60, 0.60, 0.60, 0.50ms. Separate instrumentation run wrapping the native WebAssembly.Memory.prototype.buffer getter without changing its result: main: 1,046,912 getter calls over 80 dirty scroll snapshots. PR: 240 getter calls over 80 dirty scroll snapshots. Timing samples exclude the getter-counting instrumentation and video capture. Initial un-warmed PR run had a 5ms p95; subsequent four warmed runs were 0.50-0.60ms. These are local snapshot measurements, not end-to-end frame times or allocation-volume measurements. Main repeat cold ChatView compilation took several minutes, then client became usable. No >10min stall occurred. Neighboring shared-runtime behavior: clicked Split Terminal Horizontally, typed printf SECOND_TERMINAL_OK into the second real PTY; both terminal canvases rendered independently. The original pane retained STREAM_COMPLETE and colored Unicode text. Runtime identity was shared between both terminal cores. Closed Terminal 2 through the real confirmation dialog; one terminal remained. No tracked source changes, commits, pushes, labels, or PR lifecycle changes were made.