A slow access check closes the whole browser connection #240
Closed
opened 2026-10-17 14:06:08 +00:00 by kayg
·
215 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#240
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?
Production reliability fix, split out of the app-windows work (#146).
Finding (app-windows-ship
c7169cb78, commitff845df22): every frame a browser socket handles — terminal input and output, action calls, desktop input — first reads the session's authority from SQLite with a fixed 25 ms deadline. One read that misses that deadline closes the whole socket, terminals included. On a busy server this is a likely cause of "Reconnects" and "The connection to the server ended." (#227, #234).Fix: a read that misses its deadline is a busy store, not a refusal. It is retried (5 ms doubling to 100 ms pauses) for at most 1 s while the socket's work waits — frames stay in order, none lost. A refusal or store error still closes at once; a store stuck past 1 s still closes (fail-closed); the session deadline is measured from the wall clock after the read, so a slow store can never extend a session.
Plan: branch
authority-read-retryofforigin/release-prod-live; cherry-pick only the fix + its tests; failing test first; a terminal-only socket stall test (100–800 ms); perf-VM count of socket closes before/after with injected stalls, and per-frame added latency on fast reads;scripts/verify fast; size vs release-prod-live (D243).Refs #146 #227 #234
Start. Branch
authority-read-retry, baseorigin/release-prod-live3048580c11.Source of the fix:
ff845df22on app-windows-ship ("hold a socket's work through a slow authority read instead of closing it"). It touches onlywebsocket.rs(read_authority + three call sites) and addssocket_tests/transient_authority_stall.rs; nothing app-windows-specific. The cherry-pick conflicts only on a native-diagnosticseprintln!block that is not on the production line, so I re-apply the same change by hand without it.Next: tests first on unmodified prod (expect red), plus a new terminal-only test (100/300/800 ms stalls, input and output order checked).
Findings so far (branch
authority-read-retry, pushed at73f410984).Red on release-prod-live
3048580c1(tests added, websocket.rs unchanged):Green with the fix (
fd54530ed): 3 passed. Server authority/socket/websocket filters: 72 passed, 0 failed.Policy change in #189 tests (please review): three
websocket_authority_testscases pinned "a periodic read whose operation is frozen or holds the only connection fails at exactly one 25 ms deadline". With the fix they hung, because the paused clock never reached the new 1 s bound. They now step through the bounded wait and also assert the result does not come before half the wait or after wait + 25 ms. Every safety assertion stays the same: no side effect after a revocation or expiry, the result is Err, and the owned value is dropped. In practice, when a revoked socket's frozen operation holds the only pool connection, the socket now closes in up to 1 s instead of 25 ms. Production has 8 connections.Harness pitfalls found and fixed in the measurement (not server bugs): a test browser that does not answer the server's liveness Pings is closed after the proof budget (2 s at first, then about 300 ms once the RTT is learned). Without TCP_NODELAY on the test listener, echo p50 was 35–40 ms from delayed ACKs. Production sets nodelay (runtime.rs:328).
Local soak (build host, load ~10–16, 10 s, 4 terminals, 5 stalls of 50–300 ms): before 16 closes, 1607 echoes; after 0 closes, 4004 echoes. Without stalls, the before build had 0 closes. Perf VM numbers follow.
Finished. Branch
authority-read-retry, head61dc21e333(base release-prod-live3048580c1). Pushed.Commits:
fd54530edfix(server): hold a socket's work through a slow authority read instead of closing it73f410984test(server): ignored soak and echo-latency harness for slow authority readseec9d1421test(server): satisfy pedantic clippy in the #240 stall tests and harness. Note:fd54530edand73f410984alone fail clippy (tests only). Squash on merge if each commit must pass the gate.61dc21e33perf(server): compile the authority read retry once; ratchet x86_64 size (D243). The final shape is one non-genericread_expirywith a fixed 10 ms pause against an absolute 1 s give-up instant.Root cause: before any frame's work, the server checks in SQLite that the session is still valid, and gives that check 25 ms. If the database is busy for longer, even once, the server treats the miss as "not allowed" and closes the whole connection: every terminal, every window. Now a miss counts as "busy". The frame waits, the check is retried for up to 1 s, and nothing is lost or reordered. A real "no" still closes at once, and a database stuck for more than 1 s still closes.
Perf VM (10.69.69.208, under the perf lock), 4 terminal sockets typing every 10 ms, store connection held for random stalls:
Fast-store echo round trip (5,000 samples per run, interleaved): 9 rounds, p50 median before 791 µs / after 768 µs, p99 median 3,934 / 3,882 µs. v4: 5 rounds, p50 median before 1,111 µs / after 840 µs (a noisier VM window). The added per-frame latency is within noise, about 0.
Size (static, same target dir): first version +3,392 B x86_64 / +2,816 B aarch64. Final: x86_64 21,090,384 (−64 B, ceiling ratcheted down as the gate requires), aarch64 19,316,264 (+0).
scripts/verify fast (load 10.6 at start), verbatim:
Size lines:
size: 21090384 bytes; cap: 21090384 bytes; delta: +0 bytes/size: 19316264 bytes; cap: 19316264 bytes; delta: +0 bytesEvidence:
red-on-release-prod-live.log
green-transient.log
server-socket-filters.log
perf-vm-results.txt
perf-vm-rtt-extra.txt
perf-vm-v4.txt
verify-fast-2.log
Break-it review (Opus) started on branch
review-authority-read-retryat61dc21e33(base release-prod-live3048580c1).Break-it review (Opus) of
61dc21e33: two P1s, do not mergeBranch
review-authority-read-retry, commit42710ba1a, addscrates/infraternal-server/src/auth/socket_tests/review_authority_retry.rs(2 tests, both fail).Run:
cargo test -p infraternal-server --lib review_authority_retryP1-1: a session that expires during the wait is renewed for 30 days, and its frame runs.
read_expirytakesnowonce, before the retry loop. Every retry passes that oldnowtolive_expiry(expires > now) and tosocket_activity(renewal tonow + SESSION). After a stall that crosses the session end, the retried read still treats the session as live and renews it. Expiry stops being monotonic: HTTP sees the session as dead, then it comes back.session_is_live(renew=true, used at the input/attach/resize gates and at shutdown) has the same old clock. Before this change the read missed its 25 ms deadline and the socket closed. Fix: read the clock again for each attempt.P1-2: retrying a renewing read drains the 8-connection pool during a write stall. A renewing read is a SELECT followed by an UPDATE. While another connection holds the write lock, the UPDATE waits on busy_timeout (5 s). The 25 ms timeout drops the future, but the statement keeps its pooled connection. A retry every 10 ms checks out another connection, so one socket due for renewal uses all 8 in about 300 ms. Then every WAL reader in the server stalls (other sockets close at 1 s, which is the global outage #240 is meant to stop). The 50–300 ms soak holds one connection but no write lock, so it cannot see this. Fix direction: retry only the read and defer or skip a busy renewal, or keep awaiting the same attempt instead of starting a new one. Cap concurrent authority attempts as well.
P2-3:
session_is_liveon the teardown path now waits up to 1 s beforedrop(sink)/drop(transport), and it also renews at shutdown. The comment onAUTHORITY_READ_TIMEOUT("shutdown cannot inherit the normal one-second writer wait") is now wrong.P3-4: A revocation that arrives while a tick read is in flight closes after up to about 2 s (
authority.await?thensocket_deadline). Nothing is sent in the meantime (the operation is not polled). Only the close is late, past the "within 1 s" that the #189 tests state.P3-5: The issue says the backoff starts at 5 ms and doubles up to 100 ms. The code uses a fixed 10 ms, about 28 attempts per second per stalled socket, which makes P1-2 worse.
Checked, holds: frame ordering and loss (serial loop, bounded INPUT_SLOTS, TCP backpressure); a revocation published during the entry wait (subscribed before the read, biased select, the frame does not run); pings are answered without SQL (D265). The changed #189 tests widen 25 ms to the designed 1 s, a deliberate weakening and not a bug.
Not done: the same tests run against the base code (
3048580c1). The run waited over 40 min for a build slot and was stopped. Without the retry, both failures cannot happen: there is one attempt and the socket closes.Start: fixing the break-it review (P1-1, P1-2, P2-3, P3-4, P3-5). Branch
authority-read-retry, base release-prod-live3048580c1. History rewritten (force-with-lease): the clippy-only commiteec9d1421is squashed into its parents (its one transient_authority_stall.rs line into the fix commit, the soak changes into the harness commit; final tree identical), and the review tests42710ba1aare cherry-picked on top. Rewritten head before fixes: de9ecbc5b.Break-it review fixes: done, with one gate still red (aarch64 size +1,584 B, owner decision)
Branch
authority-read-retry, head37d2e4dc3c(base release-prod-live3048580c1). Pushed with force-with-lease over61dc21e33.History: the clippy-only commit
eec9d1421is squashed into its parents. The review tests (42710ba1a, now2e621f6b2) are cherry-picked. Then one commit per finding:9f04c80eaP1-1: each attempt reads the clock, and the answer is checked against the clock again after the read. An ended session is never found live or renewed. Review testsession_expiring_during_the_wait_is_not_revived_or_servedis green.6f342c440P1-2 + P3-5: only the SELECT is retried. Renewal runs off the read path as a spawned UPDATE: at most one server-wide, skipped when busy, judged byexpires>unixepoch()when the statement runs. AUTHORITY_READS=4 caps authority connections server-wide (a semaphore; an attempt waits its turn within its own deadline). The backoff is 5 ms doubling to 100 ms.socket_activityis gone. Review testrenewing_retries_do_not_drain_the_pool_during_a_write_stallis green.3a8791618soak:SOAK_HOLD=write|mixedholds the write lock (BEGIN IMMEDIATE outside the pool) after making the session due for renewal.SOAK_STORE=fileuses the production pool shape. A pool probe reports other readers' wait.360480feaP2-3: teardown makes one attempt, no wait, no renewal. The AUTHORITY_READ_TIMEOUT comment is corrected. New tests, red before the fix:teardown_with_a_busy_store_does_not_wait_for_authority(959 ms → <500 ms) andteardown_does_not_renew_the_session.fa37d18dbP3-4: on revocation or deadline during a periodic read, the stale in-flight read is dropped and one fresh read decides, so the close comes within one bounded wait of the change. There is no new red test: the old 2 s case needs a SELECT that straddles the revocation commit. The bound stays pinned by the authority_watchdog interruption tests, which measure from the interruption.37d2e4dc3ratchets the x86_64 ceiling down to 21,086,416.Rejected along the way: try-only counters for the cap. They were 512 B smaller, but a burst of more than 4 reads paid a 5 ms pause and
recovery_subscription_updates_every_signed_in_socketfailed deterministically.Perf VM (10.69.69.208, under the perf lock), 120 s, 4 terminals typing every 10 ms, 55 stalls of 50–300 ms. "reviewed" =
61dc21e33:3048580c1)Fast-store echo RTT p50 (µs, 3 interleaved rounds): before 697/815/707, reviewed 784/771/1165, after 791/1041/1250. The VM was noisy in rounds 2–3 (reviewed jumped too). The previous run of a near-final build gave before 826/841/772, after 832/811/825. I do not claim a per-frame cost from this. A clean re-run is needed before merge.
Size (static, same target dir): x86_64 21,086,416 (−3,968 vs the old ceiling, ratcheted). aarch64 19,317,848, +1,584 over 19,316,264. A symbol diff puts the growth in the spawned renewal UPDATE plus its drop glue, and the AuthorityLimits Arc. I did not raise the ceiling: it is the owner's call.
scripts/verify fast (load 13.3 at start), verbatim:
The only red item is static builds, which fails on the aarch64 size line above; the x86_64 line there is from before the ratchet commit (cap now 21,086,416).
Evidence:
review-fix-verify-fast.log
review-fix-perf-vm.txt
review-fix-perf-vm-earlier.txt
review-fix-p2-red.log
Break-it delta review r2 (Opus) started on branch
review-authority-read-retry-r2ata9db5526be(origin/authority-read-retry). Scope: prior P1-1, P1-2, P2-3, P3-4, P3-5 plus renewal starvation, clock skew, the authority cap, fairness at the cap, shutdown of the renewal task.Break-it delta review r2 (Opus) of
a9db5526b: no P0/P1/P2, one P3 with a failing test, three P3 notes. MERGEBranch
review-authority-read-retry-r2, head0faea9c3d6(on origin/authority-read-retrya9db5526b). Addscrates/infraternal-server/src/auth/socket_tests/review_authority_cap.rs(1 test, fails on purpose).Prior findings
session_expiring_during_the_wait_is_not_revived_or_served ... ok. Each attempt reads the clock, a post-read check rejectsexpiry <= now, and the renewal isexpires>unixepoch()when the statement runsrenewing_retries_do_not_drain_the_pool_during_a_write_stall ... ok. Only the SELECT is retried, and WAL serves it under the write lock. At most one renewal runs server-wideteardown_with_a_busy_store_does_not_wait_for_authority ... ok,teardown_does_not_renew_the_session ... okauthority_watchdogtests okNew
P3-6 (failing test): the cap counts attempts, not connections. The
read_expirydoc says "however many sockets retry at once they hold at most that many connections". The place is a permit inside the attempt future. A missed deadline drops the future and the permit returns at once. The statement that is already running keeps its pooled connection until SQLite returns: sqlx 0.8.6return_to_poolpings the connection before reuse (pool/connection.rs:314), and that ping waits behind the running statement. If the SELECT itself waits, one socket takes the whole pool:The test uses a rollback-journal file whose lock another connection holds. In production WAL the write lock does not block the SELECT, so the case needs a read that is slow inside SQLite (slow I/O). That is why this is P3. Fix options: keep awaiting the same attempt rather than starting a new one, or hold the place until the connection has been returned. Or narrow the doc to what the cap actually bounds.
Renewal starvation (asked): no risk. A renewal is due 60 s after the last slide, and the session lasts 30 days. An active session expires only if every renewal is skipped or fails for about 30 days. One renewal blocks the others for at most busy_timeout 5 s, plus the pool acquire timeout if the pool is exhausted. HTTP requests also renew (
read_session). No deadline before expiry is needed. P3-7: a failed renewal is discarded (let _ =). If renewals always fail (a read-only or full disk), nothing logs it. One rate-limited log line would cover this.Clock skew (asked): none.
now_seconds()(SystemTime) and SQLite'sunixepoch()(unix VFS, gettimeofday) read the same CLOCK_REALTIME and both truncate to whole seconds. SQLite takes "now" after the busy-handler wait inside the step, so a renewal that queued behind a writer judges the session at the moment it writes. A wall-clock step backward affects both sides equally, so the two cannot disagree. The only fake clock istest_http_time, which applies to HTTP in tests only.Cap vs non-authority readers, deadlock with a renewal: holds. A renewal holds 1 place and 1 connection, so authority work holds at most 4 connections plus whatever P3-6 leaks. The writer that a renewal waits on never needs an authority place to finish (
require_session_txuses its own transaction). A nestedlive()inside anauthorized()operation takes its own place, independent of the tick read. No cycle.P3-8 fairness at the cap. The semaphore is FIFO, but an attempt that misses its 25 ms deadline leaves the queue and rejoins at the back after its pause. Every logout wakes every socket (the revocation watch is server-wide), so N sockets queue on 4 places. That is half the herd throughput of the old 8-connection path. At about 100 µs per read this is about 2.5 ms for 100 sockets, so it is harmless. It only matters when reads take milliseconds. The backoff also adds up to 100 ms after a stall ends (before: 10 ms). That follows the spec, but if latency comes first the 100 ms ceiling could come down now that the cap bounds the cost.
Shutdown of the background task: holds. The renewal task is detached and never joined. When the runtime drops, the task is dropped;
RenewalHoldreturns the place and clears the flag. The UPDATE is atomic and idempotent, so an interrupted one is harmless. Production never callspool.close(), so nothing waits on it.Gate
scripts/verify faston0faea9c3d(load ~15 at start).testis red only because of the new review test (508 passed, 1 failed):No perf-VM runs in this review.
MERGE: 0 P0, 0 P1, 0 P2, 4 P3 (P3-6 with a failing test, which can follow up after merge or be fixed before).
Release 2 deployed to production at 14:08 IST: release-prod-live
103815e70, server sha256 8608623e…, MainPID 86026, /healthz ok. Backup /var/backups/infraternal/20261018-083808-103815e70…. CA is locked after the restart until the owner unlocks it.Start: branch
authority-cap-hold, baseorigin/release-prod-livebec4eb7dd2. Read #240 and parent #146 history; continuing the open P3 cap finding. Next: cherry-pick only the test from0faea9c3d, confirm it fails on this base, then implement the smallest connection-lifetime fix.Finding P3-6 reproduced on
authority-cap-holdat12eeafe81:retries_whose_select_waits_stay_within_the_authority_capfails after 1.32 s withone socket's abandoned authority reads hold 8 of 8 pool connections; the cap promises at most 4. The assertion is incrates/infraternal-server/src/auth/socket_tests/review_authority_cap.rs:85;crates/infraternal-server/src/websocket.rs:2383-2403places the permit inside the future that the 25 ms timeout drops, while the SQLite SELECT remains active. A repeat is queued to save and attach the raw log.Raw repeat attached. The same test is red on the release base: 8/8 pool connections busy at 600 ms, permitted maximum 4; exit 101. red-authority-cap.log
Step complete: test-only cherry-pick
36d4bb58edddc5fc582cbbf00cf7ceef3c05d29fis pushed onorigin/authority-cap-hold. Its tree is unchanged from the requested test commit; the message now records D243 and ends withRefs: #240. Red evidence remains 8/8 pooled connections busy at 600 ms versus a cap of 4; raw run.Finding P3-6 fix validation (working tree, test commit
36d4bb58e): the focused regression passes, 1/1, with the assertion that busy pooled connections stay at or below 4 of 8 after the 600 ms SELECT wait. The permit is now held by the spawned query throughAuth::live_expiry; dropping the timed caller detaches that query. green-authority-cap.logGate finding at test commit
36d4bb58eplus the uncommitted fix: the unfilteredcargo test -p infraternal-server --lockedrun completed with 375 passed, 2 failed, 25 ignored. The cap regression and prior #240 retry tests passed. Tworeview_subscription_refusalcases atcrates/infraternal-server/src/auth/socket_tests/review_subscription_refusal.rs:177receivedplugin unavailablewhere they expectmesh unavailable. I’m rerunning these cases in isolation and will compare with the release base if they reproduce. Full server test logThe corrected workspace-equivalent server run passed with
remoteenabled:cargo test -p infraternal-server --features remote --locked— 615 library tests passed, plus all integration and doc-test binaries; the cap regression, prior authority retry tests and bothreview_subscription_refusalcases passed. The earlier two failures were only from running the crate with its default feature set (remote disabled), while those tests expect remote-enabled behavior. Full output: server-tests-remote.log.Perf measurement setup finding: the host-linked x86_64 harness binary transferred with matching SHA-256
101f58116c3edba61805a4ad21b3001d5b30d17780fb580900403e729eb0c088, but the perf VM returnedcannot execute: required file not found;lddshows its interpreter under/nix/store/.../ld-linux-x86-64.so.2, which is absent on the VM. I am rebuilding the before/after harness as static musl binaries with the production target recipe, then I will measure there.Pre-fix perf baseline on the 4-vCPU perf VM (load average 0.00; 5,870 MiB available), using the production-profile static x86_64 harness and three rounds of 5,000 echoes: p50 699.4 / 705.3 / 688.5 µs; p99 3,861.7 / 2,634.3 / 3,575.0 µs. No closes in 15,000 samples. Full output: perf-before.log. The fixed binary is building now for the matching comparison.
The first fixed-path measurement exposed a latency regression at essentially idle VM load (0.00): p50 904.3 / 861.7 / 1,095.6 µs and p99 6,915.7 / 6,096.1 / 8,643.4 µs, versus pre-fix p50 699.4 / 705.3 / 688.5 and p99 3,861.7 / 2,634.3 / 3,575.0. The three post-fix rounds had no closes. The always-spawned query task adds a scheduler hop to every fast check. I am changing the fast path to await inline and detach only after the per-attempt deadline. Full output: perf-after.log.
A second fixed implementation, which awaited normal SELECTs inline and detached only after a per-query deadline, still regressed on the same 4-vCPU VM at load 0.00. Three 5,000-sample rounds: p50 881.3 / 972.5 / 918.9 µs (median 918.9); p99 5,225.6 / 6,753.1 / 6,323.0 µs (median 6,323.0). Baseline medians were p50 699.4 and p99 3,575.0 µs. This version adds a per-query timer/select; I am removing that overhead and will remeasure. Full output: perf-conditional-after.log.
A repeated pre-fix run shows the perf VM's timing shifted since the first baseline, so the earlier comparison was not load-window matched. At 4 vCPUs, load average 0.45, and 5,855 MiB available, the original binary measured p50 864.2 / 861.1 / 924.9 µs and p99 5,698.1 / 4,688.2 / 5,816.2 µs, with zero closes in 15,000 samples. This overlaps the conditional implementation's range and warrants interleaved comparison in one load window. Full output: perf-before-repeat.log.
The interleaved comparison resolves the earlier apparent regression, which coincided with a perf-VM speed shift. In one locked run on the 4-vCPU VM (start load average 0.59, 5,844 MiB available), three 5,000-sample rounds per binary had zero closes. Baseline p50/p99: 819.2 / 4,475.9 µs medians; fixed p50/p99: 760.5 / 4,099.3 µs medians. Individual baseline p50/p99 were 819.2/4,475.9, 751.5/3,302.5, 848.3/4,747.1; fixed were 720.2/4,099.3, 760.5/3,626.2, 845.9/4,705.7. The measured fast path has no latency regression. Full alternating output: perf-paired.log.
Clippy finding while checking the
remote-feature server test configuration:cargo clippy -p infraternal-server --all-targets --features remote --locked -- -D warningsexits 101 becausecrates/infraternal-agent/src/plugins.rs:123and:133triggerclippy::unnecessary_wraps. This code is outside the three-file fix and the feature-specific server tests pass; the server's default-feature clippy gate is running separately. Full output: clippy-remote-feature.log.Final-source server validation completed at test commit
36d4bb58eplus the uncommitted three-file fix.cargo test -p infraternal-server --features remote --lockedpassed: 615 passed, 0 failed, 52 ignored; 37 integration/doc-test binaries also passed. This includesretries_whose_select_waits_stay_within_the_authority_cap, both existing authority retry tests and both remote-enabled refusal cases. Default-feature server clippy passed with-D warnings. The optional remote-feature clippy run separately reports two unrelatedunnecessary_wrapslints incrates/infraternal-agent/src/plugins.rs:123,133(logged above). Outputs: server tests, server clippy.Correction to my previous count: there were 19 integration-test binaries plus one doc-test binary (20 non-library executables), not 37. Together they report 82 passed, 0 failed, 1 ignored; the library reported 615 passed, 0 failed, 52 ignored.
Production fix committed and pushed on
authority-cap-hold:8e58fd16a. The red-first regression failed before the fix at 8/8 pooled connections against the cap of 4; the final remote-enabled server suite passed 615 library tests (0 failed, 52 ignored) and 82 integration tests (0 failed, 1 ignored), plus doc tests. Default-feature server clippy and formatting passed. Paired perf VM medians: p50/p99 819.2/4475.9 µs before, 760.5/4099.3 µs after (three 5,000-echo rounds each, zero closes). Fullscripts/verify fastis running now at the pushed head.The branch-head
scripts/verify fastcargo-deny row reports the pre-acknowledgedRUSTSEC-2026-0382advisory forrustls-webpki 0.103.15; bans, licenses and sources pass. This matches the brief's note that another job is patching the dependency, so I have not changed dependencies in this minimal production fix. The gate continues through the static architecture builds; exact output will be attached with the final transcript.The branch-head fast gate's stripped x86_64 static binary is 21,394,064 bytes against the exact 21,386,224-byte D243 cap (+7,840 bytes), so the size row fails despite the brief's expected <2 KB delta. This is above the exact gate ceiling; I am reducing code size without changing the bounded-query behavior, then will rerun the gate. The in-progress
verify-fast.logcontains the size receipt and will be attached after completion.The first pushed-head
scripts/verify fastcompleted. Workspace tests (including the server suite), clippy, fmt, VT fmt, plugin compile-out and SSH checks passed. The gate returned 1 for the pre-acknowledgedRUSTSEC-2026-0382cargo-deny row and both exact D243 size caps: x86_64 21,394,064 / 21,386,224 (+7,840 bytes); aarch64 19,566,936 / 19,557,992 (+8,944 bytes). Full transcript: verify-fast.log.Final gate summary (verbatim):
Size-trim follow-up compile finding: the first
DetachOnDropcompile failed because Tokio requires the spawned future's output to beSend(websocket.rs:190, E0277). Added the output bound; formatting now passes. Re-running the cap regression next.Release 9.2 integration is running on release-9-2 from
411485164; progress, interplay findings and final artifact/gate receipts are tracked on #24. No deploy. #240 inclusion remains conditional on its completed finish record after #250/#243 are integrated and gated.Size-trim step is in the working tree based on
8e58fd16a:DetachOnDropleaves successful queries inline and transfers only a timed-out query into a task with its authority place. The focused cap regression passes. Full remote-enabled server suite: 615 unit tests passed, 0 failed, 52 ignored; 82 integration tests passed, 0 failed, 1 ignored; doc tests passed (0). Evidence: server-tests-trim.log. Clippy, perf and size gates remain.The first perf-VM paired run after the size trim returned baseline median p50/p99 694.9/1557.2 us and trim 720.4/2018.3 us (three 5,000-echo rounds each, 0 closes). Load rose from 0.00 to 0.79 during the 25-second run, so this is an apparent regression with a time-order confound. I’m repeating in a reversed/interleaved order before accepting the comparison. Receipt: perf-trim-paired.log.
Second perf-VM run used 10,000 echoes per round in trim/baseline/baseline/trim/trim/baseline order (4 vCPU, 7,879 MiB RAM; 1-minute load rose 0.49 to 1.08; no closes). Median baseline p50/p99 was 678.2/1996.9 us; trim was 724.8/2030.2 us, a measured +6.9% p50 and +1.7% p99. I’m comparing the earlier direct-select implementation in the same VM window to separate wrapper overhead from run variance before selecting the final implementation. Receipt: perf-trim-paired-10k.log.
Correction: the 10,000-echo trim measurement receipt is perf-trim-paired-10k.log.
Perf-VM follow-up used three 10,000-echo rounds for each implementation, interleaved baseline/direct-select/trim variants (4 vCPU, 7,879 MiB; load 0.97 to 1.32; 0 closes). Median p50/p99: baseline 488.6/1030.8 us, direct-select 478.3/1009.7 us, trim 481.9/1003.4 us. The trim is 1.4% lower p50 and 2.7% lower p99 than baseline, and within 0.8% p50 and 0.6% p99 of the earlier direct-select implementation. Run-to-run values drifted during the window; the three-way sequence shows no consistent regression. Receipt: perf-three-way-10k.log.
Self-review finding: the size trim changed the attempt from the prior
timeout_at+ post-resultInstant::now() <= attempt_deadlinecheck totimeout(read_timeout, read). That removed the explicit late-result guard incrates/infraternal-server/src/websocket.rs; Tokio documents that timeout cannot preempt a future that does not yield. I’m restoring the monotonic deadline check so a result first observed after its attempt bound retries as before.Committed and pushed
4f54f4c49(D243 size trim): successful reads stay inline; timed-out queries carry their read place into a task, with the explicit late-result deadline check preserved. Focused cap regression passes. Full remote-enabled server suite: 615 unit + 82 integration tests passed, 0 failed, 53 ignored across unit/integration binaries; clippy and fmt pass. Receipts: cap test, server suite, clippy. Final static-size gate and performance measurement on this exact commit are pending.D243 size finding on branch head
4f54f4c49: the finalscripts/verify fastx86_64 static build is 21,393,616 bytes against 21,386,224 (delta +7,392). The aarch64 build is still running. The trim reduced the first fix's x86_64 overage by 448 bytes, so a further code-size reduction is required before completion.Final
scripts/verify faston4f54f4c49completed with static size still over D243: x86_64 21,393,616 vs 21,386,224 (+7,392); aarch64 19,566,888 vs 19,557,992 (+8,896). Thecargo-denyrow also reports the already known RUSTSEC-2026-0382 on rustls-webpki 0.103.15, assigned to the other patch job. fmt, CLI compile-out, clippy, SSH helper, workspace tests and inode-reuse fixture pass. Full receipt: verify-fast-final.log. I’m reducing the spawn task’s monomorphized code before the next gate.The boxed-query cancellation candidate reduces the earlier overage but still misses both exact D243 caps: x86_64 21,388,304 bytes (+2,080) and aarch64 19,560,280 bytes (+2,288). Receipts: x86_64, aarch64. I’m replacing the manual permit hold with an owned semaphore permit carried by the query, which should remove the custom permit wrapper.
Release 9.2 leaves #240 for the next release: completion marker absent at the integration checkpoint and still absent after the full first-two-fix gate. Release head
c996c8d2bd; artifact hashes and final gate receipts on #24. No deploy.Experiment update: replacing the boxed unit future with a named spawned query task and an owned semaphore permit produced x86_64 21,393,648 bytes (+7,424), so that form is rejected; receipt: size-detached-type-x86.log. I’m returning to the erased unit-task form and testing a
select!deadline wrapper to reduce the remaining ~2 KB while retaining the strict post-result bound.Size finding: the unit-output detach helper builds to 21,388,272 bytes on x86_64 against the exact 21,386,224-byte D243 cap (+2,048). Receipt: size-unit-detach-x86.txt. I am testing a select-based deadline path that moves only a timed-out query into this shared unit-output task.
Size finding on the smallest tested timeout-task form: x86_64 is 21,388,272 bytes (+2,048 over cap); aarch64 is 19,560,120 bytes (+2,128). Both are about 2 KB and below the 16 KB growth threshold, but the exact D243 caps still require an update for the branch image. Receipt: size-unit-detach-both.txt. I am testing a guard that owns only the read semaphore to reduce the remaining bytes before finalizing the cap ratchet.
The smaller guard candidate did not help: owning Arc measures +2,304 bytes on x86, 256 bytes larger than the Arc guard. I am reverting it. Receipt: size-semaphore-guard-x86.txt.
Full server suite passed on the final query-handoff implementation: 615 library tests passed, 0 failed, 52 ignored; 82 integration tests passed, 0 failed, 1 ignored; doc tests 0/0. The #240
retries_whose_select_waits_stay_within_the_authority_capregression passed in the run. Receipt: server-tests-final.log.Default-feature server clippy passed:
cargo clippy --locked -p infraternal-server --all-targets -- -D warnings. Receipt: clippy-server-final.log.scripts/verify iteratecompleted. Repository artifact, deployment fixture, fmt, VT native fmt, CLI compile-out, clippy, SSH runtime helper, workspace tests and SSH inode reuse fixture passed. The only reported failure is the knownRUSTSEC-2026-0382cargo-deny advisory assigned to the other patch job. Raw output: verify-iterate.log.Final paired perf-VM benchmark passed with no closures. Six interleaved runs used 10,000 echoes each. On infraternal-perf-test (4 vCPU, 7,879 MiB RAM; 1-minute load average 0.25 before and 1.00 after), median baseline p50/p99 was 716.8/1,645.3 µs; candidate was 714.4/1,601.9 µs (-0.3% / -2.6%). Receipt: perf-final-paired-10k.log.
Finished on
authority-cap-hold, headd6efb0f04c4b90f9a1ca76b7f9606c6c9321a082(pushed; clean worktree). No deployment.The timeout retry regression passes; the existing #240 slow-check socket tests remain green. The server suite passed (615 unit tests and 82 integration tests). The final access-check loop measured baseline p50/p99 716.8/1,645.3 µs and candidate 714.4/1,601.9 µs; no regression. Static stripped sizes: x86_64 21,388,272 bytes (+2,048); aarch64 19,560,120 bytes (+2,128). Both match the updated caps. Full gate log: verify-fast-final-head.log.
scripts/verify fastfinal Rust gate output:The only failing row is the known
RUSTSEC-2026-0382advisory forrustls-webpki 0.103.15, being patched by another job.Start delta review r3 on review-authority-cap-r3, base
d6efb0f04c(origin/authority-cap-hold). Scope: 36d4bb58e..d6efb0f04; test-only commits, no deployment. Read all 52 #240 comments and retrieved parent #146 (1,492 comments); continuing the existing cap regressions. Checking query cancellation, permit recovery, deadlines and bounded stalled-read storms against real SQLite.Step 1:
45aceec8don review-authority-cap-r3. Added a 32-caller full-budget retry storm using explicit runtime time and real SQLite pool exhaustion. All 32 callers fail closed; exactly 4 retained query holds remain after callers finish (Arc count 5 including state), no fifth place becomes available during retries, and all 4 places recover after releasing the connection. Formatting, default-feature server clippy (-D warnings) and all 7 authority-watchdog tests pass. Raw gate receipt will be attached with the final record.Step 2:
48aec3784pushed. A second 32-caller storm cancels both running and queued reads, matching the enclosing-future drop used by socket disconnect/shutdown. All 4 places stay held by detached queries, then recover exactly once. Subsequent Denied and closed-pool storage errors preserve all 4 places. Formatting, server clippy (-D warnings) and both new tests pass.Step 3:
0559a49e3pushed. Real SQLite rollback-journal lock, pool size 8, configured busy timeout 2 s, 32 callers: exactly 4 acquisitions observed; callers end with 4 places retained; all 4 places recover while the independent exclusive lock is still held. No unlock is needed to drain detached reads. Formatting, server clippy (-D warnings) and all 3 r3 tests pass. These are functional timeout/completion checks on the build host, not performance measurements.Step 4:
1355aa888pushed. A real SQLite progress callback and a custom result waker arrange a ready SELECT first observed after its attempt deadline. The access check remains pending, then its retry observes a session deletion and refuses the stale live answer. All 4 new r3 tests, formatting and server clippy pass. Running the new tests on pre-delta36d4bb58eto verify that they detect the old cap failure, then the full branch-head fast gate.Comparison finding: all 4 new tests fail on pre-delta
36d4bb58e, and all 4 pass on review head1355aa888(product based6efb0f04). The pre-delta cancellation, deadline and SQLite-stall cases return all 4 places while queries still own them (expected 0 available). The pre-delta late-result case returns the stale live answer after its attempt deadline. These are fixed by the reviewed delta; no new P0/P1/P2 finding. Raw baseline receipt will accompany the final gate.R3 receipts: 4 new tests fail on
36d4bb58eand pass on1355aa888.step1.log
step2.log
step3.log
step4.log
baseline-tests.log
review-audit.txt
Audit qualification: AuthorityReadHold spans SELECT-future completion; sqlx performs pooled return/ping asynchronously afterward. Its pinned single-row SQLite path resets the iterator before publishing the row, so no blocked SELECT remains outside the tested cap. The stronger comment about actual pooled return should not be treated as an instantaneous num_idle guarantee. The clock-error branch is reviewed statically (explicit borrowed-place drop), without changing the live host clock. Final gate and same-recipe size comparison are pending.
Step 5:
4bd4c24c0pushed. Real transport storm at the per-person ceiling: 16/16 sockets receive an explicit Close, 0 action results, with the sole pooled connection held until all outcomes are counted. Both protocol and WebSocket pings are answered; EOF is not counted as success. Formatting, default-feature server clippy (-D warnings) and the focused real-socket test pass. The four earlier regressions are also green in the full workspace milestone. Static x86_64 is 21,388,272 bytes (exact cap); aarch64 and the final-head gate remain pending.step5.log
Step 6:
077ebbc02pushed. Four cancelled reads keep all four places while queued for the sole pool connection. Advancing the configured acquire timeout with explicit runtime time returns all four places and drops every retained query reference, while the connection remains held. Formatting, server clippy (-D warnings) and the focused test pass. This complements the real SQLite busy-timeout case.step6.log
Milestone full Rust gate: every row except the inherited RUSTSEC-2026-0382 advisory passes. Static sizes match exact caps: x86_64 21,388,272 bytes; aarch64 19,560,120 bytes. Final-head full gate and supplemental TypeScript checks are running (the advisory otherwise exits the script before that phase).
Final-head gate at
077ebbc024: all 6 new r3 tests pass; workspace tests, clippy and both static builds pass. Only the inherited RUSTSEC-2026-0382 cargo-deny row fails. The TypeScript phase was run explicitly after the script exited on that row: supplemental TypeScript exit=0. Static x86_64 21,388,272 bytes; aarch64 19,560,120 bytes, both exact caps. Same-recipe merge-base x86_64 rebuild remains in progress.verify-fast.log
verify-fast-head.txt
Finished delta review r3: CLEAN (MERGE). No P0/P1/P2 found in 36d4bb58e..d6efb0f04.
Branch review-authority-cap-r3, pushed head
077ebbc024. Six atomic test commits, two test files only; product code, dependencies and decisions unchanged.Evidence: four new regressions fail on pre-delta
36d4bb58eand pass on the candidate. Full-budget and cancellation storms use 32 callers, retain exactly 4 query holds, and recover all 4 places without duplication. Success, Denied and closed-pool storage error recover all places. Real SQLite busy-timeout and pool-acquire-timeout cases recover without releasing the blocking lock/connection. A ready result first observed past its attempt deadline retries and sees a subsequent deletion. Actual socket storm: 16/16 explicit Close outcomes at the per-person ceiling, 0 action results, both ping forms answered, store held until every outcome is counted. All six r3 tests pass in the final workspace gate.D243 same-recipe stripped static x86_64 comparison against merge base
d6efb0f04: 21,388,272 / 21,388,272 bytes, delta +0 B, SHA-256 byte-identical. aarch64 gate size 19,560,120 bytes. Both exact caps pass.Scope qualification: the hold spans SELECT-future completion; sqlx schedules pooled return/ping afterward. Its pinned single-row path resets the iterator before publishing the row, so no blocked SELECT remains outside the tested cap. The comment about actual pool return is stronger than this mechanism. unix_seconds failure is reviewed statically (explicit borrowed-place drop); no host clock changes or product hooks were introduced. Cancellation is tested at the enclosing access-check future drop boundary. The supplied perf-VM receipt is reused, not remeasured. Details are in the attached audit.
Final scripts/verify fast summary, verbatim:
Fast gate exit=1 solely for inherited RUSTSEC-2026-0382 (rustls-webpki 0.103.15). The TypeScript phase otherwise skipped by that exit was run explicitly: supplemental TypeScript exit=0.
verify-fast.log
verify-fast-head.txt
binary-size.txt
base-static-build.log
review-audit.txt
Own scratch baseline and build artifacts are being removed; raw receipts remain outside the checkout and attached here. No deployment. Issue remains open.
Cleanup complete: removed the owned detached baseline worktree, cargo target, comparison binary and SQLite scratch directories. Raw receipts remain outside the checkout and attached above. Worktree clean; local HEAD and origin/review-authority-cap-r3 both
077ebbc024. Final verdict remains CLEAN (MERGE); no P0/P1/P2. No deployment; issue left open.Release 9.3 with the socket authority read cap is pushed at
abedd62b068cbd0af0c51488abb0a6e0ddf4ce4e; final gates, artifact hashes, staging/browser results and the broad-suite caveat are recorded on #24.Orchestrator: release 9.3 deployed at
abedd62b0(9.2 + the #240 authority read cap + r2/r3 review tests; the r3 review was CLEAN)./proc/PID/exesha256 e98f7dfa…bf0 matches the artifact;/healthzok; no journal errors.release-prod-live→abedd62b0.Audit: auth, session and WebSocket authority code at release 9.3 (
abedd62b0)Defensive read-only audit (Claude subagent). Scope:
crates/infraternal-server/src/auth/sessions.rs,crates/infraternal-server/src/websocket.rs(AuthorityReadHold, DetachOnDrop, read_expiry/timeout_at, while_authorized, EndedStreams), revocation paths inauth/, andcrates/infraternal-protocol/src/lib.rs. No fixes were made. Line numbers are atabedd62b0.Summary: no P0 or P1 found. No path lets a revoked or expired session keep authority past one bounded read. One P2 (closes for every account, labelled as a refusal) with a failing test. Three P3.
P2-1: one account's logout plus a busy store closes every socket on the server, logged as
auth_resume_refusalwebsocket.rs:732-751(main socket loop): onrevocations.changed()and onsleep_until(expiry), a failedsocket_deadlinesetsteardown_reason = RESUME_REFUSEDfor any error. A busy store (AuthorityMiss::UnavailableafterAUTHORITY_WAIT, 1 s) and a real revocation (Refused) get the same label.RESUME_REFUSEDis not in the re-classification set atwebsocket.rs:931-933(PROTOCOL_ERROR | AUTHORITY_UNAVAILABLE | SERVER_PROCESSING_FAILED), sofailure_reasonnever corrects it. The close log saysreason=connection_resume_refused,reason_category=auth_resume_refusal. If the single teardown read succeeds, the browser also gets control Close 1011 "the server refused to resume the connection". #227 and #240 say a busy server must never look like a refusal.Auth::revocationsis a single watch channel for the whole server (auth/sessions.rs:108-123,webauthn.rs:221). Any logout or recovery by any account wakes every open socket's main loop, and every in-flightwhile_authorizedoperation, at the same moment. Each one does a read through the fourAUTHORITY_READSplaces, with 25 ms attempts.busy_timeout,runtime.rs:776-778). (3) Account A signs out (DELETE FROM sessions, thensend_replace).server_busy. Expected: either no read for B (the wake is not B's), or at least theAUTHORITY_UNAVAILABLElabel.close_logging::revocation_wake_on_busy_store_logs_authority_unavailable_not_resume_refusedon branchaudit-auth-93. It is the existingauthority_read_timeout_during_a_frame_logs_authority_unavailablefixture, with the Resize trigger replaced byf.auth.revocations.send_replace(()). Result: Commit6fe600b0efonaudit-auth-93(pushed to origin).P3-1: whole-second truncation keeps an expired session's socket up to ~1 s past
expireswebsocket.rs:2402-2415authority_deadline:remaining = expiry - unix_seconds()in whole seconds, added toInstant::now(). At a real time ofE-1+0.9it gives a deadline ofE+0.9.expires=Estreams terminal output (or is idle) acrossE.sleep_until(expiry)(:745) and the post-operation check (:1091) trust that deadline. Output and long operations keep flowing for up to about 1 s afterE.probe_deadline(:2376-2392) already does this correctly with sub-second wall time, so the two are inconsistent. Each new frame still does an entry read, which is correct, so the exposure is bounded and small.P3-2:
EndedStreamsfailure is fatal for the whole socketwebsocket.rs:2793-2827: up toMAX_ATTACHMENTS(32) ended stream ids wait for the browser's Close. The 33rdinsertreturnsErr(:1447,:2007,:2326), and the error ends the whole socket and every sibling terminal on it.terminal.tsendSessioncallscloseStream). Another client, or a tracer path that returns early inretryStreamwithout reattaching, then ends 33 terminals.P3-3: a busy store after a revocation event shares one label with a refusal (diagnostics)
The same mislabel as P2-1 on the
sleep_until(expiry)branch (:745-751): a session that is still live, read during a stall at its renewal deadline, logsauth_resume_refusal. One fix covers both: mapUnavailabletoAUTHORITY_UNAVAILABLEhere.Checked, no finding
read_expiry(:2445-2498): the wall clock is read per attempt, and the result is re-checked after the read (expiry <= nowmeans refused). A lateOkpastattempt_deadlineis retried, not accepted. Refused or a store error fails at once. No resurrection:renewalusesexpires>unixepoch()in SQL, and a deleted row cannot be revived.AuthorityReadHoldandDetachOnDrop(:145-213): the permit moves into the SELECT future (live_expiry_hold). A timed-out attempt is detached with its permit, so at most 4 detached queries are in flight.RenewalHoldreturns its place and flag on drop. No permit leak was found:place.forget()is always followed by an owner that callsadd_permits(1)exactly once.while_authorized_operation(:1024-1094): it subscribes before the entry read. The race between a late operation result and a revocation is closed by the finalhas_changed()check.webauthn.rs:220-222) and the cascade delete all publish after commit. Pending (unlocked=0) sessions cannot authorize sockets (live_expiryrequiresunlocked=1).infraternal-protocol/src/lib.rs): varints are canonical and bounded, and frame length is capped atMAX_FRAME_LENbefore allocation. Offsets usechecked_add.body[8..]for InputReply runs only afterbody_u64checked the length. No panic path found.Branch:
audit-auth-93(test only, no fix). AI agent: Claude Opus 5.5, session https://claude.ai/code/session_01GHLxFr6gB7AcU2GRKHB6DEStart auth-busy-wake at
6fe600b0ef(origin/audit-auth-93; production baseabedd62b0). Read #240 history and retrieved parent #146 history. Scope: preserve typed busy/refused authority outcomes in both socket-loop wake branches, regression tests, then sub-second authority deadlines in a separate commit. Existing read_expiry already retries within AUTHORITY_WAIT and checks late results; no retry budget increase is needed. Per-account wakes affect every revocation publisher and the watchdog/proof subscribers, so will document a separate plan rather than widen this production fix. No deployment or development-line push.Reproduced P2-1 on unchanged websocket.rs at
6fe600b0e: supplied revocation-wake test fails, left auth_resume_refusal / right server_busy (0 passed, 1 failed). The shared read already retries for AUTHORITY_WAIT; authority_deadline erases AuthorityMiss, and both wake branches label every error RESUME_REFUSED. The patch preserves typed errors until those branches, without changing attempts, backoff, permits or the post-result deadline check. Two additional attached-terminal cases cover another account deletion + wake with a 300 ms connection hold, and own-session deletion with the same hold. These are functional timeout scenarios, not build-host performance evidence.red-busy.log
Per-account wake follow-up plan: keep one watch generation per account with subscriptions established before the entry read; publish only the affected account after logout/recovery commit; preserve simultaneous account removals (a last-user-id watch alone loses coalesced events); share the same account subscription across the main loop, operation watchdog and proof authority; remove unused account entries when the last subscriber drops. Test concurrent two-account revocations and missed-wakeup windows, then compare at the 256-socket ceiling. This is larger than an obviously correct ~2 KB change and is deferred from this production fix.
Additional finding: fixing only websocket.rs main-loop classification is insufficient. The supplied regression still fails (auth_resume_refusal instead of server_busy) after that patch. websocket_probe_authority::Lease::refresh/run also erase AuthorityMiss; websocket_transport.rs proof_loop turns any failure into AuthorizationRefused, and run_socket teardown prefers that transport reason. Extending the same typed outcome through the proof path, with a distinct internal AuthorityUnavailable transport end (1013 / server_busy), is necessary for this request. Authorized transmit errors retain ServerWriteFailed. Read retries, permit holds and final generation/deadline checks are unchanged. Added a shared-fixture expiry-wake case as well as the requested short-stall cases.
green-busy.log
Focused functional results: 3/3 requested attached-terminal cases pass: supplied sustained revocation stall logs server_busy, other-account logout with a 300 ms held connection preserves authenticated application progress, own-session deletion under the same hold logs auth_resume_refusal. Setup now waits for an application result after attach before holding storage. Removed the extra expiry-wake fixture because ordinary terminal events can also start authority reads, so it did not isolate the timer branch. Both production branches explicitly preserve AuthorityMiss.
P3-1 red before correction: the paused-runtime clock-conversion test fails with a deadline later than the stored fractional wall-clock end. This is an arithmetic assertion with real SQLite and stationary runtime time, not a build-host latency measurement. The test is temporarily ignored in the uncommitted second-step file and run explicitly; the committed fix will enable it normally. Broader slot-wrapped checks are still queued behind shared builds.
green-busy-final.log
green-unrelated.log
green-revoked.log
red-subsecond.log
Baseline comparison for the pre-existing auth socket storm test (#118 exception): initial branch runs failed the explicit WebSocket Close count (11/16); detached origin/dev
ee3dab018passed once, then the branch passed once in the next window. Fixed cohort of three interleaved branch/dev-baseline pairs, using the compiled test binaries: pair 1 both PASS; pairs 2 and 3 both FAIL at review_authority_cap.rs:162 (Close count, expected 16). No application Result was observed; the test would panic on one. Host and load are recorded before each run in the raw receipt. No timing/performance claim is made. This matches the owner-authorized auth socket baseline exception: record both outputs, retain the safety assertions, commit and continue; all other rows must pass.The first larger targeted run has 9/9 close-log tests PASS and 11/11 authority-watchdog/cap-retention tests PASS; its only functional failure is the matched storm test. Its lint failure was in the separate uncommitted fractional-expiry test, which has been corrected and removed from the checkout until the first commit is gated. The first-step library lint passes with remote + infraternal-agent/mesh enabled (the earlier remote-only dependency combination has existing unnecessary_wraps warnings).
storm-paired.log
storm-paired.json
storm-repeat.log
storm-dev-baseline.log
Short-stall harness refinement before the first commit: one combined run closed B unexpectedly while the initial isolated runs passed. The two new short-stall tests now use the existing FrozenSocketTime helper, park content-free probes through the existing visibility notice, and observe retained authority-read places through a cfg(test, remote)-only monitor. Three held queries prove a timed-out attempt was retried; storage is released before 300 ms of explicit runtime time, then time stays stationary during real SQLite/network completion. This isolates authority from host scheduling and the independent liveness clock. Both tests pass; the original sustained busy-wake case remains active/real-time and also passes. Production backoff, attempt deadlines, authority wait and post-result checks are unchanged. These are functional clock/availability checks, not timing evidence.
green-unrelated-paused.log
green-revoked-paused.log
Checkpoint while waiting for shared build capacity: attached the current busy-store correction against
6fe600b0eso the in-progress code is recoverable from the issue. The supplied busy-wake regression and both explicitly timed short-stall cases pass individually; the exact-tree all-target lint/test sequence is queued through build-slot before the first atomic commit. The fractional-expiry test and its red receipt remain separate for the next commit. No deployment or development-line push.pending-busy-fix.patch
Step 1 committed and pushed:
ac28fb5edc. Busy/refused outcomes now survive both main-loop wakes and the competing proof checker. No retry, cap, renewal or post-result guard is relaxed.Fmt and server all-target clippy (remote + infraternal-agent/mesh): PASS. Functional results:
close: test result: ok. 9 passed; 0 failed; 0 ignored; 0 measured; 668 filtered out
watchdog: test result: ok. 11 passed; 0 failed; 0 ignored; 0 measured; 666 filtered out
review: test result: ok. 4 passed; 0 failed; 0 ignored; 0 measured; 673 filtered out
transient: test result: ok. 5 passed; 0 failed; 0 ignored; 0 measured; 672 filtered out
proofs: test result: ok. 4 passed; 0 failed; 0 ignored; 0 measured; 673 filtered out
transport: test result: ok. 3 passed; 0 failed; 0 ignored; 0 measured; 674 filtered out
Per-account wakes remain the separately documented follow-up. Next: the independently reproduced fractional-expiry correction, then same-recipe static sizes and the final fast gate.
Step 2 committed and pushed:
aad424a6a7. Authority and proof deadlines now share checked sub-second wall-clock conversion, pairing clocks after the read. The paused-runtime/real-SQLite regression is enabled normally and passes; its pre-fix failing receipt is attached earlier.Fmt and server all-target clippy: PASS. Functional results:
watchdog: test result: ok. 12 passed; 0 failed; 0 ignored; 0 measured; 666 filtered out
close: test result: ok. 9 passed; 0 failed; 0 ignored; 0 measured; 669 filtered out
proofs: test result: ok. 4 passed; 0 failed; 0 ignored; 0 measured; 674 filtered out
transient: test result: ok. 5 passed; 0 failed; 0 ignored; 0 measured; 673 filtered out
No new dependency, timer, renewal or authority query is added. Building production
abedd62b0and the branch with the same pinned static recipe next; final fast gate remains pending.Broader iterate at
aad424a6a: all Rust rows pass except test. The only failed case is the new revoked-session fixture, before the storage hold/session deletion: its next-frame assertion expected the visibility Pong. Five fixed repeats reproduced that assertion. An attached terminal can have unrelated notices queued before the correlated reply. Fixed the fixture to wait for control stream 0 / nonce 240, reject an early Close and retain a hang bound. The focused corrected test passes; exact-tree lint, suite and fixed-repeat gates are queued before a separate test-only commit. No authority, liveness or timeout assertion is weakened. This failure was not treated as the pre-existing storm exception.revoked-repeat-1.log
green-revoked-fenced.log
milestone-iterate.log
Step 3 committed and pushed:
4d2ea3884f. The broader iterate gate exposed a fixture assumption before the revocation stall: an attached-terminal notice could precede the visibility Pong. The test now waits for the matching control-stream nonce, fails on an early Close and has a hang bound. No authorization, liveness or deadline assertion was relaxed.Fmt/all-target server clippy PASS; close-log suite 9/9 PASS with remote + infraternal-agent/mesh; both controlled short-stall tests pass 5/5 fixed repeats each. The earlier full iterate Rust summary passed every row except test (this new fixture assertion); cargo-deny passed. Continuing the same-recipe static comparison and then the required final-head fast gate. The auth corrections themselves remain
ac28fb5ed+aad424a6a.Static baseline completed at
abedd62b0using scripts/static-cargo build --locked --release --package infraternal --target x86_64-unknown-linux-musl on infraternal-dev. Stripped artifact: 21,389,296 bytes, exactly the current recorded cap. Branch comparison is building with the same recipe/target directory; no timing claim is made from this shared build host. Removed this job's 12 GB debug incremental cache while preserving compiled tests to relieve shared disk pressure. Final fast gate still pending.Static comparison at
4d2ea3884f: reproducedabedd62b0x86_64 = 21,389,296 bytes; branch = 21,389,040 bytes, delta -256 bytes. Branch aarch64 = 19,561,912 bytes, +256 bytes against its recorded release-9.3 ceiling (19,561,656). Same scripts/static-cargo --locked --release recipe, stripped static binaries; no dependency, feature or profile change. This is artifact-size evidence, not shared-host timing evidence.D243 requires the x86_64 ceiling to ratchet down; proposing the exact measured ceilings 21,389,040 / 19,561,912, without allowance, in scripts/verify.d/rust.sh and docs/PROCESS.md. The 256-byte ARM increase preserves the necessary typed busy/refused outcome in the competing proof path and the common fractional deadline conversion; it is below the 16 KB band. Leaving stale caps or adding slack is rejected. Running the existing exact-cap / +1-byte / downward-ratchet checks before an atomic size-gate commit, then the final-head fast gate.
Step 4 committed and pushed:
300c0c8cb7. Exact static ceilings now match the measured artifacts (x86_64 21,389,040; aarch64 19,561,912 bytes), with no slack. bash -n PASS; existing size-boundary tests PASS at both exact caps, reject cap+1, require downward ratcheting and reject an unsupported target. Starting scripts/verify fast on this final head through build-slot.Receipts for pushed head
300c0c8cb: x86_64 21,389,040 bytes (-256 versus reproducedabedd62b0); aarch64 19,561,912 bytes (+256 versus recorded ceiling); both exact boundary checks PASS, and each controlled short-stall regression 5/5 PASS. scripts/verify fast is waiting for its host-wide build slot; no final gate result yet.static-size.json
size-cap-tests.log
fence-corpus.json
Finished and pushed auth-busy-wake at
300c0c8cb7. Both socket wake branches and the competing proof checker retain busy/unavailable versus known refusal. Short unrelated-account stalls preserve the socket; genuinely revoked sessions still close as RESUME_REFUSED once the read answers. Sustained unavailability closes as AUTHORITY_UNAVAILABLE/server_busy. Fractional expiry uses a shared checked wall/monotonic conversion. Per-account wakes are deferred with the lifecycle/coalescing plan above.Final scripts/verify fast exit 0 on that head; no baseline exception was used. All three busy-store socket regressions, fractional-expiry regression and existing full-place storm passed. Final gate output excerpt, verbatim (complete unfiltered output attached):
Stripped static x86_64: reproduced
abedd62b021,389,296 bytes; head 21,389,040, delta -256 bytes. ARM: 19,561,912 bytes (+256 versus recorded ceiling). Exact caps and boundary checks updated with no slack. Existing limits unchanged: 25 ms/read attempt, one-second total authority wait, four shared read places and 5-to-100 ms backoff; post-result checks retained. No added shipping state, tasks, queries, timers, dependencies or features. Auth B1/S1/S2/N1 self-review attached.Working tree clean; origin/auth-busy-wake matches head. Detached baseline and all job build targets removed; evidence retained outside checkout. No deployment, dev/main push or lab-host use. Issue left open.
verify-fast.log
verify-fast-summary.txt
self-review.txt
fence-close.log
static-size.json
size-cap-tests.log
fence-corpus.json
cleanup.txt
Verification review started on review-auth-busy-wake at
300c0c8cb7; diff base6fe600b0ef. Independent initial diff view recorded before reading author comments. Retrieved full #240 and parent #146 histories. Scope: edge tests only, no fixes/deploy; exact-author-head fast gate followed by review-head validation. Checking known expiry under storage stalls and outcome propagation.Independent review progress: the wake branches use the same pre-existing retry budget (25 ms per attempt, one-second wait), so no added revocation grace was found in the diff. Static wire finding under test: websocket.rs:975-994 sends only an optional 1011 application Close, conditioned on a successful teardown read, then an empty WebSocket Close; main-loop AuthorityMiss::Unavailable therefore has no guaranteed 1013 wire outcome. The transport proof path separately maps AuthorityUnavailable to 1013 at websocket.rs:798-800. Added an idle-socket wire regression to isolate the main loop; execution pending the exact-author-head full gate. Closed watch is infrastructure loss and is unreachable while the normal Auth-owned sender is alive; Unavailable is appropriate. No verdict yet.
Start
full-place-stormon branchflake-full-place-storm, baseorigin/release-prod-liveabedd62b06. Read #240 comments and its linked parent #146 history. Scope: classifyevery_socket_in_a_full_place_storm_fails_closed_without_a_replywith 50 isolated runs and 50 runs under a competing test workload, preserving the 16 explicit-Close/zero-reply contract. No server changes unless a deterministic production defect is demonstrated; no deployment.P2 contract finding, test-only commit
939b456cdpushed on review-auth-busy-wake. websocket.rs:738-758 sets AUTHORITY_UNAVAILABLE on the main wake path, but websocket.rs:975-997 conditionally sends only an application Close hardcoded to 1011, then an empty WebSocket Close. The new 1013 mapping at websocket.rs:796-800 is reached only through transport.recv, so it does not cover this path.Sequence: authenticate an idle socket; require an application result as a main-loop barrier; hold the only pooled connection; publish an unrelated shared revocation; keep storage held past the existing retry wait. Result: the socket fails closed but no application/WebSocket close code is observed (codes=[]), rather than required server_busy/1013. New regression: 0 passed, 1 failed; compilation and fmt pass. This is a wire/diagnostic contract gap, not retained authorization. The main teardown shape predates this diff; the requested contract remains unmet by the candidate. No fix added. Exact-author-head full gate and touched-test lint remain in progress.
wire-review-test.log
review-sequences.txt
Source review:
review_authority_cap.rs:100-163establishes all 16 sockets before holding the fixture’s sole SQLite connection, sends an action on each, answers WebSocket and protocol pings, treats any action Result as a failure, and counts only explicit WebSocket Close messages. The fixture’s pool ismax_connections(1)atauth/tests.rs:224-232;MAX_USER_CONNECTIONSis 16 atwebsocket.rs:36, and authority wait is 1 s atwebsocket.rs:59-61. The current main-loop error path reaches teardown and sendsMessage::Close(None)atwebsocket.rs:927-985. Reproduction build is queued behind all four host build slots; no code changed.Test-only review commits pushed:
939b456cd(idle wire contract, expected red),1741038d2(12 revoked retry boundaries),9f57e0998(expiry crossing held read),4f70e46af(wall/runtime clock roles),bbdd236bb(closed notification source),8f5846229(16 real sockets recover application authority).Five new tests PASS, one wire regression FAIL: close codes=[] rather than required 1013. The boundary matrix suppresses guarded work for all 12 stalls and recovers all four read places plus the pool. The 16-socket case verifies application results after the shared wake, not only content-free proofs. No fixes or deploy. Exact author-head full gate is still in progress; final review-head full gate follows. Tests ran from the compiled review binary; raw outputs will be attached with final gates. Formatting and test compilation pass; new-source workspace lint remains pending in the final gate.
Test-only placement step committed and pushed at
0705cfbf3: move the closed-channel review module after Lease implementation, following the items_after_test_module convention; assertions unchanged. Fmt PASS; closed-channel compiled-binary repeat PASS. The six new test commits remain separate. Exact author-head fast gate is still running (no test failures reported so far). Review-head touched-server clippy, full fast gate, static artifact comparison versus author head and supplemental TypeScript are serialized to start after it releases its slot. Final verdict pending these receipts.Targeted test harness build complete at unchanged HEAD
abedd62b068cbd0af0c51488abb0a6e0ddf4ce4e; no repository files changed.cargo test --locked -p infraternal-server --lib every_socket_in_a_full_place_storm_fails_closed_without_a_reply --no-runpassed through build-slot in 11m42s with two Cargo jobs. Binary:$HOME/.cache/codex-scratch/flake-full-place-storm/target/debug/deps/infraternal_server-6dc06b768874f2f9. Cohort runs are next.The 50-run isolated cohort is queued but has not started: all four host build slots are occupied by other jobs. The targeted test binary is ready in
$HOME/.cache/codex-scratch/flake-full-place-storm/target; continuing as soon as a slot is released. No work outside this branch has been started.Functional review evidence at pushed head
0705cfbf3: five new tests PASS, one deliberate P2 contract regression FAIL (idle unavailable wake observes no 1013 code). Twelve revoked-stall inputs cover 0/24/25/26/100/300/800/925/975/1000/1025/1200 ms of controlled runtime time; no guarded write, all four read places and the pool recover. Both deadline callers refuse expiry crossed during a held read. Closed watch is Unavailable without polling the write. Sixteen actual sockets recover authenticated application results after a controlled short shared wake stall.Clock qualification: real wall expiry and independent runtime movement are tested; the live host CLOCK_REALTIME is not stepped. Static comparison confirms the unavailable-wire teardown block is byte-identical between
6fe600b0eand300c0c8cb, so the P2 is a pre-existing contract gap. No new authority-retention regression found. Original author server suite passed 626/626 active tests (52 ignored). Full author gate is building static artifacts; final review-head lint/gate remains serialized afterward.matrix-direct-test.log
expiry-review-test.log
clock-review-test.log
closed-review-test.log
storm-review-test.log
functional-results.json
review-audit.txt
teardown-comparison.txt
Correction to the source-review line references:
MAX_USER_CONNECTIONS = 16is atwebsocket.rs:72(not line 36);AUTHORITY_WAIT = 1 sis atwebsocket.rs:87; the fixture pool cap is atauth/tests.rs:229; the main-loop teardown WebSocket Close is atwebsocket.rs:977.Unaccompanied cohort complete at unchanged HEAD
abedd62b068cbd0af0c51488abb0a6e0ddf4ce4e: 50/50 pass oninfraternal-dev(12 CPUs), no companion test started by this job. Load average: 22.12 / 21.59 / 21.91 at start; 34.78 / 26.21 / 23.54 at end. Each outcome was an explicit WebSocket Close and no action Result; no failures to diagnose in this cohort. Receipts: isolated.log, isolated-summary.json. Starting 50 runs alongsidecargo test -p infraternal-protocol.Controlled cohort finding at unchanged HEAD
abedd62b068cbd0af0c51488abb0a6e0ddf4ce4e: 38/50 pass, 12/50 fail when run besidecargo test -p infraternal-protocol(212 companion runs, 0 failures). The failed assertions counted 8, 9, 10, 11, 11, 11, 11, 12, 12, 14, 14, and 9 explicit WebSocket Closes out of 16. No action Result was observed; every failure reachedreview_authority_cap.rs:162in under 2 seconds, before its 15-second reader bound. Machine: infraternal-dev, 12 CPUs; load average 8.97 / 15.60 / 19.94 at start, 16.33 / 15.53 / 19.40 at end. This shows the failure is reproducible under a competing test workload, but the current assertion does not distinguish EOF from a socket that stayed open. Receipts: loaded.log, loaded-summary.json, protocol-companion.log. Next: record each socket's terminal outcome and make the timer-controlled run deterministic before classifying.Exact author-head validation completed on detached
300c0c8cb7: scripts/verify fast exit 0, no load/baseline exception used. All nine Rust rows and all TypeScript phases pass. Original server suite: 626 passed, 0 failed, 52 ignored. Stripped static artifacts match exact caps: x86_64 21,389,040 bytes; aarch64 19,561,912 bytes; PT_INTERP absent. The complete unfiltered gate transcript is attached.Verbatim final Rust gate output:
author-verify-fast.log
author-gate-summary.txt
author-static.json
The same detached validation checkout is now at review head
0705cfbf3for touched-server clippy and final review-head fast verification. Candidate artifacts were recorded before changing that checkout. Test-only review verdict still pending final lint/gate receipts; no fixes or deploy.P3 cleanup-order finding, test-only commit
737b2c095pushed. websocket.rs:953-961 now receives typed AUTHORITY_UNAVAILABLE from the wake branches and therefore awaits failure_reason/teardown_read before the stream-end record and drop(attachments) at :969. Before this diff, that miss became RESUME_REFUSED and skipped the pre-drop classification read. Stream-resource cleanup moves later by one attempt bound (25 ms production). Guarded work is not polled during it; known Refused keeps its old ordering; the total socket-close path still has one teardown read in either ordering. This is not an added authorization grace period.The new attached-terminal regression deletes the session on the held connection, publishes revocation, parks browser probes, keeps storage unavailable, and advances controlled runtime through the existing one-second wait. With the fixture's existing 100 ms attempt bound, stream-end records are still absent at that fence: 0 passed, 1 failed at the cleanup assertion; setup/liveness checks completed. No physical latency claim. The old ordering is established by source comparison, not a full-base replay. No fix added.
Seven new review tests now comprise five PASS and two deliberate diagnostic regressions (P2 wire code, P3 cleanup ordering). Original author-head fast gate completed exit 0 and is attached above. A full gate on final review head
737b2c095is queued behind the isolated0705cfbf3milestone; final verdict pending head lint/gate and cleanup.stream-end-review-test.log
stream-end-sequence.txt
0705cfbf3milestone hit the owner-listed auth socket storm exception at review_authority_cap.rs:162: explicit WebSocket Close count 10/16, with no application Result observed (that would fail earlier). The exact author-head fast gate had passed in its earlier window. Comparing against owned detached origin/devadee19da0now, using the same CARGO_TARGET_DIR. The storm test function is byte-identical on that dev baseline. Baseline compile is in progress; paired compiled-binary checks will record each load window before any exception is applied. No production fix or timeout change. Final review head remains pushed737b2c095.Owner #118 baseline comparison complete in fixed paired order on the same build host/load window: detached origin/dev
adee19da0initial filtered run PASS, then dev 3/3 PASS; retained review executable 2/3 PASS, one Close-count failure. Every invocation selected exactly one test; the test function is byte-identical. The paired JSON records each start/load and all outcomes, with no timing claim. No matched-baseline failure was reproduced, so I am NOT applying the load exception. The final737b2c095gate must pass this pre-existing case; it is queued behind the earlier isolated milestone. No production or timeout changes.dev-storm-test.log
storm-paired-results.json
storm-pair-3-candidate.log
storm-baseline-comparison.txt
Diagnostic outcomes narrowed the loaded failures: the 10-run cohort passed 7/10; all three failures observed
Connection reset by peer (os error 104)on clients that did not receive a WebSocket Close, with no action Result and no 15-second timeout. The companion protocol test passed 87/87. This proves a terminal TCP reset rather than a socket that remained open, but it does not prove a clean WebSocket close. I am retaining the explicit-close and no-reply assertions while comparing a paused Tokio-time cohort. Evidence: diagnostic-error.log, diagnostic-error-summary.json, diagnostic-error-protocol.log.Verdict: HOLD — the stated 1013 wire acceptance criterion is not met (P2). No P0/P1 found. Findings: 1 P2, 1 P3. No fixes or deploy.
Reviewed 6fe600b0e..300c0c8cb. Test-only branch review-auth-busy-wake is pushed at
737b2c095b; eight atomic commits contain seven new tests plus test placement cleanup. Root worktree is clean and origin matches HEAD.939b456cd.737b2c095. Old ordering is established by source comparison, not a full-base replay.Edges checked: twelve revoked-stall boundaries, expiry crossing a held read, fractional deadline arithmetic, closed revocation source, separate wall/runtime clock behavior, sixteen real sockets recovering application authority, and all four retained read places plus pool recovery. Five new tests pass; two intentionally fail at the findings above. A closed notification source correctly means unavailable infrastructure; normal Auth ownership keeps its sender alive. No new authorization grace period was found. Live CLOCK_REALTIME was not stepped, and no fresh performance claim is made.
Exact author head
300c0c8cb: scripts/verify fast completed exit 0, with no exception. Server: 626 passed, 0 failed, 52 ignored. Verbatim Rust gate output:Final review head
737b2c095: touched-server all-target clippy with remote,infraternal-agent/mesh and -D warnings PASS. Full scripts/verify fast completed exit 1 solely for the two intentional review regressions: server 631 passed, 2 failed, 52 ignored. Every other Rust row passes. Verbatim final gate output:The Rust failure stops the dispatcher before TypeScript, so supplemental TypeScript was run separately and completed exit 0. Complete unfiltered gate and lint/TypeScript transcripts are attached.
The pre-existing 16-socket storm passed in the final full run. Earlier milestone failure (10/16 Close count), owned detached dev baseline
adee19da0and fixed paired results are recorded above: dev 3/3 PASS, review 2/3 PASS. No matched-baseline exception was applied or needed for the final head.D243 same-recipe comparison against the review branch's merge base
300c0c8cb: stripped static x86_64 21,389,040 -> 21,389,040 bytes (+0); aarch64 19,561,912 -> 19,561,912 (+0). Both images are byte-identical and satisfy their exact caps.Cleanup complete: owned detached author/baseline checkouts, the one Cargo target folder, retained test executables and any worktree target/ are removed. Raw receipts remain outside the checkout and are attached here. Issue remains open.
author-verify-fast.log
author-gate-summary.txt
author-static.json
final-verify-fast.log
final-gate-summary.txt
final-server-clippy.log
final-typescript.log
binary-comparison.json
functional-results-final.json
review-audit-final.txt
review-commit-history.txt
cleanup.json
Start: branch
auth-busy-1013, baseorigin/review-auth-busy-wakeat737b2c095b61d960fab726f56ce0511a0300acd0. Fixing the two review regressions: route known Unavailable teardown through the existing 1013 close-frame path and skip the redundant teardown authority read. Existing limits remain unchanged.The paused-clock focused test is still queued in the host-wide build-slot wrapper; its compile/test command has not started. The worktree change remains limited to the storm test. I will continue once a slot is released.
Paused-time diagnostic: the strict assertion passed once all real SQLite/WebSocket setup finished and Tokio time was paused immediately before the storm calls (1/1, 16 explicit Close outcomes, no Result).
start_paused = truefrom runtime creation instead made the SQLx in-memory fixture fail atauth/tests.rs:232withPoolTimedOut, so the test now pauses only after acquiring the held connection. Evidence: paused-single.log.Confirmed against head
737b2c095: the main-loop wake recordsAUTHORITY_UNAVAILABLE, but teardown calledfailure_reasonbefore releasing attachments, then the final close path could make another liveness read and suppress the close. The #240 review receipts show the wire case observed no close code and the attached-terminal case had no stream-end by the one-second fence. The working diff preserves the known unavailable result, skips both reads, and sends the existing control close frame with code 1013 and theserver_busyclassification. The retry and read limits are unchanged. Targeted validation is pending.The revised 50-run isolated + 50-run companion-load harness has been waiting in
build-slotfor more than five minutes. It has not started and has produced no cohort logs. It needs a host-wide slot release; I am keeping it queued.Correction from a second source pass:
AUTHORITY_UNAVAILABLEis also provisional after a guarded frame failure (websocket.rsframe handler), wherefailure_reasonmust still distinguish a refusal from a busy store. I am tracking the typed known-unavailable outcome separately; only an exhausted wake read or a closed revocation source will bypass that classification read. This keeps revoked-session behavior intact.The paused-clock experiment rejects the time-control approach for this test: with the exact 16-WebSocket-close assertion, the edited test passed 35/50 isolated and 45/50 with the protocol companion test (162 companion passes, 0 failures). Every failed run reported
Connection reset by peerfor sockets without an explicit Close; none timed out or received a Result. Automatic time advancement also advances the production 25 ms best-effort close deadline before every close frame can be observed. I will assert the actual fail-closed contract instead: every socket reaches a terminal outcome (Close, EOF or read error), no Result is received, and unexpected messages/timeouts fail. Evidence: paused-isolated.log, paused-isolated-summary.json, paused-loaded.log, paused-loaded-summary.json, paused-protocol-companion.log.Step evidence:
run_socketnow tracks a typed Unavailable outcome separately from the provisional frame-error reason. Known busy wakes release attachments without another authority read and send the control close frame with code 1013; refusal classification remains on provisional paths. No wait, retry, or pool limit changed. Withremote,infraternal-agent/mesh, both requested tests pass (1/1 each). Full server validation and the repository iterate gate are pending; the diff is still uncommitted at base737b2c095.review-1013-final.log
review-cleanup-final.log
Classification: test defect. The original assertion equated a WebSocket Close frame with a closed socket. Under load, misses were
Connection reset by peerterminal reads, not timeouts or action Results. Pausing Tokio time is unsuitable here: it also advances the 25 ms best-effort close write deadline and produced 35/50 isolated, 45/50 loaded with the strict assertion. The revised test requires all 16 sockets to reach a terminal read outcome (Close, EOF or read error), still panics on any Result, and fails on unexpected messages or a 15 s timeout. It passed 50/50 isolated and 50/50 loaded alongside 409 successful protocol test runs (0 companion failures).infraternal-dev, 12 CPUs; load average start/end: isolated 17.02/12.41/12.84 → 10.03/10.99/12.28; loaded 10.03/10.99/12.28 → 6.31/9.79/11.76. Evidence: terminal-isolated.log, terminal-isolated-summary.json, terminal-loaded.log, terminal-loaded-summary.json, terminal-protocol-companion.log.Start revocation-per-account at
300c0c8cb7(origin/auth-busy-wake). origin/auth-busy-1013 is not pushed. Read #240 history and retrieved parent #146 history. Continuing the recorded per-account watch/lifecycle plan: independent generations, subscribe before authority reads, publish after commit, remove the last subscriber's entry. Logout carries account and session hash; recovery carries account. No current production mutation affects every account; any all-account test notification models out-of-band database changes only. No deploy or development-line push.Finding: websocket.rs:726 also guards recovery-state delivery with while_authorized on the server-wide recovery_changes channel. auth/webauthn.rs:222 publishes it after recovery completion, so scoping revocations alone would still make every recovery-subscribed account read authority. Reusing the account registry for recovery-state notifications in a separate logical commit; start/cancel/rotation/complete already know the affected account. No global production recovery-state case exists. Existing per-account snapshot contents and subscription protocol stay unchanged.
Additive contract note before documentation: keywrap.md recovery visibility retains its existing protocol and account-selected snapshots. Document that revocation and recovery-state wake generations are independent per authenticated account, subscribed before entry reads, published after commit, and coalescing always means recheck that account. Session hashes are private hints, never a reason to skip a recheck. Current logout/recovery mutations have no server-wide case; shutdown/restore restart ends sockets directly. Test-only unknown-scope database notifications may wake every account to model infrastructure loss. No foundational choice or frozen wire change.
scripts/verify iteratereached server clippy and found one touched-file lint:clippy::items_after_statementsbecauseSocketOutcomeis declared inside the test after setup statements (review_authority_cap.rs:125). I will move the enum to module scope and rerun the affected gates.Registry checks: 6/6 PASS in a standalone harness against built Tokio/futures dependencies. Covers coalesced two-account generations, cancellation, 256 independent accounts, last-subscriber removal, 4 concurrent registration/cleanup callers and notification outside the registry lock. This is an early functional check, not the server crate gate. Pre-fix server compilation at
300c0c8cbremains in progress. No commits yet.primitive-standalone.log
Committed and pushed
9896d3a85749...asauth-busy-1013. The remote-feature server suite passed 633 tests, 0 failed, 52 ignored; all-target clippy withremote,infraternal-agent/meshpassed.scripts/verify iterateexited 0: all eight Rust rows passed, and each TypeScript phase reported 0 failures (345 tests across 59 files, plus the smaller protocol, metadata and release suites). Finalscripts/verify fastis pending.Auth self-review (B1/S1/S2/N1): typed refusal behavior stays intact; provisional frame errors still go through
failure_reason; only confirmed Unavailable avoids another authority read and reportsserver_busy/1013. Retry, timeout, pool and renewal limits are unchanged. No schema, dependency, crypto or parser changes; no secrets enter code or logs.server-remote-tests.log
server-remote-clippy.log
verify-iterate.log
Correction: the full commit SHA is
9896d3a85b7499fee9e7237fc6233c913f41bd5b.Base update: origin/auth-busy-1013 appeared at
9896d3a85b. Fast-forwarded revocation-per-account to it before any own commit, as requested. Stopped only own build process group 2945118; its partial primitive crate gate is not counted as a pass. Baseline checkout now also9896d3a85. Static comparison and remaining gates will use that merge base.Valid old-base (
300c0c8cb) red results: account notification 0/1; admission/subscription gap 0/2; 256 sockets/16 accounts logout 0/1, one unrelated account authority reads 112 -> 128 (+16). The old recovery capacity run failed at fixture setup (synthetic future NOW after HTTP wall-time renewal), so it is not evidence of the product defect. Corrected to current recovery time and the returned ready_at; rerunning on9896d3a85before the recovery fix.Pre-fix evidence on
9896d3a85: admission/subscription-gap tests 0/2; account notification + full-capacity logout tests 0/2; corrected full-capacity recovery test 0/1. Real SQLite and 256 real WebSockets across 61 accounts. One unrelated four-socket account reads 28 -> 32 on logout (+4), and 28 -> 40 on recovery start/completion (+12). The recovery fixture now uses wall time and returned ready_at; it reaches completion and fails the intended read-isolation assertion.Build-host functional evidence only, no latency claim. Environment and exact reproduction sources attached. The first primitive module crate gate is running; no own commit yet.
red-upgrade-9896.log
red-logout-9896.log
red-recovery-9896.log
base-functional-9896-environment.json
baseline-regressions-9896.patch
Reproduction source supplement: the attachment endpoint rejected the .rs extension (HTTP 422); the identical capacity fixture is attached as plain text. The preceding patch includes the test-only read counter and test-module registration.
baseline-capacity-9896.txt
Moved
SocketOutcometo module scope and madeReadErrora unit variant so failures retain outcome categories without dead-field warnings. The focused storm test passes (1/1);cargo clippy --locked -p infraternal-server --all-targets -- -D warningspasses. I am rerunningscripts/verify iteratefor a green branch gate. Evidence: final-focused.log, server-clippy.log.Self-review caught an uncommitted registry cleanup race: checking watch.receiver_count in the wrapper Drop runs before receiver fields are destroyed. Two final wrappers can both see two receivers and retain an inactive entry. A test-only barrier holds both receiver fields after bookkeeping; the regression fails before correction and passes afterward. The registry now counts subscription lifetimes under its existing mutex with no extra allocation or atomic counter, and checks key identity so an old closed cursor cannot remove a replacement generation.
Standalone module: 9/9 PASS. The crate gate also found one single_match_else lint, corrected to if let. That partial gate is not a pass; exact-source crate validation is scheduled after the clean
9896d3a85static baseline build currently running. No own commit yet.red-final-subscriber.log
green-final-subscriber.log
The post-fix
scripts/verify iteratererun has waited inbuild-slotfor more than five minutes and has not started. The focused storm test and server all-target clippy pass; the full fast gate remains required. This needs a host-wide slot release.Post-fix
scripts/verify iteratepasses. Rust rows: fmt, VT native fmt, compile-out, clippy, SSH runtime helper, workspace tests, inode fixture and cargo-deny all PASS; server suite: 622 passed, 0 failed, 52 ignored. TypeScript protocol suite: 39 passed, 0 failed. Evidence: verify-iterate-final.log. I am committing this single test-contract correction, then runningscripts/verify faston the branch head.Committed the single test-contract change as
edfdb18124fb8bdb772f60f59bb576b3c94ce462. The post-fix iterate gate passes (server 622 passed/0 failed/52 ignored; protocol 39 passed/0 failed), and the revised test passes 50/50 isolated and 50/50 under the protocol-test companion load. The finalscripts/verify fastgate and static size delta are next.Step 1 committed and pushed:
95e5de0e2d. Account notification registry introduced behind test configuration before production wiring. Formatter PASS; server all-target clippy with remote,infraternal-agent/mesh PASS; module tests 9 passed, 0 failed. Concurrent final-drop cleanup, replacement identity, coalescing, closed source and wake-lock safety are covered.Clean
9896d3a85static x86_64 baseline: 21,389,424 bytes, stripped static PIE, PT_INTERP absent (384 bytes above the earlier recorded cap). This is the merge-base reference for the branch delta. No dependency, schema or deployment change.gate-primitive-final.log
baseline-size.json
Full fast gate finding:
scripts/verify fastreporteda_live_legacy_runtime_cannot_publish_an_unheld_lifetime_filefailed atcrates/plugins/remote/src/runtime_lock_tests.rs:109(assert!(acquire(&fixture.state()).is_ok())); that suite had 97 passed, 1 failed, 15 ignored. The gate is still building aarch64. I will rerun the isolated test after that build finishes to determine whether this was transient.The x86_64 static artifact measured 21,389,424 bytes against the existing 21,389,040-byte cap (+384 bytes); baseline
300c0c8cbmeasured 21,389,040 bytes. I will record the aarch64 result and address the exact cap after the gate completes.Checkpoint at pushed head
95e5de0e2: pending revocation routing diff attached. It enables the registry, uses DELETE RETURNING user_id for logout, publishes recovery revocation to its account, scopes all six trusted subscriber paths, and adapts closed-source/busy-wake fixtures without changing their assertions. The OtherAccount transient fixture now asserts zero retained reads through a controlled 300 ms store hold. Formatter passed; full touched-server clippy/test command is still waiting for a host build slot (no gate result). Recovery-state routing, bootstrap entry rechecks, capacity fixture registration and final gates remain separate following steps.revocation-routing-pending.patch
Contract step pushed:
b4c60d727aadds the notification requirements already proposed above;963b21634clarifies that recovery retires old sessions while preserving the recovered account/new enrollment session. Documentation only, git diff --check PASS, no Rust/TypeScript touched. No wire/request/schema or decision change. This is the required behavior for the pending implementation, not a deployment claim. Revocation routing validation remains queued.First
scripts/verify fastcompleted with exit 1. The remote crate suite reported 97 passed, 1 failed, 15 ignored:a_live_legacy_runtime_cannot_publish_an_unheld_lifetime_fileatcrates/plugins/remote/src/runtime_lock_tests.rs:109. Static artifacts measured x86_64 21,389,424 bytes (+384 vs300c0c8cb) and aarch64 19,562,296 bytes (+384); the prior exact caps were 21,389,040 and 19,561,912. Other Rust gate rows passed. I will reproduce the isolated test and ratchet both exact caps to the measured artifacts.Raw gate log: verify-fast.log
The full-suite runtime-lock failure did not reproduce in isolation with the workspace feature set. The exact test passed: 1 passed, 0 failed, 112 filtered out (
cargo test -p infraternal-plugin-remote --lib --features agent,server,test-support,tokio/rt-multi-thread ...). Log: runtime-lock-isolated-full-features.log. I will confirm the full workspace suite on the final fast-gate rerun.Cap-only step pushed as
5280c44d4. Exact ceilings now match the measured artifacts: x86_64 21,389,424 bytes and aarch64 19,562,296 bytes (+384 bytes each vs300c0c8cb).bash -n scripts/verify.d/rust.shandscripts/test-static-size.pypassed, including exact-cap acceptance, one-byte-over rejection, and downward-ratchet checks. static-size-cap.logRevocation routing committed and pushed:
f16bbe216e. Logout uses one DELETE RETURNING statement for account + private session hint; recovery revocation and six trusted subscriber paths use account generations. Existing guards, 4 read places, attempt/total retry bounds, renewal and typed busy/refused outcomes remain unchanged.Formatter PASS; all-target server clippy PASS (remote,infraternal-agent/mesh). Full server library result, verbatim:
The idempotent/metadata/isolation test, 300 ms controlled unrelated-account store hold with zero retained reads, own-session refusal, full-place storm and inherited 1013/closed-source review cases all pass. No baseline exception used. Recovery-state scoping is now the next uncommitted step.
gate-revocation-final.log
Finished on
auth-busy-1013, head5280c44d42ddcd0158e472c21e6fec9a1e7179aa, pushed to origin. The code fix is9896d3a85; the separate exact-cap update is5280c44d4.Reviewer checklist: only typed known Unavailable outcomes skip the redundant teardown authority read; provisional frame-error reasons still pass through
failure_reasonand retain refusal classification. Other close reasons retain the existing liveness check. Known unavailable closes use 1013/server_busy, and attachments are released without adding retries, reads, renewal, or pool limits. No auth storage, crypto, rate-limit, or UI paths changed.Final
scripts/verify fastoutput (verbatim):Static-size delta vs
300c0c8cb: x86_64 21,389,424 vs 21,389,040 bytes (+384); aarch64 19,562,296 vs 19,561,912 bytes (+384). Both exact caps and one-byte-over rejection checks passed. Full final gate log: verify-fast-final.logRecovery-state routing committed and pushed:
9427866232. Start/cancel/rotation/completion now publish only to their account; notification schema, audit and credential verification are unchanged. Formatter and all-target server clippy PASS; recovery filter: 28 passed, 0 failed, 3 ignored. Existing 16-device start/cancel socket coverage and other-account signal assertions pass.Self-review correction needed in the earlier
f16bbe216logout query: pinned SQLx fetch_optional limits RETURNING to one row and resets the iterator before forwarding it. A real SQLite deferred-constraint probe reports success while the parent row remains (1). This loses a commit refusal. Added an actual Auth regression before changing logout; it is queued/running. Planned correction: fetch_all drains the statement through completion before any success/publication; token_hash is unique, so the result is bounded to one row. This retains one SQL statement and avoids separate lookup or transaction round trips. No deployment.gate-recovery.log
statement-completion-probe.log
Classification: test defect. The old assertion required all 16 clients to receive an explicit WebSocket Close frame before a wall-clock timeout. Production performs a bounded best-effort close, so a client can observe a TCP reset after the server has already closed the socket. The revised test records terminal outcomes (Close, EOF, or read error) for every client, while still failing on a result frame, an unexpected message, or a 15-second timeout. Production code and limits are unchanged.
Final revised test cohorts on infraternal-dev (12 CPUs): isolated 50/50 pass; under concurrent
cargo test --locked -p infraternal-protocol, 50/50 pass. The companion protocol test ran 409 times with 0 failures. Load average for the loaded cohort: 10.03/10.99/12.28 at start, 6.31/9.79/11.76 at end.Static stripped binary sizes vs
abedd62b0, using the documented static recipe: x86_64 21,389,296 bytes (delta 0); aarch64 19,561,656 bytes (delta 0).Head
edfdb181246b057265ebfc7cf99e8b89deca37c2pushed toorigin/flake-full-place-storm.Final
scripts/verify fastoutput (verbatim):Full raw gate transcript: verify-fast-final.log.
Auth-level commit-refusal regression reproduced before correction at
942786623: 0 passed, 1 failed, "a refused commit was reported as logout success". The fixture adds a real deferred foreign-key constraint on its in-memory sessions row; no migration or production schema change. This confirms the earlier driver probe reaches logout itself.Correction under validation: drain DELETE RETURNING through fetch_all, bounded to at most one row by the unique token hash, and publish only after successful statement completion. Keeps one SQL statement; rejected extra lookup and BEGIN/COMMIT round trips. Formatter applied; touched-server lint/logout/close-log tests are queued/running.
red-logout-commit.log
Step logout-completion committed and pushed:
8d44a362ba. Formatter and all-target touched-server clippy PASS (remote,infraternal-agent/mesh). Relevant functional test output, verbatim:gate-logout-commit.log
Step bootstrap-entry committed and pushed:
cf609f9771. Formatter and all-target touched-server clippy PASS (remote,infraternal-agent/mesh). Relevant functional test output, verbatim:gate-bootstrap-entry.log
Step capacity committed and pushed:
f4e5b6aadf. Formatter and all-target touched-server clippy PASS (remote,infraternal-agent/mesh). Relevant functional test output, verbatim:gate-capacity-final.log
Iteration milestone on pushed
f4e5b6aadf: scripts/verify iterate PASS; server 650 passed, 0 failed, 52 ignored. No load exception. Static builds now running for exact size measurement against reproduced auth-busy-1013 merge base9896d3a85. Verbatim gate summary:Static builds on
f4e5b6aadfsucceeded. Stripped x86_64: 21,395,728 bytes versus reproduced auth-busy-1013 merge base 21,389,424: +6,304 bytes. ARM: 19,572,056 bytes. x86_64 is static PIE, stripped, with no PT_INTERP. Reviewer B1/S1/S2/N1 check attached. Exact-ceiling update plus final scripts/verify fast is queued for a shared build slot; iteration already passed. No deployment.head-static-sizes.json
self-review.txt
Measured size ceilings committed and pushed:
57185fd9bf. Stripped static x86_64: 21395728 bytes; reproduced merge base 21389424 bytes; delta 6304 bytes. ARM static: 19572056 bytes. No dependency, feature or build-profile changes. Exact-cap, one-byte-over rejection, downward-ratchet and unknown-target checks PASS. Reviewer B1/S1/S2/N1 checks attached. Full final gate starts on this head.head-static-sizes.json
gate-static-ceilings.log
self-review.txt
Final fast gate on
57185fd9bf: existing auth socket full-place contention test failed at review_authority_cap.rs:162 (14 close outcomes, expected 16); server result 649 passed, 1 failed, 52 ignored. All four new per-account tests PASS. Not waived. Exact failed test is building on detached origin/dev5868ef5360in the same host-load window; environment and assertion attached. Other gate rows continue. A complete final gate rerun will follow the comparison.full-place-failure.txt
baseline-load-environment.json
Close-count comparison complete: isolated branch test PASS (1/0), detached dev
5868ef536test with matching remote,infraternal-agent/mesh features PASS (1/0). Test source is byte-identical. The initial 14/16 failure was not reproduced; no load exception is applied and no test/deadline was changed. Every other initial Rust gate row, including both static builds, passed. Complete scripts/verify fast rerun on unchanged pushed head57185fd9bis queued. Full initial transcript and both comparison results attached.verify-fast-initial.log
head-full-place-rerun.log
baseline-load-full-place-matched.log
baseline-load-environment.json
Finished on pushed branch revocation-per-account, head
57185fd9bf, based on auth-busy-10139896d3a85b. No deployment.Logout and recovery notifications are scoped to the committed account; known session hashes remain private hints. Coalescing always rechecks the account, including an earlier logout hidden by a later session hint. All six revocation subscribers use account scope; recovery-state notifications are scoped too. Bootstrap sockets recheck after subscription. Logout drains its bounded RETURNING result through statement completion before publication. Account entries disappear after the last cursor, including concurrent drops. No current production logout/recovery case needs a server-wide event; shutdown/component disable retain independent lifecycle signals.
Real-engine functional evidence: 256 sockets across 61 accounts; both logout and recovery completion close 16 affected sockets without advancing runtime time; all 240 unrelated sockets add zero authority reads and still complete authenticated application work. Baseline 9896 reproduction: one unrelated four-socket account added four reads on logout and twelve on recovery. Coalesced-session, surviving-session, lost-source, commit-refusal and subscription-gap checks PASS. Full gate PASS; reviewer B1/S1/S2/N1 receipt attached. No build-host duration is claimed as latency evidence.
Stripped static x86_64: 21,395,728 bytes versus merge-base 21,389,424: +6,304 bytes. ARM: 19,572,056 bytes. Exact ceilings and their boundary checks PASS; no new dependency or feature.
The first full run had a 14/16 close-count failure in an existing auth socket test. Isolated branch and feature-matched detached dev runs both passed; no exception was applied. The complete final rerun passes. Temporary checkout and build products were removed; evidence receipts remain.
scripts/verify fast output (verbatim summary and final output; complete unfiltered transcript attached):
verify-fast.log
verify-iterate.log
head-static-sizes.json
self-review.txt
cleanup.txt
Initial failure and comparison receipts:
verify-fast-initial.log
head-full-place-rerun.log
baseline-load-full-place-matched.log
baseline-load-environment.json
Start independent verification review #240. Branch review-revocation-per-account; base/head
57185fd9bf; diff base9896d3a85. Read issue #240 and parent #146 history. Test-only changes; cover subscription orders, coalescing/source loss, concurrent recovery/logout, identity changes, transaction refusal and inherited busy-store outcomes. No deployment or remote host access.Audit progress: test-only cases added for two-account revocation, 65,536 coalesced overwrites plus unknown-scope fallback, concurrent A recovery/B logout, out-of-band reassignment/deletion, SQLite statement rollback, both bootstrap subscription orders, lost bootstrap source, and cancellation after an externally observed logout commit. Validation is queued behind the shared build-slot wrapper; no result claimed yet. Source inspection: watch channels have no bounded queue/lag error; source loss must fail closed per contracts/keywrap.md. No production reassignment/deletion path exists.
Finding R1 — committed logout can lose its wake on caller cancellation. Test auth::tests::logout_commit::review_account_scope_committed_logout_keeps_wake_when_waiter_is_cancelled fails at logout_commit_tests.rs:146: "committed logout lost its notification when the waiter was cancelled". A separate disk-SQLite observer sees the session deletion commit while the logout future is suspended; cancellation then drops the waiter before sessions.rs:124 publication. The only pool connection is reacquired as a completion fence. 0 generations published for 1 committed deletion. This is a cancellation-safety gap inherited from the old post-await publication pattern, not evidence of cross-account access. Reproduction is at the Auth API boundary; HTTP cancellation reachability is not established by this test.
Finding R2 — lost bootstrap notification source does not fail closed. Test bootstrap_api::tests::review_account_scope_lost_bootstrap_source_retires_instead_of_spinning fails at bootstrap_api_tests.rs:1055: "lost revocation source retained bootstrap instead of failing closed". bootstrap_api.rs:331 ignores changed() errors and repeatedly reauthorizes the still-live session. contracts/keywrap.md requires source loss to fail closed as unavailable. The test-only source-removal hook models unexpected loss; normal registry ownership prevents this state today. Cleanup explicitly logs out and waits for the upgrade permit to return. Defensive P2 contract gap.
First new-case run: 7 passed; 2 failed. Passing: two-account revocation, 65,536 overwrites per affected account plus global fallback, simultaneous recovery A/logout B including recovery completion, original-account authority after reassignment, deletion with an open socket, rollback then committed retry, and logout after bootstrap subscription. Existing pre-subscription tests and inherited busy outcomes are in the repetition suite.
scope-first.log
Step pushed:
1a16ddd43on review-revocation-per-account. Five account-scope cases pass: two-account logout, 65,536 coalesced generations per account with all-account fallback, simultaneous recovery/logout, reassignment authority binding, and deletion with an open socket. cargo fmt --all --check exit 0; all-target touched-server clippy (remote,infraternal-agent/mesh) exit 0. Product code unchanged. The two boundary reproductions remain uncommitted while the required five-run suite executes.Step pushed:
7d3bdc892. Bootstrap logout after the installed-subscription fence passes; source loss fails closed-contract assertion as recorded in R2. The test cleans up its upgrade via explicit logout and permit-return fence even on failure. Formatter/clippy exit 0. No product change.Step pushed:
f52fd309b. Real SQLite statement rollback then successful retry passes; cancellation after an externally observed committed deletion fails the notification assertion (R1). Explicit single-connection return fence and database cleanup complete before the assertion. Formatter/clippy exit 0; no product code changed. Five repeated #240 runs and the full fast gate continue on this head.Five consecutive #240 union runs completed on pushed
f52fd309b. Each ran 38 tests: 36 passed, only R1/R2 failed; no baseline/load exception. Both capacity cases pass each time (256 sockets, 61 accounts, 16 affected, 240 unrelated usable; zero unrelated authority reads). 1013 busy close and sixteen-socket recovery pass in all five. Formatter and touched-server clippy exit 0. Static merge-base reproduction is running, followed by full scripts/verify fast.Verbatim results:
review-run-1.log
review-run-2.log
review-run-3.log
review-run-4.log
review-run-5.log
run-review-command.txt
Static baseline reproduced at
9896d3a85with scripts/static-cargo and the same job target/toolchain: x86_64 static PIE, stripped, 21,389,424 bytes. No alternate recipe or dependency change. Full scripts/verify fast has started on pushedf52fd309ba; final head sizes remain pending.size-baseline.log
Gate resource note on
f52fd309b: shared disk free space fell to 12 GiB while GNU test binaries compiled. Removed 430 inactive incremental-cache directories from this job only, retaining the active infraternal_server cache and all dependency artifacts. Paused/resumed only own Cargo PID 3808132 to prevent a new compiler starting during cleanup. Free space returned to 17 GiB. No test, compiler option or product change; fast gate continues.Full fast gate server result on
f52fd309b, verbatim:Only R1/R2 fail; no inherited failure or load exception. fmt, VT native fmt, CLI compile-out, workspace clippy, SSH runtime helper, SSH inode reuse and cargo-deny completed successfully. Both shipping static builds are running. Removed this job GNU debug artifacts only after all GNU checks completed and after confirming no executable in target/debug remained active.
Head x86_64 static image reproduced on
f52fd309b: 21,395,728 bytes, compared with merge base9896d3a85at 21,389,424 bytes: +6,304 bytes, exactly the claim. Production trust and native key-memory checks pass. Verbatim size line:ARM static build is running; full gate remains pending.
Independent verification review finished: HOLD on
review-revocation-per-account, pushed headf52fd309ba374a540b28a352dd902a7c380cd1d3(reviewed product head57185fd9b; diff base9896d3a85). Three test-only commits:1a16ddd43,7d3bdc892,f52fd309b. No product code changed.R1:
logout_commit_tests.rs:146reproduces one externally observed committed SQLite deletion with zero notification when the awaiting logout future is cancelled. Publication is tied to the caller's post-await continuation. This is an inherited Auth API cancellation gap; the test does not establish an HTTP reset reproduction.R2:
bootstrap_api_tests.rs:1055reproduces a live bootstrap socket retained after its notification source is removed. The idle loop ignores the watch error and keeps reauthorizing. The source-removal test hook models unexpected loss; normal registry ownership retains sources today. This violates the specified fail-closed defensive contract.Ordinary account scope holds in the tested scenarios: both bootstrap subscription orders; two-account coalescing; 65,536 overwrites per affected account and all-account fallback; A recovery concurrent with B logout, including recovery completion; original-account binding after out-of-band reassignment; deletion with an open socket; failed/rolled-back logout and successful retry. In each of five runs, both 256-socket/61-account cases close the 16 affected sockets while 240 unrelated sockets do zero authority reads and remain usable. Busy-store 1013 and sixteen-socket recovery pass in all five. No load exception used.
Five consecutive #240 union results, verbatim and in order:
Full server result, verbatim:
Only R1/R2 fail. Final
scripts/verify fastsummary and exit, verbatim (complete unfiltered transcript attached):The TypeScript project stage is not reached after the Rust gate failure; no TypeScript files changed.
Static qualification: x86_64 21,395,728 bytes vs independently reproduced merge base 21,389,424: +6,304 bytes, exactly the claim. ARM 19,572,056 bytes. Static linkage, exact ceilings, production trust and compiler-metadata checks pass; native x86_64 key-memory check passes. The gate explicitly does not execute the ARM key-memory check on this x86_64 host.
Verbatim size lines:
Reproduction: stage the pinned compiler with
scripts/auth-toolchainusing a job-localCARGO_TARGET_DIR, then use the attached exact #240 runner command (remote,infraternal-agent/mesh features). Full gate ran through the host build-slot wrapper. Temporary baseline checkout and build target are removed; no executable under this job target remained active. Worktree is clean and head equals origin/review-revocation-per-account. Findings and reviewer checklist are attached; all evidence remains outside the checkout.findings.txt
verify-fast.log
gate-summary.txt
static-sizes.json
reviewer-checklist.txt
cleanup.txt
disk-cleanup.txt
clippy.log
fmt.log
environment.txt
review-run-1.log
review-run-2.log
review-run-3.log
review-run-4.log
review-run-5.log
run-review-command.txt
size-baseline.log
Release 9.4 merge, verification, staging, artifact hashes, and the five consecutive authority-storm passes are recorded on #24; final head is
b30bb81cfc.Release 9.4 (
b30bb81cf) is live with the #240 busy-store authority fix: sign-out wakes on a busy store now close with the correct outcome (resume refused / 1013 authority unavailable), and expiry keeps fractional seconds. Deploy details on #24.kayg referenced this issue2026-10-28 17:53:56 +00:00
Resumed revocation-per-account-r2 on branch revocation-per-account at pushed head
57185fd9bf; diff base9896d3a85. Read #240 and parent #146 history. Review findings file was not migrated; equivalent R1/R2 findings and exact runner are attached to #240. Next: merge test-only origin/review-revocation-per-accountf52fd309b, reproduce both failures, fix cancellation-safe publication and bootstrap source loss. No deployment.Review history merged and pushed at
ccea75217(test-onlyf52fd309b, no test weakened). Recovered missing review findings and exact union runner from #240 attachments. Source audit: sessions.rs logout publishes after fetch_all await; webauthn.rs recovery completion after tx.commit await; recovery.rs start/cancel and recovery_rotation.rs rotation have the same cancellation boundary. Plan: owned write/publication completion; preserve quiet rollback and affected-account scope. bootstrap_api.rs idle loop ignores source loss; setup idle loop does too. Handle unavailable notification source as 1013 in both shared upgrade modes, including pending sends/confirmation. Fresh R1/R2 reproduction is building through the host slot.R1/R2 freshly reproduced on merged review tests: test result: FAILED. 0 passed; 2 failed; 0 ignored; 0 measured; 709 filtered out; finished in 3.72s. Product changes now cover logout owned connection through publication, recovery start/cancel/rotation/completion owned final commit+account notifications, and typed source-loss propagation to 1013 in bootstrap/setup (idle, sends, confirmation and setup initial-request wait). Original review assertions retained; bootstrap source-loss assertion strengthened to require 1013. Added real-SQLite cancelled/refused transaction checks and setup 1013 check. Formatter/diff whitespace checks pass; server clippy/test command has waited about nine minutes for the host build slot. Final gates/size/repetitions pending. Shared disk free is about 20 GiB; this job target is 4.9 GiB. No performance measurements on the build host.
Focused fixes pass: fmt; all-target server clippy with remote,infraternal-agent/mesh; 18 passed, 0 failed, 1 ignored (perf-only), including unchanged R1, strengthened R2/1013, setup source loss, real cancelled/refused commit checks. Full iterate passed fmt, VT fmt, CLI compile-out, workspace clippy and SSH helper/inode checks. Workspace test compilation hit shared disk ENOSPC and linker bus errors as free space fell below 1 GiB. Removed 334 inactive incremental directories, then all own incremental caches after the command ended; this job debug/deps alone is about 10 GiB, free space remains about 4.6 GiB. Own build outputs only; no other job files/processes touched. Need shared capacity freed by orchestrator before final full build qualification; continuing available work.
New external gate blocker: cargo-deny reports RUSTSEC-2026-0386 for tokio 1.53.2 (AsyncFd I/O safety); fixed versions listed by the advisory are >=1.51.6,<1.52.0 or >=1.53.3. origin/dev carries the same 1.53.2 lock entry. No dependency or advisory exception changed. Request orchestrator security-update direction/patch for the shared line; this is unrelated to account-wake fixes and should stay a separate atomic dependency change. No green full-gate claim. Raw iterate and cleanup receipts retained under this job evidence path.
Resumed on shared build VM 6by32-compute02. Branch revocation-per-account, base/head
ccea75217; restored unreviewed WIP3b5618001with soft reset. Reviewing R1 owned commit/publication and R2 bootstrap/setup source-loss changes before atomic commits. Will merge current origin/dev after fixes, push each commit, run five #240 union repetitions and final scripts/verify fast. No deployment.Restored WIP reviewed: cancellation protection covers logout plus recovery start/cancel/rotation/completion. Earlier transaction authority checks stay in place; failed commits do not publish. Bootstrap/setup source loss propagates to the existing 1013 authority-unavailable close across idle, pending send, confirmation and initial setup receive paths. No dependency/features added. Existing R1 retained unchanged; R2 strengthened to require 1013, with setup coverage added. Full iterate is building through the host slot; about 109 GiB free, own target about 3 GiB. Exact reviewer union runner recovered from #240 attachment and adapted only for current paths; five final repetitions pending.
First restored-tree iterate: fmt, VT fmt, CLI compile-out, workspace clippy, SSH runtime helper and inode fixture PASS. Workspace tests stopped at existing infraternal/tests/agent_daemon.rs real_binary_preserves_input_and_output_across_24_abrupt_stops: verify-agent.py waits for shim-test prompt, socket read timed out. origin/dev scripts/agent_fixture.py now explicitly prepares the Bash prompt; preserve that shipped fix in required merge. No baseline/load exception claimed. cargo-deny reports expected RUSTSEC-2026-0386 on pre-merge tokio 1.53.2; required origin/dev merge supplies #255. Focused all-target server clippy and auth/recovery/source-loss tests are running before atomic fix commits.
Committed/pushed
7986f5f72: logout retains its acquired connection through drained DELETE RETURNING and account publication in an owned boxed completion. Existing cancellation review test and rollback tests PASS. Formatter, workspace clippy and explicit all-target server clippy (remote,infraternal-agent/mesh) PASS. Focused restored-tree tests: test result: ok. 46 passed; 0 failed; 4 ignored; 0 measured; 665 filtered out; finished in 56.44s. Includes R1, strengthened R2/1013, setup source loss, cancelled/refused transaction checks and recovery capacity. Four ignored tests are measurement-only. Full iterate after this step is running; pre-merge fixture/Tokio failures remain recorded, not waived.Committed/pushed
ff5b6da44: final recovery commit and account notifications now share owned completion for start/cancel/rotation/completion. Real cancelled transaction wakes both affected sources; deferred-constraint commit refusal wakes neither and rolls back; unrelated account sources stay quiet. Included in 46/0 focused tests and clean all-target server clippy. Post-logout iterate repeated only the recorded old daemon prompt fixture and old Tokio advisory failures; no exception claimed. Next R2 bootstrap/setup commit, then dev merge to retain shipped fixture/security fixes.Committed/pushed
dfb806246: bootstrap and setup propagate lost account source as typed unavailable authority to the shared upgrade, stop work, and send existing 1013 close. Covers idle, pending send, host-key confirmation and setup initial request waits. Original R1 unchanged; R2 strengthened to require 1013, added setup source loss and admission-retirement checks. Focused tests/clippy passed as recorded. Per-commit iterate still shows only old daemon prompt fixture + old Tokio advisory, which the required dev merge supplies; no tests/deadlines weakened. Remaining WIP is ignored perf-only logout publication harness, then merge origin/dev4a6202a52and final qualification.Committed/pushed perf-only harness
34b627ef4; formatter, explicit all-target server clippy PASS; logout tests 3 passed, 0 failed, measurement ignored. Merging origin/dev4a6202a52after all restored changes committed. Only conflicts: docs/PROCESS.md measured-size history and scripts/verify.d/rust.sh exact ceilings. Resolved both to dev (#255 ceilings 21,386,512 / 19,563,608); fresh branch measurements will be recorded separately. Kept all shipped busy-store authority handling, descriptor ownership/Tokio 1.53.3 repair, and new fixture prompt/short-path checks. No evidence/capture files introduced by merge. Merged-tree iterate running before merge commit.Merge committed/pushed
501f0d7ed: origin/dev4a6202a52integrated; both size conflicts resolved to dev as described in merge body. scripts/verify iterate PASS in full, including patched-Tokio cargo-deny, workspace tests, additional shim suite, TypeScript. Earlier daemon prompt fixture now PASS with dev's existing explicit shell setup. Server result verbatim:No load exception. Five exact #240 reviewer-union runs now running on merged branch; final fast/static measurements still pending.
Five consecutive #240 reviewer-union runs on pushed merged head
501f0d7edPASS. Same reviewer filters and remote,infraternal-agent/mesh features, plus 3 new functional tests. The sole ignored case is the perf-only diagnostic. Original R1 retained; R2 strengthened to require 1013. Both 256-socket/61-account cases pass each time: 16 affected sockets, 240 unrelated sockets with zero authority reads and authenticated work. Busy-store 1013 and source-loss checks pass all five. No load exception. Results verbatim:All remaining own GNU incremental caches removed after the suite ended, before static builds; dependency artifacts retained. No other job files/processes touched.
Evidence for five consecutive 41/0 #240 union passes, exact current-host runner, merged iterate PASS and focused auth/recovery/source-loss checks. Source cancellation/refusal/isolation assertions retained; durations are functional gate output, not perf evidence.
union-1.log
union-2.log
union-3.log
union-4.log
union-5.log
run-union-command.txt
iterate-merged-dev.log
focused-restored.log
Fresh static baseline reproduction complete on 6by32-compute02, same job CARGO_TARGET_DIR/toolchain/profile/recipe:
9896d3a85bx86_64 image = 21,389,424 bytes, static PIE, stripped, PT_INTERP absent; SHA-256 71ced02f01ef832af382e0df838bc9d62e5de1226ec302f3c5ea5c7836605ef3. Matches prior independently reproduced baseline exactly. Branch static sizes pending. Preparing perf-only static test binaries for orchestrator handoff; no runtime performance measurement on the build VM.Perf-VM handoff (orchestrator runs; this VM does not measure): baseline static test executable
ccea75217plus only the ignored measurement harness from34b627ef4. Production baseline unchanged. Binary retained on shared build VM 6by32-compute02 at/home/agent/.cache/codex-scratch/revocation-per-account-r2/evidence/logout-before; SHA-256f9205be98be1c40c8bb01be8cda447deabd3603d095dd42d41b501a2de20b60f. Static PIE test program; size budget applies separately to stripped shipping CLI.logout-before.gz
Decompress to
~/infraternal-perf/logout-beforeand make executable. Exact perf-VM command:1,000 real in-memory SQLite logout completions, 16 affected and 240 unrelated watch cursors over 61 scopes; reports completion p50/p99, asserts account isolation. Final-head matching executable follows. Please run 3 interleaved before/after pairs under the perf lock once both are available. Comparison includes the required dev/Tokio merge and must not be called isolated completion-helper overhead. No build-host performance result claimed. Continuing static qualification and final gate.
Fresh branch x86_64 static measurement on pushed
501f0d7ed: 21,403,472 bytes, stripped static PIE, PT_INTERP absent. Versus freshly reproduced task baseline9896d3a85at 21,389,424: +14,048 bytes total, within the task's <=16 KB budget. Against dev #255 cap 21,386,512, +16,960 bytes; the task comparison is against 9896, not the later smaller dev image. Trust and native key-memory check PASS. ARM is building sequentially. Exact caps remain dev values until both measurements complete; expected cap failure is not waived. No dependency/feature/profile changes introduced by R1/R2; required dev merge supplies #255.Both static images measured on
501f0d7ed: x86_64 21,403,472 (+14,048 vs fresh 9896 baseline), ARM 19,585,304 (+23,008 vs recorded 9896 ARM 19,562,296). ARM exceeds the 16 KB target. Before accepting an exception, reusing the existing websocket DetachOnDrop ownership wrapper instead of the new result oneshot: normal writes can run inline; cancellation alone detaches their owned commit/publication. This removes the success-path task hop and a channel implementation. First extracting the existing wrapper unchanged into shared completion module (including existing read-place retention); iterate running. Then auth switches to it, tests/repetitions and both sizes will rerun. No gate budget raised yet.Continued branch revocation-per-account at pushed
d1f653dcd(shared completion refactor). Latest iterate PASS (662 passed, 0 failed, 53 ignored). Auth trimming found an extra cancellation edge: inline retention using ambient tokio::spawn fails when its public waiter is dropped on a thread without an entered runtime. Real SQLite blocked-COMMIT test reproduced failure (0 passed, 1 failed); retaining the originating runtime only for auth writes fixes scheduling without cloning a handle on authority reads. Focused green run in progress, then five repetitions and both static sizes. No deployment.Inline completion validation: formatter, explicit all-target server clippy PASS; full iterate test row failed only ca_bootstrap::tests::generated_remote_leaf_is_verifiable_after_cold_restart at existing X509StoreContext verify_cert assertion (661 passed, 1 failed, 53 ignored). Exact isolated rerun, unchanged tree: 1 passed, 0 failed. No CA source changes and no load waiver; final full fast must pass afresh. Other Rust iterate rows passed. Five #240 union repetitions on final auth retention implementation now running. Runtime-context cancellation red/green attached below.
outside-runtime-red.log
outside-runtime-green.log
Committed
f2943586f: auth reuses shared cancellation retention, normal writes finish inline; auth retains originating runtime only for cross-thread cancellation. No success-path oneshot/task hop. Formatter and explicit all-target server clippy PASS; strengthened blocked-COMMIT test red then green. Five consecutive #240 unions on this source, verbatim:All ten 256-socket capacity cases: 16 affected, 240 unaffected, unrelated_reads=0, recovered=240. Existing R1 unchanged, R2 requires 1013. Full iterate CA failure and isolated green rerun recorded separately, no waiver. Both static images now rebuilding sequentially before caps change; final fast pending.
Final corrected source
f2943586f, same pinned static recipe: x86_64 21,401,712 bytes; aarch64 19,583,480. Against task baseline9896d3a85(21,389,424 / 19,562,296), whole-branch growth +12,288 / +21,184 bytes. x86 baseline independently reproduced byte-for-byte; ARM baseline is recorded release artifact. Both stripped static PIEs, PT_INTERP absent, production trust and compiler metadata PASS; native x86 key-memory PASS, ARM runtime not executable on x86 host.D243 target-specific justification under the brief's "unless justified": x86 meets 16 KB; ARM exceeds 16 KiB by 4,800 bytes. Required corrected behavior owns commit+notification through cancellation for logout and every recovery writer, and propagates unavailable authority across bootstrap/setup idle, pending sends, initial receive and confirmation. First corrected implementation cost +14,048 / +23,008; sharing existing completion retention removes a success-path task hop/result channel and saves 1,760 / 1,824 bytes. Remaining +21,184 ARM is the whole branch including account scoping and required dev/Tokio integration, not isolated helper overhead. No new dependency/features/schema/protocol/profile. Preserve correctness guarantees rather than weaken tests or change release optimization. Exact caps updated to 21,401,712 / 19,583,480, with no allowance, and are being rechecked. No runtime-performance claim; paired perf handoff pending.
Committed/pushed
63c0d9c3a: exact static ceilings and measured D243 history/ARM justification. Cached full static qualification with new caps PASS; boundary, linkage, production trust, compiler metadata, x86 native key-memory and CLI checks pass. Verbatim size rows:ARM key-memory execution is explicitly not checked on x86. Final-head perf binary building now, followed by full scripts/verify fast on committed head. No deployment.
Matching final-head perf executable ready on 6by32-compute02:
/home/agent/.cache/codex-scratch/revocation-per-account-r2/evidence/logout-after, source63c0d9c3a576e409a026f837c02347648e201bef, SHA-256f4e7d28ab96317c8b8fe40e86240d10f6aed4a8dd25f6835892037a61d5e5da4. Static PIE test program; --list confirms exact diagnostic, no measurement run here.Decompress attachment to ~/infraternal-perf/logout-after, make executable. Exact command:
Please run 3 interleaved before/after pairs with earlier logout-before artifact (SHA f9205be98be1c40c8bb01be8cda447deabd3603d095dd42d41b501a2de20b60f). Same 1,000 SQLite logouts, 16 affected + 240 unrelated cursors/61 scopes. Comparison includes dev/Tokio merge; do not attribute it solely to helper overhead. Runtime performance remains pending orchestrator, not a build-host claim. Full final scripts/verify fast running on committed head.
logout-after.gz
perf-after.json
Finished implementation on pushed branch revocation-per-account, head
63c0d9c3a5; origin matches, worktree clean. R1: logout and recovery writers own final commit plus account publication through cancellation, including dropping the public waiter outside runtime context. R2: bootstrap/setup notification-source loss stops work and closes with existing 1013 unavailable authority. Original R1 test unchanged; R2 strengthened, none weakened. Required dev4a6202a52merged in501f0d7ed, preserving shipped busy-store handling and Tokio repair; merge resolutions recorded in commit. No deployment, issue stays open.Final scripts/verify fast on this committed head, verbatim summary and exit (complete unfiltered transcript attached):
Server result, verbatim:
TypeScript stages pass. Earlier iterate's isolated CA assertion failure did not recur in final full gate, no waiver.
Five consecutive final #240 union results, verbatim:
All ten capacity cases: sockets=256, accounts=61, affected=16, unaffected=240, unrelated_reads=0, recovered=240. Busy-store 1013 and closed-source checks pass every run. Sole ignored union case is perf-only.
D243 shipping images: x86_64 21,401,712 (+12,288 versus reproduced
9896d3a85); ARM 19,583,480 (+21,184 versus recorded 9896 baseline). ARM justified-growth rationale and trim savings (1,760 / 1,824 bytes) in prior comment and docs/PROCESS.md. Exact caps, static linkage/no PT_INTERP, trust and metadata pass; x86 native key-memory pass. ARM runtime execution not checked on x86 host.Runtime performance remains for the orchestrator: both static before/after test binaries, hashes and exact perf-run.sh commands attached in preceding handoff; request 3 interleaved pairs. No runtime-performance measurement or claim from build VM.
Cleanup complete: own target deleted after proving no executable from it remained active; temporary baseline worktree already removed. Both perf binaries and evidence preserved outside checkout. No other job files/processes touched. Author auth review attached; independent review remains the orchestrator's next step.
verify-fast-final.log
gate-summary-final.txt
self-review-final.txt
union-final-1.log
union-final-2.log
union-final-3.log
union-final-4.log
union-final-5.log
iterate-inline.log
ca-rerun.log
static-exact-caps.log
sizes-final.json
self-review.txt
cleanup-final.json
run-union-final.txt
Independent round 2 delta review started. Branch review-revocation-r2, base
63c0d9c3a. Reviewing R1 cancellation/commit publication, R2 source loss and restoration, isolation, busy-store close handling, dev merge and size justification. Implementation will remain unchanged.Source audit complete; functional compilation running through build-slot. No confirmed finding yet. R1: logout retains its acquired connection and drained DELETE through publication; recovery start/cancel/rotation and WebAuthn recovery completion all reach the shared retained final commit. Pending-login removal cannot authorize a live socket; passkey addition/counter updates do not revoke sessions. R2: old watch receivers retain closure when a replacement registry entry appears; added real-socket restoration checks and a revoked proof-cursor check. Added real-SQLite blocked-COMMIT checks for timeout, panic, task abort, and refusal after caller drop (results pending).
Merge audit: Cargo.lock and crates/infraternal-shim/src/readiness.rs byte-identical to current origin/dev
63773bb3e. Transport and close-reason modules also identical. Actual merged dev parent is4a6202a52;63773bb3eonly adds D311 text. Remerge diff confirms only process/size-cap conflicts. Release 9.4's known-unavailable/1013 logic remains intact. Size reproduction and final fast gate pending. Implementation unchanged.Round 2 finding R2-1 (P2), failing test committed/pushed immediately at
69e91d072on review-revocation-r2. Recovery-state source loss uses websocket.rs:674–675 plain break, leaving loop_result Ok. An idle recovery-subscribed socket therefore stops with an empty WebSocket Close, without 1013 or a fresh authority read. This differs from the corrected revocation-source path. Contract keywrap.md:359 requires lost sources to report unavailable authority; the review brief also permits a full read.Real SQLite/WebSocket reproduction closes then synchronously replaces the recovery source before the old cursor runs, parks proof timers, and counts authority reads. Test review_r2_lost_recovery_source_reports_unavailable_or_reads_authority: 0 passed, 1 failed, codes=[], reread=false. The socket stops; no continued serving is alleged. Normal registry ownership prevents source loss without the existing test hook. Implementation unchanged. Full gate and remaining checks pending.
lost-recovery-source.log
Review evidence pushed in separate commits:
69e91d072(new P2 failing source-loss regression),93cdf2450(four passing real-SQLite commit/departure checks),53e6a7f0a(three passing source-restoration checks). Head53e6a7f0a; no implementation changes.Formatter and all-target server clippy with remote,infraternal-agent/mesh PASS after correcting one similar_names lint in a new test. Focused results: new passing checks 7/0; logout completion/refusal/rollback 3/0 (one perf-only ignore); inherited busy-wake/1013 and sixteen-socket recovery 2/0. Initial account filter 39/0, one perf ignore, including original R1/R2 and both capacity cases. Capacity evidence: 256 sockets / 61 accounts / 16 affected / 240 unaffected, unrelated_reads=0 and recovered=240 for logout and recovery.
The sole confirmed finding remains P2 R2-1, recovery-state source loss with codes=[] and reread=false. Shared-helper tests plus call-site audit cover every recovery final-commit writer; pending-login cleanup and ordinary passkey updates cannot revoke authorized sockets. Same-recipe static dev merge-base reproduction is running, then full scripts/verify fast on the review head. No runtime performance measurement on this VM.
Review evidence correction:
e231c1644(pushed to review-revocation-r2) adds an explicit one-shot SQLite worker fence to the refused-commit test. The initial full gate exposed my test's assumption that the first poll must remain Pending: deferred foreign-key refusal can complete before a reader lock matters. This was a review-fixture defect, separate from R2-1; production code remains unchanged.Corrected focused run: fmt and all-target server clippy PASS; seven new positive tests PASS; logout ordering/refusal 3 PASS, 1 measurement-only ignored; busy-wake 2 PASS. Initial full fast gate: all rows except workspace tests PASS, including both static builds. Reproduced shipping sizes: x86 21,401,712 / ARM 19,583,480 bytes. Fresh dev merge-base x86 was 21,386,512, delta +15,200.
Final scripts/verify fast is running on
e231c1644. The deliberate R2-1 regression is retained.Independent round-2 verdict: merge after fixes. Counts: 0 P0 / 0 P1 / 1 P2 / 0 P3.
Target
63c0d9c3a5; review heade231c16444, pushed only to review-revocation-r2. Four atomic test-only commits; implementation unchanged. Never close this issue from the review job.R2-1 (P2) — websocket.rs:674–675 takes a plain break when a subscribed recovery-state notification source is lost. Even synchronous source replacement leaves the old cursor closed. The real SQLite/loopback regression fails with
codes=[], reread=false: socket stops without 1013 or a fresh authority read. This is a defensive outcome/contract gap; it does not demonstrate continued serving, and current registry ownership requires the existing test hook to produce the loss. Fix the unavailable-authority outcome and retain this regression.Original R1 logout cancellation and bootstrap R2 regressions pass. New real-SQLite completion checks pass for panic, timeout, task abort and refused commit after caller drop: no precommit or rolled-back publication. Recovery/recovery rotation/WebAuthn recovery writers share the retained commit path; remaining writers were checked for session-revocation scope. Immediate source restoration checks pass for bootstrap, setup and the proof lease. Both 256-socket capacity cases pass: 16 affected, 240 unaffected, zero unrelated authority reads and 240 recovered application calls. Busy-store 1013 and short-stall recovery pass.
Dev merge: requested Cargo.lock/readiness.rs diff is empty against origin/dev
63773bb3e; transport and close reasons also match. Remerge resolution only docs/size caps; release 9.4 busy/unavailable behavior is retained.Size: shipping x86/ARM reproduced at 21,401,712 / 19,583,480 bytes, exact caps and digests retained. Fresh dev merge-base x86 is 21,386,512 (+15,200). Task-baseline deltas +12,288 / +21,184 (ARM 4,800 above 16 KiB). No obvious dead/duplicated production helper found. Source review supports the recorded whole-branch behavior justification and shared-helper trim; this is not independent symbol attribution. ARM baseline remains the author's recorded artifact. Paired runtime perf-VM handoff remains with the orchestrator; no shared-build-VM timing claim.
Final server result, verbatim:
Only R2-1 fails. The initial gate exposed a reviewer-fixture Pending assumption;
e231c1644replaces it with an explicit SQLite worker fence. It passes focused checks and the full suite. Supplemental standard ts_verify_fast stage PASS (exit 0), since the deliberate Rust failure prevents dispatch to it.Final
scripts/verify faston the job head, verbatim:Evidence:
findings.md
reviewer-checklist.txt
verify-fast.log
typescript.log
verify-fast-initial.log
merge-proof.json
size-evidence.txt
account-tests.log
focused-corrected.log
baseline-static.log
Cleanup: no active executable under the job target; target directory deleted, temporary baseline removed. Review worktree and scratch evidence retained. Local and origin review heads match; worktree clean. No deployment or implementation fix.
Start R2-1 (P2) implementation fix. Base origin/revocation-per-account
63c0d9c3a5; merged reviewe231c16444. Local branch revocation-r2-fix (revocation-per-account is still attached to the prior job worktree); will push HEAD to revocation-per-account without force. Scope: shared fail-closed account notification mechanism, all subscription call sites, unchanged R1/R2/isolation/busy-store regressions, five #240 repetitions, sequential pinned static sizes and final fast gate. No deployment.R2-1 source audit: production account subscribers are websocket.rs (recovery, revocation and operation watchdog), websocket_probe_authority.rs (proof lease), bootstrap_api.rs + bootstrap_setup_api.rs (idle/write/confirmation/first-request), and bootstrap_remote.rs (provisioning cancellation). Bootstrap/setup already preserve typed AuthorityUnavailable; proof lease maps closure to AuthorityMiss::Unavailable; provisioning returns unavailable. The main recovery arm alone uses plain break without preserving unavailable status. Operation-watchdog unit errors can also reach ordinary main-loop breaks, so source-loss classification should be shared at main-loop exit rather than copied into a second select arm.
Mutation audit: sessions.rs logout retains acquired connection through drained DELETE RETURNING and account publication; recovery.rs start/cancel and recovery_rotation.rs rotation use AccountEvents::commit; webauthn.rs recovery registration uses that same retained commit with revocations. Ordinary passkey addition/counter updates do not revoke existing sessions; pending-login cleanup cannot authorize a socket. No writer changes needed. Shared source-loss handling will reuse the existing known-unavailable/1013 teardown outcome, with no new authority query or retry budget. Add strict real-socket recovery/revocation closure checks; retain the review's acceptance assertion.
Review tests merged/pushed as
e6cb0bc20(review heade231c1644). No implementation changed in this merge; R2-1 remains deliberately red until the fix. Local strict-test extensions share only the existing setup, preserve the review acceptance assertion, and additionally require 1013/server_busy with zero follow-up authority reads for both recovery and revocation source loss. Fresh regression compilation is in progress through build-slot.R2-1 freshly reproduced before production changes: reviewer regression 0 passed/1 failed, codes=[], reread=false. Shared fixture retains its acceptance assertion and now also rejects any application frame after source loss. Strict recovery 1013/zero-reread check fails before the fix; strict revocation equivalent passes (sources filter: 3 passed, 2 failed). The implemented candidate moves the existing revocation known-unavailable classification to one common main-loop exit check for both account cursors, including guarded-work exits. It reuses the existing server_busy/1013 teardown, matching bootstrap/setup's known-unavailable outcome; no duplicate close sender/helper, authority query, timer or allocation. Focused remote+mesh tests compiling now.
recovery-source-red.log
sources-red.log
R2-1 candidate focused validation PASS: 23 passed, 0 failed. Includes retained reviewer regression; strict recovery/revocation 1013 + zero-reread checks; original R1 and bootstrap/setup R2; immediate source restoration; four SQLite commit/departure checks; proof closed-source checks; inherited busy-store 1013 and sixteen-socket short-stall recovery. No baseline exception. Production diff is one shared exit classification (18 changed lines), avoiding a second close sender or watcher helper. Author source/mutation review attached. All-target server clippy running; static sizes, five union repetitions and final fast gate pending.
focused-green.log
self-review.txt
R2-1 implementation committed as
55ed71bb4: one main-loop exit check routes lost recovery/revocation sources through the existing known-unavailable 1013 teardown. No extra authority read, close sender, task, dependency or timer. The review regression remains, plus strict recovery and revocation cases; each reports codes=[1013], reread=false and rejects continued application frames.Current-source commit gates: fmt and diff checks passed; all-target server clippy with remote + mesh passed; focused review union: 23 passed, 0 failed. Subscriber/writer audit remains as recorded above; no other production paths required changes. Measuring pinned static images sequentially next, then five full #240 union runs and the final committed-head fast gate.
R2-1 measured with the pinned static recipe, sequentially in one build slot on 6by32-compute02: x86_64 21,401,776 bytes (+64 versus round 2); aarch64 19,583,480 bytes (0). Total versus task baseline: +12,352 / +21,184 bytes; the existing round-2 ARM justification remains. Both images are stripped/static with no INTERP. No dependencies, features or profile changes.
Exact x86_64 cap and measured explanation committed/pushed as
8208904789. Both exact-cap, one-byte-over, downward-ratchet and unsupported-target tests passed. fmt, shell syntax and diff checks passed. Five consecutive full #240 union runs are now in progress; final fast gate follows on this head.static-sizes.log
size-boundaries.log
commit-gates.log
Five consecutive full #240 union runs passed on
8208904789. Each: 51 passed, 0 failed, 1 perf-only ignored. Every run exercised both 256-socket/61-account cases: 16 affected, 240 unaffected, unrelated_reads=0, recovered=240. Each recovery/revocation source-loss diagnostic was codes=[1013], reread=false. Busy-store 1013, short-stall recovery, R1/R2 and restoration tests passed in all five runs. These are functional counts, not build-host performance claims.scripts/verify fastis now running on this committed head.union-final-1.log
union-final-2.log
union-final-3.log
union-final-4.log
union-final-5.log
Finished R2-1 on head
8208904789, pushed to revocation-per-account. Shared known-unavailable teardown closes lost recovery/revocation sources with 1013 and no reread. Reviewer regression retained; strict recovery/revocation regressions added. Subscriber/writer audit found no further changes needed.Five consecutive #240 unions each passed 51/0 (one perf-only ignored). All ten 256-socket cases: 240 unrelated sockets, unrelated_reads=0, recovered=240. Busy-store 1013 and R1/R2 guarantees passed.
Pinned sizes: x86_64 21,401,776 bytes (+64 versus round 2); aarch64 19,583,480 bytes (+0). Exact cap ratcheted; boundary tests pass. Total baseline delta +12,352 / +21,184; existing round-2 ARM justification remains.
scripts/verify faston this committed head exited 0; verbatim summary and test result excerpts:Gate limitation, verbatim:
No baseline exception used. Worktree clean, origin matches head. Verified no executable was running from this job target, then deleted CARGO_TARGET_DIR; evidence retained outside the repository. Issue remains open for review.
verify-fast.log
self-review.txt
run-union.txt
Final independent round 3 review started. Branch review-revocation-r3; base
8208904789. Checking prior tests without weakening, all notification subscribers, retained commit ordering, account isolation, release 9.4 / #255 scope and exact static sizes. Implementation unchanged; final permitted review round.Source audit completed; review checkpoint
57165ba12cpushed only to review-revocation-r3. No implementation/test changes (empty audit commit; D262 receipts remain outside checkout). No new confirmed finding.Diff e231c1644..820890478 leaves prior test files unchanged except review_account_scope.rs: common source-loss fixture extraction retains the original acceptance assertion and adds rejection of application frames plus strict 1013/zero-reread cases. Persistent main cursors catch source loss across guarded-work exits and immediate registry replacement. Bootstrap/setup share typed unavailable close; proof leases and provisioning return unavailable. Final-commit notification ownership and quiet refusal/rollback code unchanged.
All files changed by #255 repair
1495c9480, including Cargo.lock and AsyncFd readiness.rs, are byte-identical to current origin/dev07c5da77b. Release 9.4 known-unavailable close classification, fractional deadlines and read limits remain. Dev merge-base4a6202a52recorded sizes 21,386,512 / 19,563,608 imply +15,264 / +19,872 at requested head sizes; task-baseline deltas +12,352 / +21,184. Existing ARM growth rationale and shared-helper trim are recorded above and in PROCESS.md. Fresh full fast gate is compiling through build-slot; runtime measurements are not claimed from the build VM.Final-round full server suite passed on review head
57165ba12(source identical to820890478). Verbatim:Includes original R1/R2 and R2-1, strict recovery/revocation 1013 without another authority read, bootstrap/setup/proof immediate source restoration, panic/timeout/abort/drop final-commit ordering and quiet refusal/rollback, both 256-socket capacity cases and inherited busy-store 1013. No new confirmed finding or load exception. Remaining workspace/static/TypeScript gate stages, focused diagnostics and same-recipe dev merge-base x86 size rebuild are pending. No implementation change.
Independent final-round verdict: merge. Counts: 0 P0 / 0 P1 / 0 P2 / 0 P3.
Target
8208904789; review branch review-revocation-r3, head57165ba12c. The source tree is identical to the target. One empty audit commit records the review without adding repository receipts (D262); only this review branch was pushed. No implementation fix or deployment.Prior R2-1 is resolved. The original acceptance assertion and I/O fences remain; extracting the shared fixture adds rejection of application frames and strict recovery/revocation 1013 + zero-reread checks. The other round-1/round-2 review files are unchanged from
e231c1644. Main recovery/revocation and guarded-work exits reach the common known-unavailable teardown; bootstrap/setup share typed unavailable close, proof leases return unavailable, and provisioning cancellation returns unavailable. Old cursors remain closed across immediate registry replacement.Committed-write checks pass for caller cancellation, panic, timeout, abort and future drop. Successful final commit precedes publication; refused commits and rollback stay quiet. Logout retains its acquired connection through drained DELETE RETURNING and notification; recovery start/cancel/rotation and WebAuthn recovery completion use the shared retained final commit. Ordinary passkey/counter updates and pending-login cleanup do not revoke authorized sockets.
Fresh focused diagnostics, verbatim:
The sole ignore is perf-only. Inherited busy-store 1013, sixteen-socket short-stall recovery, authority read caps and fractional expiry checks pass. No load exception was needed.
Every file changed by #255 repair
1495c9480, including Cargo.lock and all AsyncFd ownership sources, is byte-identical to dev07c5da77b. Release 9.4 known-unavailable teardown and retry/read budgets are retained.Both pinned stripped static images reproduced exactly: 21,401,776 / 19,583,480 bytes, no PT_INTERP, exact-cap checks pass. Fresh same-recipe dev merge-base
4a6202a52x86_64 is 21,386,512, giving +15,264 bytes. Its recorded ARM baseline is 19,563,608, giving +19,872; that ARM baseline was not rebuilt this round. Current dev07c5da77brecorded caps are 21,400,400 / 19,575,064 (arithmetic differences +1,376 / +8,416; later unrelated changes make merge-base the D243 comparison). Task-baseline deltas remain +12,352 / +21,184. The #240 / PROCESS.md ARM justification retains cancellation ownership and typed unavailable teardown, and records the shared-owner trim of 1,760 / 1,824 bytes. R2-1 itself adds only +64 / 0 bytes, with no dependencies/features/profile changes. No runtime-performance claim from this build VM.Full server result, verbatim:
Final
scripts/verify faston the review head, verbatim summary and observed exit:TypeScript stages also pass; full transcript attached. Gate limitation, verbatim:
Cleanup verified: no active executable under the job target; target directory deleted; temporary baseline worktree removed. Review worktree clean, local and origin heads match. Issue remains open.
findings.txt
reviewer-checklist.txt
verify-fast.log
gate-summary.txt
union-final-1.log
head-sizes.json
baseline-size.json
baseline-static.log
descriptor-proof.json
prior-tests-diff.txt
cleanup.json
Start release 9.5 integration. Branch integrate-9-5, base origin/dev
07c5da77b. Merge reviewed #240 head820890478(final round-3 review57165ba12). Preserve both sides, sequential pinned static rebuilds and exact D243 caps, five #240 union repetitions, #252 setup-token tests, then final committed-head scripts/verify fast. Will push only integrate-9-5, never dev; no deployment.Merge findings: exactly three conflicted files. auth/tests.rs appended independent tests on both sides; retained public_status_result_fields_are_listed_in_the_auth_contract, account_logout_does_not_notify_another_account, and logout_commit module. docs/PROCESS.md retains #252 and #240 histories; current table will use merged measurements. scripts/verify.d/rust.sh changes only the exact size caps after measurement. No conflict in production code. Cargo.lock and the #255 shim ownership sources are identical to reviewed #240; static builds are running sequentially through build-slot on 6by32-compute02.
Merged x86_64 pinned stripped static image: 21,420,592 bytes; no PT_INTERP. Delta +20,192 versus dev
07c5da77b(21,400,400), +18,816 versus reviewed #240 alone (21,401,776). Sequential ARM build is running through the same build slot on 6by32-compute02.D243 growth justification: this integration retains both reviewed behaviors: #240 account-isolated revocation, retained commit/publication under caller cancellation and typed unavailable teardown, together with #252 installed-service setup command and data resolution. Neither branch's caps predict the combined link. There is no manual production-code resolution, dependency/feature/profile change, duplicated helper or added runtime work in this merge. Per the integration brief, the cap will equal the actual merged bytes with no allowance. Both original size histories are retained; final merged table and ARM measurement follow.
Both sequential pinned stripped static builds passed on 6by32-compute02, with no PT_INTERP:
07c5da77b820890478Both caps now equal the measured merge bytes, with no allowance. docs/PROCESS.md retains both parent histories and adds this comparison. D243 growth retains reviewed account isolation, cancellation-safe commit/publication, unavailable-authority teardown and installed-service setup resolution; no manual production-code resolution, dependency, feature or profile changes. Parent deltas are non-additive at link time.
Fresh fmt, shell syntax and diff checks passed. Size boundary tests passed exact caps, one byte over rejection, downward ratchet and unsupported target. Five #240 unions are compiling/running through one build slot; #252 tests follow.
static-build.log
Five consecutive #240 union runs passed on the merged source. Each: 51 passed, 0 failed, 1 perf-only ignored. All ten 256-socket/61-account cases report 16 affected, 240 unaffected, unrelated_reads=0 and recovered=240. Recovery/revocation source-loss checks report codes=[1013], reread=false. No baseline exception used. #252 CLI, status and production-browser functional checks are now compiling/running; committed-head fast gate follows.
Integration merge committed/pushed only to integrate-9-5:
8f88bf086f(parents dev07c5da77band #240820890478). Every conflict resolution is documented in the commit message. Dev was not pushed; no deployment.Targeted merged-tree checks passed: five consecutive #240 unions, each 51/0 (one perf-only ignored); six setup_output CLI tests; four token/data-resolution unit tests; 22 server setup/public-status tests; service-discovery suite; both unchanged system-service production-browser tests at unique port 51295 with zero synthetic RTT for functional validation. Display/copy at 393px and bounds at 375px pass. Final scripts/verify fast is running on this committed head; this is not yet the final qualification report.
Finished release 9.5 integration on
integrate-9-5, head8f88bf086f5c3d3c3a57d4bc8529befbcb0ca176. Pushed only this branch; local and origin heads match, worktree clean. Dev was not pushed; no deployment. The merge message records every conflict resolution: retain both auth test additions and logout_commit module; retain both PROCESS histories with a new comparison; use freshly measured exact merged caps.Pinned stripped static sizes, built sequentially on 6by32-compute02 and reproduced by the final gate: 21,420,592 / 19,592,504 bytes (x86_64 / aarch64), no PT_INTERP. Delta versus dev
07c5da77b: +20,192 / +17,440 bytes. Both exact caps have no allowance; reviewed behavior and combined-link growth justification are recorded above and in PROCESS.md.Five consecutive #240 unions each passed 51/0, one perf-only ignored. All ten 256-socket cases: unrelated_reads=0, recovered=240. Source-loss cases: codes=[1013], reread=false. #252 checks passed: setup_output 6/0, token/data resolution 4/0, server setup/public status 22/0, service discovery 14/0, production-browser display/copy and phone bounds 2/0. No baseline exception used.
Final
scripts/verify faston this committed head, verbatim summary and observed exit:Full server result, verbatim:
Final protocol output, verbatim:
Gate limitation, verbatim:
Verified no executable was running from the job target, then deleted CARGO_TARGET_DIR. Evidence is outside the repository. Issues remain open.
verify-fast.log
static-build.log
union-1.log

union-2.log
union-3.log
union-4.log
union-5.log
focused-tests.log
self-review.txt
cleanup.json
Merged into dev via the 9.5 integration
8f88bf086(final review: merge, 0 findings; gate PASS).Closed by the orchestrator during the 2026-11-09 night housekeeping (owner order: "close stale prs/issues"). The work has landed on dev, and the latest note here is a finish or merge note (J387 inventory on #436). Reopen if anything is still missing.