UI: port pane cards, branched tree and warm tooltips into packages/ui #33

Closed
opened 2026-10-06 15:42:35 +00:00 by kayg · 47 comments
Owner

Port the approved core-screen pieces (branch mock-core) into the product UI and packages/ui:

  • the pane card layout (.panes grid, one .pane-card per view), the base for splitting later;
  • the branched host tree with trunk fades (branched.ts);
  • the warm tooltip group (tooltip.ts), auto-attached to icon-only controls;
  • themes, the mesh backdrop and the key bar (variant a).

The mockup modules are plain TS. Each becomes a Svelte component or action with the same behaviour and timings (see their module docs).

Port the approved core-screen pieces (branch mock-core) into the product UI and `packages/ui`: - the pane card layout (`.panes` grid, one `.pane-card` per view), the base for splitting later; - the branched host tree with trunk fades (`branched.ts`); - the warm tooltip group (`tooltip.ts`), auto-attached to icon-only controls; - themes, the mesh backdrop and the key bar (variant a). The mockup modules are plain TS. Each becomes a Svelte component or action with the same behaviour and timings (see their module docs).
Author
Owner

Start: branch t-web, base origin/dev 7174d6bf6f; starting head 845c293a70. Read #33 (no prior comments), all comments on parent #14, decisions 68–103, architecture, process and all mock-core modules.

Start: branch t-web, base origin/dev 7174d6bf6f1880458a4166a2cf0fa45158d1742e; starting head 845c293a70d6f86e05a6f46794462009793df973. Read #33 (no prior comments), all comments on parent #14, decisions 68–103, architecture, process and all mock-core modules.
Author
Owner

Baseline on production tracer build (Chromium, Linux 6.12.111 x86_64, 8 vCPU; load 4.24/3.41/5.20): 500/500 echoes, p50/p99 14.80/15.70 ms, forced resume 77.40 ms. Focused suite: 3 passed. Screenshots: apps/tracer/test-results/terminal-first-run-passkey-29742-esume-and-the-latency-probe/tracer-terminal.png and tracer-probe.png.

Baseline on production tracer build (Chromium, Linux 6.12.111 x86_64, 8 vCPU; load 4.24/3.41/5.20): 500/500 echoes, p50/p99 14.80/15.70 ms, forced resume 77.40 ms. Focused suite: 3 passed. Screenshots: apps/tracer/test-results/terminal-first-run-passkey-29742-esume-and-the-latency-probe/tracer-terminal.png and tracer-probe.png.
Author
Owner

Finding: apps/tracer/src/terminal.ts documents one client session; main.ts opens only ssh.session.open and accepts an optional host UUID. This tracer has no host/session listing API. The sidebar will use that UUID when present (otherwise say the host name is unavailable), and every demo host/tab will visibly say static. The test double already echoes protocol Ping/Pong; the tracer currently only replies to server Ping, so RTT can be measured on the existing mux without touching auth.

Finding: apps/tracer/src/terminal.ts documents one client session; main.ts opens only ssh.session.open and accepts an optional host UUID. This tracer has no host/session listing API. The sidebar will use that UUID when present (otherwise say the host name is unavailable), and every demo host/tab will visibly say static. The test double already echoes protocol Ping/Pong; the tracer currently only replies to server Ping, so RTT can be measured on the existing mux without touching auth.
Author
Owner

Step 1 complete: shared OKLab/contrast helpers exported from packages/ui. Commit 0001845b7c. Strict standalone TypeScript check passed; fast gate passed (all 5 Rust gates, Ghostty checksums, 7 TypeScript protocol tests).

Step 1 complete: shared OKLab/contrast helpers exported from packages/ui. Commit 0001845b7c05ee07d79c5ef271b38d5384158919. Strict standalone TypeScript check passed; fast gate passed (all 5 Rust gates, Ghostty checksums, 7 TypeScript protocol tests).
Author
Owner

Step 2 complete: ported all 10 approved themes and unified UI/terminal palettes. Commit 04231caa56. Strict TypeScript passed; all 10 themes pass the unchanged fg/fg2/fg3/accent/status/ANSI contrast thresholds; fast gate passed.

Step 2 complete: ported all 10 approved themes and unified UI/terminal palettes. Commit 04231caa561c96c6bd03265d54771eeef4212b97. Strict TypeScript passed; all 10 themes pass the unchanged fg/fg2/fg3/accent/status/ANSI contrast thresholds; fast gate passed.
Author
Owner

Step 3 complete: added the one-shot mesh backdrop with half-resolution rendering, context release, and stale-render protection. Commit 8300fe7763. All 10 theme mesh peaks pass the existing contrast cap; fast gate passed (Rust gates, static builds, Ghostty checksums, and 7 TypeScript protocol tests).

Step 3 complete: added the one-shot mesh backdrop with half-resolution rendering, context release, and stale-render protection. Commit 8300fe776323dcb0ce78f8bb6eb631bce788e4f1. All 10 theme mesh peaks pass the existing contrast cap; fast gate passed (Rust gates, static builds, Ghostty checksums, and 7 TypeScript protocol tests).
Author
Owner

Step 4 complete: added the shared branched host tree with safe text/data DOM construction, 300 ms pointer marker/branch motion, fold tracking, instant keyboard selection, and reduced-motion support. Commit 93e536cce0. Strict TypeScript check passed; no dynamic host/session values are interpolated as HTML.

Step 4 complete: added the shared branched host tree with safe text/data DOM construction, 300 ms pointer marker/branch motion, fold tracking, instant keyboard selection, and reduced-motion support. Commit 93e536cce09c451f110d513cef82f02bacb400bf. Strict TypeScript check passed; no dynamic host/session values are interpolated as HTML.
Author
Owner

Step 5 complete: terminal client now measures bounded ping/pong RTT on its existing mux connection and exposes theme, one-shot ctrl/alt, and input activity hooks. Commit 6980e267d0. Tracer strict TypeScript check and production build passed; mock server already echoes Ping on both mux streams.

Step 5 complete: terminal client now measures bounded ping/pong RTT on its existing mux connection and exposes theme, one-shot ctrl/alt, and input activity hooks. Commit 6980e267d0bb933ab9402a9f941b4ff265f10bf0. Tracer strict TypeScript check and production build passed; mock server already echoes Ping on both mux streams.
Author
Owner

Finding: first post-layout production browser run reached the existing probe ceiling: 500-key p99 was 23.1 ms (>20 ms), versus baseline 15.7 ms. The 3-test terminal suite had 1 failure (probe ceiling), 2 passes; access first-paint tests passed. Investigating trace and host load before attributing the delta to the screen.

Finding: first post-layout production browser run reached the existing probe ceiling: 500-key p99 was 23.1 ms (>20 ms), versus baseline 15.7 ms. The 3-test terminal suite had 1 failure (probe ceiling), 2 passes; access first-paint tests passed. Investigating trace and host load before attributing the delta to the screen.
Author
Owner

Finding: renderBackdrop calls loseContext before canvas.toBlob; core-screen.spec.ts:108 fails with toBlob event index 2 and context-loss index 1. That ordering can discard the still during encoding. I’m moving snapshot initiation before context release and retaining the failing assertion.

Finding: renderBackdrop calls loseContext before canvas.toBlob; core-screen.spec.ts:108 fails with toBlob event index 2 and context-loss index 1. That ordering can discard the still during encoding. I’m moving snapshot initiation before context release and retaining the failing assertion.
Author
Owner

Finding: core-screen.spec.ts reached theme selection but the terminal stage had no data-theme attribute; applyLook only wrote theme/background state to html, while stage selectors read terminal-screen. Updating both the root theme tokens and stage state, then rerunning the production browser check.

Finding: core-screen.spec.ts reached theme selection but the terminal stage had no data-theme attribute; applyLook only wrote theme/background state to html, while stage selectors read terminal-screen. Updating both the root theme tokens and stage state, then rerunning the production browser check.
Author
Owner

Performance finding: isolated 500-key terminal probe again exceeded its 20 ms p99 guard (p50 15.30 ms, p95 29.10 ms, p99 39.20 ms; resume 76.30 ms). Trace: encode→send p99 5.50 ms, ws.send→echo p99 13.80 ms, term.write→callback p99 33.60 ms. Host load at capture was 6.91/5.69/7.82; baseline p50/p99/resume was 14.80/15.70/77.40 ms at load 4.24/3.41/5.20. I’m retaining this as unresolved pending another isolated measurement.

Performance finding: isolated 500-key terminal probe again exceeded its 20 ms p99 guard (p50 15.30 ms, p95 29.10 ms, p99 39.20 ms; resume 76.30 ms). Trace: encode→send p99 5.50 ms, ws.send→echo p99 13.80 ms, term.write→callback p99 33.60 ms. Host load at capture was 6.91/5.69/7.82; baseline p50/p99/resume was 14.80/15.70/77.40 ms at load 4.24/3.41/5.20. I’m retaining this as unresolved pending another isolated measurement.
Author
Owner

Step 6 complete: production tracer core screen, mobile controls, command palette, themes, RTT display, and static-data labeling are committed at f3c5ae2858. Core browser check passed (1 passed); checks include no pane backdrop-filter, immediate keyboard palette, 44 px touch targets, one mesh draw/context release, and 12 screenshots. Screenshot paths:\n- apps/tracer/test-results/core-screen/tracer-core-393x852-paper-sidebar-closed.png\n- apps/tracer/test-results/core-screen/tracer-core-393x852-paper-sidebar-open.png\n- apps/tracer/test-results/core-screen/tracer-core-393x852-paper-palette-open.png\n- apps/tracer/test-results/core-screen/tracer-core-393x852-ink-sidebar-closed.png\n- apps/tracer/test-results/core-screen/tracer-core-393x852-ink-sidebar-open.png\n- apps/tracer/test-results/core-screen/tracer-core-393x852-ink-palette-open.png\n- apps/tracer/test-results/core-screen/tracer-core-1440x900-paper-sidebar-closed.png\n- apps/tracer/test-results/core-screen/tracer-core-1440x900-paper-sidebar-open.png\n- apps/tracer/test-results/core-screen/tracer-core-1440x900-paper-palette-open.png\n- apps/tracer/test-results/core-screen/tracer-core-1440x900-ink-sidebar-closed.png\n- apps/tracer/test-results/core-screen/tracer-core-1440x900-ink-sidebar-open.png\n- apps/tracer/test-results/core-screen/tracer-core-1440x900-ink-palette-open.png

Step 6 complete: production tracer core screen, mobile controls, command palette, themes, RTT display, and static-data labeling are committed at f3c5ae285813a71908b07418067125bf789c6b3b. Core browser check passed (1 passed); checks include no pane backdrop-filter, immediate keyboard palette, 44 px touch targets, one mesh draw/context release, and 12 screenshots. Screenshot paths:\n- apps/tracer/test-results/core-screen/tracer-core-393x852-paper-sidebar-closed.png\n- apps/tracer/test-results/core-screen/tracer-core-393x852-paper-sidebar-open.png\n- apps/tracer/test-results/core-screen/tracer-core-393x852-paper-palette-open.png\n- apps/tracer/test-results/core-screen/tracer-core-393x852-ink-sidebar-closed.png\n- apps/tracer/test-results/core-screen/tracer-core-393x852-ink-sidebar-open.png\n- apps/tracer/test-results/core-screen/tracer-core-393x852-ink-palette-open.png\n- apps/tracer/test-results/core-screen/tracer-core-1440x900-paper-sidebar-closed.png\n- apps/tracer/test-results/core-screen/tracer-core-1440x900-paper-sidebar-open.png\n- apps/tracer/test-results/core-screen/tracer-core-1440x900-paper-palette-open.png\n- apps/tracer/test-results/core-screen/tracer-core-1440x900-ink-sidebar-closed.png\n- apps/tracer/test-results/core-screen/tracer-core-1440x900-ink-sidebar-open.png\n- apps/tracer/test-results/core-screen/tracer-core-1440x900-ink-palette-open.png
Author
Owner

Finding: the full Playwright run exposed an outdated renderer-corpus viewport assumption after adding the pane/top bar. Two fixtures reached 197x50 instead of the test's fixed 205x56 target (error-context.md for behemoth-prefix-82541.bin and browser-text-binary-prefix-192253.bin); the test only adds the old full-screen 16 px inset. I’ll update the corpus test to calculate pane gutters and terminal padding from the production DOM, then rerun all fixtures.

Finding: the full Playwright run exposed an outdated renderer-corpus viewport assumption after adding the pane/top bar. Two fixtures reached 197x50 instead of the test's fixed 205x56 target (error-context.md for behemoth-prefix-82541.bin and browser-text-binary-prefix-192253.bin); the test only adds the old full-screen 16 px inset. I’ll update the corpus test to calculate pane gutters and terminal padding from the production DOM, then rerun all fixtures.
Author
Owner

First full required Playwright gate: 4 passed, 11 failed in 2.1 min. Ten corpus cases all failed before fixture delivery at the same 197x50 versus 205x56 grid assertion; corpus loading/canary assertions were not reached. The 500-key probe reported p50/p95/p99 14.20/18.50/21.80 ms and resume 79.50 ms (host load 4.31/5.54/6.92). Updating only the viewport calculation for the new pane geometry; repeating the latency probe after the corpus suite.

First full required Playwright gate: 4 passed, 11 failed in 2.1 min. Ten corpus cases all failed before fixture delivery at the same 197x50 versus 205x56 grid assertion; corpus loading/canary assertions were not reached. The 500-key probe reported p50/p95/p99 14.20/18.50/21.80 ms and resume 79.50 ms (host load 4.31/5.54/6.92). Updating only the viewport calculation for the new pane geometry; repeating the latency probe after the corpus suite.
Author
Owner

Renderer-corpus geometry test adjustment complete at de5ebe2831. Minimal-combining fixture passed with the unchanged target grid (205x56), 10,000-row scrollback, 11,730,944 B WASM, and painted canary. The viewport now includes actual pane insets plus terminal padding.

Renderer-corpus geometry test adjustment complete at de5ebe2831cf0a09a7e37c975e0d77615703a68c. Minimal-combining fixture passed with the unchanged target grid (205x56), 10,000-row scrollback, 11,730,944 B WASM, and painted canary. The viewport now includes actual pane insets plus terminal padding.
Author
Owner

Test rerun finding: the full suite’s first process exited, but its test server was then found listening on localhost:4173 from the parallel auth worktree (/home/kayg/.cache/codex-scratch/auth4/client/apps/tracer). The next run refused the occupied URL. I’m adding an environment-selectable Playwright/mock-server port and will run this worktree on 4174 without stopping the auth job.

Test rerun finding: the full suite’s first process exited, but its test server was then found listening on localhost:4173 from the parallel auth worktree (/home/kayg/.cache/codex-scratch/auth4/client/apps/tracer). The next run refused the occupied URL. I’m adding an environment-selectable Playwright/mock-server port and will run this worktree on 4174 without stopping the auth job.
Author
Owner

Parallel-test isolation complete at 81f338ff65. The production core-screen suite passed on TRACER_TEST_PORT=4174 while the other job retained port 4173 (1 passed, 12 screenshots).

Parallel-test isolation complete at 81f338ff65a501738ed68db65aa1047e463cabc0. The production core-screen suite passed on TRACER_TEST_PORT=4174 while the other job retained port 4173 (1 passed, 12 screenshots).
Author
Owner

Second full Playwright run (4174): 14 passed, 1 failed in 2.4 min. All 10 renderer corpus cases passed with 205x56 grids and painted canaries; the 500-key probe passed at p50/p95/p99 14.50/16.80/18.60 ms, resume 79.60 ms. The sole failure was onboarding.spec.ts layout stability: one non-input shift of 0.000005846 (baseline had passed); auth tests are untouched. Rerunning that test unchanged, then repeating full suite.

Second full Playwright run (4174): 14 passed, 1 failed in 2.4 min. All 10 renderer corpus cases passed with 205x56 grids and painted canaries; the 500-key probe passed at p50/p95/p99 14.50/16.80/18.60 ms, resume 79.60 ms. The sole failure was onboarding.spec.ts layout stability: one non-input shift of 0.000005846 (baseline had passed); auth tests are untouched. Rerunning that test unchanged, then repeating full suite.
Author
Owner

Onboarding rerun passed unchanged on port 4175: 1 passed in 15.9s, all 12 existing screenshots produced. The 0.000005846 layout-shift failure appears intermittent; no auth implementation or auth test file was modified. Repeating the full Playwright suite for a clean all-pass result.

Onboarding rerun passed unchanged on port 4175: 1 passed in 15.9s, all 12 existing screenshots produced. The 0.000005846 layout-shift failure appears intermittent; no auth implementation or auth test file was modified. Repeating the full Playwright suite for a clean all-pass result.
Author
Owner

Latest full suite: 14 passed, 1 failed in 2.1 min; all 10 renderer fixtures and onboarding/core-screen passed. Latency probe p50/p95/p99 14.80/21.90/33.20 ms, resume 76.00 ms; term.write→callback p99 28.20 ms. Host load 6.00/5.99/6.49 with concurrent rustc and infraternal processes. Prior complete-corpus run on the same code passed the existing p99 guard at 18.60 ms (p50 14.50, resume 79.60). Baseline was 14.80/15.70/77.40 at load 4.24/3.41/5.20. Investigating variance; performance gate remains open.

Latest full suite: 14 passed, 1 failed in 2.1 min; all 10 renderer fixtures and onboarding/core-screen passed. Latency probe p50/p95/p99 14.80/21.90/33.20 ms, resume 76.00 ms; term.write→callback p99 28.20 ms. Host load 6.00/5.99/6.49 with concurrent rustc and infraternal processes. Prior complete-corpus run on the same code passed the existing p99 guard at 18.60 ms (p50 14.50, resume 79.60). Baseline was 14.80/15.70/77.40 at load 4.24/3.41/5.20. Investigating variance; performance gate remains open.
Author
Owner

Fast gate passed at head 81f338ff65. Verbatim result summary:\n+---------------------------+--------------+\n| Rust gate | Result |\n+---------------------------+--------------+\n| fmt | PASS |\n| clippy | PASS |\n| test | PASS |\n| cargo-deny | PASS |\n| static builds | PASS |\n+---------------------------+--------------+\nVendored Ghostty artifact checksums: all 3 OK. TypeScript protocol tests: 7 pass, 0 fail, 34390 expect() calls; 134 streams, 11439 schedules, zero divergences.

Fast gate passed at head 81f338ff65a501738ed68db65aa1047e463cabc0. Verbatim result summary:\n+---------------------------+--------------+\n| Rust gate | Result |\n+---------------------------+--------------+\n| fmt | PASS |\n| clippy | PASS |\n| test | PASS |\n| cargo-deny | PASS |\n| static builds | PASS |\n+---------------------------+--------------+\nVendored Ghostty artifact checksums: all 3 OK. TypeScript protocol tests: 7 pass, 0 fail, 34390 expect() calls; 134 streams, 11439 schedules, zero divergences.
Author
Owner

Focused 500-key rerun on port 4177 missed the existing 20 ms guard by 1.1 ms under concurrent rustc (host load 4.85/5.27/6.13): p50/p95/p99 14.70/17.60/21.10 ms; renderer callback p99 18.60 ms; resume 93.30 ms. Most tail was ws.send→echo p99 5.60 ms; waiting for competing compiles before the controlled rerun.

Focused 500-key rerun on port 4177 missed the existing 20 ms guard by 1.1 ms under concurrent rustc (host load 4.85/5.27/6.13): p50/p95/p99 14.70/17.60/21.10 ms; renderer callback p99 18.60 ms; resume 93.30 ms. Most tail was ws.send→echo p99 5.60 ms; waiting for competing compiles before the controlled rerun.
Author
Owner

Finding during reviewer pass: packages/ui/src/branched.ts sets both branch draw and marker glide to exactly 300 ms (lines 148, 164); job bar requires under 300 ms. Adding a browser assertion before reducing both to 280 ms.

Finding during reviewer pass: packages/ui/src/branched.ts sets both branch draw and marker glide to exactly 300 ms (lines 148, 164); job bar requires under 300 ms. Adding a browser assertion before reducing both to 280 ms.
Author
Owner

Completed motion-cap fix in f6f2c3c. The new assertion reproduced 300 ms for the marker before the fix; both marker glide and branch draw now use 280 ms. Production core-screen Playwright passed (1/1), including branch timing and all 12 requested screenshots at 393x852 and 1440x900, both themes, sidebar open/closed and palette open.

Completed motion-cap fix in f6f2c3c. The new assertion reproduced 300 ms for the marker before the fix; both marker glide and branch draw now use 280 ms. Production core-screen Playwright passed (1/1), including branch timing and all 12 requested screenshots at 393x852 and 1440x900, both themes, sidebar open/closed and palette open.
Author
Owner

Finished at f6f2c3c797.

Self-review: pane card has no backdrop filter; responsive floating bar and touch targets are covered; live host/session are real and unavailable examples are labeled static; the existing tooltip installer covers icon-only controls with the d-pad exception; curated themes retain their contrast caps; mesh draws once and releases WebGL, with no second draw after 2.1 seconds; mobile tray and instant keyboard palette are covered; reduced motion and the 280 ms branch cap are covered. No rAF loop runs while idle.

Performance on Linux 6.12.111 x86_64, 8 vCPUs. Baseline at load 4.24/3.41/5.20: p50/p99 14.80/15.70 ms, resume 77.40 ms. After, isolated 500-key run at load 1.56/3.26/4.94: 500/500 echoes, p50/p99 15.40/16.30 ms, resume 78.30 ms. Full suite run: 500/500, p50/p99 14.80/18.60 ms, resume 77.10 ms; p99 stayed below the existing 20 ms test bound while the renderer corpus ran.

Production screenshots regenerated at this HEAD, 393x852 and 1440x900, paper and ink, sidebar closed/open and palette open:
apps/tracer/test-results/core-screen/tracer-core-393x852-paper-sidebar-closed.png
apps/tracer/test-results/core-screen/tracer-core-393x852-paper-sidebar-open.png
apps/tracer/test-results/core-screen/tracer-core-393x852-paper-palette-open.png
apps/tracer/test-results/core-screen/tracer-core-393x852-ink-sidebar-closed.png
apps/tracer/test-results/core-screen/tracer-core-393x852-ink-sidebar-open.png
apps/tracer/test-results/core-screen/tracer-core-393x852-ink-palette-open.png
apps/tracer/test-results/core-screen/tracer-core-1440x900-paper-sidebar-closed.png
apps/tracer/test-results/core-screen/tracer-core-1440x900-paper-sidebar-open.png
apps/tracer/test-results/core-screen/tracer-core-1440x900-paper-palette-open.png
apps/tracer/test-results/core-screen/tracer-core-1440x900-ink-sidebar-closed.png
apps/tracer/test-results/core-screen/tracer-core-1440x900-ink-sidebar-open.png
apps/tracer/test-results/core-screen/tracer-core-1440x900-ink-palette-open.png

Playwright gate output, verbatim: 15 passed (2.1m).
Fast gate output, verbatim summary:
+---------------------------+--------------+
| Rust gate | Result |
+---------------------------+--------------+
| fmt | PASS |
| clippy | PASS |
| test | PASS |
| cargo-deny | PASS |
| static builds | PASS |
+---------------------------+--------------+
dist/ghostty-web.js: OK
dist/ghostty-vt.wasm: OK
dist/index.d.ts: OK
7 pass
0 fail
34390 expect() calls
Ran 7 tests across 2 files. [2.69s]

Finished at f6f2c3c797e3a5f11842249b4004eb638f86ec2a. Self-review: pane card has no backdrop filter; responsive floating bar and touch targets are covered; live host/session are real and unavailable examples are labeled static; the existing tooltip installer covers icon-only controls with the d-pad exception; curated themes retain their contrast caps; mesh draws once and releases WebGL, with no second draw after 2.1 seconds; mobile tray and instant keyboard palette are covered; reduced motion and the 280 ms branch cap are covered. No rAF loop runs while idle. Performance on Linux 6.12.111 x86_64, 8 vCPUs. Baseline at load 4.24/3.41/5.20: p50/p99 14.80/15.70 ms, resume 77.40 ms. After, isolated 500-key run at load 1.56/3.26/4.94: 500/500 echoes, p50/p99 15.40/16.30 ms, resume 78.30 ms. Full suite run: 500/500, p50/p99 14.80/18.60 ms, resume 77.10 ms; p99 stayed below the existing 20 ms test bound while the renderer corpus ran. Production screenshots regenerated at this HEAD, 393x852 and 1440x900, paper and ink, sidebar closed/open and palette open: apps/tracer/test-results/core-screen/tracer-core-393x852-paper-sidebar-closed.png apps/tracer/test-results/core-screen/tracer-core-393x852-paper-sidebar-open.png apps/tracer/test-results/core-screen/tracer-core-393x852-paper-palette-open.png apps/tracer/test-results/core-screen/tracer-core-393x852-ink-sidebar-closed.png apps/tracer/test-results/core-screen/tracer-core-393x852-ink-sidebar-open.png apps/tracer/test-results/core-screen/tracer-core-393x852-ink-palette-open.png apps/tracer/test-results/core-screen/tracer-core-1440x900-paper-sidebar-closed.png apps/tracer/test-results/core-screen/tracer-core-1440x900-paper-sidebar-open.png apps/tracer/test-results/core-screen/tracer-core-1440x900-paper-palette-open.png apps/tracer/test-results/core-screen/tracer-core-1440x900-ink-sidebar-closed.png apps/tracer/test-results/core-screen/tracer-core-1440x900-ink-sidebar-open.png apps/tracer/test-results/core-screen/tracer-core-1440x900-ink-palette-open.png Playwright gate output, verbatim: `15 passed (2.1m)`. Fast gate output, verbatim summary: +---------------------------+--------------+ | Rust gate | Result | +---------------------------+--------------+ | fmt | PASS | | clippy | PASS | | test | PASS | | cargo-deny | PASS | | static builds | PASS | +---------------------------+--------------+ dist/ghostty-web.js: OK dist/ghostty-vt.wasm: OK dist/index.d.ts: OK 7 pass 0 fail 34390 expect() calls Ran 7 tests across 2 files. [2.69s]
Author
Owner

Start: branch t-web, base origin/dev 7174d6bf6f, starting head f6f2c3c797. Read CLAUDE.md, DECISIONS.md, docs/ARCHITECTURE.md, all 26 comments on #33 and all 3 comments on parent #14.

Start: branch t-web, base origin/dev 7174d6bf6f1880458a4166a2cf0fa45158d1742e, starting head f6f2c3c797e3a5f11842249b4004eb638f86ec2a. Read CLAUDE.md, DECISIONS.md, docs/ARCHITECTURE.md, all 26 comments on #33 and all 3 comments on parent #14.
Author
Owner

Finding: apps/tracer/src/core-screen.ts still renders two fabricated disabled tabs, two fabricated hosts/three sessions, inert palette rows, and 'Current host' (lines 66-76, 162-177, 233-251). apps/tracer/style.css:210-216 resets --overlay/--overlay-line/--shadow on .terminal-screen, masking applyTheme's dark values; the session model at t-server crates/infraternal-server/src/auth/sessions.rs:6-13 and POST /auth/session in auth/http.rs:226-228 expose no hostname. Will use the authenticated session response and keep the tracer auth module/tests untouched.

Finding: apps/tracer/src/core-screen.ts still renders two fabricated disabled tabs, two fabricated hosts/three sessions, inert palette rows, and 'Current host' (lines 66-76, 162-177, 233-251). apps/tracer/style.css:210-216 resets --overlay/--overlay-line/--shadow on .terminal-screen, masking applyTheme's dark values; the session model at t-server crates/infraternal-server/src/auth/sessions.rs:6-13 and POST /auth/session in auth/http.rs:226-228 expose no hostname. Will use the authenticated session response and keep the tracer auth module/tests untouched.
Author
Owner

Failing-test evidence before fixes: updated core-screen Playwright assertion failed on the current production build at apps/tracer/test/core-screen.spec.ts:135; expected server hostname 'infraternal-dev', received 'Current host · name unavailable'. The run used isolated TRACER_TEST_PORT=4183 (1 failed, 7.7s).

Failing-test evidence before fixes: updated core-screen Playwright assertion failed on the current production build at apps/tracer/test/core-screen.spec.ts:135; expected server hostname 'infraternal-dev', received 'Current host · name unavailable'. The run used isolated TRACER_TEST_PORT=4183 (1 failed, 7.7s).
Author
Owner

Build finding: the new server route test initially stopped in openssl-sys before project compilation because PATH omitted make. Found existing gnumake 4.4.1 at /nix/store/p5frwjlmkgj2987iy9plr7nav9l72xz4-gnumake-4.4.1/bin/make; rerunning with that path.

Build finding: the new server route test initially stopped in openssl-sys before project compilation because PATH omitted make. Found existing gnumake 4.4.1 at /nix/store/p5frwjlmkgj2987iy9plr7nav9l72xz4-gnumake-4.4.1/bin/make; rerunning with that path.
Author
Owner

Failing-test evidence before the server fix: t-server authenticated POST /auth/session route test now runs; 1 failed because the response had no hostname (expected gethostname()='infraternal-dev'). The baseline request authenticated successfully (HTTP 200).

Failing-test evidence before the server fix: t-server authenticated POST /auth/session route test now runs; 1 failed because the response had no hostname (expected gethostname()='infraternal-dev'). The baseline request authenticated successfully (HTTP 200).
Author
Owner

Finding: after token inheritance was fixed, the browser check showed .capsule still computed transparent: rgba(0,0,0,0) vs paper overlay rgb(251 251 251 / 0.72). The earlier :scope button reset (0,1,1) outranked .capsule (0,1,0); changed it to :where(.terminal-screen) button so the themed control rules apply.

Finding: after token inheritance was fixed, the browser check showed .capsule still computed transparent: rgba(0,0,0,0) vs paper overlay rgb(251 251 251 / 0.72). The earlier :scope button reset (0,1,1) outranked .capsule (0,1,0); changed it to :where(.terminal-screen) button so the themed control rules apply.
Author
Owner

Screenshot-run finding: the focused Playwright test timed out at its 30 s test limit after producing 8/12 screenshots; no assertion failed. It overlapped the server fast gate's vendored OpenSSL build (make/rustc active). Retaking the matrix after compilation settles.

Screenshot-run finding: the focused Playwright test timed out at its 30 s test limit after producing 8/12 screenshots; no assertion failed. It overlapped the server fast gate's vendored OpenSSL build (make/rustc active). Retaking the matrix after compilation settles.
Author
Owner

Server gate finding: clippy and cargo-deny passed. fmt failed on formatting in crates/infraternal-server/src/auth/http.rs. The workspace test stage failed 7 existing shim integration cases with ; static x86_64 build completed in 7m16s under CARGO_TARGET_DIR=/home/kayg/.cache/codex-scratch/issue33-server/target, then the checker looked for target/x86_64-unknown-linux-musl/release/infraternal and failed. I’m formatting the patch and rerunning from a scratch checkout so generated targets and relative runtime state stay under the permitted cache.

Server gate finding: clippy and cargo-deny passed. fmt failed on formatting in crates/infraternal-server/src/auth/http.rs. The workspace test stage failed 7 existing shim integration cases with ; static x86_64 build completed in 7m16s under CARGO_TARGET_DIR=/home/kayg/.cache/codex-scratch/issue33-server/target, then the checker looked for target/x86_64-unknown-linux-musl/release/infraternal and failed. I’m formatting the patch and rerunning from a scratch checkout so generated targets and relative runtime state stay under the permitted cache.
Author
Owner

Correction to my previous note: seven shim integration tests failed with the literal message shim socket: No such file or directory. The first issue comment dropped the word shim because shell command substitution consumed its backticks; the rest of the gate result is unchanged.

Correction to my previous note: seven shim integration tests failed with the literal message shim socket: No such file or directory. The first issue comment dropped the word shim because shell command substitution consumed its backticks; the rest of the gate result is unchanged.
Author
Owner

Server hostname slice committed as 37216316fc: both authenticated session endpoints now include hostname from gethostname; the authenticated route test matched the host OS name. Focused route test: 1 passed, 0 failed. Full workspace server tests: 56 passed, 4 ignored; shim tests 7 passed, 0 failed.

scripts/verify fast output from the scratch checkout containing this commit's source:
+---------------------------+--------------+
| Rust gate | Result |
+---------------------------+--------------+
| fmt | PASS |
| clippy | PASS |
| test | PASS |
| cargo-deny | PASS |
| static builds | PASS |
+---------------------------+--------------+

x86_64: static-pie linked; PT_INTERP absent; 14801824 bytes. aarch64: statically linked; PT_INTERP absent; 12391776 bytes. server and agent stubs: exit 2, not implemented.

TypeScript protocol output: 7 pass, 0 fail, 34390 expect() calls; 134 streams, 11439 schedules, zero divergences.

Server hostname slice committed as 37216316fc62c6e91563c295c8e4ad3560e575e6: both authenticated session endpoints now include hostname from gethostname; the authenticated route test matched the host OS name. Focused route test: 1 passed, 0 failed. Full workspace server tests: 56 passed, 4 ignored; shim tests 7 passed, 0 failed. scripts/verify fast output from the scratch checkout containing this commit's source: +---------------------------+--------------+ | Rust gate | Result | +---------------------------+--------------+ | fmt | PASS | | clippy | PASS | | test | PASS | | cargo-deny | PASS | | static builds | PASS | +---------------------------+--------------+ x86_64: static-pie linked; PT_INTERP absent; 14801824 bytes. aarch64: statically linked; PT_INTERP absent; 12391776 bytes. server and agent stubs: exit 2, not implemented. TypeScript protocol output: 7 pass, 0 fail, 34390 expect() calls; 134 streams, 11439 schedules, zero divergences.
Author
Owner

Finding from full Playwright run: the all-theme contrast test passed. The screenshot matrix saved 3 of 12 views (1440x900 Paper) then failed at ink .icon-btn material. Error evidence: apps/tracer/test-results/core-screen-core-screen-th-1b4b8-mobile-tray-and-screenshots/error-context.md reports received RGB 30,31,33 alpha 1 where the resting ink token was RGB 28,28,30 alpha 0.68. The pointer stayed over the toggle after the Paper loop, so :hover applied the solid hover color. I will move the pointer off the controls before checking resting materials and rerun the full suite.

Finding from full Playwright run: the all-theme contrast test passed. The screenshot matrix saved 3 of 12 views (1440x900 Paper) then failed at ink .icon-btn material. Error evidence: apps/tracer/test-results/core-screen-core-screen-th-1b4b8-mobile-tray-and-screenshots/error-context.md reports received RGB 30,31,33 alpha 1 where the resting ink token was RGB 28,28,30 alpha 0.68. The pointer stayed over the toggle after the Paper loop, so :hover applied the solid hover color. I will move the pointer off the controls before checking resting materials and rerun the full suite.
Author
Owner

Latency evidence from full Playwright run: 500/500 echoes painted, p50 14.20 ms, p99 30.50 ms, resume 83.70 ms. The existing #33 baseline is p50/p99 14.80/15.70 ms and resume 77.40 ms, so this sample does not establish within-noise p99. At run start the host load average was 15.88 on 8 vCPUs; other Chromium, Zig, Rust and shim benchmark processes were active. The test failed its unchanged p99 <20 ms gate; I will rerun when that load clears.

Latency evidence from full Playwright run: 500/500 echoes painted, p50 14.20 ms, p99 30.50 ms, resume 83.70 ms. The existing #33 baseline is p50/p99 14.80/15.70 ms and resume 77.40 ms, so this sample does not establish within-noise p99. At run start the host load average was 15.88 on 8 vCPUs; other Chromium, Zig, Rust and shim benchmark processes were active. The test failed its unchanged p99 <20 ms gate; I will rerun when that load clears.
Author
Owner

Production screenshot matrix passed: 2 Playwright tests; 12 images at 393x852 and 1440x900 for Paper/Ink, sidebar closed/open and palette open.

/home/kayg/Developer/infraternal/.worktrees/t-web/apps/tracer/test-results/core-screen/tracer-core-1440x900-paper-sidebar-closed.png
/home/kayg/Developer/infraternal/.worktrees/t-web/apps/tracer/test-results/core-screen/tracer-core-1440x900-paper-sidebar-open.png
/home/kayg/Developer/infraternal/.worktrees/t-web/apps/tracer/test-results/core-screen/tracer-core-1440x900-paper-palette-open.png
/home/kayg/Developer/infraternal/.worktrees/t-web/apps/tracer/test-results/core-screen/tracer-core-1440x900-ink-sidebar-closed.png
/home/kayg/Developer/infraternal/.worktrees/t-web/apps/tracer/test-results/core-screen/tracer-core-1440x900-ink-sidebar-open.png
/home/kayg/Developer/infraternal/.worktrees/t-web/apps/tracer/test-results/core-screen/tracer-core-1440x900-ink-palette-open.png
/home/kayg/Developer/infraternal/.worktrees/t-web/apps/tracer/test-results/core-screen/tracer-core-393x852-paper-sidebar-closed.png
/home/kayg/Developer/infraternal/.worktrees/t-web/apps/tracer/test-results/core-screen/tracer-core-393x852-paper-sidebar-open.png
/home/kayg/Developer/infraternal/.worktrees/t-web/apps/tracer/apps/tracer/test-results/core-screen/tracer-core-393x852-paper-palette-open.png
/home/kayg/Developer/infraternal/.worktrees/t-web/apps/tracer/test-results/core-screen/tracer-core-393x852-ink-sidebar-closed.png
/home/kayg/Developer/infraternal/.worktrees/t-web/apps/tracer/test-results/core-screen/tracer-core-393x852-ink-sidebar-open.png
/home/kayg/Developer/infraternal/.worktrees/t-web/apps/tracer/test-results/core-screen/tracer-core-393x852-ink-palette-open.png

Production screenshot matrix passed: 2 Playwright tests; 12 images at 393x852 and 1440x900 for Paper/Ink, sidebar closed/open and palette open. /home/kayg/Developer/infraternal/.worktrees/t-web/apps/tracer/test-results/core-screen/tracer-core-1440x900-paper-sidebar-closed.png /home/kayg/Developer/infraternal/.worktrees/t-web/apps/tracer/test-results/core-screen/tracer-core-1440x900-paper-sidebar-open.png /home/kayg/Developer/infraternal/.worktrees/t-web/apps/tracer/test-results/core-screen/tracer-core-1440x900-paper-palette-open.png /home/kayg/Developer/infraternal/.worktrees/t-web/apps/tracer/test-results/core-screen/tracer-core-1440x900-ink-sidebar-closed.png /home/kayg/Developer/infraternal/.worktrees/t-web/apps/tracer/test-results/core-screen/tracer-core-1440x900-ink-sidebar-open.png /home/kayg/Developer/infraternal/.worktrees/t-web/apps/tracer/test-results/core-screen/tracer-core-1440x900-ink-palette-open.png /home/kayg/Developer/infraternal/.worktrees/t-web/apps/tracer/test-results/core-screen/tracer-core-393x852-paper-sidebar-closed.png /home/kayg/Developer/infraternal/.worktrees/t-web/apps/tracer/test-results/core-screen/tracer-core-393x852-paper-sidebar-open.png /home/kayg/Developer/infraternal/.worktrees/t-web/apps/tracer/apps/tracer/test-results/core-screen/tracer-core-393x852-paper-palette-open.png /home/kayg/Developer/infraternal/.worktrees/t-web/apps/tracer/test-results/core-screen/tracer-core-393x852-ink-sidebar-closed.png /home/kayg/Developer/infraternal/.worktrees/t-web/apps/tracer/test-results/core-screen/tracer-core-393x852-ink-sidebar-open.png /home/kayg/Developer/infraternal/.worktrees/t-web/apps/tracer/test-results/core-screen/tracer-core-393x852-ink-palette-open.png
Author
Owner

Correction: the 393x852 Paper palette screenshot path is /home/kayg/Developer/infraternal/.worktrees/t-web/apps/tracer/test-results/core-screen/tracer-core-393x852-paper-palette-open.png. The previous list duplicated apps/tracer in that one path; the other eleven are correct.

Correction: the 393x852 Paper palette screenshot path is /home/kayg/Developer/infraternal/.worktrees/t-web/apps/tracer/test-results/core-screen/tracer-core-393x852-paper-palette-open.png. The previous list duplicated apps/tracer in that one path; the other eleven are correct.
Author
Owner

Rerunning the full browser suite with the hover assertion fixed: the core screenshot test passed and saved all 12 images. Existing onboarding.spec.ts then failed its no-layout-shifts assertion with one shift value 0.000009357216917438271 instead of an empty array; that auth test file and apps/tracer/src/auth.ts remain untouched. The host was still at load average 15.52 on 8 vCPUs at run start, with concurrent Chromium and Rust builds. I will rerun the full suite after contention drops.

Rerunning the full browser suite with the hover assertion fixed: the core screenshot test passed and saved all 12 images. Existing onboarding.spec.ts then failed its no-layout-shifts assertion with one shift value 0.000009357216917438271 instead of an empty array; that auth test file and apps/tracer/src/auth.ts remain untouched. The host was still at load average 15.52 on 8 vCPUs at run start, with concurrent Chromium and Rust builds. I will rerun the full suite after contention drops.
Author
Owner

Follow-up evidence: isolated onboarding.spec.ts rerun passed (1/1, 16.9s), with the auth tests and apps/tracer/src/auth.ts untouched. The full-suite layout-shift failure is intermittent under the shared workload; I am rerunning the entire suite.

Follow-up evidence: isolated onboarding.spec.ts rerun passed (1/1, 16.9s), with the auth tests and apps/tracer/src/auth.ts untouched. The full-suite layout-shift failure is intermittent under the shared workload; I am rerunning the entire suite.
Author
Owner

Full Playwright suite now passes: 16 passed in 2.1m. The core screen test passed all-theme contrast, token/material checks, placeholder/action assertions, and captured the 12 production PNGs (verified dimensions 1440x900 and 393x852).

500-key probe: 500/500 echoes; p50/p99 15.30/16.10 ms; resume 78.90 ms. Baseline on #33 was 14.80/15.70 ms and 77.40 ms, deltas +0.50/+0.40/+1.50 ms. This is within the prior local variation and below the existing p99 <20 ms gate. Machine: Linux 6.12.111 x86_64, 8 vCPUs. Load average at run start 9.83/13.34/16.56 and after run 5.56/9.99/14.76.

Full Playwright suite now passes: 16 passed in 2.1m. The core screen test passed all-theme contrast, token/material checks, placeholder/action assertions, and captured the 12 production PNGs (verified dimensions 1440x900 and 393x852). 500-key probe: 500/500 echoes; p50/p99 15.30/16.10 ms; resume 78.90 ms. Baseline on #33 was 14.80/15.70 ms and 77.40 ms, deltas +0.50/+0.40/+1.50 ms. This is within the prior local variation and below the existing p99 <20 ms gate. Machine: Linux 6.12.111 x86_64, 8 vCPUs. Load average at run start 9.83/13.34/16.56 and after run 5.56/9.99/14.76.
Author
Owner

Theme-material step committed in t-web as 4f93dd7f12. Overlay tokens now provide theme-derived glass, line and shadow values; the screen no longer overwrites them with light defaults, and the icon button retains its SVG and material. Automated contrast checks pass for every curated theme; the final screenshot matrix checks sidebar, palette, capsule, tabs and mobile key tray.

Theme-material step committed in t-web as 4f93dd7f121c9988db23a9b9083e2f36f6ccd8a9. Overlay tokens now provide theme-derived glass, line and shadow values; the screen no longer overwrites them with light defaults, and the icon button retains its SVG and material. Automated contrast checks pass for every curated theme; the final screenshot matrix checks sidebar, palette, capsule, tabs and mobile key tray.
Author
Owner

Real-host/core-screen step committed in t-web as 795acbba09. The UI now shows the authenticated server hostname and one live shell, with no seeded hosts, unavailable labels, Add hosts row or inert palette entries. The full Playwright suite passed 16/16 on this tree; the 500-key probe measured p50/p99 15.30/16.10 ms and 78.90 ms resume.

Real-host/core-screen step committed in t-web as 795acbba096cea56471b1fdc31c0bdd4b3a53c0e. The UI now shows the authenticated server hostname and one live shell, with no seeded hosts, unavailable labels, Add hosts row or inert palette entries. The full Playwright suite passed 16/16 on this tree; the 500-key probe measured p50/p99 15.30/16.10 ms and 78.90 ms resume.
Author
Owner

Finished. t-web HEAD 795acbba09; t-server HEAD 37216316fc. Both worktrees are clean. No push or deploy.

scripts/verify fast — t-web output:
+---------------------------+--------------+
| Rust gate | Result |
+---------------------------+--------------+
| fmt | PASS |
| clippy | PASS |
| test | PASS |
| cargo-deny | PASS |
| static builds | PASS |
+---------------------------+--------------+
dist/ghostty-web.js: OK
dist/ghostty-vt.wasm: OK
dist/index.d.ts: OK
stream differential: 134 streams, 11439 schedules, zero divergences
7 pass
0 fail
34390 expect() calls
Ran 7 tests across 2 files. [3.97s]

scripts/verify fast — t-server output, run from a temporary scratch worktree containing the exact committed source so all build and runtime state stayed under the cache:
+---------------------------+--------------+
| Rust gate | Result |
+---------------------------+--------------+
| fmt | PASS |
| clippy | PASS |
| test | PASS |
| cargo-deny | PASS |
| static builds | PASS |
+---------------------------+--------------+
x86_64: static-pie linked; PT_INTERP absent; size 14801824 bytes
aarch64: statically linked; PT_INTERP absent; size 12391776 bytes
server subcommand: exit 2, not implemented
agent subcommand: exit 2, not implemented
stream differential: 134 streams, 11439 schedules, zero divergences
7 pass
0 fail
34390 expect() calls
Ran 7 tests across 2 files. [4.94s]

Full cd apps/tracer && bun x playwright test: 16 passed (2.1m). 500-key probe: 500/500 echoes; p50/p99 15.30/16.10 ms; resume 78.90 ms. Against the #33 baseline 14.80/15.70 ms and 77.40 ms, deltas were +0.50/+0.40/+1.50 ms. Linux 6.12.111 x86_64, 8 vCPUs; load average at run start 9.83/13.34/16.56 and after run 5.56/9.99/14.76.

All 12 production screenshots are saved under /home/kayg/Developer/infraternal/.worktrees/t-web/apps/tracer/test-results/core-screen/ and were listed individually in the earlier comment. Dimensions are 1440x900 and 393x852 for Paper/Ink, sidebar closed/open and palette open.

Finished. t-web HEAD 795acbba096cea56471b1fdc31c0bdd4b3a53c0e; t-server HEAD 37216316fc62c6e91563c295c8e4ad3560e575e6. Both worktrees are clean. No push or deploy. scripts/verify fast — t-web output: +---------------------------+--------------+ | Rust gate | Result | +---------------------------+--------------+ | fmt | PASS | | clippy | PASS | | test | PASS | | cargo-deny | PASS | | static builds | PASS | +---------------------------+--------------+ dist/ghostty-web.js: OK dist/ghostty-vt.wasm: OK dist/index.d.ts: OK stream differential: 134 streams, 11439 schedules, zero divergences 7 pass 0 fail 34390 expect() calls Ran 7 tests across 2 files. [3.97s] scripts/verify fast — t-server output, run from a temporary scratch worktree containing the exact committed source so all build and runtime state stayed under the cache: +---------------------------+--------------+ | Rust gate | Result | +---------------------------+--------------+ | fmt | PASS | | clippy | PASS | | test | PASS | | cargo-deny | PASS | | static builds | PASS | +---------------------------+--------------+ x86_64: static-pie linked; PT_INTERP absent; size 14801824 bytes aarch64: statically linked; PT_INTERP absent; size 12391776 bytes server subcommand: exit 2, not implemented agent subcommand: exit 2, not implemented stream differential: 134 streams, 11439 schedules, zero divergences 7 pass 0 fail 34390 expect() calls Ran 7 tests across 2 files. [4.94s] Full cd apps/tracer && bun x playwright test: 16 passed (2.1m). 500-key probe: 500/500 echoes; p50/p99 15.30/16.10 ms; resume 78.90 ms. Against the #33 baseline 14.80/15.70 ms and 77.40 ms, deltas were +0.50/+0.40/+1.50 ms. Linux 6.12.111 x86_64, 8 vCPUs; load average at run start 9.83/13.34/16.56 and after run 5.56/9.99/14.76. All 12 production screenshots are saved under /home/kayg/Developer/infraternal/.worktrees/t-web/apps/tracer/test-results/core-screen/ and were listed individually in the earlier comment. Dimensions are 1440x900 and 393x852 for Paper/Ink, sidebar closed/open and palette open.
Author
Owner

Closed by the orchestrator during the 2026-10-28 handover (#254), on the owner's request to close finished issues. Evidence: Pane cards, branched tree and tooltips merged in 0c47cd42e (#33, #36) which is in dev and prod; production screenshots and gate posted. Reopen if anything is still missing.

Closed by the orchestrator during the 2026-10-28 handover (#254), on the owner's request to close finished issues. Evidence: Pane cards, branched tree and tooltips merged in 0c47cd42e (#33, #36) which is in dev and prod; production screenshots and gate posted. Reopen if anything is still missing.
kayg closed this issue 2026-10-28 17:52:23 +00:00
Sign in to join this conversation.
No labels
launch-qa
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
kayg/infraternal#33
No description provided.