Terminal opens refused at 128 sessions; dead sessions linger; background sessions invisible #151
Closed
opened 2026-10-10 09:57:17 +00:00 by kayg
·
79 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#151
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 (2026-10-10), production: new terminals sometimes fail with "The server could not open this terminal."
Root cause, found on monitor01:
MAX_TERMINAL_STREAMS = 128sessions (plugin-api/src/channel.rs:35,agent/src/daemon.rs:345). It replies "invalid terminal open or session limit", which the UI shows generically./run/infraternal/sessions. After hanging up idle shells, 128 shims stayed alive with no shell. The agent held 0 pidfds for them, yet the sockets remained.Measured: a session costs about 10.5 MB (5.5 MB shim + 5 MB shell). 130 sessions ≈ 1.4 GB of 8 GB.
Manual cleanup done with the owner's approval: idle shells were hung up, the empty shims terminated, and the stale sockets removed. One live session is left.
Owner decision (Q2, "we need way better ux here"):
Started session-bounds at production base
0d93a50275. Read #151 (no comments, no parent linked), CLAUDE.md, DECISIONS.md, architecture and process. Scope: local shim/session lifecycle, memory admission, structured refusal and background counts; remote exit propagation stays with release-addhost. Finding: shim session.rs waits for AckExit indefinitely; daemon.rs terminal relay intentionally never acknowledges Exited; sessions.rs discovery also refuses after 128 sockets.Contract proposal under approved #151/D214 brief: keep all v1 shim frame layouts, including ExitAck. Replace indefinite dead-exit retention with retirement once final output and Exited have been flushed to each attached viewer; retire without a viewer within one second. Live detached shells still survive (D13/D178). Add terminal.open refusal JSON reason codes and optional numeric available_mib/session_count; expose background count additively. No new transport/engine choice.
Failing real-shell test before fix: detached_shell_exit_reaps_shim_within_one_second failed with "dead shim socket retained" after 1.03 s (crates/infraternal/tests/shim.rs). Shim now drains final output, flushes Exited to every output viewer, and exits/removes socket without requiring ExitAck. Discovery/control probes do not backpressure PTY output. All 8 real shim tests passed in 3.30 s; full fast gate running. Test state moved under job scratch (104-byte socket path) because the absolute worktree socket path exceeds Linux sun_path.
Finding: apps/tracer/src/canvas/sessions/live-inventory.ts explicitly implements only browser-local remembered sessions pending #100; existing picker can be opened, but cannot currently end host sessions. Backend count will report host truth independently; no replacement visual design in this lane.
Correction to the memory figure (smaps_rollup on monitor01, one empty session):
The shim's other 3.5 MB is private-clean text from the 18.7 MB static binary. It is shared across every shim through the page cache, so with N shims it isn't paid N times.
The real incremental cost of an empty session is about 3.3 MB, of which infraternal's shim is about 1 MB. 130 empty sessions ≈ 430 MB, not 1.4 GB. The 128 cap was not protecting memory.
For this job:
Resumed session-bounds at base
0d93a50275, HEAD unchanged. Read all four #151 comments; no parent is linked. Existing shim reaping diff and 8/8 real tests retained. Previous fast gate stopped on ENOSPC; rerunning after disk recovery before committing/pushing the shim step. Memory measurement will use PSS/private dirty at 200 sessions, including scrollback/runtime/grid attribution.Measurement blocked by host-wide PTY exhaustion: /proc/sys/kernel/pty/nr=4041, max=4096 (55 slots free). The 200-session fixture failed at session 55; all fixture children were retired. Cannot complete simultaneous 200-session measurement until other owners release at least 200 PTYs; this job cannot change host sysctls or terminate other jobs. Host infraternal-dev load=26.37 27.10 20.67, MemAvailable=4933996 KiB. Continuing implementation and gates; will retry if capacity returns. No valid 200-session figures claimed.
Fresh shim verification: 8/8 real shim tests passed in 5.63 s; real daemon 24-restart oracle passed in 39.74 s; queue saturation oracle passed in 35.66 s. Gate found fixture setup failure (initial attach credit: FileNotFoundError target/ac, before binary launch), because legacy tests still use repo-relative target paths. Linked ignored worktree target to this job scratch target; clean gate rerun pending. Corrected duplicated disconnect conditional caught by clippy. No production behavior change from either correction.
Additional failing real-shell case: detached_shell_exit_reaps_even_with_a_live_background_descendant failed in 1.11 s (dead shim socket retained). An ignored-HUP background sleep holds the PTY slave, so POLLIN/HUP never arrives after shell exit. Fix: when the child has exited and viewer backpressure permits draining, poll with zero timeout and probe the nonblocking master; WouldBlock completes the final drain. Live idle shims retain event-driven blocking poll. Rerunning nine real shim tests.
Additive implementation contract for remaining #151 work: resource admission stays behind the existing host plugin feature; host settings gain terminalMemoryFloorMiB=256 and terminalMemoryFloorPercent=5, and a declared host.memory.configure action. Generic plugin admission/context hooks keep core dispatch independent of policy. terminal.open refusal JSON adds reason (host_memory_low/invalid/unavailable/resource_unavailable), available_mib and session_count only for memory refusal; existing error remains for compatibility. Host facts add sessionCount/backgroundSessionCount from live registry and window attachment ownership, including native QUIC. Registry deletion notifications are event-driven, with no idle timer. Startup discovery uses bounded handshake batches without a total session cap.
Reaping integration finding: fast gate real_binary_preserves_input_and_output_across_24_abrupt_stops failed after shell exit: agent_fixture.py:316 received Close(1,"terminal shim disconnected") before terminal.exited. The local daemon had queued Event on bulk then read shim EOF, allowing priority Close to overtake it. Added a local Message::Exited delivery acknowledgment in daemon.rs: writer sends ordered Event, acknowledges it, terminal task returns successfully without reading EOF. No frame layout or remote server/browser handler changed. Nine real shim tests now pass (5.79 s); full fast rerun includes this dependent lifecycle fix.
Completed lifecycle step, pushed session-bounds head
730dd3bd12. Nine real shim tests pass (including detached shell with live descendant); the ordered writer acknowledgment fixes the EOF/Close race. All workspace tests, including 262 server tests, pass; TS gates pass separately (36 protocol tests, 34,462 assertions). Static x86_64 is stripped, static-PIE, 19,616,352 bytes. No deploy. Fast gate output below verbatim; only the legacy size allowance fails under D205:/home/kayg/.cache/codex-scratch/session-bounds/target/x86_64-unknown-linux-musl/release/infraternal: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), static-pie linked, stripped
PT_INTERP: absent; size: 19616352 bytes (baseline 16142672 + allowance 262144 = max 16404816)
binary exceeds the 16404816-byte size budget: 19616352 bytes
+---------------------------+--------------+
| Rust gate | Result |
+---------------------------+--------------+
| fmt | PASS |
| VT native fmt | PASS |
| clippy | PASS |
| test | PASS |
| cargo-deny | PASS |
| static builds | FAIL (1) |
+---------------------------+--------------+
Completed additive plugin API step:
a58e071b, pushed session-bounds. Policy hooks keep admission plugin-owned; typed refusal preserves legacy error and validates counters. scripts/verify fast: fmt, VT fmt, clippy, workspace tests and cargo-deny PASS; static size-only FAIL under D205 (19,616,448 bytes, +96 from730dd3bd). Host policy failing-first regression: configured_memory_floor_refuses_with_current_host_counters fails with UnknownAction before implementation.| fmt | PASS |
| VT native fmt | PASS |
| clippy | PASS |
| test | PASS |
| cargo-deny | PASS |
| static builds | FAIL (1) |
PSS diagnostic only, not the mandatory 200-session evidence: 12 simultaneous real 80x24 sessions on infraternal-dev, CPUWeight=10000; concurrent own gate build, load 12.42/19.02/22.57 initially. Empty shims mean PSS 1,410.92 KiB/private dirty 1,065.33 KiB; shells 780.67/595.00 KiB. After 12,000 real shell output rows each: shims 18,203.25/17,857.67 KiB; shells 838.67/655.00 KiB. Completion markers read from every shim before sampling; all owned children retired. One shim thread, resident stack 48 KiB; ELF writable mappings account for 908 KiB private dirty, not a per-shim async runtime/thread pool. Lazy output ring and bounded VT history dominate growth (src/ring.rs, src/terminal.rs). The production single-binary layout has replicated writable relocation pages; reducing that requires a separately measured binary-layout change, not selecting another terminal engine. Logs: ~/.cache/codex-scratch/session-bounds/memory-diagnostic-12.log. PTYs still nr4039/max4096; 200 real simultaneous sessions remain blocked.
PTY capacity recovered (nr16/max4096); required 200 simultaneous real 80x24 shim+shell measurement completed locally under CPUWeight=10000, stripped static binary 19,620,768 bytes (
a58e071b+ host memory policy, commit pending). Load recorded below; own gate tests were running, no artificial CPU load. Counters are PSS/private dirty, NOT RSS. Empty total PSS 339,048 KiB/private dirty 331,804 KiB; after 12,000 output rows each, total PSS 3,750,764 KiB/private dirty 3,743,480 KiB. All completion markers read before sampling; all 200 owned shells/shims cleaned, nr returned20. One shim thread, resident stack52 KiB; writable ELF mappings908 KiB private dirty. VT initial heap/anonymous pages are much smaller; no async runtime in shim. An empty-shell estimate misses about3.25 GiB of real retained history at200 sessions; admission must sample MemAvailable. Evidence: ~/.cache/codex-scratch/session-bounds/memory-200.log and measure.py.{"machine": "infraternal-dev", "binary": "/home/kayg/.cache/codex-scratch/session-bounds/target/x86_64-unknown-linux-musl/release/infraternal", "dimensions": "80x24", "load": "13.13 41.39 34.73 15/3074 3946799"}
{"phase": "empty-200", "role": "shim", "count": 200, "total_kib": {"Pss": 216928, "Private_Dirty": 212928, "Private_Clean": 0}, "mean_kib": {"Pss": 1084.64, "Private_Dirty": 1064.64, "Private_Clean": 0.0}, "load": "13.13 41.39 34.73 12/3500 3947596"}
{"phase": "empty-200", "role": "shell", "count": 200, "total_kib": {"Pss": 122120, "Private_Dirty": 118876, "Private_Clean": 4}, "mean_kib": {"Pss": 610.6, "Private_Dirty": 594.38, "Private_Clean": 0.02}, "load": "13.13 41.39 34.73 9/3504 3947605"}
{"phase": "scrollback-200", "role": "shim", "count": 200, "total_kib": {"Pss": 3616604, "Private_Dirty": 3612604, "Private_Clean": 0}, "mean_kib": {"Pss": 18083.02, "Private_Dirty": 18063.02, "Private_Clean": 0.0}, "load": "18.92 41.74 34.92 10/3501 3948054"}
{"phase": "scrollback-200", "role": "shell", "count": 200, "total_kib": {"Pss": 134160, "Private_Dirty": 130876, "Private_Clean": 4}, "mean_kib": {"Pss": 670.8, "Private_Dirty": 654.38, "Private_Clean": 0.02}, "load": "18.92 41.74 34.92 16/3501 3948054"}
Host-load gate retries: initial terminal-open reply failure subsequently PASS in full gate; isolated current/dev open test PASS1.51s/1.31s; initial mesh snapshot failure retries current/dev PASS9.83s/9.71s. dev baseline
b9b61d07in own detached scratch checkout. The third full gate is running with test harness concurrency1; neither failure is being waived on mismatching baseline results.Completed host memory settings module:
a7a0ff7b, pushed session-bounds. Runtime host.memory.configure, validated absolute MiB/percentage floors (default256/5), current OS memory sample. 12 host plugin tests PASS. This is the static source used for the200-session measurement already recorded. Final scripts/verify fast (test harness concurrency1) workspace tests PASS, including262 server tests/30 ignored. Size-only exception underD205; +4,320 bytes overa58e071b. Verbatim gate tail:advisories ok, bans ok, licenses ok, sources ok
==> static builds
Finished
releaseprofile [optimized] target(s) in 0.69s/home/kayg/.cache/codex-scratch/session-bounds/target/x86_64-unknown-linux-musl/release/infraternal: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), static-pie linked, stripped
PT_INTERP: absent; size: 19620768 bytes (baseline 16142672 + allowance 262144 = max 16404816)
binary exceeds the 16404816-byte size budget: 19620768 bytes
+---------------------------+--------------+
| Rust gate | Result |
+---------------------------+--------------+
| fmt | PASS |
| VT native fmt | PASS |
| clippy | PASS |
| test | PASS |
| cargo-deny | PASS |
| static builds | FAIL (1) |
+---------------------------+--------------+
Next discovery regression fails first:200 authenticated fixture sockets rejected with infraternal session limit reached (discovery-before.log). Real lifecycle counter regression fails first with missing sessionCount (lifecycle-before.log); browser low-memory regression fails with no refusal toast (refusal-real-before.log), client parser fails reason expectedhost_memory_low receivedterminal unavailable (refusal-client-before.log).
Completed discovery module:
fe362c97, pushed session-bounds. 200 authenticated fixture sockets recover (previously rejected at129); concurrent frozen-frame handshake storage bounded32MiB. Stale sockets removed, disappearance races tolerated. No new dependency. Static binary19,622,688 bytes (+1,920 overa7a0ff7b), no PT_INTERP. Verbatim fast gate tail:==> static builds
Blocking waiting for file lock on build directory
Compiling infraternal-plugin-host-facts v0.1.0 (/home/kayg/Developer/infraternal/.worktrees/session-bounds/crates/plugins/host-facts)
Compiling infraternal-agent v0.1.0 (/home/kayg/Developer/infraternal/.worktrees/session-bounds/crates/infraternal-agent)
Compiling infraternal-server v0.1.0 (/home/kayg/Developer/infraternal/.worktrees/session-bounds/crates/infraternal-server)
Compiling infraternal v0.1.0 (/home/kayg/Developer/infraternal/.worktrees/session-bounds/crates/infraternal)
Finished
releaseprofile [optimized] target(s) in 3m 36s/home/kayg/.cache/codex-scratch/session-bounds/target/x86_64-unknown-linux-musl/release/infraternal: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), static-pie linked, stripped
PT_INTERP: absent; size: 19622688 bytes (baseline 16142672 + allowance 262144 = max 16404816)
binary exceeds the 16404816-byte size budget: 19622688 bytes
+---------------------------+--------------+
| Rust gate | Result |
+---------------------------+--------------+
| fmt | PASS |
| VT native fmt | PASS |
| clippy | PASS |
| test | PASS |
| cargo-deny | PASS |
| static builds | FAIL (1) |
+---------------------------+--------------+
New failing real-shim finding: a viewer attaching without Credit, killing its shell, then granting Credit after350ms gets Close(terminal shim disconnected) instead of the buffered terminal.exited event (exit-credit-before.log). Shim/socket already retired; the relay starvation path discarded the only remaining buffered exit. Planned local fix: preserve a read-closed shim link until its final output and exit are funded/drained; live-shim250ms detachment remains. This does not change remote server/browser exit propagation.
Completed host-facts wire module:
a82ec0d9, pushed session-bounds. Additive optional sessionCount/backgroundSessionCount from trusted NodeContext; bootstrap-only collection omits them; caller counters rejected. Failing-first context test nowPASS; core lifecycle wiring is next. Static binary19,623,776 bytes (+1,088), no PT_INTERP; no dependencies added. Verbatim fast gate tail:advisories ok, bans ok, licenses ok, sources ok
==> static builds
Compiling infraternal-plugin-host-facts v0.1.0 (/home/kayg/Developer/infraternal/.worktrees/session-bounds/crates/plugins/host-facts)
Compiling infraternal-agent v0.1.0 (/home/kayg/Developer/infraternal/.worktrees/session-bounds/crates/infraternal-agent)
Compiling infraternal-server v0.1.0 (/home/kayg/Developer/infraternal/.worktrees/session-bounds/crates/infraternal-server)
Compiling infraternal v0.1.0 (/home/kayg/Developer/infraternal/.worktrees/session-bounds/crates/infraternal)
Finished
releaseprofile [optimized] target(s) in 3m 12s/home/kayg/.cache/codex-scratch/session-bounds/target/x86_64-unknown-linux-musl/release/infraternal: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), static-pie linked, stripped
PT_INTERP: absent; size: 19623776 bytes (baseline 16142672 + allowance 262144 = max 16404816)
binary exceeds the 16404816-byte size budget: 19623776 bytes
+---------------------------+--------------+
| Rust gate | Result |
+---------------------------+--------------+
| fmt | PASS |
| VT native fmt | PASS |
| clippy | PASS |
| test | PASS |
| cargo-deny | PASS |
| static builds | FAIL (1) |
+---------------------------+--------------+
Weighted release relay measurement:200 simultaneous actual local relay futures against authenticated Unix fixture peers (no PTYs). Paired fixture/private overhead988KiB =5,058bytes/stream; relay future1,704bytes; load10.43/12.43/19.25. This measures transport metadata separately from the recorded200 real shim+shell PSS. Planned per-connection metadata reservation4MiB /32KiB perstream (over6x measured) keeps128 concurrent streams; host session count is independent. Numeric stream IDs remainu32; shim frame/queue and transport byte credits remain independent byte bounds. Evidence stream-memory-200.log and src/stream_memory_tests.rs.
Daemon gate load finding: auth socket visible-host expiry test returned an error event instead of snapshot/resync under load 14.85/12.12/12.17. Detached dev baseline
b9b61d07failed the same test in the same window: left "error", expected "resync", 12.51s. Exact current workspace test binary rerun passed in 10.38s. Baseline output:running 1 test
listed_live=true db_live_now=false expiry_event_received=true
thread 'auth::tests::socket_tests::claude_review_visible_liveness::claude_review_watch_expires_host_made_visible_by_membership_edit' (192302) panicked at crates/infraternal-server/src/auth/socket_tests/claude_review_visible_liveness.rs:137:5:
assertion
left == rightfailedleft: String("error")
right: "resync"
note: run with
RUST_BACKTRACE=1environment variable to display a backtracetest auth::tests::socket_tests::claude_review_visible_liveness::claude_review_watch_expires_host_made_visible_by_membership_edit ... FAILED
failures:
failures:
auth::tests::socket_tests::claude_review_visible_liveness::claude_review_watch_expires_host_made_visible_by_membership_edit
test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 150 filtered out; finished in 12.51s
Completed daemon lifecycle/admission step
24216c3217, pushed session-bounds. Real regressions pass: counts/admission/attached+detached reaping (6.54s), delayed-credit exit after 350ms (2.18s). Shim unit 61 pass/12 ignored; public mouse probe passes with pinned Zig PATH. x86 static 19,642,048 bytes (+18,272 froma82ec0d9), PT_INTERP absent. Test row failure is the auth socket expiry timeout also reproduced on detached devb9b61d07in the same load window; exact current isolated rerun passed (recorded above). All other rows pass except the D205 historical size budget. Tracer/compiler/protocol checks pass separately. Gate output verbatim:+---------------------------+--------------+
| Rust gate | Result |
+---------------------------+--------------+
| fmt | PASS |
| VT native fmt | PASS |
| clippy | PASS |
| test | FAIL (101) |
| cargo-deny | PASS |
| static builds | FAIL (1) |
+---------------------------+--------------+
Repeat measurement after daemon lifecycle change
24216c32(static 19,642,048 bytes), local CPUWeight=10000, 8 cores. Actual daemon recovered all 200 real shims, reported 200 background sessions, admitted session 201, then returned to 200 after its shell exited. All owned children cleaned. This confirms the removed host cap with real shells, beyond the earlier authenticated socket discovery test. PSS/private dirty numbers and load:{"machine": "infraternal-dev", "binary": "/home/kayg/.cache/codex-scratch/session-bounds/target/x86_64-unknown-linux-musl/release/infraternal", "dimensions": "80x24", "load": "22.73 20.75 18.05 32/3093 292548"}
{"phase": "registry", "recovered": 200, "admitted": 201, "after_reap": 200}
{"phase": "empty-200", "role": "shim", "count": 200, "total_kib": {"Pss": 217747, "Private_Dirty": 213748, "Private_Clean": 0}, "mean_kib": {"Pss": 1088.73, "Private_Dirty": 1068.74, "Private_Clean": 0.0}, "load": "25.58 21.43 18.30 16/3460 293712"}
{"phase": "empty-200", "role": "shell", "count": 200, "total_kib": {"Pss": 122183, "Private_Dirty": 118884, "Private_Clean": 20}, "mean_kib": {"Pss": 610.91, "Private_Dirty": 594.42, "Private_Clean": 0.1}, "load": "25.58 21.43 18.30 21/3460 293712"}
{"phase": "scrollback-200", "role": "shim", "count": 200, "total_kib": {"Pss": 3577471, "Private_Dirty": 3573472, "Private_Clean": 0}, "mean_kib": {"Pss": 17887.35, "Private_Dirty": 17867.36, "Private_Clean": 0.0}, "load": "38.18 24.12 19.18 34/3508 294279"}
{"phase": "scrollback-200", "role": "shell", "count": 200, "total_kib": {"Pss": 134219, "Private_Dirty": 130884, "Private_Clean": 16}, "mean_kib": {"Pss": 671.1, "Private_Dirty": 654.42, "Private_Clean": 0.08}, "load": "38.18 24.12 19.18 32/3507 294282"}
Refusal forwarding regression: real authenticated browser socket previously received only legacy error text (reason=null); after typed server routing, memory_refusal_preserves_reason_and_counters_to_browser passes, retaining host_memory_low, available_mib=180 and session_count=212. Decoding is bounded to MAX_CONTROL_JSON (32 KiB), unknown/internal failures remain generic, and freshness/revocation/ownership checks are preserved. Tracer refusal tests pass 4/4 (21 assertions), compiler and production transfer pass (critical gzip 288,094/307,200 bytes). Host facts plugin removal check passes. Full fast gate and ASan parser fuzz run are in progress before the next atomic commits; browser screenshots wait for this branch's updated static binary. No deployment.
Weighted release relay repeat with final window ownership tracking, local infraternal-dev: 200 simultaneous relay tasks, private memory 4,072 -> 5,076 KiB (+1,004 KiB), 5,140 bytes/stream; future 1,728 bytes. Load 33.38/29.37/26.00. No PTYs in this transport-only benchmark. Earlier baseline without window ownership was 5,058 bytes/stream and 1,704-byte future. 32 KiB/stream remains over six times measured cost within the 4 MiB connection metadata reserve (128 concurrent streams); host admission is independent. Full payload/QUIC limits are separate, not attributed to this metadata measurement.
Canonical documentation finding: contracts/shim.md:93,109-110 and docs/S1-SHIM.md:32 describe retaining exited shims until ExitAck, contradicting the explicitly approved #151 job. Proposed owner-brief amendment: preserve the frozen opcodes/layouts; Exited is flushed after PTY drain to attached data viewers, then the shim retires and removes its socket without requiring ExitAck. With no data viewer, retire within one second; discovery/control peers cannot hold it alive. ExitAck remains accepted as a peer acknowledgement and cannot skip another viewer's ordered exit. Retired shells are not resumable after infraternal agent restart; startup reconciles only live shims. D178 continues to preserve detached live shells. I will update the canonical semantics and mark earlier retained-exit evidence as historical, without changing DECISIONS.md.
Completed and pushed separate backend steps:
f92c9e34preserves bounded public reasons/counters through authenticated server routing;72de9325derives 128 connection stream slots from 4 MiB / 32 KiB and includes the 200-relay measurement;22e75f8dadds the production admission/refusal fuzz target. Corrected full fast gate passes every non-size row. Static x86 binary 19,652,384 bytes (+10,336 from24216c32, from typed server refusal handling; metadata expression and cfg(test)/fuzz additions add no production behavior/dependency). PT_INTERP absent. ASan+coverage, fuzz-only LTO disabled: 1,899,491 executions in46s, 6303 counters, cov1818/ft5722, no crashes. Browser refusal/desktop+phone action passes on this static binary; full browser run still has scroll-lock/switch failures and needs follow-up. Gate output verbatim:+---------------------------+--------------+
| Rust gate | Result |
+---------------------------+--------------+
| fmt | PASS |
| VT native fmt | PASS |
| clippy | PASS |
| test | PASS |
| cargo-deny | PASS |
| static builds | FAIL (1) |
+---------------------------+--------------+
Reviewer finding: lifecycle.rs used a proc directory inode as process birth identity. Linux proc_pid_make_inode allocates get_next_ino() when the inode is recreated (https://raw.githubusercontent.com/torvalds/linux/master/fs/proc/base.c); an inode is therefore not a stable birth clock. Deterministic regression directory_inode_changes_do_not_retire_the_same_process preserves the real stat record and executable through a fresh process directory view and fails before repair: count 0, expected 1 (0.01s). I will use the kernel stat start_time field (https://docs.kernel.org/filesystems/proc.html), retaining stale PID/zombie rejection with no per-session idle descriptor or timer. The parser will be bounded and fuzzed, and facts latency measured at 200 real sessions. This finding is separate from the browser failures; no claim that it caused them.
Completed process-identity fix:
4540e157. The failing inode-recreation regression dropped count 1 -> 0 before the fix; all 3 lifecycle tests now pass. Kernel stat field 22 birth ticks survive inode recreation and reject PID reuse/dead states; reads are bounded at 4 KiB, no idle timer/FD per session.ASan production parser fuzz: 2,372,685 executions / 46 s, cov=2049 ft=6838, no crash. Paired weighted zero-RTT host-facts reads at 200 sessions (101 samples): median 2.521 -> 3.999 ms, maximum 8.613 -> 13.941 ms; load 14.76/13.04/15.77 -> 17.20/13.86/15.95. This measured control-path cost buys stable liveness; no typing hot-path change.
Weighted scripts/verify fast: 263 server tests and 9 real shim tests passed. x86 static stripped binary 19,656,320 bytes (+3,936); ARM 17,533,960 bytes, static stripped, neither has PT_INTERP. Legacy size row is the D205 exception. Verbatim summary:
Verbatim scripts/verify fast summary for
4540e157(D205 legacy size exception); TypeScript compiler, bundles and all 36 protocol tests / 34,462 assertions also passed separately because the Rust size row stops the dispatcher.+---------------------------+--------------+
| Rust gate | Result |
+---------------------------+--------------+
| fmt | PASS |
| VT native fmt | PASS |
| clippy | PASS |
| test | PASS |
| cargo-deny | PASS |
| static builds | FAIL (1) |
+---------------------------+--------------+
Completed shared toast activation event extension
5657749aand tracer refusal flowb6837c3b(both pushed). Validated public reason/counters become plain host guidance; legacy refusals remain compatible, unknown/internal text remains generic. Sessions invokes the existing window-header picker. Background-session UI remains the orchestrator lane.TypeScript/compiler/production transfer gates PASS: critical JS gzip 288,093 / 307,200 bytes, brotli 239,205 / 256,000 bytes; protocol 36 tests / 34,462 assertions PASS. Real static-binary host-facts/refusal specs 2/2 PASS (3.7 s / 5.3 s): desktop and phone guidance, Sessions action, picker viewport assertions. Captures: apps/tracer/captures/session-bounds/{refusal-desktop,refusal-phone,sessions-phone}.png; phone 393x852 at DPR3, Chromium emulation. Attached for independent visual review, no visual-quality claim.
Full real-server suite still running. A paginated Mesh spec has failed; this is recorded and being checked before final gate reporting. Rust binary size is unchanged by these UI commits.
Completed real-browser readiness correction
1e47d0c6: fixed-delay setup allowed a late terminal attachment to take focus after the middle window was locked. The scrollback check repeatedly failed before this change (expected data-scrolled=true, got false). Setup now waits for real output from all three attached streams before selecting focus; scroll/no-chaining and cost budgets unchanged.Final static-binary run: all five scroll-lock specs PASS (2.8 / 2.6 / 18.3 / 1.3 / 0.465 s); wheel handler median 0 ms, p95 0.1 ms, mean 0.122 ms. New desktop/phone refusal and picker viewport assertions also PASS. The full suite is still checking the remaining specs; a paginated Mesh failure remains to inspect.
Completed reproducible real-session measurement harness
939402a2(pushed). Final static binary SHA256 4939fc4d3a09c62a3b80febbb7a7fdfa1cef846189cbdb6618899ddcf271f32b, 19,656,320 bytes. Weighted local run: 200 real shims recovered, session 201 admitted, shell killed and socket retired within one second, count back to 200. Full raw PSS/private dirty/clean and load rows are in docs/perf/session-bounds/measurement-final-200.json.Empty 200: shim/shell PSS 217,152 / 122,187 KiB, private dirty 212,952 / 118,868 KiB. Filled 12,000 rows each: shim/shell PSS 3,576,532 / 134,202 KiB, private dirty 3,572,332 / 130,868 KiB. infraternal-dev, 8 cores, 80x24; load 12.31/11.42/16.24 -> 22.11/13.50/16.81. No artificial CPU load. Cleanup guards recorded process birth; the two-session real cleanup smoke also passes.
Rebuilt the exact production base
0d93a502using identical release/musl settings: 19,613,216 bytes. This branch adds 43,104 bytes total; the first reaping commit adds 3,136 bytes. No production dependency added. Both base and branch already exceed the historical size maximum, reported under D205 rather than worked around. Baseline browser comparison is running for the three remaining full-suite failures.Completed browser fixture corrections
d2193c32andf353a830. Bootstrap diagnostics compared count 0 before the initial console protocol socket opened, then saw 1 from that unrelated connection; wait for the real initial attachment. All nine canvas specs pass. The switch fixture assumed attach insertion order was window order; that could invert first/second identities and wait 20 s for input Ack on the wrong session. Resolve fixture identities by actual shell output markers and focus the second window before preparing it. All seven switch specs pass, input Ack 193 ms, cold attach 26.4 ms / live paint 57.2 ms; original budgets unchanged.Unchanged production binary/UI passed all 20 selected canvas/Mesh/switch specs. Branch isolated rerun passed all Mesh specs (the earlier paginated run had 2/450 refusals), and the marker correction resolves the repeated branch switch failure. Final complete 44-spec run is in progress against static artifact SHA256 4939fc4d3a09c62a3b80febbb7a7fdfa1cef846189cbdb6618899ddcf271f32b, TRACER_TEST_PORT=4351. No production Mesh, bootstrap routing or switch code changed.
Finished at
7ef4a88e3a, branch session-bounds; all 17 atomic commits pushed. No deploy. Reaping, resource-based session admission (default max of 256 MiB / 5% RAM), typed refusal guidance with existing Sessions action, and trusted live/background session count wire are implemented. The existing picker remains browser-known inventory; the orchestrator owns background-session UI.Final scripts/verify fast summary, verbatim (D205 historical size exception):
+---------------------------+--------------+
| Rust gate | Result |
+---------------------------+--------------+
| fmt | PASS |
| VT native fmt | PASS |
| clippy | PASS |
| test | PASS |
| cargo-deny | PASS |
| static builds | FAIL (1) |
+---------------------------+--------------+
Static x86: 19,656,320 bytes, static PIE/stripped, no PT_INTERP; exact production base
0d93a50219,613,216 bytes, delta +43,104 (0.22%). ARM: 17,533,960 bytes, static/stripped, no PT_INTERP. No production Cargo manifest/lock dependency change; cargo tree -d checked. ARM built separately because the x86 historical size row stops the dispatcher.TypeScript compiler/unit/bundle/precompression/transfer gates PASS (run separately after the Rust size stop). Critical JS gzip 288,093 / 307,200, brotli 239,205 / 256,000 bytes. Protocol output, verbatim:
36 pass
0 fail
34462 expect() calls
Ran 36 tests across 10 files. [4.80s]
Agent lifecycle/admission/delayed-credit tests PASS; real shim tests 9/9 PASS (4.11 s); server tests 263 PASS, 30 ignored. Final real-server suite against this branch static binary SHA256 4939fc4d3a09c62a3b80febbb7a7fdfa1cef846189cbdb6618899ddcf271f32b, TRACER_TEST_PORT=4351, verbatim:
3 skipped
41 passed (7.4m)
Existing skips: disabled-Mesh profile x2, opt-in scale x1. Earlier gate failures, baseline comparisons and failing-before-fix fixture regressions are recorded above; no timing budget was relaxed.
200 real sessions: recovered 200 background shims, admitted 201st, killed its shell, socket retired within 1 s and count back to 200. Empty shim/shell PSS 217,152 / 122,187 KiB; private dirty 212,952 / 118,868 KiB. At 12,000 output rows each: PSS 3,576,532 / 134,202 KiB, private dirty 3,572,332 / 130,868 KiB. infraternal-dev, 8 cores, RAM 32,803,748 KiB, 80x24, CPUWeight10000; load 12.31/11.42/16.24 -> 22.11/13.50/16.81, no artificial CPU load. Paired zero-RTT host-facts latency at 200: median 2.521 -> 3.999 ms (101 samples); load 14.76/13.04/15.77 -> 17.20/13.86/15.95. On-request process-birth identity costs 1.478 ms observed median, no typing/idle path change. ASan parsers: 2,372,685 executions / 46 s, cov2049 ft6838, no crash.
Reviewer checklist complete: PID reuse/zombies/stale sockets, exit ordering/credit, trusted counts, policy arithmetic/bounds, public refusal sanitization, existing host/UID/freshness authorization, frozen frame layouts, feature-off work, dependency and UI reuse. Production desktop/phone captures are attached for independent visual review (Chromium phone emulation, not physical Safari).
Durable evidence: docs/perf/session-bounds/{README.md,gates.md,measurement-final-200.json,facts-latency-200.json}; scripts/measure-session-memory.py; apps/tracer/captures/session-bounds/{refusal-desktop,refusal-phone,sessions-phone}.png. Scratch build targets and own baseline checkouts removed; final static artifacts/logs retained under /home/kayg/.cache/codex-scratch/session-bounds/artifacts and the job scratch root. Issue left open.
Independent review started on review-session-bounds, detached target
7ef4a88e; merge base with dev2eaaaa36a2. Read #151 and all 32 comments; no parent linked. Review includes the merge-base diff, concentrating behavioral probes on #151 changes since production0d93a502. No pushes or implementation fixes per reviewer brief.P1 SB-01: final output and exit are lost when a shell exits after the 250 ms credit-starvation detach. Location crates/infraternal-agent/src/daemon.rs:750-758 and crates/infraternal-shim/src/session.rs:332-339. A window remains attached; the relay drops its local shim link, a control-only probe writes FINAL_OUTPUT and exits 7, the shim retires, then credit returns. Result: Close(1,"terminal shim disconnected"), no final output/terminal.exited. Rust test attached_window_recovers_final_output_and_exit_after_shim_link_detaches fails on exact static artifact 4939fc4d3a09c62a3b80febbb7a7fdfa1cef846189cbdb6618899ddcf271f32b (19.33s). Detachment is observed from shim socket descriptors, not assumed from a sleep. This regresses no-lost-output/resume semantics D13/D41; preserving only peers already read-closed at the deadline misses shells exiting later. Evidence test: crates/infraternal/tests/session_bounds_review.rs and scripts/verify-session-exit-credit.py --exit-after-detach. Implementation not changed.
SB-01 failing-test commit is now
06d27c70(the fixture accepts both raw output and snapshot repaint). Exact-head reproduction fails with terminal shim disconnected in 5.36 s. Original exit-before-detach test PASS; production0d93a502also recovers final output and exit after detach when the probe accommodates its old retained-exit lifetime. No implementation fix/push.Independent CPUWeight=10000 200-session run: 200 recovered, 201 admitted, extra retired within 1 s. Empty shim/shell PSS 216328/122193 KiB, filled 12000 rows each 3575164/134219 KiB; load 10.34/8.77/8.50 -> 21.79/11.46/9.40. Zero-RTT 200-session facts median 8.799 ms / max31.933 ms under load59.30/40.88/25.64. 5 TS tests/25 assertions PASS. Latency diagnostics fail on both head and production base under host load; no causal regression claimed. Exact-head fast gate and bounded ASan fuzz still compiling; durable report docs/reviews/session-bounds-151.md in progress.
Completed independent evidence step
eb2764f3on review-session-bounds: docs/reviews/session-bounds-151.md records SB-01, the passing production-base comparison, 200 real sessions (filled combined PSS 3709383 KiB), zero-RTT facts median8.799ms/max31.933ms and all raw role totals/load. Five TS tests/25 assertions and original credit test PASS. Exact-head fast/fuzz completion remains a separate step; no claim that those gates passed. Verdict remains HOLD: P0=0/P1=1/P2=0/P3=0.Independent review finished: review-session-bounds HEAD
98f7a3b735; target7ef4a88e, merge base2eaaaa36a2.Verdict: merge after fixes. HOLD (P0=0, P1=1, P2=0, P3=0).
SB-01: an attached window loses final output/terminal.exited when credit starvation detaches its shim link before the shell exits. Failing Rust test commit
06d27c70, independent measurementseb2764f3, final gates98f7a3b7. Test fails against the exact target artifact, independently rebuilt GNU debug (2.57s) and static musl (1.40s); production-base comparison passes with its retained-exit semantics. Details: docs/reviews/session-bounds-151.md.Exact-head scripts/verify fast output, verbatim:
+---------------------------+--------------+
| Rust gate | Result |
+---------------------------+--------------+
| fmt | PASS |
| VT native fmt | PASS |
| clippy | PASS |
| test | PASS |
| cargo-deny | PASS |
| static builds | FAIL (1) |
+---------------------------+--------------+
571 workspace tests PASS, 62 ignored; 263 server unit tests PASS, 30 ignored. No timeout failure waived. Earlier relative scratch-root failure was a fixture setup error; short absolute 99-byte socket paths make the full rerun pass. Static x86 19,656,320 bytes, +43,104 bytes (0.22%) vs production base; historical size-only exception D205. Independent SHA256 9a254fa962006021459d86089c857ac998b9a32247b68b8fdaa7865d0774770a.
TS compiler/unit/build/transfer gates PASS; protocol 36 PASS / 0 FAIL / 34,462 assertions. ASan fuzz 740,611 executions / 46 s, cov 1858 / ft 5140, no crash. Real 200-session PSS/private/recovery/admission evidence and load committed; latency diagnostics failed on both target and production base under host load, no causal regression claimed. Supplied desktop/phone production captures reviewed; no physical Safari run.
Own build targets, temporary head checkout and short scratch alias removed. Raw logs and rebuilt static artifact retained under ~/.cache/codex-scratch/session-bounds-review/. No implementation fix, push or deploy. Issue left open.
Round 2 started on session-bounds at base
7ef4a88e3a. Read contracts, all 37 issue comments and review98f7a3b7; no parent linked. Review branch was not pushed, but its commit objects exist locally. Will cherry-pick unchanged failing-test06d27c70first, reproduce SB-01, and reuse the concurrent fix-dead-session typed ended answer where available. No deploy.SB-01 reproduced unchanged on pushed test commit
14c13138using round-1 static artifact: AssertionError (15, Close 1 terminal shim disconnected), 1.63 s. Proposed additive shim cap bit 3: a separate authenticated ownership-only connection keeps a window owning its session across output-link detach, never backpressures PTY, and drops on release or ordered exit delivery. Retain exited owned shims at most 600 seconds from child exit (one-shot deadline, no live-session timer); on expiry save a fixed-size Exited record in the private runtime session directory before removing the socket. Reattach sends ordered terminal.exited status and existing fix-dead-session Close 4404/session ended. Reuse protocol commit0cd816bdfrom #158, no second ended type. The unchanged Rust review test calls a fixture whose old assumptions (one socket at detach, retirement before credit) must be capability-aware for the newly approved retained-owner lifetime; retain its final-output/status assertions and observed data-link barrier. Ten minutes covers long network/credit pauses while capping each exited owner at the existing ~25 MiB history/ring bound; explicit window close retires immediately. No owner still retires promptly.Completed/pushed unchanged failing-test
14c13138, reused #158 protocol constantsa93942d6(source0cd816bd), ownership contract8646ba9c, exit-record module46512db0. File-security/codec regression PASS 1/1, 0.27 s. Record is atomic fixed-size 17 bytes, same UID/0600/regular only, O_NOFOLLOW; reuses frozen fuzzed Exited decoder. Full fast gate remains pending dependent ownership/relay modules; deliberately failing SB-01 is retained. Environment: first native build completed C dependencies, later build hit ENOSPC; disk recovered from <1 GiB to 12 GiB, rerun started. No other job files changed.Completed/pushed ownership shim
90f5faca, bounded hidden startup overridec6a149ff, negotiated sessions API0e6f8d32, relay fix84f6a3ffand real-engine testse7a2ac92. Unchanged review Rust test PASS 1/1 in 0.94 s; real bound/unfunded expiry/restarted daemon reconnect PASS 1/1 in 1.51 s; real shim suite PASS 11/11 in 5.14 s (including no-owner retirement within one second, owner release and unread data at maximum). Shared Close 4404 notified on #158. Full fast gate in progress: clippy caught request handler exceeding 100 lines; extracted capability attachment validation into Peer::attach, no behavior change. Full gate rerun required; no green claim yet.Full fast gate found a dependent fixture limitation, not waived: agent_daemon real 24-restart oracle fails at its second attach with Close 1 (11.71 s), after initial real exit/idle checks pass. Evidence: scripts/agent_fixture.py AckBarrier.run accepts one shim connection then drains it synchronously; the independent ownership connection waits behind the data connection and times out. The real direct-shim review/bound tests pass. Fix the local test proxy to accept both connections concurrently, keeping PTY Ack/State barriers and disconnect callbacks restricted to data links. Preserve existing deadlines/bytes/restart assertions. TS differential failure also recorded: stream.test.ts cargo run waited on the parallel full gate Cargo lock and timed out at 30 s; rerun serially after native/static builds.
Completed/pushed fixture concurrency fix
5151ef6b(24 restarts / 4,710,396 exact bytes; State/Ack oracle 524,288 exact replay bytes; queue 2,640,000 exact bytes; isolation control/sibling progress 303.790 ms at 300 ms RTT), Peer attachment extraction81997f42, two-owner test4e6b9a1fand owner-scale harness74feac60. Correction: commit bodies said 12/12 before the new test had been rebuilt; the first direct rerun actually used cached 11-test binary (11/11, 6.27 s). Recompiled updated shim.rs against current built libraries/binary with rustc --test: all 12 real tests now PASS in 6.75 s, including delivered_exit_cannot_release_another_owning_window. Cargo/full fast will rerun on this head after the initial static build finishes. Owner harness two-session weighted cleanup smoke PASS. No full gate or 200-session completion claimed yet.Round-2 verification: the final full Rust gate has passed fmt, VT fmt, clippy, workspace tests and dependency checks; static build is still running. Extracted the shared ordered Event send path to satisfy the writer length gate without suppressing clippy. Earlier unweighted production browser run failed enrol/setup timeouts (9 failed, 27 did not run, 7 passed); the round-one binary also needed 1.7m for the isolated bootstrap. A weighted isolated branch run passed in 15.5s with no browser errors in a separate public-metadata diagnostic. Weighted full-suite rerun is underway with test runtime/data inside this job scratch tree and unique port 4357. No test budgets changed. First round-2 200-session measurement: empty combined PSS 340164 KiB (+825 KiB, 0.243% vs round 1), filled combined PSS 3710186 KiB (-548 KiB). Owner connections added no measurable resident pages at page granularity. Final artifact repeat will follow the writer refactor. No synthetic CPU load.
Completed:
e665af15extracts the shared ordered Event writer;bdb7abb0adds the real attach benchmark. Both pushed. Final fast: fmt/VT fmt/clippy/test/cargo-deny PASS; only known static size row FAIL, x86 19692992 bytes (+36672, 0.187% vs round one). Workspace 577 passed, 62 ignored, including unchanged review test and 12 real-shim tests. Separate serial TypeScript gate: 36 pass, 0 fail, 34462 assertions; build/compiler/UI/transfer checks pass. Final 200-session artifact SHA256 b389237f901517dc0a7cdb536b0e127002ba74398b95f522a8c9f911e2fab2c1: empty combined PSS 339540 KiB (+201), filled 3709530 KiB (-1204), 200 ownership connections add no measurable resident pages. Local weighted scopes, initial load 14.67/25.43/31.83, no own build/browser or synthetic CPU load during measurement. 51 quiet zero-network attach samples: median 0.341525 ms before / 0.470702 after, observed +0.129177 ms; host variance limits causality. Weighted production suite: 38 pass, 3 skip, 3 failures (freeze scale .697676 vs <.58, low-memory test timeout, 2 Mesh enrol refusals). The exact three specs all pass against round-one artifact (6 pass, 2 skip, 48.3s); final branch isolated rerun underway, unchanged budgets.Production browser follow-up: the three failed files from the first weighted full run all pass with unchanged budgets against both round-one binary (6 pass, 2 skip, 48.3s) and final round-two binary (6 pass, 2 skip, 43.7s). Thus all 41 enabled specs have passing evidence. An additional full repeat overlapped ARM compilation and finished 33 pass, 3 skip, 2 fail, 6 not run: freeze pixel fingerprint changed during camera motion, and switch setup missed FIRST-MARK within 5000 ms. Log: round2-server-specs-final.log under the job scratch root. The latter passed in the first weighted full run. No fully green full invocation is claimed; next repeat will avoid own compilation. ARM static build is progressing; x86 final source and all Rust/TS gates except the known size row are already verified.
Author review found an additional maximum-retirement overlap: the 17-byte exit record is published before peer/listener teardown. Expanded real-retention regression retains that real record and installs a private same-UID socket closing handshakes. Previous final static SHA256 b389237f901517dc0a7cdb536b0e127002ba74398b95f522a8c9f911e2fab2c1 fails before Welcome: infraternal agent failed: unexpected end of file (round2-retirement-race-before.log). A restarting daemon must ignore a handshake failure only when a secure verified record proves the UUID ended; reattach must likewise deliver that recorded status, not generic disconnect. Fixing recovery and stream classification as separate module changes; no additional filesystem read on successful connections.
5a9ea37eadds the explicitly requested normal unowned exit/status-7 regression, pushed; final pre-race gate had 578 pass, 62 ignored, all 13 real-shim tests passing, size-only failure. The prefix baseline browser run also fails the existing 4x-CPU frame count (16 vs >20), establishing shared-load interference with the round-one artifact; all 41 enabled specs already have passing evidence across full and isolated branch runs.Completed and pushed:
58afade0recovery tolerates a retiring handshake only with a verified exit record;b3ddf6fcrelay errors preserve recorded status during any initialization/read phase;f8a58e2cadds the publication/teardown race regression. Final fast: 578 passed, 62 ignored, 13 real-shim tests; fmt/VT fmt/clippy/test/cargo-deny PASS, known static-size row FAIL. X86 19699392 bytes (+43072, 0.219% versus round one), SHA256 b1c8fcface143e0d2e0dae4fde67c2076106fedfdcadc52e671a8364e03833f4. Final owned 200-session repeat: empty combined PSS 339925 KiB (+586, 0.173%); filled 3712847 KiB (+2113, 0.057%). No measurable owner-link resident-page increment; one shim thread. Local weighted scopes, no own build/browser during sampling; initial load 23.58/26.49/27.21, filled load 44.38/31.13/28.72. Quiet attach 51 samples each at load 44.38/31.13/28.72: median 0.247676 ms before / 0.468064 after, +0.220388 ms; maxima 3.341133 / 4.656156 ms. No extra record read on healthy connections. Latest binary production functional flows: 5 passed in 18.1s (port 4367). Relay metadata measurement and refreshed ARM build remain before final evidence commit.Finished round 2 on session-bounds at
8b0f74f4c4; every atomic commit is pushed. No deployment; issue remains open for independent review.SB-01: unchanged review test
14c13138now passes, delivering FINAL_OUTPUT and exit 7 after the 250 ms credit detach. Separate authenticated ownership survives data detachment; exited retention is one-shot 600 seconds, then a private frozen Exited record returns terminal.exited followed by shared Close(4404, "session ended"). No-owner exit retires promptly. Tests also cover owner release, multiple owners, forced bound, daemon restart, and publication before socket teardown. Review test blob remainsa9f392314c.Final scripts/verify fast output, verbatim:
+---------------------------+--------------+
| Rust gate | Result |
+---------------------------+--------------+
| fmt | PASS |
| VT native fmt | PASS |
| clippy | PASS |
| test | PASS |
| cargo-deny | PASS |
| static builds | FAIL (1) |
+---------------------------+--------------+
578 passed, 62 ignored; all 13 real-shim tests, unchanged review regression and bounded-retention/restart regression pass. The only failure is the known historical static-size row: x86 19,699,392 (+43,072 / 0.219% versus round 1); ARM 17,570,744 (+36,784 / 0.210%). Both stripped static without PT_INTERP. Separate TypeScript half passes compiler/UI/build/transfer and 36 protocol tests, 34,462 assertions. Gzip/Brotli remain 288,093/239,205 bytes.
Local CPUWeight=10000 measurements at 200 sessions: combined empty PSS 339,925 KiB (+586 / 0.173%), filled 3,712,847 KiB (+2,113 / 0.057%). Initial load 23.58/26.49/27.21, filled 44.38/31.13/28.72; no own build/browser or generated CPU load during sampling. 200 relay futures + paired fixtures use 1,448 KiB (7,413 bytes/stream), below 32 KiB allowance; legacy capability fixtures exclude active owner links/PTYs, which are measured separately. Quiet attach 51 samples each: median 0.247676 to 0.468064 ms (+0.220388); host variation limits attribution.
Production real-server specs rerun with unique ports. All 41 enabled specs have passing evidence across full runs and isolated rechecks (6 pass/2 skip on round-one and round-two comparison files). Full invocations still have host-load timing failures; latest final binary passes five bootstrap/sign-in/window-routing/close/reload flows in 18.1 seconds. No assertions or budgets weakened. Detailed full-run failures and baseline frame-count failure are retained; a single fully green browser invocation is not claimed.
Evidence and author checklist: docs/perf/session-bounds/round2.md; measurement-round2-200.json and relay-memory-round2-200.json. Safe raw logs, final static artifacts and production screenshots retained under /home/kayg/.cache/codex-scratch/session-bounds/. Own build target and test runtime scratch removed. See round2-fast-race-final.log, round2-ts-complete.log, round2-arm-race-static.log, round2-memory-race-200.log, round2-relay-memory-200.log, round2-browser-final-functional.log and round2-browser-captures/window-sizes/phone-393x852-keyboard-up.png.
Delta independent review started on review-session-bounds at target
8b0f74f4c4; merge base with dev2eaaaa36a2. Read all 49 comments, no parent linked. Scope only 7ef4a88e..8b0f74f4 and SB-01. Earlier review preserved as review-session-bounds-round1; failing test already cherry-picked by target as14c13138, no duplicate cherry-pick. No implementation fixes, push or deploy.Independent delta evidence committed on review-session-bounds (SHA below): SB-01 now passes against hash-verified final artifact; real bounded-retention/restart/retiring-handshake fixture passes. 200 sessions recovered/201 admitted; combined PSS339974KiB empty/3710577KiB filled, load23.18/25.19/25.40 ->36.61/27.98/26.30. Ownership reconnects do not renew the bound (7 reconnects,1452.568ms for1200ms shortened bound). Paired attach median0.339466 ->0.555918ms. Same-session flood latency fails on both earlier/final artifacts (450.17/449.17ms p99), no causal delta finding. Fresh weighted fast gate in progress; no new P0/P1. Evidence docs/reviews/session-bounds-151-delta.md.
4743810054Independent fresh target-code Rust checks completed:578 passed,0 failed,62 ignored; SB-01, retention/restart and13 real-shim tests pass. Fmt/VT fmt/clippy/dependency checks pass. TypeScript compiler/UI121 tests/production/transfer pass; weighted unchanged-budget protocol retry36 pass,0 fail,34462 assertions in6.17s after two unweighted differential timeouts. Static release rebuild is still running; final verdict/gate output will follow. Evidence branch HEAD47438100. No new confirmed findings.
Independent delta review finished: target
8b0f74f4, evidence branch review-session-bounds HEADfa9364fbb5. Scope 7ef4a88e..8b0f74f4 only; prior review preserved locally.Verdict: merge. MERGE (no P0/P1). New findings P0=0/P1=0/P2=0/P3=0. Earlier P1 SB-01 RESOLVED: unchanged Rust regression passes; real exit-credit and retention/restart/publication-race probes also pass on the independently rebuilt static binary. No implementation fixes or new failing tests warranted.
Fresh target-code scripts/verify fast output, verbatim:
+---------------------------+--------------+
| Rust gate | Result |
+---------------------------+--------------+
| fmt | PASS |
| VT native fmt | PASS |
| clippy | PASS |
| test | PASS |
| cargo-deny | PASS |
| static builds | FAIL (1) |
+---------------------------+--------------+
578 Rust tests passed, 62 ignored; all 13 real-shim tests pass. Static x86 rebuild 19699392 bytes, no PT_INTERP, SHA256 6b20ba697b31bca039fd3df8043b0fb9d61db3b99e5e93727f047a46dd199b0f; only the historical size limit fails (D205). Fresh release compile took 23m10s under shared load. No Rust failure waived. Separate TS compiler/UI 121 tests/production/transfer pass; weighted protocol retry 36 pass/0 fail/34462 assertions in 6.17s after two unweighted 30s differential timeouts.
Independent local CPUWeight=10000 measurements: 200 recovered/201 admitted, PSS 339974 KiB empty/3710577 KiB filled, load 23.18/25.19/25.40 ->36.61/27.98/26.30; no measurable owner-link resident-page increase. Attach median 0.339466 ->0.555918 ms. Native same-session flood fails on both earlier/final artifacts (450.17/449.17 ms p99); baseline and sibling-flood phases pass. No confirmed delta latency regression. Full browser suite not repeated for this backend delta.
Evidence commits
47438100andfa9364fb; docs/reviews/session-bounds-151-delta.md and session-bounds-151-delta-memory.json. Own build target/empty fixture scratch removed. Raw logs, ownership probe and independent static artifact retained in ~/.cache/codex-scratch/session-bounds-review/. No push/deploy/issue close.Started production integration on session-bounds-prod, base
b373cc4c66(release-prod-2 plus #158 head80d6da0a). Read all #151/#158 comments; no parent linked. Merge origin/session-bounds8b0f74f4, preserve SB-01/DS-01..04 tests and use ordered terminal.exited status followed by the existing final Close 4404. Gates use local CPUWeight10000 scopes and browser ports5795/5796. No deployment.Merge finding: daemon::recorded_end forwards saved final_seq with terminal.exited then Close4404, but production websocket terminal_exit::record (terminal_exit.rs:36) and browser terminal.ts reject final_seq != delivered cursor. A retired session with unread final output therefore loses the final answer/status. Additive reconciliation proposed under approved D206 merge brief: optional retired:true on the SAME terminal.exited notice only for verified saved records; strict cursor equality remains for live drained exits, retired notices permit final_seq>=viewer cursor without advancing/repainting it. Close4404 stays the only final ended path. The existing ended pill gains the known status; all original exit/DS/SB assertions remain.
Conflicts: combine exited/showSessions hooks; retain production Control+Shift+K and marker-based switch identities; combine deferred replies with resource context; preserve both plugin hooks/auth modules/fuzz targets and sessions rendezvous helpers; use bounded ownership contract plus signal-after-exit no-op; retain native1s FIFO drain and one Ended writer arm.
Production browser merge run: original dead-session + saved exits0/7 + DS-04 transient/retry/input PASS5; detached-output FAIL409 at unicode-case. Evidence test/detached-output.spec.ts:10 only waits isConnected (Welcome), mock-server.ts unicode-case requires an attached reader; Attach is still in flight at300ms RTT. Follow-up will wait for actual host attachment before holding renderer callbacks, preserving every byte/cursor/reconnect assertion and deadline. Logs browser.log; screenshots captures/dead-session/{ended,retired-exit-0,retired-exit-7}-1440x900-ink.png. Default production transfer3/3 PASS: deferred Brotli44780/44671/44727 B (limit45056); DS-02 review gate PASS each run. No budget change.
Fast gate found combined CLI main at102/100 lines (main.rs:188): approved session-bounds retention option plus production command arms crossed clippy's existing limit. Extracted parsed-command dispatch after identity/internal-mode setup; same commands/results/defaults, no lint suppression. Full corrected gate replay required. Existing standalone terminal-exit fixture also fails unchanged
b373cc4c(1PASS/3FAIL, window undefined from #158 retry cancellation); timer-method stub restores original assertions, added retired parser tests6/6PASS. Evidence fast-merge.log, exit-fixture-baseline.log, retired-before/after.log.Contract reconciliation preserves D55 live-exit paint semantics: ordinary Shim::Exited remains an ordered exact-cursor terminal.exited event, reported only after final paint (clean0 may close its window). A verified retired record sends the same terminal.exited with additive retired:true, then the sole final ended Close4404; it carries status without advancing a cursor or claiming repaint. Immediate live4404 was rejected because it would hide queued final output/nonzero scrollback before paint. Missing/unknown sessions use the same4404 without status. No parallel final ended opcode or retry path.
Read-only integration review found two P1 races; failing-first proof now recorded. Native retiring-handshake plus16 in-flight Credit: command receiver closure cancels saved answer (InvalidData/native terminal command queue unavailable). Saved-status native stuck peer also exceeds3s instead of reaching#158's1s drain; focused native run3PASS/2FAIL in3.00s. Candidate: closed command sink yields to terminal completion; retired events use ordered FIFO without live ownership-delivery ack, so existing whole-native drain covers BOTH saved event and4404. Live exits retain ack-before-owner-release.
Client drop between retired Event and4404: production spec FAIL20s, no ended strip; retired pendingExit incorrectly blocks reattach although it never completes through paint. Candidate: preserve saved status but allow socket/shared retries until4404; live pending exits still block input/retry until paint. Existing final4404 remains sole final transition. Logs native-races-before.log, retired-disconnect-before.log; unchanged-after tests in progress.
Initial full test gate also found fixture setup FileNotFoundError target/ac, not behavioral failure. Linked ignored target to this job scratch build directory (as prior#151 run); corrected full replay required, no failure waived.
Integration regressions: real native gone_review 5 passed in 1.05 s (saved status before 4404, closed-command race, blocked-peer 1 s drain); production browser 7 passed in 1.8 min, including status 0/7 and retry after status-before-Close disconnect. Read-only re-review found no remaining concrete issue. Final three default builds: deferred Brotli 44,773 / 44,705 / 44,734 B, unchanged D188 limit 45,056 B. Full gate rerunning: first run failed daemon_gone_tests.rs:98 before protocol exercise because my TMPDIR exceeded SUN_LEN; removed that environment override, keeping build targets in owned scratch. No assertions changed or failures waived. Logs: $HOME/.cache/codex-scratch/session-bounds-prod/.
Full gate: imported memory_refusal_preserves_reason_and_counters_to_browser failed at terminal_refusal_tests.rs:79 (unexpected binary frame), and existing remote HTTP enrollment failed remote_http_tests.rs:181 (Denied). Both pass alone. Refusal fixture resumed timers before reading Result; keep its existing frozen clock until the observed response. Enrollment captured admission time before HTTP issuance, but remote_authority.rs:34 requires certificate.not_before <= admission time; use current admission time after issuance. All assertions retained; fixture fixes tracked separately. Real production switch rerun without own gate overlap: 7 passed in 1.0 min, unseen-session attach 22.6 ms / paint 68.3 ms, unchanged targets. First overlapping run missed attach 60 ms target at111.5 ms, 5 passed/1 failed; not waived. Full corrected gate in progress. Static x86_64 19,992,512 B vs exact
b373cc4c19,904,832 B (+87,680 B); known limit16,404,816 B unchanged.Detached dev baseline
f9151701: unchanged mesh headroom test PASSED (10,000 nodes/30,000 grants,88 pages,max frame64,612 B,pong intact,76.63 s; load33.08/27.25/25.02). Therefore no baseline waiver used. Bootstrap confirmation test is absent on dev; remains required to pass here. New production scale run under CPUWeight10000 on infraternal-dev/8 CPUs, real80x24 PTYs:200 recovered,201 admitted,200 after reap. Empty combined PSS341,851 KiB (1,709.26 KiB/session); filled combined PSS3,710,906 KiB (18,554.53 KiB/session), including200 simultaneous independent owners. Owner install/release adds no measured PSS. Facts101 samples at200: p50 4.589 ms/max44.399 ms. Load25.68/27.04/25.28 ->33.93/28.81/25.88. Binary f445bb107e6efc017ff862acbefabda83e55eb99ded9e51ebdfcbcd36deaa488,19,992,512 B. Fixture retired all own shims/shells (PTY count restored15). Raw memory-200.log in job scratch. Full gate retry follows the isolated diagnostic; no assertions/budgets changed.Post-baseline artifact invalidation rebuilt current local crates without source-content edits. Real-channel DS03 diagnostic passed:200 sequential vanished-session replies, p50 232us/p99 700us/max1912us,0.88s, late Input/Close/Ping fences intact. CPUWeight10000 on infraternal-dev/8CPUs, initial/final load46.25/36.84/29.80. This diagnostic measures sequential refusals; the separate memory fixture held200 simultaneous real PTYs. Raw gone-200.log. Final full gate retry running serially with no own browser or scale workload overlap.
Merge committed and pushed:
026e471c82; parentsb373cc4c+8b0f74f4. Conflicts preserve both test suites, admission/context hooks, bounded ownership, final FIFO drain and single typed-status -> Close4404 path. Integration fixture clocks corrected with assertions unchanged. Full Rust601 passed/0 failed/63 ignored; SB01/DS01..04 pass; source142/protocol36, production mock7 and real-switch7 pass. No baseline waiver. Deferred Brotli44773/44705/44734 B <=45056 unchanged. Fresh final static19992480 B vs exact b373cc4c19904832 B (+87648 B); initial production scale artifact19992512 B, fresh link32 B smaller. All recorded gate runs used owned targets andCPUWeight10000.Separate detached-output attachment-barrier fixture correction and short result.md follow. No deployment.
Follow-up committed and pushed:
f2d842358a. detached-output.spec.ts waits for the host attachment before holding renderer callbacks; original byte/cursor/Unicode/reconnect assertions and deadlines unchanged. Before:409 because Welcome preceded Attach at300ms RTT. After:production browser suite7 passed, detached case17s. This exact fixture and code tree were present during the passing fast-last.log gate (fmt/VTfmt/clippy/test/cargo-deny PASS; known static-size FAIL only). No production source changes after that gate. Short evidence report and cleanup follow.Finished and pushed session-bounds-prod HEAD
04cdc52a01. Commits:026e471c(merge/conflict resolutions and single authenticated saved status -> final Close 4404 path),f2d84235(detached-output fixture attachment barrier),04cdc52a(short result.md). Both test suites retained; contract choice and every reproduced integration finding recorded above. No deployment; issues remain open.Final scripts/verify fast output (fast-last.log), verbatim:
Rust 601 passed/0 failed/63 ignored, including SB-01 and DS-01..DS-04. No load failure waived; dev mesh-headroom baseline passed, final full target retry also passed that test and bootstrap confirmation. Tracer check/src 142 passed (10,901 assertions); protocol 36 passed (34,462 assertions), TS fast passed separately because static failure stops combined dispatcher. Production browser 7 passed in 1.8 min; real-PTY switch 7 passed in 1.0 min. Native gone_review 5 passed in 1.05 s. Three default builds deferred Brotli 44,773/44,705/44,734 B <= unchanged 45,056 B.
Known static exception only: final 19,992,480 B, exact
b373cc4c19,904,832 B, delta +87,648 B, no PT_INTERP; frozen limit 16,404,816 B. Real 200-session scale: 200 recovered/201 admitted/200 after reap; PSS 341,851 KiB empty (1,709.26/session), 3,710,906 KiB filled (18,554.53/session), 200 simultaneous owners add no measured PSS; facts 101 p50 4.589 ms/max 44.399 ms. infraternal-dev/8 CPUs/CPUWeight=10000, load 25.68/27.04/25.28 -> 33.93/28.81/25.88. Separate 200 sequential gone replies p50 232 µs/p99 700 µs/max 1,912 µs, load 46.25/36.84/29.80.Author checklist completed; read-only code re-review found no remaining concrete issue and checked production exit 0/7 captures (status/actions visible, no clipping/overlap). Captures: apps/tracer/captures/dead-session/retired-exit-0-1440x900-ink.png and retired-exit-7-1440x900-ink.png. Evidence report: result.md. Raw logs/binaries/captures retained under $HOME/.cache/codex-scratch/session-bounds-prod/; owned targets/baseline checkouts/runtime removed. Code and test content unchanged after final gates; final documentation quotes that evidence.
Independent delta review started on review-session-bounds-prod at
04cdc52a01; merge base with dev2eaaaa36a2. Read all 66 comments on #151; no parent linked. Scope b373cc4c..04cdc52a excluding dev imports, plus earlier SB-01/DS regressions. Earlier SB-01 test is already included by14c13138; no duplicate cherry-pick. No implementation fixes, push or deployment.Earlier DS-05 P2 still fails here: imported unchanged production regression from
9a2a789c. Isolated weighted browser run on ports5873/5874: logs chunk refused, visible w-logs window, retry button absent after5000ms (test/log-load-review.spec.ts:25); 1FAIL/2PASS, both original transient-session retry/input tests pass. First combined invocation failed at preview setup, so it is not used as finding evidence. No implementation repair; D206 allows P2 fixes forward. SB-01 artifact replay and real retention/restart probe PASS.Completed independent evidence step
b0a7d733; prior DS05 test commit72ddb2bd. Weighted tracer148PASS/0FAIL, compilerPASS; three deferred Brotli builds44751/44715/44756B <=45056. Seven relevant browser scenarios pass; DS05 isolated failure persists. Real200 recovered/201 admitted/200 afterreap, PSS341848KiB empty/3715363KiB filled, facts101 median7.077ms/max32.653ms; localCPUWeight10000/load37.85->58.19, own build concurrent. Paired same-session latency fails target/baseline423.90/435.26ms; no causal regression claimed. Fresh Rust gate remains compiling native dependencies; completion/verdict follows. Durable docs/reviews/session-bounds-prod-151.md.Fresh source checks on review-session-bounds-prod HEADb0a7d733 (production source04cdc52a unchanged): Rust601PASS/0FAIL/63ignored; fmt/VTfmt/clippyPASS. SB01 unchanged Rust regression and direct fresh-binary replayPASS; fresh retention/restart probePASS; five native gone_review testsPASS2.18s. Fresh200 sequential replies: p50 162us/p99 468us/max2206us, localCPUWeight10000/load14.39/24.05/25.82. StandardTSfastPASS including36 protocol tests/34462 assertions3.15s. Full Rust gate still running dependency/static stages; no failure waived and no final gate/verdict claimed yet.
Independent delta review finished: target
04cdc52a; review-session-bounds-prod HEAD8bbb4de392. Scope b373cc4c..04cdc52a excluding dev imports, plus earlier findings.Verdict: merge. MERGE (no P0/P1). P0=0, P1=0, P2=1, P3=0; no new confirmed delta findings. Earlier SB-01 and DS-01..DS-04 PASS. Earlier DS-05 still fails: refused production logs chunk leaves visible logs window with no retry after 5000 ms, test/log-load-review.spec.ts:25; unchanged failing test committed as
72ddb2bd. Fix forward under D206.Fresh target-code scripts/verify fast output, verbatim:
+---------------------------+--------------+
| Rust gate | Result |
+---------------------------+--------------+
| fmt | PASS |
| VT native fmt | PASS |
| clippy | PASS |
| test | PASS |
| cargo-deny | PASS |
| static builds | FAIL (1) |
+---------------------------+--------------+
601 Rust tests passed, 0 failed, 63 ignored; no waiver. Fresh five native final-reply tests PASS (2.18 s), fresh static SB-01 and real retirement/restart/handshake-race probes PASS. Standard TS gate PASS, protocol 36/36 and 34,462 assertions; separate source/parser run 148/148. Seven relevant production browser specs PASS; DS-05 isolated failure retained. Three default deferred Brotli builds: 44,751 / 44,715 / 44,756 B <= unchanged 45,056 B.
Fresh stripped static x86: 19,992,512 B, no PT_INTERP, SHA256 8bbda032e50de3733a044cb11425c0a117946a72d35f3a4f3ca39963dd0af272. Retained exact
b373cc4cbaseline 19,904,832 B: observed +87,680 B. Only the historical 16,404,816 B maximum fails (D205); no dependency added. ARM is not reached by this gate. Static build took 12m21s; complete cold gate about 49 min.Independent retained-artifact scale replay, infraternal-dev / 8 CPUs / CPUWeight=10000: 200 recovered, 201 admitted, 200 after reap. PSS 341,848 KiB empty / 3,715,363 KiB filled; 200 owner links add no measured resident pages. Facts 101 median 7.077 ms / max 32.653 ms; load 37.85/26.88/25.90 -> 58.19/31.78/27.51, own source build concurrent. Fresh 200 sequential gone replies p50 162 us / p99 468 us / max 2,206 us at load 14.39/24.05/25.82. Paired native same-session latency fails target/baseline 423.90/435.26 ms p99; no causal delta regression claimed, no green latency gate claimed. Latency script did not retain contemporaneous load, so those paired numbers remain diagnostics.
Evidence: docs/reviews/session-bounds-prod-151.md, commits
72ddb2bd/b0a7d733/8bbb4de3. Findings appended to the review job findings.md. Own targets/runtime scratch removed; safe logs and stripped binaries retained in ~/.cache/codex-scratch/session-bounds-prod-review/. Worktree clean; no implementation repairs, push, deploy or issue close.Production session lifecycle browser finding during the #160 integration: in the exit-7 spec, expected one new attach and observed two; in the saved-status reconnect spec, expected two and observed four. Both flow through the merged replay-aware terminal client and the production session-ended UI. I am tracing the extra attaches against the existing #158 implementation before changing code. The same run passed initial ended-state and exit-0 flows; the replay-specific spec passed 2/2. Full gate evidence and host-load timeouts are on #160.
Test setup finding: the isolated CARGO_TARGET_DIR was correctly placed under scratch, but existing agent tests create fixture parents at
../../targetrelative to the crate. The first test command therefore had 8 ENOENT fixture setup failures (8 of 40 agent tests); no assertions ran in those cases. Added a temporary worktreetargetsymlink to the scratch target so those existing relative fixture paths remain inside scratch; rerunning the unchanged code tests.Rust tests (default features) PASS after pointing existing
../../targetfixture paths through a temporary symlink into scratch: agent 34 passed/6 ignored + 2 transport; server 187 passed/14 ignored plus its integration targets; shim 73 passed/13 ignored, detach 2/2, mouse 1/1. The TF-001replay_complete_notice_is_accepted_by_embedded_serverpassed in the server suite. Initial ENOENT setup attempt is recorded above; no test was waived.Production Playwright rerun (TRACER_TEST_PORT=4280, CPUWeight=10000): 26/29 passed, including dead-session 4/4 and terminal-query-replay 2/2. Remaining failures: sessions-canvas empty/loading/error flow hit its 30s test timeout; terminal first passkey connection poll timed out at 5s; access first-paint expected card did not appear before its test timed out. Access metrics: render p50 1984.50ms/p99 2986.80ms vs 1000ms budget; FCP p50 1655.60ms/p99 2760.30ms. Load average was 31.88/26.80/32.51 at start and 45.43/47.33/40.28 at end. No screenshots/error-contexts inspected. Investigating functional failures; none waived.
Finding: the sessions-canvas empty/loading/error test passed all stages when run with a 60s diagnostic ceiling, but needed 36.4s because it opens three canvases and holds the loading scene for 8s; the default 30s whole-test watchdog preempted it during the same shared load. Raised only this test's outer timeout to 60s; all existing per-stage limits/assertions remain unchanged. Rechecking the focused case.
Baseline check: the same
test/terminal.spec.tsfirst-run/passkey flow fails on detachedorigin/release-prod-3bat the same line 84, default 5sisConnected()poll (1/1 failed; 1.1m total). On this branch the catch-only diagnostic sawconnected=true,attach_count=2,active_socket_count=1,socket_open_count=2,pageErrors=0immediately after that poll failed. This gate remains recorded as failing; no waiver.Baseline comparison on detached
origin/release-prod-3b,TRACER_TEST_PORT=4292, CPUWeight=10000, configured RTT 300ms: access first-paint test exits 1. Setup render p50/p99 1597.00/2025.60ms and sign-in 2029.60/2638.30ms, each vs the unchanged 1000ms budget. FCP reports setup 1423.30/1880.90ms, sign-in 1866.50/2415.70ms. This remains a failing performance gate on both base and integrated branch; not waived.Closed by the orchestrator during the 2026-10-28 handover (#254), on the owner's request to close finished issues. Evidence: Session cap/dead session fixes merged and deployed in prod-batch
707a4572(6320f5b52andb67d03455in dev; release-prod-live contains it), listed in the deploy merge message. Reopen if anything is still missing.kayg referenced this issue2026-10-28 17:53:55 +00:00