S1 auth: independent audit of discoverable sign-in and setup token #29
Closed
opened 2026-10-06 15:42:31 +00:00 by kayg
·
86 comments
No Branch/Tag specified
main
j470b-server-mesh-rejoin
mesh-compat-382
j444b-d381-key-wins-flood
j461b-macos-utun-reader-thread
j475b-remove-host-motion
fix-reconnect-new-link
j481-d380
dev
j479-mesh-soak
fix/j476-host-facts
j475-motion-pill-split
j470-mac-node-join
root-upgrade-d376
j474-review-merge
latency-targets-120hz
nightly-suite-shards
gotatun-pin-j469
macos-utun-reader-thread
fix-flood-echo-stall
wip/j416
motion-fast-ease-out
mesh-addhost-j259
takeover-close-terminals-d368
kbd-instant-followups
fix-trust-key-double-click
nightly-suite-partial-report
appwin-icons-j207
rusqlite-slice1
swipe-content-first-d374
mesh-mtu-381
addhost-instant-open
glass-contrast-d365-mock
glass-contrast-d365
signout-followups-442
fix-startup-toast-red
research-gotatun-matrix-j317
themes-sync-j304
fix-load-flakes
fix-nix-zig-patch
fix-compute01-browser-baseline
ratchet-size-baseline-419
predict-auto-d130
revoke-coverage-d367
nightly-suite-queue-timeout
nightly-browser-suite
fix-rustsec-2026-0459
fonts-ioskeley-obel
log-retention-d375
fix-kbd-no-anim-427
fix-dev-red-specs-2
takeover-proof-305-j205
wip/j410-server-pump
ui-consistency-d372
fix-osc52-clipboard
libghostty-vt-1.0
forget-retired-host-d369
j404-merge-426
fix-setup-lock-race
fix-touch-select-426
revoke-access-report-ui
fix-predictive-echo-specs
fix-selinux-agent-exec
wip/j395-checkpoint2
wip/j395
j391-review-scratch
ui-consistency-j195-deferred-rebased
fix-rustc-paths-421
decisions-wording-341
fix-install-suite-red
fix-dev-rtt-specs
fix-pending-removal-align
fix-privileged-skip
fix-install-suite-404
review-j368
mesh-dns-j254
revoke-access-report-d356b
revoke-privilege-round5
fix-removal-confirm
review-j360
gotatun-rotation-367
deps-refresh-340
review-j354
review-J351
review-j350
addhost-takeover-d359
revoke-report-items-347
revoke-end-sessions-d362
review-j348
size-mesh-ssh-346
size-trim-337
revoke-access-diff-d356
j259-pre-rebase-b06c5a6
j305-ended-at-start-spec
addhost-sudo-consent
fix-layout-real-specs-411
fix-shell-open-411
fix-console-hosts-373
fix-shell-exit
fuzz-host-name-353
fix-host-details-410
macos-filter-j197
research-gotatun-tricks
revoke-p3-j216l
stale-state-pill
revoke-followups-j216k
revoke-progress-j216e
backup/macos01-20261106/lume/j197
backup/macos01-20261106/lume/appwin-icons-j207-stash0
backup/macos01-20261106/claude/stash-0
backup/macos01-20261106/claude/stash-1
backup/macos01-20261106/claude/J80-macos-s1
backup/macos01-20261106/claude/J80
backup/macos01-20261106/claude/J80-slice1-20261102
backup/macos01-20261106/claude/J16b-appwin-on-dev
backup/macos01-20261106/claude/appwin-launch-idle-146
backup/macos01-20261106/claude/J80-s1-run
wip/j259
trust-285-p3c
runtime-lock-j216f
mesh-ssh-p3-j175
tun-proof-p3b
trust-285-p3
terminal-polish-j271
tun-proof-p3
ssh-install-flakes-j216i
fuzz-fixes-j264
trust-285-a
trust-285-b
restart-oversized-fixture-j198
backup/macos01-20261106/lume/appwin-icons-j207
restart-bound-j216h
up-preflight-p3-j198
backup/macos01-20261106/lume/j251
up-preflight-j198
wip/up-preflight-j198-j245-p2
wip/up-preflight-j198-j245-p1
agent-fsync-offloop-j196
wip/up-preflight-j198-j245
settings-offscreen-j231
wip/up-preflight-j198-j226-inspection
wip/j103f
themes-j206
wip/up-preflight-j198-j226
flakes-j216c
backup/macos01-20261106/claude/j197
flakes-j216b
backup/macos01-20261106/claude/j197-red
wip/up-preflight-j198-review
flakes-j216
backup/macos01-20261106/claude/appwin-icons-j207
engineering-j208b
appwin-mock-j209
toast-stack-j165
engineering-j208
decisions-d351
decisions-d350
decisions-d349
appearance-presets-mock-j129
decisions-d348
docs-audit-spec
doc-coverage-baseline-raise
decisions-d347
decisions-d346b
decisions-d346
j88h-profile
ui-consistency-j195-deferred
ui-consistency-j195
engineering-practices-j194
preferred-login-ui-j166
signin-pools-263-j174
macos-node-265-s1
decisions-d345
decisions-d344
proxy-cgroup-j164
verify-quick-fuzz-329
proxy-start-io-j168
timing-flakes-j163
up-263-s1
mcp-events-j147
verify-quick-fuzz-j158
proxy-p3-j159
agent-resource-j157-detect
wip/j103d-final
remote-cancel-hang-j155
proxy-traefik-281-j62d
j149-verify-quick
proxy-traefik-281-j62b
j150-drop-unnamed
wip/j79d-red-r4
wip/j103d-d332
rootless-toast-j142
wip/j103d-head
wip/j103d
j125c-mcp
macos-build-j136
backup/macos01-20261106/claude/j136
wip/j79d-red-cli
wip/j79d-red-server
j121-link-liveness
j118c-tracer-failures
wip/j79c-head
release-desktop-j131
j124c-signed-macos
wip/j79c-red-p3
wip/j79c-red-p23
wip/j79c-red-p22
merge-j128-check
perf-deferred-j128
sidebar-toggle-260
j127-shortcut-changed-dot
j125-mcp
j118-tracer-failures
j126-account-summary
settings-sections-mock-j92
j120-pinch-lock
sidebar-292
backup/macos01-20261106/claude/j120
taste-2026-11-03
row-actions-242-215
backup/macos01-20261106/claude/stash-0-untracked
backup/macos01-20261106/claude/J80-265-s1-run
backup/macos01-20261106/claude/J80-macos-s1-20261102
j112-canvas-commands
ui-no-overshoot-scroll
fix-recovery-restart
backup/macos01-20261106/claude/stash-1-untracked
taste-2026-11-02
size-baseline-ratchet
machine-cards-structure-j108
j109-boot-copy-mockups
fix-dev-red
wip/up-263-s1
j95b-settings-rows
proxy-traefik-281
j95-option-rows
docs-human-j91
docs-keys-palette
fix-flood-1013-270-j38d
mesh-ssh-s1
mesh-ssh-s0
addhost-d291-tunnel
test-stability-load
mesh-relay-220
repro-296
shim-thp-off-24
mesh-pins-258-v2
mesh-dns
signin-d311-merged
docs-pages
ui-size-283
fix-ui-batch-specs
wip/j12b-edge-update
gate-on-arm
fix-rename-sync-293
trust-285-j60b
fix-focus-ring-clip
integ-ui-1101
edge-update-v2
signin-d311
taste-2026-11-01
layout-per-tab-250
ui-approved-splitopt-224
ui-approved-splitopt-224-on-dev
icon-text-centre-282
ui-approved-189-212-216
research-reverse-proxy
transfer-budget-320
review-mesh-pins-258-r2
sidebar-pill-259
review-mesh-relay-220
wip/j12-edge-update-v2
nix-package
status-crash-loop-237
fix-dev-test-failures
fix-fixture-socket-path
wip/mesh-relay-220-pre-dev-advance-rebase
fix-canvas-side-clip
research-head-to-head
frosted-real-256
review-mesh-pins-258
wip/mesh-relay-220-pre-final-rebase
review-layout-per-tab-250-r2
broad-suite-triage
nix-devshell
review-status-crash-loop-237-r3
wip/nix-devshell-pre-p3
taste-frosted-real
wip/code-serve-demo-2026-10-30
wip/code-serve-glass-2026-10-30
wip/code-serve-clusters-2026-10-30
wip/code-merge-release94-dev-2026-10-30
wip/rproxy-delta-scratch-2026-10-30
wip/stale-note-257-staged-2026-10-30
wip/d241-size-staged-2026-10-30
review-broad-suite-207
wip/mesh-pins-258-pre-split
wip/mesh-relay-220-pre-rebase
mesh-measure-220
plan-211-update
review-edge-autoupdate-r3
perf24-reconnect
review-stale-note-r2
release-prod-live
d241-shell-marker
review-mesh-pins-server-258
review-revocation-r3
review-setup-token-r2
review-sync-journal-r3
wip/review-mesh-pins-258-prune-review-1995fee46
frosted-scroll-256
sync-journal-r3
revocation-per-account-wip
review-tokio-asyncfd-0386
review-sync-p3s
wip/stash-8by64-stash0-2026-10-30
mesh-drag-r2
setup-token-data-wip
release-9-4
auth-busy-1013
mesh-view-overlap
sync-p3s
review-auth-busy-wake
review-readd-r8-wip
mesh-drag-bounds
audit-auth-93
app-windows-stream-start
review-authority-cap-r3
app-windows-r7-measure
readd-minimal-r6
readd-minimal-r5
app-windows-r7-soak
readd-minimal-r4
app-windows-r7
app-windows-r6
readd-minimal-r3
readd-minimal-r2
readd-minimal
merge-release8-dev
review-busy-page-liveness-r2
review-busy-page-liveness
mesh-view-trim
review-authority-read-retry-r2
review-remove-uninstall-r2
release-retry-reattach
release-retry
review-remove-uninstall
review-authority-read-retry
app-windows-ship
mesh-autoswitch-p2
mesh-ssh
mesh-relay
mesh-macos-node
screen-and-control
session-labels
review-real-logins-r5
review-real-logins-r4
review-real-logins-r3
shim-memory-r2
review-real-logins-r2
shim-memory
shadow-addhost-instant
shadow-real-logins
shadow-same-session-flood
shadow-prod-perf-fix
hosts-from-server
app-windows-real
app-windows-transport
release-prod-6w
mesh-policy-verify
quiet-close-toast
dev-merge-r4
review-mesh-agent-transport
review-app-windows-transport
settings-roundtrip
review-release-pipeline-r4
mesh-agent-transport
ended-strip-fix
review-audit-ca-update-d244
settings-rows
phone-width
signout-clear
fix-restart-tests
dev-merge-rp
signer-hardening
review-audit-ca-update
terminal-fidelity
review-audit-ca-update-wip
mesh-integrate
review-mesh-agent-transport-515d3712
review-mesh-dataplane-feec1988
mesh-dataplane
signout
research-canvas-node
wip/review-renderer-cost
wip/review-terminal-fidelity
padlock-glyph
review-release-pipeline-2e95b689
phone-polish
sidebar-polish
inbox-generic
review-mesh-dataplane-378d4055
prod-batch
ui-inbox
ui-ca-unlock
ui-machine-sections
review-mesh-dataplane-a5f744fb
tls-session-prod
session-bounds-prod
fix-dead-session
session-bounds
tls-session
palette-polish
shortcuts-d222
research-appmeta
phone-gutter
ui-centre-button
wip/ui-centre-button
wip/tls-session
review-addhost-breakit
ui-platform
renderer-cost
remote-agents
mesh-api
ssh-bootstrap
prod-hotfix2
prod-fixes
review-remote-agents
review-mesh-dataplane
session-life
research-browser
review-mesh-api
research-capture
review-mesh-api-round3
review-mesh-api-round1
gate-stability
review-gate-stability
review-relay-direct
review-mesh-api-findings
proto-sessions
font-picker
proto-addhost
proto-windows
mesh-core
latency-gate
research-bsd
research-discovery
keytray-mods
mock-core
ui-tweaks
fix-motion-sel
fix-motion
integrate2
fix-robust
t-web
t-server
vt-ghostty
fix-snap-echo
t-web-auth
review-vt2
t-agent
lane-protocol
lane-shim
lane-auth
s1-base
s1-contracts
s1-workspace
No results found.
No labels
launch-qa
Milestone
Clear milestone
No items
No milestone
Projects
Clear projects
No items
No project
Assignees
Clear assignees
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".
No due date set.
Dependencies
No dependencies set
Reference
kayg/infraternal#29
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Part of #19 and #21. Independent audit of the discoverable sign-in and setup-token work (server 6fa27a3..7948ff0, client 1b4c907..639ac27).
Job: review-auth-ux (Codex GPT 6.1 Sol Medium). Findings accumulate in /tmp/review-auth-ux-findings.md and the verdict is posted on #19.
The audit also answers A3 / DECISIONS 108: does a server-wide constant PRF input (one passkey prompt) lose any protection compared with the per-user v2 input? If it does not, a follow-up implements the single prompt.
Audit finished (review-auth-ux): rework. The findings file is copied to the job's state directory (
review-auth-ux/findings.md); the full posts are on #19 and #21.Each finding has a failing test.
Gates are green. Measured: challenge p99 3 µs, finish p99 622 µs, RSS 12.8 → 14.1 MB at 1,024 pending ceremonies (the 1,025th is rejected).
Starting auth/server fix round: t-server base
6e5d9563f3; t-web base7a5e5db. Read contracts, review findings and issue/parent history. Reproduce before fixing, separate commits per finding; no push or deploy. DECISIONS.md ends at 86 and docs/PROCESS.md is absent; following owner D108 approval and supplied process requirements from the issue/task.Reproduced P2 at
6e5d956: audit_no_public_credential_listing fails with known UUID 200 instead of 401. Fix restricts identified login to matching authenticated owner; discoverable response remains empty allowCredentials. Reproduced P1 in scripts/browser-auth/check-unlock.mjs against production t-web UI and real Rust SQLite router: corrupt wrap + injected logout 429 leaves /auth/session 200. Contract proposal: login-finish issues a 5-minute restricted unlock cookie; unlock-session and wraps are its only reads, unlock-finish activates after local unwrap, session/WS/actions deny it until then. Abandoned/expired unlocks never acquire authority; server deletes expired pending rows on auth path. Logout bypasses both admission layers with exact Origin still required. No envelope/AAD changes.Ceremony binding proposal: HTTP starts set a random Secure/HttpOnly/SameSite=Strict __Host-infraternal-ceremony cookie, retain only its hash in pending state, and require it at finish. Cover registration, discoverable/identified login, additional passkey and recovery replacement starts. Reuse the starting browser cookie to permit parallel ceremonies; reject missing/different binding before proof validation. Library-only tests remain unbound because their caller is the trusted adapter.
Completed credential disclosure fix at t-server commit a6 (exact SHA in next step): unauthenticated known/unknown UUIDs now both 401 with identical JSON; empty-ID discovery still empty allowCredentials. Updated prior admission regression to use discoverable login. Full fast: fmt/clippy/test/cargo-deny/static builds PASS; protocol 7 pass, 0 fail, 34390 assertions. Static sizes x86 14685888, aarch64 12289152 bytes.
Correction: exact completed credential-disclosure commit is
50be353. The placeholder in the preceding comment was a reporting error. Next logical step is migration 0007 adding an unlocked flag, default 1 for existing sessions; pending logins explicitly use 0. Browser red evidence remains failed unwrap + 429 -> live session.Completed schema step
9425282(t-server): migration 0007 preserves existing sessions and adds explicit pending-unlock state. Full fast gate all five Rust rows PASS; protocol 7 pass/0 fail/34390 assertions. Client pending-unlock integration currently passes TypeScript/build and onboarding 4/4; production failed-unwrap probe is next once server module tests pass.Client step committed 898 (exact SHA follows tool commit output on subsequent evidence): pending unlock uses unlock-session then unlock-finish only after native AES-GCM success; failed revocation is surfaced. Existing onboarding remains 4/4, fast all Rust rows + 7 protocol tests pass. Paired real Rust/production-browser corruption+logout429 test now PASS: session 401 and reload stays at sign-in. Native browser baseline had invalid legacy name browser owner after account-label validation; updated fixture to valid username plus display name.
Exact client step SHA:
8e66b9c3ee(supersedes abbreviated placeholder in prior comment). Native browser gate 4 isolated scenarios now passes. Pending-unlock expiration regression is running against real SQLite.Completed pending-unlock server module at
b87e368. Paired production Chromium regression: corrupted AES-GCM nonce + logout429 -> /auth/session 401, reload sign-in. Pending expiry test denies session/fresh tap, cannot slide expiry via wraps, deletes row at deadline; authenticated logout still succeeds after 120 public requests. Native browser 4/4. Full fast all five Rust rows PASS; protocol 7 pass/0 fail/34390 assertions. Static x86 14692672 bytes. Client step8e66b9c.Browser-binding red reproduction: audit_ceremony_browser_binding returned 200 with no binding cookie. Added binding module for all HTTP ceremony starts/finishes, hashed random HttpOnly/Secure/SameSite=Strict cookie; foreign clients get 401 before consuming state. Current module gate: clippy passes, 30 auth/runtime tests pass (1 scale test ignored). Same-browser completion and non-draining foreign attempts are now checked; real browser pairing rerun follows.
Completed browser binding at
7c0dfc6. Foreign cookie-free finish now 401; original browser can still finish the same proof, 200. Cookie flags Secure/HttpOnly/SameSite=Strict/Path=/ and 300s checked. Slice gate: fmt/clippy pass, 30 real-verifier/SQLite tests pass (scale ignored), real production browser normal and failed-unwrap flows pass. Full final cross-lane gates will follow all fixes.Final native auth verification: 4 isolated Chromium 149.0.7827.55 scenarios pass (resident UV/PRF; unsupported PRF; nonresident; missing UV). Production tracer + real Rust router/SQLite/WebCrypto passes normal unlock and corrupted envelope + injected logout 429; the latter leaves ordinary session denied and reload signed out. Browser binding and public known/unknown UUID privacy regressions pass. Full fast gates pass in both trees. No Safari/physical-iPhone claim; production screenshots are retained under t-web/apps/tracer/test-results. Final heads/evidence documentation pending.
Release measurement after this job stopped building; 8 i9-9900K x86_64 KVM vCPUs. SQLite memory, local server paths only; no disk/network/phone claim. Auth includes browser binding and restricted unlock transaction. Discovery remains below 1ms and signed finish below 10ms; writer lookup below 1ms at 16×32=512 retained writers. Verbatim output:
Clean production-build browser rerun after this job stopped building: 4/4 pass in 46.0s. 500-key probe p99=16.40ms (<20ms); time to resume=77.00ms (<300ms). Native v3/v1/v2 prompt counts 1/2/2 and corrupted unwrap/logout-429 denial also pass. Production screenshots: t-web/apps/tracer/test-results/onboarding-setup-recovery--906cd--match-the-browser-contract/returning-sign-in-iphone-15.png; terminal-first-run-passkey-29742-esume-and-the-latency-probe/signin-dark.png and tracer-terminal.png. Screenshots are supplied for independent review, not self-approved. Evidence/self-review document server commit
f1b996c; full fast finish run pending. #28 remains blocked on production host-daemon/PTY deduplication and the longer-drop writer contract; #29/#30 implementation and native evidence pass.Implementation and requested native auth evidence complete for this issue; #28 integration blockers remain recorded separately.
Both lanes final fast exit 0; server head
f1b996c11c, client headfaa31544c6. Native auth 4/4; production paired v3/v1/v2 prompt counts 1/2/2; corrupt unwrap + logout 429 denies session and reload stays signed out. Onboarding/terminal Playwright 4/4; 500-key p99 16.40ms, resume 77ms. Auth 1024-pending p99 challenge 22us/finish 800us, Login inline 136×1024=139264 bytes excluding heap/hash tables; full-user writer lookup (512) p99 504us. Evidence/self-review: docs/verification/fix-round.md. Complete unedited gate output is posted on #28 in ordered parts for each lane. Nothing pushed/deployed; issues remain open.Both gates' Rust summary, verbatim:
Both gates' protocol summary, verbatim:
Server tests, verbatim:
All three ignored release measurement tests were run separately and passed. Final live-socket release rerun (16 simultaneous × 200 = 3200) p50 1123us/p99 2190us, load 1.92/2.42/2.56; local WebSocket control + SQLite only, no PTY claim.
Cleanup verified: both worktrees are clean at server
f1b996c11cand clientfaa31544c6. Removed both temporary target symlinks and this job’s 18GB/4.7GB scratch build targets. Production screenshots remain in t-web/apps/tracer/test-results; complete gate output and release measurements are on the issues. No running auth fixture remains; no push, deployment or issue closure. #28 acceptance remains blocked on the previously recorded production-daemon/PTY and longer-drop writer contract boundaries.Starting focused defensive audit review-auth3: read-only t-server 6e5d956..f1b996c11cf4b25dcb08ba2e7f68ab671b88dbb2 and t-web 7a5e5db..faa31544c6a26f2aec743e526fb78c1499eaee28. Prior findings and issue/parent history read; experiments isolated under HOME/.cache/codex-scratch/review-auth3, removed after evidence preservation. No push/deploy/commits.
review-auth3 F1 P1 reproduced: production tab A successfully unwraps, pauses before completion fetch; tab B replaces shared cookie, fails corrupted-nonce unwrap + logout429; release A. Expected B remains pending/signed out; actual B session 401 -> 200 and B reload opens terminal. Chromium149/native PRF/GCM + real Rust router/SQLite. Failing test HOME/.cache/codex-scratch/review-auth3/two-tabs.mjs, output two-tabs.log. auth.ts:168 completion {} and sessions.rs:57-66 activate whichever cookie is current, without transaction identity. Single-tab author regression passes. Completion must bind to its own pending login.
review-auth3 F2 P1: real WS terminal.open with delayed Unix backend Result; logout commits; socket still open at1511ms, then successful Result reaches revoked browser and terminal row commits. Failing review3_busy_revocation_must_interrupt_and_deny_late_result in audit_cases.rs; audit-tests.log. websocket.rs:236-247 blocks select revocation/expiry while awaiting handler; open_terminal:847-866 persists/responds after unbounded await without recheck. F3 P2: logout after upgrade/server Hello, before client Hello -> Welcome/resume capability still issued; failing review3_revoked_handshake_must_not_welcome. Main-loop checks start too late. Subsequent ordinary terminal frames do recheck authority; no broader handshake access claim.
review-auth3 expanded evidence: busy logout/recovery/expiry all fail (late success + row after revoked/expired authority; >1500ms open). Expiry probe changes authoritative row after dispatch, not a simulated 30-day clock. Seven independent probes:2 pass/5 fail. Known/unknown unauthenticated timing n1000 each interleaved: p50/p99 known122/215us, unknown121/223us; identical401/body/no-cookie. Foreign jar/replay denied. Native v3/v1/v2 prompt counts1/2/2; exactly1 submitted login proof without PRF for each. Two-tab P1 reproduced twice; screenshots retained. Correct exact completion lines: client auth.ts171; server http.rs220-223, sessions.rs56-64.
review-auth3 (focused audit of the fix round; server 6e5d956..f1b996c, client 7a5e5db..faa3154): rework. The run was cut short by the tooling's content filter, but the findings file is complete. A copy is in the job state directory:
review-auth3/findings.md.{}and flips whatever pending cookie is current, so a completion from tab A activates tab B's failed login (401 → 200, and a reload opens the terminal). The fix binds completion to the specific pending login transaction.Owner question for the morning: the server cannot verify that the client actually unwrapped (an empty unlock-finish activates the login). Binding to the transaction fixes the cross-tab race. Enforcing "unwrap happened" needs a proof of DEK possession (for example an HMAC verifier derived from the DEK). The passkey already authenticates the user, so this is a consistency guard rather than an authentication boundary. Decide whether to add it.
Starting focused F1–F3 fix: t-server base
f1b996c11c; t-web-auth basefaa31544c6. Read issue #29 and parent #19/#21 plus #28 history and reviewer evidence. Test-first regressions, transaction-specific completion (no DEK proof per owner task), interruptible frame/handshake authority and bounded backend waits. No push/deploy; t-web untouched. docs/PROCESS.md absent; supplied process contract applies. Proposal: additive pending_transaction field on login-finish/unlock-finish; completion matches both cookie and exact live pending transaction, single use. Document client-only unwrap boundary in keywrap contract.F1 reproduced from unchanged heads: ported scripts/browser-auth/review3-two-tabs.mjs against native Chromium production t-web-auth dist and real reviewer Rust fixture exits 1: A completion activated B failed-unwrap cookie. Screenshot writes outside worktree removed. Rust review3 regressions compiling in HOME scratch; known defects temporarily ignored in default gate and explicitly run for red evidence. Cleanup extension: failed-login logout carries the same transaction id, denying mismatched cleanup without deleting another tab session/cookie. No DEK-possession proof added.
Server red probes on
f1b996c: 0 passed / 5 failed. Busy logout/recovery/expiry remained open 1502/1503/1501 ms, sent late success and committed 1 terminal row each. Post-logout Hello minted Welcome; empty completion granted session and add-start (200). Ported auth/review3_tests.rs retains real SQLite/WebSocket/Unix/verifier tests. Logs HOME/.cache/codex-scratch/fix-auth3/red.log and two-tabs-red.log. Regression gate running; fixes will activate each known-defect test.Regression step committed
04f7366: six red defects retained (including transaction-bound completion/cleanup), native two-tab probe ported. Slice fmt/clippy pass; server default suite 44 passed, 9 ignored (six known defects plus three release measurements). Clippy findings in raw reviewer code corrected before commit. F1 implementation uses a domain-separated SHA256 id of the opaque session capability, returned once at login-finish and consumed through unlocked=0 -> 1; no schema/migration, extra pending heap state or DEK verifier is needed.F1 server completed at commit shown below: transaction-specific completion and failed-login cleanup, no schema or DEK proof. Full server suite 46 passed / 7 ignored; fmt/clippy pass; native auth 4/4. Production Chromium149 two-tab regression now B session before=401, after=401, reload sign-in; replay/mismatch/cleanup regression passes. Client edits confined to src/auth.ts and auth sections of test/mock-server.ts. Concurrent-build Playwright: 3/4 pass, terminal p99 29.2ms exceeds 20ms; clean no-build rerun required, threshold unchanged.
Exact F1 server SHA:
33fb6a5936. Next F2: race every busy frame/output await against committed revocation and stored expiry, with 25ms authority checks only while an operation is pending (idle sockets remain event/deadline driven), 5s backend deadline, post-await checks and session predicates on SQLite mutations. A stored expiry edit has no notification, so bounded busy-only checks cover the reviewer transition without changing idle CPU policy.F2 committed
c56c96fc6e. Focused 8 passed/1 F3 ignored; fmt/clippy pass. Busy logout/recovery close 1ms; direct stored-expiry transition 27ms; no late success or row. New real Unix no-reply probe returns failure at 5004ms, ignores late success, and services next Ping. Socket transport is dropped before metadata cleanup; authority/storage and close waits are bounded25ms. F3 expanded test-first probes (Resume, waiting pre-Hello, edited expiry) are running before handshake changes.F3 expanded regressions committed
772a585a5b; fmt/clippy pass. On F2 head all four F3 probes fail: revoked Hello and Resume mint Welcome, expired pre-Hello row mints Welcome, and waiting pre-Hello socket stays open beyond100ms. Tests are real WebSockets/SQLite and runnable explicitly; fix will activate all four. Client fast setup initially lacked nix in that worktree shell PATH; rerunning via installed absolute nix path, no repo change required.F3 committed 848b5f249be7cebf8927362766ed8593187ab149. Correction to commit gate body: inspected full server summary after commit and found 53 pass/1 fail, not 54 pass; expired_handshake_releases_user_permits failed under concurrent client/release builds. All twelve focused probes pass, fmt/clippy pass. Investigating admission failure and rerunning before acceptance; no finished/green claim. Near-expiry reviewer probe also caught an intermediate sliding handshake read; corrected to non-sliding reads before this gate.
Admission failure reproduced in isolation (before correction). Corrected F3 to use one absolute 5s deadline covering server Hello/authority reads and client Hello/Resume, rather than starting another 5s after server Hello. Retained capacity regression now passes in5.85s. Also stage precise Welcome rollback metadata before SQL mutation/commit awaits so cancellation cannot lose it. Client full fast passes all five Rust rows plus protocol7/0/34390. Final server gate/release build rerunning; benchmark now includes pending-transaction-id generation in finish timing.
F3 final atomic commit is
52650269c0(amended local848b5f2 with absolute deadline/rollback corrections; nothing pushed). Latest server54 passed/0 failed/3 scale ignored; fmt/clippy and static builds pass individually. Added benchmark-only628ab1a0ad0a7c131f4067c5725890c707727901 to include id generation in finish timing. Native4/4; production paired v3/v1/v2 prompts1/2/2, corruption/logout429 and two-tab401->401 all pass. Revoked Hello no Welcome; Resume315us and pre-Hello327us closure. Final complete fast rerun underway after fixing benchmark function lint; scales/browser latency run after compilation stops.Quiet release performance gate failed at628ab1a: 16 sockets x200=3200, p50=4345us/p99=11956us (5ms budget), load2.59/4.94/7.56, 8 i9-9900K KVM vCPUs. Complete fast gates are green in both trees; functional probes/native/pairing pass. Cause: duplicate pre/post watchdog SQLite queries in addition to frame entry lookup. Performance correction reuses the expiry from the authoritative entry read, keeps generation/deadline checks on completion and direct authority reads/SQL predicates at backend/persistence boundaries. No budget changed; rerun functional regressions and quiet scale before acceptance.
Performance correction completed at27f214110c0ae898eb7efe074e026a68000fdd5d; fmt/clippy and12 focused probes pass. Quiet release measurements on8 i9-9900K x86_64 KVM vCPUs; SQLite memory/loopback control, no real PTY, phone or pinned perf-VM claim. The watchdog adds no idle polling. Historical #29 socket baseline1123/2190us is not a controlled A/B; current1253/2475us remains below5ms and buys sub100ms busy revocation with no late row/success. Full current fast follows clean browser run.
socket-scale-optimized output, verbatim:
auth-scale output, verbatim:
writer-scale output, verbatim:
Client F1 completed58040dfd599cd25ed6a44abf1f8bb9084e9837c6: 2 auth files only,11 insertions/4 deletions. Client fast all five Rust rows + protocol7/0/34390, TS check/build and clean production Playwright4/4(44.9s) pass. 500-key p99=16.60ms, resume79.50ms; setup/signin first paint p99=366.9/90.9ms (n30 each). Production screenshots retained under t-web-auth/apps/tracer/test-results for independent review. Final optimized server fast/native rerun underway; no push/deploy or changes in t-web.
Final t-web-auth fast gate at58040dfd599cd25ed6a44abf1f8bb9084e9837c6; exit0. Verbatim output part1/2 (concatenate blocks in order). Command: nix shell nixpkgs#binutils nixpkgs#file nixpkgs#gnumake nixpkgs#perl -c scripts/verify fast; invoked via installed absolute nix path because this worktree shell omitted it from PATH.
Final t-web-auth fast gate at58040dfd599cd25ed6a44abf1f8bb9084e9837c6; exit0. Verbatim output part2/2 (concatenate blocks in order). Command: nix shell nixpkgs#binutils nixpkgs#file nixpkgs#gnumake nixpkgs#perl -c scripts/verify fast; invoked via installed absolute nix path because this worktree shell omitted it from PATH.
Diagnosed remaining gate401: new schema probe failed at5.86s, showing cancellation dropped the sole in-memory SQLite connection and all tables, not retained socket admission. SQLx0.8.6 Pool::acquire explicitly documents this cancellation behavior and recommends test_before_acquire(false) for a one-connection memory DB with no acquire/connect hooks (https://docs.rs/sqlx/0.8.6/sqlx/struct.Pool.html#method.acquire). Applying that option only to auth test fixture; real auth/verifier/SQLite queries remain, production disk-pool settings unchanged. Retain schema assertion so this cannot masquerade as cookie/admission failure. Full suite rerunning; scales will be remeasured with fixture policy disclosed.
Test-fixture correction committed54ab29d3b91ba4adaf62d5627196f0d5e6699693; full fast now exits0 with all five Rust rows PASS, server54/0/3 ignored, protocol7/0/34390. Final fixture socket measurement under host load8.07/6.20/5.42 (15 runnable on8 CPUs) got p50=1123us/p99=7911us and failed5ms; no compilation from this job was active. Prior optimized identical production code with checkout ping enabled measured1253/2475us atload2.48/2.94/5.91. Recording the failed loaded attempt; wait for quieter host and rerun without changing budget. Recovery-word test screenshots removed; secret-free production sign-in/terminal screenshots retained.
Final server fast gate at
e4809d49cb; exit 0. Part 1/2, verbatim. Command: nix shell nixpkgs#binutils nixpkgs#file nixpkgs#gnumake nixpkgs#perl -c scripts/verify fast. Docs-only commit follows the green source gate.Final server fast gate at
e4809d49cb; exit 0. Part 2/2, verbatim. Command: nix shell nixpkgs#binutils nixpkgs#file nixpkgs#gnumake nixpkgs#perl -c scripts/verify fast. Docs-only commit follows the green source gate.Final verification: server
e4809d49cb, client58040dfd59. Auth/server checklist B1/S1/S2/N1 completed; evidence in docs/verification/focused-auth3.md. Native and Playwright outputs, final scale repetitions and retained loaded attempts follow verbatim. No thresholds changed. Production code is unchanged between scale attempts; only in-memory test checkout-ping policy changed to prevent cancellation dropping the database. No concurrent compilation; load/runnable counts are in the measurements.native-browser.log:
client-browser-final.log:
socket-scale-repeat.log:
auth-scale-repeat.log:
writer-scale-repeat.log:
socket-scale-final.log:
auth-scale-final.log:
Finished F1–F3. Server head
e4809d49cb; client head58040dfd59. Test-first probes, per-finding fixes, performance correction, fixture correction and docs are separate commits. Both fast gates exit 0; full verbatim output is in the ordered comments above (client previously posted), along with native 4/4, Playwright 4/4 and release-scale output. Final socket p50/p99 1160/2130us at 16×200; busy revocation below 100ms with no late success/row. Checklist and evidence: docs/verification/focused-auth3.md. Exact matching page-memory id, no DEK proof, as directed. Loaded failures retained; no budget weakened. Safe production screenshots remain in client test-results for independent review. No push/deploy, no t-web edits, no issue closed. Own scratch targets removed on completion.Fast gate summary, verbatim (both worktrees):
Starting read-only review-auth4: server t-server base
f1b996c11c, heade4809d49cb; client t-web-auth basefaa31544c6, head58040dfd59. Reviewing original reviewer tests, cross-tab transaction variants, delayed/no-reply busy authority, handshake revocation, native/Playwright/1024 scale and fast gates. Disposable checkouts and logs under HOME/.cache/codex-scratch/review-auth4; no source changes/commits/push/deploy.review-auth4 completed original unmodified audit_cases.rs at server
e4809d4: 7 passed, 0 failed. Real SQLite/verifier/WebSocket/Unix backend. Empty completion returns 400; session/add-start remain401. Busy logout/recovery/expiry produce no late success and zero terminal rows; revoked Hello no Welcome. Original log summary (verbatim):review-auth4 matrix at
e4809d4: 12/12 busy variants PASS (logout/recovery/expiry ×100/1500/10000ms/never), no late success or row. Transaction order/stale/consumed-id/reload/expiry variants PASS. Long-open check fails: live valid backend reply delayed10s gets failure at5s and zero rows (review4_legitimate_10000, websocket.rs:42/1045). This matches the new documented5s policy; it does not satisfy the requested longer legitimate-open check. No real slow-host claim. Matrix summary, verbatim:review-auth4 R1 P1: delayed successful completion response still crosses tabs. A native unwrap + real matching completion accepted; hold response. B already at sign-in -> new cookie, failed unwrap/logout429, session401. Release A reply -> Set-Cookie restores A active cookie; B session200/reload terminal. In-memory cookie comparison restoredA=true; direct original B cookie remains401 (no B-row activation). Reproduced twice, production Chromium149/real router+SQLite. Failing response-race.mjs, response-race-confirm.log. auth/http.rs:239 -> session_response line120 reissues request cookie. Binding request id alone cannot prevent stale response cookie replacement. Remove unnecessary completion cookie writes and review cleanup/identity response ordering.
review-auth4 R1 additional evidence: completion-response-only control removes Set-Cookie, keeping B401->401/reload signed out (response-race-control.log); unmodified response reproduces401->200 twice. A stale successful pending-logout response also clears B active cookie: browser200->401, original B cookie still200, reload sign-in (cleanup-direct.mjs/log; http.rs:292-295). Cleanup probe uses native signed login plus exact matching test completion per accepted owner consistency boundary; no claim B locally unwrapped. Request-id checks/SQL rows work, but response cookie mutations still affect another tab. All stale cookie-writing responses need review, not only unlock-finish.
review-auth4 reproducible failing test response-race.mjs (scratch will be deleted; issue is the durable record). Copy into scripts/browser-auth/ of a disposable
e4809d4archive, build browser_auth and production58040df dist. Run bun scripts/browser-auth/response-race.mjs ../client/apps/tracer/dist with TRACER_BROWSER_AUTH_BIN selecting thee4809d4fixture. Capabilities only in private IPC/browser memory.review-auth4 reproducible failing test cleanup-direct.mjs (scratch will be deleted; issue is the durable record). Copy into scripts/browser-auth/ of a disposable
e4809d4archive, build browser_auth and production58040df dist. Run bun scripts/browser-auth/cleanup-direct.mjs ../client/apps/tracer/dist with TRACER_BROWSER_AUTH_BIN selecting thee4809d4fixture. Capabilities only in private IPC/browser memory.review-auth4 Rust variants (scratch removed at completion). Copy review4.rs beside auth/tests.rs in disposable
e4809d4; append #[path="review4.rs"] mod review4; to tests.rs. Run cargo test -p infraternal-server review4_ -- --nocapture. 12 busy cases and transaction variants pass; 10s live-open expectation fails against documented5s cap.review-auth4 server pristine archive fast gate at
e4809d49cb, exit0. Full output verbatim, part1/4; concatenate blocks in order. Command: nix shell nixpkgs#binutils nixpkgs#file nixpkgs#gnumake nixpkgs#perl -c scripts/verify fast. Original worktree remains read-only.review-auth4 server pristine archive fast gate at
e4809d49cb, exit0. Full output verbatim, part2/4; concatenate blocks in order. Command: nix shell nixpkgs#binutils nixpkgs#file nixpkgs#gnumake nixpkgs#perl -c scripts/verify fast. Original worktree remains read-only.review-auth4 server pristine archive fast gate at
e4809d49cb, exit0. Full output verbatim, part3/4; concatenate blocks in order. Command: nix shell nixpkgs#binutils nixpkgs#file nixpkgs#gnumake nixpkgs#perl -c scripts/verify fast. Original worktree remains read-only.review-auth4 server pristine archive fast gate at
e4809d49cb, exit0. Full output verbatim, part4/4; concatenate blocks in order. Command: nix shell nixpkgs#binutils nixpkgs#file nixpkgs#gnumake nixpkgs#perl -c scripts/verify fast. Original worktree remains read-only.review-auth4 client pristine archive fast gate at
58040dfd59, exit0. Full output verbatim, part1/3; concatenate blocks in order. Command: nix shell nixpkgs#binutils nixpkgs#file nixpkgs#gnumake nixpkgs#perl -c scripts/verify fast. Original worktree remains read-only.review-auth4 client pristine archive fast gate at
58040dfd59, exit0. Full output verbatim, part2/3; concatenate blocks in order. Command: nix shell nixpkgs#binutils nixpkgs#file nixpkgs#gnumake nixpkgs#perl -c scripts/verify fast. Original worktree remains read-only.review-auth4 client pristine archive fast gate at
58040dfd59, exit0. Full output verbatim, part3/3; concatenate blocks in order. Command: nix shell nixpkgs#binutils nixpkgs#file nixpkgs#gnumake nixpkgs#perl -c scripts/verify fast. Original worktree remains read-only.review-auth4 regression/scale results at server e4809d4/client58040df: native4/4; paired v3/v1/v2 prompts1/2/2, exactly one proof without PRF each; production Playwright4/4 (44.2s), 500-key p99=16.50ms/resume79.70ms. Screenshot masking for setup/recovery and acceptDownloads=false are privacy-only harness changes; assertions unchanged, failure context disabled. Release benchmarks after this review's builds/browser finish: 1024 pending, challenge21us/finish846us p99, RSS12968->14428KiB (+1460), inline136*1024=139264 bytes, 1025 rejected. Socket n3200 p99=1913us, writer512/n3200 p99=350us. SQLite memory/local test double; no actual PTY/phone/perf-VM claim. Outputs verbatim:
native.log:
traffic-v3.log:
traffic-v1.log:
traffic-v2.log:
playwright.log:
auth-scale.log:
socket-scale.log:
writer-scale.log:
Independent review-auth4 verdict: REWORK, ranked:
F2/F3 requested revocation checks PASS. Strict real WebSocket/Unix/SQLite matrix12/12 (logout/recovery/edited expiry ×0.1/1.5/10s/never), transport closed, first/late binary=false, max close30650us, no terminal rows. Hello/Resume/pre-Hello/expiry focused suite12/12. Pending matching ids, both completion orders, stale/completed ids, restricted reload and pending expiry pass. Original audit_cases.rs is SHA256-identical and passes7/7. Original two-tabs.mjs is SHA256-identical but cannot pass its obsolete positive waits for A and B to enter terminal after the rejected completion; it times out. Corrected expected-state browser probe passes401→401. This harness mismatch is not a product defect.
Native4/4; v3/v1/v2 gets1/2/2 with exactly one stripped proof each. Playwright4/4; key-to-paint p99=16.50ms, resume79.70ms. Privacy-only harness changes mask setup/recovery pixels, disable download persistence and failure DOM snapshots; assertions unchanged. Production screenshots attached in the review conversation; no visual-quality/actual PTY/physical-phone claim. Auth1024 p99 challenge21us/finish846us; RSS12968→14428KiB (+1460); inline136×1024=139264 bytes, heap excluded, 1025 denied. Socket3200 p99=1913us; writer512/3200 p99=350us, local memory SQLite. No review compilation overlapped final measurements; machine/load recorded verbatim previously.
Heads: server
e4809d49cb; client58040dfd599cd25ed6a44abf1f8bb9084e9837c6. Both original worktrees remain clean/read-only; no commits/push/deploy. Full fast logs and executable failing test sources are preserved in prior ordered comments; scratch is removed next. Both fast gates exit0, summary verbatim:Stricter socket matrix, verbatim:
The stricter matrix adds explicit transport-terminal and zero-binary assertions to the previously posted review4.rs helper; it leaves production source unchanged. Earlier invalid cleanup harness attempts (target-local virtual PRF seed/focus) are excluded from product findings.
Accumulated review-auth4 findings (verbatim); this issue is the durable record after scratch cleanup.
review-auth4
Server
e4809d4; client58040df.Original Rust probes — PASS unchanged
Copied audit_cases.rs byte-for-byte into disposable auth module.
Delay/transaction matrix
12/12 busy revocation variants PASS; close <100 ms, zero late success/rows. Both transaction orders, stale/completed ids, restricted reload and expired pending row PASS. Valid backend delays 0.1/1.5/4.5 s PASS.
R2 — P2 against requested long-open check: live 10 s open rejected
Input: live authorized socket, valid terminal.open, valid real Unix backend reply scheduled at 10 seconds, no revocation. Expected per requested long-legitimate-open check: success and one row. Actual: failure reply at ~5 seconds, late backend success ignored, zero rows. Failing
review4_legitimate_10000inaudit-server/crates/infraternal-server/src/auth/review4.rs; matrix.log.websocket.rs:42,1060imposes a total five-second open deadline. This is the documented new policy, not a revocation bypass; genuine slow-host/PTY legitimacy has not been demonstrated here. Separate authority cancellation from the legitimate-open duration requirement or resolve that budget explicitly.R1 — P1: delayed completion response restores another tab's active cookie
Input → A unwraps and the real router accepts matching completion; delay only the HTTP response. B was already on sign-in, starts a new native passkey login, fails unwrap, receives injected logout429 and has session401. Release A response.
Expected → B stays pending401 and reload signed out.
Actual → A response's Set-Cookie restores A's active cookie over B's pending cookie; B session200 and reload terminal. In-memory comparison proves restoredA=true; direct real-router request using original B cookie remains401. This is cookie replacement, not B-row activation, and not a DEK-proof request.
Failing test: audit-server/scripts/browser-auth/response-race.mjs, response-race-confirm.log. Reproduced twice with Chromium149.0.7827.55 and production dist, real verifier/SQLite/native crypto. Only response scheduling, bad nonce and logout429 controlled.
Cause → auth/http.rs:239 returns session_response(cookie), whose line120 adds Set-Cookie after accepted completion. An exact request transaction cannot bind when its response changes a shared cookie. Avoid reissuing a cookie on unlock completion; check all stale response cookie writes, including cleanup and restricted identity reads.
R1 control PASS: removing only completion Set-Cookie gives restoredA=false, B401->401/reload sign-in. Additional cleanup-direct.mjs fails: stale successful pending logout response clears B active browser cookie (200->401); original B cookie still200. B test uses exact matching completion signal per owner accepted boundary, not a claimed local B unwrap. http.rs:292-295. Earlier native cleanup attempts were invalid harnesses (target-local PRF seed/focus); they are not product findings.
Regression evidence
Both pristine snapshot fast gates PASS (full logs posted verbatim on #29); original Rust7/7 and fixed-focused12/12. Original browser hash verified unchanged: times out because it waits for the rejected A login/failed B reload to open terminal; ported corrected expected-state test PASS401->401. Native4/4, paired v3/v1/v2 native gets1/2/2 and one stripped proof each. Playwright4/4 (privacy-only masked screenshots/disabled downloads, assertions unchanged), 500-key p99 16.50ms/resume79.70ms. Release1024: challenge p99 21us/finish846us, RSS12968->14428KiB (+1460), inline136×1024=139264 bytes, 1025 denied. Socket3200 p99 1913us; writer512/3200 p99 350us. No self-review visual quality, actual PTY, phone or perf-VM claim.
Final verdict
Independent review-auth4 verdict: REWORK, ranked:
F2/F3 requested revocation checks PASS. Strict real WebSocket/Unix/SQLite matrix12/12 (logout/recovery/edited expiry ×0.1/1.5/10s/never), transport closed, first/late binary=false, max close30650us, no terminal rows. Hello/Resume/pre-Hello/expiry focused suite12/12. Pending matching ids, both completion orders, stale/completed ids, restricted reload and pending expiry pass. Original audit_cases.rs is SHA256-identical and passes7/7. Original two-tabs.mjs is SHA256-identical but cannot pass its obsolete positive waits for A and B to enter terminal after the rejected completion; it times out. Corrected expected-state browser probe passes401→401. This harness mismatch is not a product defect.
Native4/4; v3/v1/v2 gets1/2/2 with exactly one stripped proof each. Playwright4/4; key-to-paint p99=16.50ms, resume79.70ms. Privacy-only harness changes mask setup/recovery pixels, disable download persistence and failure DOM snapshots; assertions unchanged. Production screenshots attached in the review conversation; no visual-quality/actual PTY/physical-phone claim. Auth1024 p99 challenge21us/finish846us; RSS12968→14428KiB (+1460); inline136×1024=139264 bytes, heap excluded, 1025 denied. Socket3200 p99=1913us; writer512/3200 p99=350us, local memory SQLite. No review compilation overlapped final measurements; machine/load recorded verbatim previously.
Heads: server
e4809d49cb; client58040dfd599cd25ed6a44abf1f8bb9084e9837c6. Both original worktrees remain clean/read-only; no commits/push/deploy. Full fast logs and executable failing test sources are preserved in prior ordered comments; scratch is removed next. Both fast gates exit0, summary verbatim:Stricter socket matrix, verbatim:
The stricter matrix adds explicit transport-terminal and zero-binary assertions to the previously posted review4.rs helper; it leaves production source unchanged. Earlier invalid cleanup harness attempts (target-local virtual PRF seed/focus) are excluded from product findings.
review-auth4 finished and cleanup verified: t-server clean at
e4809d49cb; t-web-auth clean at58040dfd599cd25ed6a44abf1f8bb9084e9837c6. Entire HOME/.cache/codex-scratch/review-auth4 removed after preserving findings, failing executable sources and all gate logs on #29. No commits/push/deploy/issue closure. Verdict REWORK and ranked findings are in the preceding comments. Both pristine fast gates exit0; verbatim summary:Starting final recheck fixes: branch t-server, base
e4809d49cb; client t-web-auth58040dfremains read-only unless needed. Read issue/parent history and repository contract. Reproduce delayed completion/cleanup responses and legitimate 10s open before fixes; one gated commit per finding. Proposed response invariant: completion, pending cleanup and session reads emit no Set-Cookie, preventing delayed replies from replacing another login. docs/PROCESS.md absent; supplied owner process applies. No push/deploy.F1 red evidence at
e4809d4: Rust review3_completion_and_cleanup_are_transaction_bound 0 passed/1 failed on successful completion Set-Cookie. Ported reviewer browser scripts review4-response-race.mjs and review4-cleanup-direct.mjs fail against production client58040df/real Rust router: delayed completion replaces B pending cookie; delayed cleanup clears B active cookie. No screenshots/traces/secrets produced. No longer-connect budget found in DECISIONS/contracts; proposed terminal open bound60s per owner task, retaining25ms authority checks and under100ms revocation target.F1 response audit also found dispatch refreshing the request cookie on wraps/add-start and other authenticated actions (auth/http.rs:164-184); a delayed read can restore an obsolete login just like completion. Extending the same invariant: only explicit registration/login issuance writes the auth cookie; authenticated refresh/read and logout responses are cookie-neutral, including ordinary logout (database revocation remains immediate). Browser lifetime becomes30days from issuance; SQLite still slides. Updating the cookie-flags test to inspect login issuance instead of identity refresh.
F1 green focused evidence: both reviewer production Chromium races PASS, completion includes reload before delayed reply; native auth4/4 PASS. Broader response audit removes all auth-cookie refreshes and cookie clearing from logout, retaining exact SQL revocation. Current fast run not accepted:53 pass/1 fail (busy_expiry socket closed during setup under concurrent compilation); two earlier Clippy findings corrected. Client latency under build load26.7ms exceeds unchanged20ms threshold (3/4 pass). Will rerun gates without concurrent builds; no green/done claim.
F1 validation at pre-commit t-server (base
e4809d4), f1-accept-fast.log, verbatim part 1/3:F1 validation at pre-commit t-server (base
e4809d4), f1-accept-fast.log, verbatim part 2/3:F1 validation at pre-commit t-server (base
e4809d4), f1-accept-fast.log, verbatim part 3/3:F1 validation at pre-commit t-server (base
e4809d4), f1-final-native.log, verbatim part 1/1:F1 validation at pre-commit t-server (base
e4809d4), auth-scale.log, verbatim part 1/1:F1 completed at59f76869fd3c0da9fa4c992b2a876c83f800e242: cookie-neutral completion/authenticated responses/logout, explicit issuance only. Fast all5rows PASS;54 server tests pass,3 release measurements ignored; protocol7/0/34390. Native4/4 and both production cookie races PASS including reload before release. Auth scale1024: challenge p99=20us, signed finish p99=600us,136bytes/unit. Verbatim gates posted above. Unchanged client Playwright latency fails26.7/25.4ms and standalone rerun; investigating separately, no all-gates/done claim.
P2 red on59f7686: review4_ten_second_open_preserves_authority fails0pass/1fail after10.41s: real Unix backend replies successfully after10s but live socket already received failure from5s timeout. Add dedicated terminal-connect60s bound; attachment deadline remains5s and authority interruption25ms checks unchanged. Client standalone suite latency20.4ms (threshold20), host load6.65/5.63/6.65 and other-job rustc processes active; no client source touched.
P2 green evidence: dedicated60s terminal-connect bound; attach5s unchanged. Single live open10003ms; revoke during10s open closes1508us. Release at per-user capacity16: all16 ten-second opens succeed10005ms; all16 revoked sockets close2728us, zero late success/terminal rows. Eight i9-9900K KVM vCPUs, Linux6.12.111 x86_64; load after4.14/5.21/6.14; real SQLite/Unix, no real SSH claim. First full fast PASS; final gate including capacity test pending. Native auth4/4 PASS.
P2 validation before final commit, p2-final-fast.log, verbatim part 1/3:
P2 validation before final commit, p2-final-fast.log, verbatim part 2/3:
P2 validation before final commit, p2-final-fast.log, verbatim part 3/3:
P2 validation before final commit, p2-native.log, verbatim part 1/1:
P2 validation before final commit, connect-scale.log, verbatim part 1/1:
P2 validation before final commit, p2-red.log, verbatim part 1/1:
Final production client58040df Playwright on disposable archive; fixture/config port only4173->4187 after shared-port collision, source/thresholds/flags unchanged. Verbatim output:
Finished final recheck fixes: t-server head7551ff6271180f5983910e1ef6040b84dbe901f8; F1 commit59f76869fd3c0da9fa4c992b2a876c83f800e242, P2 commit7551ff6. Client t-web-auth unchanged58040dfd599cd25ed6a44abf1f8bb9084e9837c6. Both findings reproduced red first; commits gated separately. Cookie races preserve B401/200 across held responses and reload; no response cookie refresh/clear outside explicit issuance. Terminal connect60s per owner fallback, attach5s unchanged. Capacity16: opens10005ms, all revoked sockets closed2728us, zero late success/rows. Auth1024: p99 challenge20us/finish600us. Self-review/evidence docs/verification/auth4.md. Complete unedited fast/native/Playwright/scale outputs in preceding comments. No push/deploy/issue closure.
Final gate output, verbatim:
Server test summary, verbatim:
Client production500-key p99=16.20ms; resume78.50ms. Scratch archive changed fixture port only to4187 after collision; client source/thresholds unchanged. Removing this job scratch builds after durable evidence preservation.
Cleanup PASS: removed auth4 target symlink and8.5GB job scratch builds/archive after posting all required evidence. Both source worktrees clean: server7551ff6271180f5983910e1ef6040b84dbe901f8; client unchanged58040dfd599cd25ed6a44abf1f8bb9084e9837c6. No fixture listener on4187. No push/deploy/issue closure.
Orchestrator hand check: both new browser regressions pass against t-server
7551ff6+ t-web-auth58040df:They are not in scripts/verify yet; integration adds them to the native auth gate.
Closed by the orchestrator during the 2026-10-28 handover (#254), on the owner's request to close finished issues. Evidence: Auth audit rounds ended with fixes merged (
7551ff6,faa3154in dev and prod); A3 answered as D108 and regressions added. Reopen if anything is still missing.kayg referenced this issue2026-10-28 17:53:54 +00:00