Canvas structure: drag windows by the pill; how containers, VMs and Kubernetes fit #89

Open
opened 2026-10-08 06:26:17 +00:00 by kayg · 16 comments
Owner

Owner request (2026-10-08): hovering a window's pill shows a grab cursor and dragging it moves the window up, down, left or right. The canvas must stay structured (D119 tiling), never free-form or overlapping. Refine how the structured canvas fits the coming containers, VMs and Kubernetes areas.

Status: grill round 1 sent to the owner. No mockup until the answers are in (D162). TASTE row: f49e3ff.

Owner request (2026-10-08): hovering a window's pill shows a grab cursor and dragging it moves the window up, down, left or right. The canvas must stay structured (D119 tiling), never free-form or overlapping. Refine how the structured canvas fits the coming containers, VMs and Kubernetes areas. Status: grill round 1 sent to the owner. No mockup until the answers are in (D162). TASTE row: f49e3ff.
Author
Owner

Owner answers, round 1 (2026-10-08): Q1 a (columns) but with vertical scrolling too, and how do mesh arrows fit? Q2 agreed: very visual, intuitive, hand-holding. Q3 asked: is a strip a column? Q4 leaning b (everything is a canvas item; the window type decides what it can do). Q5 arrows stick to source and target windows with a satisfying snap/unsnap; wants it unified: could the topology be another cluster elsewhere on the canvas, with hover labels when zoomed out and a mobile equivalent? Nothing final. Q6 b (read-only live thumbnails below a zoom threshold). Round 2 sent.

Owner answers, round 1 (2026-10-08): Q1 a (columns) but with vertical scrolling too, and how do mesh arrows fit? Q2 agreed: very visual, intuitive, hand-holding. Q3 asked: is a strip a column? Q4 leaning b (everything is a canvas item; the window type decides what it can do). Q5 arrows stick to source and target windows with a satisfying snap/unsnap; wants it unified: could the topology be another cluster elsewhere on the canvas, with hover labels when zoomed out and a mobile equivalent? Nothing final. Q6 b (read-only live thumbnails below a zoom threshold). Round 2 sent.
Author
Owner

Owner, round 2: Q7 a (structured freeform; clusters snap and push, never overlap). Each cluster is a view; the current one is called Hosts. Views appear in the sidebar and in the command palette. Q8 onwards were unclear: re-explained in plain words, and a clusters mockup is being built (proto=clusters on top of demo-preview).

Owner, round 2: Q7 a (structured freeform; clusters snap and push, never overlap). Each cluster is a view; the current one is called Hosts. Views appear in the sidebar and in the command palette. Q8 onwards were unclear: re-explained in plain words, and a clusters mockup is being built (proto=clusters on top of demo-preview).
Author
Owner

proto-clusters started: branch proto-clusters, base demo-preview 4f60208. Building the ?proto=clusters concept mockup (6 scenes) in apps/tracer, preview on 10.69.69.125:47401.

proto-clusters started: branch proto-clusters, base demo-preview 4f60208. Building the ?proto=clusters concept mockup (6 scenes) in apps/tracer, preview on 10.69.69.125:47401.
Author
Owner

Owner, round 3: Q8 agreed (arrows always in Topology; in other views they appear faintly on pill hover or long-press; drag pill to window to grant, with a snap). The current view is renamed Console: every interactive session lives there (host shells now; container and VM shells and VNC/RDP sessions later). ⌘K → opens any session; keywords such as terminal, shell, ssh, remote desktop, vnc and rdp match too. Q9 confirmed (common frame for all kinds; only live windows split; list windows open items). Q10 asked to clarify: does a container's shell open beside the list in the Containers view, or in Console? Both are shown in the mockup (4a/4b). Q11: the views a user sees are determined by their grants.

Owner, round 3: Q8 agreed (arrows always in Topology; in other views they appear faintly on pill hover or long-press; drag pill to window to grant, with a snap). The current view is renamed **Console**: every interactive session lives there (host shells now; container and VM shells and VNC/RDP sessions later). ⌘K → <name> opens any session; keywords such as terminal, shell, ssh, remote desktop, vnc and rdp match too. Q9 confirmed (common frame for all kinds; only live windows split; list windows open items). Q10 asked to clarify: does a container's shell open beside the list in the Containers view, or in Console? Both are shown in the mockup (4a/4b). Q11: the views a user sees are determined by their grants.
Author
Owner

Owner, Q10: picking between 4a and 4b is confusing UX. Simpler flow (owner's idea): opening a shell from another view morphs the top capsule into a floating terminal, with a full-screen icon that moves it into Console (where the session lives), and the camera follows. Proposed detail: the session exists in Console from the start; × folds the float back into the capsule without ending the session. Navigation between views must be trivial: tap the capsule for a view list, ⌘K 'Go to …', ⌘1–9, sidebar rows. Mockup updated.

Owner, Q10: picking between 4a and 4b is confusing UX. Simpler flow (owner's idea): opening a shell from another view morphs the top capsule into a floating terminal, with a full-screen icon that moves it into Console (where the session lives), and the camera follows. Proposed detail: the session exists in Console from the start; × folds the float back into the capsule without ending the session. Navigation between views must be trivial: tap the capsule for a view list, ⌘K 'Go to …', ⌘1–9, sidebar rows. Mockup updated.
Author
Owner

proto-clusters finished. Branch proto-clusters, head f40c2ce (base demo-preview 4f60208). Preview: http://10.69.69.125:47401/?mock=1&proto=clusters (user unit clusters-preview). Scenes: 1 overview, 2 fly in plus palette open-by-name, 3 arrows on demand, 4 container shell as a floating terminal (capsule morph, aspect-locked resize, expand into Console, droplet split), 5 viewer/operator/new by grants, 6 structure. Captures (1440x900 and 393x852, ink and paper, plus mid-animation frames) are in the session scratchpad under clusters/. Browser specs: test/clusters.spec.ts (11) and test/canvas.spec.ts pass; test/palette-navigation.spec.ts fails on a 0.142 vs 0.13 ms handler timing under load (code not touched). scripts/verify fast: EXIT 0. Transfer budget lines:
==> Tracer compiler, precompression and bundle transfer budget
bun install v1.4.2 (744846f84)
Checked 38 installs across 69 packages (no changes) [2.00ms]
$ bun x tsc --project tsconfig.json
bun test v1.4.2 (744846f84)
20 pass
0 fail
376 expect() calls
Ran 20 tests across 6 files. [171.00ms]
$ bun run build.ts
built chunk-fh412cqf.js, main.js, chunk-p37dqphn.js, chunk-10x530vx.js, chunk-1sbmtftf.js, chunk-vh87yz4v.js, chunk-3r6rn4b0.js, chunk-fwh3x
chunk-9t6bwpm2.js: identity=27845 gzip=10061 brotli=9128 bytes
chunk-10x530vx.js: identity=6464 gzip=3104 brotli=2808 bytes
chunk-p37dqphn.js: identity=7799 gzip=3332 brotli=2970 bytes
faulty-terminal.worker.js: identity=1021 gzip=534 brotli=458 bytes
backdrop.worker.js: identity=241 gzip=212 brotli=158 bytes
chunk-axbkkqp1.js: identity=90 gzip=90 brotli=78 bytes
chunk-fh412cqf.js: identity=2576 gzip=1216 brotli=1039 bytes
chunk-se2wac4s.js: identity=41 gzip=41 brotli=41 bytes
chunk-1sbmtftf.js: identity=19047 gzip=6951 brotli=6093 bytes
chunk-zy7qh5hc.js: identity=185 gzip=153 brotli=129 bytes
chunk-cvsdqbkx.js: identity=23204 gzip=8151 brotli=7227 bytes
chunk-ssfa2aaz.js: identity=9549 gzip=3884 brotli=3341 bytes
chunk-3r6rn4b0.js: identity=2628 gzip=1262 brotli=1079 bytes
chunk-kq01rswt.js: identity=705766 gzip=204593 brotli=165819 bytes
chunk-vh87yz4v.js: identity=15305 gzip=6602 brotli=5663 bytes
main.js: identity=87625 gzip=32214 brotli=28072 bytes
chunk-fwh3xdfd.js: identity=36973 gzip=12484 brotli=11145 bytes
JavaScript transfer: identity=946359 gzip=294884/307200 brotli=245248/256000 bytes
==> Rust stream oracle (for the differential test)
==> TypeScript protocol tests
bun test v1.4.2 (744846f84)
src/stream.test.ts:
stream differential: 134 streams, 11439 schedules, zero divergences
7 pass
0 fail
34390 expect() calls
Ran 7 tests across 2 files. [3.27s]
EXIT 0

proto-clusters finished. Branch proto-clusters, head f40c2ce (base demo-preview 4f60208). Preview: http://10.69.69.125:47401/?mock=1&proto=clusters (user unit clusters-preview). Scenes: 1 overview, 2 fly in plus palette open-by-name, 3 arrows on demand, 4 container shell as a floating terminal (capsule morph, aspect-locked resize, expand into Console, droplet split), 5 viewer/operator/new by grants, 6 structure. Captures (1440x900 and 393x852, ink and paper, plus mid-animation frames) are in the session scratchpad under clusters/. Browser specs: test/clusters.spec.ts (11) and test/canvas.spec.ts pass; test/palette-navigation.spec.ts fails on a 0.142 vs 0.13 ms handler timing under load (code not touched). scripts/verify fast: EXIT 0. Transfer budget lines: ==> Tracer compiler, precompression and bundle transfer budget bun install v1.4.2 (744846f84) Checked 38 installs across 69 packages (no changes) [2.00ms] $ bun x tsc --project tsconfig.json bun test v1.4.2 (744846f84) 20 pass 0 fail 376 expect() calls Ran 20 tests across 6 files. [171.00ms] $ bun run build.ts built chunk-fh412cqf.js, main.js, chunk-p37dqphn.js, chunk-10x530vx.js, chunk-1sbmtftf.js, chunk-vh87yz4v.js, chunk-3r6rn4b0.js, chunk-fwh3x chunk-9t6bwpm2.js: identity=27845 gzip=10061 brotli=9128 bytes chunk-10x530vx.js: identity=6464 gzip=3104 brotli=2808 bytes chunk-p37dqphn.js: identity=7799 gzip=3332 brotli=2970 bytes faulty-terminal.worker.js: identity=1021 gzip=534 brotli=458 bytes backdrop.worker.js: identity=241 gzip=212 brotli=158 bytes chunk-axbkkqp1.js: identity=90 gzip=90 brotli=78 bytes chunk-fh412cqf.js: identity=2576 gzip=1216 brotli=1039 bytes chunk-se2wac4s.js: identity=41 gzip=41 brotli=41 bytes chunk-1sbmtftf.js: identity=19047 gzip=6951 brotli=6093 bytes chunk-zy7qh5hc.js: identity=185 gzip=153 brotli=129 bytes chunk-cvsdqbkx.js: identity=23204 gzip=8151 brotli=7227 bytes chunk-ssfa2aaz.js: identity=9549 gzip=3884 brotli=3341 bytes chunk-3r6rn4b0.js: identity=2628 gzip=1262 brotli=1079 bytes chunk-kq01rswt.js: identity=705766 gzip=204593 brotli=165819 bytes chunk-vh87yz4v.js: identity=15305 gzip=6602 brotli=5663 bytes main.js: identity=87625 gzip=32214 brotli=28072 bytes chunk-fwh3xdfd.js: identity=36973 gzip=12484 brotli=11145 bytes JavaScript transfer: identity=946359 gzip=294884/307200 brotli=245248/256000 bytes ==> Rust stream oracle (for the differential test) ==> TypeScript protocol tests bun test v1.4.2 (744846f84) src/stream.test.ts: stream differential: 134 streams, 11439 schedules, zero divergences 7 pass 0 fail 34390 expect() calls Ran 7 tests across 2 files. [3.27s] EXIT 0
Author
Owner

Owner on the clusters mockup: likes all the animations, but it must be rebuilt on the existing app aesthetics (approving a divergent look would derail it). Structured freeform = snap by default: selecting a view or flying in lands snapped; swipe/scroll moves window to window (horizontal between columns, vertical within); no zoom while snapped; a snap toggle in the toolbar, auto-on when switching views. Remove the bottom band. Rebuild in progress on proto-clusters on top of demo-preview.

Owner on the clusters mockup: likes all the animations, but it must be rebuilt on the existing app aesthetics (approving a divergent look would derail it). Structured freeform = snap by default: selecting a view or flying in lands snapped; swipe/scroll moves window to window (horizontal between columns, vertical within); no zoom while snapped; a snap toggle in the toolbar, auto-on when switching views. Remove the bottom band. Rebuild in progress on proto-clusters on top of demo-preview.
Author
Owner

Owner, multiplexer round (2026-10-08): Q20 a split always creates a new shell, no prompt; the session manager is one tap away (an icon at the top right of each window on desktop, an action in the mobile canvas row). Q21 a split is a new window in the same structure, no nesting, animated as a water droplet dividing into two (springy, sticky, lots of motion). Q22 closing a window never ends the session. Q23 per-window header icon, plus every session on every host in ⌘K, plus the session manager action in the mobile toolbar. Q24 attached and detached sessions are shown intuitively in the host view (to confirm: the sidebar host tree), not in Console.

Owner, multiplexer round (2026-10-08): Q20 a split always creates a new shell, no prompt; the session manager is one tap away (an icon at the top right of each window on desktop, an action in the mobile canvas row). Q21 a split is a new window in the same structure, no nesting, animated as a water droplet dividing into two (springy, sticky, lots of motion). Q22 closing a window never ends the session. Q23 per-window header icon, plus every session on every host in ⌘K, plus the session manager action in the mobile toolbar. Q24 attached and detached sessions are shown intuitively in the host view (to confirm: the sidebar host tree), not in Console.
Author
Owner

Owner answers (sessions and sidebar): all recommendations agreed with these notes — size follows the last-typed device automatically, never manual; names are automatic (later inferred) and are the window name; ordering by frecency; per-device camera plus handoff; add Settings → Devices to see all devices. 'Shared' state waits for multi-user. Recorded as D178.

Owner answers (sessions and sidebar): all recommendations agreed with these notes — size follows the last-typed device automatically, never manual; names are automatic (later inferred) and are the window name; ordering by frecency; per-device camera plus handoff; add Settings → Devices to see all devices. 'Shared' state waits for multi-user. Recorded as D178.
Author
Owner

proto-clusters rebuilt on the real app chrome (head 30d0919, demo-preview merged at 712701a). Canvas lock + input lock, two-row toolbar (#91), Settings Toolbar/Shortcuts, top-pill swipe, floating terminal kept. scripts/verify fast: EXIT 0, JavaScript transfer gzip=304957/307200 brotli=254518/256000. Specs: clusters.spec.ts (20) green, canvas/keytray-modifiers/add-host green. WebKit could not run here (missing glibc 2.44 libs for the nix-provided deps); safe areas verified in Chromium with Emulation.setSafeAreaInsetsOverride 59/34 only. Preview http://10.69.69.125:47401/?mock=1&proto=clusters

proto-clusters rebuilt on the real app chrome (head 30d0919, demo-preview merged at 712701a). Canvas lock + input lock, two-row toolbar (#91), Settings Toolbar/Shortcuts, top-pill swipe, floating terminal kept. scripts/verify fast: EXIT 0, JavaScript transfer gzip=304957/307200 brotli=254518/256000. Specs: clusters.spec.ts (20) green, canvas/keytray-modifiers/add-host green. WebKit could not run here (missing glibc 2.44 libs for the nix-provided deps); safe areas verified in Chromium with Emulation.setSafeAreaInsetsOverride 59/34 only. Preview http://10.69.69.125:47401/?mock=1&proto=clusters
Author
Owner

Round finished on proto-clusters, head f2c7d62 (preview: http://10.69.69.125:47501/?mock=1&proto=clusters).

Commits: 6e16bf5 ws close 4002 (1002 is forbidden for script; the frame that triggered it could not be reproduced), e9b5546 lock pure CSS at the exact centre, 01d4c0e descenders, 4a243ea split right and split down, 2c278fd canvas lock off stays in place, 3fa4460 dots on the gradient + zoom restyle fix, cdddcb4 Mesh grants edited by dragging, 4085d61 merge of demo-preview (dev f27b3fe sign-in), 0fc4b52 key tray spec grants clipboard permission, f2c7d62.

Gate, scripts/verify fast (verbatim table; the Rust test is agent_review::repeated_tiny_credit_pauses_preserve_shell_progress, timing based, no Rust file differs from dev, and the machine was at load 10 to 50 on 8 cores):
| Rust gate | Result |
| fmt | PASS |
| VT native fmt | PASS |
| clippy | PASS |
| test | FAIL (101) |
| cargo-deny | PASS |
| static builds | PASS |
TypeScript: bun run check clean. Playwright (clusters, core-screen, canvas, font-picker, keytray-modifiers, onboarding): 79 passed, 4 failed in one loaded run; the two toolbar specs pass alone (load flake), keytray-modifiers fixed in 0fc4b52, onboarding.spec.ts:54 also fails on demo-preview f56aebe (not from this branch).
Production JavaScript transfer budget: gzip 307837/307200, brotli 256767/256000 (demo-preview alone: 299729 / 249599). The overshoot comes from the shared two-row tray and toolbar edit mode (#91) in core-screen; needs the owner's call (raise or trim).

Frame times (apps/tracer/test/clusters-frames.spec.ts, 1440x900, scene 7, 2 s wheel gesture, renderer+GPU CPU; machine loaded so ranges): zoom 1x frames 56-84 -> 88-104, p50 33 -> 16.7 ms, CPU 3740-4680 -> 2740-3270 ms; zoom 4x p50 117-133 -> 16.7 ms, p95 167-217 -> 67-117 ms. Pan unchanged (compositor-only; software compositing in the test browser dominates). Real-GPU 60 fps is NOT verified.

Round finished on proto-clusters, head f2c7d62 (preview: http://10.69.69.125:47501/?mock=1&proto=clusters). Commits: 6e16bf5 ws close 4002 (1002 is forbidden for script; the frame that triggered it could not be reproduced), e9b5546 lock pure CSS at the exact centre, 01d4c0e descenders, 4a243ea split right and split down, 2c278fd canvas lock off stays in place, 3fa4460 dots on the gradient + zoom restyle fix, cdddcb4 Mesh grants edited by dragging, 4085d61 merge of demo-preview (dev f27b3fe sign-in), 0fc4b52 key tray spec grants clipboard permission, f2c7d62. Gate, scripts/verify fast (verbatim table; the Rust test is `agent_review::repeated_tiny_credit_pauses_preserve_shell_progress`, timing based, no Rust file differs from dev, and the machine was at load 10 to 50 on 8 cores): | Rust gate | Result | | fmt | PASS | | VT native fmt | PASS | | clippy | PASS | | test | FAIL (101) | | cargo-deny | PASS | | static builds | PASS | TypeScript: `bun run check` clean. Playwright (clusters, core-screen, canvas, font-picker, keytray-modifiers, onboarding): 79 passed, 4 failed in one loaded run; the two toolbar specs pass alone (load flake), keytray-modifiers fixed in 0fc4b52, onboarding.spec.ts:54 also fails on demo-preview f56aebe (not from this branch). Production JavaScript transfer budget: gzip 307837/307200, brotli 256767/256000 (demo-preview alone: 299729 / 249599). The overshoot comes from the shared two-row tray and toolbar edit mode (#91) in core-screen; needs the owner's call (raise or trim). Frame times (apps/tracer/test/clusters-frames.spec.ts, 1440x900, scene 7, 2 s wheel gesture, renderer+GPU CPU; machine loaded so ranges): zoom 1x frames 56-84 -> 88-104, p50 33 -> 16.7 ms, CPU 3740-4680 -> 2740-3270 ms; zoom 4x p50 117-133 -> 16.7 ms, p95 167-217 -> 67-117 ms. Pan unchanged (compositor-only; software compositing in the test browser dominates). Real-GPU 60 fps is NOT verified.
Author
Owner

canvas-product, step 1 (structure) done. Branch canvas-product, base dev f27b3fe. Merged demo-preview and proto-clusters (f2c7d62). The 2,400-line mockup controller is now modules under apps/tracer/src/canvas with adapters; mock scaffolding is under canvas/mock behind ?mock=1&proto=clusters and out of the production bundle. Head da93a2a (modules) and bdfcad2 (README + unit tests). Module map and adapter table: apps/tracer/src/canvas/README.md. Gate: bun run check clean; bun test src/canvas 12 pass; playwright clusters.spec 38/38 and canvas.spec 37/37 against the test double. Finding: the gzip JS transfer gate fails already at proto-clusters (307,840 > 307,200); the gate counts all chunks, lazy or not, so lazy loading alone cannot satisfy it. Not raising the budget; needs an owner decision (critical-path vs deferred accounting). Finding: server caps 32 terminal_writers rows per websocket connection and never deletes them on stream Close, so a long-lived page that opens and closes more than 32 windows hits the cap; client-side workaround planned (rotate the connection).

canvas-product, step 1 (structure) done. Branch canvas-product, base dev f27b3fe. Merged demo-preview and proto-clusters (f2c7d62). The 2,400-line mockup controller is now modules under apps/tracer/src/canvas with adapters; mock scaffolding is under canvas/mock behind ?mock=1&proto=clusters and out of the production bundle. Head da93a2a (modules) and bdfcad2 (README + unit tests). Module map and adapter table: apps/tracer/src/canvas/README.md. Gate: bun run check clean; bun test src/canvas 12 pass; playwright clusters.spec 38/38 and canvas.spec 37/37 against the test double. Finding: the gzip JS transfer gate fails already at proto-clusters (307,840 > 307,200); the gate counts all chunks, lazy or not, so lazy loading alone cannot satisfy it. Not raising the budget; needs an owner decision (critical-path vs deferred accounting). Finding: server caps 32 terminal_writers rows per websocket connection and never deletes them on stream Close, so a long-lived page that opens and closes more than 32 windows hits the cap; client-side workaround planned (rotate the connection).
Author
Owner

iOS memory fix on canvas-design (db7b5a8, from canvas-product bdfcad2; preview unit now serves canvas-design on 47501). Viewport-sized backdrop (<=2 layers), far views visibility:hidden + setVisible(false), terminal canvas released to 0x0 when hidden/far and redrawn from state, one GL context at a time and ended on hide, world hidden on pagehide/visibilitychange. 393x852 DPR3 (test/clusters-memory.spec.ts), MB device px: scene 1 raw layers 20812 -> 392 (near-screen 54); Mesh 628 -> 164 (near 90); hidden page 29.9, canvas 0x0. One canvas (912x1275). Specs: clusters+canvas 72 pass, 2 load flakes pass alone. Not verified on a real iPhone/Safari.

iOS memory fix on canvas-design (db7b5a8, from canvas-product bdfcad2; preview unit now serves canvas-design on 47501). Viewport-sized backdrop (<=2 layers), far views visibility:hidden + setVisible(false), terminal canvas released to 0x0 when hidden/far and redrawn from state, one GL context at a time and ended on hide, world hidden on pagehide/visibilitychange. 393x852 DPR3 (test/clusters-memory.spec.ts), MB device px: scene 1 raw layers 20812 -> 392 (near-screen 54); Mesh 628 -> 164 (near 90); hidden page 29.9, canvas 0x0. One canvas (912x1275). Specs: clusters+canvas 72 pass, 2 load flakes pass alone. Not verified on a real iPhone/Safari.
Author
Owner

canvas-product step 2 progress (head f224e80). After sign-in production shows the canvas: Console on real sessions (one MuxConnection, one TerminalClient stream per window), Settings view with the sections that exist, layout persisted per account via the document store adapter. D188 budget gate landed (critical 280,606 B gzip / 232,600 B brotli of 307,200 / 256,000; deferred 47,188 / 40,894 of 51,200 / 45,056). Real-server specs (production binary, real PTYs; apps/tracer/real): 9/9 pass: open from palette, one websocket with two streams and separate output, close leaves the session alive (second socket attaches and runs a command), split + re-tile, reload re-attaches the same sessions, connection rotation after 34 open/close cycles (server caps 32 writer rows per connection), frames at 1x/4x, memory at 393x852 DPR3 (canvases 13.8 MB, off-screen terminals 0x0, layers 31.2 MB). Test-double suite 243: 199 pass; the failures are load flakes or fail the same way on the merge baseline abc2439 (recovery-ui-hold x4, motion-audit, terminal.spec x2, droplet); re-run of the rest: 58 pass.

canvas-product step 2 progress (head f224e80). After sign-in production shows the canvas: Console on real sessions (one MuxConnection, one TerminalClient stream per window), Settings view with the sections that exist, layout persisted per account via the document store adapter. D188 budget gate landed (critical 280,606 B gzip / 232,600 B brotli of 307,200 / 256,000; deferred 47,188 / 40,894 of 51,200 / 45,056). Real-server specs (production binary, real PTYs; apps/tracer/real): 9/9 pass: open from palette, one websocket with two streams and separate output, close leaves the session alive (second socket attaches and runs a command), split + re-tile, reload re-attaches the same sessions, connection rotation after 34 open/close cycles (server caps 32 writer rows per connection), frames at 1x/4x, memory at 393x852 DPR3 (canvases 13.8 MB, off-screen terminals 0x0, layers 31.2 MB). Test-double suite 243: 199 pass; the failures are load flakes or fail the same way on the merge baseline abc2439 (recovery-ui-hold x4, motion-audit, terminal.spec x2, droplet); re-run of the rest: 58 pass.
Author
Owner

canvas-design f4bff95 (preview 47501): approved transparency tables (cards Tinted default, windows Solid default; Frosted rename), Plain/Soft/Mesh backgrounds (Soft default), header actions as one pill (phone too), keyboard rule (key row only while a terminal has input focus; toolbar taps never focus; canvas press blurs the terminal), Mockup: transparency scene, ghost-text audit (DPR 3 leaks 0.04-0.08 at Clear/Frosted view switcher and toasts), contrast audit (Solid/Tinted pass 4.5:1; Clear/Frosted below on worst-case backdrop, values unchanged), font-switch spec (font reaches UI, window bodies and terminal in Chromium; iPhone cause not reproduced). Per-level frame benchmarks deferred. Spec runs under machine load 30-50 had load flakes; re-run singly they pass.

canvas-design f4bff95 (preview 47501): approved transparency tables (cards Tinted default, windows Solid default; Frosted rename), Plain/Soft/Mesh backgrounds (Soft default), header actions as one pill (phone too), keyboard rule (key row only while a terminal has input focus; toolbar taps never focus; canvas press blurs the terminal), Mockup: transparency scene, ghost-text audit (DPR 3 leaks 0.04-0.08 at Clear/Frosted view switcher and toasts), contrast audit (Solid/Tinted pass 4.5:1; Clear/Frosted below on worst-case backdrop, values unchanged), font-switch spec (font reaches UI, window bodies and terminal in Chromium; iPhone cause not reproduced). Per-level frame benchmarks deferred. Spec runs under machine load 30-50 had load flakes; re-run singly they pass.
Author
Owner

canvas-product step 2 finished, head 631331f. Gates: bun run check clean; bun test (src/canvas + chunk-classes) pass; scripts/verify fast: Rust all pass except auth::tests::socket_tests::recovery_subscription_updates_every_signed_in_socket, which fails under load (load avg 15-28 on 8 cores) and passes alone; TS part (tsc, bundle, transfer budget critical 280,600/307,200 B gzip and 232,629/256,000 B brotli, deferred 47,173/51,200 and 40,874/45,056, protocol tests) passes. Real-server specs 9/9 (apps/tracer/real). Latency gate (scripts/verify latency, load avg 15-27): baseline keystroke echo p99 330.5 ms vs 334 budget PASS; the flood-isolation metrics FAIL under that load (Rust path untouched by this branch). Frames at 1x/4x CPU on the real page (load avg 14-20): zoom p50 16.7 ms, p95 50/117 ms; pan p50 16.7 ms, p95 33/50 ms; the mock baseline on the same machine at the same time had pan p50 83 ms. Memory at 393x852 DPR3: canvases 13.8 MB (off-screen terminals 0x0), layers 31.2 MB.

canvas-product step 2 finished, head 631331f. Gates: bun run check clean; bun test (src/canvas + chunk-classes) pass; scripts/verify fast: Rust all pass except auth::tests::socket_tests::recovery_subscription_updates_every_signed_in_socket, which fails under load (load avg 15-28 on 8 cores) and passes alone; TS part (tsc, bundle, transfer budget critical 280,600/307,200 B gzip and 232,629/256,000 B brotli, deferred 47,173/51,200 and 40,874/45,056, protocol tests) passes. Real-server specs 9/9 (apps/tracer/real). Latency gate (scripts/verify latency, load avg 15-27): baseline keystroke echo p99 330.5 ms vs 334 budget PASS; the flood-isolation metrics FAIL under that load (Rust path untouched by this branch). Frames at 1x/4x CPU on the real page (load avg 14-20): zoom p50 16.7 ms, p95 50/117 ms; pan p50 16.7 ms, p95 33/50 ms; the mock baseline on the same machine at the same time had pan p50 83 ms. Memory at 393x852 DPR3: canvases 13.8 MB (off-screen terminals 0x0), layers 31.2 MB.
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#89
No description provided.