Perf: returning sign-in to usable terminal takes ~5 s #52

Open
opened 2026-10-07 07:17:44 +00:00 by kayg · 22 comments
Owner

Owner (2026-10-07): returning sign-in takes about 5 s from 'Continue with passkey' to a usable terminal; it should be much faster. The first sign-in (welcome glitch) may stay longer on purpose (the wow moment). DECISIONS 122: optimise for the India↔Germany round trip (about 150–200 ms). Step 1: measure the waterfall (measure-only job). Step 2: fix (prefetch, parallelise, fewer round trips, remove artificial waits) after mobile-recovery merges.

Owner (2026-10-07): returning sign-in takes about 5 s from 'Continue with passkey' to a usable terminal; it should be much faster. The first sign-in (welcome glitch) may stay longer on purpose (the wow moment). DECISIONS 122: optimise for the India↔Germany round trip (about 150–200 ms). Step 1: measure the waterfall (measure-only job). Step 2: fix (prefetch, parallelise, fewer round trips, remove artificial waits) after mobile-recovery merges.
Author
Owner

Start: detached checkout (no named branch), deployed base/HEAD 191c2830c6; clean worktree. Measure-only per D122; no product edits.

Start: detached checkout (no named branch), deployed base/HEAD 191c2830c6f4a2a69d18ab7af2fd6a6814c4a2c4; clean worktree. Measure-only per D122; no product edits.
Author
Owner

Step complete at base SHA 191c2830c6: Bun 1.4.2 frozen install, tracer TypeScript check, and production build all passed. The real dist contains main.js, six code chunks, and two workers. No product source changed; release server build is in progress.

Step complete at base SHA 191c2830c6f4a2a69d18ab7af2fd6a6814c4a2c4: Bun 1.4.2 frozen install, tracer TypeScript check, and production build all passed. The real dist contains main.js, six code chunks, and two workers. No product source changed; release server build is in progress.
Author
Owner

Step complete at base SHA 191c2830c6: the x86_64-unknown-linux-musl release server built successfully in 4m26s; reports static-PIE, stripped, 16,120,912 bytes. Production tracer check/build passed; the CDP harness is uncommitted at scripts/browser-auth/measure-returning-signin.mjs. Next: fresh-server enrollment and 30 returning sign-ins.

Step complete at base SHA 191c2830c6f4a2a69d18ab7af2fd6a6814c4a2c4: the x86_64-unknown-linux-musl release server built successfully in 4m26s; reports static-PIE, stripped, 16,120,912 bytes. Production tracer check/build passed; the CDP harness is uncommitted at scripts/browser-auth/measure-returning-signin.mjs. Next: fresh-server enrollment and 30 returning sign-ins.
Author
Owner

Correction to the prior build note: file confirms the release binary is static-PIE and stripped; stat reports 16,120,912 bytes.

Correction to the prior build note: file confirms the release binary is static-PIE and stripped; stat reports 16,120,912 bytes.
Author
Owner

Harness debug, no product finding: the fresh owner enrolled on 191c283, but the smoke run timed out before sampling because the paint hook watched WebGL. The production Ghostty chunk apps/tracer/dist/chunk-rq18a73n.js uses Canvas2D (2 getContext("2d") call sites; no WebGL draw method names). The init-script hook now observes Canvas2D and WebGL and accepts the first Snapshot or Output frame. Re-running; no product files changed.

Harness debug, no product finding: the fresh owner enrolled on 191c283, but the smoke run timed out before sampling because the paint hook watched WebGL. The production Ghostty chunk apps/tracer/dist/chunk-rq18a73n.js uses Canvas2D (2 getContext("2d") call sites; no WebGL draw method names). The init-script hook now observes Canvas2D and WebGL and accepts the first Snapshot or Output frame. Re-running; no product files changed.
Author
Owner

Harness finding: the real release server enrolled the virtual owner but the embedded PTY shim returned terminal open refused. A direct shim probe identified the cause: its Unix socket path exceeded SUN_LEN because XDG_RUNTIME_DIR was nested under target/ (error: path must be shorter than SUN_LEN). I’m moving only the temporary runtime dir to the one-character worktree path /r; resulting session socket path is 105 bytes. No product code changed.

Harness finding: the real release server enrolled the virtual owner but the embedded PTY shim returned terminal open refused. A direct shim probe identified the cause: its Unix socket path exceeded SUN_LEN because XDG_RUNTIME_DIR was nested under target/ (error: path must be shorter than SUN_LEN). I’m moving only the temporary runtime dir to the one-character worktree path /r; resulting session socket path is 105 bytes. No product code changed.
Author
Owner

Harness finding updated: the nested XDG runtime path caused the shim to reject its Unix socket as longer than SUN_LEN. After moving the temporary runtime directory to worktree/r, a direct static-release shim probe created its session socket successfully; measured socket pathname is 105 bytes. This is harness setup only; no product changes.

Harness finding updated: the nested XDG runtime path caused the shim to reject its Unix socket as longer than SUN_LEN. After moving the temporary runtime directory to worktree/r, a direct static-release shim probe created its session socket successfully; measured socket pathname is 105 bytes. This is harness setup only; no product changes.
Author
Owner

Capture milestone: 0 ms one-way, cold-cache trial 1: click-to-terminal-paint 693.7 ms; click-to-passkey-request 11.8 ms; virtual passkey duration 2.3 ms. login-start/finish, unlock-session, wraps, unlock-finish and session response-header times were 8.8/14.5/11.3/7.1/6.3/10.0 ms. Cold core chunk transferred 681,136 bytes in 216.5 ms and Geist Sans 69,952 bytes in 209.9 ms. Warm trial 2 painted in 212.2 ms; keydown-to-echo-paint 25.3 ms. Full groups are running with source-admission pacing.

Capture milestone: 0 ms one-way, cold-cache trial 1: click-to-terminal-paint 693.7 ms; click-to-passkey-request 11.8 ms; virtual passkey duration 2.3 ms. login-start/finish, unlock-session, wraps, unlock-finish and session response-header times were 8.8/14.5/11.3/7.1/6.3/10.0 ms. Cold core chunk transferred 681,136 bytes in 216.5 ms and Geist Sans 69,952 bytes in 209.9 ms. Warm trial 2 painted in 212.2 ms; keydown-to-echo-paint 25.3 ms. Full groups are running with source-admission pacing.
Author
Owner

First completed group: 0 ms one-way, 10 runs: click-to-terminal-paint p50 212.2 ms / p99 693.7 ms; passkey-resolved-to-paint 192.4 / 679.6 ms; keydown-to-echo-paint 11.5 / 25.3 ms. p99 is the maximum of 10 samples. The 100 ms one-way cold trial 1 painted in 2,361.8 ms; each of its six post-click auth calls took 202.4–207.0 ms, and the core chunk and Geist Sans each took about 210 ms concurrently. Continuing 100/200 ms groups.

First completed group: 0 ms one-way, 10 runs: click-to-terminal-paint p50 212.2 ms / p99 693.7 ms; passkey-resolved-to-paint 192.4 / 679.6 ms; keydown-to-echo-paint 11.5 / 25.3 ms. p99 is the maximum of 10 samples. The 100 ms one-way cold trial 1 painted in 2,361.8 ms; each of its six post-click auth calls took 202.4–207.0 ms, and the core chunk and Geist Sans each took about 210 ms concurrently. Continuing 100/200 ms groups.
Author
Owner

Measurement method finding: under CDP's 100 ms one-way emulation, local WebSocket Hello→Welcome and Attach→Output frames still arrived in about 2–10 ms, so CDP did not shape established WebSocket traffic. I will not use those 100/200 ms samples as end-to-end latency results. I’m adding one-way delay to each direction in the test-only local WebSocket bridge while retaining CDP shaping for HTTP, then rerunning all groups. The 0 ms group is unaffected.

Measurement method finding: under CDP's 100 ms one-way emulation, local WebSocket Hello→Welcome and Attach→Output frames still arrived in about 2–10 ms, so CDP did not shape established WebSocket traffic. I will not use those 100/200 ms samples as end-to-end latency results. I’m adding one-way delay to each direction in the test-only local WebSocket bridge while retaining CDP shaping for HTTP, then rerunning all groups. The 0 ms group is unaffected.
Author
Owner

WebSocket emulation smoke passed at 100 ms one-way: constructor→open 245.4 ms, Hello→Welcome 205.8 ms, Attach→first terminal frame 236.1 ms, and keydown→echo paint 218.9 ms. These are one-run method checks only. The harness now checkpoints samples without recording inline WASM data; starting the 10-run groups.

WebSocket emulation smoke passed at 100 ms one-way: constructor→open 245.4 ms, Hello→Welcome 205.8 ms, Attach→first terminal frame 236.1 ms, and keydown→echo paint 218.9 ms. These are one-run method checks only. The harness now checkpoints samples without recording inline WASM data; starting the 10-run groups.
Author
Owner

Corrected full capture, 0 ms one-way group (n=10): click-to-terminal-paint p50/p99 337.2/1,418.9 ms; passkey p50/p99 3.3/24.6 ms; passkey-resolved-to-paint 318.9/1,389.3 ms; keydown-to-echo-paint 12.4/22.0 ms; WebSocket open 78.9/122.2 ms. Three trials had an extra 431–444 ms between AttachTerm and first output; group-start load average was 13.89 on the 8-core host. At 100 ms one-way, cold trial 1 was 3,193.4 ms; the six auth calls took 202–215 ms each, Hello→Welcome 201.7 ms, Attach→output 619.1 ms (including a 419 ms gap). p99 is max of 10. Continuing the group.

Corrected full capture, 0 ms one-way group (n=10): click-to-terminal-paint p50/p99 337.2/1,418.9 ms; passkey p50/p99 3.3/24.6 ms; passkey-resolved-to-paint 318.9/1,389.3 ms; keydown-to-echo-paint 12.4/22.0 ms; WebSocket open 78.9/122.2 ms. Three trials had an extra 431–444 ms between AttachTerm and first output; group-start load average was 13.89 on the 8-core host. At 100 ms one-way, cold trial 1 was 3,193.4 ms; the six auth calls took 202–215 ms each, Hello→Welcome 201.7 ms, Attach→output 619.1 ms (including a 419 ms gap). p99 is max of 10. Continuing the group.
Author
Owner

Corrected full capture, 100 ms one-way group (n=10): click-to-terminal-paint p50/p99 2,120.7/3,193.4 ms; passkey-resolved-to-paint 1,898.6/2,985.1 ms; keydown-to-echo-paint 202.3/219.4 ms; Hello→Welcome 201.2/220.1 ms; Attach→first frame 219.1/633.8 ms; WebSocket constructor→open 204.6/261.3 ms. Each HTTP auth endpoint response p50 was 202–204 ms. Cold trial is included; p99 is max of 10. Group load average moved 4.32→9.03 on the 8-core host. The 200 ms group is running.

Corrected full capture, 100 ms one-way group (n=10): click-to-terminal-paint p50/p99 2,120.7/3,193.4 ms; passkey-resolved-to-paint 1,898.6/2,985.1 ms; keydown-to-echo-paint 202.3/219.4 ms; Hello→Welcome 201.2/220.1 ms; Attach→first frame 219.1/633.8 ms; WebSocket constructor→open 204.6/261.3 ms. Each HTTP auth endpoint response p50 was 202–204 ms. Cold trial is included; p99 is max of 10. Group load average moved 4.32→9.03 on the 8-core host. The 200 ms group is running.
Author
Owner

200 ms one-way run, trials 1–5: HTTP calls are ~403–422 ms each and WS upgrade ~405–426 ms; Hello→Welcome ~404–470 ms. Cold trial click→paint 5,836 ms with 4 cold assets (8.1 KB, 22.4 KB, 69.9 KB font, 681.1 KB core chunk); warm trials are 3,806–4,477 ms. Attach→first terminal frame includes repeated extra 400–470 ms gaps (417–873 ms total), beyond the injected ~400 ms one-way-trip. Five trials remain.

200 ms one-way run, trials 1–5: HTTP calls are ~403–422 ms each and WS upgrade ~405–426 ms; Hello→Welcome ~404–470 ms. Cold trial click→paint 5,836 ms with 4 cold assets (8.1 KB, 22.4 KB, 69.9 KB font, 681.1 KB core chunk); warm trials are 3,806–4,477 ms. Attach→first terminal frame includes repeated extra 400–470 ms gaps (417–873 ms total), beyond the injected ~400 ms one-way-trip. Five trials remain.
Author
Owner

200 ms group complete, n=10: click→passkey request p50/p99 407.5/439.8 ms; virtual passkey 2.1/8.8 ms; click→terminal paint 4,123.4/5,836.2 ms; passkey-resolved→paint 3,715.7/5,395.2 ms; keydown→echo 402.2/432.9 ms. HTTP medians by step are 405–406 ms; WS open 410.3 ms, Hello→Welcome 403.9 ms, Attach→first frame 814.3 ms (p99 873.4), WASM compile+instantiate 3.1 ms. p99 is max for n=10. Full group data: target/signin-waterfall-results.json (ignored build output).

200 ms group complete, n=10: click→passkey request p50/p99 407.5/439.8 ms; virtual passkey 2.1/8.8 ms; click→terminal paint 4,123.4/5,836.2 ms; passkey-resolved→paint 3,715.7/5,395.2 ms; keydown→echo 402.2/432.9 ms. HTTP medians by step are 405–406 ms; WS open 410.3 ms, Hello→Welcome 403.9 ms, Attach→first frame 814.3 ms (p99 873.4), WASM compile+instantiate 3.1 ms. p99 is max for n=10. Full group data: target/signin-waterfall-results.json (ignored build output).
Author
Owner

Final measurement report for dev 191c2830c6. Built the x86_64-musl release binary and production tracer dist; fresh local data dir; local release server; Chromium 149.0.7827.55 with virtual resident UV authenticator and PRF; saved public terminal ID; 10 runs at each setting. CDP request latency was 0/200/400 ms for 0/100/200 ms one-way, unlimited throughput; WebSocket application frames were delayed one-way in each direction. Host: Intel i9-9900K, 8 CPUs; loadavg varied 4.32–13.89. p99 is nearest-rank max for n=10. One cache-cold run per group; the other nine use warm browser cache. Full sanitized marks/network evidence: target/signin-waterfall-results.json.

Waterfall p50/p99 ms:

Step 0 ms one-way 100 ms 200 ms
Page nav→sign-in button ready (pre-click) 47/292 630/1,258 1,246/2,145
Click→WebAuthn request 17/31 206/224 408/440
Virtual passkey duration 3/25 2/7 2/9
Passkey resolved→first terminal frame painted 319/1,389 1,899/2,985 3,716/5,395
Click→first terminal frame painted 337/1,419 2,121/3,193 4,123/5,836
WS constructor→open 79/122 205/261 410/426
Hello→Welcome 5/15 201/220 404/470
AttachTerm→first Output received 12/444 219/634 814/873
WASM compile+instantiate 2/4 2/13 3/13
First keydown→echo painted 12/22 202/219 402/433

CDP request→response-header p50/p99 ms, by latency:

Call 0 ms 100 ms 200 ms
/auth/login-start 5/24 205/214 406/430
/auth/login-finish 6/25 205/211 406/412
/auth/unlock-session 4/16 204/209 406/415
/auth/wraps 5/16 204/218 405/409
/auth/unlock-finish 4/15 204/206 406/411
/auth/session after unlock 4/22 205/213 405/415
Boot also serializes /auth/status then /auth/session before the button; at 200 ms each is about 403 ms p50, so readiness costs two more pre-click RTTs.

Findings and cuts (estimates at 200 ms one-way; overlapping savings are not additive):

  1. Cold cache adds four serialized fetch RTTs after auth: 22 KB chunk (~410 ms), Geist Sans font (70 KB, ~431 ms), Ghostty chunk (681,136 transfer bytes, ~410 ms), and Vite external chunk (~1.8 KB, ~434 ms): about 1.7 s. Prefetch these during the passkey prompt. The WASM is a 423,939-byte inline data URL, not a separate HTTP request; compile+instantiate is 3 ms p50, with the cold resource decode/fetch timing about 120 ms. Local ServeDir sent the Ghostty chunk without Content-Encoding; build gzip is 197,383 bytes, a 483 KB reduction before any bandwidth-dependent saving.
  2. After assertion, parallelize /auth/unlock-session and /auth/wraps, then pass through the hostname already returned from unlock-session so showTerminal does not issue the final /auth/session. wraps calls unlock_session internally. These remove two serial RTTs, about 800 ms; validate concurrent session updates in the auth contract.
  3. Start the authenticated WebSocket immediately after unlock-finish, while lazy chunks/fonts load. Current auth requires an unlocked cookie at upgrade, but the upgrade and Hello/Welcome can overlap that work; move up to two RTTs (~800 ms) off the terminal critical path. A TCP/TLS preconnect can happen earlier; current /v1/ws rejects an unauthenticated upgrade.
  4. The code waits for Welcome before sending AttachTerm; attaching the saved public session as part of the initial handshake could save one RTT (~400 ms). Independently, in 6/10 runs at 200 ms there is another ~400 ms between the first Attach Ack and first Output despite Credit being sent with AttachTerm. No 400 ms timer exists on this path; trace attach/credit/embedded-agent scheduling. This could be another RTT if the wait is removable.
  5. The page serializes /auth/status and /auth/session before rendering sign-in; parallel calls save one pre-click RTT (~400 ms). /auth/login-start also gates the native passkey prompt by one RTT (~400 ms); issuing it before click is a candidate only after checking expiry and abandoned-ceremony admission.

Timer/gate review: onboarding gives the loading counter a 400 ms display threshold but does not await it. The 2,600 ms Welcome timer is first-setup-only. Backdrop start is delayed 600 ms and stop removes it after a 260 ms timer, but neither fade nor removal is awaited by showTerminal. No transitionend/animationend gate was found. Startup races Geist Mono load against an 800 ms timeout; core-screen mount awaits Geist Sans, so the cold 431 ms font request gates first terminal paint. Ghostty render-idle 700 ms occurs after attach/output. Returning login uses firstSetup=false and skips Welcome.

Round trips and proposed budget: warm 200 ms path is about 9 RTT-equivalents after passkey (5 sequential auth HTTP calls + WS upgrade + Hello/Welcome + roughly two RTTs to first Output), about 10 including click→passkey challenge. The cold p99 is about 13.5 RTT-equivalents after passkey / 14.5 from click because of four asset RTTs; browser startup adds two pre-click RTTs. Practical target: 5 RTT + 150 ms after passkey (2.15 s at 200 ms one-way): 3 auth turns after parallelizing identity/wrap fetch and removing the final session read, plus a 2-turn WS upgrade/Hello+Attach path, with assets prefetched. A 2-RTT target (950 ms at 200 ms one-way including 150 ms local work) needs a larger auth/socket protocol change: pre-open an unauthenticated socket, return wraps with assertion verification in turn one, then combine unlock completion and Attach in turn two. Current /v1/ws requires an unlocked cookie, so this is for owner/orchestrator review, not a selected design.

Final measurement report for dev 191c2830c6f4a2a69d18ab7af2fd6a6814c4a2c4. Built the x86_64-musl release binary and production tracer dist; fresh local data dir; local release server; Chromium 149.0.7827.55 with virtual resident UV authenticator and PRF; saved public terminal ID; 10 runs at each setting. CDP request latency was 0/200/400 ms for 0/100/200 ms one-way, unlimited throughput; WebSocket application frames were delayed one-way in each direction. Host: Intel i9-9900K, 8 CPUs; loadavg varied 4.32–13.89. p99 is nearest-rank max for n=10. One cache-cold run per group; the other nine use warm browser cache. Full sanitized marks/network evidence: target/signin-waterfall-results.json. Waterfall p50/p99 ms: | Step | 0 ms one-way | 100 ms | 200 ms | |---|---:|---:|---:| | Page nav→sign-in button ready (pre-click) | 47/292 | 630/1,258 | 1,246/2,145 | | Click→WebAuthn request | 17/31 | 206/224 | 408/440 | | Virtual passkey duration | 3/25 | 2/7 | 2/9 | | Passkey resolved→first terminal frame painted | 319/1,389 | 1,899/2,985 | 3,716/5,395 | | Click→first terminal frame painted | 337/1,419 | 2,121/3,193 | 4,123/5,836 | | WS constructor→open | 79/122 | 205/261 | 410/426 | | Hello→Welcome | 5/15 | 201/220 | 404/470 | | AttachTerm→first Output received | 12/444 | 219/634 | 814/873 | | WASM compile+instantiate | 2/4 | 2/13 | 3/13 | | First keydown→echo painted | 12/22 | 202/219 | 402/433 | CDP request→response-header p50/p99 ms, by latency: | Call | 0 ms | 100 ms | 200 ms | |---|---:|---:|---:| | /auth/login-start | 5/24 | 205/214 | 406/430 | | /auth/login-finish | 6/25 | 205/211 | 406/412 | | /auth/unlock-session | 4/16 | 204/209 | 406/415 | | /auth/wraps | 5/16 | 204/218 | 405/409 | | /auth/unlock-finish | 4/15 | 204/206 | 406/411 | | /auth/session after unlock | 4/22 | 205/213 | 405/415 | Boot also serializes /auth/status then /auth/session before the button; at 200 ms each is about 403 ms p50, so readiness costs two more pre-click RTTs. Findings and cuts (estimates at 200 ms one-way; overlapping savings are not additive): 1. Cold cache adds four serialized fetch RTTs after auth: 22 KB chunk (~410 ms), Geist Sans font (70 KB, ~431 ms), Ghostty chunk (681,136 transfer bytes, ~410 ms), and Vite external chunk (~1.8 KB, ~434 ms): about 1.7 s. Prefetch these during the passkey prompt. The WASM is a 423,939-byte inline data URL, not a separate HTTP request; compile+instantiate is 3 ms p50, with the cold resource decode/fetch timing about 120 ms. Local ServeDir sent the Ghostty chunk without Content-Encoding; build gzip is 197,383 bytes, a 483 KB reduction before any bandwidth-dependent saving. 2. After assertion, parallelize /auth/unlock-session and /auth/wraps, then pass through the hostname already returned from unlock-session so showTerminal does not issue the final /auth/session. wraps calls unlock_session internally. These remove two serial RTTs, about 800 ms; validate concurrent session updates in the auth contract. 3. Start the authenticated WebSocket immediately after unlock-finish, while lazy chunks/fonts load. Current auth requires an unlocked cookie at upgrade, but the upgrade and Hello/Welcome can overlap that work; move up to two RTTs (~800 ms) off the terminal critical path. A TCP/TLS preconnect can happen earlier; current /v1/ws rejects an unauthenticated upgrade. 4. The code waits for Welcome before sending AttachTerm; attaching the saved public session as part of the initial handshake could save one RTT (~400 ms). Independently, in 6/10 runs at 200 ms there is another ~400 ms between the first Attach Ack and first Output despite Credit being sent with AttachTerm. No 400 ms timer exists on this path; trace attach/credit/embedded-agent scheduling. This could be another RTT if the wait is removable. 5. The page serializes /auth/status and /auth/session before rendering sign-in; parallel calls save one pre-click RTT (~400 ms). /auth/login-start also gates the native passkey prompt by one RTT (~400 ms); issuing it before click is a candidate only after checking expiry and abandoned-ceremony admission. Timer/gate review: onboarding gives the loading counter a 400 ms display threshold but does not await it. The 2,600 ms Welcome timer is first-setup-only. Backdrop start is delayed 600 ms and stop removes it after a 260 ms timer, but neither fade nor removal is awaited by showTerminal. No transitionend/animationend gate was found. Startup races Geist Mono load against an 800 ms timeout; core-screen mount awaits Geist Sans, so the cold 431 ms font request gates first terminal paint. Ghostty render-idle 700 ms occurs after attach/output. Returning login uses firstSetup=false and skips Welcome. Round trips and proposed budget: warm 200 ms path is about 9 RTT-equivalents after passkey (5 sequential auth HTTP calls + WS upgrade + Hello/Welcome + roughly two RTTs to first Output), about 10 including click→passkey challenge. The cold p99 is about 13.5 RTT-equivalents after passkey / 14.5 from click because of four asset RTTs; browser startup adds two pre-click RTTs. Practical target: 5 RTT + 150 ms after passkey (2.15 s at 200 ms one-way): 3 auth turns after parallelizing identity/wrap fetch and removing the final session read, plus a 2-turn WS upgrade/Hello+Attach path, with assets prefetched. A 2-RTT target (950 ms at 200 ms one-way including 150 ms local work) needs a larger auth/socket protocol change: pre-open an unauthenticated socket, return wraps with assertion verification in turn one, then combine unlock completion and Attach in turn two. Current /v1/ws requires an unlocked cookie, so this is for owner/orchestrator review, not a selected design.
Author
Owner

Finished the measure-only run. HEAD SHA: 191c2830c6. No tracked files changed; the only untracked file is scripts/browser-auth/measure-returning-signin.mjs. Sanitized per-run evidence remains at target/signin-waterfall-results.json. The measurement server and runtime state are stopped/removed. scripts/verify fast exited 0.

Verbatim final gate summary output:
+---------------------------+--------------+
| 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

==> 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 [5.99ms]
(pass) wire protocol golden vectors > returns borrowed payload views and writes into reusable buffers [0.17ms]
(pass) wire protocol golden vectors > decodes muxed messages split across WebSocket messages [0.76ms]
(pass) wire protocol golden vectors > rejects oversized, non-canonical, unknown, and malformed frame bytes [0.18ms]
(pass) split mux header preserves trailing Close [0.15ms]

src/stream.test.ts:
(pass) Rust and TypeScript preserve every frame at all boundaries and random multi-splits [2571.88ms]
stream differential: 134 streams, 11439 schedules, zero divergences
(pass) maximum frame size and fragmented oversized prefix obey the allocation boundary [9.63ms]

7 pass
0 fail
34390 expect() calls
Ran 7 tests across 2 files. [2.59s]

Finished the measure-only run. HEAD SHA: 191c2830c6f4a2a69d18ab7af2fd6a6814c4a2c4. No tracked files changed; the only untracked file is scripts/browser-auth/measure-returning-signin.mjs. Sanitized per-run evidence remains at target/signin-waterfall-results.json. The measurement server and runtime state are stopped/removed. scripts/verify fast exited 0. Verbatim final gate summary output: +---------------------------+--------------+ | 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 ==> 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 [5.99ms] (pass) wire protocol golden vectors > returns borrowed payload views and writes into reusable buffers [0.17ms] (pass) wire protocol golden vectors > decodes muxed messages split across WebSocket messages [0.76ms] (pass) wire protocol golden vectors > rejects oversized, non-canonical, unknown, and malformed frame bytes [0.18ms] (pass) split mux header preserves trailing Close [0.15ms] src/stream.test.ts: (pass) Rust and TypeScript preserve every frame at all boundaries and random multi-splits [2571.88ms] stream differential: 134 streams, 11439 schedules, zero divergences (pass) maximum frame size and fragmented oversized prefix obey the allocation boundary [9.63ms] 7 pass 0 fail 34390 expect() calls Ran 7 tests across 2 files. [2.59s]
Author
Owner

Split by owner decision: phase A # (5 RTT + 150 ms, no protocol change, now), then phase B # (2 RTT + 150 ms, combined auth/attach protocol).

Split by owner decision: **phase A #** (5 RTT + 150 ms, no protocol change, now), then **phase B #** (2 RTT + 150 ms, combined auth/attach protocol).
Author
Owner

Split by owner decision: phase A #66 (5 RTT + 150 ms, no protocol change, now), then phase B #67 (2 RTT + 150 ms, combined auth/attach protocol).

Split by owner decision: **phase A #66** (5 RTT + 150 ms, no protocol change, now), then **phase B #67** (2 RTT + 150 ms, combined auth/attach protocol).
Author
Owner

#55 measurement on infraternal-dev, x86_64, 8 cores, tracer-browser load 14.31/16.38/15.76: production-build returning sign-in to usable terminal n=10, p50 3952.40 ms, p99 5102.00 ms; 300 ms RTT, ±30 ms jitter, budget 5000 ms: FAIL. Measured by scripts/verify latency with TRACER_TEST_PORT=4621. Evidence source: apps/tracer/test/terminal.spec.ts; run log: latency-profile.log in the latency-gate scratch directory.

#55 measurement on infraternal-dev, x86_64, 8 cores, tracer-browser load 14.31/16.38/15.76: production-build returning sign-in to usable terminal n=10, p50 3952.40 ms, p99 5102.00 ms; 300 ms RTT, ±30 ms jitter, budget 5000 ms: FAIL. Measured by scripts/verify latency with TRACER_TEST_PORT=4621. Evidence source: apps/tracer/test/terminal.spec.ts; run log: latency-profile.log in the latency-gate scratch directory.
Author
Owner

Latest production-build latency profile on infraternal-dev (x86_64, 8 cores; tracer-browser phase load 17.73 10.48 10.96): returning sign-in to usable terminal, n=10, p50=3963.90 ms, p99=4987.10 ms, 5000 ms budget PASS. Prior run p99 was 5102.00 ms. Full run is recorded on #55.

Latest production-build latency profile on infraternal-dev (x86_64, 8 cores; tracer-browser phase load 17.73 10.48 10.96): returning sign-in to usable terminal, n=10, p50=3963.90 ms, p99=4987.10 ms, 5000 ms budget PASS. Prior run p99 was 5102.00 ms. Full run is recorded on #55.
Author
Owner

Latest production latency run on infraternal-dev (x86_64, 8 cores; tracer-browser load 8.84/9.29/7.19), 300 ms RTT ±30 ms: METRIC name=returning_signin_terminal_usable source=tracer-production-build n=10 p50_ms=3956.40 p99_ms=5024.70 budget_ms=5000 result=FAIL. The onboarding browser scenario also timed out after 5000 ms waiting for the test double to reconnect after sign-in. Full profile log was $HOME/.cache/codex-scratch/latency-gate/latency-final.log; test output is in apps/tracer/test-results/.

Latest production latency run on infraternal-dev (x86_64, 8 cores; tracer-browser load 8.84/9.29/7.19), 300 ms RTT ±30 ms: `METRIC name=returning_signin_terminal_usable source=tracer-production-build n=10 p50_ms=3956.40 p99_ms=5024.70 budget_ms=5000 result=FAIL`. The onboarding browser scenario also timed out after 5000 ms waiting for the test double to reconnect after sign-in. Full profile log was `$HOME/.cache/codex-scratch/latency-gate/latency-final.log`; test output is in `apps/tracer/test-results/`.
Sign in to join this conversation.
No labels
launch-qa
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
kayg/infraternal#52
No description provided.