Reload shows 'screen may be out of date' on every terminal #257
Open
opened 2026-10-29 16:37:34 +00:00 by kayg
·
44 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#257
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?
Owner report, 2026-10-29: every page reload shows "screen may be out of date" on terminals (screenshot from production: the note in a window's bottom-right corner).
Probable cause (orchestrator, from
apps/tracer/src/stale-screen.ts): D309 meant the note for shells that cannot redraw. The client infers that from silence: after the replay fence, if no newer output arrives within 400–1500 ms, it shows the note. But a shell idle at a prompt only redraws when its size changes (SIGWINCH). On a reload the attach usually carries the same size, so a perfectly healthy idle shell is silent, and the note appears on every terminal. The host keeps the session's screen state and replays it, so in that case the replay is accurate and there is nothing to warn about.Expected (D309): the note appears only when the screen really may differ from what the program believes, for example when a reattach changed the terminal size and the program did not repaint. A plain reload at the same size never shows it.
Plan: reproduce on a production build (reload with idle shells, with programs that redraw, and with a reattach that changes size). Fix the decision so silence only counts as "cannot redraw" when a repaint was actually expected. Add regression tests for all three cases, and update the real-browser spec
stale-screen-d309-review.spec.ts.Start: branch
stale-note-reload, base4a6202a5299329411fcf94deef6b0181b054957c(origin/dev). Reading D309,stale-screen.tsand the attach/resize path interminal.ts. First step: a failing unit test and a real-browser spec for a same-size reload showing the note. Then I check whether the client can learn the session's previous size without a wire change.Finding: the cause is confirmed, but the fix needs a small additive wire change, so I stopped before changing any code (brief: "stop and describe what's missing").
1. Reproduced on a production tracer build against the test double (chromium, 1280×720): live idle shell at

$, thenpage.reload(). The same-size reattach shows "screen may be out of date" after about 0.5 s (.ui-terminal-note[data-shown]count = 1). Scratch spec only, not committed.Path:
terminal.tsreleaseReplayResponsesAfterPaint(~l.1794) callsstaleWatch.begin(...)for every resume, with no look at sizes. The existing mock spectest/stale-screen.spec.ts"a shell that cannot redraw shows the note after reattach" drops and restores the connection at an unchanged size and expects the note, so it encodes the same wrong rule.2. What the client knows. On attach it sends
AttachTermthenResize{lastSize}(tryAttach, l.1176–1185). The attach size is known. The session's previous size (the PTY/screen size the host replays at) is not on the wire anywhere:terminal.replay_completecarries onlysession_idandout_seq(crates/infraternal-agent/src/terminal_events.rs,contracts/wire.mdl.224).terminal.snapshotcarriessession_id,seq,approximate. The Snapshot frame is VT bytes with no dimensions.terminal.open,Resize).terminal_sessionsrows and the session inventory carry no size.3. Why client-only tracking is not enough. A reload is a fresh page with no memory. Persisting this tab's last size in
sessionStoragewould only tell us what this viewer last sent, not what the host's PTY has now. The product's core case is several viewers (laptop + phone) on one session, and the PTY takes whichever viewer resized last. Example: the phone resized the PTY to 40×20, then the laptop reloads and attaches at 120×40. The laptop's stored size equals its attach size, so it would call the reattach "same size" and hide the note. In truth the PTY resizes, the program may not redraw, and the replayed 40×20 screen is wrong. That hides exactly the case D309 exists for. So I did not build it.4. What the backend job needs to add (additive, no frame layout change). Put the size the replayed screen was captured at into
terminal.replay_complete, e.g."cols": u16, "rows": u16, taken from the host's terminal state before the attach's ownResizeis applied. Browsers ignore unknown notice fields, and older servers simply omit them.contracts/wire.md(l.224) and its vectors need the new fields. Wire/vector tests: the fields are present, and they equal the pre-attach size when a Resize follows with a different size.5. Client change that follows (already designed, small): in
releaseReplayResponsesAfterPaint, callstaleWatch.begin(...)only if the notice'scols/rowsdiffer from the size the client attached with (lastSize, as sent in the attach Resize). A same-size reattach never starts the wait, so the note never shows, not even for a frame. If the fields are missing (older server), fall back to today's behaviour. Output after a note still clears it. Tests as in the brief: unit (same-size + silence → no note; resized + silence → note; resized + repaint → none; later output clears) and the real-browser spec (idle reload → no note; resize-then-silence → note). The mock double must report a replay size too.Branch
stale-note-reloadhas no commits beyond base4a6202a52.Start backend implementation: branch
replay-size-257, base4a6202a5299329411fcf94deef6b0181b054957c(origin/dev). Read both existing comments including the client finding. Proposed additive D63 contract:terminal.replay_completegains optional u16cols/rows, captured from authoritative shim state before this attachment's Resize; absent fields retain legacy behavior. Tracing every producer and both codecs, then regression/real PTY checks and sequential pinned static builds (D243). Client stale-screen decisions remain for the follow-up job.Trace finding: shim Hello already contains current cols/rows; both shim implementations emit config geometry and Resize updates that config (
infraternal-shim/src/session.rs:274-275,698;user_host.rs:705).infraternal-agent/src/sessions.rscurrently discards those fields. All six production replay fence calls use the onedaemon.rs::replay_completeproducer. The server's TerminalNotice decoder has deny_unknown_fields, so it must explicitly accept optional dimensions before forwarding unchanged JSON. Browser Event decoding already preserves unknown JSON fields; no stale-screen decision change is needed here.Retained primed remote links need special treatment: transport.cursor starts replay after the initial Hello, potentially after another viewer resized. Plan: read a fresh authenticated Hello without sending Attach or selecting a writer for that replay. Normal attaches and recovery relinks reuse their own Hello. Shared vectors cover new and dimension-free legacy notices; TypeScript golden vectors pass (7 tests, 98 assertions).
Step 1 pushed: contract and shared legacy/sized replay Event vectors in
46c52d011. Rust golden encode/decode test passes; TypeScript golden tests pass (7 tests, 98 assertions), protocol tsc passes. Regression before implementation failed as expected at daemon_readiness_tests.rs: missing cols decoded as Null, expected 80. This isolates the missing metadata independently of the follow-up UI decision.Implementation checks: the infraternal agent suite with remote support passes (147 passed, 20 ignored), including fresh dimensions after priming. The initial wider runs exposed fixture setup only: hard-coded ../../target needs a worktree symlink to this job's external target; the long job scratch path exceeds sun_path in three native fixtures, so a short scratch symlink is used for INFRATERNAL_TEST_STATE_ROOT. No production change was needed for those failures. A standalone partial-feature clippy invocation hit two pre-existing cfg-only unnecessary_wraps warnings in plugins.rs; using the required workspace feature context instead (scripts/verify iterate underway).
Added explicit ordered regression: replay Output is withheld until the shim has received Resize(120,40), then the fence must still report Hello's 80x24. Real-binary test covers 80x24 -> 120x40 -> 60x20 across writers, with input-state fences proving applied geometry. Server tests forward sized and legacy JSON unchanged and reject out-of-u16 values. The browser mock producer now captures session geometry before Resize, without changing client stale-screen decisions.
Gate iteration finding/correction: a short INFRATERNAL_TEST_STATE_ROOT symlink is unsuitable for restart trust tests, which compare canonical paths and correctly refuse aliases (eight restart fixture failures, including rs257 versus replay-size-257/test-state in reload_reopens_install_path_when_the_running_inode_was_replaced). Replaced it with a real mode-0700 short scratch directory; production validation is unchanged. Also corrected three new fixture-only Clippy errors (decimal masks and narrowing cast). The workspace test phase now runs with those corrections. Final-head fast gate will rerun all rows from this corrected setup.
Implementation steps pushed:
1f9649803: server accepts optional u16 dimensions and forwards sized/legacy notices unchanged; out-of-u16 values rejected.caf03db00: shim Hello dimensions retained; every production replay fence uses captured geometry; primed replay refreshes geometry without Attach or writer selection. Existing output cursor boundaries are unchanged.4b131e038: real infraternal agent/shim/PTY regression (80x24 -> 120x40 -> 60x20, ordered resize confirmation and exact fence cursors), plus sized browser mock fences. Client stale-screen decisions unchanged.Workspace tests, separate process-per-user shim tests and cargo-deny passed. Corrected workspace Clippy, fmt, protocol/tracer TypeScript checks, production tracer build/transfer budget and protocol differential suite passed (protocol: 39 tests, 50,325 assertions). Initial iterate's Clippy failure was corrected and rerun; this is not the final gate. Sequential pinned static measurements and exact cap ratchet are next.
Existing gate audit note: scripts/verify.d/rust.sh::rust_check_cli_plugin_compile_out returns the last cargo invocation's status, so the initial intermediate placeholders fixture failures still yielded a PASS row. Final qualification will inspect the complete transcript for failed tests as well as the summary. No unrelated gate behavior is changed in this branch.
Pushed
ddc4e15e5: D243 caps and PROCESS table ratchet to the pinned static recipe on 8by64-compute02, built sequentially in the build slot. x86_64: 21,396,368 bytes (+9,856); aarch64: 19,573,928 bytes (+10,320), against dev4a6202a52. Both increases are below 16 KiB; no dependency, feature or profile changes. The static real-PTY test passes: 80x24 → 120x40 → 60x20; attaching Resize excluded.Static build receipt
Author review checklist (#257): D63 uses only additive optional JSON fields; both frame layouts and replay cursor precision/order are unchanged. Existing shim uid/session/version/ring-range checks authenticate geometry; dimensions are bounded before serialization. The server retains session binding and forwards original Event bytes; legacy notices still decode. Initial, raw-prefix, partial-prefix, Snapshot, immediate-empty, credit-recovery and primed fence call sites all carry captured geometry. Captured dimensions are independent of queued Resize; a primed replay refreshes size with a Hello-only connection, without Attach or writer selection. This adds one bounded transient local socket at primed replay, none to steady-state output, no periodic tasks, dependencies or features. Cleanup follows existing Session socket ownership. Client stale-screen decisions are unchanged; the test double captures and emits dimensions for the following UI job. Functional tests cover real PTYs and ordered controlled peers. Binary-size evidence and final-head gate are recorded separately below.
Final scripts/verify fast starts on the committed head now.
Final-head gate
ddc4e15e5encountered one failure: auth::tests::socket_tests::close_logging::agent_stream_loss_logs_its_safe_close_reason_and_reaches_the_browser timed out at close_logging.rs:248 waiting 10 seconds for a browser Close frame. The server suite otherwise passed 633 tests (52 ignored); every earlier workspace integration test passed, including the new real-PTY replay-size test. No replay-complete notice is emitted by this close-only fixture. The current gate is completing remaining Rust checks. Per shared #118 load-failure rules, a detached dev baseline check follows, then the final gate will be rerun. No source changes made for this timeout.The isolated auth socket close test passes on detached dev
4a6202a52(1 passed, 0 failed). This does not reproduce the full-suite timeout, so I am not applying a baseline exemption. The full final-head gate is rerunning without source changes. First attempt: all other Rust rows PASS, including both exact static caps; TypeScript did not run because the Rust test row failed.First final-head gate, complete transcript
Isolated baseline check
Finished backend #257 at head
ddc4e15e5b05eccb6dc1c38d770463aa5c83240a, pushed toreplay-size-257.All replay-complete producers carry captured
cols/rowsbefore the attaching viewer's Resize. Server forwarding accepts absent fields and preserves the Event; shared Rust/TypeScript vectors cover both shapes. Tests cover controlled pre-resize capture, refreshed dimensions after another viewer, and a real PTY across three viewer sizes. Client stale-screen decisions are unchanged.Pinned sequential static images: x86_64 21,396,368 bytes (+9,856); aarch64 19,573,928 bytes (+10,320), against dev
4a6202a52. Both exact D243 caps and PROCESS table are updated. No dependencies/features/profile changes.Final
scripts/verify fast: PASS (exit 0) on this committed head. Every Rust gate row passed; server 634 passed / 0 failed; TypeScript protocol suite 39 passed / 0 failed / 50,325 assertions. The earlier close-only socket timeout passed in the full rerun; its failed transcript and isolated baseline check remain recorded above. No baseline exemption used.Final gate receipt · Static recipe and real PTY receipt
Job Cargo target and test-state directories deleted; temporary detached baseline removed; worktree clean. No merge or deployment.
Final-head scripts/verify fast output (verbatim)
Start client fix: branch
stale-note-257, baseddc4e15e5b05eccb6dc1c38d770463aa5c83240a(backend headreplay-size-257). Plan: start the stale-screen wait only when the replay fence's cols/rows differ from the size the attach sends; absent fields keep today's behaviour; fix the mock spec that encodes the wrong rule; unit tests; update stale-screen-d309-review.spec.ts; before/after screenshots.Progress, branch
stale-note-257:e7e18fdeffix:replayedSize()/repaintExpected()instale-screen.ts;StaleScreenWatch.begintakes the replay's size and the size the attach sends and never starts the wait when they are equal. Absent or malformed fields (older server) keep the old wait.terminal.tsreadscols/rowsfrom theterminal.replay_completenotice (the notice is read as raw JSON there, no separate TS type needed) and compares tolastSize. Unit tests (same size, resized+silence, resized+repaint, absent fields, later output clears, field decoding):bun test src/stale-screen.test.ts13 pass. Without the fix the test file does not even load (0 pass, 1 fail).f0053cb2amock spec: the old "cannot redraw" case now follows a resize done by another device (new test-double endpoint/__mock/resize-session); new same-size case asserts the note never shows, not for a frame.test/stale-screen.spec.ts: 8 passed (desktop + phone, 1 worker; the config forces one worker because the test double is shared).Next: real-browser spec, before/after screenshots, full gate.
Finished client fix, branch
stale-note-257, head1f9da4ede4035b458cc54b89ce1eed718a1c1316(base: backendddc4e15e5). Not merged, not deployed.Change: the stale-screen wait now starts only when the replay fence's
cols/rowsdiffer from the size the attach sends (lastSize). Equal size: no wait, so no note, not even for a frame. Fields absent or malformed (older server): today's behaviour. Later output still clears the note. The notice is read as raw JSON interminal.ts; there is no separate TS decoder type, so the decoding lives inreplayedSize()instale-screen.ts.Commits:
e7e18fdeffix + unit tests;f0053cb2amock spec fixed (resized reconnect) + same-size case;ac26e66fa/082a8795d/8790da61areal-PTY spec and note recorder; last commit retries a flaky fixture request in the mock spec setup.Screenshots (test double, 1440×900, 2.5 s after a reload of an idle shell):




Before (pre-fix client), same size, note shown:
After, same size, no note (recorder counted 0 frames with the note):
Resized (another device resized the session while away), before then after, note still shown:
Tests, on the final head:
bun run check: clean.bun test src/stale-screen.test.ts test/input-ready.test.ts: 14 pass, 0 fail (13 stale-screen: same size+silence, resized+silence, resized+repaint, absent fields, later output clears, field decoding). Without the fix the new file does not load (0 pass, 1 fail).test/stale-screen.spec.ts(production build, test double, 1 worker; the config forces one because the double is shared): 8 passed (desktop and phone). Two earlier full runs each had one phone case fail in setup withsocket hang upon the fixture request, before any stale-screen logic; the retry fix is in the last commit and the file then passed 8/8.real/stale-screen-d309-review.spec.ts(production server debug build, real PTY, 1 worker): 2 passed (resized reattach shows the note and Ctrl+C clears it; reload of an idle shell at an unchanged size never shows the note, same session on every reload).Finding, honest limit: on the real-PTY fixture (new account, one window, bash) the pre-fix client does not show the note after a reload either (recorder counted 0, also with a foreground
sleep 60), so the real spec guards the behaviour but does not reproduce the bug. The reproduction and the before/after proof are the unit tests and the test-double spec above. I did not find why the real path differs; a reload there may not take the resume path, which would also mean the owner's production windows do (they show the note).Gate:
scripts/verify faston head1f9da4ede4035b458cc54b89ce1eed718a1c1316exit 0 (VERIFY_EXIT=0), 0 failed tests or panics in the transcript. Static images identical in size to the backend receipt: x86_64 21,396,368 bytes, aarch64 19,573,928 bytes (exact caps PASS). Verbatim rows:Full transcript: verify-fast-head.log
Debug server binary and Cargo target deleted; scratch under
~/.cache/codex-scratch/stale-note-257removed except evidence.Independent review start: branch review-stale-note-257, target
1f9da4ede4, merge base4a6202a529. Read #257 and all 15 comments, D309 and wire contract. Reviewing all fence producers, pre-resize geometry, viewer resize races, production exclusion of the mock endpoint, and the real-PTY fixture's missing before/after reproduction. Implementation will remain unchanged; test evidence will be committed and pushed on the review branch only.Review finding R257-01 — P2 — apps/tracer/src/terminal.ts:975,1799; apps/tracer/src/connection.ts:237. A restored existing session whose renderer registers after the shared socket opened never receives onSocketOpen. onWelcome does not initialize connectionIsResume; a resized, silent replay therefore skips the D309 note entirely. The real canvas fixture's primary connection is established before terminal initialization, unlike the plain test-double screen's terminal-owned socket. This explains a concrete false-green path in the unchanged-size real spec, independently of its wait duration.
Failing test committed immediately: review-stale-note-257 at
9485e7177, apps/tracer/test/stale-note-257-review.test.ts, "a resized silent restore starts its note watch when socketOpenedFirst=true". Production stream and painted-fence callbacks: normal callback order passes; already-open socket order fails (expected [true], received []). No implementation changes. Further real-path confirmation and base/head reproduction remain underway.shared-socket-failure.log
Review progress: the R257-01 lifecycle regression also fails on detached merge base
4a6202a52(normal open callback order passes, already-open shared socket fails). It is a pre-existing gap left uncovered by this fix, not a newly introduced wire defect. Existing backend checks passed for fixed geometry despite queued Resize, refreshed primed geometry after another viewer, and the real-PTY 80x24 -> 120x40 -> 60x20 sequence. Independent real-browser and restart/Snapshot checks are prepared; full fast gate is still running. No implementation edits.Review progress on review-stale-note-257 at
9485e71775: the shared-socket callback-order regression also fails on merge base4a6202a52, so R257-01 is pre-existing. Real-path checks now compare ordinary canvas reloads, delayed WebSocket upgrade, standalone terminal ownership, and server restart. Frame latency only delays messages after upgrade; it does not reproduce the renderer/socket-open ordering. Browser run is queued behind the shared build slots. No implementation changes.R257-01 (P2) real-path corroboration, committed/pushed as
56712dd89on review-stale-note-257. Testreal/stale-note-257-review.spec.ts:94, “review: a resized silent real canvas restore shows the stale note”, fails on the target production client/server/PTY path: fence 53×42 at output cursor 108; viewer sends 80×24 then final 45×30 before the fence; zero Output bytes after the fence; note remains absent after the full bounded silence wait. This matches the callback regression already recorded (terminal.ts:975,1803 / connection.ts:237). It is the same P2, not a second finding. No implementation changed.The 8 unchanged-size controls (canvas, delayed upgrade, standalone terminal, restart; idle and sleeping shells) passed on the head with identical capture/final viewer geometry and zero live suffix bytes. Exact-base comparison is next.
Real-path open question: reproduced with exact base binary and frontend (
4a6202a52), compared with target1f9da4ede. The committed test “review: unchanged-size restore of a real idle shell on network” fails on base and passes on head. In both runs the last sent size is 53×42; the replay ends at cursor 224 and there are zero newer Output bytes. Base records the note shown; head records zero note visibility moments. The sleeping-shell control reproduces the same difference at cursor 108.The fixture difference is socket-open ordering. Ordinary local canvas reloads send the default 80×24 Resize followed by fitted 53×42 and pass on both base/head because their restored renderer registers after shared socket open (R257-01). A fixture-only 500 ms delay before the WebSocket upgrade lets the restored renderer register first; it sends only fitted 53×42 and starts the watch. Frame latency (
latencyMs/REAL_ONE_WAY_MS) is applied after open, so increasing frame RTT alone cannot model that ordering. The tests wait for a replay fence, then observe for 3 seconds, exceeding every 400–1500 ms RTT-clamped silence wait. Neither a different final attach size nor newer PTY output explains the base/head difference. Standalone socket and restart controls also show the base false note.This reproduces the reported production symptom on the actual product canvas/server/PTY path. I did not contact monitor01; confirming its exact callback sequence still needs a production socket-open/renderer-registration trace. No implementation change. Static x86_64 sizes with the same pinned recipe: base 21,386,512 B; target 21,396,368 B; delta +9,856 B.
Evidence for the real-path comparison and the production endpoint check (tests committed in
56712dd89):browser-head.log
browser-base.log
browser-mock.log
adoption-snapshot.log
production-endpoint.log
Base delayed-upgrade idle reload (note shown):

Head, identical final geometry and no live suffix (note absent):

Base real matrix: 2 pass, 7 fail (6 intended false-note regressions plus R257-01). Head: all 8 unchanged-size cases and the original idle-reload case pass; R257-01 fails; the original resize/repaint case encountered one server-startup timeout before assertions and is queued for an isolated rerun. Native adoption/raw/Snapshot checks pass. Mock desktop/phone suite: 8 pass. The production JS scan and real-server POST checks find no test endpoint.
Committed and pushed remaining review coverage:
e246975b8adds real daemon-adoption/raw/Snapshot geometry coverage to the cargo integration gate;1063a8e564adds the opposite socket-order resized-restore control and verifies repaint clearing. Focused cargo fmt/clippy, cargo integration test (1 pass), tracer check, strict real-spec TypeScript check, and both real positive browser tests pass. The original resize/repaint test passes on isolated rerun; its first startup timeout did not reach product assertions.A fresh callback regression run on review head still has 1 passing control and 1 failing case (already-open shared socket), confirming R257-01 remains present. Full
scripts/verify fastis now running on exact pushed head1063a8e564. No product implementation was changed.Final-gate diagnostic on
1063a8e56: the workspaceagent_daemontest timed out in the restart oracle (first run: before-forward iteration 1, 470,784-byte input; 369,149 output bytes received, final 17-byte marker unacknowledged). An isolated rerun against the same debug binary also timed out, at before-forward iteration 22 (468,224 bytes; 408,064 received). The runner inherited INFRATERNAL_TEST_RTT=0 from the browser checks; no implementation changed. This test is not among the standing #118 exceptions, so it is unresolved rather than waived. Saved exact-base release binary passes the same zero-RTT oracle; that alone is not a matched-profile comparison. Checking the head release binary next, and will compare debug profiles if needed. The full gate is continuing through its static-build checks; its output will be retained verbatim. R257-01 remains independently confirmed.Matched-release control: the exact-base binary
4a6202a52also times out with INFRATERNAL_TEST_RTT=0, before-forward iteration 1, 470,784-byte input, 331,264 output bytes received, final 17-byte marker unacknowledged. Both releases use the same pinned static build recipe and identical unchanged oracle/fixture code. This reproduces the zero-RTT timeout before the target change; root cause is not established. One earlier base run passed all 24 iterations, so the outcome is intermittent. The head timed out in both debug and release profiles.The first full review-head gate inherited the browser runner zero-RTT setting. It is retained as a failed run, without applying a #118 exemption. After it completes, I will run the standard gate with INFRATERNAL_TEST_RTT unset (the fixture default is 300 ms). No product code or test timeout was changed.
First full review-head gate completed on
1063a8e564with the inherited zero-RTT fixture setting. Exit 1; no exception applied. Both static builds pass (x86_64 21,396,368 B; aarch64 19,573,928 B). The workspace test row fails at the existing restart oracle; the same zero-RTT timeout reproduced on exact base release. TypeScript dispatcher rows do not run after a failed Rust summary. Standard default-RTT full gate is queued behind the shared slots, on the same head.verify-fast-head.log

review-checks.log
Oracle controls and the fresh R257-01 regression:
oracle-base-rtt0.log
oracle-base-rtt0-repeat.log
oracle-head-debug-rtt0.log
oracle-head-release-rtt0.log
shared-socket-final-head.log
Verbatim first full-gate summary (full output is attached above):
The standard default-RTT run passed the restart oracle, then failed CLI review test
a_failed_later_page_emits_only_the_failure_envelopeat UnixListener::bind (cli_review_r2.rs:72): “path must be shorter than SUN_LEN”. I configured TMPDIR to the long job scratch path; this is a review-runner path mistake, not a product finding. The exact CLI test passes with TMPDIR set to the existing private real short fixture directory$HOME/.cache/codex-scratch/r257s. No source or timeout changed.The second full gate completed exit 1 with that workspace-test failure; every other Rust gate row, including both static builds, passed. A corrected full run on the same pushed head
1063a8e56is queued: default RTT, short TMPDIR, same private CARGO_TARGET_DIR, build-slot wrapper, two Rust test threads.verify-fast-standard-head.log
cli-short-temp-control.log
R257-02 — P2 — replay geometry changes across a credit pause.
Location:
crates/infraternal-agent/src/daemon.rs:1364(replay_size = next.session.size). Contract:contracts/wire.md:228–233requires pre-viewer-Resize geometry to remain fixed through credit pauses.Failing test:
adopted_raw_and_snapshot_replays_keep_pre_resize_geometry(crates/infraternal/tests/replay_size_review.rs, scriptscripts/verify-agent-replay-size-review.py). Review commit:2b708673458187ba5ca3752b35d3b85c2d1bacc7, pushed only toreview-stale-note-257.Scenario: surviving real PTY, daemon restart, Attach then own Resize 60×20 before credit. Direct shim Hello observations show 120×40 both before restart and immediately before Attach afterward. Completion reports 60×20. The internal relink replaces the original captured geometry. Both retained-raw and snapshot cases have failed at the fixture default RTT of 300 ms; earlier zero-RTT runs passed. This can suppress the stale-screen note by reporting the attaching viewer's size as the replay size.
No implementation changes made. Latest final-head gate is running; the preceding full gate also failed this assertion.
snapshot-attach-size-control.log
snapshot-pre-size-control.log
verify-fast-final-head.log
Independent review verdict: do not merge. Counts: P0=0, P1=0, P2=2, P3=0.
Target:
stale-note-257at1f9da4ede4035b458cc54b89ce1eed718a1c1316; merge base4a6202a5299329411fcf94deef6b0181b054957c. Review head:2b708673458187ba5ca3752b35d3b85c2d1bacc7onreview-stale-note-257. Only review tests and fixture controls changed; implementation unchanged.apps/tracer/src/terminal.ts:975,1803,apps/tracer/src/connection.ts:237: a restored renderer joining an already-open shared socket never sets connectionIsResume, so a resized silent replay does not show the note. Failing test:a resized silent restore starts its note watch when socketOpenedFirst=true. Real-path counterpart:review: a resized silent real canvas restore shows the stale note(53×42 captured, 45×30 viewer, no newer output, no note). Pre-existing on base and target. Opposite-order real control passes and real PTY output clears the note.crates/infraternal-agent/src/daemon.rs:1364: credit recovery replaces the captured replay geometry with the viewer's updated geometry. Failing test:adopted_raw_and_snapshot_replays_keep_pre_resize_geometry. Actual shim Hello size is 120×40 before and after daemon restart, immediately before Attach; own Resize60×20 before credit causes completion60×20. Contract requires geometry to remain fixed through credit pauses. Retained-raw and Snapshot paths have both failed with default fixture RTT300ms.The production symptom is reproduced through the real server/browser/PTY path on the exact base: delaying WebSocket upgrade500ms lets the cached renderer register before socket-open. Unchanged-size idle and sleeping shells then show the false note on base and never show it on target. Ordinary local canvas reloads pass even on base because the reversed callback order masks the watch (R257-01). Frame-delay controls delay messages after upgrade and do not cover this handshake order. The tests await the actual replay fence and observe silence3seconds, beyond the1500ms maximum RTT-based wait, with transient note recording. The fixture sends default80×24 then fitted53×42 in the ordinary path, versus fitted53×42 after delayed upgrade. No contact with monitor01; its exact callback order remains untraced. This is a controlled real-path reproduction, not a claim about a captured production trace.
Wire review: optional fields are additive; both codecs and present/absent golden vectors pass (7 protocol tests,98 assertions). Multi-viewer geometry controls passed; credit-pause adoption is the failing exception above. Malformed/absent client geometry, same-size suppression, repaint clearing and bounded RTT wait pass (14 client tests). Mock desktop/phone suite:8 pass. Production scan:72 JS files contain no
/__mock/resize-session; authenticated real-server requests return404/405 without the test-double header.Pinned stripped static x86_64 comparison: base21,386,512B; target21,396,368B; delta+9,856B. Head aarch64:19,573,928B. Linkage/trust/key-memory/size checks passed in the prior complete gate.
Evidence and individual failing tests are recorded above; updated structured findings:
findings.json
Final
scripts/verify faston the review head exited1: the review-added replay geometry test failed in Snapshot adoption (120×40 actual pre-Attach, completion60×20); the retained-raw control passed in this run. All other Rust gate rows passed. The Rust failure prevents the dispatcher TypeScript phase; separate TypeScript/client/protocol and browser evidence is recorded above. No failure exemption applied.verify-fast-review-head.log
Final gate output — verbatim
Review cleanup complete: own target directory, target symlink, and short fixture state root removed. No fixture processes remain for this worktree. Source worktree is clean. Remote
review-stale-note-257equals2b708673458187ba5ca3752b35d3b85c2d1bacc7. No implementation changes, merge, deployment, or issue closure. Final verdict and verbatim final gate output are in the preceding comment.Implementation fix round started on branch
stale-note-257, base1f9da4ede4035b458cc54b89ce1eed718a1c1316. Review tests merged from2b708673458187ba5ca3752b35d3b85c2d1bacc7; merging dev release 9.5 candidate8f88bf086next, with cap conflicts to be resolved by sequential pinned measurements. Addressing R257-01 and R257-02 separately, retaining delayed-upgrade real-path reproduction and all prior #257 cases. The existing clean branch worktree remains untouched; work is in~/wt-infraternal/stale-note-fix.R257-01 fixed in the pushed client commit:
onWelcomeclassifies existing-session restores even when a shared socket opened before renderer registration. Both callback orders now use the same painted-fence geometry decision. Focused regression failed before the fix (already-open order: expected note, got none), then passed; expanded coverage totals 19 passing tests / 53 assertions, including same size, absent fields and later-output clearing.bun run checkpasses. Dev8f88bf086merged ind232ae41e; cap values remain provisional until the pinned final repair measurements.Merged-baseline reproduction confirms R257-02 with default fixture RTT:
adopted_raw_and_snapshot_replays_keep_pre_resize_geometryfails in Snapshot adoption. Direct shim Hello reads before/after restart are both 120×40; fence at cursor 12583279 reports 60×20 after the attaching viewer's Resize. The retained-raw control passed in this run. Removed the recovery Hello geometry replacement; all six fence sites continue using the original capture, while a primed link still refreshes when a delivered cursor starts a new replay. Repair verification is underway.R257-01 client repair is pushed at
6d7b433a449c052b9989be521e7ad6aa082bb261(19 focused tests / 53 assertions; tracer TypeScript check passes).R257-02 fixed and pushed at
e99e84cac: preserve captured replay geometry across credit recovery, including Snapshot restarts; only a primed delivered cursor starts a fresh capture. Rejected using recovery Hello geometry because this viewer's Resize may already be applied.Validation: both real-binary replay tests pass, infraternal agent remote suite 148 passed / 0 failed / 20 ignored, workspace Clippy and fmt pass, feature-disabled infraternal agent check passes. Two initial suite attempts hit Unix socket path length in a test setup; the final private TMPDIR uses a 107-byte complete fixture socket path and passes without source/timeout changes. Sequential pinned static builds are running next. Client repair remains
6d7b433a4.Pinned static measurements on
8by64-compute02, sequential builds at repair heade99e84cac2e5a8e0a2354e9e709ea22bd35826d5: x86_64 21,431,472 bytes, aarch64 19,605,896 bytes. Against dev8f88bf086(21,420,592 / 19,592,504), deltas are +10,880 / +13,392 bytes, both below 16 KiB. Both are stripped static images with no PT_INTERP; production-trust checks pass. No dependencies, features or release settings changed. Exact caps and one PROCESS comparison paragraph are committed; browser validation is running on the shipping static image and production frontend. Final-head fast gate follows.Validation on pushed head
0c8639496b376362b27689122583c53ade4a4668: 12 real-path browser tests and 8 desktop/phone mock tests pass, one worker, unique port 4957. Both resized silent real restores show the note (ordinary already-open socket and delayed upgrade); Ctrl+C/fresh PTY output clears it. All eight unchanged-size real controls report zero visibility moments, matching replay/final viewer geometry and no live suffix bytes. The delayed-upgrade idle/silent cases retain the review's controlled production-path reproduction. Original D309 real tests pass. Client focused tests: 19 pass / 53 assertions.The caps commit
0c8639496records 21,431,472 / 19,605,896 bytes against release-9.5 dev8f88bf086, +10,880 / +13,392 bytes. Native R257-02 before/after and fixture-path correction are recorded above. Full final-headscripts/verify fastis running, with default RTT, short private fixture roots and two Rust test threads.Receipts and production-build screenshots:
static-measurements.log






r257-02-before.log
native-after.log
native-checks-short.log
browser-head.log
client-tests.log
Finished implementation at head
0c8639496b376362b27689122583c53ade4a4668, pushed tostale-note-257. Worktree is clean; no deployment or issue closure.6d7b433a4): restored renderers classify resume inonWelcome, so already-open shared sockets and fresh socket ordering use the same painted replay geometry decision. Rejected using socket-open callback order to distinguish restored shells. Expanded both-order tests retain same-size suppression, absent-field fallback and later-output clearing.e99e84cac): credit recovery retains the original pre-Resize geometry for retained-raw retries and Snapshot restart. Rejected recovery Hello geometry because this attachment's Resize may already be applied. Primed delivered cursors still start a fresh capture.0c8639496): sequential pinned images on 8by64-compute02 measure 21,431,472 / 19,605,896 bytes (x86_64 / aarch64), +10,880 / +13,392 against dev8f88bf086(21,420,592 / 19,592,504). Both below 16 KiB; exact caps and one PROCESS paragraph updated, no allowance, dependencies, feature or profile changes.Validation: 19 focused client tests / 53 assertions; both real-binary replay tests; infraternal agent remote suite 148 passed / 20 ignored; workspace Clippy, fmt and feature-disabled check; 12 production-build real-path browser tests plus 8 desktop/phone mock tests, one worker. The ordinary canvas fixture formerly skipped the watch when renderer registration followed socket-open; the delayed-upgrade controls still cover the review's controlled production-path reproduction. Both resized positive controls now show the note and fresh PTY output clears it. All eight unchanged-size real controls report zero visibility moments. Screenshots and receipts are in the preceding validation comment.
Author checklist: all six replay-complete call sites retain captured geometry through credit pauses; only a new primed replay refreshes it. Cursor boundaries and additive optional notice fields are unchanged. No new hot-path allocation, periodic work, dependency, UI component or authentication behavior. Earlier native suite setup failures were socket-path length only and passed with the private 107-byte fixture path; the final fast gate needed no failure exemption.
How to test:
Final
scripts/verify fast: PASS (exit 0) on the committed head above. Every Rust gate row passes; both static images match their exact caps, including linkage/trust/key-memory checks; TypeScript validation passes. No fixture processes remain. Cargo target directory, its worktree symlink and this job's private fixture roots have been deleted.verify-fast-head.log
Final-head scripts/verify fast output (verbatim)
Round-2 delta review started: review-stale-note-r2, base
0c8639496. Checking retained round-1 tests, all replay geometry/renderer order paths, dev #255/#252/#240 preservation, static sizes and final fast gate. No implementation edits.Round-2 progress at review head
8e969e8b16: original callback regression retained in a separate byte-identical test file (8e969e8b1), pushed. Focused callback/stale-state/codec checks: 28 passed, 0 failed; tracer check passes. Four other round-1 review files are byte-identical. The author expanded the callback test in place; its original assertions also pass unchanged.apps/tracer/test/stale-note-257-review.test.ts: byte_identical=False
apps/tracer/real/stale-note-257-review.spec.ts: byte_identical=True
apps/tracer/test/stale-note-recorder.ts: byte_identical=True
scripts/verify-agent-replay-size-review.py: byte_identical=True
crates/infraternal/tests/replay_size_review.rs: byte_identical=True
Original callback test retained byte-identically at apps/tracer/test/stale-note-257-round1-review.test.ts; both orders pass.
dev preservation Cargo.lock: byte_identical=True
dev preservation Cargo.toml: byte_identical=True
dev preservation crates/infraternal/src/main.rs: byte_identical=True
dev preservation crates/infraternal/src/install.rs: byte_identical=True
dev preservation crates/infraternal-status/src/lib.rs: byte_identical=True
dev preservation crates/infraternal-server/src/websocket.rs: byte_identical=True
dev preservation crates/infraternal-server/src/auth/account_events.rs: byte_identical=True
dev preservation crates/infraternal-server/src/auth/sessions.rs: byte_identical=True
dev preservation crates/infraternal-server/src/auth/recovery.rs: byte_identical=True
dev preservation crates/infraternal-server/src/bootstrap_setup_api.rs: byte_identical=True
Full fast gate is building. No implementation changes or new product finding so far.
First review fast-gate attempt: replay_size_review stopped before assertions: ValueError: test state path is too long for an AF_UNIX socket after fallback: 108 bytes. Re-run uses private INFRATERNAL_TEST_STATE_ROOT=$HOME/.cache/codex-scratch/rr257r2 and TMPDIR=$HOME/.cache/codex-scratch/tr257r2, two test threads, unchanged source and test timeouts. First transcript retained.
Correction to the earlier progress note: the first standalone tracer check did not pass; it lacked the declared worktree type packages (TS2688). After bun install --frozen-lockfile in apps/tracer, bun run check now passes (exit 0). No dependency or lockfile changes. The full gate will check this again. First gate fixture-path setup failure and both check transcripts are retained.
Round-2 milestone on
8e969e8b16: unchanged adopted_raw_and_snapshot_replays_keep_pre_resize_geometry and replay_fences_report_pre_resize_geometry_across_viewers pass in the final gate with the short private fixture root. Sequential pinned static rebuilds independently match 21,431,472 / 19,605,896 bytes, both stripped with no PT_INTERP. First gate failed only at pre-assertion fixture path length (108 bytes); its transcript is retained. Final full gate is continuing; browser suite follows.Round-2 delta review finished: merge. Findings: P0=0, P1=0, P2=0, P3=0. R257-01 and R257-02 are verified by the retained failing regressions and the production path. Target:
0c8639496b. Review branch: review-stale-note-r2, head8e969e8b16a48c4294a06837856c65e78bd4aae1, pushed; worktree clean. No implementation edits, deployment, or issue closure.2b7086734and0c8639496. The author expanded the callback test in place; that file is not byte-identical. Commit8e969e8b1retains its original bytes separately inapps/tracer/test/stale-note-257-round1-review.test.ts. Original and expanded tests both pass; no weakened original assertion was found.adopted_raw_and_snapshot_replays_keep_pre_resize_geometrypasses unchanged, as does the real three-viewer 80x24 -> 120x40 -> 60x20 test. All six production completion sites use captured geometry; recovery retains it through raw retries and Snapshot restart. Primed delivered cursors refresh capture. No remaining producer or renderer-order defect found.8f88bf086is merged. Cargo.lock/profile, all shim sources, setup/install/CLI and relevant account-auth/websocket sources are byte-identical to dev; the receiver diff only accepts optional geometry. Final infraternal-agent suite: 149 passed, 0 failed, 20 ignored. Server: 674 passed, 0 failed, 53 ignored, including account-scoped revocation and setup coverage. No dropped #255/#252/#240 behavior found.scripts/verify faston8e969e8b16a48c4294a06837856c65e78bd4aae1: PASS, exit 0; full output quoted verbatim below. Default native RTT; RUST_TEST_THREADS=2; short private fixture roots; browser port 5272 and one worker. Build target and all owned fixture roots removed.Validation setup notes: first gate stopped the adopted-replay test before assertions at a 108-byte Unix socket path. Second gate passed that regression but its longer gone-session fixture exceeded SUN_LEN under TMPDIR. Final run uses an exclusively created one-character scratch TMPDIR (107-byte complete socket path), unchanged source/timeouts, and passes all rows. Initial standalone type check lacked declared type packages; install and corrected check pass. A standalone protocol attempt timed out cold-building its Rust oracle; the final gate prebuilds it and passes. These initial transcripts are attached; no baseline exemption was used.
Evidence and production screenshots:
verify-fast-head.log






verify-fast.log
verify-fast-final.log
browser-real.log
browser-mock.log
focused-unit.log
preservation.log
production-hook.log
tracer-check-corrected.log
protocol.log
tracer-check.log
Final-head scripts/verify fast output (verbatim)
Merged into dev by fast-forward to
0c8639496after the round-2 review returned merge (0 findings,scripts/verify fastexit 0). It goes into the next release build; the staged 9.5 bundle predates it.