Audit 2026-10-02: gaps, holes and the shortest path to a usable product #48

Open
opened 2026-10-02 12:50:14 +00:00 by kayg · 271 comments
Owner

Owner request (2026-10-02 18:15 IST): "what is the least amount of features we can get stable and stupid fast right now? we need to make the product architecturally very modular (code-reuse, extensible) and very very performant with the least cpu and memory usage. … audit … find gaps, holes and … the best direction forward to a usable product." The owner also asked how the calternal UI/UX adoption (#46) is going.

Seven read-only audit jobs run in parallel. Each comments here with its findings and a link to its full report.

  • architecture and modularity
  • performance and resource use
  • security and authorization (defensive audit)
  • frontend architecture
  • calternal UI/UX adoption status
  • test and gate velocity
  • product scope

The orchestrator writes the synthesis and the recommended direction.

Base: dev f640461, as deployed on o2. Port branch: calternal-port b3b125e.

Owner request (2026-10-02 18:15 IST): "what is the least amount of features we can get stable and stupid fast right now? we need to make the product architecturally very modular (code-reuse, extensible) and very very performant with the least cpu and memory usage. … audit … find gaps, holes and … the best direction forward to a usable product." The owner also asked how the calternal UI/UX adoption (#46) is going. Seven read-only audit jobs run in parallel. Each comments here with its findings and a link to its full report. - architecture and modularity - performance and resource use - security and authorization (defensive audit) - frontend architecture - calternal UI/UX adoption status - test and gate velocity - product scope The orchestrator writes the synthesis and the recommended direction. Base: `dev` `f640461`, as deployed on o2. Port branch: `calternal-port` `b3b125e`.
Author
Owner

Starting audit-product: read-only detached worktree /home/kayg/wt/audit-base at f640461228 (deployed dev). Inventory dev and named unmerged branches, issues #16–#47; recommend smallest stable fast v0.1. Report: /mnt/hdd/infraternal/jobs/audit-product/report.md. No commits, push, deployment or tracked edits.

Starting audit-product: read-only detached worktree /home/kayg/wt/audit-base at f640461228c8bdeba95646e4909accba829c00df (deployed dev). Inventory dev and named unmerged branches, issues #16–#47; recommend smallest stable fast v0.1. Report: /mnt/hdd/infraternal/jobs/audit-product/report.md. No commits, push, deployment or tracked edits.
Author
Owner

Starting read-only audit-perf on worktree /home/kayg/wt/audit-base.
Base: detached dev f640461228.

Starting read-only audit-perf on worktree /home/kayg/wt/audit-base. Base: detached dev f640461228c8bdeba95646e4909accba829c00df.
Author
Owner

Starting the read-only calternal UI/UX audit for #48.

Worktree: /home/kayg/wt/audit-web, detached at b3b125e7fb19f6d66ba82f1244c1c1120df77783 (calternal-port); audit comparison base is dev f640461. Current calternal source is c4a61e8cf and remains read-only. Report and screenshots will be under /mnt/hdd/infraternal/jobs/audit-calternal/ and /mnt/hdd/infraternal/artifacts/audit-calternal/.

Starting the read-only calternal UI/UX audit for #48. Worktree: `/home/kayg/wt/audit-web`, detached at `b3b125e7fb19f6d66ba82f1244c1c1120df77783` (`calternal-port`); audit comparison base is `dev` `f640461`. Current calternal source is `c4a61e8cf` and remains read-only. Report and screenshots will be under `/mnt/hdd/infraternal/jobs/audit-calternal/` and `/mnt/hdd/infraternal/artifacts/audit-calternal/`.
Author
Owner

audit-security started: read-only detached worktree /home/kayg/wt/audit-base; base/head f640461228. Reviewing authentication, authorization, remote infraternal agents, exec/SSH, audit redaction, resource bounds and supply chain. Evidence and progress: /mnt/hdd/infraternal/jobs/audit-security/report.md. No tracked edits or commits.

audit-security started: read-only detached worktree /home/kayg/wt/audit-base; base/head f640461228c8bdeba95646e4909accba829c00df. Reviewing authentication, authorization, remote infraternal agents, exec/SSH, audit redaction, resource bounds and supply chain. Evidence and progress: /mnt/hdd/infraternal/jobs/audit-security/report.md. No tracked edits or commits.
Author
Owner

Audit #48 start: working read-only in /home/kayg/wt/audit-web at b3b125e7fb19f6d66ba82f1244c1c1120df77783 (calternal-port); comparison base is dev f640461. I am mapping frontend structure and lifecycle/performance evidence. The report will be at /mnt/hdd/infraternal/jobs/audit-frontend/report.md.

Audit #48 start: working read-only in `/home/kayg/wt/audit-web` at `b3b125e7fb19f6d66ba82f1244c1c1120df77783` (calternal-port); comparison base is `dev` `f640461`. I am mapping frontend structure and lifecycle/performance evidence. The report will be at `/mnt/hdd/infraternal/jobs/audit-frontend/report.md`.
Author
Owner

Starting read-only architecture/modularity audit in /home/kayg/wt/audit-base, detached at base dev f640461228c8bdeba95646e4909accba829c00df. I have read CLAUDE.md and am reviewing the settled docs before source mapping. No tracked files will be edited.

Starting read-only architecture/modularity audit in `/home/kayg/wt/audit-base`, detached at base `dev` `f640461228c8bdeba95646e4909accba829c00df`. I have read `CLAUDE.md` and am reviewing the settled docs before source mapping. No tracked files will be edited.
Author
Owner

Starting the read-only velocity audit in worktree /home/kayg/wt/audit-base, detached at base f640461228c8bdeba95646e4909accba829c00df (dev). I read the operating contract and plan. I’ll inventory the gates, measure the permitted fast run, and document findings in /mnt/hdd/infraternal/jobs/audit-velocity/report.md. The job rules also prohibit reading other jobs’ files under /mnt/hdd/infraternal/jobs/, so I’m checking for allowed log evidence before attempting the requested cohort-wide flake counts.

Starting the read-only velocity audit in worktree `/home/kayg/wt/audit-base`, detached at base `f640461228c8bdeba95646e4909accba829c00df` (`dev`). I read the operating contract and plan. I’ll inventory the gates, measure the permitted `fast` run, and document findings in `/mnt/hdd/infraternal/jobs/audit-velocity/report.md`. The job rules also prohibit reading other jobs’ files under `/mnt/hdd/infraternal/jobs/`, so I’m checking for allowed log evidence before attempting the requested cohort-wide flake counts.
Author
Owner

Security audit progress at f640461 (read-only):

  • agents.rs:268-292: destructive agents:revoke checks scope but has no AI plan/confirmation flow (contract §2.1).
  • storage/mod.rs:771-808: token issuance reuses caller grant vectors and does not check caller active state/epochs in the issuance transaction. SSH mutations and join/revoke also lack this fence.
  • resources.rs:1976 samples fresh epochs after old-grant authorization; storage/mod.rs:2332 omits access expiry. The existing fence therefore does not certify the original authorization decision.
  • CLI/MCP refresh load→rotate→save at login.rs:764-803 has no cross-process lock; reuse detection correctly invalidates the family.
  • Passkey/idempotency/rejection audit paths have no general pre-auth admission/expired-row sweep, unlike bounded device authorization.
    Full evidence, fixes and defensive test cases: /mnt/hdd/infraternal/jobs/audit-security/report.md (in progress).
    bun audit: one low advisory (cookie@0.6.0, GHSA-pxg6-pf52-xh8x). cargo audit is unavailable. Required fast gate is running; no release build/browser suite started.
Security audit progress at f640461 (read-only): - `agents.rs:268-292`: destructive `agents:revoke` checks scope but has no AI plan/confirmation flow (contract §2.1). - `storage/mod.rs:771-808`: token issuance reuses caller grant vectors and does not check caller active state/epochs in the issuance transaction. SSH mutations and join/revoke also lack this fence. - `resources.rs:1976` samples fresh epochs after old-grant authorization; `storage/mod.rs:2332` omits access expiry. The existing fence therefore does not certify the original authorization decision. - CLI/MCP refresh load→rotate→save at `login.rs:764-803` has no cross-process lock; reuse detection correctly invalidates the family. - Passkey/idempotency/rejection audit paths have no general pre-auth admission/expired-row sweep, unlike bounded device authorization. Full evidence, fixes and defensive test cases: /mnt/hdd/infraternal/jobs/audit-security/report.md (in progress). `bun audit`: one low advisory (cookie@0.6.0, GHSA-pxg6-pf52-xh8x). `cargo audit` is unavailable. Required fast gate is running; no release build/browser suite started.
Author
Owner

Audit-product evidence update (base f640461):

  • Dev web has ten PlaceholderPage routes; host detail line 55 has a disabled Open SSH terminal button; Dashboard line 108 has CPU/Memory/Disk em dashes. Backend/CLI SSH is implemented, so web incompleteness must not be called backend absence. Calternal-port removes placeholders and adds token/session UI but is blocked by #46 live log WebSockets.
  • Dev list_containers at resources.rs:1572–1632 serves a remote snapshot only with an explicit host filter; resolve_container at :2095–2097 rejects every nonlocal host, so remote inspect and lifecycle are incomplete in addition to #43/#45.
  • Dev container log OPEN at container detail :211 and calternal ContainerLogPanel :54 use params={} despite the bounded-tail contract. The 10,000-line/4 MiB ring bounds retained payload, not engine/history/network work.
  • Multi-tab original #44 fix and #42 cleanup fixes are in dev; do not report them as wholly unfixed. #46 later traced a missed token broadcast causing OPEN_OK then CLOSE forbidden; its peer session-request correction is branch-only and still needs full verification.
  • #47 remains an unexplained kernel OOM: anon-rss 11357604 kB. No causal attribution to a route or to the independent #41 reactive-effect bug yet.

Partial findings are preserved in /mnt/hdd/infraternal/jobs/audit-product/report.md. Fast gate is running; no integration, browser or performance suite launched by this audit.

Audit-product evidence update (base f640461): - Dev web has ten PlaceholderPage routes; host detail line 55 has a disabled Open SSH terminal button; Dashboard line 108 has CPU/Memory/Disk em dashes. Backend/CLI SSH is implemented, so web incompleteness must not be called backend absence. Calternal-port removes placeholders and adds token/session UI but is blocked by #46 live log WebSockets. - Dev list_containers at resources.rs:1572–1632 serves a remote snapshot only with an explicit host filter; resolve_container at :2095–2097 rejects every nonlocal host, so remote inspect and lifecycle are incomplete in addition to #43/#45. - Dev container log OPEN at container detail :211 and calternal ContainerLogPanel :54 use params={} despite the bounded-tail contract. The 10,000-line/4 MiB ring bounds retained payload, not engine/history/network work. - Multi-tab original #44 fix and #42 cleanup fixes are in dev; do not report them as wholly unfixed. #46 later traced a missed token broadcast causing OPEN_OK then CLOSE forbidden; its peer session-request correction is branch-only and still needs full verification. - #47 remains an unexplained kernel OOM: anon-rss 11357604 kB. No causal attribution to a route or to the independent #41 reactive-effect bug yet. Partial findings are preserved in /mnt/hdd/infraternal/jobs/audit-product/report.md. Fast gate is running; no integration, browser or performance suite launched by this audit.
Author
Owner

Audit #48 start: working read-only in /home/kayg/wt/audit-web at b3b125e7fb19f6d66ba82f1244c1c1120df77783 (calternal-port); comparison base is dev f640461. I am mapping frontend structure and lifecycle/performance evidence. The report will be at /mnt/hdd/infraternal/jobs/audit-frontend/report.md.

Audit #48 start: working read-only in `/home/kayg/wt/audit-web` at `b3b125e7fb19f6d66ba82f1244c1c1120df77783` (calternal-port); comparison base is `dev` `f640461`. I am mapping frontend structure and lifecycle/performance evidence. The report will be at `/mnt/hdd/infraternal/jobs/audit-frontend/report.md`.
Author
Owner

Frontend audit findings in progress; full evidence: /mnt/hdd/infraternal/jobs/audit-frontend/report.md.

  • Container log component unmount calls detach, but packages/web/src/lib/stream-attachment.svelte.ts:176-184 leaves its shared StreamClient connected when registrations reach zero. The client liveness timer still ticks every second and sends after 15 seconds idle (packages/stream/src/index.ts:1049-1065). Fix ownership is the shared attachment lifecycle.
  • Dashboard, hosts, and containers poll every 2 seconds (packages/web/src/routes/+page.svelte:38-56, packages/web/src/routes/hosts/+page.svelte:35-53, packages/web/src/routes/containers/+page.svelte:74-88). Dashboard sends both host and container requests each tick; only container inventory currently uses ETag/304 (packages/web/src/lib/inventory.ts:30-56).
  • The current port has no remaining shadcn-svelte, bits-ui, tailwind-variants, cn, or tw-animate source/dependency references; the Lane D sweep in docs/research/calternal-port.md:250 is already complete.
Frontend audit findings in progress; full evidence: `/mnt/hdd/infraternal/jobs/audit-frontend/report.md`. - Container log component unmount calls `detach`, but `packages/web/src/lib/stream-attachment.svelte.ts:176-184` leaves its shared `StreamClient` connected when registrations reach zero. The client liveness timer still ticks every second and sends after 15 seconds idle (`packages/stream/src/index.ts:1049-1065`). Fix ownership is the shared attachment lifecycle. - Dashboard, hosts, and containers poll every 2 seconds (`packages/web/src/routes/+page.svelte:38-56`, `packages/web/src/routes/hosts/+page.svelte:35-53`, `packages/web/src/routes/containers/+page.svelte:74-88`). Dashboard sends both host and container requests each tick; only container inventory currently uses ETag/304 (`packages/web/src/lib/inventory.ts:30-56`). - The current port has no remaining shadcn-svelte, bits-ui, tailwind-variants, `cn`, or tw-animate source/dependency references; the Lane D sweep in `docs/research/calternal-port.md:250` is already complete.
Author
Owner

First architecture evidence: the code-review graph parsed 444 files (4,131 nodes, 57,567 edges). crates/server/src is 18,055 lines; stream.rs (3,476), device_auth.rs (3,467), storage/mod.rs (3,267), and resources.rs (2,507) are 12,717 lines (70.4%). stream.rs::open_channel is 1,001 lines (stream.rs:1136), combining validation, authorization, audit, grant signing, local/remote dispatch and relay setup. The architecture graph reports six high-coupling server pairs, including container↔session (78 edges) and exec↔session (57). A jscpd scan across crates packages found 86 clones / 2.48% duplicated lines at min 8 lines/100 tokens; no clone pair involved crates/server/tests at those thresholds. The scan JSON and detailed report are in /mnt/hdd/infraternal/jobs/audit-arch/jscpd/.

First architecture evidence: the code-review graph parsed 444 files (4,131 nodes, 57,567 edges). `crates/server/src` is 18,055 lines; `stream.rs` (3,476), `device_auth.rs` (3,467), `storage/mod.rs` (3,267), and `resources.rs` (2,507) are 12,717 lines (70.4%). `stream.rs::open_channel` is 1,001 lines (`stream.rs:1136`), combining validation, authorization, audit, grant signing, local/remote dispatch and relay setup. The architecture graph reports six high-coupling server pairs, including container↔session (78 edges) and exec↔session (57). A jscpd scan across `crates packages` found 86 clones / 2.48% duplicated lines at min 8 lines/100 tokens; no clone pair involved `crates/server/tests` at those thresholds. The scan JSON and detailed report are in `/mnt/hdd/infraternal/jobs/audit-arch/jscpd/`.
Author
Owner

Correction to the clone-scan note: jscpd reports paths relative to each crate, so my earlier filter missed test paths. The scan found a 440-line SSHD test-harness clone between crates/infraternal/tests/sshd_test_support.rs:193 and crates/ssh/test_support/sshd.rs:176, plus a second 90-line match. The CLI/MCP fixture says it is trimmed from the SSH fixture to avoid including that file's private cleanup tests. It also found a 45-line setup clone within crates/server/tests/stream_regressions.rs (lines 110/245) and a 39-line enrollment setup clone between agent_enrollment.rs:22 and agent_tunnel_tls.rs:91. The smallest reuse fix is a shared dev-only fixture module with private test modules kept in their owning test target.

Correction to the clone-scan note: jscpd reports paths relative to each crate, so my earlier filter missed test paths. The scan found a 440-line SSHD test-harness clone between `crates/infraternal/tests/sshd_test_support.rs:193` and `crates/ssh/test_support/sshd.rs:176`, plus a second 90-line match. The CLI/MCP fixture says it is trimmed from the SSH fixture to avoid including that file's private cleanup tests. It also found a 45-line setup clone within `crates/server/tests/stream_regressions.rs` (lines 110/245) and a 39-line enrollment setup clone between `agent_enrollment.rs:22` and `agent_tunnel_tls.rs:91`. The smallest reuse fix is a shared dev-only fixture module with private test modules kept in their owning test target.
Author
Owner

audit-security completed; read-only head/base f640461228c8bdeba95646e4909accba829c00df.
Full report
45-route scope matrix
Ranked findings include guarantees, file:line evidence, cost, smallest fix, effort and concrete defensive regression cases.
Must fix for shared use:

  1. Bind original authority to final token issuance/writes/dispatch (storage/mod.rs:771; resources.rs:1976): stale caller grants/expiry are not consistently fenced.
  2. Require AI plans for destructive infraternal identity revocation (agents.rs:268).
  3. Bound pre-login durable state and client stream connection admission (auth.rs:145; storage/mod.rs:866,2413; stream.rs:616,803).
  4. Reuse secure private-file reopen/create rules for signing key, CA, database and backup (agent/lib.rs:80; enrollment_ca.rs:54; main.rs:466).
  5. Serialize CLI/MCP refresh across processes (login.rs:764); server reuse detection correctly revokes the family.
  6. Sanitize stored rejection paths/IDs; wire credential-safe idempotency for remote administration (lib.rs:583; agents.rs:74).
    Audit read/export is absent at this base: step 25/#38 is needed before shared rollout. No unauthenticated resource route found; protected mutation races remain.
    Smallest first slice: explicitly single-owner passkey + bounded local Docker/Podman + known-key SSH + narrowed CLI/MCP; no claim of full S2 completion.
    Targeted existing tests passed: auth HTTP 14/14, real mTLS 1/1, grant tamper/nonce/replay 1/1, real sshd changed-key refusal 1/1.
    bun audit: one low cookie@0.6.0 advisory GHSA-pxg6-pf52-xh8x; production reachability not established. cargo audit unavailable; Rust advisory state unverified.
    No tracked edits, commits, push, deployment, nested jobs, release build, browser/integration/bench suite, exploit reproduction or perf claim. Git status clean.
    scripts/verify fast exit 0, verbatim:
PASS fast: migrations are append-only
PASS fast: workspace package dependencies
PASS fast: JavaScript dependencies
PASS fast: build web app
PASS fast: cargo fmt --check
PASS fast: cargo clippy
PASS fast: cargo test
PASS fast: svelte-check
PASS fast: UI package svelte-check
PASS fast: stream package typecheck
PASS fast: Vitest
PASS fast: UI package Vitest
PASS fast: stream package Vitest
PASS fast: OpenAPI and TypeScript client drift
PASS fast: terminal TypeScript
PASS fast: terminal Vitest
audit-security completed; read-only head/base `f640461228c8bdeba95646e4909accba829c00df`. [Full report](/mnt/hdd/infraternal/jobs/audit-security/report.md) [45-route scope matrix](/mnt/hdd/infraternal/jobs/audit-security/route-scope-matrix.md) Ranked findings include guarantees, file:line evidence, cost, smallest fix, effort and concrete defensive regression cases. Must fix for shared use: 1. Bind original authority to final token issuance/writes/dispatch (`storage/mod.rs:771`; `resources.rs:1976`): stale caller grants/expiry are not consistently fenced. 2. Require AI plans for destructive infraternal identity revocation (`agents.rs:268`). 3. Bound pre-login durable state and client stream connection admission (`auth.rs:145`; `storage/mod.rs:866,2413`; `stream.rs:616,803`). 4. Reuse secure private-file reopen/create rules for signing key, CA, database and backup (`agent/lib.rs:80`; `enrollment_ca.rs:54`; `main.rs:466`). 5. Serialize CLI/MCP refresh across processes (`login.rs:764`); server reuse detection correctly revokes the family. 6. Sanitize stored rejection paths/IDs; wire credential-safe idempotency for remote administration (`lib.rs:583`; `agents.rs:74`). Audit read/export is absent at this base: step 25/#38 is needed before shared rollout. No unauthenticated resource route found; protected mutation races remain. Smallest first slice: explicitly single-owner passkey + bounded local Docker/Podman + known-key SSH + narrowed CLI/MCP; no claim of full S2 completion. Targeted existing tests passed: auth HTTP 14/14, real mTLS 1/1, grant tamper/nonce/replay 1/1, real sshd changed-key refusal 1/1. `bun audit`: one low cookie@0.6.0 advisory GHSA-pxg6-pf52-xh8x; production reachability not established. `cargo audit` unavailable; Rust advisory state unverified. No tracked edits, commits, push, deployment, nested jobs, release build, browser/integration/bench suite, exploit reproduction or perf claim. Git status clean. `scripts/verify fast` exit 0, verbatim: ``` PASS fast: migrations are append-only PASS fast: workspace package dependencies PASS fast: JavaScript dependencies PASS fast: build web app PASS fast: cargo fmt --check PASS fast: cargo clippy PASS fast: cargo test PASS fast: svelte-check PASS fast: UI package svelte-check PASS fast: stream package typecheck PASS fast: Vitest PASS fast: UI package Vitest PASS fast: stream package Vitest PASS fast: OpenAPI and TypeScript client drift PASS fast: terminal TypeScript PASS fast: terminal Vitest ```
Author
Owner

Gate evidence: scripts/verify fast passed all 16 steps in 3:51.38 on this checkout (fast-gate.log). scripts/verify all serially runs 52 steps, repeats build-web in fast/integration/browser/bench, builds the release binary in integration and browser, and omits the standalone e2e level (scripts/verify:365-427, 493-534, 565-570). Owner context reports integration and browser each at 40+ minutes, so moving those full suites from each merge to nightly removes at least 80 minutes of direct gate time per merge. The complete source and limitations are in /mnt/hdd/infraternal/jobs/audit-velocity/report.md.

Gate evidence: `scripts/verify fast` passed all 16 steps in 3:51.38 on this checkout (`fast-gate.log`). `scripts/verify all` serially runs 52 steps, repeats `build-web` in fast/integration/browser/bench, builds the release binary in integration and browser, and omits the standalone e2e level (`scripts/verify:365-427, 493-534, 565-570`). Owner context reports integration and browser each at 40+ minutes, so moving those full suites from each merge to nightly removes at least 80 minutes of direct gate time per merge. The complete source and limitations are in `/mnt/hdd/infraternal/jobs/audit-velocity/report.md`.
Author
Owner

Issue evidence: #31 records two stream burst close-code tests failing under CPU stress, a 4-second Podman PTY close timeout, a transient DATA timing assertion, an authorization completion audit miss, and a framing allocation test that failed once at load5 6.23 then passed on rerun. #42's rootless-Podman PTY cleanup loop was 18/20 before the fix; final loops reached 20/20, while merged-head verification had one /proc permission miss. Causes include real host scheduling assumptions, startup readiness bounds, a blocked sync process probe on a current-thread Tokio runtime, and one genuine cleanup defect. Exact cohort-wide counts remain unavailable because shared job rules prohibit reading other jobs' log/result files. Detailed evidence and classes are in /mnt/hdd/infraternal/jobs/audit-velocity/report.md.

Issue evidence: #31 records two stream burst close-code tests failing under CPU stress, a 4-second Podman PTY close timeout, a transient DATA timing assertion, an authorization completion audit miss, and a framing allocation test that failed once at load5 6.23 then passed on rerun. #42's rootless-Podman PTY cleanup loop was 18/20 before the fix; final loops reached 20/20, while merged-head verification had one `/proc` permission miss. Causes include real host scheduling assumptions, startup readiness bounds, a blocked sync process probe on a current-thread Tokio runtime, and one genuine cleanup defect. Exact cohort-wide counts remain unavailable because shared job rules prohibit reading other jobs' log/result files. Detailed evidence and classes are in `/mnt/hdd/infraternal/jobs/audit-velocity/report.md`.
Author
Owner

Inventory path evidence (runtime measurement pending): crates/server/src/resources.rs:308-325 refreshes the complete engine inventory for each container event, without an event debounce. resources.rs:279-281 deep-clones the full inventory snapshot before resources.rs:1661-1685 checks ETag and applies filters; a conditional 304 therefore still clones N rows. At the measured starting size there are 170 existing containers (Docker 63, Podman 107). The smallest fix is an immutable/shared snapshot with ETag evaluated before per-row copying, plus coalescing adjacent container events into one list refresh. Synthetic 1k/5k container creation is deferred because a live preview and parallel audit servers may react to every engine event.

Inventory path evidence (runtime measurement pending): `crates/server/src/resources.rs:308-325` refreshes the complete engine inventory for each container event, without an event debounce. `resources.rs:279-281` deep-clones the full inventory snapshot before `resources.rs:1661-1685` checks ETag and applies filters; a conditional 304 therefore still clones N rows. At the measured starting size there are 170 existing containers (Docker 63, Podman 107). The smallest fix is an immutable/shared snapshot with ETag evaluated before per-row copying, plus coalescing adjacent container events into one list refresh. Synthetic 1k/5k container creation is deferred because a live preview and parallel audit servers may react to every engine event.
Author
Owner

Audit update: calternal-port b3b125e is 150 commits ahead of dev f640461; no port lane is on dev or o2. Lane A/B and C1–C3 are integrated in the port branch, D cleanup is implemented. The current scripts/verify fast passed all 16 steps.

Issue #46 comment 9801 records the browser blocker: CDP saw four log WebSockets still live from prior document generations; opening exec raised the count to five. I recommend centralized pagehide transport teardown and explicit, idempotent pageshow reattachment (logs retain their paused/fresh-open behavior; persistent sessions resume by session ID and consumed offset). Estimate M.

Current calternal is c4a61e8cf, not the pinned 6440a5f. @calternal/ui is now a workspace package, but the port remains on the recorded copy-only architecture. Current docs supersede some old chrome/search/Inspector notes; I’m documenting the verified rules and fresh screenshots before the final recommendation.

I started the browser gate while the host was clear. A separate release build started during its build step, so I interrupted only this audit’s own cargo child; this is a capacity stop, not a product failure. I’ll rerun after the shared build clears. Interim report: /mnt/hdd/infraternal/jobs/audit-calternal/report.md.

Audit update: `calternal-port` b3b125e is 150 commits ahead of `dev` f640461; no port lane is on `dev` or o2. Lane A/B and C1–C3 are integrated in the port branch, D cleanup is implemented. The current `scripts/verify fast` passed all 16 steps. Issue #46 comment 9801 records the browser blocker: CDP saw four log WebSockets still live from prior document generations; opening exec raised the count to five. I recommend centralized `pagehide` transport teardown and explicit, idempotent `pageshow` reattachment (logs retain their paused/fresh-open behavior; persistent sessions resume by session ID and consumed offset). Estimate M. Current calternal is c4a61e8cf, not the pinned 6440a5f. `@calternal/ui` is now a workspace package, but the port remains on the recorded copy-only architecture. Current docs supersede some old chrome/search/Inspector notes; I’m documenting the verified rules and fresh screenshots before the final recommendation. I started the browser gate while the host was clear. A separate release build started during its build step, so I interrupted only this audit’s own cargo child; this is a capacity stop, not a product failure. I’ll rerun after the shared build clears. Interim report: `/mnt/hdd/infraternal/jobs/audit-calternal/report.md`.
Author
Owner

Audit update (base f640461228):

  • resources.rs maintains a separate Docker/Podman registry and local-only detail/action path (resources.rs:204, 1709, 1760, 2083-2145); EmbeddedAgent also connects its own BollardEngine (agent/src/lib.rs:1133). This diverges from DECISIONS.md §7 and makes local/remote resource expansion require parallel dispatch. Proposed seam: HostResourceClient with embedded and tunnel adapters.
  • Local refresh queries ContainerQuery::all and clones the other engine's records (resources.rs:244); snapshot() clones the complete snapshot and list_containers filters afterward (279, 1565). Remote inventory is capped at 5,000 containers/8 MiB (contracts.md:1619-1620), with no equivalent local cap. This is a structural O(N) cost, not a measured performance result.
  • Ten UI routes still use PlaceholderPage, and dashboard host cards show CPU, memory and disk as “—” (routes/terminals/+page.svelte, +page.svelte:108). These conflict with the owner's settled no-placeholder/no-“—” rule; docs/UI still describes the old behavior.
  • Full report with module map, top-10 findings and ordered refactor plan: /mnt/hdd/infraternal/jobs/audit-arch/report.md
Audit update (base f640461228c8bdeba95646e4909accba829c00df): - resources.rs maintains a separate Docker/Podman registry and local-only detail/action path (resources.rs:204, 1709, 1760, 2083-2145); EmbeddedAgent also connects its own BollardEngine (agent/src/lib.rs:1133). This diverges from DECISIONS.md §7 and makes local/remote resource expansion require parallel dispatch. Proposed seam: HostResourceClient with embedded and tunnel adapters. - Local refresh queries ContainerQuery::all and clones the other engine's records (resources.rs:244); snapshot() clones the complete snapshot and list_containers filters afterward (279, 1565). Remote inventory is capped at 5,000 containers/8 MiB (contracts.md:1619-1620), with no equivalent local cap. This is a structural O(N) cost, not a measured performance result. - Ten UI routes still use PlaceholderPage, and dashboard host cards show CPU, memory and disk as “—” (routes/terminals/+page.svelte, +page.svelte:108). These conflict with the owner's settled no-placeholder/no-“—” rule; docs/UI still describes the old behavior. - Full report with module map, top-10 findings and ordered refactor plan: /mnt/hdd/infraternal/jobs/audit-arch/report.md
Author
Owner

Release binary result: time rtk cargo build --release -p infraternal finished in 6m 41.62s (425 crates compiled). stat -c '%n %s bytes' target/release/infraternal reports 32,538,104 bytes; file confirms stripped. This exceeds the docs/PLAN.md:291-300 ≤25 MB budget by 7,538,104 bytes (30.2%). cargo tree -p infraternal -i openssl --edges normal shows OpenSSL is required by server certificate code and webauthn-rs attestation; rustls also brings AWS-LC, so dropping either crypto stack without a security design change is not a safe size-only recommendation. The smallest first step is a cargo-bloat/link-map attribution on the perf VM, then split the executable only if duplicated CLI/MCP code is material.

Release binary result: `time rtk cargo build --release -p infraternal` finished in 6m 41.62s (425 crates compiled). `stat -c '%n %s bytes' target/release/infraternal` reports 32,538,104 bytes; `file` confirms stripped. This exceeds the `docs/PLAN.md:291-300` ≤25 MB budget by 7,538,104 bytes (30.2%). `cargo tree -p infraternal -i openssl --edges normal` shows OpenSSL is required by server certificate code and `webauthn-rs` attestation; rustls also brings AWS-LC, so dropping either crypto stack without a security design change is not a safe size-only recommendation. The smallest first step is a `cargo-bloat`/link-map attribution on the perf VM, then split the executable only if duplicated CLI/MCP code is material.
Author
Owner

Frontend audit findings with source evidence:

  • packages/web/src/lib/stream-attachment.svelte.ts:176-184,269-281: final detach removes its channel but does not close the singleton client; packages/stream/src/index.ts:1049-1065 keeps a 1-second liveness timer (idle ping threshold 15s). Fix belongs in the shared attachment lifecycle.
  • packages/web/src/lib/shell/navigation-persistence.ts:45-55 calls the generated client outside shared 401 recovery (packages/web/src/lib/api.ts:21-41), despite docs/contracts.md:122-128 requiring refresh/retry.
  • Sidebar PUT retry at packages/web/src/lib/shell/navigation-persistence.ts:50-55,354-421 makes a fresh idempotency key each time; docs/contracts.md:122-125 requires reusing one on retry. If the first write committed but its reply was lost, the retry conflicts and needs an additional reload.
  • Inventory route-owned pollers run every 2s; dashboard calls both list endpoints each tick. Hosts have no conditional validator and no loader singleflight (packages/web/src/routes/+page.svelte:38-56, hosts/+page.svelte:35-53, containers/+page.svelte:74-88, packages/web/src/lib/inventory.ts:30-56). Container cadence is contractual (docs/contracts.md:555-558) and should remain.
  • Terminal base-page refresh polls every 3s but is not protected by the pagination-only in-flight flag (packages/web/src/routes/terminals/+page.svelte:96-100,197-232).
  • InfrastructureList and live ImageReference are reused from under the Containers route; packages/web/src/lib/ImageReference.svelte has zero current importers. Browser-gate __ui-tests remains a shipped route.
  • Shadcn/bits-ui/tailwind-variants/tw-animate/cn removal is complete; no remaining imports.
    Report with full ranking and recommendation: /mnt/hdd/infraternal/jobs/audit-frontend/report.md. Fast gate passed; production browser gate is waiting for another job's active suite to finish.
Frontend audit findings with source evidence: - `packages/web/src/lib/stream-attachment.svelte.ts:176-184,269-281`: final detach removes its channel but does not close the singleton client; `packages/stream/src/index.ts:1049-1065` keeps a 1-second liveness timer (idle ping threshold 15s). Fix belongs in the shared attachment lifecycle. - `packages/web/src/lib/shell/navigation-persistence.ts:45-55` calls the generated client outside shared 401 recovery (`packages/web/src/lib/api.ts:21-41`), despite `docs/contracts.md:122-128` requiring refresh/retry. - Sidebar PUT retry at `packages/web/src/lib/shell/navigation-persistence.ts:50-55,354-421` makes a fresh idempotency key each time; `docs/contracts.md:122-125` requires reusing one on retry. If the first write committed but its reply was lost, the retry conflicts and needs an additional reload. - Inventory route-owned pollers run every 2s; dashboard calls both list endpoints each tick. Hosts have no conditional validator and no loader singleflight (`packages/web/src/routes/+page.svelte:38-56`, `hosts/+page.svelte:35-53`, `containers/+page.svelte:74-88`, `packages/web/src/lib/inventory.ts:30-56`). Container cadence is contractual (`docs/contracts.md:555-558`) and should remain. - Terminal base-page refresh polls every 3s but is not protected by the pagination-only in-flight flag (`packages/web/src/routes/terminals/+page.svelte:96-100,197-232`). - `InfrastructureList` and live `ImageReference` are reused from under the Containers route; `packages/web/src/lib/ImageReference.svelte` has zero current importers. Browser-gate `__ui-tests` remains a shipped route. - Shadcn/bits-ui/tailwind-variants/tw-animate/cn removal is complete; no remaining imports. Report with full ranking and recommendation: `/mnt/hdd/infraternal/jobs/audit-frontend/report.md`. Fast gate passed; production browser gate is waiting for another job's active suite to finish.
Author
Owner

Architecture audit complete for kayg/infraternal#48.
Base/head unchanged: f640461228. Read-only; no tracked files changed.
Full report: report.md

Key evidence:

  • Local REST resources own a separate Docker/Podman registry and local-only detail/action path alongside embedded and remote infraternal agent dispatch.
  • Local container refresh and every list request clone full inventory; unlike remote inventory, local inventory has no 5,000-container/8 MiB cap. This is structural O(N), not measured latency/RSS.
  • Ten UI routes still show “not built yet”; dashboard host cards render CPU, memory and disk as “—”, against the owner's settled UI rule.
  • Four server modules are 70.4% of 18,055 source lines; stream open_channel is 1,001 lines. Recommendation: split ownership within the server crate.
  • LXC discovery is hardcoded in two paths; OIDC has no provider boundary. MCP intentionally omits CLI exec despite API/CLI/MCP reachability rule.
  • jscpd: 86 clones, 2,267/91,399 lines (2.48%); biggest clone is 440 plus 90 lines of SSHD test setup. HTTP DTO/OpenAPI generation is checked; browser stream frame constants remain manually duplicated.
  • Report includes severity-ranked top 10, full evidence, proposed crate/module map, ordered refactor plan and deletion candidates.

scripts/verify fast (exit 0), output:

PASS fast: migrations are append-only
PASS fast: workspace package dependencies
PASS fast: JavaScript dependencies
PASS fast: build web app
PASS fast: cargo fmt --check
PASS fast: cargo clippy
PASS fast: cargo test
PASS fast: svelte-check
PASS fast: UI package svelte-check
PASS fast: stream package typecheck
PASS fast: Vitest
PASS fast: UI package Vitest
PASS fast: stream package Vitest
PASS fast: OpenAPI and TypeScript client drift
PASS fast: terminal TypeScript
PASS fast: terminal Vitest
Architecture audit complete for kayg/infraternal#48. Base/head unchanged: f640461228c8bdeba95646e4909accba829c00df. Read-only; no tracked files changed. Full report: [report.md](/mnt/hdd/infraternal/jobs/audit-arch/report.md) Key evidence: - Local REST resources own a separate Docker/Podman registry and local-only detail/action path alongside embedded and remote infraternal agent dispatch. - Local container refresh and every list request clone full inventory; unlike remote inventory, local inventory has no 5,000-container/8 MiB cap. This is structural O(N), not measured latency/RSS. - Ten UI routes still show “not built yet”; dashboard host cards render CPU, memory and disk as “—”, against the owner's settled UI rule. - Four server modules are 70.4% of 18,055 source lines; stream open_channel is 1,001 lines. Recommendation: split ownership within the server crate. - LXC discovery is hardcoded in two paths; OIDC has no provider boundary. MCP intentionally omits CLI exec despite API/CLI/MCP reachability rule. - jscpd: 86 clones, 2,267/91,399 lines (2.48%); biggest clone is 440 plus 90 lines of SSHD test setup. HTTP DTO/OpenAPI generation is checked; browser stream frame constants remain manually duplicated. - Report includes severity-ranked top 10, full evidence, proposed crate/module map, ordered refactor plan and deletion candidates. scripts/verify fast (exit 0), output: ~~~text PASS fast: migrations are append-only PASS fast: workspace package dependencies PASS fast: JavaScript dependencies PASS fast: build web app PASS fast: cargo fmt --check PASS fast: cargo clippy PASS fast: cargo test PASS fast: svelte-check PASS fast: UI package svelte-check PASS fast: stream package typecheck PASS fast: Vitest PASS fast: UI package Vitest PASS fast: stream package Vitest PASS fast: OpenAPI and TypeScript client drift PASS fast: terminal TypeScript PASS fast: terminal Vitest ~~~
Author
Owner

Audit complete for base f640461228.

Full report: /mnt/hdd/infraternal/jobs/audit-velocity/report.md

Findings:

  • Owner context says integration and browser each take 40+ minutes; tiering both to nightly removes over 80 minutes from a full per-merge loop.
  • Browser source has 84 all-route checks at intermediate widths beyond docs/UI.md and 16 duplicate route visits/screenshots later overwritten.
  • Successful verify step logs are deleted and per-step durations are not reported.
  • verify all repeats the web build four times and release build twice; stage timing was unavailable.
  • Flake evidence from #31/#42 is summarized; counts for SSH replay, PTY resize, Jump to latest and Refresh delayed could not be recovered.
  • Recommendation: fast + compact real-engine/sshd and production-browser smokes at merge; full real integration, browser matrix, e2e and perf-test VM benchmarks nightly. Measure the composed merge gate under 15 minutes before setting that budget.
  • Kept real-service test policy intact; a fake-engine majority would require an explicit contract change.

Measured scripts/verify fast: PASS, 3:51.38 wall (141.54 s user, 13.31 s system, 66% CPU).

Verbatim gate output:
PASS fast: migrations are append-only
PASS fast: workspace package dependencies
PASS fast: JavaScript dependencies
PASS fast: build web app
PASS fast: cargo fmt --check
PASS fast: cargo clippy
PASS fast: cargo test
PASS fast: svelte-check
PASS fast: UI package svelte-check
PASS fast: stream package typecheck
PASS fast: Vitest
PASS fast: UI package Vitest
PASS fast: stream package Vitest
PASS fast: OpenAPI and TypeScript client drift
PASS fast: terminal TypeScript
PASS fast: terminal Vitest

The complete cross-job log census was not performed because the shared operating contract prohibits reading other jobs' files. No tracked files changed.

Audit complete for base f640461228c8bdeba95646e4909accba829c00df. Full report: /mnt/hdd/infraternal/jobs/audit-velocity/report.md Findings: - Owner context says integration and browser each take 40+ minutes; tiering both to nightly removes over 80 minutes from a full per-merge loop. - Browser source has 84 all-route checks at intermediate widths beyond docs/UI.md and 16 duplicate route visits/screenshots later overwritten. - Successful verify step logs are deleted and per-step durations are not reported. - verify all repeats the web build four times and release build twice; stage timing was unavailable. - Flake evidence from #31/#42 is summarized; counts for SSH replay, PTY resize, Jump to latest and Refresh delayed could not be recovered. - Recommendation: fast + compact real-engine/sshd and production-browser smokes at merge; full real integration, browser matrix, e2e and perf-test VM benchmarks nightly. Measure the composed merge gate under 15 minutes before setting that budget. - Kept real-service test policy intact; a fake-engine majority would require an explicit contract change. Measured scripts/verify fast: PASS, 3:51.38 wall (141.54 s user, 13.31 s system, 66% CPU). Verbatim gate output: PASS fast: migrations are append-only PASS fast: workspace package dependencies PASS fast: JavaScript dependencies PASS fast: build web app PASS fast: cargo fmt --check PASS fast: cargo clippy PASS fast: cargo test PASS fast: svelte-check PASS fast: UI package svelte-check PASS fast: stream package typecheck PASS fast: Vitest PASS fast: UI package Vitest PASS fast: stream package Vitest PASS fast: OpenAPI and TypeScript client drift PASS fast: terminal TypeScript PASS fast: terminal Vitest The complete cross-job log census was not performed because the shared operating contract prohibits reading other jobs' files. No tracked files changed.
Author
Owner

Report path link for the completion summary above:
Full audit report

Report path link for the completion summary above: [Full audit report](/mnt/hdd/infraternal/jobs/audit-velocity/report.md)
Author
Owner

Starting gates-tiering on branch gates-tiering, based on dev at f640461228c8bdeba95646e4909accba829c00df. I read the velocity audit and the repository gate contracts. I will implement measured stages, prerequisite reuse, run isolation, browser matrix reduction, and merge/nightly tiers in the requested order. No API or wire-contract change is planned.

Starting gates-tiering on branch `gates-tiering`, based on `dev` at `f640461228c8bdeba95646e4909accba829c00df`. I read the velocity audit and the repository gate contracts. I will implement measured stages, prerequisite reuse, run isolation, browser matrix reduction, and merge/nightly tiers in the requested order. No API or wire-contract change is planned.
Author
Owner

Additional performance finding:

  • packages/terminal/src/core.ts:149-162,333-339 schedules a full accessible screen snapshot on the next animation frame after every consumed terminal write. Default panes are 80×24 (packages/web/src/routes/terminals/lib/TerminalPane.svelte:36); default backend is Ghostty (packages/terminal/src/types.ts:23-27,65-67). Its getter walks cells and builds a full string (packages/terminal/src/backends/ghostty.ts:379-394). At 60 Hz this is up to 1,920 cell positions × 60 = ~115,200 positions/sec per terminal, plus allocations and DOM text replacement. This is source-derived, not measured CPU/heap. Keep the live region; evaluate bounded cadence or incremental lines under sustained output.
    Full report: /mnt/hdd/infraternal/jobs/audit-frontend/report.md.
Additional performance finding: - `packages/terminal/src/core.ts:149-162,333-339` schedules a full accessible screen snapshot on the next animation frame after every consumed terminal write. Default panes are 80×24 (`packages/web/src/routes/terminals/lib/TerminalPane.svelte:36`); default backend is Ghostty (`packages/terminal/src/types.ts:23-27,65-67`). Its getter walks cells and builds a full string (`packages/terminal/src/backends/ghostty.ts:379-394`). At 60 Hz this is up to 1,920 cell positions × 60 = ~115,200 positions/sec per terminal, plus allocations and DOM text replacement. This is source-derived, not measured CPU/heap. Keep the live region; evaluate bounded cadence or incremental lines under sustained output. Full report: `/mnt/hdd/infraternal/jobs/audit-frontend/report.md`.
Author
Owner

Starting sec-hardening on branch sec-hardening, base f640461228. Scope: F1/F3/F4/F6/F7/F8, regression tests with fix-disabled evidence, contracts, fast and targeted gates. No nested jobs, push, or provider-refactor file edits. F2/F5 deferred to #49 per assignment.

Starting sec-hardening on branch sec-hardening, base f640461228c8bdeba95646e4909accba829c00df. Scope: F1/F3/F4/F6/F7/F8, regression tests with fix-disabled evidence, contracts, fast and targeted gates. No nested jobs, push, or provider-refactor file edits. F2/F5 deferred to #49 per assignment.
Author
Owner

Finding: verify all previously reached separate JS freshness checks and web builds through fast, integration, browser and bench, plus separate release builds through integration and browser. I added guarded per-invocation preparation helpers. Fast prepares JavaScript dependencies and the web bundle; integration/browser/e2e prepare the release binary, and composite runs skip any prerequisite already prepared. bash -n scripts/verify and git diff --check pass.

Finding: `verify all` previously reached separate JS freshness checks and web builds through fast, integration, browser and bench, plus separate release builds through integration and browser. I added guarded per-invocation preparation helpers. Fast prepares JavaScript dependencies and the web bundle; integration/browser/e2e prepare the release binary, and composite runs skip any prerequisite already prepared. `bash -n scripts/verify` and `git diff --check` pass.
Author
Owner

F1 and F7 implemented on sec-hardening. AI identity revocation returns 403 plan_required before mutation (including dry-run query); generic rejection audit uses MatchedPath route templates/unmatched, canonical HTTP methods, and parsed session targets with typed target_valid details. Fixtures use benign canaries.
Regression proof: temporarily reverted each owned fix, ran its new targeted test, then restored the fix.

f1-without

   Compiling infraternal-server v0.0.1 (/home/kayg/wt/sec-hardening/crates/server)
warning: unused import: `TokenKind`
  --> crates/server/src/agents.rs:17:5
   |
17 |     TokenKind, effective_permission,
   |     ^^^^^^^^^
   |
   = note: `#[warn(unused_imports)]` (part of `#[warn(unused)]`) on by default

warning: `infraternal-server` (lib) generated 1 warning (run `cargo fix --lib -p infraternal-server` to apply 1 suggestion)
    Finished `test` profile [unoptimized] target(s) in 11.48s
     Running tests/agent_enrollment.rs (target/debug/deps/agent_enrollment-5f47c4f53342c729)

running 1 test
test ai_identity_revoke_requires_plan_and_leaves_identity_active ... FAILED

failures:

---- ai_identity_revoke_requires_plan_and_leaves_identity_active stdout ----

thread 'ai_identity_revoke_requires_plan_and_leaves_identity_active' (163049) panicked at crates/server/tests/agent_enrollment.rs:352:9:
assertion `left == right` failed
  left: 200
 right: 403
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace


failures:
    ai_identity_revoke_requires_plan_and_leaves_identity_active

test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 2 filtered out; finished in 0.07s

error: test failed, to rerun pass `-p infraternal-server --test agent_enrollment`

f7-without

   Compiling infraternal-server v0.0.1 (/home/kayg/wt/sec-hardening/crates/server)
warning: method `audit_session_rejection` is never used
    --> crates/server/src/storage/mod.rs:2278:25
     |
 342 | impl SqliteStorage {
     | ------------------ method in this implementation
...
2278 |     pub(crate) async fn audit_session_rejection(
     |                         ^^^^^^^^^^^^^^^^^^^^^^^
     |
     = note: `#[warn(dead_code)]` (part of `#[warn(unused)]`) on by default

warning: `infraternal-server` (lib) generated 1 warning
    Finished `test` profile [unoptimized] target(s) in 10.25s
     Running tests/personal_http.rs (target/debug/deps/personal_http-6dc1299ba30b9c46)

running 1 test
test rejection_audit_uses_templates_and_validated_session_targets ... FAILED

failures:

---- rejection_audit_uses_templates_and_validated_session_targets stdout ----

thread 'rejection_audit_uses_templates_and_validated_session_targets' (163320) panicked at crates/server/tests/personal_http.rs:460:5:
assertion failed: rows.iter().all(|(a, t, d)|
        !format!("{a}{t}{d}").contains("benign-redaction-canary"))
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace


failures:
    rejection_audit_uses_templates_and_validated_session_targets

test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 4 filtered out; finished in 0.07s

error: test failed, to rerun pass `-p infraternal-server --test personal_http`

f1-restored

   Compiling infraternal-server v0.0.1 (/home/kayg/wt/sec-hardening/crates/server)
    Finished `test` profile [unoptimized] target(s) in 9.81s
     Running tests/agent_enrollment.rs (target/debug/deps/agent_enrollment-5f47c4f53342c729)

running 1 test
test ai_identity_revoke_requires_plan_and_leaves_identity_active ... ok

test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 2 filtered out; finished in 0.07s


f7-restored

   Compiling infraternal-server v0.0.1 (/home/kayg/wt/sec-hardening/crates/server)

API source: https://docs.rs/axum/0.8.9/axum/extract/struct.MatchedPath.html. Initial fast gate prepared dependencies/web but failed fmt on new unformatted edits; formatted afterward. Full fast rerun follows remaining fixes.

F1 and F7 implemented on sec-hardening. AI identity revocation returns 403 plan_required before mutation (including dry-run query); generic rejection audit uses MatchedPath route templates/unmatched, canonical HTTP methods, and parsed session targets with typed target_valid details. Fixtures use benign canaries. Regression proof: temporarily reverted each owned fix, ran its new targeted test, then restored the fix. f1-without ``` Compiling infraternal-server v0.0.1 (/home/kayg/wt/sec-hardening/crates/server) warning: unused import: `TokenKind` --> crates/server/src/agents.rs:17:5 | 17 | TokenKind, effective_permission, | ^^^^^^^^^ | = note: `#[warn(unused_imports)]` (part of `#[warn(unused)]`) on by default warning: `infraternal-server` (lib) generated 1 warning (run `cargo fix --lib -p infraternal-server` to apply 1 suggestion) Finished `test` profile [unoptimized] target(s) in 11.48s Running tests/agent_enrollment.rs (target/debug/deps/agent_enrollment-5f47c4f53342c729) running 1 test test ai_identity_revoke_requires_plan_and_leaves_identity_active ... FAILED failures: ---- ai_identity_revoke_requires_plan_and_leaves_identity_active stdout ---- thread 'ai_identity_revoke_requires_plan_and_leaves_identity_active' (163049) panicked at crates/server/tests/agent_enrollment.rs:352:9: assertion `left == right` failed left: 200 right: 403 note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace failures: ai_identity_revoke_requires_plan_and_leaves_identity_active test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 2 filtered out; finished in 0.07s error: test failed, to rerun pass `-p infraternal-server --test agent_enrollment` ``` f7-without ``` Compiling infraternal-server v0.0.1 (/home/kayg/wt/sec-hardening/crates/server) warning: method `audit_session_rejection` is never used --> crates/server/src/storage/mod.rs:2278:25 | 342 | impl SqliteStorage { | ------------------ method in this implementation ... 2278 | pub(crate) async fn audit_session_rejection( | ^^^^^^^^^^^^^^^^^^^^^^^ | = note: `#[warn(dead_code)]` (part of `#[warn(unused)]`) on by default warning: `infraternal-server` (lib) generated 1 warning Finished `test` profile [unoptimized] target(s) in 10.25s Running tests/personal_http.rs (target/debug/deps/personal_http-6dc1299ba30b9c46) running 1 test test rejection_audit_uses_templates_and_validated_session_targets ... FAILED failures: ---- rejection_audit_uses_templates_and_validated_session_targets stdout ---- thread 'rejection_audit_uses_templates_and_validated_session_targets' (163320) panicked at crates/server/tests/personal_http.rs:460:5: assertion failed: rows.iter().all(|(a, t, d)| !format!("{a}{t}{d}").contains("benign-redaction-canary")) note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace failures: rejection_audit_uses_templates_and_validated_session_targets test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 4 filtered out; finished in 0.07s error: test failed, to rerun pass `-p infraternal-server --test personal_http` ``` f1-restored ``` Compiling infraternal-server v0.0.1 (/home/kayg/wt/sec-hardening/crates/server) Finished `test` profile [unoptimized] target(s) in 9.81s Running tests/agent_enrollment.rs (target/debug/deps/agent_enrollment-5f47c4f53342c729) running 1 test test ai_identity_revoke_requires_plan_and_leaves_identity_active ... ok test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 2 filtered out; finished in 0.07s ``` f7-restored ``` Compiling infraternal-server v0.0.1 (/home/kayg/wt/sec-hardening/crates/server) ``` API source: https://docs.rs/axum/0.8.9/axum/extract/struct.MatchedPath.html. Initial fast gate prepared dependencies/web but failed fmt on new unformatted edits; formatted afterward. Full fast rerun follows remaining fixes.
Author
Owner

audit-product complete; read-only dev f640461228, HEAD unchanged, git clean.
Report: MVP v0.1 audit
Recommendation: S1-sized release: one owner, local existing Docker/Podman containers, a few SSH targets through the embedded infraternal agent.
Keep passkeys/device login, scoped plans, audit writes, process cleanup and credit flow; finish core calternal controls.
Freeze full remote support, OIDC, LXC/Linux panel, stacks/images/volumes, audit export, terminal tabs/splits and MCP breadth beyond core parity.
Top blockers: #47 anon-rss 11357604 kB OOM; #46 CDP confirms four old-document log sockets plus one exec socket.
Core gaps: web host/token/session/inbox controls; unbounded initial log history; missed-peer refresh detaches terminals; SSH CLI exit/cleanup reliability.
Remote detail/lifecycle also incomplete (resources.rs:2095); not just #43/#45. Original #44/#42 fixes are already in dev.
Report includes every exposed feature across web/CLI/MCP/API, pending branches, #16–#47 dispositions, top ten findings, costs/fixes/effort and ten ordered steps with lanes.
Perf claims remain unproven: no candidate perf-VM A/B; historical dev smoke is explicitly not release evidence.
Gates on unchanged base: scripts/verify fast exit 0; targeted auth/log tests 19/19, exit 0.
No integration/browser/bench run by this audit; no commits, push, deployment or issue closure.
Verbatim fast output:

PASS fast: migrations are append-only
PASS fast: workspace package dependencies
PASS fast: JavaScript dependencies
PASS fast: build web app
PASS fast: cargo fmt --check
PASS fast: cargo clippy
PASS fast: cargo test
PASS fast: svelte-check
PASS fast: UI package svelte-check
PASS fast: stream package typecheck
PASS fast: Vitest
PASS fast: UI package Vitest
PASS fast: stream package Vitest
PASS fast: OpenAPI and TypeScript client drift
PASS fast: terminal TypeScript
PASS fast: terminal Vitest
audit-product complete; read-only dev f640461228c8bdeba95646e4909accba829c00df, HEAD unchanged, git clean. Report: [MVP v0.1 audit](/mnt/hdd/infraternal/jobs/audit-product/report.md) Recommendation: S1-sized release: one owner, local existing Docker/Podman containers, a few SSH targets through the embedded infraternal agent. Keep passkeys/device login, scoped plans, audit writes, process cleanup and credit flow; finish core calternal controls. Freeze full remote support, OIDC, LXC/Linux panel, stacks/images/volumes, audit export, terminal tabs/splits and MCP breadth beyond core parity. Top blockers: #47 anon-rss 11357604 kB OOM; #46 CDP confirms four old-document log sockets plus one exec socket. Core gaps: web host/token/session/inbox controls; unbounded initial log history; missed-peer refresh detaches terminals; SSH CLI exit/cleanup reliability. Remote detail/lifecycle also incomplete (resources.rs:2095); not just #43/#45. Original #44/#42 fixes are already in dev. Report includes every exposed feature across web/CLI/MCP/API, pending branches, #16–#47 dispositions, top ten findings, costs/fixes/effort and ten ordered steps with lanes. Perf claims remain unproven: no candidate perf-VM A/B; historical dev smoke is explicitly not release evidence. Gates on unchanged base: scripts/verify fast exit 0; targeted auth/log tests 19/19, exit 0. No integration/browser/bench run by this audit; no commits, push, deployment or issue closure. Verbatim fast output: ```text PASS fast: migrations are append-only PASS fast: workspace package dependencies PASS fast: JavaScript dependencies PASS fast: build web app PASS fast: cargo fmt --check PASS fast: cargo clippy PASS fast: cargo test PASS fast: svelte-check PASS fast: UI package svelte-check PASS fast: stream package typecheck PASS fast: Vitest PASS fast: UI package Vitest PASS fast: stream package Vitest PASS fast: OpenAPI and TypeScript client drift PASS fast: terminal TypeScript PASS fast: terminal Vitest ```
Author
Owner

Idle-server measurement on dev f640461: release server started on free 127.0.0.1:7535 with a fresh job-local SQLite DB and 170 containers. Health-ready startup was 322.7 ms. Over 60.04 s with no browser or stream, RSS was 24,368–24,384 KiB, mean CPU 0.283% of one core (p95/max 0.999%), 17 OS threads and 25 open FDs. It is under the 40 MiB idle-RSS budget. Static task count is six long-lived async tasks (2 engine event watchers, 3 server session/token sweeps, 1 SSH reaper); Tokio task count is not exposed by the production binary. Idle sampler command: python3 /mnt/hdd/infraternal/jobs/audit-perf/idle-sample.py 164287 60 /mnt/hdd/infraternal/jobs/audit-perf/dev-server/idle-sample.json.

Idle-server measurement on dev `f640461`: release server started on free 127.0.0.1:7535 with a fresh job-local SQLite DB and 170 containers. Health-ready startup was 322.7 ms. Over 60.04 s with no browser or stream, RSS was 24,368–24,384 KiB, mean CPU 0.283% of one core (p95/max 0.999%), 17 OS threads and 25 open FDs. It is under the 40 MiB idle-RSS budget. Static task count is six long-lived async tasks (2 engine event watchers, 3 server session/token sweeps, 1 SSH reaper); Tokio task count is not exposed by the production binary. Idle sampler command: `python3 /mnt/hdd/infraternal/jobs/audit-perf/idle-sample.py 164287 60 /mnt/hdd/infraternal/jobs/audit-perf/dev-server/idle-sample.json`.
Author
Owner

Isolation finding: two concurrent infraternal_ensure_js_dependencies calls in this worktree produced one bun install v1.4.2 (220 packages installed [2.12s]); the waiter rechecked the marker and returned dependency check 2 passed without starting another install. The helper now locks in the worktree's private Git directory and rechecks the lock hash plus required tools after acquiring it. Release-server startup retries only if its child exits with an address-in-use diagnostic. Browser containers carry infraternal.test.run=<run-id>, cleanup filters that exact label, and browser/terminal/e2e outputs use run-specific directories. bash -n, node --check, and git diff --check pass.

Isolation finding: two concurrent `infraternal_ensure_js_dependencies` calls in this worktree produced one `bun install v1.4.2` (`220 packages installed [2.12s]`); the waiter rechecked the marker and returned `dependency check 2 passed` without starting another install. The helper now locks in the worktree's private Git directory and rechecks the lock hash plus required tools after acquiring it. Release-server startup retries only if its child exits with an address-in-use diagnostic. Browser containers carry `infraternal.test.run=<run-id>`, cleanup filters that exact label, and browser/terminal/e2e outputs use run-specific directories. `bash -n`, `node --check`, and `git diff --check` pass.
Author
Owner

F3 committed bd18b93: process-scoped refresh lock covers reload/rotate/save for keychain and fallback; CLI and MCP reuse eligible saved access. Independent child processes against the real server rotate once per slot and preserve current access. F8 committed: enrollment admin uses shared credential-safe idempotency, join secret excluded from stored replay, revocation replays once. Contracts and generated OpenAPI/client updated.

f3-without

     Running unittests src/main.rs (target/debug/deps/infraternal-06321d30b7368a4e)

running 1 test
test login::tests::independent_cli_and_mcp_processes_rotate_once_and_reuse_saved_access ... FAILED

failures:

---- login::tests::independent_cli_and_mcp_processes_rotate_once_and_reuse_saved_access stdout ----

thread 'login::tests::independent_cli_and_mcp_processes_rotate_once_and_reuse_saved_access' (169535) panicked at crates/infraternal/src/login.rs:1379:17:
fixture client failed
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace


failures:
    login::tests::independent_cli_and_mcp_processes_rotate_once_and_reuse_saved_access

test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 40 filtered out; finished in 0.27s

error: test failed, to rerun pass `-p infraternal --bin infraternal`

f3-restored

   Compiling infraternal-server v0.0.1 (/home/kayg/wt/sec-hardening/crates/server)
   Compiling infraternal v0.0.1 (/home/kayg/wt/sec-hardening/crates/infraternal)
    Finished `test` profile [unoptimized] target(s) in 22.02s
     Running unittests src/main.rs (target/debug/deps/infraternal-06321d30b7368a4e)

running 1 test
test login::tests::independent_cli_and_mcp_processes_rotate_once_and_reuse_saved_access ... ok

test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 40 filtered out; finished in 0.28s

f8-without

running 1 test
test enrollment_admin_idempotency_never_replays_join_secrets ... FAILED

failures:

---- enrollment_admin_idempotency_never_replays_join_secrets stdout ----

thread 'enrollment_admin_idempotency_never_replays_join_secrets' (173240) panicked at crates/server/tests/agent_enrollment.rs:413:5:
assertion `left == right` failed
  left: 200
 right: 400
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace


failures:
    enrollment_admin_idempotency_never_replays_join_secrets

test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 3 filtered out; finished in 0.08s

error: test failed, to rerun pass `-p infraternal-server --test agent_enrollment`

f8-restored

   Compiling infraternal-private-storage v0.0.1 (/home/kayg/wt/sec-hardening/crates/private-storage)
   Compiling infraternal-ssh v0.0.1 (/home/kayg/wt/sec-hardening/crates/ssh)
   Compiling infraternal-agent v0.0.1 (/home/kayg/wt/sec-hardening/crates/agent)
warning: unused import: `self`
 --> crates/agent/src/lib.rs:7:10
  |
7 |     fs::{self, OpenOptions},
  |          ^^^^
  |
  = note: `#[warn(unused_imports)]` (part of `#[warn(unused)]`) on by default

   Compiling infraternal-server v0.0.1 (/home/kayg/wt/sec-hardening/crates/server)
warning: `infraternal-agent` (lib) generated 1 warning (run `cargo fix --lib -p infraternal-agent` to apply 1 suggestion)
    Finished `test` profile [unoptimized] target(s) in 19.02s
     Running tests/agent_enrollment.rs (target/debug/deps/agent_enrollment-f74cf8f270b2ad55)

Lock API source: https://docs.rs/fs2/0.4.3/fs2/trait.FileExt.html (nonblocking exclusive locks; descriptor held through async rotation). No benchmark performance numbers claimed. Full fast gate pending F4/F6 completion.

F3 committed bd18b93: process-scoped refresh lock covers reload/rotate/save for keychain and fallback; CLI and MCP reuse eligible saved access. Independent child processes against the real server rotate once per slot and preserve current access. F8 committed: enrollment admin uses shared credential-safe idempotency, join secret excluded from stored replay, revocation replays once. Contracts and generated OpenAPI/client updated. f3-without ``` Running unittests src/main.rs (target/debug/deps/infraternal-06321d30b7368a4e) running 1 test test login::tests::independent_cli_and_mcp_processes_rotate_once_and_reuse_saved_access ... FAILED failures: ---- login::tests::independent_cli_and_mcp_processes_rotate_once_and_reuse_saved_access stdout ---- thread 'login::tests::independent_cli_and_mcp_processes_rotate_once_and_reuse_saved_access' (169535) panicked at crates/infraternal/src/login.rs:1379:17: fixture client failed note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace failures: login::tests::independent_cli_and_mcp_processes_rotate_once_and_reuse_saved_access test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 40 filtered out; finished in 0.27s error: test failed, to rerun pass `-p infraternal --bin infraternal` ``` f3-restored ``` Compiling infraternal-server v0.0.1 (/home/kayg/wt/sec-hardening/crates/server) Compiling infraternal v0.0.1 (/home/kayg/wt/sec-hardening/crates/infraternal) Finished `test` profile [unoptimized] target(s) in 22.02s Running unittests src/main.rs (target/debug/deps/infraternal-06321d30b7368a4e) running 1 test test login::tests::independent_cli_and_mcp_processes_rotate_once_and_reuse_saved_access ... ok test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 40 filtered out; finished in 0.28s ``` f8-without ``` running 1 test test enrollment_admin_idempotency_never_replays_join_secrets ... FAILED failures: ---- enrollment_admin_idempotency_never_replays_join_secrets stdout ---- thread 'enrollment_admin_idempotency_never_replays_join_secrets' (173240) panicked at crates/server/tests/agent_enrollment.rs:413:5: assertion `left == right` failed left: 200 right: 400 note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace failures: enrollment_admin_idempotency_never_replays_join_secrets test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 3 filtered out; finished in 0.08s error: test failed, to rerun pass `-p infraternal-server --test agent_enrollment` ``` f8-restored ``` Compiling infraternal-private-storage v0.0.1 (/home/kayg/wt/sec-hardening/crates/private-storage) Compiling infraternal-ssh v0.0.1 (/home/kayg/wt/sec-hardening/crates/ssh) Compiling infraternal-agent v0.0.1 (/home/kayg/wt/sec-hardening/crates/agent) warning: unused import: `self` --> crates/agent/src/lib.rs:7:10 | 7 | fs::{self, OpenOptions}, | ^^^^ | = note: `#[warn(unused_imports)]` (part of `#[warn(unused)]`) on by default Compiling infraternal-server v0.0.1 (/home/kayg/wt/sec-hardening/crates/server) warning: `infraternal-agent` (lib) generated 1 warning (run `cargo fix --lib -p infraternal-agent` to apply 1 suggestion) Finished `test` profile [unoptimized] target(s) in 19.02s Running tests/agent_enrollment.rs (target/debug/deps/agent_enrollment-f74cf8f270b2ad55) ``` Lock API source: https://docs.rs/fs2/0.4.3/fs2/trait.FileExt.html (nonblocking exclusive locks; descriptor held through async rotation). No benchmark performance numbers claimed. Full fast gate pending F4/F6 completion.
Author
Owner

Finding: the previous browser matrix visited all 14 routes at 1024×768, 768×1024 and 320×640 in both themes (84 visits), then revisited four owned routes at desktop/mobile in both themes (16 visits). The browser runner now keeps the full route matrix only at 1440×900 and 390×844, runs dashboard/sidebar/container checks at the specified responsive widths, and performs owned dashboard-scroll and sticky-host-header checks during the required route visits. The duplicate screenshot writes are removed; container-controls screenshots have distinct names. Device-token protocol edge assertions and the direct cross-filter ETag probe are removed from Playwright; the UI approval/filter flows remain. node --check and git diff --check pass.

Finding: the previous browser matrix visited all 14 routes at 1024×768, 768×1024 and 320×640 in both themes (84 visits), then revisited four owned routes at desktop/mobile in both themes (16 visits). The browser runner now keeps the full route matrix only at 1440×900 and 390×844, runs dashboard/sidebar/container checks at the specified responsive widths, and performs owned dashboard-scroll and sticky-host-header checks during the required route visits. The duplicate screenshot writes are removed; container-controls screenshots have distinct names. Device-token protocol edge assertions and the direct cross-filter ETag probe are removed from Playwright; the UI approval/filter flows remain. `node --check` and `git diff --check` pass.
Author
Owner

Production scripts/verify browser result: release build passed; Playwright failed at the stream socket lifecycle assertion. Exact output:

FAIL browser: Playwright against release server
error: opening exec left multiple live stream WebSockets in one tab (4 before, 5 after)

The browser recorded four old container-log sockets from earlier detail document generations; the new exec attachment raised the live count to five (scripts/browser-check.mjs:3975-3977). This confirms Finding 1 and identifies stream-attachment.svelte.ts as the lifecycle owner.

Partial route gzip metrics before the failure were 112013 bytes for container detail before terminal, 107744 bytes for AI agent tokens, and 108555 bytes for Terminals, each below the 122880-byte budget. The run did not reach the flood metric or remaining route budgets. Full gate log and ranked report: /mnt/hdd/infraternal/jobs/audit-frontend/verify-browser.log and /mnt/hdd/infraternal/jobs/audit-frontend/report.md.

Production `scripts/verify browser` result: release build passed; Playwright failed at the stream socket lifecycle assertion. Exact output: ```text FAIL browser: Playwright against release server error: opening exec left multiple live stream WebSockets in one tab (4 before, 5 after) ``` The browser recorded four old container-log sockets from earlier detail document generations; the new exec attachment raised the live count to five (`scripts/browser-check.mjs:3975-3977`). This confirms Finding 1 and identifies `stream-attachment.svelte.ts` as the lifecycle owner. Partial route gzip metrics before the failure were 112013 bytes for container detail before terminal, 107744 bytes for AI agent tokens, and 108555 bytes for Terminals, each below the 122880-byte budget. The run did not reach the flood metric or remaining route budgets. Full gate log and ranked report: `/mnt/hdd/infraternal/jobs/audit-frontend/verify-browser.log` and `/mnt/hdd/infraternal/jobs/audit-frontend/report.md`.
Author
Owner

Finished read-only frontend audit on calternal-port; base dev was f640461.
Head: b3b125e7fb19f6d66ba82f1244c1c1120df77783.
Report: /mnt/hdd/infraternal/jobs/audit-frontend/report.md.
Findings include a confirmed leaked stream WebSocket lifecycle (4 stale, 5 live after exec), sidebar 401/idempotency retry gaps, uncoalesced polling, and terminal transcript work.
Inventory cadence stays at its contractual 2 seconds. Shadcn-related imports are zero.
Browser gate stopped at the confirmed socket assertion; partial routes and full captured output are in the report and /mnt/hdd/infraternal/jobs/audit-frontend/verify-browser.log.
Fast output (verbatim):

PASS fast: migrations are append-only
PASS fast: workspace package dependencies
PASS fast: JavaScript dependencies
PASS fast: build web app
PASS fast: cargo fmt --check
PASS fast: cargo clippy
PASS fast: cargo test
PASS fast: svelte-check
PASS fast: UI package svelte-check
PASS fast: stream package typecheck
PASS fast: Vitest
PASS fast: UI package Vitest
PASS fast: stream package Vitest
PASS fast: OpenAPI and TypeScript client drift
PASS fast: terminal TypeScript
PASS fast: terminal Vitest

Browser output excerpts (verbatim):

PASS browser: build release binary
METRIC container-detail JS gzip before terminal: 112013 bytes
METRIC ai-agent-tokens route JS gzip: 107744 bytes
METRIC terminals route JS gzip: 108555 bytes
PASS browser log control: Jump to latest
SIDEBAR_PERSISTENCE drag/reload/second-context passed
FAIL browser: Playwright against release server
error: opening exec left multiple live stream WebSockets in one tab (4 before, 5 after)
Finished read-only frontend audit on `calternal-port`; base `dev` was `f640461`. Head: `b3b125e7fb19f6d66ba82f1244c1c1120df77783`. Report: `/mnt/hdd/infraternal/jobs/audit-frontend/report.md`. Findings include a confirmed leaked stream WebSocket lifecycle (4 stale, 5 live after exec), sidebar 401/idempotency retry gaps, uncoalesced polling, and terminal transcript work. Inventory cadence stays at its contractual 2 seconds. Shadcn-related imports are zero. Browser gate stopped at the confirmed socket assertion; partial routes and full captured output are in the report and `/mnt/hdd/infraternal/jobs/audit-frontend/verify-browser.log`. Fast output (verbatim): ```text PASS fast: migrations are append-only PASS fast: workspace package dependencies PASS fast: JavaScript dependencies PASS fast: build web app PASS fast: cargo fmt --check PASS fast: cargo clippy PASS fast: cargo test PASS fast: svelte-check PASS fast: UI package svelte-check PASS fast: stream package typecheck PASS fast: Vitest PASS fast: UI package Vitest PASS fast: stream package Vitest PASS fast: OpenAPI and TypeScript client drift PASS fast: terminal TypeScript PASS fast: terminal Vitest ``` Browser output excerpts (verbatim): ```text PASS browser: build release binary METRIC container-detail JS gzip before terminal: 112013 bytes METRIC ai-agent-tokens route JS gzip: 107744 bytes METRIC terminals route JS gzip: 108555 bytes PASS browser log control: Jump to latest SIDEBAR_PERSISTENCE drag/reload/second-context passed FAIL browser: Playwright against release server error: opening exec left multiple live stream WebSockets in one tab (4 before, 5 after) ```
Author
Owner

Dev browser result (10 detail → workspace → dashboard loops): one shared stream WebSocket remained open after all log channels detached; active log channels were 0 after each back navigation, and only one WebSocket existed across all 10 loops. This refutes four duplicate sockets in this single-tab dev run, but confirms the idle shared socket persists. The browser measured 1.0% of one core for the server over the following 10 seconds. Source: packages/web/src/lib/stream-client.svelte.ts:182-196,281-293 removes registrations but leaves the transport open; crates/server/src/stream.rs:803-812 authorizes every 100 ms (10 SQLite transactions/s/socket). Smallest fix: close the shared transport when its final registration detaches, after preserving reconnect semantics. Browser JS heap after forced GC grew from 5.06 MB baseline to at most 9.25 MB after the loops.

Dev browser result (10 detail → workspace → dashboard loops): one shared stream WebSocket remained open after all log channels detached; active log channels were 0 after each back navigation, and only one WebSocket existed across all 10 loops. This refutes four duplicate sockets in this single-tab dev run, but confirms the idle shared socket persists. The browser measured 1.0% of one core for the server over the following 10 seconds. Source: `packages/web/src/lib/stream-client.svelte.ts:182-196,281-293` removes registrations but leaves the transport open; `crates/server/src/stream.rs:803-812` authorizes every 100 ms (10 SQLite transactions/s/socket). Smallest fix: close the shared transport when its final registration detaches, after preserving reconnect semantics. Browser JS heap after forced GC grew from 5.06 MB baseline to at most 9.25 MB after the loops.
Author
Owner

Container list measurement on the dev release binary: against 172 concurrent containers, GET p50/p99 was 2.58/10.56 ms; allocator-interposed median requested bytes were 915,249 for HTTP 200 and 473,899 for conditional 304. The 304 path still clones inventory before checking ETag (crates/server/src/resources.rs:1661-1685; snapshot deep clone at :279-281). No N+1 inspect: Docker maps summaries and Podman makes a bulk metadata list (crates/engine/src/bollard_adapter.rs:712-755). Successful list requests added zero audit rows. Smallest fix: compare ETag from a stable versioned/Arc inventory snapshot before materializing a response clone. Allocation wrapper counts all process allocations between signal snapshots, including concurrent background work.

Container list measurement on the dev release binary: against 172 concurrent containers, GET p50/p99 was 2.58/10.56 ms; allocator-interposed median requested bytes were 915,249 for HTTP 200 and 473,899 for conditional 304. The 304 path still clones inventory before checking ETag (`crates/server/src/resources.rs:1661-1685`; snapshot deep clone at `:279-281`). No N+1 inspect: Docker maps summaries and Podman makes a bulk metadata list (`crates/engine/src/bollard_adapter.rs:712-755`). Successful list requests added zero audit rows. Smallest fix: compare ETag from a stable versioned/Arc inventory snapshot before materializing a response clone. Allocation wrapper counts all process allocations between signal snapshots, including concurrent background work.
Author
Owner

Decision recorded for gate tiering: scripts/verify merge is the branch merge blocker, targeting under 15 minutes. It composes fast with real Docker PTY, rootless Podman lifecycle, real-sshd session ownership, persistent-session authorization-loss, and production-browser smoke coverage. nightly runs the full integration suite, full browser matrix, e2e, and benchmarks; all aliases nightly. Both documentation sections now describe the blocking tier and the full scheduled tier. Static checks pass: bash -n scripts/verify scripts/lib/js-dependencies.sh, node --check scripts/browser-check.mjs, and git diff --check.

Decision recorded for gate tiering: `scripts/verify merge` is the branch merge blocker, targeting under 15 minutes. It composes `fast` with real Docker PTY, rootless Podman lifecycle, real-sshd session ownership, persistent-session authorization-loss, and production-browser smoke coverage. `nightly` runs the full integration suite, full browser matrix, e2e, and benchmarks; `all` aliases `nightly`. Both documentation sections now describe the blocking tier and the full scheduled tier. Static checks pass: `bash -n scripts/verify scripts/lib/js-dependencies.sh`, `node --check scripts/browser-check.mjs`, and `git diff --check`.
Author
Owner

F4 and F6 implemented in commits 59270c0 and 47010d8. F4: write-boundary caps (256 ceremonies; 1024 capability/8192 total idempotency rows), existing-key replay preserved at capacity, indexed bounded expiry batches, fixed 64 anonymous-rejection cohorts/minute with 24-hour retention. Admission and coalesced-audit benchmarks added; no VM performance numbers claimed. F6: moved SSH fd checks into private-storage, applied to signer/CA/database/sidecars/backups, 0700 directories and 0600 files, regular/owner/single-link checks before reads; backups exclusively reserve empty private files before VACUUM INTO. SQLite still uses its path-based VFS inside the private directory; the same OS user and deployment parent directories remain trusted.

f4-without

failures:

---- storage::prelogin_bounds_tests::anonymous_rejections_coalesce_and_expire_without_target_input stdout ----

thread 'storage::prelogin_bounds_tests::anonymous_rejections_coalesce_and_expire_without_target_input' (195089) panicked at crates/server/src/storage/mod.rs:3482:9:
assertion `left == right` failed
  left: 10
 right: 1
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace

---- storage::prelogin_bounds_tests::prelogin_admission_caps_and_indexed_expiry_converge stdout ----

thread 'storage::prelogin_bounds_tests::prelogin_admission_caps_and_indexed_expiry_converge' (195090) panicked at crates/server/src/storage/mod.rs:3399:9:
assertion failed: matches!(storage.create_ceremony(ceremony()).await,
    Err(StorageError::Capacity))


failures:
    storage::prelogin_bounds_tests::anonymous_rejections_coalesce_and_expire_without_target_input
    storage::prelogin_bounds_tests::prelogin_admission_caps_and_indexed_expiry_converge

test result: FAILED. 0 passed; 2 failed; 0 ignored; 0 measured; 47 filtered out; finished in 0.11s

error: test failed, to rerun pass `-p infraternal-server --lib`

f4-restored

    Blocking waiting for file lock on build directory
    Finished `test` profile [unoptimized] target(s) in 14.92s
     Running unittests src/lib.rs (target/debug/deps/infraternal_server-8e95310b8b99a75d)

running 2 tests
test storage::prelogin_bounds_tests::anonymous_rejections_coalesce_and_expire_without_target_input ... ok
test storage::prelogin_bounds_tests::prelogin_admission_caps_and_indexed_expiry_converge ... ok

test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 47 filtered out; finished in 0.83s

f4-http

   Compiling infraternal-private-storage v0.0.1 (/home/kayg/wt/sec-hardening/crates/private-storage)
   Compiling infraternal-ssh v0.0.1 (/home/kayg/wt/sec-hardening/crates/ssh)
   Compiling infraternal-agent v0.0.1 (/home/kayg/wt/sec-hardening/crates/agent)
   Compiling infraternal-server v0.0.1 (/home/kayg/wt/sec-hardening/crates/server)
    Finished `test` profile [unoptimized] target(s) in 22.93s
     Running tests/auth_http.rs (target/debug/deps/auth_http-26fdb4d7f2fd08ee)

running 1 test
test prelogin_http_capacity_refuses_new_idempotency_before_handler ... ok

test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 14 filtered out; finished in 0.46s

f6-descriptors-final

    Blocking waiting for file lock on build directory
   Compiling infraternal-private-storage v0.0.1 (/home/kayg/wt/sec-hardening/crates/private-storage)
    Finished `test` profile [unoptimized] target(s) in 22.34s
     Running unittests src/lib.rs (target/debug/deps/infraternal_private_storage-9965c7d318d87373)

running 1 test
test tests::descriptors_tighten_modes_and_refuse_links_types_and_wrong_owners ... ok

test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

f6-ca

    Blocking waiting for file lock on build directory
   Compiling infraternal-agent v0.0.1 (/home/kayg/wt/sec-hardening/crates/agent)
   Compiling infraternal-server v0.0.1 (/home/kayg/wt/sec-hardening/crates/server)
    Finished `test` profile [unoptimized] target(s) in 15.99s
     Running unittests src/lib.rs (target/debug/deps/infraternal_server-8e95310b8b99a75d)

running 1 test
test enrollment_ca::tests::ca_reopen_tightens_before_read_and_refuses_substituted_files ... ok

test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 48 filtered out; finished in 0.00s

f6-signer-without

   Compiling infraternal-agent v0.0.1 (/home/kayg/wt/sec-hardening/crates/agent)
    Finished `test` profile [unoptimized] target(s) in 16.75s
     Running unittests src/lib.rs (target/debug/deps/infraternal_agent-25473d2c7f612389)

running 1 test
test private_signer_tests::signer_reopen_tightens_before_read_and_refuses_substituted_files ... FAILED

failures:

---- private_signer_tests::signer_reopen_tightens_before_read_and_refuses_substituted_files stdout ----

thread 'private_signer_tests::signer_reopen_tightens_before_read_and_refuses_substituted_files' (201810) panicked at crates/agent/src/lib.rs:3639:9:
assertion `left == right` failed
  left: 420
 right: 384
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace


failures:
    private_signer_tests::signer_reopen_tightens_before_read_and_refuses_substituted_files

test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 14 filtered out; finished in 0.00s

error: test failed, to rerun pass `-p infraternal-agent --lib`

f6-ca-without

   Compiling infraternal-agent v0.0.1 (/home/kayg/wt/sec-hardening/crates/agent)
   Compiling infraternal-server v0.0.1 (/home/kayg/wt/sec-hardening/crates/server)
    Finished `test` profile [unoptimized] target(s) in 15.22s
     Running unittests src/lib.rs (target/debug/deps/infraternal_server-8e95310b8b99a75d)

running 1 test
test enrollment_ca::tests::ca_reopen_tightens_before_read_and_refuses_substituted_files ... FAILED

failures:

---- enrollment_ca::tests::ca_reopen_tightens_before_read_and_refuses_substituted_files stdout ----

thread 'enrollment_ca::tests::ca_reopen_tightens_before_read_and_refuses_substituted_files' (202108) panicked at crates/server/src/enrollment_ca.rs:286:18:
called `Result::unwrap()` on an `Err` value: UnsafePermissions
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace


failures:
    enrollment_ca::tests::ca_reopen_tightens_before_read_and_refuses_substituted_files

test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 48 filtered out; finished in 0.01s

error: test failed, to rerun pass `-p infraternal-server --lib`

f6-sqlite-without

   Compiling infraternal-server v0.0.1 (/home/kayg/wt/sec-hardening/crates/server)
    Finished `test` profile [unoptimized] target(s) in 9.95s
     Running tests/private_storage.rs (target/debug/deps/private_storage-c385c39fa161b378)

running 1 test
test database_wal_and_backup_are_private_and_reject_substitution ... FAILED

failures:

---- database_wal_and_backup_are_private_and_reject_substitution stdout ----

thread 'database_wal_and_backup_are_private_and_reject_substitution' (202331) panicked at crates/server/tests/private_storage.rs:16:5:
assertion `left == right` failed
  left: 493
 right: 448
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace


failures:
    database_wal_and_backup_are_private_and_reject_substitution

test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.03s

error: test failed, to rerun pass `-p infraternal-server --test private_storage`

f6-umask022

    Blocking waiting for file lock on build directory
   Compiling infraternal-server v0.0.1 (/home/kayg/wt/sec-hardening/crates/server)
   Compiling infraternal-agent v0.0.1 (/home/kayg/wt/sec-hardening/crates/agent)
    Finished `test` profile [unoptimized] target(s) in 1m 28s
     Running tests/private_storage.rs (target/debug/deps/private_storage-c385c39fa161b378)

running 1 test
test database_wal_and_backup_are_private_and_reject_substitution ... ok

test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.06s

HTTP fixture found a resource_exhausted retryability mismatch in the generic auth error helper; the refusal now uses the correct retryable 429 response, tested with no new idempotency/ceremony row. Full fast initially failed Clippy on new scenario-test length and benchmark Result handling; fixed, full gate rerun follows.
Sources: https://www.sqlite.org/lang_vacuum.html (VACUUM INTO may use an empty destination); https://www.sqlite.org/c3ref/open.html (path-based database opening); installed SQLx 0.8.6 connection/establish.rs confirms no NOFOLLOW flag in its configured open flags.

F4 and F6 implemented in commits 59270c0 and 47010d8. F4: write-boundary caps (256 ceremonies; 1024 capability/8192 total idempotency rows), existing-key replay preserved at capacity, indexed bounded expiry batches, fixed 64 anonymous-rejection cohorts/minute with 24-hour retention. Admission and coalesced-audit benchmarks added; no VM performance numbers claimed. F6: moved SSH fd checks into private-storage, applied to signer/CA/database/sidecars/backups, 0700 directories and 0600 files, regular/owner/single-link checks before reads; backups exclusively reserve empty private files before VACUUM INTO. SQLite still uses its path-based VFS inside the private directory; the same OS user and deployment parent directories remain trusted. f4-without ``` failures: ---- storage::prelogin_bounds_tests::anonymous_rejections_coalesce_and_expire_without_target_input stdout ---- thread 'storage::prelogin_bounds_tests::anonymous_rejections_coalesce_and_expire_without_target_input' (195089) panicked at crates/server/src/storage/mod.rs:3482:9: assertion `left == right` failed left: 10 right: 1 note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace ---- storage::prelogin_bounds_tests::prelogin_admission_caps_and_indexed_expiry_converge stdout ---- thread 'storage::prelogin_bounds_tests::prelogin_admission_caps_and_indexed_expiry_converge' (195090) panicked at crates/server/src/storage/mod.rs:3399:9: assertion failed: matches!(storage.create_ceremony(ceremony()).await, Err(StorageError::Capacity)) failures: storage::prelogin_bounds_tests::anonymous_rejections_coalesce_and_expire_without_target_input storage::prelogin_bounds_tests::prelogin_admission_caps_and_indexed_expiry_converge test result: FAILED. 0 passed; 2 failed; 0 ignored; 0 measured; 47 filtered out; finished in 0.11s error: test failed, to rerun pass `-p infraternal-server --lib` ``` f4-restored ``` Blocking waiting for file lock on build directory Finished `test` profile [unoptimized] target(s) in 14.92s Running unittests src/lib.rs (target/debug/deps/infraternal_server-8e95310b8b99a75d) running 2 tests test storage::prelogin_bounds_tests::anonymous_rejections_coalesce_and_expire_without_target_input ... ok test storage::prelogin_bounds_tests::prelogin_admission_caps_and_indexed_expiry_converge ... ok test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 47 filtered out; finished in 0.83s ``` f4-http ``` Compiling infraternal-private-storage v0.0.1 (/home/kayg/wt/sec-hardening/crates/private-storage) Compiling infraternal-ssh v0.0.1 (/home/kayg/wt/sec-hardening/crates/ssh) Compiling infraternal-agent v0.0.1 (/home/kayg/wt/sec-hardening/crates/agent) Compiling infraternal-server v0.0.1 (/home/kayg/wt/sec-hardening/crates/server) Finished `test` profile [unoptimized] target(s) in 22.93s Running tests/auth_http.rs (target/debug/deps/auth_http-26fdb4d7f2fd08ee) running 1 test test prelogin_http_capacity_refuses_new_idempotency_before_handler ... ok test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 14 filtered out; finished in 0.46s ``` f6-descriptors-final ``` Blocking waiting for file lock on build directory Compiling infraternal-private-storage v0.0.1 (/home/kayg/wt/sec-hardening/crates/private-storage) Finished `test` profile [unoptimized] target(s) in 22.34s Running unittests src/lib.rs (target/debug/deps/infraternal_private_storage-9965c7d318d87373) running 1 test test tests::descriptors_tighten_modes_and_refuse_links_types_and_wrong_owners ... ok test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s ``` f6-ca ``` Blocking waiting for file lock on build directory Compiling infraternal-agent v0.0.1 (/home/kayg/wt/sec-hardening/crates/agent) Compiling infraternal-server v0.0.1 (/home/kayg/wt/sec-hardening/crates/server) Finished `test` profile [unoptimized] target(s) in 15.99s Running unittests src/lib.rs (target/debug/deps/infraternal_server-8e95310b8b99a75d) running 1 test test enrollment_ca::tests::ca_reopen_tightens_before_read_and_refuses_substituted_files ... ok test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 48 filtered out; finished in 0.00s ``` f6-signer-without ``` Compiling infraternal-agent v0.0.1 (/home/kayg/wt/sec-hardening/crates/agent) Finished `test` profile [unoptimized] target(s) in 16.75s Running unittests src/lib.rs (target/debug/deps/infraternal_agent-25473d2c7f612389) running 1 test test private_signer_tests::signer_reopen_tightens_before_read_and_refuses_substituted_files ... FAILED failures: ---- private_signer_tests::signer_reopen_tightens_before_read_and_refuses_substituted_files stdout ---- thread 'private_signer_tests::signer_reopen_tightens_before_read_and_refuses_substituted_files' (201810) panicked at crates/agent/src/lib.rs:3639:9: assertion `left == right` failed left: 420 right: 384 note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace failures: private_signer_tests::signer_reopen_tightens_before_read_and_refuses_substituted_files test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 14 filtered out; finished in 0.00s error: test failed, to rerun pass `-p infraternal-agent --lib` ``` f6-ca-without ``` Compiling infraternal-agent v0.0.1 (/home/kayg/wt/sec-hardening/crates/agent) Compiling infraternal-server v0.0.1 (/home/kayg/wt/sec-hardening/crates/server) Finished `test` profile [unoptimized] target(s) in 15.22s Running unittests src/lib.rs (target/debug/deps/infraternal_server-8e95310b8b99a75d) running 1 test test enrollment_ca::tests::ca_reopen_tightens_before_read_and_refuses_substituted_files ... FAILED failures: ---- enrollment_ca::tests::ca_reopen_tightens_before_read_and_refuses_substituted_files stdout ---- thread 'enrollment_ca::tests::ca_reopen_tightens_before_read_and_refuses_substituted_files' (202108) panicked at crates/server/src/enrollment_ca.rs:286:18: called `Result::unwrap()` on an `Err` value: UnsafePermissions note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace failures: enrollment_ca::tests::ca_reopen_tightens_before_read_and_refuses_substituted_files test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 48 filtered out; finished in 0.01s error: test failed, to rerun pass `-p infraternal-server --lib` ``` f6-sqlite-without ``` Compiling infraternal-server v0.0.1 (/home/kayg/wt/sec-hardening/crates/server) Finished `test` profile [unoptimized] target(s) in 9.95s Running tests/private_storage.rs (target/debug/deps/private_storage-c385c39fa161b378) running 1 test test database_wal_and_backup_are_private_and_reject_substitution ... FAILED failures: ---- database_wal_and_backup_are_private_and_reject_substitution stdout ---- thread 'database_wal_and_backup_are_private_and_reject_substitution' (202331) panicked at crates/server/tests/private_storage.rs:16:5: assertion `left == right` failed left: 493 right: 448 note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace failures: database_wal_and_backup_are_private_and_reject_substitution test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.03s error: test failed, to rerun pass `-p infraternal-server --test private_storage` ``` f6-umask022 ``` Blocking waiting for file lock on build directory Compiling infraternal-server v0.0.1 (/home/kayg/wt/sec-hardening/crates/server) Compiling infraternal-agent v0.0.1 (/home/kayg/wt/sec-hardening/crates/agent) Finished `test` profile [unoptimized] target(s) in 1m 28s Running tests/private_storage.rs (target/debug/deps/private_storage-c385c39fa161b378) running 1 test test database_wal_and_backup_are_private_and_reject_substitution ... ok test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.06s ``` HTTP fixture found a resource_exhausted retryability mismatch in the generic auth error helper; the refusal now uses the correct retryable 429 response, tested with no new idempotency/ceremony row. Full fast initially failed Clippy on new scenario-test length and benchmark Result handling; fixed, full gate rerun follows. Sources: https://www.sqlite.org/lang_vacuum.html (VACUUM INTO may use an empty destination); https://www.sqlite.org/c3ref/open.html (path-based database opening); installed SQLx 0.8.6 connection/establish.rs confirms no NOFOLLOW flag in its configured open flags.
Author
Owner

Audit operation note: the first successful port screenshot-only diagnostic received a misspelled artifact-directory variable and used the existing /mnt/hdd/infraternal/artifacts/port-ab/ default. It updated 24 requested shell/dashboard/container/menu/settings/inbox screenshots, eight setup/sign-in screenshots, four multi-tab screenshots, and inbox-scroll-smoke.json (mtime 2026-10-02 15:53–15:54 UTC). I copied the 24 requested current images to /mnt/hdd/infraternal/artifacts/audit-calternal/port/. I did not substitute older port-c3/port-preview images because they are not byte-identical originals. The report records this unintended read-only-rule violation and its exact scope. No tracked files changed.

Audit operation note: the first successful port screenshot-only diagnostic received a misspelled artifact-directory variable and used the existing `/mnt/hdd/infraternal/artifacts/port-ab/` default. It updated 24 requested shell/dashboard/container/menu/settings/inbox screenshots, eight setup/sign-in screenshots, four multi-tab screenshots, and `inbox-scroll-smoke.json` (mtime 2026-10-02 15:53–15:54 UTC). I copied the 24 requested current images to `/mnt/hdd/infraternal/artifacts/audit-calternal/port/`. I did not substitute older port-c3/port-preview images because they are not byte-identical originals. The report records this unintended read-only-rule violation and its exact scope. No tracked files changed.
Author
Owner

Measurement finding for #48: scripts/verify fast passed all 16 stages in 313.072s (5:13.072). scripts/verify merge passed all 26 stages in 648.589s (10:48.589), under the 15-minute target. The cold release build took 412.640s; the real production-browser smoke took 19.930s and reported successful multi-tab checks plus SIDEBAR_CONTAINERS repetition=1/1 GET /api/v1/containers status=200. I am checking capacity before the optional one-time integration comparison. Full stage output will be recorded at finish.

Measurement finding for #48: `scripts/verify fast` passed all 16 stages in 313.072s (5:13.072). `scripts/verify merge` passed all 26 stages in 648.589s (10:48.589), under the 15-minute target. The cold release build took 412.640s; the real production-browser smoke took 19.930s and reported successful multi-tab checks plus `SIDEBAR_CONTAINERS repetition=1/1 GET /api/v1/containers status=200`. I am checking capacity before the optional one-time integration comparison. Full stage output will be recorded at finish.
Author
Owner

Final quota correction: the new F4 idempotency quota applies only to capability-scoped pre-login rows (1024), with 256 outstanding ceremonies. Removed the new global table quota through appended migration 0018; authenticated resource handlers on the forbidden provider-refactor files map storage failures to internal, so a global cap would alter their retry contract incorrectly. No resource/stream/engine/remote source edit. Indexed expiry sweeps still clean all expired idempotency rows. The previous comment mentioning 8192 total rows is superseded. Capacity HTTP regression passes with a retryable 429 and no new claim/ceremony row.

Private signing-key and CA creation now reuse the shared private-file creator as well as reopening checks. The real infraternal-agent process enrollment fixture was updated to supply required join/revoke keys; its targeted test passes. CA test-only import corrected; full workspace Clippy passes. Final full fast running on 644c91a.

F4 expiry-only revert evidence:

   Compiling infraternal-server v0.0.1 (/home/kayg/wt/sec-hardening/crates/server)
    Finished `test` profile [unoptimized] target(s) in 17.52s
     Running unittests src/lib.rs (target/debug/deps/infraternal_server-8e95310b8b99a75d)

running 1 test
test storage::prelogin_bounds_tests::prelogin_admission_caps_and_indexed_expiry_converge ... FAILED

failures:

---- storage::prelogin_bounds_tests::prelogin_admission_caps_and_indexed_expiry_converge stdout ----

thread 'storage::prelogin_bounds_tests::prelogin_admission_caps_and_indexed_expiry_converge' (247514) panicked at crates/server/src/storage/mod.rs:3407:51:
called `Result::unwrap()` on an `Err` value: Capacity
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace


failures:
    storage::prelogin_bounds_tests::prelogin_admission_caps_and_indexed_expiry_converge

test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 48 filtered out; finished in 0.16s

error: test failed, to rerun pass `-p infraternal-server --lib`

Real enrollment test:

                   ^^
  |
  = note: `#[warn(unused_imports)]` (part of `#[warn(unused)]`) on by default

warning: `infraternal-server` (lib) generated 1 warning (run `cargo fix --lib -p infraternal-server` to apply 1 suggestion)
   Compiling infraternal v0.0.1 (/home/kayg/wt/sec-hardening/crates/infraternal)
    Finished `test` profile [unoptimized] target(s) in 27.38s
     Running tests/agent_tunnel.rs (target/debug/deps/agent_tunnel-0c9e3a0ebc49d8c9)

running 1 test
test real_infraternal_agent_process_enrolls_and_reconnects_with_new_nonce ... ok

test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 1.47s


Final quota correction: the new F4 idempotency quota applies only to capability-scoped pre-login rows (1024), with 256 outstanding ceremonies. Removed the new global table quota through appended migration 0018; authenticated resource handlers on the forbidden provider-refactor files map storage failures to internal, so a global cap would alter their retry contract incorrectly. No resource/stream/engine/remote source edit. Indexed expiry sweeps still clean all expired idempotency rows. The previous comment mentioning 8192 total rows is superseded. Capacity HTTP regression passes with a retryable 429 and no new claim/ceremony row. Private signing-key and CA creation now reuse the shared private-file creator as well as reopening checks. The real infraternal-agent process enrollment fixture was updated to supply required join/revoke keys; its targeted test passes. CA test-only import corrected; full workspace Clippy passes. Final full fast running on 644c91a. F4 expiry-only revert evidence: ``` Compiling infraternal-server v0.0.1 (/home/kayg/wt/sec-hardening/crates/server) Finished `test` profile [unoptimized] target(s) in 17.52s Running unittests src/lib.rs (target/debug/deps/infraternal_server-8e95310b8b99a75d) running 1 test test storage::prelogin_bounds_tests::prelogin_admission_caps_and_indexed_expiry_converge ... FAILED failures: ---- storage::prelogin_bounds_tests::prelogin_admission_caps_and_indexed_expiry_converge stdout ---- thread 'storage::prelogin_bounds_tests::prelogin_admission_caps_and_indexed_expiry_converge' (247514) panicked at crates/server/src/storage/mod.rs:3407:51: called `Result::unwrap()` on an `Err` value: Capacity note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace failures: storage::prelogin_bounds_tests::prelogin_admission_caps_and_indexed_expiry_converge test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 48 filtered out; finished in 0.16s error: test failed, to rerun pass `-p infraternal-server --lib` ``` Real enrollment test: ``` ^^ | = note: `#[warn(unused_imports)]` (part of `#[warn(unused)]`) on by default warning: `infraternal-server` (lib) generated 1 warning (run `cargo fix --lib -p infraternal-server` to apply 1 suggestion) Compiling infraternal v0.0.1 (/home/kayg/wt/sec-hardening/crates/infraternal) Finished `test` profile [unoptimized] target(s) in 27.38s Running tests/agent_tunnel.rs (target/debug/deps/agent_tunnel-0c9e3a0ebc49d8c9) running 1 test test real_infraternal_agent_process_enrolls_and_reconnects_with_new_nonce ... ok test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 1.47s ```
Author
Owner

Finished sec-hardening on branch sec-hardening, base f640461228c8bdeba95646e4909accba829c00df, head 286d221b8b0932654d9bfcde76a1ab542fb53f81. Worktree clean; committed locally only, no push.

Implemented F1, F3, F4, F6, F7 and F8. Each finding's targeted regression and temporarily-reverted failing proof are recorded in earlier comments. Final F4 limits are 256 outstanding ceremonies and 1024 capability-scoped pre-login idempotency rows; the earlier total-row quota was superseded as documented. Anonymous rejected audit writes are bounded/coalesced, expiry cleanup uses indexed bounded batches. CLI/MCP refresh has a cross-process lock covering reload/rotation/save and saved MCP access reuse. Shared descriptor validation covers signing keys, enrollment CA, SQLite directory/sidecars and backups. Audit paths are route templates, personal targets are parsed IDs, enrollment administration is idempotent with secret-free join replay, and AI identity revocation returns plan_required.

Contracts, architecture, generated OpenAPI and TypeScript schema updated. Forbidden resource/stream/engine/remote files remain unchanged. F2/F5 deferral is recorded on #49. New hot-path benchmark cases are included; no perf VM measurements or performance claims were made. Independent review remains for the orchestrator.

Final scripts/verify fast exit 0 on the head above (Cargo stdout also retained to diagnose truncated failure excerpts):

PASS fast: migrations are append-only
PASS fast: workspace package dependencies
PASS fast: JavaScript dependencies
PASS fast: build web app
PASS fast: cargo fmt --check
PASS fast: cargo clippy
PASS fast: cargo test
PASS fast: svelte-check
PASS fast: UI package svelte-check
PASS fast: stream package typecheck
PASS fast: Vitest
PASS fast: UI package Vitest
PASS fast: stream package Vitest
PASS fast: OpenAPI and TypeScript client drift
PASS fast: terminal TypeScript
PASS fast: terminal Vitest

Targeted historical migration upgrade gate after updating the expected migration list through 18:

   Compiling infraternal-server v0.0.1 (/home/kayg/wt/sec-hardening/crates/server)
    Finished `test` profile [unoptimized] target(s) in 13.65s
     Running tests/migrations.rs (target/debug/deps/migrations-b79f83b859611aaf)

running 5 tests
test rejects_dev_1830177_version_eight_without_modifying_it ... ok
test migration_eleven_and_later_added_ten_apply_in_either_order ... ok
test upgrades_bba250f_database_without_losing_identity_rows ... ok
test upgrades_dev_7bda001_database_with_session_history ... ok
test upgrades_dev_a5fec35_database_with_stream_audit_details ... ok

test result: ok. 5 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.16s

Verification history: an earlier fast run exposed the stale migration-version fixture, now corrected. A later fast workspace-test step failed with its actual assertion outside the gate's 240-line excerpt; a full-output workspace rerun and the final captured fast run both passed on unchanged source. The unlocalized intermittent failure is recorded here rather than claimed fixed.

Integration skipped under the requested eligibility rule. Final eligibility check at 16:19:36 Europe/Berlin:

load average: 14.39, 11.79, 8.52
306978 bash scripts/verify integration

The concurrent integration process belongs to another job and was left untouched. No browser/bench gate requested or run. Private SQLite storage continues to trust the same OS user and deployment parent directories, as documented, because SQLx uses a path-based SQLite VFS.

Finished sec-hardening on branch `sec-hardening`, base `f640461228c8bdeba95646e4909accba829c00df`, head `286d221b8b0932654d9bfcde76a1ab542fb53f81`. Worktree clean; committed locally only, no push. Implemented F1, F3, F4, F6, F7 and F8. Each finding's targeted regression and temporarily-reverted failing proof are recorded in earlier comments. Final F4 limits are 256 outstanding ceremonies and 1024 capability-scoped pre-login idempotency rows; the earlier total-row quota was superseded as documented. Anonymous rejected audit writes are bounded/coalesced, expiry cleanup uses indexed bounded batches. CLI/MCP refresh has a cross-process lock covering reload/rotation/save and saved MCP access reuse. Shared descriptor validation covers signing keys, enrollment CA, SQLite directory/sidecars and backups. Audit paths are route templates, personal targets are parsed IDs, enrollment administration is idempotent with secret-free join replay, and AI identity revocation returns plan_required. Contracts, architecture, generated OpenAPI and TypeScript schema updated. Forbidden resource/stream/engine/remote files remain unchanged. F2/F5 deferral is recorded on #49. New hot-path benchmark cases are included; no perf VM measurements or performance claims were made. Independent review remains for the orchestrator. Final `scripts/verify fast` exit 0 on the head above (Cargo stdout also retained to diagnose truncated failure excerpts): ``` PASS fast: migrations are append-only PASS fast: workspace package dependencies PASS fast: JavaScript dependencies PASS fast: build web app PASS fast: cargo fmt --check PASS fast: cargo clippy PASS fast: cargo test PASS fast: svelte-check PASS fast: UI package svelte-check PASS fast: stream package typecheck PASS fast: Vitest PASS fast: UI package Vitest PASS fast: stream package Vitest PASS fast: OpenAPI and TypeScript client drift PASS fast: terminal TypeScript PASS fast: terminal Vitest ``` Targeted historical migration upgrade gate after updating the expected migration list through 18: ``` Compiling infraternal-server v0.0.1 (/home/kayg/wt/sec-hardening/crates/server) Finished `test` profile [unoptimized] target(s) in 13.65s Running tests/migrations.rs (target/debug/deps/migrations-b79f83b859611aaf) running 5 tests test rejects_dev_1830177_version_eight_without_modifying_it ... ok test migration_eleven_and_later_added_ten_apply_in_either_order ... ok test upgrades_bba250f_database_without_losing_identity_rows ... ok test upgrades_dev_7bda001_database_with_session_history ... ok test upgrades_dev_a5fec35_database_with_stream_audit_details ... ok test result: ok. 5 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.16s ``` Verification history: an earlier fast run exposed the stale migration-version fixture, now corrected. A later fast workspace-test step failed with its actual assertion outside the gate's 240-line excerpt; a full-output workspace rerun and the final captured fast run both passed on unchanged source. The unlocalized intermittent failure is recorded here rather than claimed fixed. Integration skipped under the requested eligibility rule. Final eligibility check at 16:19:36 Europe/Berlin: ``` load average: 14.39, 11.79, 8.52 306978 bash scripts/verify integration ``` The concurrent integration process belongs to another job and was left untouched. No browser/bench gate requested or run. Private SQLite storage continues to trust the same OS user and deployment parent directories, as documented, because SQLx uses a path-based SQLite VFS.
Author
Owner

Independent review-sec started. Reviewed branch sec-hardening at 286d221b8b against base f640461228. Scope: audit F1/F3/F4/F6/F7/F8, migration history, targeted tests and two defensive regression controls in /home/kayg/wt/review-sec-tmp. Source worktree stays read-only; no nested jobs or push. Initial load5=9.16, so integration not eligible yet.

Independent review-sec started. Reviewed branch sec-hardening at 286d221b8b0932654d9bfcde76a1ab542fb53f81 against base f640461228c8bdeba95646e4909accba829c00df. Scope: audit F1/F3/F4/F6/F7/F8, migration history, targeted tests and two defensive regression controls in /home/kayg/wt/review-sec-tmp. Source worktree stays read-only; no nested jobs or push. Initial load5=9.16, so integration not eligible yet.
Author
Owner

gates-tiering result

Head: 4952934b4f235a8a98f50689842d017d615ff59f (gates-tiering; not pushed).

Signal Before (velocity audit) After this job
fast 3:51.38 5:13.072, all 16 stages passed. This run overlapped other fast gates, so it is not a clean A/B.
Full integration about 40 minutes The one comparison run passed 12 stages, then failed in the compiled CLI/MCP stage; see evidence below.
Full browser about 40 minutes Full matrix not run. The required production-browser smoke passed in 19.930s.
Composite setup all built the web app 4 times and release binary twice merge passed in 10:48.589 across 26 stages (under 15 minutes). Composite preparation now reuses one JavaScript dependency check/install, one web build and one release binary.

The integration comparison stopped at cli_and_mcp_use_the_public_http_contract: “SSH remote exit after piped stdin EOF did not finish within five seconds.” The stage took 34.544s; no retry was made because the requested comparison was once only. Later SSH/tunnel integration stages did not run.

Verbatim scripts/verify fast output:

PASS fast: migrations are append-only (0.098s)
PASS fast: workspace package dependencies (0.197s)
PASS fast: JavaScript dependencies (0.004s)
PASS fast: build web app (9.352s)
PASS fast: cargo fmt --check (0.765s)
PASS fast: cargo clippy (116.499s)
PASS fast: cargo test (110.279s)
PASS fast: svelte-check (11.861s)
PASS fast: UI package svelte-check (8.342s)
PASS fast: stream package typecheck (5.449s)
PASS fast: Vitest (5.204s)
PASS fast: UI package Vitest (9.510s)
PASS fast: stream package Vitest (0.915s)
PASS fast: OpenAPI and TypeScript client drift (31.550s)
PASS fast: terminal TypeScript (1.945s)
PASS fast: terminal Vitest (1.102s)

Verbatim scripts/verify merge output:

PASS fast: migrations are append-only (0.114s)
PASS fast: workspace package dependencies (0.184s)
PASS fast: JavaScript dependencies (0.014s)
PASS fast: build web app (9.726s)
PASS fast: cargo fmt --check (0.882s)
PASS fast: cargo clippy (8.734s)
PASS fast: cargo test (56.361s)
PASS fast: svelte-check (9.311s)
PASS fast: UI package svelte-check (4.524s)
PASS fast: stream package typecheck (3.562s)
PASS fast: Vitest (2.725s)
PASS fast: UI package Vitest (7.340s)
PASS fast: stream package Vitest (0.741s)
PASS fast: OpenAPI and TypeScript client drift (13.668s)
PASS fast: terminal TypeScript (1.737s)
PASS fast: terminal Vitest (0.954s)
PASS merge: build release binary (412.640s)
PASS merge: release server HTTP and static behavior (0.512s)
PASS merge: Docker socket _ping (0.011s)
PASS merge: rootless Podman socket _ping (0.013s)
PASS merge: Docker exec PTY smoke (21.180s)
PASS merge: rootless Podman inventory and lifecycle smoke (2.805s)
PASS merge: real sshd session ownership smoke (34.370s)
PASS merge: persistent-session authorization-loss security smoke (32.571s)
PASS merge: install Chromium and system dependencies (3.980s)
PASS multi-tab supported: simultaneous tabs (1 refresh HTTP request)
PASS multi-tab sign-out: pending refresh response cannot restore tab B
PASS multi-tab locks-only: one notice per tab and sequential stale-access recovery
PASS multi-tab neither: one notice per tab and sequential stale-access recovery
SIDEBAR_CONTAINERS repetition=1/1 GET /api/v1/containers status=200
PASS merge: production browser smoke (19.930s)

Successful gate summary totals: fast 313.072s; merge 648.589s. target/verify-summary.txt contains the merge stage table. The working tree is clean. No issue was closed.

## gates-tiering result Head: `4952934b4f235a8a98f50689842d017d615ff59f` (`gates-tiering`; not pushed). | Signal | Before (velocity audit) | After this job | |---|---:|---:| | `fast` | 3:51.38 | 5:13.072, all 16 stages passed. This run overlapped other `fast` gates, so it is not a clean A/B. | | Full integration | about 40 minutes | The one comparison run passed 12 stages, then failed in the compiled CLI/MCP stage; see evidence below. | | Full browser | about 40 minutes | Full matrix not run. The required production-browser smoke passed in 19.930s. | | Composite setup | `all` built the web app 4 times and release binary twice | `merge` passed in 10:48.589 across 26 stages (under 15 minutes). Composite preparation now reuses one JavaScript dependency check/install, one web build and one release binary. | The integration comparison stopped at `cli_and_mcp_use_the_public_http_contract`: “SSH remote exit after piped stdin EOF did not finish within five seconds.” The stage took 34.544s; no retry was made because the requested comparison was once only. Later SSH/tunnel integration stages did not run. Verbatim `scripts/verify fast` output: ```text PASS fast: migrations are append-only (0.098s) PASS fast: workspace package dependencies (0.197s) PASS fast: JavaScript dependencies (0.004s) PASS fast: build web app (9.352s) PASS fast: cargo fmt --check (0.765s) PASS fast: cargo clippy (116.499s) PASS fast: cargo test (110.279s) PASS fast: svelte-check (11.861s) PASS fast: UI package svelte-check (8.342s) PASS fast: stream package typecheck (5.449s) PASS fast: Vitest (5.204s) PASS fast: UI package Vitest (9.510s) PASS fast: stream package Vitest (0.915s) PASS fast: OpenAPI and TypeScript client drift (31.550s) PASS fast: terminal TypeScript (1.945s) PASS fast: terminal Vitest (1.102s) ``` Verbatim `scripts/verify merge` output: ```text PASS fast: migrations are append-only (0.114s) PASS fast: workspace package dependencies (0.184s) PASS fast: JavaScript dependencies (0.014s) PASS fast: build web app (9.726s) PASS fast: cargo fmt --check (0.882s) PASS fast: cargo clippy (8.734s) PASS fast: cargo test (56.361s) PASS fast: svelte-check (9.311s) PASS fast: UI package svelte-check (4.524s) PASS fast: stream package typecheck (3.562s) PASS fast: Vitest (2.725s) PASS fast: UI package Vitest (7.340s) PASS fast: stream package Vitest (0.741s) PASS fast: OpenAPI and TypeScript client drift (13.668s) PASS fast: terminal TypeScript (1.737s) PASS fast: terminal Vitest (0.954s) PASS merge: build release binary (412.640s) PASS merge: release server HTTP and static behavior (0.512s) PASS merge: Docker socket _ping (0.011s) PASS merge: rootless Podman socket _ping (0.013s) PASS merge: Docker exec PTY smoke (21.180s) PASS merge: rootless Podman inventory and lifecycle smoke (2.805s) PASS merge: real sshd session ownership smoke (34.370s) PASS merge: persistent-session authorization-loss security smoke (32.571s) PASS merge: install Chromium and system dependencies (3.980s) PASS multi-tab supported: simultaneous tabs (1 refresh HTTP request) PASS multi-tab sign-out: pending refresh response cannot restore tab B PASS multi-tab locks-only: one notice per tab and sequential stale-access recovery PASS multi-tab neither: one notice per tab and sequential stale-access recovery SIDEBAR_CONTAINERS repetition=1/1 GET /api/v1/containers status=200 PASS merge: production browser smoke (19.930s) ``` Successful gate summary totals: `fast` 313.072s; `merge` 648.589s. `target/verify-summary.txt` contains the merge stage table. The working tree is clean. No issue was closed.
Author
Owner

Independent review findings at 286d221 (static evidence; targeted fixture checks pending):

  • F4 owner availability remains unprotected: 0018_prelogin_idempotency_scope.sql:5-7 enforces one shared 1,024-row capability pool, including valid owner refresh/login operations (auth.rs:255-275). The 256-ceremony pool is likewise shared (0017:2-4). No owner reserve or separate authenticated-capability allowance exists. Existing boundary tests establish refusal at capacity, not owner availability.
  • F4 security evidence is suppressed: storage/mod.rs:3285-3297 maps every actor-less rejected event to 64 action/error hash cohorts, ignoring validated targets and retaining no suppressed count. tunnel.rs:489-498 records certificate-backed rotation refusal with actor=None and a validated infraternal identity target; distinct identity events with the same action/code cannot both survive in one minute. This exceeds generic anonymous-noise coalescing.
  • Migration history is append-only: only 0017/0018 added above base max 0016; current local dev also remains max 0016.

Integration currently ineligible: another job has scripts/verify integration and cargo build --release running. No unrelated process has been signaled or its files read.

Independent review findings at 286d221 (static evidence; targeted fixture checks pending): - F4 owner availability remains unprotected: 0018_prelogin_idempotency_scope.sql:5-7 enforces one shared 1,024-row capability pool, including valid owner refresh/login operations (auth.rs:255-275). The 256-ceremony pool is likewise shared (0017:2-4). No owner reserve or separate authenticated-capability allowance exists. Existing boundary tests establish refusal at capacity, not owner availability. - F4 security evidence is suppressed: storage/mod.rs:3285-3297 maps every actor-less rejected event to 64 action/error hash cohorts, ignoring validated targets and retaining no suppressed count. tunnel.rs:489-498 records certificate-backed rotation refusal with actor=None and a validated infraternal identity target; distinct identity events with the same action/code cannot both survive in one minute. This exceeds generic anonymous-noise coalescing. - Migration history is append-only: only 0017/0018 added above base max 0016; current local dev also remains max 0016. Integration currently ineligible: another job has scripts/verify integration and cargo build --release running. No unrelated process has been signaled or its files read.
Author
Owner

F4 independent defensive fixtures confirmed at 286d221 in the throwaway tree:

  • valid owner refresh at the capability admission boundary returns 429, expected 200. The fixture reduces the otherwise identical quota predicate to one row; the shipped 1024-row boundary is independently covered by prelogin_http_capacity_refuses_new_idempotency_before_handler (passes).
  • two audit rejections for distinct validated infraternal identity targets retain 1 row, expected 2.
  • every documented public router path retains a template/fixed device action and no benign canary in audit columns.

Existing targeted suites all pass: server-lib, enrollment, auth-http, personal-http, private-sqlite, private-files, private-signer, refresh-processes, migrations. Initial fast failed at cargo test (runner truncates cause); an immediate full workspace diagnostic rerun passed. Fast gate retry is in progress.

F4 independent defensive fixtures confirmed at 286d221 in the throwaway tree: - valid owner refresh at the capability admission boundary returns 429, expected 200. The fixture reduces the otherwise identical quota predicate to one row; the shipped 1024-row boundary is independently covered by prelogin_http_capacity_refuses_new_idempotency_before_handler (passes). - two audit rejections for distinct validated infraternal identity targets retain 1 row, expected 2. - every documented public router path retains a template/fixed device action and no benign canary in audit columns. Existing targeted suites all pass: server-lib, enrollment, auth-http, personal-http, private-sqlite, private-files, private-signer, refresh-processes, migrations. Initial fast failed at cargo test (runner truncates cause); an immediate full workspace diagnostic rerun passed. Fast gate retry is in progress.
Author
Owner

Independent review-sec finished. Request changes for sec-hardening head 286d221b8b0932654d9bfcde76a1ab542fb53f81, base f640461228c8bdeba95646e4909accba829c00df.

  1. F4 / high: one shared capability quota also blocks valid owner refresh/login/ceremony completion. Admission precedes capability validation; there is no protected owner path. A real owner-refresh fixture at the quota boundary returned 429 instead of 200. Migration 0018:5 and auth.rs:167,255–275.
  2. F4 / medium: actor-less audit cohorts silently discard distinct security events. Certificate identity events use actor=None; storage/mod.rs:3284 ignores their validated targets. Two distinct identity rejections retained 1 record instead of 2. tunnel.rs:489–498.

F1 refusal, F3 process coordination, F7 route-template/typed-ID redaction and F8 secret-free enrollment replay checks pass. F6 passes descriptor/type/owner/mode and real SQLite/WAL/SHM/backup fixtures within its explicitly documented trusted-service-UID/trusted-deployment-parent boundary; SQLite still reopens paths through its VFS. Existing 0644 fixture modes tighten without replacing signer/CA identity. Live o2 was untouched, so no live-deployment certification is claimed. Windows fallback is unavailable (Unix-only helpers were already present at base); macOS flock semantics were researched, not hardware-tested.

All 16 base migrations are byte-identical; 0017 and 0018 uniquely append above 0016 (also current local dev maximum). Five migration tests pass. All 36 documented public route templates passed the independent canary check.

Targeted suites passed: server library 48, enrollment 4, auth HTTP 15, personal HTTP 5, SQLite private storage 1, shared private-file helper 1, signer reopen 1, independent CLI/MCP processes 1, migrations 5. Lock crash-exit/unsafe-file/timeout edge tests: 3 passed.

Two shipped regression tests proved sensitive in the throwaway tree: signer test failed with mode0644 when only its base load/create function was restored; redaction test failed with the benign path canary when only its generic template fix was removed. Both exited101 on assertions, and passed again after the fixes were restored.

Initial fast gate exited1 at cargo test; its 240-line failure display omitted the cause. Unmodified full workspace diagnostic exited0; unmodified fast retry exited0. Exact successful gate output:

PASS fast: migrations are append-only
PASS fast: workspace package dependencies
PASS fast: JavaScript dependencies
PASS fast: build web app
PASS fast: cargo fmt --check
PASS fast: cargo clippy
PASS fast: cargo test
PASS fast: svelte-check
PASS fast: UI package svelte-check
PASS fast: stream package typecheck
PASS fast: Vitest
PASS fast: UI package Vitest
PASS fast: stream package Vitest
PASS fast: OpenAPI and TypeScript client drift
PASS fast: terminal TypeScript
PASS fast: terminal Vitest

Initial gate status output (verbatim; full truncated test display retained in fast.log):

WARN load5=8.07 exceeds online CPU count=8; timing-sensitive checks may be delayed
PASS fast: migrations are append-only
PASS fast: workspace package dependencies
PASS fast: JavaScript dependencies
PASS fast: build web app
PASS fast: cargo fmt --check
PASS fast: cargo clippy
FAIL fast: cargo test

Integration skipped because another heavy scripts/verify integration gate remained active (final load5=7.72). No browser/bench/release gate run. Throwaway worktree restored and removed; source worktree clean and unchanged. No commits, pushes, nested jobs, production changes or unrelated process signals.

Full findings and logs: /mnt/hdd/infraternal/jobs/review-sec/findings.md. Reviewer fixture sources and outputs remain in that job directory.

Independent review-sec finished. **Request changes** for `sec-hardening` head `286d221b8b0932654d9bfcde76a1ab542fb53f81`, base `f640461228c8bdeba95646e4909accba829c00df`. 1. **F4 / high:** one shared capability quota also blocks valid owner refresh/login/ceremony completion. Admission precedes capability validation; there is no protected owner path. A real owner-refresh fixture at the quota boundary returned **429 instead of 200**. Migration 0018:5 and auth.rs:167,255–275. 2. **F4 / medium:** actor-less audit cohorts silently discard distinct security events. Certificate identity events use actor=None; storage/mod.rs:3284 ignores their validated targets. Two distinct identity rejections retained **1 record instead of 2**. tunnel.rs:489–498. F1 refusal, F3 process coordination, F7 route-template/typed-ID redaction and F8 secret-free enrollment replay checks pass. F6 passes descriptor/type/owner/mode and real SQLite/WAL/SHM/backup fixtures within its explicitly documented trusted-service-UID/trusted-deployment-parent boundary; SQLite still reopens paths through its VFS. Existing 0644 fixture modes tighten without replacing signer/CA identity. Live o2 was untouched, so no live-deployment certification is claimed. Windows fallback is unavailable (Unix-only helpers were already present at base); macOS flock semantics were researched, not hardware-tested. All 16 base migrations are byte-identical; 0017 and 0018 uniquely append above 0016 (also current local dev maximum). Five migration tests pass. All 36 documented public route templates passed the independent canary check. Targeted suites passed: server library 48, enrollment 4, auth HTTP 15, personal HTTP 5, SQLite private storage 1, shared private-file helper 1, signer reopen 1, independent CLI/MCP processes 1, migrations 5. Lock crash-exit/unsafe-file/timeout edge tests: 3 passed. Two shipped regression tests proved sensitive in the throwaway tree: signer test failed with mode0644 when only its base load/create function was restored; redaction test failed with the benign path canary when only its generic template fix was removed. Both exited101 on assertions, and passed again after the fixes were restored. Initial fast gate exited1 at cargo test; its 240-line failure display omitted the cause. Unmodified full workspace diagnostic exited0; unmodified fast retry exited0. Exact successful gate output: ``` PASS fast: migrations are append-only PASS fast: workspace package dependencies PASS fast: JavaScript dependencies PASS fast: build web app PASS fast: cargo fmt --check PASS fast: cargo clippy PASS fast: cargo test PASS fast: svelte-check PASS fast: UI package svelte-check PASS fast: stream package typecheck PASS fast: Vitest PASS fast: UI package Vitest PASS fast: stream package Vitest PASS fast: OpenAPI and TypeScript client drift PASS fast: terminal TypeScript PASS fast: terminal Vitest ``` Initial gate status output (verbatim; full truncated test display retained in fast.log): ``` WARN load5=8.07 exceeds online CPU count=8; timing-sensitive checks may be delayed PASS fast: migrations are append-only PASS fast: workspace package dependencies PASS fast: JavaScript dependencies PASS fast: build web app PASS fast: cargo fmt --check PASS fast: cargo clippy FAIL fast: cargo test ``` Integration skipped because another heavy scripts/verify integration gate remained active (final load5=7.72). No browser/bench/release gate run. Throwaway worktree restored and removed; source worktree clean and unchanged. No commits, pushes, nested jobs, production changes or unrelated process signals. Full findings and logs: `/mnt/hdd/infraternal/jobs/review-sec/findings.md`. Reviewer fixture sources and outputs remain in that job directory.
Author
Owner

Starting fix-sec on sec-hardening at base 286d221b8b. Merged origin/dev 4952934 cleanly. Scope: R1 owner admission under anonymous quota and R2 attributable rejection retention plus collision-free counted noise aggregation. Required gates: fast and merge; negative controls for both regressions. No push.

Starting fix-sec on sec-hardening at base 286d221b8b0932654d9bfcde76a1ab542fb53f81. Merged origin/dev 4952934 cleanly. Scope: R1 owner admission under anonymous quota and R2 attributable rejection retention plus collision-free counted noise aggregation. Required gates: fast and merge; negative controls for both regressions. No push.
Author
Owner

R1/R2 regression controls on the merged base failed on behavioral assertions (not compilation):

  • real_owner_refresh_has_capacity_at_anonymous_quota: 429 versus expected 200.
  • full_owner_passkey_login_has_capacity_at_anonymous_quota: 429 versus expected 200.
  • distinct_identity_rejections_keep_both_targets: 1 retained row versus expected 2.

After fixes, refresh + revoke and full SoftPasskey login succeed with the shipped 1,024 anonymous idempotency rows and 256 anonymous ceremonies filled. Five storage tests pass, covering separate owner quotas/recovery, exact counted noise classes (65 classes, three occurrences each), both identity targets and expiry. Scope bytes remain unchanged for replay compatibility. Owner login-start pools are isolated per registered username; knowing that username can target its bounded slots, with five-minute expiry/recovery. Refresh and issued ceremonies have separate possession-verified scopes. This limitation and fairness are explicit in docs/contracts.md.

New append-only migrations 0019/0020; committed migrations unchanged. Exact class counter UPSERT/partial-index behavior researched against https://www.sqlite.org/lang_upsert.html and https://www.sqlite.org/partialindex.html. No modulo hash bucket remains for newly aggregated noise; old evidence cannot be recovered and legacy rows expire. Targeted output logs: /tmp/fix-sec-negative-r1.log, /tmp/fix-sec-negative-login.log, /tmp/fix-sec-negative-r2.log, /tmp/fix-sec-positive-r1.log, /tmp/fix-sec-storage.log. Added a real-router owner-refresh replay benchmark; no performance claim from this shared VM.

R1/R2 regression controls on the merged base failed on behavioral assertions (not compilation): - real_owner_refresh_has_capacity_at_anonymous_quota: 429 versus expected 200. - full_owner_passkey_login_has_capacity_at_anonymous_quota: 429 versus expected 200. - distinct_identity_rejections_keep_both_targets: 1 retained row versus expected 2. After fixes, refresh + revoke and full SoftPasskey login succeed with the shipped 1,024 anonymous idempotency rows and 256 anonymous ceremonies filled. Five storage tests pass, covering separate owner quotas/recovery, exact counted noise classes (65 classes, three occurrences each), both identity targets and expiry. Scope bytes remain unchanged for replay compatibility. Owner login-start pools are isolated per registered username; knowing that username can target its bounded slots, with five-minute expiry/recovery. Refresh and issued ceremonies have separate possession-verified scopes. This limitation and fairness are explicit in docs/contracts.md. New append-only migrations 0019/0020; committed migrations unchanged. Exact class counter UPSERT/partial-index behavior researched against https://www.sqlite.org/lang_upsert.html and https://www.sqlite.org/partialindex.html. No modulo hash bucket remains for newly aggregated noise; old evidence cannot be recovered and legacy rows expire. Targeted output logs: /tmp/fix-sec-negative-r1.log, /tmp/fix-sec-negative-login.log, /tmp/fix-sec-negative-r2.log, /tmp/fix-sec-positive-r1.log, /tmp/fix-sec-storage.log. Added a real-router owner-refresh replay benchmark; no performance claim from this shared VM.
Author
Owner

Audit boundary refinement: fixed actions without an actor or typed identity/capability target remain counted noise (e.g. unauthenticated certificate rotation); typed targets always preserve individual rows. Refresh/revoke and ceremony-finish HTTP rejections remain individually retained, since generic middleware cannot identify a refresh-cookie actor. This avoids exempting unattributable fixed-route noise merely because its action is fixed. Extended the exact-class test to check both sides of this boundary. All five storage tests pass; first fast gate passed before this refinement; final fast is running. Another scripts/verify browser run is active, so merge is deferred until it finishes and load5 remains below 8.

Audit boundary refinement: fixed actions without an actor or typed identity/capability target remain counted noise (e.g. unauthenticated certificate rotation); typed targets always preserve individual rows. Refresh/revoke and ceremony-finish HTTP rejections remain individually retained, since generic middleware cannot identify a refresh-cookie actor. This avoids exempting unattributable fixed-route noise merely because its action is fixed. Extended the exact-class test to check both sides of this boundary. All five storage tests pass; first fast gate passed before this refinement; final fast is running. Another scripts/verify browser run is active, so merge is deferred until it finishes and load5 remains below 8.
Author
Owner

Final fast passed on 3961f35 after the audit-boundary refinement. Regression and targeted logs retained at /mnt/hdd/infraternal/artifacts/fix-sec-3961f35. Merge is waiting for the other active scripts/verify browser run; current load5=4.49.

PASS fast: migrations are append-only (0.091s)
PASS fast: workspace package dependencies (0.177s)
PASS fast: JavaScript dependencies (0.004s)
PASS fast: build web app (9.176s)
PASS fast: cargo fmt --check (0.795s)
PASS fast: cargo clippy (10.812s)
PASS fast: cargo test (74.205s)
PASS fast: svelte-check (10.411s)
PASS fast: UI package svelte-check (4.985s)
PASS fast: stream package typecheck (4.259s)
PASS fast: Vitest (3.996s)
PASS fast: UI package Vitest (9.495s)
PASS fast: stream package Vitest (0.894s)
PASS fast: OpenAPI and TypeScript client drift (21.377s)
PASS fast: terminal TypeScript (2.322s)
PASS fast: terminal Vitest (1.321s)
Final fast passed on 3961f35 after the audit-boundary refinement. Regression and targeted logs retained at /mnt/hdd/infraternal/artifacts/fix-sec-3961f35. Merge is waiting for the other active scripts/verify browser run; current load5=4.49. ``` PASS fast: migrations are append-only (0.091s) PASS fast: workspace package dependencies (0.177s) PASS fast: JavaScript dependencies (0.004s) PASS fast: build web app (9.176s) PASS fast: cargo fmt --check (0.795s) PASS fast: cargo clippy (10.812s) PASS fast: cargo test (74.205s) PASS fast: svelte-check (10.411s) PASS fast: UI package svelte-check (4.985s) PASS fast: stream package typecheck (4.259s) PASS fast: Vitest (3.996s) PASS fast: UI package Vitest (9.495s) PASS fast: stream package Vitest (0.894s) PASS fast: OpenAPI and TypeScript client drift (21.377s) PASS fast: terminal TypeScript (2.322s) PASS fast: terminal Vitest (1.321s) ```
Author
Owner

The first merge attempt on 3c0d3d3 passed all fast stages and the release build (694.196s), then failed release HTTP/static smoke with curl connection refusal. Full output retained at /mnt/hdd/infraternal/artifacts/fix-sec-3961f35/merge-at-3c0d3d3.log; no cause asserted. Separate owned release-server diagnostics returned healthy HTTP 200, setup-banner presence and a still-running process; no setup output was printed.

Self-check found blanket auth-route audit exemptions would let invalid refresh noise bypass aggregation. Replaced route exemptions with storage-verified attribution carried to generic audits as nonsecret user/token/setup public IDs. Raw refresh credentials, ceremony capabilities and unverified inputs never become audit targets. All actor-less target-less rejections remain exact-class counted noise; attributed capability and identity events remain individual rows. New real-router test verifies both sides. Targeted results: auth_http 18 passed, personal_http 5 passed, enrollment 4 passed, storage quota/audit 5 passed. Rerunning required fast and merge on the resulting head.

The first merge attempt on 3c0d3d3 passed all fast stages and the release build (694.196s), then failed release HTTP/static smoke with curl connection refusal. Full output retained at /mnt/hdd/infraternal/artifacts/fix-sec-3961f35/merge-at-3c0d3d3.log; no cause asserted. Separate owned release-server diagnostics returned healthy HTTP 200, setup-banner presence and a still-running process; no setup output was printed. Self-check found blanket auth-route audit exemptions would let invalid refresh noise bypass aggregation. Replaced route exemptions with storage-verified attribution carried to generic audits as nonsecret user/token/setup public IDs. Raw refresh credentials, ceremony capabilities and unverified inputs never become audit targets. All actor-less target-less rejections remain exact-class counted noise; attributed capability and identity events remain individual rows. New real-router test verifies both sides. Targeted results: auth_http 18 passed, personal_http 5 passed, enrollment 4 passed, storage quota/audit 5 passed. Rerunning required fast and merge on the resulting head.
Author
Owner

Additional attribution regression sensitivity: removed only the attribution refinement while retaining the new test; it failed on 4 individual rows versus expected 2, exit 101. Restored committed implementation immediately; targeted auth test passes with the fix.

Fast attempt on final production stopped at unchanged crates/engine/src/logs.rs::steady_state_framing_does_not_allocate_per_chunk: 172 allocations exceeded its <100 harness-noise allowance. The test uses a process-global allocator; source comments acknowledge parallel harness allocations. No engine file differs from 286d221. An isolated serial run passed (1 passed, 0 failed). Rerunning fast with CARGO_BUILD_JOBS=2 and RUST_TEST_THREADS=1; no test is excluded and no gate/test source was altered to make it pass. Failed output and isolated diagnostic retained at /mnt/hdd/infraternal/artifacts/fix-sec-94449d5.

Additional attribution regression sensitivity: removed only the attribution refinement while retaining the new test; it failed on 4 individual rows versus expected 2, exit 101. Restored committed implementation immediately; targeted auth test passes with the fix. Fast attempt on final production stopped at unchanged crates/engine/src/logs.rs::steady_state_framing_does_not_allocate_per_chunk: 172 allocations exceeded its <100 harness-noise allowance. The test uses a process-global allocator; source comments acknowledge parallel harness allocations. No engine file differs from 286d221. An isolated serial run passed (1 passed, 0 failed). Rerunning fast with CARGO_BUILD_JOBS=2 and RUST_TEST_THREADS=1; no test is excluded and no gate/test source was altered to make it pass. Failed output and isolated diagnostic retained at /mnt/hdd/infraternal/artifacts/fix-sec-94449d5.
Author
Owner

Correcting the earlier HTTP failure diagnosis: the curl connection-refusal message was startup polling noise, not the failing assertion. Reproduced the real release server's HTTP checks: /api/unknown returned the correct 404 JSON but lacked Cache-Control: no-store. The hardening request_context changed path to MatchedPath for redaction, then reused that redacted value to classify API cache policy; unmatched routes therefore became "unmatched" and lost the header.

Regression unmatched_api_errors_keep_no_store failed before the correction (None vs Some("no-store")). Restoring URI-prefix classification as a boolean retains the MatchedPath/unmatched value for logging and auditing; no raw path is retained or logged. This minimal behavior restoration is necessary for the required merge HTTP smoke. Relevant middleware-extension behavior checked against https://docs.rs/axum/0.8.9/axum/extract/struct.MatchedPath.html. No gate script or engine source was changed. Previous full serial fast passed; rerunning fast on this corrected head before final merge.

Correcting the earlier HTTP failure diagnosis: the curl connection-refusal message was startup polling noise, not the failing assertion. Reproduced the real release server's HTTP checks: /api/unknown returned the correct 404 JSON but lacked Cache-Control: no-store. The hardening request_context changed path to MatchedPath for redaction, then reused that redacted value to classify API cache policy; unmatched routes therefore became "unmatched" and lost the header. Regression unmatched_api_errors_keep_no_store failed before the correction (None vs Some("no-store")). Restoring URI-prefix classification as a boolean retains the MatchedPath/unmatched value for logging and auditing; no raw path is retained or logged. This minimal behavior restoration is necessary for the required merge HTTP smoke. Relevant middleware-extension behavior checked against https://docs.rs/axum/0.8.9/axum/extract/struct.MatchedPath.html. No gate script or engine source was changed. Previous full serial fast passed; rerunning fast on this corrected head before final merge.
Author
Owner

Finished fix-sec on sec-hardening at 12e8319d8d55491a969b610662bc0135341956fb. Merged origin/dev 4952934 first. No push; issue remains open.

R1: registered login starts and verified refresh/revoke/issued-ceremony capabilities use independent bounded admission; anonymous saturation cannot consume those slots. Pools, first-come fairness, known-username pressure and five-minute/24-hour recovery are explicit in docs/contracts.md. Production scope bytes remain unchanged for replay compatibility. Tests fill the shipped 1,024 anonymous idempotency slots and 256 anonymous ceremonies, then perform real owner refresh/revoke and a complete SoftPasskey login/replay.

R2: attributable identities/capabilities retain individual audit rows. Generic middleware carries only storage-verified user/token/setup public IDs; no refresh secret, ceremony capability or unverified field becomes a target. Target-less anonymous noise aggregates by the exact action/error tuple with occurrence counts, without modulo/hash buckets. Tests retain both certificate identity targets and all 65 stable fixture classes with their exact counts, and distinguish verified-capability refusals from invalid-credential noise. Only migrations 0019/0020 were added; committed migrations were not edited.

Required merge HTTP smoke also exposed an existing hardening regression: unmatched API routes lacked no-store because cache classification reused the redacted MatchedPath. Restored URI-prefix classification as a boolean while preserving redacted logging/auditing. Its regression fails without this correction and passes with it.

Regression sensitivity (behavioral failures, not compilation errors):

  • real_owner_refresh_has_capacity_at_anonymous_quota: 429 vs expected 200 without R1.
  • full_owner_passkey_login_has_capacity_at_anonymous_quota: 429 vs expected 200 without R1.
  • distinct_identity_rejections_keep_both_targets: 1 row vs expected 2 without R2.
  • verified_capability_rejections_keep_evidence_and_invalid_noise_counts: 4 individual rows vs expected 2 without attribution; committed implementation restored immediately.
  • unmatched_api_errors_keep_no_store: None vs Some(no-store) without cache correction.

Final gates both exit 0. Environment: CARGO_BUILD_JOBS=2 RUST_TEST_THREADS=1. Serial Rust tests prevent the existing process-global allocator test from counting parallel harness allocations; no tests were skipped and no engine/gate source was changed. Final merge admitted at load1=2.22/load5=2.97/load15=3.95 with no other gate/release build/browser suite active. Merge elapsed 508s (8m 28s), below 15 minutes.

scripts/verify fast output, verbatim:

PASS fast: migrations are append-only (0.132s)
PASS fast: workspace package dependencies (0.224s)
PASS fast: JavaScript dependencies (0.005s)
PASS fast: build web app (10.892s)
PASS fast: cargo fmt --check (0.949s)
PASS fast: cargo clippy (13.263s)
PASS fast: cargo test (98.493s)
PASS fast: svelte-check (12.047s)
PASS fast: UI package svelte-check (5.960s)
PASS fast: stream package typecheck (5.233s)
PASS fast: Vitest (3.851s)
PASS fast: UI package Vitest (10.498s)
PASS fast: stream package Vitest (0.914s)
PASS fast: OpenAPI and TypeScript client drift (21.077s)
PASS fast: terminal TypeScript (2.478s)
PASS fast: terminal Vitest (1.196s)

scripts/verify merge output, verbatim:

PASS fast: migrations are append-only (0.147s)
PASS fast: workspace package dependencies (0.198s)
PASS fast: JavaScript dependencies (0.005s)
PASS fast: build web app (9.403s)
PASS fast: cargo fmt --check (0.916s)
PASS fast: cargo clippy (10.712s)
PASS fast: cargo test (81.790s)
PASS fast: svelte-check (8.737s)
PASS fast: UI package svelte-check (4.551s)
PASS fast: stream package typecheck (3.387s)
PASS fast: Vitest (2.762s)
PASS fast: UI package Vitest (7.123s)
PASS fast: stream package Vitest (0.748s)
PASS fast: OpenAPI and TypeScript client drift (16.326s)
PASS fast: terminal TypeScript (1.726s)
PASS fast: terminal Vitest (1.011s)
PASS merge: build release binary (250.396s)
PASS merge: release server HTTP and static behavior (0.502s)
PASS merge: Docker socket _ping (0.010s)
PASS merge: rootless Podman socket _ping (0.010s)
PASS merge: Docker exec PTY smoke (9.328s)
PASS merge: rootless Podman inventory and lifecycle smoke (2.378s)
PASS merge: real sshd session ownership smoke (52.213s)
PASS merge: persistent-session authorization-loss security smoke (18.193s)
PASS merge: install Chromium and system dependencies (3.341s)
PASS multi-tab supported: simultaneous tabs (1 refresh HTTP request)
PASS multi-tab sign-out: pending refresh response cannot restore tab B
PASS multi-tab locks-only: one notice per tab and sequential stale-access recovery
PASS multi-tab neither: one notice per tab and sequential stale-access recovery
SIDEBAR_CONTAINERS repetition=1/1 GET /api/v1/containers status=200
PASS merge: production browser smoke (21.687s)

Earlier failures remain recorded: first merge on 3c0d3d3 passed fast and a cold 694.196s release build but failed the HTTP/static assertion; its startup curl warning was not the cause, and the missing no-store header was later reproduced and fixed. A later default-parallel fast failed unchanged engine steady-state framing's global-allocation allowance (172 allocations vs <100); isolated serial test and complete serial gates pass. Green reruns do not erase either failure.

Evidence: /mnt/hdd/infraternal/artifacts/fix-sec-12e8319. Earlier merge log: /mnt/hdd/infraternal/artifacts/fix-sec-3961f35/merge-at-3c0d3d3.log. Production browser screenshots (12 PNGs): /mnt/hdd/infraternal/artifacts/verify/fix-sec-12e8319-final-merge/browser. Benchmark covers real-router owner refresh replay at full anonymous quota; no performance improvement or perf-VM numbers are claimed. Working tree is clean; progress.md is excluded and uncommitted. Gate cleanup left no containers with this job's browser run label.

Finished fix-sec on sec-hardening at `12e8319d8d55491a969b610662bc0135341956fb`. Merged origin/dev 4952934 first. No push; issue remains open. R1: registered login starts and verified refresh/revoke/issued-ceremony capabilities use independent bounded admission; anonymous saturation cannot consume those slots. Pools, first-come fairness, known-username pressure and five-minute/24-hour recovery are explicit in docs/contracts.md. Production scope bytes remain unchanged for replay compatibility. Tests fill the shipped 1,024 anonymous idempotency slots and 256 anonymous ceremonies, then perform real owner refresh/revoke and a complete SoftPasskey login/replay. R2: attributable identities/capabilities retain individual audit rows. Generic middleware carries only storage-verified user/token/setup public IDs; no refresh secret, ceremony capability or unverified field becomes a target. Target-less anonymous noise aggregates by the exact action/error tuple with occurrence counts, without modulo/hash buckets. Tests retain both certificate identity targets and all 65 stable fixture classes with their exact counts, and distinguish verified-capability refusals from invalid-credential noise. Only migrations 0019/0020 were added; committed migrations were not edited. Required merge HTTP smoke also exposed an existing hardening regression: unmatched API routes lacked no-store because cache classification reused the redacted MatchedPath. Restored URI-prefix classification as a boolean while preserving redacted logging/auditing. Its regression fails without this correction and passes with it. Regression sensitivity (behavioral failures, not compilation errors): - real_owner_refresh_has_capacity_at_anonymous_quota: 429 vs expected 200 without R1. - full_owner_passkey_login_has_capacity_at_anonymous_quota: 429 vs expected 200 without R1. - distinct_identity_rejections_keep_both_targets: 1 row vs expected 2 without R2. - verified_capability_rejections_keep_evidence_and_invalid_noise_counts: 4 individual rows vs expected 2 without attribution; committed implementation restored immediately. - unmatched_api_errors_keep_no_store: None vs Some(no-store) without cache correction. Final gates both exit 0. Environment: CARGO_BUILD_JOBS=2 RUST_TEST_THREADS=1. Serial Rust tests prevent the existing process-global allocator test from counting parallel harness allocations; no tests were skipped and no engine/gate source was changed. Final merge admitted at load1=2.22/load5=2.97/load15=3.95 with no other gate/release build/browser suite active. Merge elapsed 508s (8m 28s), below 15 minutes. `scripts/verify fast` output, verbatim: ``` PASS fast: migrations are append-only (0.132s) PASS fast: workspace package dependencies (0.224s) PASS fast: JavaScript dependencies (0.005s) PASS fast: build web app (10.892s) PASS fast: cargo fmt --check (0.949s) PASS fast: cargo clippy (13.263s) PASS fast: cargo test (98.493s) PASS fast: svelte-check (12.047s) PASS fast: UI package svelte-check (5.960s) PASS fast: stream package typecheck (5.233s) PASS fast: Vitest (3.851s) PASS fast: UI package Vitest (10.498s) PASS fast: stream package Vitest (0.914s) PASS fast: OpenAPI and TypeScript client drift (21.077s) PASS fast: terminal TypeScript (2.478s) PASS fast: terminal Vitest (1.196s) ``` `scripts/verify merge` output, verbatim: ``` PASS fast: migrations are append-only (0.147s) PASS fast: workspace package dependencies (0.198s) PASS fast: JavaScript dependencies (0.005s) PASS fast: build web app (9.403s) PASS fast: cargo fmt --check (0.916s) PASS fast: cargo clippy (10.712s) PASS fast: cargo test (81.790s) PASS fast: svelte-check (8.737s) PASS fast: UI package svelte-check (4.551s) PASS fast: stream package typecheck (3.387s) PASS fast: Vitest (2.762s) PASS fast: UI package Vitest (7.123s) PASS fast: stream package Vitest (0.748s) PASS fast: OpenAPI and TypeScript client drift (16.326s) PASS fast: terminal TypeScript (1.726s) PASS fast: terminal Vitest (1.011s) PASS merge: build release binary (250.396s) PASS merge: release server HTTP and static behavior (0.502s) PASS merge: Docker socket _ping (0.010s) PASS merge: rootless Podman socket _ping (0.010s) PASS merge: Docker exec PTY smoke (9.328s) PASS merge: rootless Podman inventory and lifecycle smoke (2.378s) PASS merge: real sshd session ownership smoke (52.213s) PASS merge: persistent-session authorization-loss security smoke (18.193s) PASS merge: install Chromium and system dependencies (3.341s) PASS multi-tab supported: simultaneous tabs (1 refresh HTTP request) PASS multi-tab sign-out: pending refresh response cannot restore tab B PASS multi-tab locks-only: one notice per tab and sequential stale-access recovery PASS multi-tab neither: one notice per tab and sequential stale-access recovery SIDEBAR_CONTAINERS repetition=1/1 GET /api/v1/containers status=200 PASS merge: production browser smoke (21.687s) ``` Earlier failures remain recorded: first merge on 3c0d3d3 passed fast and a cold 694.196s release build but failed the HTTP/static assertion; its startup curl warning was not the cause, and the missing no-store header was later reproduced and fixed. A later default-parallel fast failed unchanged engine steady-state framing's global-allocation allowance (172 allocations vs <100); isolated serial test and complete serial gates pass. Green reruns do not erase either failure. Evidence: /mnt/hdd/infraternal/artifacts/fix-sec-12e8319. Earlier merge log: /mnt/hdd/infraternal/artifacts/fix-sec-3961f35/merge-at-3c0d3d3.log. Production browser screenshots (12 PNGs): /mnt/hdd/infraternal/artifacts/verify/fix-sec-12e8319-final-merge/browser. Benchmark covers real-router owner refresh replay at full anonymous quota; no performance improvement or perf-VM numbers are claimed. Working tree is clean; progress.md is excluded and uncommitted. Gate cleanup left no containers with this job's browser run label.
Author
Owner

Starting verification on branch sec-hardening, head 12e8319d8d55491a969b610662bc0135341956fb, based on origin/dev at 4952934b4f235a8a98f50689842d017d615ff59f.

I’m checking R1 and R2, running the regression tests both with and without their fixes in a throwaway worktree, checking migration numbering, and then running scripts/verify fast.

Starting verification on branch `sec-hardening`, head `12e8319d8d55491a969b610662bc0135341956fb`, based on `origin/dev` at `4952934b4f235a8a98f50689842d017d615ff59f`. I’m checking R1 and R2, running the regression tests both with and without their fixes in a throwaway worktree, checking migration numbering, and then running `scripts/verify fast`.
Author
Owner

Verification findings on sec-hardening at 12e8319d8d55491a969b610662bc0135341956fb:

  • Fixed-head targeted checks passed: capacity_at_anonymous_quota (2 tests), prelogin_http_capacity_refuses_new_idempotency_before_handler (1), noise_classes_keep_exact_counts_without_bucket_collisions (1), and distinct_identity_rejections_keep_both_targets (1). The first owner test exercises both refresh and revoke; the second exercises the full passkey login.
  • Negative controls in /home/kayg/wt/verify-sec-tmp, created at 12e8319 and then removed: with owner admission disabled, refresh and full passkey login both failed at the expected 200 assertion with 429; with the old modulo-64 audit buckets restored, the identity test observed 1 row instead of 2 and the noise test observed 42 classes instead of 65.
  • git diff origin/dev 12e8319 -- crates/server/migrations lists only added migration files 0017 through 0020; origin/dev ends at 0016.

Running the required scripts/verify fast gate next.

Verification findings on `sec-hardening` at `12e8319d8d55491a969b610662bc0135341956fb`: - Fixed-head targeted checks passed: `capacity_at_anonymous_quota` (2 tests), `prelogin_http_capacity_refuses_new_idempotency_before_handler` (1), `noise_classes_keep_exact_counts_without_bucket_collisions` (1), and `distinct_identity_rejections_keep_both_targets` (1). The first owner test exercises both refresh and revoke; the second exercises the full passkey login. - Negative controls in `/home/kayg/wt/verify-sec-tmp`, created at `12e8319` and then removed: with owner admission disabled, refresh and full passkey login both failed at the expected `200` assertion with `429`; with the old modulo-64 audit buckets restored, the identity test observed 1 row instead of 2 and the noise test observed 42 classes instead of 65. - `git diff origin/dev 12e8319 -- crates/server/migrations` lists only added migration files `0017` through `0020`; `origin/dev` ends at `0016`. Running the required `scripts/verify fast` gate next.
Author
Owner

Verification complete for issue #48. Verdict: verified.

Branch sec-hardening remains at head 12e8319d8d55491a969b610662bc0135341956fb (based on origin/dev 4952934b4f235a8a98f50689842d017d615ff59f). The main worktree is clean and the throwaway worktree has been removed.

R1: the valid owner refresh and revoke test passed; the full owner passkey login test passed; the anonymous request was still refused at the shipped capacity cap. In the throwaway control, disabling owner admission made both owner flows fail with HTTP 429.

R2: the distinct identity-target test and exact noise-class/count test passed. In the throwaway control using modulo-64 buckets and merging targeted rejections, the identity test saw 1 row instead of 2 and the noise test saw 42 classes instead of 65.

Migration check: origin/dev ends at 0016; this branch adds only 0017–0020 migration files.

CARGO_BUILD_JOBS=2 RUST_TEST_THREADS=1 rtk scripts/verify fast (exit 0) output:

PASS fast: migrations are append-only (0.092s)
PASS fast: workspace package dependencies (0.230s)
PASS fast: JavaScript dependencies (0.004s)
PASS fast: build web app (9.312s)
PASS fast: cargo fmt --check (0.798s)
PASS fast: cargo clippy (11.667s)
PASS fast: cargo test (84.041s)
PASS fast: svelte-check (8.289s)
PASS fast: UI package svelte-check (4.499s)
PASS fast: stream package typecheck (3.437s)
PASS fast: Vitest (2.647s)
PASS fast: UI package Vitest (9.187s)
PASS fast: stream package Vitest (0.968s)
PASS fast: OpenAPI and TypeScript client drift (20.202s)
PASS fast: terminal TypeScript (1.753s)
PASS fast: terminal Vitest (0.959s)
Verification complete for issue #48. Verdict: verified. Branch `sec-hardening` remains at head `12e8319d8d55491a969b610662bc0135341956fb` (based on `origin/dev` `4952934b4f235a8a98f50689842d017d615ff59f`). The main worktree is clean and the throwaway worktree has been removed. R1: the valid owner refresh and revoke test passed; the full owner passkey login test passed; the anonymous request was still refused at the shipped capacity cap. In the throwaway control, disabling owner admission made both owner flows fail with HTTP 429. R2: the distinct identity-target test and exact noise-class/count test passed. In the throwaway control using modulo-64 buckets and merging targeted rejections, the identity test saw 1 row instead of 2 and the noise test saw 42 classes instead of 65. Migration check: `origin/dev` ends at `0016`; this branch adds only `0017`–`0020` migration files. `CARGO_BUILD_JOBS=2 RUST_TEST_THREADS=1 rtk scripts/verify fast` (exit 0) output: ``` PASS fast: migrations are append-only (0.092s) PASS fast: workspace package dependencies (0.230s) PASS fast: JavaScript dependencies (0.004s) PASS fast: build web app (9.312s) PASS fast: cargo fmt --check (0.798s) PASS fast: cargo clippy (11.667s) PASS fast: cargo test (84.041s) PASS fast: svelte-check (8.289s) PASS fast: UI package svelte-check (4.499s) PASS fast: stream package typecheck (3.437s) PASS fast: Vitest (2.647s) PASS fast: UI package Vitest (9.187s) PASS fast: stream package Vitest (0.968s) PASS fast: OpenAPI and TypeScript client drift (20.202s) PASS fast: terminal TypeScript (1.753s) PASS fast: terminal Vitest (0.959s) ```
Author
Owner

Starting #48 on deploy-git-fix, based on 12e8319d8d. I am tracing the deploy build-container invocation and will remove the helper’s dependency on Git while preserving the dev VM install lock behavior. I will run fast verification and a local Ubuntu 24.04 build-only reproduction; I will not deploy or touch o2.

Starting #48 on deploy-git-fix, based on 12e8319d8d55491a969b610662bc0135341956fb. I am tracing the deploy build-container invocation and will remove the helper’s dependency on Git while preserving the dev VM install lock behavior. I will run fast verification and a local Ubuntu 24.04 build-only reproduction; I will not deploy or touch o2.
Author
Owner

Finding: deploy-o2 creates /src from git archive at scripts/deploy-o2 lines 116–120, so there is no .git metadata inside the Ubuntu build container. scripts/lib/js-dependencies.sh:64 calls git -C "$repo_root" rev-parse --absolute-git-dir when dependencies need installing, which fails in that exact source layout.

Finding: deploy-o2 creates /src from `git archive` at scripts/deploy-o2 lines 116–120, so there is no .git metadata inside the Ubuntu build container. scripts/lib/js-dependencies.sh:64 calls `git -C "$repo_root" rev-parse --absolute-git-dir` when dependencies need installing, which fails in that exact source layout.
Author
Owner

Finding and decision: the existing scripts/tests/js-dependencies.sh creates its fixture outside any Git repository and reproduced the failure before the change. The helper now hashes the checkout path and keeps the lock in XDG_CACHE_HOME (or HOME/.cache), outside node_modules, preserving per-checkout flock serialization without requiring Git or changing Bun installation behavior.

Finding and decision: the existing scripts/tests/js-dependencies.sh creates its fixture outside any Git repository and reproduced the failure before the change. The helper now hashes the checkout path and keeps the lock in XDG_CACHE_HOME (or HOME/.cache), outside node_modules, preserving per-checkout flock serialization without requiring Git or changing Bun installation behavior.
Author
Owner

Finished #48.

Branch: deploy-git-fix
Base: 12e8319d8d
Head: 6f6fd89621
Commit: Make JS install lock independent of Git metadata

The helper now keeps its per-checkout install lock under XDG_CACHE_HOME (falling back to HOME/.cache), keyed by the physical checkout path and outside node_modules. The flock, lockfile recheck, Bun install, and marker behavior remain in place.

Targeted check:
PASS shared JavaScript dependency freshness

Container reproduction used ubuntu:24.04, the deploy source archive mount extracted at /src, and no Git binary or .git directory. It installed pinned Bun 1.4.2 and ran the real dependency helper:

bun install v1.4.2 (744846f84)
Resolving dependencies
Resolved, downloaded and extracted [68]

+ @playwright/test@1.63.0

220 packages installed [14.91s]
PASS ubuntu:24.04 js-dependencies (/src, no git, no .git)

Final scripts/verify fast output:

PASS fast: migrations are append-only (0.125s)
PASS fast: workspace package dependencies (0.166s)
PASS fast: JavaScript dependencies (0.003s)
PASS fast: build web app (9.477s)
PASS fast: cargo fmt --check (0.975s)
PASS fast: cargo clippy (9.213s)
PASS fast: cargo test (56.198s)
PASS fast: svelte-check (14.144s)
PASS fast: UI package svelte-check (6.286s)
PASS fast: stream package typecheck (4.651s)
PASS fast: Vitest (3.884s)
PASS fast: UI package Vitest (9.987s)
PASS fast: stream package Vitest (1.007s)
PASS fast: OpenAPI and TypeScript client drift (18.338s)
PASS fast: terminal TypeScript (2.412s)
PASS fast: terminal Vitest (1.289s)

An earlier fast attempt exited during cargo test dependency compilation without a Rust diagnostic; the subsequent rerun and final post-change run passed.

No deployment was run and o2 was not accessed.

Finished #48. Branch: deploy-git-fix Base: 12e8319d8d55491a969b610662bc0135341956fb Head: 6f6fd896214f05d9ef19a47e43fb8be2561ab626 Commit: Make JS install lock independent of Git metadata The helper now keeps its per-checkout install lock under XDG_CACHE_HOME (falling back to HOME/.cache), keyed by the physical checkout path and outside node_modules. The flock, lockfile recheck, Bun install, and marker behavior remain in place. Targeted check: PASS shared JavaScript dependency freshness Container reproduction used ubuntu:24.04, the deploy source archive mount extracted at /src, and no Git binary or .git directory. It installed pinned Bun 1.4.2 and ran the real dependency helper: ```text bun install v1.4.2 (744846f84) Resolving dependencies Resolved, downloaded and extracted [68] + @playwright/test@1.63.0 220 packages installed [14.91s] PASS ubuntu:24.04 js-dependencies (/src, no git, no .git) ``` Final scripts/verify fast output: ```text PASS fast: migrations are append-only (0.125s) PASS fast: workspace package dependencies (0.166s) PASS fast: JavaScript dependencies (0.003s) PASS fast: build web app (9.477s) PASS fast: cargo fmt --check (0.975s) PASS fast: cargo clippy (9.213s) PASS fast: cargo test (56.198s) PASS fast: svelte-check (14.144s) PASS fast: UI package svelte-check (6.286s) PASS fast: stream package typecheck (4.651s) PASS fast: Vitest (3.884s) PASS fast: UI package Vitest (9.987s) PASS fast: stream package Vitest (1.007s) PASS fast: OpenAPI and TypeScript client drift (18.338s) PASS fast: terminal TypeScript (2.412s) PASS fast: terminal Vitest (1.289s) ``` An earlier fast attempt exited during cargo test dependency compilation without a Rust diagnostic; the subsequent rerun and final post-change run passed. No deployment was run and o2 was not accessed.
Author
Owner

Supply-chain gate job
Branch: lp-supply
Base head: 6f6fd89621
Done: read CLAUDE.md and the required repository docs; confirmed scripts/verify integration is already running, so no gate will be started concurrently.
Next: inspect the graph and existing verify/bootstrap/package metadata; add pinned cargo-deny, Bun audit reporting, and generated license notices.

Supply-chain gate job Branch: lp-supply Base head: 6f6fd896214f05d9ef19a47e43fb8be2561ab626 Done: read CLAUDE.md and the required repository docs; confirmed scripts/verify integration is already running, so no gate will be started concurrently. Next: inspect the graph and existing verify/bootstrap/package metadata; add pinned cargo-deny, Bun audit reporting, and generated license notices.
Author
Owner

Starting job lp-flaky on branch lp-flaky, based on dev at 6f6fd896214f05d9ef19a47e43fb8be2561ab626. I’m addressing the timing-sensitive SSH/CLI tests and consolidating the duplicated dev-only sshd harness within the assigned test files. The code-review-graph index was missing and is being rebuilt before source orientation. A separate scripts/verify integration run is active, so I’ll defer heavy gates until it finishes.

Starting job `lp-flaky` on branch `lp-flaky`, based on `dev` at `6f6fd896214f05d9ef19a47e43fb8be2561ab626`. I’m addressing the timing-sensitive SSH/CLI tests and consolidating the duplicated dev-only sshd harness within the assigned test files. The code-review-graph index was missing and is being rebuilt before source orientation. A separate `scripts/verify integration` run is active, so I’ll defer heavy gates until it finishes.
Author
Owner

Starting docs-only roadmap proposal on branch lp-roadmap, based on dev 6f6fd896214f05d9ef19a47e43fb8be2561ab626. I am reading the named audit/design/review evidence and will add only docs/research/roadmap-2026-10.md; no PLAN, DECISIONS, or contracts changes. I will run scripts/verify fast, commit without pushing, and post a concise summary here.

Starting docs-only roadmap proposal on branch `lp-roadmap`, based on `dev` `6f6fd896214f05d9ef19a47e43fb8be2561ab626`. I am reading the named audit/design/review evidence and will add only `docs/research/roadmap-2026-10.md`; no PLAN, DECISIONS, or contracts changes. I will run `scripts/verify fast`, commit without pushing, and post a concise summary here.
Author
Owner

Supply-chain gate job
Branch: lp-supply
Base head: 6f6fd89621
Done: read CLAUDE.md and the required repository docs; confirmed scripts/verify integration is already running, so no gate will be started concurrently.
Next: inspect the graph and existing verify/bootstrap/package metadata; add pinned cargo-deny, Bun audit reporting, and generated license notices.

Supply-chain gate job Branch: lp-supply Base head: 6f6fd896214f05d9ef19a47e43fb8be2561ab626 Done: read CLAUDE.md and the required repository docs; confirmed scripts/verify integration is already running, so no gate will be started concurrently. Next: inspect the graph and existing verify/bootstrap/package metadata; add pinned cargo-deny, Bun audit reporting, and generated license notices.
Author
Owner

Supply-chain gate job — issue kayg/infraternal#48
Branch: lp-supply
Base head: 6f6fd89621

Done:

  • Read CLAUDE.md, DECISIONS.md, docs/DESIGN.md, docs/PLAN.md, docs/UI.md and the relevant contracts context.
  • Built the missing local code-review-graph index; it located the run_fast hook and confirmed no existing supply-chain checker.
  • Added deny.toml with a closed license allow list and started scripts/check-supply-chain with pinned cargo-deny 0.20.2, offline fallback for RustSec, Bun audit reporting, and generated frontend notices.
  • Added the fast-stage hook and visible successful-stage report output to scripts/verify.
  • bash -n scripts/check-supply-chain scripts/verify and git diff --check passed.

Decisions/findings:

  • Workspace minimum Rust is 1.89; cargo-deny 0.20.2 requires 1.88. This is the current stable release listed by the upstream project: https://github.com/EmbarkStudios/cargo-deny/releases
  • Keep Bun findings report-only as requested. Bun audit reads bun.lock and exits 1 for either reported vulnerabilities or registry request failure: https://bun.sh/docs/pm/cli/audit
  • Allow GPL-3.0/LGPL-3.0 terms as AGPL-3.0 compatible, following the GNU license compatibility guidance: https://www.gnu.org/licenses/license-compatibility.html
  • Calternal-derived sources currently carry provenance in packages/ui/src/tokens.css and packages/web/src/routes/hosts/+page.svelte; scripts/fj explicitly identifies itself as copied from calternal.js.

Next:

  • Install/resolve frontend dependencies and cargo-deny at reduced CPU priority; validate notice generation, current cargo advisories/licenses, and Bun audit output.
  • Run scripts/verify fast and scripts/verify merge only when no verify process is active and load5 is at most 6.
  • Record current findings and recommended fixes on issue #48, commit the owned changes, then post the final head and exact gate output.
Supply-chain gate job — issue kayg/infraternal#48 Branch: lp-supply Base head: 6f6fd896214f05d9ef19a47e43fb8be2561ab626 Done: - Read CLAUDE.md, DECISIONS.md, docs/DESIGN.md, docs/PLAN.md, docs/UI.md and the relevant contracts context. - Built the missing local code-review-graph index; it located the `run_fast` hook and confirmed no existing supply-chain checker. - Added deny.toml with a closed license allow list and started scripts/check-supply-chain with pinned cargo-deny 0.20.2, offline fallback for RustSec, Bun audit reporting, and generated frontend notices. - Added the fast-stage hook and visible successful-stage report output to scripts/verify. - `bash -n scripts/check-supply-chain scripts/verify` and `git diff --check` passed. Decisions/findings: - Workspace minimum Rust is 1.89; cargo-deny 0.20.2 requires 1.88. This is the current stable release listed by the upstream project: https://github.com/EmbarkStudios/cargo-deny/releases - Keep Bun findings report-only as requested. Bun audit reads bun.lock and exits 1 for either reported vulnerabilities or registry request failure: https://bun.sh/docs/pm/cli/audit - Allow GPL-3.0/LGPL-3.0 terms as AGPL-3.0 compatible, following the GNU license compatibility guidance: https://www.gnu.org/licenses/license-compatibility.html - Calternal-derived sources currently carry provenance in packages/ui/src/tokens.css and packages/web/src/routes/hosts/+page.svelte; scripts/fj explicitly identifies itself as copied from calternal.js. Next: - Install/resolve frontend dependencies and cargo-deny at reduced CPU priority; validate notice generation, current cargo advisories/licenses, and Bun audit output. - Run scripts/verify fast and scripts/verify merge only when no verify process is active and load5 is at most 6. - Record current findings and recommended fixes on issue #48, commit the owned changes, then post the final head and exact gate output.
Author
Owner

Supply-chain finding update — kayg/infraternal#48

Evidence from a run with cargo-deny 0.20.2 and a refreshed RustSec database on 2026-10-02:

  • RUSTSEC-2023-0071 is reported for rsa 0.10.0-rc.18 through russh 0.63.3 into infraternal-ssh. The current RustSec advisory says no patched version exists and still lists 0.10.0-rc.18 as affected. russh 0.63.3 enables its optional rsa feature by default; infraternal’s stored SSH identity is generated as Ed25519. Recommended next fix: disable russh’s default RSA feature while preserving the required crypto backend and compression features, then verify SSH behavior; follow RustCrypto/RSA#626 for a patched release. Sources: https://rustsec.org/advisories/RUSTSEC-2023-0071.html and https://docs.rs/crate/russh/0.63.3.
  • yoke-derive 0.8.3 is yanked, reported as a warning through yoke/ICU. Recommended next fix: cargo update -p yoke-derive and verify the resulting lockfile. No dependency changes were made here.
  • The closed license allow list rejects CDLA-Permissive-2.0 on webpki-root-certs 1.0.9, webpki-roots 0.26.11, and webpki-roots 1.0.9. CDLA-Permissive-2.0 is a data license; its sharing condition requires making the agreement text available. Recommended owner decision: explicitly allow it and preserve the CDLA text in notices, or use a trust-root data source covered by the selected policy. Source: https://cdla.dev/permissive-2-0/.
  • Bun reports one low severity finding: cookie@0.6.0 via @sveltejs/kit@2.70.3; the installed Kit manifest requires cookie ^0.6.0, which excludes patched 0.7.0. Recommended next fix: update Kit when its range permits the patched cookie or apply a tested Bun override to cookie@0.7.0. The check remains report-only. Source: https://github.com/advisories/GHSA-pxg6-pf52-xh8x.
  • Unicode-3.0 appeared during policy discovery and is now explicitly allowed: the GNU license list describes it as compatible with all GNU GPL versions. Source: https://www.gnu.org/licenses/license-list.html.html.

The targeted supply-chain script now writes a concise report: SUPPLY_CHAIN_NOTICES generated THIRD_PARTY_NOTICES.md from 95 frontend packages; 179 shadcn-svelte files and 3 calternal-derived source files are listed; 66 distinct package license texts are included. The generated inventory identifies cookie@0.6.0 and detects the svelte-toolbelt MIT license from its LICENSE file.

Targeted command result: SUPPLY_CHAIN_EXIT=1 because RustSec found the RSA advisory and cargo-deny rejected the three CDLA packages; Bun’s finding was marked report-only. Next: wait for all other verify processes to finish, run the requested fast and merge gates, resolve any implementation defects without upgrading dependencies, commit, and post exact final gate output.

Supply-chain finding update — kayg/infraternal#48 Evidence from a run with `cargo-deny 0.20.2` and a refreshed RustSec database on 2026-10-02: - `RUSTSEC-2023-0071` is reported for `rsa 0.10.0-rc.18` through `russh 0.63.3` into `infraternal-ssh`. The current RustSec advisory says no patched version exists and still lists 0.10.0-rc.18 as affected. `russh 0.63.3` enables its optional `rsa` feature by default; infraternal’s stored SSH identity is generated as Ed25519. Recommended next fix: disable `russh`’s default RSA feature while preserving the required crypto backend and compression features, then verify SSH behavior; follow RustCrypto/RSA#626 for a patched release. Sources: https://rustsec.org/advisories/RUSTSEC-2023-0071.html and https://docs.rs/crate/russh/0.63.3. - `yoke-derive 0.8.3` is yanked, reported as a warning through `yoke`/ICU. Recommended next fix: `cargo update -p yoke-derive` and verify the resulting lockfile. No dependency changes were made here. - The closed license allow list rejects `CDLA-Permissive-2.0` on `webpki-root-certs 1.0.9`, `webpki-roots 0.26.11`, and `webpki-roots 1.0.9`. CDLA-Permissive-2.0 is a data license; its sharing condition requires making the agreement text available. Recommended owner decision: explicitly allow it and preserve the CDLA text in notices, or use a trust-root data source covered by the selected policy. Source: https://cdla.dev/permissive-2-0/. - Bun reports one low severity finding: `cookie@0.6.0` via `@sveltejs/kit@2.70.3`; the installed Kit manifest requires `cookie ^0.6.0`, which excludes patched `0.7.0`. Recommended next fix: update Kit when its range permits the patched cookie or apply a tested Bun override to `cookie@0.7.0`. The check remains report-only. Source: https://github.com/advisories/GHSA-pxg6-pf52-xh8x. - `Unicode-3.0` appeared during policy discovery and is now explicitly allowed: the GNU license list describes it as compatible with all GNU GPL versions. Source: https://www.gnu.org/licenses/license-list.html.html. The targeted supply-chain script now writes a concise report: `SUPPLY_CHAIN_NOTICES generated THIRD_PARTY_NOTICES.md from 95 frontend packages`; 179 shadcn-svelte files and 3 calternal-derived source files are listed; 66 distinct package license texts are included. The generated inventory identifies `cookie@0.6.0` and detects the `svelte-toolbelt` MIT license from its LICENSE file. Targeted command result: `SUPPLY_CHAIN_EXIT=1` because RustSec found the RSA advisory and cargo-deny rejected the three CDLA packages; Bun’s finding was marked report-only. Next: wait for all other verify processes to finish, run the requested fast and merge gates, resolve any implementation defects without upgrading dependencies, commit, and post exact final gate output.
Author
Owner

lp-roadmap committed as b2f2fe8babeedff6e62b19d48e47435a8281af70.
Added only docs/research/roadmap-2026-10.md; no push; working tree is clean; staged diff check passed.
Synthesis recommends a small S1 operator loop before adding resource domains.
v0.1 covers local Docker/Podman, reachable SSH, passkeys, scoped actions, bounded logs, one reattachable shell, and durable audit writes.
Remote workload fleets, Compose, OIDC, Kubernetes, LXC, Proxmox, and QEMU are deferred or cut.
Provider direction reconciles plugin goals with the product audit: compiled-in first-party crates, no dynamic framework, zero disabled-provider cost.
Proposal recommends copying current calternal UI as-is; hide unsupported UI and apply documented accessibility and motion rules.
MVP rows label merged, branch, or missing state and include done-when plus report/issue evidence.
Thirteen ordered steps assign exclusive ownership across port, provider lanes B–F, reliability, Kubernetes, LXC, and Proxmox.
Proposed failing gates cover idle CPU/RSS, per-stream memory, navigation heap, cold JS, 304 allocations, and existing hot-path limits.
Perf-test-VM A/B is required; dev-VM measurements do not certify performance.
Owner recommendations cover OIDC mapping, namespace-scoped Kubernetes, Proxmox LXC only, local-only workload scope, and L4 tunnel passthrough on o2.
Risk register covers port readiness, provider semantics/tunnel stability, scope growth, performance evidence, stale audits, UI drift, and mTLS routing.
scripts/verify fast output (verbatim):
PASS fast: migrations are append-only (0.299s)
PASS fast: workspace package dependencies (0.339s)
PASS fast: JavaScript dependencies (0.015s)
PASS fast: build web app (22.848s)
PASS fast: cargo fmt --check (1.359s)
PASS fast: cargo clippy (68.390s)
PASS fast: cargo test (84.846s)
PASS fast: svelte-check (13.174s)
PASS fast: UI package svelte-check (6.893s)
PASS fast: stream package typecheck (4.256s)
PASS fast: Vitest (3.864s)
PASS fast: UI package Vitest (9.172s)
PASS fast: stream package Vitest (0.893s)
PASS fast: OpenAPI and TypeScript client drift (28.655s)
PASS fast: terminal TypeScript (2.072s)
PASS fast: terminal Vitest (1.138s)

`lp-roadmap` committed as `b2f2fe8babeedff6e62b19d48e47435a8281af70`. Added only `docs/research/roadmap-2026-10.md`; no push; working tree is clean; staged diff check passed. Synthesis recommends a small S1 operator loop before adding resource domains. v0.1 covers local Docker/Podman, reachable SSH, passkeys, scoped actions, bounded logs, one reattachable shell, and durable audit writes. Remote workload fleets, Compose, OIDC, Kubernetes, LXC, Proxmox, and QEMU are deferred or cut. Provider direction reconciles plugin goals with the product audit: compiled-in first-party crates, no dynamic framework, zero disabled-provider cost. Proposal recommends copying current calternal UI as-is; hide unsupported UI and apply documented accessibility and motion rules. MVP rows label merged, branch, or missing state and include done-when plus report/issue evidence. Thirteen ordered steps assign exclusive ownership across port, provider lanes B–F, reliability, Kubernetes, LXC, and Proxmox. Proposed failing gates cover idle CPU/RSS, per-stream memory, navigation heap, cold JS, 304 allocations, and existing hot-path limits. Perf-test-VM A/B is required; dev-VM measurements do not certify performance. Owner recommendations cover OIDC mapping, namespace-scoped Kubernetes, Proxmox LXC only, local-only workload scope, and L4 tunnel passthrough on o2. Risk register covers port readiness, provider semantics/tunnel stability, scope growth, performance evidence, stale audits, UI drift, and mTLS routing. `scripts/verify fast` output (verbatim): PASS fast: migrations are append-only (0.299s) PASS fast: workspace package dependencies (0.339s) PASS fast: JavaScript dependencies (0.015s) PASS fast: build web app (22.848s) PASS fast: cargo fmt --check (1.359s) PASS fast: cargo clippy (68.390s) PASS fast: cargo test (84.846s) PASS fast: svelte-check (13.174s) PASS fast: UI package svelte-check (6.893s) PASS fast: stream package typecheck (4.256s) PASS fast: Vitest (3.864s) PASS fast: UI package Vitest (9.172s) PASS fast: stream package Vitest (0.893s) PASS fast: OpenAPI and TypeScript client drift (28.655s) PASS fast: terminal TypeScript (2.072s) PASS fast: terminal Vitest (1.138s)
Author
Owner

Finding: the CLI, server, and SSH integration targets included duplicated sshd harness implementations, and the cleanup tests were registered from each copy. The shared fixture now lives in crates/ssh/test_support/sshd.rs; its cleanup tests are included only by the dedicated crates/ssh/tests/sshd_cleanup.rs target.

The replay setup now gates remote shell output on explicit input, with the test observing attachment state and replay markers before releasing or reattaching. This removes the fixed one-second and 200/400 ms replay delays. Verification is pending because other scripts/verify runs are active on the VM.

Finding: the CLI, server, and SSH integration targets included duplicated sshd harness implementations, and the cleanup tests were registered from each copy. The shared fixture now lives in `crates/ssh/test_support/sshd.rs`; its cleanup tests are included only by the dedicated `crates/ssh/tests/sshd_cleanup.rs` target. The replay setup now gates remote shell output on explicit input, with the test observing attachment state and replay markers before releasing or reattaching. This removes the fixed one-second and 200/400 ms replay delays. Verification is pending because other `scripts/verify` runs are active on the VM.
Author
Owner

Starting lp-binsize on branch lp-binsize, based on dev at 6f6fd896214f05d9ef19a47e43fb8be2561ab626. I confirmed the 25 MB stripped release budget in docs/PLAN.md. The root release profile already enables fat LTO, one codegen unit, stripping and panic abort; I will measure this baseline and inspect the current activated features before making isolated, measured Cargo-only changes. The worktree is clean.

Starting lp-binsize on branch `lp-binsize`, based on `dev` at `6f6fd896214f05d9ef19a47e43fb8be2561ab626`. I confirmed the 25 MB stripped release budget in `docs/PLAN.md`. The root release profile already enables fat LTO, one codegen unit, stripping and panic abort; I will measure this baseline and inspect the current activated features before making isolated, measured Cargo-only changes. The worktree is clean.
Author
Owner

Initial dependency evidence from cargo tree -p infraternal -i ...: aws-lc-sys is reached through both russh and the rustls stack (including reqwest/tokio-tungstenite). openssl is reached by the server through webauthn-rs → webauthn-rs-core → webauthn-attestation-ca; the softpasskey authenticator also uses it in dev builds. I will not switch WebAuthn crypto without proof that its attestation verification coverage is unchanged. The forward feature tree also shows Axum defaults plus ws, and Tokio defaults, are enabled transitively; these are concrete feature-trimming candidates to verify by build and gates.

Initial dependency evidence from `cargo tree -p infraternal -i ...`: `aws-lc-sys` is reached through both `russh` and the `rustls` stack (including reqwest/tokio-tungstenite). `openssl` is reached by the server through `webauthn-rs` → `webauthn-rs-core` → `webauthn-attestation-ca`; the softpasskey authenticator also uses it in dev builds. I will not switch WebAuthn crypto without proof that its attestation verification coverage is unchanged. The forward feature tree also shows Axum defaults plus `ws`, and Tokio defaults, are enabled transitively; these are concrete feature-trimming candidates to verify by build and gates.
Author
Owner

Checkpoint: 9c76f4e206bd4fb25e1cb4e1021f22aaf87d8ac0 (test: make SSH timing tests deterministic). The edited files pass formatting and diff checks, and the embedded PTY harness parses:

cargo fmt --all -- --check  # exit 0
git diff --check            # exit 0
CLI_PTY_SCRIPT parses

Compile, 20-run repetitions and final gates are pending. An integration verification run and another fast verification run are currently active on the shared VM.

Checkpoint: `9c76f4e206bd4fb25e1cb4e1021f22aaf87d8ac0` (`test: make SSH timing tests deterministic`). The edited files pass formatting and diff checks, and the embedded PTY harness parses: ``` cargo fmt --all -- --check # exit 0 git diff --check # exit 0 CLI_PTY_SCRIPT parses ``` Compile, 20-run repetitions and final gates are pending. An integration verification run and another fast verification run are currently active on the shared VM.
Author
Owner

Panic/profile audit: crates/server/src/device_auth.rs:1622-1645 calls FutureExt::catch_unwind around the audit future so failed issuance can be marked Failed and cannot be restored. Therefore I will not introduce panic = "abort" as a size optimization; the setting already exists on the base branch and must be measured against this behavior.

Crypto evidence: the exact webauthn-rs-core 0.5.4 published manifest declares openssl and openssl-sys directly (docs.rs manifest); there is no backend feature to substitute. rustls 0.23.45 and russh 0.63.3 do offer a ring provider alongside AWS-LC (rustls feature docs, russh 0.63.3). That would still leave WebAuthn on OpenSSL, so I will not claim one shared backend or change WebAuthn attestation verification in this scope.

Panic/profile audit: `crates/server/src/device_auth.rs:1622-1645` calls `FutureExt::catch_unwind` around the audit future so failed issuance can be marked `Failed` and cannot be restored. Therefore I will not introduce `panic = "abort"` as a size optimization; the setting already exists on the base branch and must be measured against this behavior. Crypto evidence: the exact `webauthn-rs-core 0.5.4` published manifest declares `openssl` and `openssl-sys` directly ([docs.rs manifest](https://docs.rs/crate/webauthn-rs-core/0.5.4/source/Cargo.toml)); there is no backend feature to substitute. `rustls 0.23.45` and `russh 0.63.3` do offer a ring provider alongside AWS-LC ([rustls feature docs](https://docs.rs/rustls/0.23.45/rustls/#crate-features), [russh 0.63.3](https://docs.rs/crate/russh/0.63.3)). That would still leave WebAuthn on OpenSSL, so I will not claim one shared backend or change WebAuthn attestation verification in this scope.
Author
Owner

Starting the owner-approved v0.0.1 scope documentation job on branch scope-v01, based on dev at 6f6fd896214f05d9ef19a47e43fb8be2561ab626. I will record the 2026-10-02 decisions in DECISIONS.md, copy the roadmap proposal, update the scope and steps in docs/PLAN.md while retaining superseded text as history, run scripts/verify fast, and report the resulting commit and gate output here.

Starting the owner-approved v0.0.1 scope documentation job on branch `scope-v01`, based on `dev` at `6f6fd896214f05d9ef19a47e43fb8be2561ab626`. I will record the 2026-10-02 decisions in `DECISIONS.md`, copy the roadmap proposal, update the scope and steps in `docs/PLAN.md` while retaining superseded text as history, run `scripts/verify fast`, and report the resulting commit and gate output here.
Author
Owner

Baseline build attempt: cargo build --release -p infraternal compiled the Rust dependencies but stopped in infraternal-server because the generated embedded web directory is missing. Exact build-script output: embedded web build missing; run scripts/build-web first. I will generate the repository's normal web build prerequisite, then retry the baseline measurement. The release compile took 2m34s before this prerequisite failure.

Baseline build attempt: `cargo build --release -p infraternal` compiled the Rust dependencies but stopped in `infraternal-server` because the generated embedded web directory is missing. Exact build-script output: `embedded web build missing; run scripts/build-web first`. I will generate the repository's normal web build prerequisite, then retry the baseline measurement. The release compile took 2m34s before this prerequisite failure.
Author
Owner

Resumed lp-binsize on GPT 6.1 Sol. Branch lp-binsize, base/head 6f6fd89621. Worktree clean; prior build failed because embedded web bundle is absent. Waiting for shared load5 <= 6 before build/gate work. Reviewing profile and dependency-feature candidates; no crypto backend change without attestation equivalence evidence.

Resumed lp-binsize on GPT 6.1 Sol. Branch lp-binsize, base/head 6f6fd896214f05d9ef19a47e43fb8be2561ab626. Worktree clean; prior build failed because embedded web bundle is absent. Waiting for shared load5 <= 6 before build/gate work. Reviewing profile and dependency-feature candidates; no crypto backend change without attestation equivalence evidence.
Author
Owner

Resumed scope-v01 on GPT 6.1 Sol at the owner's request. Branch scope-v01, base 6f6fd896214f05d9ef19a47e43fb8be2561ab626; reviewed and retained the prior unfinished docs changes.

The active plan now promotes signed remote parity into v0.0.1 for list, inspect, actions, logs, exec and persistent sessions, including SSH reachable from every enrolled infraternal agent. The old plan and exact roadmap proposal remain as historical evidence; the copied proposal's v0.1/local-only recommendation is explicitly superseded by the dated owner approval. Provider-lane ownership now points to the approved step table, and the first Proxmox slice settles the older open PVE-API-vs-liblxc question. scripts/verify fast is running; no code or wire contracts changed.

Resumed scope-v01 on GPT 6.1 Sol at the owner's request. Branch `scope-v01`, base `6f6fd896214f05d9ef19a47e43fb8be2561ab626`; reviewed and retained the prior unfinished docs changes. The active plan now promotes signed remote parity into v0.0.1 for list, inspect, actions, logs, exec and persistent sessions, including SSH reachable from every enrolled infraternal agent. The old plan and exact roadmap proposal remain as historical evidence; the copied proposal's v0.1/local-only recommendation is explicitly superseded by the dated owner approval. Provider-lane ownership now points to the approved step table, and the first Proxmox slice settles the older open PVE-API-vs-liblxc question. `scripts/verify fast` is running; no code or wire contracts changed.
Author
Owner

Starting perf-gates on branch perf-gates, base 6f6fd896214f05d9ef19a47e43fb8be2561ab626. Scope: new scripts/perf harnesses, perf-only verify stage, appended performance table rows. Will measure dev-VM calibration separately from absolute perf-VM budgets. The prompt forbids reading other jobs files, so I will not access the referenced audit-perf report under /mnt/hdd/infraternal/jobs/. Current VM load is above 10 and other verification runs are active; heavy runs will wait.

Starting perf-gates on branch `perf-gates`, base `6f6fd896214f05d9ef19a47e43fb8be2561ab626`. Scope: new scripts/perf harnesses, perf-only verify stage, appended performance table rows. Will measure dev-VM calibration separately from absolute perf-VM budgets. The prompt forbids reading other jobs files, so I will not access the referenced audit-perf report under /mnt/hdd/infraternal/jobs/. Current VM load is above 10 and other verification runs are active; heavy runs will wait.
Author
Owner

lp-supply resumed on GPT 6.1 Sol. Branch lp-supply, base 6f6fd896214f05d9ef19a47e43fb8be2561ab626, current head 31bca568a99892ce2505a23e909c95dce7a64e4f. Worktree is clean and the implementation commit is retained. Reviewing fallback behavior and notice reproducibility, then rerunning fast and merge. Waiting to start gates until no other scripts/verify process is active and load5 is at most 6. Current Rust advisory/license failures will be reported; dependencies remain unchanged.

lp-supply resumed on GPT 6.1 Sol. Branch `lp-supply`, base `6f6fd896214f05d9ef19a47e43fb8be2561ab626`, current head `31bca568a99892ce2505a23e909c95dce7a64e4f`. Worktree is clean and the implementation commit is retained. Reviewing fallback behavior and notice reproducibility, then rerunning fast and merge. Waiting to start gates until no other `scripts/verify` process is active and load5 is at most 6. Current Rust advisory/license failures will be reported; dependencies remain unchanged.
Author
Owner

Resumed lp-flaky on GPT 6.1 Sol. Base 6f6fd89621; checkpoint 9c76f4e reviewed, clean worktree. Review found final SSH benchmark response and DONE may share a frame after removing the sleep; 53c022c preserves that frame and waits on the completion marker. Test-only scope unchanged. Compilation and final gates pending: load5 9.66 exceeds this low-priority job limit of 6; no heavy run started.

Resumed lp-flaky on GPT 6.1 Sol. Base 6f6fd896214f05d9ef19a47e43fb8be2561ab626; checkpoint 9c76f4e reviewed, clean worktree. Review found final SSH benchmark response and DONE may share a frame after removing the sleep; 53c022c preserves that frame and waits on the completion marker. Test-only scope unchanged. Compilation and final gates pending: load5 9.66 exceeds this low-priority job limit of 6; no heavy run started.
Author
Owner

Evidence before trials:

  • Base release profile already has fat LTO, codegen-units=1, strip=true, panic=abort. Production device_auth.rs uses FutureExt::catch_unwind for audit failure and Tokio task panics; abort cannot exercise those recovery paths. Do not introduce abort as a new optimization; test unwind as a candidate and report its size cost. Cargo documents that tests and benchmarks ignore panic strategy: https://doc.rust-lang.org/cargo/reference/profiles.html#panic
  • Tokio 1.53.1 default feature set is empty; SQLx 0.8.6 is already default-features=false with SQLite only; Bollard and Reqwest are already default-features=false. Axum forms and OriginalUri have no use in workspace source; MatchedPath, Json and Query are used.
  • OpenSSL is a direct dependency of locked webauthn-rs-core 0.5.4, with no provider selector: https://docs.rs/crate/webauthn-rs-core/0.5.4/source/Cargo.toml . Keep attestation verification unchanged. A single crypto provider is not achievable through the allowed feature-only change. rcgen additionally brings ring, so the actual graph has OpenSSL, AWS-LC and ring.
  • Shared load5 rose above 13 and concurrent verify runs are active. Heavy work waits for load5 <= 6 and no active verify/release build.
Evidence before trials: - Base release profile already has fat LTO, codegen-units=1, strip=true, panic=abort. Production device_auth.rs uses FutureExt::catch_unwind for audit failure and Tokio task panics; abort cannot exercise those recovery paths. Do not introduce abort as a new optimization; test unwind as a candidate and report its size cost. Cargo documents that tests and benchmarks ignore panic strategy: https://doc.rust-lang.org/cargo/reference/profiles.html#panic - Tokio 1.53.1 default feature set is empty; SQLx 0.8.6 is already default-features=false with SQLite only; Bollard and Reqwest are already default-features=false. Axum forms and OriginalUri have no use in workspace source; MatchedPath, Json and Query are used. - OpenSSL is a direct dependency of locked webauthn-rs-core 0.5.4, with no provider selector: https://docs.rs/crate/webauthn-rs-core/0.5.4/source/Cargo.toml . Keep attestation verification unchanged. A single crypto provider is not achievable through the allowed feature-only change. rcgen additionally brings ring, so the actual graph has OpenSSL, AWS-LC and ring. - Shared load5 rose above 13 and concurrent verify runs are active. Heavy work waits for load5 <= 6 and no active verify/release build.
Author
Owner

lp-supply targeted verification on 6896994 (base 6f6fd89):

  • Fixed generated Markdown whitespace only; no license wording changed. Two regeneration runs produce identical output (SHA256 f8e0586d1ea7e28ebea59aa0b5bd5fbcf2dc8ad9d524648594f174342efac284). git diff --check 6f6fd89 and bash -n scripts/check-supply-chain scripts/verify pass.
  • Real cargo-deny + private empty advisory cache + unreachable https://localhost:1/advisory-db: refresh failure and unavailable-cache warnings, exit 0. Shared advisory cache untouched.
  • Injected fetch outage + real cached cargo-deny check: RSA vulnerability remains blocking (exit 4; RUSTSEC-2023-0071).
  • Real cargo-deny fixture tests: MIT accepted (exit 0), LicenseRef-Proprietary rejected (exit 4), no license rejected (exit 4).
  • Real Bun audit: cookie@0.6.0 through SvelteKit reports GHSA-pxg6-pf52-xh8x, 1 low vulnerability; wrapper exits 0 as required.

Final fast/merge are waiting for other verify runs to finish and load5 <=6. Evidence is in the worktree target/lp-supply-evidence/; no dependency upgrades or policy exceptions added.

lp-supply targeted verification on `6896994` (base `6f6fd89`): - Fixed generated Markdown whitespace only; no license wording changed. Two regeneration runs produce identical output (SHA256 `f8e0586d1ea7e28ebea59aa0b5bd5fbcf2dc8ad9d524648594f174342efac284`). `git diff --check 6f6fd89` and `bash -n scripts/check-supply-chain scripts/verify` pass. - Real cargo-deny + private empty advisory cache + unreachable `https://localhost:1/advisory-db`: refresh failure and unavailable-cache warnings, exit 0. Shared advisory cache untouched. - Injected fetch outage + real cached cargo-deny check: RSA vulnerability remains blocking (exit 4; RUSTSEC-2023-0071). - Real cargo-deny fixture tests: MIT accepted (exit 0), LicenseRef-Proprietary rejected (exit 4), no license rejected (exit 4). - Real Bun audit: cookie@0.6.0 through SvelteKit reports GHSA-pxg6-pf52-xh8x, 1 low vulnerability; wrapper exits 0 as required. Final fast/merge are waiting for other verify runs to finish and load5 <=6. Evidence is in the worktree `target/lp-supply-evidence/`; no dependency upgrades or policy exceptions added.
Author
Owner

Continuation review fixes committed: 53c022c retains coalesced final benchmark output; 9e22bb0 replaces the signal fixture sleep with an input gate and addresses fixture include attributes; ea3b328 preserves the shared fixture wrapper for benchmark consumers without editing files outside ownership. Embedded Python script parses and git diff --check passes. Full Rust compilation remains pending while other scripts/verify runs are active and load5 is above 6. Python pidfd API checked against https://docs.python.org/3/library/os.html#os.pidfd_open .

Continuation review fixes committed: 53c022c retains coalesced final benchmark output; 9e22bb0 replaces the signal fixture sleep with an input gate and addresses fixture include attributes; ea3b328 preserves the shared fixture wrapper for benchmark consumers without editing files outside ownership. Embedded Python script parses and git diff --check passes. Full Rust compilation remains pending while other scripts/verify runs are active and load5 is above 6. Python pidfd API checked against https://docs.python.org/3/library/os.html#os.pidfd_open .
Author
Owner

Draft measurements reuse the existing real Chromium paced-source benchmark for echo/log throughput; its loaded RSS remains the existing conservative whole-harness VmHWM, not standalone server RSS. Added explicit dev baseline +10% evaluator with zero-only lifecycle gates; 5 Node evaluator/process tests pass, JS/bash syntax checks pass. Full builds are waiting for load1 ≤10 (currently 10.13; load5 14.73). Browser helpers are not exported by browser-check.mjs, so narrow setup follows their passkey/fixture pattern; importing that executable would run the full browser matrix. Allocation APIs checked against https://docs.rs/stats_alloc/0.1.10/stats_alloc/struct.Stats.html and Chromium measurements against https://chromedevtools.github.io/devtools-protocol/tot/HeapProfiler/ and https://chromedevtools.github.io/devtools-protocol/tot/SystemInfo/.

Draft measurements reuse the existing real Chromium paced-source benchmark for echo/log throughput; its loaded RSS remains the existing conservative whole-harness VmHWM, not standalone server RSS. Added explicit dev baseline +10% evaluator with zero-only lifecycle gates; 5 Node evaluator/process tests pass, JS/bash syntax checks pass. Full builds are waiting for load1 ≤10 (currently 10.13; load5 14.73). Browser helpers are not exported by browser-check.mjs, so narrow setup follows their passkey/fixture pattern; importing that executable would run the full browser matrix. Allocation APIs checked against https://docs.rs/stats_alloc/0.1.10/stats_alloc/struct.Stats.html and Chromium measurements against https://chromedevtools.github.io/devtools-protocol/tot/HeapProfiler/ and https://chromedevtools.github.io/devtools-protocol/tot/SystemInfo/.
Author
Owner

Completed docs-only scope-v01 on branch scope-v01, base 6f6fd896214f05d9ef19a47e43fb8be2561ab626, head c74a3890af5efd5f0dc1e5da42321f72220b9c66. Committed locally; not pushed.

  • Added dated DECISIONS §24 recording all nine owner-approved decisions. Remote Docker/Podman and reachable SSH parity is in v0.0.1 for the embedded and every enrolled remote infraternal agent, through one signed provider path.
  • Rewrote the active PLAN scope and ordered steps from proposal §4; steps 11–13 are deferred. Preserved the earlier scope/steps as superseded history and pointed current lane ownership at the approved table.
  • Recorded compile-time first-party Rust providers, deferred OIDC/Kubernetes/LXC/Proxmox and resource domains, the cut of dynamic third-party plugins, direct TLS 1.3 mTLS/L4 passthrough on o2, and the adopted failing performance table with one perf-test-VM calibration.
  • Copied lp-roadmap:docs/research/roadmap-2026-10.md byte-for-byte. The dated decision explicitly supersedes its historical v0.1/local-only recommendation. CLAUDE.md has no scope list, so it needed no pointer edit.

Docs checks passed: new-section-only DECISIONS edit, exact proposal copy, preservation of historical scope/step text, all 13 approved steps present with 11–13 deferred, and git diff --check. Worktree clean; progress.md excluded and uncommitted.

First scripts/verify fast attempt exited 101 in cargo test. The gate printed only compilation lines (first 240 lines), so the underlying cause is unknown. This is not proof of a test assertion failure. Exact stage-output excerpt:

WARN load5=9.25 exceeds online CPU count=8; timing-sensitive checks may be delayed
PASS fast: migrations are append-only (0.196s)
PASS fast: workspace package dependencies (0.205s)
PASS fast: JavaScript dependencies (8.332s)
PASS fast: build web app (20.186s)
PASS fast: cargo fmt --check (1.246s)
PASS fast: cargo clippy (247.044s)
FAIL fast: cargo test (97.063s)

Reran scripts/verify fast without source changes; exit 0. Exact complete gate output:

WARN load5=16.32 exceeds online CPU count=8; timing-sensitive checks may be delayed
PASS fast: migrations are append-only (0.187s)
PASS fast: workspace package dependencies (0.213s)
PASS fast: JavaScript dependencies (0.006s)
PASS fast: build web app (12.875s)
PASS fast: cargo fmt --check (1.088s)
PASS fast: cargo clippy (13.725s)
PASS fast: cargo test (60.838s)
PASS fast: svelte-check (12.538s)
PASS fast: UI package svelte-check (5.186s)
PASS fast: stream package typecheck (4.267s)
PASS fast: Vitest (3.312s)
PASS fast: UI package Vitest (9.785s)
PASS fast: stream package Vitest (0.995s)
PASS fast: OpenAPI and TypeScript client drift (52.311s)
PASS fast: terminal TypeScript (4.877s)
PASS fast: terminal Vitest (2.013s)

No integration/browser/bench run for this docs-only job. Performance calibration and enforcement implementation remain release-plan work; no new performance measurements are claimed. Independent review and merge verification remain with the orchestrator. Issues remain open.

Completed docs-only scope-v01 on branch `scope-v01`, base `6f6fd896214f05d9ef19a47e43fb8be2561ab626`, head `c74a3890af5efd5f0dc1e5da42321f72220b9c66`. Committed locally; not pushed. - Added dated DECISIONS §24 recording all nine owner-approved decisions. Remote Docker/Podman and reachable SSH parity is in v0.0.1 for the embedded and every enrolled remote infraternal agent, through one signed provider path. - Rewrote the active PLAN scope and ordered steps from proposal §4; steps 11–13 are deferred. Preserved the earlier scope/steps as superseded history and pointed current lane ownership at the approved table. - Recorded compile-time first-party Rust providers, deferred OIDC/Kubernetes/LXC/Proxmox and resource domains, the cut of dynamic third-party plugins, direct TLS 1.3 mTLS/L4 passthrough on o2, and the adopted failing performance table with one perf-test-VM calibration. - Copied `lp-roadmap:docs/research/roadmap-2026-10.md` byte-for-byte. The dated decision explicitly supersedes its historical v0.1/local-only recommendation. CLAUDE.md has no scope list, so it needed no pointer edit. Docs checks passed: new-section-only DECISIONS edit, exact proposal copy, preservation of historical scope/step text, all 13 approved steps present with 11–13 deferred, and `git diff --check`. Worktree clean; progress.md excluded and uncommitted. First `scripts/verify fast` attempt exited 101 in cargo test. The gate printed only compilation lines (first 240 lines), so the underlying cause is unknown. This is not proof of a test assertion failure. Exact stage-output excerpt: ```text WARN load5=9.25 exceeds online CPU count=8; timing-sensitive checks may be delayed PASS fast: migrations are append-only (0.196s) PASS fast: workspace package dependencies (0.205s) PASS fast: JavaScript dependencies (8.332s) PASS fast: build web app (20.186s) PASS fast: cargo fmt --check (1.246s) PASS fast: cargo clippy (247.044s) FAIL fast: cargo test (97.063s) ``` Reran `scripts/verify fast` without source changes; exit 0. Exact complete gate output: ```text WARN load5=16.32 exceeds online CPU count=8; timing-sensitive checks may be delayed PASS fast: migrations are append-only (0.187s) PASS fast: workspace package dependencies (0.213s) PASS fast: JavaScript dependencies (0.006s) PASS fast: build web app (12.875s) PASS fast: cargo fmt --check (1.088s) PASS fast: cargo clippy (13.725s) PASS fast: cargo test (60.838s) PASS fast: svelte-check (12.538s) PASS fast: UI package svelte-check (5.186s) PASS fast: stream package typecheck (4.267s) PASS fast: Vitest (3.312s) PASS fast: UI package Vitest (9.785s) PASS fast: stream package Vitest (0.995s) PASS fast: OpenAPI and TypeScript client drift (52.311s) PASS fast: terminal TypeScript (4.877s) PASS fast: terminal Vitest (2.013s) ``` No integration/browser/bench run for this docs-only job. Performance calibration and enforcement implementation remain release-plan work; no new performance measurements are claimed. Independent review and merge verification remain with the orchestrator. Issues remain open.
Author
Owner

lp-supply finished implementation and the requested gate attempts. Branch lp-supply, base 6f6fd896214f05d9ef19a47e43fb8be2561ab626, head 6896994dfc951585905dffb626f0b270c847f922. Commits: 31bca56 supply checks/notices; 6896994 generated-whitespace fix. Only the four owned paths changed. Worktree clean; no dependency upgrades; not pushed.

Pinned cargo-deny 0.20.2 installs with cargo install --locked and is cached under Cargo's install root. The fast stage enforces Rust advisories and the closed license allow list, retains cached advisory checking after refresh failures, warns when neither live nor cached advisory data can be checked, and reports Bun audit findings without failing for them. Generator inventory: 95 frontend dependency packages, 179 checked-in shadcn-svelte files, 3 calternal provenance-marked files, 66 distinct license texts. This follows declared frontend dependency reachability (a conservative inventory, including package-declared peers), rather than a tree-shaken bundle attribution. Calternal discovery relies on checked-in provenance markers.

Targeted checks passed: real cargo-deny with private empty DB cache/unreachable localhost fetch warns and exits 0; injected refresh outage plus real cached RSA check still fails; real MIT fixture accepted, unknown and unlicensed fixtures rejected; real Bun cookie audit wrapper exits 0; two notices generations are identical with license wording preserved; bash syntax, ShellCheck with sources, and git whitespace checks pass.

Current findings and recommended follow-ups (no fixes applied in this lane):

  • RUSTSEC-2023-0071, rsa 0.10.0-rc.18 through russh 0.63.3: no patched version exists. Disable russh's default RSA feature while retaining the required crypto backend/compression, then verify real SSH behavior; follow RustCrypto/RSA#626. RustSec, russh manifest.
  • yoke-derive 0.8.3 is yanked (warning): update this package and verify the resulting lockfile.
  • webpki-root-certs 1.0.9, webpki-roots 0.26.11 and webpki-roots 1.0.9 use CDLA-Permissive-2.0, which is rejected by the policy. Explicitly approve this data license and retain its agreement text, or replace the trust-root source under the selected policy. CDLA terms.
  • cookie@0.6.0 via @sveltejs/kit@2.70.3: one low GHSA-pxg6-pf52-xh8x. Kit's installed manifest specifies ^0.6.0, excluding patched 0.7.0; update Kit when it permits a patched cookie, or apply a tested override. Advisory.

Final gates are not green: both terminate at the new supply-chain stage because of the RSA advisory and three license rejections. They finish before compiling or running heavy/browser tests; the VM load warning is retained below. These brief checks ran at nice 19 while other jobs were active; no heavy workload was started. Later gate stages remain unverified on this branch.

Exact scripts/verify fast output (exit 1):

WARN load5=12.75 exceeds online CPU count=8; timing-sensitive checks may be delayed
PASS fast: migrations are append-only (0.180s)
PASS fast: workspace package dependencies (0.220s)
PASS fast: JavaScript dependencies (0.155s)
FAIL fast: supply-chain checks (4.278s)
SUPPLY_CHAIN cargo-deny: cargo-deny 0.20.2
SUPPLY_CHAIN_NOTICES generated THIRD_PARTY_NOTICES.md from 95 frontend packages
SUPPLY_CHAIN_NOTICES copied source: 179 shadcn files, 3 calternal-derived files
SUPPLY_CHAIN_NOTICES license files: 66 distinct texts; 0 packages need manual license review
error[vulnerability]: Marvin Attack: potential key recovery through timing sidechannels
    ┌─ /mnt/hdd/infraternal/wt-lp/lp-supply/Cargo.lock:337:1
    │
337 │ rsa 0.10.0-rc.18 registry+https://github.com/rust-lang/crates.io-index
    │ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ security vulnerability detected
    │
    ├ ID: RUSTSEC-2023-0071
    ├ Advisory: https://rustsec.org/advisories/RUSTSEC-2023-0071
    ├ ### Impact
      Due to a non-constant-time implementation, information about the private key is leaked through timing information which is observable over the network. An attacker may be able to use that information to recover the key.
      
      ### Patches
      No patch is yet available. The crypto-bigint migration ([RustCrypto/RSA#394](https://github.com/RustCrypto/RSA/pull/394)) did not close this. Tracking is [RustCrypto/RSA#626](https://github.com/RustCrypto/RSA/issues/626) (padding still not constant-time). Implicit rejection work is in [RustCrypto/RSA#680](https://github.com/RustCrypto/RSA/pull/680); default-path blinding is in [RustCrypto/RSA#702](https://github.com/RustCrypto/RSA/pull/702).
      
      Still affected as of 2026-09-12: rsa 0.9.10 (latest stable) and rsa 0.10.0-rc.18 (latest). `patched = []` is intentional.
      
      ### Workarounds
      Avoid using the `rsa` crate in settings where attackers can observe timing, for example over the network. Local use on a non-compromised computer is fine.
      
      ### References
      This vulnerability was discovered as part of the "[Marvin Attack]", which revealed several implementations of RSA including OpenSSL had not properly mitigated timing sidechannel attacks.
      
      [Marvin Attack]: https://people.redhat.com/~hkario/marvin/
    ├ Announcement: https://github.com/RustCrypto/RSA/issues/626
    ├ Solution: No safe upgrade is available!

warning[yanked]: detected yanked crate (try `cargo update -p yoke-derive`)
    ┌─ /mnt/hdd/infraternal/wt-lp/lp-supply/Cargo.lock:529:1
    │
529 │ yoke-derive 0.8.3 registry+https://github.com/rust-lang/crates.io-index
    │ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ yanked version

advisories FAILED
error[rejected]: failed to satisfy license requirements
   ┌─ /home/kayg/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/webpki-root-certs-1.0.9/Cargo.toml:26:12
   │
26 │ license = "CDLA-Permissive-2.0"
   │            ━━━━━━━━━━━━━━━━━━━
   │            │
   │            rejected: license is not explicitly allowed
   │
   ├ CDLA-Permissive-2.0 - Community Data License Agreement Permissive 2.0:
   ├   - No additional metadata available for license

error[rejected]: failed to satisfy license requirements
   ┌─ /home/kayg/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/webpki-roots-0.26.11/Cargo.toml:25:12
   │
25 │ license = "CDLA-Permissive-2.0"
   │            ━━━━━━━━━━━━━━━━━━━
   │            │
   │            rejected: license is not explicitly allowed
   │
   ├ CDLA-Permissive-2.0 - Community Data License Agreement Permissive 2.0:
   ├   - No additional metadata available for license

error[rejected]: failed to satisfy license requirements
   ┌─ /home/kayg/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/webpki-roots-1.0.9/Cargo.toml:26:12
   │
26 │ license = "CDLA-Permissive-2.0"
   │            ━━━━━━━━━━━━━━━━━━━
   │            │
   │            rejected: license is not explicitly allowed
   │
   ├ CDLA-Permissive-2.0 - Community Data License Agreement Permissive 2.0:
   ├   - No additional metadata available for license

licenses FAILED
bun audit v1.4.2 (744846f84)

cookie@0.6.0
  workspace:@infraternal/web > @sveltejs/kit > cookie
  low: cookie accepts cookie name, path, and domain with out of bounds characters (<0.7.0) - https://github.com/advisories/GHSA-pxg6-pf52-xh8x

1 vulnerability (1 low)

  bun audit fix           upgrade the vulnerable packages within their ranges
  bun audit fix --latest  also cross major versions
SUPPLY_CHAIN_BUN_AUDIT findings reported; this check is report-only
SUPPLY_CHAIN_FAIL Rust advisory or license policy check failed
FAST_EXIT=1

Exact scripts/verify merge output (exit 1):

WARN load5=12.66 exceeds online CPU count=8; timing-sensitive checks may be delayed
PASS fast: migrations are append-only (0.206s)
PASS fast: workspace package dependencies (0.245s)
PASS fast: JavaScript dependencies (0.006s)
FAIL fast: supply-chain checks (5.408s)
SUPPLY_CHAIN cargo-deny: cargo-deny 0.20.2
SUPPLY_CHAIN_NOTICES generated THIRD_PARTY_NOTICES.md from 95 frontend packages
SUPPLY_CHAIN_NOTICES copied source: 179 shadcn files, 3 calternal-derived files
SUPPLY_CHAIN_NOTICES license files: 66 distinct texts; 0 packages need manual license review
error[vulnerability]: Marvin Attack: potential key recovery through timing sidechannels
    ┌─ /mnt/hdd/infraternal/wt-lp/lp-supply/Cargo.lock:337:1
    │
337 │ rsa 0.10.0-rc.18 registry+https://github.com/rust-lang/crates.io-index
    │ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ security vulnerability detected
    │
    ├ ID: RUSTSEC-2023-0071
    ├ Advisory: https://rustsec.org/advisories/RUSTSEC-2023-0071
    ├ ### Impact
      Due to a non-constant-time implementation, information about the private key is leaked through timing information which is observable over the network. An attacker may be able to use that information to recover the key.
      
      ### Patches
      No patch is yet available. The crypto-bigint migration ([RustCrypto/RSA#394](https://github.com/RustCrypto/RSA/pull/394)) did not close this. Tracking is [RustCrypto/RSA#626](https://github.com/RustCrypto/RSA/issues/626) (padding still not constant-time). Implicit rejection work is in [RustCrypto/RSA#680](https://github.com/RustCrypto/RSA/pull/680); default-path blinding is in [RustCrypto/RSA#702](https://github.com/RustCrypto/RSA/pull/702).
      
      Still affected as of 2026-09-12: rsa 0.9.10 (latest stable) and rsa 0.10.0-rc.18 (latest). `patched = []` is intentional.
      
      ### Workarounds
      Avoid using the `rsa` crate in settings where attackers can observe timing, for example over the network. Local use on a non-compromised computer is fine.
      
      ### References
      This vulnerability was discovered as part of the "[Marvin Attack]", which revealed several implementations of RSA including OpenSSL had not properly mitigated timing sidechannel attacks.
      
      [Marvin Attack]: https://people.redhat.com/~hkario/marvin/
    ├ Announcement: https://github.com/RustCrypto/RSA/issues/626
    ├ Solution: No safe upgrade is available!

warning[yanked]: detected yanked crate (try `cargo update -p yoke-derive`)
    ┌─ /mnt/hdd/infraternal/wt-lp/lp-supply/Cargo.lock:529:1
    │
529 │ yoke-derive 0.8.3 registry+https://github.com/rust-lang/crates.io-index
    │ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ yanked version

advisories FAILED
error[rejected]: failed to satisfy license requirements
   ┌─ /home/kayg/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/webpki-root-certs-1.0.9/Cargo.toml:26:12
   │
26 │ license = "CDLA-Permissive-2.0"
   │            ━━━━━━━━━━━━━━━━━━━
   │            │
   │            rejected: license is not explicitly allowed
   │
   ├ CDLA-Permissive-2.0 - Community Data License Agreement Permissive 2.0:
   ├   - No additional metadata available for license

error[rejected]: failed to satisfy license requirements
   ┌─ /home/kayg/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/webpki-roots-0.26.11/Cargo.toml:25:12
   │
25 │ license = "CDLA-Permissive-2.0"
   │            ━━━━━━━━━━━━━━━━━━━
   │            │
   │            rejected: license is not explicitly allowed
   │
   ├ CDLA-Permissive-2.0 - Community Data License Agreement Permissive 2.0:
   ├   - No additional metadata available for license

error[rejected]: failed to satisfy license requirements
   ┌─ /home/kayg/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/webpki-roots-1.0.9/Cargo.toml:26:12
   │
26 │ license = "CDLA-Permissive-2.0"
   │            ━━━━━━━━━━━━━━━━━━━
   │            │
   │            rejected: license is not explicitly allowed
   │
   ├ CDLA-Permissive-2.0 - Community Data License Agreement Permissive 2.0:
   ├   - No additional metadata available for license

licenses FAILED
bun audit v1.4.2 (744846f84)

cookie@0.6.0
  workspace:@infraternal/web > @sveltejs/kit > cookie
  low: cookie accepts cookie name, path, and domain with out of bounds characters (<0.7.0) - https://github.com/advisories/GHSA-pxg6-pf52-xh8x

1 vulnerability (1 low)

  bun audit fix           upgrade the vulnerable packages within their ranges
  bun audit fix --latest  also cross major versions
SUPPLY_CHAIN_BUN_AUDIT findings reported; this check is report-only
SUPPLY_CHAIN_FAIL Rust advisory or license policy check failed
MERGE_EXIT=1

Local evidence: target/lp-supply-evidence/. Independent review and any decision to resolve/accept the current dependency findings remain with the orchestrator; this branch is not ready for a green-gate merge.

lp-supply finished implementation and the requested gate attempts. Branch `lp-supply`, base `6f6fd896214f05d9ef19a47e43fb8be2561ab626`, head `6896994dfc951585905dffb626f0b270c847f922`. Commits: `31bca56` supply checks/notices; `6896994` generated-whitespace fix. Only the four owned paths changed. Worktree clean; no dependency upgrades; not pushed. Pinned cargo-deny 0.20.2 installs with `cargo install --locked` and is cached under Cargo's install root. The fast stage enforces Rust advisories and the closed license allow list, retains cached advisory checking after refresh failures, warns when neither live nor cached advisory data can be checked, and reports Bun audit findings without failing for them. Generator inventory: 95 frontend dependency packages, 179 checked-in shadcn-svelte files, 3 calternal provenance-marked files, 66 distinct license texts. This follows declared frontend dependency reachability (a conservative inventory, including package-declared peers), rather than a tree-shaken bundle attribution. Calternal discovery relies on checked-in provenance markers. Targeted checks passed: real cargo-deny with private empty DB cache/unreachable localhost fetch warns and exits 0; injected refresh outage plus real cached RSA check still fails; real MIT fixture accepted, unknown and unlicensed fixtures rejected; real Bun cookie audit wrapper exits 0; two notices generations are identical with license wording preserved; bash syntax, ShellCheck with sources, and git whitespace checks pass. Current findings and recommended follow-ups (no fixes applied in this lane): - `RUSTSEC-2023-0071`, `rsa 0.10.0-rc.18` through `russh 0.63.3`: no patched version exists. Disable russh's default RSA feature while retaining the required crypto backend/compression, then verify real SSH behavior; follow RustCrypto/RSA#626. [RustSec](https://rustsec.org/advisories/RUSTSEC-2023-0071.html), [russh manifest](https://docs.rs/crate/russh/0.63.3/source/Cargo.toml). - `yoke-derive 0.8.3` is yanked (warning): update this package and verify the resulting lockfile. - `webpki-root-certs 1.0.9`, `webpki-roots 0.26.11` and `webpki-roots 1.0.9` use `CDLA-Permissive-2.0`, which is rejected by the policy. Explicitly approve this data license and retain its agreement text, or replace the trust-root source under the selected policy. [CDLA terms](https://cdla.dev/permissive-2-0/). - `cookie@0.6.0` via `@sveltejs/kit@2.70.3`: one low GHSA-pxg6-pf52-xh8x. Kit's installed manifest specifies `^0.6.0`, excluding patched 0.7.0; update Kit when it permits a patched cookie, or apply a tested override. [Advisory](https://github.com/advisories/GHSA-pxg6-pf52-xh8x). Final gates are **not green**: both terminate at the new supply-chain stage because of the RSA advisory and three license rejections. They finish before compiling or running heavy/browser tests; the VM load warning is retained below. These brief checks ran at nice 19 while other jobs were active; no heavy workload was started. Later gate stages remain unverified on this branch. Exact `scripts/verify fast` output (exit 1): ```text WARN load5=12.75 exceeds online CPU count=8; timing-sensitive checks may be delayed PASS fast: migrations are append-only (0.180s) PASS fast: workspace package dependencies (0.220s) PASS fast: JavaScript dependencies (0.155s) FAIL fast: supply-chain checks (4.278s) SUPPLY_CHAIN cargo-deny: cargo-deny 0.20.2 SUPPLY_CHAIN_NOTICES generated THIRD_PARTY_NOTICES.md from 95 frontend packages SUPPLY_CHAIN_NOTICES copied source: 179 shadcn files, 3 calternal-derived files SUPPLY_CHAIN_NOTICES license files: 66 distinct texts; 0 packages need manual license review error[vulnerability]: Marvin Attack: potential key recovery through timing sidechannels ┌─ /mnt/hdd/infraternal/wt-lp/lp-supply/Cargo.lock:337:1 │ 337 │ rsa 0.10.0-rc.18 registry+https://github.com/rust-lang/crates.io-index │ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ security vulnerability detected │ ├ ID: RUSTSEC-2023-0071 ├ Advisory: https://rustsec.org/advisories/RUSTSEC-2023-0071 ├ ### Impact Due to a non-constant-time implementation, information about the private key is leaked through timing information which is observable over the network. An attacker may be able to use that information to recover the key. ### Patches No patch is yet available. The crypto-bigint migration ([RustCrypto/RSA#394](https://github.com/RustCrypto/RSA/pull/394)) did not close this. Tracking is [RustCrypto/RSA#626](https://github.com/RustCrypto/RSA/issues/626) (padding still not constant-time). Implicit rejection work is in [RustCrypto/RSA#680](https://github.com/RustCrypto/RSA/pull/680); default-path blinding is in [RustCrypto/RSA#702](https://github.com/RustCrypto/RSA/pull/702). Still affected as of 2026-09-12: rsa 0.9.10 (latest stable) and rsa 0.10.0-rc.18 (latest). `patched = []` is intentional. ### Workarounds Avoid using the `rsa` crate in settings where attackers can observe timing, for example over the network. Local use on a non-compromised computer is fine. ### References This vulnerability was discovered as part of the "[Marvin Attack]", which revealed several implementations of RSA including OpenSSL had not properly mitigated timing sidechannel attacks. [Marvin Attack]: https://people.redhat.com/~hkario/marvin/ ├ Announcement: https://github.com/RustCrypto/RSA/issues/626 ├ Solution: No safe upgrade is available! warning[yanked]: detected yanked crate (try `cargo update -p yoke-derive`) ┌─ /mnt/hdd/infraternal/wt-lp/lp-supply/Cargo.lock:529:1 │ 529 │ yoke-derive 0.8.3 registry+https://github.com/rust-lang/crates.io-index │ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ yanked version advisories FAILED error[rejected]: failed to satisfy license requirements ┌─ /home/kayg/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/webpki-root-certs-1.0.9/Cargo.toml:26:12 │ 26 │ license = "CDLA-Permissive-2.0" │ ━━━━━━━━━━━━━━━━━━━ │ │ │ rejected: license is not explicitly allowed │ ├ CDLA-Permissive-2.0 - Community Data License Agreement Permissive 2.0: ├ - No additional metadata available for license error[rejected]: failed to satisfy license requirements ┌─ /home/kayg/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/webpki-roots-0.26.11/Cargo.toml:25:12 │ 25 │ license = "CDLA-Permissive-2.0" │ ━━━━━━━━━━━━━━━━━━━ │ │ │ rejected: license is not explicitly allowed │ ├ CDLA-Permissive-2.0 - Community Data License Agreement Permissive 2.0: ├ - No additional metadata available for license error[rejected]: failed to satisfy license requirements ┌─ /home/kayg/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/webpki-roots-1.0.9/Cargo.toml:26:12 │ 26 │ license = "CDLA-Permissive-2.0" │ ━━━━━━━━━━━━━━━━━━━ │ │ │ rejected: license is not explicitly allowed │ ├ CDLA-Permissive-2.0 - Community Data License Agreement Permissive 2.0: ├ - No additional metadata available for license licenses FAILED bun audit v1.4.2 (744846f84) cookie@0.6.0 workspace:@infraternal/web > @sveltejs/kit > cookie low: cookie accepts cookie name, path, and domain with out of bounds characters (<0.7.0) - https://github.com/advisories/GHSA-pxg6-pf52-xh8x 1 vulnerability (1 low) bun audit fix upgrade the vulnerable packages within their ranges bun audit fix --latest also cross major versions SUPPLY_CHAIN_BUN_AUDIT findings reported; this check is report-only SUPPLY_CHAIN_FAIL Rust advisory or license policy check failed FAST_EXIT=1 ``` Exact `scripts/verify merge` output (exit 1): ```text WARN load5=12.66 exceeds online CPU count=8; timing-sensitive checks may be delayed PASS fast: migrations are append-only (0.206s) PASS fast: workspace package dependencies (0.245s) PASS fast: JavaScript dependencies (0.006s) FAIL fast: supply-chain checks (5.408s) SUPPLY_CHAIN cargo-deny: cargo-deny 0.20.2 SUPPLY_CHAIN_NOTICES generated THIRD_PARTY_NOTICES.md from 95 frontend packages SUPPLY_CHAIN_NOTICES copied source: 179 shadcn files, 3 calternal-derived files SUPPLY_CHAIN_NOTICES license files: 66 distinct texts; 0 packages need manual license review error[vulnerability]: Marvin Attack: potential key recovery through timing sidechannels ┌─ /mnt/hdd/infraternal/wt-lp/lp-supply/Cargo.lock:337:1 │ 337 │ rsa 0.10.0-rc.18 registry+https://github.com/rust-lang/crates.io-index │ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ security vulnerability detected │ ├ ID: RUSTSEC-2023-0071 ├ Advisory: https://rustsec.org/advisories/RUSTSEC-2023-0071 ├ ### Impact Due to a non-constant-time implementation, information about the private key is leaked through timing information which is observable over the network. An attacker may be able to use that information to recover the key. ### Patches No patch is yet available. The crypto-bigint migration ([RustCrypto/RSA#394](https://github.com/RustCrypto/RSA/pull/394)) did not close this. Tracking is [RustCrypto/RSA#626](https://github.com/RustCrypto/RSA/issues/626) (padding still not constant-time). Implicit rejection work is in [RustCrypto/RSA#680](https://github.com/RustCrypto/RSA/pull/680); default-path blinding is in [RustCrypto/RSA#702](https://github.com/RustCrypto/RSA/pull/702). Still affected as of 2026-09-12: rsa 0.9.10 (latest stable) and rsa 0.10.0-rc.18 (latest). `patched = []` is intentional. ### Workarounds Avoid using the `rsa` crate in settings where attackers can observe timing, for example over the network. Local use on a non-compromised computer is fine. ### References This vulnerability was discovered as part of the "[Marvin Attack]", which revealed several implementations of RSA including OpenSSL had not properly mitigated timing sidechannel attacks. [Marvin Attack]: https://people.redhat.com/~hkario/marvin/ ├ Announcement: https://github.com/RustCrypto/RSA/issues/626 ├ Solution: No safe upgrade is available! warning[yanked]: detected yanked crate (try `cargo update -p yoke-derive`) ┌─ /mnt/hdd/infraternal/wt-lp/lp-supply/Cargo.lock:529:1 │ 529 │ yoke-derive 0.8.3 registry+https://github.com/rust-lang/crates.io-index │ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ yanked version advisories FAILED error[rejected]: failed to satisfy license requirements ┌─ /home/kayg/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/webpki-root-certs-1.0.9/Cargo.toml:26:12 │ 26 │ license = "CDLA-Permissive-2.0" │ ━━━━━━━━━━━━━━━━━━━ │ │ │ rejected: license is not explicitly allowed │ ├ CDLA-Permissive-2.0 - Community Data License Agreement Permissive 2.0: ├ - No additional metadata available for license error[rejected]: failed to satisfy license requirements ┌─ /home/kayg/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/webpki-roots-0.26.11/Cargo.toml:25:12 │ 25 │ license = "CDLA-Permissive-2.0" │ ━━━━━━━━━━━━━━━━━━━ │ │ │ rejected: license is not explicitly allowed │ ├ CDLA-Permissive-2.0 - Community Data License Agreement Permissive 2.0: ├ - No additional metadata available for license error[rejected]: failed to satisfy license requirements ┌─ /home/kayg/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/webpki-roots-1.0.9/Cargo.toml:26:12 │ 26 │ license = "CDLA-Permissive-2.0" │ ━━━━━━━━━━━━━━━━━━━ │ │ │ rejected: license is not explicitly allowed │ ├ CDLA-Permissive-2.0 - Community Data License Agreement Permissive 2.0: ├ - No additional metadata available for license licenses FAILED bun audit v1.4.2 (744846f84) cookie@0.6.0 workspace:@infraternal/web > @sveltejs/kit > cookie low: cookie accepts cookie name, path, and domain with out of bounds characters (<0.7.0) - https://github.com/advisories/GHSA-pxg6-pf52-xh8x 1 vulnerability (1 low) bun audit fix upgrade the vulnerable packages within their ranges bun audit fix --latest also cross major versions SUPPLY_CHAIN_BUN_AUDIT findings reported; this check is report-only SUPPLY_CHAIN_FAIL Rust advisory or license policy check failed MERGE_EXIT=1 ``` Local evidence: `target/lp-supply-evidence/`. Independent review and any decision to resolve/accept the current dependency findings remain with the orchestrator; this branch is not ready for a green-gate merge.
Author
Owner

Starting fix-supply on lp-supply, base 6896994dfc951585905dffb626f0b270c847f922, worktree /mnt/hdd/infraternal/wt-lp/lp-supply. Scope: trace RSA dependency/features and private-key use; document reversible CDLA/RSA exceptions; enforce 30-day RSA review deadline; run fast and merge subject to shared-VM constraints. No push or nested delegation.

Starting fix-supply on `lp-supply`, base `6896994dfc951585905dffb626f0b270c847f922`, worktree `/mnt/hdd/infraternal/wt-lp/lp-supply`. Scope: trace RSA dependency/features and private-key use; document reversible CDLA/RSA exceptions; enforce 30-day RSA review deadline; run fast and merge subject to shared-VM constraints. No push or nested delegation.
Author
Owner

Progress at c3aa9f6: eight targeted Node tests pass; first scripts/verify fast is running with two Cargo workers. Completed real output:

WARN load5=13.83 exceeds online CPU count=8; timing-sensitive checks may be delayed
PASS fast: migrations are append-only (0.170s)
PASS fast: workspace package dependencies (0.233s)
PASS fast: JavaScript dependencies (2.753s)
PASS fast: build web app (18.156s)
PASS fast: cargo fmt --check (1.468s)
PASS fast: cargo clippy (336.434s)

Release/calibration work is waiting for load1 ≤10; latest observed load1/load5/load15 = 16.68/13.65/12.48. Merge waits for load5 <8 and no other scripts/verify run, as requested. I read the audit evidence already posted in this issue instead of accessing another job directory: the older f640461 audit measured 473,899 conditional-304 allocation bytes at 172 containers. That is historical context, not the current 500-container measurement.

Progress at `c3aa9f6`: eight targeted Node tests pass; first `scripts/verify fast` is running with two Cargo workers. Completed real output: ```text WARN load5=13.83 exceeds online CPU count=8; timing-sensitive checks may be delayed PASS fast: migrations are append-only (0.170s) PASS fast: workspace package dependencies (0.233s) PASS fast: JavaScript dependencies (2.753s) PASS fast: build web app (18.156s) PASS fast: cargo fmt --check (1.468s) PASS fast: cargo clippy (336.434s) ``` Release/calibration work is waiting for load1 ≤10; latest observed load1/load5/load15 = 16.68/13.65/12.48. Merge waits for load5 <8 and no other scripts/verify run, as requested. I read the audit evidence already posted in this issue instead of accessing another job directory: the older f640461 audit measured 473,899 conditional-304 allocation bytes at 172 containers. That is historical context, not the current 500-container measurement.
Author
Owner

Scheduling update: still waiting for the shared VM after ~20 minutes of continuation. Current load5=13.52, above this low-priority job's required <=6 threshold; other verify jobs have been active. Baseline prerequisite/build is queued locally and checks both load and active verify/release processes before starting. No tracked edits, no new gates or release builds started, no size claims made. Frozen JavaScript dependency install and required local code index are complete.

Scheduling update: still waiting for the shared VM after ~20 minutes of continuation. Current load5=13.52, above this low-priority job's required <=6 threshold; other verify jobs have been active. Baseline prerequisite/build is queued locally and checks both load and active verify/release processes before starting. No tracked edits, no new gates or release builds started, no size claims made. Frozen JavaScript dependency install and required local code index are complete.
Author
Owner

Verification scheduling blocker (continuation): no permitted build slot has opened in roughly 20 minutes. At 19:53 local (17:53 UTC), pgrep shows four bash scripts/verify fast runs and uptime reports load5 15.29. This job is obeying the no-overlap/load5 <= 6 rule, has started no heavy build, and has a waiting runner ready to start fast with nice 15 / two Cargo build jobs. Current head 9a55cb2 is committed and worktree clean. No Rust gate or 20-repeat pass count is claimed. A reserved slot from the orchestrator would allow the queued fast gate and subsequent repetitions/merge gate to proceed.

Verification scheduling blocker (continuation): no permitted build slot has opened in roughly 20 minutes. At 19:53 local (17:53 UTC), pgrep shows four bash scripts/verify fast runs and uptime reports load5 15.29. This job is obeying the no-overlap/load5 <= 6 rule, has started no heavy build, and has a waiting runner ready to start fast with nice 15 / two Cargo build jobs. Current head 9a55cb2 is committed and worktree clean. No Rust gate or 20-repeat pass count is claimed. A reserved slot from the orchestrator would allow the queued fast gate and subsequent repetitions/merge gate to proceed.
Author
Owner

Decision: RSA advisory RUSTSEC-2023-0071

Trace on lp-supply base 6896994: cargo tree -i rsa is ambiguous; the enabled dependency is rsa 0.10.0-rc.18, reached through russh 0.63.3 directly and ssh-key 0.7.0-rc.11. russh/default -> russh/rsa -> dep:rsa + ssh-key/rsa. rsa 0.9.10 is locked but has no enabled inverse tree even with --target all.

Generated infraternal agent SSH identities use Ed25519. Existing ssh_ed25519 files are parsed as unrestricted OpenSSH PrivateKey values (crates/ssh/src/keys.rs), then passed to authenticate_publickey (client.rs). Russh sign_with_hash_alg dispatches RSA identities to ssh-key's rsa::pkcs1v15::SigningKey::try_sign. Consequently RSA private signing is reachable for a pre-existing RSA identity; the default feature is not safely classified as unused. RSA host-key verification is also enabled, but uses public material. WebAuthn uses OpenSSL; command grants use ed25519-dalek. No claim that RSA signing is unaffected or safe.

Default implemented for owner review: ignore only RUSTSEC-2023-0071, accepted 2026-10-02, review 2026-11-01, local mandatory gate failure starting 2026-11-02 UTC. Six targeted tests cover deadline boundaries, removal, malformed/duplicate dates, periods exceeding 30 days, future acceptance, bare ignores and CLI failure. Metadata lives in deny.toml's reason, so removal is one reversible edit. The local check runs before network-dependent checks.

Owner options:

  1. Keep the ignore, explicitly accept the reachable RSA signing risk and renew the dated review window.
  2. Disable RSA SSH keys, constrain loaded identity algorithms and turn off russh's RSA feature while retaining aws-lc-rs/flate2; decide RSA host-key compatibility and verify against real sshd.
  3. Switch to a non-vulnerable implementation, with real SSH signing/host-key verification. RustSec currently lists no patched RustCrypto rsa version.

Sources: RustSec advisory, russh manifest, russh signing dispatch, ssh-key signer, cargo-deny ignore configuration. Exact locked crate sources were inspected locally. Cargo-deny's duration expiry is relative to advisory publication, so the calendar review deadline is enforced separately.

CDLA default: allow CDLA-Permissive-2.0 for webpki-root-certs 1.0.9, webpki-roots 0.26.11 and webpki-roots 1.0.9. docs/supply-chain-exceptions.md includes the full agreement from the locked crate and reversal instructions. Agreement.

Full gates pending: VM load5 is 15.11 and other verify processes are active. Waiting to satisfy the requested shared-VM gate constraints; no unrelated process has been signalled or job files accessed.

## Decision: RSA advisory RUSTSEC-2023-0071 Trace on `lp-supply` base `6896994`: `cargo tree -i rsa` is ambiguous; the enabled dependency is `rsa 0.10.0-rc.18`, reached through `russh 0.63.3` directly and `ssh-key 0.7.0-rc.11`. `russh/default -> russh/rsa -> dep:rsa + ssh-key/rsa`. `rsa 0.9.10` is locked but has no enabled inverse tree even with `--target all`. Generated infraternal agent SSH identities use Ed25519. Existing `ssh_ed25519` files are parsed as unrestricted OpenSSH `PrivateKey` values (`crates/ssh/src/keys.rs`), then passed to `authenticate_publickey` (`client.rs`). Russh `sign_with_hash_alg` dispatches RSA identities to ssh-key's `rsa::pkcs1v15::SigningKey::try_sign`. Consequently RSA private signing is reachable for a pre-existing RSA identity; the default feature is not safely classified as unused. RSA host-key verification is also enabled, but uses public material. WebAuthn uses OpenSSL; command grants use ed25519-dalek. No claim that RSA signing is unaffected or safe. Default implemented for owner review: ignore only RUSTSEC-2023-0071, accepted **2026-10-02**, review **2026-11-01**, local mandatory gate failure starting **2026-11-02 UTC**. Six targeted tests cover deadline boundaries, removal, malformed/duplicate dates, periods exceeding 30 days, future acceptance, bare ignores and CLI failure. Metadata lives in deny.toml's reason, so removal is one reversible edit. The local check runs before network-dependent checks. Owner options: 1. **Keep the ignore**, explicitly accept the reachable RSA signing risk and renew the dated review window. 2. **Disable RSA SSH keys**, constrain loaded identity algorithms and turn off russh's RSA feature while retaining `aws-lc-rs`/`flate2`; decide RSA host-key compatibility and verify against real sshd. 3. **Switch to a non-vulnerable implementation**, with real SSH signing/host-key verification. RustSec currently lists no patched RustCrypto rsa version. Sources: [RustSec advisory](https://rustsec.org/advisories/RUSTSEC-2023-0071.html), [russh manifest](https://docs.rs/crate/russh/0.63.3/source/Cargo.toml), [russh signing dispatch](https://docs.rs/crate/russh/0.63.3/source/src/helpers.rs), [ssh-key signer](https://docs.rs/crate/ssh-key/0.7.0-rc.11/source/src/signature.rs), [cargo-deny ignore configuration](https://embarkstudios.github.io/cargo-deny/checks/advisories/cfg.html#ignore). Exact locked crate sources were inspected locally. Cargo-deny's duration expiry is relative to advisory publication, so the calendar review deadline is enforced separately. CDLA default: allow CDLA-Permissive-2.0 for `webpki-root-certs 1.0.9`, `webpki-roots 0.26.11` and `webpki-roots 1.0.9`. `docs/supply-chain-exceptions.md` includes the full agreement from the locked crate and reversal instructions. [Agreement](https://cdla.dev/permissive-2-0/). Full gates pending: VM load5 is 15.11 and other verify processes are active. Waiting to satisfy the requested shared-VM gate constraints; no unrelated process has been signalled or job files accessed.
Author
Owner

First fast invocation completed all checks, but the runner exited after them with a shell EOF error caused by editing scripts/verify in place during execution. Current bash -n scripts/verify passes; I will rerun without editing the runner while active. This first invocation is not a passing gate. Exact output:

WARN load5=13.83 exceeds online CPU count=8; timing-sensitive checks may be delayed
PASS fast: migrations are append-only (0.170s)
PASS fast: workspace package dependencies (0.233s)
PASS fast: JavaScript dependencies (2.753s)
PASS fast: build web app (18.156s)
PASS fast: cargo fmt --check (1.468s)
PASS fast: cargo clippy (336.434s)
PASS fast: cargo test (256.527s)
PASS fast: svelte-check (24.389s)
PASS fast: UI package svelte-check (10.516s)
PASS fast: stream package typecheck (9.264s)
PASS fast: Vitest (8.419s)
PASS fast: UI package Vitest (14.830s)
PASS fast: stream package Vitest (1.910s)
PASS fast: OpenAPI and TypeScript client drift (79.977s)
PASS fast: terminal TypeScript (3.219s)
PASS fast: terminal Vitest (1.657s)
scripts/verify: line 815: unexpected EOF while looking for matching `"'
First fast invocation completed all checks, but the runner exited after them with a shell EOF error caused by editing scripts/verify in place during execution. Current `bash -n scripts/verify` passes; I will rerun without editing the runner while active. This first invocation is not a passing gate. Exact output: ```text WARN load5=13.83 exceeds online CPU count=8; timing-sensitive checks may be delayed PASS fast: migrations are append-only (0.170s) PASS fast: workspace package dependencies (0.233s) PASS fast: JavaScript dependencies (2.753s) PASS fast: build web app (18.156s) PASS fast: cargo fmt --check (1.468s) PASS fast: cargo clippy (336.434s) PASS fast: cargo test (256.527s) PASS fast: svelte-check (24.389s) PASS fast: UI package svelte-check (10.516s) PASS fast: stream package typecheck (9.264s) PASS fast: Vitest (8.419s) PASS fast: UI package Vitest (14.830s) PASS fast: stream package Vitest (1.910s) PASS fast: OpenAPI and TypeScript client drift (79.977s) PASS fast: terminal TypeScript (3.219s) PASS fast: terminal Vitest (1.657s) scripts/verify: line 815: unexpected EOF while looking for matching `"' ```
Author
Owner

Second fast run failed in the unchanged engine global-allocator regression test. The test source (crates/engine/src/logs.rs:343-351) explicitly allows <100 allocations for parallel-test noise; this shared-VM run observed 172. The exact same compiled test passed with one test thread:

running 1 test
test logs::tests::steady_state_framing_does_not_allocate_per_chunk ... ok

test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 19 filtered out; finished in 0.01s

Next fast/merge invocation will use RUST_TEST_THREADS=1 to prevent overlap within the global-counter test binary, without changing any product or test files. Native/glibc measurement counter now covers native SQLite/OpenSSL allocations too, not only Rust allocations; C semantics/self-test and eight Node tests pass. Reference: https://sourceware.org/glibc/manual/latest/html_node/Replacing-malloc.html.

Second fast run failed in the unchanged engine global-allocator regression test. The test source (crates/engine/src/logs.rs:343-351) explicitly allows <100 allocations for parallel-test noise; this shared-VM run observed 172. The exact same compiled test passed with one test thread: ```text running 1 test test logs::tests::steady_state_framing_does_not_allocate_per_chunk ... ok test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 19 filtered out; finished in 0.01s ``` Next fast/merge invocation will use RUST_TEST_THREADS=1 to prevent overlap within the global-counter test binary, without changing any product or test files. Native/glibc measurement counter now covers native SQLite/OpenSSL allocations too, not only Rust allocations; C semantics/self-test and eight Node tests pass. Reference: https://sourceware.org/glibc/manual/latest/html_node/Replacing-malloc.html.
Author
Owner

Implementation committed on lp-supply: 0909f91aa221def0755be41316b9237fa9b6e820 (no push). Working tree clean. Code graph impact against 6896994 identifies only the six owned policy/docs/verification files; no runtime code changes.

Targeted nice -n 19 scripts/check-supply-chain exited 0 with real refreshed RustSec data and real cargo-deny licenses. Exact output:

SUPPLY_CHAIN_REVIEWS advisory exceptions are within their review windows
SUPPLY_CHAIN cargo-deny: cargo-deny 0.20.2
SUPPLY_CHAIN_NOTICES generated THIRD_PARTY_NOTICES.md from 95 frontend packages
SUPPLY_CHAIN_NOTICES copied source: 179 shadcn files, 3 calternal-derived files
SUPPLY_CHAIN_NOTICES license files: 66 distinct texts; 0 packages need manual license review
warning[yanked]: detected yanked crate (try `cargo update -p yoke-derive`)
    ┌─ /mnt/hdd/infraternal/wt-lp/lp-supply/Cargo.lock:529:1
    │
529 │ yoke-derive 0.8.3 registry+https://github.com/rust-lang/crates.io-index
    │ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ yanked version

advisories ok
SUPPLY_CHAIN_RUST_ADVISORIES passed with refreshed advisory data
licenses ok
SUPPLY_CHAIN_RUST_LICENSES passed
bun audit v1.4.2 (744846f84)

cookie@0.6.0
  workspace:@infraternal/web > @sveltejs/kit > cookie
  low: cookie accepts cookie name, path, and domain with out of bounds characters (<0.7.0) - https://github.com/advisories/GHSA-pxg6-pf52-xh8x

1 vulnerability (1 low)

  bun audit fix           upgrade the vulnerable packages within their ranges
  bun audit fix --latest  also cross major versions
SUPPLY_CHAIN_BUN_AUDIT findings reported; this check is report-only
SUPPLY_CHAIN_PASS Rust advisory/license checks complete; Bun findings are report-only

python3 scripts/tests/advisory-reviews.py: six tests passed. bash -n scripts/verify scripts/check-supply-chain and git diff --check passed.

scripts/verify fast started once load1 was 8.80 (two Cargo jobs). Supply-chain, web build and formatting passed; Clippy is compiling native dependencies. Merge is queued until load5<8 and no other active verify/release build/browser process. Full gate outputs will follow; these targeted checks do not constitute a merge signal.

Implementation committed on `lp-supply`: `0909f91aa221def0755be41316b9237fa9b6e820` (no push). Working tree clean. Code graph impact against `6896994` identifies only the six owned policy/docs/verification files; no runtime code changes. Targeted `nice -n 19 scripts/check-supply-chain` exited 0 with real refreshed RustSec data and real cargo-deny licenses. Exact output: ```text SUPPLY_CHAIN_REVIEWS advisory exceptions are within their review windows SUPPLY_CHAIN cargo-deny: cargo-deny 0.20.2 SUPPLY_CHAIN_NOTICES generated THIRD_PARTY_NOTICES.md from 95 frontend packages SUPPLY_CHAIN_NOTICES copied source: 179 shadcn files, 3 calternal-derived files SUPPLY_CHAIN_NOTICES license files: 66 distinct texts; 0 packages need manual license review warning[yanked]: detected yanked crate (try `cargo update -p yoke-derive`) ┌─ /mnt/hdd/infraternal/wt-lp/lp-supply/Cargo.lock:529:1 │ 529 │ yoke-derive 0.8.3 registry+https://github.com/rust-lang/crates.io-index │ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ yanked version advisories ok SUPPLY_CHAIN_RUST_ADVISORIES passed with refreshed advisory data licenses ok SUPPLY_CHAIN_RUST_LICENSES passed bun audit v1.4.2 (744846f84) cookie@0.6.0 workspace:@infraternal/web > @sveltejs/kit > cookie low: cookie accepts cookie name, path, and domain with out of bounds characters (<0.7.0) - https://github.com/advisories/GHSA-pxg6-pf52-xh8x 1 vulnerability (1 low) bun audit fix upgrade the vulnerable packages within their ranges bun audit fix --latest also cross major versions SUPPLY_CHAIN_BUN_AUDIT findings reported; this check is report-only SUPPLY_CHAIN_PASS Rust advisory/license checks complete; Bun findings are report-only ``` `python3 scripts/tests/advisory-reviews.py`: six tests passed. `bash -n scripts/verify scripts/check-supply-chain` and `git diff --check` passed. `scripts/verify fast` started once load1 was 8.80 (two Cargo jobs). Supply-chain, web build and formatting passed; Clippy is compiling native dependencies. Merge is queued until load5<8 and no other active verify/release build/browser process. Full gate outputs will follow; these targeted checks do not constitute a merge signal.
Author
Owner

lp-flaky continuation is incomplete and blocked on verification scheduling. Head 9a55cb2e9b; base 6f6fd89621; worktree clean; nothing pushed. Review fixes: coalesced benchmark completion marker retained; shared fixture include attribute fixed while preserving benchmark wrapper; signal test sleep replaced by observable marker/input gate; shared lint annotations preserved. Whitespace checks and embedded Python syntax passed. No Rust compilation, test repeat counts, fast gate or merge gate ran: the waiting runner never found no active verify + load5 <= 6 during roughly 30 minutes. Own waiting runner is now stopped. progress.md records exact next steps.

Operational incident: at about 18:02 UTC I mistakenly sent SIGTERM to another job's bash scripts/verify fast process PID 1341778 while intending to stop this job's waiting runner. This violated the explicit no-signalling-other-jobs rule. I disclosed it to the user immediately; I did not restart or otherwise manage that job. The orchestrator needs to identify and rerun the interrupted gate. Afterward I verified my own waiting runner PID 1203550 by exact /proc cmdline and stopped only it and its sleep child.

lp-flaky continuation is incomplete and blocked on verification scheduling. Head 9a55cb2e9bb039bb32e3f48cdf52e782a082f645; base 6f6fd896214f05d9ef19a47e43fb8be2561ab626; worktree clean; nothing pushed. Review fixes: coalesced benchmark completion marker retained; shared fixture include attribute fixed while preserving benchmark wrapper; signal test sleep replaced by observable marker/input gate; shared lint annotations preserved. Whitespace checks and embedded Python syntax passed. No Rust compilation, test repeat counts, fast gate or merge gate ran: the waiting runner never found no active verify + load5 <= 6 during roughly 30 minutes. Own waiting runner is now stopped. progress.md records exact next steps. Operational incident: at about 18:02 UTC I mistakenly sent SIGTERM to another job's bash scripts/verify fast process PID 1341778 while intending to stop this job's waiting runner. This violated the explicit no-signalling-other-jobs rule. I disclosed it to the user immediately; I did not restart or otherwise manage that job. The orchestrator needs to identify and rerun the interrupted gate. Afterward I verified my own waiting runner PID 1203550 by exact /proc cmdline and stopped only it and its sleep child.
Author
Owner

Orchestrator: at about 23:30 IST, job lp-flaky mistakenly sent SIGTERM to another job's scripts/verify fast (PID 1341778). Any job whose verify fast ended with 'Terminated' or exit 143 around then must rerun it; it is not a real failure.

Orchestrator: at about 23:30 IST, job lp-flaky mistakenly sent SIGTERM to another job's `scripts/verify fast` (PID 1341778). **Any job whose `verify fast` ended with 'Terminated' or exit 143 around then must rerun it; it is not a real failure.**
Author
Owner

lp-flaky continuation: branch lp-flaky, base 6f6fd89621, current head 9a55cb2e9b. Read progress.md and contract. Remaining compilation, 20-repeat proofs, fast and merge. Observed concurrent verify processes and load5 13.24; no heavy work started. Will poll every two minutes and run targeted single-test repeats only when load5 < 10. Will not signal any process not started in this run.

lp-flaky continuation: branch lp-flaky, base 6f6fd896214f05d9ef19a47e43fb8be2561ab626, current head 9a55cb2e9bb039bb32e3f48cdf52e782a082f645. Read progress.md and contract. Remaining compilation, 20-repeat proofs, fast and merge. Observed concurrent verify processes and load5 13.24; no heavy work started. Will poll every two minutes and run targeted single-test repeats only when load5 < 10. Will not signal any process not started in this run.
Author
Owner

scripts/verify fast failed in the workspace cargo-test stage (exit 101), after the new review-policy tests, supply-chain stage, web build, formatting and Clippy passed. The gate prints only the first 240 cargo-test log lines; those contain compilation output and omit the cause. Retaining a full targeted cargo test --workspace log on a rerun after load1<=10 to diagnose. Disk and memory have capacity. Merge not started. Exact fast output:

WARN load5=12.85 exceeds online CPU count=8; timing-sensitive checks may be delayed
PASS fast: migrations are append-only (0.185s)
PASS fast: workspace package dependencies (0.201s)
PASS fast: JavaScript dependencies (0.005s)
PASS fast: advisory review policy tests (0.146s)
SUPPLY_CHAIN_REVIEWS advisory exceptions are within their review windows
SUPPLY_CHAIN cargo-deny: cargo-deny 0.20.2
SUPPLY_CHAIN_NOTICES generated THIRD_PARTY_NOTICES.md from 95 frontend packages
SUPPLY_CHAIN_NOTICES copied source: 179 shadcn files, 3 calternal-derived files
SUPPLY_CHAIN_NOTICES license files: 66 distinct texts; 0 packages need manual license review
warning[yanked]: detected yanked crate (try `cargo update -p yoke-derive`)
    ┌─ /mnt/hdd/infraternal/wt-lp/lp-supply/Cargo.lock:529:1
    │
529 │ yoke-derive 0.8.3 registry+https://github.com/rust-lang/crates.io-index
    │ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ yanked version

advisories ok
SUPPLY_CHAIN_RUST_ADVISORIES passed with refreshed advisory data
licenses ok
SUPPLY_CHAIN_RUST_LICENSES passed
bun audit v1.4.2 (744846f84)

cookie@0.6.0
  workspace:@infraternal/web > @sveltejs/kit > cookie
  low: cookie accepts cookie name, path, and domain with out of bounds characters (<0.7.0) - https://github.com/advisories/GHSA-pxg6-pf52-xh8x

1 vulnerability (1 low)

  bun audit fix           upgrade the vulnerable packages within their ranges
  bun audit fix --latest  also cross major versions
SUPPLY_CHAIN_BUN_AUDIT findings reported; this check is report-only
SUPPLY_CHAIN_PASS Rust advisory/license checks complete; Bun findings are report-only
PASS fast: supply-chain checks (3.873s)
PASS fast: build web app (29.313s)
PASS fast: cargo fmt --check (1.608s)
PASS fast: cargo clippy (479.556s)
FAIL fast: cargo test (266.570s)
   Compiling libc v0.2.189
   Compiling zeroize v1.9.0
   Compiling subtle v2.6.1
   Compiling rand_core v0.10.1
   Compiling cmov v0.5.4
   Compiling ctutils v0.4.2
   Compiling hybrid-array v0.4.15
   Compiling getrandom v0.4.3
   Compiling num-traits v0.2.19
   Compiling crypto-common v0.2.2
   Compiling block-buffer v0.12.1
   Compiling serde_core v1.0.229
   Compiling log v0.4.34
   Compiling digest v0.11.3
   Compiling block-padding v0.4.2
   Compiling errno v0.3.14
   Compiling signal-hook-registry v1.4.8
   Compiling inout v0.2.2
   Compiling cipher v0.5.2
   Compiling bitflags v2.13.2
   Compiling mio v1.2.3
   Compiling futures-sink v0.3.34
   Compiling slab v0.4.12
   Compiling socket2 v0.6.5
   Compiling serde v1.0.229
   Compiling tokio v1.53.1
   Compiling sha2 v0.11.0
   Compiling cpubits v0.1.1
   Compiling futures-channel v0.3.34
   Compiling serde_json v1.0.151
   Compiling futures-util v0.3.34
   Compiling tracing-core v0.1.36
   Compiling smallvec v1.16.1
   Compiling crossbeam-utils v0.8.23
   Compiling tracing v0.1.44
   Compiling base64ct v1.8.3
   Compiling hmac v0.13.0
   Compiling linux-raw-sys v0.12.1
   Compiling zerocopy v0.8.57
   Compiling rustix v1.1.5
   Compiling pem-rfc7468 v1.0.0
   Compiling fastrand v2.5.0
   Compiling aes v0.9.3
   Compiling universal-hash v0.6.1
   Compiling num-integer v0.1.47
   Compiling polyval v0.7.3
   Compiling der v0.8.2
   Compiling crypto-bigint v0.7.5
   Compiling cbc v0.2.1
   Compiling ghash v0.6.0
   Compiling pbkdf2 v0.13.0
   Compiling ctr v0.10.1
   Compiling aead v0.6.1
   Compiling aes-gcm v0.11.1
   Compiling spki v0.8.0
   Compiling indexmap v2.14.2
   Compiling salsa20 v0.11.0
   Compiling chacha20 v0.10.2
   Compiling scrypt v0.12.0
   Compiling deranged v0.5.8
   Compiling powerfmt v0.2.0
   Compiling pkcs5 v0.8.1
   Compiling time v0.3.55
   Compiling icu_normalizer v2.3.0
   Compiling http v1.5.0
   Compiling atomic-waker v1.1.2
   Compiling idna_adapter v1.2.2
   Compiling pkcs8 v0.11.0
   Compiling rand v0.10.3
   Compiling aws-lc-sys v0.45.0
   Compiling hkdf v0.13.0
   Compiling ff v0.14.0
   Compiling untrusted v0.7.1
   Compiling idna v1.1.0
   Compiling aws-lc-rs v1.18.1
   Compiling data-encoding v2.11.1
   Compiling url v2.5.8
   Compiling getrandom v0.3.4
   Compiling group v0.14.0
   Compiling http-body v1.1.0
   Compiling half v2.7.1
   Compiling either v1.18.0
   Compiling signature v3.0.0
   Compiling base16ct v1.0.0
   Compiling ryu-js v1.0.3
   Compiling minimal-lexical v0.2.1
   Compiling serde_json_canonicalizer v0.3.2
   Compiling nom v7.1.3
   Compiling sec1 v0.8.1
   Compiling utoipa v5.5.0
   Compiling rand_core v0.9.5
   Compiling httparse v1.10.1
   Compiling ulid v3.0.0
   Compiling num-bigint v0.4.8
   Compiling rustls-pki-types v1.15.1
   Compiling tower-service v0.3.3
   Compiling base64 v0.22.1
   Compiling nix v0.31.3
   Compiling rusticata-macros v4.1.0
   Compiling elliptic-curve v0.14.1
   Compiling primefield v0.14.0
   Compiling ppv-lite86 v0.2.21
   Compiling futures-executor v0.3.34
   Compiling try-lock v0.2.5
   Compiling untrusted v0.9.0
   Compiling regex-syntax v0.8.11
   Compiling want v0.3.1
   Compiling rand_chacha v0.9.0
   Compiling wnaf v0.14.1
   Compiling infraternal-proto v0.0.1 (/mnt/hdd/infraternal/wt-lp/lp-supply/crates/proto)
   Compiling rfc6979 v0.6.0
   Compiling tempfile v3.27.0
   Compiling tokio-util v0.7.19
   Compiling lazy_static v1.5.0
   Compiling httpdate v1.0.3
   Compiling utf8parse v0.2.2
   Compiling anstyle-parse v1.0.0
   Compiling hyper v1.11.1
   Compiling ecdsa v0.17.0
   Compiling regex-automata v0.4.18
   Compiling primeorder v0.14.0
   Compiling rand v0.9.5
   Compiling colorchoice v1.0.5
   Compiling anstyle-query v1.1.5
   Compiling is_terminal_polyfill v1.70.2
   Compiling ipnet v2.12.2
   Compiling anstyle v1.0.14
   Compiling anstream v1.0.0
   Compiling hyper-util v0.1.20
   Compiling crossbeam-epoch v0.9.21
   Compiling tokio-stream v0.1.19
   Compiling futures v0.3.34
   Compiling serde_urlencoded v0.7.1
   Compiling http-body-util v0.1.5
   Compiling ssh-encoding v0.3.0
   Compiling keccak v0.2.2
   Compiling clap_lex v1.1.1
   Compiling byteorder v1.5.0
   Compiling clap_builder v4.6.7
   Compiling blowfish v0.10.0
   Compiling curve25519-dalek v5.0.0
   Compiling crossbeam-deque v0.8.8
   Compiling rustls-webpki v0.103.15
   Compiling ed25519 v3.0.0
   Compiling crypto-primes v0.7.2
   Compiling pkcs1 v0.8.0-rc.4
   Compiling poly1305 v0.9.1
   Compiling blake2 v0.11.0
   Compiling plotters-backend v0.3.7
   Compiling ciborium-io v0.2.2
   Compiling adler2 v2.0.1
   Compiling simd-adler32 v0.3.10
   Compiling plotters-svg v0.3.7
   Compiling miniz_oxide v0.9.1
   Compiling ciborium-ll v0.2.2
   Compiling argon2 v0.6.0
   Compiling rsa v0.10.0-rc.18
   Compiling ssh-cipher v0.3.0
   Compiling ed25519-dalek v3.0.0
   Compiling clap v4.6.7
   Compiling rustls v0.23.45
   Compiling rayon-core v1.13.0
   Compiling crc32fast v1.5.2
   Compiling bcrypt-pbkdf v0.11.0
   Compiling sha3 v0.11.0
   Compiling p384 v0.14.0
   Compiling p521 v0.14.0
   Compiling p256 v0.14.0
   Compiling itertools v0.13.0
   Compiling sha1 v0.11.0
   Compiling kem v0.3.0
   Compiling module-lattice v0.2.3
   Compiling sponge-cursor v0.1.0
   Compiling cast v0.3.0
   Compiling ml-kem v0.3.2
   Compiling criterion-plot v0.8.2
   Compiling sha3 v0.12.0
   Compiling thiserror v1.0.69
   Compiling ssh-key v0.7.0-rc.11
   Compiling flate2 v1.1.10
   Compiling generic-array v1.4.5
   Compiling rayon v1.12.0
   Compiling alloca v0.4.0
   Compiling ciborium v0.2.2
   Compiling plotters v0.3.7
   Compiling russh-cryptovec v0.62.0
   Compiling regex v1.13.1
   Compiling infraternal-private-storage v0.0.1 (/mnt/hdd/infraternal/wt-lp/lp-supply/crates/private-storage)
   Compiling num-bigint v0.5.1
   Compiling russh-util v0.52.0
   Compiling tinytemplate v1.2.1
   Compiling uuid v1.26.1
   Compiling page_size v0.6.0
   Compiling hex-literal v1.1.0
   Compiling anes v0.1.6
   Compiling oorandom v11.1.5
   Compiling md5 v0.8.1
   Compiling criterion v0.8.2
   Compiling russh v0.63.3
   Compiling hyperlocal v0.9.1
   Compiling bollard-stubs v1.53.1-rc.29.3.1
   Compiling sync_wrapper v1.0.2
   Compiling fs2 v0.4.3
   Compiling tower-layer v0.3.3
   Compiling openssl-probe v0.2.1
   Compiling rustls-native-certs v0.8.4
   Compiling asn1-rs v0.7.2
   Compiling tokio-rustls v0.26.5
   Compiling asn1-rs v0.6.2
   Compiling tower v0.5.3
   Compiling infraternal-ssh v0.0.1 (/mnt/hdd/infraternal/wt-lp/lp-supply/crates/ssh)
   Compiling parking_lot_core v0.9.12
   Compiling sha1 v0.10.7
   Compiling webpki-roots v1.0.9
   Compiling getrandom v0.2.17
   Compiling base64 v0.21.7
   Compiling foreign-types-shared v0.1.1
   Compiling base64 v0.23.1
   Compiling bollard v0.21.1
   Compiling base64urlsafedata v0.5.4
   Compiling foreign-types v0.3.2
   Compiling ring v0.17.14
   Compiling infraternal-engine v0.0.1 (/mnt/hdd/infraternal/wt-lp/lp-supply/crates/engine)
   Compiling webpki-roots v0.26.11
   Compiling tungstenite v0.29.0
   Compiling parking_lot v0.12.5
   Compiling oid-registry v0.8.1
   Compiling der-parser v10.0.0
   Compiling openssl-sys v0.9.117
   Compiling openssl v0.10.81
   Compiling x509-parser v0.18.1
   Compiling tokio-tungstenite v0.29.0
   Compiling oid-registry v0.7.1
   Compiling pem v4.0.0
   Compiling tower-http v0.6.11
   Compiling der-parser v9.0.0
   Compiling hyper-rustls v0.27.10
   Compiling rustls-platform-verifier v0.7.0
   Compiling yasna v0.6.0
   Compiling reqwest v0.13.5
`scripts/verify fast` failed in the workspace cargo-test stage (exit 101), after the new review-policy tests, supply-chain stage, web build, formatting and Clippy passed. The gate prints only the first 240 cargo-test log lines; those contain compilation output and omit the cause. Retaining a full targeted `cargo test --workspace` log on a rerun after load1<=10 to diagnose. Disk and memory have capacity. Merge not started. Exact fast output: ```text WARN load5=12.85 exceeds online CPU count=8; timing-sensitive checks may be delayed PASS fast: migrations are append-only (0.185s) PASS fast: workspace package dependencies (0.201s) PASS fast: JavaScript dependencies (0.005s) PASS fast: advisory review policy tests (0.146s) SUPPLY_CHAIN_REVIEWS advisory exceptions are within their review windows SUPPLY_CHAIN cargo-deny: cargo-deny 0.20.2 SUPPLY_CHAIN_NOTICES generated THIRD_PARTY_NOTICES.md from 95 frontend packages SUPPLY_CHAIN_NOTICES copied source: 179 shadcn files, 3 calternal-derived files SUPPLY_CHAIN_NOTICES license files: 66 distinct texts; 0 packages need manual license review warning[yanked]: detected yanked crate (try `cargo update -p yoke-derive`) ┌─ /mnt/hdd/infraternal/wt-lp/lp-supply/Cargo.lock:529:1 │ 529 │ yoke-derive 0.8.3 registry+https://github.com/rust-lang/crates.io-index │ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ yanked version advisories ok SUPPLY_CHAIN_RUST_ADVISORIES passed with refreshed advisory data licenses ok SUPPLY_CHAIN_RUST_LICENSES passed bun audit v1.4.2 (744846f84) cookie@0.6.0 workspace:@infraternal/web > @sveltejs/kit > cookie low: cookie accepts cookie name, path, and domain with out of bounds characters (<0.7.0) - https://github.com/advisories/GHSA-pxg6-pf52-xh8x 1 vulnerability (1 low) bun audit fix upgrade the vulnerable packages within their ranges bun audit fix --latest also cross major versions SUPPLY_CHAIN_BUN_AUDIT findings reported; this check is report-only SUPPLY_CHAIN_PASS Rust advisory/license checks complete; Bun findings are report-only PASS fast: supply-chain checks (3.873s) PASS fast: build web app (29.313s) PASS fast: cargo fmt --check (1.608s) PASS fast: cargo clippy (479.556s) FAIL fast: cargo test (266.570s) Compiling libc v0.2.189 Compiling zeroize v1.9.0 Compiling subtle v2.6.1 Compiling rand_core v0.10.1 Compiling cmov v0.5.4 Compiling ctutils v0.4.2 Compiling hybrid-array v0.4.15 Compiling getrandom v0.4.3 Compiling num-traits v0.2.19 Compiling crypto-common v0.2.2 Compiling block-buffer v0.12.1 Compiling serde_core v1.0.229 Compiling log v0.4.34 Compiling digest v0.11.3 Compiling block-padding v0.4.2 Compiling errno v0.3.14 Compiling signal-hook-registry v1.4.8 Compiling inout v0.2.2 Compiling cipher v0.5.2 Compiling bitflags v2.13.2 Compiling mio v1.2.3 Compiling futures-sink v0.3.34 Compiling slab v0.4.12 Compiling socket2 v0.6.5 Compiling serde v1.0.229 Compiling tokio v1.53.1 Compiling sha2 v0.11.0 Compiling cpubits v0.1.1 Compiling futures-channel v0.3.34 Compiling serde_json v1.0.151 Compiling futures-util v0.3.34 Compiling tracing-core v0.1.36 Compiling smallvec v1.16.1 Compiling crossbeam-utils v0.8.23 Compiling tracing v0.1.44 Compiling base64ct v1.8.3 Compiling hmac v0.13.0 Compiling linux-raw-sys v0.12.1 Compiling zerocopy v0.8.57 Compiling rustix v1.1.5 Compiling pem-rfc7468 v1.0.0 Compiling fastrand v2.5.0 Compiling aes v0.9.3 Compiling universal-hash v0.6.1 Compiling num-integer v0.1.47 Compiling polyval v0.7.3 Compiling der v0.8.2 Compiling crypto-bigint v0.7.5 Compiling cbc v0.2.1 Compiling ghash v0.6.0 Compiling pbkdf2 v0.13.0 Compiling ctr v0.10.1 Compiling aead v0.6.1 Compiling aes-gcm v0.11.1 Compiling spki v0.8.0 Compiling indexmap v2.14.2 Compiling salsa20 v0.11.0 Compiling chacha20 v0.10.2 Compiling scrypt v0.12.0 Compiling deranged v0.5.8 Compiling powerfmt v0.2.0 Compiling pkcs5 v0.8.1 Compiling time v0.3.55 Compiling icu_normalizer v2.3.0 Compiling http v1.5.0 Compiling atomic-waker v1.1.2 Compiling idna_adapter v1.2.2 Compiling pkcs8 v0.11.0 Compiling rand v0.10.3 Compiling aws-lc-sys v0.45.0 Compiling hkdf v0.13.0 Compiling ff v0.14.0 Compiling untrusted v0.7.1 Compiling idna v1.1.0 Compiling aws-lc-rs v1.18.1 Compiling data-encoding v2.11.1 Compiling url v2.5.8 Compiling getrandom v0.3.4 Compiling group v0.14.0 Compiling http-body v1.1.0 Compiling half v2.7.1 Compiling either v1.18.0 Compiling signature v3.0.0 Compiling base16ct v1.0.0 Compiling ryu-js v1.0.3 Compiling minimal-lexical v0.2.1 Compiling serde_json_canonicalizer v0.3.2 Compiling nom v7.1.3 Compiling sec1 v0.8.1 Compiling utoipa v5.5.0 Compiling rand_core v0.9.5 Compiling httparse v1.10.1 Compiling ulid v3.0.0 Compiling num-bigint v0.4.8 Compiling rustls-pki-types v1.15.1 Compiling tower-service v0.3.3 Compiling base64 v0.22.1 Compiling nix v0.31.3 Compiling rusticata-macros v4.1.0 Compiling elliptic-curve v0.14.1 Compiling primefield v0.14.0 Compiling ppv-lite86 v0.2.21 Compiling futures-executor v0.3.34 Compiling try-lock v0.2.5 Compiling untrusted v0.9.0 Compiling regex-syntax v0.8.11 Compiling want v0.3.1 Compiling rand_chacha v0.9.0 Compiling wnaf v0.14.1 Compiling infraternal-proto v0.0.1 (/mnt/hdd/infraternal/wt-lp/lp-supply/crates/proto) Compiling rfc6979 v0.6.0 Compiling tempfile v3.27.0 Compiling tokio-util v0.7.19 Compiling lazy_static v1.5.0 Compiling httpdate v1.0.3 Compiling utf8parse v0.2.2 Compiling anstyle-parse v1.0.0 Compiling hyper v1.11.1 Compiling ecdsa v0.17.0 Compiling regex-automata v0.4.18 Compiling primeorder v0.14.0 Compiling rand v0.9.5 Compiling colorchoice v1.0.5 Compiling anstyle-query v1.1.5 Compiling is_terminal_polyfill v1.70.2 Compiling ipnet v2.12.2 Compiling anstyle v1.0.14 Compiling anstream v1.0.0 Compiling hyper-util v0.1.20 Compiling crossbeam-epoch v0.9.21 Compiling tokio-stream v0.1.19 Compiling futures v0.3.34 Compiling serde_urlencoded v0.7.1 Compiling http-body-util v0.1.5 Compiling ssh-encoding v0.3.0 Compiling keccak v0.2.2 Compiling clap_lex v1.1.1 Compiling byteorder v1.5.0 Compiling clap_builder v4.6.7 Compiling blowfish v0.10.0 Compiling curve25519-dalek v5.0.0 Compiling crossbeam-deque v0.8.8 Compiling rustls-webpki v0.103.15 Compiling ed25519 v3.0.0 Compiling crypto-primes v0.7.2 Compiling pkcs1 v0.8.0-rc.4 Compiling poly1305 v0.9.1 Compiling blake2 v0.11.0 Compiling plotters-backend v0.3.7 Compiling ciborium-io v0.2.2 Compiling adler2 v2.0.1 Compiling simd-adler32 v0.3.10 Compiling plotters-svg v0.3.7 Compiling miniz_oxide v0.9.1 Compiling ciborium-ll v0.2.2 Compiling argon2 v0.6.0 Compiling rsa v0.10.0-rc.18 Compiling ssh-cipher v0.3.0 Compiling ed25519-dalek v3.0.0 Compiling clap v4.6.7 Compiling rustls v0.23.45 Compiling rayon-core v1.13.0 Compiling crc32fast v1.5.2 Compiling bcrypt-pbkdf v0.11.0 Compiling sha3 v0.11.0 Compiling p384 v0.14.0 Compiling p521 v0.14.0 Compiling p256 v0.14.0 Compiling itertools v0.13.0 Compiling sha1 v0.11.0 Compiling kem v0.3.0 Compiling module-lattice v0.2.3 Compiling sponge-cursor v0.1.0 Compiling cast v0.3.0 Compiling ml-kem v0.3.2 Compiling criterion-plot v0.8.2 Compiling sha3 v0.12.0 Compiling thiserror v1.0.69 Compiling ssh-key v0.7.0-rc.11 Compiling flate2 v1.1.10 Compiling generic-array v1.4.5 Compiling rayon v1.12.0 Compiling alloca v0.4.0 Compiling ciborium v0.2.2 Compiling plotters v0.3.7 Compiling russh-cryptovec v0.62.0 Compiling regex v1.13.1 Compiling infraternal-private-storage v0.0.1 (/mnt/hdd/infraternal/wt-lp/lp-supply/crates/private-storage) Compiling num-bigint v0.5.1 Compiling russh-util v0.52.0 Compiling tinytemplate v1.2.1 Compiling uuid v1.26.1 Compiling page_size v0.6.0 Compiling hex-literal v1.1.0 Compiling anes v0.1.6 Compiling oorandom v11.1.5 Compiling md5 v0.8.1 Compiling criterion v0.8.2 Compiling russh v0.63.3 Compiling hyperlocal v0.9.1 Compiling bollard-stubs v1.53.1-rc.29.3.1 Compiling sync_wrapper v1.0.2 Compiling fs2 v0.4.3 Compiling tower-layer v0.3.3 Compiling openssl-probe v0.2.1 Compiling rustls-native-certs v0.8.4 Compiling asn1-rs v0.7.2 Compiling tokio-rustls v0.26.5 Compiling asn1-rs v0.6.2 Compiling tower v0.5.3 Compiling infraternal-ssh v0.0.1 (/mnt/hdd/infraternal/wt-lp/lp-supply/crates/ssh) Compiling parking_lot_core v0.9.12 Compiling sha1 v0.10.7 Compiling webpki-roots v1.0.9 Compiling getrandom v0.2.17 Compiling base64 v0.21.7 Compiling foreign-types-shared v0.1.1 Compiling base64 v0.23.1 Compiling bollard v0.21.1 Compiling base64urlsafedata v0.5.4 Compiling foreign-types v0.3.2 Compiling ring v0.17.14 Compiling infraternal-engine v0.0.1 (/mnt/hdd/infraternal/wt-lp/lp-supply/crates/engine) Compiling webpki-roots v0.26.11 Compiling tungstenite v0.29.0 Compiling parking_lot v0.12.5 Compiling oid-registry v0.8.1 Compiling der-parser v10.0.0 Compiling openssl-sys v0.9.117 Compiling openssl v0.10.81 Compiling x509-parser v0.18.1 Compiling tokio-tungstenite v0.29.0 Compiling oid-registry v0.7.1 Compiling pem v4.0.0 Compiling tower-http v0.6.11 Compiling der-parser v9.0.0 Compiling hyper-rustls v0.27.10 Compiling rustls-platform-verifier v0.7.0 Compiling yasna v0.6.0 Compiling reqwest v0.13.5 ```
Author
Owner

Separate baseline gate blocker identified on lp-supply 0909f91: workspace tests fail in crates/server/tests/private_storage.rs:49. After reopened.close().await, the WAL sidecar still exists, and symlink(&backup, &sidecar).unwrap() returns OS error 17 (AlreadyExists). git diff 6896994 -- crates/server/tests/private_storage.rs crates/server/src/storage is empty; this supply change touches no storage or runtime SSH code.

Exact diagnostic from full retained cargo test --workspace log (exit 101):

     Running tests/private_storage.rs (target/debug/deps/private_storage-62fc754aa0e4a128)

running 1 test
test database_wal_and_backup_are_private_and_reject_substitution ... FAILED

failures:

---- database_wal_and_backup_are_private_and_reject_substitution stdout ----

thread 'database_wal_and_backup_are_private_and_reject_substitution' (1427417) panicked at crates/server/tests/private_storage.rs:49:32:
called `Result::unwrap()` on an `Err` value: Os { code: 17, kind: AlreadyExists, message: "File exists" }
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace


failures:
    database_wal_and_backup_are_private_and_reject_substitution

test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.11s

error: test failed, to rerun pass `-p infraternal-server --test private_storage`

Keeping this job inside the supply-chain step. The new review-policy and supply-chain checks pass. Retrying fast with warm build cache for a gate report that includes the diagnostic; merge will still be attempted only when load5<8 and no other verify run is active. This is not a green merge signal.

Separate baseline gate blocker identified on `lp-supply` `0909f91`: workspace tests fail in `crates/server/tests/private_storage.rs:49`. After `reopened.close().await`, the WAL sidecar still exists, and `symlink(&backup, &sidecar).unwrap()` returns OS error 17 (`AlreadyExists`). `git diff 6896994 -- crates/server/tests/private_storage.rs crates/server/src/storage` is empty; this supply change touches no storage or runtime SSH code. Exact diagnostic from full retained `cargo test --workspace` log (exit 101): ```text Running tests/private_storage.rs (target/debug/deps/private_storage-62fc754aa0e4a128) running 1 test test database_wal_and_backup_are_private_and_reject_substitution ... FAILED failures: ---- database_wal_and_backup_are_private_and_reject_substitution stdout ---- thread 'database_wal_and_backup_are_private_and_reject_substitution' (1427417) panicked at crates/server/tests/private_storage.rs:49:32: called `Result::unwrap()` on an `Err` value: Os { code: 17, kind: AlreadyExists, message: "File exists" } note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace failures: database_wal_and_backup_are_private_and_reject_substitution test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.11s error: test failed, to rerun pass `-p infraternal-server --test private_storage` ``` Keeping this job inside the supply-chain step. The new review-policy and supply-chain checks pass. Retrying fast with warm build cache for a gate report that includes the diagnostic; merge will still be attempted only when load5<8 and no other verify run is active. This is not a green merge signal.
Author
Owner

Head ab23aef adds admission checks inside the owned perf stage: before each release compile it waits for load1≤10 and no other full cargo build --release; before each browser workload it waits for load1≤10 and no active Chromium. Only process names/admission status are printed; no other jobs are signalled or their files accessed. Nine targeted tests pass. scripts/verify perf --dev-vm --calibrate target/perf/base.json --output target/perf/calibration-diagnostic.json is active; web prerequisite passed, then admission waited through load1 13.41→18.53. No release binary/measurement table yet. Third fast (RUST_TEST_THREADS=1) exited101 at workspace tests; its first240-line output hides the final failing test. A standalone rerun of the exact compiled server-unit binary passed52 enabled tests/1 ignored in3.70s. More evidence will follow from a quiet gate rerun.

Head `ab23aef` adds admission checks inside the owned perf stage: before each release compile it waits for load1≤10 and no other full cargo build --release; before each browser workload it waits for load1≤10 and no active Chromium. Only process names/admission status are printed; no other jobs are signalled or their files accessed. Nine targeted tests pass. `scripts/verify perf --dev-vm --calibrate target/perf/base.json --output target/perf/calibration-diagnostic.json` is active; web prerequisite passed, then admission waited through load1 13.41→18.53. No release binary/measurement table yet. Third fast (RUST_TEST_THREADS=1) exited101 at workspace tests; its first240-line output hides the final failing test. A standalone rerun of the exact compiled server-unit binary passed52 enabled tests/1 ignored in3.70s. More evidence will follow from a quiet gate rerun.
Author
Owner

Fast retry on unchanged head 0909f91aa221def0755be41316b9237fa9b6e820 failed at another baseline test: crates/infraternal/tests/agent_tunnel.rs:580, remote inventory was not published. The new review-policy and supply-chain stages passed again. Full exact retry output follows.

The isolated private-storage test passed (exact output below), so its previous workspace failure is not deterministic. Shared VM overload is a possible contributor; not established as the cause. No storage, tunnel, timeout or test behavior has been changed in this supply-chain job. Merge is queued for load5<8 and no other active verify/release build/browser run.

WARN load5=11.06 exceeds online CPU count=8; timing-sensitive checks may be delayed
PASS fast: migrations are append-only (0.406s)
PASS fast: workspace package dependencies (0.400s)
PASS fast: JavaScript dependencies (1.600s)
PASS fast: advisory review policy tests (0.326s)
SUPPLY_CHAIN_REVIEWS advisory exceptions are within their review windows
SUPPLY_CHAIN cargo-deny: cargo-deny 0.20.2
SUPPLY_CHAIN_NOTICES generated THIRD_PARTY_NOTICES.md from 95 frontend packages
SUPPLY_CHAIN_NOTICES copied source: 179 shadcn files, 3 calternal-derived files
SUPPLY_CHAIN_NOTICES license files: 66 distinct texts; 0 packages need manual license review
warning[yanked]: detected yanked crate (try `cargo update -p yoke-derive`)
    ┌─ /mnt/hdd/infraternal/wt-lp/lp-supply/Cargo.lock:529:1
    │
529 │ yoke-derive 0.8.3 registry+https://github.com/rust-lang/crates.io-index
    │ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ yanked version

advisories ok
SUPPLY_CHAIN_RUST_ADVISORIES passed with refreshed advisory data
licenses ok
SUPPLY_CHAIN_RUST_LICENSES passed
bun audit v1.4.2 (744846f84)

cookie@0.6.0
  workspace:@infraternal/web > @sveltejs/kit > cookie
  low: cookie accepts cookie name, path, and domain with out of bounds characters (<0.7.0) - https://github.com/advisories/GHSA-pxg6-pf52-xh8x

1 vulnerability (1 low)

  bun audit fix           upgrade the vulnerable packages within their ranges
  bun audit fix --latest  also cross major versions
SUPPLY_CHAIN_BUN_AUDIT findings reported; this check is report-only
SUPPLY_CHAIN_PASS Rust advisory/license checks complete; Bun findings are report-only
PASS fast: supply-chain checks (9.667s)
PASS fast: build web app (28.795s)
PASS fast: cargo fmt --check (1.204s)
PASS fast: cargo clippy (61.211s)
FAIL fast: cargo test (206.414s)
   Compiling infraternal-server v0.0.1 (/mnt/hdd/infraternal/wt-lp/lp-supply/crates/server)
   Compiling infraternal v0.0.1 (/mnt/hdd/infraternal/wt-lp/lp-supply/crates/infraternal)
    Finished `test` profile [unoptimized] target(s) in 3m 13s
     Running unittests src/main.rs (target/debug/deps/infraternal-786ee3abac3a281d)

running 41 tests
test cli::tests::log_snapshot_deadline_defaults_to_five_seconds_and_follow_is_unbounded ... ok
test http::tests::caller_idempotency_keys_are_ulids ... ok
test cli::tests::log_timeout_override_is_bounded_and_liveness_errors_have_a_stable_exit_code ... ok
test http::tests::addresses_and_plan_ids_use_proto_validation ... ok
test http::tests::plan_errors_explain_the_next_safe_step ... ok
test http::tests::client_error_exit_codes_follow_the_contract_registry ... ok
test login::tests::fallback_rejects_symlinks_and_permissive_files ... ok
test login::tests::fallback_rejects_hard_linked_files ... ok
test login::tests::fallback_creates_and_replaces_only_private_regular_files ... ok
test login::tests::credential_slots_are_isolated_and_validate_binding ... ok
test login::tests::keychain_and_fallback_transitions_never_replay_old_material ... ok
test login::tests::keychain_record_rejects_swapped_binding ... ok
test login::tests::refresh_process_child ... ok
test login::tests::server_url_transport_policy_accepts_only_safe_origins ... ok
test login::tests::keychain_success_surfaces_fallback_cleanup_failure_and_blocks_stale_reads ... ok
test login::tests::source_has_no_direct_secret_output ... ok
test login::tests::verification_uri_must_match_the_normalized_server_origin ... ok
test mcp::tests::container_logs_defaults_are_bounded ... ok
test http::tests::expired_access_tokens_refresh_before_the_request ... ok
test mcp::tests::host_trust_tool_defaults_to_no_replacement_and_no_mutation ... ok
test mcp::tests::list_input_is_an_optional_filter_object ... ok
test mcp::tests::tool_input_defaults_are_safe_for_destructive_calls ... ok
test mcp::tests::container_logs_has_a_complete_output_schema ... ok
test http::tests::server_url_rejects_embedded_credentials_and_query_data ... ok
test login::tests::authentication_client_never_forwards_post_bodies_across_redirects ... ok
test mcp::tests::every_tool_publishes_output_schema_and_behavior_annotations ... ok
test login::tests::unreachable_server_keeps_the_local_fallback_for_retry ... ok
test mcp::tests::tool_router_contains_the_contract_tool_names ... ok
test stream::tests::invalid_channel_state_closes_websocket_with_protocol_code_1002 ... ok
test stream::tests::malformed_frame_closes_websocket_with_protocol_code_1002 ... ok
test tests::accepted_server_socket_has_tcp_nodelay_and_handler_gets_real_peer ... ok
test tests::backup_command_parses_explicit_source_and_destination ... ok
test stream::tests::oversized_frame_closes_websocket_with_message_too_big_code_1009 ... ok
test stream::tests::malformed_log_record_closes_channel_with_invalid_request ... ok
test tests::server_defaults_match_the_public_local_origin ... ok
test tests::mcp_setup_and_login_parse_with_global_server ... ok
test http::tests::resource_client_does_not_follow_bearer_or_body_redirects ... ok
test stream::tests::oversized_log_record_closes_channel_with_record_too_large ... ok
test stream::tests::silent_server_gets_ping_then_liveness_close_4008 ... ok
test login::tests::independent_cli_and_mcp_processes_rotate_once_and_reuse_saved_access ... ok
test ssh::tests::detach_bounds_a_stalled_close_send ... ok

test result: ok. 41 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.31s

     Running tests/agent_tunnel.rs (target/debug/deps/agent_tunnel-3131a6e194ddc3c7)

running 1 test
test real_infraternal_agent_process_enrolls_and_reconnects_with_new_nonce ... FAILED

failures:

---- real_infraternal_agent_process_enrolls_and_reconnects_with_new_nonce stdout ----

thread 'real_infraternal_agent_process_enrolls_and_reconnects_with_new_nonce' (1459785) panicked at crates/infraternal/tests/agent_tunnel.rs:580:5:
remote inventory was not published
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace


failures:
    real_infraternal_agent_process_enrolls_and_reconnects_with_new_nonce

test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out; finished in 10.99s

error: test failed, to rerun pass `-p infraternal --test agent_tunnel`

Isolated cargo test -p infraternal-server --test private_storage (exit 0), exact final output:

   Compiling infraternal-server v0.0.1 (/mnt/hdd/infraternal/wt-lp/lp-supply/crates/server)
    Finished `test` profile [unoptimized] target(s) in 1m 25s
     Running tests/private_storage.rs (target/debug/deps/private_storage-c385c39fa161b378)

running 1 test
test database_wal_and_backup_are_private_and_reject_substitution ... ok

test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.10s

Fast retry on unchanged head `0909f91aa221def0755be41316b9237fa9b6e820` failed at another baseline test: `crates/infraternal/tests/agent_tunnel.rs:580`, `remote inventory was not published`. The new review-policy and supply-chain stages passed again. Full exact retry output follows. The isolated private-storage test passed (exact output below), so its previous workspace failure is not deterministic. Shared VM overload is a possible contributor; not established as the cause. No storage, tunnel, timeout or test behavior has been changed in this supply-chain job. Merge is queued for load5<8 and no other active verify/release build/browser run. ```text WARN load5=11.06 exceeds online CPU count=8; timing-sensitive checks may be delayed PASS fast: migrations are append-only (0.406s) PASS fast: workspace package dependencies (0.400s) PASS fast: JavaScript dependencies (1.600s) PASS fast: advisory review policy tests (0.326s) SUPPLY_CHAIN_REVIEWS advisory exceptions are within their review windows SUPPLY_CHAIN cargo-deny: cargo-deny 0.20.2 SUPPLY_CHAIN_NOTICES generated THIRD_PARTY_NOTICES.md from 95 frontend packages SUPPLY_CHAIN_NOTICES copied source: 179 shadcn files, 3 calternal-derived files SUPPLY_CHAIN_NOTICES license files: 66 distinct texts; 0 packages need manual license review warning[yanked]: detected yanked crate (try `cargo update -p yoke-derive`) ┌─ /mnt/hdd/infraternal/wt-lp/lp-supply/Cargo.lock:529:1 │ 529 │ yoke-derive 0.8.3 registry+https://github.com/rust-lang/crates.io-index │ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ yanked version advisories ok SUPPLY_CHAIN_RUST_ADVISORIES passed with refreshed advisory data licenses ok SUPPLY_CHAIN_RUST_LICENSES passed bun audit v1.4.2 (744846f84) cookie@0.6.0 workspace:@infraternal/web > @sveltejs/kit > cookie low: cookie accepts cookie name, path, and domain with out of bounds characters (<0.7.0) - https://github.com/advisories/GHSA-pxg6-pf52-xh8x 1 vulnerability (1 low) bun audit fix upgrade the vulnerable packages within their ranges bun audit fix --latest also cross major versions SUPPLY_CHAIN_BUN_AUDIT findings reported; this check is report-only SUPPLY_CHAIN_PASS Rust advisory/license checks complete; Bun findings are report-only PASS fast: supply-chain checks (9.667s) PASS fast: build web app (28.795s) PASS fast: cargo fmt --check (1.204s) PASS fast: cargo clippy (61.211s) FAIL fast: cargo test (206.414s) Compiling infraternal-server v0.0.1 (/mnt/hdd/infraternal/wt-lp/lp-supply/crates/server) Compiling infraternal v0.0.1 (/mnt/hdd/infraternal/wt-lp/lp-supply/crates/infraternal) Finished `test` profile [unoptimized] target(s) in 3m 13s Running unittests src/main.rs (target/debug/deps/infraternal-786ee3abac3a281d) running 41 tests test cli::tests::log_snapshot_deadline_defaults_to_five_seconds_and_follow_is_unbounded ... ok test http::tests::caller_idempotency_keys_are_ulids ... ok test cli::tests::log_timeout_override_is_bounded_and_liveness_errors_have_a_stable_exit_code ... ok test http::tests::addresses_and_plan_ids_use_proto_validation ... ok test http::tests::plan_errors_explain_the_next_safe_step ... ok test http::tests::client_error_exit_codes_follow_the_contract_registry ... ok test login::tests::fallback_rejects_symlinks_and_permissive_files ... ok test login::tests::fallback_rejects_hard_linked_files ... ok test login::tests::fallback_creates_and_replaces_only_private_regular_files ... ok test login::tests::credential_slots_are_isolated_and_validate_binding ... ok test login::tests::keychain_and_fallback_transitions_never_replay_old_material ... ok test login::tests::keychain_record_rejects_swapped_binding ... ok test login::tests::refresh_process_child ... ok test login::tests::server_url_transport_policy_accepts_only_safe_origins ... ok test login::tests::keychain_success_surfaces_fallback_cleanup_failure_and_blocks_stale_reads ... ok test login::tests::source_has_no_direct_secret_output ... ok test login::tests::verification_uri_must_match_the_normalized_server_origin ... ok test mcp::tests::container_logs_defaults_are_bounded ... ok test http::tests::expired_access_tokens_refresh_before_the_request ... ok test mcp::tests::host_trust_tool_defaults_to_no_replacement_and_no_mutation ... ok test mcp::tests::list_input_is_an_optional_filter_object ... ok test mcp::tests::tool_input_defaults_are_safe_for_destructive_calls ... ok test mcp::tests::container_logs_has_a_complete_output_schema ... ok test http::tests::server_url_rejects_embedded_credentials_and_query_data ... ok test login::tests::authentication_client_never_forwards_post_bodies_across_redirects ... ok test mcp::tests::every_tool_publishes_output_schema_and_behavior_annotations ... ok test login::tests::unreachable_server_keeps_the_local_fallback_for_retry ... ok test mcp::tests::tool_router_contains_the_contract_tool_names ... ok test stream::tests::invalid_channel_state_closes_websocket_with_protocol_code_1002 ... ok test stream::tests::malformed_frame_closes_websocket_with_protocol_code_1002 ... ok test tests::accepted_server_socket_has_tcp_nodelay_and_handler_gets_real_peer ... ok test tests::backup_command_parses_explicit_source_and_destination ... ok test stream::tests::oversized_frame_closes_websocket_with_message_too_big_code_1009 ... ok test stream::tests::malformed_log_record_closes_channel_with_invalid_request ... ok test tests::server_defaults_match_the_public_local_origin ... ok test tests::mcp_setup_and_login_parse_with_global_server ... ok test http::tests::resource_client_does_not_follow_bearer_or_body_redirects ... ok test stream::tests::oversized_log_record_closes_channel_with_record_too_large ... ok test stream::tests::silent_server_gets_ping_then_liveness_close_4008 ... ok test login::tests::independent_cli_and_mcp_processes_rotate_once_and_reuse_saved_access ... ok test ssh::tests::detach_bounds_a_stalled_close_send ... ok test result: ok. 41 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.31s Running tests/agent_tunnel.rs (target/debug/deps/agent_tunnel-3131a6e194ddc3c7) running 1 test test real_infraternal_agent_process_enrolls_and_reconnects_with_new_nonce ... FAILED failures: ---- real_infraternal_agent_process_enrolls_and_reconnects_with_new_nonce stdout ---- thread 'real_infraternal_agent_process_enrolls_and_reconnects_with_new_nonce' (1459785) panicked at crates/infraternal/tests/agent_tunnel.rs:580:5: remote inventory was not published note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace failures: real_infraternal_agent_process_enrolls_and_reconnects_with_new_nonce test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out; finished in 10.99s error: test failed, to rerun pass `-p infraternal --test agent_tunnel` ``` Isolated `cargo test -p infraternal-server --test private_storage` (exit 0), exact final output: ```text Compiling infraternal-server v0.0.1 (/mnt/hdd/infraternal/wt-lp/lp-supply/crates/server) Finished `test` profile [unoptimized] target(s) in 1m 25s Running tests/private_storage.rs (target/debug/deps/private_storage-c385c39fa161b378) running 1 test test database_wal_and_backup_are_private_and_reject_substitution ... ok test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.10s ```
Author
Owner

lp-flaky targeted verification started at 18:27 UTC with load5 8.72: cargo test -p infraternal --test cli_mcp cli_and_mcp_use_the_public_http_contract -- --ignored --exact --nocapture --test-threads=1. CARGO_BUILD_JOBS=1, nice 15. This is iteration 1/20 of the full scenario; compilation is in progress, no pass claimed. Shared fixture startup performs a HOME-wide stale sweep, so all test commands in this continuation use a fresh job-specific HOME; Cargo/Rustup cache paths remain preserved. This confines fixture cleanup to resources created in this run and honors the hard no-signalling-other-processes rule. Heavy gates remain pending until no active verification and load5 <= 6.

lp-flaky targeted verification started at 18:27 UTC with load5 8.72: cargo test -p infraternal --test cli_mcp cli_and_mcp_use_the_public_http_contract -- --ignored --exact --nocapture --test-threads=1. CARGO_BUILD_JOBS=1, nice 15. This is iteration 1/20 of the full scenario; compilation is in progress, no pass claimed. Shared fixture startup performs a HOME-wide stale sweep, so all test commands in this continuation use a fresh job-specific HOME; Cargo/Rustup cache paths remain preserved. This confines fixture cleanup to resources created in this run and honors the hard no-signalling-other-processes rule. Heavy gates remain pending until no active verification and load5 <= 6.
Author
Owner

20:33 UTC checkpoint: merge is still queued (about 16 minutes waiting). load5 is now 7.63, but other active verify/release-build/browser processes remain, so the requested no-concurrent-verify condition is not met. Head remains 0909f91aa221def0755be41316b9237fa9b6e820, working tree clean; no changes after the passing targeted supply-chain evidence. Waiting without signalling unrelated processes or accessing other jobs' files.

20:33 UTC checkpoint: merge is still queued (about 16 minutes waiting). load5 is now 7.63, but other active verify/release-build/browser processes remain, so the requested no-concurrent-verify condition is not met. Head remains `0909f91aa221def0755be41316b9237fa9b6e820`, working tree clean; no changes after the passing targeted supply-chain evidence. Waiting without signalling unrelated processes or accessing other jobs' files.
Author
Owner

Orchestrator, gate policy from 00:10 IST: with about 12 jobs running, waiting for 'no other scripts/verify run active' deadlocks. Jobs: run scripts/verify fast plus your targeted tests, then finish and report 'merge gate pending'. Do not wait for scripts/verify merge. The orchestrator runs merge gates centrally, one at a time, on ready branches.

Orchestrator, gate policy from 00:10 IST: with about 12 jobs running, waiting for 'no other scripts/verify run active' deadlocks. **Jobs: run `scripts/verify fast` plus your targeted tests, then finish and report 'merge gate pending'. Do not wait for `scripts/verify merge`.** The orchestrator runs merge gates centrally, one at a time, on ready branches.
Author
Owner

lp-flaky verification finding at head 9a55cb2: compilation of the CLI/MCP target succeeds after building the missing real web prerequisite through the repository dependency helper and scripts/build-web. No tracked product code changed.

A focused real-sshd reproduction under a fresh isolated HOME inside /home/kayg fails the known killed-client replay exit assertion at low load (load5 4.86 before reproduction). Command:

CARGO_BUILD_JOBS=1 INFRATERNAL_CLI_MCP_SSH_ONLY=1 cargo test -p infraternal --test cli_mcp cli_and_mcp_use_the_public_http_contract -- --ignored --exact --nocapture --test-threads=1

The piped EOF check now completes with expected remote exit 3. The reattached replay shell emits BEFORE/AFTER, consumes finish, and prints exit, but its compiled CLI does not exit within the unchanged 15-second deadline. This is 0/1 pass for the focused proof so far. Evidence:

    Finished `test` profile [unoptimized] target(s) in 0.45s
     Running tests/cli_mcp.rs (target/debug/deps/cli_mcp-790383087740bf0e)

running 1 test
test cli_and_mcp_use_the_public_http_contract ... Warning: the OS keychain is unavailable; using a permission-restricted credential file.
Warning: the OS keychain is unavailable; using a permission-restricted credential file.

thread 'cli_and_mcp_use_the_public_http_contract' (1590140) panicked at crates/infraternal/tests/cli_mcp.rs:3484:5:
PTY harness failed: Traceback (most recent call last):
  File "<string>", line 138, in <module>
    raise RuntimeError('compiled CLI did not exit: ' + output)
RuntimeError: compiled CLI did not exit: Warning: the OS keychain is unavailable; using a permission-restricted credential file.
Session	s_01M3YYQX289CVFKACZXT0EWX21
printf '%s%s\n' '__CLI_SSH_REPLAY_' 'BEFORE__'; read -r _continue; printf '%s%s\n' '__CLI_SSH_REPLAY_' 'AFTER__'; read _finish; exit 19
[?2004hbash-5.2$ printf '%s%s\n' '__CLI_SSH_REPLAY_' 'BEFORE__'; read -r _continue; prin
ntf '%s%s\n' '__CLI_SSH_REPLAY_' 'AFTER__'; read _finish; exit 19
[?2004l
__CLI_SSH_REPLAY_BEFORE__
continue
__CLI_SSH_REPLAY_AFTER__
finish
exit


note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
FAILED

failures:

failures:
    cli_and_mcp_use_the_public_http_contract

test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out; finished in 22.89s

error: test failed, to rerun pass `-p infraternal --test cli_mcp`

Investigating whether the exit event is retained and CLOSE delivered, versus CLI shutdown remaining blocked after CLOSE. Proposed product follow-up if confirmed: fix the exit-to-CLOSE or CLI shutdown path while retaining the remote exit-code assertion; no product code is changed in this test-only branch. Server lifecycle 20-repeat proof is compiling independently; fast/merge still pending permitted scheduling slots.

Verification setup correction: an isolated HOME under /tmp made authorized-key ancestry fail OpenSSH StrictModes. Fresh homes must be inside the actual user home; this preserves isolation from all prior jobs and keeps existing StrictModes checks intact. OpenSSH path-permission reference: https://github.com/openssh/openssh-portable/blob/master/regress/check-perm.c

lp-flaky verification finding at head 9a55cb2: compilation of the CLI/MCP target succeeds after building the missing real web prerequisite through the repository dependency helper and scripts/build-web. No tracked product code changed. A focused real-sshd reproduction under a fresh isolated HOME inside /home/kayg fails the known killed-client replay exit assertion at low load (load5 4.86 before reproduction). Command: ``` CARGO_BUILD_JOBS=1 INFRATERNAL_CLI_MCP_SSH_ONLY=1 cargo test -p infraternal --test cli_mcp cli_and_mcp_use_the_public_http_contract -- --ignored --exact --nocapture --test-threads=1 ``` The piped EOF check now completes with expected remote exit 3. The reattached replay shell emits BEFORE/AFTER, consumes `finish`, and prints `exit`, but its compiled CLI does not exit within the unchanged 15-second deadline. This is 0/1 pass for the focused proof so far. Evidence: ``` Finished `test` profile [unoptimized] target(s) in 0.45s Running tests/cli_mcp.rs (target/debug/deps/cli_mcp-790383087740bf0e) running 1 test test cli_and_mcp_use_the_public_http_contract ... Warning: the OS keychain is unavailable; using a permission-restricted credential file. Warning: the OS keychain is unavailable; using a permission-restricted credential file. thread 'cli_and_mcp_use_the_public_http_contract' (1590140) panicked at crates/infraternal/tests/cli_mcp.rs:3484:5: PTY harness failed: Traceback (most recent call last): File "<string>", line 138, in <module> raise RuntimeError('compiled CLI did not exit: ' + output) RuntimeError: compiled CLI did not exit: Warning: the OS keychain is unavailable; using a permission-restricted credential file. Session s_01M3YYQX289CVFKACZXT0EWX21 printf '%s%s\n' '__CLI_SSH_REPLAY_' 'BEFORE__'; read -r _continue; printf '%s%s\n' '__CLI_SSH_REPLAY_' 'AFTER__'; read _finish; exit 19 [?2004hbash-5.2$ printf '%s%s\n' '__CLI_SSH_REPLAY_' 'BEFORE__'; read -r _continue; prin ntf '%s%s\n' '__CLI_SSH_REPLAY_' 'AFTER__'; read _finish; exit 19 [?2004l __CLI_SSH_REPLAY_BEFORE__ continue __CLI_SSH_REPLAY_AFTER__ finish exit note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace FAILED failures: failures: cli_and_mcp_use_the_public_http_contract test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out; finished in 22.89s error: test failed, to rerun pass `-p infraternal --test cli_mcp` ``` Investigating whether the exit event is retained and CLOSE delivered, versus CLI shutdown remaining blocked after CLOSE. Proposed product follow-up if confirmed: fix the exit-to-CLOSE or CLI shutdown path while retaining the remote exit-code assertion; no product code is changed in this test-only branch. Server lifecycle 20-repeat proof is compiling independently; fast/merge still pending permitted scheduling slots. Verification setup correction: an isolated HOME under /tmp made authorized-key ancestry fail OpenSSH StrictModes. Fresh homes must be inside the actual user home; this preserves isolation from all prior jobs and keeps existing StrictModes checks intact. OpenSSH path-permission reference: https://github.com/openssh/openssh-portable/blob/master/regress/check-perm.c
Author
Owner

Readiness harness correction: host_detail_response in crates/server/src/resources.rs only reads local inventory and therefore reports an enrolled remote host offline; host_summary used by GET /api/v1/hosts checks TunnelService::connected. The perf harness now waits for that list summary and detects an early owned-process exit. No product source changed.

First calibration attempt was incomplete (no baseline saved). Real partial dev measurements on unchanged 6f6fd89 product trees: stripped binary 32,643,704 bytes; idle server maximum RSS 29,646,848 bytes; 60-second idle CPU mean 0.5162214300% of one core and p95 0.9997288246%. Absolute budget outcomes are recorded separately from dev calibration; these are dev diagnostics, not perf-test VM claims.

The existing real stream workload's final threshold checker is now captured at full numeric precision by a scoped Bun wrapper. Workload assertions remain intact; the new perf evaluator alone applies baseline +10% or absolute budgets. This avoids rounded values and the old fixed dev thresholds defeating calibration. Tests cover strict budget boundaries, malformed/incomplete captures and forwarding stdin without printing capabilities.

Readiness harness correction: `host_detail_response` in `crates/server/src/resources.rs` only reads local inventory and therefore reports an enrolled remote host offline; `host_summary` used by GET /api/v1/hosts checks `TunnelService::connected`. The perf harness now waits for that list summary and detects an early owned-process exit. No product source changed. First calibration attempt was incomplete (no baseline saved). Real partial dev measurements on unchanged 6f6fd89 product trees: stripped binary 32,643,704 bytes; idle server maximum RSS 29,646,848 bytes; 60-second idle CPU mean 0.5162214300% of one core and p95 0.9997288246%. Absolute budget outcomes are recorded separately from dev calibration; these are dev diagnostics, not perf-test VM claims. The existing real stream workload's final threshold checker is now captured at full numeric precision by a scoped Bun wrapper. Workload assertions remain intact; the new perf evaluator alone applies baseline +10% or absolute budgets. This avoids rounded values and the old fixed dev thresholds defeating calibration. Tests cover strict budget boundaries, malformed/incomplete captures and forwarding stdin without printing capabilities.
Author
Owner

lp-flaky at 18d221c: server SSH lifecycle repeat proof passed 20/20. Both replay synchronization fixes are exercised by this one test. The first attempt found an incorrect added assertion expecting explicit gap:false; production omits that flag for complete replay (gap().then_some(true)). Commit 18d221c corrects the test to require omitted gap, with a comment explaining the wire representation. No product code changed. Verbatim repeat output:

OWN_HOME /home/kayg/lpf-home-20261002-YI4Zkj
START ssh-product 1/20 load=4.00 4.06 6.81 5/1239 1606920
PASS ssh-product 1/20
START ssh-product 2/20 load=4.15 4.09 6.79 5/1210 1607289
PASS ssh-product 2/20
START ssh-product 3/20 load=4.78 4.23 6.82 5/1224 1607602
PASS ssh-product 3/20
START ssh-product 4/20 load=4.78 4.23 6.82 6/1248 1607869
PASS ssh-product 4/20
START ssh-product 5/20 load=5.20 4.32 6.84 6/1322 1608479
PASS ssh-product 5/20
START ssh-product 6/20 load=5.66 4.43 6.86 5/1344 1608949
PASS ssh-product 6/20
START ssh-product 7/20 load=5.53 4.43 6.84 6/1323 1609341
PASS ssh-product 7/20
START ssh-product 8/20 load=5.73 4.49 6.85 7/1331 1609817
PASS ssh-product 8/20
START ssh-product 9/20 load=5.73 4.49 6.85 5/1329 1610416
PASS ssh-product 9/20
START ssh-product 10/20 load=5.67 4.49 6.84 14/1336 1610937
PASS ssh-product 10/20
START ssh-product 11/20 load=5.78 4.54 6.84 5/1316 1612206
PASS ssh-product 11/20
START ssh-product 12/20 load=5.88 4.58 6.84 9/1310 1612477
PASS ssh-product 12/20
START ssh-product 13/20 load=5.88 4.58 6.84 5/1330 1612880
PASS ssh-product 13/20
START ssh-product 14/20 load=5.89 4.60 6.84 6/1331 1613230
PASS ssh-product 14/20
START ssh-product 15/20 load=5.81 4.61 6.83 15/1338 1613597
PASS ssh-product 15/20
START ssh-product 16/20 load=5.75 4.62 6.82 5/1329 1614023
PASS ssh-product 16/20
START ssh-product 17/20 load=6.25 4.74 6.84 5/1320 1614597
PASS ssh-product 17/20
START ssh-product 18/20 load=8.63 5.26 7.00 3/1353 1615936
PASS ssh-product 18/20
START ssh-product 19/20 load=8.63 5.26 7.00 3/1342 1616091
PASS ssh-product 19/20
START ssh-product 20/20 load=8.18 5.22 6.98 3/1350 1616258
PASS ssh-product 20/20

CLI replay proof remains failing/pending; cleanup, surrounding tests, fast and merge remain pending.

lp-flaky at 18d221c: server SSH lifecycle repeat proof passed 20/20. Both replay synchronization fixes are exercised by this one test. The first attempt found an incorrect added assertion expecting explicit gap:false; production omits that flag for complete replay (gap().then_some(true)). Commit 18d221c corrects the test to require omitted gap, with a comment explaining the wire representation. No product code changed. Verbatim repeat output: ``` OWN_HOME /home/kayg/lpf-home-20261002-YI4Zkj START ssh-product 1/20 load=4.00 4.06 6.81 5/1239 1606920 PASS ssh-product 1/20 START ssh-product 2/20 load=4.15 4.09 6.79 5/1210 1607289 PASS ssh-product 2/20 START ssh-product 3/20 load=4.78 4.23 6.82 5/1224 1607602 PASS ssh-product 3/20 START ssh-product 4/20 load=4.78 4.23 6.82 6/1248 1607869 PASS ssh-product 4/20 START ssh-product 5/20 load=5.20 4.32 6.84 6/1322 1608479 PASS ssh-product 5/20 START ssh-product 6/20 load=5.66 4.43 6.86 5/1344 1608949 PASS ssh-product 6/20 START ssh-product 7/20 load=5.53 4.43 6.84 6/1323 1609341 PASS ssh-product 7/20 START ssh-product 8/20 load=5.73 4.49 6.85 7/1331 1609817 PASS ssh-product 8/20 START ssh-product 9/20 load=5.73 4.49 6.85 5/1329 1610416 PASS ssh-product 9/20 START ssh-product 10/20 load=5.67 4.49 6.84 14/1336 1610937 PASS ssh-product 10/20 START ssh-product 11/20 load=5.78 4.54 6.84 5/1316 1612206 PASS ssh-product 11/20 START ssh-product 12/20 load=5.88 4.58 6.84 9/1310 1612477 PASS ssh-product 12/20 START ssh-product 13/20 load=5.88 4.58 6.84 5/1330 1612880 PASS ssh-product 13/20 START ssh-product 14/20 load=5.89 4.60 6.84 6/1331 1613230 PASS ssh-product 14/20 START ssh-product 15/20 load=5.81 4.61 6.83 15/1338 1613597 PASS ssh-product 15/20 START ssh-product 16/20 load=5.75 4.62 6.82 5/1329 1614023 PASS ssh-product 16/20 START ssh-product 17/20 load=6.25 4.74 6.84 5/1320 1614597 PASS ssh-product 17/20 START ssh-product 18/20 load=8.63 5.26 7.00 3/1353 1615936 PASS ssh-product 18/20 START ssh-product 19/20 load=8.63 5.26 7.00 3/1342 1616091 PASS ssh-product 19/20 START ssh-product 20/20 load=8.18 5.22 6.98 3/1350 1616258 PASS ssh-product 20/20 ``` CLI replay proof remains failing/pending; cleanup, surrounding tests, fast and merge remain pending.
Author
Owner

20:48 UTC checkpoint: merge is still queued for the required exclusive verification slot; active gate/build processes remain. load5 is 5.90 and the worktree is clean at 0909f91aa221def0755be41316b9237fa9b6e820. The gate has not been skipped or run concurrently with another verification run. No source changes since the implementation commit.

20:48 UTC checkpoint: merge is still queued for the required exclusive verification slot; active gate/build processes remain. load5 is 5.90 and the worktree is clean at `0909f91aa221def0755be41316b9237fa9b6e820`. The gate has not been skipped or run concurrently with another verification run. No source changes since the implementation commit.
Author
Owner

lp-flaky update, head 020f6f7:

  • Added shared-fixture INFRATERNAL_TEST_SSHD_ROOT override (908ccdf) for a fresh root under real HOME. Both startup and stale sweep use that root, leaving HOME and engine configuration untouched. All current/future verification uses the override; it confines signalling to this run's fixtures.
  • Server no-gap wire assertion corrected in 18d221c; prior server proof 20/20 passed.
  • Full CLI/MCP now reaches and passes the modified SSH/log/exec/slow-reader/EOF sections, then fails an unrelated later MCP error assertion. Relevant output follows. No product code is changed.
  • Added INFRATERNAL_CLI_MCP_STREAM_ONLY selection immediately after the stream EOF checks (020f6f7), matching the existing SSH-only selectors. Default integration continues through all MCP assertions unchanged. This enables a targeted 20-repeat proof of every changed stream regression.
  • SSH-only repeat proof currently 10/20 passed; its earlier replay exit failure is intermittent, not a confirmed product defect. Stream proof, server proof on final head, cleanup/real_sshd, fast and merge remain pending.
   Compiling infraternal v0.0.1 (/mnt/hdd/infraternal/wt-lp/lp-flaky/crates/infraternal)
    Finished `test` profile [unoptimized] target(s) in 7.42s
     Running tests/cli_mcp.rs (target/debug/deps/cli_mcp-790383087740bf0e)

running 1 test
test cli_and_mcp_use_the_public_http_contract ... Warning: the OS keychain is unavailable; using a permission-restricted credential file.
Warning: the OS keychain is unavailable; using a permission-restricted credential file.
Warning: the OS keychain is unavailable; using a permission-restricted credential file.
Warning: the OS keychain is unavailable; using a permission-restricted credential file.
Warning: the OS keychain is unavailable; using a permission-restricted credential file.
CLI_MCP_SLOW_COMMAND command=logs elapsed_ms=10011
STREAM_EXEC_RTT_MS runtime=docker elapsed_ms=318
CLI_MCP_SLOW_COMMAND command=logs elapsed_ms=10009
STREAM_EXEC_RTT_MS runtime=podman elapsed_ms=406
STREAM_SLOW_READER bytes=8388613 rss_delta_kib=48
Warning: the OS keychain is unavailable; using a permission-restricted credential file.

thread 'cli_and_mcp_use_the_public_http_contract' (1625664) panicked at crates/infraternal/tests/cli_mcp.rs:1773:9:
schema type "object" rejected null
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
Warning: the OS keychain is unavailable; using a permission-restricted credential file.

thread 'cli_and_mcp_use_the_public_http_contract' (1625664) panicked at crates/infraternal/tests/cli_mcp.rs:1743:5:
assertion `left == right` failed
  left: Some(false)
 right: Some(true)
FAILED

failures:

failures:
    cli_and_mcp_use_the_public_http_contract

test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out; finished in 101.21s

error: test failed, to rerun pass `-p infraternal --test cli_mcp`

Proposed follow-up for full-test failure: diagnose the MCP refusal that unexpectedly returns success, retaining its PlanRequired/error assertion. The branch's product code is identical to base 6f6fd89; this test-only job will not modify authorization or MCP product paths.

lp-flaky update, head 020f6f7: - Added shared-fixture INFRATERNAL_TEST_SSHD_ROOT override (908ccdf) for a fresh root under real HOME. Both startup and stale sweep use that root, leaving HOME and engine configuration untouched. All current/future verification uses the override; it confines signalling to this run's fixtures. - Server no-gap wire assertion corrected in 18d221c; prior server proof 20/20 passed. - Full CLI/MCP now reaches and passes the modified SSH/log/exec/slow-reader/EOF sections, then fails an unrelated later MCP error assertion. Relevant output follows. No product code is changed. - Added INFRATERNAL_CLI_MCP_STREAM_ONLY selection immediately after the stream EOF checks (020f6f7), matching the existing SSH-only selectors. Default integration continues through all MCP assertions unchanged. This enables a targeted 20-repeat proof of every changed stream regression. - SSH-only repeat proof currently 10/20 passed; its earlier replay exit failure is intermittent, not a confirmed product defect. Stream proof, server proof on final head, cleanup/real_sshd, fast and merge remain pending. ``` Compiling infraternal v0.0.1 (/mnt/hdd/infraternal/wt-lp/lp-flaky/crates/infraternal) Finished `test` profile [unoptimized] target(s) in 7.42s Running tests/cli_mcp.rs (target/debug/deps/cli_mcp-790383087740bf0e) running 1 test test cli_and_mcp_use_the_public_http_contract ... Warning: the OS keychain is unavailable; using a permission-restricted credential file. Warning: the OS keychain is unavailable; using a permission-restricted credential file. Warning: the OS keychain is unavailable; using a permission-restricted credential file. Warning: the OS keychain is unavailable; using a permission-restricted credential file. Warning: the OS keychain is unavailable; using a permission-restricted credential file. CLI_MCP_SLOW_COMMAND command=logs elapsed_ms=10011 STREAM_EXEC_RTT_MS runtime=docker elapsed_ms=318 CLI_MCP_SLOW_COMMAND command=logs elapsed_ms=10009 STREAM_EXEC_RTT_MS runtime=podman elapsed_ms=406 STREAM_SLOW_READER bytes=8388613 rss_delta_kib=48 Warning: the OS keychain is unavailable; using a permission-restricted credential file. thread 'cli_and_mcp_use_the_public_http_contract' (1625664) panicked at crates/infraternal/tests/cli_mcp.rs:1773:9: schema type "object" rejected null note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace Warning: the OS keychain is unavailable; using a permission-restricted credential file. thread 'cli_and_mcp_use_the_public_http_contract' (1625664) panicked at crates/infraternal/tests/cli_mcp.rs:1743:5: assertion `left == right` failed left: Some(false) right: Some(true) FAILED failures: failures: cli_and_mcp_use_the_public_http_contract test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out; finished in 101.21s error: test failed, to rerun pass `-p infraternal --test cli_mcp` ``` Proposed follow-up for full-test failure: diagnose the MCP refusal that unexpectedly returns success, retaining its PlanRequired/error assertion. The branch's product code is identical to base 6f6fd89; this test-only job will not modify authorization or MCP product paths.
Author
Owner

Lifecycle measurement now cross-checks CDP with a transparent loopback HTTP/upgraded-TCP observer. Full document replacement omitted some CDP webSocketClosed events in real Chromium runs; counting that stale ledger as real sockets would overstate leaks. The observer matches handshake keys, retires entries on actual TCP closure/read EOF, forwards authentication and bytes unchanged with pipe backpressure, and fails if ledgers do not match. A real TCP test deliberately omits the CDP close event and verifies retirement. The SPA-retained transport remains measured independently.

Setup enrollment is asynchronous because its HTTP requests pass through that same Node event loop. The one stuck owned enrollment subprocess was interrupted by verified parent-child identity; no other job was signaled.

CPU sampling now uses the external POSIX process CPU clock, including all threads, plus monotonic elapsed time. HZ=100 stat ticks quantized one-second p95 to 1% and produced a false-zero standalone baseline. Tests verify sub-tick work is retained and nonexistent processes fail instead of aliasing a Linux clock id. Reference: https://man7.org/linux/man-pages/man3/clock_getcpuclockid.3.html . All 12 targeted tests pass. No complete baseline has yet been saved; fresh complete calibration remains in progress.

Lifecycle measurement now cross-checks CDP with a transparent loopback HTTP/upgraded-TCP observer. Full document replacement omitted some CDP webSocketClosed events in real Chromium runs; counting that stale ledger as real sockets would overstate leaks. The observer matches handshake keys, retires entries on actual TCP closure/read EOF, forwards authentication and bytes unchanged with pipe backpressure, and fails if ledgers do not match. A real TCP test deliberately omits the CDP close event and verifies retirement. The SPA-retained transport remains measured independently. Setup enrollment is asynchronous because its HTTP requests pass through that same Node event loop. The one stuck owned enrollment subprocess was interrupted by verified parent-child identity; no other job was signaled. CPU sampling now uses the external POSIX process CPU clock, including all threads, plus monotonic elapsed time. HZ=100 stat ticks quantized one-second p95 to 1% and produced a false-zero standalone baseline. Tests verify sub-tick work is retained and nonexistent processes fail instead of aliasing a Linux clock id. Reference: https://man7.org/linux/man-pages/man3/clock_getcpuclockid.3.html . All 12 targeted tests pass. No complete baseline has yet been saved; fresh complete calibration remains in progress.
Author
Owner

Starting fix-ps in worktree /mnt/hdd/infraternal/wt-lp/fix-ps, branch fix-private-storage, based on dev at d91cf0aef9ccec9c8803d17ee6a67054339c92bf. I am tracing the test and SQLite pool close behavior before choosing a deterministic test-only fix; scope is crates/server/tests/private_storage.rs.

Starting fix-ps in worktree `/mnt/hdd/infraternal/wt-lp/fix-ps`, branch `fix-private-storage`, based on `dev` at `d91cf0aef9ccec9c8803d17ee6a67054339c92bf`. I am tracing the test and SQLite pool close behavior before choosing a deterministic test-only fix; scope is `crates/server/tests/private_storage.rs`.
Author
Owner

Starting fix-ps in worktree /mnt/hdd/infraternal/wt-lp/fix-ps, branch fix-private-storage, based on dev at d91cf0aef9ccec9c8803d17ee6a67054339c92bf. I am tracing the test and SQLite pool close behavior before choosing a deterministic test-only fix; scope is crates/server/tests/private_storage.rs.

Starting fix-ps in worktree `/mnt/hdd/infraternal/wt-lp/fix-ps`, branch `fix-private-storage`, based on `dev` at `d91cf0aef9ccec9c8803d17ee6a67054339c92bf`. I am tracing the test and SQLite pool close behavior before choosing a deterministic test-only fix; scope is `crates/server/tests/private_storage.rs`.
Author
Owner

Finding from source inspection: SqliteStorage::close(self) awaits self.pool.close() at crates/server/src/storage/mod.rs:454-456. The pinned SQLx 0.8.6 Pool::close() contract says awaiting it waits for checked-out connections to be returned or closed, so the storage close implementation does wait for the pool; this is not evidence of a product bug. The flaky assertion is the test's unconditional symlink() over a WAL sidecar SQLite may validly leave as a regular file. I will make the test verify and remove that existing private regular sidecar before planting the hostile symlink.

SQLx 0.8.6 docs: https://docs.rs/sqlx/0.8.6/sqlx/struct.Pool.html#method.close

Finding from source inspection: `SqliteStorage::close(self)` awaits `self.pool.close()` at `crates/server/src/storage/mod.rs:454-456`. The pinned SQLx 0.8.6 `Pool::close()` contract says awaiting it waits for checked-out connections to be returned or closed, so the storage close implementation does wait for the pool; this is not evidence of a product bug. The flaky assertion is the test's unconditional `symlink()` over a WAL sidecar SQLite may validly leave as a regular file. I will make the test verify and remove that existing private regular sidecar before planting the hostile symlink. SQLx 0.8.6 docs: https://docs.rs/sqlx/0.8.6/sqlx/struct.Pool.html#method.close
Author
Owner

Merge started at load1=2.14/load5=2.81 with no active verification/release-build/browser process detected. All fast stages passed within merge, including the workspace tests; neither earlier test failure recurred on this run. No source or timeout changes were made. Release binary is currently building for the real service and production-browser smokes. One full release build was observed. Head: 0909f91aa221def0755be41316b9237fa9b6e820. Exact gate output so far (merge is not yet complete):

PASS fast: migrations are append-only (0.108s)
PASS fast: workspace package dependencies (0.234s)
PASS fast: JavaScript dependencies (0.009s)
PASS fast: advisory review policy tests (0.112s)
SUPPLY_CHAIN_REVIEWS advisory exceptions are within their review windows
SUPPLY_CHAIN cargo-deny: cargo-deny 0.20.2
SUPPLY_CHAIN_NOTICES generated THIRD_PARTY_NOTICES.md from 95 frontend packages
SUPPLY_CHAIN_NOTICES copied source: 179 shadcn files, 3 calternal-derived files
SUPPLY_CHAIN_NOTICES license files: 66 distinct texts; 0 packages need manual license review
warning[yanked]: detected yanked crate (try `cargo update -p yoke-derive`)
    ┌─ /mnt/hdd/infraternal/wt-lp/lp-supply/Cargo.lock:529:1
    │
529 │ yoke-derive 0.8.3 registry+https://github.com/rust-lang/crates.io-index
    │ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ yanked version

advisories ok
SUPPLY_CHAIN_RUST_ADVISORIES passed with refreshed advisory data
licenses ok
SUPPLY_CHAIN_RUST_LICENSES passed
bun audit v1.4.2 (744846f84)

cookie@0.6.0
  workspace:@infraternal/web > @sveltejs/kit > cookie
  low: cookie accepts cookie name, path, and domain with out of bounds characters (<0.7.0) - https://github.com/advisories/GHSA-pxg6-pf52-xh8x

1 vulnerability (1 low)

  bun audit fix           upgrade the vulnerable packages within their ranges
  bun audit fix --latest  also cross major versions
SUPPLY_CHAIN_BUN_AUDIT findings reported; this check is report-only
SUPPLY_CHAIN_PASS Rust advisory/license checks complete; Bun findings are report-only
PASS fast: supply-chain checks (5.420s)
PASS fast: build web app (14.424s)
PASS fast: cargo fmt --check (0.869s)
PASS fast: cargo clippy (28.010s)
PASS fast: cargo test (116.487s)
PASS fast: svelte-check (11.942s)
PASS fast: UI package svelte-check (5.242s)
PASS fast: stream package typecheck (4.842s)
PASS fast: Vitest (3.677s)
PASS fast: UI package Vitest (8.421s)
PASS fast: stream package Vitest (0.758s)
PASS fast: OpenAPI and TypeScript client drift (61.577s)
PASS fast: terminal TypeScript (1.851s)
PASS fast: terminal Vitest (0.984s)
Merge started at load1=2.14/load5=2.81 with no active verification/release-build/browser process detected. **All fast stages passed within merge**, including the workspace tests; neither earlier test failure recurred on this run. No source or timeout changes were made. Release binary is currently building for the real service and production-browser smokes. One full release build was observed. Head: `0909f91aa221def0755be41316b9237fa9b6e820`. Exact gate output so far (merge is not yet complete): ```text PASS fast: migrations are append-only (0.108s) PASS fast: workspace package dependencies (0.234s) PASS fast: JavaScript dependencies (0.009s) PASS fast: advisory review policy tests (0.112s) SUPPLY_CHAIN_REVIEWS advisory exceptions are within their review windows SUPPLY_CHAIN cargo-deny: cargo-deny 0.20.2 SUPPLY_CHAIN_NOTICES generated THIRD_PARTY_NOTICES.md from 95 frontend packages SUPPLY_CHAIN_NOTICES copied source: 179 shadcn files, 3 calternal-derived files SUPPLY_CHAIN_NOTICES license files: 66 distinct texts; 0 packages need manual license review warning[yanked]: detected yanked crate (try `cargo update -p yoke-derive`) ┌─ /mnt/hdd/infraternal/wt-lp/lp-supply/Cargo.lock:529:1 │ 529 │ yoke-derive 0.8.3 registry+https://github.com/rust-lang/crates.io-index │ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ yanked version advisories ok SUPPLY_CHAIN_RUST_ADVISORIES passed with refreshed advisory data licenses ok SUPPLY_CHAIN_RUST_LICENSES passed bun audit v1.4.2 (744846f84) cookie@0.6.0 workspace:@infraternal/web > @sveltejs/kit > cookie low: cookie accepts cookie name, path, and domain with out of bounds characters (<0.7.0) - https://github.com/advisories/GHSA-pxg6-pf52-xh8x 1 vulnerability (1 low) bun audit fix upgrade the vulnerable packages within their ranges bun audit fix --latest also cross major versions SUPPLY_CHAIN_BUN_AUDIT findings reported; this check is report-only SUPPLY_CHAIN_PASS Rust advisory/license checks complete; Bun findings are report-only PASS fast: supply-chain checks (5.420s) PASS fast: build web app (14.424s) PASS fast: cargo fmt --check (0.869s) PASS fast: cargo clippy (28.010s) PASS fast: cargo test (116.487s) PASS fast: svelte-check (11.942s) PASS fast: UI package svelte-check (5.242s) PASS fast: stream package typecheck (4.842s) PASS fast: Vitest (3.677s) PASS fast: UI package Vitest (8.421s) PASS fast: stream package Vitest (0.758s) PASS fast: OpenAPI and TypeScript client drift (61.577s) PASS fast: terminal TypeScript (1.851s) PASS fast: terminal Vitest (0.984s) ```
Author
Owner

Real 500-container workload completed on unchanged dev product trees (250 owned Docker +250 owned rootless Podman fixtures): API list p99 9.167717000000001ms; maximum conditional-304 allocation across100 empty304 responses 894,855bytes. Native/Rust process-wide interposition includes storage workers and background work, conservatively. These are dev diagnostics, not perf-test VM results.

Idle correction: Dashboard's onMount interval refreshes both list APIs every2seconds. Before both CPU windows, the harness now navigates to about:blank and drains requests, retaining origin authentication storage for the later UI workload. Earlier preliminary CPU figures included Dashboard polling and are not used as idle baselines. Corrected idle serverRSS29,212,672bytes/CPUmean0.5346486849%/p951.0480281417%; standaloneRSS16,171,008bytes/CPUmean0.04256601394%/p950.1738007420%.

Cold-route correction: the preceding lifecycle workload saves a persistent terminal reattach point; full container-detail reload restores it automatically, adding xterm to the supposedly terminal-excluded cold route. The cold phase now clears only the owned fixture's saved reattach point before route reloads; authentication remains intact and the real detached shell is cleaned up with its container. A fresh complete baseline must use this corrected harness fingerprint. No completed calibrated candidate comparison has run yet, and no saved baseline will be overwritten.

The remaining Chromium stream benchmark is waiting at host admission (load1 reached18.85; no active browser). No other job/process was signaled. Fast/merge remain pending final verification; merge will wait for load5<8 and no other scripts/verify.

Real 500-container workload completed on unchanged dev product trees (250 owned Docker +250 owned rootless Podman fixtures): API list p99 9.167717000000001ms; maximum conditional-304 allocation across100 empty304 responses 894,855bytes. Native/Rust process-wide interposition includes storage workers and background work, conservatively. These are dev diagnostics, not perf-test VM results. Idle correction: Dashboard's onMount interval refreshes both list APIs every2seconds. Before both CPU windows, the harness now navigates to about:blank and drains requests, retaining origin authentication storage for the later UI workload. Earlier preliminary CPU figures included Dashboard polling and are not used as idle baselines. Corrected idle serverRSS29,212,672bytes/CPUmean0.5346486849%/p951.0480281417%; standaloneRSS16,171,008bytes/CPUmean0.04256601394%/p950.1738007420%. Cold-route correction: the preceding lifecycle workload saves a persistent terminal reattach point; full container-detail reload restores it automatically, adding xterm to the supposedly terminal-excluded cold route. The cold phase now clears only the owned fixture's saved reattach point before route reloads; authentication remains intact and the real detached shell is cleaned up with its container. A fresh complete baseline must use this corrected harness fingerprint. No completed calibrated candidate comparison has run yet, and no saved baseline will be overwritten. The remaining Chromium stream benchmark is waiting at host admission (load1 reached18.85; no active browser). No other job/process was signaled. Fast/merge remain pending final verification; merge will wait for load5<8 and no other scripts/verify.
Author
Owner

Scheduling blocker after ~95 minutes: baseline build still has not started. load5 briefly fell below 6, but other verify/release Cargo processes remained active throughout those windows; load5 is now 12.60. Continuing to wait under the explicit low-priority/no-overlap rules. Worktree remains clean at 6f6fd89. No new binary size, build time, gate success or runtime result is claimed. Findings are in earlier comments; resume state is in excluded progress.md.

Scheduling blocker after ~95 minutes: baseline build still has not started. load5 briefly fell below 6, but other verify/release Cargo processes remained active throughout those windows; load5 is now 12.60. Continuing to wait under the explicit low-priority/no-overlap rules. Worktree remains clean at 6f6fd89. No new binary size, build time, gate success or runtime result is claimed. Findings are in earlier comments; resume state is in excluded progress.md.
Author
Owner

lp-flaky continuation head 4ef61c7. Further test-only fixes and evidence:

  • Plain SSH-only repeat at the earlier head passed 16 times, then reproduced the original five-second piped EOF timeout at load5 3.60. The SSH product path converts stream EOF into Ctrl-D; the test had been closing stdin while Bash readline could still be accepting the command. Inference from this behavior: command-output readiness must precede EOF so Ctrl-D reaches canonical PTY input. Commit 4e149cb adds a split output marker, waits for it, then closes stdin. The original total five-second deadline and remote exit3 assertion remain intact. GNU sources: https://www.gnu.org/software/bash/manual/html_node/Command-Line-Editing.html and https://ftp.gnu.org/old-gnu/Manuals/glibc/html_node/Canonical-or-Not.html
  • After that change, a plain loop passed 13 runs then reproduced the separate killed-client replay CLI-exit timeout; that remains recorded and unresolved. A complete 20-run sequence with read-only descendant-process/session-state observation passed 20/20. These are diagnostic passes, not proof the earlier plain failure disappeared. Output below.
  • Broader stream-only iteration1 passed. Iteration2 passed SSH/log/slow-reader portions but failed raw-mode readiness before exec SIGHUP. Commit 4ef61c7 replaces quiet sleep30 and repeated stty polling in exec interrupt/signal tests with shared remote READY output + an input gate. It retains actual raw-mode, signal status and terminal-restoration assertions.
  • Restarted stream 20-run proof is waiting for load5 <10. Dedicated normal sshd_cleanup test compiled and passed; ignored cleanup + each surrounding real_sshd test are queued individually with fresh fixture roots. Gates queued, but have not started because other verification remains active and/or load5 >6.

Verbatim diagnostic repeat result (current source before exec-only readiness change):

START diagnostic-cli-ssh 1/20
PASS diagnostic-cli-ssh 1/20
START diagnostic-cli-ssh 2/20
PASS diagnostic-cli-ssh 2/20
START diagnostic-cli-ssh 3/20
PASS diagnostic-cli-ssh 3/20
START diagnostic-cli-ssh 4/20
PASS diagnostic-cli-ssh 4/20
START diagnostic-cli-ssh 5/20
PASS diagnostic-cli-ssh 5/20
START diagnostic-cli-ssh 6/20
PASS diagnostic-cli-ssh 6/20
START diagnostic-cli-ssh 7/20
PASS diagnostic-cli-ssh 7/20
START diagnostic-cli-ssh 8/20
PASS diagnostic-cli-ssh 8/20
START diagnostic-cli-ssh 9/20
PASS diagnostic-cli-ssh 9/20
START diagnostic-cli-ssh 10/20
PASS diagnostic-cli-ssh 10/20
START diagnostic-cli-ssh 11/20
PASS diagnostic-cli-ssh 11/20
START diagnostic-cli-ssh 12/20
PASS diagnostic-cli-ssh 12/20
START diagnostic-cli-ssh 13/20
PASS diagnostic-cli-ssh 13/20
START diagnostic-cli-ssh 14/20
PASS diagnostic-cli-ssh 14/20
START diagnostic-cli-ssh 15/20
PASS diagnostic-cli-ssh 15/20
START diagnostic-cli-ssh 16/20
PASS diagnostic-cli-ssh 16/20
START diagnostic-cli-ssh 17/20
PASS diagnostic-cli-ssh 17/20
START diagnostic-cli-ssh 18/20
PASS diagnostic-cli-ssh 18/20
START diagnostic-cli-ssh 19/20
PASS diagnostic-cli-ssh 19/20
START diagnostic-cli-ssh 20/20
PASS diagnostic-cli-ssh 20/20
RESULT diagnostic-cli-ssh passes=20 failures=0 total=20

No product code changed; no process from another run has been signalled, stopped or killed in this continuation.

lp-flaky continuation head 4ef61c7. Further test-only fixes and evidence: - Plain SSH-only repeat at the earlier head passed 16 times, then reproduced the original five-second piped EOF timeout at load5 3.60. The SSH product path converts stream EOF into Ctrl-D; the test had been closing stdin while Bash readline could still be accepting the command. Inference from this behavior: command-output readiness must precede EOF so Ctrl-D reaches canonical PTY input. Commit 4e149cb adds a split output marker, waits for it, then closes stdin. The original total five-second deadline and remote exit3 assertion remain intact. GNU sources: https://www.gnu.org/software/bash/manual/html_node/Command-Line-Editing.html and https://ftp.gnu.org/old-gnu/Manuals/glibc/html_node/Canonical-or-Not.html - After that change, a plain loop passed 13 runs then reproduced the separate killed-client replay CLI-exit timeout; that remains recorded and unresolved. A complete 20-run sequence with read-only descendant-process/session-state observation passed 20/20. These are diagnostic passes, not proof the earlier plain failure disappeared. Output below. - Broader stream-only iteration1 passed. Iteration2 passed SSH/log/slow-reader portions but failed raw-mode readiness before exec SIGHUP. Commit 4ef61c7 replaces quiet sleep30 and repeated stty polling in exec interrupt/signal tests with shared remote READY output + an input gate. It retains actual raw-mode, signal status and terminal-restoration assertions. - Restarted stream 20-run proof is waiting for load5 <10. Dedicated normal sshd_cleanup test compiled and passed; ignored cleanup + each surrounding real_sshd test are queued individually with fresh fixture roots. Gates queued, but have not started because other verification remains active and/or load5 >6. Verbatim diagnostic repeat result (current source before exec-only readiness change): ``` START diagnostic-cli-ssh 1/20 PASS diagnostic-cli-ssh 1/20 START diagnostic-cli-ssh 2/20 PASS diagnostic-cli-ssh 2/20 START diagnostic-cli-ssh 3/20 PASS diagnostic-cli-ssh 3/20 START diagnostic-cli-ssh 4/20 PASS diagnostic-cli-ssh 4/20 START diagnostic-cli-ssh 5/20 PASS diagnostic-cli-ssh 5/20 START diagnostic-cli-ssh 6/20 PASS diagnostic-cli-ssh 6/20 START diagnostic-cli-ssh 7/20 PASS diagnostic-cli-ssh 7/20 START diagnostic-cli-ssh 8/20 PASS diagnostic-cli-ssh 8/20 START diagnostic-cli-ssh 9/20 PASS diagnostic-cli-ssh 9/20 START diagnostic-cli-ssh 10/20 PASS diagnostic-cli-ssh 10/20 START diagnostic-cli-ssh 11/20 PASS diagnostic-cli-ssh 11/20 START diagnostic-cli-ssh 12/20 PASS diagnostic-cli-ssh 12/20 START diagnostic-cli-ssh 13/20 PASS diagnostic-cli-ssh 13/20 START diagnostic-cli-ssh 14/20 PASS diagnostic-cli-ssh 14/20 START diagnostic-cli-ssh 15/20 PASS diagnostic-cli-ssh 15/20 START diagnostic-cli-ssh 16/20 PASS diagnostic-cli-ssh 16/20 START diagnostic-cli-ssh 17/20 PASS diagnostic-cli-ssh 17/20 START diagnostic-cli-ssh 18/20 PASS diagnostic-cli-ssh 18/20 START diagnostic-cli-ssh 19/20 PASS diagnostic-cli-ssh 19/20 START diagnostic-cli-ssh 20/20 PASS diagnostic-cli-ssh 20/20 RESULT diagnostic-cli-ssh passes=20 failures=0 total=20 ``` No product code changed; no process from another run has been signalled, stopped or killed in this continuation.
Author
Owner

Remote infraternal-agent parity acceptance suite implemented on branch e2e-remote, head8bc9fd1, base dev6f6fd89. Owned changes only e2e/remote/** and the new scripts/verify e2e-remote stage. Full production-binary table:35pass,13expected-fail,0hard failures,48cases,clean cleanup. Shared operations exercise real Docker/rootless Podman and private sshd, with a separate --no-local-agent server plus enrolled real mTLS infraternal-agent process. No mocks, no product source edits, no pushes/deployment.

Detailed operation table, exact expected reasons and verbatim gates are recorded in #49. Existing gaps: remote detail/actions resolve only embedded containers; remoteSSH unsupported; confirmed remote identity withdrawal leaves client channels without CLOSE within1s; embedded identity DELETE constructs NotFound without required details and aborts production at errors.rs490 (SIGABRT), debug returns exact idempotency-in-progress. Both identity gaps are narrowly expected with evidence; other crashes/timeouts fail. Unexpected successes require retiring expectations.

Fast GREEN on cached single-threaded retry (no skipped tests). Required merge still queued under the owner condition load5<8/no active scripts/verify; multiple other actual verification runs remain active. The orchestrator can review the committed suite while this job waits for its required gate slot.

Remote infraternal-agent parity acceptance suite implemented on branch `e2e-remote`, head8bc9fd1, base dev6f6fd89. Owned changes only e2e/remote/** and the new scripts/verify e2e-remote stage. Full production-binary table:35pass,13expected-fail,0hard failures,48cases,clean cleanup. Shared operations exercise real Docker/rootless Podman and private sshd, with a separate --no-local-agent server plus enrolled real mTLS infraternal-agent process. No mocks, no product source edits, no pushes/deployment. Detailed operation table, exact expected reasons and verbatim gates are recorded in [#49](https://git.kayg.org/kayg/infraternal/issues/49). Existing gaps: remote detail/actions resolve only embedded containers; remoteSSH unsupported; confirmed remote identity withdrawal leaves client channels without CLOSE within1s; embedded identity DELETE constructs NotFound without required details and aborts production at errors.rs490 (SIGABRT), debug returns exact idempotency-in-progress. Both identity gaps are narrowly expected with evidence; other crashes/timeouts fail. Unexpected successes require retiring expectations. Fast GREEN on cached single-threaded retry (no skipped tests). Required merge still queued under the owner condition load5<8/no active scripts/verify; multiple other actual verification runs remain active. The orchestrator can review the committed suite while this job waits for its required gate slot.
Author
Owner

21:22 UTC checkpoint: merge remains in its first release build on this worktree. All fast stages passed within this merge attempt. No runtime, storage, tunnel or timeout changes were made after 0909f91. Merge started under the requested load/process conditions; shared VM load rose afterward. The build has made the overall merge attempt exceed the under-15-minute target; this is being recorded, not presented as a successful completed gate. Service and browser smokes remain pending. Current state and own log/session pointers are in excluded worktree-root progress.md.

21:22 UTC checkpoint: merge remains in its first release build on this worktree. All fast stages passed within this merge attempt. No runtime, storage, tunnel or timeout changes were made after `0909f91`. Merge started under the requested load/process conditions; shared VM load rose afterward. The build has made the overall merge attempt exceed the under-15-minute target; this is being recorded, not presented as a successful completed gate. Service and browser smokes remain pending. Current state and own log/session pointers are in excluded worktree-root progress.md.
Author
Owner

Finished fix-supply implementation on lp-supply, head 0909f91aa221def0755be41316b9237fa9b6e820, base 6896994dfc951585905dffb626f0b270c847f922. Committed locally, not pushed; worktree clean; issue remains open.

The new supply-chain gate now passes with real refreshed RustSec data and real license checking. Allowed CDLA-Permissive-2.0 with all three CA-data crates named. RSA private signing is reachable for a pre-existing RSA identity through russh/ssh-key; generated identities remain Ed25519. The reversible RUSTSEC-2023-0071 ignore is accepted 2026-10-02, reviewed by 2026-11-01, and fails the local UTC gate from 2026-11-02 onward. Six review-policy tests pass. Reasoning, upstream sources, full CDLA agreement and reversal instructions are in docs/supply-chain-exceptions.md. The titled owner decision above gives the requested options: keep ignore, disable RSA SSH keys, switch implementation.

Full merge gate is not green. The requested merge attempt started only at load1=2.14/load5=2.81 with no other active verification/release-build/browser process detected. All fast stages passed inside merge, followed by release HTTP/static behavior, Docker/PTy, rootless Podman lifecycle, real sshd ownership and persistent-session authorization-loss smokes. It failed the final production-browser smoke at unchanged scripts/browser-check.mjs:1503: the second tab's /containers navigation exceeded 30s while waiting for networkidle. The log shows repeated auth-refresh traffic during that navigation. No cause is asserted solely from load; no browser timeout/test/storage/tunnel code was changed in this supply-chain job. git diff 6896994 -- scripts/browser-check.mjs is empty.

The sum of reported merge-stage durations is 1577.668s; the first release build accounts for 990.197s. The under-15-minute target was not met. Earlier standalone fast runs failed unchanged storage/tunnel tests; neither failure recurred in merge's workspace tests. Their diagnostic evidence is retained in earlier comments. The existing yanked yoke-derive warning and low Bun cookie finding remain nonblocking under the existing policy.

Latest standalone scripts/verify fast retry, exit 101, verbatim output:

WARN load5=11.06 exceeds online CPU count=8; timing-sensitive checks may be delayed
PASS fast: migrations are append-only (0.406s)
PASS fast: workspace package dependencies (0.400s)
PASS fast: JavaScript dependencies (1.600s)
PASS fast: advisory review policy tests (0.326s)
SUPPLY_CHAIN_REVIEWS advisory exceptions are within their review windows
SUPPLY_CHAIN cargo-deny: cargo-deny 0.20.2
SUPPLY_CHAIN_NOTICES generated THIRD_PARTY_NOTICES.md from 95 frontend packages
SUPPLY_CHAIN_NOTICES copied source: 179 shadcn files, 3 calternal-derived files
SUPPLY_CHAIN_NOTICES license files: 66 distinct texts; 0 packages need manual license review
warning[yanked]: detected yanked crate (try `cargo update -p yoke-derive`)
    ┌─ /mnt/hdd/infraternal/wt-lp/lp-supply/Cargo.lock:529:1
    │
529 │ yoke-derive 0.8.3 registry+https://github.com/rust-lang/crates.io-index
    │ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ yanked version

advisories ok
SUPPLY_CHAIN_RUST_ADVISORIES passed with refreshed advisory data
licenses ok
SUPPLY_CHAIN_RUST_LICENSES passed
bun audit v1.4.2 (744846f84)

cookie@0.6.0
  workspace:@infraternal/web > @sveltejs/kit > cookie
  low: cookie accepts cookie name, path, and domain with out of bounds characters (<0.7.0) - https://github.com/advisories/GHSA-pxg6-pf52-xh8x

1 vulnerability (1 low)

  bun audit fix           upgrade the vulnerable packages within their ranges
  bun audit fix --latest  also cross major versions
SUPPLY_CHAIN_BUN_AUDIT findings reported; this check is report-only
SUPPLY_CHAIN_PASS Rust advisory/license checks complete; Bun findings are report-only
PASS fast: supply-chain checks (9.667s)
PASS fast: build web app (28.795s)
PASS fast: cargo fmt --check (1.204s)
PASS fast: cargo clippy (61.211s)
FAIL fast: cargo test (206.414s)
   Compiling infraternal-server v0.0.1 (/mnt/hdd/infraternal/wt-lp/lp-supply/crates/server)
   Compiling infraternal v0.0.1 (/mnt/hdd/infraternal/wt-lp/lp-supply/crates/infraternal)
    Finished `test` profile [unoptimized] target(s) in 3m 13s
     Running unittests src/main.rs (target/debug/deps/infraternal-786ee3abac3a281d)

running 41 tests
test cli::tests::log_snapshot_deadline_defaults_to_five_seconds_and_follow_is_unbounded ... ok
test http::tests::caller_idempotency_keys_are_ulids ... ok
test cli::tests::log_timeout_override_is_bounded_and_liveness_errors_have_a_stable_exit_code ... ok
test http::tests::addresses_and_plan_ids_use_proto_validation ... ok
test http::tests::plan_errors_explain_the_next_safe_step ... ok
test http::tests::client_error_exit_codes_follow_the_contract_registry ... ok
test login::tests::fallback_rejects_symlinks_and_permissive_files ... ok
test login::tests::fallback_rejects_hard_linked_files ... ok
test login::tests::fallback_creates_and_replaces_only_private_regular_files ... ok
test login::tests::credential_slots_are_isolated_and_validate_binding ... ok
test login::tests::keychain_and_fallback_transitions_never_replay_old_material ... ok
test login::tests::keychain_record_rejects_swapped_binding ... ok
test login::tests::refresh_process_child ... ok
test login::tests::server_url_transport_policy_accepts_only_safe_origins ... ok
test login::tests::keychain_success_surfaces_fallback_cleanup_failure_and_blocks_stale_reads ... ok
test login::tests::source_has_no_direct_secret_output ... ok
test login::tests::verification_uri_must_match_the_normalized_server_origin ... ok
test mcp::tests::container_logs_defaults_are_bounded ... ok
test http::tests::expired_access_tokens_refresh_before_the_request ... ok
test mcp::tests::host_trust_tool_defaults_to_no_replacement_and_no_mutation ... ok
test mcp::tests::list_input_is_an_optional_filter_object ... ok
test mcp::tests::tool_input_defaults_are_safe_for_destructive_calls ... ok
test mcp::tests::container_logs_has_a_complete_output_schema ... ok
test http::tests::server_url_rejects_embedded_credentials_and_query_data ... ok
test login::tests::authentication_client_never_forwards_post_bodies_across_redirects ... ok
test mcp::tests::every_tool_publishes_output_schema_and_behavior_annotations ... ok
test login::tests::unreachable_server_keeps_the_local_fallback_for_retry ... ok
test mcp::tests::tool_router_contains_the_contract_tool_names ... ok
test stream::tests::invalid_channel_state_closes_websocket_with_protocol_code_1002 ... ok
test stream::tests::malformed_frame_closes_websocket_with_protocol_code_1002 ... ok
test tests::accepted_server_socket_has_tcp_nodelay_and_handler_gets_real_peer ... ok
test tests::backup_command_parses_explicit_source_and_destination ... ok
test stream::tests::oversized_frame_closes_websocket_with_message_too_big_code_1009 ... ok
test stream::tests::malformed_log_record_closes_channel_with_invalid_request ... ok
test tests::server_defaults_match_the_public_local_origin ... ok
test tests::mcp_setup_and_login_parse_with_global_server ... ok
test http::tests::resource_client_does_not_follow_bearer_or_body_redirects ... ok
test stream::tests::oversized_log_record_closes_channel_with_record_too_large ... ok
test stream::tests::silent_server_gets_ping_then_liveness_close_4008 ... ok
test login::tests::independent_cli_and_mcp_processes_rotate_once_and_reuse_saved_access ... ok
test ssh::tests::detach_bounds_a_stalled_close_send ... ok

test result: ok. 41 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.31s

     Running tests/agent_tunnel.rs (target/debug/deps/agent_tunnel-3131a6e194ddc3c7)

running 1 test
test real_infraternal_agent_process_enrolls_and_reconnects_with_new_nonce ... FAILED

failures:

---- real_infraternal_agent_process_enrolls_and_reconnects_with_new_nonce stdout ----

thread 'real_infraternal_agent_process_enrolls_and_reconnects_with_new_nonce' (1459785) panicked at crates/infraternal/tests/agent_tunnel.rs:580:5:
remote inventory was not published
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace


failures:
    real_infraternal_agent_process_enrolls_and_reconnects_with_new_nonce

test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out; finished in 10.99s

error: test failed, to rerun pass `-p infraternal --test agent_tunnel`

scripts/verify merge, exit 1, verbatim output:

PASS fast: migrations are append-only (0.108s)
PASS fast: workspace package dependencies (0.234s)
PASS fast: JavaScript dependencies (0.009s)
PASS fast: advisory review policy tests (0.112s)
SUPPLY_CHAIN_REVIEWS advisory exceptions are within their review windows
SUPPLY_CHAIN cargo-deny: cargo-deny 0.20.2
SUPPLY_CHAIN_NOTICES generated THIRD_PARTY_NOTICES.md from 95 frontend packages
SUPPLY_CHAIN_NOTICES copied source: 179 shadcn files, 3 calternal-derived files
SUPPLY_CHAIN_NOTICES license files: 66 distinct texts; 0 packages need manual license review
warning[yanked]: detected yanked crate (try `cargo update -p yoke-derive`)
    ┌─ /mnt/hdd/infraternal/wt-lp/lp-supply/Cargo.lock:529:1
    │
529 │ yoke-derive 0.8.3 registry+https://github.com/rust-lang/crates.io-index
    │ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ yanked version

advisories ok
SUPPLY_CHAIN_RUST_ADVISORIES passed with refreshed advisory data
licenses ok
SUPPLY_CHAIN_RUST_LICENSES passed
bun audit v1.4.2 (744846f84)

cookie@0.6.0
  workspace:@infraternal/web > @sveltejs/kit > cookie
  low: cookie accepts cookie name, path, and domain with out of bounds characters (<0.7.0) - https://github.com/advisories/GHSA-pxg6-pf52-xh8x

1 vulnerability (1 low)

  bun audit fix           upgrade the vulnerable packages within their ranges
  bun audit fix --latest  also cross major versions
SUPPLY_CHAIN_BUN_AUDIT findings reported; this check is report-only
SUPPLY_CHAIN_PASS Rust advisory/license checks complete; Bun findings are report-only
PASS fast: supply-chain checks (5.420s)
PASS fast: build web app (14.424s)
PASS fast: cargo fmt --check (0.869s)
PASS fast: cargo clippy (28.010s)
PASS fast: cargo test (116.487s)
PASS fast: svelte-check (11.942s)
PASS fast: UI package svelte-check (5.242s)
PASS fast: stream package typecheck (4.842s)
PASS fast: Vitest (3.677s)
PASS fast: UI package Vitest (8.421s)
PASS fast: stream package Vitest (0.758s)
PASS fast: OpenAPI and TypeScript client drift (61.577s)
PASS fast: terminal TypeScript (1.851s)
PASS fast: terminal Vitest (0.984s)
PASS merge: build release binary (990.197s)
PASS merge: release server HTTP and static behavior (1.096s)
PASS merge: Docker socket _ping (0.021s)
PASS merge: rootless Podman socket _ping (0.027s)
PASS merge: Docker exec PTY smoke (94.824s)
PASS merge: rootless Podman inventory and lifecycle smoke (3.680s)
PASS merge: real sshd session ownership smoke (117.185s)
PASS merge: persistent-session authorization-loss security smoke (53.291s)
PASS merge: install Chromium and system dependencies (5.066s)
FAIL merge: production browser smoke (47.314s)
curl: (7) Failed to connect to 127.0.0.1 port 5409 after 0 ms: Could not connect to server
AUTH_REFRESH context=main page=main-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=main page=main-page-1 method=POST path=/api/v1/auth/refresh outcome=http_error status=401
AUTH_401 context=main page=main-page-1 method=POST path=/api/v1/auth/refresh access_token_id=none
AUTH_REFRESH context=main page=main-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=main page=main-page-1 method=POST path=/api/v1/auth/refresh outcome=http_error status=401
AUTH_401 context=main page=main-page-1 method=POST path=/api/v1/auth/refresh access_token_id=none
AUTH_REFRESH context=main page=main-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=main page=main-page-1 method=POST path=/api/v1/auth/refresh outcome=http_error status=401
AUTH_401 context=main page=main-page-1 method=POST path=/api/v1/auth/refresh access_token_id=none
AUTH_REFRESH context=main page=main-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=main page=main-page-1 method=POST path=/api/v1/auth/refresh outcome=http_error status=401
AUTH_401 context=main page=main-page-1 method=POST path=/api/v1/auth/refresh access_token_id=none
AUTH_REFRESH context=main page=main-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=main page=main-page-1 method=POST path=/api/v1/auth/refresh outcome=http_error status=401
AUTH_401 context=main page=main-page-1 method=POST path=/api/v1/auth/refresh access_token_id=none
AUTH_SIGNOUT context=main page=main-page-1 method=POST path=/api/v1/auth/signout outcome=request
AUTH_SIGNOUT context=main page=main-page-1 method=POST path=/api/v1/auth/signout outcome=success status=200
AUTH_REFRESH context=main page=main-page-3 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=main page=main-page-3 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=main page=main-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=main page=main-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
PASS multi-tab supported: simultaneous tabs (1 refresh HTTP request)
AUTH_REFRESH context=main page=main-page-4 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_SIGNOUT context=main page=main-page-1 method=POST path=/api/v1/auth/signout outcome=request
AUTH_SIGNOUT context=main page=main-page-1 method=POST path=/api/v1/auth/signout outcome=success status=200
AUTH_REFRESH context=main page=main-page-4 method=POST path=/api/v1/auth/refresh outcome=success status=200
PASS multi-tab sign-out: pending refresh response cannot restore tab B
AUTH_REFRESH context=main page=main-page-6 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=main page=main-page-6 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=main page=main-page-6 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=main page=main-page-6 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=main page=main-page-5 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=main page=main-page-5 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=main page=main-page-5 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=main page=main-page-5 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=main page=main-page-6 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_401 context=main page=main-page-6 method=GET path=/api/v1/containers access_token_id=t_01M3Z1A0N8ZNRSZ31YKXCNVJF2
AUTH_REFRESH context=main page=main-page-6 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_401 context=main page=main-page-5 method=GET path=/api/v1/containers access_token_id=t_01M3Z1A2CKDV3NXCNV96PS3B48
AUTH_REFRESH context=main page=main-page-5 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=main page=main-page-5 method=POST path=/api/v1/auth/refresh outcome=success status=200
PASS multi-tab locks-only: one notice per tab and sequential stale-access recovery
AUTH_REFRESH context=main page=main-page-7 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=main page=main-page-7 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=main page=main-page-7 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=main page=main-page-7 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=main page=main-page-8 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=main page=main-page-8 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=main page=main-page-8 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=main page=main-page-8 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_401 context=main page=main-page-7 method=GET path=/api/v1/containers access_token_id=t_01M3Z1A4MBQQWF43DJEXEM72EC
AUTH_REFRESH context=main page=main-page-7 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=main page=main-page-7 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=main page=main-page-8 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_401 context=main page=main-page-8 method=GET path=/api/v1/me/sidebar access_token_id=t_01M3Z1A6NFC63V238Y7F4VVEPN
AUTH_401 context=main page=main-page-8 method=GET path=/api/v1/hosts access_token_id=t_01M3Z1A6NFC63V238Y7F4VVEPN
AUTH_401 context=main page=main-page-8 method=GET path=/api/v1/containers access_token_id=t_01M3Z1A6NFC63V238Y7F4VVEPN
AUTH_REFRESH context=main page=main-page-8 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_401 context=main page=main-page-7 method=GET path=/api/v1/containers access_token_id=t_01M3Z1A6R6Z1DNJ5Z8ZCJRNEER
AUTH_REFRESH context=main page=main-page-7 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=main page=main-page-7 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_401 context=main page=main-page-8 method=GET path=/api/v1/containers access_token_id=t_01M3Z1A6VPZKN55ANHRSSTQK7G
AUTH_REFRESH context=main page=main-page-8 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=main page=main-page-8 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=main page=main-page-7 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_401 context=main page=main-page-7 method=GET path=/api/v1/containers access_token_id=t_01M3Z1A8P90S5KX6RC1GYAKSFJ
AUTH_REFRESH context=main page=main-page-7 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_401 context=main page=main-page-8 method=GET path=/api/v1/containers access_token_id=t_01M3Z1A8S62FSGNW4EEF8P9ZJJ
AUTH_REFRESH context=main page=main-page-8 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=main page=main-page-8 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=main page=main-page-7 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_401 context=main page=main-page-7 method=GET path=/api/v1/containers access_token_id=t_01M3Z1AAMV1QZ6JJ8PSE4WD0ND
AUTH_REFRESH context=main page=main-page-7 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_401 context=main page=main-page-8 method=GET path=/api/v1/containers access_token_id=t_01M3Z1AAQQ76J9TYGQTKBZWWZA
AUTH_REFRESH context=main page=main-page-8 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=main page=main-page-8 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_401 context=main page=main-page-7 method=GET path=/api/v1/containers access_token_id=t_01M3Z1ACKBWJ43ACG64S2BE0S3
AUTH_REFRESH context=main page=main-page-7 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=main page=main-page-7 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=main page=main-page-8 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_401 context=main page=main-page-8 method=GET path=/api/v1/containers access_token_id=t_01M3Z1ACP69N2DAAQF96MBMASH
AUTH_REFRESH context=main page=main-page-8 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_401 context=main page=main-page-7 method=GET path=/api/v1/containers access_token_id=t_01M3Z1AEHVGHVZJ39AED71CA73
AUTH_REFRESH context=main page=main-page-7 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=main page=main-page-7 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_401 context=main page=main-page-8 method=GET path=/api/v1/containers access_token_id=t_01M3Z1AEMXPTHNE2MTMBSZ8T9W
AUTH_REFRESH context=main page=main-page-8 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=main page=main-page-8 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_401 context=main page=main-page-7 method=GET path=/api/v1/containers access_token_id=t_01M3Z1AGGCJBMC7XVX26QFE764
AUTH_REFRESH context=main page=main-page-7 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=main page=main-page-7 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_401 context=main page=main-page-8 method=GET path=/api/v1/containers access_token_id=t_01M3Z1AGK7TBT60YZNXMMA6X5M
AUTH_REFRESH context=main page=main-page-8 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=main page=main-page-8 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_401 context=main page=main-page-7 method=GET path=/api/v1/containers access_token_id=t_01M3Z1AJES7H4S5CD5PEW50PYE
AUTH_REFRESH context=main page=main-page-7 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=main page=main-page-7 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=main page=main-page-8 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_401 context=main page=main-page-8 method=GET path=/api/v1/containers access_token_id=t_01M3Z1AJHPE7X4MM1AQGJTQQXK
AUTH_REFRESH context=main page=main-page-8 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=main page=main-page-7 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_401 context=main page=main-page-7 method=GET path=/api/v1/containers access_token_id=t_01M3Z1AMDEFH0TETXWRF1YRC45
AUTH_REFRESH context=main page=main-page-7 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=main page=main-page-8 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_401 context=main page=main-page-8 method=GET path=/api/v1/containers access_token_id=t_01M3Z1AMGFTDRY63FCSC67YQG3
AUTH_REFRESH context=main page=main-page-8 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_401 context=main page=main-page-7 method=GET path=/api/v1/containers access_token_id=t_01M3Z1APC04Y9QXCQ1EC64WJX3
AUTH_REFRESH context=main page=main-page-7 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=main page=main-page-7 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=main page=main-page-8 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_401 context=main page=main-page-8 method=GET path=/api/v1/containers access_token_id=t_01M3Z1APER78SGWF55Y9B4YCDC
AUTH_REFRESH context=main page=main-page-8 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_401 context=main page=main-page-7 method=GET path=/api/v1/containers access_token_id=t_01M3Z1ARAAK36XGQMTFRTQQKF5
AUTH_REFRESH context=main page=main-page-7 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=main page=main-page-7 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=main page=main-page-8 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_401 context=main page=main-page-8 method=GET path=/api/v1/containers access_token_id=t_01M3Z1ARD6R4SNQE756V238XMS
AUTH_REFRESH context=main page=main-page-8 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_401 context=main page=main-page-7 method=GET path=/api/v1/containers access_token_id=t_01M3Z1AT9AC2ZWCS4P9HYAVKE7
AUTH_REFRESH context=main page=main-page-7 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=main page=main-page-7 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_401 context=main page=main-page-8 method=GET path=/api/v1/containers access_token_id=t_01M3Z1ATBV63ZQ1GFNBZTSECAE
AUTH_REFRESH context=main page=main-page-8 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=main page=main-page-8 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_401 context=main page=main-page-7 method=GET path=/api/v1/containers access_token_id=t_01M3Z1AW7CY66K1FJ58FY8074D
AUTH_REFRESH context=main page=main-page-7 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=main page=main-page-7 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=main page=main-page-8 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=main page=main-page-8 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_401 context=main page=main-page-8 method=GET path=/api/v1/containers access_token_id=t_01M3Z1AWA6X7E5XZHSRWJWSMVK
AUTH_401 context=main page=main-page-7 method=GET path=/api/v1/containers access_token_id=t_01M3Z1AY66J6XA43ZY9GZDAV0H
AUTH_REFRESH context=main page=main-page-7 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=main page=main-page-7 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_401 context=main page=main-page-8 method=GET path=/api/v1/containers access_token_id=t_01M3Z1AY8TV84X5NGBGN28XM88
AUTH_REFRESH context=main page=main-page-8 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=main page=main-page-8 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_401 context=main page=main-page-7 method=GET path=/api/v1/containers access_token_id=t_01M3Z1B048NWPKF4VNERJ92EMF
AUTH_REFRESH context=main page=main-page-7 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=main page=main-page-7 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_401 context=main page=main-page-8 method=GET path=/api/v1/containers access_token_id=t_01M3Z1B076DSJP4RZ38E90VDBF
AUTH_REFRESH context=main page=main-page-8 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=main page=main-page-8 method=POST path=/api/v1/auth/refresh outcome=success status=200
1498 |       await waitForDashboard(pages[0], `${mode} first tab`);
1499 |       await pages[0].goto(`${baseUrl}/containers`, { waitUntil: "networkidle" });
1500 |       await pages[0].getByRole("heading", { name: "Containers", level: 1 }).waitFor({ state: "visible" });
1501 |       await pages[1].goto(`${baseUrl}/`, { waitUntil: "networkidle" });
1502 |       await waitForDashboard(pages[1], `${mode} second tab`);
1503 |       await pages[1].goto(`${baseUrl}/containers`, { waitUntil: "networkidle" });
                            ^
TimeoutError: goto: Timeout 30000ms exceeded.
Call log:
  - navigating to "http://localhost:5409/containers", waiting until "networkidle"

  log: [ "  - navigating to \"http://localhost:5409/containers\", waiting until \"networkidle\"" ],

      at checkSharedCookieTabs (/mnt/hdd/infraternal/wt-lp/lp-supply/scripts/browser-check.mjs:1503:22)
      at processTicksAndRejections (native:7:39)

Bun v1.4.2 (Linux x64)

No extra integration, browser or bench tier was run. No runtime hot path changed. No unrelated process was signalled and no other job files were read. Follow-up outside this supply-chain fix: resolve the multi-tab production-browser gate failure and rerun merge before integration.

Finished fix-supply implementation on `lp-supply`, head **`0909f91aa221def0755be41316b9237fa9b6e820`**, base `6896994dfc951585905dffb626f0b270c847f922`. Committed locally, not pushed; worktree clean; issue remains open. The new supply-chain gate now passes with real refreshed RustSec data and real license checking. Allowed `CDLA-Permissive-2.0` with all three CA-data crates named. RSA private signing is reachable for a pre-existing RSA identity through russh/ssh-key; generated identities remain Ed25519. The reversible RUSTSEC-2023-0071 ignore is accepted 2026-10-02, reviewed by 2026-11-01, and fails the local UTC gate from 2026-11-02 onward. Six review-policy tests pass. Reasoning, upstream sources, full CDLA agreement and reversal instructions are in `docs/supply-chain-exceptions.md`. The titled owner decision above gives the requested options: keep ignore, disable RSA SSH keys, switch implementation. **Full merge gate is not green.** The requested merge attempt started only at load1=2.14/load5=2.81 with no other active verification/release-build/browser process detected. All fast stages passed inside merge, followed by release HTTP/static behavior, Docker/PTy, rootless Podman lifecycle, real sshd ownership and persistent-session authorization-loss smokes. It failed the final production-browser smoke at unchanged `scripts/browser-check.mjs:1503`: the second tab's `/containers` navigation exceeded 30s while waiting for `networkidle`. The log shows repeated auth-refresh traffic during that navigation. No cause is asserted solely from load; no browser timeout/test/storage/tunnel code was changed in this supply-chain job. `git diff 6896994 -- scripts/browser-check.mjs` is empty. The sum of reported merge-stage durations is 1577.668s; the first release build accounts for 990.197s. The under-15-minute target was not met. Earlier standalone fast runs failed unchanged storage/tunnel tests; neither failure recurred in merge's workspace tests. Their diagnostic evidence is retained in earlier comments. The existing yanked yoke-derive warning and low Bun cookie finding remain nonblocking under the existing policy. Latest standalone `scripts/verify fast` retry, exit 101, verbatim output: ```text WARN load5=11.06 exceeds online CPU count=8; timing-sensitive checks may be delayed PASS fast: migrations are append-only (0.406s) PASS fast: workspace package dependencies (0.400s) PASS fast: JavaScript dependencies (1.600s) PASS fast: advisory review policy tests (0.326s) SUPPLY_CHAIN_REVIEWS advisory exceptions are within their review windows SUPPLY_CHAIN cargo-deny: cargo-deny 0.20.2 SUPPLY_CHAIN_NOTICES generated THIRD_PARTY_NOTICES.md from 95 frontend packages SUPPLY_CHAIN_NOTICES copied source: 179 shadcn files, 3 calternal-derived files SUPPLY_CHAIN_NOTICES license files: 66 distinct texts; 0 packages need manual license review warning[yanked]: detected yanked crate (try `cargo update -p yoke-derive`) ┌─ /mnt/hdd/infraternal/wt-lp/lp-supply/Cargo.lock:529:1 │ 529 │ yoke-derive 0.8.3 registry+https://github.com/rust-lang/crates.io-index │ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ yanked version advisories ok SUPPLY_CHAIN_RUST_ADVISORIES passed with refreshed advisory data licenses ok SUPPLY_CHAIN_RUST_LICENSES passed bun audit v1.4.2 (744846f84) cookie@0.6.0 workspace:@infraternal/web > @sveltejs/kit > cookie low: cookie accepts cookie name, path, and domain with out of bounds characters (<0.7.0) - https://github.com/advisories/GHSA-pxg6-pf52-xh8x 1 vulnerability (1 low) bun audit fix upgrade the vulnerable packages within their ranges bun audit fix --latest also cross major versions SUPPLY_CHAIN_BUN_AUDIT findings reported; this check is report-only SUPPLY_CHAIN_PASS Rust advisory/license checks complete; Bun findings are report-only PASS fast: supply-chain checks (9.667s) PASS fast: build web app (28.795s) PASS fast: cargo fmt --check (1.204s) PASS fast: cargo clippy (61.211s) FAIL fast: cargo test (206.414s) Compiling infraternal-server v0.0.1 (/mnt/hdd/infraternal/wt-lp/lp-supply/crates/server) Compiling infraternal v0.0.1 (/mnt/hdd/infraternal/wt-lp/lp-supply/crates/infraternal) Finished `test` profile [unoptimized] target(s) in 3m 13s Running unittests src/main.rs (target/debug/deps/infraternal-786ee3abac3a281d) running 41 tests test cli::tests::log_snapshot_deadline_defaults_to_five_seconds_and_follow_is_unbounded ... ok test http::tests::caller_idempotency_keys_are_ulids ... ok test cli::tests::log_timeout_override_is_bounded_and_liveness_errors_have_a_stable_exit_code ... ok test http::tests::addresses_and_plan_ids_use_proto_validation ... ok test http::tests::plan_errors_explain_the_next_safe_step ... ok test http::tests::client_error_exit_codes_follow_the_contract_registry ... ok test login::tests::fallback_rejects_symlinks_and_permissive_files ... ok test login::tests::fallback_rejects_hard_linked_files ... ok test login::tests::fallback_creates_and_replaces_only_private_regular_files ... ok test login::tests::credential_slots_are_isolated_and_validate_binding ... ok test login::tests::keychain_and_fallback_transitions_never_replay_old_material ... ok test login::tests::keychain_record_rejects_swapped_binding ... ok test login::tests::refresh_process_child ... ok test login::tests::server_url_transport_policy_accepts_only_safe_origins ... ok test login::tests::keychain_success_surfaces_fallback_cleanup_failure_and_blocks_stale_reads ... ok test login::tests::source_has_no_direct_secret_output ... ok test login::tests::verification_uri_must_match_the_normalized_server_origin ... ok test mcp::tests::container_logs_defaults_are_bounded ... ok test http::tests::expired_access_tokens_refresh_before_the_request ... ok test mcp::tests::host_trust_tool_defaults_to_no_replacement_and_no_mutation ... ok test mcp::tests::list_input_is_an_optional_filter_object ... ok test mcp::tests::tool_input_defaults_are_safe_for_destructive_calls ... ok test mcp::tests::container_logs_has_a_complete_output_schema ... ok test http::tests::server_url_rejects_embedded_credentials_and_query_data ... ok test login::tests::authentication_client_never_forwards_post_bodies_across_redirects ... ok test mcp::tests::every_tool_publishes_output_schema_and_behavior_annotations ... ok test login::tests::unreachable_server_keeps_the_local_fallback_for_retry ... ok test mcp::tests::tool_router_contains_the_contract_tool_names ... ok test stream::tests::invalid_channel_state_closes_websocket_with_protocol_code_1002 ... ok test stream::tests::malformed_frame_closes_websocket_with_protocol_code_1002 ... ok test tests::accepted_server_socket_has_tcp_nodelay_and_handler_gets_real_peer ... ok test tests::backup_command_parses_explicit_source_and_destination ... ok test stream::tests::oversized_frame_closes_websocket_with_message_too_big_code_1009 ... ok test stream::tests::malformed_log_record_closes_channel_with_invalid_request ... ok test tests::server_defaults_match_the_public_local_origin ... ok test tests::mcp_setup_and_login_parse_with_global_server ... ok test http::tests::resource_client_does_not_follow_bearer_or_body_redirects ... ok test stream::tests::oversized_log_record_closes_channel_with_record_too_large ... ok test stream::tests::silent_server_gets_ping_then_liveness_close_4008 ... ok test login::tests::independent_cli_and_mcp_processes_rotate_once_and_reuse_saved_access ... ok test ssh::tests::detach_bounds_a_stalled_close_send ... ok test result: ok. 41 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.31s Running tests/agent_tunnel.rs (target/debug/deps/agent_tunnel-3131a6e194ddc3c7) running 1 test test real_infraternal_agent_process_enrolls_and_reconnects_with_new_nonce ... FAILED failures: ---- real_infraternal_agent_process_enrolls_and_reconnects_with_new_nonce stdout ---- thread 'real_infraternal_agent_process_enrolls_and_reconnects_with_new_nonce' (1459785) panicked at crates/infraternal/tests/agent_tunnel.rs:580:5: remote inventory was not published note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace failures: real_infraternal_agent_process_enrolls_and_reconnects_with_new_nonce test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out; finished in 10.99s error: test failed, to rerun pass `-p infraternal --test agent_tunnel` ``` `scripts/verify merge`, exit 1, verbatim output: ```text PASS fast: migrations are append-only (0.108s) PASS fast: workspace package dependencies (0.234s) PASS fast: JavaScript dependencies (0.009s) PASS fast: advisory review policy tests (0.112s) SUPPLY_CHAIN_REVIEWS advisory exceptions are within their review windows SUPPLY_CHAIN cargo-deny: cargo-deny 0.20.2 SUPPLY_CHAIN_NOTICES generated THIRD_PARTY_NOTICES.md from 95 frontend packages SUPPLY_CHAIN_NOTICES copied source: 179 shadcn files, 3 calternal-derived files SUPPLY_CHAIN_NOTICES license files: 66 distinct texts; 0 packages need manual license review warning[yanked]: detected yanked crate (try `cargo update -p yoke-derive`) ┌─ /mnt/hdd/infraternal/wt-lp/lp-supply/Cargo.lock:529:1 │ 529 │ yoke-derive 0.8.3 registry+https://github.com/rust-lang/crates.io-index │ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ yanked version advisories ok SUPPLY_CHAIN_RUST_ADVISORIES passed with refreshed advisory data licenses ok SUPPLY_CHAIN_RUST_LICENSES passed bun audit v1.4.2 (744846f84) cookie@0.6.0 workspace:@infraternal/web > @sveltejs/kit > cookie low: cookie accepts cookie name, path, and domain with out of bounds characters (<0.7.0) - https://github.com/advisories/GHSA-pxg6-pf52-xh8x 1 vulnerability (1 low) bun audit fix upgrade the vulnerable packages within their ranges bun audit fix --latest also cross major versions SUPPLY_CHAIN_BUN_AUDIT findings reported; this check is report-only SUPPLY_CHAIN_PASS Rust advisory/license checks complete; Bun findings are report-only PASS fast: supply-chain checks (5.420s) PASS fast: build web app (14.424s) PASS fast: cargo fmt --check (0.869s) PASS fast: cargo clippy (28.010s) PASS fast: cargo test (116.487s) PASS fast: svelte-check (11.942s) PASS fast: UI package svelte-check (5.242s) PASS fast: stream package typecheck (4.842s) PASS fast: Vitest (3.677s) PASS fast: UI package Vitest (8.421s) PASS fast: stream package Vitest (0.758s) PASS fast: OpenAPI and TypeScript client drift (61.577s) PASS fast: terminal TypeScript (1.851s) PASS fast: terminal Vitest (0.984s) PASS merge: build release binary (990.197s) PASS merge: release server HTTP and static behavior (1.096s) PASS merge: Docker socket _ping (0.021s) PASS merge: rootless Podman socket _ping (0.027s) PASS merge: Docker exec PTY smoke (94.824s) PASS merge: rootless Podman inventory and lifecycle smoke (3.680s) PASS merge: real sshd session ownership smoke (117.185s) PASS merge: persistent-session authorization-loss security smoke (53.291s) PASS merge: install Chromium and system dependencies (5.066s) FAIL merge: production browser smoke (47.314s) curl: (7) Failed to connect to 127.0.0.1 port 5409 after 0 ms: Could not connect to server AUTH_REFRESH context=main page=main-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=main page=main-page-1 method=POST path=/api/v1/auth/refresh outcome=http_error status=401 AUTH_401 context=main page=main-page-1 method=POST path=/api/v1/auth/refresh access_token_id=none AUTH_REFRESH context=main page=main-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=main page=main-page-1 method=POST path=/api/v1/auth/refresh outcome=http_error status=401 AUTH_401 context=main page=main-page-1 method=POST path=/api/v1/auth/refresh access_token_id=none AUTH_REFRESH context=main page=main-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=main page=main-page-1 method=POST path=/api/v1/auth/refresh outcome=http_error status=401 AUTH_401 context=main page=main-page-1 method=POST path=/api/v1/auth/refresh access_token_id=none AUTH_REFRESH context=main page=main-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=main page=main-page-1 method=POST path=/api/v1/auth/refresh outcome=http_error status=401 AUTH_401 context=main page=main-page-1 method=POST path=/api/v1/auth/refresh access_token_id=none AUTH_REFRESH context=main page=main-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=main page=main-page-1 method=POST path=/api/v1/auth/refresh outcome=http_error status=401 AUTH_401 context=main page=main-page-1 method=POST path=/api/v1/auth/refresh access_token_id=none AUTH_SIGNOUT context=main page=main-page-1 method=POST path=/api/v1/auth/signout outcome=request AUTH_SIGNOUT context=main page=main-page-1 method=POST path=/api/v1/auth/signout outcome=success status=200 AUTH_REFRESH context=main page=main-page-3 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=main page=main-page-3 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=main page=main-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=main page=main-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 PASS multi-tab supported: simultaneous tabs (1 refresh HTTP request) AUTH_REFRESH context=main page=main-page-4 method=POST path=/api/v1/auth/refresh outcome=request AUTH_SIGNOUT context=main page=main-page-1 method=POST path=/api/v1/auth/signout outcome=request AUTH_SIGNOUT context=main page=main-page-1 method=POST path=/api/v1/auth/signout outcome=success status=200 AUTH_REFRESH context=main page=main-page-4 method=POST path=/api/v1/auth/refresh outcome=success status=200 PASS multi-tab sign-out: pending refresh response cannot restore tab B AUTH_REFRESH context=main page=main-page-6 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=main page=main-page-6 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=main page=main-page-6 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=main page=main-page-6 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=main page=main-page-5 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=main page=main-page-5 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=main page=main-page-5 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=main page=main-page-5 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=main page=main-page-6 method=POST path=/api/v1/auth/refresh outcome=request AUTH_401 context=main page=main-page-6 method=GET path=/api/v1/containers access_token_id=t_01M3Z1A0N8ZNRSZ31YKXCNVJF2 AUTH_REFRESH context=main page=main-page-6 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_401 context=main page=main-page-5 method=GET path=/api/v1/containers access_token_id=t_01M3Z1A2CKDV3NXCNV96PS3B48 AUTH_REFRESH context=main page=main-page-5 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=main page=main-page-5 method=POST path=/api/v1/auth/refresh outcome=success status=200 PASS multi-tab locks-only: one notice per tab and sequential stale-access recovery AUTH_REFRESH context=main page=main-page-7 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=main page=main-page-7 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=main page=main-page-7 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=main page=main-page-7 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=main page=main-page-8 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=main page=main-page-8 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=main page=main-page-8 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=main page=main-page-8 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_401 context=main page=main-page-7 method=GET path=/api/v1/containers access_token_id=t_01M3Z1A4MBQQWF43DJEXEM72EC AUTH_REFRESH context=main page=main-page-7 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=main page=main-page-7 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=main page=main-page-8 method=POST path=/api/v1/auth/refresh outcome=request AUTH_401 context=main page=main-page-8 method=GET path=/api/v1/me/sidebar access_token_id=t_01M3Z1A6NFC63V238Y7F4VVEPN AUTH_401 context=main page=main-page-8 method=GET path=/api/v1/hosts access_token_id=t_01M3Z1A6NFC63V238Y7F4VVEPN AUTH_401 context=main page=main-page-8 method=GET path=/api/v1/containers access_token_id=t_01M3Z1A6NFC63V238Y7F4VVEPN AUTH_REFRESH context=main page=main-page-8 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_401 context=main page=main-page-7 method=GET path=/api/v1/containers access_token_id=t_01M3Z1A6R6Z1DNJ5Z8ZCJRNEER AUTH_REFRESH context=main page=main-page-7 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=main page=main-page-7 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_401 context=main page=main-page-8 method=GET path=/api/v1/containers access_token_id=t_01M3Z1A6VPZKN55ANHRSSTQK7G AUTH_REFRESH context=main page=main-page-8 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=main page=main-page-8 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=main page=main-page-7 method=POST path=/api/v1/auth/refresh outcome=request AUTH_401 context=main page=main-page-7 method=GET path=/api/v1/containers access_token_id=t_01M3Z1A8P90S5KX6RC1GYAKSFJ AUTH_REFRESH context=main page=main-page-7 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_401 context=main page=main-page-8 method=GET path=/api/v1/containers access_token_id=t_01M3Z1A8S62FSGNW4EEF8P9ZJJ AUTH_REFRESH context=main page=main-page-8 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=main page=main-page-8 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=main page=main-page-7 method=POST path=/api/v1/auth/refresh outcome=request AUTH_401 context=main page=main-page-7 method=GET path=/api/v1/containers access_token_id=t_01M3Z1AAMV1QZ6JJ8PSE4WD0ND AUTH_REFRESH context=main page=main-page-7 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_401 context=main page=main-page-8 method=GET path=/api/v1/containers access_token_id=t_01M3Z1AAQQ76J9TYGQTKBZWWZA AUTH_REFRESH context=main page=main-page-8 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=main page=main-page-8 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_401 context=main page=main-page-7 method=GET path=/api/v1/containers access_token_id=t_01M3Z1ACKBWJ43ACG64S2BE0S3 AUTH_REFRESH context=main page=main-page-7 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=main page=main-page-7 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=main page=main-page-8 method=POST path=/api/v1/auth/refresh outcome=request AUTH_401 context=main page=main-page-8 method=GET path=/api/v1/containers access_token_id=t_01M3Z1ACP69N2DAAQF96MBMASH AUTH_REFRESH context=main page=main-page-8 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_401 context=main page=main-page-7 method=GET path=/api/v1/containers access_token_id=t_01M3Z1AEHVGHVZJ39AED71CA73 AUTH_REFRESH context=main page=main-page-7 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=main page=main-page-7 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_401 context=main page=main-page-8 method=GET path=/api/v1/containers access_token_id=t_01M3Z1AEMXPTHNE2MTMBSZ8T9W AUTH_REFRESH context=main page=main-page-8 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=main page=main-page-8 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_401 context=main page=main-page-7 method=GET path=/api/v1/containers access_token_id=t_01M3Z1AGGCJBMC7XVX26QFE764 AUTH_REFRESH context=main page=main-page-7 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=main page=main-page-7 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_401 context=main page=main-page-8 method=GET path=/api/v1/containers access_token_id=t_01M3Z1AGK7TBT60YZNXMMA6X5M AUTH_REFRESH context=main page=main-page-8 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=main page=main-page-8 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_401 context=main page=main-page-7 method=GET path=/api/v1/containers access_token_id=t_01M3Z1AJES7H4S5CD5PEW50PYE AUTH_REFRESH context=main page=main-page-7 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=main page=main-page-7 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=main page=main-page-8 method=POST path=/api/v1/auth/refresh outcome=request AUTH_401 context=main page=main-page-8 method=GET path=/api/v1/containers access_token_id=t_01M3Z1AJHPE7X4MM1AQGJTQQXK AUTH_REFRESH context=main page=main-page-8 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=main page=main-page-7 method=POST path=/api/v1/auth/refresh outcome=request AUTH_401 context=main page=main-page-7 method=GET path=/api/v1/containers access_token_id=t_01M3Z1AMDEFH0TETXWRF1YRC45 AUTH_REFRESH context=main page=main-page-7 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=main page=main-page-8 method=POST path=/api/v1/auth/refresh outcome=request AUTH_401 context=main page=main-page-8 method=GET path=/api/v1/containers access_token_id=t_01M3Z1AMGFTDRY63FCSC67YQG3 AUTH_REFRESH context=main page=main-page-8 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_401 context=main page=main-page-7 method=GET path=/api/v1/containers access_token_id=t_01M3Z1APC04Y9QXCQ1EC64WJX3 AUTH_REFRESH context=main page=main-page-7 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=main page=main-page-7 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=main page=main-page-8 method=POST path=/api/v1/auth/refresh outcome=request AUTH_401 context=main page=main-page-8 method=GET path=/api/v1/containers access_token_id=t_01M3Z1APER78SGWF55Y9B4YCDC AUTH_REFRESH context=main page=main-page-8 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_401 context=main page=main-page-7 method=GET path=/api/v1/containers access_token_id=t_01M3Z1ARAAK36XGQMTFRTQQKF5 AUTH_REFRESH context=main page=main-page-7 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=main page=main-page-7 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=main page=main-page-8 method=POST path=/api/v1/auth/refresh outcome=request AUTH_401 context=main page=main-page-8 method=GET path=/api/v1/containers access_token_id=t_01M3Z1ARD6R4SNQE756V238XMS AUTH_REFRESH context=main page=main-page-8 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_401 context=main page=main-page-7 method=GET path=/api/v1/containers access_token_id=t_01M3Z1AT9AC2ZWCS4P9HYAVKE7 AUTH_REFRESH context=main page=main-page-7 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=main page=main-page-7 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_401 context=main page=main-page-8 method=GET path=/api/v1/containers access_token_id=t_01M3Z1ATBV63ZQ1GFNBZTSECAE AUTH_REFRESH context=main page=main-page-8 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=main page=main-page-8 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_401 context=main page=main-page-7 method=GET path=/api/v1/containers access_token_id=t_01M3Z1AW7CY66K1FJ58FY8074D AUTH_REFRESH context=main page=main-page-7 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=main page=main-page-7 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=main page=main-page-8 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=main page=main-page-8 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_401 context=main page=main-page-8 method=GET path=/api/v1/containers access_token_id=t_01M3Z1AWA6X7E5XZHSRWJWSMVK AUTH_401 context=main page=main-page-7 method=GET path=/api/v1/containers access_token_id=t_01M3Z1AY66J6XA43ZY9GZDAV0H AUTH_REFRESH context=main page=main-page-7 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=main page=main-page-7 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_401 context=main page=main-page-8 method=GET path=/api/v1/containers access_token_id=t_01M3Z1AY8TV84X5NGBGN28XM88 AUTH_REFRESH context=main page=main-page-8 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=main page=main-page-8 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_401 context=main page=main-page-7 method=GET path=/api/v1/containers access_token_id=t_01M3Z1B048NWPKF4VNERJ92EMF AUTH_REFRESH context=main page=main-page-7 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=main page=main-page-7 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_401 context=main page=main-page-8 method=GET path=/api/v1/containers access_token_id=t_01M3Z1B076DSJP4RZ38E90VDBF AUTH_REFRESH context=main page=main-page-8 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=main page=main-page-8 method=POST path=/api/v1/auth/refresh outcome=success status=200 1498 | await waitForDashboard(pages[0], `${mode} first tab`); 1499 | await pages[0].goto(`${baseUrl}/containers`, { waitUntil: "networkidle" }); 1500 | await pages[0].getByRole("heading", { name: "Containers", level: 1 }).waitFor({ state: "visible" }); 1501 | await pages[1].goto(`${baseUrl}/`, { waitUntil: "networkidle" }); 1502 | await waitForDashboard(pages[1], `${mode} second tab`); 1503 | await pages[1].goto(`${baseUrl}/containers`, { waitUntil: "networkidle" }); ^ TimeoutError: goto: Timeout 30000ms exceeded. Call log:  - navigating to "http://localhost:5409/containers", waiting until "networkidle" log: [ " - navigating to \"http://localhost:5409/containers\", waiting until \"networkidle\"" ], at checkSharedCookieTabs (/mnt/hdd/infraternal/wt-lp/lp-supply/scripts/browser-check.mjs:1503:22) at processTicksAndRejections (native:7:39) Bun v1.4.2 (Linux x64) ``` No extra integration, browser or bench tier was run. No runtime hot path changed. No unrelated process was signalled and no other job files were read. Follow-up outside this supply-chain fix: resolve the multi-tab production-browser gate failure and rerun merge before integration.
Author
Owner

Verification finding: scripts/verify fast passed all 16 stages (total 475.724s), but the requested busy-host loop exposed a second failure after 20 consecutive passes. This was not symlink() failing with AlreadyExists: the WAL-symlink rejection assertion at crates/server/tests/private_storage.rs:62 failed because SqliteStorage::open(&database) returned Ok immediately after the test planted the WAL symlink. The storage code preflights -wal with open_secure_owned_file before connecting; that helper uses O_NOFOLLOW (crates/private-storage/src/lib.rs:9-32). I am checking whether the planted symlink disappears around open; if it remains and open still succeeds, this is a product bug. No product files have been changed.

Verification finding: `scripts/verify fast` passed all 16 stages (total 475.724s), but the requested busy-host loop exposed a second failure after 20 consecutive passes. This was not `symlink()` failing with `AlreadyExists`: the WAL-symlink rejection assertion at `crates/server/tests/private_storage.rs:62` failed because `SqliteStorage::open(&database)` returned `Ok` immediately after the test planted the WAL symlink. The storage code preflights `-wal` with `open_secure_owned_file` before connecting; that helper uses `O_NOFOLLOW` (`crates/private-storage/src/lib.rs:9-32`). I am checking whether the planted symlink disappears around open; if it remains and open still succeeds, this is a product bug. No product files have been changed.
Author
Owner

lp-flaky head a0eb7be: all three dedicated sshd cleanup checks and all 15 surrounding real_sshd cases passed individually, 18/18 total. Each test used a fresh run-specific fixture root and original HOME, one Cargo worker at nice15, checking load5 <10 before starting. The SIGKILL regression kills only its own child test process; its watchdog cleaned that private listener/run directory. Verbatim output:

START sshd_cleanup sshd::tests::stale_sweep_kills_marked_processes_and_removes_the_run_directory
PASS sshd_cleanup sshd::tests::stale_sweep_kills_marked_processes_and_removes_the_run_directory
15.02 14.15 9.50 6/1182 1754706
1521279 /home/kayg/.nix-profile/bin/rtk proxy bash -c while true; do if awk '{ exit !($2 < 8) }' /proc/loadavg && ! pgrep -f '^(bash|[^ ]*/bash) ([^ ]*/)?scripts/verify ' >/dev/null && ! pgrep -f '(^|/)cargo (build .*--release|build --release|bench)' >/dev/null; then break; fi; sleep 30; done; set -o pipefail; CARGO_BUILD_JOBS=1 scripts/verify integration 2>&1 | tee target/provider-b-evidence/integration.log
1521280 /usr/bin/bash -c while true; do if awk '{ exit !($2 < 8) }' /proc/loadavg && ! pgrep -f '^(bash|[^ ]*/bash) ([^ ]*/)?scripts/verify ' >/dev/null && ! pgrep -f '(^|/)cargo (build .*--release|build --release|bench)' >/dev/null; then break; fi; sleep 30; done; set -o pipefail; CARGO_BUILD_JOBS=1 scripts/verify integration 2>&1 | tee target/provider-b-evidence/integration.log
1582530 /home/kayg/.nix-profile/bin/rtk proxy bash -c while true; do if awk '{ exit !($2 < 8) }' /proc/loadavg && ! pgrep -f '^(bash|[^ ]*/bash) ([^ ]*/)?scripts/verify ' >/dev/null && ! pgrep -f '(^|/)cargo (build .*--release|build --release|bench)' >/dev/null; then break; fi; sleep 20; done; printf "Merge launch load: "; cat /proc/loadavg; pgrep -af scripts/verify >/tmp/e2e-remote-merge-launch-20261002.log || true; CARGO_BUILD_JOBS=2 CARGO_TERM_QUIET=true RUST_TEST_THREADS=1 INFRATERNAL_VERIFY_RUN_ID=e2e-remote-merge-20261002 scripts/verify merge >/tmp/e2e-remote-merge-20261002.log 2>&1; status=$?; cat /tmp/e2e-remote-merge-20261002.log; exit "$status"
1582536 /usr/bin/bash -c while true; do if awk '{ exit !($2 < 8) }' /proc/loadavg && ! pgrep -f '^(bash|[^ ]*/bash) ([^ ]*/)?scripts/verify ' >/dev/null && ! pgrep -f '(^|/)cargo (build .*--release|build --release|bench)' >/dev/null; then break; fi; sleep 20; done; printf "Merge launch load: "; cat /proc/loadavg; pgrep -af scripts/verify >/tmp/e2e-remote-merge-launch-20261002.log || true; CARGO_BUILD_JOBS=2 CARGO_TERM_QUIET=true RUST_TEST_THREADS=1 INFRATERNAL_VERIFY_RUN_ID=e2e-remote-merge-20261002 scripts/verify merge >/tmp/e2e-remote-merge-20261002.log 2>&1; status=$?; cat /tmp/e2e-remote-merge-20261002.log; exit "$status"
1666660 bash scripts/verify merge
1670780 /usr/bin/zsh -c while true; do if awk '{ exit !($2 < 8) }' /proc/loadavg && ! pgrep -f '^(bash|[^ ]*/bash) ([^ ]*/)?scripts/verify (integration|browser|merge)( |$)' >/dev/null && ! pgrep -f '(^|/)cargo build .*--release' >/dev/null; then break; fi; sleep 120; done CARGO_BUILD_JOBS=2 INFRATERNAL_ARTIFACT_DIR=/mnt/hdd/infraternal/artifacts/port-final/sol-20261002 INFRATERNAL_VERIFY_RUN_ID=port-final-sol-browser-2 INFRATERMINAL_TERMINAL_TEST_PORT=21847 scripts/verify browser > /tmp/port-final-sol-browser-2.log 2>&1
1700522 /home/kayg/.nix-profile/bin/rtk proxy bash -c set -o pipefail; CARGO_BUILD_JOBS=2 CARGO_TERM_QUIET=true RUST_TEST_THREADS=1 INFRATERNAL_VERIFY_RUN_ID=e2e-remote-fast-20261002-3 scripts/verify fast 2>&1 | tee /tmp/e2e-remote-fast-20261002-3.log
1700524 /usr/bin/bash -c set -o pipefail; CARGO_BUILD_JOBS=2 CARGO_TERM_QUIET=true RUST_TEST_THREADS=1 INFRATERNAL_VERIFY_RUN_ID=e2e-remote-fast-20261002-3 scripts/verify fast 2>&1 | tee /tmp/e2e-remote-fast-20261002-3.log
1700527 bash scripts/verify fast
8.20 11.94 9.26 7/1193 1759036
1521279 /home/kayg/.nix-profile/bin/rtk proxy bash -c while true; do if awk '{ exit !($2 < 8) }' /proc/loadavg && ! pgrep -f '^(bash|[^ ]*/bash) ([^ ]*/)?scripts/verify ' >/dev/null && ! pgrep -f '(^|/)cargo (build .*--release|build --release|bench)' >/dev/null; then break; fi; sleep 30; done; set -o pipefail; CARGO_BUILD_JOBS=1 scripts/verify integration 2>&1 | tee target/provider-b-evidence/integration.log
1521280 /usr/bin/bash -c while true; do if awk '{ exit !($2 < 8) }' /proc/loadavg && ! pgrep -f '^(bash|[^ ]*/bash) ([^ ]*/)?scripts/verify ' >/dev/null && ! pgrep -f '(^|/)cargo (build .*--release|build --release|bench)' >/dev/null; then break; fi; sleep 30; done; set -o pipefail; CARGO_BUILD_JOBS=1 scripts/verify integration 2>&1 | tee target/provider-b-evidence/integration.log
1582530 /home/kayg/.nix-profile/bin/rtk proxy bash -c while true; do if awk '{ exit !($2 < 8) }' /proc/loadavg && ! pgrep -f '^(bash|[^ ]*/bash) ([^ ]*/)?scripts/verify ' >/dev/null && ! pgrep -f '(^|/)cargo (build .*--release|build --release|bench)' >/dev/null; then break; fi; sleep 20; done; printf "Merge launch load: "; cat /proc/loadavg; pgrep -af scripts/verify >/tmp/e2e-remote-merge-launch-20261002.log || true; CARGO_BUILD_JOBS=2 CARGO_TERM_QUIET=true RUST_TEST_THREADS=1 INFRATERNAL_VERIFY_RUN_ID=e2e-remote-merge-20261002 scripts/verify merge >/tmp/e2e-remote-merge-20261002.log 2>&1; status=$?; cat /tmp/e2e-remote-merge-20261002.log; exit "$status"
1582536 /usr/bin/bash -c while true; do if awk '{ exit !($2 < 8) }' /proc/loadavg && ! pgrep -f '^(bash|[^ ]*/bash) ([^ ]*/)?scripts/verify ' >/dev/null && ! pgrep -f '(^|/)cargo (build .*--release|build --release|bench)' >/dev/null; then break; fi; sleep 20; done; printf "Merge launch load: "; cat /proc/loadavg; pgrep -af scripts/verify >/tmp/e2e-remote-merge-launch-20261002.log || true; CARGO_BUILD_JOBS=2 CARGO_TERM_QUIET=true RUST_TEST_THREADS=1 INFRATERNAL_VERIFY_RUN_ID=e2e-remote-merge-20261002 scripts/verify merge >/tmp/e2e-remote-merge-20261002.log 2>&1; status=$?; cat /tmp/e2e-remote-merge-20261002.log; exit "$status"
1666660 bash scripts/verify merge
1670780 /usr/bin/zsh -c while true; do if awk '{ exit !($2 < 8) }' /proc/loadavg && ! pgrep -f '^(bash|[^ ]*/bash) ([^ ]*/)?scripts/verify (integration|browser|merge)( |$)' >/dev/null && ! pgrep -f '(^|/)cargo build .*--release' >/dev/null; then break; fi; sleep 120; done CARGO_BUILD_JOBS=2 INFRATERNAL_ARTIFACT_DIR=/mnt/hdd/infraternal/artifacts/port-final/sol-20261002 INFRATERNAL_VERIFY_RUN_ID=port-final-sol-browser-2 INFRATERMINAL_TERMINAL_TEST_PORT=21847 scripts/verify browser > /tmp/port-final-sol-browser-2.log 2>&1
6.72 10.40 9.04 3/1155 1763093
1521279 /home/kayg/.nix-profile/bin/rtk proxy bash -c while true; do if awk '{ exit !($2 < 8) }' /proc/loadavg && ! pgrep -f '^(bash|[^ ]*/bash) ([^ ]*/)?scripts/verify ' >/dev/null && ! pgrep -f '(^|/)cargo (build .*--release|build --release|bench)' >/dev/null; then break; fi; sleep 30; done; set -o pipefail; CARGO_BUILD_JOBS=1 scripts/verify integration 2>&1 | tee target/provider-b-evidence/integration.log
1521280 /usr/bin/bash -c while true; do if awk '{ exit !($2 < 8) }' /proc/loadavg && ! pgrep -f '^(bash|[^ ]*/bash) ([^ ]*/)?scripts/verify ' >/dev/null && ! pgrep -f '(^|/)cargo (build .*--release|build --release|bench)' >/dev/null; then break; fi; sleep 30; done; set -o pipefail; CARGO_BUILD_JOBS=1 scripts/verify integration 2>&1 | tee target/provider-b-evidence/integration.log
1582530 /home/kayg/.nix-profile/bin/rtk proxy bash -c while true; do if awk '{ exit !($2 < 8) }' /proc/loadavg && ! pgrep -f '^(bash|[^ ]*/bash) ([^ ]*/)?scripts/verify ' >/dev/null && ! pgrep -f '(^|/)cargo (build .*--release|build --release|bench)' >/dev/null; then break; fi; sleep 20; done; printf "Merge launch load: "; cat /proc/loadavg; pgrep -af scripts/verify >/tmp/e2e-remote-merge-launch-20261002.log || true; CARGO_BUILD_JOBS=2 CARGO_TERM_QUIET=true RUST_TEST_THREADS=1 INFRATERNAL_VERIFY_RUN_ID=e2e-remote-merge-20261002 scripts/verify merge >/tmp/e2e-remote-merge-20261002.log 2>&1; status=$?; cat /tmp/e2e-remote-merge-20261002.log; exit "$status"
1582536 /usr/bin/bash -c while true; do if awk '{ exit !($2 < 8) }' /proc/loadavg && ! pgrep -f '^(bash|[^ ]*/bash) ([^ ]*/)?scripts/verify ' >/dev/null && ! pgrep -f '(^|/)cargo (build .*--release|build --release|bench)' >/dev/null; then break; fi; sleep 20; done; printf "Merge launch load: "; cat /proc/loadavg; pgrep -af scripts/verify >/tmp/e2e-remote-merge-launch-20261002.log || true; CARGO_BUILD_JOBS=2 CARGO_TERM_QUIET=true RUST_TEST_THREADS=1 INFRATERNAL_VERIFY_RUN_ID=e2e-remote-merge-20261002 scripts/verify merge >/tmp/e2e-remote-merge-20261002.log 2>&1; status=$?; cat /tmp/e2e-remote-merge-20261002.log; exit "$status"
1666660 bash scripts/verify merge
1670780 /usr/bin/zsh -c while true; do if awk '{ exit !($2 < 8) }' /proc/loadavg && ! pgrep -f '^(bash|[^ ]*/bash) ([^ ]*/)?scripts/verify (integration|browser|merge)( |$)' >/dev/null && ! pgrep -f '(^|/)cargo build .*--release' >/dev/null; then break; fi; sleep 120; done CARGO_BUILD_JOBS=2 INFRATERNAL_ARTIFACT_DIR=/mnt/hdd/infraternal/artifacts/port-final/sol-20261002 INFRATERNAL_VERIFY_RUN_ID=port-final-sol-browser-2 INFRATERMINAL_TERMINAL_TEST_PORT=21847 scripts/verify browser > /tmp/port-final-sol-browser-2.log 2>&1
1762083 bash scripts/verify fast
11.48 10.24 9.10 23/1254 1770591
1521279 /home/kayg/.nix-profile/bin/rtk proxy bash -c while true; do if awk '{ exit !($2 < 8) }' /proc/loadavg && ! pgrep -f '^(bash|[^ ]*/bash) ([^ ]*/)?scripts/verify ' >/dev/null && ! pgrep -f '(^|/)cargo (build .*--release|build --release|bench)' >/dev/null; then break; fi; sleep 30; done; set -o pipefail; CARGO_BUILD_JOBS=1 scripts/verify integration 2>&1 | tee target/provider-b-evidence/integration.log
1521280 /usr/bin/bash -c while true; do if awk '{ exit !($2 < 8) }' /proc/loadavg && ! pgrep -f '^(bash|[^ ]*/bash) ([^ ]*/)?scripts/verify ' >/dev/null && ! pgrep -f '(^|/)cargo (build .*--release|build --release|bench)' >/dev/null; then break; fi; sleep 30; done; set -o pipefail; CARGO_BUILD_JOBS=1 scripts/verify integration 2>&1 | tee target/provider-b-evidence/integration.log
1582530 /home/kayg/.nix-profile/bin/rtk proxy bash -c while true; do if awk '{ exit !($2 < 8) }' /proc/loadavg && ! pgrep -f '^(bash|[^ ]*/bash) ([^ ]*/)?scripts/verify ' >/dev/null && ! pgrep -f '(^|/)cargo (build .*--release|build --release|bench)' >/dev/null; then break; fi; sleep 20; done; printf "Merge launch load: "; cat /proc/loadavg; pgrep -af scripts/verify >/tmp/e2e-remote-merge-launch-20261002.log || true; CARGO_BUILD_JOBS=2 CARGO_TERM_QUIET=true RUST_TEST_THREADS=1 INFRATERNAL_VERIFY_RUN_ID=e2e-remote-merge-20261002 scripts/verify merge >/tmp/e2e-remote-merge-20261002.log 2>&1; status=$?; cat /tmp/e2e-remote-merge-20261002.log; exit "$status"
1582536 /usr/bin/bash -c while true; do if awk '{ exit !($2 < 8) }' /proc/loadavg && ! pgrep -f '^(bash|[^ ]*/bash) ([^ ]*/)?scripts/verify ' >/dev/null && ! pgrep -f '(^|/)cargo (build .*--release|build --release|bench)' >/dev/null; then break; fi; sleep 20; done; printf "Merge launch load: "; cat /proc/loadavg; pgrep -af scripts/verify >/tmp/e2e-remote-merge-launch-20261002.log || true; CARGO_BUILD_JOBS=2 CARGO_TERM_QUIET=true RUST_TEST_THREADS=1 INFRATERNAL_VERIFY_RUN_ID=e2e-remote-merge-20261002 scripts/verify merge >/tmp/e2e-remote-merge-20261002.log 2>&1; status=$?; cat /tmp/e2e-remote-merge-20261002.log; exit "$status"
1666660 bash scripts/verify merge
1670780 /usr/bin/zsh -c while true; do if awk '{ exit !($2 < 8) }' /proc/loadavg && ! pgrep -f '^(bash|[^ ]*/bash) ([^ ]*/)?scripts/verify (integration|browser|merge)( |$)' >/dev/null && ! pgrep -f '(^|/)cargo build .*--release' >/dev/null; then break; fi; sleep 120; done CARGO_BUILD_JOBS=2 INFRATERNAL_ARTIFACT_DIR=/mnt/hdd/infraternal/artifacts/port-final/sol-20261002 INFRATERNAL_VERIFY_RUN_ID=port-final-sol-browser-2 INFRATERMINAL_TERMINAL_TEST_PORT=21847 scripts/verify browser > /tmp/port-final-sol-browser-2.log 2>&1
1762083 bash scripts/verify fast
1765041 timeout 2700 scripts/verify merge
1765042 bash scripts/verify merge
1765750 /home/kayg/.nix-profile/bin/rtk run mkdir -p target; set -o pipefail; INFRATERNAL_VERIFY_RUN_ID=fix-ps-20261002-2117 scripts/verify fast 2>&1 | tee target/fix-ps-verify-fast.log
1765761 sh -c mkdir -p target; set -o pipefail; INFRATERNAL_VERIFY_RUN_ID=fix-ps-20261002-2117 scripts/verify fast 2>&1 | tee target/fix-ps-verify-fast.log
1765767 bash scripts/verify fast
15.14 12.50 10.10 16/1223 1779523
1521279 /home/kayg/.nix-profile/bin/rtk proxy bash -c while true; do if awk '{ exit !($2 < 8) }' /proc/loadavg && ! pgrep -f '^(bash|[^ ]*/bash) ([^ ]*/)?scripts/verify ' >/dev/null && ! pgrep -f '(^|/)cargo (build .*--release|build --release|bench)' >/dev/null; then break; fi; sleep 30; done; set -o pipefail; CARGO_BUILD_JOBS=1 scripts/verify integration 2>&1 | tee target/provider-b-evidence/integration.log
1521280 /usr/bin/bash -c while true; do if awk '{ exit !($2 < 8) }' /proc/loadavg && ! pgrep -f '^(bash|[^ ]*/bash) ([^ ]*/)?scripts/verify ' >/dev/null && ! pgrep -f '(^|/)cargo (build .*--release|build --release|bench)' >/dev/null; then break; fi; sleep 30; done; set -o pipefail; CARGO_BUILD_JOBS=1 scripts/verify integration 2>&1 | tee target/provider-b-evidence/integration.log
1582530 /home/kayg/.nix-profile/bin/rtk proxy bash -c while true; do if awk '{ exit !($2 < 8) }' /proc/loadavg && ! pgrep -f '^(bash|[^ ]*/bash) ([^ ]*/)?scripts/verify ' >/dev/null && ! pgrep -f '(^|/)cargo (build .*--release|build --release|bench)' >/dev/null; then break; fi; sleep 20; done; printf "Merge launch load: "; cat /proc/loadavg; pgrep -af scripts/verify >/tmp/e2e-remote-merge-launch-20261002.log || true; CARGO_BUILD_JOBS=2 CARGO_TERM_QUIET=true RUST_TEST_THREADS=1 INFRATERNAL_VERIFY_RUN_ID=e2e-remote-merge-20261002 scripts/verify merge >/tmp/e2e-remote-merge-20261002.log 2>&1; status=$?; cat /tmp/e2e-remote-merge-20261002.log; exit "$status"
1582536 /usr/bin/bash -c while true; do if awk '{ exit !($2 < 8) }' /proc/loadavg && ! pgrep -f '^(bash|[^ ]*/bash) ([^ ]*/)?scripts/verify ' >/dev/null && ! pgrep -f '(^|/)cargo (build .*--release|build --release|bench)' >/dev/null; then break; fi; sleep 20; done; printf "Merge launch load: "; cat /proc/loadavg; pgrep -af scripts/verify >/tmp/e2e-remote-merge-launch-20261002.log || true; CARGO_BUILD_JOBS=2 CARGO_TERM_QUIET=true RUST_TEST_THREADS=1 INFRATERNAL_VERIFY_RUN_ID=e2e-remote-merge-20261002 scripts/verify merge >/tmp/e2e-remote-merge-20261002.log 2>&1; status=$?; cat /tmp/e2e-remote-merge-20261002.log; exit "$status"
1666660 bash scripts/verify merge
1670780 /usr/bin/zsh -c while true; do if awk '{ exit !($2 < 8) }' /proc/loadavg && ! pgrep -f '^(bash|[^ ]*/bash) ([^ ]*/)?scripts/verify (integration|browser|merge)( |$)' >/dev/null && ! pgrep -f '(^|/)cargo build .*--release' >/dev/null; then break; fi; sleep 120; done CARGO_BUILD_JOBS=2 INFRATERNAL_ARTIFACT_DIR=/mnt/hdd/infraternal/artifacts/port-final/sol-20261002 INFRATERNAL_VERIFY_RUN_ID=port-final-sol-browser-2 INFRATERMINAL_TERMINAL_TEST_PORT=21847 scripts/verify browser > /tmp/port-final-sol-browser-2.log 2>&1
1762083 bash scripts/verify fast
1765041 timeout 2700 scripts/verify merge
1765042 bash scripts/verify merge
1765750 /home/kayg/.nix-profile/bin/rtk run mkdir -p target; set -o pipefail; INFRATERNAL_VERIFY_RUN_ID=fix-ps-20261002-2117 scripts/verify fast 2>&1 | tee target/fix-ps-verify-fast.log
1765761 sh -c mkdir -p target; set -o pipefail; INFRATERNAL_VERIFY_RUN_ID=fix-ps-20261002-2117 scripts/verify fast 2>&1 | tee target/fix-ps-verify-fast.log
1765767 bash scripts/verify fast
15.88 13.50 10.76 21/1317 1794134
1521279 /home/kayg/.nix-profile/bin/rtk proxy bash -c while true; do if awk '{ exit !($2 < 8) }' /proc/loadavg && ! pgrep -f '^(bash|[^ ]*/bash) ([^ ]*/)?scripts/verify ' >/dev/null && ! pgrep -f '(^|/)cargo (build .*--release|build --release|bench)' >/dev/null; then break; fi; sleep 30; done; set -o pipefail; CARGO_BUILD_JOBS=1 scripts/verify integration 2>&1 | tee target/provider-b-evidence/integration.log
1521280 /usr/bin/bash -c while true; do if awk '{ exit !($2 < 8) }' /proc/loadavg && ! pgrep -f '^(bash|[^ ]*/bash) ([^ ]*/)?scripts/verify ' >/dev/null && ! pgrep -f '(^|/)cargo (build .*--release|build --release|bench)' >/dev/null; then break; fi; sleep 30; done; set -o pipefail; CARGO_BUILD_JOBS=1 scripts/verify integration 2>&1 | tee target/provider-b-evidence/integration.log
1582530 /home/kayg/.nix-profile/bin/rtk proxy bash -c while true; do if awk '{ exit !($2 < 8) }' /proc/loadavg && ! pgrep -f '^(bash|[^ ]*/bash) ([^ ]*/)?scripts/verify ' >/dev/null && ! pgrep -f '(^|/)cargo (build .*--release|build --release|bench)' >/dev/null; then break; fi; sleep 20; done; printf "Merge launch load: "; cat /proc/loadavg; pgrep -af scripts/verify >/tmp/e2e-remote-merge-launch-20261002.log || true; CARGO_BUILD_JOBS=2 CARGO_TERM_QUIET=true RUST_TEST_THREADS=1 INFRATERNAL_VERIFY_RUN_ID=e2e-remote-merge-20261002 scripts/verify merge >/tmp/e2e-remote-merge-20261002.log 2>&1; status=$?; cat /tmp/e2e-remote-merge-20261002.log; exit "$status"
1582536 /usr/bin/bash -c while true; do if awk '{ exit !($2 < 8) }' /proc/loadavg && ! pgrep -f '^(bash|[^ ]*/bash) ([^ ]*/)?scripts/verify ' >/dev/null && ! pgrep -f '(^|/)cargo (build .*--release|build --release|bench)' >/dev/null; then break; fi; sleep 20; done; printf "Merge launch load: "; cat /proc/loadavg; pgrep -af scripts/verify >/tmp/e2e-remote-merge-launch-20261002.log || true; CARGO_BUILD_JOBS=2 CARGO_TERM_QUIET=true RUST_TEST_THREADS=1 INFRATERNAL_VERIFY_RUN_ID=e2e-remote-merge-20261002 scripts/verify merge >/tmp/e2e-remote-merge-20261002.log 2>&1; status=$?; cat /tmp/e2e-remote-merge-20261002.log; exit "$status"
1666660 bash scripts/verify merge
1670780 /usr/bin/zsh -c while true; do if awk '{ exit !($2 < 8) }' /proc/loadavg && ! pgrep -f '^(bash|[^ ]*/bash) ([^ ]*/)?scripts/verify (integration|browser|merge)( |$)' >/dev/null && ! pgrep -f '(^|/)cargo build .*--release' >/dev/null; then break; fi; sleep 120; done CARGO_BUILD_JOBS=2 INFRATERNAL_ARTIFACT_DIR=/mnt/hdd/infraternal/artifacts/port-final/sol-20261002 INFRATERNAL_VERIFY_RUN_ID=port-final-sol-browser-2 INFRATERMINAL_TERMINAL_TEST_PORT=21847 scripts/verify browser > /tmp/port-final-sol-browser-2.log 2>&1
1765041 timeout 2700 scripts/verify merge
1765042 bash scripts/verify merge
1765750 /home/kayg/.nix-profile/bin/rtk run mkdir -p target; set -o pipefail; INFRATERNAL_VERIFY_RUN_ID=fix-ps-20261002-2117 scripts/verify fast 2>&1 | tee target/fix-ps-verify-fast.log
1765761 sh -c mkdir -p target; set -o pipefail; INFRATERNAL_VERIFY_RUN_ID=fix-ps-20261002-2117 scripts/verify fast 2>&1 | tee target/fix-ps-verify-fast.log
1765767 bash scripts/verify fast
21.14 16.35 12.14 15/1220 1803238
1521279 /home/kayg/.nix-profile/bin/rtk proxy bash -c while true; do if awk '{ exit !($2 < 8) }' /proc/loadavg && ! pgrep -f '^(bash|[^ ]*/bash) ([^ ]*/)?scripts/verify ' >/dev/null && ! pgrep -f '(^|/)cargo (build .*--release|build --release|bench)' >/dev/null; then break; fi; sleep 30; done; set -o pipefail; CARGO_BUILD_JOBS=1 scripts/verify integration 2>&1 | tee target/provider-b-evidence/integration.log
1521280 /usr/bin/bash -c while true; do if awk '{ exit !($2 < 8) }' /proc/loadavg && ! pgrep -f '^(bash|[^ ]*/bash) ([^ ]*/)?scripts/verify ' >/dev/null && ! pgrep -f '(^|/)cargo (build .*--release|build --release|bench)' >/dev/null; then break; fi; sleep 30; done; set -o pipefail; CARGO_BUILD_JOBS=1 scripts/verify integration 2>&1 | tee target/provider-b-evidence/integration.log
1582530 /home/kayg/.nix-profile/bin/rtk proxy bash -c while true; do if awk '{ exit !($2 < 8) }' /proc/loadavg && ! pgrep -f '^(bash|[^ ]*/bash) ([^ ]*/)?scripts/verify ' >/dev/null && ! pgrep -f '(^|/)cargo (build .*--release|build --release|bench)' >/dev/null; then break; fi; sleep 20; done; printf "Merge launch load: "; cat /proc/loadavg; pgrep -af scripts/verify >/tmp/e2e-remote-merge-launch-20261002.log || true; CARGO_BUILD_JOBS=2 CARGO_TERM_QUIET=true RUST_TEST_THREADS=1 INFRATERNAL_VERIFY_RUN_ID=e2e-remote-merge-20261002 scripts/verify merge >/tmp/e2e-remote-merge-20261002.log 2>&1; status=$?; cat /tmp/e2e-remote-merge-20261002.log; exit "$status"
1582536 /usr/bin/bash -c while true; do if awk '{ exit !($2 < 8) }' /proc/loadavg && ! pgrep -f '^(bash|[^ ]*/bash) ([^ ]*/)?scripts/verify ' >/dev/null && ! pgrep -f '(^|/)cargo (build .*--release|build --release|bench)' >/dev/null; then break; fi; sleep 20; done; printf "Merge launch load: "; cat /proc/loadavg; pgrep -af scripts/verify >/tmp/e2e-remote-merge-launch-20261002.log || true; CARGO_BUILD_JOBS=2 CARGO_TERM_QUIET=true RUST_TEST_THREADS=1 INFRATERNAL_VERIFY_RUN_ID=e2e-remote-merge-20261002 scripts/verify merge >/tmp/e2e-remote-merge-20261002.log 2>&1; status=$?; cat /tmp/e2e-remote-merge-20261002.log; exit "$status"
1666660 bash scripts/verify merge
1670780 /usr/bin/zsh -c while true; do if awk '{ exit !($2 < 8) }' /proc/loadavg && ! pgrep -f '^(bash|[^ ]*/bash) ([^ ]*/)?scripts/verify (integration|browser|merge)( |$)' >/dev/null && ! pgrep -f '(^|/)cargo build .*--release' >/dev/null; then break; fi; sleep 120; done CARGO_BUILD_JOBS=2 INFRATERNAL_ARTIFACT_DIR=/mnt/hdd/infraternal/artifacts/port-final/sol-20261002 INFRATERNAL_VERIFY_RUN_ID=port-final-sol-browser-2 INFRATERMINAL_TERMINAL_TEST_PORT=21847 scripts/verify browser > /tmp/port-final-sol-browser-2.log 2>&1
1765041 timeout 2700 scripts/verify merge
1765042 bash scripts/verify merge
1765750 /home/kayg/.nix-profile/bin/rtk run mkdir -p target; set -o pipefail; INFRATERNAL_VERIFY_RUN_ID=fix-ps-20261002-2117 scripts/verify fast 2>&1 | tee target/fix-ps-verify-fast.log
1765761 sh -c mkdir -p target; set -o pipefail; INFRATERNAL_VERIFY_RUN_ID=fix-ps-20261002-2117 scripts/verify fast 2>&1 | tee target/fix-ps-verify-fast.log
1765767 bash scripts/verify fast
11.93 14.58 12.02 19/1288 1812407
1521279 /home/kayg/.nix-profile/bin/rtk proxy bash -c while true; do if awk '{ exit !($2 < 8) }' /proc/loadavg && ! pgrep -f '^(bash|[^ ]*/bash) ([^ ]*/)?scripts/verify ' >/dev/null && ! pgrep -f '(^|/)cargo (build .*--release|build --release|bench)' >/dev/null; then break; fi; sleep 30; done; set -o pipefail; CARGO_BUILD_JOBS=1 scripts/verify integration 2>&1 | tee target/provider-b-evidence/integration.log
1521280 /usr/bin/bash -c while true; do if awk '{ exit !($2 < 8) }' /proc/loadavg && ! pgrep -f '^(bash|[^ ]*/bash) ([^ ]*/)?scripts/verify ' >/dev/null && ! pgrep -f '(^|/)cargo (build .*--release|build --release|bench)' >/dev/null; then break; fi; sleep 30; done; set -o pipefail; CARGO_BUILD_JOBS=1 scripts/verify integration 2>&1 | tee target/provider-b-evidence/integration.log
1582530 /home/kayg/.nix-profile/bin/rtk proxy bash -c while true; do if awk '{ exit !($2 < 8) }' /proc/loadavg && ! pgrep -f '^(bash|[^ ]*/bash) ([^ ]*/)?scripts/verify ' >/dev/null && ! pgrep -f '(^|/)cargo (build .*--release|build --release|bench)' >/dev/null; then break; fi; sleep 20; done; printf "Merge launch load: "; cat /proc/loadavg; pgrep -af scripts/verify >/tmp/e2e-remote-merge-launch-20261002.log || true; CARGO_BUILD_JOBS=2 CARGO_TERM_QUIET=true RUST_TEST_THREADS=1 INFRATERNAL_VERIFY_RUN_ID=e2e-remote-merge-20261002 scripts/verify merge >/tmp/e2e-remote-merge-20261002.log 2>&1; status=$?; cat /tmp/e2e-remote-merge-20261002.log; exit "$status"
1582536 /usr/bin/bash -c while true; do if awk '{ exit !($2 < 8) }' /proc/loadavg && ! pgrep -f '^(bash|[^ ]*/bash) ([^ ]*/)?scripts/verify ' >/dev/null && ! pgrep -f '(^|/)cargo (build .*--release|build --release|bench)' >/dev/null; then break; fi; sleep 20; done; printf "Merge launch load: "; cat /proc/loadavg; pgrep -af scripts/verify >/tmp/e2e-remote-merge-launch-20261002.log || true; CARGO_BUILD_JOBS=2 CARGO_TERM_QUIET=true RUST_TEST_THREADS=1 INFRATERNAL_VERIFY_RUN_ID=e2e-remote-merge-20261002 scripts/verify merge >/tmp/e2e-remote-merge-20261002.log 2>&1; status=$?; cat /tmp/e2e-remote-merge-20261002.log; exit "$status"
1666660 bash scripts/verify merge
1670780 /usr/bin/zsh -c while true; do if awk '{ exit !($2 < 8) }' /proc/loadavg && ! pgrep -f '^(bash|[^ ]*/bash) ([^ ]*/)?scripts/verify (integration|browser|merge)( |$)' >/dev/null && ! pgrep -f '(^|/)cargo build .*--release' >/dev/null; then break; fi; sleep 120; done CARGO_BUILD_JOBS=2 INFRATERNAL_ARTIFACT_DIR=/mnt/hdd/infraternal/artifacts/port-final/sol-20261002 INFRATERNAL_VERIFY_RUN_ID=port-final-sol-browser-2 INFRATERMINAL_TERMINAL_TEST_PORT=21847 scripts/verify browser > /tmp/port-final-sol-browser-2.log 2>&1
1765041 timeout 2700 scripts/verify merge
1765042 bash scripts/verify merge
9.10 12.82 11.70 5/1202 1822825
1521279 /home/kayg/.nix-profile/bin/rtk proxy bash -c while true; do if awk '{ exit !($2 < 8) }' /proc/loadavg && ! pgrep -f '^(bash|[^ ]*/bash) ([^ ]*/)?scripts/verify ' >/dev/null && ! pgrep -f '(^|/)cargo (build .*--release|build --release|bench)' >/dev/null; then break; fi; sleep 30; done; set -o pipefail; CARGO_BUILD_JOBS=1 scripts/verify integration 2>&1 | tee target/provider-b-evidence/integration.log
1521280 /usr/bin/bash -c while true; do if awk '{ exit !($2 < 8) }' /proc/loadavg && ! pgrep -f '^(bash|[^ ]*/bash) ([^ ]*/)?scripts/verify ' >/dev/null && ! pgrep -f '(^|/)cargo (build .*--release|build --release|bench)' >/dev/null; then break; fi; sleep 30; done; set -o pipefail; CARGO_BUILD_JOBS=1 scripts/verify integration 2>&1 | tee target/provider-b-evidence/integration.log
1582530 /home/kayg/.nix-profile/bin/rtk proxy bash -c while true; do if awk '{ exit !($2 < 8) }' /proc/loadavg && ! pgrep -f '^(bash|[^ ]*/bash) ([^ ]*/)?scripts/verify ' >/dev/null && ! pgrep -f '(^|/)cargo (build .*--release|build --release|bench)' >/dev/null; then break; fi; sleep 20; done; printf "Merge launch load: "; cat /proc/loadavg; pgrep -af scripts/verify >/tmp/e2e-remote-merge-launch-20261002.log || true; CARGO_BUILD_JOBS=2 CARGO_TERM_QUIET=true RUST_TEST_THREADS=1 INFRATERNAL_VERIFY_RUN_ID=e2e-remote-merge-20261002 scripts/verify merge >/tmp/e2e-remote-merge-20261002.log 2>&1; status=$?; cat /tmp/e2e-remote-merge-20261002.log; exit "$status"
1582536 /usr/bin/bash -c while true; do if awk '{ exit !($2 < 8) }' /proc/loadavg && ! pgrep -f '^(bash|[^ ]*/bash) ([^ ]*/)?scripts/verify ' >/dev/null && ! pgrep -f '(^|/)cargo (build .*--release|build --release|bench)' >/dev/null; then break; fi; sleep 20; done; printf "Merge launch load: "; cat /proc/loadavg; pgrep -af scripts/verify >/tmp/e2e-remote-merge-launch-20261002.log || true; CARGO_BUILD_JOBS=2 CARGO_TERM_QUIET=true RUST_TEST_THREADS=1 INFRATERNAL_VERIFY_RUN_ID=e2e-remote-merge-20261002 scripts/verify merge >/tmp/e2e-remote-merge-20261002.log 2>&1; status=$?; cat /tmp/e2e-remote-merge-20261002.log; exit "$status"
1670780 /usr/bin/zsh -c while true; do if awk '{ exit !($2 < 8) }' /proc/loadavg && ! pgrep -f '^(bash|[^ ]*/bash) ([^ ]*/)?scripts/verify (integration|browser|merge)( |$)' >/dev/null && ! pgrep -f '(^|/)cargo build .*--release' >/dev/null; then break; fi; sleep 120; done CARGO_BUILD_JOBS=2 INFRATERNAL_ARTIFACT_DIR=/mnt/hdd/infraternal/artifacts/port-final/sol-20261002 INFRATERNAL_VERIFY_RUN_ID=port-final-sol-browser-2 INFRATERMINAL_TERMINAL_TEST_PORT=21847 scripts/verify browser > /tmp/port-final-sol-browser-2.log 2>&1
1765041 timeout 2700 scripts/verify merge
1765042 bash scripts/verify merge
1817014 bash scripts/verify perf --dev-vm --calibrate target/perf/base-final.json --output target/perf/base-final-diagnostic.json
7.06 10.66 11.02 7/1087 1830976
1521279 /home/kayg/.nix-profile/bin/rtk proxy bash -c while true; do if awk '{ exit !($2 < 8) }' /proc/loadavg && ! pgrep -f '^(bash|[^ ]*/bash) ([^ ]*/)?scripts/verify ' >/dev/null && ! pgrep -f '(^|/)cargo (build .*--release|build --release|bench)' >/dev/null; then break; fi; sleep 30; done; set -o pipefail; CARGO_BUILD_JOBS=1 scripts/verify integration 2>&1 | tee target/provider-b-evidence/integration.log
1521280 /usr/bin/bash -c while true; do if awk '{ exit !($2 < 8) }' /proc/loadavg && ! pgrep -f '^(bash|[^ ]*/bash) ([^ ]*/)?scripts/verify ' >/dev/null && ! pgrep -f '(^|/)cargo (build .*--release|build --release|bench)' >/dev/null; then break; fi; sleep 30; done; set -o pipefail; CARGO_BUILD_JOBS=1 scripts/verify integration 2>&1 | tee target/provider-b-evidence/integration.log
1582530 /home/kayg/.nix-profile/bin/rtk proxy bash -c while true; do if awk '{ exit !($2 < 8) }' /proc/loadavg && ! pgrep -f '^(bash|[^ ]*/bash) ([^ ]*/)?scripts/verify ' >/dev/null && ! pgrep -f '(^|/)cargo (build .*--release|build --release|bench)' >/dev/null; then break; fi; sleep 20; done; printf "Merge launch load: "; cat /proc/loadavg; pgrep -af scripts/verify >/tmp/e2e-remote-merge-launch-20261002.log || true; CARGO_BUILD_JOBS=2 CARGO_TERM_QUIET=true RUST_TEST_THREADS=1 INFRATERNAL_VERIFY_RUN_ID=e2e-remote-merge-20261002 scripts/verify merge >/tmp/e2e-remote-merge-20261002.log 2>&1; status=$?; cat /tmp/e2e-remote-merge-20261002.log; exit "$status"
1582536 /usr/bin/bash -c while true; do if awk '{ exit !($2 < 8) }' /proc/loadavg && ! pgrep -f '^(bash|[^ ]*/bash) ([^ ]*/)?scripts/verify ' >/dev/null && ! pgrep -f '(^|/)cargo (build .*--release|build --release|bench)' >/dev/null; then break; fi; sleep 20; done; printf "Merge launch load: "; cat /proc/loadavg; pgrep -af scripts/verify >/tmp/e2e-remote-merge-launch-20261002.log || true; CARGO_BUILD_JOBS=2 CARGO_TERM_QUIET=true RUST_TEST_THREADS=1 INFRATERNAL_VERIFY_RUN_ID=e2e-remote-merge-20261002 scripts/verify merge >/tmp/e2e-remote-merge-20261002.log 2>&1; status=$?; cat /tmp/e2e-remote-merge-20261002.log; exit "$status"
1670780 /usr/bin/zsh -c while true; do if awk '{ exit !($2 < 8) }' /proc/loadavg && ! pgrep -f '^(bash|[^ ]*/bash) ([^ ]*/)?scripts/verify (integration|browser|merge)( |$)' >/dev/null && ! pgrep -f '(^|/)cargo build .*--release' >/dev/null; then break; fi; sleep 120; done CARGO_BUILD_JOBS=2 INFRATERNAL_ARTIFACT_DIR=/mnt/hdd/infraternal/artifacts/port-final/sol-20261002 INFRATERNAL_VERIFY_RUN_ID=port-final-sol-browser-2 INFRATERMINAL_TERMINAL_TEST_PORT=21847 scripts/verify browser > /tmp/port-final-sol-browser-2.log 2>&1
1765041 timeout 2700 scripts/verify merge
1765042 bash scripts/verify merge
1817014 bash scripts/verify perf --dev-vm --calibrate target/perf/base-final.json --output target/perf/base-final-diagnostic.json
START sshd_cleanup sshd::tests::live_listener_is_identified_by_config_and_socket
PASS sshd_cleanup sshd::tests::live_listener_is_identified_by_config_and_socket
START sshd_cleanup sshd::tests::sigkill_of_test_runner_cleans_listener_and_run_directory
PASS sshd_cleanup sshd::tests::sigkill_of_test_runner_cleans_listener_and_run_directory
START real_sshd strict_host_key_change
PASS real_sshd strict_host_key_change
START real_sshd per_host_shell_mode_controls_multiplexer_rc
PASS real_sshd per_host_shell_mode_controls_multiplexer_rc
START real_sshd open_key_is_scoped_to_session_owner
PASS real_sshd open_key_is_scoped_to_session_owner
START real_sshd failed_retry_audit_does_not_terminate_original_session
PASS real_sshd failed_retry_audit_does_not_terminate_original_session
START real_sshd pty_resize_and_replay
PASS real_sshd pty_resize_and_replay
START real_sshd concurrent_same_open_key
PASS real_sshd concurrent_same_open_key
START real_sshd takeover_while_output_flows
PASS real_sshd takeover_while_output_flows
START real_sshd simultaneous_actual_persistent_limits
PASS real_sshd simultaneous_actual_persistent_limits
START real_sshd session_limits_include_nonpersistent
PASS real_sshd session_limits_include_nonpersistent
START real_sshd owner_loss_terminates_shell
PASS real_sshd owner_loss_terminates_shell
START real_sshd dropping_local_sshd_kills_detached_session
PASS real_sshd dropping_local_sshd_kills_detached_session
START real_sshd plain_thread_termination_terminates_shell
PASS real_sshd plain_thread_termination_terminates_shell
START real_sshd direct_terminate_terminates_shell
PASS real_sshd direct_terminate_terminates_shell
START real_sshd idle_expiry_terminates_shell
PASS real_sshd idle_expiry_terminates_shell
START real_sshd nonpersistent_attachment_drop_terminates_shell
PASS real_sshd nonpersistent_attachment_drop_terminates_shell
RESULT SSH cleanup and surrounding tests passes=18 failures=0 total=18

Current CLI STREAM_ONLY 20-repeat proof: new head compiled, iteration1 PASS (77.87s), iteration2 running. No full repeat pass claim yet. Fast/merge remain queued because another verify perf run is active. No other run process has been signalled or stopped.

lp-flaky head a0eb7be: all three dedicated sshd cleanup checks and all 15 surrounding real_sshd cases passed individually, 18/18 total. Each test used a fresh run-specific fixture root and original HOME, one Cargo worker at nice15, checking load5 <10 before starting. The SIGKILL regression kills only its own child test process; its watchdog cleaned that private listener/run directory. Verbatim output: ``` START sshd_cleanup sshd::tests::stale_sweep_kills_marked_processes_and_removes_the_run_directory PASS sshd_cleanup sshd::tests::stale_sweep_kills_marked_processes_and_removes_the_run_directory 15.02 14.15 9.50 6/1182 1754706 1521279 /home/kayg/.nix-profile/bin/rtk proxy bash -c while true; do if awk '{ exit !($2 < 8) }' /proc/loadavg && ! pgrep -f '^(bash|[^ ]*/bash) ([^ ]*/)?scripts/verify ' >/dev/null && ! pgrep -f '(^|/)cargo (build .*--release|build --release|bench)' >/dev/null; then break; fi; sleep 30; done; set -o pipefail; CARGO_BUILD_JOBS=1 scripts/verify integration 2>&1 | tee target/provider-b-evidence/integration.log 1521280 /usr/bin/bash -c while true; do if awk '{ exit !($2 < 8) }' /proc/loadavg && ! pgrep -f '^(bash|[^ ]*/bash) ([^ ]*/)?scripts/verify ' >/dev/null && ! pgrep -f '(^|/)cargo (build .*--release|build --release|bench)' >/dev/null; then break; fi; sleep 30; done; set -o pipefail; CARGO_BUILD_JOBS=1 scripts/verify integration 2>&1 | tee target/provider-b-evidence/integration.log 1582530 /home/kayg/.nix-profile/bin/rtk proxy bash -c while true; do if awk '{ exit !($2 < 8) }' /proc/loadavg && ! pgrep -f '^(bash|[^ ]*/bash) ([^ ]*/)?scripts/verify ' >/dev/null && ! pgrep -f '(^|/)cargo (build .*--release|build --release|bench)' >/dev/null; then break; fi; sleep 20; done; printf "Merge launch load: "; cat /proc/loadavg; pgrep -af scripts/verify >/tmp/e2e-remote-merge-launch-20261002.log || true; CARGO_BUILD_JOBS=2 CARGO_TERM_QUIET=true RUST_TEST_THREADS=1 INFRATERNAL_VERIFY_RUN_ID=e2e-remote-merge-20261002 scripts/verify merge >/tmp/e2e-remote-merge-20261002.log 2>&1; status=$?; cat /tmp/e2e-remote-merge-20261002.log; exit "$status" 1582536 /usr/bin/bash -c while true; do if awk '{ exit !($2 < 8) }' /proc/loadavg && ! pgrep -f '^(bash|[^ ]*/bash) ([^ ]*/)?scripts/verify ' >/dev/null && ! pgrep -f '(^|/)cargo (build .*--release|build --release|bench)' >/dev/null; then break; fi; sleep 20; done; printf "Merge launch load: "; cat /proc/loadavg; pgrep -af scripts/verify >/tmp/e2e-remote-merge-launch-20261002.log || true; CARGO_BUILD_JOBS=2 CARGO_TERM_QUIET=true RUST_TEST_THREADS=1 INFRATERNAL_VERIFY_RUN_ID=e2e-remote-merge-20261002 scripts/verify merge >/tmp/e2e-remote-merge-20261002.log 2>&1; status=$?; cat /tmp/e2e-remote-merge-20261002.log; exit "$status" 1666660 bash scripts/verify merge 1670780 /usr/bin/zsh -c while true; do if awk '{ exit !($2 < 8) }' /proc/loadavg && ! pgrep -f '^(bash|[^ ]*/bash) ([^ ]*/)?scripts/verify (integration|browser|merge)( |$)' >/dev/null && ! pgrep -f '(^|/)cargo build .*--release' >/dev/null; then break; fi; sleep 120; done CARGO_BUILD_JOBS=2 INFRATERNAL_ARTIFACT_DIR=/mnt/hdd/infraternal/artifacts/port-final/sol-20261002 INFRATERNAL_VERIFY_RUN_ID=port-final-sol-browser-2 INFRATERMINAL_TERMINAL_TEST_PORT=21847 scripts/verify browser > /tmp/port-final-sol-browser-2.log 2>&1 1700522 /home/kayg/.nix-profile/bin/rtk proxy bash -c set -o pipefail; CARGO_BUILD_JOBS=2 CARGO_TERM_QUIET=true RUST_TEST_THREADS=1 INFRATERNAL_VERIFY_RUN_ID=e2e-remote-fast-20261002-3 scripts/verify fast 2>&1 | tee /tmp/e2e-remote-fast-20261002-3.log 1700524 /usr/bin/bash -c set -o pipefail; CARGO_BUILD_JOBS=2 CARGO_TERM_QUIET=true RUST_TEST_THREADS=1 INFRATERNAL_VERIFY_RUN_ID=e2e-remote-fast-20261002-3 scripts/verify fast 2>&1 | tee /tmp/e2e-remote-fast-20261002-3.log 1700527 bash scripts/verify fast 8.20 11.94 9.26 7/1193 1759036 1521279 /home/kayg/.nix-profile/bin/rtk proxy bash -c while true; do if awk '{ exit !($2 < 8) }' /proc/loadavg && ! pgrep -f '^(bash|[^ ]*/bash) ([^ ]*/)?scripts/verify ' >/dev/null && ! pgrep -f '(^|/)cargo (build .*--release|build --release|bench)' >/dev/null; then break; fi; sleep 30; done; set -o pipefail; CARGO_BUILD_JOBS=1 scripts/verify integration 2>&1 | tee target/provider-b-evidence/integration.log 1521280 /usr/bin/bash -c while true; do if awk '{ exit !($2 < 8) }' /proc/loadavg && ! pgrep -f '^(bash|[^ ]*/bash) ([^ ]*/)?scripts/verify ' >/dev/null && ! pgrep -f '(^|/)cargo (build .*--release|build --release|bench)' >/dev/null; then break; fi; sleep 30; done; set -o pipefail; CARGO_BUILD_JOBS=1 scripts/verify integration 2>&1 | tee target/provider-b-evidence/integration.log 1582530 /home/kayg/.nix-profile/bin/rtk proxy bash -c while true; do if awk '{ exit !($2 < 8) }' /proc/loadavg && ! pgrep -f '^(bash|[^ ]*/bash) ([^ ]*/)?scripts/verify ' >/dev/null && ! pgrep -f '(^|/)cargo (build .*--release|build --release|bench)' >/dev/null; then break; fi; sleep 20; done; printf "Merge launch load: "; cat /proc/loadavg; pgrep -af scripts/verify >/tmp/e2e-remote-merge-launch-20261002.log || true; CARGO_BUILD_JOBS=2 CARGO_TERM_QUIET=true RUST_TEST_THREADS=1 INFRATERNAL_VERIFY_RUN_ID=e2e-remote-merge-20261002 scripts/verify merge >/tmp/e2e-remote-merge-20261002.log 2>&1; status=$?; cat /tmp/e2e-remote-merge-20261002.log; exit "$status" 1582536 /usr/bin/bash -c while true; do if awk '{ exit !($2 < 8) }' /proc/loadavg && ! pgrep -f '^(bash|[^ ]*/bash) ([^ ]*/)?scripts/verify ' >/dev/null && ! pgrep -f '(^|/)cargo (build .*--release|build --release|bench)' >/dev/null; then break; fi; sleep 20; done; printf "Merge launch load: "; cat /proc/loadavg; pgrep -af scripts/verify >/tmp/e2e-remote-merge-launch-20261002.log || true; CARGO_BUILD_JOBS=2 CARGO_TERM_QUIET=true RUST_TEST_THREADS=1 INFRATERNAL_VERIFY_RUN_ID=e2e-remote-merge-20261002 scripts/verify merge >/tmp/e2e-remote-merge-20261002.log 2>&1; status=$?; cat /tmp/e2e-remote-merge-20261002.log; exit "$status" 1666660 bash scripts/verify merge 1670780 /usr/bin/zsh -c while true; do if awk '{ exit !($2 < 8) }' /proc/loadavg && ! pgrep -f '^(bash|[^ ]*/bash) ([^ ]*/)?scripts/verify (integration|browser|merge)( |$)' >/dev/null && ! pgrep -f '(^|/)cargo build .*--release' >/dev/null; then break; fi; sleep 120; done CARGO_BUILD_JOBS=2 INFRATERNAL_ARTIFACT_DIR=/mnt/hdd/infraternal/artifacts/port-final/sol-20261002 INFRATERNAL_VERIFY_RUN_ID=port-final-sol-browser-2 INFRATERMINAL_TERMINAL_TEST_PORT=21847 scripts/verify browser > /tmp/port-final-sol-browser-2.log 2>&1 6.72 10.40 9.04 3/1155 1763093 1521279 /home/kayg/.nix-profile/bin/rtk proxy bash -c while true; do if awk '{ exit !($2 < 8) }' /proc/loadavg && ! pgrep -f '^(bash|[^ ]*/bash) ([^ ]*/)?scripts/verify ' >/dev/null && ! pgrep -f '(^|/)cargo (build .*--release|build --release|bench)' >/dev/null; then break; fi; sleep 30; done; set -o pipefail; CARGO_BUILD_JOBS=1 scripts/verify integration 2>&1 | tee target/provider-b-evidence/integration.log 1521280 /usr/bin/bash -c while true; do if awk '{ exit !($2 < 8) }' /proc/loadavg && ! pgrep -f '^(bash|[^ ]*/bash) ([^ ]*/)?scripts/verify ' >/dev/null && ! pgrep -f '(^|/)cargo (build .*--release|build --release|bench)' >/dev/null; then break; fi; sleep 30; done; set -o pipefail; CARGO_BUILD_JOBS=1 scripts/verify integration 2>&1 | tee target/provider-b-evidence/integration.log 1582530 /home/kayg/.nix-profile/bin/rtk proxy bash -c while true; do if awk '{ exit !($2 < 8) }' /proc/loadavg && ! pgrep -f '^(bash|[^ ]*/bash) ([^ ]*/)?scripts/verify ' >/dev/null && ! pgrep -f '(^|/)cargo (build .*--release|build --release|bench)' >/dev/null; then break; fi; sleep 20; done; printf "Merge launch load: "; cat /proc/loadavg; pgrep -af scripts/verify >/tmp/e2e-remote-merge-launch-20261002.log || true; CARGO_BUILD_JOBS=2 CARGO_TERM_QUIET=true RUST_TEST_THREADS=1 INFRATERNAL_VERIFY_RUN_ID=e2e-remote-merge-20261002 scripts/verify merge >/tmp/e2e-remote-merge-20261002.log 2>&1; status=$?; cat /tmp/e2e-remote-merge-20261002.log; exit "$status" 1582536 /usr/bin/bash -c while true; do if awk '{ exit !($2 < 8) }' /proc/loadavg && ! pgrep -f '^(bash|[^ ]*/bash) ([^ ]*/)?scripts/verify ' >/dev/null && ! pgrep -f '(^|/)cargo (build .*--release|build --release|bench)' >/dev/null; then break; fi; sleep 20; done; printf "Merge launch load: "; cat /proc/loadavg; pgrep -af scripts/verify >/tmp/e2e-remote-merge-launch-20261002.log || true; CARGO_BUILD_JOBS=2 CARGO_TERM_QUIET=true RUST_TEST_THREADS=1 INFRATERNAL_VERIFY_RUN_ID=e2e-remote-merge-20261002 scripts/verify merge >/tmp/e2e-remote-merge-20261002.log 2>&1; status=$?; cat /tmp/e2e-remote-merge-20261002.log; exit "$status" 1666660 bash scripts/verify merge 1670780 /usr/bin/zsh -c while true; do if awk '{ exit !($2 < 8) }' /proc/loadavg && ! pgrep -f '^(bash|[^ ]*/bash) ([^ ]*/)?scripts/verify (integration|browser|merge)( |$)' >/dev/null && ! pgrep -f '(^|/)cargo build .*--release' >/dev/null; then break; fi; sleep 120; done CARGO_BUILD_JOBS=2 INFRATERNAL_ARTIFACT_DIR=/mnt/hdd/infraternal/artifacts/port-final/sol-20261002 INFRATERNAL_VERIFY_RUN_ID=port-final-sol-browser-2 INFRATERMINAL_TERMINAL_TEST_PORT=21847 scripts/verify browser > /tmp/port-final-sol-browser-2.log 2>&1 1762083 bash scripts/verify fast 11.48 10.24 9.10 23/1254 1770591 1521279 /home/kayg/.nix-profile/bin/rtk proxy bash -c while true; do if awk '{ exit !($2 < 8) }' /proc/loadavg && ! pgrep -f '^(bash|[^ ]*/bash) ([^ ]*/)?scripts/verify ' >/dev/null && ! pgrep -f '(^|/)cargo (build .*--release|build --release|bench)' >/dev/null; then break; fi; sleep 30; done; set -o pipefail; CARGO_BUILD_JOBS=1 scripts/verify integration 2>&1 | tee target/provider-b-evidence/integration.log 1521280 /usr/bin/bash -c while true; do if awk '{ exit !($2 < 8) }' /proc/loadavg && ! pgrep -f '^(bash|[^ ]*/bash) ([^ ]*/)?scripts/verify ' >/dev/null && ! pgrep -f '(^|/)cargo (build .*--release|build --release|bench)' >/dev/null; then break; fi; sleep 30; done; set -o pipefail; CARGO_BUILD_JOBS=1 scripts/verify integration 2>&1 | tee target/provider-b-evidence/integration.log 1582530 /home/kayg/.nix-profile/bin/rtk proxy bash -c while true; do if awk '{ exit !($2 < 8) }' /proc/loadavg && ! pgrep -f '^(bash|[^ ]*/bash) ([^ ]*/)?scripts/verify ' >/dev/null && ! pgrep -f '(^|/)cargo (build .*--release|build --release|bench)' >/dev/null; then break; fi; sleep 20; done; printf "Merge launch load: "; cat /proc/loadavg; pgrep -af scripts/verify >/tmp/e2e-remote-merge-launch-20261002.log || true; CARGO_BUILD_JOBS=2 CARGO_TERM_QUIET=true RUST_TEST_THREADS=1 INFRATERNAL_VERIFY_RUN_ID=e2e-remote-merge-20261002 scripts/verify merge >/tmp/e2e-remote-merge-20261002.log 2>&1; status=$?; cat /tmp/e2e-remote-merge-20261002.log; exit "$status" 1582536 /usr/bin/bash -c while true; do if awk '{ exit !($2 < 8) }' /proc/loadavg && ! pgrep -f '^(bash|[^ ]*/bash) ([^ ]*/)?scripts/verify ' >/dev/null && ! pgrep -f '(^|/)cargo (build .*--release|build --release|bench)' >/dev/null; then break; fi; sleep 20; done; printf "Merge launch load: "; cat /proc/loadavg; pgrep -af scripts/verify >/tmp/e2e-remote-merge-launch-20261002.log || true; CARGO_BUILD_JOBS=2 CARGO_TERM_QUIET=true RUST_TEST_THREADS=1 INFRATERNAL_VERIFY_RUN_ID=e2e-remote-merge-20261002 scripts/verify merge >/tmp/e2e-remote-merge-20261002.log 2>&1; status=$?; cat /tmp/e2e-remote-merge-20261002.log; exit "$status" 1666660 bash scripts/verify merge 1670780 /usr/bin/zsh -c while true; do if awk '{ exit !($2 < 8) }' /proc/loadavg && ! pgrep -f '^(bash|[^ ]*/bash) ([^ ]*/)?scripts/verify (integration|browser|merge)( |$)' >/dev/null && ! pgrep -f '(^|/)cargo build .*--release' >/dev/null; then break; fi; sleep 120; done CARGO_BUILD_JOBS=2 INFRATERNAL_ARTIFACT_DIR=/mnt/hdd/infraternal/artifacts/port-final/sol-20261002 INFRATERNAL_VERIFY_RUN_ID=port-final-sol-browser-2 INFRATERMINAL_TERMINAL_TEST_PORT=21847 scripts/verify browser > /tmp/port-final-sol-browser-2.log 2>&1 1762083 bash scripts/verify fast 1765041 timeout 2700 scripts/verify merge 1765042 bash scripts/verify merge 1765750 /home/kayg/.nix-profile/bin/rtk run mkdir -p target; set -o pipefail; INFRATERNAL_VERIFY_RUN_ID=fix-ps-20261002-2117 scripts/verify fast 2>&1 | tee target/fix-ps-verify-fast.log 1765761 sh -c mkdir -p target; set -o pipefail; INFRATERNAL_VERIFY_RUN_ID=fix-ps-20261002-2117 scripts/verify fast 2>&1 | tee target/fix-ps-verify-fast.log 1765767 bash scripts/verify fast 15.14 12.50 10.10 16/1223 1779523 1521279 /home/kayg/.nix-profile/bin/rtk proxy bash -c while true; do if awk '{ exit !($2 < 8) }' /proc/loadavg && ! pgrep -f '^(bash|[^ ]*/bash) ([^ ]*/)?scripts/verify ' >/dev/null && ! pgrep -f '(^|/)cargo (build .*--release|build --release|bench)' >/dev/null; then break; fi; sleep 30; done; set -o pipefail; CARGO_BUILD_JOBS=1 scripts/verify integration 2>&1 | tee target/provider-b-evidence/integration.log 1521280 /usr/bin/bash -c while true; do if awk '{ exit !($2 < 8) }' /proc/loadavg && ! pgrep -f '^(bash|[^ ]*/bash) ([^ ]*/)?scripts/verify ' >/dev/null && ! pgrep -f '(^|/)cargo (build .*--release|build --release|bench)' >/dev/null; then break; fi; sleep 30; done; set -o pipefail; CARGO_BUILD_JOBS=1 scripts/verify integration 2>&1 | tee target/provider-b-evidence/integration.log 1582530 /home/kayg/.nix-profile/bin/rtk proxy bash -c while true; do if awk '{ exit !($2 < 8) }' /proc/loadavg && ! pgrep -f '^(bash|[^ ]*/bash) ([^ ]*/)?scripts/verify ' >/dev/null && ! pgrep -f '(^|/)cargo (build .*--release|build --release|bench)' >/dev/null; then break; fi; sleep 20; done; printf "Merge launch load: "; cat /proc/loadavg; pgrep -af scripts/verify >/tmp/e2e-remote-merge-launch-20261002.log || true; CARGO_BUILD_JOBS=2 CARGO_TERM_QUIET=true RUST_TEST_THREADS=1 INFRATERNAL_VERIFY_RUN_ID=e2e-remote-merge-20261002 scripts/verify merge >/tmp/e2e-remote-merge-20261002.log 2>&1; status=$?; cat /tmp/e2e-remote-merge-20261002.log; exit "$status" 1582536 /usr/bin/bash -c while true; do if awk '{ exit !($2 < 8) }' /proc/loadavg && ! pgrep -f '^(bash|[^ ]*/bash) ([^ ]*/)?scripts/verify ' >/dev/null && ! pgrep -f '(^|/)cargo (build .*--release|build --release|bench)' >/dev/null; then break; fi; sleep 20; done; printf "Merge launch load: "; cat /proc/loadavg; pgrep -af scripts/verify >/tmp/e2e-remote-merge-launch-20261002.log || true; CARGO_BUILD_JOBS=2 CARGO_TERM_QUIET=true RUST_TEST_THREADS=1 INFRATERNAL_VERIFY_RUN_ID=e2e-remote-merge-20261002 scripts/verify merge >/tmp/e2e-remote-merge-20261002.log 2>&1; status=$?; cat /tmp/e2e-remote-merge-20261002.log; exit "$status" 1666660 bash scripts/verify merge 1670780 /usr/bin/zsh -c while true; do if awk '{ exit !($2 < 8) }' /proc/loadavg && ! pgrep -f '^(bash|[^ ]*/bash) ([^ ]*/)?scripts/verify (integration|browser|merge)( |$)' >/dev/null && ! pgrep -f '(^|/)cargo build .*--release' >/dev/null; then break; fi; sleep 120; done CARGO_BUILD_JOBS=2 INFRATERNAL_ARTIFACT_DIR=/mnt/hdd/infraternal/artifacts/port-final/sol-20261002 INFRATERNAL_VERIFY_RUN_ID=port-final-sol-browser-2 INFRATERMINAL_TERMINAL_TEST_PORT=21847 scripts/verify browser > /tmp/port-final-sol-browser-2.log 2>&1 1762083 bash scripts/verify fast 1765041 timeout 2700 scripts/verify merge 1765042 bash scripts/verify merge 1765750 /home/kayg/.nix-profile/bin/rtk run mkdir -p target; set -o pipefail; INFRATERNAL_VERIFY_RUN_ID=fix-ps-20261002-2117 scripts/verify fast 2>&1 | tee target/fix-ps-verify-fast.log 1765761 sh -c mkdir -p target; set -o pipefail; INFRATERNAL_VERIFY_RUN_ID=fix-ps-20261002-2117 scripts/verify fast 2>&1 | tee target/fix-ps-verify-fast.log 1765767 bash scripts/verify fast 15.88 13.50 10.76 21/1317 1794134 1521279 /home/kayg/.nix-profile/bin/rtk proxy bash -c while true; do if awk '{ exit !($2 < 8) }' /proc/loadavg && ! pgrep -f '^(bash|[^ ]*/bash) ([^ ]*/)?scripts/verify ' >/dev/null && ! pgrep -f '(^|/)cargo (build .*--release|build --release|bench)' >/dev/null; then break; fi; sleep 30; done; set -o pipefail; CARGO_BUILD_JOBS=1 scripts/verify integration 2>&1 | tee target/provider-b-evidence/integration.log 1521280 /usr/bin/bash -c while true; do if awk '{ exit !($2 < 8) }' /proc/loadavg && ! pgrep -f '^(bash|[^ ]*/bash) ([^ ]*/)?scripts/verify ' >/dev/null && ! pgrep -f '(^|/)cargo (build .*--release|build --release|bench)' >/dev/null; then break; fi; sleep 30; done; set -o pipefail; CARGO_BUILD_JOBS=1 scripts/verify integration 2>&1 | tee target/provider-b-evidence/integration.log 1582530 /home/kayg/.nix-profile/bin/rtk proxy bash -c while true; do if awk '{ exit !($2 < 8) }' /proc/loadavg && ! pgrep -f '^(bash|[^ ]*/bash) ([^ ]*/)?scripts/verify ' >/dev/null && ! pgrep -f '(^|/)cargo (build .*--release|build --release|bench)' >/dev/null; then break; fi; sleep 20; done; printf "Merge launch load: "; cat /proc/loadavg; pgrep -af scripts/verify >/tmp/e2e-remote-merge-launch-20261002.log || true; CARGO_BUILD_JOBS=2 CARGO_TERM_QUIET=true RUST_TEST_THREADS=1 INFRATERNAL_VERIFY_RUN_ID=e2e-remote-merge-20261002 scripts/verify merge >/tmp/e2e-remote-merge-20261002.log 2>&1; status=$?; cat /tmp/e2e-remote-merge-20261002.log; exit "$status" 1582536 /usr/bin/bash -c while true; do if awk '{ exit !($2 < 8) }' /proc/loadavg && ! pgrep -f '^(bash|[^ ]*/bash) ([^ ]*/)?scripts/verify ' >/dev/null && ! pgrep -f '(^|/)cargo (build .*--release|build --release|bench)' >/dev/null; then break; fi; sleep 20; done; printf "Merge launch load: "; cat /proc/loadavg; pgrep -af scripts/verify >/tmp/e2e-remote-merge-launch-20261002.log || true; CARGO_BUILD_JOBS=2 CARGO_TERM_QUIET=true RUST_TEST_THREADS=1 INFRATERNAL_VERIFY_RUN_ID=e2e-remote-merge-20261002 scripts/verify merge >/tmp/e2e-remote-merge-20261002.log 2>&1; status=$?; cat /tmp/e2e-remote-merge-20261002.log; exit "$status" 1666660 bash scripts/verify merge 1670780 /usr/bin/zsh -c while true; do if awk '{ exit !($2 < 8) }' /proc/loadavg && ! pgrep -f '^(bash|[^ ]*/bash) ([^ ]*/)?scripts/verify (integration|browser|merge)( |$)' >/dev/null && ! pgrep -f '(^|/)cargo build .*--release' >/dev/null; then break; fi; sleep 120; done CARGO_BUILD_JOBS=2 INFRATERNAL_ARTIFACT_DIR=/mnt/hdd/infraternal/artifacts/port-final/sol-20261002 INFRATERNAL_VERIFY_RUN_ID=port-final-sol-browser-2 INFRATERMINAL_TERMINAL_TEST_PORT=21847 scripts/verify browser > /tmp/port-final-sol-browser-2.log 2>&1 1765041 timeout 2700 scripts/verify merge 1765042 bash scripts/verify merge 1765750 /home/kayg/.nix-profile/bin/rtk run mkdir -p target; set -o pipefail; INFRATERNAL_VERIFY_RUN_ID=fix-ps-20261002-2117 scripts/verify fast 2>&1 | tee target/fix-ps-verify-fast.log 1765761 sh -c mkdir -p target; set -o pipefail; INFRATERNAL_VERIFY_RUN_ID=fix-ps-20261002-2117 scripts/verify fast 2>&1 | tee target/fix-ps-verify-fast.log 1765767 bash scripts/verify fast 21.14 16.35 12.14 15/1220 1803238 1521279 /home/kayg/.nix-profile/bin/rtk proxy bash -c while true; do if awk '{ exit !($2 < 8) }' /proc/loadavg && ! pgrep -f '^(bash|[^ ]*/bash) ([^ ]*/)?scripts/verify ' >/dev/null && ! pgrep -f '(^|/)cargo (build .*--release|build --release|bench)' >/dev/null; then break; fi; sleep 30; done; set -o pipefail; CARGO_BUILD_JOBS=1 scripts/verify integration 2>&1 | tee target/provider-b-evidence/integration.log 1521280 /usr/bin/bash -c while true; do if awk '{ exit !($2 < 8) }' /proc/loadavg && ! pgrep -f '^(bash|[^ ]*/bash) ([^ ]*/)?scripts/verify ' >/dev/null && ! pgrep -f '(^|/)cargo (build .*--release|build --release|bench)' >/dev/null; then break; fi; sleep 30; done; set -o pipefail; CARGO_BUILD_JOBS=1 scripts/verify integration 2>&1 | tee target/provider-b-evidence/integration.log 1582530 /home/kayg/.nix-profile/bin/rtk proxy bash -c while true; do if awk '{ exit !($2 < 8) }' /proc/loadavg && ! pgrep -f '^(bash|[^ ]*/bash) ([^ ]*/)?scripts/verify ' >/dev/null && ! pgrep -f '(^|/)cargo (build .*--release|build --release|bench)' >/dev/null; then break; fi; sleep 20; done; printf "Merge launch load: "; cat /proc/loadavg; pgrep -af scripts/verify >/tmp/e2e-remote-merge-launch-20261002.log || true; CARGO_BUILD_JOBS=2 CARGO_TERM_QUIET=true RUST_TEST_THREADS=1 INFRATERNAL_VERIFY_RUN_ID=e2e-remote-merge-20261002 scripts/verify merge >/tmp/e2e-remote-merge-20261002.log 2>&1; status=$?; cat /tmp/e2e-remote-merge-20261002.log; exit "$status" 1582536 /usr/bin/bash -c while true; do if awk '{ exit !($2 < 8) }' /proc/loadavg && ! pgrep -f '^(bash|[^ ]*/bash) ([^ ]*/)?scripts/verify ' >/dev/null && ! pgrep -f '(^|/)cargo (build .*--release|build --release|bench)' >/dev/null; then break; fi; sleep 20; done; printf "Merge launch load: "; cat /proc/loadavg; pgrep -af scripts/verify >/tmp/e2e-remote-merge-launch-20261002.log || true; CARGO_BUILD_JOBS=2 CARGO_TERM_QUIET=true RUST_TEST_THREADS=1 INFRATERNAL_VERIFY_RUN_ID=e2e-remote-merge-20261002 scripts/verify merge >/tmp/e2e-remote-merge-20261002.log 2>&1; status=$?; cat /tmp/e2e-remote-merge-20261002.log; exit "$status" 1666660 bash scripts/verify merge 1670780 /usr/bin/zsh -c while true; do if awk '{ exit !($2 < 8) }' /proc/loadavg && ! pgrep -f '^(bash|[^ ]*/bash) ([^ ]*/)?scripts/verify (integration|browser|merge)( |$)' >/dev/null && ! pgrep -f '(^|/)cargo build .*--release' >/dev/null; then break; fi; sleep 120; done CARGO_BUILD_JOBS=2 INFRATERNAL_ARTIFACT_DIR=/mnt/hdd/infraternal/artifacts/port-final/sol-20261002 INFRATERNAL_VERIFY_RUN_ID=port-final-sol-browser-2 INFRATERMINAL_TERMINAL_TEST_PORT=21847 scripts/verify browser > /tmp/port-final-sol-browser-2.log 2>&1 1765041 timeout 2700 scripts/verify merge 1765042 bash scripts/verify merge 1765750 /home/kayg/.nix-profile/bin/rtk run mkdir -p target; set -o pipefail; INFRATERNAL_VERIFY_RUN_ID=fix-ps-20261002-2117 scripts/verify fast 2>&1 | tee target/fix-ps-verify-fast.log 1765761 sh -c mkdir -p target; set -o pipefail; INFRATERNAL_VERIFY_RUN_ID=fix-ps-20261002-2117 scripts/verify fast 2>&1 | tee target/fix-ps-verify-fast.log 1765767 bash scripts/verify fast 11.93 14.58 12.02 19/1288 1812407 1521279 /home/kayg/.nix-profile/bin/rtk proxy bash -c while true; do if awk '{ exit !($2 < 8) }' /proc/loadavg && ! pgrep -f '^(bash|[^ ]*/bash) ([^ ]*/)?scripts/verify ' >/dev/null && ! pgrep -f '(^|/)cargo (build .*--release|build --release|bench)' >/dev/null; then break; fi; sleep 30; done; set -o pipefail; CARGO_BUILD_JOBS=1 scripts/verify integration 2>&1 | tee target/provider-b-evidence/integration.log 1521280 /usr/bin/bash -c while true; do if awk '{ exit !($2 < 8) }' /proc/loadavg && ! pgrep -f '^(bash|[^ ]*/bash) ([^ ]*/)?scripts/verify ' >/dev/null && ! pgrep -f '(^|/)cargo (build .*--release|build --release|bench)' >/dev/null; then break; fi; sleep 30; done; set -o pipefail; CARGO_BUILD_JOBS=1 scripts/verify integration 2>&1 | tee target/provider-b-evidence/integration.log 1582530 /home/kayg/.nix-profile/bin/rtk proxy bash -c while true; do if awk '{ exit !($2 < 8) }' /proc/loadavg && ! pgrep -f '^(bash|[^ ]*/bash) ([^ ]*/)?scripts/verify ' >/dev/null && ! pgrep -f '(^|/)cargo (build .*--release|build --release|bench)' >/dev/null; then break; fi; sleep 20; done; printf "Merge launch load: "; cat /proc/loadavg; pgrep -af scripts/verify >/tmp/e2e-remote-merge-launch-20261002.log || true; CARGO_BUILD_JOBS=2 CARGO_TERM_QUIET=true RUST_TEST_THREADS=1 INFRATERNAL_VERIFY_RUN_ID=e2e-remote-merge-20261002 scripts/verify merge >/tmp/e2e-remote-merge-20261002.log 2>&1; status=$?; cat /tmp/e2e-remote-merge-20261002.log; exit "$status" 1582536 /usr/bin/bash -c while true; do if awk '{ exit !($2 < 8) }' /proc/loadavg && ! pgrep -f '^(bash|[^ ]*/bash) ([^ ]*/)?scripts/verify ' >/dev/null && ! pgrep -f '(^|/)cargo (build .*--release|build --release|bench)' >/dev/null; then break; fi; sleep 20; done; printf "Merge launch load: "; cat /proc/loadavg; pgrep -af scripts/verify >/tmp/e2e-remote-merge-launch-20261002.log || true; CARGO_BUILD_JOBS=2 CARGO_TERM_QUIET=true RUST_TEST_THREADS=1 INFRATERNAL_VERIFY_RUN_ID=e2e-remote-merge-20261002 scripts/verify merge >/tmp/e2e-remote-merge-20261002.log 2>&1; status=$?; cat /tmp/e2e-remote-merge-20261002.log; exit "$status" 1666660 bash scripts/verify merge 1670780 /usr/bin/zsh -c while true; do if awk '{ exit !($2 < 8) }' /proc/loadavg && ! pgrep -f '^(bash|[^ ]*/bash) ([^ ]*/)?scripts/verify (integration|browser|merge)( |$)' >/dev/null && ! pgrep -f '(^|/)cargo build .*--release' >/dev/null; then break; fi; sleep 120; done CARGO_BUILD_JOBS=2 INFRATERNAL_ARTIFACT_DIR=/mnt/hdd/infraternal/artifacts/port-final/sol-20261002 INFRATERNAL_VERIFY_RUN_ID=port-final-sol-browser-2 INFRATERMINAL_TERMINAL_TEST_PORT=21847 scripts/verify browser > /tmp/port-final-sol-browser-2.log 2>&1 1765041 timeout 2700 scripts/verify merge 1765042 bash scripts/verify merge 9.10 12.82 11.70 5/1202 1822825 1521279 /home/kayg/.nix-profile/bin/rtk proxy bash -c while true; do if awk '{ exit !($2 < 8) }' /proc/loadavg && ! pgrep -f '^(bash|[^ ]*/bash) ([^ ]*/)?scripts/verify ' >/dev/null && ! pgrep -f '(^|/)cargo (build .*--release|build --release|bench)' >/dev/null; then break; fi; sleep 30; done; set -o pipefail; CARGO_BUILD_JOBS=1 scripts/verify integration 2>&1 | tee target/provider-b-evidence/integration.log 1521280 /usr/bin/bash -c while true; do if awk '{ exit !($2 < 8) }' /proc/loadavg && ! pgrep -f '^(bash|[^ ]*/bash) ([^ ]*/)?scripts/verify ' >/dev/null && ! pgrep -f '(^|/)cargo (build .*--release|build --release|bench)' >/dev/null; then break; fi; sleep 30; done; set -o pipefail; CARGO_BUILD_JOBS=1 scripts/verify integration 2>&1 | tee target/provider-b-evidence/integration.log 1582530 /home/kayg/.nix-profile/bin/rtk proxy bash -c while true; do if awk '{ exit !($2 < 8) }' /proc/loadavg && ! pgrep -f '^(bash|[^ ]*/bash) ([^ ]*/)?scripts/verify ' >/dev/null && ! pgrep -f '(^|/)cargo (build .*--release|build --release|bench)' >/dev/null; then break; fi; sleep 20; done; printf "Merge launch load: "; cat /proc/loadavg; pgrep -af scripts/verify >/tmp/e2e-remote-merge-launch-20261002.log || true; CARGO_BUILD_JOBS=2 CARGO_TERM_QUIET=true RUST_TEST_THREADS=1 INFRATERNAL_VERIFY_RUN_ID=e2e-remote-merge-20261002 scripts/verify merge >/tmp/e2e-remote-merge-20261002.log 2>&1; status=$?; cat /tmp/e2e-remote-merge-20261002.log; exit "$status" 1582536 /usr/bin/bash -c while true; do if awk '{ exit !($2 < 8) }' /proc/loadavg && ! pgrep -f '^(bash|[^ ]*/bash) ([^ ]*/)?scripts/verify ' >/dev/null && ! pgrep -f '(^|/)cargo (build .*--release|build --release|bench)' >/dev/null; then break; fi; sleep 20; done; printf "Merge launch load: "; cat /proc/loadavg; pgrep -af scripts/verify >/tmp/e2e-remote-merge-launch-20261002.log || true; CARGO_BUILD_JOBS=2 CARGO_TERM_QUIET=true RUST_TEST_THREADS=1 INFRATERNAL_VERIFY_RUN_ID=e2e-remote-merge-20261002 scripts/verify merge >/tmp/e2e-remote-merge-20261002.log 2>&1; status=$?; cat /tmp/e2e-remote-merge-20261002.log; exit "$status" 1670780 /usr/bin/zsh -c while true; do if awk '{ exit !($2 < 8) }' /proc/loadavg && ! pgrep -f '^(bash|[^ ]*/bash) ([^ ]*/)?scripts/verify (integration|browser|merge)( |$)' >/dev/null && ! pgrep -f '(^|/)cargo build .*--release' >/dev/null; then break; fi; sleep 120; done CARGO_BUILD_JOBS=2 INFRATERNAL_ARTIFACT_DIR=/mnt/hdd/infraternal/artifacts/port-final/sol-20261002 INFRATERNAL_VERIFY_RUN_ID=port-final-sol-browser-2 INFRATERMINAL_TERMINAL_TEST_PORT=21847 scripts/verify browser > /tmp/port-final-sol-browser-2.log 2>&1 1765041 timeout 2700 scripts/verify merge 1765042 bash scripts/verify merge 1817014 bash scripts/verify perf --dev-vm --calibrate target/perf/base-final.json --output target/perf/base-final-diagnostic.json 7.06 10.66 11.02 7/1087 1830976 1521279 /home/kayg/.nix-profile/bin/rtk proxy bash -c while true; do if awk '{ exit !($2 < 8) }' /proc/loadavg && ! pgrep -f '^(bash|[^ ]*/bash) ([^ ]*/)?scripts/verify ' >/dev/null && ! pgrep -f '(^|/)cargo (build .*--release|build --release|bench)' >/dev/null; then break; fi; sleep 30; done; set -o pipefail; CARGO_BUILD_JOBS=1 scripts/verify integration 2>&1 | tee target/provider-b-evidence/integration.log 1521280 /usr/bin/bash -c while true; do if awk '{ exit !($2 < 8) }' /proc/loadavg && ! pgrep -f '^(bash|[^ ]*/bash) ([^ ]*/)?scripts/verify ' >/dev/null && ! pgrep -f '(^|/)cargo (build .*--release|build --release|bench)' >/dev/null; then break; fi; sleep 30; done; set -o pipefail; CARGO_BUILD_JOBS=1 scripts/verify integration 2>&1 | tee target/provider-b-evidence/integration.log 1582530 /home/kayg/.nix-profile/bin/rtk proxy bash -c while true; do if awk '{ exit !($2 < 8) }' /proc/loadavg && ! pgrep -f '^(bash|[^ ]*/bash) ([^ ]*/)?scripts/verify ' >/dev/null && ! pgrep -f '(^|/)cargo (build .*--release|build --release|bench)' >/dev/null; then break; fi; sleep 20; done; printf "Merge launch load: "; cat /proc/loadavg; pgrep -af scripts/verify >/tmp/e2e-remote-merge-launch-20261002.log || true; CARGO_BUILD_JOBS=2 CARGO_TERM_QUIET=true RUST_TEST_THREADS=1 INFRATERNAL_VERIFY_RUN_ID=e2e-remote-merge-20261002 scripts/verify merge >/tmp/e2e-remote-merge-20261002.log 2>&1; status=$?; cat /tmp/e2e-remote-merge-20261002.log; exit "$status" 1582536 /usr/bin/bash -c while true; do if awk '{ exit !($2 < 8) }' /proc/loadavg && ! pgrep -f '^(bash|[^ ]*/bash) ([^ ]*/)?scripts/verify ' >/dev/null && ! pgrep -f '(^|/)cargo (build .*--release|build --release|bench)' >/dev/null; then break; fi; sleep 20; done; printf "Merge launch load: "; cat /proc/loadavg; pgrep -af scripts/verify >/tmp/e2e-remote-merge-launch-20261002.log || true; CARGO_BUILD_JOBS=2 CARGO_TERM_QUIET=true RUST_TEST_THREADS=1 INFRATERNAL_VERIFY_RUN_ID=e2e-remote-merge-20261002 scripts/verify merge >/tmp/e2e-remote-merge-20261002.log 2>&1; status=$?; cat /tmp/e2e-remote-merge-20261002.log; exit "$status" 1670780 /usr/bin/zsh -c while true; do if awk '{ exit !($2 < 8) }' /proc/loadavg && ! pgrep -f '^(bash|[^ ]*/bash) ([^ ]*/)?scripts/verify (integration|browser|merge)( |$)' >/dev/null && ! pgrep -f '(^|/)cargo build .*--release' >/dev/null; then break; fi; sleep 120; done CARGO_BUILD_JOBS=2 INFRATERNAL_ARTIFACT_DIR=/mnt/hdd/infraternal/artifacts/port-final/sol-20261002 INFRATERNAL_VERIFY_RUN_ID=port-final-sol-browser-2 INFRATERMINAL_TERMINAL_TEST_PORT=21847 scripts/verify browser > /tmp/port-final-sol-browser-2.log 2>&1 1765041 timeout 2700 scripts/verify merge 1765042 bash scripts/verify merge 1817014 bash scripts/verify perf --dev-vm --calibrate target/perf/base-final.json --output target/perf/base-final-diagnostic.json START sshd_cleanup sshd::tests::live_listener_is_identified_by_config_and_socket PASS sshd_cleanup sshd::tests::live_listener_is_identified_by_config_and_socket START sshd_cleanup sshd::tests::sigkill_of_test_runner_cleans_listener_and_run_directory PASS sshd_cleanup sshd::tests::sigkill_of_test_runner_cleans_listener_and_run_directory START real_sshd strict_host_key_change PASS real_sshd strict_host_key_change START real_sshd per_host_shell_mode_controls_multiplexer_rc PASS real_sshd per_host_shell_mode_controls_multiplexer_rc START real_sshd open_key_is_scoped_to_session_owner PASS real_sshd open_key_is_scoped_to_session_owner START real_sshd failed_retry_audit_does_not_terminate_original_session PASS real_sshd failed_retry_audit_does_not_terminate_original_session START real_sshd pty_resize_and_replay PASS real_sshd pty_resize_and_replay START real_sshd concurrent_same_open_key PASS real_sshd concurrent_same_open_key START real_sshd takeover_while_output_flows PASS real_sshd takeover_while_output_flows START real_sshd simultaneous_actual_persistent_limits PASS real_sshd simultaneous_actual_persistent_limits START real_sshd session_limits_include_nonpersistent PASS real_sshd session_limits_include_nonpersistent START real_sshd owner_loss_terminates_shell PASS real_sshd owner_loss_terminates_shell START real_sshd dropping_local_sshd_kills_detached_session PASS real_sshd dropping_local_sshd_kills_detached_session START real_sshd plain_thread_termination_terminates_shell PASS real_sshd plain_thread_termination_terminates_shell START real_sshd direct_terminate_terminates_shell PASS real_sshd direct_terminate_terminates_shell START real_sshd idle_expiry_terminates_shell PASS real_sshd idle_expiry_terminates_shell START real_sshd nonpersistent_attachment_drop_terminates_shell PASS real_sshd nonpersistent_attachment_drop_terminates_shell RESULT SSH cleanup and surrounding tests passes=18 failures=0 total=18 ``` Current CLI STREAM_ONLY 20-repeat proof: new head compiled, iteration1 PASS (77.87s), iteration2 running. No full repeat pass claim yet. Fast/merge remain queued because another verify perf run is active. No other run process has been signalled or stopped.
Author
Owner

Follow-up: the diagnostic test version passed 30/30 targeted iterations at low load. SQLx 0.8.6 documents that dropping SqliteConnection signals its background worker to close the database, while explicitly calling SqliteConnection::close() waits for closure: https://docs.rs/sqlx/0.8.6/sqlx/struct.SqliteConnection.html. This leaves an open question about whether SqliteStorage::close()'s awaited pool shutdown also waits for SQLite worker threads. The earlier high-load iteration had open() return Ok after symlink creation, but the first version did not capture whether the symlink still existed after open. I added that diagnostic and will repeat under load after running fast on the current diff. No product files have been changed.

Follow-up: the diagnostic test version passed 30/30 targeted iterations at low load. SQLx 0.8.6 documents that dropping `SqliteConnection` signals its background worker to close the database, while explicitly calling `SqliteConnection::close()` waits for closure: https://docs.rs/sqlx/0.8.6/sqlx/struct.SqliteConnection.html. This leaves an open question about whether `SqliteStorage::close()`'s awaited pool shutdown also waits for SQLite worker threads. The earlier high-load iteration had `open()` return `Ok` after symlink creation, but the first version did not capture whether the symlink still existed after open. I added that diagnostic and will repeat under load after running fast on the current diff. No product files have been changed.
Author
Owner

lp-flaky head 1322fe4: current-head server SSH repeat proof passed 8 runs, then run9 failed an unchanged security deadline at load5 4.87. Both replay paths had completed; later detached-session token-revocation state did not become Exited within its one-second timeout. The one-second assertion is retained. Finishing iterations10-20 to report actual overall pass counts without hiding this failure.

Proposed product follow-up: inspect detached-session authorization-loss termination and the exit-to-storage update path; align the reaper/termination completion with the contractual deadline instead of increasing the test timeout. Product code remains unchanged in this test-only branch.

Also removed an unnecessary mut from the new UnixStream output gate helper (1322fe4), which would block clippy -D warnings. This does not change gate behavior.

Verbatim failing run:

    Blocking waiting for file lock on package cache
warning: variable does not need to be mutable
   --> crates/server/tests/ssh_product.rs:146:30
    |
146 | async fn release_output_gate(mut stream: UnixStream) {
    |                              ----^^^^^^
    |                              |
    |                              help: remove this `mut`
    |
    = note: `#[warn(unused_mut)]` (part of `#[warn(unused)]`) on by default

warning: `infraternal-server` (test "ssh_product") generated 1 warning (run `cargo fix --test "ssh_product" -p infraternal-server` to apply 1 suggestion)
    Finished `test` profile [unoptimized] target(s) in 0.44s
     Running tests/ssh_product.rs (target/debug/deps/ssh_product-53944fa883718f69)

running 1 test
test host_trust_stream_replay_resize_close_and_changed_key ... SSH_STREAM_ROUND_TRIP samples=40 p50_ms=1.417 p99_ms=1.847

thread 'host_trust_stream_replay_resize_close_and_changed_key' (1853229) panicked at crates/server/tests/ssh_product.rs:866:6:
detached SSH session survived token revocation beyond one second: Elapsed(())
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
FAILED

failures:

failures:
    host_trust_stream_replay_resize_close_and_changed_key

test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 3 filtered out; finished in 2.43s

error: test failed, to rerun pass `-p infraternal-server --test ssh_product`

CLI STREAM_ONLY proof is at 3/20 passes on the latest logical changes; remaining runs continue. Cleanup/surrounding real_sshd proof passed 18/18. Fast/merge still queued behind other verification.

lp-flaky head 1322fe4: current-head server SSH repeat proof passed 8 runs, then run9 failed an unchanged security deadline at load5 4.87. Both replay paths had completed; later detached-session token-revocation state did not become Exited within its one-second timeout. The one-second assertion is retained. Finishing iterations10-20 to report actual overall pass counts without hiding this failure. Proposed product follow-up: inspect detached-session authorization-loss termination and the exit-to-storage update path; align the reaper/termination completion with the contractual deadline instead of increasing the test timeout. Product code remains unchanged in this test-only branch. Also removed an unnecessary `mut` from the new UnixStream output gate helper (1322fe4), which would block clippy -D warnings. This does not change gate behavior. Verbatim failing run: ``` Blocking waiting for file lock on package cache warning: variable does not need to be mutable --> crates/server/tests/ssh_product.rs:146:30 | 146 | async fn release_output_gate(mut stream: UnixStream) { | ----^^^^^^ | | | help: remove this `mut` | = note: `#[warn(unused_mut)]` (part of `#[warn(unused)]`) on by default warning: `infraternal-server` (test "ssh_product") generated 1 warning (run `cargo fix --test "ssh_product" -p infraternal-server` to apply 1 suggestion) Finished `test` profile [unoptimized] target(s) in 0.44s Running tests/ssh_product.rs (target/debug/deps/ssh_product-53944fa883718f69) running 1 test test host_trust_stream_replay_resize_close_and_changed_key ... SSH_STREAM_ROUND_TRIP samples=40 p50_ms=1.417 p99_ms=1.847 thread 'host_trust_stream_replay_resize_close_and_changed_key' (1853229) panicked at crates/server/tests/ssh_product.rs:866:6: detached SSH session survived token revocation beyond one second: Elapsed(()) note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace FAILED failures: failures: host_trust_stream_replay_resize_close_and_changed_key test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 3 filtered out; finished in 2.43s error: test failed, to rerun pass `-p infraternal-server --test ssh_product` ``` CLI STREAM_ONLY proof is at 3/20 passes on the latest logical changes; remaining runs continue. Cleanup/surrounding real_sshd proof passed 18/18. Fast/merge still queued behind other verification.
Author
Owner

Continuation evidence at HEAD 1322fe4 (test-only changes; no product edits):

Server lifecycle final repeat sequence completed 19/20 PASS. Runs 1-8 passed, run 9 failed the unchanged one-second detached-token-revocation assertion, and runs 10-20 passed. The deadline is explicit in docs/contracts.md section 3.11, lines 1487-1493. Both replay scenarios completed before run 9 reached revocation. See server-repeats-run.log, server-remaining-repeats-run.log, and ssh-product-9.log in target/lp-flaky-evidence. Do not relax the security assertion; proposed follow-up is to inspect authorization-loss polling/termination and exit-state persistence against the one-second contract.

The current 20-run CLI stream sequence is ongoing. Iteration 5 failed before exec SIGHUP readiness with HTTP 500 Internal Server Error: The stream ticket could not be created. (internal). Iteration 6 failed before exec SIGQUIT readiness with the stream peer closed the WebSocket with code Some(4003). These are explicit stream-open failures, not absence of the remote readiness marker caused by synchronization. No signal was sent in either failed readiness case. Evidence: cli-stream-5.log and cli-stream-6.log. Proposed product follow-up: inspect ticket-storage/audit errors and the WebSocket 4003 rejection path under repeated real Docker/Podman streams. No retry or weakened assertion added.

Fast and merge remain queued behind other active scripts/verify runs; their runners poll every two minutes. This continuation has not signalled/stopped/killed any other process.

Continuation evidence at HEAD 1322fe4 (test-only changes; no product edits): Server lifecycle final repeat sequence completed 19/20 PASS. Runs 1-8 passed, run 9 failed the unchanged one-second detached-token-revocation assertion, and runs 10-20 passed. The deadline is explicit in docs/contracts.md section 3.11, lines 1487-1493. Both replay scenarios completed before run 9 reached revocation. See server-repeats-run.log, server-remaining-repeats-run.log, and ssh-product-9.log in target/lp-flaky-evidence. Do not relax the security assertion; proposed follow-up is to inspect authorization-loss polling/termination and exit-state persistence against the one-second contract. The current 20-run CLI stream sequence is ongoing. Iteration 5 failed before exec SIGHUP readiness with `HTTP 500 Internal Server Error: The stream ticket could not be created. (internal)`. Iteration 6 failed before exec SIGQUIT readiness with `the stream peer closed the WebSocket with code Some(4003)`. These are explicit stream-open failures, not absence of the remote readiness marker caused by synchronization. No signal was sent in either failed readiness case. Evidence: cli-stream-5.log and cli-stream-6.log. Proposed product follow-up: inspect ticket-storage/audit errors and the WebSocket 4003 rejection path under repeated real Docker/Podman streams. No retry or weakened assertion added. Fast and merge remain queued behind other active scripts/verify runs; their runners poll every two minutes. This continuation has not signalled/stopped/killed any other process.
Author
Owner

Completed fix-ps. Commit: 543818f57e304f8153c6d4b6545c0a7a3ddb5eca on branch fix-private-storage (base d91cf0aef9ccec9c8803d17ee6a67054339c92bf).

Change: the test now uses symlink_metadata before removing an existing WAL sidecar, asserts that it is a regular mode-0600 file, and verifies the hostile symlink fixture before checking that database open rejects it. An unexpected successful open now reports whether the symlink remained afterward.

Close check: SqliteStorage::close() awaits self.pool.close(). SQLx 0.8.6 documents that awaited pool close waits for pool connections: https://docs.rs/sqlx/0.8.6/sqlx/struct.Pool.html#method.close. Its SQLite connection docs say drop signals the background worker, while explicit connection close ensures the database is closed: https://docs.rs/sqlx/0.8.6/sqlx/struct.SqliteConnection.html. No product files were changed.

Targeted test loop: 30/30 passed. It started with uptime load average 11.79, 9.33, 8.71.

An earlier 30-run attempt on the less diagnostic patch had 20 passes, then SqliteStorage::open() unexpectedly returned Ok after WAL symlink creation. The final diagnostic patch did not reproduce that behavior in 30 busy-host iterations; the original AlreadyExists condition is addressed by validating and clearing a leftover regular WAL before creating the symlink.

scripts/verify fast output on the committed diff:

PASS fast: migrations are append-only (0.168s)
PASS fast: workspace package dependencies (0.228s)
PASS fast: JavaScript dependencies (0.005s)
PASS fast: build web app (14.049s)
PASS fast: cargo fmt --check (1.385s)
PASS fast: cargo clippy (13.481s)
PASS fast: cargo test (99.164s)
PASS fast: svelte-check (41.666s)
PASS fast: UI package svelte-check (10.343s)
PASS fast: stream package typecheck (8.532s)
PASS fast: Vitest (7.770s)
PASS fast: UI package Vitest (17.804s)
PASS fast: stream package Vitest (1.590s)
PASS fast: OpenAPI and TypeScript client drift (38.520s)
PASS fast: terminal TypeScript (3.853s)
PASS fast: terminal Vitest (1.829s)
Total: 260.387s

Merge gate pending.

Completed fix-ps. Commit: `543818f57e304f8153c6d4b6545c0a7a3ddb5eca` on branch `fix-private-storage` (base `d91cf0aef9ccec9c8803d17ee6a67054339c92bf`). Change: the test now uses `symlink_metadata` before removing an existing WAL sidecar, asserts that it is a regular mode-0600 file, and verifies the hostile symlink fixture before checking that database open rejects it. An unexpected successful open now reports whether the symlink remained afterward. Close check: `SqliteStorage::close()` awaits `self.pool.close()`. SQLx 0.8.6 documents that awaited pool close waits for pool connections: https://docs.rs/sqlx/0.8.6/sqlx/struct.Pool.html#method.close. Its SQLite connection docs say drop signals the background worker, while explicit connection close ensures the database is closed: https://docs.rs/sqlx/0.8.6/sqlx/struct.SqliteConnection.html. No product files were changed. Targeted test loop: 30/30 passed. It started with uptime load average `11.79, 9.33, 8.71`. An earlier 30-run attempt on the less diagnostic patch had 20 passes, then `SqliteStorage::open()` unexpectedly returned `Ok` after WAL symlink creation. The final diagnostic patch did not reproduce that behavior in 30 busy-host iterations; the original `AlreadyExists` condition is addressed by validating and clearing a leftover regular WAL before creating the symlink. `scripts/verify fast` output on the committed diff: > PASS fast: migrations are append-only (0.168s) > PASS fast: workspace package dependencies (0.228s) > PASS fast: JavaScript dependencies (0.005s) > PASS fast: build web app (14.049s) > PASS fast: cargo fmt --check (1.385s) > PASS fast: cargo clippy (13.481s) > PASS fast: cargo test (99.164s) > PASS fast: svelte-check (41.666s) > PASS fast: UI package svelte-check (10.343s) > PASS fast: stream package typecheck (8.532s) > PASS fast: Vitest (7.770s) > PASS fast: UI package Vitest (17.804s) > PASS fast: stream package Vitest (1.590s) > PASS fast: OpenAPI and TypeScript client drift (38.520s) > PASS fast: terminal TypeScript (3.853s) > PASS fast: terminal Vitest (1.829s) > Total: 260.387s Merge gate pending.
Author
Owner

Starting wal-race on branch wal-race, base 21b267b9b949e08b32e0125221df28cda462ad69. Scope: private SQLite open path and crates/server/tests/private_storage.rs. Investigate intermittent WAL symlink acceptance with up to 200 iterations under load; targeted tests and scripts/verify fast; merge gate pending centrally. No push.

Starting wal-race on branch `wal-race`, base `21b267b9b949e08b32e0125221df28cda462ad69`. Scope: private SQLite open path and `crates/server/tests/private_storage.rs`. Investigate intermittent WAL symlink acceptance with up to 200 iterations under load; targeted tests and `scripts/verify fast`; merge gate pending centrally. No push.
Author
Owner

Blocked / unfinished after more than two hours waiting for a shared-VM slot. Current load5=9.96. Every window with load5 <=6 still had other verify/release Cargo processes active; earlier/later load5 exceeded 6. Respecting the explicit low-priority/no-overlap rules, no new release build or gate started.

Branch lp-binsize remains clean at base/head 6f6fd89621; no manifest changes or new commits. No new size, build-time or stream-performance result is claimed. Frozen JS dependency install and local code index completed; feature/crypto/panic findings are recorded in earlier comments.

Only this job's waiting Python process has been stopped, so it will not launch a build after the handoff. Excluded progress.md records next steps. A quiet VM slot is required to resume the baseline, measured trials, fast gate and quick stream benchmark. The 25 MB budget remains unresolved. Issue stays open.

Blocked / unfinished after more than two hours waiting for a shared-VM slot. Current load5=9.96. Every window with load5 <=6 still had other verify/release Cargo processes active; earlier/later load5 exceeded 6. Respecting the explicit low-priority/no-overlap rules, no new release build or gate started. Branch lp-binsize remains clean at base/head 6f6fd896214f05d9ef19a47e43fb8be2561ab626; no manifest changes or new commits. No new size, build-time or stream-performance result is claimed. Frozen JS dependency install and local code index completed; feature/crypto/panic findings are recorded in earlier comments. Only this job's waiting Python process has been stopped, so it will not launch a build after the handoff. Excluded progress.md records next steps. A quiet VM slot is required to resume the baseline, measured trials, fast gate and quick stream benchmark. The 25 MB budget remains unresolved. Issue stays open.
Author
Owner

wal-race inspection evidence (base 21b267b): SqliteStorage::open checks the main file and existing -wal/-shm/-journal once before constructing a new SQLx pool; it does not use a cached pool or check before each additional pool connection. backup independently calls self.options.clone().connect() and drops that connection. SqliteStorage::close only waits for the pool. SQLx 0.8.6 uses a background SQLite worker; Drop requests shutdown without awaiting it, whereas explicit close awaits it (SQLx docs, versioned source). SQLite last-connection close deletes WAL/SHM (SQLite WAL docs §6). This is a plausible late cleanup race with the fixture.

The bundled libsqlite3-sys 0.30.1 SQLite Unix VFS already includes O_NOFOLLOW in WAL/journal open flags and SHM opens (versioned SQLite source, functions unixOpen/unixOpenSharedMemory). It can create WAL via O_CREAT, but does not follow final sidecar symlinks on this Linux target. The documented same-OS-user trusted-writer boundary remains relevant. Reproduction and a deterministic lifecycle regression are next.

wal-race inspection evidence (base `21b267b`): `SqliteStorage::open` checks the main file and existing `-wal`/`-shm`/`-journal` once before constructing a new SQLx pool; it does not use a cached pool or check before each additional pool connection. `backup` independently calls `self.options.clone().connect()` and drops that connection. `SqliteStorage::close` only waits for the pool. SQLx 0.8.6 uses a background SQLite worker; Drop requests shutdown without awaiting it, whereas explicit close awaits it ([SQLx docs](https://docs.rs/sqlx/0.8.6/sqlx/struct.SqliteConnection.html), [versioned source](https://github.com/launchbadge/sqlx/blob/v0.8.6/sqlx-sqlite/src/connection/mod.rs)). SQLite last-connection close deletes WAL/SHM ([SQLite WAL docs §6](https://sqlite.org/wal.html)). This is a plausible late cleanup race with the fixture. The bundled libsqlite3-sys 0.30.1 SQLite Unix VFS already includes `O_NOFOLLOW` in WAL/journal open flags and SHM opens ([versioned SQLite source](https://raw.githubusercontent.com/sqlite/sqlite/version-3.46.0/src/os_unix.c), functions unixOpen/unixOpenSharedMemory). It can create WAL via `O_CREAT`, but does not follow final sidecar symlinks on this Linux target. The documented same-OS-user trusted-writer boundary remains relevant. Reproduction and a deterministic lifecycle regression are next.
Author
Owner

Final perf calibration attempt (harness1a59bc0) completed idle/browser/all18coldroutes/list/304, then its stream subprocess exited101. No baseline was saved; the partial report remains complete:false. Real gate output:

PASS perf: build release binary (383.729s)
PASS perf: install Chromium and system dependencies (4.236s)
PASS perf: evaluator tests (0.381s)
PASS perf: build process CPU clock sampler (0.058s)
PASS perf: build allocation measurement harness (189.140s)
FAIL perf: measured performance budgets (838.534s)

run_bun_with_stdin_ready requires STREAM_BENCH_READY within15seconds. Admission waiting inside the Bun workload can consume that deadline. Moved admission outside the timed workload: cargo test --no-run first, then host/browser admission, then actual cargo test. Bun forwards workload/stdout/secretstdin unchanged and replaces only the final numeric threshold checker. All12 targetedtests pass at035ae81. Fresh complete calibration is running; scripts/verify fast is running serially.

Classification correction before final baseline: a shared transport still in the current SPA document is recorded as PERF_DIAGNOSTIC spa_idle_sockets, not mislabeled as an old-document socket. The zero old-document budget uses actual document identities and physical TCP closure; full navigation measured zero old sockets/channels. The earlier provisional socket1 finding referred to the current SPA document.

Corrected cold container-detail measurement excludes automatic persistent-terminal restoration:173,692gzipbytes, still above120KiB. The detached shell remains real and is cleaned up with its owned fixture. Product crates/packages remain unchanged from6f6fd89.

Final perf calibration attempt (harness1a59bc0) completed idle/browser/all18coldroutes/list/304, then its stream subprocess exited101. No baseline was saved; the partial report remains complete:false. Real gate output: ``` PASS perf: build release binary (383.729s) PASS perf: install Chromium and system dependencies (4.236s) PASS perf: evaluator tests (0.381s) PASS perf: build process CPU clock sampler (0.058s) PASS perf: build allocation measurement harness (189.140s) FAIL perf: measured performance budgets (838.534s) ``` `run_bun_with_stdin_ready` requires STREAM_BENCH_READY within15seconds. Admission waiting inside the Bun workload can consume that deadline. Moved admission outside the timed workload: cargo test --no-run first, then host/browser admission, then actual cargo test. Bun forwards workload/stdout/secretstdin unchanged and replaces only the final numeric threshold checker. All12 targetedtests pass at035ae81. Fresh complete calibration is running; scripts/verify fast is running serially. Classification correction before final baseline: a shared transport still in the current SPA document is recorded as PERF_DIAGNOSTIC spa_idle_sockets, not mislabeled as an old-document socket. The zero old-document budget uses actual document identities and physical TCP closure; full navigation measured zero old sockets/channels. The earlier provisional socket1 finding referred to the current SPA document. Corrected cold container-detail measurement excludes automatic persistent-terminal restoration:173,692gzipbytes, still above120KiB. The detached shell remains real and is cleaned up with its owned fixture. Product crates/packages remain unchanged from6f6fd89.
Author
Owner

e2e-remote blocked handoff at 8bc9fd128610f4490debe54fe29470405679ba25 (branch e2e-remote, base dev6f6fd89). Implementation committed; full production parity35pass/13expected-fail/0fail,48cases,clean cleanup; fast GREEN without skipped tests. Detailed operation table, exact expected reasons, discovered embedded NotFound-constructor abort and verbatim gate output are in #49.

Required merge was not attempted: owner's load/exclusivity conditions never became eligible while this job waited. Only the owned unstarted waiter was retired; no other job was touched. The orchestrator must reserve a quiet slot and run scripts/verify merge before integration. Worktree clean, no push/deployment, no background waiter or owned fixture resources remain. progress.md contains exact continuation steps.

e2e-remote blocked handoff at `8bc9fd128610f4490debe54fe29470405679ba25` (branch e2e-remote, base dev6f6fd89). Implementation committed; full production parity35pass/13expected-fail/0fail,48cases,clean cleanup; fast GREEN without skipped tests. Detailed operation table, exact expected reasons, discovered embedded NotFound-constructor abort and verbatim gate output are in [#49](https://git.kayg.org/kayg/infraternal/issues/49). Required merge was not attempted: owner's load/exclusivity conditions never became eligible while this job waited. Only the owned unstarted waiter was retired; no other job was touched. The orchestrator must reserve a quiet slot and run scripts/verify merge before integration. Worktree clean, no push/deployment, no background waiter or owned fixture resources remain. progress.md contains exact continuation steps.
Author
Owner

wal-race resumed on branch wal-race, base 21b267b9b949e08b32e0125221df28cda462ad69; owned private-storage lifecycle and regression tests only.

Root-cause evidence: retained baseline run had 9 failures/200. Accepted opens reported symlink remained after open: false; another failure found the planted WAL missing. Test filesystem setup is synchronous and asserts the symlink before awaiting open. open validates sidecars once before constructing a pool (max 8 connections, no connection hook). backup opens an independent SQLx connection and drops it; close waits only for the pool. Deterministic backup_cannot_open_a_connection_after_storage_closes fails on base because backup can reopen a closed storage clone.

SQLx documents that SQLite uses a background worker and Drop merely signals shutdown: https://docs.rs/sqlx/0.8.6/sqlx/struct.SqliteConnection.html . Pool close waits for acquired connections: https://docs.rs/sqlx/0.8.6/sqlx/struct.Pool.html#method.close . SQLite last-connection close removes WAL/SHM: https://sqlite.org/wal.html#the_wal_file . Together with baseline disappearing-link evidence, this identifies a product lifecycle gap: delayed backup cleanup races reopen preflight, rather than unfinished fixture setup. Fix uses a pooled backup connection, so shutdown accounts for it on success/failure and refuses backup after close. No filesystem checks added to per-query hot paths. Added a 200-iteration real-SQLite regression loop; gates underway. Merge gate pending.

wal-race resumed on branch `wal-race`, base `21b267b9b949e08b32e0125221df28cda462ad69`; owned private-storage lifecycle and regression tests only. Root-cause evidence: retained baseline run had 9 failures/200. Accepted opens reported `symlink remained after open: false`; another failure found the planted WAL missing. Test filesystem setup is synchronous and asserts the symlink before awaiting open. `open` validates sidecars once before constructing a pool (max 8 connections, no connection hook). `backup` opens an independent SQLx connection and drops it; `close` waits only for the pool. Deterministic `backup_cannot_open_a_connection_after_storage_closes` fails on base because backup can reopen a closed storage clone. SQLx documents that SQLite uses a background worker and Drop merely signals shutdown: https://docs.rs/sqlx/0.8.6/sqlx/struct.SqliteConnection.html . Pool close waits for acquired connections: https://docs.rs/sqlx/0.8.6/sqlx/struct.Pool.html#method.close . SQLite last-connection close removes WAL/SHM: https://sqlite.org/wal.html#the_wal_file . Together with baseline disappearing-link evidence, this identifies a product lifecycle gap: delayed backup cleanup races reopen preflight, rather than unfinished fixture setup. Fix uses a pooled backup connection, so shutdown accounts for it on success/failure and refuses backup after close. No filesystem checks added to per-query hot paths. Added a 200-iteration real-SQLite regression loop; gates underway. Merge gate pending.
Author
Owner

Additional unchanged assertion failure in current repeated CLI stream proof (HEAD1322fe4): iteration15, load5 at start8.72, finished55.39s. Podman logs --tail 4 --timeout 1 returned success with stdout=[] and no remote stderr; expected both exact fixture stdout lines. Evidence cli-stream-15.log, assertion cli_mcp.rs421. The fixture starts via real Podman run -d using k8s-file logging, and no direct engine-log observation was retained at failure, so this evidence does not establish whether fixture log publication or the product stream caused the empty result. Proposed follow-up: retain/observe the fixture log records through the real engine before the snapshot and capture stream opening/timeout timing; preserve the byte-exact assertion and the one-second timeout contract. No product edit, retry, or relaxed assertion added.

Additional unchanged assertion failure in current repeated CLI stream proof (HEAD1322fe4): iteration15, load5 at start8.72, finished55.39s. Podman `logs --tail 4 --timeout 1` returned success with stdout=[] and no remote stderr; expected both exact fixture stdout lines. Evidence cli-stream-15.log, assertion cli_mcp.rs421. The fixture starts via real Podman `run -d` using k8s-file logging, and no direct engine-log observation was retained at failure, so this evidence does not establish whether fixture log publication or the product stream caused the empty result. Proposed follow-up: retain/observe the fixture log records through the real engine before the snapshot and capture stream opening/timeout timing; preserve the byte-exact assertion and the one-second timeout contract. No product edit, retry, or relaxed assertion added.
Author
Owner

Owned synchronization finding and fix at a9789dd: iteration16 of the current CLI stream sequence failed unchanged five-second MCP SSH read deadline. Inspection found one remaining inline BEFORE marker in the MCP SSH shell command; Python could accept the terminal echo as readiness. The other SIGHUP/killed-client commands already split their markers. This commit splits the MCP marker too and awaits server-observed detached state before MCP attachment. The original marker/read deadlines and all output/status assertions remain intact; timeout diagnostics now include received fixture output. The finding establishes an unsafe readiness check, not a definitive causal explanation for run16.

Added full-SSH-only selection of the existing integration test to exercise the complete real SSH path (EOF, resize, SIGHUP and SIGKILL replay, MCP send/read, signal restoration and host-key refusal) without unrelated container checks. Fresh 20-run proof will follow current sequence completion. Current sequence iterations1-18 used1322fe4; remaining19-20 will usea9789dd after compilation. Preserve all earlier failures and report the source transition; do not label the mixed sequence as a final-head proof. Fast/merge stillqueued, no other process signalled.

Owned synchronization finding and fix at a9789dd: iteration16 of the current CLI stream sequence failed unchanged five-second MCP SSH read deadline. Inspection found one remaining inline BEFORE marker in the MCP SSH shell command; Python could accept the terminal echo as readiness. The other SIGHUP/killed-client commands already split their markers. This commit splits the MCP marker too and awaits server-observed detached state before MCP attachment. The original marker/read deadlines and all output/status assertions remain intact; timeout diagnostics now include received fixture output. The finding establishes an unsafe readiness check, not a definitive causal explanation for run16. Added full-SSH-only selection of the existing integration test to exercise the complete real SSH path (EOF, resize, SIGHUP and SIGKILL replay, MCP send/read, signal restoration and host-key refusal) without unrelated container checks. Fresh 20-run proof will follow current sequence completion. Current sequence iterations1-18 used1322fe4; remaining19-20 will usea9789dd after compilation. Preserve all earlier failures and report the source transition; do not label the mixed sequence as a final-head proof. Fast/merge stillqueued, no other process signalled.
Author
Owner

Further wal-race evidence and corrected root cause: pooled backup alone was insufficient; the regression still failed. A real syscall trace (/tmp/wal-race-syscalls.log) caught the race: test thread 1961049 planted the WAL link at 1790971324.102687; SQLite worker 1963506 unlinked that same WAL at 1790971324.102828, after storage close returned. This explains both accepted opens (link disappears before preflight) and ENOENT fixture failures.

SQLx0.8.6 pool close itself can return early when idle and returning connections overlap. PoolInner::close drains idle connections via Live::float; its DecrementSizeGuard::new_permit releases a semaphore permit even though release-to-idle already released it. Close's semaphore wait can therefore complete with other connection guards still outstanding. Source: https://github.com/launchbadge/sqlx/blob/v0.8.6/sqlx-core/src/pool/inner.rs and https://github.com/launchbadge/sqlx/blob/v0.8.6/sqlx-core/src/pool/connection.rs . Disabling idle reaping did not fix it and was reverted.

Small lifecycle fix: keep backups pooled and, after closing admissions, repeat pool close until pool.size()==0, with a 1ms async sleep to avoid spinning during outstanding operations. Pool remains bounded at 8; no per-query filesystem validation. The preflight descriptor now closes before SQLite connects, avoiding unrelated descriptor close during SQLite POSIX locking (https://sqlite.org/howtocorrupt.html#posix_advisory_locks_canceled_by_a_separate_thread_doing_close).

The first full regression with explicit size drain passed:

WAL regression: 200 iterations, 0 failures
test result: ok. 3 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 15.40s

Final targeted tests and fast gate follow. Merge gate pending.

Further wal-race evidence and corrected root cause: pooled backup alone was insufficient; the regression still failed. A real syscall trace (`/tmp/wal-race-syscalls.log`) caught the race: test thread 1961049 planted the WAL link at 1790971324.102687; SQLite worker 1963506 unlinked that same WAL at 1790971324.102828, after storage close returned. This explains both accepted opens (link disappears before preflight) and ENOENT fixture failures. SQLx0.8.6 pool close itself can return early when idle and returning connections overlap. `PoolInner::close` drains idle connections via `Live::float`; its `DecrementSizeGuard::new_permit` releases a semaphore permit even though release-to-idle already released it. Close's semaphore wait can therefore complete with other connection guards still outstanding. Source: https://github.com/launchbadge/sqlx/blob/v0.8.6/sqlx-core/src/pool/inner.rs and https://github.com/launchbadge/sqlx/blob/v0.8.6/sqlx-core/src/pool/connection.rs . Disabling idle reaping did not fix it and was reverted. Small lifecycle fix: keep backups pooled and, after closing admissions, repeat pool close until `pool.size()==0`, with a 1ms async sleep to avoid spinning during outstanding operations. Pool remains bounded at 8; no per-query filesystem validation. The preflight descriptor now closes before SQLite connects, avoiding unrelated descriptor close during SQLite POSIX locking (https://sqlite.org/howtocorrupt.html#posix_advisory_locks_canceled_by_a_separate_thread_doing_close). The first full regression with explicit size drain passed: ``` WAL regression: 200 iterations, 0 failures test result: ok. 3 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 15.40s ``` Final targeted tests and fast gate follow. Merge gate pending.
Author
Owner

Product-path hang in CLI stream attempt19 at a9789dd: modified full SSH/MCP path completed, then the compiled CLI exec <this-run Docker fixture> -- true did not exit for several minutes. The integration test waited in its existing unbounded run_cli wait_with_output. Captured only this run's process ancestry, client thread waits and filtered audit metadata: cli-stream-19-processes.log and cli-stream-19-interrupted.log. Server stream.open was accepted for exec; client main/runtime threads waited on futex/epoll. This does not establish whether remote execution or exit-frame delivery stalled. Proposed follow-up: trace exec completion and EXIT/CLOSE handling; separately replace this unbounded test wait with a bounded process-exit assertion so failures terminate without manual intervention. No product source changed.

To unblock this test, signalled ONLY compiled CLI PID1981715 started by our current test. Immediately revalidated executable path, exact command arguments, start_ticks2689090 and ancestry CLI1981715 -> test1976469 -> Cargo1975286 -> this run's runner1739814. No other process or service was signalled/stopped/restarted. Attempt19 is explicitly INTERRUPTED, not a natural timeout failure or a pass; retain it in the attempted20 totals.

Product-path hang in CLI stream attempt19 at a9789dd: modified full SSH/MCP path completed, then the compiled CLI `exec <this-run Docker fixture> -- true` did not exit for several minutes. The integration test waited in its existing unbounded run_cli wait_with_output. Captured only this run's process ancestry, client thread waits and filtered audit metadata: cli-stream-19-processes.log and cli-stream-19-interrupted.log. Server stream.open was accepted for exec; client main/runtime threads waited on futex/epoll. This does not establish whether remote execution or exit-frame delivery stalled. Proposed follow-up: trace exec completion and EXIT/CLOSE handling; separately replace this unbounded test wait with a bounded process-exit assertion so failures terminate without manual intervention. No product source changed. To unblock this test, signalled ONLY compiled CLI PID1981715 started by our current test. Immediately revalidated executable path, exact command arguments, start_ticks2689090 and ancestry CLI1981715 -> test1976469 -> Cargo1975286 -> this run's runner1739814. No other process or service was signalled/stopped/restarted. Attempt19 is explicitly INTERRUPTED, not a natural timeout failure or a pass; retain it in the attempted20 totals.
Author
Owner

wal-race finished. Branch wal-race; base 21b267b9b949e08b32e0125221df28cda462ad69; head 53b54c86c08e9f0e4e848931ab2aa4805df73404. Committed, clean worktree, not pushed.

Verdict: product lifecycle gap (b), not unfinished test setup. Late SQLite worker cleanup removed the already-planted WAL before validation; syscall timing and SQLx0.8.6 semaphore accounting analysis are recorded in the preceding finding. Backup now acquires a pooled connection; close waits for actual pool size zero with a 1ms async wait and re-drain. Preflight descriptor closes before SQLite connects. Pool maximum remains 8, with lazy expansion and no per-query filesystem checks. Added backup-after-close regression plus a 200-iteration real-SQLite backup/close/reopen/privacy loop. Comments cite SQLx and SQLite sources. Changes limited to crates/server/src/storage/mod.rs and crates/server/tests/private_storage.rs; progress.md excluded and uncommitted.

Baseline: 200 iterations, 9 failures. Final separate-process repeat of the original test, exit 0:

fixed: 200 iterations, 0 failures, elapsed=28.111s

Targeted cargo test -p infraternal-server --test private_storage --test storage -- --nocapture, exit 0 (includes consistent snapshot during live writes):

WAL regression: 200 iterations, 0 failures
test result: ok. 3 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 19.78s
test result: ok. 23 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 2.31s

scripts/verify fast, exit 0, verbatim output:

WARN load5=10.39 exceeds online CPU count=8; timing-sensitive checks may be delayed
PASS fast: migrations are append-only (0.395s)
PASS fast: workspace package dependencies (0.315s)
PASS fast: JavaScript dependencies (0.008s)
PASS fast: build web app (22.628s)
PASS fast: cargo fmt --check (1.398s)
PASS fast: cargo clippy (53.578s)
PASS fast: cargo test (108.327s)
PASS fast: svelte-check (9.347s)
PASS fast: UI package svelte-check (5.618s)
PASS fast: stream package typecheck (4.691s)
PASS fast: Vitest (4.267s)
PASS fast: UI package Vitest (10.416s)
PASS fast: stream package Vitest (1.201s)
PASS fast: OpenAPI and TypeScript client drift (50.072s)
PASS fast: terminal TypeScript (2.637s)
PASS fast: terminal Vitest (1.324s)

No merge, integration, browser or bench gates run. Shutdown-only correctness change; no new request hot path. Source review and targeted checks complete; independent review and merge gate pending for the orchestrator. Never closed this issue.

wal-race finished. Branch `wal-race`; base `21b267b9b949e08b32e0125221df28cda462ad69`; head `53b54c86c08e9f0e4e848931ab2aa4805df73404`. Committed, clean worktree, not pushed. Verdict: product lifecycle gap (b), not unfinished test setup. Late SQLite worker cleanup removed the already-planted WAL before validation; syscall timing and SQLx0.8.6 semaphore accounting analysis are recorded in the preceding finding. Backup now acquires a pooled connection; close waits for actual pool size zero with a 1ms async wait and re-drain. Preflight descriptor closes before SQLite connects. Pool maximum remains 8, with lazy expansion and no per-query filesystem checks. Added backup-after-close regression plus a 200-iteration real-SQLite backup/close/reopen/privacy loop. Comments cite SQLx and SQLite sources. Changes limited to `crates/server/src/storage/mod.rs` and `crates/server/tests/private_storage.rs`; progress.md excluded and uncommitted. Baseline: 200 iterations, 9 failures. Final separate-process repeat of the original test, exit 0: ``` fixed: 200 iterations, 0 failures, elapsed=28.111s ``` Targeted `cargo test -p infraternal-server --test private_storage --test storage -- --nocapture`, exit 0 (includes consistent snapshot during live writes): ``` WAL regression: 200 iterations, 0 failures test result: ok. 3 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 19.78s test result: ok. 23 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 2.31s ``` `scripts/verify fast`, exit 0, verbatim output: ``` WARN load5=10.39 exceeds online CPU count=8; timing-sensitive checks may be delayed PASS fast: migrations are append-only (0.395s) PASS fast: workspace package dependencies (0.315s) PASS fast: JavaScript dependencies (0.008s) PASS fast: build web app (22.628s) PASS fast: cargo fmt --check (1.398s) PASS fast: cargo clippy (53.578s) PASS fast: cargo test (108.327s) PASS fast: svelte-check (9.347s) PASS fast: UI package svelte-check (5.618s) PASS fast: stream package typecheck (4.691s) PASS fast: Vitest (4.267s) PASS fast: UI package Vitest (10.416s) PASS fast: stream package Vitest (1.201s) PASS fast: OpenAPI and TypeScript client drift (50.072s) PASS fast: terminal TypeScript (2.637s) PASS fast: terminal Vitest (1.324s) ``` No merge, integration, browser or bench gates run. Shutdown-only correctness change; no new request hot path. Source review and targeted checks complete; independent review and merge gate pending for the orchestrator. Never closed this issue.
Author
Owner

Orchestrator review of wal-race 53b54c8: approve. Follow-up (minor): SqliteStorage::close() loops until pool.size()==0 with no bound, so a connection held forever would hang shutdown. Add a bounded wait that logs and returns an error after N seconds. Merge gate is queued after lane D.

Orchestrator review of wal-race `53b54c8`: approve. Follow-up (minor): `SqliteStorage::close()` loops until `pool.size()==0` with no bound, so a connection held forever would hang shutdown. Add a bounded wait that logs and returns an error after N seconds. Merge gate is queued after lane D.
Author
Owner

Complete corrected dev calibration on infraternal-dev, 2026-10-02T20:08:12.118Z, harness head 035ae816c6. All 36 required metrics completed; product crates/packages are unchanged from dev 6f6fd89. These are dev diagnostics, not perf-test VM A/B certification. Absolute outcomes below describe these dev observations only; --perf-vm enforces those budgets on the perf-test VM.

Metric Measured dev baseline Absolute budget Dev comparison limit Meets absolute value
binary_size 32,643,704 bytes ≤ 25,000,000 ≤ 35,908,074.4 no
server_idle_rss 28,377,088 bytes ≤ 41,943,040 ≤ 31,214,796.8 yes
server_idle_cpu_mean 0.411882 % of one core ≤ 0.5 ≤ 0.45307 yes
server_idle_cpu_p95 0.73205 % of one core ≤ 1 ≤ 0.805256 yes
infraternal_agent_idle_rss 16,646,144 bytes ≤ 15,728,640 ≤ 18,310,758.4 no
infraternal_agent_idle_cpu_mean 0.044103 % of one core ≤ 0.5 ≤ 0.048514 yes
infraternal_agent_idle_cpu_p95 0.170328 % of one core ≤ 1 ≤ 0.187361 yes
log_stream_memory 1,085,440 bytes ≤ 3,145,728 ≤ 1,193,984 yes
terminal_stream_memory 655,360 bytes ≤ 1,572,864 ≤ 720,896 yes
old_document_channels 0 count ≤ 0 ≤ 0 yes
old_document_sockets 0 count ≤ 0 ≤ 0 yes
browser_heap 5,030,084 bytes ≤ 12,582,912 ≤ 5,533,092.4 yes
browser_tree_rss 534,417,408 bytes ≤ 786,432,000 ≤ 587,859,148.8 yes
route_js:/ 120,695 bytes ≤ 122,880 ≤ 132,764.5 yes
route_js:/hosts 129,381 bytes ≤ 122,880 ≤ 142,319.1 no
route_js:/containers 168,719 bytes ≤ 122,880 ≤ 185,590.9 no
route_js:/stacks 115,932 bytes ≤ 122,880 ≤ 127,525.2 yes
route_js:/images 115,931 bytes ≤ 122,880 ≤ 127,524.1 yes
route_js:/volumes 115,934 bytes ≤ 122,880 ≤ 127,527.4 yes
route_js:/terminals 115,985 bytes ≤ 122,880 ≤ 127,583.5 yes
route_js:/users-roles 115,935 bytes ≤ 122,880 ≤ 127,528.5 yes
route_js:/ai-agent-tokens 115,931 bytes ≤ 122,880 ≤ 127,524.1 yes
route_js:/infraternal-agents 115,945 bytes ≤ 122,880 ≤ 127,539.5 yes
route_js:/audit-log 115,936 bytes ≤ 122,880 ≤ 127,529.6 yes
route_js:/settings 115,931 bytes ≤ 122,880 ≤ 127,524.1 yes
route_js:/inbox 115,934 bytes ≤ 122,880 ≤ 127,527.4 yes
route_js:/account 114,923 bytes ≤ 122,880 ≤ 126,415.3 yes
route_js:/device 119,211 bytes ≤ 122,880 ≤ 131,132.1 yes
route_js:/__ui-tests 143,378 bytes ≤ 122,880 ≤ 157,715.8 no
route_js:/containers/:host/:engine/:id 173,692 bytes ≤ 122,880 ≤ 191,061.2 no
route_js:/hosts/:id 121,560 bytes ≤ 122,880 ≤ 133,716 yes
container_list_p99 7.987767 ms ≤ 20 ≤ 8.786544 yes
conditional_304_allocated 861,944 bytes ≤ 131,072 ≤ 948,138.4 no
echo_p99 94.2 ms ≤ 5 ≤ 103.62 no
logs_throughput 49.189156 MiB/s ≥ 50 ≥ 44.717414 no
loaded_server_peak_rss 33,054,720 bytes ≤ 67,108,864 ≤ 36,360,192 yes

Units and full-precision source report:

{
  "schema": 1,
  "complete": true,
  "error": null,
  "mode": "dev",
  "host": "infraternal-dev",
  "head": "035ae816c6a1c8f72efdbff084ec0f12447e4721",
  "harness_sha256": "2cead49795a8ee5f406ea5f505b0f7fb58705d89f18c4194544cbf406d4e6081",
  "product_trees": {
    "crates": "37ac3bc9da5cdacf837217519bc4cce999217133",
    "packages": "fc0156aac9f94c02d51cd9d264e0e8468eed6fb3"
  },
  "created_at": "2026-10-02T20:08:12.118Z",
  "values": {
    "binary_size": 32643704,
    "server_idle_rss": 28377088,
    "server_idle_cpu_mean": 0.4118817571964272,
    "server_idle_cpu_p95": 0.7320504670822221,
    "infraternal_agent_idle_rss": 16646144,
    "infraternal_agent_idle_cpu_mean": 0.044103315599023196,
    "infraternal_agent_idle_cpu_p95": 0.17032816931197536,
    "log_stream_memory": 1085440,
    "terminal_stream_memory": 655360,
    "old_document_channels": 0,
    "old_document_sockets": 0,
    "browser_heap": 5030084,
    "browser_tree_rss": 534417408,
    "route_js:/": 120695,
    "route_js:/hosts": 129381,
    "route_js:/containers": 168719,
    "route_js:/stacks": 115932,
    "route_js:/images": 115931,
    "route_js:/volumes": 115934,
    "route_js:/terminals": 115985,
    "route_js:/users-roles": 115935,
    "route_js:/ai-agent-tokens": 115931,
    "route_js:/infraternal-agents": 115945,
    "route_js:/audit-log": 115936,
    "route_js:/settings": 115931,
    "route_js:/inbox": 115934,
    "route_js:/account": 114923,
    "route_js:/device": 119211,
    "route_js:/__ui-tests": 143378,
    "route_js:/containers/:host/:engine/:id": 173692,
    "route_js:/hosts/:id": 121560,
    "container_list_p99": 7.987767,
    "conditional_304_allocated": 861944,
    "echo_p99": 94.20000000298023,
    "logs_throughput": 49.1891558559208,
    "loaded_server_peak_rss": 33054720
  },
  "failures": []
}

Loaded RSS is the existing benchmark’s conservative whole-test-process VmHWM, including the embedded server; it is not standalone server RSS certification. The 304 counter includes native/Rust allocations across storage workers/background tasks; request construction is excluded. Cold JS excludes only the fixture’s saved automatic terminal reattach point; authentication is preserved. Zero old-document counts use real document identity and physical TCP closure. The current-document SPA singleton socket is diagnostic only.

scripts/verify fast completed successfully, using CARGO_BUILD_JOBS=2 and RUST_TEST_THREADS=1. Verbatim output:

WARN load5=12.59 exceeds online CPU count=8; timing-sensitive checks may be delayed
PASS fast: migrations are append-only (0.147s)
PASS fast: workspace package dependencies (1.627s)
PASS fast: JavaScript dependencies (0.356s)
PASS fast: build web app (19.528s)
PASS fast: cargo fmt --check (2.439s)
PASS fast: cargo clippy (68.401s)
PASS fast: cargo test (166.749s)
PASS fast: svelte-check (14.700s)
PASS fast: UI package svelte-check (6.826s)
PASS fast: stream package typecheck (5.890s)
PASS fast: Vitest (3.463s)
PASS fast: UI package Vitest (10.713s)
PASS fast: stream package Vitest (1.012s)
PASS fast: OpenAPI and TypeScript client drift (38.029s)
PASS fast: terminal TypeScript (5.327s)
PASS fast: terminal Vitest (1.854s)

The actual scripts/verify perf --dev-vm comparison is now running against this first complete corrected baseline. The baseline will not be overwritten after a numeric failure. Merge remains pending its load5<8/no-other-verify admission.

Complete corrected dev calibration on infraternal-dev, 2026-10-02T20:08:12.118Z, harness head 035ae816c6a1c8f72efdbff084ec0f12447e4721. All 36 required metrics completed; product crates/packages are unchanged from dev 6f6fd89. These are dev diagnostics, not perf-test VM A/B certification. Absolute outcomes below describe these dev observations only; --perf-vm enforces those budgets on the perf-test VM. | Metric | Measured dev baseline | Absolute budget | Dev comparison limit | Meets absolute value | |---|---:|---:|---:|:---:| | binary_size | 32,643,704 bytes | ≤ 25,000,000 | ≤ 35,908,074.4 | no | | server_idle_rss | 28,377,088 bytes | ≤ 41,943,040 | ≤ 31,214,796.8 | yes | | server_idle_cpu_mean | 0.411882 % of one core | ≤ 0.5 | ≤ 0.45307 | yes | | server_idle_cpu_p95 | 0.73205 % of one core | ≤ 1 | ≤ 0.805256 | yes | | infraternal_agent_idle_rss | 16,646,144 bytes | ≤ 15,728,640 | ≤ 18,310,758.4 | no | | infraternal_agent_idle_cpu_mean | 0.044103 % of one core | ≤ 0.5 | ≤ 0.048514 | yes | | infraternal_agent_idle_cpu_p95 | 0.170328 % of one core | ≤ 1 | ≤ 0.187361 | yes | | log_stream_memory | 1,085,440 bytes | ≤ 3,145,728 | ≤ 1,193,984 | yes | | terminal_stream_memory | 655,360 bytes | ≤ 1,572,864 | ≤ 720,896 | yes | | old_document_channels | 0 count | ≤ 0 | ≤ 0 | yes | | old_document_sockets | 0 count | ≤ 0 | ≤ 0 | yes | | browser_heap | 5,030,084 bytes | ≤ 12,582,912 | ≤ 5,533,092.4 | yes | | browser_tree_rss | 534,417,408 bytes | ≤ 786,432,000 | ≤ 587,859,148.8 | yes | | route_js:/ | 120,695 bytes | ≤ 122,880 | ≤ 132,764.5 | yes | | route_js:/hosts | 129,381 bytes | ≤ 122,880 | ≤ 142,319.1 | no | | route_js:/containers | 168,719 bytes | ≤ 122,880 | ≤ 185,590.9 | no | | route_js:/stacks | 115,932 bytes | ≤ 122,880 | ≤ 127,525.2 | yes | | route_js:/images | 115,931 bytes | ≤ 122,880 | ≤ 127,524.1 | yes | | route_js:/volumes | 115,934 bytes | ≤ 122,880 | ≤ 127,527.4 | yes | | route_js:/terminals | 115,985 bytes | ≤ 122,880 | ≤ 127,583.5 | yes | | route_js:/users-roles | 115,935 bytes | ≤ 122,880 | ≤ 127,528.5 | yes | | route_js:/ai-agent-tokens | 115,931 bytes | ≤ 122,880 | ≤ 127,524.1 | yes | | route_js:/infraternal-agents | 115,945 bytes | ≤ 122,880 | ≤ 127,539.5 | yes | | route_js:/audit-log | 115,936 bytes | ≤ 122,880 | ≤ 127,529.6 | yes | | route_js:/settings | 115,931 bytes | ≤ 122,880 | ≤ 127,524.1 | yes | | route_js:/inbox | 115,934 bytes | ≤ 122,880 | ≤ 127,527.4 | yes | | route_js:/account | 114,923 bytes | ≤ 122,880 | ≤ 126,415.3 | yes | | route_js:/device | 119,211 bytes | ≤ 122,880 | ≤ 131,132.1 | yes | | route_js:/__ui-tests | 143,378 bytes | ≤ 122,880 | ≤ 157,715.8 | no | | route_js:/containers/:host/:engine/:id | 173,692 bytes | ≤ 122,880 | ≤ 191,061.2 | no | | route_js:/hosts/:id | 121,560 bytes | ≤ 122,880 | ≤ 133,716 | yes | | container_list_p99 | 7.987767 ms | ≤ 20 | ≤ 8.786544 | yes | | conditional_304_allocated | 861,944 bytes | ≤ 131,072 | ≤ 948,138.4 | no | | echo_p99 | 94.2 ms | ≤ 5 | ≤ 103.62 | no | | logs_throughput | 49.189156 MiB/s | ≥ 50 | ≥ 44.717414 | no | | loaded_server_peak_rss | 33,054,720 bytes | ≤ 67,108,864 | ≤ 36,360,192 | yes | Units and full-precision source report: ```json { "schema": 1, "complete": true, "error": null, "mode": "dev", "host": "infraternal-dev", "head": "035ae816c6a1c8f72efdbff084ec0f12447e4721", "harness_sha256": "2cead49795a8ee5f406ea5f505b0f7fb58705d89f18c4194544cbf406d4e6081", "product_trees": { "crates": "37ac3bc9da5cdacf837217519bc4cce999217133", "packages": "fc0156aac9f94c02d51cd9d264e0e8468eed6fb3" }, "created_at": "2026-10-02T20:08:12.118Z", "values": { "binary_size": 32643704, "server_idle_rss": 28377088, "server_idle_cpu_mean": 0.4118817571964272, "server_idle_cpu_p95": 0.7320504670822221, "infraternal_agent_idle_rss": 16646144, "infraternal_agent_idle_cpu_mean": 0.044103315599023196, "infraternal_agent_idle_cpu_p95": 0.17032816931197536, "log_stream_memory": 1085440, "terminal_stream_memory": 655360, "old_document_channels": 0, "old_document_sockets": 0, "browser_heap": 5030084, "browser_tree_rss": 534417408, "route_js:/": 120695, "route_js:/hosts": 129381, "route_js:/containers": 168719, "route_js:/stacks": 115932, "route_js:/images": 115931, "route_js:/volumes": 115934, "route_js:/terminals": 115985, "route_js:/users-roles": 115935, "route_js:/ai-agent-tokens": 115931, "route_js:/infraternal-agents": 115945, "route_js:/audit-log": 115936, "route_js:/settings": 115931, "route_js:/inbox": 115934, "route_js:/account": 114923, "route_js:/device": 119211, "route_js:/__ui-tests": 143378, "route_js:/containers/:host/:engine/:id": 173692, "route_js:/hosts/:id": 121560, "container_list_p99": 7.987767, "conditional_304_allocated": 861944, "echo_p99": 94.20000000298023, "logs_throughput": 49.1891558559208, "loaded_server_peak_rss": 33054720 }, "failures": [] } ``` Loaded RSS is the existing benchmark’s conservative whole-test-process VmHWM, including the embedded server; it is not standalone server RSS certification. The 304 counter includes native/Rust allocations across storage workers/background tasks; request construction is excluded. Cold JS excludes only the fixture’s saved automatic terminal reattach point; authentication is preserved. Zero old-document counts use real document identity and physical TCP closure. The current-document SPA singleton socket is diagnostic only. `scripts/verify fast` completed successfully, using CARGO_BUILD_JOBS=2 and RUST_TEST_THREADS=1. Verbatim output: ```text WARN load5=12.59 exceeds online CPU count=8; timing-sensitive checks may be delayed PASS fast: migrations are append-only (0.147s) PASS fast: workspace package dependencies (1.627s) PASS fast: JavaScript dependencies (0.356s) PASS fast: build web app (19.528s) PASS fast: cargo fmt --check (2.439s) PASS fast: cargo clippy (68.401s) PASS fast: cargo test (166.749s) PASS fast: svelte-check (14.700s) PASS fast: UI package svelte-check (6.826s) PASS fast: stream package typecheck (5.890s) PASS fast: Vitest (3.463s) PASS fast: UI package Vitest (10.713s) PASS fast: stream package Vitest (1.012s) PASS fast: OpenAPI and TypeScript client drift (38.029s) PASS fast: terminal TypeScript (5.327s) PASS fast: terminal Vitest (1.854s) ``` The actual scripts/verify perf --dev-vm comparison is now running against this first complete corrected baseline. The baseline will not be overwritten after a numeric failure. Merge remains pending its load5<8/no-other-verify admission.
Author
Owner

Interim verification at a9789dd (work remains; fast/merge queued):

The CLI stream sequence attempted all 20 tests: 15 PASS, 4 natural assertion failures, and 1 manually interrupted hung own CLI (attempt19). Raw runner classifies the interrupted attempt as FAIL, so its exact RESULT is passes=15 failures=5. Iterations1-18 used1322fe4; iterations19-20 useda9789dd. This is a mixed-source sequence, not a final-head 20/20 proof. Failure5: HTTP500 exec ticket creation; failure6: WebSocket4003 before exec SIGQUIT readiness; failure15: empty Podman tail snapshot; failure16: MCP SSH output deadline, followed by the owned marker fix; attempt19: Docker exec true hang, own verified CLI interrupted after227s. No assertion relaxed.

Exact runner count lines:

PASS cli-stream 1/20
PASS cli-stream 2/20
PASS cli-stream 3/20
PASS cli-stream 4/20
FAIL cli-stream 5/20
FAIL cli-stream 6/20
PASS cli-stream 7/20
PASS cli-stream 8/20
PASS cli-stream 9/20
PASS cli-stream 10/20
PASS cli-stream 11/20
PASS cli-stream 12/20
PASS cli-stream 13/20
PASS cli-stream 14/20
FAIL cli-stream 15/20
FAIL cli-stream 16/20
PASS cli-stream 17/20
PASS cli-stream 18/20
FAIL cli-stream 19/20
PASS cli-stream 20/20
RESULT cli-stream passes=15 failures=5 total=20

Fresh complete-SSH 20-repeat proof at a9789dd is queued/running with its own fixture root and load5<10 check (cli-ssh-full-repeats-run.log). This includes MCP, both detach/replay paths, EOF, resize, signals/restoration and host-key refusal, while avoiding the unrelated container failures. Server lifecycle sequence completed19/20 PASS (one unchanged revocation deadline failure); surrounding real-sshd and cleanup checks completed18/18 PASS. Compilation of latest source succeeded in cli-stream-19.log. Heavy fast/merge still cannot start while other scripts/verify runs are active or load5 exceeds6; polling continues every2min.

Interim verification at a9789dd (work remains; fast/merge queued): The CLI stream sequence attempted all 20 tests: 15 PASS, 4 natural assertion failures, and 1 manually interrupted hung own CLI (attempt19). Raw runner classifies the interrupted attempt as FAIL, so its exact RESULT is passes=15 failures=5. Iterations1-18 used1322fe4; iterations19-20 useda9789dd. This is a mixed-source sequence, not a final-head 20/20 proof. Failure5: HTTP500 exec ticket creation; failure6: WebSocket4003 before exec SIGQUIT readiness; failure15: empty Podman tail snapshot; failure16: MCP SSH output deadline, followed by the owned marker fix; attempt19: Docker exec true hang, own verified CLI interrupted after227s. No assertion relaxed. Exact runner count lines: ```text PASS cli-stream 1/20 PASS cli-stream 2/20 PASS cli-stream 3/20 PASS cli-stream 4/20 FAIL cli-stream 5/20 FAIL cli-stream 6/20 PASS cli-stream 7/20 PASS cli-stream 8/20 PASS cli-stream 9/20 PASS cli-stream 10/20 PASS cli-stream 11/20 PASS cli-stream 12/20 PASS cli-stream 13/20 PASS cli-stream 14/20 FAIL cli-stream 15/20 FAIL cli-stream 16/20 PASS cli-stream 17/20 PASS cli-stream 18/20 FAIL cli-stream 19/20 PASS cli-stream 20/20 RESULT cli-stream passes=15 failures=5 total=20 ``` Fresh complete-SSH 20-repeat proof at a9789dd is queued/running with its own fixture root and load5<10 check (cli-ssh-full-repeats-run.log). This includes MCP, both detach/replay paths, EOF, resize, signals/restoration and host-key refusal, while avoiding the unrelated container failures. Server lifecycle sequence completed19/20 PASS (one unchanged revocation deadline failure); surrounding real-sshd and cleanup checks completed18/18 PASS. Compilation of latest source succeeded in cli-stream-19.log. Heavy fast/merge still cannot start while other scripts/verify runs are active or load5 exceeds6; polling continues every2min.
Author
Owner

Final-head full SSH proof completed at a9789dd:18/20PASS,2FAIL. All20executed the exact ignored integration test using SSH_FULL_ONLY; no observer or retry inside the tests. Original five-second EOF and fifteen-second CLI process-exit limits remain intact.

Run4 (start load5=8.91): SIGHUP reattach delivered BEFORE, AFTER, finish and remote exit, then Python pidfd/process-exit observation reached the unchanged15s timeout (test24.04s). Evidence cli-ssh-full-4.log. Run19 (start load5=7.21): piped SSH EOF did not finish within original5s (test11.26s). Evidence cli-ssh-full-19.log. The new split MCP marker/state gate did not fail in this sequence.

This does NOT prove the known exit hangs fixed. The independent Docker exec true CLI hang in stream attempt19 lasted227s, suggesting a broader product completion/EXIT path worth tracing. Proposed product fix investigation: observe server session completion/exit state and EXIT/CLOSE delivery together with CLI receive-loop termination and input-worker shutdown. Preserve all deadlines and remote exit assertions; no product edit in this branch.

Exact runner counts:

PASS cli-ssh-full 1/20
PASS cli-ssh-full 2/20
PASS cli-ssh-full 3/20
FAIL cli-ssh-full 4/20
PASS cli-ssh-full 5/20
PASS cli-ssh-full 6/20
PASS cli-ssh-full 7/20
PASS cli-ssh-full 8/20
PASS cli-ssh-full 9/20
PASS cli-ssh-full 10/20
PASS cli-ssh-full 11/20
PASS cli-ssh-full 12/20
PASS cli-ssh-full 13/20
PASS cli-ssh-full 14/20
PASS cli-ssh-full 15/20
PASS cli-ssh-full 16/20
PASS cli-ssh-full 17/20
PASS cli-ssh-full 18/20
FAIL cli-ssh-full 19/20
PASS cli-ssh-full 20/20
RESULT cli-ssh-full passes=18 failures=2 total=20

Compilation and ancillary18/18checks passed. Server20-repeat remains19/20 due unchanged contractual1s revocation deadline. Fast/merge still queued behind other active verification runs; pgrep polling every2min continues. No other process/service signalled.

Final-head full SSH proof completed at a9789dd:18/20PASS,2FAIL. All20executed the exact ignored integration test using SSH_FULL_ONLY; no observer or retry inside the tests. Original five-second EOF and fifteen-second CLI process-exit limits remain intact. Run4 (start load5=8.91): SIGHUP reattach delivered BEFORE, AFTER, finish and remote `exit`, then Python pidfd/process-exit observation reached the unchanged15s timeout (test24.04s). Evidence cli-ssh-full-4.log. Run19 (start load5=7.21): piped SSH EOF did not finish within original5s (test11.26s). Evidence cli-ssh-full-19.log. The new split MCP marker/state gate did not fail in this sequence. This does NOT prove the known exit hangs fixed. The independent Docker exec true CLI hang in stream attempt19 lasted227s, suggesting a broader product completion/EXIT path worth tracing. Proposed product fix investigation: observe server session completion/exit state and EXIT/CLOSE delivery together with CLI receive-loop termination and input-worker shutdown. Preserve all deadlines and remote exit assertions; no product edit in this branch. Exact runner counts: ```text PASS cli-ssh-full 1/20 PASS cli-ssh-full 2/20 PASS cli-ssh-full 3/20 FAIL cli-ssh-full 4/20 PASS cli-ssh-full 5/20 PASS cli-ssh-full 6/20 PASS cli-ssh-full 7/20 PASS cli-ssh-full 8/20 PASS cli-ssh-full 9/20 PASS cli-ssh-full 10/20 PASS cli-ssh-full 11/20 PASS cli-ssh-full 12/20 PASS cli-ssh-full 13/20 PASS cli-ssh-full 14/20 PASS cli-ssh-full 15/20 PASS cli-ssh-full 16/20 PASS cli-ssh-full 17/20 PASS cli-ssh-full 18/20 FAIL cli-ssh-full 19/20 PASS cli-ssh-full 20/20 RESULT cli-ssh-full passes=18 failures=2 total=20 ``` Compilation and ancillary18/18checks passed. Server20-repeat remains19/20 due unchanged contractual1s revocation deadline. Fast/merge still queued behind other active verification runs; pgrep polling every2min continues. No other process/service signalled.
Author
Owner

Correction to the preceding proof comment: run19 started at load5=7.38, not7.21. Exact runner line:

START cli-ssh-full 19/20 load=4.61 7.38 8.89 2/897 2111358

The18/20count and failure/deadline evidence are unchanged.

Correction to the preceding proof comment: run19 started at load5=7.38, not7.21. Exact runner line: ```text START cli-ssh-full 19/20 load=4.61 7.38 8.89 2/897 2111358 ``` The18/20count and failure/deadline evidence are unchanged.
Author
Owner

Request-path panic scan (rg -n 'unwrap\(|expect\(|unreachable!' crates/server/src) found the two concrete ApiError::new assertion failures in the agents route; both are fixed and covered. The other required-detail error call sites found by checking NotFound and InvalidValue now either pass their typed details or are the fixed agents helper.

Remaining invariant sites for follow-up:

  • crates/server/src/stream.rs:1852: host_id.expect("visible stream targets have a canonical host") after stream target lookup/authorization; the assumption depends on the visible-target constructor.
  • crates/server/src/resources.rs:2007: _ => unreachable!() when mapping action_scope; the preceding action parsing currently admits only the four container lifecycle scopes.
  • crates/server/src/device_auth.rs:910,914,953,967,1207,1276,1352: validated record/state expect and unreachable! branches; current checks run under the device-state mutex and return invalid/terminal records before these sites.
  • crates/server/src/lib.rs:612: code.expect("error responses have a code") follows an or_else fallback that always returns Some.

Reviewed auth serialization/cookie/status expects and resource ETag/status expects use generated or validated values. No change made to lane-owned stream/resource/device-auth/lib files in this job.

Request-path panic scan (`rg -n 'unwrap\(|expect\(|unreachable!' crates/server/src`) found the two concrete `ApiError::new` assertion failures in the agents route; both are fixed and covered. The other required-detail error call sites found by checking `NotFound` and `InvalidValue` now either pass their typed details or are the fixed agents helper. Remaining invariant sites for follow-up: - `crates/server/src/stream.rs:1852`: `host_id.expect("visible stream targets have a canonical host")` after stream target lookup/authorization; the assumption depends on the visible-target constructor. - `crates/server/src/resources.rs:2007`: `_ => unreachable!()` when mapping `action_scope`; the preceding action parsing currently admits only the four container lifecycle scopes. - `crates/server/src/device_auth.rs:910,914,953,967,1207,1276,1352`: validated record/state `expect` and `unreachable!` branches; current checks run under the device-state mutex and return invalid/terminal records before these sites. - `crates/server/src/lib.rs:612`: `code.expect("error responses have a code")` follows an `or_else` fallback that always returns `Some`. Reviewed auth serialization/cookie/status expects and resource ETag/status expects use generated or validated values. No change made to lane-owned stream/resource/device-auth/lib files in this job.
Author
Owner

Confirmed product-side completion failure, not remote EOF readiness, at a9789dd. Observed full-SSH diagnostic batch:9PASS, run10failed original5s EOF process-exit assertion; observer stopped after capturing failure. Plain final-head proof remains18/20 and is reported separately.

While the compiled CLI PID2138780 remained alive, server session s_01M3Z56CEVKNNFPQEJWHKXF42G was already persisted as exited with exit_code3 at two successive snapshots. Thus remote EOF reached cat and the expected remote exit occurred before the local process timeout. CLI main/runtime/blocking threads were waiting in futex/epoll; no causal claim from those waits alone. No assertion or deadline changed, no product code edited. Exact safe metadata:

SNAPSHOT 1790973260.2189822
OWN_SSH_CLI 2138780
OWN_SERVER_SESSION_METADATA []
SNAPSHOT 1790973262.3465962
OWN_SSH_CLI 2138780
OWN_SERVER_SESSION_METADATA [('s_01M3Z56CEVKNNFPQEJWHKXF42G', 'exited', 3)]
SNAPSHOT 1790973264.5156722
OWN_SSH_CLI 2138780
OWN_SERVER_SESSION_METADATA [('s_01M3Z56CEVKNNFPQEJWHKXF42G', 'exited', 3)]
TEST_EXIT 101

Evidence: diagnostic-full-test-10.log (original EOF timeout) and diagnostic-full-state-10.log (full owned-client thread/session snapshots), target/lp-flaky-evidence. Proposed product fix: ensure completed SSH sessions enqueue/deliver EXIT/CLOSE to the current attachment, and ensure the CLI exits with that code without waiting indefinitely on input or background workers. Trace both server EXIT delivery and CLI receive/cleanup before choosing the fix. Relevant product sources are outside this branch's allowed test-only ownership. Existing5s/exit3 regression must remain unchanged and repeat cleanly after the product fix. This also warrants comparing the SIGHUP reattach exit hang and227s Docker exec true hang already reported.

Fast/merge stillqueued behind active verification runs. This run has not signalled any other process/service.

Confirmed product-side completion failure, not remote EOF readiness, at a9789dd. Observed full-SSH diagnostic batch:9PASS, run10failed original5s EOF process-exit assertion; observer stopped after capturing failure. Plain final-head proof remains18/20 and is reported separately. While the compiled CLI PID2138780 remained alive, server session s_01M3Z56CEVKNNFPQEJWHKXF42G was already persisted as exited with exit_code3 at two successive snapshots. Thus remote EOF reached cat and the expected remote exit occurred before the local process timeout. CLI main/runtime/blocking threads were waiting in futex/epoll; no causal claim from those waits alone. No assertion or deadline changed, no product code edited. Exact safe metadata: ```text SNAPSHOT 1790973260.2189822 OWN_SSH_CLI 2138780 OWN_SERVER_SESSION_METADATA [] SNAPSHOT 1790973262.3465962 OWN_SSH_CLI 2138780 OWN_SERVER_SESSION_METADATA [('s_01M3Z56CEVKNNFPQEJWHKXF42G', 'exited', 3)] SNAPSHOT 1790973264.5156722 OWN_SSH_CLI 2138780 OWN_SERVER_SESSION_METADATA [('s_01M3Z56CEVKNNFPQEJWHKXF42G', 'exited', 3)] TEST_EXIT 101 ``` Evidence: diagnostic-full-test-10.log (original EOF timeout) and diagnostic-full-state-10.log (full owned-client thread/session snapshots), target/lp-flaky-evidence. Proposed product fix: ensure completed SSH sessions enqueue/deliver EXIT/CLOSE to the current attachment, and ensure the CLI exits with that code without waiting indefinitely on input or background workers. Trace both server EXIT delivery and CLI receive/cleanup before choosing the fix. Relevant product sources are outside this branch's allowed test-only ownership. Existing5s/exit3 regression must remain unchanged and repeat cleanly after the product fix. This also warrants comparing the SIGHUP reattach exit hang and227s Docker exec true hang already reported. Fast/merge stillqueued behind active verification runs. This run has not signalled any other process/service.
Author
Owner

Dev comparison at HEAD 035ae816c6, unchanged product trees vs dev 6f6fd89. The fixed complete baseline remains target/perf/base-final.json; no recalibration after failures. Numeric failures observed so far:

Metric Measured Dev limit Absolute budget
log_stream_memory 1454080 1193984 3145728
terminal_stream_memory 765952 720896 1572864
conditional_304_allocated 1117151 948138.4 131072

Cold-route regression checks and all old-document socket/channel checks passed. The 500-container TCP list p99 is 7.650645 ms (limit 8.7865437 ms). Final stream benchmark remains pending host admission. These are shared dev-VM diagnostics, not perf-test VM certification. Full fast already passed; merge remains required after this run, load5 <8 and no other actual verification run.

Dev comparison at HEAD 035ae816c6a1c8f72efdbff084ec0f12447e4721, unchanged product trees vs dev 6f6fd89. The fixed complete baseline remains target/perf/base-final.json; no recalibration after failures. Numeric failures observed so far: | Metric | Measured | Dev limit | Absolute budget | |---|---:|---:|---:| | log_stream_memory | 1454080 | 1193984 | 3145728 | | terminal_stream_memory | 765952 | 720896 | 1572864 | | conditional_304_allocated | 1117151 | 948138.4 | 131072 | Cold-route regression checks and all old-document socket/channel checks passed. The 500-container TCP list p99 is 7.650645 ms (limit 8.7865437 ms). Final stream benchmark remains pending host admission. These are shared dev-VM diagnostics, not perf-test VM certification. Full fast already passed; merge remains required after this run, load5 <8 and no other actual verification run.
Author
Owner

Panic audit (ApiError code/details mismatch), dev @ c56a8fb, read-only. Release builds use panic=abort, so each of these takes down the whole process.

Fixed: agents.rs:318/344/126 (not_found / invalid_value without details). Fixed by 5a85e5c, now merged to dev.

Still open, HIGH:

  1. server/src/stream.rs:1389. A stream OPEN for exec/logs/stats whose engine inspect fails (daemon 5xx, timeout, 409, bad field) passes error.code to send_open_error (stream.rs:2347), which uses Empty details for engine_error/conflict/invalid_value and panics at errors.rs:490. Fix: pass details that match the code (send_open_error_with_details).
  2. engine/src/bollard_adapter.rs:1612 and :1678 build ResourceExhausted with retryable=false. EngineError::api_error (engine/src/error.rs:123) then calls with_retryable(false), which panics at errors.rs:518. Trigger: GET /api/v1/containers/{h}/podman/{id}, or POST .../{action}, on a container whose Podman inspect JSON exceeds 16 MiB (resources.rs:1735 and :1815). Fix: set retryable=true, or override only for engine/ssh/internal.
  3. infraternal/src/http.rs:214. ClientError::InvalidHost builds not_found with Empty details. Any CLI command or MCP tool call naming an unknown or ambiguous host panics (mcp.rs:1127 tool_error) and kills the MCP server. Fix: NotFoundDetails{kind:"host"}.

Latent: agent/src/lib.rs:1461. ssh_error with no stage (TakenOver) gets Empty details; open() cannot return it today.
Landmines: the helpers api_error_response (lib.rs:771), auth error_response (auth.rs:1612, which also hard-codes retryable=false), device_auth handled_error (:1899), agents error (:96), stream send_open_error and agent send_error/send_stream_close_raw all accept any code with None/Empty details. All ~200 current literal call sites are correct. Other unwrap/expect/unreachable/indexing in handlers: none reachable from request input.

Structural fix:

  • Now: make ApiError::new and with_retryable non-panicking. Use debug_assert, log, and coerce the details (or downgrade to internal), and clamp retryable. One file, no call-site changes, removes the crash class.
  • Then: replace (ErrorCode, ApiErrorDetails) with a per-code enum ApiErrorKind (details and retryable live on the variant, code() derived), so mismatches don't compile. Cost: ~200 call sites and all helper signatures, about 1-2 days of mechanical work, no wire change. Returning a Result from new only turns the crash into a 500 and needs the same churn.
Panic audit (ApiError code/details mismatch), dev @ c56a8fb, read-only. Release builds use panic=abort, so each of these takes down the whole process. Fixed: agents.rs:318/344/126 (not_found / invalid_value without details). Fixed by 5a85e5c, now merged to dev. Still open, HIGH: 1. server/src/stream.rs:1389. A stream OPEN for exec/logs/stats whose engine inspect fails (daemon 5xx, timeout, 409, bad field) passes error.code to send_open_error (stream.rs:2347), which uses Empty details for engine_error/conflict/invalid_value and panics at errors.rs:490. Fix: pass details that match the code (send_open_error_with_details). 2. engine/src/bollard_adapter.rs:1612 and :1678 build ResourceExhausted with retryable=false. EngineError::api_error (engine/src/error.rs:123) then calls with_retryable(false), which panics at errors.rs:518. Trigger: GET /api/v1/containers/{h}/podman/{id}, or POST .../{action}, on a container whose Podman inspect JSON exceeds 16 MiB (resources.rs:1735 and :1815). Fix: set retryable=true, or override only for engine/ssh/internal. 3. infraternal/src/http.rs:214. ClientError::InvalidHost builds not_found with Empty details. Any CLI command or MCP tool call naming an unknown or ambiguous host panics (mcp.rs:1127 tool_error) and kills the MCP server. Fix: NotFoundDetails{kind:"host"}. Latent: agent/src/lib.rs:1461. ssh_error with no stage (TakenOver) gets Empty details; open() cannot return it today. Landmines: the helpers api_error_response (lib.rs:771), auth error_response (auth.rs:1612, which also hard-codes retryable=false), device_auth handled_error (:1899), agents error (:96), stream send_open_error and agent send_error/send_stream_close_raw all accept any code with None/Empty details. All ~200 current literal call sites are correct. Other unwrap/expect/unreachable/indexing in handlers: none reachable from request input. Structural fix: - Now: make ApiError::new and with_retryable non-panicking. Use debug_assert, log, and coerce the details (or downgrade to internal), and clamp retryable. One file, no call-site changes, removes the crash class. - Then: replace (ErrorCode, ApiErrorDetails) with a per-code enum ApiErrorKind (details and retryable live on the variant, code() derived), so mismatches don't compile. Cost: ~200 call sites and all helper signatures, about 1-2 days of mechanical work, no wire change. Returning a Result from new only turns the crash into a 500 and needs the same churn.
Author
Owner

ApiError panic fix: branch fix-apierror-panics (not pushed). Base: dev c56a8fb. Head: 3bf9496e19

Commits:

  • 46efd21 proto: ApiError::new and with_retryable no longer panic in release. The checks stay as debug_assert!. proto has no logging dependency, so none was added. Mismatched pairs are repaired by repair_details, and the retryable flag by clamp_retryable. Fallbacks:
    • not_found -> NotFound{kind:"resource"}
    • conflict -> ConflictDetails::default()
    • plan_stale -> PlanStaleDetails::default()
    • engine_error -> Engine{engine_code:"unknown"}
    • rate_limited -> RateLimited{retry_after_ms:1000}
    • authorization_pending / slow_down -> PollInterval{interval:5} (RFC 8628 default)
    • invalid_value -> invalid_request + Empty (same 400 status and exit code; no field to name)
    • ssh_error / host_key_mismatch -> internal + Empty, retryable = original code default
    • all Empty-only codes: keep code, drop stray details
    • retryable on a fixed code: clamped to the registry default
      Valid pairs are unchanged. Tests cover every code x every details variant (the result is contract-valid and round-trips through the strict decoder), clamping, debug-assert should_panic, and a cfg(not(debug_assertions)) test calling new+with_retryable directly (run with --release).
  • 558d703 engine: EngineError::api_error now overrides retryable only for engine_error, ssh_error and internal. This fixes the Podman inspect over 16 MiB (ResourceExhausted, bollard_adapter.rs:1612/1678), whose wire retryable is now the registry value (true). The local flag still drives in-process retry. A test was added.
  • 3bf9496 cli: resolve_host_id unknown host -> not_found{kind:"host"}. Ambiguous name -> new ClientError::AmbiguousHost -> invalid_value{field:"host"}. Exit code 2 is kept for both. Added an axum-backed test.

Not edited: crates/server/src/stream.rs:1389. The embedded-agent target_exists error goes to send_audited_open_error with Empty details. It no longer aborts after 46efd21, but in release it will emit repaired details (for example engine_error with engine_code "unknown", or invalid_value downgraded to invalid_request) until the stream.rs rewrite passes matching details.

Targeted tests: cargo test -p infraternal-proto ok (61 + 2 passed). Release-mode errors tests: 9 passed. cargo test -p infraternal-engine: 23 passed, 1 ignored. cargo test -p infraternal: 42 lib passed, new test ok.

INFRATERNAL_VERIFY_RUN_ID=sub-apierror scripts/verify fast (exit 0):
PASS fast: migrations are append-only (0.139s)
PASS fast: workspace package dependencies (0.227s)
PASS fast: JavaScript dependencies (4.560s)
PASS fast: build web app (13.037s)
PASS fast: cargo fmt --check (1.057s)
PASS fast: cargo clippy (76.205s)
PASS fast: cargo test (133.093s)
PASS fast: svelte-check (26.920s)
PASS fast: UI package svelte-check (13.489s)
PASS fast: stream package typecheck (8.366s)
PASS fast: Vitest (6.101s)
PASS fast: UI package Vitest (17.153s)
PASS fast: stream package Vitest (1.397s)
PASS fast: OpenAPI and TypeScript client drift (78.177s)
PASS fast: terminal TypeScript (3.170s)
PASS fast: terminal Vitest (1.755s)

ApiError panic fix: branch `fix-apierror-panics` (not pushed). Base: dev c56a8fb. Head: 3bf9496e19553cc7943d6fd42d9c2eafa794d9a6 Commits: - 46efd21 proto: `ApiError::new` and `with_retryable` no longer panic in release. The checks stay as `debug_assert!`. proto has no logging dependency, so none was added. Mismatched pairs are repaired by `repair_details`, and the retryable flag by `clamp_retryable`. Fallbacks: - not_found -> NotFound{kind:"resource"} - conflict -> ConflictDetails::default() - plan_stale -> PlanStaleDetails::default() - engine_error -> Engine{engine_code:"unknown"} - rate_limited -> RateLimited{retry_after_ms:1000} - authorization_pending / slow_down -> PollInterval{interval:5} (RFC 8628 default) - invalid_value -> invalid_request + Empty (same 400 status and exit code; no field to name) - ssh_error / host_key_mismatch -> internal + Empty, retryable = original code default - all Empty-only codes: keep code, drop stray details - retryable on a fixed code: clamped to the registry default Valid pairs are unchanged. Tests cover every code x every details variant (the result is contract-valid and round-trips through the strict decoder), clamping, debug-assert should_panic, and a `cfg(not(debug_assertions))` test calling `new`+`with_retryable` directly (run with `--release`). - 558d703 engine: `EngineError::api_error` now overrides retryable only for engine_error, ssh_error and internal. This fixes the Podman inspect over 16 MiB (`ResourceExhausted`, bollard_adapter.rs:1612/1678), whose wire retryable is now the registry value (true). The local flag still drives in-process retry. A test was added. - 3bf9496 cli: `resolve_host_id` unknown host -> not_found{kind:"host"}. Ambiguous name -> new `ClientError::AmbiguousHost` -> invalid_value{field:"host"}. Exit code 2 is kept for both. Added an axum-backed test. Not edited: crates/server/src/stream.rs:1389. The embedded-agent `target_exists` error goes to `send_audited_open_error` with Empty details. It no longer aborts after 46efd21, but in release it will emit repaired details (for example engine_error with engine_code "unknown", or invalid_value downgraded to invalid_request) until the stream.rs rewrite passes matching details. Targeted tests: `cargo test -p infraternal-proto` ok (61 + 2 passed). Release-mode errors tests: 9 passed. `cargo test -p infraternal-engine`: 23 passed, 1 ignored. `cargo test -p infraternal`: 42 lib passed, new test ok. `INFRATERNAL_VERIFY_RUN_ID=sub-apierror scripts/verify fast` (exit 0): PASS fast: migrations are append-only (0.139s) PASS fast: workspace package dependencies (0.227s) PASS fast: JavaScript dependencies (4.560s) PASS fast: build web app (13.037s) PASS fast: cargo fmt --check (1.057s) PASS fast: cargo clippy (76.205s) PASS fast: cargo test (133.093s) PASS fast: svelte-check (26.920s) PASS fast: UI package svelte-check (13.489s) PASS fast: stream package typecheck (8.366s) PASS fast: Vitest (6.101s) PASS fast: UI package Vitest (17.153s) PASS fast: stream package Vitest (1.397s) PASS fast: OpenAPI and TypeScript client drift (78.177s) PASS fast: terminal TypeScript (3.170s) PASS fast: terminal Vitest (1.755s)
Author
Owner

Flaky production browser smoke (goto timeout 30000ms on networkidle): fixed on local branch fix-networkidle, commit d71768f (not pushed). scripts/browser-check.mjs now opens the polling routes (/, /hosts, /containers) with waitUntil domcontentloaded, then waits for the route h1 (waitForDashboard for /) and for its loading skeleton to go away. That covers checkSharedCookieTabs and the other 23 polling-route navigations. Assertions and multi-tab coverage are unchanged. networkidle stays on pages that don't poll (setup/sign-in, /device, /__ui-tests, detail pages) and on the pending-refresh tab. Playwright docs mark networkidle DISCOURAGED for testing: https://playwright.dev/docs/api/class-page#page-goto. scripts/verify fast passed. I skipped scripts/verify browser because another browser verify was already running.

Flaky production browser smoke (goto timeout 30000ms on networkidle): fixed on local branch fix-networkidle, commit d71768f (not pushed). scripts/browser-check.mjs now opens the polling routes (/, /hosts, /containers) with waitUntil domcontentloaded, then waits for the route h1 (waitForDashboard for /) and for its loading skeleton to go away. That covers checkSharedCookieTabs and the other 23 polling-route navigations. Assertions and multi-tab coverage are unchanged. networkidle stays on pages that don't poll (setup/sign-in, /device, /__ui-tests, detail pages) and on the pending-refresh tab. Playwright docs mark networkidle DISCOURAGED for testing: https://playwright.dev/docs/api/class-page#page-goto. scripts/verify fast passed. I skipped scripts/verify browser because another browser verify was already running.
Author
Owner

perf-gates: measured table after merging current dev (head 04adb17)

origin/dev is merged into perf-gates. The merge had no conflicts. The perf browser workload now uses dev's rule for routes that poll: DOMContentLoaded, then the route's h1, then the first inventory load (loading skeleton detached). Signed-in /, /hosts and /containers no longer use networkidle. scripts/perf/Cargo.lock also picks up the new provider-api / host-resource-client path crates.

Gates

  • INFRATERNAL_VERIFY_RUN_ID=sub-perf scripts/verify fast: exit 0. All 16 checks passed (clippy 191.5s, cargo test 165.2s).
  • scripts/verify perf --dev-vm --calibrate target/perf/base-v2.json: PASS perf: measured performance budgets (766.250s). It produced a complete baseline: 36 metrics, failures: [], head 04adb17. That baseline is now the reference for --dev-vm --baseline regression runs on this host.
  • The stage started at 00:42 IST, after a scripts/verify merge from another job finished. Host load averaged about 9–11 from other jobs during the run, so the CPU and echo figures are noisy.
  • scripts/verify merge: not run, by instruction.
  • The perf-test VM (--perf-vm) absolute A/B was not run. The figures below are dev-VM numbers and do not certify anything.
metric measured (dev VM) absolute budget absolute
server_idle_rss 32,075,776 B (30.6 MiB) ≤ 40 MiB pass
server_idle_cpu_mean 0.281 % ≤ 0.5 % pass
server_idle_cpu_p95 0.309 % ≤ 1.0 % pass
infraternal_agent_idle_rss 24,961,024 B (23.8 MiB) ≤ 15 MiB FAIL
infraternal_agent_idle_cpu_mean 0.210 % ≤ 0.5 % pass
infraternal_agent_idle_cpu_p95 1.684 % ≤ 1.0 % FAIL (host load ~10)
log_stream_memory 1,572,864 B ≤ 3 MiB pass
terminal_stream_memory 880,640 B ≤ 1.5 MiB pass
old_document_sockets 0 0 pass
old_document_channels 0 0 pass
browser_heap (10 cycles + GC) 5,784,352 B ≤ 12 MiB pass
browser_tree_rss 547,811,328 B ≤ 750 MiB pass
route_js:/ 120,695 B ≤ 120 KiB pass
route_js:/hosts 129,381 B ≤ 120 KiB FAIL
route_js:/containers 168,719 B ≤ 120 KiB FAIL
route_js:/containers/:host/:engine/:id 173,692 B ≤ 120 KiB FAIL
route_js:/__ui-tests (fixture) 143,378 B ≤ 120 KiB FAIL
route_js:/hosts/:id 121,560 B ≤ 120 KiB pass
route_js: other 12 static routes 114,923–119,211 B ≤ 120 KiB pass
container_list_p99 (500 rows) 4.832 ms ≤ 20 ms pass
conditional_304_allocated (500 rows) 344,873 B ≤ 128 KiB FAIL
echo_p99 20.1 ms ≤ 5 ms FAIL (also over the 10 ms dev limit; host load ~10)
logs_throughput 53.59 MiB/s ≥ 50 MiB/s pass
loaded_server_peak_rss (VmHWM, harness included) 30,269,440 B ≤ 64 MiB pass
binary_size (stripped release) 32,931,832 B ≤ 25,000,000 B FAIL

Fails the absolute budget today: standalone agent RSS; agent idle CPU p95 (probably host noise); cold JS on /hosts, /containers, container detail and the __ui-tests fixture; the 304 allocation; echo p99 (host load); binary size.

The 304 allocation dropped from 861,944 B (previous baseline on 035ae81) to 344,873 B on current dev. Diagnostic: spa_idle_sockets (the current document's shared socket, not a leak) was 0 in 9 cycles and 1 in 1 cycle.

Usage (see scripts/perf/README.md): on the dev VM, run scripts/verify perf --dev-vm --calibrate <new file> once on the base head. Then run scripts/verify perf --dev-vm --baseline <file> to fail on more than +10% regression (throughput: below baseline / 1.1). On the perf-test VM, run scripts/verify perf --perf-vm to enforce the absolute budgets above. Every observation prints a PERF {json} line, and the stage exits nonzero when any metric is over its limit.

## perf-gates: measured table after merging current `dev` (head `04adb17`) `origin/dev` is merged into `perf-gates`. The merge had no conflicts. The perf browser workload now uses dev's rule for routes that poll: DOMContentLoaded, then the route's h1, then the first inventory load (loading skeleton detached). Signed-in `/`, `/hosts` and `/containers` no longer use `networkidle`. `scripts/perf/Cargo.lock` also picks up the new `provider-api` / `host-resource-client` path crates. **Gates** - `INFRATERNAL_VERIFY_RUN_ID=sub-perf scripts/verify fast`: exit 0. All 16 checks passed (clippy 191.5s, cargo test 165.2s). - `scripts/verify perf --dev-vm --calibrate target/perf/base-v2.json`: `PASS perf: measured performance budgets (766.250s)`. It produced a complete baseline: 36 metrics, `failures: []`, head 04adb17. That baseline is now the reference for `--dev-vm --baseline` regression runs on this host. - The stage started at 00:42 IST, after a `scripts/verify merge` from another job finished. Host load averaged about 9–11 from other jobs during the run, so the CPU and echo figures are noisy. - `scripts/verify merge`: not run, by instruction. - The perf-test VM (`--perf-vm`) absolute A/B was **not** run. The figures below are dev-VM numbers and do not certify anything. | metric | measured (dev VM) | absolute budget | absolute | |---|---|---|---| | server_idle_rss | 32,075,776 B (30.6 MiB) | ≤ 40 MiB | pass | | server_idle_cpu_mean | 0.281 % | ≤ 0.5 % | pass | | server_idle_cpu_p95 | 0.309 % | ≤ 1.0 % | pass | | infraternal_agent_idle_rss | 24,961,024 B (23.8 MiB) | ≤ 15 MiB | **FAIL** | | infraternal_agent_idle_cpu_mean | 0.210 % | ≤ 0.5 % | pass | | infraternal_agent_idle_cpu_p95 | 1.684 % | ≤ 1.0 % | **FAIL** (host load ~10) | | log_stream_memory | 1,572,864 B | ≤ 3 MiB | pass | | terminal_stream_memory | 880,640 B | ≤ 1.5 MiB | pass | | old_document_sockets | 0 | 0 | pass | | old_document_channels | 0 | 0 | pass | | browser_heap (10 cycles + GC) | 5,784,352 B | ≤ 12 MiB | pass | | browser_tree_rss | 547,811,328 B | ≤ 750 MiB | pass | | route_js:/ | 120,695 B | ≤ 120 KiB | pass | | route_js:/hosts | 129,381 B | ≤ 120 KiB | **FAIL** | | route_js:/containers | 168,719 B | ≤ 120 KiB | **FAIL** | | route_js:/containers/:host/:engine/:id | 173,692 B | ≤ 120 KiB | **FAIL** | | route_js:/__ui-tests (fixture) | 143,378 B | ≤ 120 KiB | **FAIL** | | route_js:/hosts/:id | 121,560 B | ≤ 120 KiB | pass | | route_js: other 12 static routes | 114,923–119,211 B | ≤ 120 KiB | pass | | container_list_p99 (500 rows) | 4.832 ms | ≤ 20 ms | pass | | conditional_304_allocated (500 rows) | 344,873 B | ≤ 128 KiB | **FAIL** | | echo_p99 | 20.1 ms | ≤ 5 ms | **FAIL** (also over the 10 ms dev limit; host load ~10) | | logs_throughput | 53.59 MiB/s | ≥ 50 MiB/s | pass | | loaded_server_peak_rss (VmHWM, harness included) | 30,269,440 B | ≤ 64 MiB | pass | | binary_size (stripped release) | 32,931,832 B | ≤ 25,000,000 B | **FAIL** | **Fails the absolute budget today:** standalone agent RSS; agent idle CPU p95 (probably host noise); cold JS on `/hosts`, `/containers`, container detail and the `__ui-tests` fixture; the 304 allocation; echo p99 (host load); binary size. The 304 allocation dropped from 861,944 B (previous baseline on 035ae81) to 344,873 B on current dev. Diagnostic: `spa_idle_sockets` (the current document's shared socket, not a leak) was 0 in 9 cycles and 1 in 1 cycle. **Usage** (see `scripts/perf/README.md`): on the dev VM, run `scripts/verify perf --dev-vm --calibrate <new file>` once on the base head. Then run `scripts/verify perf --dev-vm --baseline <file>` to fail on more than +10% regression (throughput: below baseline / 1.1). On the perf-test VM, run `scripts/verify perf --perf-vm` to enforce the absolute budgets above. Every observation prints a `PERF {json}` line, and the stage exits nonzero when any metric is over its limit.
Author
Owner

Continuation after the disk-full stop. Merged origin/dev cleanly (471b6df); added a test-only diagnostic in ssh_product.rs (api() now panics with method/path/status/body when a response body does not decode). Head 0db8e9b, not pushed.

20-repeat loops, all assertions and deadlines unchanged, shared VM with another merge gate running (load5 mostly 7-11):

Test Pass Failures
ssh_product::host_trust_stream_replay_resize_close_and_changed_key (merge head) 14/20 5x detached SSH session survived token revocation beyond one second (ssh_product.rs:866); 1x session-list request returned an error body (unknown field code)
same, rerun at 0db8e9b with the decode diagnostic 17/20 3x the same 1 s revocation deadline; the error-body case did not recur
cli_mcp::cli_and_mcp_use_the_public_http_contract with INFRATERNAL_CLI_MCP_SSH_FULL_ONLY=1 15/20 4x killed-client replay compiled CLI did not exit: the PTY transcript shows __CLI_SSH_REPLAY_AFTER__, finish and exit, so remote exit 19 ran and the CLI stayed alive; 1x piped-stdin EOF did not finish within 5 s
real_sshd::pty_resize_and_replay 20/20 none

No replay-offset or replay-sleep failure occurred: every failure came after the test's synchronization point. Every CLI failure is the known product hang (the remote session has exited but the CLI never receives or acts on EXIT/EOF), which fits the server dropping zero-payload EOF frames and the SQLite lock-loss bug being fixed on wal-race. The 1 s revocation-termination deadline is the contract under test, and the check is already measured after the attachment closes, so it was left as is. The single error-body session-list response may be the same SQLite lock loss. All of these need product fixes, after which these loops should be rerun.

INFRATERNAL_VERIFY_RUN_ID=sub-flaky scripts/verify fast at 0db8e9b: exit 0, 16/16 PASS. Merge, integration and browser gates were not run in this continuation. No process this run did not start was signalled.

Continuation after the disk-full stop. Merged origin/dev cleanly (471b6df); added a test-only diagnostic in ssh_product.rs (`api()` now panics with method/path/status/body when a response body does not decode). Head **0db8e9b**, not pushed. 20-repeat loops, all assertions and deadlines unchanged, shared VM with another merge gate running (load5 mostly 7-11): | Test | Pass | Failures | |---|---:|---| | `ssh_product::host_trust_stream_replay_resize_close_and_changed_key` (merge head) | 14/20 | 5x `detached SSH session survived token revocation beyond one second` (ssh_product.rs:866); 1x session-list request returned an error body (`unknown field code`) | | same, rerun at 0db8e9b with the decode diagnostic | 17/20 | 3x the same 1 s revocation deadline; the error-body case did not recur | | `cli_mcp::cli_and_mcp_use_the_public_http_contract` with `INFRATERNAL_CLI_MCP_SSH_FULL_ONLY=1` | 15/20 | 4x killed-client replay `compiled CLI did not exit`: the PTY transcript shows `__CLI_SSH_REPLAY_AFTER__`, `finish` and `exit`, so remote `exit 19` ran and the CLI stayed alive; 1x piped-stdin EOF did not finish within 5 s | | `real_sshd::pty_resize_and_replay` | 20/20 | none | No replay-offset or replay-sleep failure occurred: every failure came after the test's synchronization point. Every CLI failure is the known product hang (the remote session has exited but the CLI never receives or acts on EXIT/EOF), which fits the server dropping zero-payload EOF frames and the SQLite lock-loss bug being fixed on wal-race. The 1 s revocation-termination deadline is the contract under test, and the check is already measured after the attachment closes, so it was left as is. The single error-body session-list response may be the same SQLite lock loss. All of these need product fixes, after which these loops should be rerun. `INFRATERNAL_VERIFY_RUN_ID=sub-flaky scripts/verify fast` at 0db8e9b: **exit 0**, 16/16 PASS. Merge, integration and browser gates were not run in this continuation. No process this run did not start was signalled.
Author
Owner

SQLite transaction hardening. Branch sqlite-txn-hardening at 4ce2d21, on top of fix-stream-teardown 3811185. Committed on the VM, not pushed.

Audit of pool.begin():

  • Read then write, converted to with_immediate_retry: consume_agent_join_token (agents.rs). It SELECTs the join token, then UPDATEs it.
  • Write first, left deferred: bootstrap_user, insert_token_with_admission (the None branch), finish_setup, update_passkey_and_issue_session, add_passkey, issue_device_session, create_plan, finish_plan, accept_agent_tunnel_nonce and rotate_remote_agent_certificate. In each, the first statement is a write. SQLite then takes the snapshot and the write lock together, under the busy handler, so the lock-upgrade failure cannot happen. This was verified on the old code: these tests passed and only enrollment failed. Tests keep it true: adding a read before the first write makes them fail.
  • Read only, unchanged: stream_authorization.

Raw BEGIN IMMEDIATE, from the security re-review: all eight are now SQLx transactions.

  • These seven use with_immediate_retry: ensure_local_host, ensure_setup_token, create_setup_ceremony, take_ceremony, refresh_session, revoke_refresh_family and claim_plan.
  • dispatch_stream_open uses pool.begin_with("BEGIN IMMEDIATE") and commits, with no retry, because its callback must run at most once.
  • finish_manual_transaction is removed. No raw BEGIN string remains in storage/.

Other fixes:

  • is_busy missed extended result codes: SQLx reports 517, 261 and 773. It now matches on the primary code (code & 0xff is 5 or 6).
  • SqliteStorage::close() now waits at most 5 s (CLOSE_DRAIN_TIMEOUT). It then logs a warn with the held-connection count and returns. The pool is already closed, so a held connection closes when it is returned.

Tests: 16 new, in crates/server/src/storage/txn_tests.rs.

  • Read then write: concurrent_agent_enrollments_commit_behind_a_concurrent_writer. Before the fix it failed with (code: 5) database is locked; now it passes.
  • Write first: concurrent_{agent_tunnel,plan,credential}_writes_… and concurrent_setup_finishes_….
  • Cancellation: cancelled_<fn>_releases_the_write_lock, one per raw-BEGIN function (8). Each aborts the call after BEGIN, then makes 8 writes with a 2 s limit each.
  • Close: close_gives_up_on_a_held_connection_after_its_bound and close_drains_an_idle_pool.
  • Busy codes: busy_classification_uses_the_primary_result_code.

Gates:

  • cargo test -p infraternal-server: all pass.
  • INFRATERNAL_VERIFY_RUN_ID=sub-sqltxn scripts/verify fast:
    • First run: FAIL fast: cargo test, at load5=19.39 on 8 CPUs. The script printed only the first 240 lines of that step and deleted its log, so the failing test is unknown.
    • Then cargo test --workspace --no-fail-fast passed (exit 0).
    • Second run, at load5=14.62: every step passed, including PASS fast: cargo test (140.698s) and PASS fast: OpenAPI and TypeScript client drift (80.927s).
**SQLite transaction hardening.** Branch `sqlite-txn-hardening` at `4ce2d21`, on top of `fix-stream-teardown` `3811185`. Committed on the VM, not pushed. **Audit of `pool.begin()`:** - **Read then write, converted to `with_immediate_retry`:** `consume_agent_join_token` (agents.rs). It SELECTs the join token, then UPDATEs it. - **Write first, left deferred:** `bootstrap_user`, `insert_token_with_admission` (the `None` branch), `finish_setup`, `update_passkey_and_issue_session`, `add_passkey`, `issue_device_session`, `create_plan`, `finish_plan`, `accept_agent_tunnel_nonce` and `rotate_remote_agent_certificate`. In each, the first statement is a write. SQLite then takes the snapshot and the write lock together, under the busy handler, so the lock-upgrade failure cannot happen. This was verified on the old code: these tests passed and only enrollment failed. Tests keep it true: adding a read before the first write makes them fail. - **Read only, unchanged:** `stream_authorization`. **Raw `BEGIN IMMEDIATE`, from the security re-review:** all eight are now SQLx transactions. - These seven use `with_immediate_retry`: `ensure_local_host`, `ensure_setup_token`, `create_setup_ceremony`, `take_ceremony`, `refresh_session`, `revoke_refresh_family` and `claim_plan`. - `dispatch_stream_open` uses `pool.begin_with("BEGIN IMMEDIATE")` and commits, with no retry, because its callback must run at most once. - `finish_manual_transaction` is removed. No raw BEGIN string remains in `storage/`. **Other fixes:** - `is_busy` missed extended result codes: SQLx reports 517, 261 and 773. It now matches on the primary code (`code & 0xff` is 5 or 6). - `SqliteStorage::close()` now waits at most 5 s (`CLOSE_DRAIN_TIMEOUT`). It then logs a `warn` with the held-connection count and returns. The pool is already closed, so a held connection closes when it is returned. **Tests:** 16 new, in `crates/server/src/storage/txn_tests.rs`. - **Read then write:** `concurrent_agent_enrollments_commit_behind_a_concurrent_writer`. Before the fix it failed with `(code: 5) database is locked`; now it passes. - **Write first:** `concurrent_{agent_tunnel,plan,credential}_writes_…` and `concurrent_setup_finishes_…`. - **Cancellation:** `cancelled_<fn>_releases_the_write_lock`, one per raw-BEGIN function (8). Each aborts the call after BEGIN, then makes 8 writes with a 2 s limit each. - **Close:** `close_gives_up_on_a_held_connection_after_its_bound` and `close_drains_an_idle_pool`. - **Busy codes:** `busy_classification_uses_the_primary_result_code`. **Gates:** - `cargo test -p infraternal-server`: all pass. - `INFRATERNAL_VERIFY_RUN_ID=sub-sqltxn scripts/verify fast`: - First run: `FAIL fast: cargo test`, at load5=19.39 on 8 CPUs. The script printed only the first 240 lines of that step and deleted its log, so the failing test is unknown. - Then `cargo test --workspace --no-fail-fast` passed (exit 0). - Second run, at load5=14.62: every step passed, including `PASS fast: cargo test (140.698s)` and `PASS fast: OpenAPI and TypeScript client drift (80.927s)`.
Author
Owner

Conditional 304 allocation (345 KB vs 128 KiB budget): fixed on perf-304-alloc 8f07e8d (base dev 72d7485, not pushed)

Root cause. It was not the handler. list_containers already compares a cheap ETag (generation plus query hash) before touching rows. The steady 304 cost is about 41 KB. The 345 KB was an outlier from opening a new SQLite connection inside the request:

  • crates/server/src/storage/mod.rs:1445 (base): authenticate_access ran the token lookup with fetch_optional(&self.pool), dropped that connection, and then :1462 called stream_authorization, which acquired again at :1652 (self.pool.begin()).
  • sqlx 0.8.6 returns a dropped connection through a spawned task (PoolConnection::drop), so the second acquire often found the idle queue empty. The pool (:3831, max 8, lazy growth) then opened a new connection on the request path.
  • Per-thread attribution with the perf glibc interposer: each outlier was about 275-325 KB on a brand-new sqlx-sqlite-worker thread (schema and page cache), plus about 40 KB of normal request work. A connection's first use cost about 50-85 KB more.

Fix.

  1. authenticate_access now runs the lookup and the grant snapshot in one transaction on one connection, through a new stream_authorization_in. Both reads also come from one snapshot.
  2. SqliteStorage::open/in_memory open every pool connection after migrations. Each connection runs the four per-request auth statements once (warm_authentication_pool), and the pool keeps its connections (idle_timeout/max_lifetime = None).
  3. I did not use min_connections: its background opens race migrations and fail with SQLITE_BUSY (that broke agent_tunnel_tls and private_storage in a first attempt).

The ETag is unchanged, so 304 correctness is unchanged.

Numbers. Dev VM diagnostics only, not perf-VM figures. Same production Server/router, same allocator.c interposer, max of 100 validated 304s:

max median
before 343-376 KB 44 KB
after (5 runs) 71.4-72.6 KB 40-41 KB

Test. crates/server/tests/conditional_304_allocations.rs is its own binary in cargo test, so it runs in fast. It re-executes itself with an unreachable DOCKER_HOST so other jobs' engine events cannot add allocations. It sends 100 304s through the full router and checks two things:

  • Rust allocations are at most 128 KiB (stats_alloc, since the workspace forbids unsafe code).
  • The SQLite worker count is 8 before the loop and does not change during it. This is the native-side check: a Rust allocator cannot see native SQLite bytes. On the old code it fails ("storage must open its whole pool before serving requests"; the pool grew 2→4 during the loop).

Gate. INFRATERNAL_VERIFY_RUN_ID=sub-304 scripts/verify fast on 8f07e8d:

WARN load5=12.86 exceeds online CPU count=8; timing-sensitive checks may be delayed
PASS fast: migrations are append-only (0.624s)
PASS fast: workspace package dependencies (1.036s)
PASS fast: JavaScript dependencies (0.016s)
PASS fast: build web app (54.560s)
PASS fast: cargo fmt --check (3.302s)
PASS fast: cargo clippy (36.571s)
PASS fast: cargo test (144.767s)
PASS fast: svelte-check (16.208s)
PASS fast: UI package svelte-check (14.182s)
PASS fast: stream package typecheck (10.548s)
PASS fast: Vitest (10.670s)
PASS fast: UI package Vitest (16.765s)
PASS fast: stream package Vitest (1.086s)
PASS fast: OpenAPI and TypeScript client drift (61.061s)
PASS fast: terminal TypeScript (3.208s)
PASS fast: terminal Vitest (1.769s)

I did not run scripts/verify perf. The real 500-container number still needs a perf-VM A/B.

**Conditional 304 allocation (345 KB vs 128 KiB budget): fixed on `perf-304-alloc` `8f07e8d`** (base `dev` `72d7485`, not pushed) **Root cause.** It was not the handler. `list_containers` already compares a cheap ETag (generation plus query hash) before touching rows. The steady 304 cost is about 41 KB. The 345 KB was an outlier from opening a new SQLite connection inside the request: - `crates/server/src/storage/mod.rs:1445` (base): `authenticate_access` ran the token lookup with `fetch_optional(&self.pool)`, dropped that connection, and then `:1462` called `stream_authorization`, which acquired again at `:1652` (`self.pool.begin()`). - sqlx 0.8.6 returns a dropped connection through a spawned task (`PoolConnection::drop`), so the second acquire often found the idle queue empty. The pool (`:3831`, max 8, lazy growth) then opened a new connection on the request path. - Per-thread attribution with the perf glibc interposer: each outlier was about 275-325 KB on a brand-new `sqlx-sqlite-worker` thread (schema and page cache), plus about 40 KB of normal request work. A connection's first use cost about 50-85 KB more. **Fix.** 1. `authenticate_access` now runs the lookup and the grant snapshot in one transaction on one connection, through a new `stream_authorization_in`. Both reads also come from one snapshot. 2. `SqliteStorage::open`/`in_memory` open every pool connection after migrations. Each connection runs the four per-request auth statements once (`warm_authentication_pool`), and the pool keeps its connections (`idle_timeout`/`max_lifetime` = `None`). 3. I did not use `min_connections`: its background opens race migrations and fail with `SQLITE_BUSY` (that broke `agent_tunnel_tls` and `private_storage` in a first attempt). The ETag is unchanged, so 304 correctness is unchanged. **Numbers.** Dev VM diagnostics only, not perf-VM figures. Same production `Server`/router, same `allocator.c` interposer, max of 100 validated 304s: | | max | median | |---|---|---| | before | 343-376 KB | 44 KB | | after (5 runs) | 71.4-72.6 KB | 40-41 KB | **Test.** `crates/server/tests/conditional_304_allocations.rs` is its own binary in `cargo test`, so it runs in fast. It re-executes itself with an unreachable `DOCKER_HOST` so other jobs' engine events cannot add allocations. It sends 100 304s through the full router and checks two things: - Rust allocations are at most 128 KiB (`stats_alloc`, since the workspace forbids unsafe code). - The SQLite worker count is 8 before the loop and does not change during it. This is the native-side check: a Rust allocator cannot see native SQLite bytes. On the old code it fails ("storage must open its whole pool before serving requests"; the pool grew 2→4 during the loop). **Gate.** `INFRATERNAL_VERIFY_RUN_ID=sub-304 scripts/verify fast` on `8f07e8d`: ``` WARN load5=12.86 exceeds online CPU count=8; timing-sensitive checks may be delayed PASS fast: migrations are append-only (0.624s) PASS fast: workspace package dependencies (1.036s) PASS fast: JavaScript dependencies (0.016s) PASS fast: build web app (54.560s) PASS fast: cargo fmt --check (3.302s) PASS fast: cargo clippy (36.571s) PASS fast: cargo test (144.767s) PASS fast: svelte-check (16.208s) PASS fast: UI package svelte-check (14.182s) PASS fast: stream package typecheck (10.548s) PASS fast: Vitest (10.670s) PASS fast: UI package Vitest (16.765s) PASS fast: stream package Vitest (1.086s) PASS fast: OpenAPI and TypeScript client drift (61.061s) PASS fast: terminal TypeScript (3.208s) PASS fast: terminal Vitest (1.769s) ``` I did not run `scripts/verify perf`. The real 500-container number still needs a perf-VM A/B.
Author
Owner

perf-agent-rss: standalone infraternal agent idle RSS (branch perf-agent-rss, commit e39f453, based on 72d7485; not pushed)

I measured with the perf harness's own agent step: browserMetrics up to infraternal_agent_idle_rss, which takes the max VmRSS over 60 one-second samples. These are dev VM numbers, not reportable ones.

Before (72d7485): 16.2, 16.5 and 17.3 MiB. The 23.8 MiB in this issue came from a loaded run on 04adb17.
After: 14.94, 15.07, 15.08, 15.22 and 15.29 MiB, so about 15.1 MiB on average, a cut of about 1.4 MiB. It is not reliably under 15 MiB.

Where the RSS is (smaps and pagemap, before)

part resident
executable .text (201 fully mapped 64 KiB fault-around windows out of 23 MiB) 9.6–10.4 MiB
.rela.dyn (50k relative relocations, read by ld.so) 1.2 MiB
.rodata 1.15 MiB
.data.rel.ro, dirtied by relocation (mostly OpenSSL and aws-lc tables) 0.9 MiB
libc + libm + ld.so + libgcc 2.5 MiB
heap + 15 thread stacks and arenas + main stack about 1.2 MiB

Anonymous memory is small. The tokio pools, bollard/hyper pools, provider snapshots (9 containers on the host) and rustls roots (the agent loads only its CA, no webpki or native roots) are all minor. Ablation: without engines the agent is 13.2 MiB, mostly less text; key generation versus an existing key makes no difference. About 1.1 MiB of resident text is server-only crates (rmcp, axum, sqlx, webauthn, zbus). The agent never runs them; fat LTO places them next to code it does run.

Changes

  1. RELR relocations (-z pack-relative-relocs in crates/infraternal/build.rs). Saves about 1.2 MiB RSS. The binary shrinks by 1.18 MB (33,475,832 → 32,300,352 B). PIE/ASLR are unchanged. This needs glibc 2.36 or newer; the deploy baseline is Ubuntu 24.04 with 2.39 (noted in DEPLOY.md). A test reads the ELF dynamic section.
  2. Threads. agent run uses 2 tokio workers instead of one per core, and each engine's exec-cleanup runtime uses 1 worker instead of 2. The agent drops from 15 to 7 threads, saving about 0.25 MiB.
  3. THP opt-out for agent run (prctl(PR_SET_THP_DISABLE) through nix). This host has THP always, thp_fault_alloc at 6M and khugepaged max_ptes_none=511, so a sparse arena or stack can become a 2 MiB page. A long-running infraternal server on this host has 18 MiB of its 30 MiB RSS in huge pages. My runs had none (MemFree was low), so this change caps variance like the 23.8 MiB run rather than lowering the median.

INFRATERNAL_VERIFY_RUN_ID=sub-rss scripts/verify fast: all 16 checks pass.

Tried and dropped

Boxing the main future saved 28 KiB. -z keep-text-section-prefix made no difference, because .text.unlikely is only 0.9 MiB. lld --icf=safe would fold nothing because rustc emits no addrsig, and --icf=all can merge distinct statics. Making SSH lazy would undo the deliberate rule that corrupt host keys are rejected at startup.

Going reliably under 15 MiB needs an owner decision

  • opt-level s or z for the release profile. This shrinks the text that drives the fault-around windows and would also help the 25 MB binary budget. Server throughput and echo budgets must be re-checked. Not measured.
  • Non-PIE: drops the 0.9 MiB of relocated .data.rel.ro, but the executable loses ASLR.
  • Link ordering (a symbol-ordering file or PGO): the largest potential win, but the ordering file goes stale as code changes.
  • Dropping startup-only text mappings with madvise: needs unsafe, which the workspace forbids.
  • Or re-baseline the agent budget to about 16 MiB.
## perf-agent-rss: standalone infraternal agent idle RSS (branch `perf-agent-rss`, commit `e39f453`, based on `72d7485`; not pushed) I measured with the perf harness's own agent step: `browserMetrics` up to `infraternal_agent_idle_rss`, which takes the max `VmRSS` over 60 one-second samples. These are dev VM numbers, not reportable ones. **Before (72d7485):** 16.2, 16.5 and 17.3 MiB. The 23.8 MiB in this issue came from a loaded run on 04adb17. **After:** 14.94, 15.07, 15.08, 15.22 and 15.29 MiB, so about 15.1 MiB on average, a cut of about 1.4 MiB. **It is not reliably under 15 MiB.** ### Where the RSS is (smaps and pagemap, before) | part | resident | |---|---| | executable `.text` (201 fully mapped 64 KiB fault-around windows out of 23 MiB) | 9.6–10.4 MiB | | `.rela.dyn` (50k relative relocations, read by ld.so) | 1.2 MiB | | `.rodata` | 1.15 MiB | | `.data.rel.ro`, dirtied by relocation (mostly OpenSSL and aws-lc tables) | 0.9 MiB | | libc + libm + ld.so + libgcc | 2.5 MiB | | heap + 15 thread stacks and arenas + main stack | about 1.2 MiB | Anonymous memory is small. The tokio pools, bollard/hyper pools, provider snapshots (9 containers on the host) and rustls roots (the agent loads only its CA, no webpki or native roots) are all minor. Ablation: without engines the agent is 13.2 MiB, mostly less text; key generation versus an existing key makes no difference. About 1.1 MiB of resident text is server-only crates (rmcp, axum, sqlx, webauthn, zbus). The agent never runs them; fat LTO places them next to code it does run. ### Changes 1. **RELR relocations** (`-z pack-relative-relocs` in `crates/infraternal/build.rs`). Saves about 1.2 MiB RSS. The binary shrinks by 1.18 MB (33,475,832 → 32,300,352 B). PIE/ASLR are unchanged. This needs glibc 2.36 or newer; the deploy baseline is Ubuntu 24.04 with 2.39 (noted in DEPLOY.md). A test reads the ELF dynamic section. 2. **Threads.** `agent run` uses 2 tokio workers instead of one per core, and each engine's exec-cleanup runtime uses 1 worker instead of 2. The agent drops from 15 to 7 threads, saving about 0.25 MiB. 3. **THP opt-out for `agent run`** (`prctl(PR_SET_THP_DISABLE)` through nix). This host has THP `always`, `thp_fault_alloc` at 6M and khugepaged `max_ptes_none=511`, so a sparse arena or stack can become a 2 MiB page. A long-running `infraternal server` on this host has **18 MiB of its 30 MiB RSS in huge pages**. My runs had none (MemFree was low), so this change caps variance like the 23.8 MiB run rather than lowering the median. `INFRATERNAL_VERIFY_RUN_ID=sub-rss scripts/verify fast`: all 16 checks pass. ### Tried and dropped Boxing the main future saved 28 KiB. `-z keep-text-section-prefix` made no difference, because `.text.unlikely` is only 0.9 MiB. lld `--icf=safe` would fold nothing because rustc emits no addrsig, and `--icf=all` can merge distinct statics. Making SSH lazy would undo the deliberate rule that corrupt host keys are rejected at startup. ### Going reliably under 15 MiB needs an owner decision - **opt-level `s` or `z`** for the release profile. This shrinks the text that drives the fault-around windows and would also help the 25 MB binary budget. Server throughput and echo budgets must be re-checked. Not measured. - **Non-PIE**: drops the 0.9 MiB of relocated `.data.rel.ro`, but the executable loses ASLR. - **Link ordering** (a symbol-ordering file or PGO): the largest potential win, but the ordering file goes stale as code changes. - **Dropping startup-only text mappings with `madvise`**: needs `unsafe`, which the workspace forbids. - Or re-baseline the agent budget to about 16 MiB.
Author
Owner

Starting contract-drift-rest on branch contract-drift-rest, base head 450c297354f4d2f07c84ace930949a6bacdbb900 (origin/dev). Scope: D9, D11–D14 (configured access lifetime only), D16, and D18 from the contract drift review. I’ll regenerate OpenAPI and the TypeScript client, add targeted tests, and run INFRATERAL_VERIFY_RUN_ID=contract-drift-rest scripts/verify fast as requested.

Starting contract-drift-rest on branch `contract-drift-rest`, base head `450c297354f4d2f07c84ace930949a6bacdbb900` (origin/dev). Scope: D9, D11–D14 (configured access lifetime only), D16, and D18 from the contract drift review. I’ll regenerate OpenAPI and the TypeScript client, add targeted tests, and run `INFRATERAL_VERIFY_RUN_ID=contract-drift-rest scripts/verify fast` as requested.
Author
Owner

Starting perf-guards-nightly on branch perf-guards-nightly, based on origin/dev at 450c297354f4d2f07c84ace930949a6bacdbb900.

Starting perf-guards-nightly on branch `perf-guards-nightly`, based on `origin/dev` at `450c297354f4d2f07c84ace930949a6bacdbb900`.
Author
Owner

Starting ops-install-restore on branch ops-install-restore at base 450c297354. Scope: generic server/remote infraternal agent installation, offline validated atomic restore, nightly backup/restore and prior-binary upgrade smoke, operator documentation. Required final gate: lean scripts/verify fast; central orchestrator owns merge gate.

Starting ops-install-restore on branch ops-install-restore at base 450c297354f4d2f07c84ace930949a6bacdbb900. Scope: generic server/remote infraternal agent installation, offline validated atomic restore, nightly backup/restore and prior-binary upgrade smoke, operator documentation. Required final gate: lean scripts/verify fast; central orchestrator owns merge gate.
Author
Owner

Implementation findings (#48):

  • code-review-graph search SqliteStorage initially returned 0 nodes while rebuild ran. Rebuild succeeded: Full build: 521 files, 5356 nodes, 75296 edges (postprocess=full). Subsequent search returns storage open/backup/call sites. Used rg after the initially empty graph.
  • Backup CLI currently calls SqliteStorage::open; this job leaves that open path untouched for storage-postmerge-fixes. Ordinary storage opens will share a persistent sibling .lock lease; offline restore requires its exclusive lease. Older binaries/external SQLite programs do not honor it and must be stopped explicitly.
  • Restore validates a private staged standalone snapshot with read-only immutable SQLite, integrity_check, known successful migration prefix/checksums and a reconstructed in-memory schema. No migrations on either on-disk input. The previous main/WAL/SHM/journal set is preserved; a durable .restore-pending marker fences startup across interrupted file-set publication.
  • Prior-binary baseline chosen from actual ancestor history: e339ad192d (Merge CLI and MCP parity). No release tags exist. Its SQLite migration files have no diff versus base 450c2973; the operations stage will prove real binary replacement/state retention on this compatible lineage, not claim a schema migration that did not occur. Unit tests separately exercise an older migration prefix.

Platform sources: Rust file locks (stable since 1.89): https://doc.rust-lang.org/src/std/fs.rs.html ; SQLite WAL and preservation: https://www.sqlite.org/wal.html and https://www.sqlite.org/howtocorrupt.html ; SQLx immutable/read-only options: https://docs.rs/sqlx/0.8.6/sqlx/sqlite/struct.SqliteConnectOptions.html ; systemd configuration/state directory behavior: https://www.freedesktop.org/software/systemd/man/latest/systemd.exec.html .

Implementation findings (#48): - `code-review-graph search SqliteStorage` initially returned 0 nodes while rebuild ran. Rebuild succeeded: `Full build: 521 files, 5356 nodes, 75296 edges (postprocess=full)`. Subsequent search returns storage open/backup/call sites. Used rg after the initially empty graph. - Backup CLI currently calls `SqliteStorage::open`; this job leaves that open path untouched for storage-postmerge-fixes. Ordinary storage opens will share a persistent sibling `.lock` lease; offline restore requires its exclusive lease. Older binaries/external SQLite programs do not honor it and must be stopped explicitly. - Restore validates a private staged standalone snapshot with read-only immutable SQLite, integrity_check, known successful migration prefix/checksums and a reconstructed in-memory schema. No migrations on either on-disk input. The previous main/WAL/SHM/journal set is preserved; a durable `.restore-pending` marker fences startup across interrupted file-set publication. - Prior-binary baseline chosen from actual ancestor history: e339ad192d9ebfbf9feebe4e725becb138c0c4b4 (`Merge CLI and MCP parity`). No release tags exist. Its SQLite migration files have no diff versus base 450c2973; the operations stage will prove real binary replacement/state retention on this compatible lineage, not claim a schema migration that did not occur. Unit tests separately exercise an older migration prefix. Platform sources: Rust file locks (stable since 1.89): https://doc.rust-lang.org/src/std/fs.rs.html ; SQLite WAL and preservation: https://www.sqlite.org/wal.html and https://www.sqlite.org/howtocorrupt.html ; SQLx immutable/read-only options: https://docs.rs/sqlx/0.8.6/sqlx/sqlite/struct.SqliteConnectOptions.html ; systemd configuration/state directory behavior: https://www.freedesktop.org/software/systemd/man/latest/systemd.exec.html .
Author
Owner

Baseline findings from 450c297354f4d2f07c84ace930949a6bacdbb900:

  • SqliteStorage::admit_stream_data acquires a connection, starts BEGIN IMMEDIATE, validates the authorization snapshot, enqueues, and commits for each DATA call. The stream connection invokes it once for each inbound DATA frame.
  • stream/relay.rs::forward_to_client slices bulk DATA payloads as Bytes, then re-encodes each outgoing frame. This copies payload bytes once during encode; tests can enforce the current one-copy ceiling through the relay and writer.
  • tunnel.rs::run_tunnel deserializes each inventory row into InventoryItemPayload.container: Value, then deserializes that value into Container, retaining the intermediate allocation round-trip.
Baseline findings from `450c297354f4d2f07c84ace930949a6bacdbb900`: - `SqliteStorage::admit_stream_data` acquires a connection, starts `BEGIN IMMEDIATE`, validates the authorization snapshot, enqueues, and commits for each DATA call. The stream connection invokes it once for each inbound DATA frame. - `stream/relay.rs::forward_to_client` slices bulk DATA payloads as `Bytes`, then re-encodes each outgoing frame. This copies payload bytes once during encode; tests can enforce the current one-copy ceiling through the relay and writer. - `tunnel.rs::run_tunnel` deserializes each inventory row into `InventoryItemPayload.container: Value`, then deserializes that value into `Container`, retaining the intermediate allocation round-trip.
Author
Owner

The login-start idempotency scope uses a separate admission flag from its replay lifetime: setting owner_admission also selects the per-scope owner quota, while unknown usernames remain in the anonymous capability pool. I split the short 5-minute lifetime from quota selection and extended the unknown-user test to assert it stays in the anonymous pool.

The login-start idempotency scope uses a separate admission flag from its replay lifetime: setting `owner_admission` also selects the per-scope owner quota, while unknown usernames remain in the anonymous capability pool. I split the short 5-minute lifetime from quota selection and extended the unknown-user test to assert it stays in the anonymous pool.
Author
Owner

Independent read-only defensive correctness review for #48

Branch: ops-install-restore. Base and HEAD: 450c297354. Reviewed the working diff and untracked operational source/templates/tests, using the existing code-review graph for orientation and the repository operating/design/storage contracts. No author conclusions or issue comments read. No source changes, commits, expensive builds, host service installation, network changes, or process signals.

  1. P1 — Keep the operation lease until native SQLite close finishes. crates/server/src/storage/mod.rs:4107–4112 retains the native-worker lease in the rollback-hook closure. SQLx 0.8.6's ConnectionState::drop removes that hook and destroys its closure before its ConnectionHandle field runs sqlite3_close. When the last storage/pool is dropped without a completed drain, idle connections shut down asynchronously; once pool/storage captures disappear, the hook can own the final lease reference. Its destructor releases the shared lease while the last native database handle still exists.

    Concrete failing interleaving: drop the final storage/pool; suspend its last worker after rollback-hook removal and before native close; a second process can now acquire restore's exclusive lease and start reading/moving the old file set; resume the old worker, whose SQLite close can checkpoint and remove WAL/SHM concurrently. This violates restore exclusion and can invalidate preserved main/sidecar bytes or disrupt file-set publication. The existing checked-out-connection timeout test does not cover this destructor boundary. Keep an independent lease owner through acknowledged native shutdown, and add a deterministic teardown-boundary refusal test.

    This is a static interleaving finding, not a claim of an executed runtime reproduction. Official primary-source evidence: SQLx ConnectionState destructor, hook closure destruction, subsequent native close, pool teardown and field ownership, and SQLite final-connection checkpoint behavior.

Disposition: one blocking correctness finding. No additional blocking findings established in schema-prefix validation, publication/rollback order and pending-marker durability, descriptor link/owner checks, documented CLI/enrollment commands, service templates, or prior-version lineage/state assertions. The backup CLI open path is unchanged.

Lightweight independent checks only (no merge gate requested/run):

Python AST parse: PASS
Bash syntax check (operations.sh): 0
Pinned prior source is a distinct ancestor: PASS

Pinned prior source: e339ad192d, an actual earlier ancestor with two parents. The smoke archives/builds that source and its web assets, starts the prior binary on scratch state, and checks retained host data, migration-history prefix and integrity through the candidate before actual binary backup/restore.

Concurrent edits: restore.rs changed validation from a pool to an explicitly closed single connection; restore/tests.rs removed diagnostic prints. Both changes were independently re-reviewed. No finding was invalidated by these edits; the outstanding finding is in unchanged storage/mod.rs. Untracked pycache is generated material, excluded from source review and unsuitable for commit.

Reviewed content SHA-256 (working files, not a committed branch head):

a4bf5f3594ca08dff57e02dc209991717ad7f8d50947019213aab64e8df12009  crates/infraternal/src/main.rs
4f733baa6564b52daee32ef0c14723bc1d590d16917dbc988ed5af06c4901243  crates/server/src/storage/mod.rs
74fc7d7da2468df3cf143fa1681fa8431accba1e364cccfdf61090d7d5d4434d  docs/DEPLOY.md
1dd8058e5067d57eee96f13b623a280a09f0074aed3b7dbc6a6e6adf26a9a856  docs/DESIGN.md
b7393eef17b2c90afb18cef894f1fde74fac6f63a7cf8e0bafc8522f15a9158a  docs/PLAN.md
fad4ea2e5dc2e0a4f561c0c94b2f11a350a08323779e78d0e763a187d25c4f16  docs/contracts.md
f493992bba036e0a025a7b2ba5fb951ac951f58e77054141f6c117c640ddfdfb  scripts/verify
32b274a0b9196a34524da4ceeb9742b1264ea636175a14a43dd50a905151550d  crates/server/src/storage/restore.rs
df6c6bcca15dc5db5ceeaf5674547bacf20b92dee4402f14ad4b6fac7a36dbf9  crates/server/src/storage/restore/tests.rs
41ed98db379aac90dd518ed215413c4bd50e731d28aa7f96b4e63a39e9d17259  deploy/systemd/infraternal-agent.service
68c341e6b76a91917967860dea996ef9d0aa083df56967bb28c386595ce87315  deploy/systemd/infraternal.service
fa65db6fc28c0c67cb97ab50832db0d272cbd4eb1ee76faa4a0905a191ccac5b  deploy/systemd/remote.env
0e090deb25130cbc1cba43f145e942a7359eacc03d9d5187d86de3f45fb8148e  deploy/systemd/server.env
0147fa7499b09d2aa664afc784dbbf5352038040dc9ce2108307c996a328218c  scripts/tests/operations.py
11b88d2dc08fcc4f712cf92d7c1d57e0d06d101916c368495b5552749981cd86  scripts/tests/operations.sh

Local incremental evidence: /tmp/infraternal-ops-install-restore-review/findings.md; frozen reviewed content: snapshot/; initial and final SHA-256 manifests: initial-hashes.json and hashes.json.

Independent read-only defensive correctness review for #48 Branch: ops-install-restore. Base and HEAD: 450c297354f4d2f07c84ace930949a6bacdbb900. Reviewed the working diff and untracked operational source/templates/tests, using the existing code-review graph for orientation and the repository operating/design/storage contracts. No author conclusions or issue comments read. No source changes, commits, expensive builds, host service installation, network changes, or process signals. 1. **P1 — Keep the operation lease until native SQLite close finishes.** `crates/server/src/storage/mod.rs:4107–4112` retains the native-worker lease in the rollback-hook closure. SQLx 0.8.6's `ConnectionState::drop` removes that hook and destroys its closure *before* its `ConnectionHandle` field runs `sqlite3_close`. When the last storage/pool is dropped without a completed drain, idle connections shut down asynchronously; once pool/storage captures disappear, the hook can own the final lease reference. Its destructor releases the shared lease while the last native database handle still exists. Concrete failing interleaving: drop the final storage/pool; suspend its last worker after rollback-hook removal and before native close; a second process can now acquire restore's exclusive lease and start reading/moving the old file set; resume the old worker, whose SQLite close can checkpoint and remove WAL/SHM concurrently. This violates restore exclusion and can invalidate preserved main/sidecar bytes or disrupt file-set publication. The existing checked-out-connection timeout test does not cover this destructor boundary. Keep an independent lease owner through acknowledged native shutdown, and add a deterministic teardown-boundary refusal test. This is a static interleaving finding, not a claim of an executed runtime reproduction. Official primary-source evidence: [SQLx ConnectionState destructor](https://github.com/launchbadge/sqlx/blob/v0.8.6/sqlx-sqlite/src/connection/mod.rs#L519-L527), [hook closure destruction](https://github.com/launchbadge/sqlx/blob/v0.8.6/sqlx-sqlite/src/connection/mod.rs#L151-L157), [subsequent native close](https://github.com/launchbadge/sqlx/blob/v0.8.6/sqlx-sqlite/src/connection/handle.rs#L80-L90), [pool teardown and field ownership](https://github.com/launchbadge/sqlx/blob/v0.8.6/sqlx-core/src/pool/inner.rs#L23-L34), and [SQLite final-connection checkpoint behavior](https://www.sqlite.org/wal.html#automatic_checkpoint). **Disposition: one blocking correctness finding.** No additional blocking findings established in schema-prefix validation, publication/rollback order and pending-marker durability, descriptor link/owner checks, documented CLI/enrollment commands, service templates, or prior-version lineage/state assertions. The backup CLI open path is unchanged. Lightweight independent checks only (no merge gate requested/run): ``` Python AST parse: PASS Bash syntax check (operations.sh): 0 Pinned prior source is a distinct ancestor: PASS ``` Pinned prior source: e339ad192d9ebfbf9feebe4e725becb138c0c4b4, an actual earlier ancestor with two parents. The smoke archives/builds that source and its web assets, starts the prior binary on scratch state, and checks retained host data, migration-history prefix and integrity through the candidate before actual binary backup/restore. Concurrent edits: restore.rs changed validation from a pool to an explicitly closed single connection; restore/tests.rs removed diagnostic prints. Both changes were independently re-reviewed. **No finding was invalidated by these edits**; the outstanding finding is in unchanged storage/mod.rs. Untracked __pycache__ is generated material, excluded from source review and unsuitable for commit. Reviewed content SHA-256 (working files, not a committed branch head): ``` a4bf5f3594ca08dff57e02dc209991717ad7f8d50947019213aab64e8df12009 crates/infraternal/src/main.rs 4f733baa6564b52daee32ef0c14723bc1d590d16917dbc988ed5af06c4901243 crates/server/src/storage/mod.rs 74fc7d7da2468df3cf143fa1681fa8431accba1e364cccfdf61090d7d5d4434d docs/DEPLOY.md 1dd8058e5067d57eee96f13b623a280a09f0074aed3b7dbc6a6e6adf26a9a856 docs/DESIGN.md b7393eef17b2c90afb18cef894f1fde74fac6f63a7cf8e0bafc8522f15a9158a docs/PLAN.md fad4ea2e5dc2e0a4f561c0c94b2f11a350a08323779e78d0e763a187d25c4f16 docs/contracts.md f493992bba036e0a025a7b2ba5fb951ac951f58e77054141f6c117c640ddfdfb scripts/verify 32b274a0b9196a34524da4ceeb9742b1264ea636175a14a43dd50a905151550d crates/server/src/storage/restore.rs df6c6bcca15dc5db5ceeaf5674547bacf20b92dee4402f14ad4b6fac7a36dbf9 crates/server/src/storage/restore/tests.rs 41ed98db379aac90dd518ed215413c4bd50e731d28aa7f96b4e63a39e9d17259 deploy/systemd/infraternal-agent.service 68c341e6b76a91917967860dea996ef9d0aa083df56967bb28c386595ce87315 deploy/systemd/infraternal.service fa65db6fc28c0c67cb97ab50832db0d272cbd4eb1ee76faa4a0905a191ccac5b deploy/systemd/remote.env 0e090deb25130cbc1cba43f145e942a7359eacc03d9d5187d86de3f45fb8148e deploy/systemd/server.env 0147fa7499b09d2aa664afc784dbbf5352038040dc9ce2108307c996a328218c scripts/tests/operations.py 11b88d2dc08fcc4f712cf92d7c1d57e0d06d101916c368495b5552749981cd86 scripts/tests/operations.sh ``` Local incremental evidence: /tmp/infraternal-ops-install-restore-review/findings.md; frozen reviewed content: snapshot/; initial and final SHA-256 manifests: initial-hashes.json and hashes.json.
Author
Owner

Restore implementation and focused verification update:

  • Added seven real-SQLite cases: snapshot/mutate/restore; idle-open/cloned storage refusal; corrupt/unknown/dirty/changed/missing migration history and altered schema rejection; compatible older migration prefix without validation migrations; links/sidecars/pending marker refusal; lease retention through timed-out close; real rename failure restoring moved sidecars and retaining main bytes.
  • First test compilation exposed the actual ULID 3 constructor (generate, not new), corrected after checking repository usage and https://docs.rs/ulid/3.0.0/ulid/struct.Ulid.html . A preliminary direct Cargo attempt lacked embedded web assets; subsequent runs use the gate runner's web prerequisite.
  • A pooled-validation rejection test hung on one run. Its owned test process was terminated; the diagnostic rerun passed. Removed the new offline validation pool/drain loop entirely: a single explicit read-only immutable SQLite connection now closes through SQLx's awaited worker shutdown, as documented/implemented in https://github.com/launchbadge/sqlx/blob/v0.8.6/sqlx-sqlite/src/connection/mod.rs . This avoids introducing pooled retries/drain races into one-shot restore. Backup's open path remains untouched.
  • Static systemd template verification returned exit 0 without installation. The operations tier also validates their actual CLI arguments. No host services installed, no networking changes, no other processes signalled.

Current scripts/verify operations output so far (lean settings, nice 15):

WARN load5=40.41 exceeds online CPU count=8; timing-sensitive checks may be delayed
PASS prepare: JavaScript dependencies (0.052s)
PASS operations-storage: build web app (40.632s)
test result: ok. 7 passed; 0 failed; 0 ignored; 0 measured; 107 filtered out; finished in 2.41s
PASS operations-storage: SQLite restore unit tests (54.913s)

Actual current/prior-binary stage and final fast remain in progress/unrun respectively.

Restore implementation and focused verification update: - Added seven real-SQLite cases: snapshot/mutate/restore; idle-open/cloned storage refusal; corrupt/unknown/dirty/changed/missing migration history and altered schema rejection; compatible older migration prefix without validation migrations; links/sidecars/pending marker refusal; lease retention through timed-out close; real rename failure restoring moved sidecars and retaining main bytes. - First test compilation exposed the actual ULID 3 constructor (`generate`, not `new`), corrected after checking repository usage and https://docs.rs/ulid/3.0.0/ulid/struct.Ulid.html . A preliminary direct Cargo attempt lacked embedded web assets; subsequent runs use the gate runner's web prerequisite. - A pooled-validation rejection test hung on one run. Its owned test process was terminated; the diagnostic rerun passed. Removed the new offline validation pool/drain loop entirely: a single explicit read-only immutable SQLite connection now closes through SQLx's awaited worker shutdown, as documented/implemented in https://github.com/launchbadge/sqlx/blob/v0.8.6/sqlx-sqlite/src/connection/mod.rs . This avoids introducing pooled retries/drain races into one-shot restore. Backup's open path remains untouched. - Static systemd template verification returned exit 0 without installation. The operations tier also validates their actual CLI arguments. No host services installed, no networking changes, no other processes signalled. Current `scripts/verify operations` output so far (lean settings, nice 15): ``` WARN load5=40.41 exceeds online CPU count=8; timing-sensitive checks may be delayed PASS prepare: JavaScript dependencies (0.052s) PASS operations-storage: build web app (40.632s) test result: ok. 7 passed; 0 failed; 0 ignored; 0 measured; 107 filtered out; finished in 2.41s PASS operations-storage: SQLite restore unit tests (54.913s) ``` Actual current/prior-binary stage and final fast remain in progress/unrun respectively.
Author
Owner

Durable idempotency rows may outlive a release, so accepting lowercase keys only in the request parser would make pre-upgrade replays miss their old rows. Migration 22 uppercases retained keys; case-collision groups are reduced to one unknown row so a retry cannot repeat an ambiguous mutation. The plan pre-lock authorization mismatch now records ready → failed and skipped target outcome atomically, matching the proto state model and contract.

Durable idempotency rows may outlive a release, so accepting lowercase keys only in the request parser would make pre-upgrade replays miss their old rows. Migration 22 uppercases retained keys; case-collision groups are reduced to one `unknown` row so a retry cannot repeat an ambiguous mutation. The plan pre-lock authorization mismatch now records `ready → failed` and `skipped` target outcome atomically, matching the proto state model and contract.
Author
Owner

G1 now counts successful BEGIN IMMEDIATE admissions reached through run_connection: the baseline assertion is one transaction per DATA frame, and the ignored follow-up records the ≤N/8 target. The existing s0.rs benchmark is a Criterion smoke with no pass/fail budget evaluator; a wall-clock threshold there would be nondeterministic on this shared VM, so the deterministic transaction-count guard remains the gate.

The perf harness idle window now combines 20 run-labeled Docker healthchecks that alternate state every five seconds with one idle stream connection; /proc/<pid>/status context-switch deltas produce idle_wakeups_per_s. The 20 exact IDs are removed after the measurement, and the run's signal cleanup also removes its labeled fixtures. The Chromium stream workload now measures a 64 MiB non-TTY stdin upload into cat >/dev/null against the existing 50 MB/s terminal-ingest budget. Nightly now invokes the existing e2e/remote/ suite; merge remains unchanged.

G1 now counts successful `BEGIN IMMEDIATE` admissions reached through `run_connection`: the baseline assertion is one transaction per DATA frame, and the ignored follow-up records the ≤N/8 target. The existing `s0.rs` benchmark is a Criterion smoke with no pass/fail budget evaluator; a wall-clock threshold there would be nondeterministic on this shared VM, so the deterministic transaction-count guard remains the gate. The perf harness idle window now combines 20 run-labeled Docker healthchecks that alternate state every five seconds with one idle stream connection; `/proc/<pid>/status` context-switch deltas produce `idle_wakeups_per_s`. The 20 exact IDs are removed after the measurement, and the run's signal cleanup also removes its labeled fixtures. The Chromium stream workload now measures a 64 MiB non-TTY stdin upload into `cat >/dev/null` against the existing 50 MB/s terminal-ingest budget. Nightly now invokes the existing `e2e/remote/` suite; merge remains unchanged.
Author
Owner

The legacy case-collision migration now retains the maximum expiry across the whole normalized-key group before deleting duplicates; otherwise an expired canonical row could erase a still-live lowercase replay fence. The migration test seeds an expired uppercase survivor plus live mixed/lowercase variants and asserts one unknown canonical row retains the latest expiry. Runtime parsing also rejects ULID overflow spellings whose serialized ID differs from the uppercase input, keeping SQL migration and request normalization equivalent.

The legacy case-collision migration now retains the maximum expiry across the whole normalized-key group before deleting duplicates; otherwise an expired canonical row could erase a still-live lowercase replay fence. The migration test seeds an expired uppercase survivor plus live mixed/lowercase variants and asserts one `unknown` canonical row retains the latest expiry. Runtime parsing also rejects ULID overflow spellings whose serialized ID differs from the uppercase input, keeping SQL migration and request normalization equivalent.
Author
Owner

Starting contract-drift-rest on branch contract-drift-rest, base head 450c297354f4d2f07c84ace930949a6bacdbb900 (origin/dev). Scope: D9, D11–D14 (configured access lifetime only), D16, and D18 from the contract drift review. I’ll regenerate OpenAPI and the TypeScript client, add targeted tests, and run INFRATERAL_VERIFY_RUN_ID=contract-drift-rest scripts/verify fast as requested.

Starting contract-drift-rest on branch `contract-drift-rest`, base head `450c297354f4d2f07c84ace930949a6bacdbb900` (origin/dev). Scope: D9, D11–D14 (configured access lifetime only), D16, and D18 from the contract drift review. I’ll regenerate OpenAPI and the TypeScript client, add targeted tests, and run `INFRATERAL_VERIFY_RUN_ID=contract-drift-rest scripts/verify fast` as requested.
Author
Owner

Starting issue #48 work on branch contract-drift-rest, based at 450c297354f4d2f07c84ace930949a6bacdbb900 (current origin/dev is 0d8e41a108cf1169e08b9b1473df99e55da276d1). I’m reviewing the interrupted worktree edits first, then I’ll finish only D9, D11–D14 (configured access lifetime only), D16 and D18 items in scope. Disk check: 23 GB available on /mnt/hdd.

Starting issue #48 work on branch `contract-drift-rest`, based at `450c297354f4d2f07c84ace930949a6bacdbb900` (current `origin/dev` is `0d8e41a108cf1169e08b9b1473df99e55da276d1`). I’m reviewing the interrupted worktree edits first, then I’ll finish only D9, D11–D14 (configured access lifetime only), D16 and D18 items in scope. Disk check: 23 GB available on `/mnt/hdd`.
Author
Owner

Started work on branch perf-guards-nightly from base 450c297354f4d2f07c84ace930949a6bacdbb900. This resumed run is reviewing and completing the existing uncommitted mechanical performance guards for G1, G2, G6, metrics scenarios, and nightly remote parity. Disk check: 23 GB available on /mnt/hdd.

Started work on branch `perf-guards-nightly` from base `450c297354f4d2f07c84ace930949a6bacdbb900`. This resumed run is reviewing and completing the existing uncommitted mechanical performance guards for G1, G2, G6, metrics scenarios, and nightly remote parity. Disk check: 23 GB available on /mnt/hdd.
Author
Owner

Review finding: the current s0 Criterion bench has no absolute threshold or output consumer that could fail a gate on its timing; scripts/verify bench runs it as a reporting smoke. I kept its timing informational and enforce G1 with deterministic transaction-count assertions plus the existing end-to-end stdin throughput gate. The inherited stdin benchmark branch was also wired to the logs flag instead of the upload flag; it is now separated so the quiet no-logs run measures the 64 MiB upload.

Review finding: the current `s0` Criterion bench has no absolute threshold or output consumer that could fail a gate on its timing; `scripts/verify bench` runs it as a reporting smoke. I kept its timing informational and enforce G1 with deterministic transaction-count assertions plus the existing end-to-end stdin throughput gate. The inherited stdin benchmark branch was also wired to the logs flag instead of the upload flag; it is now separated so the quiet no-logs run measures the 64 MiB upload.
Author
Owner

Final verification finding (#48):

The corrected operations tier passed all seven SQLite tests and the actual current/prior-binary drill (including committed crash-WAL preservation and restart). Final template syntax verification also passed after retaining optional engine startup ordering.

The fast tier passed Clippy, then failed during workspace test compilation on host filesystem pressure. No other job's files were removed and no other process was signalled. Current evidence after the failure: this worktree's target is 2.6 GiB; the filesystem reports 20 GiB available. Retrying fast once with the exact requested run id and lean settings now that space is available.

Exact failed fast output:

WARN load5=43.91 exceeds online CPU count=8; timing-sensitive checks may be delayed
PASS fast: migrations are append-only (0.337s)
PASS fast: workspace package dependencies (0.641s)
PASS fast: JavaScript dependencies (0.178s)
PASS fast: advisory review policy tests (0.290s)
SUPPLY_CHAIN_REVIEWS advisory exceptions are within their review windows
SUPPLY_CHAIN cargo-deny: cargo-deny 0.20.2
SUPPLY_CHAIN_NOTICES generated THIRD_PARTY_NOTICES.md from 95 frontend packages
SUPPLY_CHAIN_NOTICES copied source: 179 shadcn files, 3 calternal-derived files
SUPPLY_CHAIN_NOTICES license files: 66 distinct texts; 0 packages need manual license review
advisories ok
SUPPLY_CHAIN_RUST_ADVISORIES passed with refreshed advisory data
licenses ok
SUPPLY_CHAIN_RUST_LICENSES passed
bun audit v1.4.2 (744846f84)

cookie@0.6.0
  workspace:@infraternal/web > @sveltejs/kit > cookie
  low: cookie accepts cookie name, path, and domain with out of bounds characters (<0.7.0) - https://github.com/advisories/GHSA-pxg6-pf52-xh8x

1 vulnerability (1 low)

  bun audit fix           upgrade the vulnerable packages within their ranges
  bun audit fix --latest  also cross major versions
SUPPLY_CHAIN_BUN_AUDIT findings reported; this check is report-only
SUPPLY_CHAIN_PASS Rust advisory/license checks complete; Bun findings are report-only
PASS fast: supply-chain checks (16.973s)
PASS fast: build web app (75.408s)
PASS fast: cargo fmt --check (3.109s)
PASS fast: cargo clippy (226.344s)
FAIL fast: cargo test (342.129s)
   Compiling tokio v1.53.1
   Compiling tempfile v3.27.0
   Compiling regex-syntax v0.8.11
   Compiling regex-automata v0.4.18
   Compiling tokio-util v0.7.19
   Compiling hyper v1.11.1
   Compiling tokio-stream v0.1.19
   Compiling regex v1.13.1
   Compiling hyper-util v0.1.21
   Compiling tinytemplate v1.2.1
   Compiling hyperlocal v0.9.1
   Compiling bollard v0.21.1
   Compiling criterion v0.8.2
   Compiling infraternal-provider-bollard v0.0.1 (/mnt/hdd/infraternal/wt-lp/ops-install-restore/crates/provider-bollard)
   Compiling russh-util v0.52.0
   Compiling russh v0.63.3
   Compiling infraternal-provider-docker v0.0.1 (/mnt/hdd/infraternal/wt-lp/ops-install-restore/crates/provider-docker)
   Compiling infraternal-provider-podman v0.0.1 (/mnt/hdd/infraternal/wt-lp/ops-install-restore/crates/provider-podman)
   Compiling infraternal-engine v0.0.1 (/mnt/hdd/infraternal/wt-lp/ops-install-restore/crates/engine)
   Compiling tokio-rustls v0.26.5
   Compiling tower v0.5.3
   Compiling tokio-tungstenite v0.29.0
   Compiling tower-http v0.6.11
   Compiling hyper-rustls v0.27.10
   Compiling reqwest v0.13.5
   Compiling matchers v0.2.0
   Compiling tracing-subscriber v0.3.23
   Compiling sqlx-core v0.8.6
   Compiling infraternal-ssh v0.0.1 (/mnt/hdd/infraternal/wt-lp/ops-install-restore/crates/ssh)
   Compiling sqlx-sqlite v0.8.6
   Compiling infraternal-agent v0.0.1 (/mnt/hdd/infraternal/wt-lp/ops-install-restore/crates/agent)
   Compiling axum v0.8.9
   Compiling infraternal-server v0.0.1 (/mnt/hdd/infraternal/wt-lp/ops-install-restore/crates/server)
   Compiling sqlx v0.8.6
   Compiling webauthn-authenticator-rs v0.5.4
   Compiling concurrent-queue v2.5.0
   Compiling async-io v2.6.0
   Compiling async-channel v2.5.0
   Compiling async-signal v0.2.14
   Compiling blocking v1.7.0
   Compiling async-process v2.5.0
   Compiling async-executor v1.14.0
   Compiling zbus v5.19.0
   Compiling process-wrap v10.0.1
   Compiling rmcp v3.5.0
error: failed to write to `/mnt/hdd/infraternal/wt-lp/ops-install-restore/target/debug/deps/rmetavJITTK/full.rmeta`: No space left on device (os error 28)

error: could not compile `zbus` (lib) due to 1 previous error
warning: build failed, waiting for other jobs to finish...
error: failed to write to `/mnt/hdd/infraternal/wt-lp/ops-install-restore/target/debug/deps/rmetai8D4ru/full.rmeta`: No space left on device (os error 28)

error: could not compile `rmcp` (lib) due to 1 previous error
Final verification finding (#48): The corrected operations tier passed all seven SQLite tests and the actual current/prior-binary drill (including committed crash-WAL preservation and restart). Final template syntax verification also passed after retaining optional engine startup ordering. The fast tier passed Clippy, then failed during workspace test compilation on host filesystem pressure. No other job's files were removed and no other process was signalled. Current evidence after the failure: this worktree's target is 2.6 GiB; the filesystem reports 20 GiB available. Retrying fast once with the exact requested run id and lean settings now that space is available. Exact failed fast output: ``` WARN load5=43.91 exceeds online CPU count=8; timing-sensitive checks may be delayed PASS fast: migrations are append-only (0.337s) PASS fast: workspace package dependencies (0.641s) PASS fast: JavaScript dependencies (0.178s) PASS fast: advisory review policy tests (0.290s) SUPPLY_CHAIN_REVIEWS advisory exceptions are within their review windows SUPPLY_CHAIN cargo-deny: cargo-deny 0.20.2 SUPPLY_CHAIN_NOTICES generated THIRD_PARTY_NOTICES.md from 95 frontend packages SUPPLY_CHAIN_NOTICES copied source: 179 shadcn files, 3 calternal-derived files SUPPLY_CHAIN_NOTICES license files: 66 distinct texts; 0 packages need manual license review advisories ok SUPPLY_CHAIN_RUST_ADVISORIES passed with refreshed advisory data licenses ok SUPPLY_CHAIN_RUST_LICENSES passed bun audit v1.4.2 (744846f84) cookie@0.6.0 workspace:@infraternal/web > @sveltejs/kit > cookie low: cookie accepts cookie name, path, and domain with out of bounds characters (<0.7.0) - https://github.com/advisories/GHSA-pxg6-pf52-xh8x 1 vulnerability (1 low) bun audit fix upgrade the vulnerable packages within their ranges bun audit fix --latest also cross major versions SUPPLY_CHAIN_BUN_AUDIT findings reported; this check is report-only SUPPLY_CHAIN_PASS Rust advisory/license checks complete; Bun findings are report-only PASS fast: supply-chain checks (16.973s) PASS fast: build web app (75.408s) PASS fast: cargo fmt --check (3.109s) PASS fast: cargo clippy (226.344s) FAIL fast: cargo test (342.129s) Compiling tokio v1.53.1 Compiling tempfile v3.27.0 Compiling regex-syntax v0.8.11 Compiling regex-automata v0.4.18 Compiling tokio-util v0.7.19 Compiling hyper v1.11.1 Compiling tokio-stream v0.1.19 Compiling regex v1.13.1 Compiling hyper-util v0.1.21 Compiling tinytemplate v1.2.1 Compiling hyperlocal v0.9.1 Compiling bollard v0.21.1 Compiling criterion v0.8.2 Compiling infraternal-provider-bollard v0.0.1 (/mnt/hdd/infraternal/wt-lp/ops-install-restore/crates/provider-bollard) Compiling russh-util v0.52.0 Compiling russh v0.63.3 Compiling infraternal-provider-docker v0.0.1 (/mnt/hdd/infraternal/wt-lp/ops-install-restore/crates/provider-docker) Compiling infraternal-provider-podman v0.0.1 (/mnt/hdd/infraternal/wt-lp/ops-install-restore/crates/provider-podman) Compiling infraternal-engine v0.0.1 (/mnt/hdd/infraternal/wt-lp/ops-install-restore/crates/engine) Compiling tokio-rustls v0.26.5 Compiling tower v0.5.3 Compiling tokio-tungstenite v0.29.0 Compiling tower-http v0.6.11 Compiling hyper-rustls v0.27.10 Compiling reqwest v0.13.5 Compiling matchers v0.2.0 Compiling tracing-subscriber v0.3.23 Compiling sqlx-core v0.8.6 Compiling infraternal-ssh v0.0.1 (/mnt/hdd/infraternal/wt-lp/ops-install-restore/crates/ssh) Compiling sqlx-sqlite v0.8.6 Compiling infraternal-agent v0.0.1 (/mnt/hdd/infraternal/wt-lp/ops-install-restore/crates/agent) Compiling axum v0.8.9 Compiling infraternal-server v0.0.1 (/mnt/hdd/infraternal/wt-lp/ops-install-restore/crates/server) Compiling sqlx v0.8.6 Compiling webauthn-authenticator-rs v0.5.4 Compiling concurrent-queue v2.5.0 Compiling async-io v2.6.0 Compiling async-channel v2.5.0 Compiling async-signal v0.2.14 Compiling blocking v1.7.0 Compiling async-process v2.5.0 Compiling async-executor v1.14.0 Compiling zbus v5.19.0 Compiling process-wrap v10.0.1 Compiling rmcp v3.5.0 error: failed to write to `/mnt/hdd/infraternal/wt-lp/ops-install-restore/target/debug/deps/rmetavJITTK/full.rmeta`: No space left on device (os error 28) error: could not compile `zbus` (lib) due to 1 previous error warning: build failed, waiting for other jobs to finish... error: failed to write to `/mnt/hdd/infraternal/wt-lp/ops-install-restore/target/debug/deps/rmetai8D4ru/full.rmeta`: No space left on device (os error 28) error: could not compile `rmcp` (lib) due to 1 previous error ```
Author
Owner

Implementation evidence for issue #48:

  • D9: the utoipa test now checks that all four requested Idempotency-Key headers are required, that refresh lists 401, the host-key probe lists 429, and authenticated keyed operations share 400/401/409/422 responses. The generated schema.ts now carries the expanded response set.
  • D11–D14: unknown-user login-start scopes now receive 300,000 ms while remaining outside the owner admission pool; join-token limits use Unicode character counts; lockout responses use the remaining time for limiting failure buckets; token minting passes the configured access lifetime.
  • D16: §3.4 names the tunnel control types on channel 0, and §3.10 lists the 429 upgrade failure.
  • D18: plan-stale reason values and the failed/skipped pre-lock authorization mismatch are documented and tested. Idempotency ULIDs normalize to uppercase in both middleware paths; migration 0022 collapses legacy case collisions to an unknown row so an ambiguous request is never replayed. The unused legacy_code() mapper was removed, and §7.2 now describes the unwired adapter and substrate-denial classification.
Implementation evidence for issue #48: - D9: the `utoipa` test now checks that all four requested `Idempotency-Key` headers are required, that refresh lists 401, the host-key probe lists 429, and authenticated keyed operations share 400/401/409/422 responses. The generated `schema.ts` now carries the expanded response set. - D11–D14: unknown-user login-start scopes now receive 300,000 ms while remaining outside the owner admission pool; join-token limits use Unicode character counts; lockout responses use the remaining time for limiting failure buckets; token minting passes the configured access lifetime. - D16: §3.4 names the tunnel control types on channel 0, and §3.10 lists the 429 upgrade failure. - D18: plan-stale reason values and the failed/skipped pre-lock authorization mismatch are documented and tested. Idempotency ULIDs normalize to uppercase in both middleware paths; migration 0022 collapses legacy case collisions to an `unknown` row so an ambiguous request is never replayed. The unused `legacy_code()` mapper was removed, and §7.2 now describes the unwired adapter and substrate-denial classification.
Author
Owner

Verification blocked by the requested disk guard after commit and merge. Final worktree is clean at 6eb9f7b783340302918f2bd80ab94e291e377679 (branch contract-drift-rest, ahead 5 of origin/dev).

Pre-gate disk output:

Filesystem      Size  Used Avail Use% Mounted on
/dev/sda         98G   88G  5.5G  95% /mnt/hdd

I did not start another full build because free space was below 6 GB. The most recent scripts/verify fast run before the final test fixes ended with FAIL fast: cargo clippy (43.327s) due to test compile errors; those fixes are committed, but fast has not been rerun after them. Earlier fast stages passed, but there is no green fast result to record.

Verification blocked by the requested disk guard after commit and merge. Final worktree is clean at `6eb9f7b783340302918f2bd80ab94e291e377679` (branch `contract-drift-rest`, ahead 5 of `origin/dev`). Pre-gate disk output: ``` Filesystem Size Used Avail Use% Mounted on /dev/sda 98G 88G 5.5G 95% /mnt/hdd ``` I did not start another full build because free space was below 6 GB. The most recent `scripts/verify fast` run before the final test fixes ended with `FAIL fast: cargo clippy (43.327s)` due to test compile errors; those fixes are committed, but fast has not been rerun after them. Earlier fast stages passed, but there is no green fast result to record.
Author
Owner

Finished this run on branch perf-guards-nightly, based on 450c297354f4d2f07c84ace930949a6bacdbb900 and merged with origin/dev at 0d8e41a108cf1169e08b9b1473df99e55da276d1.

HEAD: 8fb1f638aa874c00892e058c905f3f4aed331a0b.

The latest scripts/verify fast run reached this exact gate output:

PASS fast: cargo clippy (27.279s)

I interrupted the run during cargo test --workspace after the required disk check fell below the 6 GB floor:

Filesystem      Size  Used Avail Use% Mounted on
/dev/sda         98G   88G  5.5G  95% /mnt/hdd

The complete fast gate did not finish. The worktree is clean. No push was made; this issue remains open.

Finished this run on branch `perf-guards-nightly`, based on `450c297354f4d2f07c84ace930949a6bacdbb900` and merged with `origin/dev` at `0d8e41a108cf1169e08b9b1473df99e55da276d1`. HEAD: `8fb1f638aa874c00892e058c905f3f4aed331a0b`. The latest `scripts/verify fast` run reached this exact gate output: ```text PASS fast: cargo clippy (27.279s) ``` I interrupted the run during `cargo test --workspace` after the required disk check fell below the 6 GB floor: ```text Filesystem Size Used Avail Use% Mounted on /dev/sda 98G 88G 5.5G 95% /mnt/hdd ``` The complete fast gate did not finish. The worktree is clean. No push was made; this issue remains open.
Author
Owner

Completed ops-install-restore. Branch: ops-install-restore. Base: 450c297354. Final head: b396348188d94179e96fc4cb8564c90fda5655c8. Five small logical commits; clean worktree; no push; issue remains open.

Behavior/files:

  • crates/infraternal/src/main.rs: restore command with backup-consistent database selection. Backup's open path is unchanged for storage-postmerge-fixes.
  • crates/server/src/storage/mod.rs, storage/restore.rs, storage/restore/tests.rs: shared server/pool/native-handle lease and exclusive whole-operation restore lease; isolated read-only immutable validation of integrity, successful known migration prefix/checksums and literal-prefix schema comparison; durable staging, preservation of previous main/WAL/SHM/journal, atomic same-filesystem publication, pending-marker startup fence and pre-publication rollback. Seven real SQLite tests include corrupt/incompatible/altered/lookalike schema inputs, older-prefix startup upgrade, cloned/held/timed-out storage refusal and rename-failure preservation.
  • deploy/systemd/*, docs/DEPLOY.md: generic Debian/Ubuntu server and root-run remote infraternal agent units/private configuration; actual enrollment arguments, rootful and explicit rootless Podman setup, upgrade/uninstall, private whole-state backup, restore and interrupted recovery; owner-matched copies of root-owned archived snapshots. No services installed on the VM.
  • scripts/verify, scripts/tests/operations.sh, operations.py, docs/PLAN.md, docs/DESIGN.md, docs/contracts.md, .claude/skills/ops-install-restore/SKILL.md: focused operations tiers and nightly real-binary drill. Repo skill validated (Skill is valid!).

Latest scoped operations command: PATH includes /home/kayg/.nix-profile/bin; CARGO_INCREMENTAL=0 CARGO_PROFILE_DEV_DEBUG=0 CARGO_PROFILE_TEST_DEBUG=0 CARGO_BUILD_JOBS=2 INFRATERNAL_VERIFY_RUN_ID=ops-install-restore-operations-literal-prefix nice -n 15 scripts/verify operations.
Exact output:

WARN load5=50.88 exceeds online CPU count=8; timing-sensitive checks may be delayed
PASS prepare: JavaScript dependencies (0.039s)
PASS operations-storage: build web app (38.515s)
test result: ok. 7 passed; 0 failed; 0 ignored; 0 measured; 107 filtered out; finished in 3.16s
PASS operations-storage: SQLite restore unit tests (114.363s)
PASS operations: build current binary (65.618s)
PRIOR_BINARY_COMMIT e339ad192d9ebfbf9feebe4e725becb138c0c4b4
PASS operations: systemd templates and actual CLI arguments validate without service installation
PASS operations: actual prior binary -> current binary retains state and migration lineage
PASS operations: binary backup -> mutate -> restore; running server refusal
PASS operations: corrupt snapshot rejected without changing destination
PASS operations: committed crash WAL preserved; restored server restarts
PASS operations: actual binary backup, restore and prior-version upgrade (102.476s)

Final required fast command: PATH includes /home/kayg/.nix-profile/bin; CARGO_INCREMENTAL=0 CARGO_PROFILE_DEV_DEBUG=0 CARGO_PROFILE_TEST_DEBUG=0 CARGO_BUILD_JOBS=2 INFRATERNAL_VERIFY_RUN_ID=ops-install-restore nice -n 15 scripts/verify fast. Exit 0.
Exact output:

WARN load5=46.45 exceeds online CPU count=8; timing-sensitive checks may be delayed
PASS fast: migrations are append-only (0.428s)
PASS fast: workspace package dependencies (0.664s)
PASS fast: JavaScript dependencies (0.219s)
PASS fast: advisory review policy tests (2.749s)
SUPPLY_CHAIN_REVIEWS advisory exceptions are within their review windows
SUPPLY_CHAIN cargo-deny: cargo-deny 0.20.2
SUPPLY_CHAIN_NOTICES generated THIRD_PARTY_NOTICES.md from 95 frontend packages
SUPPLY_CHAIN_NOTICES copied source: 179 shadcn files, 3 calternal-derived files
SUPPLY_CHAIN_NOTICES license files: 66 distinct texts; 0 packages need manual license review
advisories ok
SUPPLY_CHAIN_RUST_ADVISORIES passed with refreshed advisory data
licenses ok
SUPPLY_CHAIN_RUST_LICENSES passed
bun audit v1.4.2 (744846f84)

cookie@0.6.0
  workspace:@infraternal/web > @sveltejs/kit > cookie
  low: cookie accepts cookie name, path, and domain with out of bounds characters (<0.7.0) - https://github.com/advisories/GHSA-pxg6-pf52-xh8x

1 vulnerability (1 low)

  bun audit fix           upgrade the vulnerable packages within their ranges
  bun audit fix --latest  also cross major versions
SUPPLY_CHAIN_BUN_AUDIT findings reported; this check is report-only
SUPPLY_CHAIN_PASS Rust advisory/license checks complete; Bun findings are report-only
PASS fast: supply-chain checks (42.993s)
PASS fast: build web app (47.284s)
PASS fast: cargo fmt --check (2.319s)
PASS fast: cargo clippy (358.122s)
PASS fast: cargo test (299.439s)
PASS fast: svelte-check (35.745s)
PASS fast: UI package svelte-check (13.265s)
PASS fast: stream package typecheck (13.246s)
PASS fast: Vitest (9.109s)
PASS fast: UI package Vitest (25.101s)
PASS fast: stream package Vitest (3.839s)
PASS fast: OpenAPI and TypeScript client drift (49.738s)
PASS fast: terminal TypeScript (6.218s)
PASS fast: terminal Vitest (2.403s)

Additional scoped checks: systemd-analyze verify on temporary units referencing the actual binary returned exit 0, without installation; bash syntax and Python syntax checks passed; git diff --check passed; all five commit messages end in the required trailers.

Limitations/integration notes:

  • Merge and full nightly were not run, as instructed on the loaded VM; central orchestration retains those gates and independent review. No performance claims or hot-path benchmarks: this adds offline/startup work, and pool ownership avoids an additional Arc bump per storage clone.
  • No privileged host installation, rootful/rootless Podman setup, SSH service installation or network/NetBird change was performed; templates/CLI were checked and the real existing tunnel/auth mechanisms are reused. No demo containers removed and no other job's processes signalled.
  • Prior binary was built from actual pinned ancestor e339ad192d and its own web assets, not fabricated. There are no release tags; this lineage has unchanged migrations 1–21, so the real drill proves binary/state continuity. Older-prefix migration is covered in real SQLite tests.
  • Earlier fast failure from transient No space left on device is recorded verbatim in the preceding finding; retries and final head passed. The existing low cookie Bun advisory is report-only and is quoted in the final gate output.
  • Final schema review corrected LIKE's underscore wildcard via GLOB and added a lookalike user-schema rejection case; SQLite's literal reserved prefix is documented at https://www.sqlite.org/lang_createtable.html .
Completed ops-install-restore. Branch: ops-install-restore. Base: 450c297354f4d2f07c84ace930949a6bacdbb900. Final head: b396348188d94179e96fc4cb8564c90fda5655c8. Five small logical commits; clean worktree; no push; issue remains open. Behavior/files: - `crates/infraternal/src/main.rs`: restore command with backup-consistent database selection. Backup's open path is unchanged for storage-postmerge-fixes. - `crates/server/src/storage/mod.rs`, `storage/restore.rs`, `storage/restore/tests.rs`: shared server/pool/native-handle lease and exclusive whole-operation restore lease; isolated read-only immutable validation of integrity, successful known migration prefix/checksums and literal-prefix schema comparison; durable staging, preservation of previous main/WAL/SHM/journal, atomic same-filesystem publication, pending-marker startup fence and pre-publication rollback. Seven real SQLite tests include corrupt/incompatible/altered/lookalike schema inputs, older-prefix startup upgrade, cloned/held/timed-out storage refusal and rename-failure preservation. - `deploy/systemd/*`, `docs/DEPLOY.md`: generic Debian/Ubuntu server and root-run remote infraternal agent units/private configuration; actual enrollment arguments, rootful and explicit rootless Podman setup, upgrade/uninstall, private whole-state backup, restore and interrupted recovery; owner-matched copies of root-owned archived snapshots. No services installed on the VM. - `scripts/verify`, `scripts/tests/operations.sh`, `operations.py`, `docs/PLAN.md`, `docs/DESIGN.md`, `docs/contracts.md`, `.claude/skills/ops-install-restore/SKILL.md`: focused operations tiers and nightly real-binary drill. Repo skill validated (`Skill is valid!`). Latest scoped operations command: PATH includes /home/kayg/.nix-profile/bin; CARGO_INCREMENTAL=0 CARGO_PROFILE_DEV_DEBUG=0 CARGO_PROFILE_TEST_DEBUG=0 CARGO_BUILD_JOBS=2 INFRATERNAL_VERIFY_RUN_ID=ops-install-restore-operations-literal-prefix nice -n 15 scripts/verify operations. Exact output: ``` WARN load5=50.88 exceeds online CPU count=8; timing-sensitive checks may be delayed PASS prepare: JavaScript dependencies (0.039s) PASS operations-storage: build web app (38.515s) test result: ok. 7 passed; 0 failed; 0 ignored; 0 measured; 107 filtered out; finished in 3.16s PASS operations-storage: SQLite restore unit tests (114.363s) PASS operations: build current binary (65.618s) PRIOR_BINARY_COMMIT e339ad192d9ebfbf9feebe4e725becb138c0c4b4 PASS operations: systemd templates and actual CLI arguments validate without service installation PASS operations: actual prior binary -> current binary retains state and migration lineage PASS operations: binary backup -> mutate -> restore; running server refusal PASS operations: corrupt snapshot rejected without changing destination PASS operations: committed crash WAL preserved; restored server restarts PASS operations: actual binary backup, restore and prior-version upgrade (102.476s) ``` Final required fast command: PATH includes /home/kayg/.nix-profile/bin; CARGO_INCREMENTAL=0 CARGO_PROFILE_DEV_DEBUG=0 CARGO_PROFILE_TEST_DEBUG=0 CARGO_BUILD_JOBS=2 INFRATERNAL_VERIFY_RUN_ID=ops-install-restore nice -n 15 scripts/verify fast. Exit 0. Exact output: ``` WARN load5=46.45 exceeds online CPU count=8; timing-sensitive checks may be delayed PASS fast: migrations are append-only (0.428s) PASS fast: workspace package dependencies (0.664s) PASS fast: JavaScript dependencies (0.219s) PASS fast: advisory review policy tests (2.749s) SUPPLY_CHAIN_REVIEWS advisory exceptions are within their review windows SUPPLY_CHAIN cargo-deny: cargo-deny 0.20.2 SUPPLY_CHAIN_NOTICES generated THIRD_PARTY_NOTICES.md from 95 frontend packages SUPPLY_CHAIN_NOTICES copied source: 179 shadcn files, 3 calternal-derived files SUPPLY_CHAIN_NOTICES license files: 66 distinct texts; 0 packages need manual license review advisories ok SUPPLY_CHAIN_RUST_ADVISORIES passed with refreshed advisory data licenses ok SUPPLY_CHAIN_RUST_LICENSES passed bun audit v1.4.2 (744846f84) cookie@0.6.0 workspace:@infraternal/web > @sveltejs/kit > cookie low: cookie accepts cookie name, path, and domain with out of bounds characters (<0.7.0) - https://github.com/advisories/GHSA-pxg6-pf52-xh8x 1 vulnerability (1 low) bun audit fix upgrade the vulnerable packages within their ranges bun audit fix --latest also cross major versions SUPPLY_CHAIN_BUN_AUDIT findings reported; this check is report-only SUPPLY_CHAIN_PASS Rust advisory/license checks complete; Bun findings are report-only PASS fast: supply-chain checks (42.993s) PASS fast: build web app (47.284s) PASS fast: cargo fmt --check (2.319s) PASS fast: cargo clippy (358.122s) PASS fast: cargo test (299.439s) PASS fast: svelte-check (35.745s) PASS fast: UI package svelte-check (13.265s) PASS fast: stream package typecheck (13.246s) PASS fast: Vitest (9.109s) PASS fast: UI package Vitest (25.101s) PASS fast: stream package Vitest (3.839s) PASS fast: OpenAPI and TypeScript client drift (49.738s) PASS fast: terminal TypeScript (6.218s) PASS fast: terminal Vitest (2.403s) ``` Additional scoped checks: systemd-analyze verify on temporary units referencing the actual binary returned exit 0, without installation; bash syntax and Python syntax checks passed; git diff --check passed; all five commit messages end in the required trailers. Limitations/integration notes: - Merge and full nightly were not run, as instructed on the loaded VM; central orchestration retains those gates and independent review. No performance claims or hot-path benchmarks: this adds offline/startup work, and pool ownership avoids an additional Arc bump per storage clone. - No privileged host installation, rootful/rootless Podman setup, SSH service installation or network/NetBird change was performed; templates/CLI were checked and the real existing tunnel/auth mechanisms are reused. No demo containers removed and no other job's processes signalled. - Prior binary was built from actual pinned ancestor e339ad192d9ebfbf9feebe4e725becb138c0c4b4 and its own web assets, not fabricated. There are no release tags; this lineage has unchanged migrations 1–21, so the real drill proves binary/state continuity. Older-prefix migration is covered in real SQLite tests. - Earlier fast failure from transient No space left on device is recorded verbatim in the preceding finding; retries and final head passed. The existing low cookie Bun advisory is report-only and is quoted in the final gate output. - Final schema review corrected LIKE's underscore wildcard via GLOB and added a lookalike user-schema rejection case; SQLite's literal reserved prefix is documented at https://www.sqlite.org/lang_createtable.html .
Author
Owner

Follow-up fix writer started. Branch ops-install-restore; base origin/dev 450c297354; starting HEAD b396348188d94179e96fc4cb8564c90fda5655c8; git status clean. Preserving all prior changes. Independently checking reviewer P1 against SQLx 0.8.6 teardown ordering, then deterministic storage regression and focused operations plus fast gates. No merge/nightly or push.

Follow-up fix writer started. Branch ops-install-restore; base origin/dev 450c297354f4d2f07c84ace930949a6bacdbb900; starting HEAD b396348188d94179e96fc4cb8564c90fda5655c8; git status clean. Preserving all prior changes. Independently checking reviewer P1 against SQLx 0.8.6 teardown ordering, then deterministic storage regression and focused operations plus fast gates. No merge/nightly or push.
Author
Owner

Confirmed reviewer P1 against current HEAD b396348188d94179e96fc4cb8564c90fda5655c8 and installed pinned SQLx 0.8.6 sources: ConnectionState::drop removes rollback-hook captures before ConnectionHandle::drop invokes sqlite3_close. Current storage/mod.rs retains the per-connection lease only in that capture. Pool drain cannot account for detached connections.

Primary sources: https://github.com/launchbadge/sqlx/blob/v0.8.6/sqlx-sqlite/src/connection/mod.rs#L557-L567 and https://github.com/launchbadge/sqlx/blob/v0.8.6/sqlx-sqlite/src/connection/handle.rs#L80-L90 . Proposed native owner uses SQLx LockedSqliteHandle::create_collation, which registers a SQLite-owned xDestroy callback (safe Rust API, registration errors reclaimed by SQLx): https://github.com/launchbadge/sqlx/blob/v0.8.6/sqlx-sqlite/src/connection/collation.rs#L76-L108 . SQLite 3.46.0 bundled by pinned libsqlite3-sys 0.30.1 closes all Btrees/pagers and reports connection locks released before collation xDel: https://github.com/sqlite/sqlite/blob/version-3.46.0/src/main.c#L1299-L1369 ; documented native callback lifetime: https://www.sqlite.org/c3ref/create_collation.html . This is a native acknowledgment that database-file shutdown is complete, even if SQLx shutdown awaiting is cancelled, bounded, or skipped. The private collation is never queried, replaced or removed. No new polling, background work, request-path allocations, unsafe Rust, or dependencies are required.

Regression now in development: drain pool while a detached connection remains; strip authorization hooks; pause the real worker in rollback-hook destruction before native close; prove exclusive admission/public restore refuse, then prove restore succeeds immediately after acknowledged worker shutdown.

Confirmed reviewer P1 against current HEAD b396348188d94179e96fc4cb8564c90fda5655c8 and installed pinned SQLx 0.8.6 sources: ConnectionState::drop removes rollback-hook captures before ConnectionHandle::drop invokes sqlite3_close. Current storage/mod.rs retains the per-connection lease only in that capture. Pool drain cannot account for detached connections. Primary sources: https://github.com/launchbadge/sqlx/blob/v0.8.6/sqlx-sqlite/src/connection/mod.rs#L557-L567 and https://github.com/launchbadge/sqlx/blob/v0.8.6/sqlx-sqlite/src/connection/handle.rs#L80-L90 . Proposed native owner uses SQLx LockedSqliteHandle::create_collation, which registers a SQLite-owned xDestroy callback (safe Rust API, registration errors reclaimed by SQLx): https://github.com/launchbadge/sqlx/blob/v0.8.6/sqlx-sqlite/src/connection/collation.rs#L76-L108 . SQLite 3.46.0 bundled by pinned libsqlite3-sys 0.30.1 closes all Btrees/pagers and reports connection locks released before collation xDel: https://github.com/sqlite/sqlite/blob/version-3.46.0/src/main.c#L1299-L1369 ; documented native callback lifetime: https://www.sqlite.org/c3ref/create_collation.html . This is a native acknowledgment that database-file shutdown is complete, even if SQLx shutdown awaiting is cancelled, bounded, or skipped. The private collation is never queried, replaced or removed. No new polling, background work, request-path allocations, unsafe Rust, or dependencies are required. Regression now in development: drain pool while a detached connection remains; strip authorization hooks; pause the real worker in rollback-hook destruction before native close; prove exclusive admission/public restore refuse, then prove restore succeeds immediately after acknowledged worker shutdown.
Author
Owner

Deterministic reviewer repro confirmed before production fix. The first operations-storage run exposed a test-harness issue (single-thread runtime blocked in native capture destruction); the corrected multi-thread tests use a bounded destructor rendezvous. Focused lean diagnostic of the corrected tests against pre-fix production code exited 101, with all three failing on early exclusive lease admission:

   Compiling infraternal-server v0.0.1 (/mnt/hdd/infraternal/wt-lp/ops-install-restore/crates/server)
    Finished `test` profile [unoptimized] target(s) in 50.25s
     Running unittests src/lib.rs (target/debug/deps/infraternal_server-c412346f2a3a8c0c)

running 3 tests

thread 'storage::restore::tests::detached_connection_refuses_restore_at_native_close_boundary' (1993404) panicked at crates/server/src/storage/restore/tests.rs:227:5:
assertion failed: lease(&database, true).is_err()
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
test storage::restore::tests::detached_connection_refuses_restore_at_native_close_boundary ... FAILED

thread 'storage::restore::tests::cancelled_close_refuses_restore_at_native_close_boundary' (1993403) panicked at crates/server/src/storage/restore/tests.rs:227:5:
assertion failed: lease(&database, true).is_err()
test storage::restore::tests::cancelled_close_refuses_restore_at_native_close_boundary ... FAILED

thread 'storage::restore::tests::dropped_connection_refuses_restore_at_native_close_boundary' (1993405) panicked at crates/server/src/storage/restore/tests.rs:227:5:
assertion failed: lease(&database, true).is_err()
test storage::restore::tests::dropped_connection_refuses_restore_at_native_close_boundary ... FAILED

failures:

failures:
    storage::restore::tests::cancelled_close_refuses_restore_at_native_close_boundary
    storage::restore::tests::detached_connection_refuses_restore_at_native_close_boundary
    storage::restore::tests::dropped_connection_refuses_restore_at_native_close_boundary

test result: FAILED. 0 passed; 3 failed; 0 ignored; 0 measured; 114 filtered out; finished in 0.66s

error: test failed, to rerun pass `-p infraternal-server --lib`

Applied the SQLite-owned private collation capture using SQLx safe API, releasing only at native acknowledgment of finished Btree/pager/WAL/lock teardown. Added detached acknowledged, dropped and cancelled-close boundary regressions; preserved checked-out timed-out-close coverage. Running scripts/verify operations now; fast follows.

Deterministic reviewer repro confirmed before production fix. The first operations-storage run exposed a test-harness issue (single-thread runtime blocked in native capture destruction); the corrected multi-thread tests use a bounded destructor rendezvous. Focused lean diagnostic of the corrected tests against pre-fix production code exited 101, with all three failing on early exclusive lease admission: ``` Compiling infraternal-server v0.0.1 (/mnt/hdd/infraternal/wt-lp/ops-install-restore/crates/server) Finished `test` profile [unoptimized] target(s) in 50.25s Running unittests src/lib.rs (target/debug/deps/infraternal_server-c412346f2a3a8c0c) running 3 tests thread 'storage::restore::tests::detached_connection_refuses_restore_at_native_close_boundary' (1993404) panicked at crates/server/src/storage/restore/tests.rs:227:5: assertion failed: lease(&database, true).is_err() note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace test storage::restore::tests::detached_connection_refuses_restore_at_native_close_boundary ... FAILED thread 'storage::restore::tests::cancelled_close_refuses_restore_at_native_close_boundary' (1993403) panicked at crates/server/src/storage/restore/tests.rs:227:5: assertion failed: lease(&database, true).is_err() test storage::restore::tests::cancelled_close_refuses_restore_at_native_close_boundary ... FAILED thread 'storage::restore::tests::dropped_connection_refuses_restore_at_native_close_boundary' (1993405) panicked at crates/server/src/storage/restore/tests.rs:227:5: assertion failed: lease(&database, true).is_err() test storage::restore::tests::dropped_connection_refuses_restore_at_native_close_boundary ... FAILED failures: failures: storage::restore::tests::cancelled_close_refuses_restore_at_native_close_boundary storage::restore::tests::detached_connection_refuses_restore_at_native_close_boundary storage::restore::tests::dropped_connection_refuses_restore_at_native_close_boundary test result: FAILED. 0 passed; 3 failed; 0 ignored; 0 measured; 114 filtered out; finished in 0.66s error: test failed, to rerun pass `-p infraternal-server --lib` ``` Applied the SQLite-owned private collation capture using SQLx safe API, releasing only at native acknowledgment of finished Btree/pager/WAL/lock teardown. Added detached acknowledged, dropped and cancelled-close boundary regressions; preserved checked-out timed-out-close coverage. Running scripts/verify operations now; fast follows.
Author
Owner

Resuming the perf review follow-up for wins #2 (G3, Docker/Podman event filtering and refresh coalescing) and #7 (G5, log follow allocations and in-place frame batching).

Branch: perf-events-logs
Base head: 450c297354f4d2f07c84ace930949a6bacdbb900
Starting HEAD: 6d30a151ff3250b92b2a7af84826c56509a270b1

The worktree is clean. I’m reviewing the existing implementation and guard tests, then will finish the remaining checks and run INFRATERAL_VERIFY_RUN_ID=rs-perf-events scripts/verify fast.

Resuming the perf review follow-up for wins #2 (G3, Docker/Podman event filtering and refresh coalescing) and #7 (G5, log follow allocations and in-place frame batching). Branch: `perf-events-logs` Base head: `450c297354f4d2f07c84ace930949a6bacdbb900` Starting HEAD: `6d30a151ff3250b92b2a7af84826c56509a270b1` The worktree is clean. I’m reviewing the existing implementation and guard tests, then will finish the remaining checks and run `INFRATERAL_VERIFY_RUN_ID=rs-perf-events scripts/verify fast`.
Author
Owner

Resuming rs-session-authority as the only writer in /mnt/hdd/infraternal/wt-lp/session-authority, branch session-authority, base/resume head cd7ca3faf07621804f642f8e0f1793f72024e637. Worktree is clean. The existing commit contains A3/A5/A8/A10/A11 implementation and regressions; I am recovering the prior workspace-test failure, rerunning it in isolation before changing code, and finishing with the requested INFRATERNAL_VERIFY_RUN_ID=rs-session-authority scripts/verify fast. Lean Cargo environment, two build workers, nice 15, root-disk target cache. No merge gate or push.

Resuming rs-session-authority as the only writer in `/mnt/hdd/infraternal/wt-lp/session-authority`, branch `session-authority`, base/resume head `cd7ca3faf07621804f642f8e0f1793f72024e637`. Worktree is clean. The existing commit contains A3/A5/A8/A10/A11 implementation and regressions; I am recovering the prior workspace-test failure, rerunning it in isolation before changing code, and finishing with the requested `INFRATERNAL_VERIFY_RUN_ID=rs-session-authority scripts/verify fast`. Lean Cargo environment, two build workers, nice 15, root-disk target cache. No merge gate or push.
Author
Owner

Resuming the binary-size work on branch perf-binsize.

Resume head: ffbee9c79c8b78960b91c57b3735bf167d0d63c4.
Branch base against current origin/dev (git merge-base): bedafc1936e5f5c43aef15b46399fb34b171aba2.

The existing branch contains the recorded profile, crypto-backend and embedded-asset optimizations. The current worktree also has an uncommitted edit to docs/DEVELOPING.md, which I am preserving. I’ll measure the current stripped release binary, make only a justified remaining change if it still exceeds the 25,000,000-byte budget, and finish with INFRATERAL_VERIFY_RUN_ID=rs-binsize scripts/verify fast.

Resuming the binary-size work on branch `perf-binsize`. Resume head: `ffbee9c79c8b78960b91c57b3735bf167d0d63c4`. Branch base against current `origin/dev` (`git merge-base`): `bedafc1936e5f5c43aef15b46399fb34b171aba2`. The existing branch contains the recorded profile, crypto-backend and embedded-asset optimizations. The current worktree also has an uncommitted edit to `docs/DEVELOPING.md`, which I am preserving. I’ll measure the current stripped release binary, make only a justified remaining change if it still exceeds the 25,000,000-byte budget, and finish with `INFRATERAL_VERIFY_RUN_ID=rs-binsize scripts/verify fast`.
Author
Owner

Resuming rs-mutation-safety directly in worktree /mnt/hdd/infraternal/wt-lp/mutation-safety, branch mutation-safety. Base head: 450c297; current head: 1f629548fa69d0b51443ea6f3b01656ad74b59a5. Worktree is clean. Existing implementation for D1/D2/D7/D10/D15 is committed. Checking prior test evidence, then rerunning isolated failures and the requested INFRATERNAL_VERIFY_RUN_ID=rs-mutation-safety scripts/verify fast under the lean build environment. No push or merge gate. A6 only if it fits the current provider seam cheaply.

Resuming rs-mutation-safety directly in worktree /mnt/hdd/infraternal/wt-lp/mutation-safety, branch mutation-safety. Base head: 450c297; current head: 1f629548fa69d0b51443ea6f3b01656ad74b59a5. Worktree is clean. Existing implementation for D1/D2/D7/D10/D15 is committed. Checking prior test evidence, then rerunning isolated failures and the requested INFRATERNAL_VERIFY_RUN_ID=rs-mutation-safety scripts/verify fast under the lean build environment. No push or merge gate. A6 only if it fits the current provider seam cheaply.
Author
Owner

First requested fast run exited 101 in existing real_infraternal_agent_process_enrolls_and_reconnects_with_new_nonce: remote inventory was not published at agent_tunnel.rs:580 (100 attempts separated by 100 ms). The test and infraternal-agent/tunnel implementation have no diff against origin/dev 450c297354. No tunnel, engine, network, deadline or fixture changes made. VM reported load5 33.90 against 8 online CPUs. Focused lean diagnostic passed unchanged in 2.15 seconds, supporting a transient inventory-publication failure, not establishing its cause. Re-running full fast to obtain final gate evidence.

Initial failure excerpt verbatim:

     Running tests/agent_tunnel.rs (target/debug/deps/agent_tunnel-2825b9315441a779)

running 1 test
test real_infraternal_agent_process_enrolls_and_reconnects_with_new_nonce ... FAILED

failures:

---- real_infraternal_agent_process_enrolls_and_reconnects_with_new_nonce stdout ----

thread 'real_infraternal_agent_process_enrolls_and_reconnects_with_new_nonce' (2150654) panicked at crates/infraternal/tests/agent_tunnel.rs:580:5:
remote inventory was not published
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace


failures:
    real_infraternal_agent_process_enrolls_and_reconnects_with_new_nonce

test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out; finished in 11.04s

error: test failed, to rerun pass `-p infraternal --test agent_tunnel`

Focused diagnostic output verbatim:

   Compiling tracing-subscriber v0.3.23
   Compiling criterion v0.8.2
   Compiling infraternal v0.0.1 (/mnt/hdd/infraternal/wt-lp/ops-install-restore/crates/infraternal)
    Finished `test` profile [unoptimized] target(s) in 1m 14s
     Running tests/agent_tunnel.rs (target/debug/deps/agent_tunnel-a9753a196773eab4)

running 1 test
test real_infraternal_agent_process_enrolls_and_reconnects_with_new_nonce ... ok

test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 2.15s

First requested fast run exited 101 in existing real_infraternal_agent_process_enrolls_and_reconnects_with_new_nonce: remote inventory was not published at agent_tunnel.rs:580 (100 attempts separated by 100 ms). The test and infraternal-agent/tunnel implementation have no diff against origin/dev 450c297354f4d2f07c84ace930949a6bacdbb900. No tunnel, engine, network, deadline or fixture changes made. VM reported load5 33.90 against 8 online CPUs. Focused lean diagnostic passed unchanged in 2.15 seconds, supporting a transient inventory-publication failure, not establishing its cause. Re-running full fast to obtain final gate evidence. Initial failure excerpt verbatim: ``` Running tests/agent_tunnel.rs (target/debug/deps/agent_tunnel-2825b9315441a779) running 1 test test real_infraternal_agent_process_enrolls_and_reconnects_with_new_nonce ... FAILED failures: ---- real_infraternal_agent_process_enrolls_and_reconnects_with_new_nonce stdout ---- thread 'real_infraternal_agent_process_enrolls_and_reconnects_with_new_nonce' (2150654) panicked at crates/infraternal/tests/agent_tunnel.rs:580:5: remote inventory was not published note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace failures: real_infraternal_agent_process_enrolls_and_reconnects_with_new_nonce test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out; finished in 11.04s error: test failed, to rerun pass `-p infraternal --test agent_tunnel` ``` Focused diagnostic output verbatim: ``` Compiling tracing-subscriber v0.3.23 Compiling criterion v0.8.2 Compiling infraternal v0.0.1 (/mnt/hdd/infraternal/wt-lp/ops-install-restore/crates/infraternal) Finished `test` profile [unoptimized] target(s) in 1m 14s Running tests/agent_tunnel.rs (target/debug/deps/agent_tunnel-a9753a196773eab4) running 1 test test real_infraternal_agent_process_enrolls_and_reconnects_with_new_nonce ... ok test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 2.15s ```
Author
Owner

Follow-up fix for kayg/infraternal#48

Branch: ops-install-restore
Base origin/dev: 450c297354
Starting HEAD: b396348188d94179e96fc4cb8564c90fda5655c8 (clean)
Final HEAD: ba13a6d531d48da6d5f593358848066dc93b94c1 (clean)
Commit: fix(storage): retain restore lease through native SQLite teardown (#48)

Confirmed and fixed the review P1. SQLx 0.8.6 destroys rollback-hook captures before ConnectionHandle invokes native SQLite close. The per-connection shared operation lease now lives in an unused private SQLite collation capture via SQLx's safe API. SQLite 3.46.0 destroys that capture after every Btree/pager closes, WAL cleanup completes and database locks are released. This native file-shutdown acknowledgment remains effective if pool drain excludes a detached connection, or a close is dropped, cancellation-requested or timed out. The lease does not rely on pool size or an async future surviving. Existing bounded pool close is unchanged. No new production background polling/tasks, unsafe Rust, dependencies or request/frame allocations. Pool clones retain their existing closure ownership without extra storage-clone work.

Primary source evidence:

Regressions pause native teardown after authorization hooks are removed and before sqlite3_close. They independently require exclusive lease admission and public restore to refuse, check unchanged main/WAL bytes, then require successful restore after native shutdown. They cover detached acknowledged close, raw connection drop, cancellation requests and the existing checked-out close timeout. Tests use a bounded destructor rendezvous and a multi-thread runtime because SQLx can destroy native state on the thread polling close. Cooperative cancellation may complete the synchronous current poll; the final test accepts successful acknowledgment or a cancelled JoinError while keeping all restore/file assertions strict. Tokio cancellation behavior.

Corrected regressions failed before the production fix at early exclusive admission in all 3 cases (0 passed / 3 failed). Final focused SQLite gate passed all 10 tests. All 3 boundary cases then passed 20 consecutive repetitions (60 executions). Initial harness issues and their corrections are preserved in issue comments and local diagnostic logs; no refusal assertion was relaxed.

The previous writer's install/enrollment/upgrade/uninstall docs and systemd templates, restore validation/publication/recovery logic, backup open path and actual historical-binary verification were preserved. The operations smoke built and ran pinned historical source e339ad192d with scratch state. The production fix passed that full smoke; subsequent edits only corrected test-harness completion handling, and the final storage suite was rerun.

Validation and remaining blocker:

  • scripts/verify operations: exit 0.
  • scripts/verify operations-storage on final sources: exit 0, 10 passed / 0 failed.
  • Final boundary diagnostic: 20 repetitions, 60 passed / 0 failed.
  • Required INFRATERNAL_VERIFY_RUN_ID=ops-install-restore scripts/verify fast: final exit 1 at web Vitest. All Rust workspace tests, Clippy, formatting, web build and frontend type checks passed. Full fast is NOT green.
  • Remaining fast blocker: auth.test.ts browser refresh coordination cases both (5000 ms timeout) and locks (false instead of true). Web/other frontend packages and bun.lock have no diff from the pinned base. auth.test.ts blob is 8e78e65dc1 and auth.svelte.ts blob is 55902f3375, identical in base and working files. These tests mock fetch and browser globals; they do not call the Rust server. The focused unchanged auth diagnostic passed all 14 cases. No UI, timeout or network changes made; central verification must resolve/re-run this unrelated gate failure.
  • First fast attempt exited 101 at the existing remote inventory-publication test. Its focused unchanged diagnostic passed (1 test, 2.15 seconds), and the final full Rust workspace stage passed. Both attempts are recorded, not hidden.
  • Later fast stages (UI/stream Vitest, OpenAPI/client drift, terminal checks/tests) were not reached after final web Vitest failure. Merge/nightly, perf-test VM, host installation and Safari/iOS were not run. Nothing pushed; no issues closed.

Actual output follows verbatim.

Operations gate

WARN load5=38.97 exceeds online CPU count=8; timing-sensitive checks may be delayed
PASS prepare: JavaScript dependencies (0.046s)
PASS operations-storage: build web app (36.974s)
test result: ok. 10 passed; 0 failed; 0 ignored; 0 measured; 107 filtered out; finished in 3.58s
PASS operations-storage: SQLite restore unit tests (64.341s)
PASS operations: build current binary (158.027s)
PRIOR_BINARY_COMMIT e339ad192d9ebfbf9feebe4e725becb138c0c4b4
PASS operations: systemd templates and actual CLI arguments validate without service installation
PASS operations: actual prior binary -> current binary retains state and migration lineage
PASS operations: binary backup -> mutate -> restore; running server refusal
PASS operations: corrupt snapshot rejected without changing destination
PASS operations: committed crash WAL preserved; restored server restarts
PASS operations: actual binary backup, restore and prior-version upgrade (113.056s)

Final storage gate

WARN load5=39.61 exceeds online CPU count=8; timing-sensitive checks may be delayed
PASS prepare: JavaScript dependencies (0.060s)
PASS operations-storage: build web app (58.900s)
test result: ok. 10 passed; 0 failed; 0 ignored; 0 measured; 107 filtered out; finished in 3.14s
PASS operations-storage: SQLite restore unit tests (224.341s)

Boundary repetitions (verified log summary)

PASS teardown boundary reproducibility: 20 repetitions, 60 tests passed, 0 failures

Final required fast gate

WARN load5=41.38 exceeds online CPU count=8; timing-sensitive checks may be delayed
PASS fast: migrations are append-only (0.689s)
PASS fast: workspace package dependencies (1.002s)
PASS fast: JavaScript dependencies (0.070s)
PASS fast: advisory review policy tests (0.867s)
SUPPLY_CHAIN_REVIEWS advisory exceptions are within their review windows
SUPPLY_CHAIN cargo-deny: cargo-deny 0.20.2
SUPPLY_CHAIN_NOTICES generated THIRD_PARTY_NOTICES.md from 95 frontend packages
SUPPLY_CHAIN_NOTICES copied source: 179 shadcn files, 3 calternal-derived files
SUPPLY_CHAIN_NOTICES license files: 66 distinct texts; 0 packages need manual license review
advisories ok
SUPPLY_CHAIN_RUST_ADVISORIES passed with refreshed advisory data
licenses ok
SUPPLY_CHAIN_RUST_LICENSES passed
bun audit v1.4.2 (744846f84)

cookie@0.6.0
  workspace:@infraternal/web > @sveltejs/kit > cookie
  low: cookie accepts cookie name, path, and domain with out of bounds characters (<0.7.0) - https://github.com/advisories/GHSA-pxg6-pf52-xh8x

1 vulnerability (1 low)

  bun audit fix           upgrade the vulnerable packages within their ranges
  bun audit fix --latest  also cross major versions
SUPPLY_CHAIN_BUN_AUDIT findings reported; this check is report-only
SUPPLY_CHAIN_PASS Rust advisory/license checks complete; Bun findings are report-only
PASS fast: supply-chain checks (20.201s)
PASS fast: build web app (81.788s)
PASS fast: cargo fmt --check (3.088s)
PASS fast: cargo clippy (189.973s)
PASS fast: cargo test (442.976s)
PASS fast: svelte-check (78.122s)
PASS fast: UI package svelte-check (27.987s)
PASS fast: stream package typecheck (28.276s)
FAIL fast: Vitest (29.445s)
$ vitest run

 RUN  v5.0.1 /mnt/hdd/infraternal/wt-lp/ops-install-restore/packages/web

 ❯ src/lib/auth.test.ts (14 tests | 2 failed) 6450ms
   ❯ browser refresh coordination (14)
     × both: refreshes and reports the supported mode 5049ms
     × locks: refreshes and reports the supported mode 461ms

⎯⎯⎯⎯⎯⎯⎯ Failed Tests 2 ⎯⎯⎯⎯⎯⎯⎯

 FAIL  src/lib/auth.test.ts > browser refresh coordination > both: refreshes and reports the supported mode
Error: Test timed out in 5000ms.
If this is a long-running test, pass a timeout value as the last argument or configure it globally with "testTimeout".
 ❯ src/lib/auth.test.ts:39:5
     37| describe("browser refresh coordination", () => {
     38|   for (const mode of ["both", "locks", "neither"] as const) {
     39|     it(`${mode}: refreshes and reports the supported mode`, async () =…
       |     ^
     40|       const fetchMock = vi.fn().mockResolvedValueOnce(ok(session("0"))…
     41|       const auth = await loadAuth(mode, fetchMock);

⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[1/2]⎯

 FAIL  src/lib/auth.test.ts > browser refresh coordination > locks: refreshes and reports the supported mode
AssertionError: expected false to be true // Object.is equality

- Expected
+ Received

- true
+ false

 ❯ src/lib/auth.test.ts:42:42
     40|       const fetchMock = vi.fn().mockResolvedValueOnce(ok(session("0"))…
     41|       const auth = await loadAuth(mode, fetchMock);
     42|       await expect(auth.refreshSession()).resolves.toBe(true);
       |                                          ^
     43|       expect(auth.accessToken).toBe(token("0"));
     44|       expect(auth.singleTabNotice).toBe(mode !== "both");

⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[2/2]⎯


 Test Files  1 failed | 9 passed (10)
      Tests  2 failed | 50 passed (52)
   Start at  12:37:46
   Duration  18.10s (transform 71%, tests 18%, import 9%, worker 1%)

  Transform  transforming modules took 31.41s · 71% of tracked time, re-done on every run
             persist transforms across runs with fsModuleCache: true
             learn more: https://vitest.dev/guide/improving-performance#caching-between-reruns

error: script "test" exited with code 1

Focused frontend diagnostic

$ vitest run src/lib/auth.test.ts

 RUN  v5.0.1 /mnt/hdd/infraternal/wt-lp/ops-install-restore/packages/web


 Test Files  1 passed (1)
      Tests  14 passed (14)
   Start at  12:40:35
   Duration  5.46s (tests 94%, transform 4%, import 1%)

Focused remote-enrollment diagnostic

   Compiling tracing-subscriber v0.3.23
   Compiling criterion v0.8.2
   Compiling infraternal v0.0.1 (/mnt/hdd/infraternal/wt-lp/ops-install-restore/crates/infraternal)
    Finished `test` profile [unoptimized] target(s) in 1m 14s
     Running tests/agent_tunnel.rs (target/debug/deps/agent_tunnel-a9753a196773eab4)

running 1 test
test real_infraternal_agent_process_enrolls_and_reconnects_with_new_nonce ... ok

test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 2.15s

Follow-up fix for kayg/infraternal#48 Branch: ops-install-restore Base origin/dev: 450c297354f4d2f07c84ace930949a6bacdbb900 Starting HEAD: b396348188d94179e96fc4cb8564c90fda5655c8 (clean) Final HEAD: ba13a6d531d48da6d5f593358848066dc93b94c1 (clean) Commit: fix(storage): retain restore lease through native SQLite teardown (#48) Confirmed and fixed the review P1. SQLx 0.8.6 destroys rollback-hook captures before ConnectionHandle invokes native SQLite close. The per-connection shared operation lease now lives in an unused private SQLite collation capture via SQLx's safe API. SQLite 3.46.0 destroys that capture after every Btree/pager closes, WAL cleanup completes and database locks are released. This native file-shutdown acknowledgment remains effective if pool drain excludes a detached connection, or a close is dropped, cancellation-requested or timed out. The lease does not rely on pool size or an async future surviving. Existing bounded pool close is unchanged. No new production background polling/tasks, unsafe Rust, dependencies or request/frame allocations. Pool clones retain their existing closure ownership without extra storage-clone work. Primary source evidence: - [SQLx hook teardown](https://github.com/launchbadge/sqlx/blob/v0.8.6/sqlx-sqlite/src/connection/mod.rs#L557-L567) - [SQLx SQLite-owned collation capture](https://github.com/launchbadge/sqlx/blob/v0.8.6/sqlx-sqlite/src/connection/collation.rs#L76-L108) - [SQLite 3.46.0 native close ordering](https://github.com/sqlite/sqlite/blob/version-3.46.0/src/main.c#L1299-L1369) - [Documented collation destructor lifetime](https://www.sqlite.org/c3ref/create_collation.html) Regressions pause native teardown after authorization hooks are removed and before sqlite3_close. They independently require exclusive lease admission and public restore to refuse, check unchanged main/WAL bytes, then require successful restore after native shutdown. They cover detached acknowledged close, raw connection drop, cancellation requests and the existing checked-out close timeout. Tests use a bounded destructor rendezvous and a multi-thread runtime because SQLx can destroy native state on the thread polling close. Cooperative cancellation may complete the synchronous current poll; the final test accepts successful acknowledgment or a cancelled JoinError while keeping all restore/file assertions strict. [Tokio cancellation behavior](https://docs.rs/tokio/latest/tokio/task/struct.JoinHandle.html#method.abort). Corrected regressions failed before the production fix at early exclusive admission in all 3 cases (0 passed / 3 failed). Final focused SQLite gate passed all 10 tests. All 3 boundary cases then passed 20 consecutive repetitions (60 executions). Initial harness issues and their corrections are preserved in issue comments and local diagnostic logs; no refusal assertion was relaxed. The previous writer's install/enrollment/upgrade/uninstall docs and systemd templates, restore validation/publication/recovery logic, backup open path and actual historical-binary verification were preserved. The operations smoke built and ran pinned historical source e339ad192d9ebfbf9feebe4e725becb138c0c4b4 with scratch state. The production fix passed that full smoke; subsequent edits only corrected test-harness completion handling, and the final storage suite was rerun. Validation and remaining blocker: - scripts/verify operations: exit 0. - scripts/verify operations-storage on final sources: exit 0, 10 passed / 0 failed. - Final boundary diagnostic: 20 repetitions, 60 passed / 0 failed. - Required INFRATERNAL_VERIFY_RUN_ID=ops-install-restore scripts/verify fast: final exit 1 at web Vitest. All Rust workspace tests, Clippy, formatting, web build and frontend type checks passed. Full fast is NOT green. - Remaining fast blocker: auth.test.ts browser refresh coordination cases `both` (5000 ms timeout) and `locks` (false instead of true). Web/other frontend packages and bun.lock have no diff from the pinned base. auth.test.ts blob is 8e78e65dc1bd6e6ee5789efe253dc626f493a266 and auth.svelte.ts blob is 55902f33750de7967e65eb001707ace0d24d8e24, identical in base and working files. These tests mock fetch and browser globals; they do not call the Rust server. The focused unchanged auth diagnostic passed all 14 cases. No UI, timeout or network changes made; central verification must resolve/re-run this unrelated gate failure. - First fast attempt exited 101 at the existing remote inventory-publication test. Its focused unchanged diagnostic passed (1 test, 2.15 seconds), and the final full Rust workspace stage passed. Both attempts are recorded, not hidden. - Later fast stages (UI/stream Vitest, OpenAPI/client drift, terminal checks/tests) were not reached after final web Vitest failure. Merge/nightly, perf-test VM, host installation and Safari/iOS were not run. Nothing pushed; no issues closed. Actual output follows verbatim. Operations gate ```text WARN load5=38.97 exceeds online CPU count=8; timing-sensitive checks may be delayed PASS prepare: JavaScript dependencies (0.046s) PASS operations-storage: build web app (36.974s) test result: ok. 10 passed; 0 failed; 0 ignored; 0 measured; 107 filtered out; finished in 3.58s PASS operations-storage: SQLite restore unit tests (64.341s) PASS operations: build current binary (158.027s) PRIOR_BINARY_COMMIT e339ad192d9ebfbf9feebe4e725becb138c0c4b4 PASS operations: systemd templates and actual CLI arguments validate without service installation PASS operations: actual prior binary -> current binary retains state and migration lineage PASS operations: binary backup -> mutate -> restore; running server refusal PASS operations: corrupt snapshot rejected without changing destination PASS operations: committed crash WAL preserved; restored server restarts PASS operations: actual binary backup, restore and prior-version upgrade (113.056s) ``` Final storage gate ```text WARN load5=39.61 exceeds online CPU count=8; timing-sensitive checks may be delayed PASS prepare: JavaScript dependencies (0.060s) PASS operations-storage: build web app (58.900s) test result: ok. 10 passed; 0 failed; 0 ignored; 0 measured; 107 filtered out; finished in 3.14s PASS operations-storage: SQLite restore unit tests (224.341s) ``` Boundary repetitions (verified log summary) ```text PASS teardown boundary reproducibility: 20 repetitions, 60 tests passed, 0 failures ``` Final required fast gate ```text WARN load5=41.38 exceeds online CPU count=8; timing-sensitive checks may be delayed PASS fast: migrations are append-only (0.689s) PASS fast: workspace package dependencies (1.002s) PASS fast: JavaScript dependencies (0.070s) PASS fast: advisory review policy tests (0.867s) SUPPLY_CHAIN_REVIEWS advisory exceptions are within their review windows SUPPLY_CHAIN cargo-deny: cargo-deny 0.20.2 SUPPLY_CHAIN_NOTICES generated THIRD_PARTY_NOTICES.md from 95 frontend packages SUPPLY_CHAIN_NOTICES copied source: 179 shadcn files, 3 calternal-derived files SUPPLY_CHAIN_NOTICES license files: 66 distinct texts; 0 packages need manual license review advisories ok SUPPLY_CHAIN_RUST_ADVISORIES passed with refreshed advisory data licenses ok SUPPLY_CHAIN_RUST_LICENSES passed bun audit v1.4.2 (744846f84) cookie@0.6.0 workspace:@infraternal/web > @sveltejs/kit > cookie low: cookie accepts cookie name, path, and domain with out of bounds characters (<0.7.0) - https://github.com/advisories/GHSA-pxg6-pf52-xh8x 1 vulnerability (1 low) bun audit fix upgrade the vulnerable packages within their ranges bun audit fix --latest also cross major versions SUPPLY_CHAIN_BUN_AUDIT findings reported; this check is report-only SUPPLY_CHAIN_PASS Rust advisory/license checks complete; Bun findings are report-only PASS fast: supply-chain checks (20.201s) PASS fast: build web app (81.788s) PASS fast: cargo fmt --check (3.088s) PASS fast: cargo clippy (189.973s) PASS fast: cargo test (442.976s) PASS fast: svelte-check (78.122s) PASS fast: UI package svelte-check (27.987s) PASS fast: stream package typecheck (28.276s) FAIL fast: Vitest (29.445s) $ vitest run RUN v5.0.1 /mnt/hdd/infraternal/wt-lp/ops-install-restore/packages/web ❯ src/lib/auth.test.ts (14 tests | 2 failed) 6450ms ❯ browser refresh coordination (14) × both: refreshes and reports the supported mode 5049ms × locks: refreshes and reports the supported mode 461ms ⎯⎯⎯⎯⎯⎯⎯ Failed Tests 2 ⎯⎯⎯⎯⎯⎯⎯ FAIL src/lib/auth.test.ts > browser refresh coordination > both: refreshes and reports the supported mode Error: Test timed out in 5000ms. If this is a long-running test, pass a timeout value as the last argument or configure it globally with "testTimeout". ❯ src/lib/auth.test.ts:39:5 37| describe("browser refresh coordination", () => { 38| for (const mode of ["both", "locks", "neither"] as const) { 39| it(`${mode}: refreshes and reports the supported mode`, async () =… | ^ 40| const fetchMock = vi.fn().mockResolvedValueOnce(ok(session("0"))… 41| const auth = await loadAuth(mode, fetchMock); ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[1/2]⎯ FAIL src/lib/auth.test.ts > browser refresh coordination > locks: refreshes and reports the supported mode AssertionError: expected false to be true // Object.is equality - Expected + Received - true + false ❯ src/lib/auth.test.ts:42:42 40| const fetchMock = vi.fn().mockResolvedValueOnce(ok(session("0"))… 41| const auth = await loadAuth(mode, fetchMock); 42| await expect(auth.refreshSession()).resolves.toBe(true); | ^ 43| expect(auth.accessToken).toBe(token("0")); 44| expect(auth.singleTabNotice).toBe(mode !== "both"); ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[2/2]⎯ Test Files 1 failed | 9 passed (10) Tests 2 failed | 50 passed (52) Start at 12:37:46 Duration 18.10s (transform 71%, tests 18%, import 9%, worker 1%) Transform transforming modules took 31.41s · 71% of tracked time, re-done on every run persist transforms across runs with fsModuleCache: true learn more: https://vitest.dev/guide/improving-performance#caching-between-reruns error: script "test" exited with code 1 ``` Focused frontend diagnostic ```text $ vitest run src/lib/auth.test.ts RUN v5.0.1 /mnt/hdd/infraternal/wt-lp/ops-install-restore/packages/web Test Files 1 passed (1) Tests 14 passed (14) Start at 12:40:35 Duration 5.46s (tests 94%, transform 4%, import 1%) ``` Focused remote-enrollment diagnostic ```text Compiling tracing-subscriber v0.3.23 Compiling criterion v0.8.2 Compiling infraternal v0.0.1 (/mnt/hdd/infraternal/wt-lp/ops-install-restore/crates/infraternal) Finished `test` profile [unoptimized] target(s) in 1m 14s Running tests/agent_tunnel.rs (target/debug/deps/agent_tunnel-a9753a196773eab4) running 1 test test real_infraternal_agent_process_enrolls_and_reconnects_with_new_nonce ... ok test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 2.15s ```
Author
Owner

Resuming rs-stream-conformance as sole writer on branch stream-conformance. Base 450c297; starting HEAD ff65f249a1a6c72e4c5dc995f230dfdf23e53826, clean worktree. Checking prior conformance work and remaining documentation/tests; lean root-disk Cargo cache, nice 15, two build jobs. Final requested gate is INFRATERNAL_VERIFY_RUN_ID=rs-stream-conformance scripts/verify fast; no merge gate or push.

Resuming rs-stream-conformance as sole writer on branch `stream-conformance`. Base `450c297`; starting HEAD `ff65f249a1a6c72e4c5dc995f230dfdf23e53826`, clean worktree. Checking prior conformance work and remaining documentation/tests; lean root-disk Cargo cache, nice 15, two build jobs. Final requested gate is `INFRATERNAL_VERIFY_RUN_ID=rs-stream-conformance scripts/verify fast`; no merge gate or push.
Author
Owner

Finding during release measurement: the preset CARGO_TARGET_DIR=/home/kayg/.cache/infraternal-targets/rs-binsize resolves to /mnt/hdd/infraternal/wt-lp/perf-binsize/target, so it is not on the root disk as required. The release build ran 32 minutes and failed with:

error: failed to write `/home/kayg/.cache/infraternal-targets/rs-binsize/release/.fingerprint/infraternal-agent-f076b6663fec2e22/lib-infraternal_agent`
Caused by: No such file or directory (os error 2)

I have stopped using that path. / has 18 GB free and the existing target tree is 5.3 GB; I’ll reuse it by copying artifacts into a new non-symlinked cache under /home/kayg/.cache, then point Cargo there explicitly for the release build and required fast gate.

Finding during release measurement: the preset `CARGO_TARGET_DIR=/home/kayg/.cache/infraternal-targets/rs-binsize` resolves to `/mnt/hdd/infraternal/wt-lp/perf-binsize/target`, so it is not on the root disk as required. The release build ran 32 minutes and failed with: ``` error: failed to write `/home/kayg/.cache/infraternal-targets/rs-binsize/release/.fingerprint/infraternal-agent-f076b6663fec2e22/lib-infraternal_agent` Caused by: No such file or directory (os error 2) ``` I have stopped using that path. `/` has 18 GB free and the existing target tree is 5.3 GB; I’ll reuse it by copying artifacts into a new non-symlinked cache under `/home/kayg/.cache`, then point Cargo there explicitly for the release build and required fast gate.
Author
Owner

Verification is blocked by the build environment at unchanged head cd7ca3faf07621804f642f8e0f1793f72024e637.

The preset root-cache path was redirected to the worktree's HDD target during this job. The fast gate then failed at Clippy with SQLx/either artifact hash mismatch E0460. A separate root-disk cache copy was started to preserve the existing target and retry without HDD builds, but concurrent disk use reduced root free space from 19 GiB to 6.5 GiB and then 3.6 GiB. I stopped only my copy to avoid filling the root filesystem. The copied partial cache is /home/kayg/.cache/infraternal-targets/rs-session-authority-resume. No other job was signalled and no source was changed.

The fresh full workspace test run before the gate passed (exit 0); the earlier cargo-test failure did not reproduce. Product-source fixes are already committed at the head above. Fast remains incomplete, not green. Requested orchestration help to free root space or provide a permitted cache location; root-disk cache constraint prevents falling back to HDD builds.

Verification is blocked by the build environment at unchanged head `cd7ca3faf07621804f642f8e0f1793f72024e637`. The preset root-cache path was redirected to the worktree's HDD target during this job. The fast gate then failed at Clippy with SQLx/`either` artifact hash mismatch E0460. A separate root-disk cache copy was started to preserve the existing target and retry without HDD builds, but concurrent disk use reduced root free space from 19 GiB to 6.5 GiB and then 3.6 GiB. I stopped only my copy to avoid filling the root filesystem. The copied partial cache is `/home/kayg/.cache/infraternal-targets/rs-session-authority-resume`. No other job was signalled and no source was changed. The fresh full workspace test run before the gate passed (exit 0); the earlier cargo-test failure did not reproduce. Product-source fixes are already committed at the head above. Fast remains incomplete, not green. Requested orchestration help to free root space or provide a permitted cache location; root-disk cache constraint prevents falling back to HDD builds.
Author
Owner

rs-stream-conformance finished on branch stream-conformance, HEAD 6e687f50d6cc70a4c8e7543bf9ff0b107b56c4bb, base 450c297. No push or merge; issues remain open.

Preserved prior commit ff65f24 implementing D3/D4/D5/D6/D17: stream/tunnel oversize close 1009; channel-local invalid RESIZE; bounded tunnel frames, close codes, per-channel OPEN_ERR refusals, timestamped PING and shared control admission; generated TypeScript OPEN_ERR validation for all registered errors; cumulative Rust control budget shared by CLI and SSH clients.

Resume commits:

  • 9d4e23b: discard invalid RESIZE after channel retirement. A real TCP WebSocket regression verifies OPEN_ERR followed by late RESIZE produces PONG without a second CLOSE.
  • 6e687f5: document the Rust sliding one-second 256 KiB admission limit and tunnel inventory exception; add steady-state CREDIT and cumulative-refusal benchmarks to the existing proto harness; reject excessive payload counts without arithmetic overflow, with a regression test. Deque capacity reuse and bounded growth are explained in code.

All checks below completed with exit 0. Rust commands used CARGO_INCREMENTAL=0, CARGO_PROFILE_DEV_DEBUG=0, CARGO_PROFILE_TEST_DEBUG=0, CARGO_BUILD_JOBS=2, the preset root-disk CARGO_TARGET_DIR and nice -n 15. No timing failures required isolation or a retry. No verify merge was run. The final fast gate covers the committed source; its Rust tests include real TCP and mTLS conformance tests. Docker/Podman/sshd integration tiers and perf-test-VM A/B are not certified by this fast run. Criterion ran in test mode only; no performance measurements are claimed.

Requested gate: INFRATERNAL_VERIFY_RUN_ID=rs-stream-conformance scripts/verify fast (exit 0), output verbatim:

WARN load5=37.83 exceeds online CPU count=8; timing-sensitive checks may be delayed
PASS fast: migrations are append-only (0.659s)
PASS fast: workspace package dependencies (13.237s)
PASS fast: JavaScript dependencies (5.596s)
PASS fast: advisory review policy tests (0.140s)
SUPPLY_CHAIN_REVIEWS advisory exceptions are within their review windows
SUPPLY_CHAIN cargo-deny: cargo-deny 0.20.2
SUPPLY_CHAIN_NOTICES generated THIRD_PARTY_NOTICES.md from 95 frontend packages
SUPPLY_CHAIN_NOTICES copied source: 179 shadcn files, 3 calternal-derived files
SUPPLY_CHAIN_NOTICES license files: 66 distinct texts; 0 packages need manual license review
advisories ok
SUPPLY_CHAIN_RUST_ADVISORIES passed with refreshed advisory data
licenses ok
SUPPLY_CHAIN_RUST_LICENSES passed
bun audit v1.4.2 (744846f84)

cookie@0.6.0
  workspace:@infraternal/web > @sveltejs/kit > cookie
  low: cookie accepts cookie name, path, and domain with out of bounds characters (<0.7.0) - https://github.com/advisories/GHSA-pxg6-pf52-xh8x

1 vulnerability (1 low)

  bun audit fix           upgrade the vulnerable packages within their ranges
  bun audit fix --latest  also cross major versions
SUPPLY_CHAIN_BUN_AUDIT findings reported; this check is report-only
SUPPLY_CHAIN_PASS Rust advisory/license checks complete; Bun findings are report-only
PASS fast: supply-chain checks (48.624s)
PASS fast: build web app (75.997s)
PASS fast: cargo fmt --check (2.893s)
PASS fast: cargo clippy (1262.559s)
PASS fast: cargo test (940.319s)
PASS fast: svelte-check (133.779s)
PASS fast: UI package svelte-check (42.354s)
PASS fast: stream package typecheck (20.098s)
PASS fast: Vitest (19.321s)
PASS fast: UI package Vitest (63.849s)
PASS fast: stream package Vitest (2.178s)
PASS fast: OpenAPI and TypeScript client drift (143.634s)
PASS fast: terminal TypeScript (6.588s)
PASS fast: terminal Vitest (1.907s)

Workspace Rust test results and selected conformance test lines, verbatim:

test stream::tests::control_frame_flood_closes_websocket_with_policy_code_1008 ... ok
test stream::tests::oversized_frame_closes_websocket_with_message_too_big_code_1009 ... ok
test result: ok. 48 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 1.04s
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 2.22s
test result: ok. 8 passed; 0 failed; 3 ignored; 0 measured; 0 filtered out; finished in 0.00s
test result: ok. 0 passed; 0 failed; 4 ignored; 0 measured; 0 filtered out; finished in 0.00s
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.53s
test remote::tests::benchmark_tunnel_credit_accounting ... ignored, benchmark only on the perf-test VM
test remote::tests::live_tunnel_reconciliation_preserves_unrelated_channel ... ignored, requires real Docker and rootless Podman
test remote::tests::bulk_channel_completion_stays_behind_its_queued_data ... ok
test remote::tests::enrollment_origin_only_allows_loopback_http_or_https_root ... ok
test remote::tests::excess_or_malformed_open_is_refused_without_ending_the_tunnel ... ok
test remote::tests::forced_authorization_close_overtakes_queued_bulk_data ... ok
test remote::tests::frames_for_retired_ids_are_discarded_and_never_opened_ids_are_fatal ... ok
test remote::tests::inbound_websocket_messages_map_to_contract_close_codes ... ok
test remote::tests::physical_tunnel_credit_is_shared_across_clients_and_released ... ok
test remote::tests::private_identity_files_are_owner_only_and_not_overwritten ... ok
test remote::tests::tunnel_ping_carries_the_current_unix_time ... ok
test remote::tests::tunnel_websocket_limits_are_one_contract_frame ... ok
test remote::tests::tunnel_writer_sends_the_requested_close_code ... ok
test result: ok. 17 passed; 0 failed; 7 ignored; 0 measured; 0 filtered out; finished in 0.21s
test result: ok. 0 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 0.00s
test result: ok. 15 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 1.29s
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
test docker_exec_pty_reports_initial_and_resized_dimensions_to_child ... ignored, requires rootful Docker
test result: ok. 0 passed; 0 failed; 12 ignored; 0 measured; 0 filtered out; finished in 0.00s
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
test stream::bucket::tests::empty_payloads_only_spend_frame_tokens ... ok
test stream::bucket::tests::excessive_payload_is_refused_without_overflow_or_spending_admission ... ok
test stream::bucket::tests::frame_rate_has_a_burst_then_refills_at_200_per_second ... ok
test stream::bucket::tests::payload_budget_is_cumulative_across_frames_not_per_frame ... ok
test stream::frame::tests::resize_direction_depends_on_the_connection_peer ... ok
test result: ok. 66 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 2.11s
test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.74s
test tests::console_does_not_imply_exec_and_resize_requires_pty ... ok
test result: ok. 25 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.23s
test capabilities::tests::termination_ack_deadline_includes_a_stalled_resize_lock ... ignored, run explicitly; injects a stalled resize lock
test result: ok. 47 passed; 0 failed; 5 ignored; 0 measured; 0 filtered out; finished in 3.10s
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
test result: ok. 0 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 0.00s
test result: ok. 4 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
test result: ok. 0 passed; 0 failed; 2 ignored; 0 measured; 0 filtered out; finished in 0.00s
test stream::tests::out_of_range_resize_closes_only_its_channel_with_invalid_value ... ok
test result: ok. 109 passed; 0 failed; 2 ignored; 0 measured; 0 filtered out; finished in 9.51s
test result: ok. 5 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.82s
test tunnel_violations_close_with_contract_codes_and_agent_open_is_refused ... ok
test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 1.48s
test result: ok. 18 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 16.27s
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.09s
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.81s
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.82s
test result: ok. 5 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.41s
test result: ok. 5 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.99s
test result: ok. 3 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 57.57s
test result: ok. 0 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 0.00s
test host_trust_stream_replay_resize_close_and_changed_key ... ignored, requires real sshd, ssh-keygen and tmux
test result: ok. 0 passed; 0 failed; 4 ignored; 0 measured; 0 filtered out; finished in 0.00s
test result: ok. 24 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 4.57s
test oversized_client_message_is_refused_with_close_1009 ... ok
test out_of_range_resize_for_a_retired_channel_is_discarded ... ok
test result: ok. 10 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 1.62s
test result: ok. 9 passed; 0 failed; 4 ignored; 0 measured; 0 filtered out; finished in 0.28s
test result: ok. 7 passed; 0 failed; 12 ignored; 0 measured; 0 filtered out; finished in 11.75s
test result: ok. 34 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.76s
test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.01s
test pty_resize_and_replay ... ignored, requires OpenSSH server tools (sshd and ssh-keygen)
test result: ok. 1 passed; 0 failed; 15 ignored; 0 measured; 0 filtered out; finished in 0.00s
test result: ok. 1 passed; 0 failed; 3 ignored; 0 measured; 0 filtered out; finished in 0.14s
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

Focused stream package: bun --cwd=packages/stream run check and bun --cwd=packages/stream run test, both nice -n 15, exit 0; output verbatim:

$ tsc --noEmit
$ vitest run

 RUN  v5.0.1 /mnt/hdd/infraternal/wt-lp/stream-conformance/packages/stream


 Test Files  4 passed (4)
      Tests  75 passed (75)
   Start at  12:36:27
   Duration  7.68s (transform 51%, tests 30%, import 13%, worker 6%)

  Transform  transforming modules took 6.89s · 51% of tracked time, re-done on every run
             persist transforms across runs with fsModuleCache: true
             learn more: https://vitest.dev/guide/improving-performance#caching-between-reruns

Benchmark smoke: cargo test -p infraternal-proto --bench stream -- control_admission --test, exit 0; output verbatim:

   Compiling syn v2.0.119
   Compiling serde_core v1.0.229
   Compiling syn v3.0.6
   Compiling zerocopy-derive v0.8.59
   Compiling serde v1.0.229
   Compiling getrandom v0.4.3
   Compiling serde_derive v1.0.229
   Compiling zerocopy v0.8.59
   Compiling serde_json v1.0.151
   Compiling memchr v2.8.3
   Compiling num-traits v0.2.19
   Compiling getrandom v0.3.4
   Compiling rustix v1.1.5
   Compiling cc v1.5.1
   Compiling rand_core v0.9.5
   Compiling linux-raw-sys v0.12.1
   Compiling either v1.18.0
   Compiling alloca v0.4.0
   Compiling chacha20 v0.10.2
   Compiling half v2.7.1
   Compiling once_cell v1.21.4
   Compiling indexmap v2.14.2
   Compiling ciborium-ll v0.2.2
   Compiling tempfile v3.27.0
   Compiling clap_builder v4.6.7
   Compiling rand v0.10.3
   Compiling itertools v0.13.0
   Compiling regex-automata v0.4.18
   Compiling ppv-lite86 v0.2.21
   Compiling utoipa-gen v5.5.0
   Compiling wait-timeout v0.2.1
   Compiling serde_json_canonicalizer v0.3.2
   Compiling rusty-fork v0.3.1
   Compiling tokio v1.53.1
   Compiling criterion-plot v0.8.2
   Compiling rand_chacha v0.9.0
   Compiling regex v1.13.1
   Compiling clap v4.6.7
   Compiling rayon v1.12.0
   Compiling utoipa v5.5.0
   Compiling ulid v3.0.0
   Compiling ciborium v0.2.2
   Compiling plotters v0.3.7
   Compiling tinytemplate v1.2.1
   Compiling rand v0.9.5
   Compiling rand_xorshift v0.4.0
   Compiling page_size v0.6.0
   Compiling infraternal-proto v0.0.1 (/mnt/hdd/infraternal/wt-lp/stream-conformance/crates/proto)
   Compiling criterion v0.8.2
   Compiling proptest v1.11.0
    Finished `test` profile [unoptimized] target(s) in 1m 22s
     Running benches/stream.rs (/home/kayg/.cache/infraternal-targets/rs-stream-conformance/debug/deps/stream-86dba6da9bb1aa28)
Gnuplot not found, using plotters backend
Testing control_admission_credit_steady_state
Success

Testing control_admission_cumulative_payload_refusal
Success

Code index rebuilt, refreshed after edits, and queried for ControlBucket and the stream impact radius. No independent review is claimed by this author job.

API references checked: Criterion batched reference timing, Criterion test mode, VecDeque capacity.

Final /usr/bin/git status --short output was empty (exit 0); temporary target symlink removed. Build artifacts and this report remain only in the root-disk cache.

rs-stream-conformance finished on branch `stream-conformance`, HEAD `6e687f50d6cc70a4c8e7543bf9ff0b107b56c4bb`, base `450c297`. No push or merge; issues remain open. Preserved prior commit `ff65f24` implementing D3/D4/D5/D6/D17: stream/tunnel oversize close 1009; channel-local invalid RESIZE; bounded tunnel frames, close codes, per-channel OPEN_ERR refusals, timestamped PING and shared control admission; generated TypeScript OPEN_ERR validation for all registered errors; cumulative Rust control budget shared by CLI and SSH clients. Resume commits: - `9d4e23b`: discard invalid RESIZE after channel retirement. A real TCP WebSocket regression verifies OPEN_ERR followed by late RESIZE produces PONG without a second CLOSE. - `6e687f5`: document the Rust sliding one-second 256 KiB admission limit and tunnel inventory exception; add steady-state CREDIT and cumulative-refusal benchmarks to the existing proto harness; reject excessive payload counts without arithmetic overflow, with a regression test. Deque capacity reuse and bounded growth are explained in code. All checks below completed with exit 0. Rust commands used CARGO_INCREMENTAL=0, CARGO_PROFILE_DEV_DEBUG=0, CARGO_PROFILE_TEST_DEBUG=0, CARGO_BUILD_JOBS=2, the preset root-disk CARGO_TARGET_DIR and nice -n 15. No timing failures required isolation or a retry. No `verify merge` was run. The final fast gate covers the committed source; its Rust tests include real TCP and mTLS conformance tests. Docker/Podman/sshd integration tiers and perf-test-VM A/B are not certified by this fast run. Criterion ran in test mode only; no performance measurements are claimed. Requested gate: `INFRATERNAL_VERIFY_RUN_ID=rs-stream-conformance scripts/verify fast` (exit 0), output verbatim: ```text WARN load5=37.83 exceeds online CPU count=8; timing-sensitive checks may be delayed PASS fast: migrations are append-only (0.659s) PASS fast: workspace package dependencies (13.237s) PASS fast: JavaScript dependencies (5.596s) PASS fast: advisory review policy tests (0.140s) SUPPLY_CHAIN_REVIEWS advisory exceptions are within their review windows SUPPLY_CHAIN cargo-deny: cargo-deny 0.20.2 SUPPLY_CHAIN_NOTICES generated THIRD_PARTY_NOTICES.md from 95 frontend packages SUPPLY_CHAIN_NOTICES copied source: 179 shadcn files, 3 calternal-derived files SUPPLY_CHAIN_NOTICES license files: 66 distinct texts; 0 packages need manual license review advisories ok SUPPLY_CHAIN_RUST_ADVISORIES passed with refreshed advisory data licenses ok SUPPLY_CHAIN_RUST_LICENSES passed bun audit v1.4.2 (744846f84) cookie@0.6.0 workspace:@infraternal/web > @sveltejs/kit > cookie low: cookie accepts cookie name, path, and domain with out of bounds characters (<0.7.0) - https://github.com/advisories/GHSA-pxg6-pf52-xh8x 1 vulnerability (1 low) bun audit fix upgrade the vulnerable packages within their ranges bun audit fix --latest also cross major versions SUPPLY_CHAIN_BUN_AUDIT findings reported; this check is report-only SUPPLY_CHAIN_PASS Rust advisory/license checks complete; Bun findings are report-only PASS fast: supply-chain checks (48.624s) PASS fast: build web app (75.997s) PASS fast: cargo fmt --check (2.893s) PASS fast: cargo clippy (1262.559s) PASS fast: cargo test (940.319s) PASS fast: svelte-check (133.779s) PASS fast: UI package svelte-check (42.354s) PASS fast: stream package typecheck (20.098s) PASS fast: Vitest (19.321s) PASS fast: UI package Vitest (63.849s) PASS fast: stream package Vitest (2.178s) PASS fast: OpenAPI and TypeScript client drift (143.634s) PASS fast: terminal TypeScript (6.588s) PASS fast: terminal Vitest (1.907s) ``` Workspace Rust test results and selected conformance test lines, verbatim: ```text test stream::tests::control_frame_flood_closes_websocket_with_policy_code_1008 ... ok test stream::tests::oversized_frame_closes_websocket_with_message_too_big_code_1009 ... ok test result: ok. 48 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 1.04s test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 2.22s test result: ok. 8 passed; 0 failed; 3 ignored; 0 measured; 0 filtered out; finished in 0.00s test result: ok. 0 passed; 0 failed; 4 ignored; 0 measured; 0 filtered out; finished in 0.00s test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.53s test remote::tests::benchmark_tunnel_credit_accounting ... ignored, benchmark only on the perf-test VM test remote::tests::live_tunnel_reconciliation_preserves_unrelated_channel ... ignored, requires real Docker and rootless Podman test remote::tests::bulk_channel_completion_stays_behind_its_queued_data ... ok test remote::tests::enrollment_origin_only_allows_loopback_http_or_https_root ... ok test remote::tests::excess_or_malformed_open_is_refused_without_ending_the_tunnel ... ok test remote::tests::forced_authorization_close_overtakes_queued_bulk_data ... ok test remote::tests::frames_for_retired_ids_are_discarded_and_never_opened_ids_are_fatal ... ok test remote::tests::inbound_websocket_messages_map_to_contract_close_codes ... ok test remote::tests::physical_tunnel_credit_is_shared_across_clients_and_released ... ok test remote::tests::private_identity_files_are_owner_only_and_not_overwritten ... ok test remote::tests::tunnel_ping_carries_the_current_unix_time ... ok test remote::tests::tunnel_websocket_limits_are_one_contract_frame ... ok test remote::tests::tunnel_writer_sends_the_requested_close_code ... ok test result: ok. 17 passed; 0 failed; 7 ignored; 0 measured; 0 filtered out; finished in 0.21s test result: ok. 0 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 0.00s test result: ok. 15 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 1.29s test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s test docker_exec_pty_reports_initial_and_resized_dimensions_to_child ... ignored, requires rootful Docker test result: ok. 0 passed; 0 failed; 12 ignored; 0 measured; 0 filtered out; finished in 0.00s test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s test stream::bucket::tests::empty_payloads_only_spend_frame_tokens ... ok test stream::bucket::tests::excessive_payload_is_refused_without_overflow_or_spending_admission ... ok test stream::bucket::tests::frame_rate_has_a_burst_then_refills_at_200_per_second ... ok test stream::bucket::tests::payload_budget_is_cumulative_across_frames_not_per_frame ... ok test stream::frame::tests::resize_direction_depends_on_the_connection_peer ... ok test result: ok. 66 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 2.11s test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.74s test tests::console_does_not_imply_exec_and_resize_requires_pty ... ok test result: ok. 25 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.23s test capabilities::tests::termination_ack_deadline_includes_a_stalled_resize_lock ... ignored, run explicitly; injects a stalled resize lock test result: ok. 47 passed; 0 failed; 5 ignored; 0 measured; 0 filtered out; finished in 3.10s test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s test result: ok. 0 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 0.00s test result: ok. 4 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s test result: ok. 0 passed; 0 failed; 2 ignored; 0 measured; 0 filtered out; finished in 0.00s test stream::tests::out_of_range_resize_closes_only_its_channel_with_invalid_value ... ok test result: ok. 109 passed; 0 failed; 2 ignored; 0 measured; 0 filtered out; finished in 9.51s test result: ok. 5 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.82s test tunnel_violations_close_with_contract_codes_and_agent_open_is_refused ... ok test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 1.48s test result: ok. 18 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 16.27s test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.09s test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.81s test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.82s test result: ok. 5 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.41s test result: ok. 5 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.99s test result: ok. 3 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 57.57s test result: ok. 0 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 0.00s test host_trust_stream_replay_resize_close_and_changed_key ... ignored, requires real sshd, ssh-keygen and tmux test result: ok. 0 passed; 0 failed; 4 ignored; 0 measured; 0 filtered out; finished in 0.00s test result: ok. 24 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 4.57s test oversized_client_message_is_refused_with_close_1009 ... ok test out_of_range_resize_for_a_retired_channel_is_discarded ... ok test result: ok. 10 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 1.62s test result: ok. 9 passed; 0 failed; 4 ignored; 0 measured; 0 filtered out; finished in 0.28s test result: ok. 7 passed; 0 failed; 12 ignored; 0 measured; 0 filtered out; finished in 11.75s test result: ok. 34 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.76s test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.01s test pty_resize_and_replay ... ignored, requires OpenSSH server tools (sshd and ssh-keygen) test result: ok. 1 passed; 0 failed; 15 ignored; 0 measured; 0 filtered out; finished in 0.00s test result: ok. 1 passed; 0 failed; 3 ignored; 0 measured; 0 filtered out; finished in 0.14s test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s ``` Focused stream package: `bun --cwd=packages/stream run check` and `bun --cwd=packages/stream run test`, both nice -n 15, exit 0; output verbatim: ```text $ tsc --noEmit $ vitest run RUN v5.0.1 /mnt/hdd/infraternal/wt-lp/stream-conformance/packages/stream Test Files 4 passed (4) Tests 75 passed (75) Start at 12:36:27 Duration 7.68s (transform 51%, tests 30%, import 13%, worker 6%) Transform transforming modules took 6.89s · 51% of tracked time, re-done on every run persist transforms across runs with fsModuleCache: true learn more: https://vitest.dev/guide/improving-performance#caching-between-reruns ``` Benchmark smoke: `cargo test -p infraternal-proto --bench stream -- control_admission --test`, exit 0; output verbatim: ```text Compiling syn v2.0.119 Compiling serde_core v1.0.229 Compiling syn v3.0.6 Compiling zerocopy-derive v0.8.59 Compiling serde v1.0.229 Compiling getrandom v0.4.3 Compiling serde_derive v1.0.229 Compiling zerocopy v0.8.59 Compiling serde_json v1.0.151 Compiling memchr v2.8.3 Compiling num-traits v0.2.19 Compiling getrandom v0.3.4 Compiling rustix v1.1.5 Compiling cc v1.5.1 Compiling rand_core v0.9.5 Compiling linux-raw-sys v0.12.1 Compiling either v1.18.0 Compiling alloca v0.4.0 Compiling chacha20 v0.10.2 Compiling half v2.7.1 Compiling once_cell v1.21.4 Compiling indexmap v2.14.2 Compiling ciborium-ll v0.2.2 Compiling tempfile v3.27.0 Compiling clap_builder v4.6.7 Compiling rand v0.10.3 Compiling itertools v0.13.0 Compiling regex-automata v0.4.18 Compiling ppv-lite86 v0.2.21 Compiling utoipa-gen v5.5.0 Compiling wait-timeout v0.2.1 Compiling serde_json_canonicalizer v0.3.2 Compiling rusty-fork v0.3.1 Compiling tokio v1.53.1 Compiling criterion-plot v0.8.2 Compiling rand_chacha v0.9.0 Compiling regex v1.13.1 Compiling clap v4.6.7 Compiling rayon v1.12.0 Compiling utoipa v5.5.0 Compiling ulid v3.0.0 Compiling ciborium v0.2.2 Compiling plotters v0.3.7 Compiling tinytemplate v1.2.1 Compiling rand v0.9.5 Compiling rand_xorshift v0.4.0 Compiling page_size v0.6.0 Compiling infraternal-proto v0.0.1 (/mnt/hdd/infraternal/wt-lp/stream-conformance/crates/proto) Compiling criterion v0.8.2 Compiling proptest v1.11.0 Finished `test` profile [unoptimized] target(s) in 1m 22s Running benches/stream.rs (/home/kayg/.cache/infraternal-targets/rs-stream-conformance/debug/deps/stream-86dba6da9bb1aa28) Gnuplot not found, using plotters backend Testing control_admission_credit_steady_state Success Testing control_admission_cumulative_payload_refusal Success ``` Code index rebuilt, refreshed after edits, and queried for ControlBucket and the stream impact radius. No independent review is claimed by this author job. API references checked: [Criterion batched reference timing](https://docs.rs/criterion/latest/criterion/struct.Bencher.html#method.iter_batched_ref), [Criterion test mode](https://bheisler.github.io/criterion.rs/book/faq.html), [VecDeque capacity](https://doc.rust-lang.org/std/collections/struct.VecDeque.html). Final `/usr/bin/git status --short` output was empty (exit 0); temporary target symlink removed. Build artifacts and this report remain only in the root-disk cache.
Author
Owner

rs-tunnel-drop completed at HEAD 2abb7e93d66bcde5015dbc9a9d45223f754c609b on tunnel-drop-close; merged batch-1003a including 22ac67d and retained original stop deadlines. Drop/replacement now use the audited host_offline path, with local-channel isolation and generation-preservation regressions. Required final INFRATERNAL_VERIFY_RUN_ID=rs-tunnel-drop scripts/verify fast exited 0; no merge gate or push. Full head, findings and verbatim gate/focused test output are recorded in #49. Two prior focused inherited rate-limit flood failures are recorded there; final workspace tests passed.

rs-tunnel-drop completed at HEAD `2abb7e93d66bcde5015dbc9a9d45223f754c609b` on `tunnel-drop-close`; merged batch-1003a including 22ac67d and retained original stop deadlines. Drop/replacement now use the audited host_offline path, with local-channel isolation and generation-preservation regressions. Required final `INFRATERNAL_VERIFY_RUN_ID=rs-tunnel-drop scripts/verify fast` exited 0; no merge gate or push. Full head, findings and verbatim gate/focused test output are recorded in [#49](https://git.kayg.org/kayg/infraternal/issues/49). Two prior focused inherited rate-limit flood failures are recorded there; final workspace tests passed.
Author
Owner

rs-replay-admission resume finished on replay-book-admission.

Head: dbb19e7b51e9c5acf6c2312cf25071f1eb9da70c. Resume base: 9dd7fa5d1f565fc7f08e77b6869432607a5a0042. New logical commit: fix(authz): isolate plan grants from read replay admission. Worktree is clean; no push and no issues closed. Related: #49 / #48 / #46.

Finished the remaining scope:

  • Preserved the previous A1/A9 implementation: every pre-action and post-action signed inspect is admitted, embedded routing included; budgets use users rather than tokens, with an owner-wide ceiling. Refused read-only action requests sign nothing.
  • Completed the explicit A2 requirement for plans on their own book: three independently bounded 4096-entry replay books for reads, plans and OPEN/actions. The server and infraternal agent share the classification, and plan grants use separate per-(user, owning infraternal agent) admission buckets, at the read numeric rates. Legacy OPEN and provider grants retain the 10 s server lifetime.
  • Retained A7's atomic fence/idempotency mark and the 130 s execution deadline. Corrected the freshness documentation: signing follows the fence commit, so the 10 s lifetime bounds acceptance from signing; a scheduling delay before signing is outside that bound.
  • Added fixed-time full-book isolation checks in both directions, OPEN/action acceptance with full read/plan books, and plan-book clearing/old-nonce denial after tunnel reset. Admission tests now exercise all three classes at a controlled instant. Added the perf-VM-only warm acceptance/refusal benchmark; no performance measurement or budget certification is claimed.

Regression proof: before the split, the test failed with a full read book must leave plan grants available: ResourceExhausted (exit 101). Final workspace tests include the strengthened fixed-time and nonce-reset checks. Relevant final test output, quoted verbatim:

test unsupported_tampered_stale_binding_and_malformed_calls_fail_before_provider_io ... ok
test discovery_inspect_plan_and_action_round_trip_through_the_runtime ... ok
test read_flood_cannot_starve_open_or_mutation_grants ... ok
test result: ok. 3 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 83.15s
test host_route::tests::admission_ceilings_stay_below_replay_book_capacity ... ok
test host_route::tests::admission_is_per_user_and_agent_with_an_agent_ceiling ... ok
test host_route::tests::benchmark_grant_admission ... ignored, benchmark only on the perf-test VM; A/B against the base head
test storage::fence_tests::container_dispatch_marks_idempotency_inside_the_fence ... ok
test tunnel::provider_rpc_tests::read_only_action_flood_signs_nothing_and_leaves_the_owner_working ... ok
test result: ok. 114 passed; 0 failed; 3 ignored; 0 measured; 0 filtered out; finished in 8.45s

Required gate command: nice -n 15 env CARGO_INCREMENTAL=0 CARGO_PROFILE_DEV_DEBUG=0 CARGO_PROFILE_TEST_DEBUG=0 CARGO_BUILD_JOBS=2 INFRATERNAL_VERIFY_RUN_ID=rs-replay-admission scripts/verify fast. Exit 0. Exact complete gate output:

WARN load5=37.26 exceeds online CPU count=8; timing-sensitive checks may be delayed
PASS fast: migrations are append-only (2.056s)
PASS fast: workspace package dependencies (3.350s)
PASS fast: JavaScript dependencies (0.534s)
PASS fast: advisory review policy tests (1.458s)
SUPPLY_CHAIN_REVIEWS advisory exceptions are within their review windows
SUPPLY_CHAIN cargo-deny: cargo-deny 0.20.2
SUPPLY_CHAIN_NOTICES generated THIRD_PARTY_NOTICES.md from 95 frontend packages
SUPPLY_CHAIN_NOTICES copied source: 179 shadcn files, 3 calternal-derived files
SUPPLY_CHAIN_NOTICES license files: 66 distinct texts; 0 packages need manual license review
advisories ok
SUPPLY_CHAIN_RUST_ADVISORIES passed with refreshed advisory data
licenses ok
SUPPLY_CHAIN_RUST_LICENSES passed
bun audit v1.4.2 (744846f84)

cookie@0.6.0
  workspace:@infraternal/web > @sveltejs/kit > cookie
  low: cookie accepts cookie name, path, and domain with out of bounds characters (<0.7.0) - https://github.com/advisories/GHSA-pxg6-pf52-xh8x

1 vulnerability (1 low)

  bun audit fix           upgrade the vulnerable packages within their ranges
  bun audit fix --latest  also cross major versions
SUPPLY_CHAIN_BUN_AUDIT findings reported; this check is report-only
SUPPLY_CHAIN_PASS Rust advisory/license checks complete; Bun findings are report-only
PASS fast: supply-chain checks (41.606s)
PASS fast: build web app (109.051s)
PASS fast: cargo fmt --check (5.661s)
PASS fast: cargo clippy (996.863s)
PASS fast: cargo test (558.788s)
PASS fast: svelte-check (49.863s)
PASS fast: UI package svelte-check (10.158s)
PASS fast: stream package typecheck (15.425s)
PASS fast: Vitest (16.905s)
PASS fast: UI package Vitest (62.335s)
PASS fast: stream package Vitest (3.315s)
PASS fast: OpenAPI and TypeScript client drift (188.201s)
PASS fast: terminal TypeScript (7.974s)
PASS fast: terminal Vitest (2.652s)

The low cookie advisory is the existing report-only Bun finding. No dependency changes. No verify merge, other full gate, or perf-VM A/B was run; independent review and merge/performance gates remain with the orchestrator.

Tooling/host notes: the graph was absent; rebuild and queries were attempted before raw searches, but queries returned no indexed nodes while the database was locked. The owned prolonged rebuild was stopped and direct source/diff review supplied the fallback. The preset root-disk cache was cold. The former worktree target was moved off /mnt/hdd; its obsolete cache was later removed when root free space fell to 8 GB. A temporary root-target symlink supported the gate summary and was removed after the gate. Active build artifacts remain only in the preset root-disk target, outside git.

rs-replay-admission resume finished on `replay-book-admission`. Head: `dbb19e7b51e9c5acf6c2312cf25071f1eb9da70c`. Resume base: `9dd7fa5d1f565fc7f08e77b6869432607a5a0042`. New logical commit: `fix(authz): isolate plan grants from read replay admission`. Worktree is clean; no push and no issues closed. Related: #49 / #48 / #46. Finished the remaining scope: - Preserved the previous A1/A9 implementation: every pre-action and post-action signed inspect is admitted, embedded routing included; budgets use users rather than tokens, with an owner-wide ceiling. Refused read-only action requests sign nothing. - Completed the explicit A2 requirement for plans on their own book: three independently bounded 4096-entry replay books for reads, plans and OPEN/actions. The server and infraternal agent share the classification, and plan grants use separate per-(user, owning infraternal agent) admission buckets, at the read numeric rates. Legacy OPEN and provider grants retain the 10 s server lifetime. - Retained A7's atomic fence/idempotency mark and the 130 s execution deadline. Corrected the freshness documentation: signing follows the fence commit, so the 10 s lifetime bounds acceptance from signing; a scheduling delay before signing is outside that bound. - Added fixed-time full-book isolation checks in both directions, OPEN/action acceptance with full read/plan books, and plan-book clearing/old-nonce denial after tunnel reset. Admission tests now exercise all three classes at a controlled instant. Added the perf-VM-only warm acceptance/refusal benchmark; no performance measurement or budget certification is claimed. Regression proof: before the split, the test failed with `a full read book must leave plan grants available: ResourceExhausted` (exit 101). Final workspace tests include the strengthened fixed-time and nonce-reset checks. Relevant final test output, quoted verbatim: ```text test unsupported_tampered_stale_binding_and_malformed_calls_fail_before_provider_io ... ok test discovery_inspect_plan_and_action_round_trip_through_the_runtime ... ok test read_flood_cannot_starve_open_or_mutation_grants ... ok test result: ok. 3 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 83.15s test host_route::tests::admission_ceilings_stay_below_replay_book_capacity ... ok test host_route::tests::admission_is_per_user_and_agent_with_an_agent_ceiling ... ok test host_route::tests::benchmark_grant_admission ... ignored, benchmark only on the perf-test VM; A/B against the base head test storage::fence_tests::container_dispatch_marks_idempotency_inside_the_fence ... ok test tunnel::provider_rpc_tests::read_only_action_flood_signs_nothing_and_leaves_the_owner_working ... ok test result: ok. 114 passed; 0 failed; 3 ignored; 0 measured; 0 filtered out; finished in 8.45s ``` Required gate command: `nice -n 15 env CARGO_INCREMENTAL=0 CARGO_PROFILE_DEV_DEBUG=0 CARGO_PROFILE_TEST_DEBUG=0 CARGO_BUILD_JOBS=2 INFRATERNAL_VERIFY_RUN_ID=rs-replay-admission scripts/verify fast`. Exit 0. Exact complete gate output: ```text WARN load5=37.26 exceeds online CPU count=8; timing-sensitive checks may be delayed PASS fast: migrations are append-only (2.056s) PASS fast: workspace package dependencies (3.350s) PASS fast: JavaScript dependencies (0.534s) PASS fast: advisory review policy tests (1.458s) SUPPLY_CHAIN_REVIEWS advisory exceptions are within their review windows SUPPLY_CHAIN cargo-deny: cargo-deny 0.20.2 SUPPLY_CHAIN_NOTICES generated THIRD_PARTY_NOTICES.md from 95 frontend packages SUPPLY_CHAIN_NOTICES copied source: 179 shadcn files, 3 calternal-derived files SUPPLY_CHAIN_NOTICES license files: 66 distinct texts; 0 packages need manual license review advisories ok SUPPLY_CHAIN_RUST_ADVISORIES passed with refreshed advisory data licenses ok SUPPLY_CHAIN_RUST_LICENSES passed bun audit v1.4.2 (744846f84) cookie@0.6.0 workspace:@infraternal/web > @sveltejs/kit > cookie low: cookie accepts cookie name, path, and domain with out of bounds characters (<0.7.0) - https://github.com/advisories/GHSA-pxg6-pf52-xh8x 1 vulnerability (1 low) bun audit fix upgrade the vulnerable packages within their ranges bun audit fix --latest also cross major versions SUPPLY_CHAIN_BUN_AUDIT findings reported; this check is report-only SUPPLY_CHAIN_PASS Rust advisory/license checks complete; Bun findings are report-only PASS fast: supply-chain checks (41.606s) PASS fast: build web app (109.051s) PASS fast: cargo fmt --check (5.661s) PASS fast: cargo clippy (996.863s) PASS fast: cargo test (558.788s) PASS fast: svelte-check (49.863s) PASS fast: UI package svelte-check (10.158s) PASS fast: stream package typecheck (15.425s) PASS fast: Vitest (16.905s) PASS fast: UI package Vitest (62.335s) PASS fast: stream package Vitest (3.315s) PASS fast: OpenAPI and TypeScript client drift (188.201s) PASS fast: terminal TypeScript (7.974s) PASS fast: terminal Vitest (2.652s) ``` The low cookie advisory is the existing report-only Bun finding. No dependency changes. No `verify merge`, other full gate, or perf-VM A/B was run; independent review and merge/performance gates remain with the orchestrator. Tooling/host notes: the graph was absent; rebuild and queries were attempted before raw searches, but queries returned no indexed nodes while the database was locked. The owned prolonged rebuild was stopped and direct source/diff review supplied the fallback. The preset root-disk cache was cold. The former worktree target was moved off /mnt/hdd; its obsolete cache was later removed when root free space fell to 8 GB. A temporary root-target symlink supported the gate summary and was removed after the gate. Active build artifacts remain only in the preset root-disk target, outside git.
Author
Owner

Job rs-mutation-safety finished on branch mutation-safety at d0952a66460672cc51b94bd6da47867a7c296d28; original base 450c297. Worktree clean. No push or merge gate.

Retained implementation commit 1f62954; added d0952a6 (real SQLite busy exhaustion/resumption regression). Both commits contain the requested attribution/session trailers.

Finished and verified:

  • D1: sorted per-target locks, 10-second lock timeout -> plan_stale reason lock_timeout for plans, authorization/version recheck under the locks, parameterized bounded dispatch (60-second embedded default). Planned and unplanned mutations share the locks.
  • D2: safe retryable pre-dispatch failures release the idempotency claim; dispatched and unknown outcomes retain protection.
  • D7: CLI mutation response loss/unreadable response -> conflict/outcome_unknown, retryable false, exit 6. Unsent connection failures remain retryable.
  • D10: docs/CLI.md exit-code table, InvalidHost exit 5, unknown/out-of-range exec/SSH exit status -> 1.
  • D15: initial attempt plus three busy retries, then skipped/Busy. Added a real competing SQLite writer test proving zero dispatch/accepted-audit records during contention and success after releasing the writer.

A6 deferred: this branch's resources still dispatch through the legacy engine boundary; no provider binding is available to hash into the plan. Integrate binding freshness with the provider migration rather than inventing a binding here.

Scoped verification (nice -n 15; one test thread):

test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 113 filtered out; finished in 0.45s
test result: ok. 112 passed; 0 failed; 2 ignored; 0 measured; 0 filtered out; finished in 54.19s
test result: ok. 49 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 3.72s

Final required command: INFRATERNAL_VERIFY_RUN_ID=rs-mutation-safety scripts/verify fast. Environment: CARGO_INCREMENTAL=0, CARGO_PROFILE_DEV_DEBUG=0, CARGO_PROFILE_TEST_DEBUG=0, CARGO_BUILD_JOBS=2, RUST_TEST_THREADS=1; nice -n 15; preset root-disk CARGO_TARGET_DIR. Exit 0. Verbatim gate output:

WARN load5=23.45 exceeds online CPU count=8; timing-sensitive checks may be delayed
PASS fast: migrations are append-only (0.543s)
PASS fast: workspace package dependencies (1.167s)
PASS fast: JavaScript dependencies (1.025s)
PASS fast: advisory review policy tests (0.291s)
SUPPLY_CHAIN_REVIEWS advisory exceptions are within their review windows
SUPPLY_CHAIN cargo-deny: cargo-deny 0.20.2
SUPPLY_CHAIN_NOTICES generated THIRD_PARTY_NOTICES.md from 95 frontend packages
SUPPLY_CHAIN_NOTICES copied source: 179 shadcn files, 3 calternal-derived files
SUPPLY_CHAIN_NOTICES license files: 66 distinct texts; 0 packages need manual license review
advisories ok
SUPPLY_CHAIN_RUST_ADVISORIES passed with refreshed advisory data
licenses ok
SUPPLY_CHAIN_RUST_LICENSES passed
bun audit v1.4.2 (744846f84)

cookie@0.6.0
  workspace:@infraternal/web > @sveltejs/kit > cookie
  low: cookie accepts cookie name, path, and domain with out of bounds characters (<0.7.0) - https://github.com/advisories/GHSA-pxg6-pf52-xh8x

1 vulnerability (1 low)

  bun audit fix           upgrade the vulnerable packages within their ranges
  bun audit fix --latest  also cross major versions
SUPPLY_CHAIN_BUN_AUDIT findings reported; this check is report-only
SUPPLY_CHAIN_PASS Rust advisory/license checks complete; Bun findings are report-only
PASS fast: supply-chain checks (20.616s)
PASS fast: build web app (55.570s)
PASS fast: cargo fmt --check (2.971s)
PASS fast: cargo clippy (123.322s)
PASS fast: cargo test (398.985s)
PASS fast: svelte-check (57.087s)
PASS fast: UI package svelte-check (26.067s)
PASS fast: stream package typecheck (18.453s)
PASS fast: Vitest (20.010s)
PASS fast: UI package Vitest (44.839s)
PASS fast: stream package Vitest (1.749s)
PASS fast: OpenAPI and TypeScript client drift (105.210s)
PASS fast: terminal TypeScript (7.455s)
PASS fast: terminal Vitest (2.265s)

The first fast attempt exited 101 during linking because generated CLI object files were missing. Disk had 19G free; cause was not established. The isolated CLI retry and final fast rerun both passed without source changes. The Bun cookie advisory is report-only; dependencies were not changed in this job. No performance certification or merge/integration/nightly gate is claimed.

Job rs-mutation-safety finished on branch mutation-safety at d0952a66460672cc51b94bd6da47867a7c296d28; original base 450c297. Worktree clean. No push or merge gate. Retained implementation commit 1f62954; added d0952a6 (real SQLite busy exhaustion/resumption regression). Both commits contain the requested attribution/session trailers. Finished and verified: - D1: sorted per-target locks, 10-second lock timeout -> plan_stale reason lock_timeout for plans, authorization/version recheck under the locks, parameterized bounded dispatch (60-second embedded default). Planned and unplanned mutations share the locks. - D2: safe retryable pre-dispatch failures release the idempotency claim; dispatched and unknown outcomes retain protection. - D7: CLI mutation response loss/unreadable response -> conflict/outcome_unknown, retryable false, exit 6. Unsent connection failures remain retryable. - D10: docs/CLI.md exit-code table, InvalidHost exit 5, unknown/out-of-range exec/SSH exit status -> 1. - D15: initial attempt plus three busy retries, then skipped/Busy. Added a real competing SQLite writer test proving zero dispatch/accepted-audit records during contention and success after releasing the writer. A6 deferred: this branch's resources still dispatch through the legacy engine boundary; no provider binding is available to hash into the plan. Integrate binding freshness with the provider migration rather than inventing a binding here. Scoped verification (nice -n 15; one test thread): ```text test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 113 filtered out; finished in 0.45s test result: ok. 112 passed; 0 failed; 2 ignored; 0 measured; 0 filtered out; finished in 54.19s test result: ok. 49 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 3.72s ``` Final required command: INFRATERNAL_VERIFY_RUN_ID=rs-mutation-safety scripts/verify fast. Environment: CARGO_INCREMENTAL=0, CARGO_PROFILE_DEV_DEBUG=0, CARGO_PROFILE_TEST_DEBUG=0, CARGO_BUILD_JOBS=2, RUST_TEST_THREADS=1; nice -n 15; preset root-disk CARGO_TARGET_DIR. Exit 0. Verbatim gate output: ```text WARN load5=23.45 exceeds online CPU count=8; timing-sensitive checks may be delayed PASS fast: migrations are append-only (0.543s) PASS fast: workspace package dependencies (1.167s) PASS fast: JavaScript dependencies (1.025s) PASS fast: advisory review policy tests (0.291s) SUPPLY_CHAIN_REVIEWS advisory exceptions are within their review windows SUPPLY_CHAIN cargo-deny: cargo-deny 0.20.2 SUPPLY_CHAIN_NOTICES generated THIRD_PARTY_NOTICES.md from 95 frontend packages SUPPLY_CHAIN_NOTICES copied source: 179 shadcn files, 3 calternal-derived files SUPPLY_CHAIN_NOTICES license files: 66 distinct texts; 0 packages need manual license review advisories ok SUPPLY_CHAIN_RUST_ADVISORIES passed with refreshed advisory data licenses ok SUPPLY_CHAIN_RUST_LICENSES passed bun audit v1.4.2 (744846f84) cookie@0.6.0 workspace:@infraternal/web > @sveltejs/kit > cookie low: cookie accepts cookie name, path, and domain with out of bounds characters (<0.7.0) - https://github.com/advisories/GHSA-pxg6-pf52-xh8x 1 vulnerability (1 low) bun audit fix upgrade the vulnerable packages within their ranges bun audit fix --latest also cross major versions SUPPLY_CHAIN_BUN_AUDIT findings reported; this check is report-only SUPPLY_CHAIN_PASS Rust advisory/license checks complete; Bun findings are report-only PASS fast: supply-chain checks (20.616s) PASS fast: build web app (55.570s) PASS fast: cargo fmt --check (2.971s) PASS fast: cargo clippy (123.322s) PASS fast: cargo test (398.985s) PASS fast: svelte-check (57.087s) PASS fast: UI package svelte-check (26.067s) PASS fast: stream package typecheck (18.453s) PASS fast: Vitest (20.010s) PASS fast: UI package Vitest (44.839s) PASS fast: stream package Vitest (1.749s) PASS fast: OpenAPI and TypeScript client drift (105.210s) PASS fast: terminal TypeScript (7.455s) PASS fast: terminal Vitest (2.265s) ``` The first fast attempt exited 101 during linking because generated CLI object files were missing. Disk had 19G free; cause was not established. The isolated CLI retry and final fast rerun both passed without source changes. The Bun cookie advisory is report-only; dependencies were not changed in this job. No performance certification or merge/integration/nightly gate is claimed.
Author
Owner

Release measurement from the corrected root-disk cache:

cargo build (13 crates compiled)
Finished `release` profile [optimized] target(s) in 7m 36s

stat -c '%n %s bytes' reports 31,116,264 bytes for release/infraternal; file reports not stripped. This is 6,116,264 bytes over the 25,000,000-byte budget. The earlier 32,931,832-byte baseline was recorded as stripped, so I’m checking why the profile’s strip setting is not reflected before comparing or changing size levers.

Release measurement from the corrected root-disk cache: ``` cargo build (13 crates compiled) Finished `release` profile [optimized] target(s) in 7m 36s ``` `stat -c '%n %s bytes'` reports 31,116,264 bytes for `release/infraternal`; `file` reports `not stripped`. This is 6,116,264 bytes over the 25,000,000-byte budget. The earlier 32,931,832-byte baseline was recorded as stripped, so I’m checking why the profile’s strip setting is not reflected before comparing or changing size levers.
Author
Owner

rs-remote-ssh resume finished at 576e91e050 on branch remote-ssh. Full findings and verbatim gate/test evidence are posted in kayg/infraternal#49. Added attributed-identity regressions and corrected architecture docs; fixed the completion-audit test fixture to bind its real embedded infraternal agent owner. Real remote SSH test: 1 passed; embedded real-sshd product tests: 4 passed. Final INFRATERNAL_VERIFY_RUN_ID=rs-remote-ssh scripts/verify fast: exit 0, all 18 stages, serial workspace tests (RUST_TEST_THREADS=1), lean two-job nice-15 root-disk build. Clean worktree; no push or merge gate.

rs-remote-ssh resume finished at 576e91e050ba74c39b43cfa52bf2c5eb033d61f4 on branch remote-ssh. Full findings and verbatim gate/test evidence are posted in kayg/infraternal#49. Added attributed-identity regressions and corrected architecture docs; fixed the completion-audit test fixture to bind its real embedded infraternal agent owner. Real remote SSH test: 1 passed; embedded real-sshd product tests: 4 passed. Final INFRATERNAL_VERIFY_RUN_ID=rs-remote-ssh scripts/verify fast: exit 0, all 18 stages, serial workspace tests (RUST_TEST_THREADS=1), lean two-job nice-15 root-disk build. Clean worktree; no push or merge gate.
Author
Owner

Completed resume verification on branch session-authority, head cd7ca3faf07621804f642f8e0f1793f72024e637. Worktree is clean. No push, merge gate, or issue close. No new source commit was necessary: the existing commit already implements A3/A5/A8/A10/A11 and its tests; the previous cargo-test failure did not reproduce in a full workspace run or the final fast gate. The old failing diagnostic was not available in the worktree, so its original test name could not be recovered.

Finished:

  • Verified the one owner-plus-creator-refresh-lineage rule for embedded SSH, embedded exec, and remote exec sweeps, including creator mismatch termination and owner-only audit attribution (A3/A10).
  • Verified events require containers:read and redact exec command text/labels (A5).
  • Verified certificate rotation/revocation checks before tunnel nonce admission (A8).
  • Verified OPEN_OK.session_id creation/reattachment binding (A11).
  • Completed a full cargo test --workspace diagnostic run, exit 0. The real-Docker creator-revocation regression also passed in the existing current-code test executable.
  • Resolved generated dependency-cache errors (SQLx E0460, WebAuthn E0463) without product-source changes. The preset root-cache path became a symlink to the HDD target during the run. After root-disk space recovered, copied this worktree's generated cache to the actual root-disk directory /home/kayg/.cache/infraternal-targets/rs-session-authority-resume and rebuilt affected SQLx/either/WebAuthn/OpenSSL packages. The prior environment blockage is resolved.

Final gate command (exit 0):

env CARGO_TARGET_DIR=/home/kayg/.cache/infraternal-targets/rs-session-authority-resume CARGO_INCREMENTAL=0 CARGO_PROFILE_DEV_DEBUG=0 CARGO_PROFILE_TEST_DEBUG=0 CARGO_BUILD_JOBS=2 CARGO_TERM_QUIET=true INFRATERNAL_VERIFY_RUN_ID=rs-session-authority nice -n 15 scripts/verify fast

Final gate output, verbatim:

WARN load5=15.79 exceeds online CPU count=8; timing-sensitive checks may be delayed
PASS fast: migrations are append-only (0.372s)
PASS fast: workspace package dependencies (0.418s)
PASS fast: JavaScript dependencies (0.246s)
PASS fast: advisory review policy tests (0.198s)
SUPPLY_CHAIN_REVIEWS advisory exceptions are within their review windows
SUPPLY_CHAIN cargo-deny: cargo-deny 0.20.2
SUPPLY_CHAIN_NOTICES generated THIRD_PARTY_NOTICES.md from 95 frontend packages
SUPPLY_CHAIN_NOTICES copied source: 179 shadcn files, 3 calternal-derived files
SUPPLY_CHAIN_NOTICES license files: 66 distinct texts; 0 packages need manual license review
advisories ok
SUPPLY_CHAIN_RUST_ADVISORIES passed with refreshed advisory data
licenses ok
SUPPLY_CHAIN_RUST_LICENSES passed
bun audit v1.4.2 (744846f84)

cookie@0.6.0
  workspace:@infraternal/web > @sveltejs/kit > cookie
  low: cookie accepts cookie name, path, and domain with out of bounds characters (<0.7.0) - https://github.com/advisories/GHSA-pxg6-pf52-xh8x

1 vulnerability (1 low)

  bun audit fix           upgrade the vulnerable packages within their ranges
  bun audit fix --latest  also cross major versions
SUPPLY_CHAIN_BUN_AUDIT findings reported; this check is report-only
SUPPLY_CHAIN_PASS Rust advisory/license checks complete; Bun findings are report-only
PASS fast: supply-chain checks (5.021s)
PASS fast: build web app (24.008s)
PASS fast: cargo fmt --check (1.278s)
PASS fast: cargo clippy (25.595s)
PASS fast: cargo test (184.308s)
PASS fast: svelte-check (22.314s)
PASS fast: UI package svelte-check (6.091s)
PASS fast: stream package typecheck (5.723s)
PASS fast: Vitest (6.558s)
PASS fast: UI package Vitest (11.866s)
PASS fast: stream package Vitest (0.758s)
PASS fast: OpenAPI and TypeScript client drift (54.485s)
PASS fast: terminal TypeScript (4.254s)
PASS fast: terminal Vitest (1.582s)

The Bun low-severity cookie finding above is report-only under the existing gate policy. Fast passing is not a merge-gate or perf-test-VM A/B claim.

Additional diagnostic evidence, verbatim:

test revoking_ai_agent_creator_terminates_embedded_persistent_exec ... ok

test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 20 filtered out; finished in 7.85s

Cache-repair references: Rust E0460, Rust E0463, package-scoped Cargo cleanup.

Completed resume verification on branch `session-authority`, head `cd7ca3faf07621804f642f8e0f1793f72024e637`. Worktree is clean. No push, merge gate, or issue close. No new source commit was necessary: the existing commit already implements A3/A5/A8/A10/A11 and its tests; the previous cargo-test failure did not reproduce in a full workspace run or the final fast gate. The old failing diagnostic was not available in the worktree, so its original test name could not be recovered. Finished: - Verified the one owner-plus-creator-refresh-lineage rule for embedded SSH, embedded exec, and remote exec sweeps, including creator mismatch termination and owner-only audit attribution (A3/A10). - Verified events require `containers:read` and redact exec command text/labels (A5). - Verified certificate rotation/revocation checks before tunnel nonce admission (A8). - Verified `OPEN_OK.session_id` creation/reattachment binding (A11). - Completed a full `cargo test --workspace` diagnostic run, exit 0. The real-Docker creator-revocation regression also passed in the existing current-code test executable. - Resolved generated dependency-cache errors (SQLx E0460, WebAuthn E0463) without product-source changes. The preset root-cache path became a symlink to the HDD target during the run. After root-disk space recovered, copied this worktree's generated cache to the actual root-disk directory `/home/kayg/.cache/infraternal-targets/rs-session-authority-resume` and rebuilt affected SQLx/`either`/WebAuthn/OpenSSL packages. The prior environment blockage is resolved. Final gate command (exit 0): ```sh env CARGO_TARGET_DIR=/home/kayg/.cache/infraternal-targets/rs-session-authority-resume CARGO_INCREMENTAL=0 CARGO_PROFILE_DEV_DEBUG=0 CARGO_PROFILE_TEST_DEBUG=0 CARGO_BUILD_JOBS=2 CARGO_TERM_QUIET=true INFRATERNAL_VERIFY_RUN_ID=rs-session-authority nice -n 15 scripts/verify fast ``` Final gate output, verbatim: ```text WARN load5=15.79 exceeds online CPU count=8; timing-sensitive checks may be delayed PASS fast: migrations are append-only (0.372s) PASS fast: workspace package dependencies (0.418s) PASS fast: JavaScript dependencies (0.246s) PASS fast: advisory review policy tests (0.198s) SUPPLY_CHAIN_REVIEWS advisory exceptions are within their review windows SUPPLY_CHAIN cargo-deny: cargo-deny 0.20.2 SUPPLY_CHAIN_NOTICES generated THIRD_PARTY_NOTICES.md from 95 frontend packages SUPPLY_CHAIN_NOTICES copied source: 179 shadcn files, 3 calternal-derived files SUPPLY_CHAIN_NOTICES license files: 66 distinct texts; 0 packages need manual license review advisories ok SUPPLY_CHAIN_RUST_ADVISORIES passed with refreshed advisory data licenses ok SUPPLY_CHAIN_RUST_LICENSES passed bun audit v1.4.2 (744846f84) cookie@0.6.0 workspace:@infraternal/web > @sveltejs/kit > cookie low: cookie accepts cookie name, path, and domain with out of bounds characters (<0.7.0) - https://github.com/advisories/GHSA-pxg6-pf52-xh8x 1 vulnerability (1 low) bun audit fix upgrade the vulnerable packages within their ranges bun audit fix --latest also cross major versions SUPPLY_CHAIN_BUN_AUDIT findings reported; this check is report-only SUPPLY_CHAIN_PASS Rust advisory/license checks complete; Bun findings are report-only PASS fast: supply-chain checks (5.021s) PASS fast: build web app (24.008s) PASS fast: cargo fmt --check (1.278s) PASS fast: cargo clippy (25.595s) PASS fast: cargo test (184.308s) PASS fast: svelte-check (22.314s) PASS fast: UI package svelte-check (6.091s) PASS fast: stream package typecheck (5.723s) PASS fast: Vitest (6.558s) PASS fast: UI package Vitest (11.866s) PASS fast: stream package Vitest (0.758s) PASS fast: OpenAPI and TypeScript client drift (54.485s) PASS fast: terminal TypeScript (4.254s) PASS fast: terminal Vitest (1.582s) ``` The Bun low-severity cookie finding above is report-only under the existing gate policy. Fast passing is not a merge-gate or perf-test-VM A/B claim. Additional diagnostic evidence, verbatim: ```text test revoking_ai_agent_creator_terminates_embedded_persistent_exec ... ok test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 20 filtered out; finished in 7.85s ``` Cache-repair references: [Rust E0460](https://doc.rust-lang.org/error_codes/E0460.html), [Rust E0463](https://doc.rust-lang.org/error_codes/E0463.html), [package-scoped Cargo cleanup](https://doc.rust-lang.org/cargo/commands/cargo-clean.html).
Author
Owner

The final-package strip fix is verified:

cargo build (1 crates compiled)
Finished `release` profile [optimized] target(s) in 3m 07s

After adding strip = "symbols" under [profile.release.package.infraternal], file reports stripped, and readelf finds no .symtab, .strtab or .debug_* sections. Exact size: 26,176,448 bytes, still 1,176,448 bytes over the 25,000,000-byte budget. A copy stripped manually before this change measured 26,176,440 bytes, confirming the manifest setting now gives the same result.

The final-package strip fix is verified: ``` cargo build (1 crates compiled) Finished `release` profile [optimized] target(s) in 3m 07s ``` After adding `strip = "symbols"` under `[profile.release.package.infraternal]`, `file` reports `stripped`, and `readelf` finds no `.symtab`, `.strtab` or `.debug_*` sections. Exact size: 26,176,448 bytes, still 1,176,448 bytes over the 25,000,000-byte budget. A copy stripped manually before this change measured 26,176,440 bytes, confirming the manifest setting now gives the same result.
Author
Owner

The first required fast gate passed clippy but stopped during Cargo test-profile compilation, before tests ran.

Verbatim output:
FAIL fast: cargo test (187.929s)
error: could not parse/generate dep info at: /home/kayg/.cache/infraternal-targets/rs-perf-events/debug/deps/aws_lc_rs-73ba973b55b35c41.d
failed to write .../.fingerprint/aws-lc-rs-73ba973b55b35c41/dep-lib-aws_lc_rs
No such file or directory (os error 2)

Disk space is available; the affected fingerprint paths are absent after the failed build. I’m rerunning the required gate to separate this build-cache failure from test results.

The first required fast gate passed clippy but stopped during Cargo test-profile compilation, before tests ran. Verbatim output: `FAIL fast: cargo test (187.929s)` `error: could not parse/generate dep info at: /home/kayg/.cache/infraternal-targets/rs-perf-events/debug/deps/aws_lc_rs-73ba973b55b35c41.d` `failed to write .../.fingerprint/aws-lc-rs-73ba973b55b35c41/dep-lib-aws_lc_rs` `No such file or directory (os error 2)` Disk space is available; the affected fingerprint paths are absent after the failed build. I’m rerunning the required gate to separate this build-cache failure from test results.
Author
Owner

Measured feature-trim trial: workspace Axum now requests only http1, json, matched-path, query, tokio, tracing and ws; cargo tree -e features -i axum confirms form, original-uri and tower-log are gone. The release build succeeds, but the stripped executable is 26,177,472 bytes, 1,024 bytes larger than the preceding 26,176,448-byte build. LTO had already removed this unused feature code from the final binary, so I am reverting this trial to avoid keeping a no-win feature behavior change.

Measured feature-trim trial: workspace Axum now requests only `http1`, `json`, `matched-path`, `query`, `tokio`, `tracing` and `ws`; `cargo tree -e features -i axum` confirms `form`, `original-uri` and `tower-log` are gone. The release build succeeds, but the stripped executable is 26,177,472 bytes, 1,024 bytes larger than the preceding 26,176,448-byte build. LTO had already removed this unused feature code from the final binary, so I am reverting this trial to avoid keeping a no-win feature behavior change.
Author
Owner

Starting cdr-fix on branch contract-drift-rest at 6eb9f7b783340302918f2bd80ab94e291e377679; merge target origin/dev is d987a32dfd11cda99b2ddc516ad74ba13fcc5003.

Starting cdr-fix on branch `contract-drift-rest` at `6eb9f7b783340302918f2bd80ab94e291e377679`; merge target `origin/dev` is `d987a32dfd11cda99b2ddc516ad74ba13fcc5003`.
Author
Owner

Finished rs-perf-events on branch perf-events-logs.

Head: 6d30a151ff3250b92b2a7af84826c56509a270b1 (existing implementation commit; worktree clean). The requested event filtering/debounce/change-only inventory publication and log-frame allocation/batching changes, with G3/G5 guards, were already present. No additional code changes were needed.

The first required fast run stopped before tests because Cargo could not write into a missing fingerprint directory; that failure was recorded above. Retried with the requested run ID and lean build settings. The required gate exited 0:

PASS fast: migrations are append-only (0.134s)
PASS fast: workspace package dependencies (0.306s)
PASS fast: JavaScript dependencies (0.160s)
PASS fast: advisory review policy tests (0.121s)
SUPPLY_CHAIN_REVIEWS advisory exceptions are within their review windows
SUPPLY_CHAIN cargo-deny: cargo-deny 0.20.2
SUPPLY_CHAIN_NOTICES generated THIRD_PARTY_NOTICES.md from 95 frontend packages
SUPPLY_CHAIN_NOTICES copied source: 179 shadcn files, 3 calternal-derived files
SUPPLY_CHAIN_NOTICES license files: 66 distinct texts; 0 packages need manual license review
advisories ok
SUPPLY_CHAIN_RUST_ADVISORIES passed with refreshed advisory data
licenses ok
SUPPLY_CHAIN_RUST_LICENSES passed
bun audit v1.4.2 (744846f84)

cookie@0.6.0
  workspace:@infraternal/web > @sveltejs/kit > cookie
  low: cookie accepts cookie name, path, and domain with out of bounds characters (<0.7.0) - https://github.com/advisories/GHSA-pxg6-pf52-xh8x

1 vulnerability (1 low)

  bun audit fix           upgrade the vulnerable packages within their ranges
  bun audit fix --latest  also cross major versions
SUPPLY_CHAIN_BUN_AUDIT findings reported; this check is report-only
SUPPLY_CHAIN_PASS Rust advisory/license checks complete; Bun findings are report-only
PASS fast: supply-chain checks (7.140s)
PASS fast: build web app (17.135s)
PASS fast: cargo fmt --check (1.617s)
PASS fast: cargo clippy (295.786s)
PASS fast: cargo test (241.700s)
PASS fast: svelte-check (12.357s)
PASS fast: UI package svelte-check (5.011s)
PASS fast: stream package typecheck (4.807s)
PASS fast: Vitest (3.951s)
PASS fast: UI package Vitest (12.264s)
PASS fast: stream package Vitest (0.763s)
PASS fast: OpenAPI and TypeScript client drift (58.244s)
PASS fast: terminal TypeScript (2.608s)
PASS fast: terminal Vitest (1.584s)
Finished `rs-perf-events` on branch `perf-events-logs`. Head: `6d30a151ff3250b92b2a7af84826c56509a270b1` (existing implementation commit; worktree clean). The requested event filtering/debounce/change-only inventory publication and log-frame allocation/batching changes, with G3/G5 guards, were already present. No additional code changes were needed. The first required fast run stopped before tests because Cargo could not write into a missing fingerprint directory; that failure was recorded above. Retried with the requested run ID and lean build settings. The required gate exited 0: ```text PASS fast: migrations are append-only (0.134s) PASS fast: workspace package dependencies (0.306s) PASS fast: JavaScript dependencies (0.160s) PASS fast: advisory review policy tests (0.121s) SUPPLY_CHAIN_REVIEWS advisory exceptions are within their review windows SUPPLY_CHAIN cargo-deny: cargo-deny 0.20.2 SUPPLY_CHAIN_NOTICES generated THIRD_PARTY_NOTICES.md from 95 frontend packages SUPPLY_CHAIN_NOTICES copied source: 179 shadcn files, 3 calternal-derived files SUPPLY_CHAIN_NOTICES license files: 66 distinct texts; 0 packages need manual license review advisories ok SUPPLY_CHAIN_RUST_ADVISORIES passed with refreshed advisory data licenses ok SUPPLY_CHAIN_RUST_LICENSES passed bun audit v1.4.2 (744846f84) cookie@0.6.0 workspace:@infraternal/web > @sveltejs/kit > cookie low: cookie accepts cookie name, path, and domain with out of bounds characters (<0.7.0) - https://github.com/advisories/GHSA-pxg6-pf52-xh8x 1 vulnerability (1 low) bun audit fix upgrade the vulnerable packages within their ranges bun audit fix --latest also cross major versions SUPPLY_CHAIN_BUN_AUDIT findings reported; this check is report-only SUPPLY_CHAIN_PASS Rust advisory/license checks complete; Bun findings are report-only PASS fast: supply-chain checks (7.140s) PASS fast: build web app (17.135s) PASS fast: cargo fmt --check (1.617s) PASS fast: cargo clippy (295.786s) PASS fast: cargo test (241.700s) PASS fast: svelte-check (12.357s) PASS fast: UI package svelte-check (5.011s) PASS fast: stream package typecheck (4.807s) PASS fast: Vitest (3.951s) PASS fast: UI package Vitest (12.264s) PASS fast: stream package Vitest (0.763s) PASS fast: OpenAPI and TypeScript client drift (58.244s) PASS fast: terminal TypeScript (2.608s) PASS fast: terminal Vitest (1.584s) ```
Author
Owner

Finding: openapi_documents_bearer_idempotency_and_refresh_transports was 112 lines against clippy's 100-line limit. Split its existing assertions by concern into idempotency/bearer security, refresh/rate-limit transport, and shared error response tests; the checks remain intact.

Finding: `openapi_documents_bearer_idempotency_and_refresh_transports` was 112 lines against clippy's 100-line limit. Split its existing assertions by concern into idempotency/bearer security, refresh/rate-limit transport, and shared error response tests; the checks remain intact.
Author
Owner

Merge finding: resources.rs had overlapping import blocks from both branches. The first OpenAPI build reported duplicate imports for the shared REST auth/storage types; those duplicates are removed, while the remote HostRoute and provider types remain. The detail/action route keeps the local keyed-route error response type (which documents 400/401/409/422) and the remote 429/501/503 provider outcomes, plus its explicit 403/404 responses.

Merge finding: `resources.rs` had overlapping import blocks from both branches. The first OpenAPI build reported duplicate imports for the shared REST auth/storage types; those duplicates are removed, while the remote `HostRoute` and provider types remain. The detail/action route keeps the local keyed-route error response type (which documents 400/401/409/422) and the remote 429/501/503 provider outcomes, plus its explicit 403/404 responses.
Author
Owner

Finding: the merged RPC test expected ProviderError::legacy_code(), but ProviderError exposes the registered provider failure fields. Updated the assertion to verify NotFound, HTTP category, native status 404 and retryable == false directly. Workspace clippy then reported: cargo clippy: No issues found.

Finding: the merged RPC test expected `ProviderError::legacy_code()`, but `ProviderError` exposes the registered provider failure fields. Updated the assertion to verify NotFound, HTTP category, native status 404 and `retryable == false` directly. Workspace clippy then reported: `cargo clippy: No issues found`.
Author
Owner

Starting fence-batch in /mnt/hdd/infraternal/wt-lp/fence-batch. Branch: fence-batch. Base/head: d987a32dfd (origin/dev). Scope: bounded ready-only inbound DATA batches with the durable SQLite authorization fence; ordering, credits and fail-closed behavior preserved. Requested gates: fmt, workspace clippy -D warnings, targeted stream tests, verify fast.

Starting fence-batch in /mnt/hdd/infraternal/wt-lp/fence-batch. Branch: fence-batch. Base/head: d987a32dfd11cda99b2ddc516ad74ba13fcc5003 (origin/dev). Scope: bounded ready-only inbound DATA batches with the durable SQLite authorization fence; ordering, credits and fail-closed behavior preserved. Requested gates: fmt, workspace clippy -D warnings, targeted stream tests, verify fast.
Author
Owner

Finding: both production inbound forwarding channels had capacity 1 (EmbeddedAgent::open_frame_at and TunnelHub::reserve), so reserve_many could not admit a batch without widening those inbound queues. Changed only those inbound frame queues to a shared 64-slot constant; existing per-frame credit accounting and byte-window bounds remain, and outbound one-slot queues remain. Consecutive ready DATA is batched only on the same channel; the first nonmatching message is retained in connection order. Capacity waits occur before the SQLite write lock. The whole batch is synchronously enqueued while the lock is held, so a revocation committed first rejects every frame. API references: https://docs.rs/tokio/latest/tokio/sync/mpsc/struct.Sender.html#method.reserve_many (reserve_many rejects counts above channel capacity, reserves all requested slots); https://docs.rs/futures-util/latest/futures_util/future/trait.FutureExt.html#method.now_or_never (single immediate poll). No G1 stream_data_fence_cost existed at base; adding the <= N/8 guard with a 16-transaction target for a queued 1000-frame burst.

Finding: both production inbound forwarding channels had capacity 1 (EmbeddedAgent::open_frame_at and TunnelHub::reserve), so reserve_many could not admit a batch without widening those inbound queues. Changed only those inbound frame queues to a shared 64-slot constant; existing per-frame credit accounting and byte-window bounds remain, and outbound one-slot queues remain. Consecutive ready DATA is batched only on the same channel; the first nonmatching message is retained in connection order. Capacity waits occur before the SQLite write lock. The whole batch is synchronously enqueued while the lock is held, so a revocation committed first rejects every frame. API references: https://docs.rs/tokio/latest/tokio/sync/mpsc/struct.Sender.html#method.reserve_many (reserve_many rejects counts above channel capacity, reserves all requested slots); https://docs.rs/futures-util/latest/futures_util/future/trait.FutureExt.html#method.now_or_never (single immediate poll). No G1 stream_data_fence_cost existed at base; adding the <= N/8 guard with a 16-transaction target for a queued 1000-frame burst.
Author
Owner

Finding: scripts/verify fast failed one storage test: mint_token_uses_the_configured_access_lifetime (130 passed, 1 failed) because its caller token had no grants and mint_authenticated_token correctly requires effective TokensManage. Updated that test fixture to grant TokensManage; no authorization behavior changed.

Finding: `scripts/verify fast` failed one storage test: `mint_token_uses_the_configured_access_lifetime` (130 passed, 1 failed) because its caller token had no grants and `mint_authenticated_token` correctly requires effective `TokensManage`. Updated that test fixture to grant `TokensManage`; no authorization behavior changed.
Author
Owner

Perf diagnostic target-path conflict: scripts/verify perf hardcodes --target-dir "$repo_root/target" for its allocation harness, bypassing CARGO_TARGET_DIR and writing build artifacts under /mnt/hdd. I stopped the build with SIGINT during the perf: build allocation measurement harness step and removed files written under this worktree's target after the run started. It produced no RSS metrics. The perf README classifies dev-VM results as diagnostics only; a root-disk target override is needed to run this diagnostic within the job's cache rule.

Perf diagnostic target-path conflict: `scripts/verify perf` hardcodes `--target-dir "$repo_root/target"` for its allocation harness, bypassing `CARGO_TARGET_DIR` and writing build artifacts under `/mnt/hdd`. I stopped the build with SIGINT during the `perf: build allocation measurement harness` step and removed files written under this worktree's target after the run started. It produced no RSS metrics. The perf README classifies dev-VM results as diagnostics only; a root-disk target override is needed to run this diagnostic within the job's cache rule.
Author
Owner

First targeted stream run measured against file-backed SQLite:

queued burst: 1000 DATA frames, 16 admit transactions (per-frame baseline: 1000)

The original singleton shape is exercised for 1000 successful admissions against the same database before the ready-only collector/forwarder path. The guard enforces <=125 transactions and exact ceil(1000/64)=16, checking every forwarded frame in order. Revocation-mid-burst and revocation-during-capacity-wait tests passed. One new interactive fixture initially failed with Database(PoolTimedOut) because start_paused allowed SQLx pool timers to expire while its real worker I/O was pending; corrected the fixture to pause time only around the synchronous collector and resume before SQLite operations. Rerunning targeted tests; verify fast has passed prerequisites, web build and fmt and is running workspace clippy.

First targeted stream run measured against file-backed SQLite: ``` queued burst: 1000 DATA frames, 16 admit transactions (per-frame baseline: 1000) ``` The original singleton shape is exercised for 1000 successful admissions against the same database before the ready-only collector/forwarder path. The guard enforces <=125 transactions and exact ceil(1000/64)=16, checking every forwarded frame in order. Revocation-mid-burst and revocation-during-capacity-wait tests passed. One new interactive fixture initially failed with Database(PoolTimedOut) because start_paused allowed SQLx pool timers to expire while its real worker I/O was pending; corrected the fixture to pause time only around the synchronous collector and resume before SQLite operations. Rerunning targeted tests; verify fast has passed prerequisites, web build and fmt and is running workspace clippy.
Author
Owner

Finding: device_poll_admission_precedes_failed_response_actor_authentication sent its 32 requests serially against an 8-token source bucket refilling at 4/s. The run admitted 9 and limited 23 because one token refilled during response handling, failing the unchanged limited >= 24 assertion. Changed the test to submit a concurrent same-source burst; production admission behavior and the assertion are unchanged.

Finding: `device_poll_admission_precedes_failed_response_actor_authentication` sent its 32 requests serially against an 8-token source bucket refilling at 4/s. The run admitted 9 and limited 23 because one token refilled during response handling, failing the unchanged `limited >= 24` assertion. Changed the test to submit a concurrent same-source burst; production admission behavior and the assertion are unchanged.
Author
Owner

Starting pg-fix on branch perf-guards-nightly, base head 8fb1f63. Investigating the failing stream_data_fence_cost_matches_current_per_frame_baseline assertion and will make G1 deterministic as an upper-bound check, then merge origin/dev, resolve any conflicts, run fmt, clippy with warnings denied, targeted tests, and INFRATERAL_VERIFY_RUN_ID=pg-fix scripts/verify fast.

Starting pg-fix on branch `perf-guards-nightly`, base head `8fb1f63`. Investigating the failing `stream_data_fence_cost_matches_current_per_frame_baseline` assertion and will make G1 deterministic as an upper-bound check, then merge `origin/dev`, resolve any conflicts, run fmt, clippy with warnings denied, targeted tests, and `INFRATERAL_VERIFY_RUN_ID=pg-fix scripts/verify fast`.
Author
Owner

Starting sc-merge #48 on branch stream-conformance.

Worktree base head: 6e687f50d6cc70a4c8e7543bf9ff0b107b56c4bb. The local origin/dev ref is d987a32dfd11cda99b2ddc516ad74ba13fcc5003 (batch-1003a). I will merge origin/dev, retain both stream benchmark behaviors, resolve any other conflicts preserving both sides, then run fmt, workspace clippy with -D warnings, proto/server stream tests, and INFRATERAL_VERIFY_RUN_ID=sc-merge scripts/verify fast with the requested lean environment. No merge gate will be run.

Starting sc-merge #48 on branch `stream-conformance`. Worktree base head: `6e687f50d6cc70a4c8e7543bf9ff0b107b56c4bb`. The local `origin/dev` ref is `d987a32dfd11cda99b2ddc516ad74ba13fcc5003` (batch-1003a). I will merge `origin/dev`, retain both stream benchmark behaviors, resolve any other conflicts preserving both sides, then run fmt, workspace clippy with `-D warnings`, proto/server stream tests, and `INFRATERAL_VERIFY_RUN_ID=sc-merge scripts/verify fast` with the requested lean environment. No merge gate will be run.
Author
Owner

Merge finding: the sole content conflict is crates/proto/benches/stream.rs. The stream-conformance side adds ControlBucket steady-state and cumulative-payload-refusal benchmarks; origin/dev adds provider-reply split/assembly benchmarks for 8 KiB and 1 MiB responses. These exercise distinct paths, so resolution will retain both sets and register both functions in Criterion.

Merge finding: the sole content conflict is `crates/proto/benches/stream.rs`. The `stream-conformance` side adds `ControlBucket` steady-state and cumulative-payload-refusal benchmarks; `origin/dev` adds provider-reply split/assembly benchmarks for 8 KiB and 1 MiB responses. These exercise distinct paths, so resolution will retain both sets and register both functions in Criterion.
Author
Owner

Finding: setup_banner_uses_stdout_and_database_uses_the_data_directory used a fixed 500 ms sleep before checking child stdout and failed while the VM was under load. Replaced the sleep with a bounded wait for the setup-banner line on stdout; the assertion checks only the prefix and does not retain or print the credential.

Finding: `setup_banner_uses_stdout_and_database_uses_the_data_directory` used a fixed 500 ms sleep before checking child stdout and failed while the VM was under load. Replaced the sleep with a bounded wait for the setup-banner line on stdout; the assertion checks only the prefix and does not retain or print the credential.
Author
Owner

Release-size trials from the safe root-disk cache, with explicit symbol stripping: third-party default opt-level="z" measured 26,048,160 bytes versus 26,176,448 at s (128,288 bytes smaller, still 1,048,160 over the 25,000,000-byte cap). Setting the root CLI package to z as well measured 25,368,480 bytes (807,968 bytes below the s baseline, still 368,480 over). Hot server, infraternal agent, proto, SSH and their explicit hot dependency overrides remain at 3. Both builds succeeded; root-CLI-only follow-up compiled 1 crate in 4m23s. These are size measurements only; no runtime A/B is claimed yet.

Release-size trials from the safe root-disk cache, with explicit symbol stripping: third-party default `opt-level="z"` measured 26,048,160 bytes versus 26,176,448 at `s` (128,288 bytes smaller, still 1,048,160 over the 25,000,000-byte cap). Setting the root CLI package to `z` as well measured 25,368,480 bytes (807,968 bytes below the `s` baseline, still 368,480 over). Hot server, infraternal agent, proto, SSH and their explicit hot dependency overrides remain at 3. Both builds succeeded; root-CLI-only follow-up compiled 1 crate in 4m23s. These are size measurements only; no runtime A/B is claimed yet.
Author
Owner

Verification finding: the first cargo clippy --workspace --all-targets -- -D warnings exited 101 before completing. Cargo could not write .../sc-merge/debug/build/crossbeam-deque-.../build_script_build-....d (No such file or directory); the aws-lc-sys build then reported missing output paths under the same debug/build tree. At inspection, debug/build was absent while the target filesystem had 6.6 GiB free and 12% inode use, and other Cargo/Rust compiler processes were active. This points to target-tree lifecycle/concurrent build activity; I’ll retry after those processes drain.

Verification finding: the first `cargo clippy --workspace --all-targets -- -D warnings` exited 101 before completing. Cargo could not write `.../sc-merge/debug/build/crossbeam-deque-.../build_script_build-....d` (`No such file or directory`); the `aws-lc-sys` build then reported missing output paths under the same `debug/build` tree. At inspection, `debug/build` was absent while the target filesystem had 6.6 GiB free and 12% inode use, and other Cargo/Rust compiler processes were active. This points to target-tree lifecycle/concurrent build activity; I’ll retry after those processes drain.
Author
Owner

Correction to the build finding: the remaining Cargo processes are targeting separate caches (fence-batch, tdfu-fix, and pg-fix), so they do not establish contention on the sc-merge cache. Disk and inode capacity were also available. The evidenced failure remains a missing path under the configured sc-merge/debug/build tree; I’ll retry and record whether it recurs.

Correction to the build finding: the remaining Cargo processes are targeting separate caches (`fence-batch`, `tdfu-fix`, and `pg-fix`), so they do not establish contention on the `sc-merge` cache. Disk and inode capacity were also available. The evidenced failure remains a missing path under the configured `sc-merge/debug/build` tree; I’ll retry and record whether it recurs.
Author
Owner

Finding: the gate panic is in the test's flow-control fixture, before the transaction-count assertion. count_stream_data_fences sends DATA while a separate task drains forwarded frames, but it sends the next agent CREDIT as soon as local WebSocket sends consume its own available counter; it does not wait for that DATA window to reach the test infraternal agent. Under queue delay, account_agent_frame can see CREDIT before the server has deducted the outstanding DATA, reject the window as over its cap, and spawn_relay closes the WebSocket with 1008. next_test_client_frame then reports only “expected a binary frame.” I’ll synchronize credit with observed drain completion and make the transaction check a ceiling (<= DATA_FRAME_COUNT) so batching can reduce it.

Finding: the gate panic is in the test's flow-control fixture, before the transaction-count assertion. `count_stream_data_fences` sends DATA while a separate task drains forwarded frames, but it sends the next agent CREDIT as soon as local WebSocket sends consume its own `available` counter; it does not wait for that DATA window to reach the test infraternal agent. Under queue delay, `account_agent_frame` can see CREDIT before the server has deducted the outstanding DATA, reject the window as over its cap, and `spawn_relay` closes the WebSocket with 1008. `next_test_client_frame` then reports only “expected a binary frame.” I’ll synchronize credit with observed drain completion and make the transaction check a ceiling (`<= DATA_FRAME_COUNT`) so batching can reduce it.
Author
Owner

Final targeted stream run passes after the fixture correction and byte-window cap. The collector ends a batch before a frame that exceeds remaining credit, preserving the valid prefix and keeping the violating frame next for the actor to reject. This also avoids accumulating uncharged DATA beyond the current window. Both count and byte limits are covered.

Command: nice -n 15 env ... CARGO_BUILD_JOBS=2 cargo test -p infraternal-server --lib stream:: -- --nocapture with the configured task Cargo cache, incremental disabled, and dev/test debug=0. Selected output verbatim:

queued burst: 1000 DATA frames, 16 admit transactions (per-frame baseline: 1000)
test result: ok. 45 passed; 0 failed; 0 ignored; 0 measured; 86 filtered out; finished in 4.97s

The configured Cargo cache/profile settings are now explicit in the lean environment; workspace clippy and the remaining fast gate are running.

Final targeted stream run passes after the fixture correction and byte-window cap. The collector ends a batch before a frame that exceeds remaining credit, preserving the valid prefix and keeping the violating frame next for the actor to reject. This also avoids accumulating uncharged DATA beyond the current window. Both count and byte limits are covered. Command: `nice -n 15 env ... CARGO_BUILD_JOBS=2 cargo test -p infraternal-server --lib stream:: -- --nocapture` with the configured task Cargo cache, incremental disabled, and dev/test debug=0. Selected output verbatim: ``` queued burst: 1000 DATA frames, 16 admit transactions (per-frame baseline: 1000) test result: ok. 45 passed; 0 failed; 0 ignored; 0 measured; 86 filtered out; finished in 4.97s ``` The configured Cargo cache/profile settings are now explicit in the lean environment; workspace clippy and the remaining fast gate are running.
Author
Owner

Finished cdr-fix on branch contract-drift-rest.

Head: 02ceef772f2eb453152bd823b3278d002ec0d14b
Merged base: d987a32dfd11cda99b2ddc516ad74ba13fcc5003

cargo fmt --check passed. cargo clippy --workspace --all-targets -- -D warnings reported cargo clippy: No issues found. The startup readiness and device poll burst tests each passed 20/20 targeted repetitions. The final INFRATERAL_VERIFY_RUN_ID=cdr-fix scripts/verify fast exited 0. Gate output:

WARN load5=17.37 exceeds online CPU count=8; timing-sensitive checks may be delayed
PASS fast: migrations are append-only (0.560s)
PASS fast: workspace package dependencies (0.711s)
PASS fast: JavaScript dependencies (0.053s)
PASS fast: advisory review policy tests (0.409s)
SUPPLY_CHAIN_REVIEWS advisory exceptions are within their review windows
SUPPLY_CHAIN cargo-deny: cargo-deny 0.20.2
SUPPLY_CHAIN_NOTICES generated THIRD_PARTY_NOTICES.md from 95 frontend packages
SUPPLY_CHAIN_NOTICES copied source: 179 shadcn files, 3 calternal-derived files
SUPPLY_CHAIN_NOTICES license files: 66 distinct texts; 0 packages need manual license review
advisories ok
SUPPLY_CHAIN_RUST_ADVISORIES passed with refreshed advisory data
licenses ok
SUPPLY_CHAIN_RUST_LICENSES passed
bun audit v1.4.2 (744846f84)

cookie@0.6.0
  workspace:@infraternal/web > @sveltejs/kit > cookie
  low: cookie accepts cookie name, path, and domain with out of bounds characters (<0.7.0) - https://github.com/advisories/GHSA-pxg6-pf52-xh8x

1 vulnerability (1 low)

  bun audit fix           upgrade the vulnerable packages within their ranges
  bun audit fix --latest  also cross major versions
SUPPLY_CHAIN_BUN_AUDIT findings reported; this check is report-only
SUPPLY_CHAIN_PASS Rust advisory/license checks complete; Bun findings are report-only
PASS fast: supply-chain checks (9.458s)
PASS fast: build web app (30.422s)
PASS fast: cargo fmt --check (1.542s)
PASS fast: cargo clippy (34.325s)
PASS fast: cargo test (330.158s)
PASS fast: svelte-check (40.545s)
PASS fast: UI package svelte-check (9.200s)
PASS fast: stream package typecheck (12.537s)
PASS fast: Vitest (10.910s)
PASS fast: UI package Vitest (41.157s)
PASS fast: stream package Vitest (2.495s)
PASS fast: OpenAPI and TypeScript client drift (60.609s)
PASS fast: terminal TypeScript (6.951s)
PASS fast: terminal Vitest (1.648s)

Commits: f515857 (split clippy test), 5e025f2 (merge origin/dev and regenerate artifacts), 02ceef7 (verification test fixes). Not pushed. The only remaining untracked path is the preexisting target/ build directory.

Finished cdr-fix on branch `contract-drift-rest`. Head: `02ceef772f2eb453152bd823b3278d002ec0d14b` Merged base: `d987a32dfd11cda99b2ddc516ad74ba13fcc5003` `cargo fmt --check` passed. `cargo clippy --workspace --all-targets -- -D warnings` reported `cargo clippy: No issues found`. The startup readiness and device poll burst tests each passed 20/20 targeted repetitions. The final `INFRATERAL_VERIFY_RUN_ID=cdr-fix scripts/verify fast` exited 0. Gate output: ```text WARN load5=17.37 exceeds online CPU count=8; timing-sensitive checks may be delayed PASS fast: migrations are append-only (0.560s) PASS fast: workspace package dependencies (0.711s) PASS fast: JavaScript dependencies (0.053s) PASS fast: advisory review policy tests (0.409s) SUPPLY_CHAIN_REVIEWS advisory exceptions are within their review windows SUPPLY_CHAIN cargo-deny: cargo-deny 0.20.2 SUPPLY_CHAIN_NOTICES generated THIRD_PARTY_NOTICES.md from 95 frontend packages SUPPLY_CHAIN_NOTICES copied source: 179 shadcn files, 3 calternal-derived files SUPPLY_CHAIN_NOTICES license files: 66 distinct texts; 0 packages need manual license review advisories ok SUPPLY_CHAIN_RUST_ADVISORIES passed with refreshed advisory data licenses ok SUPPLY_CHAIN_RUST_LICENSES passed bun audit v1.4.2 (744846f84) cookie@0.6.0 workspace:@infraternal/web > @sveltejs/kit > cookie low: cookie accepts cookie name, path, and domain with out of bounds characters (<0.7.0) - https://github.com/advisories/GHSA-pxg6-pf52-xh8x 1 vulnerability (1 low) bun audit fix upgrade the vulnerable packages within their ranges bun audit fix --latest also cross major versions SUPPLY_CHAIN_BUN_AUDIT findings reported; this check is report-only SUPPLY_CHAIN_PASS Rust advisory/license checks complete; Bun findings are report-only PASS fast: supply-chain checks (9.458s) PASS fast: build web app (30.422s) PASS fast: cargo fmt --check (1.542s) PASS fast: cargo clippy (34.325s) PASS fast: cargo test (330.158s) PASS fast: svelte-check (40.545s) PASS fast: UI package svelte-check (9.200s) PASS fast: stream package typecheck (12.537s) PASS fast: Vitest (10.910s) PASS fast: UI package Vitest (41.157s) PASS fast: stream package Vitest (2.495s) PASS fast: OpenAPI and TypeScript client drift (60.609s) PASS fast: terminal TypeScript (6.951s) PASS fast: terminal Vitest (1.648s) ``` Commits: `f515857` (split clippy test), `5e025f2` (merge `origin/dev` and regenerate artifacts), `02ceef7` (verification test fixes). Not pushed. The only remaining untracked path is the preexisting `target/` build directory.
Author
Owner

Fast gate passed fmt and workspace clippy --all-targets -D warnings, then failed in the unchanged concurrent_closes_wait_for_the_same_pty_cleanup regression at stream_regressions.rs:1492:

PASS fast: migrations are append-only (0.385s)
PASS fast: workspace package dependencies (1.059s)
PASS fast: JavaScript dependencies (0.295s)
PASS fast: advisory review policy tests (0.213s)
PASS fast: supply-chain checks (10.571s)
PASS fast: build web app (22.644s)
PASS fast: cargo fmt --check (3.545s)
PASS fast: cargo clippy (378.852s)
FAIL fast: cargo test (380.157s)
second close reported completion before cleanup finished
test result: FAILED. 6 passed; 1 failed; 12 ignored; 0 measured; 0 filtered out; finished in 4.97s
error: test failed, to rerun pass `-p infraternal-server --test stream_regressions`

The assertion is second_done >= first_done, where both instants are captured after concurrent DELETE HTTP responses finish; it compares response-completion order, not an observed cleanup barrier. The fixture opens a persistent exec attachment using OPEN only, then sends DELETE requests: no inbound DATA goes through the changed batching fence. The regression source has no diff from d987a32. Running an isolated exact rerun and then a full fast retry without changing or weakening this test. Full failing cargo-test log is at /mnt/hdd/infraternal/artifacts/verify/fence-batch/step-9.log; full gate output preserved at /tmp/fence-batch-fast-attempt-1.log.

Fast gate passed fmt and workspace clippy --all-targets -D warnings, then failed in the unchanged concurrent_closes_wait_for_the_same_pty_cleanup regression at stream_regressions.rs:1492: ``` PASS fast: migrations are append-only (0.385s) PASS fast: workspace package dependencies (1.059s) PASS fast: JavaScript dependencies (0.295s) PASS fast: advisory review policy tests (0.213s) PASS fast: supply-chain checks (10.571s) PASS fast: build web app (22.644s) PASS fast: cargo fmt --check (3.545s) PASS fast: cargo clippy (378.852s) FAIL fast: cargo test (380.157s) second close reported completion before cleanup finished test result: FAILED. 6 passed; 1 failed; 12 ignored; 0 measured; 0 filtered out; finished in 4.97s error: test failed, to rerun pass `-p infraternal-server --test stream_regressions` ``` The assertion is second_done >= first_done, where both instants are captured after concurrent DELETE HTTP responses finish; it compares response-completion order, not an observed cleanup barrier. The fixture opens a persistent exec attachment using OPEN only, then sends DELETE requests: no inbound DATA goes through the changed batching fence. The regression source has no diff from d987a32. Running an isolated exact rerun and then a full fast retry without changing or weakening this test. Full failing cargo-test log is at /mnt/hdd/infraternal/artifacts/verify/fence-batch/step-9.log; full gate output preserved at /tmp/fence-batch-fast-attempt-1.log.
Author
Owner

Integrated origin/dev at d987a32 after fix commit defb369; Git's ort merge completed without conflicts at 200f7b2b. Post-merge format is complete. I’m serializing clippy and test gates behind the currently active server stream test on the VM.

Integrated `origin/dev` at `d987a32` after fix commit `defb369`; Git's `ort` merge completed without conflicts at `200f7b2b`. Post-merge format is complete. I’m serializing clippy and test gates behind the currently active server stream test on the VM.
Author
Owner

Finished fence-batch. Branch: fence-batch. Base: d987a32dfd. Head: f967b3a1ae. Committed locally; no push. Working tree is clean.

Consecutive same-channel DATA already ready is bounded by 64 frames, the forwarding capacity and current byte credit. Capacity is reserved before one durable authorization transaction. Every enqueue runs synchronously in order under SQLite's writer lock and the watcher mutex; a previously committed revocation rejects the whole batch. Embedded and remote inbound queues share the 64-slot bound. Byte-credit accounting and outbound queues stay unchanged. Docs and the existing Criterion fence benchmark now describe/exercise singleton and 64-frame admission.

Transaction count measured on file-backed SQLite: 1000 singleton admissions versus 16 admissions for the queued 1000-frame burst. The new G1 guard enforces <=125 and exactly ceil(1000/64)=16. Interactive input, batch boundaries/order, current-credit prefix, committed revocation mid-burst and revocation while reserving capacity are covered. The Criterion variants compile under all-targets clippy; no dev-VM throughput or timing claim is made.

Requested gates passed: fmt, workspace clippy --all-targets -- -D warnings, targeted stream tests, and INFRATERNAL_VERIFY_RUN_ID=fence-batch scripts/verify fast. Runs used nice -n 15, CARGO_BUILD_JOBS=2, explicit configured Cargo target cache and dev/test debug=0 with incremental disabled.

Targeted stream output, verbatim:

queued burst: 1000 DATA frames, 16 admit transactions (per-frame baseline: 1000)
test result: ok. 45 passed; 0 failed; 0 ignored; 0 measured; 86 filtered out; finished in 4.97s

The first complete fast attempt failed at the unchanged concurrent_closes_wait_for_the_same_pty_cleanup assertion comparing concurrent HTTP response completion instants. Its fixture sends OPEN then DELETE requests, with no inbound DATA. Exact isolated rerun passed without source/test changes:

test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 18 filtered out; finished in 2.93s

The full fast retry then passed without changing or weakening that test. Earlier failing output is preserved in /tmp/fence-batch-fast-attempt-1.log and /mnt/hdd/infraternal/artifacts/verify/fence-batch/step-9.log, and documented above. The corrected interactive fixture pauses time only around the collector to avoid SQLx real-worker pool timeout; this is covered by the final targeted and workspace runs.

Final fast gate output, verbatim:

WARN load5=10.82 exceeds online CPU count=8; timing-sensitive checks may be delayed
PASS fast: migrations are append-only (0.161s)
PASS fast: workspace package dependencies (0.228s)
PASS fast: JavaScript dependencies (0.491s)
PASS fast: advisory review policy tests (0.584s)
SUPPLY_CHAIN_REVIEWS advisory exceptions are within their review windows
SUPPLY_CHAIN cargo-deny: cargo-deny 0.20.2
SUPPLY_CHAIN_NOTICES generated THIRD_PARTY_NOTICES.md from 95 frontend packages
SUPPLY_CHAIN_NOTICES copied source: 179 shadcn files, 3 calternal-derived files
SUPPLY_CHAIN_NOTICES license files: 66 distinct texts; 0 packages need manual license review
advisories ok
SUPPLY_CHAIN_RUST_ADVISORIES passed with refreshed advisory data
licenses ok
SUPPLY_CHAIN_RUST_LICENSES passed
bun audit v1.4.2 (744846f84)

cookie@0.6.0
  workspace:@infraternal/web > @sveltejs/kit > cookie
  low: cookie accepts cookie name, path, and domain with out of bounds characters (<0.7.0) - https://github.com/advisories/GHSA-pxg6-pf52-xh8x

1 vulnerability (1 low)

  bun audit fix           upgrade the vulnerable packages within their ranges
  bun audit fix --latest  also cross major versions
SUPPLY_CHAIN_BUN_AUDIT findings reported; this check is report-only
SUPPLY_CHAIN_PASS Rust advisory/license checks complete; Bun findings are report-only
PASS fast: supply-chain checks (11.443s)
PASS fast: build web app (15.662s)
PASS fast: cargo fmt --check (2.042s)
PASS fast: cargo clippy (25.318s)
PASS fast: cargo test (159.866s)
PASS fast: svelte-check (27.999s)
PASS fast: UI package svelte-check (10.833s)
PASS fast: stream package typecheck (9.404s)
PASS fast: Vitest (10.194s)
PASS fast: UI package Vitest (34.051s)
PASS fast: stream package Vitest (2.879s)
PASS fast: OpenAPI and TypeScript client drift (114.191s)
PASS fast: terminal TypeScript (3.740s)
PASS fast: terminal Vitest (2.074s)
Finished fence-batch. Branch: fence-batch. Base: d987a32dfd11cda99b2ddc516ad74ba13fcc5003. Head: f967b3a1aee03653399787aed1fd142b2aef87bb. Committed locally; no push. Working tree is clean. Consecutive same-channel DATA already ready is bounded by 64 frames, the forwarding capacity and current byte credit. Capacity is reserved before one durable authorization transaction. Every enqueue runs synchronously in order under SQLite's writer lock and the watcher mutex; a previously committed revocation rejects the whole batch. Embedded and remote inbound queues share the 64-slot bound. Byte-credit accounting and outbound queues stay unchanged. Docs and the existing Criterion fence benchmark now describe/exercise singleton and 64-frame admission. Transaction count measured on file-backed SQLite: 1000 singleton admissions versus 16 admissions for the queued 1000-frame burst. The new G1 guard enforces <=125 and exactly ceil(1000/64)=16. Interactive input, batch boundaries/order, current-credit prefix, committed revocation mid-burst and revocation while reserving capacity are covered. The Criterion variants compile under all-targets clippy; no dev-VM throughput or timing claim is made. Requested gates passed: fmt, workspace clippy --all-targets -- -D warnings, targeted stream tests, and INFRATERNAL_VERIFY_RUN_ID=fence-batch scripts/verify fast. Runs used nice -n 15, CARGO_BUILD_JOBS=2, explicit configured Cargo target cache and dev/test debug=0 with incremental disabled. Targeted stream output, verbatim: ``` queued burst: 1000 DATA frames, 16 admit transactions (per-frame baseline: 1000) test result: ok. 45 passed; 0 failed; 0 ignored; 0 measured; 86 filtered out; finished in 4.97s ``` The first complete fast attempt failed at the unchanged concurrent_closes_wait_for_the_same_pty_cleanup assertion comparing concurrent HTTP response completion instants. Its fixture sends OPEN then DELETE requests, with no inbound DATA. Exact isolated rerun passed without source/test changes: ``` test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 18 filtered out; finished in 2.93s ``` The full fast retry then passed without changing or weakening that test. Earlier failing output is preserved in /tmp/fence-batch-fast-attempt-1.log and /mnt/hdd/infraternal/artifacts/verify/fence-batch/step-9.log, and documented above. The corrected interactive fixture pauses time only around the collector to avoid SQLx real-worker pool timeout; this is covered by the final targeted and workspace runs. Final fast gate output, verbatim: ``` WARN load5=10.82 exceeds online CPU count=8; timing-sensitive checks may be delayed PASS fast: migrations are append-only (0.161s) PASS fast: workspace package dependencies (0.228s) PASS fast: JavaScript dependencies (0.491s) PASS fast: advisory review policy tests (0.584s) SUPPLY_CHAIN_REVIEWS advisory exceptions are within their review windows SUPPLY_CHAIN cargo-deny: cargo-deny 0.20.2 SUPPLY_CHAIN_NOTICES generated THIRD_PARTY_NOTICES.md from 95 frontend packages SUPPLY_CHAIN_NOTICES copied source: 179 shadcn files, 3 calternal-derived files SUPPLY_CHAIN_NOTICES license files: 66 distinct texts; 0 packages need manual license review advisories ok SUPPLY_CHAIN_RUST_ADVISORIES passed with refreshed advisory data licenses ok SUPPLY_CHAIN_RUST_LICENSES passed bun audit v1.4.2 (744846f84) cookie@0.6.0 workspace:@infraternal/web > @sveltejs/kit > cookie low: cookie accepts cookie name, path, and domain with out of bounds characters (<0.7.0) - https://github.com/advisories/GHSA-pxg6-pf52-xh8x 1 vulnerability (1 low) bun audit fix upgrade the vulnerable packages within their ranges bun audit fix --latest also cross major versions SUPPLY_CHAIN_BUN_AUDIT findings reported; this check is report-only SUPPLY_CHAIN_PASS Rust advisory/license checks complete; Bun findings are report-only PASS fast: supply-chain checks (11.443s) PASS fast: build web app (15.662s) PASS fast: cargo fmt --check (2.042s) PASS fast: cargo clippy (25.318s) PASS fast: cargo test (159.866s) PASS fast: svelte-check (27.999s) PASS fast: UI package svelte-check (10.833s) PASS fast: stream package typecheck (9.404s) PASS fast: Vitest (10.194s) PASS fast: UI package Vitest (34.051s) PASS fast: stream package Vitest (2.879s) PASS fast: OpenAPI and TypeScript client drift (114.191s) PASS fast: terminal TypeScript (3.740s) PASS fast: terminal Vitest (2.074s) ```
Author
Owner

Fast-gate finding: the pre-existing untracked target symlink points to /home/kayg/.cache/infraternal-gate-target/stream-conformance, but that cache leaf was absent. scripts/verify writes target/verify-summary.txt and its mkdir -p failed through the dangling symlink after all listed fast checks had passed. I will create the empty cache leaf at the symlink destination, rerun fast, and leave the symlink untracked.

Fast-gate finding: the pre-existing untracked `target` symlink points to `/home/kayg/.cache/infraternal-gate-target/stream-conformance`, but that cache leaf was absent. `scripts/verify` writes `target/verify-summary.txt` and its `mkdir -p` failed through the dangling symlink after all listed fast checks had passed. I will create the empty cache leaf at the symlink destination, rerun `fast`, and leave the symlink untracked.
Author
Owner

Finished sc-merge #48 on branch stream-conformance.

Head SHA: 39953784873435a48620148367ba30a8120912d0 (merge commit Merge origin/dev into stream-conformance). The only conflict was crates/proto/benches/stream.rs; the resolution retains both control-admission benchmarks and both provider-reply split/assembly benchmarks. cargo fmt --all exited 0. cargo clippy --workspace --all-targets -- -D warnings reported cargo clippy: No issues found. Stream tests passed: proto 37 passed / 34 filtered; server library 41 passed / 88 filtered; server integration 26 passed / 16 ignored. No merge gate was run.

INFRATERAL_VERIFY_RUN_ID=sc-merge scripts/verify fast exited 0. Successful run output:

WARN load5=10.74 exceeds online CPU count=8; timing-sensitive checks may be delayed
PASS fast: migrations are append-only (2.381s)
PASS fast: workspace package dependencies (0.474s)
PASS fast: JavaScript dependencies (0.150s)
PASS fast: advisory review policy tests (0.216s)
SUPPLY_CHAIN_REVIEWS advisory exceptions are within their review windows
SUPPLY_CHAIN cargo-deny: cargo-deny 0.20.2
SUPPLY_CHAIN_NOTICES generated THIRD_PARTY_NOTICES.md from 95 frontend packages
SUPPLY_CHAIN_NOTICES copied source: 179 shadcn files, 3 calternal-derived files
SUPPLY_CHAIN_NOTICES license files: 66 distinct texts; 0 packages need manual license review
advisories ok
SUPPLY_CHAIN_RUST_ADVISORIES passed with refreshed advisory data
licenses ok
SUPPLY_CHAIN_RUST_LICENSES passed
bun audit v1.4.2 (744846f84)

cookie@0.6.0
  workspace:@infraternal/web > @sveltejs/kit > cookie
  low: cookie accepts cookie name, path, and domain with out of bounds characters (<0.7.0) - https://github.com/advisories/GHSA-pxg6-pf52-xh8x

1 vulnerability (1 low)

  bun audit fix           upgrade the vulnerable packages within their ranges
  bun audit fix --latest  also upgrade major versions
SUPPLY_CHAIN_BUN_AUDIT findings reported; this check is report-only
SUPPLY_CHAIN_PASS Rust advisory/license checks complete; Bun findings are report-only
PASS fast: supply-chain checks (8.820s)
PASS fast: build web app (25.036s)
PASS fast: cargo fmt --check (1.394s)
PASS fast: cargo clippy (28.913s)
PASS fast: cargo test (187.011s)
PASS fast: svelte-check (12.879s)
PASS fast: UI package svelte-check (6.607s)
PASS fast: stream package typecheck (5.336s)
PASS fast: Vitest (3.560s)
PASS fast: UI package Vitest (13.063s)
PASS fast: stream package Vitest (0.871s)
PASS fast: OpenAPI and TypeScript client drift (21.994s)
PASS fast: terminal TypeScript (1.947s)
PASS fast: terminal Vitest (1.133s)

The pre-existing target symlink remains untracked and was not committed. Its previously missing cache destination was created so the gate could write its summary. No push was performed.

Finished sc-merge #48 on branch `stream-conformance`. Head SHA: `39953784873435a48620148367ba30a8120912d0` (merge commit `Merge origin/dev into stream-conformance`). The only conflict was `crates/proto/benches/stream.rs`; the resolution retains both control-admission benchmarks and both provider-reply split/assembly benchmarks. `cargo fmt --all` exited 0. `cargo clippy --workspace --all-targets -- -D warnings` reported `cargo clippy: No issues found`. Stream tests passed: proto 37 passed / 34 filtered; server library 41 passed / 88 filtered; server integration 26 passed / 16 ignored. No merge gate was run. `INFRATERAL_VERIFY_RUN_ID=sc-merge scripts/verify fast` exited 0. Successful run output: ```text WARN load5=10.74 exceeds online CPU count=8; timing-sensitive checks may be delayed PASS fast: migrations are append-only (2.381s) PASS fast: workspace package dependencies (0.474s) PASS fast: JavaScript dependencies (0.150s) PASS fast: advisory review policy tests (0.216s) SUPPLY_CHAIN_REVIEWS advisory exceptions are within their review windows SUPPLY_CHAIN cargo-deny: cargo-deny 0.20.2 SUPPLY_CHAIN_NOTICES generated THIRD_PARTY_NOTICES.md from 95 frontend packages SUPPLY_CHAIN_NOTICES copied source: 179 shadcn files, 3 calternal-derived files SUPPLY_CHAIN_NOTICES license files: 66 distinct texts; 0 packages need manual license review advisories ok SUPPLY_CHAIN_RUST_ADVISORIES passed with refreshed advisory data licenses ok SUPPLY_CHAIN_RUST_LICENSES passed bun audit v1.4.2 (744846f84) cookie@0.6.0 workspace:@infraternal/web > @sveltejs/kit > cookie low: cookie accepts cookie name, path, and domain with out of bounds characters (<0.7.0) - https://github.com/advisories/GHSA-pxg6-pf52-xh8x 1 vulnerability (1 low) bun audit fix upgrade the vulnerable packages within their ranges bun audit fix --latest also upgrade major versions SUPPLY_CHAIN_BUN_AUDIT findings reported; this check is report-only SUPPLY_CHAIN_PASS Rust advisory/license checks complete; Bun findings are report-only PASS fast: supply-chain checks (8.820s) PASS fast: build web app (25.036s) PASS fast: cargo fmt --check (1.394s) PASS fast: cargo clippy (28.913s) PASS fast: cargo test (187.011s) PASS fast: svelte-check (12.879s) PASS fast: UI package svelte-check (6.607s) PASS fast: stream package typecheck (5.336s) PASS fast: Vitest (3.560s) PASS fast: UI package Vitest (13.063s) PASS fast: stream package Vitest (0.871s) PASS fast: OpenAPI and TypeScript client drift (21.994s) PASS fast: terminal TypeScript (1.947s) PASS fast: terminal Vitest (1.133s) ``` The pre-existing `target` symlink remains untracked and was not committed. Its previously missing cache destination was created so the gate could write its summary. No push was performed.
Author
Owner

The isolated test reached DATA 16, then stalled at DATA 17: stream_data_fence_cost_stays_within_current_per_frame_upper_bound failed with remote test infraternal agent did not drain DATA frame 17 of 1000 after 60 seconds.

The test-only TestTunnelWriter::send_from_agent helper wrote directly to the route sender and skipped account_tunnel_frame, unlike production tunnel ingress. Its CREDIT therefore replenished the stream fixture but left the tunnel route's agent window at zero; the route rejected subsequent DATA. The helper now applies inbound tunnel accounting before forwarding the frame.

The isolated test reached DATA 16, then stalled at DATA 17: `stream_data_fence_cost_stays_within_current_per_frame_upper_bound` failed with `remote test infraternal agent did not drain DATA frame 17 of 1000` after 60 seconds. The test-only `TestTunnelWriter::send_from_agent` helper wrote directly to the route sender and skipped `account_tunnel_frame`, unlike production tunnel ingress. Its CREDIT therefore replenished the stream fixture but left the tunnel route's agent window at zero; the route rejected subsequent DATA. The helper now applies inbound tunnel accounting before forwarding the frame.
Author
Owner

Finished pg-fix #48.

Branch: perf-guards-nightly
Head: 01fa2b078e50b04b41aa8d9206fa774737306cf8

The deterministic DATA fence guard now uses a per-frame upper bound and asserts that the authorization fence ran. The test tunnel helper applies the same inbound window accounting as production; without it, the test CREDIT replenished the stream fixture but left the tunnel route window at zero. The targeted test passed 20 consecutive runs (1 passed, 132 filtered out each). Workspace clippy reported cargo clippy: No issues found.

INFRATERNAL_VERIFY_RUN_ID=pg-fix scripts/verify fast exited 0. The first run completed every stage but could not write its summary because the pre-existing target symlink was dangling. I created its intended empty gate-output directory and reran the gate successfully.

Fast gate summary, quoted verbatim from target/verify-summary.txt:

Gate: fast
Stages: 18
Elapsed  Stage
0.144s   fast: migrations are append-only
0.203s   fast: workspace package dependencies
0.005s   fast: JavaScript dependencies
0.185s   fast: advisory review policy tests
4.190s   fast: supply-chain checks
11.197s  fast: build web app
1.302s   fast: cargo fmt --check
22.584s  fast: cargo clippy
171.007s fast: cargo test
9.107s   fast: svelte-check
4.914s   fast: UI package svelte-check
3.526s   fast: stream package typecheck
3.460s   fast: Vitest
8.871s   fast: UI package Vitest
1.385s   fast: stream package Vitest
21.629s  fast: OpenAPI and TypeScript client drift
1.856s   fast: terminal TypeScript
1.042s   fast: terminal Vitest
Total: 266.607s
Finished pg-fix #48. Branch: `perf-guards-nightly` Head: `01fa2b078e50b04b41aa8d9206fa774737306cf8` The deterministic DATA fence guard now uses a per-frame upper bound and asserts that the authorization fence ran. The test tunnel helper applies the same inbound window accounting as production; without it, the test CREDIT replenished the stream fixture but left the tunnel route window at zero. The targeted test passed 20 consecutive runs (`1 passed, 132 filtered out` each). Workspace clippy reported `cargo clippy: No issues found`. `INFRATERNAL_VERIFY_RUN_ID=pg-fix scripts/verify fast` exited 0. The first run completed every stage but could not write its summary because the pre-existing `target` symlink was dangling. I created its intended empty gate-output directory and reran the gate successfully. Fast gate summary, quoted verbatim from `target/verify-summary.txt`: ```text Gate: fast Stages: 18 Elapsed Stage 0.144s fast: migrations are append-only 0.203s fast: workspace package dependencies 0.005s fast: JavaScript dependencies 0.185s fast: advisory review policy tests 4.190s fast: supply-chain checks 11.197s fast: build web app 1.302s fast: cargo fmt --check 22.584s fast: cargo clippy 171.007s fast: cargo test 9.107s fast: svelte-check 4.914s fast: UI package svelte-check 3.526s fast: stream package typecheck 3.460s fast: Vitest 8.871s fast: UI package Vitest 1.385s fast: stream package Vitest 21.629s fast: OpenAPI and TypeScript client drift 1.856s fast: terminal TypeScript 1.042s fast: terminal Vitest Total: 266.607s ```
Author
Owner

Started th-merge on branch tunnel-hostname at base 5c6359ba715aec3e8122872c0bfa8f6c7fb12347. Merging origin/dev at 2265bb7f90; resolving crates/server/src/lib.rs while preserving hostname TLS/enrollment wiring and the incoming server changes.

Started th-merge on branch tunnel-hostname at base 5c6359ba715aec3e8122872c0bfa8f6c7fb12347. Merging origin/dev at 2265bb7f905792c70d38b38f45039020543b23db; resolving crates/server/src/lib.rs while preserving hostname TLS/enrollment wiring and the incoming server changes.
Author
Owner

Merge finding: the only content conflict was an overlap between and in . I retained both and closed the endpoint impl before the provider initializer. §6.2 requires the configured hostname to drive the tunnel URL and SNI matching; still starts the provider initializer only when the embedded infraternal agent is enabled. Focused verification is running.

Merge finding: the only content conflict was an overlap between and in . I retained both and closed the endpoint impl before the provider initializer. §6.2 requires the configured hostname to drive the tunnel URL and SNI matching; still starts the provider initializer only when the embedded infraternal agent is enabled. Focused verification is running.
Author
Owner

Correction to the previous merge finding comment: the conflict was between TunnelEndpoint::from_config and spawn_embedded_providers in crates/server/src/lib.rs. I retained both and closed the tunnel endpoint impl before the provider initializer. docs/contracts.md section 6.2 requires the configured hostname to drive the tunnel URL and SNI matching. Server::open still starts provider initialization only when the embedded infraternal agent is enabled. Focused verification is running.

Correction to the previous merge finding comment: the conflict was between TunnelEndpoint::from_config and spawn_embedded_providers in crates/server/src/lib.rs. I retained both and closed the tunnel endpoint impl before the provider initializer. docs/contracts.md section 6.2 requires the configured hostname to drive the tunnel URL and SNI matching. Server::open still starts provider initialization only when the embedded infraternal agent is enabled. Focused verification is running.
Author
Owner

th-merge resumed on branch tunnel-hostname at base head 5c6359ba715aec3e8122872c0bfa8f6c7fb12347. The worktree already has an active merge with MERGE_HEAD 2265bb7f90; conflicts are resolved and changes are staged. Current origin/dev is 52c38730ff, so I am preserving the active merge target recorded for this job. Disk check: /mnt/hdd has 8.1 GB free; target/ is empty. Continuing from the existing merge state.

th-merge resumed on branch tunnel-hostname at base head 5c6359ba715aec3e8122872c0bfa8f6c7fb12347. The worktree already has an active merge with MERGE_HEAD 2265bb7f905792c70d38b38f45039020543b23db; conflicts are resolved and changes are staged. Current origin/dev is 52c38730ff22ff2bbb184e572d84d82cbf72732d, so I am preserving the active merge target recorded for this job. Disk check: /mnt/hdd has 8.1 GB free; target/ is empty. Continuing from the existing merge state.
Author
Owner

Finding: the worktree's untracked target symlink points to the missing /mnt/hdd/infraternal/gate-target/tunnel-hostname directory, so build artifacts from the interrupted run are gone. /mnt/hdd currently has 6.9 GB free. I will recreate only that generated-artifact directory, use a lean debug profile with incremental compilation disabled, and stop builds if free space falls below 5 GB.

Finding: the worktree's untracked target symlink points to the missing /mnt/hdd/infraternal/gate-target/tunnel-hostname directory, so build artifacts from the interrupted run are gone. /mnt/hdd currently has 6.9 GB free. I will recreate only that generated-artifact directory, use a lean debug profile with incremental compilation disabled, and stop builds if free space falls below 5 GB.
Author
Owner

Resolution evidence: git ls-files -u is empty. The staged tree retains --tunnel-hostname, ServerConfig::tunnel_hostname, enrollment URL wiring, and the dedicated tunnel SAN/SNI setup (git grep --cached); the staged Server::open also retains dev's embedded provider initialization and HostRouter wiring (git diff HEAD -- crates/server/src/lib.rs). cargo fmt --all --check and git diff --cached --check pass.

Resolution evidence: `git ls-files -u` is empty. The staged tree retains `--tunnel-hostname`, `ServerConfig::tunnel_hostname`, enrollment URL wiring, and the dedicated tunnel SAN/SNI setup (`git grep --cached`); the staged `Server::open` also retains dev's embedded provider initialization and HostRouter wiring (`git diff HEAD -- crates/server/src/lib.rs`). `cargo fmt --all --check` and `git diff --cached --check` pass.
Author
Owner

Targeted tests passed before the full fast gate:

  • cargo test -p infraternal-server --lib dedicated_tunnel: cargo test: 2 passed, 130 filtered out (1 suite, 0.06s)
  • cargo test -p infraternal-server --test agent_enrollment dedicated_tunnel_hostname: cargo test: 1 passed, 6 filtered out (1 suite, 0.31s)
  • cargo test -p infraternal --test agent_tunnel dedicated_tunnel_hostname: cargo test: 1 passed, 1 filtered out (1 suite, 0.40s)
  • cargo test -p infraternal-server --lib remote_inspect_and_actions_use_signed_provider_rpc: cargo test: 1 passed, 131 filtered out (1 suite, 1.37s)
  • cargo test -p infraternal-proto stream: cargo test: 37 passed, 34 filtered out (2 suites, 1.29s)
  • cargo test -p infraternal-server --lib stream: cargo test: 41 passed, 91 filtered out (1 suite, 1.81s)
    Workspace clippy output was cargo clippy: No issues found.
Targeted tests passed before the full fast gate: - `cargo test -p infraternal-server --lib dedicated_tunnel`: `cargo test: 2 passed, 130 filtered out (1 suite, 0.06s)` - `cargo test -p infraternal-server --test agent_enrollment dedicated_tunnel_hostname`: `cargo test: 1 passed, 6 filtered out (1 suite, 0.31s)` - `cargo test -p infraternal --test agent_tunnel dedicated_tunnel_hostname`: `cargo test: 1 passed, 1 filtered out (1 suite, 0.40s)` - `cargo test -p infraternal-server --lib remote_inspect_and_actions_use_signed_provider_rpc`: `cargo test: 1 passed, 131 filtered out (1 suite, 1.37s)` - `cargo test -p infraternal-proto stream`: `cargo test: 37 passed, 34 filtered out (2 suites, 1.29s)` - `cargo test -p infraternal-server --lib stream`: `cargo test: 41 passed, 91 filtered out (1 suite, 1.81s)` Workspace clippy output was `cargo clippy: No issues found`.
Author
Owner

th-merge finished.

Branch tunnel-hostname is at merge commit 5d56cfda821862fd801ee1e8dae2ba017ba4130f; parents are 5c6359ba715aec3e8122872c0bfa8f6c7fb12347 and the requested merge target 2265bb7f905792c70d38b38f45039020543b23db. The staged resolution kept this branch's dedicated tunnel hostname, SNI/SAN and enrollment wiring with dev's provider and stream changes. Tracked files are clean. The pre-existing untracked target symlink remains uncommitted. No push was made.

origin/dev has since advanced to 52c38730ff22ff2bbb184e572d84d82cbf72732d (three commits beyond the active merge target); this job concluded the merge already in progress against 2265bb7 as specified.

INFRATERAL_VERIFY_RUN_ID=th-merge-20261003 scripts/verify fast exited 0. Verbatim gate output:

WARN load5=10.48 exceeds online CPU count=8; timing-sensitive checks may be delayed
PASS fast: migrations are append-only (0.194s)
PASS fast: workspace package dependencies (0.255s)
PASS fast: JavaScript dependencies (0.046s)
PASS fast: advisory review policy tests (0.156s)
SUPPLY_CHAIN_REVIEWS advisory exceptions are within their review windows
SUPPLY_CHAIN cargo-deny: cargo-deny 0.20.2
SUPPLY_CHAIN_NOTICES generated THIRD_PARTY_NOTICES.md from 95 frontend packages
SUPPLY_CHAIN_NOTICES copied source: 179 shadcn files, 3 calternal-derived files
SUPPLY_CHAIN_NOTICES license files: 66 distinct texts; 0 packages need manual license review
advisories ok
SUPPLY_CHAIN_RUST_ADVISORIES passed with refreshed advisory data
licenses ok
SUPPLY_CHAIN_RUST_LICENSES passed
bun audit v1.4.2 (744846f84)

cookie@0.6.0
  workspace:@infraternal/web > @sveltejs/kit > cookie
  low: cookie accepts cookie name, path, and domain with out of bounds characters (<0.7.0) - https://github.com/advisories/GHSA-pxg6-pf52-xh8x

1 vulnerability (1 low)

  bun audit fix           upgrade the vulnerable packages within their ranges
  bun audit fix --latest  also cross major versions
SUPPLY_CHAIN_BUN_AUDIT findings reported; this check is report-only
SUPPLY_CHAIN_PASS Rust advisory/license checks complete; Bun findings are report-only
PASS fast: supply-chain checks (4.302s)
PASS fast: build web app (14.489s)
PASS fast: cargo fmt --check (1.247s)
PASS fast: cargo clippy (16.833s)
PASS fast: cargo test (197.050s)
PASS fast: svelte-check (11.822s)
PASS fast: UI package svelte-check (4.993s)
PASS fast: stream package typecheck (4.219s)
PASS fast: Vitest (3.785s)
PASS fast: UI package Vitest (11.912s)
PASS fast: stream package Vitest (0.893s)
PASS fast: OpenAPI and TypeScript client drift (56.315s)
PASS fast: terminal TypeScript (2.498s)
PASS fast: terminal Vitest (1.283s)

Verifier summary:

Gate: fast
Stages: 18
Elapsed  Stage
0.194s   fast: migrations are append-only
0.255s   fast: workspace package dependencies
0.046s   fast: JavaScript dependencies
0.156s   fast: advisory review policy tests
4.302s   fast: supply-chain checks
14.489s  fast: build web app
1.247s   fast: cargo fmt --check
16.833s  fast: cargo clippy
197.050s fast: cargo test
11.822s  fast: svelte-check
4.993s   fast: UI package svelte-check
4.219s   fast: stream package typecheck
3.785s   fast: Vitest
11.912s  fast: UI package Vitest
0.893s   fast: stream package Vitest
56.315s  fast: OpenAPI and TypeScript client drift
2.498s   fast: terminal TypeScript
1.283s   fast: terminal Vitest
Total: 332.292s
th-merge finished. Branch `tunnel-hostname` is at merge commit `5d56cfda821862fd801ee1e8dae2ba017ba4130f`; parents are `5c6359ba715aec3e8122872c0bfa8f6c7fb12347` and the requested merge target `2265bb7f905792c70d38b38f45039020543b23db`. The staged resolution kept this branch's dedicated tunnel hostname, SNI/SAN and enrollment wiring with dev's provider and stream changes. Tracked files are clean. The pre-existing untracked `target` symlink remains uncommitted. No push was made. `origin/dev` has since advanced to `52c38730ff22ff2bbb184e572d84d82cbf72732d` (three commits beyond the active merge target); this job concluded the merge already in progress against `2265bb7` as specified. `INFRATERAL_VERIFY_RUN_ID=th-merge-20261003 scripts/verify fast` exited 0. Verbatim gate output: ```text WARN load5=10.48 exceeds online CPU count=8; timing-sensitive checks may be delayed PASS fast: migrations are append-only (0.194s) PASS fast: workspace package dependencies (0.255s) PASS fast: JavaScript dependencies (0.046s) PASS fast: advisory review policy tests (0.156s) SUPPLY_CHAIN_REVIEWS advisory exceptions are within their review windows SUPPLY_CHAIN cargo-deny: cargo-deny 0.20.2 SUPPLY_CHAIN_NOTICES generated THIRD_PARTY_NOTICES.md from 95 frontend packages SUPPLY_CHAIN_NOTICES copied source: 179 shadcn files, 3 calternal-derived files SUPPLY_CHAIN_NOTICES license files: 66 distinct texts; 0 packages need manual license review advisories ok SUPPLY_CHAIN_RUST_ADVISORIES passed with refreshed advisory data licenses ok SUPPLY_CHAIN_RUST_LICENSES passed bun audit v1.4.2 (744846f84) cookie@0.6.0 workspace:@infraternal/web > @sveltejs/kit > cookie low: cookie accepts cookie name, path, and domain with out of bounds characters (<0.7.0) - https://github.com/advisories/GHSA-pxg6-pf52-xh8x 1 vulnerability (1 low) bun audit fix upgrade the vulnerable packages within their ranges bun audit fix --latest also cross major versions SUPPLY_CHAIN_BUN_AUDIT findings reported; this check is report-only SUPPLY_CHAIN_PASS Rust advisory/license checks complete; Bun findings are report-only PASS fast: supply-chain checks (4.302s) PASS fast: build web app (14.489s) PASS fast: cargo fmt --check (1.247s) PASS fast: cargo clippy (16.833s) PASS fast: cargo test (197.050s) PASS fast: svelte-check (11.822s) PASS fast: UI package svelte-check (4.993s) PASS fast: stream package typecheck (4.219s) PASS fast: Vitest (3.785s) PASS fast: UI package Vitest (11.912s) PASS fast: stream package Vitest (0.893s) PASS fast: OpenAPI and TypeScript client drift (56.315s) PASS fast: terminal TypeScript (2.498s) PASS fast: terminal Vitest (1.283s) ``` Verifier summary: ```text Gate: fast Stages: 18 Elapsed Stage 0.194s fast: migrations are append-only 0.255s fast: workspace package dependencies 0.046s fast: JavaScript dependencies 0.156s fast: advisory review policy tests 4.302s fast: supply-chain checks 14.489s fast: build web app 1.247s fast: cargo fmt --check 16.833s fast: cargo clippy 197.050s fast: cargo test 11.822s fast: svelte-check 4.993s fast: UI package svelte-check 4.219s fast: stream package typecheck 3.785s fast: Vitest 11.912s fast: UI package Vitest 0.893s fast: stream package Vitest 56.315s fast: OpenAPI and TypeScript client drift 2.498s fast: terminal TypeScript 1.283s fast: terminal Vitest Total: 332.292s ```
Author
Owner

Starting stream-batch2 integration. Only writer in /mnt/hdd/infraternal/wt-lp/stream-batch2, branch stream-batch2, base d4fee7ba2f. Merge order: fence-batch f967b3a, remote-ssh 0120952, flake-sweep ff7e6f0; then teardown-followups if its updated dev merge is ready. Current teardown-followups tip 46cf51b starts with Merge origin/dev. Preserve fail-closed and durable-audit-before-CLOSE semantics, 850 ms close bound, local stream isolation. Cargo check after each merge; final requested debug validation and fast gate. No push.

Starting stream-batch2 integration. Only writer in /mnt/hdd/infraternal/wt-lp/stream-batch2, branch stream-batch2, base d4fee7ba2fa24d5dc55c0cbd22750c065df4668b. Merge order: fence-batch f967b3a, remote-ssh 0120952, flake-sweep ff7e6f0; then teardown-followups if its updated dev merge is ready. Current teardown-followups tip 46cf51b starts with Merge origin/dev. Preserve fail-closed and durable-audit-before-CLOSE semantics, 850 ms close bound, local stream isolation. Cargo check after each merge; final requested debug validation and fast gate. No push.
Author
Owner

Starting read-mostly sdp-audit at detached HEAD d4fee7ba2fa24d5dc55c0cbd22750c065df4668b in /mnt/hdd/infraternal/wt-lp/sdp-audit. No product-code commits or pushes. Building one release binary with preset CARGO_TARGET_DIR, nice 15, three Cargo build jobs. Real labelled fixtures only; demo containers excluded. Findings recorded in /mnt/hdd/infraternal/jobs/sdp-audit/findings.md.

Starting read-mostly sdp-audit at detached HEAD `d4fee7ba2fa24d5dc55c0cbd22750c065df4668b` in `/mnt/hdd/infraternal/wt-lp/sdp-audit`. No product-code commits or pushes. Building one release binary with preset CARGO_TARGET_DIR, nice 15, three Cargo build jobs. Real labelled fixtures only; demo containers excluded. Findings recorded in `/mnt/hdd/infraternal/jobs/sdp-audit/findings.md`.
Author
Owner

Baseline evidence at d4fee7ba2f, one release build (14m 25s), product code unchanged. scripts/verify e2e-remote exited 1. Real Docker and rootless Podman; fixtures relabelled infraternal.test=sdp-audit by disposable argv wrappers. 46 actual passes, remote SSH OPEN returns unsupported, remote infraternal-agent revocation actually passes but stale policy classifies unexpected-pass (e2e/remote/policy.ts:15). Container remote inspect/actions pass on this audited head, unlike the older readiness document. Full evidence: /mnt/hdd/infraternal/jobs/sdp-audit/evidence/verify/sdp-audit-baseline/e2e/remote-sdp-audit-baseline/report.json.

Verbatim gate excerpt:

EXPECTED-FAIL remote/both/host/ssh: ssh:open: 0 unsupported
UNEXPECTED-PASS remote/both/host/infraternal-agent-revocation
PARITY fail: 46 pass, 1 expected-fail, 1 failing cases

Additional hands-on CLI, MCP, slow stop, 305-container, SSH and fault tests are running; these passes do not certify VM performance budgets.

Baseline evidence at d4fee7ba2fa24d5dc55c0cbd22750c065df4668b, one release build (14m 25s), product code unchanged. `scripts/verify e2e-remote` exited 1. Real Docker and rootless Podman; fixtures relabelled `infraternal.test=sdp-audit` by disposable argv wrappers. 46 actual passes, remote SSH OPEN returns `unsupported`, remote infraternal-agent revocation actually passes but stale policy classifies `unexpected-pass` (e2e/remote/policy.ts:15). Container remote inspect/actions pass on this audited head, unlike the older readiness document. Full evidence: /mnt/hdd/infraternal/jobs/sdp-audit/evidence/verify/sdp-audit-baseline/e2e/remote-sdp-audit-baseline/report.json. Verbatim gate excerpt: ``` EXPECTED-FAIL remote/both/host/ssh: ssh:open: 0 unsupported UNEXPECTED-PASS remote/both/host/infraternal-agent-revocation PARITY fail: 46 pass, 1 expected-fail, 1 failing cases ``` Additional hands-on CLI, MCP, slow stop, 305-container, SSH and fault tests are running; these passes do not certify VM performance budgets.
Author
Owner

Confirmed hands-on findings on unchanged d4fee7ba2f:

  1. Remote persistent exec DELETE returns HTTP 200 {closed:true} for both Docker and rootless Podman, but no client CLOSE arrives within 3–5 s and kill -0 inside the owned test container confirms its native shell remains alive. Embedded DELETE closes and kills the shell. Suspect crates/server/src/personal.rs:435–460: remote sessions are absent from embedded live-session sets, enter the already-exited branch without routed termination. Evidence: jobs/sdp-audit/evidence/followup.json.
  2. Remote Docker inventory freezes during 305 stopped labelled fixture creation: embedded API/CLI see all 305; remote API/CLI see 286 after a 60-second settlement window, with HTTP 200 and no incomplete/stale indicator. 364 controlled samples, zero non-200 samples in that run. Native total 316 vs final remote total 298. Suspects runtime reconciliation/admission and legacy publisher (provider_runtime.rs:343, remote.rs:534, tunnel.rs:898), not yet a proven root cause. Evidence: followup.json, scale-timeline.json.
  3. DOCKER_HOST=unix://<owned-rootless-Podman-API> exposes the same actual Podman fixture in both Docker and Podman inventory, on embedded and remote paths. provider-podman/src/lib.rs:41 reads Docker's override; no independent Podman override is available. Missing configured endpoints return healthy HTTP 200 empty inventories.
  4. Remote SSH OPEN is unsupported, and /api/v1/ssh/credentials/default returns the embedded key rather than the enrolled remote runtime's key (compared in-memory; no key material emitted).
  5. CLI logs --tail 1 --follow --timeout 2 exits 2 before calling the server on all four routes.

Positive controls: all four real CLI PTY+resize cases pass on corrected observer; piped stdin/EOF, 2 MiB exec output, exit codes, API+CLI lifecycle actions and bounded/multiline logs pass. Four API slow-stop cases honor the real 20-second TERM handler under 30-second grace. Rootless Podman 305 inventory passes embedded+remote API+CLI. Forty narrowed-token refusal attempts all return 403 and preserve native state. Real owned TCP tunnel drop reconnects the same runtime and retains both Docker and Podman persistent shells with replay. SSH changed-key refusal and explicit replacement pass; active SSH revocation closes forbidden in 105 ms (dev-VM diagnostic, not certified performance).

Audit-driver corrections are documented in findings.md and excluded from product counts. Private Docker now runs in a separate network namespace; after the initial private-daemon run exposed a missing shared docker0 interface, its recorded subnet/gateway and three verified existing endpoints were restored without stopping, restarting, removing or execing any existing container. A corrected isolated Docker run reproduces remote Docker inventory unavailability while embedded Docker remains usable. The report will explicitly retain this isolation incident and coverage limits.

Confirmed hands-on findings on unchanged d4fee7ba2fa24d5dc55c0cbd22750c065df4668b: 1. Remote persistent exec DELETE returns HTTP 200 `{closed:true}` for both Docker and rootless Podman, but no client CLOSE arrives within 3–5 s and `kill -0` inside the owned test container confirms its native shell remains alive. Embedded DELETE closes and kills the shell. Suspect `crates/server/src/personal.rs:435–460`: remote sessions are absent from embedded live-session sets, enter the already-exited branch without routed termination. Evidence: `jobs/sdp-audit/evidence/followup.json`. 2. Remote Docker inventory freezes during 305 stopped labelled fixture creation: embedded API/CLI see all 305; remote API/CLI see 286 after a 60-second settlement window, with HTTP 200 and no incomplete/stale indicator. 364 controlled samples, zero non-200 samples in that run. Native total 316 vs final remote total 298. Suspects runtime reconciliation/admission and legacy publisher (`provider_runtime.rs:343`, `remote.rs:534`, `tunnel.rs:898`), not yet a proven root cause. Evidence: followup.json, scale-timeline.json. 3. `DOCKER_HOST=unix://<owned-rootless-Podman-API>` exposes the same actual Podman fixture in both Docker and Podman inventory, on embedded and remote paths. `provider-podman/src/lib.rs:41` reads Docker's override; no independent Podman override is available. Missing configured endpoints return healthy HTTP 200 empty inventories. 4. Remote SSH OPEN is unsupported, and `/api/v1/ssh/credentials/default` returns the embedded key rather than the enrolled remote runtime's key (compared in-memory; no key material emitted). 5. CLI `logs --tail 1 --follow --timeout 2` exits 2 before calling the server on all four routes. Positive controls: all four real CLI PTY+resize cases pass on corrected observer; piped stdin/EOF, 2 MiB exec output, exit codes, API+CLI lifecycle actions and bounded/multiline logs pass. Four API slow-stop cases honor the real 20-second TERM handler under 30-second grace. Rootless Podman 305 inventory passes embedded+remote API+CLI. Forty narrowed-token refusal attempts all return 403 and preserve native state. Real owned TCP tunnel drop reconnects the same runtime and retains both Docker and Podman persistent shells with replay. SSH changed-key refusal and explicit replacement pass; active SSH revocation closes forbidden in 105 ms (dev-VM diagnostic, not certified performance). Audit-driver corrections are documented in findings.md and excluded from product counts. Private Docker now runs in a separate network namespace; after the initial private-daemon run exposed a missing shared docker0 interface, its recorded subnet/gateway and three verified existing endpoints were restored without stopping, restarting, removing or execing any existing container. A corrected isolated Docker run reproduces remote Docker inventory unavailability while embedded Docker remains usable. The report will explicitly retain this isolation incident and coverage limits.
Author
Owner

Resuming stream-batch2 at 10840ac678 (base d4fee7b). All four requested merges and targeted tests already recorded; no merge or test repetition redo. Previous fast gate failed during linking with No space left on device. Current df: / 22 GB free, /mnt/hdd 16 GB free, both above 6 GB cutoff. Resuming debug-only fast in lean environment, nice -n 15; no code-review-graph rebuild, other jobs, or pushes.

Resuming stream-batch2 at 10840ac678d8ba5c0a7a16b8336bed49d9cc271c (base d4fee7b). All four requested merges and targeted tests already recorded; no merge or test repetition redo. Previous fast gate failed during linking with No space left on device. Current df: / 22 GB free, /mnt/hdd 16 GB free, both above 6 GB cutoff. Resuming debug-only fast in lean environment, nice -n 15; no code-review-graph rebuild, other jobs, or pushes.
Author
Owner

Integration head: 10840ac678
Branch: stream-batch2; base: d4fee7ba2f. No push.

Merge notes:

  • fence-batch f967b3a -> e14a720: one stream.rs receive-loop conflict; keep pending-message burst batching and dev oversized-WebSocket Close 1009.
  • remote-ssh 0120952 -> 4685895: no content conflicts; retain per-infraternal-agent SSH key/trust ownership and creator-lineage session authority.
  • flake-sweep ff7e6f0 -> 9bcdc52: one grant-shrink test conflict; preserve owner AND creator authority, adopt event-driven process exit evidence.
  • teardown-followups 46cf51b (qualifying Merge origin/dev commit newer than c37f762) -> cbf31ff: conflicts in stream.rs operation/receive loop and contracts §2.3. Prepare bounded ready DATA before storage-admission waits so the socket read half can be dropped at cutoff; reuse the pair snapshot. Combine batched audits, shared reads, bounded concurrent detaches and 150 ms socket cutoff with transport-CLOSE reservation before audits.

Follow-ups:

  • Update auto-merged repeated-withdrawal test fixture for new shared-read counters and detach timestamps.
  • Replace concurrent HTTP caller timestamp ordering with real original-process exit and durable cleanup-fence evidence at each response; retain observed overlap and final socket/process checks.
  • Add containers:read to recovered-OPEN events fixture, preserving storage-error injection and recovery checks.
  • Isolate log/PTY test containers with network none after the dev VM lost docker0; no host service or network changes.

Validation (debug, lean environment, nice -n 15):

check-fence:

    Finished `dev` profile [unoptimized + debuginfo] target(s) in 48.64s

check-ssh:

    Finished `dev` profile [unoptimized + debuginfo] target(s) in 29.23s

check-flake:

    Finished `dev` profile [unoptimized + debuginfo] target(s) in 5.79s

check-teardown:

    Finished `dev` profile [unoptimized + debuginfo] target(s) in 4.15s

server-lib:

     Running unittests src/lib.rs (target/debug/deps/infraternal_server-c4746f7e9761787d)
test result: ok. 158 passed; 0 failed; 2 ignored; 0 measured; 0 filtered out; finished in 36.25s

server-integration:

     Running tests/agent_tunnel_tls.rs (target/debug/deps/agent_tunnel_tls-cfa2abc8c0c14cbd)
test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.77s
     Running tests/storage.rs (target/debug/deps/storage-762922d317c64f9e)
test result: ok. 24 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 7.12s
     Running tests/stream.rs (target/debug/deps/stream-8241f3189c0d9a3b)
test result: ok. 10 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 2.73s
     Running tests/stream_regressions.rs (target/debug/deps/stream_regressions-18fb77f37e68a261)
test result: ok. 22 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 120.04s

stream-regressions-confirmed:

     Running tests/stream_regressions.rs (target/debug/deps/stream_regressions-18fb77f37e68a261)
test result: ok. 22 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 94.63s

stream-e2e:

     Running tests/stream_e2e.rs (target/debug/deps/stream_e2e-f8e5042b9faaae97)
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 13 filtered out; finished in 8.67s

runtime:

     Running unittests src/lib.rs (target/debug/deps/infraternal_agent-317ab6e1573c0e37)
test result: ok. 28 passed; 0 failed; 7 ignored; 0 measured; 0 filtered out; finished in 0.13s

ssh-core:

     Running tests/real_sshd.rs (target/debug/deps/real_sshd-08ed15bb0796f6a5)
test result: ok. 15 passed; 0 failed; 0 ignored; 0 measured; 1 filtered out; finished in 14.48s

ssh-embedded:

     Running tests/ssh_product.rs (target/debug/deps/ssh_product-b82c51bb182f9109)
test result: ok. 4 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 14.43s

ssh-remote:

     Running tests/remote_ssh.rs (target/debug/deps/remote_ssh-a989e0e5662352ca)
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 2.66s

tunnel-allocation:

     Running unittests src/lib.rs (target/debug/deps/infraternal_server-c4746f7e9761787d)
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 159 filtered out; finished in 0.31s

Concurrent cleanup repetitions:

PASS concurrent cleanup repetition 1/20
PASS concurrent cleanup repetition 2/20
PASS concurrent cleanup repetition 3/20
PASS concurrent cleanup repetition 4/20
PASS concurrent cleanup repetition 5/20
PASS concurrent cleanup repetition 6/20
PASS concurrent cleanup repetition 7/20
PASS concurrent cleanup repetition 8/20
PASS concurrent cleanup repetition 9/20
PASS concurrent cleanup repetition 10/20
PASS concurrent cleanup repetition 11/20
PASS concurrent cleanup repetition 12/20
PASS concurrent cleanup repetition 13/20
PASS concurrent cleanup repetition 14/20
PASS concurrent cleanup repetition 15/20
PASS concurrent cleanup repetition 16/20
PASS concurrent cleanup repetition 17/20
PASS concurrent cleanup repetition 18/20
PASS concurrent cleanup repetition 19/20
PASS concurrent cleanup repetition 20/20

Fmt check passed; workspace clippy -D warnings passes in fast on this head. No release build was needed. Benchmark-only cases reserved for the perf-test VM; this integration job makes no performance certification claim.

Outstanding real Docker/rootless Podman runtime tests completed after resume:

test remote::tests::live_tunnel_reconciliation_preserves_unrelated_channel ... ok
test tests::persistent_exec_first_attach_replays_the_real_shell_prompt ... ok
test tests::persistent_exec_termination_preempts_a_full_outbound_send ... ok
test tests::real_engine_following_log_stream_is_bounded_for_a_finite_snapshot ... ok
test tests::real_engines_batch_log_records_under_a_10k_lines_per_second_flood ... ok
test tests::stalled_nonpersistent_pty_input_does_not_hold_cleanup ... ok
test result: ok. 6 passed; 0 failed; 0 ignored; 0 measured; 29 filtered out; finished in 45.83s

Final requested fast gate: EXIT 0. Verbatim output:

WARN load5=8.05 exceeds online CPU count=8; timing-sensitive checks may be delayed
PASS fast: migrations are append-only (0.123s)
PASS fast: workspace package dependencies (0.233s)
PASS fast: JavaScript dependencies (0.005s)
PASS fast: advisory review policy tests (0.124s)
SUPPLY_CHAIN_REVIEWS advisory exceptions are within their review windows
SUPPLY_CHAIN cargo-deny: cargo-deny 0.20.2
SUPPLY_CHAIN_NOTICES generated THIRD_PARTY_NOTICES.md from 95 frontend packages
SUPPLY_CHAIN_NOTICES copied source: 179 shadcn files, 3 calternal-derived files
SUPPLY_CHAIN_NOTICES license files: 66 distinct texts; 0 packages need manual license review
advisories ok
SUPPLY_CHAIN_RUST_ADVISORIES passed with refreshed advisory data
licenses ok
SUPPLY_CHAIN_RUST_LICENSES passed
bun audit v1.4.2 (744846f84)

cookie@0.6.0
  workspace:@infraternal/web > @sveltejs/kit > cookie
  low: cookie accepts cookie name, path, and domain with out of bounds characters (<0.7.0) - https://github.com/advisories/GHSA-pxg6-pf52-xh8x

1 vulnerability (1 low)

  bun audit fix           upgrade the vulnerable packages within their ranges
  bun audit fix --latest  also cross major versions
SUPPLY_CHAIN_BUN_AUDIT findings reported; this check is report-only
SUPPLY_CHAIN_PASS Rust advisory/license checks complete; Bun findings are report-only
PASS fast: supply-chain checks (5.377s)
PASS fast: build web app (10.489s)
PASS fast: cargo fmt --check (1.208s)
PASS fast: cargo clippy (177.034s)
PASS fast: cargo test (206.683s)
PASS fast: svelte-check (11.905s)
PASS fast: UI package svelte-check (5.519s)
PASS fast: stream package typecheck (3.771s)
PASS fast: Vitest (3.445s)
PASS fast: UI package Vitest (9.775s)
PASS fast: stream package Vitest (0.791s)
PASS fast: OpenAPI and TypeScript client drift (40.133s)
PASS fast: terminal TypeScript (1.809s)
PASS fast: terminal Vitest (0.970s)

Verifier summary:

Gate: fast
Stages: 18
Elapsed  Stage
0.123s   fast: migrations are append-only
0.233s   fast: workspace package dependencies
0.005s   fast: JavaScript dependencies
0.124s   fast: advisory review policy tests
5.377s   fast: supply-chain checks
10.489s  fast: build web app
1.208s   fast: cargo fmt --check
177.034s fast: cargo clippy
206.683s fast: cargo test
11.905s  fast: svelte-check
5.519s   fast: UI package svelte-check
3.771s   fast: stream package typecheck
3.445s   fast: Vitest
9.775s   fast: UI package Vitest
0.791s   fast: stream package Vitest
40.133s  fast: OpenAPI and TypeScript client drift
1.809s   fast: terminal TypeScript
0.970s   fast: terminal Vitest
Total: 479.394s

All requested merges included; teardown-followups was ready and was not skipped. Tracked working tree is clean. No push, release build or code-review-graph rebuild during resume. Prior disk-full gate attempt is superseded by this successful run. The final gate used lean environment, nice -n 15, debug only, incremental disabled and debug symbols disabled. This job does not certify release performance or replace the orchestrator's merge-tier and independent-review requirements.

Integration head: 10840ac678d8ba5c0a7a16b8336bed49d9cc271c Branch: stream-batch2; base: d4fee7ba2fa24d5dc55c0cbd22750c065df4668b. No push. Merge notes: - fence-batch f967b3a -> e14a720: one stream.rs receive-loop conflict; keep pending-message burst batching and dev oversized-WebSocket Close 1009. - remote-ssh 0120952 -> 4685895: no content conflicts; retain per-infraternal-agent SSH key/trust ownership and creator-lineage session authority. - flake-sweep ff7e6f0 -> 9bcdc52: one grant-shrink test conflict; preserve owner AND creator authority, adopt event-driven process exit evidence. - teardown-followups 46cf51b (qualifying Merge origin/dev commit newer than c37f762) -> cbf31ff: conflicts in stream.rs operation/receive loop and contracts §2.3. Prepare bounded ready DATA before storage-admission waits so the socket read half can be dropped at cutoff; reuse the pair snapshot. Combine batched audits, shared reads, bounded concurrent detaches and 150 ms socket cutoff with transport-CLOSE reservation before audits. Follow-ups: - Update auto-merged repeated-withdrawal test fixture for new shared-read counters and detach timestamps. - Replace concurrent HTTP caller timestamp ordering with real original-process exit and durable cleanup-fence evidence at each response; retain observed overlap and final socket/process checks. - Add containers:read to recovered-OPEN events fixture, preserving storage-error injection and recovery checks. - Isolate log/PTY test containers with network none after the dev VM lost docker0; no host service or network changes. Validation (debug, lean environment, nice -n 15): check-fence: ``` Finished `dev` profile [unoptimized + debuginfo] target(s) in 48.64s ``` check-ssh: ``` Finished `dev` profile [unoptimized + debuginfo] target(s) in 29.23s ``` check-flake: ``` Finished `dev` profile [unoptimized + debuginfo] target(s) in 5.79s ``` check-teardown: ``` Finished `dev` profile [unoptimized + debuginfo] target(s) in 4.15s ``` server-lib: ``` Running unittests src/lib.rs (target/debug/deps/infraternal_server-c4746f7e9761787d) test result: ok. 158 passed; 0 failed; 2 ignored; 0 measured; 0 filtered out; finished in 36.25s ``` server-integration: ``` Running tests/agent_tunnel_tls.rs (target/debug/deps/agent_tunnel_tls-cfa2abc8c0c14cbd) test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.77s Running tests/storage.rs (target/debug/deps/storage-762922d317c64f9e) test result: ok. 24 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 7.12s Running tests/stream.rs (target/debug/deps/stream-8241f3189c0d9a3b) test result: ok. 10 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 2.73s Running tests/stream_regressions.rs (target/debug/deps/stream_regressions-18fb77f37e68a261) test result: ok. 22 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 120.04s ``` stream-regressions-confirmed: ``` Running tests/stream_regressions.rs (target/debug/deps/stream_regressions-18fb77f37e68a261) test result: ok. 22 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 94.63s ``` stream-e2e: ``` Running tests/stream_e2e.rs (target/debug/deps/stream_e2e-f8e5042b9faaae97) test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 13 filtered out; finished in 8.67s ``` runtime: ``` Running unittests src/lib.rs (target/debug/deps/infraternal_agent-317ab6e1573c0e37) test result: ok. 28 passed; 0 failed; 7 ignored; 0 measured; 0 filtered out; finished in 0.13s ``` ssh-core: ``` Running tests/real_sshd.rs (target/debug/deps/real_sshd-08ed15bb0796f6a5) test result: ok. 15 passed; 0 failed; 0 ignored; 0 measured; 1 filtered out; finished in 14.48s ``` ssh-embedded: ``` Running tests/ssh_product.rs (target/debug/deps/ssh_product-b82c51bb182f9109) test result: ok. 4 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 14.43s ``` ssh-remote: ``` Running tests/remote_ssh.rs (target/debug/deps/remote_ssh-a989e0e5662352ca) test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 2.66s ``` tunnel-allocation: ``` Running unittests src/lib.rs (target/debug/deps/infraternal_server-c4746f7e9761787d) test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 159 filtered out; finished in 0.31s ``` Concurrent cleanup repetitions: ``` PASS concurrent cleanup repetition 1/20 PASS concurrent cleanup repetition 2/20 PASS concurrent cleanup repetition 3/20 PASS concurrent cleanup repetition 4/20 PASS concurrent cleanup repetition 5/20 PASS concurrent cleanup repetition 6/20 PASS concurrent cleanup repetition 7/20 PASS concurrent cleanup repetition 8/20 PASS concurrent cleanup repetition 9/20 PASS concurrent cleanup repetition 10/20 PASS concurrent cleanup repetition 11/20 PASS concurrent cleanup repetition 12/20 PASS concurrent cleanup repetition 13/20 PASS concurrent cleanup repetition 14/20 PASS concurrent cleanup repetition 15/20 PASS concurrent cleanup repetition 16/20 PASS concurrent cleanup repetition 17/20 PASS concurrent cleanup repetition 18/20 PASS concurrent cleanup repetition 19/20 PASS concurrent cleanup repetition 20/20 ``` Fmt check passed; workspace clippy -D warnings passes in fast on this head. No release build was needed. Benchmark-only cases reserved for the perf-test VM; this integration job makes no performance certification claim. Outstanding real Docker/rootless Podman runtime tests completed after resume: ```text test remote::tests::live_tunnel_reconciliation_preserves_unrelated_channel ... ok test tests::persistent_exec_first_attach_replays_the_real_shell_prompt ... ok test tests::persistent_exec_termination_preempts_a_full_outbound_send ... ok test tests::real_engine_following_log_stream_is_bounded_for_a_finite_snapshot ... ok test tests::real_engines_batch_log_records_under_a_10k_lines_per_second_flood ... ok test tests::stalled_nonpersistent_pty_input_does_not_hold_cleanup ... ok test result: ok. 6 passed; 0 failed; 0 ignored; 0 measured; 29 filtered out; finished in 45.83s ``` Final requested fast gate: EXIT 0. Verbatim output: ```text WARN load5=8.05 exceeds online CPU count=8; timing-sensitive checks may be delayed PASS fast: migrations are append-only (0.123s) PASS fast: workspace package dependencies (0.233s) PASS fast: JavaScript dependencies (0.005s) PASS fast: advisory review policy tests (0.124s) SUPPLY_CHAIN_REVIEWS advisory exceptions are within their review windows SUPPLY_CHAIN cargo-deny: cargo-deny 0.20.2 SUPPLY_CHAIN_NOTICES generated THIRD_PARTY_NOTICES.md from 95 frontend packages SUPPLY_CHAIN_NOTICES copied source: 179 shadcn files, 3 calternal-derived files SUPPLY_CHAIN_NOTICES license files: 66 distinct texts; 0 packages need manual license review advisories ok SUPPLY_CHAIN_RUST_ADVISORIES passed with refreshed advisory data licenses ok SUPPLY_CHAIN_RUST_LICENSES passed bun audit v1.4.2 (744846f84) cookie@0.6.0 workspace:@infraternal/web > @sveltejs/kit > cookie low: cookie accepts cookie name, path, and domain with out of bounds characters (<0.7.0) - https://github.com/advisories/GHSA-pxg6-pf52-xh8x 1 vulnerability (1 low) bun audit fix upgrade the vulnerable packages within their ranges bun audit fix --latest also cross major versions SUPPLY_CHAIN_BUN_AUDIT findings reported; this check is report-only SUPPLY_CHAIN_PASS Rust advisory/license checks complete; Bun findings are report-only PASS fast: supply-chain checks (5.377s) PASS fast: build web app (10.489s) PASS fast: cargo fmt --check (1.208s) PASS fast: cargo clippy (177.034s) PASS fast: cargo test (206.683s) PASS fast: svelte-check (11.905s) PASS fast: UI package svelte-check (5.519s) PASS fast: stream package typecheck (3.771s) PASS fast: Vitest (3.445s) PASS fast: UI package Vitest (9.775s) PASS fast: stream package Vitest (0.791s) PASS fast: OpenAPI and TypeScript client drift (40.133s) PASS fast: terminal TypeScript (1.809s) PASS fast: terminal Vitest (0.970s) ``` Verifier summary: ```text Gate: fast Stages: 18 Elapsed Stage 0.123s fast: migrations are append-only 0.233s fast: workspace package dependencies 0.005s fast: JavaScript dependencies 0.124s fast: advisory review policy tests 5.377s fast: supply-chain checks 10.489s fast: build web app 1.208s fast: cargo fmt --check 177.034s fast: cargo clippy 206.683s fast: cargo test 11.905s fast: svelte-check 5.519s fast: UI package svelte-check 3.771s fast: stream package typecheck 3.445s fast: Vitest 9.775s fast: UI package Vitest 0.791s fast: stream package Vitest 40.133s fast: OpenAPI and TypeScript client drift 1.809s fast: terminal TypeScript 0.970s fast: terminal Vitest Total: 479.394s ``` All requested merges included; teardown-followups was ready and was not skipped. Tracked working tree is clean. No push, release build or code-review-graph rebuild during resume. Prior disk-full gate attempt is superseded by this successful run. The final gate used lean environment, nice -n 15, debug only, incremental disabled and debug symbols disabled. This job does not certify release performance or replace the orchestrator's merge-tier and independent-review requirements.
Author
Owner

Starting rust199 (#48).

Branch: rust199
Base head: d4fee7ba2f (origin/dev)
Scope: update for Rust 1.99.0 deprecation diagnostics, add the stable toolchain pin, inspect deploy container toolchains, and run the requested gates.

Starting rust199 (#48). Branch: rust199 Base head: d4fee7ba2fa24d5dc55c0cbd22750c065df4668b (origin/dev) Scope: update for Rust 1.99.0 deprecation diagnostics, add the stable toolchain pin, inspect deploy container toolchains, and run the requested gates.
Author
Owner

Finding: Rust 1.99.0 clippy reports two errors in crates/agent/src/provider_runtime.rs: AtomicUsize::fetch_update at lines 43 and 457 is deprecated and renamed to try_update for consistency. The compiler replacement is .try_update(Ordering::AcqRel, Ordering::Acquire, ...) at both sites.

Deployment toolchain inspection: deploy/o2/build.sh sets RUST_VERSION=1.98.1 and builds with cargo +"$RUST_VERSION"; this explicit override does not follow the workspace rustup pin. I am checking whether the replacement API requires 1.99 before changing the deploy pin.

Finding: Rust 1.99.0 clippy reports two errors in `crates/agent/src/provider_runtime.rs`: `AtomicUsize::fetch_update` at lines 43 and 457 is deprecated and renamed to `try_update` for consistency. The compiler replacement is `.try_update(Ordering::AcqRel, Ordering::Acquire, ...)` at both sites. Deployment toolchain inspection: `deploy/o2/build.sh` sets `RUST_VERSION=1.98.1` and builds with `cargo +"$RUST_VERSION"`; this explicit override does not follow the workspace rustup pin. I am checking whether the replacement API requires 1.99 before changing the deploy pin.
Author
Owner

Deployment decision: kept deploy/o2/build.sh at Rust 1.98.1. The new AtomicUsize::try_update API compiles with rustc +1.98.1 (a standalone probe exited 0), so the deploy script's explicit toolchain remains compatible with the replacement and does not need a version change.

Deployment decision: kept `deploy/o2/build.sh` at Rust 1.98.1. The new `AtomicUsize::try_update` API compiles with `rustc +1.98.1` (a standalone probe exited 0), so the deploy script's explicit toolchain remains compatible with the replacement and does not need a version change.
Author
Owner

Additional Rust 1.99 clippy finding after replacing the two deprecated atomic calls: clippy::assert_is_empty now fails -D warnings for five unit-test assertions (three under crates/proto/src/stream/{controls,records}.rs, two under crates/ssh/src/session.rs). Clippy recommends comparing the value to an empty array so failures show the actual value. I will apply those assertion-only replacements and rerun the gate.

Additional Rust 1.99 clippy finding after replacing the two deprecated atomic calls: `clippy::assert_is_empty` now fails `-D warnings` for five unit-test assertions (three under `crates/proto/src/stream/{controls,records}.rs`, two under `crates/ssh/src/session.rs`). Clippy recommends comparing the value to an empty array so failures show the actual value. I will apply those assertion-only replacements and rerun the gate.
Author
Owner

After correcting the first five empty checks, clippy found six matching non-empty assertions in crates/engine/tests/integration.rs; its assert_ne!(value, "") suggestions preserve the checks and report the offending value. It also reports AtomicUsize::try_update as stable since Rust 1.95.0 while [workspace.package].rust-version is 1.89. I will align the declared MSRV to 1.95 so the required replacement API is accurate and clippy remains clean without an allow.

After correcting the first five empty checks, clippy found six matching non-empty assertions in crates/engine/tests/integration.rs; its assert_ne!(value, "") suggestions preserve the checks and report the offending value. It also reports AtomicUsize::try_update as stable since Rust 1.95.0 while [workspace.package].rust-version is 1.89. I will align the declared MSRV to 1.95 so the required replacement API is accurate and clippy remains clean without an allow.
Author
Owner

The six assert_is_empty failures are now changed to value equality assertions. The agent crate alone now declares Rust 1.95 because AtomicUsize::try_update requires 1.95; workspace package MSRV remains 1.89.

The next clippy pass found two duration_suboptimal_units diagnostics in crates/agent/src/lib.rs at lines 1712 and 2480. Both use Duration::from_secs(24 * 60 * 60); clippy recommends the equivalent Duration::from_hours(24).

The six assert_is_empty failures are now changed to value equality assertions. The agent crate alone now declares Rust 1.95 because AtomicUsize::try_update requires 1.95; workspace package MSRV remains 1.89. The next clippy pass found two `duration_suboptimal_units` diagnostics in `crates/agent/src/lib.rs` at lines 1712 and 2480. Both use `Duration::from_secs(24 * 60 * 60)`; clippy recommends the equivalent `Duration::from_hours(24)`.
Author
Owner

The two Duration constructor lints are now changed to Duration::from_hours(24). The next all-targets clippy pass found 11 additional assert_is_empty diagnostics: two in crates/server/tests/auth_http.rs, one in crates/server/src/storage/fence_tests.rs, two in crates/server/src/stream/watcher.rs, and six in crates/infraternal/tests/cli_mcp.rs. They are assertion-only; I will use assert_eq!/assert_ne! comparisons with empty values as clippy recommends.

The two Duration constructor lints are now changed to Duration::from_hours(24). The next all-targets clippy pass found 11 additional assert_is_empty diagnostics: two in crates/server/tests/auth_http.rs, one in crates/server/src/storage/fence_tests.rs, two in crates/server/src/stream/watcher.rs, and six in crates/infraternal/tests/cli_mcp.rs. They are assertion-only; I will use assert_eq!/assert_ne! comparisons with empty values as clippy recommends.
Author
Owner

Starting multitab-refresh on branch multitab-refresh; base origin/dev and HEAD d4fee7ba2f. Investigating product vs browser-check races, preserving exactly one refresh, adding Vitest regression coverage and 30 loaded multi-tab runs, then scripts/verify fast. Only writer; no push.

Starting multitab-refresh on branch multitab-refresh; base origin/dev and HEAD d4fee7ba2fa24d5dc55c0cbd22750c065df4668b. Investigating product vs browser-check races, preserving exactly one refresh, adding Vitest regression coverage and 30 loaded multi-tab runs, then scripts/verify fast. Only writer; no push.
Author
Owner

The prior 11 assert_is_empty assertions are now changed. The following clippy pass found four more: two in crates/server/tests/ssh_product.rs, one in crates/infraternal/src/login.rs, and one in crates/infraternal/src/http.rs. I am scanning the remaining Rust assertions for the same lint pattern before the next clippy run.

The prior 11 assert_is_empty assertions are now changed. The following clippy pass found four more: two in crates/server/tests/ssh_product.rs, one in crates/infraternal/src/login.rs, and one in crates/infraternal/src/http.rs. I am scanning the remaining Rust assertions for the same lint pattern before the next clippy run.
Author
Owner

Product races reproduced with Vitest: four regression checks fail on base implementation (idle signed-in broadcast adoption, storage newer before recovery, timeout causing another refresh, sign-out during generation wait causing another refresh). No refresh timer exists in auth.svelte.ts: refresh is initialization/401 driven. The provided production log contains refresh/401 cascades involving the original tab as well as both cold tabs. Current fix adopts successors in idle signed-in tabs, compares generation to the held credential, and returns without rotating after a failed generation wait. Contract clarification is separate commit b8b8cf1, for independent review before integration. Browser smoke now waits for two actual native lock requests rather than 200 ms, keeps the original poll active, counts every context refresh, and waits for all three pages to successfully use one public successor token ID. Sources: https://www.w3.org/TR/web-locks/ (lock held until callback settles); https://html.spec.whatwg.org/multipage/web-messaging.html#broadcasting-to-other-browsing-contexts (queued broadcast tasks); https://playwright.dev/docs/api/class-route#route-fetch (fetch without fulfilling). Four regressions pass after the minimal product fix; further simultaneous-tab coverage and loaded production checks pending.

Product races reproduced with Vitest: four regression checks fail on base implementation (idle signed-in broadcast adoption, storage newer before recovery, timeout causing another refresh, sign-out during generation wait causing another refresh). No refresh timer exists in auth.svelte.ts: refresh is initialization/401 driven. The provided production log contains refresh/401 cascades involving the original tab as well as both cold tabs. Current fix adopts successors in idle signed-in tabs, compares generation to the held credential, and returns without rotating after a failed generation wait. Contract clarification is separate commit b8b8cf1, for independent review before integration. Browser smoke now waits for two actual native lock requests rather than 200 ms, keeps the original poll active, counts every context refresh, and waits for all three pages to successfully use one public successor token ID. Sources: https://www.w3.org/TR/web-locks/ (lock held until callback settles); https://html.spec.whatwg.org/multipage/web-messaging.html#broadcasting-to-other-browsing-contexts (queued broadcast tasks); https://playwright.dev/docs/api/class-route#route-fetch (fetch without fulfilling). Four regressions pass after the minimal product fix; further simultaneous-tab coverage and loaded production checks pending.
Author
Owner

The first fast run with my misspelled run-ID variable failed its cargo test stage. Relevant output, quoted verbatim:

FAIL fast: cargo test (62.505s)
---- real_infraternal_agent_process_enrolls_and_reconnects_with_new_nonce stdout ----
thread 'real_infraternal_agent_process_enrolls_and_reconnects_with_new_nonce' (1035311) panicked at crates/infraternal/tests/agent_tunnel.rs:580:5:
remote inventory was not published

This exact test passed in the preceding cargo test --workspace run. I am rerunning it alone, then will rerun fast with the requested run ID.

The first fast run with my misspelled run-ID variable failed its cargo test stage. Relevant output, quoted verbatim: FAIL fast: cargo test (62.505s) ---- real_infraternal_agent_process_enrolls_and_reconnects_with_new_nonce stdout ---- thread 'real_infraternal_agent_process_enrolls_and_reconnects_with_new_nonce' (1035311) panicked at crates/infraternal/tests/agent_tunnel.rs:580:5: remote inventory was not published This exact test passed in the preceding cargo test --workspace run. I am rerunning it alone, then will rerun fast with the requested run ID.
Author
Owner

The failed fast test passes alone. Relevant output, quoted verbatim:

test real_infraternal_agent_process_enrolls_and_reconnects_with_new_nonce ... ok
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 11.85s

The same test also passed in the earlier cargo test --workspace run. I will rerun fast with one test thread and CARGO_BUILD_JOBS=1, using INFRATERNAL_VERIFY_RUN_ID=rust199.

The failed fast test passes alone. Relevant output, quoted verbatim: test real_infraternal_agent_process_enrolls_and_reconnects_with_new_nonce ... ok test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 11.85s The same test also passed in the earlier cargo test --workspace run. I will rerun fast with one test thread and CARGO_BUILD_JOBS=1, using INFRATERNAL_VERIFY_RUN_ID=rust199.
Author
Owner

Implementation committed: docs b8b8cf1, product/regressions dd0922b, deterministic browser smoke 1eb1596. Auth regression suite: 18/18 pass; svelte-check: 0 errors/0 warnings. Initial gate prerequisites exposed a local sccache error (incremental compilation is prohibited), including after unsetting/zeroing CARGO_INCREMENTAL; running the same scripts/verify entry point with RUSTC_WRAPPER empty resolves it without repository tooling changes. Production release build is underway on the dev VM; stress and fast gates remain pending. Rust 1.99 stable also emits existing fetch_update deprecation warnings in provider runtime files, which may affect clippy; no unrelated source files modified.

Implementation committed: docs b8b8cf1, product/regressions dd0922b, deterministic browser smoke 1eb1596. Auth regression suite: 18/18 pass; svelte-check: 0 errors/0 warnings. Initial gate prerequisites exposed a local sccache error (incremental compilation is prohibited), including after unsetting/zeroing CARGO_INCREMENTAL; running the same scripts/verify entry point with RUSTC_WRAPPER empty resolves it without repository tooling changes. Production release build is underway on the dev VM; stress and fast gates remain pending. Rust 1.99 stable also emits existing fetch_update deprecation warnings in provider runtime files, which may affect clippy; no unrelated source files modified.
Author
Owner

Finished rust199 (#48).

Branch: rust199
Base head: d4fee7ba2f
Head SHA: 57704632b5
Commit: Fix Rust 1.99 lint failures

Warnings fixed:

  • Replaced the two deprecated AtomicUsize::fetch_update calls with try_update; set only the infraternal agent crate MSRV to 1.95 because try_update is stable since 1.95. The deploy/o2 build remains pinned to Rust 1.98.1; a rustc +1.98.1 probe of try_update succeeded.
  • Replaced two duration_suboptimal_units cases with Duration::from_hours(24).
  • Replaced all 26 clippy::assert_is_empty failures with assert_eq!/assert_ne! comparisons.

Direct gates:

  • cargo fmt --check: exit 0.
  • cargo clippy --workspace --all-targets -- -D warnings: exit 0.
  • cargo test --workspace: exit 0.
  • Final fast run used INFRATERNAL_VERIFY_RUN_ID=rust199 with CARGO_BUILD_JOBS=1 and RUST_TEST_THREADS=1. Gate output (verbatim):

PASS fast: migrations are append-only (0.347s)
PASS fast: workspace package dependencies (0.308s)
PASS fast: JavaScript dependencies (0.020s)
PASS fast: advisory review policy tests (0.267s)
PASS fast: supply-chain checks (9.201s)
PASS fast: build web app (23.959s)
PASS fast: cargo fmt --check (1.374s)
PASS fast: cargo clippy (21.500s)
PASS fast: cargo test (240.728s)
PASS fast: svelte-check (28.018s)
PASS fast: UI package svelte-check (12.157s)
PASS fast: stream package typecheck (12.254s)
PASS fast: Vitest (7.136s)
PASS fast: UI package Vitest (17.512s)
PASS fast: stream package Vitest (1.288s)
PASS fast: OpenAPI and TypeScript client drift (150.905s)
PASS fast: terminal TypeScript (3.048s)
PASS fast: terminal Vitest (1.654s)
Total: 531.676s

The gate also reported the existing low-severity Bun cookie advisory as report-only. No push was performed.

Finished rust199 (#48). Branch: rust199 Base head: d4fee7ba2fa24d5dc55c0cbd22750c065df4668b Head SHA: 57704632b5b58be18aa966834fa97d00c88befbf Commit: Fix Rust 1.99 lint failures Warnings fixed: - Replaced the two deprecated AtomicUsize::fetch_update calls with try_update; set only the infraternal agent crate MSRV to 1.95 because try_update is stable since 1.95. The deploy/o2 build remains pinned to Rust 1.98.1; a rustc +1.98.1 probe of try_update succeeded. - Replaced two duration_suboptimal_units cases with Duration::from_hours(24). - Replaced all 26 clippy::assert_is_empty failures with assert_eq!/assert_ne! comparisons. Direct gates: - cargo fmt --check: exit 0. - cargo clippy --workspace --all-targets -- -D warnings: exit 0. - cargo test --workspace: exit 0. - Final fast run used INFRATERNAL_VERIFY_RUN_ID=rust199 with CARGO_BUILD_JOBS=1 and RUST_TEST_THREADS=1. Gate output (verbatim): PASS fast: migrations are append-only (0.347s) PASS fast: workspace package dependencies (0.308s) PASS fast: JavaScript dependencies (0.020s) PASS fast: advisory review policy tests (0.267s) PASS fast: supply-chain checks (9.201s) PASS fast: build web app (23.959s) PASS fast: cargo fmt --check (1.374s) PASS fast: cargo clippy (21.500s) PASS fast: cargo test (240.728s) PASS fast: svelte-check (28.018s) PASS fast: UI package svelte-check (12.157s) PASS fast: stream package typecheck (12.254s) PASS fast: Vitest (7.136s) PASS fast: UI package Vitest (17.512s) PASS fast: stream package Vitest (1.288s) PASS fast: OpenAPI and TypeScript client drift (150.905s) PASS fast: terminal TypeScript (3.048s) PASS fast: terminal Vitest (1.654s) Total: 531.676s The gate also reported the existing low-severity Bun cookie advisory as report-only. No push was performed.
Author
Owner

Production browser gate passed on head 107e502 (focused multi-tab app checks plus the required terminal fixture and production budget stages). Invocation: RUSTC_WRAPPER= CARGO_INCREMENTAL=0 INFRATERNAL_VERIFY_RUN_ID=multitab-refresh-browser INFRATERNAL_MULTITAB_ONLY=1 scripts/verify browser. The first run passed all stages but exited 2 after editing the running shell script; this stable rerun exited 0. Real gate output:

PASS browser: JavaScript dependencies (0.049s)
PASS browser: build web app (30.975s)
PASS browser: build release binary (410.233s)
PASS browser: install Chromium and system dependencies (4.936s)
PASS browser: terminal fixture Playwright (62.640s)
PASS multi-tab supported: simultaneous tabs (1 refresh HTTP request)
PASS multi-tab sign-out: pending refresh response cannot restore tab B
PASS multi-tab locks-only: one notice per tab and sequential stale-access recovery
PASS multi-tab neither: one notice per tab and sequential stale-access recovery
PASS multi-tab repetition=1/1
PASS browser: Playwright against release server (12.238s)
PASS browser: terminal production first-load budget (3.193s)

VM screenshot artifacts inspected: /mnt/hdd/infraternal/artifacts/verify/multitab-refresh-browser/browser/multi-tab-supported-1440x900.png and multi-tab-supported-390x844.png. Existing fallback notices captured at both widths as well. Applied UI skill rules: Emil invisible correctness/instant feedback; better-accessibility accessible names and existing status live region; better-layout/typography narrow-width wrapping; better-ui/colors reuse existing tokens and surfaces; better-writing preserve consistent notice vocabulary; better-interface evidence scoped to this auth flow. No visual source changes or broad accessibility/color audit claimed; Safari/iOS remain owner checks.

Eight-worker stress-ng load is active for 30 targeted production multi-tab repetitions; fast gate follows after stopping it.

Production browser gate passed on head 107e502 (focused multi-tab app checks plus the required terminal fixture and production budget stages). Invocation: RUSTC_WRAPPER= CARGO_INCREMENTAL=0 INFRATERNAL_VERIFY_RUN_ID=multitab-refresh-browser INFRATERNAL_MULTITAB_ONLY=1 scripts/verify browser. The first run passed all stages but exited 2 after editing the running shell script; this stable rerun exited 0. Real gate output: ```text PASS browser: JavaScript dependencies (0.049s) PASS browser: build web app (30.975s) PASS browser: build release binary (410.233s) PASS browser: install Chromium and system dependencies (4.936s) PASS browser: terminal fixture Playwright (62.640s) PASS multi-tab supported: simultaneous tabs (1 refresh HTTP request) PASS multi-tab sign-out: pending refresh response cannot restore tab B PASS multi-tab locks-only: one notice per tab and sequential stale-access recovery PASS multi-tab neither: one notice per tab and sequential stale-access recovery PASS multi-tab repetition=1/1 PASS browser: Playwright against release server (12.238s) PASS browser: terminal production first-load budget (3.193s) ``` VM screenshot artifacts inspected: /mnt/hdd/infraternal/artifacts/verify/multitab-refresh-browser/browser/multi-tab-supported-1440x900.png and multi-tab-supported-390x844.png. Existing fallback notices captured at both widths as well. Applied UI skill rules: Emil invisible correctness/instant feedback; better-accessibility accessible names and existing status live region; better-layout/typography narrow-width wrapping; better-ui/colors reuse existing tokens and surfaces; better-writing preserve consistent notice vocabulary; better-interface evidence scoped to this auth flow. No visual source changes or broad accessibility/color audit claimed; Safari/iOS remain owner checks. Eight-worker stress-ng load is active for 30 targeted production multi-tab repetitions; fast gate follows after stopping it.
Author
Owner

Loaded attempt 1 stopped after 8 complete repetitions: supported=9/9 exactly one refresh and sign-out=9/9 passed; locks-only=8 and neither=8 passed. Failure in repetition 9: locks-only second tab account probe returned 401 after first tab background poll issued its own refresh, so second tab correctly cleared its session. The unsupported fallback test claimed sequential activity but left both tabs polling. Fixing only this fixture: isolated BrowserContext with the real cookie carried forward, Playwright controlled clock pauses interval polls before navigation, real initial requests drain before the next tab rotates, and explicit stale GETs remain real/serialized. Supported scenario retains native timers, Web Locks, BroadcastChannel and the exact-one assertion. Clock API is context-wide per https://playwright.dev/docs/api/class-clock ; install must precede timer use per https://playwright.dev/docs/clock . Raw failed stress evidence: /home/kayg/.cache/infraternal-targets/multitab-refresh/multitab-stress-attempt-1.log. All eight stress-ng workers stopped cleanly. Restarting the entire 30-repeat run after fixture validation.

Loaded attempt 1 stopped after 8 complete repetitions: supported=9/9 exactly one refresh and sign-out=9/9 passed; locks-only=8 and neither=8 passed. Failure in repetition 9: locks-only second tab account probe returned 401 after first tab background poll issued its own refresh, so second tab correctly cleared its session. The unsupported fallback test claimed sequential activity but left both tabs polling. Fixing only this fixture: isolated BrowserContext with the real cookie carried forward, Playwright controlled clock pauses interval polls before navigation, real initial requests drain before the next tab rotates, and explicit stale GETs remain real/serialized. Supported scenario retains native timers, Web Locks, BroadcastChannel and the exact-one assertion. Clock API is context-wide per https://playwright.dev/docs/api/class-clock ; install must precede timer use per https://playwright.dev/docs/clock . Raw failed stress evidence: /home/kayg/.cache/infraternal-targets/multitab-refresh/multitab-stress-attempt-1.log. All eight stress-ng workers stopped cleanly. Restarting the entire 30-repeat run after fixture validation.
Author
Owner

Final head f47f6b2: 30 consecutive loaded production multi-tab repetitions completed with exit 0. Supported=30 (each exactly ONE refresh across all three active pages); sign-out=30; locks-only=30; neither=30; total 120 checks. Native supported-mode timers and coordination remain active. Fallback clocks are isolated and initial real authorization responses are observed before another tab rotates. Eight stress-ng CPU workers stayed active throughout and were stopped/reaped before fast verification.

Actual browser output:

PASS multi-tab supported: simultaneous tabs (1 refresh HTTP request)
PASS multi-tab sign-out: pending refresh response cannot restore tab B
PASS multi-tab locks-only: one notice per tab and sequential stale-access recovery
PASS multi-tab neither: one notice per tab and sequential stale-access recovery
PASS multi-tab repetition=1/30
PASS multi-tab supported: simultaneous tabs (1 refresh HTTP request)
PASS multi-tab sign-out: pending refresh response cannot restore tab B
PASS multi-tab locks-only: one notice per tab and sequential stale-access recovery
PASS multi-tab neither: one notice per tab and sequential stale-access recovery
PASS multi-tab repetition=2/30
PASS multi-tab supported: simultaneous tabs (1 refresh HTTP request)
PASS multi-tab sign-out: pending refresh response cannot restore tab B
PASS multi-tab locks-only: one notice per tab and sequential stale-access recovery
PASS multi-tab neither: one notice per tab and sequential stale-access recovery
PASS multi-tab repetition=3/30
PASS multi-tab supported: simultaneous tabs (1 refresh HTTP request)
PASS multi-tab sign-out: pending refresh response cannot restore tab B
PASS multi-tab locks-only: one notice per tab and sequential stale-access recovery
PASS multi-tab neither: one notice per tab and sequential stale-access recovery
PASS multi-tab repetition=4/30
PASS multi-tab supported: simultaneous tabs (1 refresh HTTP request)
PASS multi-tab sign-out: pending refresh response cannot restore tab B
PASS multi-tab locks-only: one notice per tab and sequential stale-access recovery
PASS multi-tab neither: one notice per tab and sequential stale-access recovery
PASS multi-tab repetition=5/30
PASS multi-tab supported: simultaneous tabs (1 refresh HTTP request)
PASS multi-tab sign-out: pending refresh response cannot restore tab B
PASS multi-tab locks-only: one notice per tab and sequential stale-access recovery
PASS multi-tab neither: one notice per tab and sequential stale-access recovery
PASS multi-tab repetition=6/30
PASS multi-tab supported: simultaneous tabs (1 refresh HTTP request)
PASS multi-tab sign-out: pending refresh response cannot restore tab B
PASS multi-tab locks-only: one notice per tab and sequential stale-access recovery
PASS multi-tab neither: one notice per tab and sequential stale-access recovery
PASS multi-tab repetition=7/30
PASS multi-tab supported: simultaneous tabs (1 refresh HTTP request)
PASS multi-tab sign-out: pending refresh response cannot restore tab B
PASS multi-tab locks-only: one notice per tab and sequential stale-access recovery
PASS multi-tab neither: one notice per tab and sequential stale-access recovery
PASS multi-tab repetition=8/30
PASS multi-tab supported: simultaneous tabs (1 refresh HTTP request)
PASS multi-tab sign-out: pending refresh response cannot restore tab B
PASS multi-tab locks-only: one notice per tab and sequential stale-access recovery
PASS multi-tab neither: one notice per tab and sequential stale-access recovery
PASS multi-tab repetition=9/30
PASS multi-tab supported: simultaneous tabs (1 refresh HTTP request)
PASS multi-tab sign-out: pending refresh response cannot restore tab B
PASS multi-tab locks-only: one notice per tab and sequential stale-access recovery
PASS multi-tab neither: one notice per tab and sequential stale-access recovery
PASS multi-tab repetition=10/30
PASS multi-tab supported: simultaneous tabs (1 refresh HTTP request)
PASS multi-tab sign-out: pending refresh response cannot restore tab B
PASS multi-tab locks-only: one notice per tab and sequential stale-access recovery
PASS multi-tab neither: one notice per tab and sequential stale-access recovery
PASS multi-tab repetition=11/30
PASS multi-tab supported: simultaneous tabs (1 refresh HTTP request)
PASS multi-tab sign-out: pending refresh response cannot restore tab B
PASS multi-tab locks-only: one notice per tab and sequential stale-access recovery
PASS multi-tab neither: one notice per tab and sequential stale-access recovery
PASS multi-tab repetition=12/30
PASS multi-tab supported: simultaneous tabs (1 refresh HTTP request)
PASS multi-tab sign-out: pending refresh response cannot restore tab B
PASS multi-tab locks-only: one notice per tab and sequential stale-access recovery
PASS multi-tab neither: one notice per tab and sequential stale-access recovery
PASS multi-tab repetition=13/30
PASS multi-tab supported: simultaneous tabs (1 refresh HTTP request)
PASS multi-tab sign-out: pending refresh response cannot restore tab B
PASS multi-tab locks-only: one notice per tab and sequential stale-access recovery
PASS multi-tab neither: one notice per tab and sequential stale-access recovery
PASS multi-tab repetition=14/30
PASS multi-tab supported: simultaneous tabs (1 refresh HTTP request)
PASS multi-tab sign-out: pending refresh response cannot restore tab B
PASS multi-tab locks-only: one notice per tab and sequential stale-access recovery
PASS multi-tab neither: one notice per tab and sequential stale-access recovery
PASS multi-tab repetition=15/30
PASS multi-tab supported: simultaneous tabs (1 refresh HTTP request)
PASS multi-tab sign-out: pending refresh response cannot restore tab B
PASS multi-tab locks-only: one notice per tab and sequential stale-access recovery
PASS multi-tab neither: one notice per tab and sequential stale-access recovery
PASS multi-tab repetition=16/30
PASS multi-tab supported: simultaneous tabs (1 refresh HTTP request)
PASS multi-tab sign-out: pending refresh response cannot restore tab B
PASS multi-tab locks-only: one notice per tab and sequential stale-access recovery
PASS multi-tab neither: one notice per tab and sequential stale-access recovery
PASS multi-tab repetition=17/30
PASS multi-tab supported: simultaneous tabs (1 refresh HTTP request)
PASS multi-tab sign-out: pending refresh response cannot restore tab B
PASS multi-tab locks-only: one notice per tab and sequential stale-access recovery
PASS multi-tab neither: one notice per tab and sequential stale-access recovery
PASS multi-tab repetition=18/30
PASS multi-tab supported: simultaneous tabs (1 refresh HTTP request)
PASS multi-tab sign-out: pending refresh response cannot restore tab B
PASS multi-tab locks-only: one notice per tab and sequential stale-access recovery
PASS multi-tab neither: one notice per tab and sequential stale-access recovery
PASS multi-tab repetition=19/30
PASS multi-tab supported: simultaneous tabs (1 refresh HTTP request)
PASS multi-tab sign-out: pending refresh response cannot restore tab B
PASS multi-tab locks-only: one notice per tab and sequential stale-access recovery
PASS multi-tab neither: one notice per tab and sequential stale-access recovery
PASS multi-tab repetition=20/30
PASS multi-tab supported: simultaneous tabs (1 refresh HTTP request)
PASS multi-tab sign-out: pending refresh response cannot restore tab B
PASS multi-tab locks-only: one notice per tab and sequential stale-access recovery
PASS multi-tab neither: one notice per tab and sequential stale-access recovery
PASS multi-tab repetition=21/30
PASS multi-tab supported: simultaneous tabs (1 refresh HTTP request)
PASS multi-tab sign-out: pending refresh response cannot restore tab B
PASS multi-tab locks-only: one notice per tab and sequential stale-access recovery
PASS multi-tab neither: one notice per tab and sequential stale-access recovery
PASS multi-tab repetition=22/30
PASS multi-tab supported: simultaneous tabs (1 refresh HTTP request)
PASS multi-tab sign-out: pending refresh response cannot restore tab B
PASS multi-tab locks-only: one notice per tab and sequential stale-access recovery
PASS multi-tab neither: one notice per tab and sequential stale-access recovery
PASS multi-tab repetition=23/30
PASS multi-tab supported: simultaneous tabs (1 refresh HTTP request)
PASS multi-tab sign-out: pending refresh response cannot restore tab B
PASS multi-tab locks-only: one notice per tab and sequential stale-access recovery
PASS multi-tab neither: one notice per tab and sequential stale-access recovery
PASS multi-tab repetition=24/30
PASS multi-tab supported: simultaneous tabs (1 refresh HTTP request)
PASS multi-tab sign-out: pending refresh response cannot restore tab B
PASS multi-tab locks-only: one notice per tab and sequential stale-access recovery
PASS multi-tab neither: one notice per tab and sequential stale-access recovery
PASS multi-tab repetition=25/30
PASS multi-tab supported: simultaneous tabs (1 refresh HTTP request)
PASS multi-tab sign-out: pending refresh response cannot restore tab B
PASS multi-tab locks-only: one notice per tab and sequential stale-access recovery
PASS multi-tab neither: one notice per tab and sequential stale-access recovery
PASS multi-tab repetition=26/30
PASS multi-tab supported: simultaneous tabs (1 refresh HTTP request)
PASS multi-tab sign-out: pending refresh response cannot restore tab B
PASS multi-tab locks-only: one notice per tab and sequential stale-access recovery
PASS multi-tab neither: one notice per tab and sequential stale-access recovery
PASS multi-tab repetition=27/30
PASS multi-tab supported: simultaneous tabs (1 refresh HTTP request)
PASS multi-tab sign-out: pending refresh response cannot restore tab B
PASS multi-tab locks-only: one notice per tab and sequential stale-access recovery
PASS multi-tab neither: one notice per tab and sequential stale-access recovery
PASS multi-tab repetition=28/30
PASS multi-tab supported: simultaneous tabs (1 refresh HTTP request)
PASS multi-tab sign-out: pending refresh response cannot restore tab B
PASS multi-tab locks-only: one notice per tab and sequential stale-access recovery
PASS multi-tab neither: one notice per tab and sequential stale-access recovery
PASS multi-tab repetition=29/30
PASS multi-tab supported: simultaneous tabs (1 refresh HTTP request)
PASS multi-tab sign-out: pending refresh response cannot restore tab B
PASS multi-tab locks-only: one notice per tab and sequential stale-access recovery
PASS multi-tab neither: one notice per tab and sequential stale-access recovery
PASS multi-tab repetition=30/30

Actual load output:

stress-ng: info:  [1445830] defaulting to a 1 day run per stressor
stress-ng: info:  [1445830] dispatching hogs: 8 cpu
stress-ng: info:  [1445830] skipped: 0
stress-ng: info:  [1445830] passed: 8: cpu (8)
stress-ng: info:  [1445830] failed: 0
stress-ng: info:  [1445830] metrics untrustworthy: 0
stress-ng: info:  [1445830] successful run completed in 5 mins, 57.38 secs

Raw stress log: /home/kayg/.cache/infraternal-targets/multitab-refresh/multitab-stress.log. Screenshot artifacts: /mnt/hdd/infraternal/artifacts/verify/multitab-refresh-stress/browser/ (supported, locks-only, neither at 1440×900 and 390×844). Required INFRATERNAL_VERIFY_RUN_ID=multitab-refresh scripts/verify fast is now running, with the previously documented RUSTC_WRAPPER= and CARGO_INCREMENTAL=0 environment workaround. No Rust source changes; no performance-budget claim from this CPU-loaded VM test.

Final head f47f6b2: 30 consecutive loaded production multi-tab repetitions completed with exit 0. Supported=30 (each exactly ONE refresh across all three active pages); sign-out=30; locks-only=30; neither=30; total 120 checks. Native supported-mode timers and coordination remain active. Fallback clocks are isolated and initial real authorization responses are observed before another tab rotates. Eight stress-ng CPU workers stayed active throughout and were stopped/reaped before fast verification. Actual browser output: ```text PASS multi-tab supported: simultaneous tabs (1 refresh HTTP request) PASS multi-tab sign-out: pending refresh response cannot restore tab B PASS multi-tab locks-only: one notice per tab and sequential stale-access recovery PASS multi-tab neither: one notice per tab and sequential stale-access recovery PASS multi-tab repetition=1/30 PASS multi-tab supported: simultaneous tabs (1 refresh HTTP request) PASS multi-tab sign-out: pending refresh response cannot restore tab B PASS multi-tab locks-only: one notice per tab and sequential stale-access recovery PASS multi-tab neither: one notice per tab and sequential stale-access recovery PASS multi-tab repetition=2/30 PASS multi-tab supported: simultaneous tabs (1 refresh HTTP request) PASS multi-tab sign-out: pending refresh response cannot restore tab B PASS multi-tab locks-only: one notice per tab and sequential stale-access recovery PASS multi-tab neither: one notice per tab and sequential stale-access recovery PASS multi-tab repetition=3/30 PASS multi-tab supported: simultaneous tabs (1 refresh HTTP request) PASS multi-tab sign-out: pending refresh response cannot restore tab B PASS multi-tab locks-only: one notice per tab and sequential stale-access recovery PASS multi-tab neither: one notice per tab and sequential stale-access recovery PASS multi-tab repetition=4/30 PASS multi-tab supported: simultaneous tabs (1 refresh HTTP request) PASS multi-tab sign-out: pending refresh response cannot restore tab B PASS multi-tab locks-only: one notice per tab and sequential stale-access recovery PASS multi-tab neither: one notice per tab and sequential stale-access recovery PASS multi-tab repetition=5/30 PASS multi-tab supported: simultaneous tabs (1 refresh HTTP request) PASS multi-tab sign-out: pending refresh response cannot restore tab B PASS multi-tab locks-only: one notice per tab and sequential stale-access recovery PASS multi-tab neither: one notice per tab and sequential stale-access recovery PASS multi-tab repetition=6/30 PASS multi-tab supported: simultaneous tabs (1 refresh HTTP request) PASS multi-tab sign-out: pending refresh response cannot restore tab B PASS multi-tab locks-only: one notice per tab and sequential stale-access recovery PASS multi-tab neither: one notice per tab and sequential stale-access recovery PASS multi-tab repetition=7/30 PASS multi-tab supported: simultaneous tabs (1 refresh HTTP request) PASS multi-tab sign-out: pending refresh response cannot restore tab B PASS multi-tab locks-only: one notice per tab and sequential stale-access recovery PASS multi-tab neither: one notice per tab and sequential stale-access recovery PASS multi-tab repetition=8/30 PASS multi-tab supported: simultaneous tabs (1 refresh HTTP request) PASS multi-tab sign-out: pending refresh response cannot restore tab B PASS multi-tab locks-only: one notice per tab and sequential stale-access recovery PASS multi-tab neither: one notice per tab and sequential stale-access recovery PASS multi-tab repetition=9/30 PASS multi-tab supported: simultaneous tabs (1 refresh HTTP request) PASS multi-tab sign-out: pending refresh response cannot restore tab B PASS multi-tab locks-only: one notice per tab and sequential stale-access recovery PASS multi-tab neither: one notice per tab and sequential stale-access recovery PASS multi-tab repetition=10/30 PASS multi-tab supported: simultaneous tabs (1 refresh HTTP request) PASS multi-tab sign-out: pending refresh response cannot restore tab B PASS multi-tab locks-only: one notice per tab and sequential stale-access recovery PASS multi-tab neither: one notice per tab and sequential stale-access recovery PASS multi-tab repetition=11/30 PASS multi-tab supported: simultaneous tabs (1 refresh HTTP request) PASS multi-tab sign-out: pending refresh response cannot restore tab B PASS multi-tab locks-only: one notice per tab and sequential stale-access recovery PASS multi-tab neither: one notice per tab and sequential stale-access recovery PASS multi-tab repetition=12/30 PASS multi-tab supported: simultaneous tabs (1 refresh HTTP request) PASS multi-tab sign-out: pending refresh response cannot restore tab B PASS multi-tab locks-only: one notice per tab and sequential stale-access recovery PASS multi-tab neither: one notice per tab and sequential stale-access recovery PASS multi-tab repetition=13/30 PASS multi-tab supported: simultaneous tabs (1 refresh HTTP request) PASS multi-tab sign-out: pending refresh response cannot restore tab B PASS multi-tab locks-only: one notice per tab and sequential stale-access recovery PASS multi-tab neither: one notice per tab and sequential stale-access recovery PASS multi-tab repetition=14/30 PASS multi-tab supported: simultaneous tabs (1 refresh HTTP request) PASS multi-tab sign-out: pending refresh response cannot restore tab B PASS multi-tab locks-only: one notice per tab and sequential stale-access recovery PASS multi-tab neither: one notice per tab and sequential stale-access recovery PASS multi-tab repetition=15/30 PASS multi-tab supported: simultaneous tabs (1 refresh HTTP request) PASS multi-tab sign-out: pending refresh response cannot restore tab B PASS multi-tab locks-only: one notice per tab and sequential stale-access recovery PASS multi-tab neither: one notice per tab and sequential stale-access recovery PASS multi-tab repetition=16/30 PASS multi-tab supported: simultaneous tabs (1 refresh HTTP request) PASS multi-tab sign-out: pending refresh response cannot restore tab B PASS multi-tab locks-only: one notice per tab and sequential stale-access recovery PASS multi-tab neither: one notice per tab and sequential stale-access recovery PASS multi-tab repetition=17/30 PASS multi-tab supported: simultaneous tabs (1 refresh HTTP request) PASS multi-tab sign-out: pending refresh response cannot restore tab B PASS multi-tab locks-only: one notice per tab and sequential stale-access recovery PASS multi-tab neither: one notice per tab and sequential stale-access recovery PASS multi-tab repetition=18/30 PASS multi-tab supported: simultaneous tabs (1 refresh HTTP request) PASS multi-tab sign-out: pending refresh response cannot restore tab B PASS multi-tab locks-only: one notice per tab and sequential stale-access recovery PASS multi-tab neither: one notice per tab and sequential stale-access recovery PASS multi-tab repetition=19/30 PASS multi-tab supported: simultaneous tabs (1 refresh HTTP request) PASS multi-tab sign-out: pending refresh response cannot restore tab B PASS multi-tab locks-only: one notice per tab and sequential stale-access recovery PASS multi-tab neither: one notice per tab and sequential stale-access recovery PASS multi-tab repetition=20/30 PASS multi-tab supported: simultaneous tabs (1 refresh HTTP request) PASS multi-tab sign-out: pending refresh response cannot restore tab B PASS multi-tab locks-only: one notice per tab and sequential stale-access recovery PASS multi-tab neither: one notice per tab and sequential stale-access recovery PASS multi-tab repetition=21/30 PASS multi-tab supported: simultaneous tabs (1 refresh HTTP request) PASS multi-tab sign-out: pending refresh response cannot restore tab B PASS multi-tab locks-only: one notice per tab and sequential stale-access recovery PASS multi-tab neither: one notice per tab and sequential stale-access recovery PASS multi-tab repetition=22/30 PASS multi-tab supported: simultaneous tabs (1 refresh HTTP request) PASS multi-tab sign-out: pending refresh response cannot restore tab B PASS multi-tab locks-only: one notice per tab and sequential stale-access recovery PASS multi-tab neither: one notice per tab and sequential stale-access recovery PASS multi-tab repetition=23/30 PASS multi-tab supported: simultaneous tabs (1 refresh HTTP request) PASS multi-tab sign-out: pending refresh response cannot restore tab B PASS multi-tab locks-only: one notice per tab and sequential stale-access recovery PASS multi-tab neither: one notice per tab and sequential stale-access recovery PASS multi-tab repetition=24/30 PASS multi-tab supported: simultaneous tabs (1 refresh HTTP request) PASS multi-tab sign-out: pending refresh response cannot restore tab B PASS multi-tab locks-only: one notice per tab and sequential stale-access recovery PASS multi-tab neither: one notice per tab and sequential stale-access recovery PASS multi-tab repetition=25/30 PASS multi-tab supported: simultaneous tabs (1 refresh HTTP request) PASS multi-tab sign-out: pending refresh response cannot restore tab B PASS multi-tab locks-only: one notice per tab and sequential stale-access recovery PASS multi-tab neither: one notice per tab and sequential stale-access recovery PASS multi-tab repetition=26/30 PASS multi-tab supported: simultaneous tabs (1 refresh HTTP request) PASS multi-tab sign-out: pending refresh response cannot restore tab B PASS multi-tab locks-only: one notice per tab and sequential stale-access recovery PASS multi-tab neither: one notice per tab and sequential stale-access recovery PASS multi-tab repetition=27/30 PASS multi-tab supported: simultaneous tabs (1 refresh HTTP request) PASS multi-tab sign-out: pending refresh response cannot restore tab B PASS multi-tab locks-only: one notice per tab and sequential stale-access recovery PASS multi-tab neither: one notice per tab and sequential stale-access recovery PASS multi-tab repetition=28/30 PASS multi-tab supported: simultaneous tabs (1 refresh HTTP request) PASS multi-tab sign-out: pending refresh response cannot restore tab B PASS multi-tab locks-only: one notice per tab and sequential stale-access recovery PASS multi-tab neither: one notice per tab and sequential stale-access recovery PASS multi-tab repetition=29/30 PASS multi-tab supported: simultaneous tabs (1 refresh HTTP request) PASS multi-tab sign-out: pending refresh response cannot restore tab B PASS multi-tab locks-only: one notice per tab and sequential stale-access recovery PASS multi-tab neither: one notice per tab and sequential stale-access recovery PASS multi-tab repetition=30/30 ``` Actual load output: ```text stress-ng: info: [1445830] defaulting to a 1 day run per stressor stress-ng: info: [1445830] dispatching hogs: 8 cpu stress-ng: info: [1445830] skipped: 0 stress-ng: info: [1445830] passed: 8: cpu (8) stress-ng: info: [1445830] failed: 0 stress-ng: info: [1445830] metrics untrustworthy: 0 stress-ng: info: [1445830] successful run completed in 5 mins, 57.38 secs ``` Raw stress log: /home/kayg/.cache/infraternal-targets/multitab-refresh/multitab-stress.log. Screenshot artifacts: /mnt/hdd/infraternal/artifacts/verify/multitab-refresh-stress/browser/ (supported, locks-only, neither at 1440×900 and 390×844). Required INFRATERNAL_VERIFY_RUN_ID=multitab-refresh scripts/verify fast is now running, with the previously documented RUSTC_WRAPPER= and CARGO_INCREMENTAL=0 environment workaround. No Rust source changes; no performance-budget claim from this CPU-loaded VM test.
Author
Owner

Initial fast run on f47f6b2 exited 101 on baseline Rust 1.99 lints. Actual failure lines:

FAIL fast: cargo clippy (212.412s)
full log: /mnt/hdd/infraternal/artifacts/verify/multitab-refresh/step-8.log
error: used `assert!` to check that a value is not empty
error: used `assert!` to check that a value is not empty
error: used `assert!` to check that a value is not empty
error: used `assert!` to check that a value is not empty
error: used `assert!` to check that a value is not empty
error: could not compile `infraternal-engine` (test "integration") due to 6 previous errors

While the job ran, origin/dev advanced from d4fee7ba2f to 411c758719 (Rust 1.99 pin and lint fixes, #48). Integrated those already-landed changes with non-destructive merge e650051149; no additional backend changes authored here. Branch delta against updated origin/dev remains only docs/contracts.md, auth.svelte.ts, auth.test.ts, browser-check.mjs and the one verify output filter. Auth/smoke content is identical to the 30/30 loaded run on f47f6b2. Required fast gate restarted on e650051 with the exact multitab-refresh run ID; final result pending.

Initial fast run on f47f6b2 exited 101 on baseline Rust 1.99 lints. Actual failure lines: ```text FAIL fast: cargo clippy (212.412s) full log: /mnt/hdd/infraternal/artifacts/verify/multitab-refresh/step-8.log error: used `assert!` to check that a value is not empty error: used `assert!` to check that a value is not empty error: used `assert!` to check that a value is not empty error: used `assert!` to check that a value is not empty error: used `assert!` to check that a value is not empty error: could not compile `infraternal-engine` (test "integration") due to 6 previous errors ``` While the job ran, origin/dev advanced from d4fee7ba2fa24d5dc55c0cbd22750c065df4668b to 411c7587192d6b8ac1a61f3c52fd12b0e5d1ef47 (Rust 1.99 pin and lint fixes, #48). Integrated those already-landed changes with non-destructive merge e650051149605fa0ee09ccba037c00d3227bb7cc; no additional backend changes authored here. Branch delta against updated origin/dev remains only docs/contracts.md, auth.svelte.ts, auth.test.ts, browser-check.mjs and the one verify output filter. Auth/smoke content is identical to the 30/30 loaded run on f47f6b2. Required fast gate restarted on e650051 with the exact multitab-refresh run ID; final result pending.
Author
Owner

Finished multitab-refresh. Branch: multitab-refresh. Head: e650051149. No push; issues remain open.

Root cause: the product ignored session broadcasts in already signed-in tabs without a pending refresh, leaving revoked access credentials to start another rotation on polling 401s. Comparing the refresh baseline against the maximum stored generation also hid a completed rotation whose broadcast was still queued. Generation-wait timeout/sign-out could fall through to another refresh. The fix adopts successor credentials in signed-in tabs, compares against the generation of the held access credential, and fences waits/async completion against sign-out; observing a newer stored generation never falls through to another rotation.

Browser fixture races also existed: the fixed delay did not establish real lock contention, the existing signed-in tab's refreshes were uncounted, and unsupported-mode tabs could poll concurrently during supposedly sequential recovery. Supported-mode now waits for native held/pending refresh locks and successful use of the same credential by all three active tabs, and counts every context refresh. Unsupported-mode uses a context-wide paused browser clock and drains real requests between sequential operations. Exactly-one refresh assertion is unchanged.

Validation: 18 auth Vitest cases pass; four new product regressions failed against the original implementation. Production release browser stress passed 30 consecutive repetitions with stress-ng --cpu 8: supported=30, sign-out=30, locks-only=30, neither=30; every supported repetition issued exactly ONE refresh. Workers and test server were stopped. Stress was on f47f6b2b5b; its auth/test/browser files are byte-identical to this head. Final head merges origin/dev 411c758's already-landed Rust 1.99 lint fixes; no additional backend changes were authored here.

Final fast command: RUSTC_WRAPPER= CARGO_INCREMENTAL=0 INFRATERNAL_VERIFY_RUN_ID=multitab-refresh scripts/verify fast. Exit 0. The wrapper override avoids this VM's sccache incremental-compilation rejection. Full output quoted verbatim:

WARN load5=18.84 exceeds online CPU count=8; timing-sensitive checks may be delayed
PASS fast: migrations are append-only (0.320s)
PASS fast: workspace package dependencies (0.853s)
PASS fast: JavaScript dependencies (0.290s)
PASS fast: advisory review policy tests (0.264s)
SUPPLY_CHAIN_REVIEWS advisory exceptions are within their review windows
SUPPLY_CHAIN cargo-deny: cargo-deny 0.20.2
SUPPLY_CHAIN_NOTICES generated THIRD_PARTY_NOTICES.md from 95 frontend packages
SUPPLY_CHAIN_NOTICES copied source: 179 shadcn files, 3 calternal-derived files
SUPPLY_CHAIN_NOTICES license files: 66 distinct texts; 0 packages need manual license review
advisories ok
SUPPLY_CHAIN_RUST_ADVISORIES passed with refreshed advisory data
licenses ok
SUPPLY_CHAIN_RUST_LICENSES passed
bun audit v1.4.2 (744846f84)

cookie@0.6.0
  workspace:@infraternal/web > @sveltejs/kit > cookie
  low: cookie accepts cookie name, path, and domain with out of bounds characters (<0.7.0) - https://github.com/advisories/GHSA-pxg6-pf52-xh8x

1 vulnerability (1 low)

  bun audit fix           upgrade the vulnerable packages within their ranges
  bun audit fix --latest  also cross major versions
SUPPLY_CHAIN_BUN_AUDIT findings reported; this check is report-only
SUPPLY_CHAIN_PASS Rust advisory/license checks complete; Bun findings are report-only
PASS fast: supply-chain checks (9.381s)
PASS fast: build web app (20.148s)
PASS fast: cargo fmt --check (2.245s)
PASS fast: cargo clippy (46.373s)
PASS fast: cargo test (376.272s)
PASS fast: svelte-check (22.736s)
PASS fast: UI package svelte-check (6.475s)
PASS fast: stream package typecheck (5.652s)
PASS fast: Vitest (7.242s)
PASS fast: UI package Vitest (25.483s)
PASS fast: stream package Vitest (1.338s)
PASS fast: OpenAPI and TypeScript client drift (60.459s)
PASS fast: terminal TypeScript (2.656s)
PASS fast: terminal Vitest (1.432s)

Production browser stress output quoted verbatim:

AUTH_REFRESH context=main page=main-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=main page=main-page-1 method=POST path=/api/v1/auth/refresh outcome=http_error status=401
AUTH_401 context=main page=main-page-1 method=POST path=/api/v1/auth/refresh access_token_id=none
AUTH_REFRESH context=main page=main-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=main page=main-page-1 method=POST path=/api/v1/auth/refresh outcome=http_error status=401
AUTH_401 context=main page=main-page-1 method=POST path=/api/v1/auth/refresh access_token_id=none
AUTH_REFRESH context=main page=main-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=main page=main-page-1 method=POST path=/api/v1/auth/refresh outcome=http_error status=401
AUTH_401 context=main page=main-page-1 method=POST path=/api/v1/auth/refresh access_token_id=none
AUTH_REFRESH context=main page=main-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=main page=main-page-1 method=POST path=/api/v1/auth/refresh outcome=http_error status=401
AUTH_401 context=main page=main-page-1 method=POST path=/api/v1/auth/refresh access_token_id=none
AUTH_REFRESH context=main page=main-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=main page=main-page-1 method=POST path=/api/v1/auth/refresh outcome=http_error status=401
AUTH_401 context=main page=main-page-1 method=POST path=/api/v1/auth/refresh access_token_id=none
AUTH_SIGNOUT context=main page=main-page-1 method=POST path=/api/v1/auth/signout outcome=request
AUTH_SIGNOUT context=main page=main-page-1 method=POST path=/api/v1/auth/signout outcome=success status=200
AUTH_REFRESH context=main page=main-page-3 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=main page=main-page-3 method=POST path=/api/v1/auth/refresh outcome=success status=200
PASS multi-tab supported: simultaneous tabs (1 refresh HTTP request)
AUTH_REFRESH context=main page=main-page-4 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_SIGNOUT context=main page=main-page-1 method=POST path=/api/v1/auth/signout outcome=request
AUTH_SIGNOUT context=main page=main-page-1 method=POST path=/api/v1/auth/signout outcome=success status=200
AUTH_REFRESH context=main page=main-page-4 method=POST path=/api/v1/auth/refresh outcome=success status=200
PASS multi-tab sign-out: pending refresh response cannot restore tab B
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_401 context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=GET path=/api/v1/containers access_token_id=t_01M41FPZAX9MR4812Z6XQGTGD6
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_401 context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=GET path=/api/v1/containers access_token_id=t_01M41FQ1G5D64SPCA1GZTSRCYA
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
PASS multi-tab locks-only: one notice per tab and sequential stale-access recovery
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_401 context=multi-tab-neither page=multi-tab-neither-page-1 method=GET path=/api/v1/containers access_token_id=t_01M41FQ3QNJC2QEGZ9NVSRANV9
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_401 context=multi-tab-neither page=multi-tab-neither-page-2 method=GET path=/api/v1/containers access_token_id=t_01M41FQ5B5KB8CRNBWHK7A37HY
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
PASS multi-tab neither: one notice per tab and sequential stale-access recovery
AUTH_REFRESH context=main page=main-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=main page=main-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
PASS multi-tab repetition=1/30
AUTH_REFRESH context=main page=main-page-6 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=main page=main-page-6 method=POST path=/api/v1/auth/refresh outcome=success status=200
PASS multi-tab supported: simultaneous tabs (1 refresh HTTP request)
AUTH_REFRESH context=main page=main-page-7 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_SIGNOUT context=main page=main-page-1 method=POST path=/api/v1/auth/signout outcome=request
AUTH_SIGNOUT context=main page=main-page-1 method=POST path=/api/v1/auth/signout outcome=success status=200
AUTH_REFRESH context=main page=main-page-7 method=POST path=/api/v1/auth/refresh outcome=success status=200
PASS multi-tab sign-out: pending refresh response cannot restore tab B
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_401 context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=GET path=/api/v1/containers access_token_id=t_01M41FQCVQ4R44V0FHR8NDX8QJ
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_401 context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=GET path=/api/v1/containers access_token_id=t_01M41FQDYFK9DWJJV58TDEDM8E
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
PASS multi-tab locks-only: one notice per tab and sequential stale-access recovery
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_401 context=multi-tab-neither page=multi-tab-neither-page-1 method=GET path=/api/v1/containers access_token_id=t_01M41FQH2P6HPRA7CQRP5TGHVK
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_401 context=multi-tab-neither page=multi-tab-neither-page-2 method=GET path=/api/v1/containers access_token_id=t_01M41FQJX4JRED7TVA3YEJPSTA
PASS multi-tab neither: one notice per tab and sequential stale-access recovery
AUTH_REFRESH context=main page=main-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=main page=main-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
PASS multi-tab repetition=2/30
AUTH_REFRESH context=main page=main-page-8 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=main page=main-page-8 method=POST path=/api/v1/auth/refresh outcome=success status=200
PASS multi-tab supported: simultaneous tabs (1 refresh HTTP request)
AUTH_REFRESH context=main page=main-page-10 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_SIGNOUT context=main page=main-page-1 method=POST path=/api/v1/auth/signout outcome=request
AUTH_SIGNOUT context=main page=main-page-1 method=POST path=/api/v1/auth/signout outcome=success status=200
AUTH_REFRESH context=main page=main-page-10 method=POST path=/api/v1/auth/refresh outcome=success status=200
PASS multi-tab sign-out: pending refresh response cannot restore tab B
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_401 context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=GET path=/api/v1/containers access_token_id=t_01M41FQSFH0XXP5E8HNXY8N6SJ
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_401 context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=GET path=/api/v1/containers access_token_id=t_01M41FQV1G4DPWQBFJVXFWNBAE
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
PASS multi-tab locks-only: one notice per tab and sequential stale-access recovery
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_401 context=multi-tab-neither page=multi-tab-neither-page-1 method=GET path=/api/v1/containers access_token_id=t_01M41FQZ0N0K4P5HEE2VWCS794
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_401 context=multi-tab-neither page=multi-tab-neither-page-2 method=GET path=/api/v1/containers access_token_id=t_01M41FR2WFHVFX1692J3NA9B7Q
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
PASS multi-tab neither: one notice per tab and sequential stale-access recovery
AUTH_REFRESH context=main page=main-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=main page=main-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
PASS multi-tab repetition=3/30
AUTH_REFRESH context=main page=main-page-12 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=main page=main-page-12 method=POST path=/api/v1/auth/refresh outcome=success status=200
PASS multi-tab supported: simultaneous tabs (1 refresh HTTP request)
AUTH_REFRESH context=main page=main-page-13 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_SIGNOUT context=main page=main-page-1 method=POST path=/api/v1/auth/signout outcome=request
AUTH_SIGNOUT context=main page=main-page-1 method=POST path=/api/v1/auth/signout outcome=success status=200
AUTH_REFRESH context=main page=main-page-13 method=POST path=/api/v1/auth/refresh outcome=success status=200
PASS multi-tab sign-out: pending refresh response cannot restore tab B
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_401 context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=GET path=/api/v1/containers access_token_id=t_01M41FRJV0YHC6RZY3F9K9J067
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_401 context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=GET path=/api/v1/containers access_token_id=t_01M41FRPD2F431G2VDZ2THEW08
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
PASS multi-tab locks-only: one notice per tab and sequential stale-access recovery
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_401 context=multi-tab-neither page=multi-tab-neither-page-1 method=GET path=/api/v1/containers access_token_id=t_01M41FRV1CE1AYBABKNZ5HMQMZ
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_401 context=multi-tab-neither page=multi-tab-neither-page-2 method=GET path=/api/v1/containers access_token_id=t_01M41FRX3C87XK0V9PA95M25S1
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
PASS multi-tab neither: one notice per tab and sequential stale-access recovery
AUTH_REFRESH context=main page=main-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=main page=main-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
PASS multi-tab repetition=4/30
AUTH_REFRESH context=main page=main-page-14 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=main page=main-page-14 method=POST path=/api/v1/auth/refresh outcome=success status=200
PASS multi-tab supported: simultaneous tabs (1 refresh HTTP request)
AUTH_REFRESH context=main page=main-page-16 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_SIGNOUT context=main page=main-page-1 method=POST path=/api/v1/auth/signout outcome=request
AUTH_SIGNOUT context=main page=main-page-1 method=POST path=/api/v1/auth/signout outcome=success status=200
AUTH_REFRESH context=main page=main-page-16 method=POST path=/api/v1/auth/refresh outcome=success status=200
PASS multi-tab sign-out: pending refresh response cannot restore tab B
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_401 context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=GET path=/api/v1/containers access_token_id=t_01M41FS40NBAF0DE0N3ACSQR45
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_401 context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=GET path=/api/v1/containers access_token_id=t_01M41FS52EG7JBGV7JRCTSH0BN
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
PASS multi-tab locks-only: one notice per tab and sequential stale-access recovery
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_401 context=multi-tab-neither page=multi-tab-neither-page-1 method=GET path=/api/v1/containers access_token_id=t_01M41FS76PE2TZSNQRKBJQF6TD
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_401 context=multi-tab-neither page=multi-tab-neither-page-2 method=GET path=/api/v1/containers access_token_id=t_01M41FS8W1VH90Q6GQSE3TJYDV
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
PASS multi-tab neither: one notice per tab and sequential stale-access recovery
AUTH_REFRESH context=main page=main-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=main page=main-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
PASS multi-tab repetition=5/30
AUTH_REFRESH context=main page=main-page-18 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=main page=main-page-18 method=POST path=/api/v1/auth/refresh outcome=success status=200
PASS multi-tab supported: simultaneous tabs (1 refresh HTTP request)
AUTH_REFRESH context=main page=main-page-19 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_SIGNOUT context=main page=main-page-1 method=POST path=/api/v1/auth/signout outcome=request
AUTH_SIGNOUT context=main page=main-page-1 method=POST path=/api/v1/auth/signout outcome=success status=200
AUTH_REFRESH context=main page=main-page-19 method=POST path=/api/v1/auth/refresh outcome=success status=200
PASS multi-tab sign-out: pending refresh response cannot restore tab B
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_401 context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=GET path=/api/v1/containers access_token_id=t_01M41FSEPQZG320Z16NJNXKH6A
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_401 context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=GET path=/api/v1/containers access_token_id=t_01M41FSFKS8F628RC2ZHKCG2Q4
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
PASS multi-tab locks-only: one notice per tab and sequential stale-access recovery
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_401 context=multi-tab-neither page=multi-tab-neither-page-1 method=GET path=/api/v1/containers access_token_id=t_01M41FSH1XAP5A453S03R123XF
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_401 context=multi-tab-neither page=multi-tab-neither-page-2 method=GET path=/api/v1/containers access_token_id=t_01M41FSHX5X7KR7NXMSEW662RV
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
PASS multi-tab neither: one notice per tab and sequential stale-access recovery
AUTH_REFRESH context=main page=main-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=main page=main-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
PASS multi-tab repetition=6/30
AUTH_REFRESH context=main page=main-page-21 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=main page=main-page-21 method=POST path=/api/v1/auth/refresh outcome=success status=200
PASS multi-tab supported: simultaneous tabs (1 refresh HTTP request)
AUTH_REFRESH context=main page=main-page-22 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_SIGNOUT context=main page=main-page-1 method=POST path=/api/v1/auth/signout outcome=request
AUTH_SIGNOUT context=main page=main-page-1 method=POST path=/api/v1/auth/signout outcome=success status=200
AUTH_REFRESH context=main page=main-page-22 method=POST path=/api/v1/auth/refresh outcome=success status=200
PASS multi-tab sign-out: pending refresh response cannot restore tab B
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_401 context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=GET path=/api/v1/containers access_token_id=t_01M41FSPKNVHBH4J1FZQQJS5JM
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_401 context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=GET path=/api/v1/containers access_token_id=t_01M41FSQB80V374TW3RMZBR135
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
PASS multi-tab locks-only: one notice per tab and sequential stale-access recovery
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_401 context=multi-tab-neither page=multi-tab-neither-page-1 method=GET path=/api/v1/containers access_token_id=t_01M41FSRYXF8N0GY22YGRQSWJK
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_401 context=multi-tab-neither page=multi-tab-neither-page-2 method=GET path=/api/v1/containers access_token_id=t_01M41FST0H1A93HWCWWKE4CR8X
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
PASS multi-tab neither: one notice per tab and sequential stale-access recovery
AUTH_REFRESH context=main page=main-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=main page=main-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
PASS multi-tab repetition=7/30
AUTH_REFRESH context=main page=main-page-24 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=main page=main-page-24 method=POST path=/api/v1/auth/refresh outcome=success status=200
PASS multi-tab supported: simultaneous tabs (1 refresh HTTP request)
AUTH_REFRESH context=main page=main-page-25 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_SIGNOUT context=main page=main-page-1 method=POST path=/api/v1/auth/signout outcome=request
AUTH_SIGNOUT context=main page=main-page-1 method=POST path=/api/v1/auth/signout outcome=success status=200
AUTH_REFRESH context=main page=main-page-25 method=POST path=/api/v1/auth/refresh outcome=success status=200
PASS multi-tab sign-out: pending refresh response cannot restore tab B
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_401 context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=GET path=/api/v1/containers access_token_id=t_01M41FSZETY3HSKTG3DXZAA8YE
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_401 context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=GET path=/api/v1/containers access_token_id=t_01M41FT0JEK3WBYQQPW8DAP0H6
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
PASS multi-tab locks-only: one notice per tab and sequential stale-access recovery
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_401 context=multi-tab-neither page=multi-tab-neither-page-2 method=GET path=/api/v1/containers access_token_id=t_01M41FT3A04ZK62ZC3PHY2GTT3
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_401 context=multi-tab-neither page=multi-tab-neither-page-1 method=GET path=/api/v1/containers access_token_id=t_01M41FT4CRGMJKF9QAXT3HDB25
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
PASS multi-tab neither: one notice per tab and sequential stale-access recovery
AUTH_REFRESH context=main page=main-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=main page=main-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
PASS multi-tab repetition=8/30
AUTH_REFRESH context=main page=main-page-26 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=main page=main-page-26 method=POST path=/api/v1/auth/refresh outcome=success status=200
PASS multi-tab supported: simultaneous tabs (1 refresh HTTP request)
AUTH_REFRESH context=main page=main-page-28 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_SIGNOUT context=main page=main-page-1 method=POST path=/api/v1/auth/signout outcome=request
AUTH_SIGNOUT context=main page=main-page-1 method=POST path=/api/v1/auth/signout outcome=success status=200
AUTH_REFRESH context=main page=main-page-28 method=POST path=/api/v1/auth/refresh outcome=success status=200
PASS multi-tab sign-out: pending refresh response cannot restore tab B
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_401 context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=GET path=/api/v1/containers access_token_id=t_01M41FTAYY6SSJ9B9D4JT0437B
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_401 context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=GET path=/api/v1/containers access_token_id=t_01M41FTCDFX5NB7CTMSGKDCN85
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
PASS multi-tab locks-only: one notice per tab and sequential stale-access recovery
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_401 context=multi-tab-neither page=multi-tab-neither-page-1 method=GET path=/api/v1/containers access_token_id=t_01M41FTEF42Y92Y657YP80NCAW
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_401 context=multi-tab-neither page=multi-tab-neither-page-2 method=GET path=/api/v1/containers access_token_id=t_01M41FTFVVZEZKJ2CPGZ4GETEC
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
PASS multi-tab neither: one notice per tab and sequential stale-access recovery
AUTH_REFRESH context=main page=main-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=main page=main-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
PASS multi-tab repetition=9/30
AUTH_REFRESH context=main page=main-page-30 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=main page=main-page-30 method=POST path=/api/v1/auth/refresh outcome=success status=200
PASS multi-tab supported: simultaneous tabs (1 refresh HTTP request)
AUTH_REFRESH context=main page=main-page-31 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_SIGNOUT context=main page=main-page-1 method=POST path=/api/v1/auth/signout outcome=request
AUTH_SIGNOUT context=main page=main-page-1 method=POST path=/api/v1/auth/signout outcome=success status=200
AUTH_REFRESH context=main page=main-page-31 method=POST path=/api/v1/auth/refresh outcome=success status=200
PASS multi-tab sign-out: pending refresh response cannot restore tab B
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_401 context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=GET path=/api/v1/containers access_token_id=t_01M41FTPJZAFENEQY3A1KKX4V9
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_401 context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=GET path=/api/v1/containers access_token_id=t_01M41FTQKS5J6GA574E3CABX5Z
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
PASS multi-tab locks-only: one notice per tab and sequential stale-access recovery
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_401 context=multi-tab-neither page=multi-tab-neither-page-1 method=GET path=/api/v1/containers access_token_id=t_01M41FTS6YQDFZMFKV66W8XK87
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_401 context=multi-tab-neither page=multi-tab-neither-page-2 method=GET path=/api/v1/containers access_token_id=t_01M41FTT0PVJQ4KPPV9PD12WRC
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
PASS multi-tab neither: one notice per tab and sequential stale-access recovery
AUTH_REFRESH context=main page=main-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=main page=main-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
PASS multi-tab repetition=10/30
AUTH_REFRESH context=main page=main-page-32 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=main page=main-page-32 method=POST path=/api/v1/auth/refresh outcome=success status=200
PASS multi-tab supported: simultaneous tabs (1 refresh HTTP request)
AUTH_REFRESH context=main page=main-page-34 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_SIGNOUT context=main page=main-page-1 method=POST path=/api/v1/auth/signout outcome=request
AUTH_SIGNOUT context=main page=main-page-1 method=POST path=/api/v1/auth/signout outcome=success status=200
AUTH_REFRESH context=main page=main-page-34 method=POST path=/api/v1/auth/refresh outcome=success status=200
PASS multi-tab sign-out: pending refresh response cannot restore tab B
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_401 context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=GET path=/api/v1/containers access_token_id=t_01M41FTZJ509STGZ9348XA2XAS
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_401 context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=GET path=/api/v1/containers access_token_id=t_01M41FV0D84NE8DVG2QXHPH712
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
PASS multi-tab locks-only: one notice per tab and sequential stale-access recovery
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_401 context=multi-tab-neither page=multi-tab-neither-page-1 method=GET path=/api/v1/containers access_token_id=t_01M41FV1WPRT22FW37Q1QSFHNP
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_401 context=multi-tab-neither page=multi-tab-neither-page-2 method=GET path=/api/v1/containers access_token_id=t_01M41FV2Q0FSXJ3P6ZMTAH2RAQ
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
PASS multi-tab neither: one notice per tab and sequential stale-access recovery
AUTH_REFRESH context=main page=main-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=main page=main-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
PASS multi-tab repetition=11/30
AUTH_REFRESH context=main page=main-page-36 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=main page=main-page-36 method=POST path=/api/v1/auth/refresh outcome=success status=200
PASS multi-tab supported: simultaneous tabs (1 refresh HTTP request)
AUTH_REFRESH context=main page=main-page-37 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_SIGNOUT context=main page=main-page-1 method=POST path=/api/v1/auth/signout outcome=request
AUTH_SIGNOUT context=main page=main-page-1 method=POST path=/api/v1/auth/signout outcome=success status=200
AUTH_REFRESH context=main page=main-page-37 method=POST path=/api/v1/auth/refresh outcome=success status=200
PASS multi-tab sign-out: pending refresh response cannot restore tab B
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_401 context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=GET path=/api/v1/containers access_token_id=t_01M41FV86FK2G29V70DGJFSVD3
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_401 context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=GET path=/api/v1/containers access_token_id=t_01M41FV90KGFWGKEJ12863RSPQ
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
PASS multi-tab locks-only: one notice per tab and sequential stale-access recovery
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_401 context=multi-tab-neither page=multi-tab-neither-page-2 method=GET path=/api/v1/containers access_token_id=t_01M41FVAA08X4SX48JKQTF5P18
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_401 context=multi-tab-neither page=multi-tab-neither-page-1 method=GET path=/api/v1/containers access_token_id=t_01M41FVB2A2AGNE5JZ3N1WXXVH
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
PASS multi-tab neither: one notice per tab and sequential stale-access recovery
AUTH_REFRESH context=main page=main-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=main page=main-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
PASS multi-tab repetition=12/30
AUTH_REFRESH context=main page=main-page-39 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=main page=main-page-39 method=POST path=/api/v1/auth/refresh outcome=success status=200
PASS multi-tab supported: simultaneous tabs (1 refresh HTTP request)
AUTH_REFRESH context=main page=main-page-40 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_SIGNOUT context=main page=main-page-1 method=POST path=/api/v1/auth/signout outcome=request
AUTH_SIGNOUT context=main page=main-page-1 method=POST path=/api/v1/auth/signout outcome=success status=200
AUTH_REFRESH context=main page=main-page-40 method=POST path=/api/v1/auth/refresh outcome=success status=200
PASS multi-tab sign-out: pending refresh response cannot restore tab B
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_401 context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=GET path=/api/v1/containers access_token_id=t_01M41FVFTDNQ8QGS7T004P9S98
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_401 context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=GET path=/api/v1/containers access_token_id=t_01M41FVGJEZ9EWN614QJDMEN8A
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
PASS multi-tab locks-only: one notice per tab and sequential stale-access recovery
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_401 context=multi-tab-neither page=multi-tab-neither-page-1 method=GET path=/api/v1/containers access_token_id=t_01M41FVJGEQ3HPBET86231QZ22
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_401 context=multi-tab-neither page=multi-tab-neither-page-2 method=GET path=/api/v1/containers access_token_id=t_01M41FVKH6HJGJ16F34D2YNVH2
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
PASS multi-tab neither: one notice per tab and sequential stale-access recovery
AUTH_REFRESH context=main page=main-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=main page=main-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
PASS multi-tab repetition=13/30
AUTH_REFRESH context=main page=main-page-41 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=main page=main-page-41 method=POST path=/api/v1/auth/refresh outcome=success status=200
PASS multi-tab supported: simultaneous tabs (1 refresh HTTP request)
AUTH_REFRESH context=main page=main-page-43 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_SIGNOUT context=main page=main-page-1 method=POST path=/api/v1/auth/signout outcome=request
AUTH_SIGNOUT context=main page=main-page-1 method=POST path=/api/v1/auth/signout outcome=success status=200
AUTH_REFRESH context=main page=main-page-43 method=POST path=/api/v1/auth/refresh outcome=success status=200
PASS multi-tab sign-out: pending refresh response cannot restore tab B
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_401 context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=GET path=/api/v1/containers access_token_id=t_01M41FVSCZ15K2C1R0ZJFX7WZ5
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_401 context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=GET path=/api/v1/containers access_token_id=t_01M41FVTDQXVEGB7PHDWSWDGBC
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
PASS multi-tab locks-only: one notice per tab and sequential stale-access recovery
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_401 context=multi-tab-neither page=multi-tab-neither-page-1 method=GET path=/api/v1/containers access_token_id=t_01M41FVW22700ZDWPCP2SZDWP8
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_401 context=multi-tab-neither page=multi-tab-neither-page-2 method=GET path=/api/v1/containers access_token_id=t_01M41FVWZ9Y0BN1B6783S0XDDV
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
PASS multi-tab neither: one notice per tab and sequential stale-access recovery
AUTH_REFRESH context=main page=main-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=main page=main-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
PASS multi-tab repetition=14/30
AUTH_REFRESH context=main page=main-page-44 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=main page=main-page-44 method=POST path=/api/v1/auth/refresh outcome=success status=200
PASS multi-tab supported: simultaneous tabs (1 refresh HTTP request)
AUTH_REFRESH context=main page=main-page-46 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_SIGNOUT context=main page=main-page-1 method=POST path=/api/v1/auth/signout outcome=request
AUTH_SIGNOUT context=main page=main-page-1 method=POST path=/api/v1/auth/signout outcome=success status=200
AUTH_REFRESH context=main page=main-page-46 method=POST path=/api/v1/auth/refresh outcome=success status=200
PASS multi-tab sign-out: pending refresh response cannot restore tab B
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_401 context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=GET path=/api/v1/containers access_token_id=t_01M41FW39Q54KRVKF488W222M3
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_401 context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=GET path=/api/v1/containers access_token_id=t_01M41FW4ABTC3D4C5X4KK9N15Y
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
PASS multi-tab locks-only: one notice per tab and sequential stale-access recovery
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_401 context=multi-tab-neither page=multi-tab-neither-page-2 method=GET path=/api/v1/containers access_token_id=t_01M41FW66V0VABSX1RFPHMR74E
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_401 context=multi-tab-neither page=multi-tab-neither-page-1 method=GET path=/api/v1/containers access_token_id=t_01M41FW7EAYVYP4SW7DSFTZXTQ
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
PASS multi-tab neither: one notice per tab and sequential stale-access recovery
AUTH_REFRESH context=main page=main-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=main page=main-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
PASS multi-tab repetition=15/30
AUTH_REFRESH context=main page=main-page-47 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=main page=main-page-47 method=POST path=/api/v1/auth/refresh outcome=success status=200
PASS multi-tab supported: simultaneous tabs (1 refresh HTTP request)
AUTH_REFRESH context=main page=main-page-49 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_SIGNOUT context=main page=main-page-1 method=POST path=/api/v1/auth/signout outcome=request
AUTH_SIGNOUT context=main page=main-page-1 method=POST path=/api/v1/auth/signout outcome=success status=200
AUTH_REFRESH context=main page=main-page-49 method=POST path=/api/v1/auth/refresh outcome=success status=200
PASS multi-tab sign-out: pending refresh response cannot restore tab B
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_401 context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=GET path=/api/v1/containers access_token_id=t_01M41FWCVHVPP9RK4QBV7GRY35
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_401 context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=GET path=/api/v1/containers access_token_id=t_01M41FWE3PKQTSJ9HGEH027M36
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
PASS multi-tab locks-only: one notice per tab and sequential stale-access recovery
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_401 context=multi-tab-neither page=multi-tab-neither-page-1 method=GET path=/api/v1/containers access_token_id=t_01M41FWGBEEY3SSE3HD6B6Q9N8
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_401 context=multi-tab-neither page=multi-tab-neither-page-2 method=GET path=/api/v1/containers access_token_id=t_01M41FWH9AA83BB7RNJREC8YZQ
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
PASS multi-tab neither: one notice per tab and sequential stale-access recovery
AUTH_REFRESH context=main page=main-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=main page=main-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
PASS multi-tab repetition=16/30
AUTH_REFRESH context=main page=main-page-51 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=main page=main-page-51 method=POST path=/api/v1/auth/refresh outcome=success status=200
PASS multi-tab supported: simultaneous tabs (1 refresh HTTP request)
AUTH_REFRESH context=main page=main-page-52 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_SIGNOUT context=main page=main-page-1 method=POST path=/api/v1/auth/signout outcome=request
AUTH_SIGNOUT context=main page=main-page-1 method=POST path=/api/v1/auth/signout outcome=success status=200
AUTH_REFRESH context=main page=main-page-52 method=POST path=/api/v1/auth/refresh outcome=success status=200
PASS multi-tab sign-out: pending refresh response cannot restore tab B
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_401 context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=GET path=/api/v1/containers access_token_id=t_01M41FWQ6BMVCX0EJ5E5DY1JKX
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_401 context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=GET path=/api/v1/containers access_token_id=t_01M41FWR6HYCCNG22J6G4W5YQG
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
PASS multi-tab locks-only: one notice per tab and sequential stale-access recovery
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_401 context=multi-tab-neither page=multi-tab-neither-page-1 method=GET path=/api/v1/containers access_token_id=t_01M41FWT6VAW1G7G9SYKPH89NE
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_401 context=multi-tab-neither page=multi-tab-neither-page-2 method=GET path=/api/v1/containers access_token_id=t_01M41FWVJ2T0C8TNNH3SJTJSDJ
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
PASS multi-tab neither: one notice per tab and sequential stale-access recovery
AUTH_REFRESH context=main page=main-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=main page=main-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
PASS multi-tab repetition=17/30
AUTH_REFRESH context=main page=main-page-53 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=main page=main-page-53 method=POST path=/api/v1/auth/refresh outcome=success status=200
PASS multi-tab supported: simultaneous tabs (1 refresh HTTP request)
AUTH_REFRESH context=main page=main-page-55 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_SIGNOUT context=main page=main-page-1 method=POST path=/api/v1/auth/signout outcome=request
AUTH_SIGNOUT context=main page=main-page-1 method=POST path=/api/v1/auth/signout outcome=success status=200
AUTH_REFRESH context=main page=main-page-55 method=POST path=/api/v1/auth/refresh outcome=success status=200
PASS multi-tab sign-out: pending refresh response cannot restore tab B
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_401 context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=GET path=/api/v1/containers access_token_id=t_01M41FX133JQBKFRTTC9BP2REV
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_401 context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=GET path=/api/v1/containers access_token_id=t_01M41FX26HK72QJB3KWD0T3VYC
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
PASS multi-tab locks-only: one notice per tab and sequential stale-access recovery
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_401 context=multi-tab-neither page=multi-tab-neither-page-1 method=GET path=/api/v1/containers access_token_id=t_01M41FX4D9VRN2AD2CCKCQJ2YK
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_401 context=multi-tab-neither page=multi-tab-neither-page-2 method=GET path=/api/v1/containers access_token_id=t_01M41FX5N8CXP227EK0VKT89W7
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
PASS multi-tab neither: one notice per tab and sequential stale-access recovery
AUTH_REFRESH context=main page=main-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=main page=main-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
PASS multi-tab repetition=18/30
AUTH_REFRESH context=main page=main-page-56 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=main page=main-page-56 method=POST path=/api/v1/auth/refresh outcome=success status=200
PASS multi-tab supported: simultaneous tabs (1 refresh HTTP request)
AUTH_REFRESH context=main page=main-page-58 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_SIGNOUT context=main page=main-page-1 method=POST path=/api/v1/auth/signout outcome=request
AUTH_SIGNOUT context=main page=main-page-1 method=POST path=/api/v1/auth/signout outcome=success status=200
AUTH_REFRESH context=main page=main-page-58 method=POST path=/api/v1/auth/refresh outcome=success status=200
PASS multi-tab sign-out: pending refresh response cannot restore tab B
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_401 context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=GET path=/api/v1/containers access_token_id=t_01M41FXC3BDFAR3Q96ZPKCSR8P
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_401 context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=GET path=/api/v1/containers access_token_id=t_01M41FXDD9MW3PVJYZK0NRFH0R
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
PASS multi-tab locks-only: one notice per tab and sequential stale-access recovery
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_401 context=multi-tab-neither page=multi-tab-neither-page-2 method=GET path=/api/v1/containers access_token_id=t_01M41FXFQTPF41T5F3QF27BWTV
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_401 context=multi-tab-neither page=multi-tab-neither-page-1 method=GET path=/api/v1/containers access_token_id=t_01M41FXHXRQFZDVJQVYP2DXYA2
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
PASS multi-tab neither: one notice per tab and sequential stale-access recovery
AUTH_REFRESH context=main page=main-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=main page=main-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
PASS multi-tab repetition=19/30
AUTH_REFRESH context=main page=main-page-60 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=main page=main-page-60 method=POST path=/api/v1/auth/refresh outcome=success status=200
PASS multi-tab supported: simultaneous tabs (1 refresh HTTP request)
AUTH_REFRESH context=main page=main-page-61 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_SIGNOUT context=main page=main-page-1 method=POST path=/api/v1/auth/signout outcome=request
AUTH_SIGNOUT context=main page=main-page-1 method=POST path=/api/v1/auth/signout outcome=success status=200
AUTH_REFRESH context=main page=main-page-61 method=POST path=/api/v1/auth/refresh outcome=success status=200
PASS multi-tab sign-out: pending refresh response cannot restore tab B
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_401 context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=GET path=/api/v1/containers access_token_id=t_01M41FXRTT4GEHYDSFZ65KYR0Q
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_401 context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=GET path=/api/v1/containers access_token_id=t_01M41FXTPT4BT7BZXA4200C1TR
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
PASS multi-tab locks-only: one notice per tab and sequential stale-access recovery
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_401 context=multi-tab-neither page=multi-tab-neither-page-1 method=GET path=/api/v1/containers access_token_id=t_01M41FXX3EBRFPG42K5E40TN2J
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_401 context=multi-tab-neither page=multi-tab-neither-page-2 method=GET path=/api/v1/containers access_token_id=t_01M41FXYERAWJCKRXZ6DEF6MSQ
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
PASS multi-tab neither: one notice per tab and sequential stale-access recovery
AUTH_REFRESH context=main page=main-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=main page=main-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
PASS multi-tab repetition=20/30
AUTH_REFRESH context=main page=main-page-63 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=main page=main-page-63 method=POST path=/api/v1/auth/refresh outcome=success status=200
PASS multi-tab supported: simultaneous tabs (1 refresh HTTP request)
AUTH_REFRESH context=main page=main-page-64 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_SIGNOUT context=main page=main-page-1 method=POST path=/api/v1/auth/signout outcome=request
AUTH_SIGNOUT context=main page=main-page-1 method=POST path=/api/v1/auth/signout outcome=success status=200
AUTH_REFRESH context=main page=main-page-64 method=POST path=/api/v1/auth/refresh outcome=success status=200
PASS multi-tab sign-out: pending refresh response cannot restore tab B
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_401 context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=GET path=/api/v1/containers access_token_id=t_01M41FY444CPPX8V6MYWRV6W1Z
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_401 context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=GET path=/api/v1/containers access_token_id=t_01M41FY54N759MN837ZMS29SK3
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
PASS multi-tab locks-only: one notice per tab and sequential stale-access recovery
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_401 context=multi-tab-neither page=multi-tab-neither-page-1 method=GET path=/api/v1/containers access_token_id=t_01M41FY895PNMG19XHPCY44RQV
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_401 context=multi-tab-neither page=multi-tab-neither-page-2 method=GET path=/api/v1/containers access_token_id=t_01M41FYB25NVV78X31WMCNDGQP
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
PASS multi-tab neither: one notice per tab and sequential stale-access recovery
AUTH_REFRESH context=main page=main-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=main page=main-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
PASS multi-tab repetition=21/30
AUTH_REFRESH context=main page=main-page-66 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=main page=main-page-66 method=POST path=/api/v1/auth/refresh outcome=success status=200
PASS multi-tab supported: simultaneous tabs (1 refresh HTTP request)
AUTH_REFRESH context=main page=main-page-67 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_SIGNOUT context=main page=main-page-1 method=POST path=/api/v1/auth/signout outcome=request
AUTH_SIGNOUT context=main page=main-page-1 method=POST path=/api/v1/auth/signout outcome=success status=200
AUTH_REFRESH context=main page=main-page-67 method=POST path=/api/v1/auth/refresh outcome=success status=200
PASS multi-tab sign-out: pending refresh response cannot restore tab B
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_401 context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=GET path=/api/v1/containers access_token_id=t_01M41FYNFPE4A49MTC847X8QVQ
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_401 context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=GET path=/api/v1/containers access_token_id=t_01M41FYQHTXTYQMCB2RWZRKJ71
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
PASS multi-tab locks-only: one notice per tab and sequential stale-access recovery
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_401 context=multi-tab-neither page=multi-tab-neither-page-1 method=GET path=/api/v1/containers access_token_id=t_01M41FYT2EXA961WZ3GR96MJ2A
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_401 context=multi-tab-neither page=multi-tab-neither-page-2 method=GET path=/api/v1/containers access_token_id=t_01M41FYTZTYTPW9V4FBKCTCTVE
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
PASS multi-tab neither: one notice per tab and sequential stale-access recovery
AUTH_REFRESH context=main page=main-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=main page=main-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
PASS multi-tab repetition=22/30
AUTH_REFRESH context=main page=main-page-69 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=main page=main-page-69 method=POST path=/api/v1/auth/refresh outcome=success status=200
PASS multi-tab supported: simultaneous tabs (1 refresh HTTP request)
AUTH_REFRESH context=main page=main-page-70 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_SIGNOUT context=main page=main-page-1 method=POST path=/api/v1/auth/signout outcome=request
AUTH_SIGNOUT context=main page=main-page-1 method=POST path=/api/v1/auth/signout outcome=success status=200
AUTH_REFRESH context=main page=main-page-70 method=POST path=/api/v1/auth/refresh outcome=success status=200
PASS multi-tab sign-out: pending refresh response cannot restore tab B
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_401 context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=GET path=/api/v1/containers access_token_id=t_01M41FZ0VHAZ035DA51J4HCS6X
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_401 context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=GET path=/api/v1/containers access_token_id=t_01M41FZ1VZT8BGXE8J186E64NH
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
PASS multi-tab locks-only: one notice per tab and sequential stale-access recovery
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_401 context=multi-tab-neither page=multi-tab-neither-page-1 method=GET path=/api/v1/containers access_token_id=t_01M41FZ3TAB3CVN28N11163VZ3
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_401 context=multi-tab-neither page=multi-tab-neither-page-2 method=GET path=/api/v1/containers access_token_id=t_01M41FZ4YE2G7PCCAQYSZD9YWA
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
PASS multi-tab neither: one notice per tab and sequential stale-access recovery
AUTH_REFRESH context=main page=main-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=main page=main-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
PASS multi-tab repetition=23/30
AUTH_REFRESH context=main page=main-page-72 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=main page=main-page-72 method=POST path=/api/v1/auth/refresh outcome=success status=200
PASS multi-tab supported: simultaneous tabs (1 refresh HTTP request)
AUTH_REFRESH context=main page=main-page-73 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_SIGNOUT context=main page=main-page-1 method=POST path=/api/v1/auth/signout outcome=request
AUTH_SIGNOUT context=main page=main-page-1 method=POST path=/api/v1/auth/signout outcome=success status=200
AUTH_REFRESH context=main page=main-page-73 method=POST path=/api/v1/auth/refresh outcome=success status=200
PASS multi-tab sign-out: pending refresh response cannot restore tab B
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_401 context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=GET path=/api/v1/containers access_token_id=t_01M41FZAER7QNA8N40H1CB9KVG
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_401 context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=GET path=/api/v1/containers access_token_id=t_01M41FZBHREFACPCVY5ZBVN574
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
PASS multi-tab locks-only: one notice per tab and sequential stale-access recovery
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_401 context=multi-tab-neither page=multi-tab-neither-page-1 method=GET path=/api/v1/containers access_token_id=t_01M41FZD7CRFB4KJDV42PPWXSE
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_401 context=multi-tab-neither page=multi-tab-neither-page-2 method=GET path=/api/v1/containers access_token_id=t_01M41FZEA2RJ812J4JH8SJM3M3
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
PASS multi-tab neither: one notice per tab and sequential stale-access recovery
AUTH_REFRESH context=main page=main-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=main page=main-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
PASS multi-tab repetition=24/30
AUTH_REFRESH context=main page=main-page-74 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=main page=main-page-74 method=POST path=/api/v1/auth/refresh outcome=success status=200
PASS multi-tab supported: simultaneous tabs (1 refresh HTTP request)
AUTH_REFRESH context=main page=main-page-76 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_SIGNOUT context=main page=main-page-1 method=POST path=/api/v1/auth/signout outcome=request
AUTH_SIGNOUT context=main page=main-page-1 method=POST path=/api/v1/auth/signout outcome=success status=200
AUTH_REFRESH context=main page=main-page-76 method=POST path=/api/v1/auth/refresh outcome=success status=200
PASS multi-tab sign-out: pending refresh response cannot restore tab B
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_401 context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=GET path=/api/v1/containers access_token_id=t_01M41FZMDDHP06VP6GNNY96XHX
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_401 context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=GET path=/api/v1/containers access_token_id=t_01M41FZNB04P3A2C8R9HJ45VAM
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
PASS multi-tab locks-only: one notice per tab and sequential stale-access recovery
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_401 context=multi-tab-neither page=multi-tab-neither-page-2 method=GET path=/api/v1/containers access_token_id=t_01M41FZQ00GR0QTKGSPXRAR6YT
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_401 context=multi-tab-neither page=multi-tab-neither-page-1 method=GET path=/api/v1/containers access_token_id=t_01M41FZR3GVZRX9KPZAR9E2DCR
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
PASS multi-tab neither: one notice per tab and sequential stale-access recovery
AUTH_REFRESH context=main page=main-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=main page=main-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
PASS multi-tab repetition=25/30
AUTH_REFRESH context=main page=main-page-78 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=main page=main-page-78 method=POST path=/api/v1/auth/refresh outcome=success status=200
PASS multi-tab supported: simultaneous tabs (1 refresh HTTP request)
AUTH_REFRESH context=main page=main-page-79 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_SIGNOUT context=main page=main-page-1 method=POST path=/api/v1/auth/signout outcome=request
AUTH_SIGNOUT context=main page=main-page-1 method=POST path=/api/v1/auth/signout outcome=success status=200
AUTH_REFRESH context=main page=main-page-79 method=POST path=/api/v1/auth/refresh outcome=success status=200
PASS multi-tab sign-out: pending refresh response cannot restore tab B
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_401 context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=GET path=/api/v1/containers access_token_id=t_01M41FZX3DGF08H4RZ9NCRTJB3
AUTH_401 context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=GET path=/api/v1/containers access_token_id=t_01M41FZXXVP20M1MWWNDT024F6
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
PASS multi-tab locks-only: one notice per tab and sequential stale-access recovery
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_401 context=multi-tab-neither page=multi-tab-neither-page-1 method=GET path=/api/v1/containers access_token_id=t_01M41FZZY68P8C6F1PYHWZ0KY6
AUTH_401 context=multi-tab-neither page=multi-tab-neither-page-2 method=GET path=/api/v1/containers access_token_id=t_01M41G011PNK4TT8H5HZWNGQFC
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
PASS multi-tab neither: one notice per tab and sequential stale-access recovery
AUTH_REFRESH context=main page=main-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=main page=main-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
PASS multi-tab repetition=26/30
AUTH_REFRESH context=main page=main-page-81 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=main page=main-page-81 method=POST path=/api/v1/auth/refresh outcome=success status=200
PASS multi-tab supported: simultaneous tabs (1 refresh HTTP request)
AUTH_REFRESH context=main page=main-page-82 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_SIGNOUT context=main page=main-page-1 method=POST path=/api/v1/auth/signout outcome=request
AUTH_SIGNOUT context=main page=main-page-1 method=POST path=/api/v1/auth/signout outcome=success status=200
AUTH_REFRESH context=main page=main-page-82 method=POST path=/api/v1/auth/refresh outcome=success status=200
PASS multi-tab sign-out: pending refresh response cannot restore tab B
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_401 context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=GET path=/api/v1/containers access_token_id=t_01M41G06HR333WY798YF3DYVX0
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_401 context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=GET path=/api/v1/containers access_token_id=t_01M41G07G5GFA84XZFQW32ZBB5
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
PASS multi-tab locks-only: one notice per tab and sequential stale-access recovery
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_401 context=multi-tab-neither page=multi-tab-neither-page-1 method=GET path=/api/v1/containers access_token_id=t_01M41G09EAS3RAW2VS3V4QCMDT
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_401 context=multi-tab-neither page=multi-tab-neither-page-2 method=GET path=/api/v1/containers access_token_id=t_01M41G0AE172CJPGRJT00CYMV4
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
PASS multi-tab neither: one notice per tab and sequential stale-access recovery
AUTH_REFRESH context=main page=main-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=main page=main-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
PASS multi-tab repetition=27/30
AUTH_REFRESH context=main page=main-page-84 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=main page=main-page-84 method=POST path=/api/v1/auth/refresh outcome=success status=200
PASS multi-tab supported: simultaneous tabs (1 refresh HTTP request)
AUTH_REFRESH context=main page=main-page-85 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_SIGNOUT context=main page=main-page-1 method=POST path=/api/v1/auth/signout outcome=request
AUTH_SIGNOUT context=main page=main-page-1 method=POST path=/api/v1/auth/signout outcome=success status=200
AUTH_REFRESH context=main page=main-page-85 method=POST path=/api/v1/auth/refresh outcome=success status=200
PASS multi-tab sign-out: pending refresh response cannot restore tab B
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_401 context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=GET path=/api/v1/containers access_token_id=t_01M41G0GEPBHT9AXHW7SJHW8VM
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_401 context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=GET path=/api/v1/containers access_token_id=t_01M41G0HPP3MVMPP26JHCM6HM4
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
PASS multi-tab locks-only: one notice per tab and sequential stale-access recovery
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_401 context=multi-tab-neither page=multi-tab-neither-page-1 method=GET path=/api/v1/containers access_token_id=t_01M41G0KJ3QVZ5Y5EVQEGTTF62
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_401 context=multi-tab-neither page=multi-tab-neither-page-2 method=GET path=/api/v1/containers access_token_id=t_01M41G0MSVJZNSHSY6GZ6GKKC0
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
PASS multi-tab neither: one notice per tab and sequential stale-access recovery
AUTH_REFRESH context=main page=main-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=main page=main-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
PASS multi-tab repetition=28/30
AUTH_REFRESH context=main page=main-page-87 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=main page=main-page-87 method=POST path=/api/v1/auth/refresh outcome=success status=200
PASS multi-tab supported: simultaneous tabs (1 refresh HTTP request)
AUTH_REFRESH context=main page=main-page-88 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_SIGNOUT context=main page=main-page-1 method=POST path=/api/v1/auth/signout outcome=request
AUTH_SIGNOUT context=main page=main-page-1 method=POST path=/api/v1/auth/signout outcome=success status=200
AUTH_REFRESH context=main page=main-page-88 method=POST path=/api/v1/auth/refresh outcome=success status=200
PASS multi-tab sign-out: pending refresh response cannot restore tab B
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_401 context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=GET path=/api/v1/containers access_token_id=t_01M41G0YS2QFQ87H5VPVT2WKRD
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_401 context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=GET path=/api/v1/containers access_token_id=t_01M41G0ZXAVSG2V60HY7N6RR04
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
PASS multi-tab locks-only: one notice per tab and sequential stale-access recovery
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_401 context=multi-tab-neither page=multi-tab-neither-page-1 method=GET path=/api/v1/containers access_token_id=t_01M41G12T4KKZJ415ZHFBWBJGC
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_401 context=multi-tab-neither page=multi-tab-neither-page-2 method=GET path=/api/v1/containers access_token_id=t_01M41G140F3Q8RBXG1S17MWPBF
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
PASS multi-tab neither: one notice per tab and sequential stale-access recovery
AUTH_REFRESH context=main page=main-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=main page=main-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
PASS multi-tab repetition=29/30
AUTH_REFRESH context=main page=main-page-89 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=main page=main-page-89 method=POST path=/api/v1/auth/refresh outcome=success status=200
PASS multi-tab supported: simultaneous tabs (1 refresh HTTP request)
AUTH_REFRESH context=main page=main-page-91 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_SIGNOUT context=main page=main-page-1 method=POST path=/api/v1/auth/signout outcome=request
AUTH_SIGNOUT context=main page=main-page-1 method=POST path=/api/v1/auth/signout outcome=success status=200
AUTH_REFRESH context=main page=main-page-91 method=POST path=/api/v1/auth/refresh outcome=success status=200
PASS multi-tab sign-out: pending refresh response cannot restore tab B
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_401 context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=GET path=/api/v1/containers access_token_id=t_01M41G19YGWXR2AFB9VTRVMWVZ
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_401 context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=GET path=/api/v1/containers access_token_id=t_01M41G1B7T8DAQP6CDM7NRAB7Z
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
PASS multi-tab locks-only: one notice per tab and sequential stale-access recovery
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_401 context=multi-tab-neither page=multi-tab-neither-page-1 method=GET path=/api/v1/containers access_token_id=t_01M41G1DPY4GXB6SED1HXM8R67
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200
AUTH_401 context=multi-tab-neither page=multi-tab-neither-page-2 method=GET path=/api/v1/containers access_token_id=t_01M41G1F15DR0S0ETME7N6YQ97
PASS multi-tab neither: one notice per tab and sequential stale-access recovery
AUTH_REFRESH context=main page=main-page-1 method=POST path=/api/v1/auth/refresh outcome=request
AUTH_REFRESH context=main page=main-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200
PASS multi-tab repetition=30/30

CPU load output quoted verbatim:

stress-ng: info:  [1445830] defaulting to a 1 day run per stressor
stress-ng: info:  [1445830] dispatching hogs: 8 cpu
stress-ng: info:  [1445830] skipped: 0
stress-ng: info:  [1445830] passed: 8: cpu (8)
stress-ng: info:  [1445830] failed: 0
stress-ng: info:  [1445830] metrics untrustworthy: 0
stress-ng: info:  [1445830] successful run completed in 5 mins, 57.38 secs

Artifacts: /mnt/hdd/infraternal/artifacts/verify/multitab-refresh/{fast,stress,stress-ng,auth-regressions,browser}.log. Desktop (1440x900) and mobile (390x844) screenshots: /mnt/hdd/infraternal/artifacts/verify/multitab-refresh-stress/browser/. Inspected signed-in supported desktop/mobile and unsupported mobile notice; no visual source changes.

Applied UI rules: preserve shared primitives/tokens and existing accessible notice/live-region behavior; verify native production browser behavior at desktop/mobile sizes. The change does not add motion or styling.

Mapping to calternal-port: carry over signed-in-or-eligible-pending broadcast adoption, credential-generation baseline, and epoch fences after awaits. Preserve its session_request sharing and BFCache reload logic. Its cold-start historical-generation/250ms-peer timeout must remain distinct from a rotation completed during this recovery; blindly applying the no-fallthrough rule to historical storage would strand cold tabs. Native-lock/shared-cookie regressions apply; adapt new shell locators.

Owner Safari/iOS checklist (no simulator used):

  1. Open two tabs alongside an idle signed-in tab; trigger concurrent stale access recovery and confirm all remain signed in.
  2. Sign out while another tab has refresh pending; confirm it stays signed out.
  3. At phone width, confirm the unsupported-mode notice wraps without clipping.
Finished multitab-refresh. Branch: multitab-refresh. Head: e650051149605fa0ee09ccba037c00d3227bb7cc. No push; issues remain open. Root cause: the product ignored session broadcasts in already signed-in tabs without a pending refresh, leaving revoked access credentials to start another rotation on polling 401s. Comparing the refresh baseline against the maximum stored generation also hid a completed rotation whose broadcast was still queued. Generation-wait timeout/sign-out could fall through to another refresh. The fix adopts successor credentials in signed-in tabs, compares against the generation of the held access credential, and fences waits/async completion against sign-out; observing a newer stored generation never falls through to another rotation. Browser fixture races also existed: the fixed delay did not establish real lock contention, the existing signed-in tab's refreshes were uncounted, and unsupported-mode tabs could poll concurrently during supposedly sequential recovery. Supported-mode now waits for native held/pending refresh locks and successful use of the same credential by all three active tabs, and counts every context refresh. Unsupported-mode uses a context-wide paused browser clock and drains real requests between sequential operations. Exactly-one refresh assertion is unchanged. Validation: 18 auth Vitest cases pass; four new product regressions failed against the original implementation. Production release browser stress passed 30 consecutive repetitions with stress-ng --cpu 8: supported=30, sign-out=30, locks-only=30, neither=30; every supported repetition issued exactly ONE refresh. Workers and test server were stopped. Stress was on f47f6b2b5b56f1a225da58748fdf566b32a9d135; its auth/test/browser files are byte-identical to this head. Final head merges origin/dev 411c758's already-landed Rust 1.99 lint fixes; no additional backend changes were authored here. Final fast command: RUSTC_WRAPPER= CARGO_INCREMENTAL=0 INFRATERNAL_VERIFY_RUN_ID=multitab-refresh scripts/verify fast. Exit 0. The wrapper override avoids this VM's sccache incremental-compilation rejection. Full output quoted verbatim: ```text WARN load5=18.84 exceeds online CPU count=8; timing-sensitive checks may be delayed PASS fast: migrations are append-only (0.320s) PASS fast: workspace package dependencies (0.853s) PASS fast: JavaScript dependencies (0.290s) PASS fast: advisory review policy tests (0.264s) SUPPLY_CHAIN_REVIEWS advisory exceptions are within their review windows SUPPLY_CHAIN cargo-deny: cargo-deny 0.20.2 SUPPLY_CHAIN_NOTICES generated THIRD_PARTY_NOTICES.md from 95 frontend packages SUPPLY_CHAIN_NOTICES copied source: 179 shadcn files, 3 calternal-derived files SUPPLY_CHAIN_NOTICES license files: 66 distinct texts; 0 packages need manual license review advisories ok SUPPLY_CHAIN_RUST_ADVISORIES passed with refreshed advisory data licenses ok SUPPLY_CHAIN_RUST_LICENSES passed bun audit v1.4.2 (744846f84) cookie@0.6.0 workspace:@infraternal/web > @sveltejs/kit > cookie low: cookie accepts cookie name, path, and domain with out of bounds characters (<0.7.0) - https://github.com/advisories/GHSA-pxg6-pf52-xh8x 1 vulnerability (1 low) bun audit fix upgrade the vulnerable packages within their ranges bun audit fix --latest also cross major versions SUPPLY_CHAIN_BUN_AUDIT findings reported; this check is report-only SUPPLY_CHAIN_PASS Rust advisory/license checks complete; Bun findings are report-only PASS fast: supply-chain checks (9.381s) PASS fast: build web app (20.148s) PASS fast: cargo fmt --check (2.245s) PASS fast: cargo clippy (46.373s) PASS fast: cargo test (376.272s) PASS fast: svelte-check (22.736s) PASS fast: UI package svelte-check (6.475s) PASS fast: stream package typecheck (5.652s) PASS fast: Vitest (7.242s) PASS fast: UI package Vitest (25.483s) PASS fast: stream package Vitest (1.338s) PASS fast: OpenAPI and TypeScript client drift (60.459s) PASS fast: terminal TypeScript (2.656s) PASS fast: terminal Vitest (1.432s) ``` Production browser stress output quoted verbatim: ```text AUTH_REFRESH context=main page=main-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=main page=main-page-1 method=POST path=/api/v1/auth/refresh outcome=http_error status=401 AUTH_401 context=main page=main-page-1 method=POST path=/api/v1/auth/refresh access_token_id=none AUTH_REFRESH context=main page=main-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=main page=main-page-1 method=POST path=/api/v1/auth/refresh outcome=http_error status=401 AUTH_401 context=main page=main-page-1 method=POST path=/api/v1/auth/refresh access_token_id=none AUTH_REFRESH context=main page=main-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=main page=main-page-1 method=POST path=/api/v1/auth/refresh outcome=http_error status=401 AUTH_401 context=main page=main-page-1 method=POST path=/api/v1/auth/refresh access_token_id=none AUTH_REFRESH context=main page=main-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=main page=main-page-1 method=POST path=/api/v1/auth/refresh outcome=http_error status=401 AUTH_401 context=main page=main-page-1 method=POST path=/api/v1/auth/refresh access_token_id=none AUTH_REFRESH context=main page=main-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=main page=main-page-1 method=POST path=/api/v1/auth/refresh outcome=http_error status=401 AUTH_401 context=main page=main-page-1 method=POST path=/api/v1/auth/refresh access_token_id=none AUTH_SIGNOUT context=main page=main-page-1 method=POST path=/api/v1/auth/signout outcome=request AUTH_SIGNOUT context=main page=main-page-1 method=POST path=/api/v1/auth/signout outcome=success status=200 AUTH_REFRESH context=main page=main-page-3 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=main page=main-page-3 method=POST path=/api/v1/auth/refresh outcome=success status=200 PASS multi-tab supported: simultaneous tabs (1 refresh HTTP request) AUTH_REFRESH context=main page=main-page-4 method=POST path=/api/v1/auth/refresh outcome=request AUTH_SIGNOUT context=main page=main-page-1 method=POST path=/api/v1/auth/signout outcome=request AUTH_SIGNOUT context=main page=main-page-1 method=POST path=/api/v1/auth/signout outcome=success status=200 AUTH_REFRESH context=main page=main-page-4 method=POST path=/api/v1/auth/refresh outcome=success status=200 PASS multi-tab sign-out: pending refresh response cannot restore tab B AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_401 context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=GET path=/api/v1/containers access_token_id=t_01M41FPZAX9MR4812Z6XQGTGD6 AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_401 context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=GET path=/api/v1/containers access_token_id=t_01M41FQ1G5D64SPCA1GZTSRCYA AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 PASS multi-tab locks-only: one notice per tab and sequential stale-access recovery AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_401 context=multi-tab-neither page=multi-tab-neither-page-1 method=GET path=/api/v1/containers access_token_id=t_01M41FQ3QNJC2QEGZ9NVSRANV9 AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_401 context=multi-tab-neither page=multi-tab-neither-page-2 method=GET path=/api/v1/containers access_token_id=t_01M41FQ5B5KB8CRNBWHK7A37HY AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 PASS multi-tab neither: one notice per tab and sequential stale-access recovery AUTH_REFRESH context=main page=main-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=main page=main-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 PASS multi-tab repetition=1/30 AUTH_REFRESH context=main page=main-page-6 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=main page=main-page-6 method=POST path=/api/v1/auth/refresh outcome=success status=200 PASS multi-tab supported: simultaneous tabs (1 refresh HTTP request) AUTH_REFRESH context=main page=main-page-7 method=POST path=/api/v1/auth/refresh outcome=request AUTH_SIGNOUT context=main page=main-page-1 method=POST path=/api/v1/auth/signout outcome=request AUTH_SIGNOUT context=main page=main-page-1 method=POST path=/api/v1/auth/signout outcome=success status=200 AUTH_REFRESH context=main page=main-page-7 method=POST path=/api/v1/auth/refresh outcome=success status=200 PASS multi-tab sign-out: pending refresh response cannot restore tab B AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_401 context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=GET path=/api/v1/containers access_token_id=t_01M41FQCVQ4R44V0FHR8NDX8QJ AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_401 context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=GET path=/api/v1/containers access_token_id=t_01M41FQDYFK9DWJJV58TDEDM8E AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 PASS multi-tab locks-only: one notice per tab and sequential stale-access recovery AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_401 context=multi-tab-neither page=multi-tab-neither-page-1 method=GET path=/api/v1/containers access_token_id=t_01M41FQH2P6HPRA7CQRP5TGHVK AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_401 context=multi-tab-neither page=multi-tab-neither-page-2 method=GET path=/api/v1/containers access_token_id=t_01M41FQJX4JRED7TVA3YEJPSTA PASS multi-tab neither: one notice per tab and sequential stale-access recovery AUTH_REFRESH context=main page=main-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=main page=main-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 PASS multi-tab repetition=2/30 AUTH_REFRESH context=main page=main-page-8 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=main page=main-page-8 method=POST path=/api/v1/auth/refresh outcome=success status=200 PASS multi-tab supported: simultaneous tabs (1 refresh HTTP request) AUTH_REFRESH context=main page=main-page-10 method=POST path=/api/v1/auth/refresh outcome=request AUTH_SIGNOUT context=main page=main-page-1 method=POST path=/api/v1/auth/signout outcome=request AUTH_SIGNOUT context=main page=main-page-1 method=POST path=/api/v1/auth/signout outcome=success status=200 AUTH_REFRESH context=main page=main-page-10 method=POST path=/api/v1/auth/refresh outcome=success status=200 PASS multi-tab sign-out: pending refresh response cannot restore tab B AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_401 context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=GET path=/api/v1/containers access_token_id=t_01M41FQSFH0XXP5E8HNXY8N6SJ AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_401 context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=GET path=/api/v1/containers access_token_id=t_01M41FQV1G4DPWQBFJVXFWNBAE AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 PASS multi-tab locks-only: one notice per tab and sequential stale-access recovery AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_401 context=multi-tab-neither page=multi-tab-neither-page-1 method=GET path=/api/v1/containers access_token_id=t_01M41FQZ0N0K4P5HEE2VWCS794 AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_401 context=multi-tab-neither page=multi-tab-neither-page-2 method=GET path=/api/v1/containers access_token_id=t_01M41FR2WFHVFX1692J3NA9B7Q AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 PASS multi-tab neither: one notice per tab and sequential stale-access recovery AUTH_REFRESH context=main page=main-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=main page=main-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 PASS multi-tab repetition=3/30 AUTH_REFRESH context=main page=main-page-12 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=main page=main-page-12 method=POST path=/api/v1/auth/refresh outcome=success status=200 PASS multi-tab supported: simultaneous tabs (1 refresh HTTP request) AUTH_REFRESH context=main page=main-page-13 method=POST path=/api/v1/auth/refresh outcome=request AUTH_SIGNOUT context=main page=main-page-1 method=POST path=/api/v1/auth/signout outcome=request AUTH_SIGNOUT context=main page=main-page-1 method=POST path=/api/v1/auth/signout outcome=success status=200 AUTH_REFRESH context=main page=main-page-13 method=POST path=/api/v1/auth/refresh outcome=success status=200 PASS multi-tab sign-out: pending refresh response cannot restore tab B AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_401 context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=GET path=/api/v1/containers access_token_id=t_01M41FRJV0YHC6RZY3F9K9J067 AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_401 context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=GET path=/api/v1/containers access_token_id=t_01M41FRPD2F431G2VDZ2THEW08 AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 PASS multi-tab locks-only: one notice per tab and sequential stale-access recovery AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_401 context=multi-tab-neither page=multi-tab-neither-page-1 method=GET path=/api/v1/containers access_token_id=t_01M41FRV1CE1AYBABKNZ5HMQMZ AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_401 context=multi-tab-neither page=multi-tab-neither-page-2 method=GET path=/api/v1/containers access_token_id=t_01M41FRX3C87XK0V9PA95M25S1 AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 PASS multi-tab neither: one notice per tab and sequential stale-access recovery AUTH_REFRESH context=main page=main-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=main page=main-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 PASS multi-tab repetition=4/30 AUTH_REFRESH context=main page=main-page-14 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=main page=main-page-14 method=POST path=/api/v1/auth/refresh outcome=success status=200 PASS multi-tab supported: simultaneous tabs (1 refresh HTTP request) AUTH_REFRESH context=main page=main-page-16 method=POST path=/api/v1/auth/refresh outcome=request AUTH_SIGNOUT context=main page=main-page-1 method=POST path=/api/v1/auth/signout outcome=request AUTH_SIGNOUT context=main page=main-page-1 method=POST path=/api/v1/auth/signout outcome=success status=200 AUTH_REFRESH context=main page=main-page-16 method=POST path=/api/v1/auth/refresh outcome=success status=200 PASS multi-tab sign-out: pending refresh response cannot restore tab B AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_401 context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=GET path=/api/v1/containers access_token_id=t_01M41FS40NBAF0DE0N3ACSQR45 AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_401 context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=GET path=/api/v1/containers access_token_id=t_01M41FS52EG7JBGV7JRCTSH0BN AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 PASS multi-tab locks-only: one notice per tab and sequential stale-access recovery AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_401 context=multi-tab-neither page=multi-tab-neither-page-1 method=GET path=/api/v1/containers access_token_id=t_01M41FS76PE2TZSNQRKBJQF6TD AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_401 context=multi-tab-neither page=multi-tab-neither-page-2 method=GET path=/api/v1/containers access_token_id=t_01M41FS8W1VH90Q6GQSE3TJYDV AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 PASS multi-tab neither: one notice per tab and sequential stale-access recovery AUTH_REFRESH context=main page=main-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=main page=main-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 PASS multi-tab repetition=5/30 AUTH_REFRESH context=main page=main-page-18 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=main page=main-page-18 method=POST path=/api/v1/auth/refresh outcome=success status=200 PASS multi-tab supported: simultaneous tabs (1 refresh HTTP request) AUTH_REFRESH context=main page=main-page-19 method=POST path=/api/v1/auth/refresh outcome=request AUTH_SIGNOUT context=main page=main-page-1 method=POST path=/api/v1/auth/signout outcome=request AUTH_SIGNOUT context=main page=main-page-1 method=POST path=/api/v1/auth/signout outcome=success status=200 AUTH_REFRESH context=main page=main-page-19 method=POST path=/api/v1/auth/refresh outcome=success status=200 PASS multi-tab sign-out: pending refresh response cannot restore tab B AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_401 context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=GET path=/api/v1/containers access_token_id=t_01M41FSEPQZG320Z16NJNXKH6A AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_401 context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=GET path=/api/v1/containers access_token_id=t_01M41FSFKS8F628RC2ZHKCG2Q4 AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 PASS multi-tab locks-only: one notice per tab and sequential stale-access recovery AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_401 context=multi-tab-neither page=multi-tab-neither-page-1 method=GET path=/api/v1/containers access_token_id=t_01M41FSH1XAP5A453S03R123XF AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_401 context=multi-tab-neither page=multi-tab-neither-page-2 method=GET path=/api/v1/containers access_token_id=t_01M41FSHX5X7KR7NXMSEW662RV AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 PASS multi-tab neither: one notice per tab and sequential stale-access recovery AUTH_REFRESH context=main page=main-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=main page=main-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 PASS multi-tab repetition=6/30 AUTH_REFRESH context=main page=main-page-21 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=main page=main-page-21 method=POST path=/api/v1/auth/refresh outcome=success status=200 PASS multi-tab supported: simultaneous tabs (1 refresh HTTP request) AUTH_REFRESH context=main page=main-page-22 method=POST path=/api/v1/auth/refresh outcome=request AUTH_SIGNOUT context=main page=main-page-1 method=POST path=/api/v1/auth/signout outcome=request AUTH_SIGNOUT context=main page=main-page-1 method=POST path=/api/v1/auth/signout outcome=success status=200 AUTH_REFRESH context=main page=main-page-22 method=POST path=/api/v1/auth/refresh outcome=success status=200 PASS multi-tab sign-out: pending refresh response cannot restore tab B AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_401 context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=GET path=/api/v1/containers access_token_id=t_01M41FSPKNVHBH4J1FZQQJS5JM AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_401 context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=GET path=/api/v1/containers access_token_id=t_01M41FSQB80V374TW3RMZBR135 AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 PASS multi-tab locks-only: one notice per tab and sequential stale-access recovery AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_401 context=multi-tab-neither page=multi-tab-neither-page-1 method=GET path=/api/v1/containers access_token_id=t_01M41FSRYXF8N0GY22YGRQSWJK AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_401 context=multi-tab-neither page=multi-tab-neither-page-2 method=GET path=/api/v1/containers access_token_id=t_01M41FST0H1A93HWCWWKE4CR8X AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 PASS multi-tab neither: one notice per tab and sequential stale-access recovery AUTH_REFRESH context=main page=main-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=main page=main-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 PASS multi-tab repetition=7/30 AUTH_REFRESH context=main page=main-page-24 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=main page=main-page-24 method=POST path=/api/v1/auth/refresh outcome=success status=200 PASS multi-tab supported: simultaneous tabs (1 refresh HTTP request) AUTH_REFRESH context=main page=main-page-25 method=POST path=/api/v1/auth/refresh outcome=request AUTH_SIGNOUT context=main page=main-page-1 method=POST path=/api/v1/auth/signout outcome=request AUTH_SIGNOUT context=main page=main-page-1 method=POST path=/api/v1/auth/signout outcome=success status=200 AUTH_REFRESH context=main page=main-page-25 method=POST path=/api/v1/auth/refresh outcome=success status=200 PASS multi-tab sign-out: pending refresh response cannot restore tab B AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_401 context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=GET path=/api/v1/containers access_token_id=t_01M41FSZETY3HSKTG3DXZAA8YE AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_401 context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=GET path=/api/v1/containers access_token_id=t_01M41FT0JEK3WBYQQPW8DAP0H6 AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 PASS multi-tab locks-only: one notice per tab and sequential stale-access recovery AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_401 context=multi-tab-neither page=multi-tab-neither-page-2 method=GET path=/api/v1/containers access_token_id=t_01M41FT3A04ZK62ZC3PHY2GTT3 AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_401 context=multi-tab-neither page=multi-tab-neither-page-1 method=GET path=/api/v1/containers access_token_id=t_01M41FT4CRGMJKF9QAXT3HDB25 AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 PASS multi-tab neither: one notice per tab and sequential stale-access recovery AUTH_REFRESH context=main page=main-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=main page=main-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 PASS multi-tab repetition=8/30 AUTH_REFRESH context=main page=main-page-26 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=main page=main-page-26 method=POST path=/api/v1/auth/refresh outcome=success status=200 PASS multi-tab supported: simultaneous tabs (1 refresh HTTP request) AUTH_REFRESH context=main page=main-page-28 method=POST path=/api/v1/auth/refresh outcome=request AUTH_SIGNOUT context=main page=main-page-1 method=POST path=/api/v1/auth/signout outcome=request AUTH_SIGNOUT context=main page=main-page-1 method=POST path=/api/v1/auth/signout outcome=success status=200 AUTH_REFRESH context=main page=main-page-28 method=POST path=/api/v1/auth/refresh outcome=success status=200 PASS multi-tab sign-out: pending refresh response cannot restore tab B AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_401 context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=GET path=/api/v1/containers access_token_id=t_01M41FTAYY6SSJ9B9D4JT0437B AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_401 context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=GET path=/api/v1/containers access_token_id=t_01M41FTCDFX5NB7CTMSGKDCN85 AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 PASS multi-tab locks-only: one notice per tab and sequential stale-access recovery AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_401 context=multi-tab-neither page=multi-tab-neither-page-1 method=GET path=/api/v1/containers access_token_id=t_01M41FTEF42Y92Y657YP80NCAW AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_401 context=multi-tab-neither page=multi-tab-neither-page-2 method=GET path=/api/v1/containers access_token_id=t_01M41FTFVVZEZKJ2CPGZ4GETEC AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 PASS multi-tab neither: one notice per tab and sequential stale-access recovery AUTH_REFRESH context=main page=main-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=main page=main-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 PASS multi-tab repetition=9/30 AUTH_REFRESH context=main page=main-page-30 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=main page=main-page-30 method=POST path=/api/v1/auth/refresh outcome=success status=200 PASS multi-tab supported: simultaneous tabs (1 refresh HTTP request) AUTH_REFRESH context=main page=main-page-31 method=POST path=/api/v1/auth/refresh outcome=request AUTH_SIGNOUT context=main page=main-page-1 method=POST path=/api/v1/auth/signout outcome=request AUTH_SIGNOUT context=main page=main-page-1 method=POST path=/api/v1/auth/signout outcome=success status=200 AUTH_REFRESH context=main page=main-page-31 method=POST path=/api/v1/auth/refresh outcome=success status=200 PASS multi-tab sign-out: pending refresh response cannot restore tab B AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_401 context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=GET path=/api/v1/containers access_token_id=t_01M41FTPJZAFENEQY3A1KKX4V9 AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_401 context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=GET path=/api/v1/containers access_token_id=t_01M41FTQKS5J6GA574E3CABX5Z AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 PASS multi-tab locks-only: one notice per tab and sequential stale-access recovery AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_401 context=multi-tab-neither page=multi-tab-neither-page-1 method=GET path=/api/v1/containers access_token_id=t_01M41FTS6YQDFZMFKV66W8XK87 AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_401 context=multi-tab-neither page=multi-tab-neither-page-2 method=GET path=/api/v1/containers access_token_id=t_01M41FTT0PVJQ4KPPV9PD12WRC AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 PASS multi-tab neither: one notice per tab and sequential stale-access recovery AUTH_REFRESH context=main page=main-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=main page=main-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 PASS multi-tab repetition=10/30 AUTH_REFRESH context=main page=main-page-32 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=main page=main-page-32 method=POST path=/api/v1/auth/refresh outcome=success status=200 PASS multi-tab supported: simultaneous tabs (1 refresh HTTP request) AUTH_REFRESH context=main page=main-page-34 method=POST path=/api/v1/auth/refresh outcome=request AUTH_SIGNOUT context=main page=main-page-1 method=POST path=/api/v1/auth/signout outcome=request AUTH_SIGNOUT context=main page=main-page-1 method=POST path=/api/v1/auth/signout outcome=success status=200 AUTH_REFRESH context=main page=main-page-34 method=POST path=/api/v1/auth/refresh outcome=success status=200 PASS multi-tab sign-out: pending refresh response cannot restore tab B AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_401 context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=GET path=/api/v1/containers access_token_id=t_01M41FTZJ509STGZ9348XA2XAS AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_401 context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=GET path=/api/v1/containers access_token_id=t_01M41FV0D84NE8DVG2QXHPH712 AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 PASS multi-tab locks-only: one notice per tab and sequential stale-access recovery AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_401 context=multi-tab-neither page=multi-tab-neither-page-1 method=GET path=/api/v1/containers access_token_id=t_01M41FV1WPRT22FW37Q1QSFHNP AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_401 context=multi-tab-neither page=multi-tab-neither-page-2 method=GET path=/api/v1/containers access_token_id=t_01M41FV2Q0FSXJ3P6ZMTAH2RAQ AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 PASS multi-tab neither: one notice per tab and sequential stale-access recovery AUTH_REFRESH context=main page=main-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=main page=main-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 PASS multi-tab repetition=11/30 AUTH_REFRESH context=main page=main-page-36 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=main page=main-page-36 method=POST path=/api/v1/auth/refresh outcome=success status=200 PASS multi-tab supported: simultaneous tabs (1 refresh HTTP request) AUTH_REFRESH context=main page=main-page-37 method=POST path=/api/v1/auth/refresh outcome=request AUTH_SIGNOUT context=main page=main-page-1 method=POST path=/api/v1/auth/signout outcome=request AUTH_SIGNOUT context=main page=main-page-1 method=POST path=/api/v1/auth/signout outcome=success status=200 AUTH_REFRESH context=main page=main-page-37 method=POST path=/api/v1/auth/refresh outcome=success status=200 PASS multi-tab sign-out: pending refresh response cannot restore tab B AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_401 context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=GET path=/api/v1/containers access_token_id=t_01M41FV86FK2G29V70DGJFSVD3 AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_401 context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=GET path=/api/v1/containers access_token_id=t_01M41FV90KGFWGKEJ12863RSPQ AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 PASS multi-tab locks-only: one notice per tab and sequential stale-access recovery AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_401 context=multi-tab-neither page=multi-tab-neither-page-2 method=GET path=/api/v1/containers access_token_id=t_01M41FVAA08X4SX48JKQTF5P18 AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_401 context=multi-tab-neither page=multi-tab-neither-page-1 method=GET path=/api/v1/containers access_token_id=t_01M41FVB2A2AGNE5JZ3N1WXXVH AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 PASS multi-tab neither: one notice per tab and sequential stale-access recovery AUTH_REFRESH context=main page=main-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=main page=main-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 PASS multi-tab repetition=12/30 AUTH_REFRESH context=main page=main-page-39 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=main page=main-page-39 method=POST path=/api/v1/auth/refresh outcome=success status=200 PASS multi-tab supported: simultaneous tabs (1 refresh HTTP request) AUTH_REFRESH context=main page=main-page-40 method=POST path=/api/v1/auth/refresh outcome=request AUTH_SIGNOUT context=main page=main-page-1 method=POST path=/api/v1/auth/signout outcome=request AUTH_SIGNOUT context=main page=main-page-1 method=POST path=/api/v1/auth/signout outcome=success status=200 AUTH_REFRESH context=main page=main-page-40 method=POST path=/api/v1/auth/refresh outcome=success status=200 PASS multi-tab sign-out: pending refresh response cannot restore tab B AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_401 context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=GET path=/api/v1/containers access_token_id=t_01M41FVFTDNQ8QGS7T004P9S98 AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_401 context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=GET path=/api/v1/containers access_token_id=t_01M41FVGJEZ9EWN614QJDMEN8A AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 PASS multi-tab locks-only: one notice per tab and sequential stale-access recovery AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_401 context=multi-tab-neither page=multi-tab-neither-page-1 method=GET path=/api/v1/containers access_token_id=t_01M41FVJGEQ3HPBET86231QZ22 AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_401 context=multi-tab-neither page=multi-tab-neither-page-2 method=GET path=/api/v1/containers access_token_id=t_01M41FVKH6HJGJ16F34D2YNVH2 AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 PASS multi-tab neither: one notice per tab and sequential stale-access recovery AUTH_REFRESH context=main page=main-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=main page=main-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 PASS multi-tab repetition=13/30 AUTH_REFRESH context=main page=main-page-41 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=main page=main-page-41 method=POST path=/api/v1/auth/refresh outcome=success status=200 PASS multi-tab supported: simultaneous tabs (1 refresh HTTP request) AUTH_REFRESH context=main page=main-page-43 method=POST path=/api/v1/auth/refresh outcome=request AUTH_SIGNOUT context=main page=main-page-1 method=POST path=/api/v1/auth/signout outcome=request AUTH_SIGNOUT context=main page=main-page-1 method=POST path=/api/v1/auth/signout outcome=success status=200 AUTH_REFRESH context=main page=main-page-43 method=POST path=/api/v1/auth/refresh outcome=success status=200 PASS multi-tab sign-out: pending refresh response cannot restore tab B AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_401 context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=GET path=/api/v1/containers access_token_id=t_01M41FVSCZ15K2C1R0ZJFX7WZ5 AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_401 context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=GET path=/api/v1/containers access_token_id=t_01M41FVTDQXVEGB7PHDWSWDGBC AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 PASS multi-tab locks-only: one notice per tab and sequential stale-access recovery AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_401 context=multi-tab-neither page=multi-tab-neither-page-1 method=GET path=/api/v1/containers access_token_id=t_01M41FVW22700ZDWPCP2SZDWP8 AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_401 context=multi-tab-neither page=multi-tab-neither-page-2 method=GET path=/api/v1/containers access_token_id=t_01M41FVWZ9Y0BN1B6783S0XDDV AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 PASS multi-tab neither: one notice per tab and sequential stale-access recovery AUTH_REFRESH context=main page=main-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=main page=main-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 PASS multi-tab repetition=14/30 AUTH_REFRESH context=main page=main-page-44 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=main page=main-page-44 method=POST path=/api/v1/auth/refresh outcome=success status=200 PASS multi-tab supported: simultaneous tabs (1 refresh HTTP request) AUTH_REFRESH context=main page=main-page-46 method=POST path=/api/v1/auth/refresh outcome=request AUTH_SIGNOUT context=main page=main-page-1 method=POST path=/api/v1/auth/signout outcome=request AUTH_SIGNOUT context=main page=main-page-1 method=POST path=/api/v1/auth/signout outcome=success status=200 AUTH_REFRESH context=main page=main-page-46 method=POST path=/api/v1/auth/refresh outcome=success status=200 PASS multi-tab sign-out: pending refresh response cannot restore tab B AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_401 context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=GET path=/api/v1/containers access_token_id=t_01M41FW39Q54KRVKF488W222M3 AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_401 context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=GET path=/api/v1/containers access_token_id=t_01M41FW4ABTC3D4C5X4KK9N15Y AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 PASS multi-tab locks-only: one notice per tab and sequential stale-access recovery AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_401 context=multi-tab-neither page=multi-tab-neither-page-2 method=GET path=/api/v1/containers access_token_id=t_01M41FW66V0VABSX1RFPHMR74E AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_401 context=multi-tab-neither page=multi-tab-neither-page-1 method=GET path=/api/v1/containers access_token_id=t_01M41FW7EAYVYP4SW7DSFTZXTQ AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 PASS multi-tab neither: one notice per tab and sequential stale-access recovery AUTH_REFRESH context=main page=main-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=main page=main-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 PASS multi-tab repetition=15/30 AUTH_REFRESH context=main page=main-page-47 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=main page=main-page-47 method=POST path=/api/v1/auth/refresh outcome=success status=200 PASS multi-tab supported: simultaneous tabs (1 refresh HTTP request) AUTH_REFRESH context=main page=main-page-49 method=POST path=/api/v1/auth/refresh outcome=request AUTH_SIGNOUT context=main page=main-page-1 method=POST path=/api/v1/auth/signout outcome=request AUTH_SIGNOUT context=main page=main-page-1 method=POST path=/api/v1/auth/signout outcome=success status=200 AUTH_REFRESH context=main page=main-page-49 method=POST path=/api/v1/auth/refresh outcome=success status=200 PASS multi-tab sign-out: pending refresh response cannot restore tab B AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_401 context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=GET path=/api/v1/containers access_token_id=t_01M41FWCVHVPP9RK4QBV7GRY35 AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_401 context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=GET path=/api/v1/containers access_token_id=t_01M41FWE3PKQTSJ9HGEH027M36 AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 PASS multi-tab locks-only: one notice per tab and sequential stale-access recovery AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_401 context=multi-tab-neither page=multi-tab-neither-page-1 method=GET path=/api/v1/containers access_token_id=t_01M41FWGBEEY3SSE3HD6B6Q9N8 AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_401 context=multi-tab-neither page=multi-tab-neither-page-2 method=GET path=/api/v1/containers access_token_id=t_01M41FWH9AA83BB7RNJREC8YZQ AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 PASS multi-tab neither: one notice per tab and sequential stale-access recovery AUTH_REFRESH context=main page=main-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=main page=main-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 PASS multi-tab repetition=16/30 AUTH_REFRESH context=main page=main-page-51 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=main page=main-page-51 method=POST path=/api/v1/auth/refresh outcome=success status=200 PASS multi-tab supported: simultaneous tabs (1 refresh HTTP request) AUTH_REFRESH context=main page=main-page-52 method=POST path=/api/v1/auth/refresh outcome=request AUTH_SIGNOUT context=main page=main-page-1 method=POST path=/api/v1/auth/signout outcome=request AUTH_SIGNOUT context=main page=main-page-1 method=POST path=/api/v1/auth/signout outcome=success status=200 AUTH_REFRESH context=main page=main-page-52 method=POST path=/api/v1/auth/refresh outcome=success status=200 PASS multi-tab sign-out: pending refresh response cannot restore tab B AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_401 context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=GET path=/api/v1/containers access_token_id=t_01M41FWQ6BMVCX0EJ5E5DY1JKX AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_401 context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=GET path=/api/v1/containers access_token_id=t_01M41FWR6HYCCNG22J6G4W5YQG AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 PASS multi-tab locks-only: one notice per tab and sequential stale-access recovery AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_401 context=multi-tab-neither page=multi-tab-neither-page-1 method=GET path=/api/v1/containers access_token_id=t_01M41FWT6VAW1G7G9SYKPH89NE AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_401 context=multi-tab-neither page=multi-tab-neither-page-2 method=GET path=/api/v1/containers access_token_id=t_01M41FWVJ2T0C8TNNH3SJTJSDJ AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 PASS multi-tab neither: one notice per tab and sequential stale-access recovery AUTH_REFRESH context=main page=main-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=main page=main-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 PASS multi-tab repetition=17/30 AUTH_REFRESH context=main page=main-page-53 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=main page=main-page-53 method=POST path=/api/v1/auth/refresh outcome=success status=200 PASS multi-tab supported: simultaneous tabs (1 refresh HTTP request) AUTH_REFRESH context=main page=main-page-55 method=POST path=/api/v1/auth/refresh outcome=request AUTH_SIGNOUT context=main page=main-page-1 method=POST path=/api/v1/auth/signout outcome=request AUTH_SIGNOUT context=main page=main-page-1 method=POST path=/api/v1/auth/signout outcome=success status=200 AUTH_REFRESH context=main page=main-page-55 method=POST path=/api/v1/auth/refresh outcome=success status=200 PASS multi-tab sign-out: pending refresh response cannot restore tab B AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_401 context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=GET path=/api/v1/containers access_token_id=t_01M41FX133JQBKFRTTC9BP2REV AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_401 context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=GET path=/api/v1/containers access_token_id=t_01M41FX26HK72QJB3KWD0T3VYC AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 PASS multi-tab locks-only: one notice per tab and sequential stale-access recovery AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_401 context=multi-tab-neither page=multi-tab-neither-page-1 method=GET path=/api/v1/containers access_token_id=t_01M41FX4D9VRN2AD2CCKCQJ2YK AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_401 context=multi-tab-neither page=multi-tab-neither-page-2 method=GET path=/api/v1/containers access_token_id=t_01M41FX5N8CXP227EK0VKT89W7 AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 PASS multi-tab neither: one notice per tab and sequential stale-access recovery AUTH_REFRESH context=main page=main-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=main page=main-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 PASS multi-tab repetition=18/30 AUTH_REFRESH context=main page=main-page-56 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=main page=main-page-56 method=POST path=/api/v1/auth/refresh outcome=success status=200 PASS multi-tab supported: simultaneous tabs (1 refresh HTTP request) AUTH_REFRESH context=main page=main-page-58 method=POST path=/api/v1/auth/refresh outcome=request AUTH_SIGNOUT context=main page=main-page-1 method=POST path=/api/v1/auth/signout outcome=request AUTH_SIGNOUT context=main page=main-page-1 method=POST path=/api/v1/auth/signout outcome=success status=200 AUTH_REFRESH context=main page=main-page-58 method=POST path=/api/v1/auth/refresh outcome=success status=200 PASS multi-tab sign-out: pending refresh response cannot restore tab B AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_401 context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=GET path=/api/v1/containers access_token_id=t_01M41FXC3BDFAR3Q96ZPKCSR8P AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_401 context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=GET path=/api/v1/containers access_token_id=t_01M41FXDD9MW3PVJYZK0NRFH0R AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 PASS multi-tab locks-only: one notice per tab and sequential stale-access recovery AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_401 context=multi-tab-neither page=multi-tab-neither-page-2 method=GET path=/api/v1/containers access_token_id=t_01M41FXFQTPF41T5F3QF27BWTV AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_401 context=multi-tab-neither page=multi-tab-neither-page-1 method=GET path=/api/v1/containers access_token_id=t_01M41FXHXRQFZDVJQVYP2DXYA2 AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 PASS multi-tab neither: one notice per tab and sequential stale-access recovery AUTH_REFRESH context=main page=main-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=main page=main-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 PASS multi-tab repetition=19/30 AUTH_REFRESH context=main page=main-page-60 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=main page=main-page-60 method=POST path=/api/v1/auth/refresh outcome=success status=200 PASS multi-tab supported: simultaneous tabs (1 refresh HTTP request) AUTH_REFRESH context=main page=main-page-61 method=POST path=/api/v1/auth/refresh outcome=request AUTH_SIGNOUT context=main page=main-page-1 method=POST path=/api/v1/auth/signout outcome=request AUTH_SIGNOUT context=main page=main-page-1 method=POST path=/api/v1/auth/signout outcome=success status=200 AUTH_REFRESH context=main page=main-page-61 method=POST path=/api/v1/auth/refresh outcome=success status=200 PASS multi-tab sign-out: pending refresh response cannot restore tab B AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_401 context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=GET path=/api/v1/containers access_token_id=t_01M41FXRTT4GEHYDSFZ65KYR0Q AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_401 context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=GET path=/api/v1/containers access_token_id=t_01M41FXTPT4BT7BZXA4200C1TR AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 PASS multi-tab locks-only: one notice per tab and sequential stale-access recovery AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_401 context=multi-tab-neither page=multi-tab-neither-page-1 method=GET path=/api/v1/containers access_token_id=t_01M41FXX3EBRFPG42K5E40TN2J AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_401 context=multi-tab-neither page=multi-tab-neither-page-2 method=GET path=/api/v1/containers access_token_id=t_01M41FXYERAWJCKRXZ6DEF6MSQ AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 PASS multi-tab neither: one notice per tab and sequential stale-access recovery AUTH_REFRESH context=main page=main-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=main page=main-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 PASS multi-tab repetition=20/30 AUTH_REFRESH context=main page=main-page-63 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=main page=main-page-63 method=POST path=/api/v1/auth/refresh outcome=success status=200 PASS multi-tab supported: simultaneous tabs (1 refresh HTTP request) AUTH_REFRESH context=main page=main-page-64 method=POST path=/api/v1/auth/refresh outcome=request AUTH_SIGNOUT context=main page=main-page-1 method=POST path=/api/v1/auth/signout outcome=request AUTH_SIGNOUT context=main page=main-page-1 method=POST path=/api/v1/auth/signout outcome=success status=200 AUTH_REFRESH context=main page=main-page-64 method=POST path=/api/v1/auth/refresh outcome=success status=200 PASS multi-tab sign-out: pending refresh response cannot restore tab B AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_401 context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=GET path=/api/v1/containers access_token_id=t_01M41FY444CPPX8V6MYWRV6W1Z AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_401 context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=GET path=/api/v1/containers access_token_id=t_01M41FY54N759MN837ZMS29SK3 AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 PASS multi-tab locks-only: one notice per tab and sequential stale-access recovery AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_401 context=multi-tab-neither page=multi-tab-neither-page-1 method=GET path=/api/v1/containers access_token_id=t_01M41FY895PNMG19XHPCY44RQV AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_401 context=multi-tab-neither page=multi-tab-neither-page-2 method=GET path=/api/v1/containers access_token_id=t_01M41FYB25NVV78X31WMCNDGQP AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 PASS multi-tab neither: one notice per tab and sequential stale-access recovery AUTH_REFRESH context=main page=main-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=main page=main-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 PASS multi-tab repetition=21/30 AUTH_REFRESH context=main page=main-page-66 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=main page=main-page-66 method=POST path=/api/v1/auth/refresh outcome=success status=200 PASS multi-tab supported: simultaneous tabs (1 refresh HTTP request) AUTH_REFRESH context=main page=main-page-67 method=POST path=/api/v1/auth/refresh outcome=request AUTH_SIGNOUT context=main page=main-page-1 method=POST path=/api/v1/auth/signout outcome=request AUTH_SIGNOUT context=main page=main-page-1 method=POST path=/api/v1/auth/signout outcome=success status=200 AUTH_REFRESH context=main page=main-page-67 method=POST path=/api/v1/auth/refresh outcome=success status=200 PASS multi-tab sign-out: pending refresh response cannot restore tab B AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_401 context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=GET path=/api/v1/containers access_token_id=t_01M41FYNFPE4A49MTC847X8QVQ AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_401 context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=GET path=/api/v1/containers access_token_id=t_01M41FYQHTXTYQMCB2RWZRKJ71 AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 PASS multi-tab locks-only: one notice per tab and sequential stale-access recovery AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_401 context=multi-tab-neither page=multi-tab-neither-page-1 method=GET path=/api/v1/containers access_token_id=t_01M41FYT2EXA961WZ3GR96MJ2A AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_401 context=multi-tab-neither page=multi-tab-neither-page-2 method=GET path=/api/v1/containers access_token_id=t_01M41FYTZTYTPW9V4FBKCTCTVE AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 PASS multi-tab neither: one notice per tab and sequential stale-access recovery AUTH_REFRESH context=main page=main-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=main page=main-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 PASS multi-tab repetition=22/30 AUTH_REFRESH context=main page=main-page-69 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=main page=main-page-69 method=POST path=/api/v1/auth/refresh outcome=success status=200 PASS multi-tab supported: simultaneous tabs (1 refresh HTTP request) AUTH_REFRESH context=main page=main-page-70 method=POST path=/api/v1/auth/refresh outcome=request AUTH_SIGNOUT context=main page=main-page-1 method=POST path=/api/v1/auth/signout outcome=request AUTH_SIGNOUT context=main page=main-page-1 method=POST path=/api/v1/auth/signout outcome=success status=200 AUTH_REFRESH context=main page=main-page-70 method=POST path=/api/v1/auth/refresh outcome=success status=200 PASS multi-tab sign-out: pending refresh response cannot restore tab B AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_401 context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=GET path=/api/v1/containers access_token_id=t_01M41FZ0VHAZ035DA51J4HCS6X AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_401 context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=GET path=/api/v1/containers access_token_id=t_01M41FZ1VZT8BGXE8J186E64NH AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 PASS multi-tab locks-only: one notice per tab and sequential stale-access recovery AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_401 context=multi-tab-neither page=multi-tab-neither-page-1 method=GET path=/api/v1/containers access_token_id=t_01M41FZ3TAB3CVN28N11163VZ3 AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_401 context=multi-tab-neither page=multi-tab-neither-page-2 method=GET path=/api/v1/containers access_token_id=t_01M41FZ4YE2G7PCCAQYSZD9YWA AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 PASS multi-tab neither: one notice per tab and sequential stale-access recovery AUTH_REFRESH context=main page=main-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=main page=main-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 PASS multi-tab repetition=23/30 AUTH_REFRESH context=main page=main-page-72 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=main page=main-page-72 method=POST path=/api/v1/auth/refresh outcome=success status=200 PASS multi-tab supported: simultaneous tabs (1 refresh HTTP request) AUTH_REFRESH context=main page=main-page-73 method=POST path=/api/v1/auth/refresh outcome=request AUTH_SIGNOUT context=main page=main-page-1 method=POST path=/api/v1/auth/signout outcome=request AUTH_SIGNOUT context=main page=main-page-1 method=POST path=/api/v1/auth/signout outcome=success status=200 AUTH_REFRESH context=main page=main-page-73 method=POST path=/api/v1/auth/refresh outcome=success status=200 PASS multi-tab sign-out: pending refresh response cannot restore tab B AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_401 context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=GET path=/api/v1/containers access_token_id=t_01M41FZAER7QNA8N40H1CB9KVG AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_401 context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=GET path=/api/v1/containers access_token_id=t_01M41FZBHREFACPCVY5ZBVN574 AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 PASS multi-tab locks-only: one notice per tab and sequential stale-access recovery AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_401 context=multi-tab-neither page=multi-tab-neither-page-1 method=GET path=/api/v1/containers access_token_id=t_01M41FZD7CRFB4KJDV42PPWXSE AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_401 context=multi-tab-neither page=multi-tab-neither-page-2 method=GET path=/api/v1/containers access_token_id=t_01M41FZEA2RJ812J4JH8SJM3M3 AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 PASS multi-tab neither: one notice per tab and sequential stale-access recovery AUTH_REFRESH context=main page=main-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=main page=main-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 PASS multi-tab repetition=24/30 AUTH_REFRESH context=main page=main-page-74 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=main page=main-page-74 method=POST path=/api/v1/auth/refresh outcome=success status=200 PASS multi-tab supported: simultaneous tabs (1 refresh HTTP request) AUTH_REFRESH context=main page=main-page-76 method=POST path=/api/v1/auth/refresh outcome=request AUTH_SIGNOUT context=main page=main-page-1 method=POST path=/api/v1/auth/signout outcome=request AUTH_SIGNOUT context=main page=main-page-1 method=POST path=/api/v1/auth/signout outcome=success status=200 AUTH_REFRESH context=main page=main-page-76 method=POST path=/api/v1/auth/refresh outcome=success status=200 PASS multi-tab sign-out: pending refresh response cannot restore tab B AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_401 context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=GET path=/api/v1/containers access_token_id=t_01M41FZMDDHP06VP6GNNY96XHX AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_401 context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=GET path=/api/v1/containers access_token_id=t_01M41FZNB04P3A2C8R9HJ45VAM AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 PASS multi-tab locks-only: one notice per tab and sequential stale-access recovery AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_401 context=multi-tab-neither page=multi-tab-neither-page-2 method=GET path=/api/v1/containers access_token_id=t_01M41FZQ00GR0QTKGSPXRAR6YT AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_401 context=multi-tab-neither page=multi-tab-neither-page-1 method=GET path=/api/v1/containers access_token_id=t_01M41FZR3GVZRX9KPZAR9E2DCR AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 PASS multi-tab neither: one notice per tab and sequential stale-access recovery AUTH_REFRESH context=main page=main-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=main page=main-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 PASS multi-tab repetition=25/30 AUTH_REFRESH context=main page=main-page-78 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=main page=main-page-78 method=POST path=/api/v1/auth/refresh outcome=success status=200 PASS multi-tab supported: simultaneous tabs (1 refresh HTTP request) AUTH_REFRESH context=main page=main-page-79 method=POST path=/api/v1/auth/refresh outcome=request AUTH_SIGNOUT context=main page=main-page-1 method=POST path=/api/v1/auth/signout outcome=request AUTH_SIGNOUT context=main page=main-page-1 method=POST path=/api/v1/auth/signout outcome=success status=200 AUTH_REFRESH context=main page=main-page-79 method=POST path=/api/v1/auth/refresh outcome=success status=200 PASS multi-tab sign-out: pending refresh response cannot restore tab B AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_401 context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=GET path=/api/v1/containers access_token_id=t_01M41FZX3DGF08H4RZ9NCRTJB3 AUTH_401 context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=GET path=/api/v1/containers access_token_id=t_01M41FZXXVP20M1MWWNDT024F6 AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 PASS multi-tab locks-only: one notice per tab and sequential stale-access recovery AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_401 context=multi-tab-neither page=multi-tab-neither-page-1 method=GET path=/api/v1/containers access_token_id=t_01M41FZZY68P8C6F1PYHWZ0KY6 AUTH_401 context=multi-tab-neither page=multi-tab-neither-page-2 method=GET path=/api/v1/containers access_token_id=t_01M41G011PNK4TT8H5HZWNGQFC AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 PASS multi-tab neither: one notice per tab and sequential stale-access recovery AUTH_REFRESH context=main page=main-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=main page=main-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 PASS multi-tab repetition=26/30 AUTH_REFRESH context=main page=main-page-81 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=main page=main-page-81 method=POST path=/api/v1/auth/refresh outcome=success status=200 PASS multi-tab supported: simultaneous tabs (1 refresh HTTP request) AUTH_REFRESH context=main page=main-page-82 method=POST path=/api/v1/auth/refresh outcome=request AUTH_SIGNOUT context=main page=main-page-1 method=POST path=/api/v1/auth/signout outcome=request AUTH_SIGNOUT context=main page=main-page-1 method=POST path=/api/v1/auth/signout outcome=success status=200 AUTH_REFRESH context=main page=main-page-82 method=POST path=/api/v1/auth/refresh outcome=success status=200 PASS multi-tab sign-out: pending refresh response cannot restore tab B AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_401 context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=GET path=/api/v1/containers access_token_id=t_01M41G06HR333WY798YF3DYVX0 AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_401 context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=GET path=/api/v1/containers access_token_id=t_01M41G07G5GFA84XZFQW32ZBB5 AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 PASS multi-tab locks-only: one notice per tab and sequential stale-access recovery AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_401 context=multi-tab-neither page=multi-tab-neither-page-1 method=GET path=/api/v1/containers access_token_id=t_01M41G09EAS3RAW2VS3V4QCMDT AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_401 context=multi-tab-neither page=multi-tab-neither-page-2 method=GET path=/api/v1/containers access_token_id=t_01M41G0AE172CJPGRJT00CYMV4 AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 PASS multi-tab neither: one notice per tab and sequential stale-access recovery AUTH_REFRESH context=main page=main-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=main page=main-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 PASS multi-tab repetition=27/30 AUTH_REFRESH context=main page=main-page-84 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=main page=main-page-84 method=POST path=/api/v1/auth/refresh outcome=success status=200 PASS multi-tab supported: simultaneous tabs (1 refresh HTTP request) AUTH_REFRESH context=main page=main-page-85 method=POST path=/api/v1/auth/refresh outcome=request AUTH_SIGNOUT context=main page=main-page-1 method=POST path=/api/v1/auth/signout outcome=request AUTH_SIGNOUT context=main page=main-page-1 method=POST path=/api/v1/auth/signout outcome=success status=200 AUTH_REFRESH context=main page=main-page-85 method=POST path=/api/v1/auth/refresh outcome=success status=200 PASS multi-tab sign-out: pending refresh response cannot restore tab B AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_401 context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=GET path=/api/v1/containers access_token_id=t_01M41G0GEPBHT9AXHW7SJHW8VM AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_401 context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=GET path=/api/v1/containers access_token_id=t_01M41G0HPP3MVMPP26JHCM6HM4 AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 PASS multi-tab locks-only: one notice per tab and sequential stale-access recovery AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_401 context=multi-tab-neither page=multi-tab-neither-page-1 method=GET path=/api/v1/containers access_token_id=t_01M41G0KJ3QVZ5Y5EVQEGTTF62 AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_401 context=multi-tab-neither page=multi-tab-neither-page-2 method=GET path=/api/v1/containers access_token_id=t_01M41G0MSVJZNSHSY6GZ6GKKC0 AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 PASS multi-tab neither: one notice per tab and sequential stale-access recovery AUTH_REFRESH context=main page=main-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=main page=main-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 PASS multi-tab repetition=28/30 AUTH_REFRESH context=main page=main-page-87 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=main page=main-page-87 method=POST path=/api/v1/auth/refresh outcome=success status=200 PASS multi-tab supported: simultaneous tabs (1 refresh HTTP request) AUTH_REFRESH context=main page=main-page-88 method=POST path=/api/v1/auth/refresh outcome=request AUTH_SIGNOUT context=main page=main-page-1 method=POST path=/api/v1/auth/signout outcome=request AUTH_SIGNOUT context=main page=main-page-1 method=POST path=/api/v1/auth/signout outcome=success status=200 AUTH_REFRESH context=main page=main-page-88 method=POST path=/api/v1/auth/refresh outcome=success status=200 PASS multi-tab sign-out: pending refresh response cannot restore tab B AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_401 context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=GET path=/api/v1/containers access_token_id=t_01M41G0YS2QFQ87H5VPVT2WKRD AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_401 context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=GET path=/api/v1/containers access_token_id=t_01M41G0ZXAVSG2V60HY7N6RR04 AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 PASS multi-tab locks-only: one notice per tab and sequential stale-access recovery AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_401 context=multi-tab-neither page=multi-tab-neither-page-1 method=GET path=/api/v1/containers access_token_id=t_01M41G12T4KKZJ415ZHFBWBJGC AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_401 context=multi-tab-neither page=multi-tab-neither-page-2 method=GET path=/api/v1/containers access_token_id=t_01M41G140F3Q8RBXG1S17MWPBF AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 PASS multi-tab neither: one notice per tab and sequential stale-access recovery AUTH_REFRESH context=main page=main-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=main page=main-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 PASS multi-tab repetition=29/30 AUTH_REFRESH context=main page=main-page-89 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=main page=main-page-89 method=POST path=/api/v1/auth/refresh outcome=success status=200 PASS multi-tab supported: simultaneous tabs (1 refresh HTTP request) AUTH_REFRESH context=main page=main-page-91 method=POST path=/api/v1/auth/refresh outcome=request AUTH_SIGNOUT context=main page=main-page-1 method=POST path=/api/v1/auth/signout outcome=request AUTH_SIGNOUT context=main page=main-page-1 method=POST path=/api/v1/auth/signout outcome=success status=200 AUTH_REFRESH context=main page=main-page-91 method=POST path=/api/v1/auth/refresh outcome=success status=200 PASS multi-tab sign-out: pending refresh response cannot restore tab B AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_401 context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=GET path=/api/v1/containers access_token_id=t_01M41G19YGWXR2AFB9VTRVMWVZ AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_401 context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=GET path=/api/v1/containers access_token_id=t_01M41G1B7T8DAQP6CDM7NRAB7Z AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-locks-only page=multi-tab-locks-only-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 PASS multi-tab locks-only: one notice per tab and sequential stale-access recovery AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_401 context=multi-tab-neither page=multi-tab-neither-page-1 method=GET path=/api/v1/containers access_token_id=t_01M41G1DPY4GXB6SED1HXM8R67 AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=multi-tab-neither page=multi-tab-neither-page-2 method=POST path=/api/v1/auth/refresh outcome=success status=200 AUTH_401 context=multi-tab-neither page=multi-tab-neither-page-2 method=GET path=/api/v1/containers access_token_id=t_01M41G1F15DR0S0ETME7N6YQ97 PASS multi-tab neither: one notice per tab and sequential stale-access recovery AUTH_REFRESH context=main page=main-page-1 method=POST path=/api/v1/auth/refresh outcome=request AUTH_REFRESH context=main page=main-page-1 method=POST path=/api/v1/auth/refresh outcome=success status=200 PASS multi-tab repetition=30/30 ``` CPU load output quoted verbatim: ```text stress-ng: info: [1445830] defaulting to a 1 day run per stressor stress-ng: info: [1445830] dispatching hogs: 8 cpu stress-ng: info: [1445830] skipped: 0 stress-ng: info: [1445830] passed: 8: cpu (8) stress-ng: info: [1445830] failed: 0 stress-ng: info: [1445830] metrics untrustworthy: 0 stress-ng: info: [1445830] successful run completed in 5 mins, 57.38 secs ``` Artifacts: /mnt/hdd/infraternal/artifacts/verify/multitab-refresh/{fast,stress,stress-ng,auth-regressions,browser}.log. Desktop (1440x900) and mobile (390x844) screenshots: /mnt/hdd/infraternal/artifacts/verify/multitab-refresh-stress/browser/. Inspected signed-in supported desktop/mobile and unsupported mobile notice; no visual source changes. Applied UI rules: preserve shared primitives/tokens and existing accessible notice/live-region behavior; verify native production browser behavior at desktop/mobile sizes. The change does not add motion or styling. Mapping to calternal-port: carry over signed-in-or-eligible-pending broadcast adoption, credential-generation baseline, and epoch fences after awaits. Preserve its session_request sharing and BFCache reload logic. Its cold-start historical-generation/250ms-peer timeout must remain distinct from a rotation completed during this recovery; blindly applying the no-fallthrough rule to historical storage would strand cold tabs. Native-lock/shared-cookie regressions apply; adapt new shell locators. Owner Safari/iOS checklist (no simulator used): 1. Open two tabs alongside an idle signed-in tab; trigger concurrent stale access recovery and confirm all remain signed in. 2. Sign out while another tab has refresh pending; confirm it stays signed out. 3. At phone width, confirm the unsupported-mode notice wraps without clipping.
Author
Owner

Starting batch3 integration. Branch: batch3. Base head: f0bf5fa. Sole writer; integrating fix-sessions-pty, multitab-refresh, fix-scale-podman, cli-mcp-actions, embedded-list-registry in that order. Clippy after each merge; workspace, real-runtime, SDP audit and fast verification at the end. No push.

Starting batch3 integration. Branch: batch3. Base head: f0bf5fa. Sole writer; integrating fix-sessions-pty, multitab-refresh, fix-scale-podman, cli-mcp-actions, embedded-list-registry in that order. Clippy after each merge; workspace, real-runtime, SDP audit and fast verification at the end. No push.
Author
Owner

Fast gate passed at 51cb880. Workspace tests, auth Vitest, frontend checks and generated API drift all passed. Full real-service integration now running.

WARN load5=11.31 exceeds online CPU count=8; timing-sensitive checks may be delayed
PASS fast: migrations are append-only (0.149s)
PASS fast: workspace package dependencies (0.303s)
PASS fast: JavaScript dependencies (0.051s)
PASS fast: advisory review policy tests (0.172s)
SUPPLY_CHAIN_REVIEWS advisory exceptions are within their review windows
SUPPLY_CHAIN cargo-deny: cargo-deny 0.20.2
SUPPLY_CHAIN_NOTICES generated THIRD_PARTY_NOTICES.md from 95 frontend packages
SUPPLY_CHAIN_NOTICES copied source: 179 shadcn files, 3 calternal-derived files
SUPPLY_CHAIN_NOTICES license files: 66 distinct texts; 0 packages need manual license review
advisories ok
SUPPLY_CHAIN_RUST_ADVISORIES passed with refreshed advisory data
licenses ok
SUPPLY_CHAIN_RUST_LICENSES passed
bun audit v1.4.2 (744846f84)

cookie@0.6.0
  workspace:@infraternal/web > @sveltejs/kit > cookie
  low: cookie accepts cookie name, path, and domain with out of bounds characters (<0.7.0) - https://github.com/advisories/GHSA-pxg6-pf52-xh8x

1 vulnerability (1 low)

  bun audit fix           upgrade the vulnerable packages within their ranges
  bun audit fix --latest  also cross major versions
SUPPLY_CHAIN_BUN_AUDIT findings reported; this check is report-only
SUPPLY_CHAIN_PASS Rust advisory/license checks complete; Bun findings are report-only
PASS fast: supply-chain checks (4.078s)
PASS fast: build web app (12.332s)
PASS fast: cargo fmt --check (1.221s)
PASS fast: cargo clippy (13.464s)
PASS fast: cargo test (132.804s)
PASS fast: svelte-check (15.774s)
PASS fast: UI package svelte-check (4.663s)
PASS fast: stream package typecheck (4.028s)
PASS fast: Vitest (3.170s)
PASS fast: UI package Vitest (9.980s)
PASS fast: stream package Vitest (0.779s)
PASS fast: OpenAPI and TypeScript client drift (27.981s)
PASS fast: terminal TypeScript (1.780s)
PASS fast: terminal Vitest (1.042s)
Fast gate passed at 51cb880. Workspace tests, auth Vitest, frontend checks and generated API drift all passed. Full real-service integration now running. ```text WARN load5=11.31 exceeds online CPU count=8; timing-sensitive checks may be delayed PASS fast: migrations are append-only (0.149s) PASS fast: workspace package dependencies (0.303s) PASS fast: JavaScript dependencies (0.051s) PASS fast: advisory review policy tests (0.172s) SUPPLY_CHAIN_REVIEWS advisory exceptions are within their review windows SUPPLY_CHAIN cargo-deny: cargo-deny 0.20.2 SUPPLY_CHAIN_NOTICES generated THIRD_PARTY_NOTICES.md from 95 frontend packages SUPPLY_CHAIN_NOTICES copied source: 179 shadcn files, 3 calternal-derived files SUPPLY_CHAIN_NOTICES license files: 66 distinct texts; 0 packages need manual license review advisories ok SUPPLY_CHAIN_RUST_ADVISORIES passed with refreshed advisory data licenses ok SUPPLY_CHAIN_RUST_LICENSES passed bun audit v1.4.2 (744846f84) cookie@0.6.0 workspace:@infraternal/web > @sveltejs/kit > cookie low: cookie accepts cookie name, path, and domain with out of bounds characters (<0.7.0) - https://github.com/advisories/GHSA-pxg6-pf52-xh8x 1 vulnerability (1 low) bun audit fix upgrade the vulnerable packages within their ranges bun audit fix --latest also cross major versions SUPPLY_CHAIN_BUN_AUDIT findings reported; this check is report-only SUPPLY_CHAIN_PASS Rust advisory/license checks complete; Bun findings are report-only PASS fast: supply-chain checks (4.078s) PASS fast: build web app (12.332s) PASS fast: cargo fmt --check (1.221s) PASS fast: cargo clippy (13.464s) PASS fast: cargo test (132.804s) PASS fast: svelte-check (15.774s) PASS fast: UI package svelte-check (4.663s) PASS fast: stream package typecheck (4.028s) PASS fast: Vitest (3.170s) PASS fast: UI package Vitest (9.980s) PASS fast: stream package Vitest (0.779s) PASS fast: OpenAPI and TypeScript client drift (27.981s) PASS fast: terminal TypeScript (1.780s) PASS fast: terminal Vitest (1.042s) ```
Author
Owner

Head ca3d71dab6: merge gate passed.

PASS fast: migrations are append-only (0.392s)
PASS fast: workspace package dependencies (0.434s)
PASS fast: JavaScript dependencies (0.019s)
PASS fast: advisory review policy tests (0.363s)
PASS fast: supply-chain checks (6.155s)
PASS fast: build web app (15.203s)
PASS fast: cargo fmt --check (1.287s)
PASS fast: cargo clippy (20.376s)
PASS fast: cargo test (153.453s)
PASS fast: svelte-check (10.587s)
PASS fast: UI package svelte-check (5.783s)
PASS fast: stream package typecheck (6.435s)
PASS fast: Vitest (5.022s)
PASS fast: UI package Vitest (13.797s)
PASS fast: stream package Vitest (1.016s)
PASS fast: OpenAPI and TypeScript client drift (1.407s)
PASS fast: terminal TypeScript (2.210s)
PASS fast: terminal Vitest (1.216s)
PASS merge: build release binary (484.041s)
PASS merge: release server HTTP and static behavior (0.542s)
PASS merge: Docker socket _ping (0.010s)
PASS merge: rootless Podman socket _ping (0.009s)
PASS merge: Docker exec PTY smoke (1.043s)
PASS merge: rootless Podman inventory and lifecycle smoke (1.395s)
PASS merge: real sshd session ownership smoke (0.704s)
PASS merge: persistent-session authorization-loss security smoke (1.717s)
PASS merge: install Chromium and system dependencies (2.238s)
PASS multi-tab supported: simultaneous tabs (1 refresh HTTP request)
PASS multi-tab sign-out: pending refresh response cannot restore tab B
PASS multi-tab locks-only: one notice per tab and sequential stale-access recovery
PASS multi-tab neither: one notice per tab and sequential stale-access recovery
PASS multi-tab repetition=1/1
PASS merge: production browser smoke (10.718s)

Production-browser screenshots, desktop and 390×844: /mnt/hdd/infraternal/artifacts/verify/batch3-merge-final/browser/.

Head ca3d71dab6adea876890bb8905c6998b15d764b3: merge gate passed. ``` PASS fast: migrations are append-only (0.392s) PASS fast: workspace package dependencies (0.434s) PASS fast: JavaScript dependencies (0.019s) PASS fast: advisory review policy tests (0.363s) PASS fast: supply-chain checks (6.155s) PASS fast: build web app (15.203s) PASS fast: cargo fmt --check (1.287s) PASS fast: cargo clippy (20.376s) PASS fast: cargo test (153.453s) PASS fast: svelte-check (10.587s) PASS fast: UI package svelte-check (5.783s) PASS fast: stream package typecheck (6.435s) PASS fast: Vitest (5.022s) PASS fast: UI package Vitest (13.797s) PASS fast: stream package Vitest (1.016s) PASS fast: OpenAPI and TypeScript client drift (1.407s) PASS fast: terminal TypeScript (2.210s) PASS fast: terminal Vitest (1.216s) PASS merge: build release binary (484.041s) PASS merge: release server HTTP and static behavior (0.542s) PASS merge: Docker socket _ping (0.010s) PASS merge: rootless Podman socket _ping (0.009s) PASS merge: Docker exec PTY smoke (1.043s) PASS merge: rootless Podman inventory and lifecycle smoke (1.395s) PASS merge: real sshd session ownership smoke (0.704s) PASS merge: persistent-session authorization-loss security smoke (1.717s) PASS merge: install Chromium and system dependencies (2.238s) PASS multi-tab supported: simultaneous tabs (1 refresh HTTP request) PASS multi-tab sign-out: pending refresh response cannot restore tab B PASS multi-tab locks-only: one notice per tab and sequential stale-access recovery PASS multi-tab neither: one notice per tab and sequential stale-access recovery PASS multi-tab repetition=1/1 PASS merge: production browser smoke (10.718s) ``` Production-browser screenshots, desktop and 390×844: /mnt/hdd/infraternal/artifacts/verify/batch3-merge-final/browser/.
Author
Owner

Batch3 integration complete

Head: 66b4eafe5b. Branch: batch3. Base: f0bf5fa. No push; issues remain open.

Branch Incoming head Merge commit Clippy after merge
fix-sessions-pty c509e6f c5a833e PASS
multitab-refresh e650051 5c461a2 PASS
fix-scale-podman 3cff6e4 d7d1d05 PASS
cli-mcp-actions 1f2dac9 acb0e9e PASS
embedded-list-registry 2a627b8 638706d PASS

Batch3 integration conflict notes

  1. fix-sessions-pty: e2e/remote/README.md and operations.ts conflicted. Retained SSH changed-key/revocation and scope-denial rows/imports; added persistent DELETE row and CLI PTY import. First Clippy attempts blocked by sccache incremental policy and missing embedded bundle; disabled wrapper and built locked web dependencies.

  2. multitab-refresh: clean textual merge; auth implementation, Vitest tests, browser-check and verify changes retained. Clippy passed.

  3. fix-scale-podman: eight conflicts, all overlapping Rust 1.99 empty-value assertions already fixed differently on dev. Kept dev typed-empty-array assertions and existing security regression additions; preserved bounded collector, independent Podman discovery, coalesced invalidations and true resync-gap semantics.

  4. cli-mcp-actions: six conflicted files. Kept dev assertion fixes, added the incoming server-tail/follow regression, and used the incoming tested MSRV-compatible atomic compare-exchange helper at both admission sites. Removed superseded deprecation comments/allowances. Retained scale event semantics and existing security tests.

  5. embedded-list-registry: resolved 24 conflicted paths, including facade modify/delete conflicts. Removed the engine facade and server LocalInventory; moved the bounded event-batch primitive plus four regressions to crates/agent/src/provider_runtime/event_batch.rs. Kept scale ordinary invalidation vs true gap semantics, while forwarding each compact notice into the new bounded runtime ring. Native actor-less events now invalidate normally instead of fabricating a gap. Retained the new event normalization and adapted the existing secret-redaction regression to the provider envelope. Kept remote SSH directives, ownership, identity-stop deadlines, tunnel controls, confirmed/absent DELETE acknowledgements, CLI tail/follow tests, and dev assertion fixes. Adapted security sweep fixtures to LocalHost + HostRouter. Removed legacy RemoteInventory-only tests with that removed path; registry tests/real audit check cover the replacement. Preserved native collector table, updated provider and remote SSH contract text. Clippy caught duplicate imports and stale API/facade references; fixed them without restoring the old path.

Integration fixes beyond the merges:

  • 51cb880: compact-ring test admits two ordinary notices before injecting actual overflow.
  • 1939d36: real stream fixtures wait for exact inventory readiness before OPEN or dispatch failure injection; authorization and cleanup deadlines stay unchanged.
  • ca3d71d: failed/incomplete bounded scans retry after one second on the same native feed, including idle initial and post-resync failure. Healthy feeds do not poll or construct a timer. Seventeen provider-runtime tests and thirteen real stream regressions pass. docs/contracts.md records the policy.
  • 714fa1e: HTTP readiness helper retains typed ApiError responses, allowing the existing 200/503 readiness polling to run without decoding an error as a container list.
  • 66b4eaf: serialize real-client scenarios and isolate their temporary credential config paths; four combined CLI/MCP tests pass in one process.

Validation on final head:

  • Required INFRATERNAL_VERIFY_RUN_ID=batch3 scripts/verify fast: PASS. Cargo fmt, Clippy, workspace tests, frontend typechecks, auth Vitest, generated OpenAPI/TypeScript-client drift and terminal checks pass.
  • scripts/verify integration: PASS on 66b4eaf.
  • scripts/verify merge: PASS on 66b4eaf.
  • Full e2e-remote parity: 60/60 PASS, 0 expected failures, cleanup_errors=[].
  • SDP audit: 13/13 PASS, cleanup completed. Both embedded and enrolled remote Docker/Podman paths; server-applied tail+follow; successful DELETE confirms native shell is gone and attached stream closes; DOCKER_HOST points to Docker while Podman stays independent; all 305 exact native IDs appear through both APIs and compiled CLIs for each engine.

Parity and SDP evidence used ca3d71d production code. Diff ca3d71d..66b4eaf changes only crates/server/tests/resources_http.rs and crates/infraternal/tests/cli_mcp.rs, so the production code is identical.

Additional real tests: provider-podman/real 3 PASS (rootful, rootless, DOCKER_HOST isolation); provider-docker/real 1 PASS; provider_real 2 PASS (signed parity/reconnect and 305-container remote-runtime burst); real_sshd 15 PASS; ssh_product 4 PASS; agent_tunnel with Docker+liveness 1 PASS; remote_ssh 1 PASS.

Evidence:

  • Gate logs and additional test logs: /mnt/hdd/infraternal/artifacts/verify/batch3/.
  • SDP runner and JSON: /mnt/hdd/infraternal/artifacts/verify/batch3/audit-final/.
  • Parity report: /mnt/hdd/infraternal/artifacts/verify/batch3-parity-recovery/e2e/remote-batch3-parity-recovery/report.json.
  • Final-head browser screenshots: /mnt/hdd/infraternal/artifacts/verify/batch3-merge-final-head/browser/ (desktop and 390×844).

Failed runs are retained in batch3-integration, batch3-integration-final, batch3-integration-recovery, batch3-integration-complete and batch3-remote artifact directories. They exposed startup-readiness races, idle-feed scan recovery, and test-fixture collisions corrected above. An embedded Podman inventory deadline and a persistent SSH replay exit deadline did not recur in targeted or full rechecks; their precise causes were not proven, and no deadlines or expected-failure policy were relaxed. Successful CLI schema validation prints caught alternate-schema assertion panics; its actual test result is 4 passed, 0 failed.

Measurements here are dev-VM diagnostics, not a new performance-VM A/B certification. Existing low cookie advisory remains report-only under repository policy. All commits carry the requested trailers. No generated caches, benchmark data, credentials or secrets were committed.

Working tree is clean; the temporary target symlink was removed. All five incoming heads are ancestors of HEAD; all ten first-parent integration commits have the requested trailers. No push and no issues closed.

Successful per-merge Clippy output tails (command: RUSTC_WRAPPER= CARGO_INCREMENTAL=0 cargo clippy --workspace --all-targets -- -D warnings):

fix-sessions-pty:

    Finished `dev` profile [unoptimized] target(s) in 30.91s

multitab-refresh:

    Finished `dev` profile [unoptimized] target(s) in 0.50s

fix-scale-podman:

    Finished `dev` profile [unoptimized] target(s) in 30.36s

cli-mcp-actions:

    Finished `dev` profile [unoptimized] target(s) in 28.41s

embedded-list-registry:

    Finished `dev` profile [unoptimized] target(s) in 0.90s

Required fast gate, output excerpt quoted verbatim:

PASS fast: migrations are append-only (0.183s)
PASS fast: workspace package dependencies (0.250s)
PASS fast: JavaScript dependencies (0.008s)
PASS fast: advisory review policy tests (0.148s)
PASS fast: supply-chain checks (3.638s)
PASS fast: build web app (12.021s)
PASS fast: cargo fmt --check (1.330s)
PASS fast: cargo clippy (9.893s)
PASS fast: cargo test (125.899s)
PASS fast: svelte-check (11.027s)
PASS fast: UI package svelte-check (6.179s)
PASS fast: stream package typecheck (4.224s)
PASS fast: Vitest (3.813s)
PASS fast: UI package Vitest (12.130s)
PASS fast: stream package Vitest (1.283s)
PASS fast: OpenAPI and TypeScript client drift (28.547s)
PASS fast: terminal TypeScript (3.611s)
PASS fast: terminal Vitest (1.734s)

Full integration gate, output excerpt quoted verbatim:

PASS integration: JavaScript dependencies (0.004s)
PASS integration: build web app (11.925s)
PASS integration: build release binary (357.443s)
PASS integration: real HTTP behavior (0.614s)
PASS integration: Docker socket _ping (0.013s)
PASS integration: rootless Podman socket _ping (0.012s)
PASS integration: engine adapters against Docker and Podman (242.678s)
PASS integration: bounded follow:false log snapshots against Docker and rootless Podman (12.838s)
PASS integration: TypeScript stream client against Docker and Podman (21.608s)
PASS integration: stream authorization and CLOSE regressions against Docker (90.307s)
PASS integration: persistent PTY termination preempts blocked send (1.621s)
PASS integration: resource HTTP API against Docker and rootless Podman (35.306s)
PASS integration: compiled CLI and MCP against real server and engines (130.818s)
PASS integration: SSH contract against isolated real sshd (14.658s)
PASS integration: SSH product API and stream against isolated real sshd (16.169s)
PASS integration: remote mTLS infraternal agent enroll, rotate, list, exec and revoke against Docker (23.978s)
PASS integration: remote SSH through the mTLS tunnel against isolated real sshd (4.103s)

Merge gate, output excerpt quoted verbatim:

PASS merge: build release binary (306.344s)
PASS merge: release server HTTP and static behavior (0.467s)
PASS merge: Docker socket _ping (0.009s)
PASS merge: rootless Podman socket _ping (0.009s)
PASS merge: Docker exec PTY smoke (1.129s)
PASS merge: rootless Podman inventory and lifecycle smoke (3.289s)
PASS merge: real sshd session ownership smoke (0.850s)
PASS merge: persistent-session authorization-loss security smoke (1.889s)
PASS merge: install Chromium and system dependencies (2.936s)
PASS merge: production browser smoke (10.512s)

Browser evidence inspected at both sizes: desktop, 390×844.

Batch3 integration complete Head: 66b4eafe5bc7cc13d0b57570708dd762a3d01da0. Branch: batch3. Base: f0bf5fa. No push; issues remain open. | Branch | Incoming head | Merge commit | Clippy after merge | | --- | --- | --- | --- | | fix-sessions-pty | c509e6f | c5a833e | PASS | | multitab-refresh | e650051 | 5c461a2 | PASS | | fix-scale-podman | 3cff6e4 | d7d1d05 | PASS | | cli-mcp-actions | 1f2dac9 | acb0e9e | PASS | | embedded-list-registry | 2a627b8 | 638706d | PASS | Batch3 integration conflict notes 1. fix-sessions-pty: e2e/remote/README.md and operations.ts conflicted. Retained SSH changed-key/revocation and scope-denial rows/imports; added persistent DELETE row and CLI PTY import. First Clippy attempts blocked by sccache incremental policy and missing embedded bundle; disabled wrapper and built locked web dependencies. 2. multitab-refresh: clean textual merge; auth implementation, Vitest tests, browser-check and verify changes retained. Clippy passed. 3. fix-scale-podman: eight conflicts, all overlapping Rust 1.99 empty-value assertions already fixed differently on dev. Kept dev typed-empty-array assertions and existing security regression additions; preserved bounded collector, independent Podman discovery, coalesced invalidations and true resync-gap semantics. 4. cli-mcp-actions: six conflicted files. Kept dev assertion fixes, added the incoming server-tail/follow regression, and used the incoming tested MSRV-compatible atomic compare-exchange helper at both admission sites. Removed superseded deprecation comments/allowances. Retained scale event semantics and existing security tests. 5. embedded-list-registry: resolved 24 conflicted paths, including facade modify/delete conflicts. Removed the engine facade and server LocalInventory; moved the bounded event-batch primitive plus four regressions to crates/agent/src/provider_runtime/event_batch.rs. Kept scale ordinary invalidation vs true gap semantics, while forwarding each compact notice into the new bounded runtime ring. Native actor-less events now invalidate normally instead of fabricating a gap. Retained the new event normalization and adapted the existing secret-redaction regression to the provider envelope. Kept remote SSH directives, ownership, identity-stop deadlines, tunnel controls, confirmed/absent DELETE acknowledgements, CLI tail/follow tests, and dev assertion fixes. Adapted security sweep fixtures to LocalHost + HostRouter. Removed legacy RemoteInventory-only tests with that removed path; registry tests/real audit check cover the replacement. Preserved native collector table, updated provider and remote SSH contract text. Clippy caught duplicate imports and stale API/facade references; fixed them without restoring the old path. Integration fixes beyond the merges: - 51cb880: compact-ring test admits two ordinary notices before injecting actual overflow. - 1939d36: real stream fixtures wait for exact inventory readiness before OPEN or dispatch failure injection; authorization and cleanup deadlines stay unchanged. - ca3d71d: failed/incomplete bounded scans retry after one second on the same native feed, including idle initial and post-resync failure. Healthy feeds do not poll or construct a timer. Seventeen provider-runtime tests and thirteen real stream regressions pass. docs/contracts.md records the policy. - 714fa1e: HTTP readiness helper retains typed ApiError responses, allowing the existing 200/503 readiness polling to run without decoding an error as a container list. - 66b4eaf: serialize real-client scenarios and isolate their temporary credential config paths; four combined CLI/MCP tests pass in one process. Validation on final head: - Required INFRATERNAL_VERIFY_RUN_ID=batch3 scripts/verify fast: PASS. Cargo fmt, Clippy, workspace tests, frontend typechecks, auth Vitest, generated OpenAPI/TypeScript-client drift and terminal checks pass. - scripts/verify integration: PASS on 66b4eaf. - scripts/verify merge: PASS on 66b4eaf. - Full e2e-remote parity: 60/60 PASS, 0 expected failures, cleanup_errors=[]. - SDP audit: 13/13 PASS, cleanup completed. Both embedded and enrolled remote Docker/Podman paths; server-applied tail+follow; successful DELETE confirms native shell is gone and attached stream closes; DOCKER_HOST points to Docker while Podman stays independent; all 305 exact native IDs appear through both APIs and compiled CLIs for each engine. Parity and SDP evidence used ca3d71d production code. Diff ca3d71d..66b4eaf changes only crates/server/tests/resources_http.rs and crates/infraternal/tests/cli_mcp.rs, so the production code is identical. Additional real tests: provider-podman/real 3 PASS (rootful, rootless, DOCKER_HOST isolation); provider-docker/real 1 PASS; provider_real 2 PASS (signed parity/reconnect and 305-container remote-runtime burst); real_sshd 15 PASS; ssh_product 4 PASS; agent_tunnel with Docker+liveness 1 PASS; remote_ssh 1 PASS. Evidence: - Gate logs and additional test logs: /mnt/hdd/infraternal/artifacts/verify/batch3/. - SDP runner and JSON: /mnt/hdd/infraternal/artifacts/verify/batch3/audit-final/. - Parity report: /mnt/hdd/infraternal/artifacts/verify/batch3-parity-recovery/e2e/remote-batch3-parity-recovery/report.json. - Final-head browser screenshots: /mnt/hdd/infraternal/artifacts/verify/batch3-merge-final-head/browser/ (desktop and 390×844). Failed runs are retained in batch3-integration, batch3-integration-final, batch3-integration-recovery, batch3-integration-complete and batch3-remote artifact directories. They exposed startup-readiness races, idle-feed scan recovery, and test-fixture collisions corrected above. An embedded Podman inventory deadline and a persistent SSH replay exit deadline did not recur in targeted or full rechecks; their precise causes were not proven, and no deadlines or expected-failure policy were relaxed. Successful CLI schema validation prints caught alternate-schema assertion panics; its actual test result is 4 passed, 0 failed. Measurements here are dev-VM diagnostics, not a new performance-VM A/B certification. Existing low cookie advisory remains report-only under repository policy. All commits carry the requested trailers. No generated caches, benchmark data, credentials or secrets were committed. Working tree is clean; the temporary target symlink was removed. All five incoming heads are ancestors of HEAD; all ten first-parent integration commits have the requested trailers. No push and no issues closed. Successful per-merge Clippy output tails (command: RUSTC_WRAPPER= CARGO_INCREMENTAL=0 cargo clippy --workspace --all-targets -- -D warnings): fix-sessions-pty: ``` Finished `dev` profile [unoptimized] target(s) in 30.91s ``` multitab-refresh: ``` Finished `dev` profile [unoptimized] target(s) in 0.50s ``` fix-scale-podman: ``` Finished `dev` profile [unoptimized] target(s) in 30.36s ``` cli-mcp-actions: ``` Finished `dev` profile [unoptimized] target(s) in 28.41s ``` embedded-list-registry: ``` Finished `dev` profile [unoptimized] target(s) in 0.90s ``` Required fast gate, output excerpt quoted verbatim: ``` PASS fast: migrations are append-only (0.183s) PASS fast: workspace package dependencies (0.250s) PASS fast: JavaScript dependencies (0.008s) PASS fast: advisory review policy tests (0.148s) PASS fast: supply-chain checks (3.638s) PASS fast: build web app (12.021s) PASS fast: cargo fmt --check (1.330s) PASS fast: cargo clippy (9.893s) PASS fast: cargo test (125.899s) PASS fast: svelte-check (11.027s) PASS fast: UI package svelte-check (6.179s) PASS fast: stream package typecheck (4.224s) PASS fast: Vitest (3.813s) PASS fast: UI package Vitest (12.130s) PASS fast: stream package Vitest (1.283s) PASS fast: OpenAPI and TypeScript client drift (28.547s) PASS fast: terminal TypeScript (3.611s) PASS fast: terminal Vitest (1.734s) ``` Full integration gate, output excerpt quoted verbatim: ``` PASS integration: JavaScript dependencies (0.004s) PASS integration: build web app (11.925s) PASS integration: build release binary (357.443s) PASS integration: real HTTP behavior (0.614s) PASS integration: Docker socket _ping (0.013s) PASS integration: rootless Podman socket _ping (0.012s) PASS integration: engine adapters against Docker and Podman (242.678s) PASS integration: bounded follow:false log snapshots against Docker and rootless Podman (12.838s) PASS integration: TypeScript stream client against Docker and Podman (21.608s) PASS integration: stream authorization and CLOSE regressions against Docker (90.307s) PASS integration: persistent PTY termination preempts blocked send (1.621s) PASS integration: resource HTTP API against Docker and rootless Podman (35.306s) PASS integration: compiled CLI and MCP against real server and engines (130.818s) PASS integration: SSH contract against isolated real sshd (14.658s) PASS integration: SSH product API and stream against isolated real sshd (16.169s) PASS integration: remote mTLS infraternal agent enroll, rotate, list, exec and revoke against Docker (23.978s) PASS integration: remote SSH through the mTLS tunnel against isolated real sshd (4.103s) ``` Merge gate, output excerpt quoted verbatim: ``` PASS merge: build release binary (306.344s) PASS merge: release server HTTP and static behavior (0.467s) PASS merge: Docker socket _ping (0.009s) PASS merge: rootless Podman socket _ping (0.009s) PASS merge: Docker exec PTY smoke (1.129s) PASS merge: rootless Podman inventory and lifecycle smoke (3.289s) PASS merge: real sshd session ownership smoke (0.850s) PASS merge: persistent-session authorization-loss security smoke (1.889s) PASS merge: install Chromium and system dependencies (2.936s) PASS merge: production browser smoke (10.512s) ``` Browser evidence inspected at both sizes: [desktop](/mnt/hdd/infraternal/artifacts/verify/batch3-merge-final-head/browser/multi-tab-supported-1440x900.png), [390×844](/mnt/hdd/infraternal/artifacts/verify/batch3-merge-final-head/browser/multi-tab-supported-390x844.png).
Author
Owner

Head 66b4eafe5b: completed report supplement.

Owner Safari/iOS checklist (Chromium production-browser smoke passed; AI jobs do not drive iOS Simulator):

  1. Keep two signed-in tabs open through access expiry; use either and confirm the idle tab continues authenticated.
  2. Trigger requests from both expired tabs. Where both coordination features are available, confirm one refresh request; otherwise confirm one notice per tab and recovery without a retry loop.
  3. Sign out while the other tab is refreshing; neither tab should return to a signed-in state.
Head 66b4eafe5bc7cc13d0b57570708dd762a3d01da0: completed report supplement. Owner Safari/iOS checklist (Chromium production-browser smoke passed; AI jobs do not drive iOS Simulator): 1. Keep two signed-in tabs open through access expiry; use either and confirm the idle tab continues authenticated. 2. Trigger requests from both expired tabs. Where both coordination features are available, confirm one refresh request; otherwise confirm one notice per tab and recovery without a retry loop. 3. Sign out while the other tab is refreshing; neither tab should return to a signed-in state.
Author
Owner

Starting read-mostly sdp-audit2 on detached origin/dev 2b405b3a92. Re-running every SSH/Docker/Podman flow and rough conditions on embedded and remote infraternal agents. One release binary; no product edits or pushes. Findings: /mnt/hdd/infraternal/jobs/sdp-audit2/findings.md. Corrected round-1 observers will be reused.

Starting read-mostly sdp-audit2 on detached origin/dev 2b405b3a926f0c8735d92e5e6ba445ce7c859364. Re-running every SSH/Docker/Podman flow and rough conditions on embedded and remote infraternal agents. One release binary; no product edits or pushes. Findings: /mnt/hdd/infraternal/jobs/sdp-audit2/findings.md. Corrected round-1 observers will be reused.
Author
Owner

Release binary at audited HEAD 2b405b3a92; product files unchanged. The explicit-binary rerun of scripts/verify e2e-remote passed all 60 cases in 78.014 s, with no expected failures. Remote SSH, both engines' streams, native persistent DELETE and revocation all pass. One release build, 562.419 s; initial gate binary-path defect documented separately. Extended CLI/MCP, 305-container, slow stop, long sessions and isolated fault tests are now running.

Verbatim gate output:

PASS e2e-remote: strict expected-failure and log-record observer tests (0.031s)
PASS e2e-remote: embedded and mTLS remote infraternal agent parity (78.014s)
Release binary at audited HEAD 2b405b3a926f0c8735d92e5e6ba445ce7c859364; product files unchanged. The explicit-binary rerun of `scripts/verify e2e-remote` passed all 60 cases in 78.014 s, with no expected failures. Remote SSH, both engines' streams, native persistent DELETE and revocation all pass. One release build, 562.419 s; initial gate binary-path defect documented separately. Extended CLI/MCP, 305-container, slow stop, long sessions and isolated fault tests are now running. Verbatim gate output: ``` PASS e2e-remote: strict expected-failure and log-record observer tests (0.031s) PASS e2e-remote: embedded and mTLS remote infraternal agent parity (78.014s) ```
Author
Owner

Live round-2 finding on unchanged 2b405b3: Docker and rootless Podman cold-start recovery failed on the three completed routing pairs (embedded Docker, embedded Podman, remote Docker; remote Podman running). An owned Unix passthrough exists but refuses connections during infraternal startup. After allowing it to connect to the real engine, a new native container is created through the same endpoint, labelled infraternal.test=sdp-audit2. After 30 s, the API inventory still omits that exact ID. Embedded paths keep HTTP 200 empty inventories; remote Docker transitions from 503 host_offline to HTTP 200 empty. This differs from engine API restart after successful discovery, which recovered on all four pairs. P0 core recovery gap; evidence rough-isolated.json and rough.ts cold recovery loop.

The 305-rootless-Podman test also made the remote host return 503 for both engines while its infraternal-agent process remained alive, with all 305 fixtures visible embedded. A controlled scale recheck is planned; later remote SSH/session errors in that run are treated as cascades, not independent product findings.

Live round-2 finding on unchanged 2b405b3: Docker and rootless Podman cold-start recovery failed on the three completed routing pairs (embedded Docker, embedded Podman, remote Docker; remote Podman running). An owned Unix passthrough exists but refuses connections during infraternal startup. After allowing it to connect to the real engine, a new native container is created through the same endpoint, labelled infraternal.test=sdp-audit2. After 30 s, the API inventory still omits that exact ID. Embedded paths keep HTTP 200 empty inventories; remote Docker transitions from 503 host_offline to HTTP 200 empty. This differs from engine API restart *after* successful discovery, which recovered on all four pairs. P0 core recovery gap; evidence rough-isolated.json and rough.ts cold recovery loop. The 305-rootless-Podman test also made the remote host return 503 for both engines while its infraternal-agent process remained alive, with all 305 fixtures visible embedded. A controlled scale recheck is planned; later remote SSH/session errors in that run are treated as cascades, not independent product findings.
Author
Owner

Round-2 findings on unchanged 2b405b3, release binary built once:

  • scripts/verify e2e-remote with explicit release binary: 60/60 pass. Remote SSH, stream parity and native session DELETE now work.
  • Slow stop through API, CLI and MCP passes on all four routing pairs: real 20-second TERM handler completes within 30-second grace before success.
  • Both owning infraternal agents' actual public SSH keys are installed/tested at shared sshd 127.0.0.1:2222 sshtarget; private sshd rotation, CLI real PTY/resize, replay, MCP existing SSH attach/send/read/close and revocation pass.
  • Same-process real tunnel drop/reconnect preserves SSH, Docker and Podman shells and replay; no session-survival claim is based on process restart.
  • P0: cold initially unavailable Docker/Podman endpoints do not recover all four routes after 30 seconds, despite native fixture creation succeeding through the now-working endpoint.
  • P0: remote availability still fails at 305 rootless Podman fixtures. Full mixed run loses remote workload/SSH availability. Independent scale run sees 305 on both APIs, then remote CLI returns host_offline and 0/305; fresh tunnel nonce observed, post-removal operations recover. Original control classifier omitted CLI failure; evidence and correction retained.
  • P0: cannot add a second SSH target owned by a remote infraternal agent; owner selector rejected HTTP 400 invalid_request, normal creation uses embedded public identity.
  • P1: plain CLI logs returns 3002 backlog records without --tail on all four pairs, contrary to approved 1000-line default. API explicit tail and CLI tail+follow pass.
  • P1: CLI cannot open/attach a persistent container exec session (--attach rejected exit 2); MCP only supports nonpersistent container_exec. MCP has existing SSH session attach/send/read but no fresh SSH open tool.
  • P1 verification: e2e-remote defaults to target/release despite CARGO_TARGET_DIR and hides spawn error behind readiness timeout; explicit binary selection passes with no rebuild.

Detailed findings and before/after synthesis: /mnt/hdd/infraternal/jobs/sdp-audit2/findings.md. Native fixture cleanup is recorded before finishing. No product files changed or pushed.

Round-2 findings on unchanged 2b405b3, release binary built once: - `scripts/verify e2e-remote` with explicit release binary: 60/60 pass. Remote SSH, stream parity and native session DELETE now work. - Slow stop through API, CLI and MCP passes on all four routing pairs: real 20-second TERM handler completes within 30-second grace before success. - Both owning infraternal agents' actual public SSH keys are installed/tested at shared sshd 127.0.0.1:2222 sshtarget; private sshd rotation, CLI real PTY/resize, replay, MCP existing SSH attach/send/read/close and revocation pass. - Same-process real tunnel drop/reconnect preserves SSH, Docker and Podman shells and replay; no session-survival claim is based on process restart. - P0: cold initially unavailable Docker/Podman endpoints do not recover all four routes after 30 seconds, despite native fixture creation succeeding through the now-working endpoint. - P0: remote availability still fails at 305 rootless Podman fixtures. Full mixed run loses remote workload/SSH availability. Independent scale run sees 305 on both APIs, then remote CLI returns host_offline and 0/305; fresh tunnel nonce observed, post-removal operations recover. Original control classifier omitted CLI failure; evidence and correction retained. - P0: cannot add a second SSH target owned by a remote infraternal agent; owner selector rejected HTTP 400 invalid_request, normal creation uses embedded public identity. - P1: plain CLI logs returns 3002 backlog records without --tail on all four pairs, contrary to approved 1000-line default. API explicit tail and CLI tail+follow pass. - P1: CLI cannot open/attach a persistent container exec session (`--attach` rejected exit 2); MCP only supports nonpersistent container_exec. MCP has existing SSH session attach/send/read but no fresh SSH open tool. - P1 verification: e2e-remote defaults to target/release despite CARGO_TARGET_DIR and hides spawn error behind readiness timeout; explicit binary selection passes with no rebuild. Detailed findings and before/after synthesis: /mnt/hdd/infraternal/jobs/sdp-audit2/findings.md. Native fixture cleanup is recorded before finishing. No product files changed or pushed.
Author
Owner

Completed read-mostly sdp-audit2 at unchanged detached origin/dev HEAD 2b405b3a92. No product edits/commits or pushes. One production release build, 562.419 s, nice 15 and three Cargo workers.

60/60 strict e2e-remote parity cases pass. Tonight's remote SSH, streams, native persistent DELETE, Docker scale and CLI tail-follow fixes are verified. API/CLI/MCP 20-second graceful stops within 30-second grace pass on all four routes; SSH/Docker/Podman persistent replay survives a same-process real tunnel outage.

Top ten scoped jobs: 3 P0, 6 P1, 1 P2 (one P1 is verification; product-only 3 P0, 5 P1, 1 P2):

  1. P0 cold engine discovery/connect recovery (all four routes remain unaware 30 s after native endpoint recovers).
  2. P0 intermittent remote availability loss at 305 rootless Podman containers (mixed run and independent remote CLI failure; final corrected repeat passes, so not universal).
  3. P0 add additional SSH targets with a chosen remote infraternal-agent owner (selector 400; ordinary host uses embedded key).
  4. P1 plain CLI default logs returns all 3002 records rather than default 1000.
  5. P1 CLI persistent container exec open/attach/resume.
  6. P1 MCP persistent container exec session operations.
  7. P1 MCP fresh SSH session open (existing attach/send/read/close already work).
  8. P1 selected unavailable engine must not appear as healthy empty inventory.
  9. P1 gate binary selection ignores CARGO_TARGET_DIR and hides spawn failure behind readiness timeout.
  10. P2 repetitive Linux credential-fallback notices (optional after core work).

Full before/after table, safe repro excerpts, suspected source locations, small job scopes and acceptance tests: /mnt/hdd/infraternal/jobs/sdp-audit2/findings.md. Original and corrected scale/outage observer evidence are retained; cascades and observer failures are not double-counted. Dev-VM times are diagnostic; no perf certification or full merge/nightly claim.

Verbatim successful gate output:

PASS e2e-remote: strict expected-failure and log-record observer tests (0.031s)
PASS e2e-remote: embedded and mTLS remote infraternal agent parity (78.014s)

Successful report: jobs/sdp-audit2/evidence/verify/sdp-audit2-release/e2e/remote-sdp-audit2-release/report.json. Explicit release binary supplied after the default-path harness failure, with no rebuild.

Cleanup verified: zero owned labelled Docker/Podman fixtures, zero owned services, zero private harness directories; unchanged HEAD and clean git status. Shared Docker/Podman services and demo containers were not action targets. Shared sshd owned public-key additions were removed; private SSH watchdog cleanup completed. Issues remain open.

Completed read-mostly sdp-audit2 at unchanged detached origin/dev HEAD **2b405b3a926f0c8735d92e5e6ba445ce7c859364**. No product edits/commits or pushes. One production release build, 562.419 s, nice 15 and three Cargo workers. **60/60 strict e2e-remote parity cases pass.** Tonight's remote SSH, streams, native persistent DELETE, Docker scale and CLI tail-follow fixes are verified. API/CLI/MCP 20-second graceful stops within 30-second grace pass on all four routes; SSH/Docker/Podman persistent replay survives a same-process real tunnel outage. **Top ten scoped jobs: 3 P0, 6 P1, 1 P2** (one P1 is verification; product-only 3 P0, 5 P1, 1 P2): 1. P0 cold engine discovery/connect recovery (all four routes remain unaware 30 s after native endpoint recovers). 2. P0 intermittent remote availability loss at 305 rootless Podman containers (mixed run and independent remote CLI failure; final corrected repeat passes, so not universal). 3. P0 add additional SSH targets with a chosen remote infraternal-agent owner (selector 400; ordinary host uses embedded key). 4. P1 plain CLI default logs returns all 3002 records rather than default 1000. 5. P1 CLI persistent container exec open/attach/resume. 6. P1 MCP persistent container exec session operations. 7. P1 MCP fresh SSH session open (existing attach/send/read/close already work). 8. P1 selected unavailable engine must not appear as healthy empty inventory. 9. P1 gate binary selection ignores CARGO_TARGET_DIR and hides spawn failure behind readiness timeout. 10. P2 repetitive Linux credential-fallback notices (optional after core work). Full before/after table, safe repro excerpts, suspected source locations, small job scopes and acceptance tests: `/mnt/hdd/infraternal/jobs/sdp-audit2/findings.md`. Original and corrected scale/outage observer evidence are retained; cascades and observer failures are not double-counted. Dev-VM times are diagnostic; no perf certification or full merge/nightly claim. Verbatim successful gate output: ``` PASS e2e-remote: strict expected-failure and log-record observer tests (0.031s) PASS e2e-remote: embedded and mTLS remote infraternal agent parity (78.014s) ``` Successful report: `jobs/sdp-audit2/evidence/verify/sdp-audit2-release/e2e/remote-sdp-audit2-release/report.json`. Explicit release binary supplied after the default-path harness failure, with no rebuild. Cleanup verified: zero owned labelled Docker/Podman fixtures, zero owned services, zero private harness directories; unchanged HEAD and clean git status. Shared Docker/Podman services and demo containers were not action targets. Shared sshd owned public-key additions were removed; private SSH watchdog cleanup completed. Issues remain open.
Author
Owner

Round-3 hands-on audit started. Worktree /mnt/hdd/infraternal/wt-lp/sdp-audit3, detached HEAD ea776ea7cb. No product code edits/commits/push. Reusing round-2 corrected API/CLI/MCP and fault harnesses; real embedded + remote Docker/Podman/SSH flows. One lean release build (nice 15, CARGO_BUILD_JOBS=3, preset target directory), followed by scripts/verify e2e-remote and read-mostly diagnostics. Findings: /mnt/hdd/infraternal/jobs/sdp-audit3/findings.md.

Round-3 hands-on audit started. Worktree /mnt/hdd/infraternal/wt-lp/sdp-audit3, detached HEAD ea776ea7cbe23972d4437a5338219d918bd9bb17. No product code edits/commits/push. Reusing round-2 corrected API/CLI/MCP and fault harnesses; real embedded + remote Docker/Podman/SSH flows. One lean release build (nice 15, CARGO_BUILD_JOBS=3, preset target directory), followed by scripts/verify e2e-remote and read-mostly diagnostics. Findings: /mnt/hdd/infraternal/jobs/sdp-audit3/findings.md.
Author
Owner

Round-3 audit finished at unchanged detached head ea776ea7cb. No product edits, commits or pushes.

Full report, round-2/round-3 flow table, exact repro/evidence, suspected files, regression assessment and ten scoped follow-ups:
/mnt/hdd/infraternal/jobs/sdp-audit3/findings.md
Readable summary: /mnt/hdd/infraternal/jobs/sdp-audit3/summary.md
Raw evidence and replay drivers remain in the same job directory.

Ranked fix-job counts: P0 3, P1 4, P2 2 (nine jobs; includes one P1 verification job). The tenth entry retains the historical unconfirmed close investigation and is excluded from current defect counts. Two intermittent P0 observations have unknown root causes and may overlap.

Top findings:

  1. P0: persistent immediate completion can miss OPEN_OK: raw API fails 3/4 routes; MCP initial open fails 4/4. Long-lived persistent shells work. Source suggests output/completion can win before queued initial attachment; this is an inference, not a patch claim.
  2. P0 intermittent: mixed availability gate remote Podman fixture discovery times out before the scale sweep; minimal/extended scale and an instrumented full mixed repeat pass. Original gate remains failed.
  3. P0 intermittent: four-user session OPEN times out after mixed scale; isolated identical concurrency passes. One traced close-sweep iteration also fails before DELETE; no common cause established.
  4. P1: remote live detached exec sessions falsely return exited in list/detail while native PID is alive and durable row is detached.
  5. P1: all 70 attached voluntary DELETE closes return forbidden despite native termination and retained permission. This was already present in round-2 raw evidence, not a new regression.
  6. P1: default native Podman journald/file-events follow refusal needs actionable classification; native snapshots work. Do not change shared host configuration.
  7. P1 verification: recurring parity needs immediate persistent completion, MCP final exit, remote live state and exact voluntary close reason.
  8. P2: plain CLI errors expose Rust debug formatting.
  9. P2: follow deadline copy incorrectly claims bounded snapshots do not exist.
  10. Historical investigation: known embedded Podman outcome_unknown/close_pending=1 not reproduced in 140 sweep iterations (80 E/P): 139 successful DELETEs, 79 E/P; one E/P WebSocket failure before DELETE. All successful closes prove native disappearance and close_pending=0. Not evidence the intermittent issue is fixed.

Full emitted provider cleanup traces and typed runtime diagnostics were captured for the second 70-iteration sweep; first sweep lacked provider stdout capture. Traces retain only inspected safe targets, bounded state/PID/timing/category fields; no credentials. See provider-traces.log and provider-http-timeline.jsonl.

Release binary built once successfully after supplying web assets, nice 15, three Cargo workers, preset target directory. Binary SHA-256: 213f3ee6f41d614beda2bedd7a1c48a27a8a99c3e8fef911b5178d37583a4819.

Verbatim scripts/verify e2e-remote output (exit 1):

PASS e2e-remote: strict expected-failure and log-record observer tests (0.027s)
PASS e2e-remote: embedded and mTLS remote infraternal agent parity (100.725s)
FAIL e2e-remote: cold engine recovery and 305-container availability (545.746s)

Parity 62/62; availability 5 pass / 1 fail. Diagnostic mixed repeat, not a replacement gate:

PASS availability/scale/305-inventories-and-churn

No newly confirmed regression of merged round-2 fixes. Cold recovery, typed unavailable engines, additional SSH target ownership, fresh MCP SSH, CLI persistent exec and 1000-line default snapshots work. Newly covered fast completion/remote state gaps cannot be dated from the round-2 evidence. This is not a merge or release certification; full merge/nightly/browser/perf-test-VM tiers were not run.

Cleanup verified: both real engine label queries exit 0, zero infraternal.test=sdp-audit3 containers; no owned services/private harness directories/fault data remain; shared sshd exact audit key lines removed. No demo action targets. Git status clean at the unchanged head. Issues remain open.

Round-3 audit finished at unchanged detached head ea776ea7cbe23972d4437a5338219d918bd9bb17. No product edits, commits or pushes. Full report, round-2/round-3 flow table, exact repro/evidence, suspected files, regression assessment and ten scoped follow-ups: /mnt/hdd/infraternal/jobs/sdp-audit3/findings.md Readable summary: /mnt/hdd/infraternal/jobs/sdp-audit3/summary.md Raw evidence and replay drivers remain in the same job directory. Ranked fix-job counts: P0 3, P1 4, P2 2 (nine jobs; includes one P1 verification job). The tenth entry retains the historical unconfirmed close investigation and is excluded from current defect counts. Two intermittent P0 observations have unknown root causes and may overlap. Top findings: 1. P0: persistent immediate completion can miss OPEN_OK: raw API fails 3/4 routes; MCP initial open fails 4/4. Long-lived persistent shells work. Source suggests output/completion can win before queued initial attachment; this is an inference, not a patch claim. 2. P0 intermittent: mixed availability gate remote Podman fixture discovery times out before the scale sweep; minimal/extended scale and an instrumented full mixed repeat pass. Original gate remains failed. 3. P0 intermittent: four-user session OPEN times out after mixed scale; isolated identical concurrency passes. One traced close-sweep iteration also fails before DELETE; no common cause established. 4. P1: remote live detached exec sessions falsely return exited in list/detail while native PID is alive and durable row is detached. 5. P1: all 70 attached voluntary DELETE closes return forbidden despite native termination and retained permission. This was already present in round-2 raw evidence, not a new regression. 6. P1: default native Podman journald/file-events follow refusal needs actionable classification; native snapshots work. Do not change shared host configuration. 7. P1 verification: recurring parity needs immediate persistent completion, MCP final exit, remote live state and exact voluntary close reason. 8. P2: plain CLI errors expose Rust debug formatting. 9. P2: follow deadline copy incorrectly claims bounded snapshots do not exist. 10. Historical investigation: known embedded Podman outcome_unknown/close_pending=1 not reproduced in 140 sweep iterations (80 E/P): 139 successful DELETEs, 79 E/P; one E/P WebSocket failure before DELETE. All successful closes prove native disappearance and close_pending=0. Not evidence the intermittent issue is fixed. Full emitted provider cleanup traces and typed runtime diagnostics were captured for the second 70-iteration sweep; first sweep lacked provider stdout capture. Traces retain only inspected safe targets, bounded state/PID/timing/category fields; no credentials. See provider-traces.log and provider-http-timeline.jsonl. Release binary built once successfully after supplying web assets, nice 15, three Cargo workers, preset target directory. Binary SHA-256: 213f3ee6f41d614beda2bedd7a1c48a27a8a99c3e8fef911b5178d37583a4819. Verbatim scripts/verify e2e-remote output (exit 1): ```text PASS e2e-remote: strict expected-failure and log-record observer tests (0.027s) PASS e2e-remote: embedded and mTLS remote infraternal agent parity (100.725s) FAIL e2e-remote: cold engine recovery and 305-container availability (545.746s) ``` Parity 62/62; availability 5 pass / 1 fail. Diagnostic mixed repeat, not a replacement gate: ```text PASS availability/scale/305-inventories-and-churn ``` No newly confirmed regression of merged round-2 fixes. Cold recovery, typed unavailable engines, additional SSH target ownership, fresh MCP SSH, CLI persistent exec and 1000-line default snapshots work. Newly covered fast completion/remote state gaps cannot be dated from the round-2 evidence. This is not a merge or release certification; full merge/nightly/browser/perf-test-VM tiers were not run. Cleanup verified: both real engine label queries exit 0, zero infraternal.test=sdp-audit3 containers; no owned services/private harness directories/fault data remain; shared sshd exact audit key lines removed. No demo action targets. Git status clean at the unchanged head. Issues remain open.
Commenting is not possible because the repository is archived.
No labels
No milestone
No project
No assignees
1 participant
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-v0#48
No description provided.