Session lifecycle: exited sessions kept 7 days, activity markers, automatic names (D178) #100
Open
opened 2026-10-08 11:54:22 +00:00 by kayg
·
157 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#100
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?
Keep exited sessions (final screen plus exit code) until dismissed or 7 days; expose per-session activity (new output since last seen, command finished with status) to the sidebar; automatic session names from the foreground command or working directory, renameable, used as the window name; optional per-host idle limit, off by default. Codex job for the server/shim side; the UI follows after mockup approval.
Backend decided in D183 (main
4f4acff). Codex job launched on branch session-life from devf27b3fe.Started session lifecycle on branch
session-life, based ondevatf27b3fe7a4dcfb3e268bdee90405bf1f1d8a0ce9. Read #100 and parent #98 comments; D183 is the backend contract.Additive wire proposal before implementation: lifecycle notices use existing
Eventframe 0x33 with sub_id 0, so the frozen frame layouts and codec hot paths stay unchanged. Add JSON event schemas forterminal.output_changed(session_id, out_seq),terminal.command_finished(session_id, status, finished_at),terminal.session_renamed(session_id, name), andterminal.exited(session_id, status, final_seq, exited_at, cwd, command, base64 final-screen snapshot, base64 last-256-KiB output). The exited event is bounded below the 4-MiB frame maximum; the server persists per-account metadata and the bounded payload in SQLite. Add lifecycle Event golden vectors to the shared Rust/TypeScript corpus. Existing terminal recovery notices remain unchanged.Completed wire contract and shared-vector step at
8b4089ecdeaf49fc3ea304713d9a49b68883e951.contracts/wire.mdnow defines bounded D183 lifecycle Event schemas;contracts/vectors/wire/lifecycle-event.binis consumed by both Rust and TypeScript codec tests. No wire frame layout or hot-path codec changed.scripts/verify fastran on infraternal-dev undersystemd-run --user --scope -p CPUWeight=10000. Output excerpts verbatim:Finding:
terminal_sessionsalready binds each session touser_idand hasclosed_at/exit_statuscolumns (crates/infraternal-server/migrations/0002_runtime.sql), butrgfound no writer for those exit fields; current code only rejects a closed session incrates/infraternal-server/src/websocket.rs. The existing SQLite file is under the server data directory; #34 records the current rootful path as/var/lib/infraternal/infraternal.sqlite. Lifecycle data can therefore remain account-scoped in the owner-selected SQLite store without another engine or path.Gate finding after schema commit
27a1888:scripts/verify fastfailed only at the existingunaffordable_repaints_park_until_sufficient_credittest incrates/infraternal/tests/vt_credit.rs:22(credit probe failed: t1-gate-faithful-1). Formatting, Clippy, the Rust gate through unit tests, cargo-deny, and both static builds passed; x86_64 size was 15,965,472 B and aarch64 size was 13,426,136 B, both with no PT_INTERP. This test exercises VT credit timing and no VT code changed in this commit. Rerunning the full gate to check reproducibility.Completed SQLite schema step at
27a1888411298dc896d58f64cb0967c427a3fa95: account-scoped lifecycle fields and a checkedterminal_exitstable now enforce the 1 MiB final-screen and 256 KiB output-tail caps. The post-commitscripts/verify fastrerun passed; it also exercised startup migration tests. A prior full run hit one transient existing VT credit-test failure, recorded above; the rerun passed that test.Rerun environment: infraternal-dev,
systemd-run --user --scope -p CPUWeight=10000, sampled load32.82 25.70 26.43.Gate output excerpts verbatim:
Finding:
terminal.exitedis currently emitted only on an attached stream (crates/infraternal-agent/src/daemon.rs); there is no server persistence path. The schema bounds each exit to 1 MiB screen + 256 KiB output. I’m bounding retained exits to 128 per account, or 160 MiB at maximum payload size, and adding a dismissal tombstone so duplicate notices cannot restore dismissed data.Finding: focused server test compile found four
session_idfunction/local-name collisions and missingsqlx::Rowin the new SQLite tests. Evidence:cargo test -p infraternal-server lifecycle::tests --libreported E0618 and E0599 insrc/lifecycle.rs; renamed the parser and imported the row trait. The same target is being rerun through Nix because this shell has nomakefor vendored OpenSSL.Contract proposal for the session actions required by #100: add control calls
terminal.session.rename(session_id,name),terminal.exit.dismiss(session_id), andterminal.exit.run_again(session_id). Rename pins the session name; dismiss erases payload bytes and retains a bounded tombstone; run-again uses the stored command and working directory. The first two map directly to the new account-owned storage module. Run-again will be wired through a data-only terminal launch request, never a shell command argument.Finding: the first fast-gate run reached Clippy and rejected the new lifecycle module for an unused test helper, handler length,
chunks_exactstyle, 24-hourDurationconstruction, and one manual equality assertion. Evidence:scripts/verify fastClippy diagnostics insrc/lifecycle.rsandsrc/runtime.rs; fixes are applied, and a clean full rerun is pending.Finding: first fast-gate attempt failed in the pre-existing
vt_credit::unaffordable_repaints_park_until_sufficient_creditprobe (credit probe failed: t1-gate-approximate-1) and Clippy stopped before completing. The new OSC parser also failed to compile because this toolchain has noDefaultimplementation for[u8; 128]; I’m replacing the derive with explicit initialization. Host: infraternal-dev; load at gate start: 12.60 / 19.18 / 21.16.Finding: Linux metadata inspection used to walk all of /proc for each active output scan, so the work scaled with unrelated host PID count times active sessions. It now reads the shell's foreground process-group leader directly; startup and exit-time scans are removed, so idle observers sleep on the shim socket. Evidence: crates/infraternal-agent/src/lifecycle.rs and crates/infraternal-agent/src/daemon.rs. Host measurements are pending.
Finding: the lifecycle observer cannot always fetch the last 256 KiB from the existing shim ring at exit. Although
ReadFromreplays retained bytes, crates/infraternal-shim/src/session.rs routes it to a VT snapshot whenever the terminal requires approximation. Proposal: add capability bit 3 and agent→shim frameReadRawFrom(seq)to replay retained bytes without VT repaint on the exit path. New agents use it when negotiated and keep a bounded in-memory fallback for older shims. This avoids 256 KiB × 128 active observer buffers (32 MiB) while preserving compatibility. Evidence: contracts/shim.md §4, crates/infraternal-shim/src/session.rs.Finding: the real Bash test showed a login shell (
argv0=-bash) ignores--rcfile; it printed no rcfile hook and no test variable from.bashrc. The integration launches Bash as an interactive non-login shell so its required--rcfilewrapper loads.bashrcbefore adding hooks. zsh keeps login mode through ZDOTDIR wrappers; fish uses vendor_conf.d. Evidence: crates/infraternal-shim/src/shell.rs testinstalled_shells_load_the_additive_hooks(Bash and zsh present; fish absent).Finding: the prior 24-hour cleanup interval could retain exits for nearly eight days. Cleanup now schedules the exact next seven-day deadline (including dismissed tombstones), and stays asleep when there are no retained exits. Added a real-SQLite deadline test for millisecond rounding and dismissal.
Finding:
terminal.session.renameonly changed SQLite, so other authenticated sockets received no updated window name. The action now publishes an ownedterminal.session_renamednotice after pinning the name; the existing lifecycle fanout delivers it and the persistence subscriber refreshes the stored cwd. The caller still receives the normal action result.Finding: automatic rename events were ignored by SQLite after a user pin but still reached websocket clients with the automatic name. Fanout now substitutes the stored pinned name and preserves the event's cwd, and the SQLite test checks pinned-name resolution.
Finding, reproduced before the fix: the dismissal regression test failed at
crates/infraternal-server/src/lifecycle.rs:577because the dismissed row still held exit status 7 (expected cleared status 0); command and working directory were also retained. Dismissal now clears all rerun and exit payload metadata, while retaining only the non-resurrection tombstone.Finding, reproduced before the fix:
replayed_prompt_marker_is_ready_for_one_shot_command_injectionfailed because an OSC 133 A prompt was present butprompt_returned()remained false. On observer reconnect, historical output is intentionally replayed without marker side effects, so a run-again command could remain queued forever. The parser now retains prompt readiness across replay and the observer checks it after historical bytes.Raw-tail recovery finding:
session::lifecycle_checks::expired_raw_tail_is_refused_without_snapshot_substitutionfailed before the fix atcrates/infraternal-shim/src/session.rs:140: wrapped raw history was converted to a terminal snapshot, producingError(2, "Ghostty state is not representable by the bounded faithful Snapshot painter")instead ofError(1, "raw output range expired"). Recovery now refuses the byte-exact replay and clears its cursor; terminal-state peers still use snapshot recovery. The targeted test passes (1 passed).Cross-platform check:
macos_process.rstype-checks foraarch64-apple-darwinin isolation. The full shim check remains blocked by existing Linux-only APIs incrates/infraternal-shim/src/session.rs(signalfd,PeerCredentials) andpty.rs(getgrouplist,setgroups, ioctl request type); extending the whole shim to macOS is outside this lifecycle change. The server open regression also exposed a stale expectation after adding optionalcwd/command; it now expects both null fields and the focused test passes (1 passed).Activity persistence finding: the new
exit_cursor_marks_unseen_output_when_the_last_notice_was_droppedtest failed before the fix atcrates/infraternal-server/src/lifecycle.rs:663:terminal.exited.final_seq=99leftlast_output_seqat zero. Exit persistence now advances the account cursor and marks it unseen whenlast_seen_seqtrails the final cursor; the regression passes (1 passed).Output-path finding:
daemon::name_refresh_tests::cached_process_metadata_does_not_refresh_before_the_scan_deadlinefailed before the fix because cached/procmetadata triggered name reconstruction on every PTY frame. At 10 MB/s and 16 KiB frames this is about 610 reconstructions/s. Name refresh now runs only on the 200 ms process scan or an OSC 7 cwd change; the regression passes (1 passed). Throughput impact still needs the requiredinfraternal-devbenchmark.OSC 7 finding: the real Bash PTY test failed with a working directory ending in
cwd%test; the hook emitted the raw%, which the parser interpreted as an invalid URI escape. Bash and zsh now percent-escape%and OSC control bytes; fish uses URL escaping. The PTY integration regression passes on installed Bash and zsh (fish is not installed on this host).Performance gates are blocked on the only authorized host: strict
ssh infraternal-dev uptimereturnedssh: connect to host infraternal-dev port 22: Connection refused. I did not use another host or the perf VM. I cannot report host load, parser throughput, keystroke latency, idle RSS or wakeups until infraternal-dev is reachable.Finding/fix:
scripts/agent_fixture.pyassumed Event frames only arrived on terminal stream 1. The lifecycle rename event arrived on control stream 0 (kind 0x33), and an exited stream could close after the next open result. The fixture now records control events, allocates fresh odd streams for new sessions, preserves the writer id across reconnects, and proxies observer and terminal connections concurrently. Evidence:cargo test -p infraternal --test agent_daemon -- --nocapturepassed 1/1; real binary passed 24/24 abrupt stops over 4,710,396 payload bytes across four stop positions; idle daemon and shim had 0 scheduled slices over 2.2 s, daemon RSS 12,460 KiB.Finding: the full fast gate hit
terminal command queue fullat restart 22/24 when the fixture returned one output credit per 64 KiB while replaying a 468,224-byte payload. The fixture now batches credits in 256 KiB units, preserving the bounded agent queue. Recheck: the real-binary test passed 24/24 abrupt restarts and 4,710,396 payload bytes; output-credit backpressure still uses the same protocol path. The full fast gate is being rerun.Finding:
scripts/verify faststopped in its initial three-sample latency proxy self-test. Exact output:latency proxy: configured 300 ms RTT did not arrive: p50=359.80 ms p99=441.19 ms. The shared 8-core host reported load average 28.91 at the observation. No source change was made in response; I will retry when host load settles. The required infraternal-dev benchmark SSH connection is still refused, so task-specific performance gates remain pending.Finding:
purge_expiredremoved only rows fromterminal_exits; the same exit status/time plus command/cwd remained interminal_sessions(crates/infraternal-server/src/lifecycle.rs,purge_expiredandapply_notice). This retained exit metadata past D183's seven-day/dismissal bound. I am adding a failing SQLite test before fixing expiry and quota eviction.Retention assertions are red before the fix:
purge_uses_seven_day_millisecond_deadlineleavesclosed_at=1800000000after the exit row is purged; the 130-exit quota test leaves both evicted sessions with lifecycle metadata (exit_dismissedcount 0 instead of 2). Both reproduce the stale copies interminal_sessions.Finding:
decode_osc_textstopped once it reached the 4096-byte command cap and returned the prefix; the fallback echo path also stopped appending at the cap without invalidating it.terminal.exit.run_againcould therefore execute a different, truncated command. I am adding parser regressions for explicit OSC and fallback capture before changing the cap behavior.Finding: full workspace
cargo testreproducibly failedattached_backpressure_and_detached_progresswhen it reattached withFrame::Attach(0)after the generated Bash prompt's OSC 133 markers. The shell markers make the live VT state require the negotiated approximate Snapshot fallback; production infraternal-agent attachments advertiseAPPROXIMATE_SNAPSHOT. The focused test passed alone but failed in the full shim test binary. I am updating this direct shim fixture to negotiate the capability it exercises.Finding: after the shim suite passed 7/7, full
scripts/verify fastfailedvt_credit::unaffordable_repaints_park_until_sufficient_credit. The approximate/1-byte case recorded 191 lifecycle events and zero repaints;verify-vt-credit.pyincorrectly asserted the entire event list must be empty before forwarding. I am narrowing it to snapshot and snapshot_unavailable notices, preserving the repaint assertion.Finding:
Marker::CommandFinishedcurrently callstry_lifecycle_event, which usesmpsc::Sender::try_send; if the bounded writer queue is full, the command status is dropped and no later output/exit recovery reproduces that command event. Output-change notices may remain best-effort because later cursors recover unseen activity. I am adding a queue-saturation regression before making command-finished delivery await capacity.Finding: the post-commit full gate reached
vt_reconnectand failedlegacy reset never recovered(target/review-vt2-fixes/reconnect.stderr.log). That probe intentionally masksAPPROXIMATE_SNAPSHOTto exercise an older shim client, but the newly injected shell OSC 133 prompt metadata keeps the VT in a state that requires the approximate repaint path after reset. I will disable shell integration only in this legacy protocol fixture; real shell integration is covered by the shim session tests.Step complete at
583fa68: bounded the legacy reconnect probe so it waits for reset input acknowledgement and retries recovery credit every 250 ms. The targetedvt_reconnectpassed.scripts/verify fastpassed at this HEAD: Rust gates, static builds, Ghostty checks, TypeScript build and protocol tests all green; Rust test totals included server 108/0/9 ignored and shim 64/0/12 ignored. RTT self-test p50=304.98 ms, p99=309.40 ms. Host load was 21.73/27.37/24.83 during the targeted run.Finding: a fast-gate run after
4582982failed onlyvt_creditcaset1-gate-approximate-1. Captured evidence:target/review-vt3-fixes/t1-gate-approximate-1.stderr.logreportsdetached initial producer must finishat the probe's 5 s deadline; the other completed Rust checks passed. Host load was 27.67/34.28/31.34. I’m rerunning this case under the same user CPU weight to separate host timing from a lifecycle regression.Finding: Linux
/proccommand formatting exceeded the documented 4096-byte bound when argv had many short arguments. The new red regression incrates/infraternal-agent/src/lifecycle.rsproduced 7047 bytes from 5000 one-byte arguments because separators continued after the payload limit. I’m bounding separators and stopping at a UTF-8 boundary before continuing.Finding update: with the probe setup deadline raised to 20 s, both approximate cases passed (producer completion 149 ms and 453 ms). The faithful grant=1 case reached its 1.5 s progress limit with the 2 MiB producer incomplete (
target/review-vt3-fixes/t1-gate-faithful-1.stdout.log: 1519.3 ms); host load at the rerun was 31.27/36.23/35.36. I’m keeping the 1.5 s progress assertion intact and will rerun when this host is less contended.Finding:
scripts/verify fastfailed once inrepeated_tiny_credit_pauses_preserve_shell_progressat the assertion that the one-byte grant leaves the repaint count and output cursor unchanged. A direct fixture run and targeted Rust rerun both passed all four floods (12,583,863; 25,167,199; 37,750,535; 50,333,859 output bytes) and three funded 481-byte snapshots; targeted-run load was 16.04/22.95/28.17. I added cursor/repaint values to the assertion for evidence if it recurs.Finding: the repeated tiny-credit gate failed with snapshots unchanged (1→1) but output cursor advanced by 800,575 bytes (12,831,384→13,631,959) after the probe's immediate-quiet socket check. This is residual already-credited PTY output arriving after the fixture starts its measurement, not a new repaint. The captured failure is in the
scripts/verify fastoutput from commit14aaefd; I’m changing the probe to require a stable quiet cursor before measuring one-byte credit.Finding update:
scripts/verify fastpassedvt_creditcases 1 andapproximate-1, then failedt1-gate-approximate-16384at the unchanged 1.5 s producer-progress assertion. Evidencetarget/review-vt3-fixes/t1-gate-approximate-16384.stdout.log: 2 MiB producer incomplete at 1507.2 ms; 218 lifecycle notices and zero repaints. Host load at capture was 18.59/25.53/28.03 after a 35.96 one-minute load at gate start. I’m rerunning the isolated case under the same CPU weight.Rerun complete: the full
vt_credittest passed in isolation at load 22.09/25.89/28.10. All four cases completed the 2 MiB producer in 274.8–765.3 ms with zero repaints before sufficient credit; the 1.5 s assertion is unchanged. The prior 1507.2 ms failure did not reproduce.Retention scale measurement: 128 synthetic max-size exits produced a 170,278,912-byte SQLite file (41,572 pages × 4,096 bytes), with 167,772,160 bytes of screen/tail payload and 2,097,152 bytes of duplicated command/cwd metadata. The measured file is about 162.25 MiB; the 160 MiB contract cap counts payload only. Database:
$HOME/.cache/codex-scratch/session-life/retention-scale.sqlite.Gate attempt after
29bbb76:scripts/verify fastfailed only inunaffordable_repaints_park_until_sufficient_creditfort1-gate-faithful-16384. Diagnostic: “producer=2097152 bytes completed=False elapsed_ms=1519.1”; no repaint was sent (repaints=0). Host wasinfraternal-dev, load average 29.31/36.56/34.14. Format, clippy, restart, queue, agent review, shim, cargo-deny and static x86_64/aarch64 builds passed; retrying the PTY gate under lower contention.Step complete: additive shim and wire contracts for raw retained output, shell wrappers, rerun metadata and lifecycle controls. Commit
29bbb76.scripts/verify fastRust result table (verbatim):+---------------------------+--------------+
| Rust gate | Result |
+---------------------------+--------------+
| fmt | PASS |
| VT native fmt | PASS |
| clippy | PASS |
| test | PASS |
| cargo-deny | PASS |
| static builds | PASS |
+---------------------------+--------------+
Protocol gate output:
20 pass / 0 failTypeScript codec/compiler tests;7 pass / 0 failwire tests. RTT self-test p50 297.14 ms, p99 318.09 ms. Static binaries: x86_64 16,273,536 bytes; aarch64 13,697,248 bytes.Gate attempt after
14a4a03reached the real-agent queue fixture but its firstterminal.openreturned the generic refusal response. Immediate isolated rerun passed:saturated_terminal_queues_preserve_every_byte_and_daemon_liveness ... ok(35.51 s). No code change was needed; retrying the full fast gate to establish the commit result.Full fast gate retry after
14a4a03again stopped only in the existing VT-credit progress assertion, this timet1-gate-faithful-1:producer=2097152 bytes completed=False elapsed_ms=1513.8, withrepaints=0andnotices=226. Hostinfraternal-devload average was 21.67/21.45/26.20. This is the same 1.5 s host-contention symptom recorded earlier; the focused test is being rerun before the next full attempt.Focused
cargo test -p infraternal --test vt_creditretry also failed duringt1-gate-approximate-1: the 2,097,152-byte producer did not finish within the fixed 1,500 ms progress assertion (elapsed_ms=1509.4, zero repaints). Host load had risen to 33.04/24.38/26.94. This supports contention in the test window; it does not indicate an early repaint or cursor advance.Parser performance finding: an exploratory release microbenchmark parsed 10,485,760 ordinary bytes in 1.664498 s (6.01 MiB/s). The host load was 33.93/25.00/27.10 and this run was not yet under the requested CPU-weight scope, so I will repeat it before treating the number as a budget result. Source review found prompt suffix matching repeated for every byte; I am replacing it with state updated only at printable suffix boundaries and adding a deterministic regression check.
Parser performance fix evidence: the new regression test failed first at 393,216 suffix scans for 65,536 ordinary bytes. Cached prompt recognition now checks suffixes only when a printable space arrives; all 9
infraternal-agentlifecycle parser tests pass. A release microbenchmark undersystemd-run --user --scope -p CPUWeight=10000processed five 10 MiB samples at median 121.22 MiB/s (min 109.08, max 170.41); hostinfraternal-devload was 31.85/28.77/28.18. Repeating the test and measuring end-to-end baseline/current output throughput remains pending.Step complete: cached prompt recognition in the lifecycle OSC parser. Commit
e25e07a.scripts/verify fastRust result table (verbatim):+---------------------------+--------------+
| Rust gate | Result |
+---------------------------+--------------+
| fmt | PASS |
| VT native fmt | PASS |
| clippy | PASS |
| test | PASS |
| cargo-deny | PASS |
| static builds | PASS |
+---------------------------+--------------+
Gate details: RTT p50 306.03 ms / p99 316.40 ms; x86_64 static binary 16,273,600 bytes; aarch64 13,697,248 bytes; TypeScript 20 pass and wire 7 pass. The full suite passed at host start load 20.20/34.38/33.45. Parser microbenchmark: five 10 MiB samples, median 121.22 MiB/s (109.08–170.41). Fuzz smoke: 175,068 runs in 6 seconds, coverage 271, no crash, 52 MiB peak RSS; sanitizer disabled because nightly toolchain installation stalled before
rustc.Gate attempt after
167b870: all agent review and shim tests passed, includingrepeated_tiny_credit_pauses_preserve_shell_progress(153.74 s).scripts/verify fastthen failed only att1-gate-approximate-16384: the 2,097,152-byte producer did not finish in the fixed 1,500 ms progress window (elapsed_ms=1502.3,repaints=0,notices=261). Hostinfraternal-devload was 32.66/27.52/27.05. This matches the previously recorded load-sensitive setup/progress symptom; a focused retry will follow.Focused VT-credit retry after
167b870failed the same progress-window assertion att1-gate-approximate-1: 2,097,152-byte producer incomplete at 1,502.7 ms, with zero repaints and 250 notices. Host load was 30.04/28.26/27.37. No parser/agent protocol assertion failed; I will repeat the full gate once contention drops.The full gate at
6845d49failedattached_backpressure_and_detached_progress(minimum 2165, observed head 1274). Host load was 15.06/20.11/24.18; isolated rerun under CPUWeight=10000 passed (1/1, 0.47 s). Retrying the full gate.Server lifecycle persistence, routing, quotas and controls are committed at
6845d4937c. On infraternal-dev,scripts/verify fastpasses: server 108 passed/9 ignored; shim 64 passed/12 ignored; agent 26 passed/2 ignored; agent daemon abrupt-stop test 24 cycles in 44.04 s; TypeScript protocol 7 passed/0 failed (40,810 expects); browser-side tests 20 passed/0 failed (376 expects). RTT self-test p50 304.91 ms, p99 313.85 ms. Static binaries: x86_64 16,273,600 B; aarch64 13,697,248 B. Running the separately requested latency and throughput gates now.scripts/verify latencyis still running on infraternal-dev. The native phase (scripts/verify-latency.py:63) raisedAssertionError: unexpected stream 0while awaiting the baseline output marker. In the Playwright matrix, tests 32, 34, 41, 43, 44, 46, 50, 52, 54 and 58 have failed so far; 91/106 cases had run at the last checkpoint. Host load reached 37.65/26.03/21.53. The bulk browser output probe measured 50 MB in 21.65 s (2.31 MB/s, prediction off) and 21.49 s (2.33 MB/s, prediction on). Collecting final traces and retrying under lower load.scripts/verify latencyfinished on infraternal-dev (exit 1): 67 passed, 26 skipped, 13 failed in 19.1 min; load at finish 22.68/26.85/24.25. The native harness fails on a new but contract-valid lifecycle Event (stream=0,sub_id=0):scripts/verify-latency.py:63raisesunexpected stream 0because it only tracks terminal streams. I will update this harness to ignore account lifecycle events during PTY timing samples.Other failures were in the existing tracer browser matrix: 2 mock requests ended with socket hangups; visual/timing assertions failed in motion, onboarding, palette, predictive echo/backspace, theme, terminal latency and first-paint cases under heavy host load. End-to-end measurements: reconnect p99 977.50 ms (900 ms budget); prediction CPU p99 5.00 ms/key (2 ms budget); visible glyph p99 13.70 ms (17 ms budget); returning sign-in p99 4273.30 ms (5000 ms budget); measured RTT 311.70 ms. The renderer bulk-output comparison passed its ±5% gate: 50 MB medians 2.31 MB/s (prediction off) vs 2.33 MB/s (on), +0.76%; cell renderer throughput was 9.68–9.76 MB/s at DPR 2/3.
Updated the native latency fixture to skip only D183 account lifecycle Event frames (
stream=0,sub_id=0) while measuring PTY streams. Commite583bd19ac. Red/green fake-frame probe reproducedunexpected stream 0, then passed with the account event followed by a terminal Ack.scripts/verify fastpasses after the commit: server 108/108 active tests; shim 64/64 active; agent 26/26 active; TypeScript 20/20 and protocol 7/7; x86_64 binary 16,273,600 B, aarch64 13,697,248 B; RTT self-test p50 307.75 ms / p99 317.17 ms. Full gate log is in the final issue comment.The
f27b3febaseline static build in scratch initially failed before producing a binary: OpenSSL's build script reportedCommand 'make' not foundbecause the direct PATH omitted the cross-build tools. The current static binary was saved separately. Retrying with Nix-provided Zig, GNU make and Perl on infraternal-dev.The baseline retry with Nix tools passed OpenSSL but stopped at SQLite because baseline
.cargo/musl-cc.shhardcodesbaseline-src/target/auth-tools/zig/zig, absent from the scratch archive. I will point only that scratch helper path at the Nix store Zig executable; repository files and the saved current binary remain untouched.The post-fix native PTY probe (
--samples 20, current binary) now reaches its measurements. Baseline echo p99 was 322.30 ms and other-session echo p99 328.01 ms (334 ms budget); same-session flood p99 was 2502.37 ms and failed the 334 ms budget, while other-session flood growth was 16.22 ms (16.67 ms budget). Host load changed 22.35/27.21/27.23 → 22.67/26.73/27.06. Running the same probe onf27b3febefore attributing this result.The same native 20-sample PTY probe on
f27b3fealso exceeds the absolute same-session flood budget: baseline same-session echo p99 515.35 ms and PTY echo p99 2254.70 ms (334 ms budget); current was 612.09 ms and 2502.37 ms. Current p50s (338.87/645.43 ms) exceeded baseline p50s (343.86/485.87 ms) for confirmed/PTY echo respectively; current other-session flood growth was 16.22 ms versus baseline -33.14 ms. Load stayed in the 22–27 range in both runs. This points to an additional same-session flood cost worth isolating; the baseline also fails the flood budget, so I am not attributing the absolute failure to this change yet.The existing unbatched output benchmark produced no throughput samples on either static binary:
bench-agent-output.pyexited on Close stream 1,terminal command queue full; reattach and replay unacknowledged input, in bothf27b3feand current runs (load rose from ~30 to ~34). The message exists in both agent revisions. I am retrying the diagnostic with the benchmark's 64 MiB batched-credit mode to reduce credit-command pressure and will also run the idle/memory gate.The batched LF output benchmark (50 MiB x3) produced baseline 3.370/1.328/1.366 MiB/s and current 2.351/1.664/0.708 MiB/s; current host load rose from 25.14 to 32.43. These samples are too contended to attribute a throughput change. Code review found the current observer can attempt a
terminal.output_changedevent for each 64 KiB of output (up to ~800 notices per 50 MiB) despite an existing 100 ms cadence; a full event queue also leaves the byte threshold due on every following frame. I will coalesce attempts to the 100 ms output-driven cadence, add a unit test for burst coalescing, and rerun the comparisons.Implemented 100 ms output-driven event coalescing with a red/green unit test; commit pending after full gate. The native 20-sample PTY probe on the coalesced binary measured same-session flood p50/p99 674.53/1581.62 ms, versus pre-coalescing current 645.43/2502.37 ms and
f27b3fe485.87/2254.70 ms. The coalesced run was under heavier load (35.92→32.00; prior runs 22.35→22.67 and 24.86→23.34), so this is directional only; the absolute 334 ms same-session budget still fails. Baseline and other-session echo metrics remain near the 300 ms configured RTT. Running the post-change throughput probe next.Post-coalescing
verify-agent.pymeasured 0 scheduled agent slices over 2.200 s (0/min), agent RSS 5,096 KiB; with an attached idle shim it measured 0 slices for both agent and shim. All 24 abrupt-stop/restart cases passed (4,710,396 payload bytes). The 1,000-sample input-to-PTY Ack p99 was 369.25 ms versus the 334 ms budget, so the gate stopped before its 50 MiB throughput/RSS phases. Host load was 37.57/38.98/36.25. Recording the load-limited failure; coalesced output probe medians and parser throughput are recorded above.Coalesced
terminal.output_changedattempts to the existing 100 ms cadence on PTY output; failed queue sends are throttled too, with no idle timer. Commit c62ec63f9f11e4693908ed8e04dcf0db7e8b223d. The newhigh_volume_output_waits_for_the_notice_intervaltest failed against the old byte threshold and passed after the change (1/1). Static post-change 50 MiB LF runs were 2.023/1.477/1.168 MiB/s, median 1.477; load was 38.45/39.62/35.53 at start and 26.09/34.54/34.11 at finish. This remains a loaded-host comparison.scripts/verify fastis running after this commit.Finding after
c62ec63078:scripts/verify fastcaught Clippyunchecked_time_subtractionincrates/infraternal-agent/src/daemon.rs:1017in the new 100 ms notice interval test. The test subtracts 1 ms from aDuration; I’ll express the pre-interval instant without subtraction and rerun the gate.The first fast-gate run after
c62ec63078exited 1. In addition to the recorded Clippy lint,crates/infraternal/tests/vt_credit.rsfailed at line 22 withcredit probe failed: t1-gate-approximate-1(22.69 s). The 276.84 s agent review suite passed; cargo-deny and both static builds passed. At the time, other worktrees also had fast gates active on this shared host, so I’ll recheck the PTY probe after the local lint fix.Step complete: committed
4d6f98c9dd. The notice interval test now samples at half the configured interval and Clippy passes (Finished dev profile in 2.07s); the focused regression test passes (1 passed, 28 filtered). The prior full fast run still needs a clean rerun becausevt_creditfailed while this shared host was heavily loaded.Finding on repeated fast runs after
c62ec63078/4d6f98c9dd:vt_creditfailed twice atcrates/infraternal/tests/vt_credit.rs:22, caset1-gate-approximate-1(22.69 s, then 29.07 s). Its stderr attarget/review-vt3-fixes/t1-gate-approximate-1.stderr.logisAssertionError: detached initial producer must finish;scripts/verify-vt-credit.pywaits 20 s for the synthetic 12 MiB PTY producer'sreadymarker before reaching the credit assertion. This is a setup timeout, not the test's measured 1.5 s progress assertion. Both runs were on a shared host with load averages above 50; I’ll rerun the probe when contention allows.Load comparison: with load averages 73.85/73.75/65.86 at start (73.65/73.72/66.31 after), the standalone
verify-vt-credit.pyprobe against thef27b3febaseline binary reached its progress phase but did not finish the synthetic 2 MiB producer within 1.5 s (elapsed_ms=1520.0,done=False). The same probe againstcurrent-coalesceddid not reach itsreadymarker within 20 s. This demonstrates the probe's setup/progress limits are failing under this contention; it does not yet establish the current build's relative slowdown, so the result remains unresolved pending a lower-load run.Performance finding from the scratch-only 60 s setup probe (the repo's 1.5 s assertion was unchanged): under shared-host load around 70–80,
f27b3febaseline reached the producer marker in 3.51 s and its 2 MiB progress phase passed in 650 ms;current-coalescedreached the marker in 7.85 s, emitted 85 activity notices, then missed the 1.5 s progress assertion (2 MiB producer incomplete at 1,518.8 ms). These single runs are not a controlled benchmark, but the current observer path is a plausible source of material output-path overhead and the failing gate. I’m repeating paired probes before choosing a fix.Third alternating scratch-probe pair: with load 82.15/77.37/73.07 before baseline and 76.13/76.47/72.97 before coalesced, baseline reached
readyin 10.71 s and failed the 1.5 s phase at 1,507.6 ms; coalesced reachedreadyin 9.71 s and failed at 1,517.0 ms. Across three pairs, outcomes vary with contention and show no consistent relative slowdown. The full gate remains red because its fixed 1.5 s PTY probe is not passing at current load; I still need a green full gate on this commit.Finding on the third fast-gate run after
4d6f98c9dd:agent_review::repeated_tiny_credit_pauses_preserve_shell_progressfailed becausescripts/verify-agent-snapshot.pydid not observecompleted-0within its 90 s deadline (5 passed, 1 failed; suite 97.09 s). Formatting, Clippy, cargo-deny and static builds passed. Load after that run completed was 7.62/11.67/30.86; I could not sample load at the exact assertion. The host is now lighter, so I’m rerunning the full gate.Preliminary low-load throughput comparison on the same 50 MiB LF batched workload (three runs per binary, systemd CPUWeight=10000):
current-coalescedwas 7.174, 6.692, 4.502 MiB/s (median 6.692);f27b3febaseline was 3.585, 8.019, 9.452 MiB/s (median 8.019). Load averages stayed around 14.9/12.6–13.1/23.3–23.9 across both blocks. The apparent 16.5% lower current median has high spread and sequential-order bias, so it is not yet a reliable regression measure; I’m running an alternating paired sample before deciding whether the output path needs more work.Output throughput step: five alternating paired 50 MiB LF batched runs under
CPUWeight=10000. Baseline speeds were 10.175, 9.578, 9.722, 9.057, 8.381 MiB/s (median 9.578);current-coalescedwas 9.521, 9.501, 9.692, 8.969, 9.426 MiB/s (median 9.501), a 0.8% median difference. Load averages were 10.91/12.34/22.69 at start and 8.20/11.20/21.54 at finish. The paired sample shows no throughput regression beyond run-to-run noise.Low-load latency rerun on infraternal-dev (8 cores, port 4287; load 7.41/10.88/21.27 at start, 10.00/31.42/27.91 at finish) still exited 1. Native baseline confirmed-echo p99 was 328.44 ms (pass), PTY-echo p99 337.46 ms (3.46 ms over 334); other-session flood echo p99 330.51 ms and growth -6.95 ms (pass). The same-session flood phase stalled in
agent_fixture.py:exactfor 10:49 with the syntheticyesblocked on PTY output; I interrupted it and its cleanup removed the test processes. Auth-browser passed. Playwright reported 75 passed, 26 skipped, 5 failed: motion tooltip width 169 vs 190; first-key cost 3.4 ms vs <2; theme paint p99 20.1 ms vs <16.67; reconnect p99 1,027.2 ms vs <=900; access render p50/p99 1,477.4/1,866.6 ms at setup and 1,791.2/1,962.3 ms at sign-in vs 1,000. The 50 MB browser throughput delta passed (+0.06%, 2.17 MiB/s median on/off). No UI code changed in this lane; these browser failures remain recorded as gate results.Finished on branch
session-life, HEAD4d6f98c9dd772346272239960ba3e7852e4a2bbf.git diff --check f27b3fe..HEADpassed and the worktree is clean. The fast gate passed on this exact commit. Earlier latency results and the final performance measurements are recorded in the preceding comments;scripts/verify latencyremains red as documented.Verbatim
scripts/verify faststdout (exit 0):METRIC name=network_rtt_selftest configured_rtt_ms=300 jitter_ms=30 loss=unsupported transport=tcp-stream n=3 p50_ms=302.02 p99_ms=304.16 result=PASS
==> fmt
==> VT native fmt
==> clippy
Finished
devprofile [unoptimized + debuginfo] target(s) in 0.54s==> test
Finished
testprofile [unoptimized + debuginfo] target(s) in 0.44sRunning unittests src/main.rs (target/debug/deps/infraternal-2c06fb1e08b40f8f)
running 2 tests
test install::tests::dry_run_prints_a_process_surviving_user_unit ... ok
test setup_token_tests::setup_token_command_reads_only_the_expected_socket_response ... ok
test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
running 1 test
test real_binary_preserves_input_and_output_across_24_abrupt_stops ... ok
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 39.62s
running 1 test
test saturated_terminal_queues_preserve_every_byte_and_daemon_liveness ... ok
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 34.84s
running 6 tests
test stalled_terminal_never_delays_control_or_sibling_dispatch ... ok
test last_typist_selects_its_own_real_pty_dimensions ... ok
test initial_attach_requires_explicit_credit_before_replay ... ok
test retained_unwritten_input_survives_interleaved_ack_restart ... ok
test two_writers_keep_independent_ack_and_exact_input_after_restart ... ok
test repeated_tiny_credit_pauses_preserve_shell_progress ... ok
test result: ok. 6 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 15.37s
running 1 test
test detached_shim_is_discovered_and_replays_from_the_last_observed_offset ... ok
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.03s
running 1 test
test one_hertz_wakeup_is_detected_past_the_legacy_half_second_window ... ok
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 3.14s
running 7 tests
test double_fork_survives_parent_death ... ok
test disallowed_signal_only_disconnects_peer ... ok
test replacement_connection_and_malformed_limit ... ok
active
test user_scope_survives_parent_unit_stop ... ok
test real_shell_reconnect_resize_and_retained_exit ... ok
test attached_backpressure_and_detached_progress ... ok
test ring_wrap_snapshot_repaints_real_vim ... ok
test result: ok. 7 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 3.31s
running 1 test
test unaffordable_repaints_park_until_sufficient_credit ... ok
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 11.66s
running 1 test
test snapshot_limits_never_close_live_reconnect ... ok
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 16.39s
running 29 tests
test daemon::name_refresh_tests::cached_process_metadata_does_not_refresh_before_the_scan_deadline ... ok
test daemon::output_event_tests::high_volume_output_waits_for_the_notice_interval ... ok
test lifecycle::tests::fallback_prompt_ignores_color_sequences ... ok
test daemon::command_finished_delivery_tests::command_completion_waits_for_writer_capacity ... ok
test lifecycle::tests::command_marker_keeps_echoed_input_and_decodes_shell_payload ... ok
test lifecycle::tests::fallback_tracks_echoed_command_until_prompt_returns ... ok
test lifecycle::tests::markers_survive_chunk_boundaries_and_percent_encoded_cwd ... ok
test lifecycle::tests::replayed_prompt_marker_is_ready_for_one_shot_command_injection ... ok
test lifecycle::tests::malformed_and_oversized_sequences_remain_bounded ... ok
test relay::tests::input_overlap_gap_and_restart_from_confirmed_offset ... ok
test relay::tests::output_partial_credit_and_dedup ... ok
test lifecycle::tests::process_command_capture_stays_within_its_byte_limit ... ok
test lifecycle::tests::overlong_command_captures_are_not_replayed_as_prefixes ... ok
test relay::tests::output_payload_move_measurement ... ignored, release ownership versus payload-copy measurement
test relay::tests::overflowing_ranges_never_mutate_cursors ... ok
test relay::tests::attachment_has_no_implicit_output_or_snapshot_credit ... ok
test relay::tests::returned_credit_cancels_starvation_and_state_has_no_payload_buffer ... ok
test relay::tests::starvation_is_one_shot_and_snapshot_length_does_not_advance_sequence ... ok
test sessions::tests::reader_borrow_measurement ... ignored, release borrowed versus owned asynchronous receive measurement
test relay::tests::positive_insufficient_credit_arms_a_one_shot_deadline ... ok
test sessions::tests::refused_socket_is_removed_but_insecure_directory_is_rejected ... ok
test sessions::tests::symlink_state_cannot_redirect_private_runtime_storage ... ok
test lifecycle::tests::ordinary_output_does_not_rescan_prompt_suffixes_per_byte ... ok
test sessions::tests::sequenced_attach_intersects_caps_and_legacy_attach_stays_zero ... ok
test relay::tests::expired_credit_resumes_retained_bytes_at_the_same_cursor ... ok
test daemon::output_tail_tests::retains_exact_tail_across_wrap_and_oversized_write ... ok
test sessions::tests::borrowed_reader_payload_uses_reusable_cancel_safe_storage ... ok
test sessions::tests::post_listen_chmod_wakes_a_connection_refused_at_bind ... ok
test sessions::tests::cancelled_fragmented_shim_read_retains_header_and_body_progress ... ok
test result: ok. 27 passed; 0 failed; 2 ignored; 0 measured; 0 filtered out; finished in 0.03s
running 2 tests
test oversized_header_and_truncated_frame_are_rejected ... ok
test fragmented_headers_coalesced_frames_and_reusable_transmit ... ok
test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.01s
running 0 tests
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
running 1 test
test omitted_arrow_ports_default_to_all_services ... ok
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
running 14 tests
test overlaps_are_reported_without_silent_range_changes ... ok
test join_to_same_tag_grants_both_initiation_directions ... ok
test directional_grants_union_and_minimal_updates ... ok
test exhausted_versions_reject_mutations_without_changing_state ... ok
test names_versions_and_backend_status ... ok
test arrow_replacement_is_atomic_and_unrelated_nodes_keep_their_versions ... ok
test checkpoint_after_suffix_change_restores_without_reallocating_addresses ... ok
test private_material_never_enters_debug_or_coordination_serialization ... ok
test server_rotation_has_continuous_keys_for_every_node_during_delivery ... ok
test rotation_waits_for_overlap_and_delivery_and_removal_drops_every_key ... ok
test public_checkpoint_preserves_addresses_rules_versions_and_overlap ... ok
test protocol_port_unions_never_grant_an_unlisted_service ... ok
test addresses_are_unique_stable_and_not_recycled ... ok
test seeded_random_sequences_equal_full_compile_and_deny_without_grants ... ok
test result: ok. 14 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 4.16s
running 1 test
test unrepresentable_rotation_overlap_rejects_before_mutation ... ok
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.01s
running 0 tests
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
running 0 tests
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
running 7 tests
test tests::mux_round_trip_and_incremental_decoders_preserve_frame_order ... ok
test tests::rejects_oversized_noncanonical_and_malformed_frames_before_buffering_body ... ok
test tests::oversized_encode_keeps_the_reusable_output_unchanged ... ok
test stream_tests::split_mux_header_preserves_trailing_close ... ok
test stream_tests::all_short_frame_splits_match_direct_decoding ... ok
test tests::golden_vectors_encode_and_decode_every_contract_frame ... ok
test stream_tests::maximum_sized_fragmented_frame_is_not_rejected ... ok
test result: ok. 7 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.01s
running 117 tests
test auth::tests::aaguid_projection_rejects_malformed_cbor_corpus ... ok
test auth::tests::account_identity_migration_backfills_legacy_users ... ok
test auth::http::tests::admission_partitions_reset_without_trusting_forwarded_headers ... ok
test auth::http::hostname_tests::authenticated_session_response_includes_system_hostname ... ok
test auth::tests::account_identity_schema_has_unique_usernames_and_display_names ... ok
test auth::tests::aaguid_migration_preserves_legacy_credentials_and_sessions ... ok
test auth::crypto::verifier_tests::recovery_capacity_denial_is_not_a_legacy_credential_signal ... ok
test auth::crypto::verifier_tests::browser_secret_hashing_is_canonical_and_bounded ... ok
test auth::tests::audit_ceremony_browser_binding ... ok
test auth::tests::audit_logout_survives_admission_exhaustion ... ok
test auth::tests::discoverable_latency_at_pending_capacity ... ignored, run --release --ignored --nocapture without concurrent builds
test auth::tests::audit_no_public_credential_listing ... ok
test auth::tests::audit_recovery_after_page_discard_can_resume_at_original_deadline ... ok
test auth::tests::audit_recovery_pending_is_visible_to_signed_in_device ... ok
test auth::tests::audit_recovery_session_expiring_during_verification_keeps_delay ... ok
test auth::tests::provider_labels_cover_the_cited_registry_without_guessing ... ok
test auth::tests::provider_session_latency_at_50_devices ... ignored, local auth session scale measurement; run without concurrent builds
test auth::tests::authenticated_prf_metadata_preserves_legacy_envelopes ... ok
test auth::tests::ceremony_prf_wraps_and_optional_second_passkey ... ok
test auth::tests::concurrent_owner_and_optional_passkey_enrollment_fail_closed ... ok
test auth::tests::discoverable_login_handle_credential_counter_and_replay ... ok
test auth::tests::enrollment_prf_input_matches_discoverable_login ... ok
test auth::tests::http_csrf_cookie_flags_body_limit_and_latency_evidence ... ok
test auth::tests::pending_unlock_expires_without_terminal_authority ... ok
test auth::tests::public_status_and_discoverable_http_login ... ok
test auth::tests::recovery_session_delay_latency_at_capacity ... ignored, release-only recovery measurement at 50 live sessions; run without concurrent compilation
test auth::tests::recovery_audit_commits_once_with_start_cancel_and_complete ... ok
test auth::tests::recovery_delay_cancel_and_replacement_revokes_every_capability ... ok
test auth::tests::recovery_verifier_latency_at_capacity ... ignored, release-only v2 diagnostic at 50 live session rows; record host load separately
test auth::tests::recovery_expiry_revocation_and_cross_user_isolation ... ok
test auth::tests::recovery_http_live_same_account_is_immediate ... ok
test auth::tests::recovery_http_other_expired_pending_and_missing_sessions_wait ... ok
test auth::tests::recovery_live_session_cannot_accelerate_an_active_delayed_request ... ok
test auth::tests::recovery_live_session_revoked_during_verification_cannot_waive_delay ... ok
test auth::tests::recovery_unknown_identity_pays_the_same_database_and_verifier_work ... ok
test auth::tests::recovery_username_identity_is_additive_and_ambiguous_forms_fail ... ok
test auth::tests::redacted_unknown_and_failed_registrations_do_not_claim_a_provider ... ok
test auth::tests::registration_aaguid_survives_none_attestation_and_binds_session_provider ... ok
test auth::tests::rejected_origin_uv_challenge_signature_prf_and_expired_ceremonies ... ok
test auth::tests::review3_tests::review3_backend_reply_has_a_deadline ... ok
test auth::tests::review3_tests::review3_busy_expiry ... ok
test auth::tests::review3_tests::review3_busy_logout ... ok
test auth::tests::review3_tests::review3_busy_recovery ... ok
test auth::tests::review3_tests::review3_completion_and_cleanup_are_transaction_bound ... ok
test auth::tests::review3_tests::review3_expired_handshake_must_not_welcome ... ok
test auth::tests::review3_tests::review4_slow_open_at_user_capacity ... ignored, release-only connect scale measurement; run without concurrent builds
test auth::tests::review3_tests::review3_identified_privacy_timing_and_binding_replays ... ok
test auth::tests::review3_tests::review3_pending_routes_and_idle_expiry_recovery ... ok
test auth::tests::review3_tests::review3_revoked_handshake_must_not_welcome ... ok
test auth::tests::review3_tests::review3_revoked_resume_must_not_welcome ... ok
test auth::tests::review3_tests::review3_unwrap_cannot_be_skipped ... ok
test auth::tests::review3_tests::review3_waiting_handshake_loses_authority ... ok
test auth::tests::review3_tests::review4_open_reply_and_revocation_preserve_authority ... ok
test auth::tests::review_invalid_device_polling_exhausts_browser_budget ... ok
test auth::tests::review_old_words_race_rotation ... ok
test auth::tests::reviewer_tests::reviewer_disk_cancel_complete_races ... ok
test auth::tests::reviewer_tests::reviewer_disk_restart_and_concurrent_resume ... ok
test auth::tests::reviewer_tests::reviewer_http_denials_and_recovery_admission ... ok
test auth::tests::reviewer_tests::reviewer_http_expired_capability_cannot_complete_after_writer_wait ... ok
test auth::tests::reviewer_tests::reviewer_http_expired_ceremony_cannot_complete_after_writer_wait ... ok
test auth::tests::reviewer_tests::reviewer_server_clock_rollback_retains_deadline_and_reports_more_than_day ... ok
test auth::tests::setup_check_is_non_consuming_and_closes_after_owner_creation ... ok
test auth::tests::setup_identity_validation_and_uniqueness ... ok
test auth::tests::rotation_tests::recovery_phrase_routes_are_removed_and_words_fail_closed ... ok
test auth::tests::rotation_tests::recovery_rotation_cannot_follow_a_cookie_account_switch ... ok
test auth::tests::setup_start_accepts_username_and_display_name ... ok
test auth::tests::rotation_tests::recovery_rotation_denies_pending_expired_and_stale_sessions ... ok
test auth::tests::rotation_tests::recovery_rotation_requires_session_and_replaces_legacy_envelope ... ok
test auth::tests::rotation_tests::reviewer_concurrent_signed_in_rotations_commit_once ... ok
test auth::tests::server_setup_terminal_echo_and_resume_preserve_offsets_once ... ok
test auth::tests::sessions_slide_but_fresh_tap_does_not_and_device_keys_are_scoped ... ok
test auth::tests::setup_restart_rotation_expiry_and_parallel_redemption ... ok
test auth::tests::socket_tests::authenticated_idle_socket_survives_the_former_read_timeout ... ok
test auth::tests::socket_tests::socket_authority_latency_at_user_capacity ... ignored, release-only measurement without concurrent compilation
test auth::tests::socket_tests::clean_control_close_is_not_an_internal_error ... ok
test embedded::regressions::credited_bulk_output_survives_forwarder_io_pause ... ok
test embedded::regressions::credited_output_queue_at_stream_capacity ... ignored, debug actor memory/scheduling measurement; run without concurrent builds
test embedded::regressions::full_output_queue_must_not_block_shared_actor ... ok
test embedded::regressions::healthy_receiver_survives_ready_native_output_burst ... ok
test embedded::regressions::healthy_streams_progress_at_user_attachment_capacity ... ok
test embedded::regressions::output_and_snapshot_spend_remaining_restart_credit ... ok
test embedded::regressions::real_agent_canonical_uuid_result_is_accepted ... ok
test embedded::regressions::real_agent_open_uses_uid_and_character_dimensions ... ok
test embedded::regressions::reattach_must_restore_output_credit ... ok
test embedded::regressions::recovery_event_then_snapshot_keeps_embedded_connection_live ... ok
test embedded::regressions::recovery_notices_preserve_order_credit_and_session_isolation ... ok
test embedded::regressions::stream_close_must_not_restart_all_sessions ... ok
test embedded::regressions::uncredited_output_or_repaint_is_rejected_before_queueing ... ok
test lifecycle::tests::automatic_rename_updates_cwd_but_respects_a_pinned_name ... ok
test lifecycle::tests::cleanup_deadline_tracks_exit_and_dismissal_without_periodic_polling ... ok
test lifecycle::tests::exit_cursor_marks_unseen_output_when_the_last_notice_was_dropped ... ok
test lifecycle::tests::exit_is_bounded_owned_dismissed_and_not_resurrected ... ok
test lifecycle::tests::foreign_or_oversized_exit_is_rejected ... ok
test lifecycle::tests::output_activity_clears_only_after_the_seen_cursor_catches_up ... ok
test lifecycle::tests::purge_uses_seven_day_millisecond_deadline ... ok
test lifecycle::tests::retained_exit_quota_caps_account_storage_at_128_records ... ok
test runtime::reviewer_admission::reviewer_recovery_source_limit_covers_all_routes_without_forwarding_bypass ... ok
test runtime::tests::proxy_mode_requires_an_explicit_peer_allowlist ... ok
test runtime::tests::proxy_networks_match_only_their_address_family_and_prefix ... ok
test runtime::tests::restart_serves_fresh_setup_token_and_completes_owner_enrollment ... ok
test runtime::tests::router_migrates_private_storage_and_serves_health ... ok
test runtime::tests::setup_socket_cleanup_preserves_symlinks_and_regular_files ... ok
test runtime::tests::setup_token_socket_is_private_and_requires_explicit_request ... ok
test runtime::tests::startup_with_owner_unlinks_stale_setup_token_socket ... ok
test web_assets::tests::encodings_and_identity_have_correct_headers_and_sizes ... ok
test web_assets::tests::spa_and_mutable_assets_revalidate_and_missing_brotli_uses_gzip ... ok
test websocket::recovery_notification_bench::recovery_notification_state_at_socket_capacity ... ignored, notification state sizing diagnostic, not allocator-inclusive RSS certification
test websocket::writer_tests::second_device_does_not_inherit_first_device_input_ack ... ok
test websocket::writer_tests::writer_admission_at_user_capacity ... ignored, release-only scale measurement; run without concurrent builds
test websocket::writer_tests::writer_ownership_capacity_unsigned_offsets_and_identity_reuse ... ok
test auth::tests::socket_tests::expired_handshake_releases_user_permits ... ok
test auth::tests::socket_tests::fragmented_wire_frame_has_a_completion_deadline ... ok
test auth::tests::socket_tests::half_open_sockets_obey_user_limit ... ok
test auth::tests::socket_tests::incomplete_rfc_message_still_loses_authority_on_revocation ... ok
test auth::tests::socket_tests::recovery_subscription_updates_every_signed_in_socket ... ok
test auth::tests::socket_tests::revoked_idle_socket_loses_all_authority ... ok
test auth::tests::stale_counters_recovery_cancellation_and_wrap_tampering ... ok
test result: ok. 108 passed; 0 failed; 9 ignored; 0 measured; 0 filtered out; finished in 154.36s
running 76 tests
test frame::checks::codec_reuse_measurement ... ignored, release codec and allocation-path measurement
test frame::checks::golden::every_frozen_message ... ok
test frame::checks::tests::golden_and_fragmented ... ok
test ring::checks::tests::wrap_and_exact_offsets ... ok
test frame::checks::tests::invalid_lengths_types_and_utf8 ... ok
test session::inputs::tests::identity_cap_preserves_all_existing_cursors ... ok
test frame::checks::approximate_snapshot_codec_is_bounded_and_canonical ... ok
test session::measurements::budgets::input_to_pty_write ... ignored, real-PTY performance measurement; set ZDOTDIR to tests/profile
test session::measurements::poll_storage_measurement ... ignored, release poll-storage allocation measurement
test session::inputs::tests::partial_writes_credit_only_the_owner_and_replay_trims_per_writer ... ok
test frame::checks::borrowed_and_owned_decoders_agree_at_every_fragment_boundary ... ok
test session::resize_checks::resize_refusal_session_probe ... ignored, isolated session probe invoked by its parent with a controlled shell profile
test session::sequenced_checks::coalesced_ack_never_overwrites_a_partial_output_and_cursors_survive_peer_loss ... ok
test session::sequenced_checks::new_frames_roundtrip_and_refuse_noncanonical_payloads ... ok
test session::sequenced_checks::reusable_encoder_retains_capacity_and_refuses_growth_before_mutation ... ok
test session::sequenced_checks::trim_duplicates_gaps_overflow_and_capacity_are_transactional ... ok
test session::sequenced_checks::writer_selection_has_a_frozen_little_endian_layout ... ok
test shell::tests::shell_hooks_append_after_user_configuration ... ok
test frame::checks::golden::exact_maximum_and_coalesced_frames ... ok
test session::lifecycle_checks::expired_raw_tail_is_refused_without_snapshot_substitution ... ok
test terminal::checks::tests::implicit_hyperlinks_retain_groups_across_rows_and_continuation ... ok
test terminal::checks::tests::fixtures_and_continuations_repaint ... ok
test terminal::checks::tests::alternate_variants_and_nested_switches_repaint ... ok
test terminal::checks::tests::margins_tabs_charsets_and_modes_continue ... ok
test terminal::checks::tests::long_unfinished_hyperlink_and_control_strings_continue ... ok
test terminal::checks::tests::retained_alternate_saved_cursor_and_keyboard_stack_continue ... ok
test terminal::checks::tests::partial_csi_and_utf8_continue ... ok
test terminal::checks::tests::pending_wrap_and_saved_wrap_continue_with_wide_cells ... ok
test terminal::fidelity::fidelity_charset_mapped_wide_space_is_explicitly_rejected ... ok
test terminal::checks::tests::byte_budget_prunes_history_and_resize_remains_repaintable ... ok
test terminal::fidelity::fidelity_diagnostic_fixture ... ignored, diagnostic replay of an explicitly selected fixture file
test terminal::checks::tests::saved_origin_survives_changed_margins ... ok
test terminal::fidelity::fidelity_extended_nightly ... ignored, nightly expanded differential corpus: 20,000 deterministic cases
test session::resize_checks::native_resize_refusal_preserves_peer_and_pty ... ok
test terminal::fidelity::fidelity_cursor ... ok
test terminal::fidelity::fidelity_fresh_c_redraw_default_is_explicitly_rejected ... ok
test terminal::checks::tests::unfinished_sequence_over_frame_limit_fails_without_losing_runtime_state ... ok
test terminal::fidelity::fidelity_inherited_protection_off_mode_is_explicitly_rejected ... ok
test terminal::fidelity::fidelity_edge ... ok
test terminal::fidelity::fidelity_f1_rep ... ok
test terminal::fidelity::fidelity_iso_protection_erase ... ok
test terminal::checks::approximate_repaint_keeps_complete_pending_syntax_or_omits_it_whole ... ok
test terminal::fidelity::fidelity_oracle_observes_archived_cells_with_equal_active_screens ... ok
test terminal::fidelity::fidelity_orphaned_spacer_head ... ok
test terminal::fidelity::fidelity_prompt_resize_requires_explicit_rejection ... ok
test shell::tests::installed_shells_load_the_additive_hooks ... ok
test terminal::fidelity::fidelity_oracle_detects_hidden_state ... ok
test terminal::fidelity::fidelity_iso_protection_does_not_keep_rep_scratch ... ok
test terminal::fidelity::fidelity_saved_modes_future_restore ... ok
test terminal::fidelity::fidelity_rejects_unrepresentable_rep_without_mutating_source ... ok
test terminal::fidelity::fidelity_seeded_nightly ... ignored, nightly differential corpus: 20,000 deterministic cases
test terminal::fidelity::fidelity_saved_cursor_over_changed_edge ... ok
test terminal::checks::approximate_repaint_is_bounded_clips_at_complete_cells_and_preserves_source ... ok
test terminal::fidelity::fidelity_single_shift_survives_rep_seed ... ok
test terminal::fidelity::fidelity_snapshot_history_tail_contains_no_padding_rows ... ok
test terminal::fidelity::fidelity_snapshot_resets_stale_viewer_color_overrides ... ok
test terminal::fidelity::fidelity_semantic_validation_matches_exported_history_extent ... ok
test terminal::fidelity::fidelity_screen_entry_consumes_inherited_shift_before_saving ... ok
test terminal::fidelity::fidelity_variation_tail_attributes ... ok
test terminal::fidelity::fresh_captures::fidelity_fresh_real_program_captures ... ignored, manual fresh capture oracle; set VT_CAPTURE_DIR after real program capture
test terminal::measurements::budgets::snapshot_200x60 ... ignored, performance measurement; run release on the perf host
test terminal::measurements::memory::measured_terminal_rss ... ignored, RSS measurement; run this filter alone in a fresh release process
test terminal::measurements::throughput::measured_parser ... ignored, VT observer and history throughput measurement
test terminal::recovery_measurements::measured_full_ring_reconstruction ... ignored, release reconstruction measurement; old healthy handles permit repeated cleanup
test terminal::resize_recovery::absent_ring_keeps_last_good_size_and_later_output_usable ... ok
test terminal::fidelity::fidelity_spacer_head_attributes ... ok
test terminal::resize_recovery::earlier_geometry_changes_require_approximation_even_with_origin_coverage ... ok
test terminal::resize_recovery::complete_ring_restores_screens_mouse_and_unfinished_syntax ... ok
test terminal_native::allocation::resize_allocation_refusal_retires_native_handle ... ok
test terminal::resize_recovery::ring_gap_requires_clean_approximate_recovery ... ok
test terminal::fidelity::fidelity_variation_wrap_attributes ... ok
test terminal::fidelity::fidelity_mouse_effective_fields_follow_order_independently_of_booleans ... ok
test terminal::fidelity::fidelity_recorded_corpus ... ok
test terminal::fidelity::fidelity_handwritten ... ok
test terminal::fidelity::fidelity_extended_smoke ... ok
test terminal::fidelity::fidelity_seeded_smoke ... ok
test result: ok. 64 passed; 0 failed; 12 ignored; 0 measured; 0 filtered out; finished in 57.77s
running 1 test
test closed_standard_descriptors_become_dev_null ... ok
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.94s
running 1 test
test faithful_snapshot_preserves_public_mouse_encoder_reports ... ok
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.51s
Doc-tests infraternal_agent
running 0 tests
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
Doc-tests infraternal_mesh
running 1 test
test crates/infraternal-mesh/src/model.rs - model::LocalPrivateKey (line 20) - compile fail ... ok
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.12s
Doc-tests infraternal_plugin_api
running 0 tests
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
Doc-tests infraternal_plugin_ssh
running 0 tests
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
Doc-tests infraternal_protocol
running 0 tests
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
Doc-tests infraternal_server
running 0 tests
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
Doc-tests infraternal_shim
running 0 tests
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
==> cargo-deny
warning[duplicate]: found 2 duplicate entries for crate 'base64'
┌─ /home/kayg/Developer/infraternal/.worktrees/session-life/Cargo.lock:24:1
│
24 │ ╭ base64 0.21.7 registry+https://github.com/rust-lang/crates.io-index
25 │ │ base64 0.22.1 registry+https://github.com/rust-lang/crates.io-index
│ ╰───────────────────────────────────────────────────────────────────┘ lock entries
│
├ base64 v0.21.7
├── base64urlsafedata v0.5.5
│ ├── webauthn-attestation-ca v0.5.5
│ │ └── webauthn-rs-core v0.5.5
│ │ └── webauthn-rs v0.5.5
│ │ └── infraternal-server v0.1.0
│ │ └── infraternal v0.1.0
│ ├── webauthn-rs v0.5.5 ()
│ ├── webauthn-rs-core v0.5.5 ()
│ └── webauthn-rs-proto v0.5.5
│ └── webauthn-rs-core v0.5.5 ()
├── webauthn-rs-core v0.5.5 ()
└── webauthn-rs-proto v0.5.5 ()
├ base64 v0.22.1
├── axum v0.8.9
│ └── infraternal-server v0.1.0
│ └── infraternal v0.1.0
├── infraternal-server v0.1.0 ()
└── sqlx-core v0.8.6
├── sqlx v0.8.6
│ ├── infraternal v0.1.0 ()
│ └── infraternal-server v0.1.0 ()
├── sqlx-macros v0.8.6
│ └── sqlx v0.8.6 ()
├── sqlx-macros-core v0.8.6
│ └── sqlx-macros v0.8.6 ()
└── sqlx-sqlite v0.8.6
├── sqlx v0.8.6 ()
└── sqlx-macros-core v0.8.6 ()
warning[duplicate]: found 3 duplicate entries for crate 'getrandom'
┌─ /home/kayg/Developer/infraternal/.worktrees/session-life/Cargo.lock:88:1
│
88 │ ╭ getrandom 0.2.17 registry+https://github.com/rust-lang/crates.io-index
89 │ │ getrandom 0.3.4 registry+https://github.com/rust-lang/crates.io-index
90 │ │ getrandom 0.4.3 registry+https://github.com/rust-lang/crates.io-index
│ ╰─────────────────────────────────────────────────────────────────────┘ lock entries
│
├ getrandom v0.2.17
└── rand_core v0.6.4
├── bip39 v2.2.2
│ └── infraternal-server v0.1.0
│ └── infraternal v0.1.0
├── crypto-common v0.1.7
│ ├── aead v0.5.2
│ │ └── aes-gcm v0.10.3
│ │ └── (dev) infraternal-server v0.1.0 ()
│ ├── cipher v0.4.4
│ │ ├── aes v0.8.4
│ │ │ └── aes-gcm v0.10.3 ()
│ │ ├── aes-gcm v0.10.3 ()
│ │ └── ctr v0.9.2
│ │ └── aes-gcm v0.10.3 ()
│ ├── digest v0.10.7
│ │ ├── blake2 v0.10.6
│ │ │ └── argon2 v0.5.3
│ │ │ └── infraternal-server v0.1.0 ()
│ │ ├── hmac v0.12.1
│ │ │ └── hkdf v0.12.4
│ │ │ └── (dev) infraternal-server v0.1.0 ()
│ │ ├── sha1 v0.10.7
│ │ │ ├── axum v0.8.9
│ │ │ │ └── infraternal-server v0.1.0 ()
│ │ │ └── tungstenite v0.29.0
│ │ │ └── tokio-tungstenite v0.29.0
│ │ │ ├── axum v0.8.9 ()
│ │ │ └── (dev) infraternal-server v0.1.0 ()
│ │ └── sha2 v0.10.9
│ │ ├── infraternal-server v0.1.0 ()
│ │ ├── sqlx-core v0.8.6
│ │ │ ├── sqlx v0.8.6
│ │ │ │ ├── infraternal v0.1.0 ()
│ │ │ │ └── infraternal-server v0.1.0 ()
│ │ │ ├── sqlx-macros v0.8.6
│ │ │ │ └── sqlx v0.8.6 ()
│ │ │ ├── sqlx-macros-core v0.8.6
│ │ │ │ └── sqlx-macros v0.8.6 ()
│ │ │ └── sqlx-sqlite v0.8.6
│ │ │ ├── sqlx v0.8.6 ()
│ │ │ └── sqlx-macros-core v0.8.6 ()
│ │ └── sqlx-macros-core v0.8.6 ()
│ └── universal-hash v0.5.1
│ └── polyval v0.6.2
│ └── ghash v0.5.1
│ └── aes-gcm v0.10.3 ()
├── password-hash v0.5.0
│ └── argon2 v0.5.3 ()
├── rand v0.8.8
│ └── bip39 v2.2.2 ()
└── rand_chacha v0.3.1
└── rand v0.8.8 ()
├ getrandom v0.3.4
└── rand_core v0.9.5
├── rand v0.9.5
│ ├── infraternal-server v0.1.0
│ │ └── infraternal v0.1.0
│ ├── tungstenite v0.29.0
│ │ └── tokio-tungstenite v0.29.0
│ │ ├── axum v0.8.9
│ │ │ └── infraternal-server v0.1.0 ()
│ │ └── (dev) infraternal-server v0.1.0 ()
│ └── webauthn-rs-core v0.5.5
│ └── webauthn-rs v0.5.5
│ └── infraternal-server v0.1.0 ()
└── rand_chacha v0.9.0
├── rand v0.9.5 ()
└── webauthn-rs-core v0.5.5 ()
├ getrandom v0.4.3
├── jobserver v0.1.35
│ └── cc v1.6.0
│ ├── (build) libfuzzer-sys v0.4.13
│ │ └── infraternal-fuzz v0.1.0
│ ├── (build) libsqlite3-sys v0.30.1
│ │ └── sqlx-sqlite v0.8.6
│ │ ├── sqlx v0.8.6
│ │ │ ├── infraternal v0.1.0
│ │ │ └── infraternal-server v0.1.0
│ │ │ └── infraternal v0.1.0 ()
│ │ └── sqlx-macros-core v0.8.6
│ │ └── sqlx-macros v0.8.6
│ │ └── sqlx v0.8.6 ()
│ ├── openssl-src v300.6.1+3.6.3
│ │ └── (build) openssl-sys v0.9.117
│ │ ├── axum-server v0.8.0
│ │ │ └── infraternal-server v0.1.0 ()
│ │ ├── openssl v0.10.81
│ │ │ ├── axum-server v0.8.0 ()
│ │ │ ├── infraternal-server v0.1.0 ()
│ │ │ ├── tokio-openssl v0.6.5
│ │ │ │ └── axum-server v0.8.0 ()
│ │ │ ├── webauthn-attestation-ca v0.5.5
│ │ │ │ └── webauthn-rs-core v0.5.5
│ │ │ │ └── webauthn-rs v0.5.5
│ │ │ │ └── infraternal-server v0.1.0 ()
│ │ │ └── webauthn-rs-core v0.5.5 ()
│ │ ├── tokio-openssl v0.6.5 ()
│ │ ├── webauthn-attestation-ca v0.5.5 ()
│ │ └── webauthn-rs-core v0.5.5 ()
│ └── (build) openssl-sys v0.9.117 ()
└── uuid v1.27.0
├── infraternal-agent v0.1.0
│ └── infraternal v0.1.0 ()
├── infraternal-server v0.1.0 ()
├── webauthn-attestation-ca v0.5.5 ()
├── webauthn-rs v0.5.5 ()
└── webauthn-rs-core v0.5.5 (*)
warning[duplicate]: found 2 duplicate entries for crate 'hashbrown'
┌─ /home/kayg/Developer/infraternal/.worktrees/session-life/Cargo.lock:94:1
│
94 │ ╭ hashbrown 0.15.5 registry+https://github.com/rust-lang/crates.io-index
95 │ │ hashbrown 0.17.1 registry+https://github.com/rust-lang/crates.io-index
│ ╰──────────────────────────────────────────────────────────────────────┘ lock entries
│
├ hashbrown v0.15.5
├── hashlink v0.10.0
│ └── sqlx-core v0.8.6
│ ├── sqlx v0.8.6
│ │ ├── infraternal v0.1.0
│ │ └── infraternal-server v0.1.0
│ │ └── infraternal v0.1.0 ()
│ ├── sqlx-macros v0.8.6
│ │ └── sqlx v0.8.6 ()
│ ├── sqlx-macros-core v0.8.6
│ │ └── sqlx-macros v0.8.6 ()
│ └── sqlx-sqlite v0.8.6
│ ├── sqlx v0.8.6 ()
│ └── sqlx-macros-core v0.8.6 ()
└── sqlx-core v0.8.6 ()
├ hashbrown v0.17.1
└── indexmap v2.14.2
├── h2 v0.4.19
│ └── hyper v1.11.1
│ ├── axum v0.8.9
│ │ └── infraternal-server v0.1.0
│ │ └── infraternal v0.1.0
│ ├── axum-server v0.8.0
│ │ └── infraternal-server v0.1.0 ()
│ └── hyper-util v0.1.21
│ ├── axum v0.8.9 ()
│ └── axum-server v0.8.0 ()
└── sqlx-core v0.8.6
├── sqlx v0.8.6
│ ├── infraternal v0.1.0 ()
│ └── infraternal-server v0.1.0 ()
├── sqlx-macros v0.8.6
│ └── sqlx v0.8.6 ()
├── sqlx-macros-core v0.8.6
│ └── sqlx-macros v0.8.6 ()
└── sqlx-sqlite v0.8.6
├── sqlx v0.8.6 ()
└── sqlx-macros-core v0.8.6 (*)
warning[duplicate]: found 2 duplicate entries for crate 'r-efi'
┌─ /home/kayg/Developer/infraternal/.worktrees/session-life/Cargo.lock:183:1
│
183 │ ╭ r-efi 5.3.0 registry+https://github.com/rust-lang/crates.io-index
184 │ │ r-efi 6.0.0 registry+https://github.com/rust-lang/crates.io-index
│ ╰─────────────────────────────────────────────────────────────────┘ lock entries
│
├ r-efi v5.3.0
└── getrandom v0.3.4
└── rand_core v0.9.5
├── rand v0.9.5
│ ├── infraternal-server v0.1.0
│ │ └── infraternal v0.1.0
│ ├── tungstenite v0.29.0
│ │ └── tokio-tungstenite v0.29.0
│ │ ├── axum v0.8.9
│ │ │ └── infraternal-server v0.1.0 ()
│ │ └── (dev) infraternal-server v0.1.0 ()
│ └── webauthn-rs-core v0.5.5
│ └── webauthn-rs v0.5.5
│ └── infraternal-server v0.1.0 ()
└── rand_chacha v0.9.0
├── rand v0.9.5 ()
└── webauthn-rs-core v0.5.5 ()
├ r-efi v6.0.0
└── getrandom v0.4.3
├── jobserver v0.1.35
│ └── cc v1.6.0
│ ├── (build) libfuzzer-sys v0.4.13
│ │ └── infraternal-fuzz v0.1.0
│ ├── (build) libsqlite3-sys v0.30.1
│ │ └── sqlx-sqlite v0.8.6
│ │ ├── sqlx v0.8.6
│ │ │ ├── infraternal v0.1.0
│ │ │ └── infraternal-server v0.1.0
│ │ │ └── infraternal v0.1.0 ()
│ │ └── sqlx-macros-core v0.8.6
│ │ └── sqlx-macros v0.8.6
│ │ └── sqlx v0.8.6 ()
│ ├── openssl-src v300.6.1+3.6.3
│ │ └── (build) openssl-sys v0.9.117
│ │ ├── axum-server v0.8.0
│ │ │ └── infraternal-server v0.1.0 ()
│ │ ├── openssl v0.10.81
│ │ │ ├── axum-server v0.8.0 ()
│ │ │ ├── infraternal-server v0.1.0 ()
│ │ │ ├── tokio-openssl v0.6.5
│ │ │ │ └── axum-server v0.8.0 ()
│ │ │ ├── webauthn-attestation-ca v0.5.5
│ │ │ │ └── webauthn-rs-core v0.5.5
│ │ │ │ └── webauthn-rs v0.5.5
│ │ │ │ └── infraternal-server v0.1.0 ()
│ │ │ └── webauthn-rs-core v0.5.5 ()
│ │ ├── tokio-openssl v0.6.5 ()
│ │ ├── webauthn-attestation-ca v0.5.5 ()
│ │ └── webauthn-rs-core v0.5.5 ()
│ └── (build) openssl-sys v0.9.117 ()
└── uuid v1.27.0
├── infraternal-agent v0.1.0
│ └── infraternal v0.1.0 ()
├── infraternal-server v0.1.0 ()
├── webauthn-attestation-ca v0.5.5 ()
├── webauthn-rs v0.5.5 ()
└── webauthn-rs-core v0.5.5 ()
warning[duplicate]: found 2 duplicate entries for crate 'rand'
┌─ /home/kayg/Developer/infraternal/.worktrees/session-life/Cargo.lock:185:1
│
185 │ ╭ rand 0.8.8 registry+https://github.com/rust-lang/crates.io-index
186 │ │ rand 0.9.5 registry+https://github.com/rust-lang/crates.io-index
│ ╰────────────────────────────────────────────────────────────────┘ lock entries
│
├ rand v0.8.8
└── bip39 v2.2.2
└── infraternal-server v0.1.0
└── infraternal v0.1.0
├ rand v0.9.5
├── infraternal-server v0.1.0
│ └── infraternal v0.1.0
├── tungstenite v0.29.0
│ └── tokio-tungstenite v0.29.0
│ ├── axum v0.8.9
│ │ └── infraternal-server v0.1.0 ()
│ └── (dev) infraternal-server v0.1.0 ()
└── webauthn-rs-core v0.5.5
└── webauthn-rs v0.5.5
└── infraternal-server v0.1.0 (*)
warning[duplicate]: found 2 duplicate entries for crate 'rand_chacha'
┌─ /home/kayg/Developer/infraternal/.worktrees/session-life/Cargo.lock:187:1
│
187 │ ╭ rand_chacha 0.3.1 registry+https://github.com/rust-lang/crates.io-index
188 │ │ rand_chacha 0.9.0 registry+https://github.com/rust-lang/crates.io-index
│ ╰───────────────────────────────────────────────────────────────────────┘ lock entries
│
├ rand_chacha v0.3.1
└── rand v0.8.8
└── bip39 v2.2.2
└── infraternal-server v0.1.0
└── infraternal v0.1.0
├ rand_chacha v0.9.0
├── rand v0.9.5
│ ├── infraternal-server v0.1.0
│ │ └── infraternal v0.1.0
│ ├── tungstenite v0.29.0
│ │ └── tokio-tungstenite v0.29.0
│ │ ├── axum v0.8.9
│ │ │ └── infraternal-server v0.1.0 ()
│ │ └── (dev) infraternal-server v0.1.0 ()
│ └── webauthn-rs-core v0.5.5
│ └── webauthn-rs v0.5.5
│ └── infraternal-server v0.1.0 ()
└── webauthn-rs-core v0.5.5 ()
warning[duplicate]: found 2 duplicate entries for crate 'rand_core'
┌─ /home/kayg/Developer/infraternal/.worktrees/session-life/Cargo.lock:189:1
│
189 │ ╭ rand_core 0.6.4 registry+https://github.com/rust-lang/crates.io-index
190 │ │ rand_core 0.9.5 registry+https://github.com/rust-lang/crates.io-index
│ ╰─────────────────────────────────────────────────────────────────────┘ lock entries
│
├ rand_core v0.6.4
├── bip39 v2.2.2
│ └── infraternal-server v0.1.0
│ └── infraternal v0.1.0
├── crypto-common v0.1.7
│ ├── aead v0.5.2
│ │ └── aes-gcm v0.10.3
│ │ └── (dev) infraternal-server v0.1.0 ()
│ ├── cipher v0.4.4
│ │ ├── aes v0.8.4
│ │ │ └── aes-gcm v0.10.3 ()
│ │ ├── aes-gcm v0.10.3 ()
│ │ └── ctr v0.9.2
│ │ └── aes-gcm v0.10.3 ()
│ ├── digest v0.10.7
│ │ ├── blake2 v0.10.6
│ │ │ └── argon2 v0.5.3
│ │ │ └── infraternal-server v0.1.0 ()
│ │ ├── hmac v0.12.1
│ │ │ └── hkdf v0.12.4
│ │ │ └── (dev) infraternal-server v0.1.0 ()
│ │ ├── sha1 v0.10.7
│ │ │ ├── axum v0.8.9
│ │ │ │ └── infraternal-server v0.1.0 ()
│ │ │ └── tungstenite v0.29.0
│ │ │ └── tokio-tungstenite v0.29.0
│ │ │ ├── axum v0.8.9 ()
│ │ │ └── (dev) infraternal-server v0.1.0 ()
│ │ └── sha2 v0.10.9
│ │ ├── infraternal-server v0.1.0 ()
│ │ ├── sqlx-core v0.8.6
│ │ │ ├── sqlx v0.8.6
│ │ │ │ ├── infraternal v0.1.0 ()
│ │ │ │ └── infraternal-server v0.1.0 ()
│ │ │ ├── sqlx-macros v0.8.6
│ │ │ │ └── sqlx v0.8.6 ()
│ │ │ ├── sqlx-macros-core v0.8.6
│ │ │ │ └── sqlx-macros v0.8.6 ()
│ │ │ └── sqlx-sqlite v0.8.6
│ │ │ ├── sqlx v0.8.6 ()
│ │ │ └── sqlx-macros-core v0.8.6 ()
│ │ └── sqlx-macros-core v0.8.6 ()
│ └── universal-hash v0.5.1
│ └── polyval v0.6.2
│ └── ghash v0.5.1
│ └── aes-gcm v0.10.3 ()
├── password-hash v0.5.0
│ └── argon2 v0.5.3 ()
├── rand v0.8.8
│ └── bip39 v2.2.2 ()
└── rand_chacha v0.3.1
└── rand v0.8.8 ()
├ rand_core v0.9.5
├── rand v0.9.5
│ ├── infraternal-server v0.1.0
│ │ └── infraternal v0.1.0
│ ├── tungstenite v0.29.0
│ │ └── tokio-tungstenite v0.29.0
│ │ ├── axum v0.8.9
│ │ │ └── infraternal-server v0.1.0 ()
│ │ └── (dev) infraternal-server v0.1.0 ()
│ └── webauthn-rs-core v0.5.5
│ └── webauthn-rs v0.5.5
│ └── infraternal-server v0.1.0 ()
└── rand_chacha v0.9.0
├── rand v0.9.5 ()
└── webauthn-rs-core v0.5.5 ()
warning[duplicate]: found 2 duplicate entries for crate 'syn'
┌─ /home/kayg/Developer/infraternal/.worktrees/session-life/Cargo.lock:226:1
│
226 │ ╭ syn 2.0.119 registry+https://github.com/rust-lang/crates.io-index
227 │ │ syn 3.0.6 registry+https://github.com/rust-lang/crates.io-index
│ ╰───────────────────────────────────────────────────────────────┘ lock entries
│
├ syn v2.0.119
├── asn1-rs-derive v0.5.1
│ └── asn1-rs v0.6.2
│ ├── der-parser v9.0.0
│ │ ├── webauthn-rs-core v0.5.5
│ │ │ └── webauthn-rs v0.5.5
│ │ │ └── infraternal-server v0.1.0
│ │ │ └── infraternal v0.1.0
│ │ └── x509-parser v0.16.0
│ │ └── webauthn-rs-core v0.5.5 ()
│ ├── oid-registry v0.7.1
│ │ └── x509-parser v0.16.0 ()
│ └── x509-parser v0.16.0 ()
├── asn1-rs-impl v0.2.0
│ └── asn1-rs v0.6.2 ()
├── openssl-macros v0.1.1
│ └── openssl v0.10.81
│ ├── axum-server v0.8.0
│ │ └── infraternal-server v0.1.0 ()
│ ├── infraternal-server v0.1.0 ()
│ ├── tokio-openssl v0.6.5
│ │ └── axum-server v0.8.0 ()
│ ├── webauthn-attestation-ca v0.5.5
│ │ └── webauthn-rs-core v0.5.5 ()
│ └── webauthn-rs-core v0.5.5 ()
├── sqlx-macros v0.8.6
│ └── sqlx v0.8.6
│ ├── infraternal v0.1.0 ()
│ └── infraternal-server v0.1.0 ()
├── sqlx-macros-core v0.8.6
│ └── sqlx-macros v0.8.6 ()
├── synstructure v0.13.2
│ └── asn1-rs-derive v0.5.1 ()
├── thiserror-impl v1.0.69
│ └── thiserror v1.0.69
│ ├── asn1-rs v0.6.2 ()
│ ├── webauthn-rs-core v0.5.5 ()
│ └── x509-parser v0.16.0 ()
├── tracing-attributes v0.1.31
│ └── tracing v0.1.44
│ ├── axum v0.8.9
│ │ └── infraternal-server v0.1.0 ()
│ ├── axum-core v0.5.6
│ │ └── axum v0.8.9 ()
│ ├── h2 v0.4.19
│ │ └── hyper v1.11.1
│ │ ├── axum v0.8.9 ()
│ │ ├── axum-server v0.8.0 ()
│ │ └── hyper-util v0.1.21
│ │ ├── axum v0.8.9 ()
│ │ └── axum-server v0.8.0 ()
│ ├── infraternal-server v0.1.0 ()
│ ├── sqlx-core v0.8.6
│ │ ├── sqlx v0.8.6 ()
│ │ ├── sqlx-macros v0.8.6 ()
│ │ ├── sqlx-macros-core v0.8.6 ()
│ │ └── sqlx-sqlite v0.8.6
│ │ ├── sqlx v0.8.6 ()
│ │ └── sqlx-macros-core v0.8.6 ()
│ ├── sqlx-sqlite v0.8.6 ()
│ ├── tower v0.5.3
│ │ ├── axum v0.8.9 ()
│ │ └── (dev) infraternal-server v0.1.0 ()
│ ├── tracing-subscriber v0.3.23
│ │ └── infraternal-server v0.1.0 ()
│ ├── webauthn-attestation-ca v0.5.5 ()
│ ├── webauthn-rs v0.5.5 ()
│ └── webauthn-rs-core v0.5.5 ()
└── zerocopy-derive v0.8.60
└── zerocopy v0.8.60
├── half v2.7.1
│ ├── ciborium-ll v0.2.2
│ │ └── ciborium v0.2.2
│ │ └── criterion v0.7.0
│ │ └── (dev) infraternal-protocol v0.1.0
│ │ ├── infraternal-agent v0.1.0
│ │ │ └── infraternal v0.1.0 ()
│ │ ├── infraternal-fuzz v0.1.0
│ │ └── infraternal-server v0.1.0 ()
│ └── serde_cbor_2 v0.13.0
│ ├── infraternal-server v0.1.0 ()
│ └── webauthn-rs-core v0.5.5 ()
└── ppv-lite86 v0.2.21
├── rand_chacha v0.3.1
│ └── rand v0.8.8
│ └── bip39 v2.2.2
│ └── infraternal-server v0.1.0 ()
└── rand_chacha v0.9.0
├── rand v0.9.5
│ ├── infraternal-server v0.1.0 ()
│ ├── tungstenite v0.29.0
│ │ └── tokio-tungstenite v0.29.0
│ │ ├── axum v0.8.9 ()
│ │ └── (dev) infraternal-server v0.1.0 ()
│ └── webauthn-rs-core v0.5.5 ()
└── webauthn-rs-core v0.5.5 ()
├ syn v3.0.6
├── clap_derive v4.6.7
│ └── clap v4.6.7
│ ├── criterion v0.7.0
│ │ └── (dev) infraternal-protocol v0.1.0
│ │ ├── infraternal-agent v0.1.0
│ │ │ └── infraternal v0.1.0
│ │ ├── infraternal-fuzz v0.1.0
│ │ └── infraternal-server v0.1.0
│ │ └── infraternal v0.1.0 ()
│ └── infraternal v0.1.0 ()
├── displaydoc v0.2.7
│ ├── asn1-rs v0.6.2
│ │ ├── der-parser v9.0.0
│ │ │ ├── webauthn-rs-core v0.5.5
│ │ │ │ └── webauthn-rs v0.5.5
│ │ │ │ └── infraternal-server v0.1.0 ()
│ │ │ └── x509-parser v0.16.0
│ │ │ └── webauthn-rs-core v0.5.5 ()
│ │ ├── oid-registry v0.7.1
│ │ │ └── x509-parser v0.16.0 ()
│ │ └── x509-parser v0.16.0 ()
│ ├── der-parser v9.0.0 ()
│ ├── icu_collections v2.3.0
│ │ ├── icu_normalizer v2.3.0
│ │ │ └── idna_adapter v1.2.2
│ │ │ └── idna v1.1.0
│ │ │ └── url v2.5.8
│ │ │ ├── infraternal-server v0.1.0 ()
│ │ │ ├── sqlx-core v0.8.6
│ │ │ │ ├── sqlx v0.8.6
│ │ │ │ │ ├── infraternal v0.1.0 ()
│ │ │ │ │ └── infraternal-server v0.1.0 ()
│ │ │ │ ├── sqlx-macros v0.8.6
│ │ │ │ │ └── sqlx v0.8.6 ()
│ │ │ │ ├── sqlx-macros-core v0.8.6
│ │ │ │ │ └── sqlx-macros v0.8.6 ()
│ │ │ │ └── sqlx-sqlite v0.8.6
│ │ │ │ ├── sqlx v0.8.6 ()
│ │ │ │ └── sqlx-macros-core v0.8.6 ()
│ │ │ ├── sqlx-macros-core v0.8.6 ()
│ │ │ ├── sqlx-sqlite v0.8.6 ()
│ │ │ ├── webauthn-rs v0.5.5 ()
│ │ │ ├── webauthn-rs-core v0.5.5 ()
│ │ │ └── webauthn-rs-proto v0.5.5
│ │ │ └── webauthn-rs-core v0.5.5 ()
│ │ └── icu_properties v2.3.0
│ │ └── idna_adapter v1.2.2 ()
│ ├── icu_locale_core v2.3.0
│ │ ├── icu_properties v2.3.0 ()
│ │ └── icu_provider v2.3.1
│ │ ├── icu_normalizer v2.3.0 ()
│ │ └── icu_properties v2.3.0 ()
│ ├── icu_properties v2.3.0 ()
│ ├── icu_provider v2.3.1 ()
│ ├── tinystr v0.8.4
│ │ └── icu_locale_core v2.3.0 ()
│ └── zerotrie v0.2.5
│ ├── icu_properties v2.3.0 ()
│ └── icu_provider v2.3.1 ()
├── futures-macro v0.3.34
│ └── futures-util v0.3.34
│ ├── axum v0.8.9
│ │ └── infraternal-server v0.1.0 ()
│ ├── futures-executor v0.3.34
│ │ └── sqlx-sqlite v0.8.6 ()
│ ├── infraternal-server v0.1.0 ()
│ ├── js-sys v0.3.106
│ │ └── web-sys v0.3.106
│ │ └── plotters v0.3.7
│ │ └── criterion v0.7.0 ()
│ ├── sqlx-core v0.8.6 ()
│ ├── sqlx-sqlite v0.8.6 ()
│ ├── tokio-tungstenite v0.29.0
│ │ ├── axum v0.8.9 ()
│ │ └── (dev) infraternal-server v0.1.0 ()
│ ├── tower v0.5.3
│ │ ├── axum v0.8.9 ()
│ │ └── (dev) infraternal-server v0.1.0 ()
│ └── tower-http v0.6.11
│ └── infraternal-server v0.1.0 ()
├── serde_derive v1.0.229
│ ├── serde v1.0.229
│ │ ├── base64urlsafedata v0.5.5
│ │ │ ├── webauthn-attestation-ca v0.5.5
│ │ │ │ └── webauthn-rs-core v0.5.5 ()
│ │ │ ├── webauthn-rs v0.5.5 ()
│ │ │ ├── webauthn-rs-core v0.5.5 ()
│ │ │ └── webauthn-rs-proto v0.5.5 ()
│ │ ├── bip39 v2.2.2
│ │ │ └── infraternal-server v0.1.0 ()
│ │ ├── ciborium v0.2.2
│ │ │ └── criterion v0.7.0 ()
│ │ ├── criterion v0.7.0 ()
│ │ ├── either v1.18.0
│ │ │ ├── axum-server v0.8.0
│ │ │ │ └── infraternal-server v0.1.0 ()
│ │ │ ├── itertools v0.13.0
│ │ │ │ ├── criterion v0.7.0 ()
│ │ │ │ └── criterion-plot v0.6.0
│ │ │ │ └── criterion v0.7.0 ()
│ │ │ ├── rayon v1.12.0
│ │ │ │ └── criterion v0.7.0 ()
│ │ │ ├── sqlx-core v0.8.6 ()
│ │ │ └── sqlx-macros-core v0.8.6 ()
│ │ ├── infraternal-agent v0.1.0 ()
│ │ ├── infraternal-mesh v0.1.0
│ │ ├── infraternal-server v0.1.0 ()
│ │ ├── serde_cbor_2 v0.13.0
│ │ │ ├── infraternal-server v0.1.0 ()
│ │ │ └── webauthn-rs-core v0.5.5 ()
│ │ ├── serde_urlencoded v0.7.1
│ │ │ ├── axum v0.8.9 ()
│ │ │ └── sqlx-sqlite v0.8.6 ()
│ │ ├── sqlx-core v0.8.6 ()
│ │ ├── sqlx-macros-core v0.8.6 ()
│ │ ├── sqlx-sqlite v0.8.6 ()
│ │ ├── tinytemplate v1.2.1
│ │ │ └── criterion v0.7.0 ()
│ │ ├── tracing-serde v0.2.0
│ │ │ └── tracing-subscriber v0.3.23
│ │ │ └── infraternal-server v0.1.0 ()
│ │ ├── tracing-subscriber v0.3.23 ()
│ │ ├── url v2.5.8 ()
│ │ ├── webauthn-attestation-ca v0.5.5 ()
│ │ ├── webauthn-rs v0.5.5 ()
│ │ ├── webauthn-rs-core v0.5.5 ()
│ │ └── webauthn-rs-proto v0.5.5 ()
│ └── url v2.5.8 ()
├── synstructure v0.14.0
│ ├── yoke-derive v0.8.4
│ │ └── yoke v0.8.3
│ │ ├── icu_collections v2.3.0 ()
│ │ ├── icu_provider v2.3.1 ()
│ │ ├── zerotrie v0.2.5 ()
│ │ └── zerovec v0.11.8
│ │ ├── icu_collections v2.3.0 ()
│ │ ├── icu_locale_core v2.3.0 ()
│ │ ├── icu_normalizer v2.3.0 ()
│ │ ├── icu_properties v2.3.0 ()
│ │ ├── icu_provider v2.3.1 ()
│ │ ├── potential_utf v0.1.6
│ │ │ └── icu_collections v2.3.0 ()
│ │ └── tinystr v0.8.4 ()
│ └── zerofrom-derive v0.1.8
│ └── zerofrom v0.1.8
│ ├── icu_collections v2.3.0 ()
│ ├── icu_provider v2.3.1 ()
│ ├── yoke v0.8.3 ()
│ ├── zerotrie v0.2.5 ()
│ └── zerovec v0.11.8 ()
├── thiserror-impl v2.0.21
│ └── thiserror v2.0.21
│ ├── infraternal v0.1.0 ()
│ ├── infraternal-mesh v0.1.0 ()
│ ├── infraternal-server v0.1.0 ()
│ ├── sqlx-core v0.8.6 ()
│ ├── sqlx-sqlite v0.8.6 ()
│ └── tungstenite v0.29.0
│ └── tokio-tungstenite v0.29.0 ()
├── tokio-macros v2.7.2
│ └── tokio v1.53.2
│ ├── axum v0.8.9 ()
│ ├── axum-server v0.8.0 ()
│ ├── fs-err v3.3.2
│ │ └── axum-server v0.8.0 ()
│ ├── h2 v0.4.19
│ │ └── hyper v1.11.1
│ │ ├── axum v0.8.9 ()
│ │ ├── axum-server v0.8.0 ()
│ │ └── hyper-util v0.1.21
│ │ ├── axum v0.8.9 ()
│ │ └── axum-server v0.8.0 ()
│ ├── hyper v1.11.1 ()
│ ├── hyper-util v0.1.21 ()
│ ├── infraternal v0.1.0 ()
│ ├── infraternal-agent v0.1.0 ()
│ ├── infraternal-server v0.1.0 ()
│ ├── sqlx-core v0.8.6 ()
│ ├── sqlx-macros-core v0.8.6 ()
│ ├── tokio-openssl v0.6.5
│ │ └── axum-server v0.8.0 ()
│ ├── tokio-stream v0.1.19
│ │ └── sqlx-core v0.8.6 ()
│ ├── tokio-tungstenite v0.29.0 ()
│ ├── tokio-util v0.7.19
│ │ ├── h2 v0.4.19 ()
│ │ └── tower-http v0.6.11 ()
│ ├── tower v0.5.3 ()
│ └── tower-http v0.6.11 ()
├── wasm-bindgen-macro-support v0.2.129
│ └── wasm-bindgen-macro v0.2.129
│ └── wasm-bindgen v0.2.129
│ ├── js-sys v0.3.106 ()
│ ├── plotters v0.3.7 ()
│ └── web-sys v0.3.106 ()
├── yoke-derive v0.8.4 ()
├── zerofrom-derive v0.1.8 ()
└── zerovec-derive v0.11.6
└── zerovec v0.11.8 (*)
warning[duplicate]: found 2 duplicate entries for crate 'synstructure'
┌─ /home/kayg/Developer/infraternal/.worktrees/session-life/Cargo.lock:229:1
│
229 │ ╭ synstructure 0.13.2 registry+https://github.com/rust-lang/crates.io-index
230 │ │ synstructure 0.14.0 registry+https://github.com/rust-lang/crates.io-index
│ ╰─────────────────────────────────────────────────────────────────────────┘ lock entries
│
├ synstructure v0.13.2
└── asn1-rs-derive v0.5.1
└── asn1-rs v0.6.2
├── der-parser v9.0.0
│ ├── webauthn-rs-core v0.5.5
│ │ └── webauthn-rs v0.5.5
│ │ └── infraternal-server v0.1.0
│ │ └── infraternal v0.1.0
│ └── x509-parser v0.16.0
│ └── webauthn-rs-core v0.5.5 ()
├── oid-registry v0.7.1
│ └── x509-parser v0.16.0 ()
└── x509-parser v0.16.0 ()
├ synstructure v0.14.0
├── yoke-derive v0.8.4
│ └── yoke v0.8.3
│ ├── icu_collections v2.3.0
│ │ ├── icu_normalizer v2.3.0
│ │ │ └── idna_adapter v1.2.2
│ │ │ └── idna v1.1.0
│ │ │ └── url v2.5.8
│ │ │ ├── infraternal-server v0.1.0
│ │ │ │ └── infraternal v0.1.0
│ │ │ ├── sqlx-core v0.8.6
│ │ │ │ ├── sqlx v0.8.6
│ │ │ │ │ ├── infraternal v0.1.0 ()
│ │ │ │ │ └── infraternal-server v0.1.0 ()
│ │ │ │ ├── sqlx-macros v0.8.6
│ │ │ │ │ └── sqlx v0.8.6 ()
│ │ │ │ ├── sqlx-macros-core v0.8.6
│ │ │ │ │ └── sqlx-macros v0.8.6 ()
│ │ │ │ └── sqlx-sqlite v0.8.6
│ │ │ │ ├── sqlx v0.8.6 ()
│ │ │ │ └── sqlx-macros-core v0.8.6 ()
│ │ │ ├── sqlx-macros-core v0.8.6 ()
│ │ │ ├── sqlx-sqlite v0.8.6 ()
│ │ │ ├── webauthn-rs v0.5.5
│ │ │ │ └── infraternal-server v0.1.0 ()
│ │ │ ├── webauthn-rs-core v0.5.5
│ │ │ │ └── webauthn-rs v0.5.5 ()
│ │ │ └── webauthn-rs-proto v0.5.5
│ │ │ └── webauthn-rs-core v0.5.5 ()
│ │ └── icu_properties v2.3.0
│ │ └── idna_adapter v1.2.2 ()
│ ├── icu_provider v2.3.1
│ │ ├── icu_normalizer v2.3.0 ()
│ │ └── icu_properties v2.3.0 ()
│ ├── zerotrie v0.2.5
│ │ ├── icu_properties v2.3.0 ()
│ │ └── icu_provider v2.3.1 ()
│ └── zerovec v0.11.8
│ ├── icu_collections v2.3.0 ()
│ ├── icu_locale_core v2.3.0
│ │ ├── icu_properties v2.3.0 ()
│ │ └── icu_provider v2.3.1 ()
│ ├── icu_normalizer v2.3.0 ()
│ ├── icu_properties v2.3.0 ()
│ ├── icu_provider v2.3.1 ()
│ ├── potential_utf v0.1.6
│ │ └── icu_collections v2.3.0 ()
│ └── tinystr v0.8.4
│ └── icu_locale_core v2.3.0 ()
└── zerofrom-derive v0.1.8
└── zerofrom v0.1.8
├── icu_collections v2.3.0 ()
├── icu_provider v2.3.1 ()
├── yoke v0.8.3 ()
├── zerotrie v0.2.5 ()
└── zerovec v0.11.8 ()
warning[duplicate]: found 2 duplicate entries for crate 'thiserror'
┌─ /home/kayg/Developer/infraternal/.worktrees/session-life/Cargo.lock:231:1
│
231 │ ╭ thiserror 1.0.69 registry+https://github.com/rust-lang/crates.io-index
232 │ │ thiserror 2.0.21 registry+https://github.com/rust-lang/crates.io-index
│ ╰──────────────────────────────────────────────────────────────────────┘ lock entries
│
├ thiserror v1.0.69
├── asn1-rs v0.6.2
│ ├── der-parser v9.0.0
│ │ ├── webauthn-rs-core v0.5.5
│ │ │ └── webauthn-rs v0.5.5
│ │ │ └── infraternal-server v0.1.0
│ │ │ └── infraternal v0.1.0
│ │ └── x509-parser v0.16.0
│ │ └── webauthn-rs-core v0.5.5 ()
│ ├── oid-registry v0.7.1
│ │ └── x509-parser v0.16.0 ()
│ └── x509-parser v0.16.0 ()
├── webauthn-rs-core v0.5.5 ()
└── x509-parser v0.16.0 ()
├ thiserror v2.0.21
├── infraternal v0.1.0
├── infraternal-mesh v0.1.0
├── infraternal-server v0.1.0
│ └── infraternal v0.1.0 ()
├── sqlx-core v0.8.6
│ ├── sqlx v0.8.6
│ │ ├── infraternal v0.1.0 ()
│ │ └── infraternal-server v0.1.0 ()
│ ├── sqlx-macros v0.8.6
│ │ └── sqlx v0.8.6 ()
│ ├── sqlx-macros-core v0.8.6
│ │ └── sqlx-macros v0.8.6 ()
│ └── sqlx-sqlite v0.8.6
│ ├── sqlx v0.8.6 ()
│ └── sqlx-macros-core v0.8.6 ()
├── sqlx-sqlite v0.8.6 ()
└── tungstenite v0.29.0
└── tokio-tungstenite v0.29.0
├── axum v0.8.9
│ └── infraternal-server v0.1.0 ()
└── (dev) infraternal-server v0.1.0 (*)
warning[duplicate]: found 2 duplicate entries for crate 'thiserror-impl'
┌─ /home/kayg/Developer/infraternal/.worktrees/session-life/Cargo.lock:233:1
│
233 │ ╭ thiserror-impl 1.0.69 registry+https://github.com/rust-lang/crates.io-index
234 │ │ thiserror-impl 2.0.21 registry+https://github.com/rust-lang/crates.io-index
│ ╰───────────────────────────────────────────────────────────────────────────┘ lock entries
│
├ thiserror-impl v1.0.69
└── thiserror v1.0.69
├── asn1-rs v0.6.2
│ ├── der-parser v9.0.0
│ │ ├── webauthn-rs-core v0.5.5
│ │ │ └── webauthn-rs v0.5.5
│ │ │ └── infraternal-server v0.1.0
│ │ │ └── infraternal v0.1.0
│ │ └── x509-parser v0.16.0
│ │ └── webauthn-rs-core v0.5.5 ()
│ ├── oid-registry v0.7.1
│ │ └── x509-parser v0.16.0 ()
│ └── x509-parser v0.16.0 ()
├── webauthn-rs-core v0.5.5 ()
└── x509-parser v0.16.0 ()
├ thiserror-impl v2.0.21
└── thiserror v2.0.21
├── infraternal v0.1.0
├── infraternal-mesh v0.1.0
├── infraternal-server v0.1.0
│ └── infraternal v0.1.0 ()
├── sqlx-core v0.8.6
│ ├── sqlx v0.8.6
│ │ ├── infraternal v0.1.0 ()
│ │ └── infraternal-server v0.1.0 ()
│ ├── sqlx-macros v0.8.6
│ │ └── sqlx v0.8.6 ()
│ ├── sqlx-macros-core v0.8.6
│ │ └── sqlx-macros v0.8.6 ()
│ └── sqlx-sqlite v0.8.6
│ ├── sqlx v0.8.6 ()
│ └── sqlx-macros-core v0.8.6 ()
├── sqlx-sqlite v0.8.6 ()
└── tungstenite v0.29.0
└── tokio-tungstenite v0.29.0
├── axum v0.8.9
│ └── infraternal-server v0.1.0 ()
└── (dev) infraternal-server v0.1.0 (*)
advisories ok, bans ok, licenses ok, sources ok
==> static builds
Finished
releaseprofile [optimized] target(s) in 0.50starget/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: 16273472 bytes (baseline 16142672 + allowance 262144 = max 16404816)
Finished
releaseprofile [optimized] target(s) in 0.54starget/aarch64-unknown-linux-musl/release/infraternal: ELF 64-bit LSB executable, ARM aarch64, version 1 (SYSV), statically linked, stripped
PT_INTERP: absent; size: 13697248 bytes (baseline 13555672 + allowance 262144 = max 13817816)
server subcommand: exit 2, not implemented
agent subcommand: exit 2, not implemented
+---------------------------+--------------+
| Rust gate | Result |
+---------------------------+--------------+
| fmt | PASS |
| VT native fmt | PASS |
| clippy | PASS |
| test | PASS |
| cargo-deny | PASS |
| static builds | PASS |
+---------------------------+--------------+
==> Vendored Ghostty artifact checksums
dist/ghostty-web.js: OK
dist/ghostty-vt.wasm: OK
dist/index.d.ts: OK
==> TypeScript protocol compiler
==> Tracer compiler, precompression and bundle transfer budget
bun install v1.4.2 (744846f84)
Checked 38 installs across 69 packages (no changes) [8.00ms]
$ bun x tsc --project tsconfig.json
bun test v1.4.2 (744846f84)
browser-build.test.ts:
(pass) the browser renderer has no unresolved Vite Node-file shim request [26.58ms]
precompress.test.ts:
(pass) text sidecars round-trip deterministically; compressed formats remain identity [37.18ms]
test/recovery-ui.test.ts:
(pass) compiled recovery UI mode off obeys its URL boundary [7.24ms]
(pass) compiled recovery UI mode preview obeys its URL boundary [7.78ms]
(pass) compiled recovery UI mode 1 obeys its URL boundary [2.25ms]
test/recovery-crypto.test.ts:
(pass) HKDF siblings match independent implementation and bind unwrap to domain, account, kind and version [11.10ms]
(pass) 100 repeated wrapping operations generate independent salts and nonces [15.37ms]
test/recovery-wait.test.ts:
(pass) server remaining wait 0s is accepted through the capability policy maximum [2.70ms]
(pass) server remaining wait 86400s is accepted through the capability policy maximum [1.20ms]
(pass) server remaining wait 90000s is accepted through the capability policy maximum [0.72ms]
(pass) server remaining wait 172800s is accepted through the capability policy maximum [0.60ms]
(pass) malformed or excessive remaining wait -1 is denied [3.30ms]
(pass) malformed or excessive remaining wait 0.5 is denied [1.03ms]
(pass) malformed or excessive remaining wait 172801 is denied [0.80ms]
(pass) malformed or excessive remaining wait 9007199254740992 is denied [0.89ms]
(pass) malformed or excessive remaining wait 90000 is denied [0.82ms]
test/recovery-rotation.test.ts:
(pass) signed-in rotation sends only a local envelope and verifier after acknowledgement [5.17ms]
(pass) abandoned word acknowledgement uploads nothing [3.29ms]
(pass) settled acknowledgement cannot upload later (dismissed) [1.89ms]
(pass) settled acknowledgement cannot upload later (no acknowledgement) [3.43ms]
20 pass
0 fail
376 expect() calls
Ran 20 tests across 6 files. [199.00ms]
$ bun run build.ts
built main.js, chunk-662np71y.js, chunk-6nhq7gz1.js, backdrop.worker.js, faulty-terminal.worker.js, chunk-5tj2qqhm.js, chunk-bg6rq3gy.js, chunk-c5rac8af.js, chunk-axbkkqp1.js, chunk-vfj76sc9.js
chunk-662np71y.js: identity=8373 gzip=3573 brotli=3175 bytes
chunk-5tj2qqhm.js: identity=9807 gzip=4014 brotli=3449 bytes
faulty-terminal.worker.js: identity=1084 gzip=559 brotli=478 bytes
backdrop.worker.js: identity=241 gzip=210 brotli=158 bytes
chunk-axbkkqp1.js: identity=90 gzip=90 brotli=78 bytes
chunk-vfj76sc9.js: identity=711965 gzip=206535 brotli=167390 bytes
chunk-bg6rq3gy.js: identity=185 gzip=149 brotli=130 bytes
chunk-6nhq7gz1.js: identity=6464 gzip=3106 brotli=2807 bytes
main.js: identity=87507 gzip=32671 brotli=28434 bytes
chunk-c5rac8af.js: identity=24649 gzip=8391 brotli=7510 bytes
JavaScript transfer: identity=850365 gzip=259298/307200 brotli=213609/256000 bytes
fonts/MapleMonoNF-Italic.latin.woff2: identity=37148 gzip=37148 brotli=37148 bytes
fonts/MapleMonoNF-Medium.latin.woff2: identity=33904 gzip=33904 brotli=33904 bytes
fonts/MapleMonoNF-Regular.latin.woff2: identity=32852 gzip=32852 brotli=32852 bytes
fonts/MapleMonoNF-SemiBold.latin.woff2: identity=34160 gzip=34160 brotli=34160 bytes
fonts/MapleMonoNF-SemiBoldItalic.latin.woff2: identity=38228 gzip=38228 brotli=38228 bytes
fonts/MapleMonoNF-symbols.woff2: identity=223748 gzip=223748 brotli=223748 bytes
Font transfer: critical=32852/36864 latin=176292/184320 symbols=223748/235520 bytes
==> Rust stream oracle (for the differential test)
==> TypeScript protocol tests
bun test v1.4.2 (744846f84)
src/codec.test.ts:
(pass) wire protocol golden vectors > encodes and decodes each frame exactly as the shared manifest describes [29.79ms]
(pass) wire protocol golden vectors > returns borrowed payload views and writes into reusable buffers [0.26ms]
(pass) wire protocol golden vectors > decodes muxed messages split across WebSocket messages [1.09ms]
(pass) wire protocol golden vectors > rejects oversized, non-canonical, unknown, and malformed frame bytes [0.28ms]
(pass) split mux header preserves trailing Close [0.52ms]
src/stream.test.ts:
stream differential: 141 streams, 13578 schedules, zero divergences
(pass) Rust and TypeScript preserve every frame at all boundaries and random multi-splits [4479.00ms]
(pass) maximum frame size and fragmented oversized prefix obey the allocation boundary [11.52ms]
7 pass
0 fail
40810 expect() calls
Ran 7 tests across 2 files. [4.54s]
Independent verification started on review-session-life at job head
4d6f98c9dd; merge base with devf27b3fe7a4. Read #100 and parent #98 history and author report. No implementation changes; confirmed gaps will receive committed failing tests.SL-R3 P1: Bash textless OSC 133 C resets capture to Fallback, appending first command output to stored rerun input. textless_command_marker_does_not_append_command_output fails: expected "printf xyz", got "printf xyzxyz" (crates/infraternal-agent/src/lifecycle.rs::complete_osc). A real Bash PTY also confirms output contamination. Failing test committed on review-session-life; implementation untouched. SL-R1 P2: 4096 invalid UTF-8 echoed bytes expand to 12288 metadata bytes; existing lifecycle_osc fuzz target reproduces its <=4096 assertion with sanitizer enabled. SL-R2 P2: real Bash with PROMPT_COMMAND=true emits no status-1 marker for false (two status-0 markers). Evidence logs under /home/kayg/.cache/codex-scratch/session-life-review/.
SL-R4 P1: lifecycle_exit_survives_broadcast_capacity_pressure fails against real SQLite in 0.43s: retained exits 0, expected 1, after 129 queued notices. The final command-status barrier persists, proving the reader completed the burst; the first exit was skipped by start_lifecycle_service on broadcast Lagged. EmbeddedAgent uses capacity 128 and the infraternal agent sends ExitAck after leg-B delivery, before SQLite persistence, so final screen/tail can be permanently lost. Failing test committed on review-session-life. Locations: crates/infraternal-server/src/runtime.rs::start_lifecycle_service and src/embedded.rs lifecycle_events. Evidence: /home/kayg/.cache/codex-scratch/session-life-review/broadcast-red.log.
SL-R5 P1: Bash input editing independently changes saved rerun commands. With three Readline backspaces replacing abc with xyz, edited_bash_input_is_exact_or_unavailable_for_rerun expects printf xyz or unavailable metadata, but gets "printf abc xyz". This test has no command output, isolating it from SL-R3. A real Bash PTY confirms the erase sequence. Committed failing test on review-session-life; crates/infraternal-agent/src/lifecycle.rs::feed. No implementation changes.
Evidence steps committed on review-session-life (implementation unchanged):
44cb8f0ftest(agent): expose edited Bash input retained as different command095643e7test(server): expose exit loss under lifecycle queue pressurec0587a51test(agent): expose command output entering rerun metadata22a6cc3ctest(shim): expose command status replaced by prompt hooks4d533bbctest(agent): expose expanded fallback command metadataConfirmed counts: P0=0, P1=3, P2=2, P3=0. Rust parser: oversized UTF-8 replacement 12288 > 4096 bytes; textless marker saved printf xyzxyz; edited input saved printf abc xyz. Real Bash PTY regression failed (1 failed, 1.76s): false reported status 0 with an existing prompt hook. Real SQLite queue regression failed (1 failed, 0.43s): 0 retained exits after 129 notices; barrier persisted. Existing lifecycle_osc target reproduced the <=4096 assertion with sanitizer enabled. Parser release microbenchmark (5 x 10MiB): 166.17, 156.71, 168.31, 127.42, 164.19 MiB/s, median 164.19. Host infraternal-dev x86_64, 8 cores, CPUWeight=10000, surrounding load samples 20.51/21.09/24.70 and 24.56/22.17/23.87. Exact job-head fast gate is running from detached scratch checkout with project artifacts cleaned.
Scale evidence: shipped SQL migrations applied to real SQLite 3.53.3, WAL/NORMAL, 50 accounts x 128 maximum-size exit payloads. One account/128 exits used 168128512 database bytes; 50 accounts/6400 exits used 8398704640 database bytes for 8388608000 payload bytes (maximum screen 1048576 + tail 262144 each). Completed in 77.27s on infraternal-dev, 8 cores, CPUWeight=10000, load 15.09 -> 26.09. This measures schema storage footprint, not server persistence throughput. The job-head fast gate at
4d6f98c9failed vt_credit t1-gate-faithful-1: producer 2097152 bytes incomplete at 1500.3ms, 65 notices, 0 repaints. Detached dev459070febaseline comparison is building in this load window as required by #118; all other gate rows are still running.Required #118 comparison: detached dev baseline
459070fe3bvt_credit passed 1/1 in 20.84s in the same load window (sampled load 16.44/19.41/21.19 -> 16.83/19.18/21.04). Job head4d6f98c9failed faithful grant=1 producer progress at 1500.3ms, 65 notices, no repaints. Therefore I cannot waive that head failure as a reproduced baseline failure. Repeating only the job-head credit test while the other fast-gate rows finish. Full baseline output will accompany the final verdict.Maximum-record storage claim independently reproduced: 128 exits with max screen/tail/command/cwd/name and duplicate session metadata occupy exactly 170278912 SQLite database bytes, matching the author. At D170 50-account scale, 6400 exits occupy 8506322944 database bytes for 8388608000 screen/tail payload bytes. Real SQLite 3.53.3, shipped migrations, WAL/NORMAL; infraternal-dev 8 cores, CPUWeight=10000, load 6.99 -> 11.73, 77.36s. Temporary database removed. This verifies storage footprint; no server/daemon RSS or persistence-throughput claim is inferred from this fixture.
Started repair round on branch
session-life, initial HEAD4d6f98c9dd772346272239960ba3e7852e4a2bbf; required merge target is localdevat459070fe3b75548382e8e19fba86af20439cf607. Read all #100 and parent #98 comments plus the continuation notes. I will reproduce the review regressions and gate each atomic fix. No push or deploy.Finding while merging required dev
459070fe: the merge has three content conflicts inscripts/agent_fixture.py,scripts/verify-agent-snapshot.py, andscripts/verify-vt-credit.py. The fixture conflicts overlap lifecycle control-stream/dynamic-session handling with dev's #118 credit-observation helpers; both behaviors are exercised by gates. I am combining them before committing the merge.Finding: merge
scripts/verify fastexited 1 (load 38.40/34.81/31.35 → 34.46/34.09/32.57).initial_attach_requires_explicit_credit_before_replaycould not createtarget/ac2736148because this run uses the required scratch CARGO_TARGET_DIR; static builds also failed because.cargo/musl-cc.shexpectstarget/auth-tools/zig/zig.repeated_tiny_credit_pauses_preserve_shell_progressreturned(15, "terminal shim disconnected")inscripts/agent_fixture.py::process. I am linking the ignored worktree target path to job scratch and isolating the snapshot probe before retrying.#118 comparison after the first merge-gate run: the detached dev
repeated_tiny_credit_pauses_preserve_shell_progresspassed 1/1 in 16.87s (load 30.94 → 20.97); the merged-head focused rerun passed 1/1 in 17.31s (load 20.74 → 20.77). The initial full parallel gate failure is not reproducible in the focused test and is not waived. The worktreetargetnow links to this job's scratch target; the full gate is rerunning.Finding: merged-tree
agent_review::repeated_tiny_credit_pauses_preserve_shell_progressfailed with(15, "terminal shim disconnected")(5/6 passed;scripts/verify fasttest gate returnedFAIL (101)). The detacheddevbaseline at459070fefailed the same test and error inagent_review(5/6 passed) in the same run window. This is the host-load-sensitive #118 row; all other fast-gate rows passed: fmt, VT native fmt, clippy, cargo-deny and static builds. Logs:$HOME/.cache/codex-scratch/session-life/merge-fast-rerun.logandbaseline-agent-review.log. Merged run load: 20.95→9.84; baseline run load: 37.67→37.67.Correction: the baseline test result in
baseline-agent-review.logis valid, but its wrapper tried to assign zsh's reservedstatusvariable after the test exited and omitted the before/after load line. Baseline completion load was 37.67; the start load was not captured. The merged gate's logged load was 20.95→9.84.Step complete: merged dev
459070feinto session-life as8a724f6fe9. Conflict resolution keeps lifecycle-aware fixture IDs/control handling and dev's credit accounting, barriers and retirement checks. The merged fast-gate output was| fmt | PASS |,| VT native fmt | PASS |,| clippy | PASS |,| test | FAIL (101) |,| cargo-deny | PASS |,| static builds | PASS |; test output: 5 passed, 1 failed (repeated_tiny_credit_pauses_preserve_shell_progress). Detached dev produced the same single test failure and(15, b'\x01\x00terminal shim disconnected'); see preceding finding/correction for load context. Ready for the regression-test repair sequence.Finding 1 (data loss): the cherry-picked
lifecycle_exit_survives_broadcast_capacity_pressuretest fails before the fix. After an exit plus 127 activity notices and a command-finished barrier,runtime.rs:754reportsexit count left: 0, right: 1. The lifecycle service currently reads a 128-slot broadcast receiver and handlesLaggedby continuing, so the exit is discarded with activity. Red-test log:$HOME/.cache/codex-scratch/session-life/exit-red.log.Finding 1 gated: the real-SQLite regression test and both queue tests pass (see
exit-green.logandqueue-tests.log).scripts/verify fastpassed fmt, VT native fmt, clippy, cargo-deny and both static builds; the test row was 5/6 becauserepeated_tiny_credit_pauses_preserve_shell_progressreturned(15, b'\x01\x00terminal shim disconnected'). Detached dev at459070feproduced the same 5/6 result and error inagent_reviewin the same window. This is the allowed #118 row; all other rows passed. Logs:exit-fast.log,exit-baseline-review.log; load: merged gate 29.73→38.01, baseline 37.90→35.47. Static binary sizes: x86_64 16,284,912 / 16,404,816-byte allowance; aarch64 13,711,464 / 13,817,816-byte allowance.Correction to the prior #118 comparison:
exit-baseline-review-final.logwas run withsession-lifeas its working directory, not the detached baseline, so that result is invalid. The correct run used the detached worktree at459070fe(exit-baseline-true.log) and passed 6/6 at load 27.65→28.45. Therefore the #118 exception does not apply to the merged tree's 5/6 result.The failure is reproducible in the current
scripts/verify-agent-snapshot.pyalone: after retiring client stream 1,Binary.attach()allocates stream 3 but carries stream 1's nonzero input cursor. The shim has a per-writer cursor for stream 3 starting at zero and closes it withterminal shim disconnected. Reusing stream 1 in an isolated scratch fixture passes the complete snapshot probe. I will reset input cursors when a fresh stream allocates a fresh writer before continuing the requested fixes.Merge conflict repair complete:
Binary.attach()now clears the per-writerenteredandackedcursors only when it allocates a fresh stream. Red evidence wasterminal shim disconnected; fixed snapshot-credit probe passed 1/1 in 17.63s. Commit:181b66968f.scripts/verify fastpassed at load 22.83→11.98; all server tests passed. Static sizes: x86_64 16,273,488 bytes (allowance 16,404,816); aarch64 13,697,144 (allowance 13,817,816). TypeScript protocol differential: 141 streams, 13,578 schedules, zero divergences.Verbatim Rust gate output:
Finding
095643e7confirmed: after 129 activity notices, the SQLite lifecycle row was missing (assertion left 0, right 1). Commit684aba04adds a bounded durable queue (128 notices, 12 MiB) with backpressure, plus a 128-session coalescing map for advisory activity; exits are never coalesced. The SQLite regression passed 1/1 and lifecycle queue tests passed 11/11. Fast gate load average: 11.12 16.07 21.41 before, 25.92 22.78 22.62 after. Binary sizes: x86_64 16,293,520 / 16,404,816-byte maximum; aarch64 13,719,992 / 13,817,816-byte maximum.+---------------------------+--------------+
| Rust gate | Result |
+---------------------------+--------------+
| fmt | PASS |
| VT native fmt | PASS |
| clippy | PASS |
| test | PASS |
| cargo-deny | PASS |
| static builds | PASS |
+---------------------------+--------------+
Refs: #100
Finding
22a6cc3cconfirmed on a real Bash PTY:bash_command_status_survives_existing_prompt_commandfails becausefalseemits no OSC 133 status 1 when.bashrcsetsPROMPT_COMMAND=true. The wrapper currently appends its status hook after user prompt commands, so$?has already changed. Fix in progress.Follow-up from the first full gate: the existing installed-shell test exposed an empty-PROMPT_COMMAND edge in the new scalar composition (Bash read
__infraternal_capture_status__infraternal_precmdas one command). The gate had 64 shim tests pass and this one fail. Added the missing separator; all 3 shell tests now pass, including the new nonzero-status regression. Re-running the full gate.Commit
702ce3depreserves Bash command status by capturing it before scalar or array PROMPT_COMMAND hooks. The new real-PTY regression failed first, then passed; after fixing the empty-hook separator, all 3 shell tests passed. Full fast gate load average: 16.29 19.40 20.08 before, 19.09 19.72 20.13 after. Binary sizes: x86_64 16,293,520 / 16,404,816-byte maximum; aarch64 13,719,992 / 13,817,816-byte maximum. TypeScript differential: 141 streams, 13,578 schedules, zero divergences.+---------------------------+--------------+
| Rust gate | Result |
+---------------------------+--------------+
| fmt | PASS |
| VT native fmt | PASS |
| clippy | PASS |
| test | PASS |
| cargo-deny | PASS |
| static builds | PASS |
+---------------------------+--------------+
Refs: #100
Finding
c0587a51confirmed:textless_command_marker_does_not_append_command_outputfails with the parser returningprintf xyzxyzinstead of the enteredprintf xyz. This reproduces the rerun metadata corruption after Bash's textless OSC 133 start marker.The first full fast gate for c058 reached all checks but the formatting row required
CommandState::Running { fallback_seen }on one line; tests, clippy, cargo-deny, and static builds passed. Applied rustfmt's exact correction and will rerun the gate.Commit
7ce19348keeps command text captured before a textless OSC 133 C marker and moves to running state afterward. The regression failed first withprintf xyzxyz, then passed 1/1. Full fast gate load average: 15.10 22.69 22.48 before, 15.42 17.81 19.75 after. Rust suites: server 112 passed/9 ignored, shim 65 passed/12 ignored, agent 14 passed; TypeScript differential: 141 streams, 13,578 schedules, zero divergences. Binary sizes: x86_64 16,293,520 / 16,404,816-byte maximum; aarch64 13,719,992 / 13,817,816-byte maximum.+---------------------------+--------------+
| Rust gate | Result |
+---------------------------+--------------+
| fmt | PASS |
| VT native fmt | PASS |
| clippy | PASS |
| test | PASS |
| cargo-deny | PASS |
| static builds | PASS |
+---------------------------+--------------+
Refs: #100
Finding
44cb8f0fconfirmed:edited_bash_input_is_exact_or_unavailable_for_rerunfails with command metadataprintf abc xyzafter Readline backspace echoes. The parser currently keeps the erase spaces, so run-again input differs from what was entered.The first full fast gate for 44cb reached all checks; formatting alone required the printable-byte condition on one line. Rust tests, clippy, cargo-deny, and static builds passed. Applied rustfmt's exact correction and will rerun the gate.
Commit
47835958marks fallback command metadata unavailable after backspace or delete while retaining the existing byte cap. The edited-input regression failed first withprintf abc xyz; all 11 lifecycle tests then passed. Full fast gate load average: 32.05 26.39 22.49 before, 13.64 15.77 18.55 after. Rust suites: server 112 passed/9 ignored, shim 65 passed/12 ignored, agent 14 passed. TypeScript differential: 141 streams, 13,578 schedules, zero divergences. Binary sizes: x86_64 16,293,584 / 16,404,816-byte maximum; aarch64 13,719,992 / 13,817,816-byte maximum.+---------------------------+--------------+
| Rust gate | Result |
+---------------------------+--------------+
| fmt | PASS |
| VT native fmt | PASS |
| clippy | PASS |
| test | PASS |
| cargo-deny | PASS |
| static builds | PASS |
+---------------------------+--------------+
Refs: #100
Finding
4d533bbcconfirmed: 4,096 invalid PTY bytes produce 12,288 bytes fromOscParser::command(), failingfallback_invalid_utf8_stays_inside_command_byte_limit. The raw capture is capped, but lossy UTF-8 conversion expands each invalid byte to a three-byte replacement character.Commit
29c62c44returns no command for invalid UTF-8 instead of expanding raw input into replacement characters. The regression failed first at 12,288 bytes for 4,096 input bytes; all 12 lifecycle tests then passed. Full fast gate load average: 12.51 14.45 17.74 before, 28.15 26.77 22.16 after. Rust suites: server 112 passed/9 ignored, shim 65 passed/12 ignored, agent 14 passed. TypeScript differential: 141 streams, 13,578 schedules, zero divergences. Binary sizes: x86_64 16,293,712 / 16,404,816-byte maximum; aarch64 13,720,120 / 13,817,816-byte maximum.+---------------------------+--------------+
| Rust gate | Result |
+---------------------------+--------------+
| fmt | PASS |
| VT native fmt | PASS |
| clippy | PASS |
| test | PASS |
| cargo-deny | PASS |
| static builds | PASS |
+---------------------------+--------------+
Refs: #100
Storage finding: current raw caps allow 1,310,720 bytes per exit (1 MiB screen + 256 KiB tail); 128 maximum-size records measured 170,278,912 B. A real shim 200x60 snapshot sample was 27,535 B. Exploratory zlib level 6 measured 695 B for that screen and 838 B for a repetitive 256 KiB tail; these are sizing samples, not the acceptance benchmark. Proposed additive local shim request will omit scrollback from persisted final screens; storage will compress the screen and retain a bounded output tail. I am measuring codec and SQLite row bounds before implementation. HEAD
29c62c4416.Codec sizing on infraternal-dev under systemd user scope (CPUWeight=10000, load before/after 21.56): real shim screen plus repetitive 8 KiB tail, 35,727 B total. LZ4 block: 1,023 B, p50 5 us, p99 32 us; DEFLATE fast: 1,007 B, p50 26 us, p99 197 us; Zstandard level 1: 572 B, p50 14 us, p99 119 us. A 35,727 B random sample compressed to 35,873 / 35,779 / 35,737 B respectively. Standalone release executable sizes were 477,104 / 509,448 / 1,048,712 B. I will use LZ4 block storage because it is the fastest and smallest candidate; persisted screens above the 40 KiB bound will be omitted, with the bounded output tail retained. These measurements are a codec spike, not the final SQLite scale measurement.
Dependency-only fast gate: 110 server tests passed, 2 failed, 9 ignored after 248.96 s. Failures were
auth::tests::server_setup_terminal_echo_and_resume_preserve_offsets_once(server closed the websocket while reading its next frame) andauth::tests::socket_tests::expired_handshake_releases_user_permits(expected HTTP 503 did not arrive). Static builds passed at x86_64 16,293,712 B and aarch64 13,720,120 B. Host load at gate end was 8.82 / 16.32 / 18.52. I am reproducing both failures in isolation before committing the dependency.Isolation results for the first fast-gate failures:
server_setup_terminal_echo_and_resume_preserve_offsets_oncepassed on the current branch (1 passed, 0 failed, 2.17 s).expired_handshake_releases_user_permitspassed on detached dev459070fe(1 passed, 0 failed, 0.86 s) and current branch (1 passed, 0 failed, 0.77 s). Host loads were 18.16/19.83/19.59 and 17.03/19.57/19.51. The initial full-gate failures are not reproduced in isolation; a new full gate is still required. Codec dependency now enables only std and safe block encode/decode features, removing unused frame support.Fail-first storage regression reproduced: a maximum-size high-entropy 1 MiB screen plus 256 KiB tail persisted 1,310,863 bytes for one exit (reserved SQLite row overhead included), exceeding the 65,536-byte budget. Test result: 0 passed, 1 failed. Host load was 51.75/37.53/26.45. The focused run is saved at
$HOME/.cache/codex-scratch/session-life/exit-storage-red.log.Contract proposal before code: add capability bit 4 and frame 0x22
SnapshotRequestWithTail(u16)to the frozen local shim protocol. The request caps history rows at 256; exit persistence requests zero rows, while normal reconnect snapshots keep their existing 256-row behavior. New agents fall back toSnapshotRequestwhen an older shim does not advertise the capability. This is additive and leaves the web wire event unchanged.Step complete: added the bounded-storage codec dependency. Candidate data and selection are recorded above. Commit
77d46f26; codec tests pass 2/2 (0.32 s). Lifecycle storage tests pass 13/13 with one release-only scale case ignored; incompressible 1 MiB screen is omitted and the stored tail plus metadata is 8,335 B against the 65,536 B cap. Load during the focused run was 41.03/41.82/34.86.Step complete: migration 0015 adds a version column and SQLite guards for 40 KiB screens / 8 KiB tails, while allowing version-zero rows for startup compaction. Commit
c31d4ee1. The lifecycle migration/compaction test passes in the 13-test focused lifecycle gate; a second compaction pass is a no-op.Step complete: added the versioned exit payload encoder and its module tests. Commit
74686b94.exit_storage::testspasses 2/2 (0.32 s): compressible 1 MiB screen round-trips; a high-entropy screen is omitted without truncating the block; the newest 8,192 tail bytes are retained.Step complete: server exit writes now use bounded payloads; startup upgrades version-zero rows in batches before requests are served. Commit
6380edf9. Focused lifecycle gate: 13 passed, 0 failed, 1 release-only scale test ignored (17.64 s). High-entropy 1 MiB screen evidence: 8,335 B retained row estimate including metadata/reserve, under 65,536 B. Legacy compaction and second-pass idempotence pass.Step complete: shim capability bit 4 and SnapshotRequestWithTail (0x22) now select 0–256 scrollback rows; legacy SnapshotRequest and normal reconnect snapshots remain at 256. Commit
8126a4a0. Full shim unit gate passes: 67 passed, 12 ignored, 0 failed, 199.98 s. The capability/range test and zero-history visible-row test pass.Step complete: infraternal agents now retain only the newest 8,192 PTY output bytes and request zero-row final snapshots when capability bit 4 is selected, falling back to the legacy request for older shims. Commit
3fd27ac2. Agent unit gate passes: 30 passed, 2 ignored, 0 failed (0.07 s).Step complete: contracts now specify the per-exit storage bound and additive snapshot-tail capability. Commit
23b5f472. The documented scale envelope is 50 × 128 exits × 64 KiB = 400 MiB maximum row-content budget.Finding: the new regression test failed before the fix.
empty_screen_uses_the_omitted_screen_sentinelobserved thatencode(&[], &[])stored a nonempty four-byte LZ4 size header (0/1 passed,exit_storage.rs:88). This would make startup compaction populate the screen column of an empty legacy tombstone. Fixing the encoder to preserve the empty omitted-screen sentinel.Fix complete: empty screens now remain a zero-byte sentinel through compaction. Commit
862410a6. The new test reproduced the four-byte header failure before the change (0/1); afterward all 3 encoder tests pass in 0.05 s, including compressible round-trip, empty sentinel and incompressible fallback.D170 scale measurement passed on infraternal-dev (8 cores), under the required weighted scope. At 50 accounts × 128 exits: 6,400 rows, 40,869 B stored screen + 8,192 B tail, maximum estimated record 57,381 B / 65,536 B, total row-content estimate 367,238,400 B, SQLite pages 371,486,720 B, insertion 1,303 ms. Load at measurement: 9.47/19.64/25.09. Release scale test passed 1/1.
Snapshot benchmark observation: first weighted run is inconclusive under shared host load. On infraternal-dev (8 cores; load 8.19/18.86/24.74), normal 200×60 snapshot measured p50 0.737 ms / p99 6.394 ms / 27,535 B and exceeded the existing 2 ms p99 test assertion. No code conclusion from this run; repeat in the quiet window with the dev/current reconnect comparison.
Snapshot budget repeat passed on infraternal-dev (8 cores) under the weighted scope. Load was 4.59/11.27/18.28 at start and 4.47/11.13/18.20 at finish. Normal 200×60 + 256-line snapshot: p50 0.662 ms, p99 1.433 ms, 27,535 B. Exit 200×60 + zero scrollback: p50 0.125 ms, p99 0.253 ms, 5,966 B. Both remain below the 2 ms p99 budget (1/1 test passed).
Finding: the current release build warns that
Terminal::snapshotis unused (crates/infraternal-shim/src/terminal.rs:199). The new session path calledsnapshot_with_tail(256)directly, leaving the existing default API unused in production. I’ll route normal 256-row snapshots throughsnapshot()and reservesnapshot_with_tailfor nondefault requests; this preserves the 256-row reconnect behavior and clearsclippy -D warnings.The shim clippy gate caught one follow-up style error in the new default-snapshot branch:
semicolon_if_nothing_returnedatsession.rs:355after routing the 256-row case throughsnapshot(). Adding the semicolon, then rerunning the targeted gate.Fix complete: the normal 256-row request now uses
Terminal::snapshot(), while nondefault row counts usesnapshot_with_tail(). Commit68f1a2f8. Targeted shim clippy passes with-D warnings; capability/range and zero-history visible-row tests pass 1/1 each.Finding from final fast: workspace clippy fails on three new test assertions in
exit_storage.rs(lines 91, 92, 102), allassert_is_emptyunder pedantic-D warnings. Replacing them with explicit empty-array equality assertions, then rerunning the full fast gate.Fix complete: the three storage tests now use explicit empty-array equality assertions. Commit
f67888f3. Server clippy passes with-D warnings(12.67 s), and all 3 encoder tests pass (0.04 s).Fast gate step complete at head
f67888f3. All Rust gate rows and TypeScript checks pass. Static binaries: x86_64 16,318,128 B (limit 16,404,816); aarch64 13,734,600 B (limit 13,817,816).Verbatim Rust gate summary:
+---------------------------+--------------+
| Rust gate | Result |
+---------------------------+--------------+
| fmt | PASS |
| VT native fmt | PASS |
| clippy | PASS |
| test | PASS |
| cargo-deny | PASS |
| static builds | PASS |
+---------------------------+--------------+
Verbatim TypeScript protocol summary:
stream differential: 141 streams, 13578 schedules, zero divergences
7 pass
0 fail
40810 expect() calls
Ran 7 tests across 2 files. [2.94s]
Latency-run setup finding: the dev profile reached
verify-latency.pybut its native stage stopped before measurements because the per-job fixture path exceeded AF_UNIXsun_path(110 bytes). The chosenrt-devroot was too long; this is fixture configuration, not a code result. Retrying with the shorter$HOME/.cache/codex-scratch/session-life/rtroot; dev/current native measurements will be back to back with load recorded.Same-window reconnect check on infraternal-dev under
systemd-run --user --scope -p CPUWeight=10000, targetedapps/tracer/test/terminal.spec.tstest (20 reconnect samples), RTT 300 ms, dev then current, no source changes in tracer UI. Dev459070fe:METRIC name=reconnect_resumed source=tracer-production-build n=20 p50_ms=713.00 p99_ms=962.60 budget_ms=900 result=FAIL. Currentf67888f3:METRIC name=reconnect_resumed source=tracer-production-build n=20 p50_ms=730.60 p99_ms=992.40 budget_ms=900 result=FAIL. One-minute load ranged 1.73–3.33; five-minute 3.05–4.24; fifteen-minute 7.09–8.82. Current is 29.80 ms above dev p99 in this pair; both exceed the gate. Logs:$HOME/.cache/codex-scratch/session-life/reconnect-dev.logandreconnect-current.log. Since this test uses the same tracer test double on both revisions and the branch has no tracer UI changes, this single pair does not establish a branch-caused latency change. The full baseline latency script's native stage separately failed before measurement because its state path was 110 bytes; rerunning native comparison with a shorter root is next.Finding during native latency comparison: dev
459070fecompleted the same-session flood stage withkeystroke_pty_echo_flood_same_sessionp99 564.52 ms (budget 334 ms) and 242.92 ms growth (budget 16.67 ms), after the baseline and other-session stages passed. Current release binary completed baseline/other-session stages at 20 samples (p99 324.89/320.01 ms) but produced no same-session metric within 120 seconds; the fixture was blocked inagent_fixture.py:65(sock.recv) while the currentinfraternalprocess used 76% CPU. The 100-sample current run showed the same stall and was interrupted after 5 minutes. Short state root avoided the earlier AF_UNIX path issue. This is a current-branch performance finding; root cause is under investigation. Logs:native-dev.log,native-current.log,native-current-20.logunder$HOME/.cache/codex-scratch/session-life.Causal probe (diagnostic build only): with shell hooks disabled, suppressing the lifecycle watcher reduced current same-session PTY echo from 940.02 ms to 349.90 ms for one sample; dev was 337.94 ms. Current with the watcher enabled repeated at 910.69 ms and 940.02 ms. Baseline and other-session echoes remained around 280–320 ms. This localizes the flood overhead to the lifecycle observer’s additional output path; it does not isolate the parser from relay work. The diagnostic source edit and binary were restored byte-for-byte; tracked tree is clean. Host load rose above 17 during follow-up builds/tests, so I’m not treating the flood comparison as a final gate result.
Step complete: added direct
memchrdependency for the lifecycle parser fast path, reusing locked 2.8.3 rather than adding a scanner implementation.cargo check -p infraternal-agent --libpassed in 6.01 s. Commit0cb2b1ed.Step complete: added
memchrto the separate fuzz package because its target includes the production parser module directly.cargo check --manifest-path fuzz/Cargo.toml --bin lifecycle_oscpassed in 0.78 s under Zig 0.15.2. Commit2e3ed68e.Parser hot-path step complete:
0c4b9410. The regression test first failed at 65,536 per-byte parser visits for 65,536 ordinary output bytes; it now passes with fewer than 1,024 visits and confirms prompt recognition across the next chunk. Agent library tests: 30 passed, 0 failed, 2 ignored. Clippy passed (0.77 s). Lifecycle OSC fuzzing completed 112,961 runs in 6 s, without sanitizer because the configured sanitizer runtime did not link on this toolchain. The fast path only handles chunks without ESC or spaces; all other bytes retain the existing parser path.Latency diagnostic finding (not a quiet-window comparison): the 20-sample dev run logged
keystroke_pty_echo_flood_same_sessionp99 513.31 ms (334 ms budget) and same-session flood growth 191.55 ms (16.67 ms budget); baseline p99 was 321.76 ms. Other-session growth passed at -14.14 ms. The run finished with host load 10.20/15.14/11.93 and subsequent load remained above 11; log:$HOME/.cache/codex-scratch/session-life/native-dev-20-diag.log. The optimized current run was previously interrupted when load reached 22.34, before same-session samples. These measurements cannot establish the requested quiet-window delta. I will retry only when this host has a quiet window.Committed change and required fast gate complete at
0c4b9410; systemd scope result wassuccess. Rust result: 54 tests across 12 files passed, 0 failed, 9,930 expect() calls. TypeScript protocol result: 7 passed, 0 failed, 40,810 expect() calls; differential: 141 streams, 13,578 schedules, zero divergences. Static sizes: x86_64 16,319,184 / 16,404,816 B; aarch64 13,736,056 / 13,817,816 B. Host load at gate completion: 24.20/19.11/14.91, so this is gate evidence, not latency evidence.Fast-gate Rust summary, verbatim:
Current status: code fixes and
scripts/verify fastare complete at0c4b9410. Comparative native flood and access-screen runs remain pending: this host is still occupied (load 24.33/16.24/14.78; 17 active systemd scopes). The earlier optimized native 100-sample run was interrupted at load 22.34 before same-session samples; the loaded dev diagnostic and earlier reconnect pair are recorded above. A quiet infraternal-dev window is needed to finish the performance comparison. I am continuing to monitor for one.Independent re-verification started on review-session-life at target
0c4b94108f; merge base with dev459070fe3b. Continuing prior SL-R1 through SL-R5 evidence and repair history on #100; checking fixes, restart/rerun ordering, bounded storage and performance. No implementation changes, push or deploy.SL-R6 P2 confirmed at target
0c4b9410: finish_fallback completes an OSC-integrated command with status -1 if its output ends in user$ and settles 500ms. It clears Running, so subsequent real OSC D;7 is ignored. Failing normal-location test integrated_command_output_does_not_trigger_prompt_fallback committed on review-session-life; assertion actual Some(CommandFinished {status:-1,finished_at:500}), expected None. Standalone harness compiles the actual repository module. No implementation change.SL-R7 P2: D183 additive Bash hooks change the status seen by existing PROMPT_COMMAND. Real PTY test bash_user_prompt_command_observes_original_status fails (0/1, 0.73s): after false the user hook observes 0, because __infraternal_capture_status ends with a successful assignment. The integration status marker is preserved, but the user hook status is not. Committed failing test on review-session-life; no implementation fix.
SL-R8 P1: Bash Ctrl-U editing still saves a different executable command after SL-R5 repair. A real Readline PTY replaces printf abc with printf xyz using CR + six CSI C cursor moves + CSI K erasure. Parser test bash_line_redraw_is_exact_or_unavailable_for_rerun fails: actual printf abc, expected printf xyz or unavailable. The CR changes capture to Running; cursor/erase controls do not invalidate saved input. Failing test committed on review-session-life; real PTY capture and red log under $HOME/.cache/codex-scratch/session-life-review/. No implementation change.
Source-head fast gate setup error: TMPDIR path plus the setup-token fixture suffix exceeded AF_UNIX SUN_LEN in runtime::tests::setup_token_socket_is_private_and_requires_explicit_request; server suite 116 passed/1 failed/10 ignored. This is review harness configuration. Re-run uses shorter owned $HOME/.cache/codex-scratch/slr/t; no source or deadline changes. Prior SL-R1 through SL-R5 regressions pass; parser 12/12 and shell 3/3 independently rerun. ASAN lifecycle fuzz: 310250 executions/31s, no crash. Storage fixture reproduced 6400 rows,57381B maximum record,367238400B row estimate,371486720B SQLite pages; debug insertion5064ms at load41.47 (not a release throughput comparison).
SL-R9 P1: rerun can wait indefinitely when observer connects after prompt output and ReadFrom legally substitutes SnapshotWithFlags. observe_session ignores the snapshot and does not recover retained raw OSC prompt metadata. Normal Cargo test rerun_recovers_prompt_metadata_after_snapshot_substitution fails (2.01s): actual no input, expected printf restored newline. Real Unix-socket handshake and frozen shim codec; fixture supports a raw prompt replay if requested. Test committed on review-session-life; location tests/unit/lifecycle_resume.rs. No implementation fix.
Re-verification of earlier SL-R1 through SL-R5: parser12/12 and shell3/3 focused regressions pass; source-head SQLite lifecycle_exit_survives_broadcast_capacity_pressure also passed. Existing storage scale reproduced exact author byte counts:6400 exits,40869B screen,8192B tail,57381B max estimated record,367238400B row estimate,371486720B pages. Debug insertion5064ms at load41.47/32.27/25.65; no release timing claim. ASAN lifecycle_osc fuzz310250 runs/31s, no crash. New failing tests committed separately: SL-R6 ad344bb0,SL-R7 2a2206f9,SL-R8 5a184aec,SL-R9 c5e4551c. Current new counts P0=0,P1=2,P2=2,P3=0. Source-head fast initially failed fixture SUN_LEN due review TMPDIR; the isolated test passes with short scratch alias s9. Full corrected gate follows after initial static builds.
SL-R9 concrete trigger verified: startup output wraps the ring between Hello and ReadFrom, so the ready prompt arrives only in the snapshot. Refined normal Cargo regression still fails (2.00s, no initial input). Production musl shim with a 64B ring independently returned head201, ReadFrom response0x1c (flagged snapshot183B), and raw replay retained OSC133 A in64B. Test commit amended to model default-ring wrap explicitly; no implementation change. Raw logs under session-life-review/snapshot-readiness-red.log and real-prompt-recovery.log.
Target
0c4b94108f: independent scripts/verify fast exited 0. Full output verbatim, part 1/3. Short owned scratch alias s9 fixes fixture SUN_LEN; no source changes or baseline exemption.Full gate output
Target
0c4b94108f: independent scripts/verify fast exited 0. Full output verbatim, part 2/3. Short owned scratch alias s9 fixes fixture SUN_LEN; no source changes or baseline exemption.Full gate output
Target
0c4b94108f: independent scripts/verify fast exited 0. Full output verbatim, part 3/3. Short owned scratch alias s9 fixes fixture SUN_LEN; no source changes or baseline exemption.Full gate output
kayg referenced this issue2026-10-28 17:53:56 +00:00