Canvas streams: per-window stream visibility (live, marker-only, thumbnail) over the one WebSocket (D183 B1/B2) #107
Open
opened 2026-10-08 13:27:30 +00:00 by kayg
·
113 comments
No Branch/Tag specified
main
j470b-server-mesh-rejoin
mesh-compat-382
j444b-d381-key-wins-flood
j461b-macos-utun-reader-thread
j475b-remove-host-motion
fix-reconnect-new-link
j481-d380
dev
j479-mesh-soak
fix/j476-host-facts
j475-motion-pill-split
j470-mac-node-join
root-upgrade-d376
j474-review-merge
latency-targets-120hz
nightly-suite-shards
gotatun-pin-j469
macos-utun-reader-thread
fix-flood-echo-stall
wip/j416
motion-fast-ease-out
mesh-addhost-j259
takeover-close-terminals-d368
kbd-instant-followups
fix-trust-key-double-click
nightly-suite-partial-report
appwin-icons-j207
rusqlite-slice1
swipe-content-first-d374
mesh-mtu-381
addhost-instant-open
glass-contrast-d365-mock
glass-contrast-d365
signout-followups-442
fix-startup-toast-red
research-gotatun-matrix-j317
themes-sync-j304
fix-load-flakes
fix-nix-zig-patch
fix-compute01-browser-baseline
ratchet-size-baseline-419
predict-auto-d130
revoke-coverage-d367
nightly-suite-queue-timeout
nightly-browser-suite
fix-rustsec-2026-0459
fonts-ioskeley-obel
log-retention-d375
fix-kbd-no-anim-427
fix-dev-red-specs-2
takeover-proof-305-j205
wip/j410-server-pump
ui-consistency-d372
fix-osc52-clipboard
libghostty-vt-1.0
forget-retired-host-d369
j404-merge-426
fix-setup-lock-race
fix-touch-select-426
revoke-access-report-ui
fix-predictive-echo-specs
fix-selinux-agent-exec
wip/j395-checkpoint2
wip/j395
j391-review-scratch
ui-consistency-j195-deferred-rebased
fix-rustc-paths-421
decisions-wording-341
fix-install-suite-red
fix-dev-rtt-specs
fix-pending-removal-align
fix-privileged-skip
fix-install-suite-404
review-j368
mesh-dns-j254
revoke-access-report-d356b
revoke-privilege-round5
fix-removal-confirm
review-j360
gotatun-rotation-367
deps-refresh-340
review-j354
review-J351
review-j350
addhost-takeover-d359
revoke-report-items-347
revoke-end-sessions-d362
review-j348
size-mesh-ssh-346
size-trim-337
revoke-access-diff-d356
j259-pre-rebase-b06c5a6
j305-ended-at-start-spec
addhost-sudo-consent
fix-layout-real-specs-411
fix-shell-open-411
fix-console-hosts-373
fix-shell-exit
fuzz-host-name-353
fix-host-details-410
macos-filter-j197
research-gotatun-tricks
revoke-p3-j216l
stale-state-pill
revoke-followups-j216k
revoke-progress-j216e
backup/macos01-20261106/lume/j197
backup/macos01-20261106/lume/appwin-icons-j207-stash0
backup/macos01-20261106/claude/stash-0
backup/macos01-20261106/claude/stash-1
backup/macos01-20261106/claude/J80-macos-s1
backup/macos01-20261106/claude/J80
backup/macos01-20261106/claude/J80-slice1-20261102
backup/macos01-20261106/claude/J16b-appwin-on-dev
backup/macos01-20261106/claude/appwin-launch-idle-146
backup/macos01-20261106/claude/J80-s1-run
wip/j259
trust-285-p3c
runtime-lock-j216f
mesh-ssh-p3-j175
tun-proof-p3b
trust-285-p3
terminal-polish-j271
tun-proof-p3
ssh-install-flakes-j216i
fuzz-fixes-j264
trust-285-a
trust-285-b
restart-oversized-fixture-j198
backup/macos01-20261106/lume/appwin-icons-j207
restart-bound-j216h
up-preflight-p3-j198
backup/macos01-20261106/lume/j251
up-preflight-j198
wip/up-preflight-j198-j245-p2
wip/up-preflight-j198-j245-p1
agent-fsync-offloop-j196
wip/up-preflight-j198-j245
settings-offscreen-j231
wip/up-preflight-j198-j226-inspection
wip/j103f
themes-j206
wip/up-preflight-j198-j226
flakes-j216c
backup/macos01-20261106/claude/j197
flakes-j216b
backup/macos01-20261106/claude/j197-red
wip/up-preflight-j198-review
flakes-j216
backup/macos01-20261106/claude/appwin-icons-j207
engineering-j208b
appwin-mock-j209
toast-stack-j165
engineering-j208
decisions-d351
decisions-d350
decisions-d349
appearance-presets-mock-j129
decisions-d348
docs-audit-spec
doc-coverage-baseline-raise
decisions-d347
decisions-d346b
decisions-d346
j88h-profile
ui-consistency-j195-deferred
ui-consistency-j195
engineering-practices-j194
preferred-login-ui-j166
signin-pools-263-j174
macos-node-265-s1
decisions-d345
decisions-d344
proxy-cgroup-j164
verify-quick-fuzz-329
proxy-start-io-j168
timing-flakes-j163
up-263-s1
mcp-events-j147
verify-quick-fuzz-j158
proxy-p3-j159
agent-resource-j157-detect
wip/j103d-final
remote-cancel-hang-j155
proxy-traefik-281-j62d
j149-verify-quick
proxy-traefik-281-j62b
j150-drop-unnamed
wip/j79d-red-r4
wip/j103d-d332
rootless-toast-j142
wip/j103d-head
wip/j103d
j125c-mcp
macos-build-j136
backup/macos01-20261106/claude/j136
wip/j79d-red-cli
wip/j79d-red-server
j121-link-liveness
j118c-tracer-failures
wip/j79c-head
release-desktop-j131
j124c-signed-macos
wip/j79c-red-p3
wip/j79c-red-p23
wip/j79c-red-p22
merge-j128-check
perf-deferred-j128
sidebar-toggle-260
j127-shortcut-changed-dot
j125-mcp
j118-tracer-failures
j126-account-summary
settings-sections-mock-j92
j120-pinch-lock
sidebar-292
backup/macos01-20261106/claude/j120
taste-2026-11-03
row-actions-242-215
backup/macos01-20261106/claude/stash-0-untracked
backup/macos01-20261106/claude/J80-265-s1-run
backup/macos01-20261106/claude/J80-macos-s1-20261102
j112-canvas-commands
ui-no-overshoot-scroll
fix-recovery-restart
backup/macos01-20261106/claude/stash-1-untracked
taste-2026-11-02
size-baseline-ratchet
machine-cards-structure-j108
j109-boot-copy-mockups
fix-dev-red
wip/up-263-s1
j95b-settings-rows
proxy-traefik-281
j95-option-rows
docs-human-j91
docs-keys-palette
fix-flood-1013-270-j38d
mesh-ssh-s1
mesh-ssh-s0
addhost-d291-tunnel
test-stability-load
mesh-relay-220
repro-296
shim-thp-off-24
mesh-pins-258-v2
mesh-dns
signin-d311-merged
docs-pages
ui-size-283
fix-ui-batch-specs
wip/j12b-edge-update
gate-on-arm
fix-rename-sync-293
trust-285-j60b
fix-focus-ring-clip
integ-ui-1101
edge-update-v2
signin-d311
taste-2026-11-01
layout-per-tab-250
ui-approved-splitopt-224
ui-approved-splitopt-224-on-dev
icon-text-centre-282
ui-approved-189-212-216
research-reverse-proxy
transfer-budget-320
review-mesh-pins-258-r2
sidebar-pill-259
review-mesh-relay-220
wip/j12-edge-update-v2
nix-package
status-crash-loop-237
fix-dev-test-failures
fix-fixture-socket-path
wip/mesh-relay-220-pre-dev-advance-rebase
fix-canvas-side-clip
research-head-to-head
frosted-real-256
review-mesh-pins-258
wip/mesh-relay-220-pre-final-rebase
review-layout-per-tab-250-r2
broad-suite-triage
nix-devshell
review-status-crash-loop-237-r3
wip/nix-devshell-pre-p3
taste-frosted-real
wip/code-serve-demo-2026-10-30
wip/code-serve-glass-2026-10-30
wip/code-serve-clusters-2026-10-30
wip/code-merge-release94-dev-2026-10-30
wip/rproxy-delta-scratch-2026-10-30
wip/stale-note-257-staged-2026-10-30
wip/d241-size-staged-2026-10-30
review-broad-suite-207
wip/mesh-pins-258-pre-split
wip/mesh-relay-220-pre-rebase
mesh-measure-220
plan-211-update
review-edge-autoupdate-r3
perf24-reconnect
review-stale-note-r2
release-prod-live
d241-shell-marker
review-mesh-pins-server-258
review-revocation-r3
review-setup-token-r2
review-sync-journal-r3
wip/review-mesh-pins-258-prune-review-1995fee46
frosted-scroll-256
sync-journal-r3
revocation-per-account-wip
review-tokio-asyncfd-0386
review-sync-p3s
wip/stash-8by64-stash0-2026-10-30
mesh-drag-r2
setup-token-data-wip
release-9-4
auth-busy-1013
mesh-view-overlap
sync-p3s
review-auth-busy-wake
review-readd-r8-wip
mesh-drag-bounds
audit-auth-93
app-windows-stream-start
review-authority-cap-r3
app-windows-r7-measure
readd-minimal-r6
readd-minimal-r5
app-windows-r7-soak
readd-minimal-r4
app-windows-r7
app-windows-r6
readd-minimal-r3
readd-minimal-r2
readd-minimal
merge-release8-dev
review-busy-page-liveness-r2
review-busy-page-liveness
mesh-view-trim
review-authority-read-retry-r2
review-remove-uninstall-r2
release-retry-reattach
release-retry
review-remove-uninstall
review-authority-read-retry
app-windows-ship
mesh-autoswitch-p2
mesh-ssh
mesh-relay
mesh-macos-node
screen-and-control
session-labels
review-real-logins-r5
review-real-logins-r4
review-real-logins-r3
shim-memory-r2
review-real-logins-r2
shim-memory
shadow-addhost-instant
shadow-real-logins
shadow-same-session-flood
shadow-prod-perf-fix
hosts-from-server
app-windows-real
app-windows-transport
release-prod-6w
mesh-policy-verify
quiet-close-toast
dev-merge-r4
review-mesh-agent-transport
review-app-windows-transport
settings-roundtrip
review-release-pipeline-r4
mesh-agent-transport
ended-strip-fix
review-audit-ca-update-d244
settings-rows
phone-width
signout-clear
fix-restart-tests
dev-merge-rp
signer-hardening
review-audit-ca-update
terminal-fidelity
review-audit-ca-update-wip
mesh-integrate
review-mesh-agent-transport-515d3712
review-mesh-dataplane-feec1988
mesh-dataplane
signout
research-canvas-node
wip/review-renderer-cost
wip/review-terminal-fidelity
padlock-glyph
review-release-pipeline-2e95b689
phone-polish
sidebar-polish
inbox-generic
review-mesh-dataplane-378d4055
prod-batch
ui-inbox
ui-ca-unlock
ui-machine-sections
review-mesh-dataplane-a5f744fb
tls-session-prod
session-bounds-prod
fix-dead-session
session-bounds
tls-session
palette-polish
shortcuts-d222
research-appmeta
phone-gutter
ui-centre-button
wip/ui-centre-button
wip/tls-session
review-addhost-breakit
ui-platform
renderer-cost
remote-agents
mesh-api
ssh-bootstrap
prod-hotfix2
prod-fixes
review-remote-agents
review-mesh-dataplane
session-life
research-browser
review-mesh-api
research-capture
review-mesh-api-round3
review-mesh-api-round1
gate-stability
review-gate-stability
review-relay-direct
review-mesh-api-findings
proto-sessions
font-picker
proto-addhost
proto-windows
mesh-core
latency-gate
research-bsd
research-discovery
keytray-mods
mock-core
ui-tweaks
fix-motion-sel
fix-motion
integrate2
fix-robust
t-web
t-server
vt-ghostty
fix-snap-echo
t-web-auth
review-vt2
t-agent
lane-protocol
lane-shim
lane-auth
s1-base
s1-contracts
s1-workspace
No results found.
No labels
launch-qa
Milestone
Clear milestone
No items
No milestone
Projects
Clear projects
No items
No project
Assignees
Clear assignees
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#107
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Server and client protocol support so a device's many canvas windows share one WebSocket (already multiplexed: AttachTerm per stream) and hidden windows cost nearly nothing: a per-stream visibility mode (live bytes / changed-marker only / thumbnail at ~2 Hz), switchable without reattach; snapshot on becoming visible. Numbers: CPU and bytes for 10 busy windows with 1 visible vs 10 visible; switch latency to live.
Starting #107 on canvas-streams, base
f27b3fe7a4. Read full #107/#89/#98/#99 history, repository contract and main D11/D63/D128/D130/D170/D178/D183. Additive proposal: wire capability bit 4 (16), Visibility 0x18 (u8 live=0/marker=1/thumbnail=2), Changed 0x19 (u64 since_seq, u64 head_seq), Thumbnail 0x1A (u64 seq, u8 flags, bounded visible VT repaint). Shim capability bit 4, Visibility 0x1E, Changed 0x1F, Thumbnail 0x22; leaves 0x17 and shim bit 3/0x1D for #99 size. Marker cadence >=250ms, thumbnail >=500ms, event-driven idle with no periodic wakeups. Returning live always snapshots at captured head then raw bytes from that boundary. No new engine; thumbnail uses existing bounded visible repaint. Contract and codec first, then shim, relay, browser multiplex client, real-engine/browser measurements. No push/deploy.Schema evidence: Rust protocol 7/7 and TS codec 6/6 pass with 20 shared golden vectors. Against the unchanged TS codec the new tests fail (4 pass/2 fail); restored implementation passes. Real shim/PTY visibility probe fails at baseline with "shim must advertise visibility". Existing shim peer delivery (
crates/infraternal-shim/src/session.rs:310-340) forwards raw output and only allows PTY progress for a caught-up viewer; hidden peers require explicit suppression and must permit PTY progress. Full fast gate is still warming native/static dependencies under load 23.57/30.57/26.26 on 8 CPUs; first Clippy duplicate-arm warning corrected. No performance claims from this load.First schema fast gate exited 1: fmt/VT fmt/cargo-deny/static builds PASS; Clippy duplicate-arm warning (corrected) and unchanged vt_credit t1-gate-faithful-1 FAIL. Saved stderr identifies verify-vt-credit.py:30: detached initial producer did not finish within 5s. Isolated exact retries also failed; a separate extended-deadline diagnostic completed in 501.65ms (not a gate pass). No deadline/budget changes. Both static targets pass: x86_64 15,966,096 bytes; aarch64 13,426,576 bytes, no PT_INTERP. Baseline binary native 300ms profile under concurrent build load failed: PTY echo baseline p99=356.91ms (budget334), other-session flood growth=15.39ms (PASS<=16.67), same-session growth=268.21ms (FAIL). Repeating full gate after cold static builds; implementation of visibility remains unapplied.
Step 1 complete:
a73aa8195e. Additive contracts and both codecs, capability bit 4; no conflict with #99. scripts/verify fast exit 0 (CARGO_BUILD_JOBS=2, RUST_TEST_THREADS=1, TRACER_TEST_PORT=4317, CPUWeight=10000). Rust protocol: 8 passed. Verbatim final gate output:==> cargo-deny
warning[duplicate]: found 2 duplicate entries for crate 'base64'
┌─ /home/kayg/Developer/infraternal/.worktrees/canvas-streams/Cargo.lock:24:1
│
24 │ ╭ base64 0.21.7 registry+https://github.com/rust-lang/crates.io-index
25 │ │ base64 0.22.1 registry+https://github.com/rust-lang/crates.io-index
│ ╰───────────────────────────────────────────────────────────────────┘ lock entries
│
├ base64 v0.21.7
├── base64urlsafedata v0.5.5
│ ├── webauthn-attestation-ca v0.5.5
│ │ └── webauthn-rs-core v0.5.5
│ │ └── webauthn-rs v0.5.5
│ │ └── infraternal-server v0.1.0
│ │ └── infraternal v0.1.0
│ ├── webauthn-rs v0.5.5 ()
│ ├── webauthn-rs-core v0.5.5 ()
│ └── webauthn-rs-proto v0.5.5
│ └── webauthn-rs-core v0.5.5 ()
├── webauthn-rs-core v0.5.5 ()
└── webauthn-rs-proto v0.5.5 ()
├ base64 v0.22.1
├── axum v0.8.9
│ └── infraternal-server v0.1.0
│ └── infraternal v0.1.0
├── infraternal-server v0.1.0 ()
└── sqlx-core v0.8.6
├── sqlx v0.8.6
│ ├── infraternal v0.1.0 ()
│ └── infraternal-server v0.1.0 ()
├── sqlx-macros v0.8.6
│ └── sqlx v0.8.6 ()
├── sqlx-macros-core v0.8.6
│ └── sqlx-macros v0.8.6 ()
└── sqlx-sqlite v0.8.6
├── sqlx v0.8.6 ()
└── sqlx-macros-core v0.8.6 ()
warning[duplicate]: found 3 duplicate entries for crate 'getrandom'
┌─ /home/kayg/Developer/infraternal/.worktrees/canvas-streams/Cargo.lock:88:1
│
88 │ ╭ getrandom 0.2.17 registry+https://github.com/rust-lang/crates.io-index
89 │ │ getrandom 0.3.4 registry+https://github.com/rust-lang/crates.io-index
90 │ │ getrandom 0.4.3 registry+https://github.com/rust-lang/crates.io-index
│ ╰─────────────────────────────────────────────────────────────────────┘ lock entries
│
├ getrandom v0.2.17
└── rand_core v0.6.4
├── bip39 v2.2.2
│ └── infraternal-server v0.1.0
│ └── infraternal v0.1.0
├── crypto-common v0.1.7
│ ├── aead v0.5.2
│ │ └── aes-gcm v0.10.3
│ │ └── (dev) infraternal-server v0.1.0 ()
│ ├── cipher v0.4.4
│ │ ├── aes v0.8.4
│ │ │ └── aes-gcm v0.10.3 ()
│ │ ├── aes-gcm v0.10.3 ()
│ │ └── ctr v0.9.2
│ │ └── aes-gcm v0.10.3 ()
│ ├── digest v0.10.7
│ │ ├── blake2 v0.10.6
│ │ │ └── argon2 v0.5.3
│ │ │ └── infraternal-server v0.1.0 ()
│ │ ├── hmac v0.12.1
│ │ │ └── hkdf v0.12.4
│ │ │ └── (dev) infraternal-server v0.1.0 ()
│ │ ├── sha1 v0.10.7
│ │ │ ├── axum v0.8.9
│ │ │ │ └── infraternal-server v0.1.0 ()
│ │ │ └── tungstenite v0.29.0
│ │ │ └── tokio-tungstenite v0.29.0
│ │ │ ├── axum v0.8.9 ()
│ │ │ └── (dev) infraternal-server v0.1.0 ()
│ │ └── sha2 v0.10.9
│ │ ├── infraternal-server v0.1.0 ()
│ │ ├── sqlx-core v0.8.6
│ │ │ ├── sqlx v0.8.6
│ │ │ │ ├── infraternal v0.1.0 ()
│ │ │ │ └── infraternal-server v0.1.0 ()
│ │ │ ├── sqlx-macros v0.8.6
│ │ │ │ └── sqlx v0.8.6 ()
│ │ │ ├── sqlx-macros-core v0.8.6
│ │ │ │ └── sqlx-macros v0.8.6 ()
│ │ │ └── sqlx-sqlite v0.8.6
│ │ │ ├── sqlx v0.8.6 ()
│ │ │ └── sqlx-macros-core v0.8.6 ()
│ │ └── sqlx-macros-core v0.8.6 ()
│ └── universal-hash v0.5.1
│ └── polyval v0.6.2
│ └── ghash v0.5.1
│ └── aes-gcm v0.10.3 ()
├── password-hash v0.5.0
│ └── argon2 v0.5.3 ()
├── rand v0.8.8
│ └── bip39 v2.2.2 ()
└── rand_chacha v0.3.1
└── rand v0.8.8 ()
├ getrandom v0.3.4
└── rand_core v0.9.5
├── rand v0.9.5
│ ├── infraternal-server v0.1.0
│ │ └── infraternal v0.1.0
│ ├── tungstenite v0.29.0
│ │ └── tokio-tungstenite v0.29.0
│ │ ├── axum v0.8.9
│ │ │ └── infraternal-server v0.1.0 ()
│ │ └── (dev) infraternal-server v0.1.0 ()
│ └── webauthn-rs-core v0.5.5
│ └── webauthn-rs v0.5.5
│ └── infraternal-server v0.1.0 ()
└── rand_chacha v0.9.0
├── rand v0.9.5 ()
└── webauthn-rs-core v0.5.5 ()
├ getrandom v0.4.3
├── jobserver v0.1.35
│ └── cc v1.6.0
│ ├── (build) libfuzzer-sys v0.4.13
│ │ └── infraternal-fuzz v0.1.0
│ ├── (build) libsqlite3-sys v0.30.1
│ │ └── sqlx-sqlite v0.8.6
│ │ ├── sqlx v0.8.6
│ │ │ ├── infraternal v0.1.0
│ │ │ └── infraternal-server v0.1.0
│ │ │ └── infraternal v0.1.0 ()
│ │ └── sqlx-macros-core v0.8.6
│ │ └── sqlx-macros v0.8.6
│ │ └── sqlx v0.8.6 ()
│ ├── openssl-src v300.6.1+3.6.3
│ │ └── (build) openssl-sys v0.9.117
│ │ ├── axum-server v0.8.0
│ │ │ └── infraternal-server v0.1.0 ()
│ │ ├── openssl v0.10.81
│ │ │ ├── axum-server v0.8.0 ()
│ │ │ ├── infraternal-server v0.1.0 ()
│ │ │ ├── tokio-openssl v0.6.5
│ │ │ │ └── axum-server v0.8.0 ()
│ │ │ ├── webauthn-attestation-ca v0.5.5
│ │ │ │ └── webauthn-rs-core v0.5.5
│ │ │ │ └── webauthn-rs v0.5.5
│ │ │ │ └── infraternal-server v0.1.0 ()
│ │ │ └── webauthn-rs-core v0.5.5 ()
│ │ ├── tokio-openssl v0.6.5 ()
│ │ ├── webauthn-attestation-ca v0.5.5 ()
│ │ └── webauthn-rs-core v0.5.5 ()
│ └── (build) openssl-sys v0.9.117 ()
└── uuid v1.27.0
├── infraternal-agent v0.1.0
│ └── infraternal v0.1.0 ()
├── infraternal-server v0.1.0 ()
├── webauthn-attestation-ca v0.5.5 ()
├── webauthn-rs v0.5.5 ()
└── webauthn-rs-core v0.5.5 (*)
warning[duplicate]: found 2 duplicate entries for crate 'hashbrown'
┌─ /home/kayg/Developer/infraternal/.worktrees/canvas-streams/Cargo.lock:94:1
│
94 │ ╭ hashbrown 0.15.5 registry+https://github.com/rust-lang/crates.io-index
95 │ │ hashbrown 0.17.1 registry+https://github.com/rust-lang/crates.io-index
│ ╰──────────────────────────────────────────────────────────────────────┘ lock entries
│
├ hashbrown v0.15.5
├── hashlink v0.10.0
│ └── sqlx-core v0.8.6
│ ├── sqlx v0.8.6
│ │ ├── infraternal v0.1.0
│ │ └── infraternal-server v0.1.0
│ │ └── infraternal v0.1.0 ()
│ ├── sqlx-macros v0.8.6
│ │ └── sqlx v0.8.6 ()
│ ├── sqlx-macros-core v0.8.6
│ │ └── sqlx-macros v0.8.6 ()
│ └── sqlx-sqlite v0.8.6
│ ├── sqlx v0.8.6 ()
│ └── sqlx-macros-core v0.8.6 ()
└── sqlx-core v0.8.6 ()
├ hashbrown v0.17.1
└── indexmap v2.14.2
├── h2 v0.4.19
│ └── hyper v1.11.1
│ ├── axum v0.8.9
│ │ └── infraternal-server v0.1.0
│ │ └── infraternal v0.1.0
│ ├── axum-server v0.8.0
│ │ └── infraternal-server v0.1.0 ()
│ └── hyper-util v0.1.21
│ ├── axum v0.8.9 ()
│ └── axum-server v0.8.0 ()
└── sqlx-core v0.8.6
├── sqlx v0.8.6
│ ├── infraternal v0.1.0 ()
│ └── infraternal-server v0.1.0 ()
├── sqlx-macros v0.8.6
│ └── sqlx v0.8.6 ()
├── sqlx-macros-core v0.8.6
│ └── sqlx-macros v0.8.6 ()
└── sqlx-sqlite v0.8.6
├── sqlx v0.8.6 ()
└── sqlx-macros-core v0.8.6 (*)
warning[duplicate]: found 2 duplicate entries for crate 'r-efi'
┌─ /home/kayg/Developer/infraternal/.worktrees/canvas-streams/Cargo.lock:183:1
│
183 │ ╭ r-efi 5.3.0 registry+https://github.com/rust-lang/crates.io-index
184 │ │ r-efi 6.0.0 registry+https://github.com/rust-lang/crates.io-index
│ ╰─────────────────────────────────────────────────────────────────┘ lock entries
│
├ r-efi v5.3.0
└── getrandom v0.3.4
└── rand_core v0.9.5
├── rand v0.9.5
│ ├── infraternal-server v0.1.0
│ │ └── infraternal v0.1.0
│ ├── tungstenite v0.29.0
│ │ └── tokio-tungstenite v0.29.0
│ │ ├── axum v0.8.9
│ │ │ └── infraternal-server v0.1.0 ()
│ │ └── (dev) infraternal-server v0.1.0 ()
│ └── webauthn-rs-core v0.5.5
│ └── webauthn-rs v0.5.5
│ └── infraternal-server v0.1.0 ()
└── rand_chacha v0.9.0
├── rand v0.9.5 ()
└── webauthn-rs-core v0.5.5 ()
├ r-efi v6.0.0
└── getrandom v0.4.3
├── jobserver v0.1.35
│ └── cc v1.6.0
│ ├── (build) libfuzzer-sys v0.4.13
│ │ └── infraternal-fuzz v0.1.0
│ ├── (build) libsqlite3-sys v0.30.1
│ │ └── sqlx-sqlite v0.8.6
│ │ ├── sqlx v0.8.6
│ │ │ ├── infraternal v0.1.0
│ │ │ └── infraternal-server v0.1.0
│ │ │ └── infraternal v0.1.0 ()
│ │ └── sqlx-macros-core v0.8.6
│ │ └── sqlx-macros v0.8.6
│ │ └── sqlx v0.8.6 ()
│ ├── openssl-src v300.6.1+3.6.3
│ │ └── (build) openssl-sys v0.9.117
│ │ ├── axum-server v0.8.0
│ │ │ └── infraternal-server v0.1.0 ()
│ │ ├── openssl v0.10.81
│ │ │ ├── axum-server v0.8.0 ()
│ │ │ ├── infraternal-server v0.1.0 ()
│ │ │ ├── tokio-openssl v0.6.5
│ │ │ │ └── axum-server v0.8.0 ()
│ │ │ ├── webauthn-attestation-ca v0.5.5
│ │ │ │ └── webauthn-rs-core v0.5.5
│ │ │ │ └── webauthn-rs v0.5.5
│ │ │ │ └── infraternal-server v0.1.0 ()
│ │ │ └── webauthn-rs-core v0.5.5 ()
│ │ ├── tokio-openssl v0.6.5 ()
│ │ ├── webauthn-attestation-ca v0.5.5 ()
│ │ └── webauthn-rs-core v0.5.5 ()
│ └── (build) openssl-sys v0.9.117 ()
└── uuid v1.27.0
├── infraternal-agent v0.1.0
│ └── infraternal v0.1.0 ()
├── infraternal-server v0.1.0 ()
├── webauthn-attestation-ca v0.5.5 ()
├── webauthn-rs v0.5.5 ()
└── webauthn-rs-core v0.5.5 ()
warning[duplicate]: found 2 duplicate entries for crate 'rand'
┌─ /home/kayg/Developer/infraternal/.worktrees/canvas-streams/Cargo.lock:185:1
│
185 │ ╭ rand 0.8.8 registry+https://github.com/rust-lang/crates.io-index
186 │ │ rand 0.9.5 registry+https://github.com/rust-lang/crates.io-index
│ ╰────────────────────────────────────────────────────────────────┘ lock entries
│
├ rand v0.8.8
└── bip39 v2.2.2
└── infraternal-server v0.1.0
└── infraternal v0.1.0
├ rand v0.9.5
├── infraternal-server v0.1.0
│ └── infraternal v0.1.0
├── tungstenite v0.29.0
│ └── tokio-tungstenite v0.29.0
│ ├── axum v0.8.9
│ │ └── infraternal-server v0.1.0 ()
│ └── (dev) infraternal-server v0.1.0 ()
└── webauthn-rs-core v0.5.5
└── webauthn-rs v0.5.5
└── infraternal-server v0.1.0 (*)
warning[duplicate]: found 2 duplicate entries for crate 'rand_chacha'
┌─ /home/kayg/Developer/infraternal/.worktrees/canvas-streams/Cargo.lock:187:1
│
187 │ ╭ rand_chacha 0.3.1 registry+https://github.com/rust-lang/crates.io-index
188 │ │ rand_chacha 0.9.0 registry+https://github.com/rust-lang/crates.io-index
│ ╰───────────────────────────────────────────────────────────────────────┘ lock entries
│
├ rand_chacha v0.3.1
└── rand v0.8.8
└── bip39 v2.2.2
└── infraternal-server v0.1.0
└── infraternal v0.1.0
├ rand_chacha v0.9.0
├── rand v0.9.5
│ ├── infraternal-server v0.1.0
│ │ └── infraternal v0.1.0
│ ├── tungstenite v0.29.0
│ │ └── tokio-tungstenite v0.29.0
│ │ ├── axum v0.8.9
│ │ │ └── infraternal-server v0.1.0 ()
│ │ └── (dev) infraternal-server v0.1.0 ()
│ └── webauthn-rs-core v0.5.5
│ └── webauthn-rs v0.5.5
│ └── infraternal-server v0.1.0 ()
└── webauthn-rs-core v0.5.5 ()
warning[duplicate]: found 2 duplicate entries for crate 'rand_core'
┌─ /home/kayg/Developer/infraternal/.worktrees/canvas-streams/Cargo.lock:189:1
│
189 │ ╭ rand_core 0.6.4 registry+https://github.com/rust-lang/crates.io-index
190 │ │ rand_core 0.9.5 registry+https://github.com/rust-lang/crates.io-index
│ ╰─────────────────────────────────────────────────────────────────────┘ lock entries
│
├ rand_core v0.6.4
├── bip39 v2.2.2
│ └── infraternal-server v0.1.0
│ └── infraternal v0.1.0
├── crypto-common v0.1.7
│ ├── aead v0.5.2
│ │ └── aes-gcm v0.10.3
│ │ └── (dev) infraternal-server v0.1.0 ()
│ ├── cipher v0.4.4
│ │ ├── aes v0.8.4
│ │ │ └── aes-gcm v0.10.3 ()
│ │ ├── aes-gcm v0.10.3 ()
│ │ └── ctr v0.9.2
│ │ └── aes-gcm v0.10.3 ()
│ ├── digest v0.10.7
│ │ ├── blake2 v0.10.6
│ │ │ └── argon2 v0.5.3
│ │ │ └── infraternal-server v0.1.0 ()
│ │ ├── hmac v0.12.1
│ │ │ └── hkdf v0.12.4
│ │ │ └── (dev) infraternal-server v0.1.0 ()
│ │ ├── sha1 v0.10.7
│ │ │ ├── axum v0.8.9
│ │ │ │ └── infraternal-server v0.1.0 ()
│ │ │ └── tungstenite v0.29.0
│ │ │ └── tokio-tungstenite v0.29.0
│ │ │ ├── axum v0.8.9 ()
│ │ │ └── (dev) infraternal-server v0.1.0 ()
│ │ └── sha2 v0.10.9
│ │ ├── infraternal-server v0.1.0 ()
│ │ ├── sqlx-core v0.8.6
│ │ │ ├── sqlx v0.8.6
│ │ │ │ ├── infraternal v0.1.0 ()
│ │ │ │ └── infraternal-server v0.1.0 ()
│ │ │ ├── sqlx-macros v0.8.6
│ │ │ │ └── sqlx v0.8.6 ()
│ │ │ ├── sqlx-macros-core v0.8.6
│ │ │ │ └── sqlx-macros v0.8.6 ()
│ │ │ └── sqlx-sqlite v0.8.6
│ │ │ ├── sqlx v0.8.6 ()
│ │ │ └── sqlx-macros-core v0.8.6 ()
│ │ └── sqlx-macros-core v0.8.6 ()
│ └── universal-hash v0.5.1
│ └── polyval v0.6.2
│ └── ghash v0.5.1
│ └── aes-gcm v0.10.3 ()
├── password-hash v0.5.0
│ └── argon2 v0.5.3 ()
├── rand v0.8.8
│ └── bip39 v2.2.2 ()
└── rand_chacha v0.3.1
└── rand v0.8.8 ()
├ rand_core v0.9.5
├── rand v0.9.5
│ ├── infraternal-server v0.1.0
│ │ └── infraternal v0.1.0
│ ├── tungstenite v0.29.0
│ │ └── tokio-tungstenite v0.29.0
│ │ ├── axum v0.8.9
│ │ │ └── infraternal-server v0.1.0 ()
│ │ └── (dev) infraternal-server v0.1.0 ()
│ └── webauthn-rs-core v0.5.5
│ └── webauthn-rs v0.5.5
│ └── infraternal-server v0.1.0 ()
└── rand_chacha v0.9.0
├── rand v0.9.5 ()
└── webauthn-rs-core v0.5.5 ()
warning[duplicate]: found 2 duplicate entries for crate 'syn'
┌─ /home/kayg/Developer/infraternal/.worktrees/canvas-streams/Cargo.lock:226:1
│
226 │ ╭ syn 2.0.119 registry+https://github.com/rust-lang/crates.io-index
227 │ │ syn 3.0.6 registry+https://github.com/rust-lang/crates.io-index
│ ╰───────────────────────────────────────────────────────────────┘ lock entries
│
├ syn v2.0.119
├── asn1-rs-derive v0.5.1
│ └── asn1-rs v0.6.2
│ ├── der-parser v9.0.0
│ │ ├── webauthn-rs-core v0.5.5
│ │ │ └── webauthn-rs v0.5.5
│ │ │ └── infraternal-server v0.1.0
│ │ │ └── infraternal v0.1.0
│ │ └── x509-parser v0.16.0
│ │ └── webauthn-rs-core v0.5.5 ()
│ ├── oid-registry v0.7.1
│ │ └── x509-parser v0.16.0 ()
│ └── x509-parser v0.16.0 ()
├── asn1-rs-impl v0.2.0
│ └── asn1-rs v0.6.2 ()
├── openssl-macros v0.1.1
│ └── openssl v0.10.81
│ ├── axum-server v0.8.0
│ │ └── infraternal-server v0.1.0 ()
│ ├── infraternal-server v0.1.0 ()
│ ├── tokio-openssl v0.6.5
│ │ └── axum-server v0.8.0 ()
│ ├── webauthn-attestation-ca v0.5.5
│ │ └── webauthn-rs-core v0.5.5 ()
│ └── webauthn-rs-core v0.5.5 ()
├── sqlx-macros v0.8.6
│ └── sqlx v0.8.6
│ ├── infraternal v0.1.0 ()
│ └── infraternal-server v0.1.0 ()
├── sqlx-macros-core v0.8.6
│ └── sqlx-macros v0.8.6 ()
├── synstructure v0.13.2
│ └── asn1-rs-derive v0.5.1 ()
├── thiserror-impl v1.0.69
│ └── thiserror v1.0.69
│ ├── asn1-rs v0.6.2 ()
│ ├── webauthn-rs-core v0.5.5 ()
│ └── x509-parser v0.16.0 ()
├── tracing-attributes v0.1.31
│ └── tracing v0.1.44
│ ├── axum v0.8.9
│ │ └── infraternal-server v0.1.0 ()
│ ├── axum-core v0.5.6
│ │ └── axum v0.8.9 ()
│ ├── h2 v0.4.19
│ │ └── hyper v1.11.1
│ │ ├── axum v0.8.9 ()
│ │ ├── axum-server v0.8.0 ()
│ │ └── hyper-util v0.1.21
│ │ ├── axum v0.8.9 ()
│ │ └── axum-server v0.8.0 ()
│ ├── infraternal-server v0.1.0 ()
│ ├── sqlx-core v0.8.6
│ │ ├── sqlx v0.8.6 ()
│ │ ├── sqlx-macros v0.8.6 ()
│ │ ├── sqlx-macros-core v0.8.6 ()
│ │ └── sqlx-sqlite v0.8.6
│ │ ├── sqlx v0.8.6 ()
│ │ └── sqlx-macros-core v0.8.6 ()
│ ├── sqlx-sqlite v0.8.6 ()
│ ├── tower v0.5.3
│ │ ├── axum v0.8.9 ()
│ │ └── (dev) infraternal-server v0.1.0 ()
│ ├── tracing-subscriber v0.3.23
│ │ └── infraternal-server v0.1.0 ()
│ ├── webauthn-attestation-ca v0.5.5 ()
│ ├── webauthn-rs v0.5.5 ()
│ └── webauthn-rs-core v0.5.5 ()
└── zerocopy-derive v0.8.60
└── zerocopy v0.8.60
├── half v2.7.1
│ ├── ciborium-ll v0.2.2
│ │ └── ciborium v0.2.2
│ │ └── criterion v0.7.0
│ │ └── (dev) infraternal-protocol v0.1.0
│ │ ├── infraternal-agent v0.1.0
│ │ │ └── infraternal v0.1.0 ()
│ │ ├── infraternal-fuzz v0.1.0
│ │ └── infraternal-server v0.1.0 ()
│ └── serde_cbor_2 v0.13.0
│ ├── infraternal-server v0.1.0 ()
│ └── webauthn-rs-core v0.5.5 ()
└── ppv-lite86 v0.2.21
├── rand_chacha v0.3.1
│ └── rand v0.8.8
│ └── bip39 v2.2.2
│ └── infraternal-server v0.1.0 ()
└── rand_chacha v0.9.0
├── rand v0.9.5
│ ├── infraternal-server v0.1.0 ()
│ ├── tungstenite v0.29.0
│ │ └── tokio-tungstenite v0.29.0
│ │ ├── axum v0.8.9 ()
│ │ └── (dev) infraternal-server v0.1.0 ()
│ └── webauthn-rs-core v0.5.5 ()
└── webauthn-rs-core v0.5.5 ()
├ syn v3.0.6
├── clap_derive v4.6.7
│ └── clap v4.6.7
│ ├── criterion v0.7.0
│ │ └── (dev) infraternal-protocol v0.1.0
│ │ ├── infraternal-agent v0.1.0
│ │ │ └── infraternal v0.1.0
│ │ ├── infraternal-fuzz v0.1.0
│ │ └── infraternal-server v0.1.0
│ │ └── infraternal v0.1.0 ()
│ └── infraternal v0.1.0 ()
├── displaydoc v0.2.7
│ ├── asn1-rs v0.6.2
│ │ ├── der-parser v9.0.0
│ │ │ ├── webauthn-rs-core v0.5.5
│ │ │ │ └── webauthn-rs v0.5.5
│ │ │ │ └── infraternal-server v0.1.0 ()
│ │ │ └── x509-parser v0.16.0
│ │ │ └── webauthn-rs-core v0.5.5 ()
│ │ ├── oid-registry v0.7.1
│ │ │ └── x509-parser v0.16.0 ()
│ │ └── x509-parser v0.16.0 ()
│ ├── der-parser v9.0.0 ()
│ ├── icu_collections v2.3.0
│ │ ├── icu_normalizer v2.3.0
│ │ │ └── idna_adapter v1.2.2
│ │ │ └── idna v1.1.0
│ │ │ └── url v2.5.8
│ │ │ ├── infraternal-server v0.1.0 ()
│ │ │ ├── sqlx-core v0.8.6
│ │ │ │ ├── sqlx v0.8.6
│ │ │ │ │ ├── infraternal v0.1.0 ()
│ │ │ │ │ └── infraternal-server v0.1.0 ()
│ │ │ │ ├── sqlx-macros v0.8.6
│ │ │ │ │ └── sqlx v0.8.6 ()
│ │ │ │ ├── sqlx-macros-core v0.8.6
│ │ │ │ │ └── sqlx-macros v0.8.6 ()
│ │ │ │ └── sqlx-sqlite v0.8.6
│ │ │ │ ├── sqlx v0.8.6 ()
│ │ │ │ └── sqlx-macros-core v0.8.6 ()
│ │ │ ├── sqlx-macros-core v0.8.6 ()
│ │ │ ├── sqlx-sqlite v0.8.6 ()
│ │ │ ├── webauthn-rs v0.5.5 ()
│ │ │ ├── webauthn-rs-core v0.5.5 ()
│ │ │ └── webauthn-rs-proto v0.5.5
│ │ │ └── webauthn-rs-core v0.5.5 ()
│ │ └── icu_properties v2.3.0
│ │ └── idna_adapter v1.2.2 ()
│ ├── icu_locale_core v2.3.0
│ │ ├── icu_properties v2.3.0 ()
│ │ └── icu_provider v2.3.1
│ │ ├── icu_normalizer v2.3.0 ()
│ │ └── icu_properties v2.3.0 ()
│ ├── icu_properties v2.3.0 ()
│ ├── icu_provider v2.3.1 ()
│ ├── tinystr v0.8.4
│ │ └── icu_locale_core v2.3.0 ()
│ └── zerotrie v0.2.5
│ ├── icu_properties v2.3.0 ()
│ └── icu_provider v2.3.1 ()
├── futures-macro v0.3.34
│ └── futures-util v0.3.34
│ ├── axum v0.8.9
│ │ └── infraternal-server v0.1.0 ()
│ ├── futures-executor v0.3.34
│ │ └── sqlx-sqlite v0.8.6 ()
│ ├── infraternal-server v0.1.0 ()
│ ├── js-sys v0.3.106
│ │ └── web-sys v0.3.106
│ │ └── plotters v0.3.7
│ │ └── criterion v0.7.0 ()
│ ├── sqlx-core v0.8.6 ()
│ ├── sqlx-sqlite v0.8.6 ()
│ ├── tokio-tungstenite v0.29.0
│ │ ├── axum v0.8.9 ()
│ │ └── (dev) infraternal-server v0.1.0 ()
│ ├── tower v0.5.3
│ │ ├── axum v0.8.9 ()
│ │ └── (dev) infraternal-server v0.1.0 ()
│ └── tower-http v0.6.11
│ └── infraternal-server v0.1.0 ()
├── serde_derive v1.0.229
│ ├── serde v1.0.229
│ │ ├── base64urlsafedata v0.5.5
│ │ │ ├── webauthn-attestation-ca v0.5.5
│ │ │ │ └── webauthn-rs-core v0.5.5 ()
│ │ │ ├── webauthn-rs v0.5.5 ()
│ │ │ ├── webauthn-rs-core v0.5.5 ()
│ │ │ └── webauthn-rs-proto v0.5.5 ()
│ │ ├── bip39 v2.2.2
│ │ │ └── infraternal-server v0.1.0 ()
│ │ ├── ciborium v0.2.2
│ │ │ └── criterion v0.7.0 ()
│ │ ├── criterion v0.7.0 ()
│ │ ├── either v1.18.0
│ │ │ ├── axum-server v0.8.0
│ │ │ │ └── infraternal-server v0.1.0 ()
│ │ │ ├── itertools v0.13.0
│ │ │ │ ├── criterion v0.7.0 ()
│ │ │ │ └── criterion-plot v0.6.0
│ │ │ │ └── criterion v0.7.0 ()
│ │ │ ├── rayon v1.12.0
│ │ │ │ └── criterion v0.7.0 ()
│ │ │ ├── sqlx-core v0.8.6 ()
│ │ │ └── sqlx-macros-core v0.8.6 ()
│ │ ├── infraternal-agent v0.1.0 ()
│ │ ├── infraternal-mesh v0.1.0
│ │ ├── infraternal-server v0.1.0 ()
│ │ ├── serde_cbor_2 v0.13.0
│ │ │ ├── infraternal-server v0.1.0 ()
│ │ │ └── webauthn-rs-core v0.5.5 ()
│ │ ├── serde_urlencoded v0.7.1
│ │ │ ├── axum v0.8.9 ()
│ │ │ └── sqlx-sqlite v0.8.6 ()
│ │ ├── sqlx-core v0.8.6 ()
│ │ ├── sqlx-macros-core v0.8.6 ()
│ │ ├── sqlx-sqlite v0.8.6 ()
│ │ ├── tinytemplate v1.2.1
│ │ │ └── criterion v0.7.0 ()
│ │ ├── tracing-serde v0.2.0
│ │ │ └── tracing-subscriber v0.3.23
│ │ │ └── infraternal-server v0.1.0 ()
│ │ ├── tracing-subscriber v0.3.23 ()
│ │ ├── url v2.5.8 ()
│ │ ├── webauthn-attestation-ca v0.5.5 ()
│ │ ├── webauthn-rs v0.5.5 ()
│ │ ├── webauthn-rs-core v0.5.5 ()
│ │ └── webauthn-rs-proto v0.5.5 ()
│ └── url v2.5.8 ()
├── synstructure v0.14.0
│ ├── yoke-derive v0.8.4
│ │ └── yoke v0.8.3
│ │ ├── icu_collections v2.3.0 ()
│ │ ├── icu_provider v2.3.1 ()
│ │ ├── zerotrie v0.2.5 ()
│ │ └── zerovec v0.11.8
│ │ ├── icu_collections v2.3.0 ()
│ │ ├── icu_locale_core v2.3.0 ()
│ │ ├── icu_normalizer v2.3.0 ()
│ │ ├── icu_properties v2.3.0 ()
│ │ ├── icu_provider v2.3.1 ()
│ │ ├── potential_utf v0.1.6
│ │ │ └── icu_collections v2.3.0 ()
│ │ └── tinystr v0.8.4 ()
│ └── zerofrom-derive v0.1.8
│ └── zerofrom v0.1.8
│ ├── icu_collections v2.3.0 ()
│ ├── icu_provider v2.3.1 ()
│ ├── yoke v0.8.3 ()
│ ├── zerotrie v0.2.5 ()
│ └── zerovec v0.11.8 ()
├── thiserror-impl v2.0.21
│ └── thiserror v2.0.21
│ ├── infraternal v0.1.0 ()
│ ├── infraternal-mesh v0.1.0 ()
│ ├── infraternal-server v0.1.0 ()
│ ├── sqlx-core v0.8.6 ()
│ ├── sqlx-sqlite v0.8.6 ()
│ └── tungstenite v0.29.0
│ └── tokio-tungstenite v0.29.0 ()
├── tokio-macros v2.7.2
│ └── tokio v1.53.2
│ ├── axum v0.8.9 ()
│ ├── axum-server v0.8.0 ()
│ ├── fs-err v3.3.2
│ │ └── axum-server v0.8.0 ()
│ ├── h2 v0.4.19
│ │ └── hyper v1.11.1
│ │ ├── axum v0.8.9 ()
│ │ ├── axum-server v0.8.0 ()
│ │ └── hyper-util v0.1.21
│ │ ├── axum v0.8.9 ()
│ │ └── axum-server v0.8.0 ()
│ ├── hyper v1.11.1 ()
│ ├── hyper-util v0.1.21 ()
│ ├── infraternal v0.1.0 ()
│ ├── infraternal-agent v0.1.0 ()
│ ├── infraternal-server v0.1.0 ()
│ ├── sqlx-core v0.8.6 ()
│ ├── sqlx-macros-core v0.8.6 ()
│ ├── tokio-openssl v0.6.5
│ │ └── axum-server v0.8.0 ()
│ ├── tokio-stream v0.1.19
│ │ └── sqlx-core v0.8.6 ()
│ ├── tokio-tungstenite v0.29.0 ()
│ ├── tokio-util v0.7.19
│ │ ├── h2 v0.4.19 ()
│ │ └── tower-http v0.6.11 ()
│ ├── tower v0.5.3 ()
│ └── tower-http v0.6.11 ()
├── wasm-bindgen-macro-support v0.2.129
│ └── wasm-bindgen-macro v0.2.129
│ └── wasm-bindgen v0.2.129
│ ├── js-sys v0.3.106 ()
│ ├── plotters v0.3.7 ()
│ └── web-sys v0.3.106 ()
├── yoke-derive v0.8.4 ()
├── zerofrom-derive v0.1.8 ()
└── zerovec-derive v0.11.6
└── zerovec v0.11.8 (*)
warning[duplicate]: found 2 duplicate entries for crate 'synstructure'
┌─ /home/kayg/Developer/infraternal/.worktrees/canvas-streams/Cargo.lock:229:1
│
229 │ ╭ synstructure 0.13.2 registry+https://github.com/rust-lang/crates.io-index
230 │ │ synstructure 0.14.0 registry+https://github.com/rust-lang/crates.io-index
│ ╰─────────────────────────────────────────────────────────────────────────┘ lock entries
│
├ synstructure v0.13.2
└── asn1-rs-derive v0.5.1
└── asn1-rs v0.6.2
├── der-parser v9.0.0
│ ├── webauthn-rs-core v0.5.5
│ │ └── webauthn-rs v0.5.5
│ │ └── infraternal-server v0.1.0
│ │ └── infraternal v0.1.0
│ └── x509-parser v0.16.0
│ └── webauthn-rs-core v0.5.5 ()
├── oid-registry v0.7.1
│ └── x509-parser v0.16.0 ()
└── x509-parser v0.16.0 ()
├ synstructure v0.14.0
├── yoke-derive v0.8.4
│ └── yoke v0.8.3
│ ├── icu_collections v2.3.0
│ │ ├── icu_normalizer v2.3.0
│ │ │ └── idna_adapter v1.2.2
│ │ │ └── idna v1.1.0
│ │ │ └── url v2.5.8
│ │ │ ├── infraternal-server v0.1.0
│ │ │ │ └── infraternal v0.1.0
│ │ │ ├── sqlx-core v0.8.6
│ │ │ │ ├── sqlx v0.8.6
│ │ │ │ │ ├── infraternal v0.1.0 ()
│ │ │ │ │ └── infraternal-server v0.1.0 ()
│ │ │ │ ├── sqlx-macros v0.8.6
│ │ │ │ │ └── sqlx v0.8.6 ()
│ │ │ │ ├── sqlx-macros-core v0.8.6
│ │ │ │ │ └── sqlx-macros v0.8.6 ()
│ │ │ │ └── sqlx-sqlite v0.8.6
│ │ │ │ ├── sqlx v0.8.6 ()
│ │ │ │ └── sqlx-macros-core v0.8.6 ()
│ │ │ ├── sqlx-macros-core v0.8.6 ()
│ │ │ ├── sqlx-sqlite v0.8.6 ()
│ │ │ ├── webauthn-rs v0.5.5
│ │ │ │ └── infraternal-server v0.1.0 ()
│ │ │ ├── webauthn-rs-core v0.5.5
│ │ │ │ └── webauthn-rs v0.5.5 ()
│ │ │ └── webauthn-rs-proto v0.5.5
│ │ │ └── webauthn-rs-core v0.5.5 ()
│ │ └── icu_properties v2.3.0
│ │ └── idna_adapter v1.2.2 ()
│ ├── icu_provider v2.3.1
│ │ ├── icu_normalizer v2.3.0 ()
│ │ └── icu_properties v2.3.0 ()
│ ├── zerotrie v0.2.5
│ │ ├── icu_properties v2.3.0 ()
│ │ └── icu_provider v2.3.1 ()
│ └── zerovec v0.11.8
│ ├── icu_collections v2.3.0 ()
│ ├── icu_locale_core v2.3.0
│ │ ├── icu_properties v2.3.0 ()
│ │ └── icu_provider v2.3.1 ()
│ ├── icu_normalizer v2.3.0 ()
│ ├── icu_properties v2.3.0 ()
│ ├── icu_provider v2.3.1 ()
│ ├── potential_utf v0.1.6
│ │ └── icu_collections v2.3.0 ()
│ └── tinystr v0.8.4
│ └── icu_locale_core v2.3.0 ()
└── zerofrom-derive v0.1.8
└── zerofrom v0.1.8
├── icu_collections v2.3.0 ()
├── icu_provider v2.3.1 ()
├── yoke v0.8.3 ()
├── zerotrie v0.2.5 ()
└── zerovec v0.11.8 ()
warning[duplicate]: found 2 duplicate entries for crate 'thiserror'
┌─ /home/kayg/Developer/infraternal/.worktrees/canvas-streams/Cargo.lock:231:1
│
231 │ ╭ thiserror 1.0.69 registry+https://github.com/rust-lang/crates.io-index
232 │ │ thiserror 2.0.21 registry+https://github.com/rust-lang/crates.io-index
│ ╰──────────────────────────────────────────────────────────────────────┘ lock entries
│
├ thiserror v1.0.69
├── asn1-rs v0.6.2
│ ├── der-parser v9.0.0
│ │ ├── webauthn-rs-core v0.5.5
│ │ │ └── webauthn-rs v0.5.5
│ │ │ └── infraternal-server v0.1.0
│ │ │ └── infraternal v0.1.0
│ │ └── x509-parser v0.16.0
│ │ └── webauthn-rs-core v0.5.5 ()
│ ├── oid-registry v0.7.1
│ │ └── x509-parser v0.16.0 ()
│ └── x509-parser v0.16.0 ()
├── webauthn-rs-core v0.5.5 ()
└── x509-parser v0.16.0 ()
├ thiserror v2.0.21
├── infraternal v0.1.0
├── infraternal-mesh v0.1.0
├── infraternal-server v0.1.0
│ └── infraternal v0.1.0 ()
├── sqlx-core v0.8.6
│ ├── sqlx v0.8.6
│ │ ├── infraternal v0.1.0 ()
│ │ └── infraternal-server v0.1.0 ()
│ ├── sqlx-macros v0.8.6
│ │ └── sqlx v0.8.6 ()
│ ├── sqlx-macros-core v0.8.6
│ │ └── sqlx-macros v0.8.6 ()
│ └── sqlx-sqlite v0.8.6
│ ├── sqlx v0.8.6 ()
│ └── sqlx-macros-core v0.8.6 ()
├── sqlx-sqlite v0.8.6 ()
└── tungstenite v0.29.0
└── tokio-tungstenite v0.29.0
├── axum v0.8.9
│ └── infraternal-server v0.1.0 ()
└── (dev) infraternal-server v0.1.0 (*)
warning[duplicate]: found 2 duplicate entries for crate 'thiserror-impl'
┌─ /home/kayg/Developer/infraternal/.worktrees/canvas-streams/Cargo.lock:233:1
│
233 │ ╭ thiserror-impl 1.0.69 registry+https://github.com/rust-lang/crates.io-index
234 │ │ thiserror-impl 2.0.21 registry+https://github.com/rust-lang/crates.io-index
│ ╰───────────────────────────────────────────────────────────────────────────┘ lock entries
│
├ thiserror-impl v1.0.69
└── thiserror v1.0.69
├── asn1-rs v0.6.2
│ ├── der-parser v9.0.0
│ │ ├── webauthn-rs-core v0.5.5
│ │ │ └── webauthn-rs v0.5.5
│ │ │ └── infraternal-server v0.1.0
│ │ │ └── infraternal v0.1.0
│ │ └── x509-parser v0.16.0
│ │ └── webauthn-rs-core v0.5.5 ()
│ ├── oid-registry v0.7.1
│ │ └── x509-parser v0.16.0 ()
│ └── x509-parser v0.16.0 ()
├── webauthn-rs-core v0.5.5 ()
└── x509-parser v0.16.0 ()
├ thiserror-impl v2.0.21
└── thiserror v2.0.21
├── infraternal v0.1.0
├── infraternal-mesh v0.1.0
├── infraternal-server v0.1.0
│ └── infraternal v0.1.0 ()
├── sqlx-core v0.8.6
│ ├── sqlx v0.8.6
│ │ ├── infraternal v0.1.0 ()
│ │ └── infraternal-server v0.1.0 ()
│ ├── sqlx-macros v0.8.6
│ │ └── sqlx v0.8.6 ()
│ ├── sqlx-macros-core v0.8.6
│ │ └── sqlx-macros v0.8.6 ()
│ └── sqlx-sqlite v0.8.6
│ ├── sqlx v0.8.6 ()
│ └── sqlx-macros-core v0.8.6 ()
├── sqlx-sqlite v0.8.6 ()
└── tungstenite v0.29.0
└── tokio-tungstenite v0.29.0
├── axum v0.8.9
│ └── infraternal-server v0.1.0 ()
└── (dev) infraternal-server v0.1.0 (*)
advisories ok, bans ok, licenses ok, sources ok
==> static builds
Finished
releaseprofile [optimized] target(s) in 0.42s/home/kayg/.cache/codex-scratch/canvas-streams/target/x86_64-unknown-linux-musl/release/infraternal: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), static-pie linked, stripped
PT_INTERP: absent; size: 15966096 bytes (baseline 16142672 + allowance 262144 = max 16404816)
Finished
releaseprofile [optimized] target(s) in 0.46s/home/kayg/.cache/codex-scratch/canvas-streams/target/aarch64-unknown-linux-musl/release/infraternal: ELF 64-bit LSB executable, ARM aarch64, version 1 (SYSV), statically linked, stripped
PT_INTERP: absent; size: 13426576 bytes (baseline 13555672 + allowance 262144 = max 13817816)
server subcommand: exit 2, not implemented
agent subcommand: exit 2, not implemented
+---------------------------+--------------+
| Rust gate | Result |
+---------------------------+--------------+
| fmt | PASS |
| VT native fmt | PASS |
| clippy | PASS |
| test | PASS |
| cargo-deny | PASS |
| static builds | PASS |
+---------------------------+--------------+
==> Vendored Ghostty artifact checksums
dist/ghostty-web.js: OK
dist/ghostty-vt.wasm: OK
dist/index.d.ts: OK
==> TypeScript protocol compiler
==> Tracer compiler, precompression and bundle transfer budget
bun install v1.4.2 (744846f84)
38 packages installed [177.00ms]
$ bun x tsc --project tsconfig.json
bun test v1.4.2 (744846f84)
browser-build.test.ts:
(pass) the browser renderer has no unresolved Vite Node-file shim request [21.08ms]
precompress.test.ts:
(pass) text sidecars round-trip deterministically; compressed formats remain identity [15.62ms]
test/recovery-ui.test.ts:
(pass) compiled recovery UI mode off obeys its URL boundary [4.79ms]
(pass) compiled recovery UI mode preview obeys its URL boundary [2.12ms]
(pass) compiled recovery UI mode 1 obeys its URL boundary [4.92ms]
test/recovery-crypto.test.ts:
(pass) HKDF siblings match independent implementation and bind unwrap to domain, account, kind and version [14.37ms]
(pass) 100 repeated wrapping operations generate independent salts and nonces [15.34ms]
test/recovery-wait.test.ts:
(pass) server remaining wait 0s is accepted through the capability policy maximum [3.29ms]
(pass) server remaining wait 86400s is accepted through the capability policy maximum [1.26ms]
(pass) server remaining wait 90000s is accepted through the capability policy maximum [1.70ms]
(pass) server remaining wait 172800s is accepted through the capability policy maximum [1.58ms]
(pass) malformed or excessive remaining wait -1 is denied [1.58ms]
(pass) malformed or excessive remaining wait 0.5 is denied [1.19ms]
(pass) malformed or excessive remaining wait 172801 is denied [1.28ms]
(pass) malformed or excessive remaining wait 9007199254740992 is denied [1.45ms]
(pass) malformed or excessive remaining wait 90000 is denied [1.53ms]
test/recovery-rotation.test.ts:
(pass) signed-in rotation sends only a local envelope and verifier after acknowledgement [7.62ms]
(pass) abandoned word acknowledgement uploads nothing [2.83ms]
(pass) settled acknowledgement cannot upload later (dismissed) [3.14ms]
(pass) settled acknowledgement cannot upload later (no acknowledgement) [2.80ms]
20 pass
0 fail
376 expect() calls
Ran 20 tests across 6 files. [150.00ms]
$ bun run build.ts
built main.js, chunk-662np71y.js, chunk-6nhq7gz1.js, backdrop.worker.js, faulty-terminal.worker.js, chunk-em1aaf2h.js, chunk-bg6rq3gy.js, chunk-efr1w5a7.js, chunk-axbkkqp1.js, chunk-50xk1qdf.js
chunk-662np71y.js: identity=8373 gzip=3573 brotli=3175 bytes
chunk-efr1w5a7.js: identity=24649 gzip=8391 brotli=7510 bytes
chunk-50xk1qdf.js: identity=713008 gzip=206843 brotli=167718 bytes
faulty-terminal.worker.js: identity=1084 gzip=559 brotli=478 bytes
backdrop.worker.js: identity=241 gzip=210 brotli=158 bytes
chunk-axbkkqp1.js: identity=90 gzip=90 brotli=78 bytes
chunk-bg6rq3gy.js: identity=185 gzip=149 brotli=130 bytes
chunk-6nhq7gz1.js: identity=6464 gzip=3106 brotli=2807 bytes
chunk-em1aaf2h.js: identity=9807 gzip=4014 brotli=3449 bytes
main.js: identity=87507 gzip=32668 brotli=28340 bytes
JavaScript transfer: identity=851408 gzip=259603/307200 brotli=213843/256000 bytes
fonts/MapleMonoNF-Italic.latin.woff2: identity=37148 gzip=37148 brotli=37148 bytes
fonts/MapleMonoNF-Medium.latin.woff2: identity=33904 gzip=33904 brotli=33904 bytes
fonts/MapleMonoNF-Regular.latin.woff2: identity=32852 gzip=32852 brotli=32852 bytes
fonts/MapleMonoNF-SemiBold.latin.woff2: identity=34160 gzip=34160 brotli=34160 bytes
fonts/MapleMonoNF-SemiBoldItalic.latin.woff2: identity=38228 gzip=38228 brotli=38228 bytes
fonts/MapleMonoNF-symbols.woff2: identity=223748 gzip=223748 brotli=223748 bytes
Font transfer: critical=32852/36864 latin=176292/184320 symbols=223748/235520 bytes
==> Rust stream oracle (for the differential test)
==> TypeScript protocol tests
bun test v1.4.2 (744846f84)
src/codec.test.ts:
(pass) wire protocol golden vectors > encodes and decodes each frame exactly as the shared manifest describes [7.29ms]
(pass) wire protocol golden vectors > returns borrowed payload views and writes into reusable buffers [0.21ms]
(pass) wire protocol golden vectors > decodes muxed messages split across WebSocket messages [1.03ms]
(pass) wire protocol golden vectors > rejects oversized, non-canonical, unknown, and malformed frame bytes [0.26ms]
(pass) split mux header preserves trailing Close [0.30ms]
(pass) visibility layouts reject unknown modes, reversed ranges and reserved flags [0.18ms]
src/stream.test.ts:
stream differential: 155 streams, 12906 schedules, zero divergences
(pass) Rust and TypeScript preserve every frame at all boundaries and random multi-splits [3603.89ms]
(pass) maximum frame size and fragmented oversized prefix obey the allocation boundary [8.67ms]
8 pass
0 fail
38804 expect() calls
Ran 8 tests across 2 files. [3.63s]
Step 2 complete:
05928c17d3. Shim visibility codec, strict layouts, maximum preview and every fragmentation boundary. scripts/verify fast exit 0 (serialized tests). Verbatim Rust gate summary:+---------------------------+--------------+
| Rust gate | Result |
+---------------------------+--------------+
| fmt | PASS |
| VT native fmt | PASS |
| clippy | PASS |
| test | PASS |
| cargo-deny | PASS |
| static builds | PASS |
+---------------------------+--------------+
stream differential: 155 streams, 12906 schedules, zero divergences
(pass) Rust and TypeScript preserve every frame at all boundaries and random multi-splits [4059.85ms]
(pass) maximum frame size and fragmented oversized prefix obey the allocation boundary [8.35ms]
8 pass
0 fail
38804 expect() calls
Ran 8 tests across 2 files. [4.09s]
Real shim/PTY probe passes: 9 coalesced markers in the two-second sample; observed receiver min interval 239.99 ms (a descheduled receiver can drain queued messages together). Thumbnail seq 709, live Snapshot seq 724, subsequent raw Output contiguous through 749. Local mode changes preserve framing and never reattach. Fixed Peer state measures 160 bytes, 160,000 bytes for D170 200 sessions x 5 viewers; visibility field tuple 32 bytes and no new per-viewer heap allocation. Thumbnail serialization uses the existing visible-cell engine with a 64 KiB cap and omits unfinished VT syntax; live approximate recovery stays unchanged. Full gate in progress. Evidence: scripts/verify-shim-visibility.py, crates/infraternal-shim/tests/unit/session_budgets.rs, crates/infraternal-shim/tests/unit/terminal.rs.
Integration surface prepared for the canvas controller: import CanvasConnection from apps/tracer/src/canvas-connection (also re-exported by terminal.ts); create one per canvas, then TerminalClient.open({ connection, host, status, ...existing options }) for each window. terminal.setMode("live" | "marker" | "thumbnail") changes delivery without reattach; terminal.dispose() closes only that window. The controller owns connection.dispose(). CanvasStream also exposes attach/detach with per-window painted/input checkpoints. Modes restore before Credit on reconnect. Codec commits are
a73aa81/05928c1; real shim/PTY switching passes; scheduling gate in progress. Client and relay implementation is prepared but not yet committed. No canvas UI is duplicated in this lane.Step 3 complete:
f2d015d79e. Shim visibility scheduling, bounded complete thumbnails, live snapshot boundaries and real-PTY regression. scripts/verify fast exit 0, toolchain loaded before CPUWeight=10000 scope, RUST_TEST_THREADS=1, TRACER_TEST_PORT=4317. Peer=160 bytes; 200x5 viewers=160000 bytes, added viewer allocations=0. Baseline credit retry completed 2097152 bytes in 393.3 ms; deadlines unchanged. Parser fuzz: shim 527106, direct wire 4511634, stream wire 246003 executions, each 31 seconds, no crash (scratch corpora include proposed seeds). Verbatim gate summary:+---------------------------+--------------+
| Rust gate | Result |
+---------------------------+--------------+
| fmt | PASS |
| VT native fmt | PASS |
| clippy | PASS |
| test | PASS |
| cargo-deny | PASS |
| static builds | PASS |
+---------------------------+--------------+
stream differential: 155 streams, 12906 schedules, zero divergences
(pass) Rust and TypeScript preserve every frame at all boundaries and random multi-splits [3239.46ms]
(pass) maximum frame size and fragmented oversized prefix obey the allocation boundary [12.61ms]
8 pass
0 fail
38804 expect() calls
Ran 8 tests across 2 files. [3.27s]
Real daemon/shim/PTY test passes: 12 streams on one mux connection, 8.87 seconds. Stream 24 detaches/reattaches while 11 siblings continue; daemon restart restores each output/input cursor and hidden mode before Credit. Ten marker streams and one thumbnail suppress raw bytes; all hidden streams return through Snapshot and contiguous Output. Preview credit never advances the live cursor. Clippy passes. Evidence: scripts/verify-canvas-streams.py, crates/infraternal/tests/canvas_streams.rs, crates/infraternal-agent/tests/unit/relay.rs. Same test on preserved baseline fails with unexpected leg-B request. Full relay gate in progress.
Step 4 complete:
f28317a007. Per-stream relay visibility, preview credit and exact snapshot recovery; 12 real PTYs pass independent detach/reattach/restart. Focused test 8.87 s. scripts/verify fast exit 0, RUST_TEST_THREADS=1, TRACER_TEST_PORT=4317, preloaded toolchain + CPUWeight=10000. Verbatim gate summary:+---------------------------+--------------+
| Rust gate | Result |
+---------------------------+--------------+
| fmt | PASS |
| VT native fmt | PASS |
| clippy | PASS |
| test | PASS |
| cargo-deny | PASS |
| static builds | PASS |
+---------------------------+--------------+
stream differential: 155 streams, 12906 schedules, zero divergences
(pass) Rust and TypeScript preserve every frame at all boundaries and random multi-splits [5370.28ms]
(pass) maximum frame size and fragmented oversized prefix obey the allocation boundary [13.20ms]
8 pass
0 fail
38804 expect() calls
Ran 8 tests across 2 files. [5.46s]
Server relay step: capability-gated visibility and preview routing now preserve independent credit and live checkpoints. Four focused server tests pass (crates/infraternal-server/src/embedded_regressions.rs). Found interrupted thumbnail-to-live recovery: cached mode=live could restore Attach+Credit before its missing Snapshot. A failing real Unix-socket regression reproduced this; recovery now retains awaiting_live and sends marker -> live before Credit. Browser draft has the matching failure test. Full fast gate running; host load 44.68/33.16/26.82 during focused compilation. No deadline or latency budget changed.
Completed server relay step
ffce6c0161. Four new real Unix-socket regressions pass; pending live repaint survives daemon recovery. scripts/verify fast exit 0. Verbatim gate output:x86 static: 15985424 bytes, no PT_INTERP.
Completed shared CanvasConnection step
dba4720ed6. apps/tracer/test/canvas-connection.test.ts: 2 real WebSocket tests, 47 assertions, 12 writer IDs, one physical connection per epoch, independent cursors/local close, fragmented RPC routing and unnegotiated mode rejection. Tests included in fast gate. scripts/verify fast exit 0; pinned tracer compiler passes. Verbatim gate output:Completed terminal renderer integration
71c61e406b. TerminalClient accepts one shared CanvasConnection, per-window setMode and dirty/preview hooks. Previews reuse bounded repaint queues without advancing live checkpoints; render loop parks after a preview. Interrupted switching restores Snapshot on both transports. Production-build Playwright: snapshot-resume + detached-output, 2 passed in 21.1s (port 4317, 300ms RTT). scripts/verify fast exit 0; 22 tracer units / 423 assertions. Verbatim gate output:Next: real browser/PTY measurements and screenshots, latency gate, evidence.
Real production browser fixture reaches 12 distinct real terminal sessions on one physical WebSocket. Measurements under host contention are not accepted: on infraternal-dev (8 cores), load 27.93 -> 31.24, the existing 25ms authority-read budget in crates/infraternal-server/src/websocket.rs:authority_deadline expires (temporary cfg(test) diagnostic confirms timeout, not rejection). Browser reconnects during 10-live measurement, invalidating the steady-connection comparison. Deadlines and auth behavior remain unchanged. Preserved raw evidence in scratch canvas-browser-contention.log and browser-fixture-contention.log; continue verification and rerun locally after load settles. Private harness fixes: strict 43-character fixture cookie shape, Rust ready marker prefix, and wait for preview boundary before asserting checkpoint stability.
Client recovery finding: in WebSocket CLOSING before its close event, CanvasStream.setMode threw and TerminalClient.sendFrame retired the writer on a queued keystroke. Failing real-WebSocket unit (closing-mode-red.log) and production Ghostty/Playwright regression (closing-browser-red.log, attached successfully then no reattach after close+q) reproduce it. Fix: persist desired mode without sending while unavailable; keep the keystroke in the existing bounded queue until Attach resumes the same writer. Browser regression now passes (300ms RTT, port 4317, 1 passed/20.9s), with exactly +1 output byte. Full fast gate running before this separate atomic commit. Also correcting benchmark-only assertions: correlate exact painted host echo, not cached screen text, and clear the shell command echo before the unique-tail duplication test. No auth deadlines or latency budgets changed.
Completed independent CLOSING recovery fix
494bb1a592. Two failing-before-fix regressions now pass: per-stream mode retained during CLOSING (real WebSocket unit), and production-renderer keystroke queued after close() and painted exactly once after reattach (Playwright, 300ms RTT, port4317, 1 passed/20.9s). Full scripts/verify fast exit0, including twelve real PTYs. Verbatim gate output:Real production browser correctness at 300 ±30 ms RTT passed: 12 distinct PTYs, one shared socket per epoch, independent close (11 remaining), thumbnail checkpoint unchanged (2133-byte preview), interrupted thumbnail→live repaint contains the unique tail once, and input queued during WebSocket CLOSING survives resume. First correct marker→live paint: 360.1 ms. Desktop/mobile evidence: docs/verification/canvas-streams/. Machine infraternal-dev, 8 cores; load 24.98/18.04/20.39.
Performance comparisons remain unaccepted: auth authority-read timeouts under host load 21–27 invalidate steady socket epochs. Four retries discarded; no auth deadlines changed. Full unchanged latency gate still required.
Found shared ssh.session.open expired after 10 seconds although websocket.rs defines the existing #29 connect budget as 60 seconds. Real WebSocket regression with an 11-second response fails before the fix: canvas action timed out at 10125.98 ms (2 pass, 1 fail). Aligning this specific action with the existing server budget; ordinary actions retain 10 seconds and pending calls remain capped at 32.
Native 12-stream fixture failure diagnosed by explicit Close decoding: stream 18, code 1, terminal command queue full; reattach and replay unacknowledged input. The fixture returned one Credit for every tiny Output frame; under load 31–40 on 8 cores these redundant requests saturated the existing eight-command queue. Changed only the test oracle to batch return credit at 64 KiB (same approach as the existing native latency oracle); production queue capacity and backpressure unchanged. Rerunning the full fast gate.
SSH deadline regression passes after matching #29: 3 pass, 0 fail, 49 expect calls, delayed response accepted at 11016.34 ms.
SSH deadline correction committed:
84d908408e. Real delayed-response test: 3 pass, 0 fail, 49 assertions; old code rejected at 10125.98 ms, corrected code accepted at 11016.34 ms. Fast gate exit 0. Verbatim gate summary:+---------------------------+--------------+
| Rust gate | Result |
+---------------------------+--------------+
| fmt | PASS |
| VT native fmt | PASS |
| clippy | PASS |
| test | PASS |
| cargo-deny | PASS |
| static builds | PASS |
+---------------------------+--------------+
stream differential: 155 streams, 12906 schedules, zero divergences
8 pass
0 fail
38804 expect() calls
Accepted steady-epoch 300 ±30 ms RTT comparison, infraternal-dev, 8 cores, CPUWeight=10000: ten real PTYs producing paced yes-style 1024-byte blocks every 1/30 second (30 KiB/s each). 8-second profiles in the SAME socket epoch, one active WebSocket: 10 live = server 15.124% of one CPU core, 308840.94 application WebSocket payload B/s, browser TaskDuration 548.323 ms/s, load 18.56/18.97/20.77; 1 live +9 marker = 3.125%, 31375.10 B/s, 255.057 ms/s, load 17.87/18.81/20.70. Marker→live first correct paint 350.4 ms. First retry discarded; high-rate 8192-byte profiles still invalidated by auth timeouts and are not claimed. Data: docs/verification/canvas-streams/performance.jsonl.
Same real-browser run verified 12 distinct PTYs, preview checkpoint unchanged (856-byte thumbnail), local close with 11 surviving streams, interrupted live-switch replay tail exactly once. Real unpredicted key→paint diagnostic n=31 p50 394.6 ms/p99 422.9 ms is NOT a passing latency-budget claim. Unchanged full latency gate next.
Self-review found an additive-capability edge case: choosing marker before a caps-zero server greeting cached the desired mode, then its Attach threw from the readiness hook and closed the shared connection, disrupting live siblings. Real WebSocket regression fails first (0 pass, 1 fail; canvas fixture timed out at 5092.21 ms). Fix checks negotiated visibility on readiness and locally retires only that hidden/pending-snapshot window with Close 1003 before Attach; live siblings continue. No legacy wire layout changes. Full fast gate required before this separate fix commit.
Release preview serialization, 10,000 iterations, infraternal-dev 8 cores CPUWeight=10000, load 14.41/16.99/19.81: 80x24 thumbnail 21.67 us /365 encoded bytes; 200x60 73.15 us /893 bytes. At 200 sessions x5 viewers x2 Hz: 43.34 and 146.29 CPU ms/s respectively. Existing approximate repaint: 17.55/57.30 us. Live code unchanged; new preview allocation capped at 64 KiB. Evidence docs/verification/canvas-streams/thumbnail.txt.
Unchanged full scripts/verify latency exited 1: auth-browser passed; tracer 73 passed, 26 skipped, 8 failed (19.2m), including timing/feedback/prediction capture and a mock wrapped-ring HTTP hangup. Canvas closing-input regression passed. Native ordinary confirmed input p99 326.88 ms PASS; PTY echo 338.35 FAIL; other-PTY isolation -10.36 ms PASS; same-PTY flood echo 1691.98 ms FAIL. Host 8 cores, load rose 14→58; no own build/benchmark overlapped measurement phases. Safe metrics/summary: docs/verification/canvas-streams/latency.txt.
Paired native n=100: preserved schema-only baseline ordinary echo p99 438.51 /same-PTY flood 780.13 ms; current 438.96 /2306.52 ms. Host load changed substantially. Reverse n=20: current 411.41 /869.60 ms; baseline 337.13 /1052.44 ms. BOTH versions fail unchanged budgets. These runs do not establish absence of regression. Data + binary digest: latency-paired.txt and latency-environment.json.
Latency sign-off is BLOCKED pending stable-host rerun and diagnosis of the existing baseline same-PTY flood failure. No budget or auth deadline changed. Rerunning all eight failed browser checks now; continuing gated test/evidence commits.
Cached-mode startup correction: low-level marker→live choices before the FIRST Attach must not require preview recovery on a legacy peer. Real WebSocket regression fails first (0 pass/1 fail, 5010.90 ms), then passes (1 pass/0 fail, 2 assertions, 46.37 ms). Track whether a writer has ever attached.
Real production browser caught the corresponding renderer mismatch: all twelve distinct real PTYs attached and raw frames arrived, but initial READY paint timed out after 30000 ms. TerminalClient now follows its shared port snapshot requirement for cached pre-attachment choices. The identical real fixture passes at 300 ±30 ms RTT: initial paint, closing input, preview checkpoint, independent close (11 remaining), interrupted live replay tail once, desktop/mobile screenshots. Exit 0; load 40.22/32.34/29.79. Current correctness artifact: docs/verification/canvas-streams/correctness.txt. First correct marker→live paint 402.6 ms under that load; early proof 360.1 ms retained separately.
Pre-job frontend
f27b3femain/terminal/codec sources also fail all four selected motion/palette/predictive-capture/terminal tests; current sources restored exactly afterward. Baseline predicted glyph p99 12.5 ms; adjacent current 40.1 ms with changing host load and both overall probes failing. Prediction CPU passes current 1.4 ms <=2 ms. No claim of absence of regression or latency sign-off. Evidence browser-baseline.txt/browser-latency-current.txt.Native twelve-stream oracle credit batching committed:
bb451039aa. Per-attachment deferred credit resets at detach/restart; unexpected Close reasons retained. Full fast retry exit 0 after the existing detached-producer five-second readiness probe passed. Canvas twelve-PTY restart/mode test passed. Verbatim gate summary:+---------------------------+--------------+
| Rust gate | Result |
+---------------------------+--------------+
| fmt | PASS |
| VT native fmt | PASS |
| clippy | PASS |
| test | PASS |
| cargo-deny | PASS |
| static builds | PASS |
+---------------------------+--------------+
stream differential: 155 streams, 12906 schedules, zero divergences
8 pass
0 fail
38804 expect() calls
Cached-mode legacy isolation and renderer startup: real WebSocket red/green plus twelve real PTYs red before first-paint correction, production browser green afterward.
Head:
c0ef8eb868. scripts/verify fast exit 0. Verbatim gate summary:+---------------------------+--------------+
| Rust gate | Result |
+---------------------------+--------------+
| fmt | PASS |
| VT native fmt | PASS |
| clippy | PASS |
| test | PASS |
| cargo-deny | PASS |
| static builds | PASS |
+---------------------------+--------------+
stream differential: 155 streams, 12906 schedules, zero divergences
8 pass
0 fail
38804 expect() calls
Two full fast runs failed in scripts/verify-agent-snapshot.py:48: cursor/Snapshot changed during the one-byte-grant observation. The test drained before waiting for shell completion, leaving output from the original credit grant queued when its cursor was recorded. Moving that existing drain after completion preserves all grant amounts and deadlines and strengthens the independent shell-progress check. No production credit change. Red evidence retained in fixture-fast-contention.log and fixture-fast-contention-2.log. Latency sign-off remains blocked as previously recorded.
Tiny-credit probe ordering fixed after two failing full fast runs. Four real 12 MiB floods, three unchanged one-byte pauses and three funded 481-byte Snapshots pass; credit sizes and deadlines unchanged.
Head:
b7d52dca4d. scripts/verify fast exit 0. Verbatim gate summary:+---------------------------+--------------+
| Rust gate | Result |
+---------------------------+--------------+
| fmt | PASS |
| VT native fmt | PASS |
| clippy | PASS |
| test | PASS |
| cargo-deny | PASS |
| static builds | PASS |
+---------------------------+--------------+
stream differential: 155 streams, 12906 schedules, zero divergences
8 pass
0 fail
38804 expect() calls
Real HTTPS/daemon/PTY browser measurement harness, twelve-stream resume/close checks, and 80x24/200x60 release serialization. Accepted steady profile: 308841→31375 B/s, server 15.124→3.125% of one core, browser 548.323→255.057 ms/s.
Head:
b2df08f508. scripts/verify fast exit 0. Verbatim gate summary:+---------------------------+--------------+
| Rust gate | Result |
+---------------------------+--------------+
| fmt | PASS |
| VT native fmt | PASS |
| clippy | PASS |
| test | PASS |
| cargo-deny | PASS |
| static builds | PASS |
+---------------------------+--------------+
stream differential: 155 streams, 12906 schedules, zero divergences
8 pass
0 fail
38804 expect() calls
Visibility modes, reserved flags and sequence boundaries added to existing parser seed generator. Seeded 30-second smoke runs: shim 527106, frame 4511634, stream 246003 executions; no crashes.
Head:
d54b1b0be4. scripts/verify fast exit 0. Verbatim gate summary:+---------------------------+--------------+
| Rust gate | Result |
+---------------------------+--------------+
| fmt | PASS |
| VT native fmt | PASS |
| clippy | PASS |
| test | PASS |
| cargo-deny | PASS |
| static builds | PASS |
+---------------------------+--------------+
stream differential: 155 streams, 12906 schedules, zero divergences
8 pass
0 fail
38804 expect() calls
API, actual production screenshots, accepted comparison and scale evidence recorded. Latency sign-off remains blocked; full unchanged latency gate and both baseline/current failures are retained without changing budgets.
Head:
33440a3462. scripts/verify fast exit 0. Verbatim gate summary:+---------------------------+--------------+
| Rust gate | Result |
+---------------------------+--------------+
| fmt | PASS |
| VT native fmt | PASS |
| clippy | PASS |
| test | PASS |
| cargo-deny | PASS |
| static builds | PASS |
+---------------------------+--------------+
stream differential: 155 streams, 12906 schedules, zero divergences
8 pass
0 fail
38804 expect() calls
Implementation and review evidence committed on canvas-streams. Head:
33440a3462. No push/deploy. Final scripts/verify fast exit 0; verbatim summary:+---------------------------+--------------+
| Rust gate | Result |
+---------------------------+--------------+
| fmt | PASS |
| VT native fmt | PASS |
| clippy | PASS |
| test | PASS |
| cargo-deny | PASS |
| static builds | PASS |
+---------------------------+--------------+
stream differential: 155 streams, 12906 schedules, zero divergences
8 pass
0 fail
38804 expect() calls
Twelve real PTYs share one browser WebSocket per epoch; independent close/resume, thumbnail checkpoint preservation, interrupted live repaint and queued closing input verified. Accepted 300±30 ms RTT comparison (10 paced 30 KiB/s PTYs): 10 live vs 1 live+9 marker = 308841 vs 31375 payload B/s; server 15.124 vs 3.125% of one core; browser main thread 548.323 vs 255.057 ms/s. Correct marker→live paint 350.4 ms in that comparison, 402.6 ms in the latest twelve-PTY correctness run. Evidence and production screenshots: docs/verification/canvas-streams/.
BLOCKED acceptance item: no keystroke-regression sign-off. Unchanged scripts/verify latency exit 1:
8 failed
26 skipped
73 passed (19.2m)
Native ordinary PTY echo p99 338.35 ms >334 ms; same-PTY flood 1691.98 ms, growth 1353.63 ms >16.67 ms. Baseline and current native/browser comparisons both fail under varying host load; they do not establish absence of regression. A stable-host rerun and diagnosis of baseline same-PTY flood failure remain necessary. Budgets and authentication deadlines unchanged. Full safe metrics, comparison digest/load and author checklist retained in the evidence directory. The issue remains open.
Independent break-it review starting on review-canvas-streams at target
33440a3462, merge basef27b3fe7a4. Read #107 and parent/backend #98 history and target report. Evidence-only commits; no implementation fixes, push or deploy. Latency acceptance already blocked in author report; testing visibility ordering, shared-stream recovery, decoder boundaries and local performance.CS-R1 — P1 — Browser deadlines cannot close the shared socket
Location: apps/tracer/src/canvas-connection.ts:223, 272–273 (also greeting timeout:215).
Scenario: an otherwise welcomed native browser WebSocket receives incomplete mux bytes 01 14, then no suffix. At its five-second incomplete-frame deadline the new manager calls socket.close(1002), which script APIs forbid. Chromium raises InvalidAccessError, keeps the socket open and performs no resume, stalling every canvas window. Greeting and malformed-frame paths use the same invalid close code.
Failing test: apps/tracer/test/canvas-deadline-review.spec.ts — incomplete-frame deadline closes the native browser WebSocket and resumes.
Evidence: real ws server + native Chromium, port 4402, default 300ms RTT for the test page; 1 failed/16.1s. Expected sockets=2/errors=[] after 10s; actual sockets=1/errors=["Failed to execute 'close' on 'WebSocket': The close code must be either 1000, or between 3000 and 4999. 1002 is neither."]. Full sanitized log will be committed under docs/verification/review-canvas-streams/. Renderer and route mocks are deliberately excluded from this deadline test. Wire §7 completion deadlines and D11/D183 recovery are ineffective.
CS-R2 — P1 — Backpressure retirement permanently strands a canvas window
Location: apps/tracer/src/terminal.ts:852–855, with CanvasStream.receive at canvas-connection.ts:107.
Scenario: server retires only stream 1 with Close(1013) after attachment/output queue pressure. Shared TerminalClient clears attached but neither requests a new AttachTerm nor schedules recovery; its CanvasStream ready hook only runs once per physical socket epoch. The healthy shared socket remains open indefinitely. Queued input is retained but never transmitted until an unrelated whole-socket drop.
Failing test: apps/tracer/test/canvas-stream-close-review.spec.ts — server-retired canvas window reattaches while its sibling remains usable.
Evidence: production Ghostty build + real WebSocket fixture + native Chromium, port 4405; 1 failed/19.2s. Two windows attached; sibling stream 3 echoed one input byte successfully after stream 1 Close. Expected stream 1 attachment count=2 after 10s; actual=1. This breaks wire §6 viewer reattach/replay on stream-local retirement. Unlike the original single-terminal path, shared Close neither closes its socket nor retries the attachment.
Independent review evidence committed: CS-R1 (native browser incomplete-frame deadline) at
782b2fa; CS-R2 (stream-local backpressure retirement with live sibling) at2b152d4. Both tests fail at the behavioral assertion after successful greeting/attachment. Tracer TypeScript check passes. No implementation files changed. Full target-head fast gate still running from a cold private target; Rust clippy passed, workspace test build in progress. Continuing legacy transport and parser checks.Verification review of
33440a3(stopped early by the provider filter after committing tests): CS-R1 P1 browser rejects close(1002) so deadlines stall all canvas windows; CS-R2 P1 stream-local Close(1013) strands a window. Tests on review-canvas-streams (782b2fa,2b152d4, WIP3f335bc). Relaunched canvas-streams run 2 (Sol medium: data path) to fix both plus main-thread cost (target ≤100 ms/s for 10 live) and the latency gate.Repair/performance round starting on canvas-streams, base
33440a3462. Read #107/#98 history and review findings. Reproduce review tests before fixes; preserve engine and budgets. Additive contract proposal for CS-R1: browser client close code 4002 denotes invalid protocol/greeting/incomplete-frame deadline and triggers ordinary resume. Port 4407; all measurements local on infraternal-dev under CPUWeight=10000. No push/deploy. Browser plugin unavailable; production Playwright validation.Review tests cherry-picked separately:
a095ea5(CS-R1),a4ad734(CS-R2),b5a071d(cached-mode WIP). Production browser on port 4407, 300ms RTT: all three fail at behavioral assertions. CS-R1: sockets remains 1 with InvalidAccessError; CS-R2: Attach count remains 1 while sibling echoes. WIP: legacy single-window pre-attach marker->live never paints INITIAL; TerminalClient.setMode unconditionally sets awaitingLiveSnapshot for standalone transport. Keeping and completing this real startup regression. Evidence: scratch canvas-streams/review-red.log. CS-R1 original test now passes (1/1, 14.8s); expanded native greeting/malformed/deadline and resume checks underway.CS-R1 expanded browser checks pass 3/3 (28.7s): greeting, incomplete and malformed frames use 4002; welcomed connections send Resume and replacement becomes ready. First fast run encountered existing vt_credit t1-gate-faithful-1: producer 2097152 bytes completed=False after 1500.7ms; assertion at scripts/verify-vt-credit.py:42. Load 25.73/25.18/26.69 on 8 cores. Formatting/clippy passed, all preceding native suites passed; static builds still running. Will rerun unchanged after cold build. No timeout/budget change.
First fast run finished exit 1; both static targets pass, unchanged native vt_credit probe failed as recorded. Tracer check separately passes. Refined regressions still fail before fixes: cached startup plus stream Close codes 1013 and 1; the latter now tests a painted/acknowledged six-byte prefix before retirement. Evidence refined-red.log. Verbatim fast summary:
+---------------------------+--------------+
| Rust gate | Result |
+---------------------------+--------------+
| fmt | PASS |
| VT native fmt | PASS |
| clippy | PASS |
| test | FAIL (101) |
| cargo-deny | PASS |
| static builds | PASS |
+---------------------------+--------------+
Unchanged fast retry exit1: vt_credit t1-gate-faithful-1 failed at scripts/verify-vt-credit.py:30 (detached initial producer not ready within5s). Load42-46/8cores; no own benchmark/build overlapped native test phase. Both static targets pass15985424/13439056. Continuing repairs/profiling without changing native deadlines. Verbatim summary:
+---------------------------+--------------+
| Rust gate | Result |
+---------------------------+--------------+
| fmt | PASS |
| VT native fmt | PASS |
| clippy | PASS |
| test | FAIL (101) |
| cargo-deny | PASS |
| static builds | PASS |
+---------------------------+--------------+
Steady real12PTY production profile accepted after2 discarded epoch pairs: 10live538.907ms/s, 1live+9marker275.710ms/s. ScopeCPUWeight10000, RTT300+/-30ms, load46.22/42.32/35.44 and45.61/42.31/35.51; geometry57x12. VT writes4.450/3.675ms/s, render61.909/10.950ms/s; render calls564.971/60.374 persecond. Native send and empty-buffer WireDecodeError stack work sampled. Evidence before-profile.log and before-profile/profile-*-2.json; independent instrumentation overlaps receive/render time, not additive.
Additional lifecycle finding from completed WIP fixture: a new window disposed before its first rAF fit raises terminal renderer cell metrics are unavailable, because scheduleFit accesses the released renderer. New production browser regression closing a new canvas window cancels its pending fit fails before the guard (dispose-fit-red.log). Cached-mode implementation already paints INITIAL, but exposed this pending-fit race. Adding closed check inside the queued fit; no contract/budget change. R2 repair tests pass2/2 (59.8s), offsets6/6 and queued q7 confirmed, sibling remains on same socket. Repair commits pending the shared native fast gate.
Cached startup and pending-fit repairs: both real Chromium regressions pass (2/2, 1.6m). Cached/live before first Attach now paints INITIAL on the legacy transport; disposing a new canvas window before its queued fit no longer raises unavailable-cell-metrics and leaves the primary connected. Evidence: apps/tracer/test/canvas-cached-mode-review.spec.ts; scratch cached-and-fit-green.log. No repair commit yet: the third full fast gate is running after two unrelated native VT credit deadline failures under host load.
Third unchanged native fast retry exits 1: fmt, VT native fmt, clippy, cargo-deny and both static builds PASS; test FAIL (101), now vt_credit t1-gate-approximate-1 rather than the earlier faithful-1 case. Host load reached 72.92/66.68/53.55 on eight cores. No Rust or native gate code changed. Full log: scratch repair-fast-third.log. The unweighted browser repair rerun passed all three deadline and both retirement cases (5/5); cached tests hit primary-connection deadlines under load (2 failures). Repeating cached tests in CPUWeight=10000 scope. Parser empty-tail microbench median complete-message decode 3825ns before / 742ns after (five interleaved samples, local scope, 1024B frames); differential rerun awaits its warmed Rust oracle.
Offscreen regression reproduced before viewport tracking: bounded output advanced to offset 6 but renderer painted an offscreen window. IntersectionObserver now parks its loop and paints retained state on visibility; real Ghostty Chromium test passes (1/1, 11.8s). Corrected profiling instrumentation: visibility Snapshot resets replace wasmTerm, so earlier 4.45ms/s VT counter covered only one live stream; aggregate TaskDuration/render/receive numbers remain valid. Re-running corrected before/after VT counters. Warmed streaming differential passes 155 streams / 12906 schedules, zero divergences; package tests 8/8 with 38804 assertions. No terminal engine or dependency changed.
Worker transport round in progress: native browser deadline tests all 3/3 pass through the worker, cached startup/disposal and offscreen output also pass (6/6 total). Retirement fixture was redirecting only the page WebSocket global; dedicated workers use their own global. Configuring its production connection with the explicit fixture URL restores the 1013 regression pass (1/1, 22.7s); running both codes next. Transport uses the same browser WebSocket and TS codec; Ghostty unchanged. Pure output batches at 8ms, control/input-response frames dispatch immediately, empty idle schedules nothing. First worker profile discarded three epoch-changing pairs under load 77–88; no valid CPU result yet. Baseline native release build continues in this job’s scratch snapshot, paused only during measurements.
Credit batching exposed a liveness gap before commit: the legacy real-engine cached spec painted INITIAL but its final seven-byte refund was withheld indefinitely (credit-remainder-red.log). A one-shot 1s settling flush now restores the advertised window; live transitions flush pending credit immediately and owned writes awaiting live recovery also refund immediately. Test now passes (1/1, 17.7s; credit-remainder-green.log). Native merge-base
f27b3felatency gate: all six keystroke p99 metrics fail at load ~80, n=100 each; baseline confirmed 428.13ms, baseline PTY 697.64ms, same-session flood PTY 4995.34ms, against 334ms. Other-session flood isolation passes; same-session isolation fails. Full baseline gate continues through its cold auth-browser build. Head comparison pending; no claim of no regression yet.Additional real-engine lifecycle regressions: disposing owned output before its paint raised "queue consume exceeds queued bytes" (dispose-output-red.log); restoring document visibility left applied output unpainted (foreground-red.log). Closed write callbacks now stop, paint hooks may close their owning window safely, and visibilitychange schedules a retained-state repaint. Both pass (2/2, 19.6s; lifecycle-green.log). Baseline full latency gate has reached its browser suite on 4407; no parallel browser benchmark while it owns that port. Another existing same-code gap noted for the follow-up: legacy TerminalClient.protocolFailure still calls browser close(1002); not yet repaired/tested.
Full fast gate on the current repair working tree (base
b5a071d6) exited 0 after host load dropped. Earlier three native credit deadline failures remain recorded; no native deadlines were changed. Verbatim gate summary:Evidence: /home/kayg/.cache/codex-scratch/canvas-streams/repair-fast-quiet.log. Atomic repair commits are next; browser/performance/latency comparison remains in progress.
CS-R1 committed as
9acc6610: additive browser close 4002, all three deadline/malformed cases recover; 3/3 real-browser tests passed. CS-R2 committed as2842166a: only the retired writer reattaches for Close(1013)/Close(1); 2/2 real-browser tests passed, offsets 6/6, queued input delivered, sibling unchanged, one physical socket. Full repair-tree scripts/verify fast exited 0 (repair-fast-quiet.log); native deadlines unchanged. Worker performance changes remain uncommitted pending valid measurement. Evidence paths: /home/kayg/.cache/codex-scratch/canvas-streams/r1-all-green.log, r2-green.log, repair-fast-quiet.log.Completed atomic steps:
0462804bcached pre-attach legacy compatibility (real gap, retained WIP spec);4841d3c6pending fit/output disposal guards (red then green browser evidence);cdd1934dbounded 64 KiB credit refunds with one settling timer (partial-refund red then green);69797563empty-buffer decoder fast path (median 3825→742 ns, 155 differential streams/12906 schedules, zero divergences);50334d2eone dirty paint and invisible/background parking (both visibility tests red then green). Transport groundwork split by module:24032771shared bounds/messages,c290c00fworker,341c44dffacade. Full repair-tree fast gate exited 0; pinned Ghostty checksum unchanged. Worker integration/performance acceptance pending. Evidence: /home/kayg/.cache/codex-scratch/canvas-streams/{repair-fast-quiet.log,credit-remainder-red.log,credit-remainder-green.log,decoder-bench.log,offscreen-red.log,offscreen-green.log,foreground-red.log,lifecycle-green.log}.Unchanged merge base
f27b3fe7full scripts/verify latency exited 1 on infraternal-dev under CPUWeight=10000, port 4407. Browser phase: 6 failed, 26 skipped, 74 passed (17.8m), setup load 13.09, finish 11.25/10.98/20.22. Failures: offline access layout, motion audit, palette navigation, predictive cursor, terminal/latency probe, access first-paint budget. Native phase ran earlier at load ~80 and failed 7 metrics; do not compare that phase to a quiet head. A new matched lower-load native pair (base load 10.52, head 6.57) has completed: PTY baseline p99 328.27→339.71 ms; flood-other 304.20→300.14; flood-same 497.82→457.25; same-session isolation growth 169.55→117.54 (budget 16.67), both still fail. Baseline-tail difference needs reverse-order confirmation; no no-regression claim yet. Evidence: /home/kayg/.cache/codex-scratch/canvas-streams/base-latency.log and native-matched-pair.log.Worker integration committed as
bb7d43d8(typed modules were split beforehand). Real-browser targeted run: 9 passed, 1 fixture failure; the fixture decoded only the first frame in the legacy combined Hello+Resume message. Corrected it to production WebSocketFrameDecoder; focused rerun 1/1 passed in 13.0 s. Both Close(1013)/Close(1) now pass through the worker with same-writer offsets and sibling continuity; 3 deadline cases, 2 disposal cases, 2 visibility cases also pass. Additional legacy close(1002) path reproduced (replacement peer count stayed 1), corrected to shared 4002, close code/Resume now pass; that follow-up is uncommitted until its final gate. Production repair screenshots: /home/kayg/.cache/codex-scratch/canvas-streams/repair-screens/. Evidence: repairs-all-green.log, legacy-close-red.log, legacy-close-green.log, integration-ts-fast.log. No CPU acceptance claim yet.Performance acceptance remains unmet: valid worker pair with CPU sampling 324.58/141.12 ms/s; without CPU sampling 226.49/109.15; with network observer disabled but physical-byte/epoch counters retained 292.74/94.63. Workload remains 10 × 1024 B at 30 Hz, RTT 300±30 ms, one accepted physical epoch; no target-pass claim. Trace at load 5.78–6.28 shows 4796 native rAF callbacks/8 s for 10 live (two per output), main FunctionCall 534.9 ms and max 4.26 ms. Reusable packages/ui FrameTask prototype now batches owners and yields after 8 ms; 16 KiB VT chunks use a 2 ms per-owner application budget rather than a fixed throughput cap. Red tests observed six callbacks for three windows and 131081-byte single Output/Snapshot writes; green prototype browser run 9 pass + one pre-page /__mock/reset socket hangup, focused retry 1/1 pass. New partial-snapshot overlap regression red: 111 actual fillText operations before complete repaint through engine echo/resize paths; renderer guards and deferred fitting are next. Head
bb7d43d8, prototype uncommitted. Evidence logs under /home/kayg/.cache/codex-scratch/canvas-streams/: worker-quiet-profile.log, worker-acceptance.log, worker-unobserved.log, worker-timeline.log, frame-coalescing-red.log, vt-chunks-red.log, shared-frame-browser.log, shared-frame-dispose-retry.log, partial-snapshot-draw-red.log.Atomic steps committed:
54ce74aflegacy invalid-frame close/resume;58807c5dreusable yielding FrameTask module in packages/ui;32c85394deterministic coalescing/cancellation/fairness/error tests in fast gate (5/5);9aa6a43cworker physical receive counters for payload validation without network observer. Full scripts/verify fast on the shared-frame prototype exited 0; native tests, fmt, clippy, deny and static gates all PASS, pinned engine checksum unchanged, differential oracle 8/8 with 38804 assertions. Green fast gate did not cover the newly found partial recovery issue: actual-draw regression failed with 111 partial glyph operations. Renderer boundary guards, paused recovery activity and deferred fitting now pass that exact test with zero partial draws, plus coalescing and bounded Output/Snapshot tests (4/4, 36.4 s). Terminal integration remains uncommitted for performance and predictive-order checks. Logs: shared-frame-fast.log, frame-batch-five-green.log, partial-snapshot-draw-red.log, shared-frame-guard-green.log, all under /home/kayg/.cache/codex-scratch/canvas-streams/.Native browser trace finding (head
9aa6a43c, terminal frame integration still uncommitted): 12 real PTYs, 10 paced 1 KiB/30 Hz producers, 300 +/-30 ms RTT, CPUWeight=10000, infraternal-dev/8 cores. Native-task-sources accepted one physical epoch: TaskDuration 179.32 ms/s live, 139.48 ms/s marker; targets 100/30 remain unmet. Load 12.31/30.75/36.73 then 16.26/30.72/36.63. Trace source ScheduledActionSendBeginMainFrame: 1268.79/942.43 ms over eight seconds (223/245 tasks); worker PostMessageToWorkerObject: 71.30/93.84 ms. Shared queue removes thousands of per-window animation callbacks, but compositor work dominates. Diagnostic context hints are being measured, not shipped. Evidence: native-task-sources.log and native-task-sources/timeline-{live,marker}-0.json in the job scratch directory.Matched reverse-order native latency: head/base PTY baseline p99 329.19/329.10 ms, other-session flood 321.05/315.48 ms; both pass. Same-session flood 446.07/560.39 ms, both fail existing growth budget. First-order head/base same-session tails 457.25/497.82 ms also both fail. Native Rust source unchanged in this repair round; no consistent ordinary-key regression in the paired runs. Evidence native-reverse-pair.log/native-matched-pair.log. Full head latency gate remains pending.
Browser reporting finding: Playwright request socket-hangup errors include fixture cookie headers in their call log. Two generated gate logs were redacted in place; retained evidence contains no header values. The existing config already disables network traces and arbitrary failure screenshots. Added a first reporter to filter cookie/set-cookie/authorization/proxy-authorization in error message, stack and value before the list reporter. Two header regression tests failed before filtering; an ANSI-styled header test also failed before normalization. All three unit cases now pass. The real request-failure integration exposed the ANSI bypass; its repeat is pending. Source: apps/tracer/redact-reporter.ts and playwright.config.ts. No credential stores inspected.
Full head latency run: exit 1, 11 browser failures, 26 skipped, 84 passed (25.8m), native six failed metrics. Browser load varied through approximately 70 on eight cores, so it is not matched to the merge-base browser load approximately 13. Returning sign-in usable-terminal p99 4099.50 ms passes 5000 ms. Two predictive interleaving tests hooked socket delivery, which now only queues VT; their original assertions pass when the mock hook observes applied VT/reconciled echo before paint (2/2, 21.4s). Current broader repair/prediction rerun is pending. Evidence: head-latency.log (redacted), write-probe-green.log, reporter-{red,ansi-red,final-green}.log.
CPU repeat at head WIP: timestamped 8-second TaskDuration 101.286/38.059 ms/s (10 live / 1 live+9 marker), load 5.98/7.14/11.00 and 7.20/7.37/11.03; first pair was 91.374/25.404. Targets 100/30 are not reliably met yet. Original
33440a3timestamped pair was 463.812/256.230, different host load. Worker16ms experiment 137.864/46.139 reverted to8ms. Scoped alpha-preserving desynchronized canvas context regression red/green; no engine replacement. Real thumbnail:856bytes,375ms firstpaint,2.1ms VT+0.3ms render; checkpoint unchanged. Twelve windows share one WASM memory:67,764,224bytes, not twelve copies. Counter sample intervals fixed separately for CDP/page/server; now running portable harness on minified production with30-second phases. Baseline mixed-input budget also fails3.7ms vs2ms; head3.1-3.2ms, cursor assertions pass. Real reporter request-error integration passes sensitive-header redaction including ANSI styling. Full final fast and source checks running. No pushes.Completed source steps:00873f04 bounded shared-frame VT/paint;
e77890d3scoped alpha-preserving low-latency context;4a71baa9 explicit applied-output mock probe;f16b1d8f sensitive-header reporter;a9eaedeb redaction regressions/gate;7df7787d real-renderer frame/cursor tests;8ff1c489 portable timestamped benchmark. Full repair-tree scripts/verify fast exited0, current source8ff1c489. Full output retained in docs/verification/canvas-streams/repair-round/fast-final.txt; unchanged vendor checksums, UI5/5, tracer28/28, parser8/8;155 differential streams/12906 schedules/zero divergences.Verbatim gate output:
Minified production30s accepted pair173.861/46.923 TaskDurationms/s at load16.20/13.41/12.09 and14.46/13.31/12.10:targets100/30 remain unmet. First2 pairs discarded for physical reconnects. Twelve windows share67,764,224bytes of WASM memory. Production desktop/mobile captures saved for independent review. Merge-base latency rerun now running; head follows with unchanged settings. No budgets widened, no push.
Merge-base
f27b3fe7latency rerun exited 1: 7 browser failures, 26 skips, 73 passes (18.0m); auth browser PASS. Native ordinary and other-session flood checks pass; same-session flood fails. Repaired head starts immediately afterward with the same CPUWeight 10000 scope setting, RTT 300 +/-30ms, port4407 and test configuration. Host load fluctuates; all phase loads retained. Full safe output: docs/verification/canvas-streams/repair-round/latency-base-final.txt. Benchmark diagnostics commitf587f3b4adds opt-in bounded frame duration/allocation counters; TypeScript check exited0.Verbatim comparison baseline:
Head
f587f3b4full latency: 5 failed, 26 skipped, 91 passed (20.4m); all repair/frame cases pass. Three failures are fixture API socket hangups; one focused retry follows. Base: 7 failed, 26 skipped, 73 passed. Native ordinary PTY p99 base/head 332.77/323.89 ms; other-flood 292.33/362.92, same-flood 535.50/833.39, with different external loads, so flood regression remains unresolved. Quiet reverse pair ordinary 329.10/329.19 ms at load 8.69/8.62. Plain production 30s head samples: TaskDuration 76.840/29.069 ms/s at load 5.00/4.48, then 133.647/45.635 at load 20.19/19.81; targets are not reliable across observed load. Original33440a3plain production now 658.408/569.963 at load 33.59/28.63, not a controlled percentage comparison. Diagnostic head frame callback p99/max 5.7/7.3 ms live, .8/1.4 marker, zero >16 ms in the accepted 8s pair. Original diagnostic max 33.3/25.6 ms, eight/two >16. Main-page sampled allocation head 3.740/.626 MB/s versus original 2.779/.716; different throughput/load, no allocation-reduction claim. Evidence being retained under docs/verification/canvas-streams/repair-round/. Final head plain measurement, API retry and final fast gate remain.Final plain production sample accepts epoch 6 after three discarded pairs: all 12 windows attached before/after, socket open throughout endpoints. TaskDuration 145.807/39.609 ms/s at loads 10.48/14.00/17.10 and 10.31/13.54/16.83; targets remain unmet. ThreadTime 138.105/43.426 and ScriptDuration 92.857/18.289. Report retains all passing/missing samples. Focused one-time API retry: key-tray focus PASS, mixed.txt renderer PASS; access first-paint setup p99 1892.50 ms exceeds 1000 ms, reproducing base budget failure. No timing allowances widened. Benchmark endpoint checks/typecheck PASS. Evidence and production screenshots: docs/verification/canvas-streams/repair-round/. Final fast gate follows once browser retry exits. Performance/latency verification remains open.
Handoff at head
badbfc9064; issue remains open. Benchmark stepb42601af11: diagnostic work timers opt-in, open-socket/all-attachment endpoint validation, discarded phase evidence. Evidence stepbadbfc9064: durable production screenshots, final fast output, full base/head latency output and per-item measurements in docs/verification/canvas-streams/repair-round/.CS-R1, CS-R2 and cached-mode repairs pass the full head browser suite. Final plain production TaskDuration 145.807/39.609 ms/s at loads 10.48/10.31, after three invalidated pairs; all twelve windows attached, one epoch. Quiet sample 76.840/29.069 meets targets, later samples do not. Performance Definition of Done is NOT satisfied. VT remains main-thread; parsing is off-thread. Sampled live allocation increased at different throughput/load; no reduction claim.
Full latency base: 7 failed, 26 skipped, 73 passed; head: 5 failed, 26 skipped, 91 passed. Once-only API retry: key-tray and mixed renderer pass; access first-paint p99 1892.50 ms still fails 1000 ms, also failing at base. Native flood regression is unresolved at unmatched loads; quiet ordinary echo base/head 329.10/329.19 ms at loads 8.69/8.62. No allowance changed. Controlled dev-host load evidence is needed to settle flood comparison; the orchestrator controls job contention. Sustained performance targets, full-scale engine memory and physical iPhone cadence remain open.
Final scripts/verify fast: exit 0, no retry. Complete verbatim output committed in repair-round/fast-final.txt. Verbatim gate summaries:
Verbatim differential evidence:
How to test: TRACER_TEST_PORT=4407, run deadline/stream-close/cached/frame specs; retire one stream while typing and check independent sibling checkpoints; run the 30-second real-browser live/marker harness with observer flags unset and retain every load/sample.
Nothing pushed, deployed or closed. Owned build scratch is being removed after durable evidence capture.
Independent review resumed on review-canvas-streams at target
badbfc9064; merge base with devf27b3fe7a4. Read #107 and parent #89 history, project contract, main decisions and author report. Earlier review branch preserved as review-canvas-streams-prior-3f335bc0; prior CS-R1/CS-R2 and cached-mode tests are present in repaired head. Verify repairs and remaining protocol/lifecycle/performance boundaries; implementation unchanged, no push/deploy.CS-R3 (P2): real worker send pressure prevents local writer cleanup. Two bounded Input frames fill exactly 2,097,152 bytes in one main-thread task; CanvasStream.close throws "canvas send queue is full" before removing the writer. TerminalClient.dispose calls this before terminal.dispose, so a closed owner can retain its renderer. Production Ghostty/native Chromium/real module worker/WebSocket, RTT300 +/-30ms, port4425: 1 failed/9.0s; exact-capacity assertion passed. Failing test apps/tracer/test/canvas-dispose-pressure-review.spec.ts; implementation unchanged. Commit follows.
Review step complete: evidence commit
8895e104, failing real-worker send-pressure regression CS-R3. Prior CS-R1/CS-R2/cached/frame repairs independently pass: 16/16 Playwright tests, 2.4 minutes, port4419, 300 +/-30ms RTT, production assets. Browser plugin unavailable; repository Playwright used. Fast gate still compiling cold native/static dependencies. New Rust regression is staged in scratch until the target-head gate finishes, preserving its original test set. Next check: unsupported visibility on a surviving older shim must stop local retries rather than return transient code1.CS-R4 (P1): #107 benchmark/screenshot evidence uses an overlapping primary surface. canvas-real-bench.ts:80–83 reparents #terminal-host without resetting position:absolute/inset:0 from style.css:203–205; its section is not a containing block. Real production Ghostty/Chromium at1280x720: primary host1240x680, intended slot408x164. Failing normal browser test canvas-benchmark-layout-review.spec.ts reproduces the exact mounting; width1240>408. Author desktop/mobile captures show the same coverage over sibling windows; independent capture preserved. Reverify intended ten-visible-window geometry/occlusion and CPU evidence after correcting the harness. Implementation unchanged.
CS-R5 (P2): surviving shims without cap4 are refused with transient Close1 (daemon.rs:491, writer:136–137), which TerminalClient retries at terminal.ts:907. Real daemon/shim/PTY + existing AckBarrier caps_mask=7, RTT300 +/-30ms: three repeated Attach/Visibility cycles returned[1,1,1], expected a single nonretry capability refusal1003. Engine/state remain real; only advertised bit4 is masked. Normal Rust regression canvas_legacy_visibility_review::legacy_visibility_refusal_stops_local_reattachment and Python oracle are committed; implementation unchanged. The browser policy is already covered by passing code1 reattach tests.
Review steps committed:
fb603d54(CS-R4 P1 benchmark primary-host layout:1240x680 over408x164 slot) and e5523c28 (CS-R5 P2 legacy-capability refusals repeat[1,1,1]). CS-R3 send-pressure failure reproduces again without buffer/worker mocks. Prior repair suite16/16 passes. Target-head native test cohort was planned before new Rust regression was restored; fast gate still running, no known failed row yet. Source archive of exactbadbfc90is prepared in owned scratch for latency gates without adding intentional review failures. New performance measurements will be labeled diagnostic because the original layout is invalid; no implementation or budget changes.Fuzz instrumentation build encountered a linker error before executing any input: nightly-2026-10-01 address-sanitized wire_frame_decode has unresolved _sancov_gen coverage symbols. Log retained in owned scratch fuzz-wire-frame.txt. Retrying the same existing target/corpus without the sanitizer; no production code or profile change. Original Rust fast test cohort passed; both static target builds remain in progress. Benchmark/latency measurements will wait for owned compiler work to stop.
Review step: bounded existing wire/shim decoder fuzz targets completed with coverage and sanitizer=none: wire_frame_decode 13,393,713 executions/31s; wire_stream_decode 424,888/31s; shim_frame_decode 1,726,706/31s. No crashes or artifacts. Address-sanitized build did not link (_sancov_gen); this is not an ASan pass. CPUWeight=10000, local infraternal-dev, final load9.11/13.04/13.93. The fast run was interrupted during static compilation after original native tests passed; resuming scripts/verify fast on an exact
badbfc90archive with warm cache. Review head e5523c28.Review step: refined CS-R5 test to allow any permanent refusal code rather than prescribing1003; it now mirrors both browser retry codes1/1013. Re-run still fails with[1,1,1]. Atomic CS-R5 commit amended to
d729bec5(supersedes e5523c28). Implementation unchanged. Full log will be committed under docs/verification/review-canvas-streams/legacy-visibility-red.txt.Verification update: exact-head Rust cohort235 passed/25 ignored; fmt/clippy/deny pass. x86_64 static15,985,424bytes, no PT_INTERP, within16,404,816budget. Aarch64 attempt failed because a review-created cache alias pointed at an unfinished native build (mkdir: File exists). Removed own dangling aliases and queued a full gate rerun; not a target finding. No owner action needed. Raw interrupted/setup-error logs will be retained. Review
d729bec5.Completed review evidence step at4dd4e2bd: committed failing logs and production screenshot forCS-R3/P2,CS-R4/P1,CS-R5/P2;16/16 original repair tests pass;15,545,307 bounded decoder executions without crashes (sanitizer=none, ASan linker limitation explicit). Preserved interrupted/cache-error gate attempts. Full corrected gate and scale/latency measurements remain pending. No implementation change.
Verification step: static gates now pass both targets; independent exact-head ts_verify_fast passes. Target fast attempt failed only vt_credit/t1-gate-faithful-16384 under load
39. Detached dev459070fe normal vt_credit passes(24.81s); its fixture has#118 observer changes. Exact head faithful16384 probe against that baseline binary also passes under load43/37/30, so this does not exonerate the head failure under#118. One fresh exact-head gate is running, then sequential12-PTY performance and full latency gates. A shared debug-cache oracle failure was review setup contamination; cleared local fingerprints and rerun TS gate passes. Review4dd4e2bd.Completed CS-R4 test refinement6e6d5f25: executes canvas-real-bench.ts actual mounting callback through installed TypeScript transpiler; no copied layout. Still fails host1240x680 versus408x164 slot at1280x720, native Chromium/production renderer, port4427. The twelve DOM slots use the existing mock server for this geometry probe; connection success is not its acceptance criterion. Real12-PTY measurement follows separately. Latest fresh head gate has passed vt_credit so far.
Completed fresh exact-head scripts/verify fast: exit0 on
badbfc9064. Rust235 passed/25 ignored; fmt/nativefmt/clippy/deny pass. Static x86_64=15,985,424bytes and aarch64=13,439,056bytes, no PT_INTERP; tracer/protocol/compiler/transfer rows pass. Prior vt_credit failure is retained with passing dev tests; fresh head rerun passed, cause not established. Review6e6d5f25. Real12-PTY/30s measurements now starting; full latency gate follows sequentially. Final comment will include fast output verbatim.Completed scale acceptance guard
d9e560c8(opting in CANVAS_REVIEW_PERF=1, exactbadbfc90fixture, port4431, CPUWeight10000). Twelve distinct real PTYs attach and paint; all four30s phase pairs were rejected for changed socket epochs/attachment state. Zero accepted pairs; rejected TaskDuration ranges10live205.245-344.764ms/s, marker51.274-126.766ms/s, loads22.40-39.65. These are diagnostic rows, not valid budget comparisons. Guard fails expected fixture exit0/actual1; rawJSONL/stderr retained for final evidence. No new attributed implementation defect added to counts; existing CS-R4 invalid layout remains a P1 blocker. Read-only native memory snapshot arrived after teardown and is not valid12-PTY evidence. Full latency gate is running sequentially.Completed CS-R3 stronger regression48120d38: dispose the connected primary terminal with real worker buffering at2,097,152bytes. Failure reports retained=true and rendererReleased=false plus Error: canvas send queue is full; native disposal is observed directly, not inferred. Existing getter descriptor restored before pressure; disposal probe forwards actual method; resources cleaned after observation. Port4449/RTT300±30; review TypeScript check passes. Full exact-head latency gate finished exit1: native7 failed metrics; browser87 passed/9 failed/26 skipped25.8min. Alternating50MB prediction throughput passes −1.96% versus−5% budget. Final evidence commit and verdict follow.
Verdict: merge after fixes. Confirmed open counts P0=0/P1=1/P2=2/P3=0.
Target
badbfc9064; merge basef27b3fe7a4. Local review-canvas-streams head9a354a9cc0.CS-R3/P2: connected primary disposal at2,097,152 pending bytes throws, retains writer and skips renderer disposal (
48120d38).CS-R4/P1: actual benchmark mounting puts1240x680 host in408x164 slot, invalidating independent visible-window layout (
6e6d5f25).CS-R5/P2: real surviving-shim capability refusal retries[1,1,1] instead of stopping; normal Rust regression fails (
d729bec5).Original CS-R1/CS-R2 resolved; independent repair cohort16/16 passes.
Exact-head scripts/verify fast exit0 (235 Rust passed/25 ignored; static15,985,424 and13,439,056bytes; tracer/protocol gates pass). Review TypeScript and Rust formatting pass. Four real12-PTY/30s scale pairs rejected, zero accepted; geometry also remains red. Full latency exit1: seven native metrics failed, browser87 passed/9 failed/26 skipped25.8min. PTY p99 baseline593.60ms/same-session flood1,026.35ms versus334ms; growth432.75ms versus16.67ms at load40.50/34.37/32.30. Paired50MB prediction throughput passes−1.96% versus−5%. No controlled base attribution is claimed. Fuzz15,545,307 executions/three31s runs without crashes, sanitizer=none; ASan linkage incomplete.
Evidence: docs/verification/review-canvas-streams/README.md, full logs and production screenshots. Each confirmed finding has a committed failing regression. Native memory at expected count and physical iPhone behavior remain unverified. No implementation fix. Issue remains open.
scripts/verify fast on exact
badbfc90— complete output, verbatim:Repair round 3 started on canvas-streams, base
badbfc9064. Read #107 and parent #89 history and review2 findings. Merge local dev63b1f10efirst, import review regressions, confirm CS-R4/R3/R5 failures, fix separately. Corrected real-window benchmark and paired dev/head latency measurements run locally on infraternal-dev under CPUWeight=10000. No push/deploy.Merge dev
63b1f10econflicts in terminal.ts (product MuxConnection/font/mobile changes versus visibility/bounded rendering), build.ts worker entrypoint, ts gate coverage, and snapshot oracle. Resolved by retaining dev product API/mobile/font behavior, lane CanvasConnection streams and bounded renderer, both gate cohorts, and dev #118 credit observation. TypeScript check passes; production Chromium stream Close 1013/1 cohort 2/2 passes in 25.7s, port4507, RTT300±30. Full fast gate warming private target cache.Merge verification setup finding: fast test initial_attach_requires_explicit_credit_before_replay failed before spawning the engine: scripts/verify-agent-attach-credit.py:17 FileNotFoundError target/ac3957497. CARGO_TARGET_DIR was private scratch but worktree target/ was absent. Added ignored target symlink to own private build directory; focused unchanged probe rerunning. Other completed Rust rows pass; static cold builds remain active. Browser cohort12/14; focused disposal retry1/1 and closing-input recheck pass. No production deadline/budget changes.
CS-R5 repair contract clarification: existing permanent capability-refusal Close1003 (already used by server mixed-version visibility) will also identify surviving shim visibility refusal. Retrying codes1/1013 remain transient queue pressure. Browser remembers unsupported visibility for that stream across reconnects and reattaches once in ordinary live mode without sending further hints; sibling streams remain unchanged. No wire layout, capability bit, parser, engine, timeout or budget change. Native regression must observe one permanent refusal; renderer regression will prove continued echo and no subsequent Visibility after new mode requests.
Merge gate finding: twelve_real_streams_restore_independent_modes_and_cursors failed at scripts/verify-canvas-streams.py:98: live not yet received. The preceding until predicate waits for all input Acks, hidden markers and thumbnail, but not live Output. Input Ack confirms PTY write, not echo delivery. Keep every existing assertion and the 30s bound; include the live marker in that readiness predicate, as the existing READY/RESUME/LIVE phases already do. Integration-only oracle ordering fix will be recorded in the merge commit. Prior merge fast failure was auth expired_handshake_releases_user_permits; detached dev exact test passes0.73s, so no #118 exoneration claimed. Frontend gates pass with zero protocol divergences.
Merge step complete:
5c5e9412, dev63b1f10e merged into canvas-streams. Integration reconciles Mux product API/mobile/fonts with Canvas visibility/bounded renderer; twelve-stream oracle now waits for live echo rather than only PTY Ack. Full scripts/verify fast exit0, every row passes. Static x86_64 15,981,072bytes / aarch64 13,439,056bytes, both no PT_INTERP. Critical JS gzip289,870/307,200 and brotli241,009/256,000; deferred49,860/51,200 and43,635/45,056. Imported CS-R4 tests2300da98/51dfb536; reproduce next. Full gate retained in scratch merge-fast-ready.log; final durable evidence will include it.CS-R4 reproduced after importing
fb603d54and6e6d5f25: actual benchmark mount gives primary host 1240x680 vs grid slot 408x164 at 1280x720. Production screenshot: scratch/r4-red/benchmark-primary-layout.png (will retain with final evidence). Fix uses bounded relative flex hosts consistently for all twelve windows and persistent headings. Primary regression now passes (1/1, 17.6s); strengthening it to check all twelve canvas bounds. Corrected before measurement usesbadbfc90frontend and current real twelve-PTY fixture, 300 +/-30 ms RTT, CPUWeight=10000, load at start 15.48 16.05 17.96. Run-2 146/40 ms/s remains invalid; new numbers pending. D41/D183 unchanged.CS-R3 reproduced with imported 8895e104/48120d38 regression against a production Chromium build and real worker transport. Exact pending-byte precondition: 2097152. dispose outcome: {"buffered":2097152,"error":"Error: canvas send queue is full","retained":true,"rendererReleased":false}. Evidence: scratch/r4-green-r3-red.log. The strengthened CS-R4 regression checks all twelve host/canvas bounds and passes. Corrected
badbfc90before-run discarded all four pairs (socket epochs 5/8,13/14,17/19,22/23); load rose 15.48 to 56.99. Those CPU results are explicitly invalid, not baseline acceptance. Next: local cleanup before best-effort wire Close, retaining existing shared send bound and healthy sibling socket.Completed CS-R4 layout repair:
f0dafe17. Imported review evidence/acceptance commits as61aef3ec,ecd236e0,d75937dd. Actual mounting regression now verifies all twelve host/canvas bounds and passes; production screenshot r4-green/benchmark-primary-layout.png. scripts/verify fast exits 0 (scratch/r4-fast-ready.log): protocol differential 155 streams / 12906 schedules, 38804 assertions, zero failures; static x86_64 15981072 B, aarch64 13439056 B, both without PT_INTERP. First gate caught only two TypeScript unchecked array accesses in new assertions; corrected before the passing gate. Corrected before-run rejected four socket-changing pairs; no accepted CPU baseline yet. Short head profile is running with unchanged 300 +/-30ms RTT and CPUWeight=10000; acceptance 100/30 remains pending. CS-R3 will release local writer state before a bounded best-effort Close.CS-R3 red-to-green: real worker pending send window remains exactly 2097152 B. Before: dispose threw, writer retained=true, rendererReleased=false. After local retirement before best-effort Close: no exception, writer removed, renderer disposed; production browser regression passes 1/1 (8.1s test, 15.6s total) under CPUWeight=10000. Two initial unweighted attempts did not reach the assertion (startup under load >50, then build starvation); retained separately, not counted as behavioral verification. scripts/verify fast running with RUST_TEST_THREADS=2. The corrected head diagnostic also rejected all four reconnecting pairs; profiles/trace retained but no CPU acceptance claim.
CS-R3 committed
1742f2bdafter scripts/verify fast exit 0 (r3-fast.log); exact 2097152 B pressure regression and five connection tests pass. Final review regression imported asffcbb5a4; all eight review-canvas-streams commits are now imported.CS-R5 reproduced: native real shim/PTY refusal codes [1,1,1]; production worker client with generic server reason fails to reattach after Close1003. Saved pre-fix merged bundle also reproduces main-thread transport failure. Fix assigns existing permanent Close1003 only to unsupported visibility, preserving transient 1/1013; remembers refusal per writer across socket epochs; reattaches live once, suppressing future hints. Reasons are not inspected because websocket.rs forwards generic attachment-ended text.
Green: worker and main-thread browser paths pass 2/2 (26.2s), continued input and reconnect tested, exactly one hint observed; real native test codes [1003], live fallback acknowledged_bytes=29, executed_marker=True. Transient-code cases pass too. Fixture resume handshake corrected to one Welcome; new native echo extension initially reversed Input/Output tags, corrected before passing. TS check exits 0. Full fast gate running. No parser layout, engine, auth deadline, send bound, or performance budget changed (D17/D41/D183).
CS-R5 completed:
b1c75bd9; scripts/verify fast exit 0 (r5-fast.log). Native real-shim regression: one refusal [1003], then 29 input bytes acknowledged and executed live without a hint. Production worker and main-thread clients: both pass continued input and reconnect, exactly one visibility hint each. Existing transient Close1/1013 browser cases also pass. Static x86_64 15981136 B, aarch64 13439056 B, no PT_INTERP; protocol differential 155 streams / 12906 schedules / 38804 assertions, zero failures.Corrected scale repeat is running original
badbfc90frontend on the same current real server/daemon fixture used for the after comparison. All twelve canvases are 424x180, hosts about459x211, slots about461x234 at1440x1000; old full-grid primary is eliminated. RTT300 +/-30ms, CPUWeight10000, load now about12.7. No accepted before/after CPU pair or latency comparison yet. Builds stopped during measurements. Prepared focused real-PTY browser latency driver using the existing production key probe.Corrected before comparison (
badbfc90frontend, same current backend for both): accepted 30s pair on epoch5, all12 connected: 118.916 /41.961 main-thread ms/s at loads13.53/15.73/21.21 and14.70/15.72/21.00; live payload306496 B/s vs requested307200 B/s. Full correctness driver exits0. First repaired-head30s guard rejected four reconnecting pairs; no after acceptance yet.Short8s diagnostic without method/frame/CPU observers accepts continuous twelve-window pair:147.127/41.449 ms/s at load about22 (auth-only marker enabled). Optional wire observation separately shows Close1011 on control stream. New test-only opt-in fixed marker confirms3 authority reads exceeded existing25ms limit during that run; auth deadline/policy unchanged. Profiling shows text drawing and native browser frame work alongside VT work.
Next optimization candidate stays within the pinned renderer: skip a fully dirty but exactly unchanged plain viewport, with bounded exact packed-cell comparisons, stable cursor/theme, no selection/hover/scrollbar, and invalidation on direct drawing, clear/resize/dispose. Complex text/styles retain original path; explicit repaint always draws. No engine or protocol/API choice/change. Measure CPU and keystrokes before acceptance.
Renderer profile follow-up: existing draw path paints a fully dirty ASCII viewport even when all visible cells/cursor are identical. New regression fails on current vendor (expected 72 canvas calls, received 109); proposed pinned-source change passes 11 assertions. Exact cache uses 3 uint32/cell, capped at 8192 cells = 96 KiB/renderer, 32 renderers = 3 MiB; actual 53x10 cohort = 6,360 B/renderer, 12 = 76,320 B. No hashes, parser/credit bypass, new engine or wire change. Explicit redraw/resize, cursor changes, selection/hover/scrollbar and styled/complex text retain existing rendering. Production pixel comparisons and corrected 30s perf guard still pending; no budget success claimed.
Completed diagnostic step
e6422d64: test-only opt-in CANVAS_AUTH_PROBE emits only CANVAS_AUTHORITY_READ_TIMEOUT; observed 3 markers in the earlier real-fixture diagnostic. Production deadline/auth policy unchanged. scripts/verify fast exit 0: all six Rust gate rows PASS; protocol differential 155 streams / 12,906 schedules / 38,804 assertions, 8 pass / 0 fail. Static binaries 15,981,136 B x86_64 and 13,439,056 B aarch64, PT_INTERP absent. Raw gate: scratch canvas-streams/auth-probe-fast.log (will be retained in repair evidence).Added standalone renderer cache regressions; production Chromium pixel test fails on unchanged current vendor at skipped=false, as expected. Cache patch not yet installed; no performance success claimed.
Renderer regression preparation: cache-tests-fast.log ended with exit 143 during vt_reconnect, without a failure assertion or gate summary. Cause not established; full gate rerun in cache-tests-fast-retry.log is in progress. Existing production bundle remains unchanged. Unit regression: 0 pass / 1 fail (expected 72 canvas calls, received 109); Chromium pixel regression: 0 pass / 1 fail, expected skipped=true, received false. Both expose repeated drawing before the proposed fix.
Completed regression step
81afc431: isolated renderer-call and production Chromium pixel tests both reproduced unchanged-viewport redraws on the prior bundle. Full serialized scripts/verify fast exit 0, six Rust rows PASS, TS compiler and production transfer gates passed, differential 155 streams / 12,906 schedules / 38,804 assertions (8 pass / 0 fail). Earlier interrupted and failed runs retained; isolated dev expired-handshake baseline passed in 0.82s, so no #118 exception taken.Strict pinned vendor rebuild completed in scratch; WASM SHA256 remains 5335687263d92325b6736201a107a46cf324a3503f94ac336bf6aa0a184a8d4d. Installed exact bounded renderer cache and added its unit regression to the fast gate. Unit now 1 pass / 0 fail, 11 assertions; Chromium pixels and corrected 30s budgets pending.
Corrected 30s production acceptance guard PASS (2 pass / 0 fail): twelve real PTYs, every canvas 424x180 in its own window, 300±30 ms RTT, profiling/work/network observers disabled. First attempt accepted: all 12 attached before/after both phases, one physical socket, epoch 1.
10 live: CDP TaskDuration 68.271 ms/s (budget 100), payload 309,107 B/s, server 8.466% of one core, load 2.57/4.00/8.62. 1 live + 9 marker: 27.885 ms/s (budget 30), payload 31,658 B/s, server 2.433% core, load 1.84/3.68/8.36. Additional ThreadTime counters 96.977/36.473 ms/s retained, not the guard's TaskDuration metric.
Corrected original frontend before (same real current backend): 118.916/41.961 ms/s; loads 13.53/15.73/21.21 and 14.70/15.72/21.00. Before/after were different load windows; no attribution of the entire delta to code. Old run-2 146/40 remains invalid due primary geometry. Full renderer-module fast gate and back-to-back dev/head keystrokes pending. Evidence scratch cache-after/benchmark.jsonl, screenshots and cache-after-guard.log; will retain in repository.
Renderer-module fast gate failed only expired_handshake_releases_user_permits at auth/socket_tests.rs:151 (103 server tests passed / 1 failed / 10 ignored); fmt, native fmt, clippy, deny and both static binaries PASS. Pinned dev
63b1f10ereproduced the same assertion in the same load window: isolated rerun failed on first attempt, 0 passed / 1 failed, 0.52s (baseline source unchanged). Earlier isolated baseline pass 0.82s and green serialized full run retained as evidence of intermittence.Applying the brief's explicit #118 baseline exception for this row; no deadline/auth test change. Raw outputs: scratch cache-module-fast.log and cache-module-baseline-auth-repeat.log; standalone full TS gate still running because scripts/verify fast stops before TS after a Rust-row failure. Corrected 30s browser guard remains 68.271/27.885 ms/s with intact 12 streams and one epoch.
Completed renderer fix
c792efb9: bounded exact plain-viewport cache in the existing pinned renderer, byte-identical WASM, no dependency/public API/wire change. Unit regression 1 pass / 0 fail / 11 assertions; production pixel comparisons 1 pass / 0 fail (10.6s); full TS/transfer/differential gate exit 0, 38,804 assertions. Native gate uses the documented #118 exception: only expired-handshake assertion failed and pinned dev reproduced it, all other Rust rows passed. Raw head/baseline/TS outputs retained.Corrected 30s guard passes 68.271 ms/s (10 live, budget100) / 27.885 (1 live+9marker, budget30), first attempt, 12 attached, socket epoch1; server CPU 8.466/2.433% core, payload309107/31658B/s. Marker→live303ms, thumbnail checkpoint stable, close/resume11streams. Cache storage6360B per53x10 window, 76320B at12; max96KiB each ×32=3MiB.
Now collecting a same-window uncached/repaired renderer pair on the same backend to separate the earlier load difference, then pinned dev/head keystrokes. No push/deploy.
Back-to-back same-backend 30s pair exposed an implementation error: uncached b1c frontend 76.291/30.738 ms/s; c792 frontend 78.394/33.093, both epoch1 / 12 attached, loads roughly4–5. Therefore the earlier 68.271/27.885 pass is insufficient evidence of a robust improvement; latest marker phase exceeds30.
Cause in pinned lib/ghostty.ts initCellPool(): pool grows but never shrinks after resize, while new comparePlainViewport incorrectly required cells.length === visible cols*rows. All real benchmark windows shrink from initial geometry, disabling the cache. New regression retains16cells for a4x3viewport, with non-ASCII spare tail: current bundle fails (0 pass /1fail); fix compares only the visible prefix, retaining memory cap and pixel checks. Strict vendor rebuild in progress; no final performance claim.
Visible-prefix follow-up now passes the retained-pool regression (1 unit pass /11 assertions) and Chromium pixel comparisons (1 pass,10.2s). Strict pinned rebuild succeeded; WASM unchanged.
Corrected 30s real guard PASS first attempt: 10live TaskDuration50.288ms/s, ThreadTime50.877, payload308825B/s, server8.466%core, load2.21/2.48/4.43; 1live+9marker TaskDuration18.519ms/s, ThreadTime20.327, payload31622B/s, server2.300%core, load2.20/2.45/4.36. All12attached, one socket, epoch1 both phases, profiling disabled. Raw cache-pool-after/benchmark.jsonl and screenshots retained.
For comparison, uncached same-backend pair76.291/30.738ms/s and initial ineffective-cache pair78.394/33.093ms/s (loads4–5); original corrected badb frontend118.916/41.961(loads13–15). Loads differ; report all, no selective pass claim. Full follow-up fast gate and native dev build in progress, then back-to-back real keystrokes.
Completed visible-prefix fix
e9aa4f67. scripts/verify fast exit0: all six Rust rows PASS, retained-pool unit included (1 pass/11 assertions), TS compiler/production transfer passed, differential155streams/12906schedules/38804assertions (8pass/0fail). No #118 exception needed for this gate. Raw cache-pool-fast.log will be retained verbatim.Final corrected30s guard50.288/18.519ms/s vs100/30 budgets; separate ThreadTime50.877/20.327; real throughput308825/31622B/s, server8.466/2.300%core; 12windows remain attached through both phases on epoch1. Loads2.21/2.48/4.43 and2.20/2.45/4.36. Visible cache6360B/window ×12=76320B; cap96KiB ×32=3MiB. Earlier passes/failures and ineffective-cache pair retained transparently.
Dev63b1f10e native binary built15965392B; head static binary15981136B (no PT_INTERP). Preparing real fixture and focused browser rerun, then back-to-back latency, final evidence/docs and final fast transcript.
Back-to-back real browser/raw-PTY latency completed: pinned dev63b1f10e then heade9aa4f67, each own production bundle/native binary; common real current fixture/300±30ms relay, Chromium149.0.7827.55, no compiler during sampling, 120keys/mode ×2modes/head (4serialized batches30).
Prediction ON: confirmed echo p50/p99 dev398.0/432.4ms → head363.6/398.1ms; local prediction p9915.9→13.9ms. Loads dev7.69/8.12/6.88, head7.62/8.62/7.34.
Prediction OFF: confirmed echo dev392.6/430.8→head364.5/382.4ms; loads dev10.62/8.76/7.16, head5.55/7.96/7.17. No observed echo/prediction latency regression; lower OFF load means do not attribute its whole improvement to code.
Raw field cpuP99Ms is input-onData→wire-send wall span, not CPU: ON0.9→1.0ms, OFF2.8→0.3ms. These and all480individual samples retained in latency-dev.log/latency-head.log; screenshots retained. Focused final browser regressions7/7passed59.8s. Final corrected CPU50.288/18.519ms/s; evidence/docs and final fast transcript remain.
Finished repair round 3 on canvas-streams, head
23895a5b90. Dev63b1f10e merged; all review-canvas-streams commits through9a354a9c imported. CS-R4/R3/R5 fixed in separate logical commits; renderer CPU follow-ups and evidence separately committed. No push/deploy, issue stays open.Corrected original before118.916/41.961ms/s → final50.288/18.519 (budgets100/30), 30s/phase, twelve real PTYs, every canvas424x180 in its own window, 300±30ms RTT. Final one socket/epoch1, all12attached throughout, observers disabled; loads2.21/2.48/4.43 and2.20/2.45/4.36. Additional ThreadTime50.877/20.327; payload308825/31622B/s, server8.466/2.300%core. Loads differ and all superseded/failed attempts are retained. Old146/40 run2 remains invalid.
Back-to-back pinned dev/head, real raw PTY/production browser, 120keys/mode: echo p99 predictionON432.4→398.1ms; OFF430.8→382.4ms. Local prediction p9915.9→13.9ms. Input-to-send wall p99 ON0.9→1.0ms/OFF2.8→0.3ms (not CPU). No observed echo/prediction latency regression; loads and all480samples retained.
Final focused browser7/7 pass; DPR3 layout/pixels2/2 pass. Cache typed-array payload6360B/window ×12=76320B, cap96KiB ×32=3MiB; native WASM byte-identical. Production screenshots/raw red-green tests/gates/profiles/latency + author checklist: docs/verification/canvas-streams/repair-round-3/README.md. Every evidence link verified tracked. Final scripts/verify fast exit0, six Rust rows PASS, TS/transfer PASS, differential155streams/12906schedules/38804assertions. No #118 exception needed for final run; earlier baseline-proven exception remains recorded. Temporary baseline/targets will be removed after this record is posted.
Complete final gate output follows verbatim in 3 parts; concatenated raw transcript SHA256 f4c7c3c3416089bd28a2f81c4fc4054f35c10a8a0d302e76358c70f3a19e2e4f.
Part 1/3:
Final gate verbatim continuation; head
23895a5b90.Part 2/3:
Final gate verbatim continuation; head
23895a5b90.Part 3/3:
Independent verification resumed at target
23895a5b90; branch review-canvas-streams, merge base dev63b1f10e21. Prior review branch preserved as review-canvas-streams-prior. Prior findings and repair record read; verify repaired regressions, remaining resource/visibility boundaries, CPU and latency claims. No implementation edits, push or deploy.CS-R6 P2 confirmed and committed
7ef5cdd123: local send pressure permanently removes a valid input writer (terminal.ts:1733-1740,1756-1760). Production Ghostty/native Chromium/real worker, port4489,300±30ms RTT; buffered2097152B, queuedInput1B, retained=false, sharedSocketReady=true. Test canvas-input-pressure-review.spec.ts fails at retained-writer assertion; separate producer owns filler acknowledgments, no buffer/send mocks. Evidence docs/verification/review-canvas-streams/round-3/input-pressure-red.log. Implementation unchanged; fast gate and repaired browser cohort still running.Repair verification completed on review head7ef5cdd1, target23895a5b: production browser cohort20/20 passes in3.4min, port4485,300±30ms RTT. Includes all prior CS-R1/R2/R3/R4/R5 browser regressions, worker/main refusal, complete snapshot drawing, visibility parking and cache pixel agreement. No implementation edits. New CS-R6 input-pressure regression remains red; repeat/typecheck and native/static gates pending. Full output will be committed under docs/verification/review-canvas-streams/round-3/.
Native verification completed for target23895a5b (review7ef5cdd1): all workspace native tests passed, including legacy_visibility_refusal_stops_local_reattachment, twelve_real_streams_restore_independent_modes_and_cursors, shim visibility, vt_credit and auth socket/review3 cohorts. DPR3 production layout/pixel checks2/2 pass19.9s. CS-R1–R5 now independently resolved; sole new confirmed gap CS-R6/P2. New input-pressure test reproduces twice; review TypeScript compiler passes. Static builds and then real scale/latency gates remain.
Correction to prior native status: completed canvas/credit cohorts pass, but full workspace native gate failed expired_handshake_releases_user_permits at socket_tests.rs:151 (server103 passed/1 failed/10 ignored). That assertion was missed in a progress summary; no all-workspace pass is claimed. Detached current dev7d6df447 baseline has byte-identical socket_tests.rs; own baseline build and static gate are in progress. Setup-only errors (copied OpenSSL build metadata and omitted make/perl) corrected, not target findings. Fuzz smoke completed25,538,086 executions total (frame22633086, stream618090, shim2286910), three31s runs, sanitizer=none, no crash artifacts; final load18.32/13.87/13.98. CS-R6 remains committed7ef5cdd1.
kayg referenced this issue2026-10-28 17:53:56 +00:00