J405: red browser specs on dev (docs-palette, toast-stack, palette-polish, addhost-wizard cascade) #442
Open
opened 2026-11-09 03:15:24 +00:00 by kayg
·
11 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#442
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?
J405: fix the browser specs found red on unmodified dev by J401 (#345, comment 88223): docs-palette x4, toast-stack x2, palette-polish touch x2, addhost-wizard cascade (42 cases in a combined run). For each, decide product vs spec, fix the root cause, red-first, no weakened assertions, no fixed sleeps. Branch fix-dev-red-specs-2, base
966c52e070.Start. Branch
fix-dev-red-specs-2, base966c52e07(origin/dev).Plan (est. 3-4 h, mostly slot waits): (1) run each red spec alone on dev-02 on a production build to confirm; (2) read failure + bisect if product; (3) fix red-first; (4) combined-run isolation for addhost-wizard; (5) 3x alone + combined at 1440x900 and 393x852; (6) verify quick.
Progress: issue opened, tree synced to dev-02 (
~/worktrees/j405), first baseline run (docs-palette, toast-stack, palette-polish alone on dev966c52e07, production build) is queued for a build slot (position 2; all 3 slots busy). Static reading so far: the toast-stack failures look like a measurement taken mid-transition (.ui-toastanimates transform/height/width over 190 ms and the spec readsboundingBox()right after the count check). Will confirm with the run before changing anything. Log: dev-02~/j405/logs/base1.log.Finding 1 (reproduced, dev
966c52e07, production build, dev-02, log~/j405/logs/base1.log): the 8 reds are real and deterministic when run alone: docs-palette x4, toast-stack x2, palette-polish touch x2.7dd462e9e), so this looks like a product regression. This run failed atdata-activeon the multiplexer window (window is stilldata-parked, h1 present); J401's run failed one step earlier. Bisecting dev first-parent merges 7dd462e9e..966c52e07 withgit bisect run.boundingBox()right after the count check, while the card's transform/height/width are still transitioning (190 ms). Probe pending to prove it; if so the spec waits for animations to finish (no sleep).deployis 57.87 px wide,scrollWidthis an integer, tolerance is -1 px. Probe pending (range width vs scrollWidth).--max-failures=3.Because the slot queue is 7 deep, everything above is one queued single-slot script (
~/j405/all.sh, log~/j405/logs/all.log).Finding 2 (bisect, evidence
~/j405/logs/bisect-steps.log+bisect.logon dev-02): docs-palette "desktop ink" is green at7dd462e9eand red froma6d0223bf, Merge settings-rows-j132 (#304) (first-parent bisect, 8 steps; last good600ae5eb1). So it is a product regression, not the spec: the spec has not changed since #311. Candidate cause inside #304: the camera/active-window rules for views of rows (camera/lock.tssettled/follow,onRest,windowInView). A probe of camera + active window after a docs page is opened from ⌘K is queued (single slot,~/j405/logs/all2.log).Finding 3 (not reproduced as a cascade): in a dev-02 run of the 13-spec command on dev (log
~/j405/logs/all.log,### combined), addhost-wizard ran first (Playwright runs files alphabetically) and 57 of 58 passed. The one failure is a real spec race: after Back, the page being left (is-leaving, inert) and the new progress page both match.ah-page[data-page='progress'], sotoBeVisible()throws a strict-mode violation. J401's cascade was on J401's own part-2 tree and showed an EMPTY<main>with.cl-mockupabsent. In the double, a page load only mints a session whilepreviewSignedOutis false, and/auth/logoutsets it globally; only/__mock/resetclears it, and addhost-wizard never calls that. Repro (a scratch spec that signs out, then addhost-wizard) is queued.Findings so far, all on dev
966c52e07(production build, dev-02). Branchfix-dev-red-specs-2, heade7629c960, pushed.deploylabel 57.866 vs 58.306 at rest, probe~/j405/logs/all.log### probe)7dd462e9e, red froma6d0223bf(#304 Settings as rows). Enter on "infraternal multiplexer" now opens the Settings windows-terminal-multiplexer(new setting "Offer To Switch" mentions it); the palette has no ranking and lists Settings before Docs (probe~/j405/logs/all2.log### probe2). Product works as designed/__mock/resetclears it and addhost-wizard never called it. Scratch repro: sign-out spec then addhost-wizard →.cl-mockupnot found after 45 s (J401's exact signature) on the original file, passes with the fix (~/j405/logs/all3.log). The exact J401 cascade did NOT reproduce on unmodified dev (57/58 in the combined run), so this is the matching hazard, not a proven account of that run. Also one real spec race (strict-mode on the leaving page)Commits:
92b8fb027palette-polish (+ test/motion.ts helper),abd72b250toast-stack,7e6d9ef90docs-palette,0d51cca83addhost reset,e7629c960addhost leaving page.Proof so far: docs-palette + toast-stack + palette-polish,
--repeat-each=3, 120 passed (~/j405/logs/three1.full.log). Pending:verify quick, addhost-wizard x3, 13-spec combined run on the final head.Question for kayg (not blocking): should the palette rank a docs page whose title matches the query above a Settings row that only mentions it? Today it does not rank at all.
Progress, head
6e1f30cc9(pushed). Evidence on dev-02:~/j405/logs/.scripts/verify quick: exit 0 (all6.log; first run flagged a missing doc comment onopen, fixed).--repeat-each=3: 120 passed (three1.full.log, on 5a-era head; test code of these three files unchanged since).--repeat-each=3: two earlier runs each had 1 failure of 174, the same class both times (strict-mode violation: theis-leavingcopy of the progress page and its job rows). Fixed in the last commit for every case that reads the progress page after Back; then 174/174 passed (addhost3c.full.log).comb2).Scope added by the orchestrator:
sign-outx2 (J404, #426). Both reproduce in J404's logs on dev966c52e07(~claude/j404-evidence/dev-specs.log).showTerminal()inmain.tsawaitsTerminalClient.open()and then keeps the client without re-checkingsessionGeneration. A sign-out during the connect runsendSession()whilecurrentTerminalis still undefined, so the late client is never disposed: a live terminal and the test hook survive sign-out. Fix: one generation check after the await, dispose the late client.infraternal.canvas.<id>into the browser, so the poll for it times out. The sweep itself (clearAccountStorage) is unchanged. The spec now seeds the earlier build's keys under the real account id and keeps every assertion after the setup.Both are committed on the branch (red = the existing specs on dev; green run queued after the combined run releases my slot).
Finish. Branch
fix-dev-red-specs-2, headb5a047adc(pushed,git ls-remoteconfirms), 8 commits on origin/dev54a9da2a8. Logs and reports: dev-02~/j405/logs/.Cause per spec:
7dd462e9e, red froma6d0223bf(#304). Enter on "infraternal multiplexer" now opens a Settings row; the palette has no ranking./__mock/reset; addhost-wizard never called it. Repro (sign-out spec first):.cl-mockupnot found after 45 s on the original, passes with the fix. J401's exact 42-case cascade did not reproduce on dev; it was on J401's own part-2 tree. Plus a real spec race: after Back theis-leavingcopy of the progress page and its job rows match twice (1 in 174 on three runs).showTerminal()kept a terminal client that finished connecting after sign-out (no generation check after the await): a live terminal and test hook survive sign-out. Red: new deterministic test (holds the wasm module until sign-out) fails on dev with "no connection is left open after sign-out"; 6/6 green with the one-line fix.cachesmust be empty is stale since #243, the worker's cache holds only public app-shell files). Spec now seeds the old build's keys and checks the cache holds only public files.Gate results:
verify quickexit 0 on this tree (quick15.full.log). Notverify fast(no Rust changed).--repeat-each=3: 161 passed, 1 failed on an earlier head (D245's racy split step, since removed) —four3.full.log.--repeat-each=3: 174/174 (addhost3c.full.log), on966c52e07base with identical spec files.b5a047adc: 196 passed, 0 failed (comb3.full.log).--repeat-each=3onb5a047adc: 38 passed, 4 failed, all "Could not read this server's name" in the two real-cookie cases' setup in repeats 1 and 2 (so3.full.log). Not reproduced in 12 + 12 further runs on plain dev and on the head (so-dev6,so-head6); the error is raised before any code I changed. Treat as an unexplained transient of the double; I did not find its cause.Specs run at 1440x900 and 393x852 inside the specs themselves (production build).
For kayg: should the palette rank a docs page whose title matches above a Settings row that only mentions it? Not changed.
Review of
fix-dev-red-specs-2@b5a047adc(8 commits on origin/dev54a9da2a8)Verdict: APPROVE. The sign-out fix works: across every path I probed, nothing live survives sign-out. One P2 is worth fixing, small and cheap: the generation check runs after the late client has already opened a WebSocket. I did not find a spec change that hides a product bug.
Logs (dev-02,
~/r442/logs/):probes.full.log,combined.full.log,flake.full.log,flakediag.full.log,quick2.full.log. The probe specs are in~/r442/probes/and were never committed. They ran on a production build (the sameplaywright.config.tswebServer) at 1440×900 and 393×852 touch.Runs
verify quick(VERIFY_QUICK_BASE=origin/dev): PASS, all 10 rows. My first run failed on my own untracked probe files (missing doc comments and// sleep:reasons). I moved them out of the worktree and reran. The brief says reviewers should not runquick; I ran it only because the task asked for it.Security fix: is it complete?
I probed these on the production build, 12 cases (6 probes × 2 viewports):
?session=in the URL. But 1 socket was created after sign-out (desktop). Phone saw 0, so it depends on timing. See P2-1.closedguards inretryStreamand the timer callback work.infraternal-drawing-v1, holding/plus.js,.css,.woff2and.wasmpaths. No query strings and no account data in the paths.Static reading:
live.ts:332(canvas windows) andproduct.ts:211(isCurrentafterstore.load()) have the same late-arrival guard. The service worker caches only public app-shell files.Findings
P2-1: the late client still opens a socket after sign-out.
main.ts:632checks the generation afterTerminalClient.open()returns. By thennew TerminalClient(...)(terminal.ts:572, constructor at ~529) has already built aMuxConnectionand calledopenStream. Probe A, desktop:sockets created after sign-out = 1, closed at once. Nothing lives on, and the cookie is already cleared bylogout, so the upgrade should be refused. Still, "no connection after sign-out" is the property to hold. Suggested fix: pass anisCurrentcallback toTerminalClient.open, and check it afterprepareResourcesand thesetTimeout(0)turn, before constructing. Keep the dispose atmain.ts:632as the backstop. The new test accepts "closes straight away or never connects", so it cannot see this. A strict version is probe A's last assertion (afterMark(t) === 0).P3-1: the new test's assertions are weak.
sign-out.spec.tsends withexpect.poll(closedAfterRelease)....catch(() => undefined), which can never fail.live() === 0andhook === falsedo catch the original bug (the author's red run shows this). A stricter test would also record socket creation time against the sign-out time.P3-2: other stale-async paths in
showTerminalhave no generation guard (read, not probed):main.ts:492-496: thecatcharoundloadFontandmountCoreScreencallsrenderUnavailable. If a font fetch fails after a sign-out from another tab (the BroadcastChannel path,endSession), "Connect to load your layout" replaces the sign-in screen. Try again recovers it.main.ts:509,521,522(clusters and canvas preview modes only, gated by__CLUSTERS_PREVIEW__):canvasPrototypeis assigned after an await with no check.main.ts:674-677: the final catch writes into#connection-statuswithout checking the generation. This is harmless today.P3-3:
motionSettledhas no upper bound (test/motion.ts). It waits for any finite animation to end, so a regression to a 600 ms spring would pass silently. Today the CSS is within the owner's rule: the palette uses--t-panel240 ms,ease-outand--ease-out(style.css:503,512), and toasts use--t-pop180 ms ease-out (styles.css:199). I read the CSS rather than measuring in the browser. Suggestexpect(max endTime of the running animations).toBeLessThanOrEqual(300)inside the helper, so the spec enforces the rule instead of hiding a violation.P3-4: D245 cache check looks at URLs only. The service worker caches
/from a navigation fetch that carries the cookie (offline.worker.tsfetch handler). Today/is static, so it is fine. Suggest the spec also assert that the cached/body does not contain the account id or display name. Separately, the dropped assertion ("this build writes a layout key") is replaced by seeding. I confirmed there is no writer of those keys insrc/apart from the sweep inaccount-storage.ts. I could not find D245 or D312 defined inDECISIONS.mdon this tree (only an "amends D312" mention at line 4304), so I could not check the D312 claim against its text.Spec-only changes
transform: scale(0.98)→1over 240 ms ease-out.getBoundingClientRectincludes the transform, which explains why the label was 57.87 px wide against 58.31 at rest. It is not a layout bug./__mock/reset, so each case resets first.onScreen()excludes the inert.is-leavingpage. The spec used a baretoBeVisibleon two matches before.Open flake ("Could not read this server's name", 4 of 42)
I could not reproduce it. I ran
sign-out.spec.ts×5 (70 passed) and a diagnostic copy of the file ×6 with log-on-failure for the banner step (84 passed), so 22 runs of the two real-cookie cases with no failure.What the code says, without a reproduction:
showTerminal(main.ts:430), whensessionHostname(identity)is empty. The double always returns ahostname, so the only way there ischeckSession()returningundefined, which is a 401.sessionanswers 401 wheneveractiveAuthCookieno longer matches the page's cookie. The double has one globalactiveAuthCookie. Any HTML GET of/?proto=…(mock-server.ts:738-745),login-finish,setup-finishor/__mock/resetreplaces or clears it. A stray request from another browser or run on the same double between "Open infraternal" and the session check gives exactly this error.checkSessioninshowTerminalis reported as "Could not read this server's name" instead of going to the sign-in screen. I'd routeidentity === undefinedtorenderAuth.Not done
verify fast(the brief says reviewers must not run it).main.ts.Follow-ups on branch
signout-followups-442, head59760ed59(pushed;git ls-remoteconfirms), 11 commits on origin/dev547a48885. Red-first: the five test commits come before their fixes. Evidence on dev-02~/j405/logs/(b-red8,b-green8,b-comb8,b-reg7,bquick7).TerminalClient.opentakesisCurrent, asked after the module and font are ready and before anything is built; false rejects withTerminalOpenCancelledand no connection is made. Test: counts WebSocket constructions in the page (Proxy on the constructor) and requires the count not to move after sign-out, with the wasm held and released; it requires the page markerdata-late-terminal="cancelled"(test double only) instead of sleeping. Red on the tests-only head: fails ("cancelled" expected, "none" received); green 3x3.showTerminal(font failure, clusters mockup, canvas prototype and their catches). Not browser-tested: the window is a few ms wide.motionSettlednow fails at the first look when a finite animation is over 300 ms (delay+duration+repeats); frame-paced, no sleep.motion-bound.spec.ts: 150 ms passes, 600 ms fails naming the rule, an endless animation is ignored.showTerminalsends an empty session (401) to sign-in with "Your session ended. Sign in again to continue."; a session without a host name keeps the server-name message. The double now hands out a preview cookie per page load (a set; logout removes only its own, reset clears all; ceremonies still replace the active one). Tests: 401 after setup goes to sign-in; a page loaded in a second context does not end the first's real-cookie session (red on dev: 401).palette-rank.ts: a row may carry atitle; when a title equals or starts with the query (case and a leading the/a/an ignored), its group is listed first; nothing else moves. Docs page rows carry their title. Unit test (4 cases) pluspalette-ranking.spec.tsat 1440x900 and 393x852; docs-palette is back to pressing Enter.Gates:
verify quick: exit 0 (bquick7.full.log, onbe4ddf3b3; later commits changed only the marker and a commit message). Notverify fast.b-comb8); docs-palette/toast-stack/palette-polish x3: 120 passed (b-others6).recovery-ui-holdsign-in screenshot baselines. Those 4 also fail on plain devbd551e549(b-base8), so they are not from this branch; not investigated.Review of
signout-followups-442@59760ed59(11 commits on origin/dev547a48885)Verdict: APPROVE. I found no P0, P1 or P2. Four P3 notes follow; none blocks a merge.
Evidence is on dev-02 in
~/r442b/logs/:specs.log,probes20.log,probesDE.log,quick2.log. The tests ran on a production build through build-slot, from a detached worktree at59760ed59. The probe spec is J431'szz-review-probes.spec.ts, never committed; I did not change it.Sign-out: no socket after sign-out
Each probe runs at 1440×900 and at 393×852 with touch, and records every WebSocket created after the moment sign-out finished.
160 tests ran in 42.5 min (
probes20.log, 160 passed). D and E: 12 passed (probesDE.log). Probe A is the one that showed 1 late socket on the desktop atb5a047adc(P2-1 in comment 88876). It is now 0 across 40 runs. The fix is the right one:isCurrentis asked atterminal.tsafter the font, the wasm module and thesetTimeout(0)turn, beforecreateRendererandnew TerminalClient. The constructor opens the connection, so nothing is built for a dead session. The dispose atmain.tsstays as a backstop and sets the markerdisposed. The new spec requires the markercancelled, so it would catch a regression to the backstop path. Its WebSocket Proxy counts constructor calls, so a refused handshake counts too.Generation guards (P3-2 from the first review)
Read, not probed (the window is a few ms wide, as J405 says). Every
awaitinshowTerminalthat I listed before now has a check after it: the font catch, the clusters import, the mockup mount and its catch, the canvas imports, and the add-host catch. A late mockup or canvas is disposed, not leaked. The final catch now ignores errors after the session ended. This covers every path I named.401 path: cannot loop
checkSessionreturnsundefinedonly for a 401 (auth.ts:267). Anything else throws and keeps the "Try again" screen. So a network error does not sign the person out. For a 401,endSessionbumps the generation and callsrenderAuth. The sign-in screen starts no session check of its own.showTerminalis re-entered only by:Each of these runs once per user action. In the worst case (cookie never accepted), the person sees sign-in again after each attempt. That is a visible, user-paced result, not a loop. The startup path (
main.ts:217) and the foreground check were already 401 → sign-in.Palette ranking: deterministic and stable
rankByTitleis a stable two-way partition. Groups with a title match go first, and order inside each part is unchanged. There is no sort, and there is no timing or hash input, so the same rows and query always give the same list. With no match it returns the same array. Ranking runs only inrenderPalette, from the input handler orrefreshPalette. The arrow keys only changeselectedand re-render nothing, so arrowing never reorders. When a refresh does reorder, the selection follows the action id (preserveAction).docs-palette.spec.tsis back to pressing Enter on the first hit, and passes.palette-ranking.spec.tspasses at both viewports.palette-rank.test.ts(4 unit cases) I read but did not run separately;quickruns the changed package's unit tests.Runs
specs.log).verify quick(VERIFY_QUICK_BASE=origin/dev): PASS, all 11 rows, rc=0 (quick2.log). My first run faileddoc comments on diffandfixed test waits, because my untracked probe file sat in the worktree (same cause as J431's first run). After I moved it out, the rerun passed. The brief says reviewers should not runquick; I ran it because the task asked.verify fast, Mac, root, a real server.Findings (all P3)
refreshPalette), a title match can move the Docs group to the front. The selection follows the same action, so Enter hits the same row, but the row moves on screen. This is intended for late rows. I'd leave it unless the owner minds.motionSettledlooks only atrunninganimations. A paused animation, or one stillpendingat the first look, is skipped. The bound would miss an over-long animation caught in that state. Today's CSS (240 ms palette, 180 ms toasts) is inside the limit.motion-bound.spec.tsshows 150 ms passes, 600 ms fails and an endless one is ignored. Countingpendingas well would close the hole.SHA reviewed:
59760ed59eca5d4e32fa0b3b2ba1ba569905fdcc.