Phone on LTE: liveness timeouts, then resume refused 33 times a minute (prod) #244

Open
opened 2026-10-18 10:21:41 +00:00 by kayg · 127 comments
Owner

Production (release 3, 5b2a1b9ee), owner's iPhone PWA on LTE, 2026-10-18 ~15:44–15:50 IST. Toasts: "The connection did not respond in time." then "The server would not continue the previous connection." Server log (close reasons from #227):

  • 10:15:50 UTC: closed 15 times in 60 s, reason liveness_timeout, who=server, session 750a7ee9…, out_seq 95, input_sent 0.
  • 10:19:54 UTC: reason connection_resume_refused (auth_resume_refusal), who=server.
  • 10:20:54 UTC: closed 33 times in 60 s, reason connection_resume_refused.
    So a phone on LTE hit repeated liveness timeouts (D300 deadline) and then a reconnect loop the server refused 33 times a minute. Expected: a mobile link that stalls is doubted, then resumed (D300); a refused resume falls back to a fresh attach once, never loops.
Production (release 3, 5b2a1b9ee), owner's iPhone PWA on LTE, 2026-10-18 ~15:44–15:50 IST. Toasts: "The connection did not respond in time." then "The server would not continue the previous connection." Server log (close reasons from #227): - 10:15:50 UTC: closed 15 times in 60 s, reason liveness_timeout, who=server, session 750a7ee9…, out_seq 95, input_sent 0. - 10:19:54 UTC: reason connection_resume_refused (auth_resume_refusal), who=server. - 10:20:54 UTC: closed 33 times in 60 s, reason connection_resume_refused. So a phone on LTE hit repeated liveness timeouts (D300 deadline) and then a reconnect loop the server refused 33 times a minute. Expected: a mobile link that stalls is doubted, then resumed (D300); a refused resume falls back to a fresh attach once, never loops.
361 KiB
214 KiB
372 KiB
390 KiB
406 KiB
Author
Owner

Starting #244 on resume-refused-loop, base/head 5b2a1b9ee3 (release-prod-live). Issue has no comments or parent link. Reading browser/server probe and resume paths; will add failing reproductions before fixes. No push or deploy, per brief. Evidence/builds use job scratch directory.

Starting #244 on resume-refused-loop, base/head 5b2a1b9ee32b37433a3a2ba1430973e9fc2b317d (release-prod-live). Issue has no comments or parent link. Reading browser/server probe and resume paths; will add failing reproductions before fixes. No push or deploy, per brief. Evidence/builds use job scratch directory.
Author
Owner

Findings at base 5b2a1b9ee:

  • Read-only monitor01 journal confirms process 88336 throughout 10:14–10:21 UTC; 15 liveness closes / 60 s, then 33 resume-refusal stream closes / 60 s. No process restart in that interval. These counts are terminal-stream closes, not necessarily socket counts (one socket may carry several streams).
  • Browser lease uses max(srtt+4rttvar+50ms,250ms), not D300's host-route clamp(2srtt+4*rttvar+75ms,250ms,2s). websocket_transport.rs retires on first expiry. connection.ts also retires late queued replies before learning RTT. No visibility is communicated; suspension is indistinguishable from silence.
  • Resume rejection checks inactive/unexpired user-owned connection, token hash, socket authority, capacity. Epoch/stream-id checks are not part of connection resume. All failures are collapsed to one reason, so existing logs cannot identify the historical failed check. Will add fixed, secret-free refusal classifications rather than claim a check without evidence.
  • Browser keeps rejected credentials until its 120s window expires; every handshake resends them. Backoff exists, but fresh attach is never selected on explicit refusal.
    Contract proposal (#244/D300): additive control Event sub_id=0, JSON {"topic":"connection.visibility","hidden":boolean}, enabled by Hello capability bit 2. Hidden pauses browser lease probes without retiring socket/writers or changing auth checks; visible restarts unknown-RTT sampling, rejecting old correlations. Foreground browser routes use D300's two-RTT allowance and first-miss doubt, second-miss retirement. Explicit resume refusal wipes the failed capability and schedules one fresh connection through existing growing backoff; a refused fresh handshake does not repeat this fallback. Generic person-facing wording explains automatic reconnection. No new library or engine.
Findings at base 5b2a1b9ee: - Read-only monitor01 journal confirms process 88336 throughout 10:14–10:21 UTC; 15 liveness closes / 60 s, then 33 resume-refusal stream closes / 60 s. No process restart in that interval. These counts are terminal-stream closes, not necessarily socket counts (one socket may carry several streams). - Browser lease uses max(srtt+4*rttvar+50ms,250ms), not D300's host-route clamp(2*srtt+4*rttvar+75ms,250ms,2s). websocket_transport.rs retires on first expiry. connection.ts also retires late queued replies before learning RTT. No visibility is communicated; suspension is indistinguishable from silence. - Resume rejection checks inactive/unexpired user-owned connection, token hash, socket authority, capacity. Epoch/stream-id checks are not part of connection resume. All failures are collapsed to one reason, so existing logs cannot identify the historical failed check. Will add fixed, secret-free refusal classifications rather than claim a check without evidence. - Browser keeps rejected credentials until its 120s window expires; every handshake resends them. Backoff exists, but fresh attach is never selected on explicit refusal. Contract proposal (#244/D300): additive control Event sub_id=0, JSON {"topic":"connection.visibility","hidden":boolean}, enabled by Hello capability bit 2. Hidden pauses browser lease probes without retiring socket/writers or changing auth checks; visible restarts unknown-RTT sampling, rejecting old correlations. Foreground browser routes use D300's two-RTT allowance and first-miss doubt, second-miss retirement. Explicit resume refusal wipes the failed capability and schedules one fresh connection through existing growing backoff; a refused fresh handshake does not repeat this fallback. Generic person-facing wording explains automatic reconnection. No new library or engine.
Author
Owner

Step 1 committed: a839a9ac6. Explicit resume refusal now wipes the old capability before scheduling a fresh handshake through existing backoff. Repeated fresh failures retain exponential delay. Regression failed before ([false,true,true,true]) and passes after ([false,true,false,false]); 17 connection/close-wording tests pass, tracer TypeScript check passes. Refusal wording now says the previous connection could not be restored and terminals reconnect automatically. No push/deploy per brief.
Visibility regression reproduces both 5s and 30s suspension: old code disconnects all 28 streams on one socket. Lifecycle implementation in progress; building native tests in the job target directory through build-slot.

Step 1 committed: a839a9ac6. Explicit resume refusal now wipes the old capability before scheduling a fresh handshake through existing backoff. Repeated fresh failures retain exponential delay. Regression failed before ([false,true,true,true]) and passes after ([false,true,false,false]); 17 connection/close-wording tests pass, tracer TypeScript check passes. Refusal wording now says the previous connection could not be restored and terminals reconnect automatically. No push/deploy per brief. Visibility regression reproduces both 5s and 30s suspension: old code disconnects all 28 streams on one socket. Lifecycle implementation in progress; building native tests in the job target directory through build-slot.
Author
Owner

Contract step 2 committed: visibility transport notice and suspension behavior in contracts/wire.md; additive Hello bit 2 / existing Event layout, no new parser frame or dependency. Commit bisection retains old behavior until both implementations land. git diff --check passed. Contract proposal recorded in previous finding before implementation.

Contract step 2 committed: visibility transport notice and suspension behavior in contracts/wire.md; additive Hello bit 2 / existing Event layout, no new parser frame or dependency. Commit bisection retains old behavior until both implementations land. git diff --check passed. Contract proposal recorded in previous finding before implementation.
Author
Owner

Further reproduction: after settling at 150ms RTT, replies varying through 150/300/600/450ms (one additional RTT on every 100th reply to model ordered retransmission delay) retire the original foreground browser lease. Visibility support alone does not fix it. With the proposed D300 two-RTT allowance and first-miss doubt on both browser peers, all 47 connection tests pass, including 28-stream hidden/foreground cases and bounded dead-peer detection. This deterministic model is not packet-level loss evidence.
Raw evidence: production journal excerpt, failing refusal regression, failing hidden-page regressions.
Contract commit 08f44356b defines the visibility notice. Focused native liveness run passed 33 tests. The first scripts/verify iterate stopped before compiler checks in the existing latency-proxy self-test (configured 300ms, reported p50=311.42ms p99=423.16ms); no passing gate is claimed. Focused native lint/tests are running through build-slot, followed by final full gate and real-browser recovery checks.

Further reproduction: after settling at 150ms RTT, replies varying through 150/300/600/450ms (one additional RTT on every 100th reply to model ordered retransmission delay) retire the original foreground browser lease. Visibility support alone does not fix it. With the proposed D300 two-RTT allowance and first-miss doubt on both browser peers, all 47 connection tests pass, including 28-stream hidden/foreground cases and bounded dead-peer detection. This deterministic model is not packet-level loss evidence. Raw evidence: [production journal excerpt](https://git.kayg.org/attachments/bef9e2fd-4ce2-4be6-94ae-638baa52441d), [failing refusal regression](https://git.kayg.org/attachments/41123c6f-8f29-4969-a63a-3591c6eba6f9), [failing hidden-page regressions](https://git.kayg.org/attachments/e3312698-ecc3-4fef-b068-bec25036e5aa). Contract commit 08f44356b defines the visibility notice. Focused native liveness run passed 33 tests. The first scripts/verify iterate stopped before compiler checks in the existing latency-proxy self-test (configured 300ms, reported p50=311.42ms p99=423.16ms); no passing gate is claimed. Focused native lint/tests are running through build-slot, followed by final full gate and real-browser recovery checks.
Author
Owner

Perf-VM deterministic comparison, 60,000ms modeled per case, one socket / 28 streams, 150–600ms reply delays, every 100th reply held for one additional RTT (retransmission model; NOT packet-level loss). Same harness and baseline 5b2a1b9ee vs current implementation:

  • foreground jitter: 11 -> 0 browser socket closes / modeled minute;
  • jitter plus 30s event-task suspension: 8 -> 0;
  • explicit refusal: 15 repeated resume attempts -> 1 refused resume then exactly 1 fresh attach; final route welcomed. Close counts 16 -> 2 include the deliberate initiating drop and refusal.
    Machine infraternal-perf-test, x86_64, Linux 6.12.111, load 0.08/0.02/0.01; /var/lock/perf-bench.lock held only during the short run. Receipt: model output, model source, failing foreground regression. Counts are not presented as real-phone measurements. Production browser/PTY check and final native checks remain pending (build-slot queue).
Perf-VM deterministic comparison, 60,000ms modeled per case, one socket / 28 streams, 150–600ms reply delays, every 100th reply held for one additional RTT (retransmission model; NOT packet-level loss). Same harness and baseline 5b2a1b9ee vs current implementation: - foreground jitter: 11 -> 0 browser socket closes / modeled minute; - jitter plus 30s event-task suspension: 8 -> 0; - explicit refusal: 15 repeated resume attempts -> 1 refused resume then exactly 1 fresh attach; final route welcomed. Close counts 16 -> 2 include the deliberate initiating drop and refusal. Machine infraternal-perf-test, x86_64, Linux 6.12.111, load 0.08/0.02/0.01; /var/lock/perf-bench.lock held only during the short run. Receipt: [model output](https://git.kayg.org/attachments/156ab1f0-d405-4bd9-9560-2a761adef132), [model source](https://git.kayg.org/attachments/d842d946-6746-4459-870e-839db551b8af), [failing foreground regression](https://git.kayg.org/attachments/46dccbb9-d55b-451f-a468-78b3acb543e8). Counts are not presented as real-phone measurements. Production browser/PTY check and final native checks remain pending (build-slot queue).
Author
Owner

Lifecycle implementation committed: 56dff47e6 (contract steps 08f44356b and 2b11b5f9b). Both peers advertise visibility capability; legacy peers receive no unknown transport notice. Hidden leases park; foreground relearns RTT without old correlations; explicit dropped hidden sockets wait until visible. Foreground browser routes use D300 two-RTT estimation and recover through a first missed allowance. Authentication expiry/revocation remain on the original independent path.
Per-commit checks: fmt, server all-target clippy, 34 native liveness tests, 5 transport tests, tracer TypeScript check, 49 browser connection tests passed. Native lint/tests.
At 224 modeled streams (8 sockets × 28), same perf-VM profile: foreground closes 93 -> 1 / modeled minute; 30s suspension case 67 -> 1. Every replacement recovered; all eight final routes welcomed. One combined RTT step/retransmission still exceeds the bounded allowance at this scale; it does not become a retry loop. These are deterministic browser-side model counts, not packet-level loss or physical-phone results. Scale receipt.
Next: fixed safe resume check diagnostics/tests, production-browser functional proof, final full static gate and size comparison. No push/deploy.

Lifecycle implementation committed: 56dff47e6 (contract steps 08f44356b and 2b11b5f9b). Both peers advertise visibility capability; legacy peers receive no unknown transport notice. Hidden leases park; foreground relearns RTT without old correlations; explicit dropped hidden sockets wait until visible. Foreground browser routes use D300 two-RTT estimation and recover through a first missed allowance. Authentication expiry/revocation remain on the original independent path. Per-commit checks: fmt, server all-target clippy, 34 native liveness tests, 5 transport tests, tracer TypeScript check, 49 browser connection tests passed. [Native lint/tests](https://git.kayg.org/attachments/6e8a47c4-5aeb-48a0-ae3a-b8553104b3ff). At 224 modeled streams (8 sockets × 28), same perf-VM profile: foreground closes 93 -> 1 / modeled minute; 30s suspension case 67 -> 1. Every replacement recovered; all eight final routes welcomed. One combined RTT step/retransmission still exceeds the bounded allowance at this scale; it does not become a retry loop. These are deterministic browser-side model counts, not packet-level loss or physical-phone results. [Scale receipt](https://git.kayg.org/attachments/db81412b-3572-4208-9870-70e3efc4886d). Next: fixed safe resume check diagnostics/tests, production-browser functional proof, final full static gate and size comparison. No push/deploy.
Author
Owner

Diagnostics committed: 3c29e3d96. Server logs fixed connection_resume_refused check categories (connection_active, connection_owner, connection_missing, resume_expired, token_mismatch, capacity/rotation/session-authority stages), never credentials or arbitrary error text. The original admission query, writer lock and constant-time token comparison remain; the extra state query runs only after refusal.
Native tests reproduce an overlapping active socket, a wrong owner, a missing row, expiry, an incorrect token, and a committed rotation whose Welcome was lost. Every refusal remains strict and is now distinguishable. fmt and all-target server clippy passed; 9 writer/authority tests passed, 1 existing release scale measurement ignored. Verbatim check output.
The historical production refusal cannot be assigned to one category from its existing log. Same process PID rules out a restart during the observed interval; no epoch or terminal-stream ID is checked in connection resume. Static baseline/head comparison is building; full final gate and production browser proof are next. No push/deploy.

Diagnostics committed: 3c29e3d96. Server logs fixed `connection_resume_refused` check categories (connection_active, connection_owner, connection_missing, resume_expired, token_mismatch, capacity/rotation/session-authority stages), never credentials or arbitrary error text. The original admission query, writer lock and constant-time token comparison remain; the extra state query runs only after refusal. Native tests reproduce an overlapping active socket, a wrong owner, a missing row, expiry, an incorrect token, and a committed rotation whose Welcome was lost. Every refusal remains strict and is now distinguishable. fmt and all-target server clippy passed; 9 writer/authority tests passed, 1 existing release scale measurement ignored. [Verbatim check output](https://git.kayg.org/attachments/9d9b2b5a-c2a2-42db-9afc-505e50cc3830). The historical production refusal cannot be assigned to one category from its existing log. Same process PID rules out a restart during the observed interval; no epoch or terminal-stream ID is checked in connection resume. Static baseline/head comparison is building; full final gate and production browser proof are next. No push/deploy.
Author
Owner

Self-review found two background retry boundary cases: an online event could bypass the hidden-page park, and a retry timer armed just before hiding could still open a socket. Both reproduced as 2 sockets where 1 was required. Fixed in 85ce1c1f8: ignore online hints while hidden and cancel pending retry timers on hide, retaining the visibility listener for immediate foreground recovery.
Tracer TypeScript check and all 50 browser connection tests pass. Failing regressions, passing regressions. No new dependencies, UI components, auth relaxations or deployment.
Static comparison build is progressing; baseline x86_64 release build completed and branch build is running with the same target/toolchain recipe. Next is a real TCP loss/jitter check inside private perf-VM network/mount/PID namespaces, plus the real-browser fresh attach regression and final scripts/verify fast.

Self-review found two background retry boundary cases: an online event could bypass the hidden-page park, and a retry timer armed just before hiding could still open a socket. Both reproduced as 2 sockets where 1 was required. Fixed in 85ce1c1f8: ignore online hints while hidden and cancel pending retry timers on hide, retaining the visibility listener for immediate foreground recovery. Tracer TypeScript check and all 50 browser connection tests pass. [Failing regressions](https://git.kayg.org/attachments/48c16160-9c50-4e5e-843d-3d0f209757f2), [passing regressions](https://git.kayg.org/attachments/58b5b4ec-f27d-474f-aa32-9f56aff0698d). No new dependencies, UI components, auth relaxations or deployment. Static comparison build is progressing; baseline x86_64 release build completed and branch build is running with the same target/toolchain recipe. Next is a real TCP loss/jitter check inside private perf-VM network/mount/PID namespaces, plus the real-browser fresh attach regression and final scripts/verify fast.
Author
Owner

Same-recipe stripped static x86_64 comparison complete: merge base 5b2a1b9ee = 21,096,144 B (exactly the shipping ceiling); current native implementation = 21,100,176 B, delta +4,032 B (+3.94 KiB). Both built with scripts/static-cargo, locked dependencies, Rust 1.99.0 and the same job target directory/compiler wrapper.
D243 justification/proposal before adjusting the exact ceiling: the 4,032 B adds the negotiated bounded visibility parser/lease scheduling and fixed secret-free resume diagnostics needed for #244. Existing Event codec/serde/runtime are reused; no crate or feature additions. This is below the brief's 16 KiB threshold. ARM measurement and full final gate remain pending; no ceiling is loosened beyond measured bytes and DECISIONS.md stays unchanged.
Real TCP netem proof is running on the perf VM with 75ms ±40ms per loopback hop, normal jitter, 0.5% packet loss and seed 244. Private mount/network/PID namespaces isolate /run, /var/log and generated fixture account files. The first attempt did not create a terminal; the fixture was aligned with the existing CA-unlock setup before taking measurements. No production state changed.

Same-recipe stripped static x86_64 comparison complete: merge base 5b2a1b9ee = 21,096,144 B (exactly the shipping ceiling); current native implementation = 21,100,176 B, delta +4,032 B (+3.94 KiB). Both built with scripts/static-cargo, locked dependencies, Rust 1.99.0 and the same job target directory/compiler wrapper. D243 justification/proposal before adjusting the exact ceiling: the 4,032 B adds the negotiated bounded visibility parser/lease scheduling and fixed secret-free resume diagnostics needed for #244. Existing Event codec/serde/runtime are reused; no crate or feature additions. This is below the brief's 16 KiB threshold. ARM measurement and full final gate remain pending; no ceiling is loosened beyond measured bytes and DECISIONS.md stays unchanged. Real TCP netem proof is running on the perf VM with 75ms ±40ms per loopback hop, normal jitter, 0.5% packet loss and seed 244. Private mount/network/PID namespaces isolate /run, /var/log and generated fixture account files. The first attempt did not create a terminal; the fixture was aligned with the existing CA-unlock setup before taking measurements. No production state changed.
Author
Owner

Real-browser test step committed: 728284e33. Production static server + production browser + real passkey/CA + retained PTY. Hidden CDP freezes of 5s/30s keep the socket. Removing only fixture connection state, then restarting, produces exactly one explicit refusal and one fresh Hello; an executed echo mobile-resumed-$((6*7)) returns mobile-resumed-42. TCP upgrades that fail while the server restarts are counted separately from fresh attach. Strict real-spec TypeScript check and tracer check passed.
Actual TCP netem comparison on infraternal-perf-test (kernel 6.12.111, quiet load 0.00/0.00/0.00 baseline, 0.11/0.04/0.01 branch): same seed 244, 75ms ±40ms normal delay per loopback hop (TLS front and backend), 0.5% packet loss, one mobile 393×852 viewer, real PTY. Same 25s visible + 5s/30s frozen observation:

  • baseline 5b2a1b9ee: 2 socket closes in 62,058ms = 1.9337 closes/min; 86/17,751 packets dropped;
  • branch: 0 socket closes in 62,087ms = 0/min; 41/9,134 packets dropped.
    The whole-socket closed count is used. The observer's extra server_closes field is unused: its tag comparison does not match this fixture's server <code> format. It does not identify which peer closed first. Initial_sockets=1 on both runs confirms no setup closes entered these counts.
    Paired netem receipt also contains the first functional assertion attempt; that assertion incorrectly omitted the bridge's s0 reason prefix. Corrected test then passed with actual packet loss (20 dropped): functional receipt.
    Namespace/profile driver, paired observer source, same-recipe x86 size comparison.
    Production-build screenshot for owner review (no visual-quality claim):
    resumed mobile terminal
    ARM build and final scripts/verify fast remain pending. No push/deploy.
Real-browser test step committed: 728284e33. Production static server + production browser + real passkey/CA + retained PTY. Hidden CDP freezes of 5s/30s keep the socket. Removing only fixture connection state, then restarting, produces exactly one explicit refusal and one fresh Hello; an executed `echo mobile-resumed-$((6*7))` returns `mobile-resumed-42`. TCP upgrades that fail while the server restarts are counted separately from fresh attach. Strict real-spec TypeScript check and tracer check passed. Actual TCP netem comparison on infraternal-perf-test (kernel 6.12.111, quiet load 0.00/0.00/0.00 baseline, 0.11/0.04/0.01 branch): same seed 244, 75ms ±40ms normal delay per loopback hop (TLS front and backend), 0.5% packet loss, one mobile 393×852 viewer, real PTY. Same 25s visible + 5s/30s frozen observation: - baseline 5b2a1b9ee: 2 socket closes in 62,058ms = 1.9337 closes/min; 86/17,751 packets dropped; - branch: 0 socket closes in 62,087ms = 0/min; 41/9,134 packets dropped. The whole-socket `closed` count is used. The observer's extra `server_closes` field is unused: its tag comparison does not match this fixture's `server <code>` format. It does not identify which peer closed first. Initial_sockets=1 on both runs confirms no setup closes entered these counts. [Paired netem receipt](https://git.kayg.org/attachments/45e0e6d5-11ba-4c38-8d1b-c3482fe742ec) also contains the first functional assertion attempt; that assertion incorrectly omitted the bridge's `s0 ` reason prefix. Corrected test then passed with actual packet loss (20 dropped): [functional receipt](https://git.kayg.org/attachments/4a7108b0-89a0-41eb-978d-4910d56ec1ee). [Namespace/profile driver](https://git.kayg.org/attachments/0ca6a582-2a15-4119-b57a-6fe550bcdceb), [paired observer source](https://git.kayg.org/attachments/2a6acf77-0112-4b8e-be33-58322e99c2ac), [same-recipe x86 size comparison](https://git.kayg.org/attachments/48033830-5bf4-4748-8c2f-8002585d7890). Production-build screenshot for owner review (no visual-quality claim): ![resumed mobile terminal](https://git.kayg.org/attachments/a73b0a45-22d1-458f-9e63-7418444c1a90) ARM build and final scripts/verify fast remain pending. No push/deploy.
Author
Owner

ARM static build complete: aarch64-unknown-linux-musl is 19,328,840 B, +3,320 B over the recorded release-3 ceiling (19,325,520 B). x86_64 is 21,100,176 B, +4,032 B against a same-recipe rebuild of merge base 5b2a1b9ee (21,096,144 B). file identifies both providers as static and stripped. No dependency or feature changes.
Under D243, propose exact ceilings 21,100,176 / 19,328,840 B for #244's bounded visibility handling and fixed refusal diagnostics; no spare growth allowance. Both deltas are below 16 KiB and justified by the real TCP false-close reduction 1.9337/min -> 0/min. Updating the two exact values and their process documentation, then running scripts/verify fast on the committed head.

ARM static build complete: aarch64-unknown-linux-musl is 19,328,840 B, +3,320 B over the recorded release-3 ceiling (19,325,520 B). x86_64 is 21,100,176 B, +4,032 B against a same-recipe rebuild of merge base 5b2a1b9ee (21,096,144 B). file identifies both providers as static and stripped. No dependency or feature changes. Under D243, propose exact ceilings 21,100,176 / 19,328,840 B for #244's bounded visibility handling and fixed refusal diagnostics; no spare growth allowance. Both deltas are below 16 KiB and justified by the real TCP false-close reduction 1.9337/min -> 0/min. Updating the two exact values and their process documentation, then running scripts/verify fast on the committed head.
Author
Owner

Full gate milestone on 7c654f8cc reached PASS for fmt, VT fmt, CLI plugin compile-out, clippy, cargo-deny and both static providers (exact new sizes and key-heap checks). The Rust test row failed in an existing gate fixture: previous_attempt_shell.py unconditionally reads INFRATERNAL_TEST_RUNTIME_HELPER, but previous_attempt_shell.rs does not set it. 32 cases fail with KeyError before exercising their oracle. The helper binary already exists at target/debug/examples/recovery-helper; Rust SSH fixtures already resolve it through tests/common::runtime_helper().
Fixing this wrapper to reuse that resolver and the existing shared scratch helper, instead of requiring an undocumented caller environment. No test is skipped and no shipping code/dependency changes. Final head also includes e42294042: two test assertions now compare counts so failure reports cannot serialize fixture cookies. Synthetic marker reproduction and strict TypeScript checks passed; real-engine success predicates remain identical. Assertion-reporting proof.
Perf cleanup is complete: no process held this job's executable/runner artifacts before removing only its VM folder. Cleanup receipt. Full gate will be rerun on the final committed head after the fixture correction.

Full gate milestone on 7c654f8cc reached PASS for fmt, VT fmt, CLI plugin compile-out, clippy, cargo-deny and both static providers (exact new sizes and key-heap checks). The Rust test row failed in an existing gate fixture: previous_attempt_shell.py unconditionally reads INFRATERNAL_TEST_RUNTIME_HELPER, but previous_attempt_shell.rs does not set it. 32 cases fail with KeyError before exercising their oracle. The helper binary already exists at target/debug/examples/recovery-helper; Rust SSH fixtures already resolve it through tests/common::runtime_helper(). Fixing this wrapper to reuse that resolver and the existing shared scratch helper, instead of requiring an undocumented caller environment. No test is skipped and no shipping code/dependency changes. Final head also includes e42294042: two test assertions now compare counts so failure reports cannot serialize fixture cookies. Synthetic marker reproduction and strict TypeScript checks passed; real-engine success predicates remain identical. [Assertion-reporting proof](https://git.kayg.org/attachments/35295af4-e027-4b08-986b-85f4e568052e). Perf cleanup is complete: no process held this job's executable/runner artifacts before removing only its VM folder. [Cleanup receipt](https://git.kayg.org/attachments/d6719062-d400-4d89-bbb7-d145b572ee27). Full gate will be rerun on the final committed head after the fixture correction.
Author
Owner

Gate fixture correction committed: 997bf36868. previous_attempt_shell.rs now passes tests/common::runtime_helper() and common::scratch() to its Python oracle. Explicit caller overrides remain supported. fmt, SSH all-target clippy, helper example build and the wrapper's 34-case Python oracle pass. No shipping code or size changes.
Final scripts/verify fast is running on this committed head with CARGO_INCREMENTAL=0, CARGO_BUILD_JOBS=2 and the job's single target directory. No external runtime-helper override and no skipped test. The earlier milestone failure is retained as raw evidence; its only failed Rust row was the missing fixture environment, while both exact static size/key-heap rows passed. Final full output will replace that milestone as the completion gate.

Gate fixture correction committed: 997bf36868c5e7b9dd558e1c9f4b1ecf60b382eb. previous_attempt_shell.rs now passes tests/common::runtime_helper() and common::scratch() to its Python oracle. Explicit caller overrides remain supported. fmt, SSH all-target clippy, helper example build and the wrapper's 34-case Python oracle pass. No shipping code or size changes. Final scripts/verify fast is running on this committed head with CARGO_INCREMENTAL=0, CARGO_BUILD_JOBS=2 and the job's single target directory. No external runtime-helper override and no skipped test. The earlier milestone failure is retained as raw evidence; its only failed Rust row was the missing fixture environment, while both exact static size/key-heap rows passed. Final full output will replace that milestone as the completion gate.
Author
Owner

The 997bf3686 gate proceeded past the corrected Python oracle, then three existing recovery_support cases failed before their checks because absolute AF_UNIX names exceeded sun_path (the newline-home case explicitly requires a short INFRATERNAL_TEST_STATE_ROOT). No production change caused this: the fixture's home/cache prefix plus .local/share/infraternal/sessions/32-hex.sock is too long.
Configured /run/user/1001/rrl244 as a short, job-owned runtime alias to /home/kayg/.cache/codex-scratch/resume-refused-loop/s. All data remains in this job's scratch directory; the alias is removed at cleanup. recovery_support now passes 11 tests with its one existing Docker-only ignore. No deadline, case or expectation was relaxed. Final full gate is rerunning on unchanged head 997bf36868 with this documented fixture root.

The 997bf3686 gate proceeded past the corrected Python oracle, then three existing recovery_support cases failed before their checks because absolute AF_UNIX names exceeded sun_path (the newline-home case explicitly requires a short INFRATERNAL_TEST_STATE_ROOT). No production change caused this: the fixture's home/cache prefix plus .local/share/infraternal/sessions/32-hex.sock is too long. Configured /run/user/1001/rrl244 as a short, job-owned runtime alias to /home/kayg/.cache/codex-scratch/resume-refused-loop/s. All data remains in this job's scratch directory; the alias is removed at cleanup. recovery_support now passes 11 tests with its one existing Docker-only ignore. No deadline, case or expectation was relaxed. Final full gate is rerunning on unchanged head 997bf36868c5e7b9dd558e1c9f4b1ecf60b382eb with this documented fixture root.
Author
Owner

Gate follow-up on 997bf36868: recovery_support had 3 existing failures because its absolute session socket name is 117 bytes before the newline variant (Linux sun_path is 108 bytes). A global short symlink override made those 11 tests pass but correctly failed 7 canonical replacement-path checks elsewhere, so that override is removed. Narrow fixture correction: use XDG_RUNTIME_DIR for these ephemeral socket fixtures when available, retain the explicit state-root override and HOME-cache fallback. Build artifacts remain in job scratch; production code and canonical-path checks stay unchanged. Running focused fmt/clippy/recovery tests before committing, then full fast again. No tests skipped.

Gate follow-up on 997bf36868: recovery_support had 3 existing failures because its absolute session socket name is 117 bytes before the newline variant (Linux sun_path is 108 bytes). A global short symlink override made those 11 tests pass but correctly failed 7 canonical replacement-path checks elsewhere, so that override is removed. Narrow fixture correction: use XDG_RUNTIME_DIR for these ephemeral socket fixtures when available, retain the explicit state-root override and HOME-cache fallback. Build artifacts remain in job scratch; production code and canonical-path checks stay unchanged. Running focused fmt/clippy/recovery tests before committing, then full fast again. No tests skipped.
Author
Owner

Step complete: 4a64e2cc2 limits the recovery fixture correction to ephemeral socket paths. cargo fmt --all --check and all-target SSH clippy pass; recovery_support: 11 passed, 0 failed, 1 pre-existing container-only ignore. Global symlink override removed. Full scripts/verify fast is running on this head with the normal canonical state roots.

Step complete: 4a64e2cc2 limits the recovery fixture correction to ephemeral socket paths. cargo fmt --all --check and all-target SSH clippy pass; recovery_support: 11 passed, 0 failed, 1 pre-existing container-only ignore. Global symlink override removed. Full scripts/verify fast is running on this head with the normal canonical state roots.
Author
Owner

Author review on 4a64e2cc2: additive Hello capability gates the <=128-byte typed visibility Event; existing frame codec and JSON parser are reused, with no dependencies/features added. Visibility only parks probe deadlines: authentication/revocation, writer ownership, attachment/memory caps and socket limits remain enforced. Correlation IDs remain monotonic and old replies cannot renew a visible lease after suspension. Foreground proven-route retirement is bounded at 500 ms–4 s; initial unknown-RTT grace remains 2 s. Browser listeners/timers retire with the connection; pending retries and online hints remain parked while hidden. Refusal diagnostics contain fixed categories only; original eligibility query, writer transaction and constant-time token check remain authoritative. The fresh-attach path wipes refused capability buffers and retains ordinary exponential retry backoff. Real PTY marker is computed by the shell, so echoed input cannot satisfy the assertion. Failure formatting uses counts instead of bridge objects that contain fixture cookies. Existing auth/socket/path guards were not weakened. Screenshot is attached for independent visual review; this is Chromium mobile emulation, not a physical iPhone claim. Historical exact resume refusal check remains unknowable from the old aggregate logs.

Author review on 4a64e2cc2: additive Hello capability gates the <=128-byte typed visibility Event; existing frame codec and JSON parser are reused, with no dependencies/features added. Visibility only parks probe deadlines: authentication/revocation, writer ownership, attachment/memory caps and socket limits remain enforced. Correlation IDs remain monotonic and old replies cannot renew a visible lease after suspension. Foreground proven-route retirement is bounded at 500 ms–4 s; initial unknown-RTT grace remains 2 s. Browser listeners/timers retire with the connection; pending retries and online hints remain parked while hidden. Refusal diagnostics contain fixed categories only; original eligibility query, writer transaction and constant-time token check remain authoritative. The fresh-attach path wipes refused capability buffers and retains ordinary exponential retry backoff. Real PTY marker is computed by the shell, so echoed input cannot satisfy the assertion. Failure formatting uses counts instead of bridge objects that contain fixture cookies. Existing auth/socket/path guards were not weakened. Screenshot is attached for independent visual review; this is Chromium mobile emulation, not a physical iPhone claim. Historical exact resume refusal check remains unknowable from the old aggregate logs.
Author
Owner

Full fast on 4a64e2cc2 reached SSH install tests, where review_inode_reuse_after_diagnostics_preserves_live_replacement could not reproduce filesystem inode reuse in 256 allocations (93 passed, 1 failed, 1 pre-existing ignore). It failed during fixture preparation, not the preservation assertion. Immediate exact-test rerun on unchanged head passed, reaching the actual safety assertion (1 passed, 94 filtered). No waiver, test skip or code change: rerunning the full gate on the same head. Prior global alias is gone; recovery_support passes with its narrow real-runtime fixture path.

Full fast on 4a64e2cc2 reached SSH install tests, where review_inode_reuse_after_diagnostics_preserves_live_replacement could not reproduce filesystem inode reuse in 256 allocations (93 passed, 1 failed, 1 pre-existing ignore). It failed during fixture preparation, not the preservation assertion. Immediate exact-test rerun on unchanged head passed, reaching the actual safety assertion (1 passed, 94 filtered). No waiver, test skip or code change: rerunning the full gate on the same head. Prior global alias is gone; recovery_support passes with its narrow real-runtime fixture path.
Author
Owner
[fast-inode-allocation.log](https://git.kayg.org/attachments/6ff85335-8225-48bb-b7ea-28a438046d30) [inode-recheck.log](https://git.kayg.org/attachments/3b48dd82-b537-44d7-8f30-0b54c9757b2e) [recovery-runtime-root.log](https://git.kayg.org/attachments/9c76c336-6bcf-4270-aebb-9f32639ad6ef)
Author
Owner

Full fast on 4a64e2cc2: every Rust gate row PASS, including the unchanged inode-reuse fixture. Frontend combined suite then found 6 failures at MuxConnection construction: earlier canvas fixtures leave a partial document without addEventListener. Focused connection suites alone had not exposed that shared-run environment. Narrow correction guards visibility listener registration/removal by method availability, consistent with existing optional browser APIs; real-browser behavior is unchanged. Keeping the failing combined transcript; rerunning the exact frontend test set and check before an atomic commit and final full gate.

Full fast on 4a64e2cc2: every Rust gate row PASS, including the unchanged inode-reuse fixture. Frontend combined suite then found 6 failures at MuxConnection construction: earlier canvas fixtures leave a partial document without addEventListener. Focused connection suites alone had not exposed that shared-run environment. Narrow correction guards visibility listener registration/removal by method availability, consistent with existing optional browser APIs; real-browser behavior is unchanged. Keeping the failing combined transcript; rerunning the exact frontend test set and check before an atomic commit and final full gate.
Author
Owner

Step complete: 526460c2e adds only availability guards for visibility listener registration/removal in non-browser consumers. bun run check and the exact combined frontend gate suite pass: 256 pass, 0 fail, 11712 assertions. Existing six failures are now green. No production browser behavior or Rust bytes changed. scripts/verify fast is running on this new committed head; all Rust rows passed on the immediate prior head.

Step complete: 526460c2e adds only availability guards for visibility listener registration/removal in non-browser consumers. bun run check and the exact combined frontend gate suite pass: 256 pass, 0 fail, 11712 assertions. Existing six failures are now green. No production browser behavior or Rust bytes changed. scripts/verify fast is running on this new committed head; all Rust rows passed on the immediate prior head.
Author
Owner
[fast-partial-document.log](https://git.kayg.org/attachments/e24d28a9-fcf0-4902-9123-2a0741f94ab3) [partial-document-fixed.log](https://git.kayg.org/attachments/88349084-a3de-48a5-840c-29595a6d78ae)
Author
Owner

Finished implementation on resume-refused-loop. Head: 526460c2e6. Atomic commits retained; clean worktree. No push or deployment.

Findings and behavior: browser routes used a tighter one-RTT allowance and first-miss retirement, and had no hidden-page suspension notice. Negotiated bounded visibility notices now park browser probes while hidden and relearn on visibility. Proven foreground browser routes use the D300 two-RTT/jitter allowance and first-miss doubt, with retirement bounded to 500 ms–4 s; startup grace remains 2 s. Authentication/revocation and resource caps remain enforced. Hidden retries/online hints park too.

Refused resume credentials previously survived until their 120 s expiry and were retried. They are now wiped at refusal; the next handshake attaches afresh once, retaining exponential backoff. Copy explains automatic terminal reconnection. Historical logs do not identify the exact refusal check, and cannot establish a token/ownership/expiry cause. Same PID excludes a restart within the observed interval; epoch/stream ID are not connection-resume checks. New fixed-category, secret-free diagnostics distinguish the checks for future incidents. Production close counts were terminal-stream closes, not necessarily distinct socket closes.

Real TCP netem on the locked perf VM (75 ms ±40 ms per hop, normal jitter, 0.5% loss, seed 244; 5 s and 30 s renderer freezes): before 2 socket closes/62.058 s = 1.9337/min; after 0/62.087 s = 0/min. Packet drops were 86/17751 before and 41/9134 after. Separate real browser/passkey/PTY functional proof passes with actual packet loss: one refusal, one fresh Hello, computed shell marker received after recovery. These are Chromium mobile emulation results, not a physical iPhone claim. At scale, the deterministic 8-socket/224-stream model reduced jitter closes 93→1/min and suspension closes 67→1/min; it did not establish zero closes universally.

Raw TCP measurement: receipt. Real functional proof: receipt. Screenshot for independent review: resumed terminal.

Final stripped static sizes: x86_64 21,100,176 B, +4,032 B against same-recipe merge-base rebuild; ARM 19,328,840 B, +3,320 B against recorded shipping ceiling. No dependencies/features added; exact ceilings match these bytes. Author review is recorded above. Gate fixture corrections and the failed preparations remain attached alongside successful reruns; no extra test skips or baseline waivers.

Full final gate output is attached verbatim; summary below is quoted verbatim. The command used the build-slot wrapper, the job target, CARGO_INCREMENTAL=0, CARGO_BUILD_JOBS=2 and TRACER_TEST_PORT=4444; no global state-root alias.

fast.log
final-gate-summary.txt

scripts/verify fast: exit 0
Head: 526460c2e6b3b36825c32ab5f7e1765ab6ae4c16

| Rust gate                 | Result       |
+---------------------------+--------------+
| fmt                       | PASS         |
| VT native fmt             | PASS         |
| CLI plugin compile-out    | PASS         |
| clippy                    | PASS         |
| test                      | PASS         |
| cargo-deny                | PASS         |
| static builds             | PASS         |
+---------------------------+--------------+


 256 pass
 0 fail
 11712 expect() calls


 37 pass
 0 fail
 34463 expect() calls

Cleanup: private perf namespaces/processes and VM artifacts are already removed (receipt). Local baseline worktree, 21 GiB target, temporary Node toolchain, comparison binaries and runtime alias are removed; evidence retained outside checkout.
final-cleanup.txt

Finished implementation on resume-refused-loop. Head: 526460c2e6b3b36825c32ab5f7e1765ab6ae4c16. Atomic commits retained; clean worktree. No push or deployment. Findings and behavior: browser routes used a tighter one-RTT allowance and first-miss retirement, and had no hidden-page suspension notice. Negotiated bounded visibility notices now park browser probes while hidden and relearn on visibility. Proven foreground browser routes use the D300 two-RTT/jitter allowance and first-miss doubt, with retirement bounded to 500 ms–4 s; startup grace remains 2 s. Authentication/revocation and resource caps remain enforced. Hidden retries/online hints park too. Refused resume credentials previously survived until their 120 s expiry and were retried. They are now wiped at refusal; the next handshake attaches afresh once, retaining exponential backoff. Copy explains automatic terminal reconnection. Historical logs do not identify the exact refusal check, and cannot establish a token/ownership/expiry cause. Same PID excludes a restart within the observed interval; epoch/stream ID are not connection-resume checks. New fixed-category, secret-free diagnostics distinguish the checks for future incidents. Production close counts were terminal-stream closes, not necessarily distinct socket closes. Real TCP netem on the locked perf VM (75 ms ±40 ms per hop, normal jitter, 0.5% loss, seed 244; 5 s and 30 s renderer freezes): before 2 socket closes/62.058 s = 1.9337/min; after 0/62.087 s = 0/min. Packet drops were 86/17751 before and 41/9134 after. Separate real browser/passkey/PTY functional proof passes with actual packet loss: one refusal, one fresh Hello, computed shell marker received after recovery. These are Chromium mobile emulation results, not a physical iPhone claim. At scale, the deterministic 8-socket/224-stream model reduced jitter closes 93→1/min and suspension closes 67→1/min; it did not establish zero closes universally. Raw TCP measurement: [receipt](https://git.kayg.org/attachments/45e0e6d5-11ba-4c38-8d1b-c3482fe742ec). Real functional proof: [receipt](https://git.kayg.org/attachments/4a7108b0-89a0-41eb-978d-4910d56ec1ee). Screenshot for independent review: [resumed terminal](https://git.kayg.org/attachments/a73b0a45-22d1-458f-9e63-7418444c1a90). Final stripped static sizes: x86_64 21,100,176 B, +4,032 B against same-recipe merge-base rebuild; ARM 19,328,840 B, +3,320 B against recorded shipping ceiling. No dependencies/features added; exact ceilings match these bytes. Author review is recorded above. Gate fixture corrections and the failed preparations remain attached alongside successful reruns; no extra test skips or baseline waivers. Full final gate output is attached verbatim; summary below is quoted verbatim. The command used the build-slot wrapper, the job target, CARGO_INCREMENTAL=0, CARGO_BUILD_JOBS=2 and TRACER_TEST_PORT=4444; no global state-root alias. [fast.log](https://git.kayg.org/attachments/1fd76e6d-1672-4caa-8217-bd83c16b05bb) [final-gate-summary.txt](https://git.kayg.org/attachments/378b47e8-a438-497a-9dfd-0691bb8544c6) ```text scripts/verify fast: exit 0 Head: 526460c2e6b3b36825c32ab5f7e1765ab6ae4c16 | Rust gate | Result | +---------------------------+--------------+ | fmt | PASS | | VT native fmt | PASS | | CLI plugin compile-out | PASS | | clippy | PASS | | test | PASS | | cargo-deny | PASS | | static builds | PASS | +---------------------------+--------------+ 256 pass 0 fail 11712 expect() calls 37 pass 0 fail 34463 expect() calls ``` Cleanup: private perf namespaces/processes and VM artifacts are already removed ([receipt](https://git.kayg.org/attachments/d6719062-d400-4d89-bbb7-d145b572ee27)). Local baseline worktree, 21 GiB target, temporary Node toolchain, comparison binaries and runtime alias are removed; evidence retained outside checkout. [final-cleanup.txt](https://git.kayg.org/attachments/fd0bc45d-88c3-4c0d-9382-f3f5eee07c6e)
Author
Owner

Break-it review starting on review-resume-refused-loop, head/base 526460c2e6; reviewed diff base 5b2a1b9ee3. Read all 24 comments; no parent linked. Checking hidden authority lifetime, refusal fallback/input/replay, lifecycle ordering and D300 host deadlines independently. Worktree DECISIONS ends at D299; checking origin/dev for D300. Findings/evidence: ~/.cache/codex-scratch/review-resume-refused-loop/. No deployment; only review branch may be pushed.

Break-it review starting on review-resume-refused-loop, head/base 526460c2e6b3b36825c32ab5f7e1765ab6ae4c16; reviewed diff base 5b2a1b9ee32b37433a3a2ba1430973e9fc2b317d. Read all 24 comments; no parent linked. Checking hidden authority lifetime, refusal fallback/input/replay, lifecycle ordering and D300 host deadlines independently. Worktree DECISIONS ends at D299; checking origin/dev for D300. Findings/evidence: ~/.cache/codex-scratch/review-resume-refused-loop/. No deployment; only review branch may be pushed.
Author
Owner

Independent review finding P1: automatic refused-resume fallback silently loses offline typing. Test review: refusal fallback preserves offline typing through the fresh writer replay fence (apps/tracer/src/connection-review-refusal-input.test.ts) drives real MuxConnection + TerminalClient callbacks: 11 never-transmitted bytes queued after disconnect; exactly 1 Resume and 1 fresh AttachTerm; after replay fence, 0 Input bytes delivered (expected never-sent\n). New fallback dispatches onWelcome(false); terminal.ts:870 calls restartCursors(), which clears inputQueue at :1169. Previously sent/unacknowledged bytes are ambiguous on a new writer; never-sent bytes must not disappear silently. Failing reproduction. Test commit follows compiler check. D300 read from origin/dev; review branch's decision snapshot ends at D299. Full fast waiting for build slot; audit continues.

Independent review finding P1: automatic refused-resume fallback silently loses offline typing. Test `review: refusal fallback preserves offline typing through the fresh writer replay fence` (apps/tracer/src/connection-review-refusal-input.test.ts) drives real MuxConnection + TerminalClient callbacks: 11 never-transmitted bytes queued after disconnect; exactly 1 Resume and 1 fresh AttachTerm; after replay fence, 0 Input bytes delivered (expected `never-sent\n`). New fallback dispatches onWelcome(false); terminal.ts:870 calls restartCursors(), which clears inputQueue at :1169. Previously sent/unacknowledged bytes are ambiguous on a new writer; never-sent bytes must not disappear silently. [Failing reproduction](https://git.kayg.org/attachments/2cdfab02-ae21-44f6-af09-3feb83690652). Test commit follows compiler check. D300 read from origin/dev; review branch's decision snapshot ends at D299. Full fast waiting for build slot; audit continues.
Author
Owner

Review step: 7464a7797 (pushed) preserves the P1 offline-input failure; compiler check passes. Additional P2 reproduced: a refused resume forgets its capability once and fresh refusals keep backing off when online hint is false (connection-restart.test.ts). Same oracle with online=true passes. With false, explicit resume refusal then fresh refusal both schedule 50 ms (zero jitter), failing expected >50; disconnect resets retryAttempt for the stale offline hint. This reset predates #244 but still defeats growing backoff on its fresh fallback path. Failing output and passing control. No claim of measured request rate. Native hidden/logout check and paired perf measurements remain in progress.

Review step: 7464a7797 (pushed) preserves the P1 offline-input failure; compiler check passes. Additional P2 reproduced: `a refused resume forgets its capability once and fresh refusals keep backing off when online hint is false` (connection-restart.test.ts). Same oracle with online=true passes. With false, explicit resume refusal then fresh refusal both schedule 50 ms (zero jitter), failing expected >50; disconnect resets retryAttempt for the stale offline hint. This reset predates #244 but still defeats growing backoff on its fresh fallback path. [Failing output and passing control](https://git.kayg.org/attachments/7220cd34-30e4-4aff-a885-e5b2ed4b8213). No claim of measured request rate. Native hidden/logout check and paired perf measurements remain in progress.
Author
Owner

Review step 59132456f (pushed): preserves the P2 stale-offline backoff failure and passing online control. Step 7777a8a18 (pushed): two additional queue/visibility ordering checks pass, one socket / 28 streams / modeled 30s suspension; all 37 idle tests pass, 76 assertions, TypeScript check passes. These are task-order checks, not a physical iOS claim.

Independent paired host-lease measurement on locked infraternal-perf-test, kernel 6.12.111, load 0.08/0.08/0.02 -> 0.08/0.09/0.02. Compiled exact Liveness sources from 5b2a1b9ee and 526460c2e into one driver; real TCP echo, 25ms probes, private network namespaces, no shared network changes. Delay/loss from tc netem. Time from last accepted reply to doubt/retire includes up to one probe interval:

  • LAN baseline 273/525ms, patch 275/524ms.
  • 150ms RTT baseline 385/767ms, patch 380/762ms.
  • 150ms + seeded 1% loss baseline 381/763ms, patch 380/758ms; healthy retirements 0/0 across 20s each; 35 actual packets dropped in the paired namespace.
    No doubling found in this lease path. This is not a repeat of #234's ten-minute real host-link test and does not establish the universal mobile zero-close claim. Receipt. Full fast compiling (cold job target); no gate pass claimed.
Review step 59132456f (pushed): preserves the P2 stale-offline backoff failure and passing online control. Step 7777a8a18 (pushed): two additional queue/visibility ordering checks pass, one socket / 28 streams / modeled 30s suspension; all 37 idle tests pass, 76 assertions, TypeScript check passes. These are task-order checks, not a physical iOS claim. Independent paired host-lease measurement on locked infraternal-perf-test, kernel 6.12.111, load 0.08/0.08/0.02 -> 0.08/0.09/0.02. Compiled exact Liveness sources from 5b2a1b9ee and 526460c2e into one driver; real TCP echo, 25ms probes, private network namespaces, no shared network changes. Delay/loss from tc netem. Time from last accepted reply to doubt/retire includes up to one probe interval: - LAN baseline 273/525ms, patch 275/524ms. - 150ms RTT baseline 385/767ms, patch 380/762ms. - 150ms + seeded 1% loss baseline 381/763ms, patch 380/758ms; healthy retirements 0/0 across 20s each; 35 actual packets dropped in the paired namespace. No doubling found in this lease path. This is not a repeat of #234's ten-minute real host-link test and does not establish the universal mobile zero-close claim. [Receipt](https://git.kayg.org/attachments/e1c67340-ee62-4138-8a2d-4b1e07339819). Full fast compiling (cold job target); no gate pass claimed.
Author
Owner

Review controls: both native tests pass with real WebSocket/SQLite: review_hidden_socket_cannot_park_logout_revocation and review_hidden_socket_cannot_park_absolute_session_expiry. Expiry fixture updates the session after HTTP upgrade renewal and before the probe lease is created; hidden notice plus correlated proof leaves the persisted expiry unchanged. No hidden-session authority bypass demonstrated. Verbatim focused summary.

The first full gate found a style lint in the new test helper (corrected), and an existing UDP receipt fixture failed once (owned socket count 0 vs 1). Exact unchanged recheck passes: receipt. No waiver claimed; final full gate will rerun that row. Static builds are progressing. Test-only review head is currently 7777a8a18; authority-test commit awaits final lint. Paired perf driver and exact source snapshots; VM cleanup. All measurement processes exited and the owned VM directory is removed.

Review controls: both native tests pass with real WebSocket/SQLite: review_hidden_socket_cannot_park_logout_revocation and review_hidden_socket_cannot_park_absolute_session_expiry. Expiry fixture updates the session after HTTP upgrade renewal and before the probe lease is created; hidden notice plus correlated proof leaves the persisted expiry unchanged. No hidden-session authority bypass demonstrated. [Verbatim focused summary](https://git.kayg.org/attachments/ae933f1d-5f21-4c4c-9ace-c986a19b1f0b). The first full gate found a style lint in the new test helper (corrected), and an existing UDP receipt fixture failed once (owned socket count 0 vs 1). Exact unchanged recheck passes: [receipt](https://git.kayg.org/attachments/19b2a131-2a16-494b-aa14-09488ce67fa7). No waiver claimed; final full gate will rerun that row. Static builds are progressing. Test-only review head is currently 7777a8a18; authority-test commit awaits final lint. [Paired perf driver and exact source snapshots](https://git.kayg.org/attachments/7be0fea2-2aba-4c68-9619-9e4c6fabf472); [VM cleanup](https://git.kayg.org/attachments/34d59ea0-1b6e-4c97-b5b9-36bb50bcbf05). All measurement processes exited and the owned VM directory is removed.
Author
Owner

Review step complete: 3a642b42ea (pushed to review-resume-refused-loop) adds the two native hidden/logout and hidden/absolute-expiry controls; 2 passed, 0 failed. Fmt and whitespace checks pass. Earlier helper style issue is corrected; final branch-head clippy/full gate remains pending. Four atomic review commits, no shipping-code changes. Current verdict HOLD: P0=0, P1=1 (offline input loss), P2=1 (stale-offline refusal backoff), P3=0. Final gate and independent review-vs-reviewed-head static size comparison still running; no merge/deployment.

Review step complete: 3a642b42ea2f30e71b9f386bffa81a1b2a666f8c (pushed to review-resume-refused-loop) adds the two native hidden/logout and hidden/absolute-expiry controls; 2 passed, 0 failed. Fmt and whitespace checks pass. Earlier helper style issue is corrected; final branch-head clippy/full gate remains pending. Four atomic review commits, no shipping-code changes. Current verdict HOLD: P0=0, P1=1 (offline input loss), P2=1 (stale-offline refusal backoff), P3=0. Final gate and independent review-vs-reviewed-head static size comparison still running; no merge/deployment.
Author
Owner

Review step: 0cedabe9f (pushed) fixes only clippy::similar_names in the new authority fixture (short_session flag versus expiry value); both assertions/setups are intact. Full native test row now PASS, including the earlier UDP counter fixture and both new hidden-session controls. Static builds PASS at exact ceilings. That attempt's only failed row was the corrected naming lint; it is retained as a preliminary transcript, not final certification: fast-final.log. Corrected-head full gate queued with a lint preflight; five atomic test-only commits. HOLD counts remain P0=0/P1=1/P2=1/P3=0. No merge/deployment.

Review step: 0cedabe9f (pushed) fixes only clippy::similar_names in the new authority fixture (short_session flag versus expiry value); both assertions/setups are intact. Full native test row now PASS, including the earlier UDP counter fixture and both new hidden-session controls. Static builds PASS at exact ceilings. That attempt's only failed row was the corrected naming lint; it is retained as a preliminary transcript, not final certification: [fast-final.log](https://git.kayg.org/attachments/1244261f-0878-4027-8f54-a787d7fc43b0). Corrected-head full gate queued with a lint preflight; five atomic test-only commits. HOLD counts remain P0=0/P1=1/P2=1/P3=0. No merge/deployment.
Author
Owner

Finished break-it review: HOLD. P0=0, P1=1, P2=1, P3=0.
Reviewed 5b2a1b9ee..526460c2e. Final pushed review head: 0cedabe9f8cad7256938bd71619bbd35cf5e384d on review-resume-refused-loop; five test-only commits, clean worktree. No production fixes, merge or deployment.

  • P1: fresh fallback silently discards offline typing. review: refusal fallback preserves offline typing through the fresh writer replay fence (connection-review-refusal-input.test.ts). Exactly one Resume and one fresh AttachTerm; 11 never-transmitted bytes retained after disconnect become zero delivered bytes after replay confirmation. connection.ts:491 activates fresh recovery; terminal.ts:870 calls restartCursors(), clearing the queue at :1168. Preserve known-unsent input separately; previously sent bytes remain ambiguous on a new writer. Failing oracle.
  • P2: stale offline hint defeats refusal backoff. a refused resume forgets its capability once and fresh refusals keep backing off when online hint is false (connection-restart.test.ts). Explicit resume refusal then fresh refusal both schedule 50ms with zero jitter; the true-hint control grows its delay. The reset at connection.ts:529 predates the patch and remains on the new fallback path. Failure and control. These are deterministic scheduled constants, not measured request rates.

Native real-WebSocket/SQLite tests review_hidden_socket_cannot_park_logout_revocation and review_hidden_socket_cannot_park_absolute_session_expiry pass, including no renewal by hidden notice/proof. No hidden-session authorization bypass demonstrated. Hidden parking deliberately removes probe retirement; repeated half-open cleanup and physical iOS/bfcache behavior remain uncertified. Both queued-reply/visibility task orders pass at 28 streams.

Perf VM, exact native lease sources over TCP, private netem namespaces, lock held only during measurement; load 0.08/0.08/0.02 to 0.08/0.09/0.02. Baseline -> patch doubt/retire from last accepted reply (includes probe phase): LAN 273/525 -> 275/524ms; 150ms 385/767 -> 380/762ms; 150ms + 1% loss 381/763 -> 380/758ms. No doubling observed; 0 healthy retirements in each 20s window, 35 packet drops in the paired loss namespace. This is a lease driver, not the full UI/host actor or a ten-minute loss study. Receipt, exact driver/source snapshots.

Independent same-recipe stripped static x86 comparison: 21,096,144 -> 21,100,176 B (+4,032 B). ARM head 19,328,840 B. Rust 1.99.0, locked dependencies, same job target/static-cargo recipe. Size receipt.

The full gate is green, while the explicit review tests remain red. Current combined frontend invocation discovers 256 tests and omits the connection suites; an exact repeat reproduces that result. Explicit connection/close-reason invocation discovers 62 tests: 60 pass / 2 fail. No gate modifications or exclusions were added. Selector root cause is not established. Combined invocation, explicit connection invocation.

Final scripts/verify fast used build-slot, CARGO_INCREMENTAL=0, CARGO_BUILD_JOBS=2, RUST_TEST_THREADS=4 and TRACER_TEST_PORT=4497. Full output is attached verbatim; the following summary is quoted verbatim:

scripts/verify fast: exit 0
Head: 0cedabe9f8cad7256938bd71619bbd35cf5e384d

+---------------------------+--------------+
| Rust gate                 | Result       |
+---------------------------+--------------+
| fmt                       | PASS         |
| VT native fmt             | PASS         |
| CLI plugin compile-out    | PASS         |
| clippy                    | PASS         |
| test                      | PASS         |
| cargo-deny                | PASS         |
| static builds             | PASS         |
+---------------------------+--------------+

 256 pass
 0 fail
 11712 expect() calls

 37 pass
 0 fail
 34463 expect() calls

Appended findings. Local cleanup: own baseline, target, runtime and temporary binaries removed, zero running executable references, clean worktree and HEAD equals pushed head. Perf VM cleanup: owned directory removed and measurement processes/namespaces exited. Evidence retained outside checkout. Issue left open.

Finished break-it review: **HOLD**. **P0=0, P1=1, P2=1, P3=0**. Reviewed `5b2a1b9ee..526460c2e`. Final pushed review head: `0cedabe9f8cad7256938bd71619bbd35cf5e384d` on `review-resume-refused-loop`; five test-only commits, clean worktree. No production fixes, merge or deployment. - **P1: fresh fallback silently discards offline typing.** `review: refusal fallback preserves offline typing through the fresh writer replay fence` (`connection-review-refusal-input.test.ts`). Exactly one Resume and one fresh AttachTerm; 11 never-transmitted bytes retained after disconnect become zero delivered bytes after replay confirmation. `connection.ts:491` activates fresh recovery; `terminal.ts:870` calls `restartCursors()`, clearing the queue at `:1168`. Preserve known-unsent input separately; previously sent bytes remain ambiguous on a new writer. [Failing oracle](https://git.kayg.org/attachments/2cdfab02-ae21-44f6-af09-3feb83690652). - **P2: stale offline hint defeats refusal backoff.** `a refused resume forgets its capability once and fresh refusals keep backing off when online hint is false` (`connection-restart.test.ts`). Explicit resume refusal then fresh refusal both schedule 50ms with zero jitter; the true-hint control grows its delay. The reset at `connection.ts:529` predates the patch and remains on the new fallback path. [Failure and control](https://git.kayg.org/attachments/7220cd34-30e4-4aff-a885-e5b2ed4b8213). These are deterministic scheduled constants, not measured request rates. Native real-WebSocket/SQLite tests `review_hidden_socket_cannot_park_logout_revocation` and `review_hidden_socket_cannot_park_absolute_session_expiry` pass, including no renewal by hidden notice/proof. No hidden-session authorization bypass demonstrated. Hidden parking deliberately removes probe retirement; repeated half-open cleanup and physical iOS/bfcache behavior remain uncertified. Both queued-reply/visibility task orders pass at 28 streams. Perf VM, exact native lease sources over TCP, private netem namespaces, lock held only during measurement; load 0.08/0.08/0.02 to 0.08/0.09/0.02. Baseline -> patch doubt/retire from last accepted reply (includes probe phase): LAN **273/525 -> 275/524ms**; 150ms **385/767 -> 380/762ms**; 150ms + 1% loss **381/763 -> 380/758ms**. No doubling observed; 0 healthy retirements in each 20s window, 35 packet drops in the paired loss namespace. This is a lease driver, not the full UI/host actor or a ten-minute loss study. [Receipt](https://git.kayg.org/attachments/e1c67340-ee62-4138-8a2d-4b1e07339819), [exact driver/source snapshots](https://git.kayg.org/attachments/7be0fea2-2aba-4c68-9619-9e4c6fabf472). Independent same-recipe stripped static x86 comparison: **21,096,144 -> 21,100,176 B (+4,032 B)**. ARM head **19,328,840 B**. Rust 1.99.0, locked dependencies, same job target/static-cargo recipe. [Size receipt](https://git.kayg.org/attachments/38904150-12ee-4694-913f-46a53000e972). **The full gate is green, while the explicit review tests remain red.** Current combined frontend invocation discovers 256 tests and omits the connection suites; an exact repeat reproduces that result. Explicit connection/close-reason invocation discovers 62 tests: **60 pass / 2 fail**. No gate modifications or exclusions were added. Selector root cause is not established. [Combined invocation](https://git.kayg.org/attachments/7a5896db-af17-4730-a080-244447e7bbaf), [explicit connection invocation](https://git.kayg.org/attachments/bce7fb1c-7957-4b20-900e-06d7f6a8924f). Final `scripts/verify fast` used build-slot, CARGO_INCREMENTAL=0, CARGO_BUILD_JOBS=2, RUST_TEST_THREADS=4 and TRACER_TEST_PORT=4497. Full output is attached [verbatim](https://git.kayg.org/attachments/bcea96ad-d0de-4ef9-ba7c-635f7ef2f99d); the following summary is quoted verbatim: ```text scripts/verify fast: exit 0 Head: 0cedabe9f8cad7256938bd71619bbd35cf5e384d +---------------------------+--------------+ | Rust gate | Result | +---------------------------+--------------+ | fmt | PASS | | VT native fmt | PASS | | CLI plugin compile-out | PASS | | clippy | PASS | | test | PASS | | cargo-deny | PASS | | static builds | PASS | +---------------------------+--------------+ 256 pass 0 fail 11712 expect() calls 37 pass 0 fail 34463 expect() calls ``` [Appended findings](https://git.kayg.org/attachments/0aa73042-4ab6-4636-8b01-cebc8127574d). [Local cleanup](https://git.kayg.org/attachments/693ce59e-5c5f-4109-8bce-9248e15df0a8): own baseline, target, runtime and temporary binaries removed, zero running executable references, clean worktree and HEAD equals pushed head. [Perf VM cleanup](https://git.kayg.org/attachments/34d59ea0-1b6e-4c97-b5b9-36bb50bcbf05): owned directory removed and measurement processes/namespaces exited. Evidence retained outside checkout. Issue left open.
Author
Owner

Round 2 starting on resume-refused-loop-r2, base 526460c2e6. Read all 32 comments and review head 0cedabe9f; #244 has no parent link. Will retain ambiguous input in memory and offer explicit one-tap resend rather than automatically type into a fresh writer. Will fix stale-offline backoff and include connection suites in the fast gate. D300 deadlines remain unchanged. Perf VM measurement authorized by this brief; no deployment.

Round 2 starting on resume-refused-loop-r2, base 526460c2e6b3b36825c32ab5f7e1765ab6ae4c16. Read all 32 comments and review head 0cedabe9f; #244 has no parent link. Will retain ambiguous input in memory and offer explicit one-tap resend rather than automatically type into a fresh writer. Will fix stale-offline backoff and include connection suites in the fast gate. D300 deadlines remain unchanged. Perf VM measurement authorized by this brief; no deployment.
Author
Owner

Review tests cherry-picked through 76a2b3dc9 (five review commits). Before fixes the explicit focused run reproduced both review failures: 8 pass / 2 fail.
79cde72ae: refusal state survives stale offline hints until successful Welcome; ordinary outage fast recovery remains. Nine restart tests pass.
d0e38f25d: fresh writer retains the existing bounded input queue and requests explicit Resend typing through shared mountToast. No automatic stale typing. Updated review oracle covers both never-sent and sent/unacknowledged 11-byte input, no delivery before replay/consent, and no duplicate on a second tap. Explicit connection/close suites: 63 pass, 0 fail, 265 assertions; tracer check passes. No additional byte buffer: existing 1 MiB cap per terminal (224 terminals = 224 MiB allocated queue capacity) unchanged.
Fast gate selector fix: explicit shell-expanded ./src/connection*.test.ts in a separate Bun invocation; 55 connection tests now discovered, rather than zero. Existing frontend suite still passes. D300 deadlines, native production code and dependencies unchanged. Full fast, production screenshot/PTY proof and perf-VM repeat pending.

Review tests cherry-picked through 76a2b3dc9 (five review commits). Before fixes the explicit focused run reproduced both review failures: 8 pass / 2 fail. 79cde72ae: refusal state survives stale offline hints until successful Welcome; ordinary outage fast recovery remains. Nine restart tests pass. d0e38f25d: fresh writer retains the existing bounded input queue and requests explicit Resend typing through shared mountToast. No automatic stale typing. Updated review oracle covers both never-sent and sent/unacknowledged 11-byte input, no delivery before replay/consent, and no duplicate on a second tap. Explicit connection/close suites: 63 pass, 0 fail, 265 assertions; tracer check passes. No additional byte buffer: existing 1 MiB cap per terminal (224 terminals = 224 MiB allocated queue capacity) unchanged. Fast gate selector fix: explicit shell-expanded ./src/connection*.test.ts in a separate Bun invocation; 55 connection tests now discovered, rather than zero. Existing frontend suite still passes. D300 deadlines, native production code and dependencies unchanged. Full fast, production screenshot/PTY proof and perf-VM repeat pending.
Author
Owner

#244 round-2 self-review (D11/D160/D243/D262/D300)

  • Fresh-writer safety: input stays in the existing bounded ByteQueue, with fresh zero-based offsets; replay cannot send it until consent. The warning explicitly states that old delivery is uncertain. Sent/unacknowledged and never-sent review cases both hold all 11 bytes. A premature consent and a repeated consent send no extra Input.
  • Normal resumed writers retain the original sequence/ack behavior. Explicit restartCursors() for a chosen new session still clears its old queues. Disposal clears retained bytes and disposes the notice.
  • No new parser, transport/auth check, dependency, feature or native shipping source. The only Rust differences from 526460c2e are the independent authority tests. D300 estimation and retirement methods unchanged.
  • Failed resumed capability is forgotten once. A refusal-recovery flag prevents stale offline/foreground hints resetting its retry count; real Welcome clears it. Ordinary no-response network recovery stays covered by its existing test.
  • D160: notice reuses packages/ui/src/toast.ts and its action button/material. It is persistent; no timer expires the person's saved typing. No terminal text or bytes are added to logs or storage.
  • Capacity stays at the existing 1 MiB per terminal, 224 MiB for 224 terminals; no second byte buffer. One boolean and a lazily mounted shared toast are the additional per-terminal state.
  • Gate now shell-expands the connection test filenames in an isolated invocation. No test exclusions.
  • Production-browser PTY proof, screenshot receipts and the full head gate remain required before completion; no visual-quality claim is made.
    review-before.log
    connections.log
#244 round-2 self-review (D11/D160/D243/D262/D300) - Fresh-writer safety: input stays in the existing bounded ByteQueue, with fresh zero-based offsets; replay cannot send it until consent. The warning explicitly states that old delivery is uncertain. Sent/unacknowledged and never-sent review cases both hold all 11 bytes. A premature consent and a repeated consent send no extra Input. - Normal resumed writers retain the original sequence/ack behavior. Explicit restartCursors() for a chosen new session still clears its old queues. Disposal clears retained bytes and disposes the notice. - No new parser, transport/auth check, dependency, feature or native shipping source. The only Rust differences from 526460c2e are the independent authority tests. D300 estimation and retirement methods unchanged. - Failed resumed capability is forgotten once. A refusal-recovery flag prevents stale offline/foreground hints resetting its retry count; real Welcome clears it. Ordinary no-response network recovery stays covered by its existing test. - D160: notice reuses packages/ui/src/toast.ts and its action button/material. It is persistent; no timer expires the person's saved typing. No terminal text or bytes are added to logs or storage. - Capacity stays at the existing 1 MiB per terminal, 224 MiB for 224 terminals; no second byte buffer. One boolean and a lazily mounted shared toast are the additional per-terminal state. - Gate now shell-expands the connection test filenames in an isolated invocation. No test exclusions. - Production-browser PTY proof, screenshot receipts and the full head gate remain required before completion; no visual-quality claim is made. [review-before.log](https://git.kayg.org/attachments/08bce3ec-59ec-44ca-a02f-917562c544c7) [connections.log](https://git.kayg.org/attachments/e1ac8c43-f4e3-4c0b-826e-e7fdbd4d5321)
Author
Owner

Additional controls committed: e98d1a1d4 exercises retry hints during refused fallback for both online states; 11 restart tests pass, 50 assertions. e71addd6a keeps the persistent saved-typing notice truthful through later disconnects (it no longer claims a current connection). a1929b04a starts the sent-input case after seven previously acknowledged bytes and verifies fresh resend rebases to offset zero; both consent tests pass, 20 assertions. Strict tracer check passes.
Gate selector commit is 35546c8ea: shell-expanded filenames discover all connection suites separately from the original frontend suite. Initial full fast has passed fmt, VT fmt and CLI compile-out and is compiling clippy dependencies. Production PTY/screenshot proof and final head fast remain pending. No push/deployment yet, per round-2 requirement to push when green.

Additional controls committed: e98d1a1d4 exercises retry hints during refused fallback for both online states; 11 restart tests pass, 50 assertions. e71addd6a keeps the persistent saved-typing notice truthful through later disconnects (it no longer claims a current connection). a1929b04a starts the sent-input case after seven previously acknowledged bytes and verifies fresh resend rebases to offset zero; both consent tests pass, 20 assertions. Strict tracer check passes. Gate selector commit is 35546c8ea: shell-expanded filenames discover all connection suites separately from the original frontend suite. Initial full fast has passed fmt, VT fmt and CLI compile-out and is compiling clippy dependencies. Production PTY/screenshot proof and final head fast remain pending. No push/deployment yet, per round-2 requirement to push when green.
Author
Owner

Initial full fast reached clippy PASS, then stopped the workspace test row at unchanged infraternal-agent test plugin_control::tests::retained_runtime_registry_keeps_lifetime_ownership_after_listener_abort: plugin_control.rs:1040, assertion failed: probe.try_lock().is_ok(). Result 143 passed / 1 failed / 20 existing ignores in that crate. There is no diff to infraternal-agent or its production dependencies in this round. No waiver or passing gate claimed. Rechecking the exact compiled test unchanged, then final full fast will repeat the entire workspace. Initial gate continues through required static builds.

Initial full fast reached clippy PASS, then stopped the workspace test row at unchanged infraternal-agent test plugin_control::tests::retained_runtime_registry_keeps_lifetime_ownership_after_listener_abort: plugin_control.rs:1040, assertion failed: probe.try_lock().is_ok(). Result 143 passed / 1 failed / 20 existing ignores in that crate. There is no diff to infraternal-agent or its production dependencies in this round. No waiver or passing gate claimed. Rechecking the exact compiled test unchanged, then final full fast will repeat the entire workspace. Initial gate continues through required static builds.
Author
Owner

Exact unchanged compiled lifetime-lock test immediately rechecked: 1 passed, 0 failed, 163 filtered. No source change, skip or waiver; final full workspace row must still pass. Latest unit control commit 1f29ae034 sends and acknowledges a seven-byte prefix through real MuxConnection/TerminalClient callbacks before retaining the 11-byte suffix; consent tests: 2 passed, 21 assertions. aaecdf2b3 updates only comments explaining the fresh-writer and refusal invariants; all 57 connection tests passed before the prefix-oracle refinement. Full-head final checks and perf proof still pending.
runtime-lock-recheck.log

Exact unchanged compiled lifetime-lock test immediately rechecked: 1 passed, 0 failed, 163 filtered. No source change, skip or waiver; final full workspace row must still pass. Latest unit control commit 1f29ae034 sends and acknowledges a seven-byte prefix through real MuxConnection/TerminalClient callbacks before retaining the 11-byte suffix; consent tests: 2 passed, 21 assertions. aaecdf2b3 updates only comments explaining the fresh-writer and refusal invariants; all 57 connection tests passed before the prefix-oracle refinement. Full-head final checks and perf proof still pending. [runtime-lock-recheck.log](https://git.kayg.org/attachments/f9c235b5-7dc4-483d-9b96-016a0ac43e3e)
Author
Owner

35c058a6a completes the refusal-state control for an initially fresh handshake too. Expanded the same oracle across resumed/fresh, both online hints and retry hints. Three cases failed before; marking every explicit pre-Welcome server refusal fixes all of them without removing ordinary no-response outage recovery. Strict tracer check and all 61 connection tests pass, 195 assertions. D300 unchanged.
Initial full fast finished: fmt, VT fmt, CLI compile-out, clippy, cargo-deny and static builds PASS; test row FAIL only at the unchanged lifetime-lock control already recorded, whose exact unchanged recheck passed. Both stripped static providers match exact ceilings: x86_64 21,100,176 B; ARM 19,328,840 B. No final gate claimed yet. Same-recipe baseline comparison and production browser asset builds are running through the one build slot, then perf-VM proof and a final full head gate.
fresh-refusal-before.log
connections-final.log

35c058a6a completes the refusal-state control for an initially fresh handshake too. Expanded the same oracle across resumed/fresh, both online hints and retry hints. Three cases failed before; marking every explicit pre-Welcome server refusal fixes all of them without removing ordinary no-response outage recovery. Strict tracer check and all 61 connection tests pass, 195 assertions. D300 unchanged. Initial full fast finished: fmt, VT fmt, CLI compile-out, clippy, cargo-deny and static builds PASS; test row FAIL only at the unchanged lifetime-lock control already recorded, whose exact unchanged recheck passed. Both stripped static providers match exact ceilings: x86_64 21,100,176 B; ARM 19,328,840 B. No final gate claimed yet. Same-recipe baseline comparison and production browser asset builds are running through the one build slot, then perf-VM proof and a final full head gate. [fresh-refusal-before.log](https://git.kayg.org/attachments/c14a5843-91eb-4540-9ed8-1434f0e85abc) [connections-final.log](https://git.kayg.org/attachments/27ea3c58-725b-4ac9-b46f-239f3930e088)
Author
Owner

Production-browser proof on the locked perf VM found an additional presentation defect before completion: saved typing survives and the one refusal/one fresh Attach succeeds, but the Resend typing button has viewport intersection ratio 0 after resizing to 1440x900. The fixed toast was mounted under the transformed canvas, which changes its containing block. Failing receipt attached. Correcting this through an additive shared toast parent-placement option, anchored to the terminal window's positioned unscrolled body; no duplicate style or global action for the wrong window. The browser assertion remains unchanged. D300 unchanged; full head gate remains pending.
functional.log

Production-browser proof on the locked perf VM found an additional presentation defect before completion: saved typing survives and the one refusal/one fresh Attach succeeds, but the Resend typing button has viewport intersection ratio 0 after resizing to 1440x900. The fixed toast was mounted under the transformed canvas, which changes its containing block. Failing receipt attached. Correcting this through an additive shared toast parent-placement option, anchored to the terminal window's positioned unscrolled body; no duplicate style or global action for the wrong window. The browser assertion remains unchanged. D300 unchanged; full head gate remains pending. [functional.log](https://git.kayg.org/attachments/ccd6da28-6465-4153-a81c-05a33befb4a2)
Author
Owner

Full fast on aa9a3be6e hit the same unchanged lifetime-lock test again: retained_runtime_registry_keeps_lifetime_ownership_after_listener_abort, plugin_control.rs:1040, probe.try_lock().is_ok(). The test waits only for the listener task completion flag, then assumes that proves the lock is already available. Exact isolated test passed unchanged; both full workspace attempts fail this immediate final check. No waiver applies and none is used. Will change only this test to wait for the actual required lock availability within its existing 5 s timeout, retaining the assertion that a retained registry keeps the lock held. Production ownership/locking, D300 deadlines and timeout bounds stay unchanged. Re-run the full touched crate and final full head gate.
Perf repeat completed meanwhile: base 526460c2e, 0 closes / 62,113 ms; round 2, 0 / 62,088 ms. Both one socket, 75 ms ±40 ms normal loopback-hop delay, seed 244, 0.5% actual packet loss, 25 s foreground plus 5/30 s suspension. Packet drops 37/8,709 base and 37/8,862 round 2. Perf VM 4 vCPU, kernel 6.12.111, loads 0.01/0.01/0.00 and 0.04/0.10/0.04. Original zero-close result retained; these are emulated mobile measurements, not a physical-phone claim.

Full fast on aa9a3be6e hit the same unchanged lifetime-lock test again: retained_runtime_registry_keeps_lifetime_ownership_after_listener_abort, plugin_control.rs:1040, probe.try_lock().is_ok(). The test waits only for the listener task completion flag, then assumes that proves the lock is already available. Exact isolated test passed unchanged; both full workspace attempts fail this immediate final check. No waiver applies and none is used. Will change only this test to wait for the actual required lock availability within its existing 5 s timeout, retaining the assertion that a retained registry keeps the lock held. Production ownership/locking, D300 deadlines and timeout bounds stay unchanged. Re-run the full touched crate and final full head gate. Perf repeat completed meanwhile: base 526460c2e, 0 closes / 62,113 ms; round 2, 0 / 62,088 ms. Both one socket, 75 ms ±40 ms normal loopback-hop delay, seed 244, 0.5% actual packet loss, 25 s foreground plus 5/30 s suspension. Packet drops 37/8,709 base and 37/8,862 round 2. Perf VM 4 vCPU, kernel 6.12.111, loads 0.01/0.01/0.00 and 0.04/0.10/0.04. Original zero-close result retained; these are emulated mobile measurements, not a physical-phone claim.
Author
Owner

Browser step complete: shared parent-placement option 79262d682, terminal-window anchor 53e2a6789, real PTY regression aa9a3be6e. Actual browser/PTy test passes with seeded packet loss: no typing executed before consent; exactly one computed marker after Resend typing; subsequent normal typing also works. Both 5/30 s suspensions retain the socket, and forced refusal produces one Resume and one fresh Attach. Resend stays in the viewport in Ink/Paper at 1440x900, 393x852, 375x667. Production screenshots attached for independent review; no author visual-quality claim.
Paired perf-VM observation: author head 526460c2e 0 closes / 62,113 ms, round 2 0 / 62,088 ms; one socket each. The original zero-close result is retained. Same seed 244 / 75ms±40ms normal per loopback hop / 0.5% packet loss; actual drops 37/8,709 and 37/8,862. Kernel 6.12.111, 4 vCPU; loads 0.01/0.01/0.00 -> 0.04/0.10/0.04. These are Chromium mobile emulation results. Each foreground remote command held the lock only for its short run and released it between cases.
Same-recipe stripped static x86_64 baseline and round 2: 21,100,176 B each, +0 B. ARM matches 19,328,840 B. No native shipping source or dependency changes. The only outstanding gate issue is the unchanged lifetime-lock test's immediate release assumption; its bounded observable-cleanup correction and full head gate are in progress. No push or deployment yet.
functional.log
mobile-before.log
mobile-after.log
size-comparison.log
retained-typing-ink-1440.png
retained-typing-ink-393.png
retained-typing-ink-375.png
retained-typing-paper-1440.png
retained-typing-paper-393.png
retained-typing-paper-375.png
resumed.png

Browser step complete: shared parent-placement option 79262d682, terminal-window anchor 53e2a6789, real PTY regression aa9a3be6e. Actual browser/PTy test passes with seeded packet loss: no typing executed before consent; exactly one computed marker after Resend typing; subsequent normal typing also works. Both 5/30 s suspensions retain the socket, and forced refusal produces one Resume and one fresh Attach. Resend stays in the viewport in Ink/Paper at 1440x900, 393x852, 375x667. Production screenshots attached for independent review; no author visual-quality claim. Paired perf-VM observation: author head 526460c2e 0 closes / 62,113 ms, round 2 0 / 62,088 ms; one socket each. The original zero-close result is retained. Same seed 244 / 75ms±40ms normal per loopback hop / 0.5% packet loss; actual drops 37/8,709 and 37/8,862. Kernel 6.12.111, 4 vCPU; loads 0.01/0.01/0.00 -> 0.04/0.10/0.04. These are Chromium mobile emulation results. Each foreground remote command held the lock only for its short run and released it between cases. Same-recipe stripped static x86_64 baseline and round 2: 21,100,176 B each, +0 B. ARM matches 19,328,840 B. No native shipping source or dependency changes. The only outstanding gate issue is the unchanged lifetime-lock test's immediate release assumption; its bounded observable-cleanup correction and full head gate are in progress. No push or deployment yet. [functional.log](https://git.kayg.org/attachments/ce31fa59-8085-4c28-8231-d5c5bc6ef3d0) [mobile-before.log](https://git.kayg.org/attachments/012b04ce-16e9-42ec-aeb9-c98fb7d87e6c) [mobile-after.log](https://git.kayg.org/attachments/f049ef30-087d-4d18-9c3e-aa383bd41c9a) [size-comparison.log](https://git.kayg.org/attachments/28f878b0-9b79-4567-8f19-58939252d869) ![retained-typing-ink-1440.png](https://git.kayg.org/attachments/ffbff05a-d222-4a56-bfd0-2d424de81dbc) ![retained-typing-ink-393.png](https://git.kayg.org/attachments/cad6a081-0c41-4b11-beb4-a7571ff2224a) ![retained-typing-ink-375.png](https://git.kayg.org/attachments/a755e6b9-48b1-4126-95fb-d26a2b1a0f8f) ![retained-typing-paper-1440.png](https://git.kayg.org/attachments/b570b263-ec91-458b-96e8-8d2ecaa79561) ![retained-typing-paper-393.png](https://git.kayg.org/attachments/48ca1ee5-f5d2-4155-8fb3-8317f250e581) ![retained-typing-paper-375.png](https://git.kayg.org/attachments/0f9fc04d-6c3e-459b-9067-51e8ea0dfaf3) ![resumed.png](https://git.kayg.org/attachments/c86d8efd-4c1c-485f-85b4-f7998465b137)
Author
Owner

0faee4959 corrects only the lifetime-lock test's final observation. Fmt and remote/mesh all-target clippy pass; full infraternal-agent crate: 144 passed, 0 failed, 20 existing diagnostic ignores. The retained-registry must-stay-held assertion and 5 s bound remain; final wait now checks actual lock acquisition as well as listener completion. Production ownership and D300 unchanged.
Screenshot review found that the old desktop captures could include an overlapping neighboring Appearance view immediately after resizing a mobile canvas; viewport intersection alone did not prove click delivery. Tightened the real-browser harness to navigate normally to Console after each resize and perform a trial click before capturing. No product code changed. Its run is queued on the perf lock (owner file: retry-join-time-r2, started 2026-10-18T17:17:43+02:00). Will retake captures and run final full fast on the committed head before pushing. The completed paired close measurement remains 0 -> 0 with identical production code.
runtime-lock-crate.log

0faee4959 corrects only the lifetime-lock test's final observation. Fmt and remote/mesh all-target clippy pass; full infraternal-agent crate: 144 passed, 0 failed, 20 existing diagnostic ignores. The retained-registry must-stay-held assertion and 5 s bound remain; final wait now checks actual lock acquisition as well as listener completion. Production ownership and D300 unchanged. Screenshot review found that the old desktop captures could include an overlapping neighboring Appearance view immediately after resizing a mobile canvas; viewport intersection alone did not prove click delivery. Tightened the real-browser harness to navigate normally to Console after each resize and perform a trial click before capturing. No product code changed. Its run is queued on the perf lock (owner file: retry-join-time-r2, started 2026-10-18T17:17:43+02:00). Will retake captures and run final full fast on the committed head before pushing. The completed paired close measurement remains 0 -> 0 with identical production code. [runtime-lock-crate.log](https://git.kayg.org/attachments/54e2284e-1afe-4d51-badc-382415f959fd)
Author
Owner

The strengthened browser check found a real actionability defect that viewport intersection missed: at 1440 px, a settings-view element intercepts Resend typing clicks even after normal Console navigation. The parent toast is centered across a wide window extending beneath the neighboring view. Correcting the reusable parent-placement option to anchor at its window's inline start; ordinary viewport toasts stay unchanged. The trial-click assertion remains and fails after 5 s rather than an unbounded action wait. Failed receipt attached. No protocol, D300 or input-queue changes. Native full iterate has passed the corrected lifetime-lock control and is progressing through server authority tests.
functional-clickability.log

The strengthened browser check found a real actionability defect that viewport intersection missed: at 1440 px, a settings-view element intercepts Resend typing clicks even after normal Console navigation. The parent toast is centered across a wide window extending beneath the neighboring view. Correcting the reusable parent-placement option to anchor at its window's inline start; ordinary viewport toasts stay unchanged. The trial-click assertion remains and fails after 5 s rather than an unbounded action wait. Failed receipt attached. No protocol, D300 or input-queue changes. Native full iterate has passed the corrected lifetime-lock control and is progressing through server authority tests. [functional-clickability.log](https://git.kayg.org/attachments/f1a9fffc-528b-4717-98b7-beeefdcab9d6)
Author
Owner

64fb14056 fixes parent-toast action occlusion through the reusable component's inline-start alignment. 724f14de0 strengthens the real browser test: normal Console navigation, bounded trial click in every viewport/theme, fixed phase markers, guaranteed server teardown. All six trial clicks now pass (including both 1440 px cases); no execution before consent and exactly one saved command after the real tap. Actual seeded loss: 24 dropped / 5,388 packets. D300 unchanged. Updated production captures below supersede the earlier desktop captures that exposed interception; snapshots are for independent visual review.
Full scripts/verify iterate passes: every native row, corrected lifetime-lock control, both hidden logout/absolute-expiry controls, existing 256 frontend tests, all 61 connection tests (195 assertions) and 37 protocol tests. This is not the final gate. Full scripts/verify fast is running on clean committed head 724f14de0b (full head SHA will be in the finish comment), followed by the final-bundle close observation and both requested branch pushes. No deployment.
functional-final.log
retained-typing-ink-1440.png
retained-typing-ink-393.png
retained-typing-ink-375.png
retained-typing-paper-1440.png
retained-typing-paper-393.png
retained-typing-paper-375.png
resumed.png

64fb14056 fixes parent-toast action occlusion through the reusable component's inline-start alignment. 724f14de0 strengthens the real browser test: normal Console navigation, bounded trial click in every viewport/theme, fixed phase markers, guaranteed server teardown. All six trial clicks now pass (including both 1440 px cases); no execution before consent and exactly one saved command after the real tap. Actual seeded loss: 24 dropped / 5,388 packets. D300 unchanged. Updated production captures below supersede the earlier desktop captures that exposed interception; snapshots are for independent visual review. Full scripts/verify iterate passes: every native row, corrected lifetime-lock control, both hidden logout/absolute-expiry controls, existing 256 frontend tests, all 61 connection tests (195 assertions) and 37 protocol tests. This is not the final gate. Full scripts/verify fast is running on clean committed head 724f14de0b (full head SHA will be in the finish comment), followed by the final-bundle close observation and both requested branch pushes. No deployment. [functional-final.log](https://git.kayg.org/attachments/039a3aaf-5867-4de4-80ef-1eb2b0f78667) ![retained-typing-ink-1440.png](https://git.kayg.org/attachments/139273ee-0954-4af5-991f-069edd680dbf) ![retained-typing-ink-393.png](https://git.kayg.org/attachments/4e1476ee-ac17-4235-9183-c934f4bd2e9b) ![retained-typing-ink-375.png](https://git.kayg.org/attachments/f01b1e02-f839-4206-94d7-7000aca82e9b) ![retained-typing-paper-1440.png](https://git.kayg.org/attachments/fc77a0c8-6e48-431c-a5bc-5ce9e5b72071) ![retained-typing-paper-393.png](https://git.kayg.org/attachments/a03d7564-7658-42ce-b6e1-b2c2c7ea8b31) ![retained-typing-paper-375.png](https://git.kayg.org/attachments/337cb35a-aa6d-47d9-b872-1caa4f895cc9) ![resumed.png](https://git.kayg.org/attachments/d10d84df-3247-493c-bcc1-f2af2360d100)
Author
Owner

Finished #244 round 2. Head: 724f14de0b8aa3ab808d80be40266cb931cdee1f. Pushed resume-refused-loop-r2 and atomically fast-forwarded resume-refused-loop to the same head. Clean worktree; no deployment.

  • P1: fresh writers cannot prove earlier delivery, so automatic replay was rejected. The existing bounded queue survives fresh attach and waits for the visible Resend typing action after replay paints. Never-sent and sent/unacknowledged 11-byte controls pass, including prior-ack cursor rebasing and premature/repeated taps. The real PTY executes saved typing once after consent. Shared window-local toast placement passes click delivery in both themes at 1440, 393 and 375 px.
  • P2: explicit pre-Welcome refusals retain growing backoff through stale offline and retry hints; successful Welcome clears refusal recovery. Ordinary no-response recovery remains covered. D300 deadlines are unchanged.
  • Gate: shell-expanded connection filenames run separately in fast/iterate; 61 connection tests pass, 195 assertions. No dependencies or features added.

Final-head binary and bundle on the locked perf VM: 0 closes / 62,088 ms = 0/min, one socket. Author base 526460c2e: 0 / 62,113 ms. Same seed 244, 75 ms ±40 ms normal delay per loopback hop, 0.5% configured loss, 25 s foreground plus 5/30 s suspension. Namespace drops: 37/8,709 base, 37/8,981 final. Kernel 6.12.111, 4 vCPU, loads 0.01/0.01/0.00 -> 0.01/0.02/0.09. This retains the author's zero-close result in Chromium mobile emulation; it is not a physical-phone measurement. Each foreground run held the lock only while running and released it between cases.

Same-recipe stripped static x86_64: base/final 21,100,176 B, delta +0 B. Final ARM 19,328,840 B, matching its exact ceiling (D243). The two earlier failed full attempts and the passing iterate run are retained below. The existing lifetime-lock test now observes actual lock release within its original 5 s bound while preserving its retained-owner assertion; no production locking or deadline changed. Final full gate passes without a waiver or new skip.

Final gate summary quoted verbatim; full stdout/stderr is attached verbatim:

scripts/verify fast: exit 0
Head: 724f14de0b8aa3ab808d80be40266cb931cdee1f

+---------------------------+--------------+
| Rust gate                 | Result       |
+---------------------------+--------------+
| fmt                       | PASS         |
| VT native fmt             | PASS         |
| CLI plugin compile-out    | PASS         |
| clippy                    | PASS         |
| test                      | PASS         |
| cargo-deny                | PASS         |
| static builds             | PASS         |
+---------------------------+--------------+

 256 pass
 0 fail
 11712 expect() calls

 61 pass
 0 fail
 195 expect() calls

 37 pass
 0 fail
 34463 expect() calls

fast.log
final-gate-summary.txt
final-sizes.txt
fast-initial.log
fast-second.log
iterate.log

Final measurement, reproducible driver source, push and cleanup receipts:

mobile-after-final.log
perf-cleanup-final.log
local-cleanup.txt
pushed-refs.txt
measurement-driver-source.txt

Production browser proof and selected final captures; all six current captures are in the preceding step comment, for independent visual review:

functional-final.log
retained-typing-ink-1440.png
retained-typing-ink-393.png
retained-typing-paper-375.png

How to test:

  1. In apps/tracer, run bun test ./src/connection*.test.ts (61 cases including both review regressions).
  2. Run the attached locked perf-VM fixture with mobile-lease.spec.ts, production server/bundle and disposable state.
  3. Verify waiting typing stays unexecuted until Resend typing, then executes once; every captured action must receive its trial click.

Cleanup: zero owned executable/cwd references on the VM, owned VM folder removed; zero local owned executable references, baseline worktree, job target, comparison binaries and temporary toolchain artifacts removed. Evidence stays outside the checkout and is attached above. Issue left open.

Finished #244 round 2. Head: `724f14de0b8aa3ab808d80be40266cb931cdee1f`. Pushed `resume-refused-loop-r2` and atomically fast-forwarded `resume-refused-loop` to the same head. Clean worktree; no deployment. - P1: fresh writers cannot prove earlier delivery, so automatic replay was rejected. The existing bounded queue survives fresh attach and waits for the visible **Resend typing** action after replay paints. Never-sent and sent/unacknowledged 11-byte controls pass, including prior-ack cursor rebasing and premature/repeated taps. The real PTY executes saved typing once after consent. Shared window-local toast placement passes click delivery in both themes at 1440, 393 and 375 px. - P2: explicit pre-Welcome refusals retain growing backoff through stale offline and retry hints; successful Welcome clears refusal recovery. Ordinary no-response recovery remains covered. D300 deadlines are unchanged. - Gate: shell-expanded connection filenames run separately in fast/iterate; **61 connection tests pass**, 195 assertions. No dependencies or features added. Final-head binary and bundle on the locked perf VM: **0 closes / 62,088 ms = 0/min**, one socket. Author base 526460c2e: **0 / 62,113 ms**. Same seed 244, 75 ms ±40 ms normal delay per loopback hop, 0.5% configured loss, 25 s foreground plus 5/30 s suspension. Namespace drops: 37/8,709 base, 37/8,981 final. Kernel 6.12.111, 4 vCPU, loads 0.01/0.01/0.00 -> 0.01/0.02/0.09. This retains the author's zero-close result in Chromium mobile emulation; it is not a physical-phone measurement. Each foreground run held the lock only while running and released it between cases. Same-recipe stripped static x86_64: base/final **21,100,176 B**, delta **+0 B**. Final ARM **19,328,840 B**, matching its exact ceiling (D243). The two earlier failed full attempts and the passing iterate run are retained below. The existing lifetime-lock test now observes actual lock release within its original 5 s bound while preserving its retained-owner assertion; no production locking or deadline changed. Final full gate passes without a waiver or new skip. Final gate summary quoted verbatim; full stdout/stderr is attached verbatim: ```text scripts/verify fast: exit 0 Head: 724f14de0b8aa3ab808d80be40266cb931cdee1f +---------------------------+--------------+ | Rust gate | Result | +---------------------------+--------------+ | fmt | PASS | | VT native fmt | PASS | | CLI plugin compile-out | PASS | | clippy | PASS | | test | PASS | | cargo-deny | PASS | | static builds | PASS | +---------------------------+--------------+ 256 pass 0 fail 11712 expect() calls 61 pass 0 fail 195 expect() calls 37 pass 0 fail 34463 expect() calls ``` [fast.log](https://git.kayg.org/attachments/1cc763ef-20a0-466c-b4ab-5746506e54a4) [final-gate-summary.txt](https://git.kayg.org/attachments/26078637-d5a2-498c-9d3a-36dcd68a9783) [final-sizes.txt](https://git.kayg.org/attachments/4725603e-99e6-4961-b612-a24f7f90c99f) [fast-initial.log](https://git.kayg.org/attachments/4f4f2b60-e8b7-43d3-990d-d7c1197c2ddf) [fast-second.log](https://git.kayg.org/attachments/074c609f-7ed7-45c0-8dda-ba0fc02a9733) [iterate.log](https://git.kayg.org/attachments/35111a09-3b29-403a-995c-9d5bb0726133) Final measurement, reproducible driver source, push and cleanup receipts: [mobile-after-final.log](https://git.kayg.org/attachments/9ef175ea-f997-48f0-910b-d5a356b8b1d5) [perf-cleanup-final.log](https://git.kayg.org/attachments/80616d06-8037-4474-a286-0719b0ae5d07) [local-cleanup.txt](https://git.kayg.org/attachments/e44e3a4d-d4c2-4483-894f-e8d482f28394) [pushed-refs.txt](https://git.kayg.org/attachments/61c8ec97-1e1f-474f-ae8f-06e529c1ac42) [measurement-driver-source.txt](https://git.kayg.org/attachments/181783b9-8c30-4464-b1fb-e176055b9167) Production browser proof and selected final captures; all six current captures are in the preceding step comment, for independent visual review: [functional-final.log](https://git.kayg.org/attachments/039a3aaf-5867-4de4-80ef-1eb2b0f78667) ![retained-typing-ink-1440.png](https://git.kayg.org/attachments/139273ee-0954-4af5-991f-069edd680dbf) ![retained-typing-ink-393.png](https://git.kayg.org/attachments/4e1476ee-ac17-4235-9183-c934f4bd2e9b) ![retained-typing-paper-375.png](https://git.kayg.org/attachments/337cb35a-aa6d-47d9-b872-1caa4f895cc9) How to test: 1. In `apps/tracer`, run `bun test ./src/connection*.test.ts` (61 cases including both review regressions). 2. Run the attached locked perf-VM fixture with `mobile-lease.spec.ts`, production server/bundle and disposable state. 3. Verify waiting typing stays unexecuted until Resend typing, then executes once; every captured action must receive its trial click. Cleanup: zero owned executable/cwd references on the VM, owned VM folder removed; zero local owned executable references, baseline worktree, job target, comparison binaries and temporary toolchain artifacts removed. Evidence stays outside the checkout and is attached above. Issue left open.
Author
Owner

Delta review round 2 starting: branch review-resume-refused-loop-r2, base/head 724f14de0b. Read all 46 issue comments; #244 has no parent link. Reviewing delta 526460c2e..724f14de0, preserving round-1 controls. Focus: retained typing isolation and lifetime, explicit consent/decline, races, keyboard/live announcements, refusal backoff, unchanged D300. No deployment; push only review-resume-refused-loop-r2. Findings and raw receipts will live in job scratch and be attached here.

Delta review round 2 starting: branch review-resume-refused-loop-r2, base/head 724f14de0b8aa3ab808d80be40266cb931cdee1f. Read all 46 issue comments; #244 has no parent link. Reviewing delta 526460c2e..724f14de0, preserving round-1 controls. Focus: retained typing isolation and lifetime, explicit consent/decline, races, keyboard/live announcements, refusal backoff, unchanged D300. No deployment; push only review-resume-refused-loop-r2. Findings and raw receipts will live in job scratch and be attached here.
Author
Owner

Review step d75b816ca pushed on review-resume-refused-loop-r2. P2: saved typing has no decline/discard action. terminal.ts:1266-1278 produces a persistent Resend-only toast (dismissible/onClose both undefined); :1236 also withholds subsequent typing. A person unwilling to resend uncertain typing cannot keep using the same shell without closing/replacing it. Synthetic 14-byte failing test: review: saved typing can be declined without closing the live shell. Three controls pass: window-local consent, clearing on session selection including stale action, and another disconnect before consent. TypeScript check passes. 3 pass / 1 fail / 17 assertions. Full fast is running through build-slot; expected review failure will be reported, never waived.
retained-lifetime.log

Review step d75b816ca pushed on review-resume-refused-loop-r2. P2: saved typing has no decline/discard action. terminal.ts:1266-1278 produces a persistent Resend-only toast (dismissible/onClose both undefined); :1236 also withholds subsequent typing. A person unwilling to resend uncertain typing cannot keep using the same shell without closing/replacing it. Synthetic 14-byte failing test: `review: saved typing can be declined without closing the live shell`. Three controls pass: window-local consent, clearing on session selection including stale action, and another disconnect before consent. TypeScript check passes. 3 pass / 1 fail / 17 assertions. Full fast is running through build-slot; expected review failure will be reported, never waived. [retained-lifetime.log](https://git.kayg.org/attachments/ae0e7d35-f049-4d91-95b6-d7a8f83fec6e)
Author
Owner

Review steps pushed: 35e56d217 adds production disposal/stale-consent control; 30830d361 tightens the Welcome reset oracle. Strict TypeScript passes. Explicit connection run: 65 pass / 1 fail / 217 assertions; all 61 author tests still pass, four additional lifetime controls pass, only decline is red.
Defensive audit: forceDrop after Welcome reset the counter itself, concealing a missing Welcome reset. Replacing it with an ordinary close passes all 15 restart tests. In-memory mutation removing Welcome's reset: previous oracle 15 pass / 0 fail, strengthened oracle 7 pass / 8 fail. Production source remains untouched. No additional shipping defect counted. D300 production deadline paths have no delta changes. Full fast compiling native checks; browser functional controls follow through the same single build slot.
backoff-audit.log
previous oracle under mutation
strengthened oracle under mutation
mutation source
connections.log

Review steps pushed: 35e56d217 adds production disposal/stale-consent control; 30830d361 tightens the Welcome reset oracle. Strict TypeScript passes. Explicit connection run: 65 pass / 1 fail / 217 assertions; all 61 author tests still pass, four additional lifetime controls pass, only decline is red. Defensive audit: forceDrop after Welcome reset the counter itself, concealing a missing Welcome reset. Replacing it with an ordinary close passes all 15 restart tests. In-memory mutation removing Welcome's reset: previous oracle 15 pass / 0 fail, strengthened oracle 7 pass / 8 fail. Production source remains untouched. No additional shipping defect counted. D300 production deadline paths have no delta changes. Full fast compiling native checks; browser functional controls follow through the same single build slot. [backoff-audit.log](https://git.kayg.org/attachments/c30adf9a-2268-4744-b960-04762b0aa250) [previous oracle under mutation](https://git.kayg.org/attachments/931f766d-93a8-4ad5-ba35-600de0e2c2d6) [strengthened oracle under mutation](https://git.kayg.org/attachments/e723d322-d7e8-4a7c-a26b-3eda572a350c) [mutation source](https://git.kayg.org/attachments/cc751a8b-ce3c-4353-b77d-5d79ee0cad4c) [connections.log](https://git.kayg.org/attachments/a88b22c5-ca97-47b0-a8ee-49ac42fa5faa)
Author
Owner

91992ec85 pushed: production-browser checks reproduce both P2 findings. Pending typing has no decline control; Tab and Shift+Tab from the terminal remain on its textarea and add four bytes (tab + reverse-tab) to the held 17-byte marker. Test-only focus on Resend followed by Enter delivers exactly those 21 bytes, proving navigation attempts became input. Positive native-button control passes with one marker sent. Browser result: 1 pass / 2 fail; strict TypeScript passes. role=status and aria-live=polite are present; actual screen-reader speech is not certified. No window/account crossover, automatic pre-consent send, or duplicate saved marker demonstrated. Verdict currently HOLD: P0=0/P1=0/P2=2/P3=0.
Tests: review: saved typing offers a non-resend exit in the live terminal window; review: keyboard can reach Resend typing from the terminal without sending more typing; passing review: a focused Resend typing button accepts Enter.
Stopped the preliminary cold native gate before completion to finish these browser controls; it is not a gate result. Final scripts/verify fast is now running on 91992ec85 with build-slot, one reused job target, two build jobs and TRACER_TEST_PORT=4498. Browser run used unique port 4499, zero artificial delay, production bundle plus fixture transport; no timing claim or visual-quality judgment.
browser-final.log
appended findings
production-build notice

91992ec85 pushed: production-browser checks reproduce both P2 findings. Pending typing has no decline control; Tab and Shift+Tab from the terminal remain on its textarea and add four bytes (tab + reverse-tab) to the held 17-byte marker. Test-only focus on Resend followed by Enter delivers exactly those 21 bytes, proving navigation attempts became input. Positive native-button control passes with one marker sent. Browser result: 1 pass / 2 fail; strict TypeScript passes. role=status and aria-live=polite are present; actual screen-reader speech is not certified. No window/account crossover, automatic pre-consent send, or duplicate saved marker demonstrated. Verdict currently HOLD: P0=0/P1=0/P2=2/P3=0. Tests: `review: saved typing offers a non-resend exit in the live terminal window`; `review: keyboard can reach Resend typing from the terminal without sending more typing`; passing `review: a focused Resend typing button accepts Enter`. Stopped the preliminary cold native gate before completion to finish these browser controls; it is not a gate result. Final scripts/verify fast is now running on 91992ec85 with build-slot, one reused job target, two build jobs and TRACER_TEST_PORT=4498. Browser run used unique port 4499, zero artificial delay, production bundle plus fixture transport; no timing claim or visual-quality judgment. [browser-final.log](https://git.kayg.org/attachments/c4bf2dc4-4277-4cbc-840d-a97786363c5d) [appended findings](https://git.kayg.org/attachments/fcdb2955-be12-4bd1-a5a1-666466de4557) ![production-build notice](https://git.kayg.org/attachments/a942294a-aa53-4a99-9d24-e09f626b5bb7)
Author
Owner

Final-head fast gate on 91992ec857: fmt, VT fmt, CLI compile-out, clippy, full native test row and cargo-deny pass. Both hidden-session revocation/absolute-expiry controls pass. x86_64 static provider passes linkage, trust, key-memory and exact-size checks: 21,100,176 B, delta +0 B against ceiling. ARM static build is running; frontend and merge-base size comparison follow. No final gate claimed yet; expected new decline regression remains red. Review counts unchanged: P0=0/P1=0/P2=2/P3=0, HOLD.

Final-head fast gate on 91992ec8571a5dcd3a90e178a321e2fe16b5b78f: fmt, VT fmt, CLI compile-out, clippy, full native test row and cargo-deny pass. Both hidden-session revocation/absolute-expiry controls pass. x86_64 static provider passes linkage, trust, key-memory and exact-size checks: 21,100,176 B, delta +0 B against ceiling. ARM static build is running; frontend and merge-base size comparison follow. No final gate claimed yet; expected new decline regression remains red. Review counts unchanged: P0=0/P1=0/P2=2/P3=0, HOLD.
Author
Owner

Finished delta break-it review: HOLD. P0=0, P1=0, P2=2, P3=0.

Reviewed 526460c2e..724f14de0. Final review head 91992ec857, four atomic test-only commits pushed only to review-resume-refused-loop-r2. Clean worktree; no production fix, merge or deployment. Issue remains open.

  • P2: no decline/discard path for retained typing. terminal.ts:1265-1273 creates a persistent Resend-only notice, with neither dismissible control nor discard handler. :1236 also holds subsequent typing behind that consent. Someone unwilling to resend uncertain typing cannot continue in the same live shell without closing/replacing it. Unit test review: saved typing can be declined without closing the live shell retains 14 synthetic bytes and fails on missing dismissal; browser test review: saved typing offers a non-resend exit in the live terminal window independently fails because no such button exists. Unit reproduction, browser receipt.
  • P2: Tab navigation from terminal focus cannot reach pending Resend. review: keyboard can reach Resend typing from the terminal without sending more typing proves Tab and Shift+Tab both leave focus on the textarea, adding four navigation bytes to the held 17-byte marker. After test-only programmatic button focus, Enter delivers those exact 21 bytes. The notice supplies no app focus shortcut; the terminal captures the normal Tab path. This is specifically navigation from terminal focus, not a claim that native button Enter is broken or that every browser-chrome workaround is impossible. Passing control: review: a focused Resend typing button accepts Enter. Browser receipt.

Controls and defensive audit: all 61 tests on the reviewed head still pass; four additional lifetime controls pass (window-local consent, session replacement/stale action, disconnect before consent, production dispose/stale action). No automatic pre-consent Input, account/window crossover, persistent-storage disclosure or duplicate saved marker was demonstrated. The new path retains the existing per-instance ByteQueue, with no new storage/logging path or second byte buffer; its cap remains 1 MiB per terminal (224 MiB capacity at 224 terminals). Sign-out/window closure reach dispose and clear the queue. This is source-path and state-control evidence, not a full multi-account browser certification. The polite status live-region markup passes; actual screen-reader speech was not tested.

Strengthened the backoff success oracle: forceDrop after Welcome reset the counter itself and hid a missing Welcome reset. An ordinary close now observes the reset. In-memory mutation removing that production reset: previous oracle 15 pass / 0 fail; strengthened oracle 7 pass / 8 fail; unchanged production 15 pass / 0 fail. No shipping defect added to the counts. Audit, old oracle, new oracle, mutation source.

D300 unchanged: delta native production sources and deadline/retirement estimators do not change. Both real-WebSocket/SQLite hidden logout and absolute-expiry controls pass in the full native row. No fresh latency/RSS or physical-phone measurement is claimed.

Independent same-recipe stripped/static x86 comparison: merge base 5b2a1b9ee 21,096,144 B -> review head 21,100,176 B, +4,032 B, matching the already-reviewed original #244 increase. Round-2 and review changes add no native production source/dependency. ARM 19,328,840 B. Rust 1.99.0, locked dependencies, scripts/static-cargo and one reused job target. Size receipt.

Production-mode bundle/build budget passes independently: critical gzip 300,989/307,200 B, deferred 49,066/51,200 B, largest on-demand chunk 15,111/20,480 B. Browser checks use the normal minified build with the repository preview flag and disposable fixture transport; no timing or visual-quality claim. Production budget.

Final scripts/verify fast exits 1 solely at the new decline regression. Every Rust/static row passes; existing frontend 256 pass; connection suites 65 pass / 1 fail. No exclusions, skips or baseline waiver added. Protocol tests after the failing connection invocation are not reached; the protocol compiler passes and protocol source is unchanged. Full stdout/stderr, verbatim, verbatim summary:

scripts/verify fast: exit 1
Head: 91992ec8571a5dcd3a90e178a321e2fe16b5b78f

+---------------------------+--------------+
| Rust gate                 | Result       |
+---------------------------+--------------+
| fmt                       | PASS         |
| VT native fmt             | PASS         |
| CLI plugin compile-out    | PASS         |
| clippy                    | PASS         |
| test                      | PASS         |
| cargo-deny                | PASS         |
| static builds             | PASS         |
+---------------------------+--------------+

 256 pass
 0 fail
 11712 expect() calls

 65 pass
 1 fail
 217 expect() calls

Appended findings.md. Cleanup: own baseline, target and comparison binary removed; zero executable/cwd references before deletion; browser fixture ports 4499/4500 closed; clean worktree and HEAD equals pushed head. Cleanup proof.

Production-build retained-typing notice

Finished delta break-it review: **HOLD**. **P0=0, P1=0, P2=2, P3=0**. Reviewed `526460c2e..724f14de0`. Final review head **91992ec8571a5dcd3a90e178a321e2fe16b5b78f**, four atomic test-only commits pushed only to `review-resume-refused-loop-r2`. Clean worktree; no production fix, merge or deployment. Issue remains open. - **P2: no decline/discard path for retained typing.** `terminal.ts:1265-1273` creates a persistent Resend-only notice, with neither dismissible control nor discard handler. `:1236` also holds subsequent typing behind that consent. Someone unwilling to resend uncertain typing cannot continue in the same live shell without closing/replacing it. Unit test `review: saved typing can be declined without closing the live shell` retains 14 synthetic bytes and fails on missing dismissal; browser test `review: saved typing offers a non-resend exit in the live terminal window` independently fails because no such button exists. [Unit reproduction](https://git.kayg.org/attachments/ae0e7d35-f049-4d91-95b6-d7a8f83fec6e), [browser receipt](https://git.kayg.org/attachments/c4bf2dc4-4277-4cbc-840d-a97786363c5d). - **P2: Tab navigation from terminal focus cannot reach pending Resend.** `review: keyboard can reach Resend typing from the terminal without sending more typing` proves Tab and Shift+Tab both leave focus on the textarea, adding four navigation bytes to the held 17-byte marker. After test-only programmatic button focus, Enter delivers those exact 21 bytes. The notice supplies no app focus shortcut; the terminal captures the normal Tab path. This is specifically navigation from terminal focus, not a claim that native button Enter is broken or that every browser-chrome workaround is impossible. Passing control: `review: a focused Resend typing button accepts Enter`. [Browser receipt](https://git.kayg.org/attachments/c4bf2dc4-4277-4cbc-840d-a97786363c5d). **Controls and defensive audit:** all 61 tests on the reviewed head still pass; four additional lifetime controls pass (window-local consent, session replacement/stale action, disconnect before consent, production dispose/stale action). No automatic pre-consent Input, account/window crossover, persistent-storage disclosure or duplicate saved marker was demonstrated. The new path retains the existing per-instance ByteQueue, with no new storage/logging path or second byte buffer; its cap remains 1 MiB per terminal (224 MiB capacity at 224 terminals). Sign-out/window closure reach dispose and clear the queue. This is source-path and state-control evidence, not a full multi-account browser certification. The polite status live-region markup passes; actual screen-reader speech was not tested. Strengthened the backoff success oracle: forceDrop after Welcome reset the counter itself and hid a missing Welcome reset. An ordinary close now observes the reset. In-memory mutation removing that production reset: previous oracle **15 pass / 0 fail**; strengthened oracle **7 pass / 8 fail**; unchanged production **15 pass / 0 fail**. No shipping defect added to the counts. [Audit](https://git.kayg.org/attachments/c30adf9a-2268-4744-b960-04762b0aa250), [old oracle](https://git.kayg.org/attachments/931f766d-93a8-4ad5-ba35-600de0e2c2d6), [new oracle](https://git.kayg.org/attachments/e723d322-d7e8-4a7c-a26b-3eda572a350c), [mutation source](https://git.kayg.org/attachments/cc751a8b-ce3c-4353-b77d-5d79ee0cad4c). **D300 unchanged:** delta native production sources and deadline/retirement estimators do not change. Both real-WebSocket/SQLite hidden logout and absolute-expiry controls pass in the full native row. No fresh latency/RSS or physical-phone measurement is claimed. Independent same-recipe stripped/static x86 comparison: merge base 5b2a1b9ee **21,096,144 B** -> review head **21,100,176 B**, **+4,032 B**, matching the already-reviewed original #244 increase. Round-2 and review changes add no native production source/dependency. ARM **19,328,840 B**. Rust 1.99.0, locked dependencies, scripts/static-cargo and one reused job target. [Size receipt](https://git.kayg.org/attachments/ac3d0d76-81e8-4700-bc07-400d8c00ef47). Production-mode bundle/build budget passes independently: critical gzip **300,989/307,200 B**, deferred **49,066/51,200 B**, largest on-demand chunk **15,111/20,480 B**. Browser checks use the normal minified build with the repository preview flag and disposable fixture transport; no timing or visual-quality claim. [Production budget](https://git.kayg.org/attachments/cfffc723-6e36-4e2e-8be0-5db7ac36b581). **Final scripts/verify fast exits 1 solely at the new decline regression.** Every Rust/static row passes; existing frontend 256 pass; connection suites 65 pass / 1 fail. No exclusions, skips or baseline waiver added. Protocol tests after the failing connection invocation are not reached; the protocol compiler passes and protocol source is unchanged. [Full stdout/stderr, verbatim](https://git.kayg.org/attachments/df09dfed-59cc-4c93-95c0-a467c5937207), [verbatim summary](https://git.kayg.org/attachments/1411ae37-eb0e-4ffe-a470-90e279cb9795): ```text scripts/verify fast: exit 1 Head: 91992ec8571a5dcd3a90e178a321e2fe16b5b78f +---------------------------+--------------+ | Rust gate | Result | +---------------------------+--------------+ | fmt | PASS | | VT native fmt | PASS | | CLI plugin compile-out | PASS | | clippy | PASS | | test | PASS | | cargo-deny | PASS | | static builds | PASS | +---------------------------+--------------+ 256 pass 0 fail 11712 expect() calls 65 pass 1 fail 217 expect() calls ``` [Appended findings.md](https://git.kayg.org/attachments/41e2db3d-3d7d-44e5-a6f3-89fd87dbbe71). Cleanup: own baseline, target and comparison binary removed; zero executable/cwd references before deletion; browser fixture ports 4499/4500 closed; clean worktree and HEAD equals pushed head. [Cleanup proof](https://git.kayg.org/attachments/047822fd-3f4b-4346-ae1e-2969236d8f77). ![Production-build retained-typing notice](https://git.kayg.org/attachments/a942294a-aa53-4a99-9d24-e09f626b5bb7)
Author
Owner

Round 3 starting on resume-refused-loop-r3, base 724f14de0b8aa3ab808d80be40266cb931cdee1f (origin/resume-refused-loop). Read all 52 comments on #244; the issue has no parent link. Round-2 review head is 91992ec8571a5dcd3a90e178a321e2fe16b5b78f; I will bring over its tests, fix discard and keyboard reachability, and leave apps/tracer/src/connection.ts untouched. No deployment.

Round 3 starting on `resume-refused-loop-r3`, base `724f14de0b8aa3ab808d80be40266cb931cdee1f` (`origin/resume-refused-loop`). Read all 52 comments on #244; the issue has no parent link. Round-2 review head is `91992ec8571a5dcd3a90e178a321e2fe16b5b78f`; I will bring over its tests, fix discard and keyboard reachability, and leave `apps/tracer/src/connection.ts` untouched. No deployment.
Author
Owner

Shared toast step committed as 438b74b6c. It adds a second native action, accessible action-group metadata and focusAction() to the existing packages/ui toast. bun run check exits 0; git diff --check passes.

The pre-fix retained-typing regression reproduces the P2s and the new fresh-shell rule: connection-review-retained-lifetime.test.ts is 2 pass / 4 fail / 20 assertions. Fresh input is still withheld while the saved buffer remains mixed into the live queue. Raw output

Shared toast step committed as `438b74b6c`. It adds a second native action, accessible action-group metadata and `focusAction()` to the existing `packages/ui` toast. `bun run check` exits 0; `git diff --check` passes. The pre-fix retained-typing regression reproduces the P2s and the new fresh-shell rule: `connection-review-retained-lifetime.test.ts` is 2 pass / 4 fail / 20 assertions. Fresh input is still withheld while the saved buffer remains mixed into the live queue. [Raw output](https://git.kayg.org/attachments/cf9f4090-f9f5-4610-8d89-a70b90d35bc6)
Author
Owner

Round-3 regression tests committed as a4e0c43b1. The unit oracle now requires a named Discard action, retains saved bytes separately, delivers new typing to the fresh shell, and covers another refused writer. The browser oracle keeps Tab and Shift+Tab in the shell, then uses the documented focus handoff to reach both buttons. bun run check exits 0; git diff --check passes. Pre-fix unit result remains 2 pass / 4 fail / 20 assertions, attached above.

Round-3 regression tests committed as `a4e0c43b1`. The unit oracle now requires a named Discard action, retains saved bytes separately, delivers new typing to the fresh shell, and covers another refused writer. The browser oracle keeps Tab and Shift+Tab in the shell, then uses the documented focus handoff to reach both buttons. `bun run check` exits 0; `git diff --check` passes. Pre-fix unit result remains 2 pass / 4 fail / 20 assertions, attached above.
Author
Owner

Production browser run: 3/4 review checks passed. The keyboard check failed because its expectation included the old saved bytes on the fresh writer; observed fresh-shell delivery was only \t, confirming those bytes stayed isolated. Updating the assertion to check focus handoff and fresh-shell keys only.

Production browser run: 3/4 review checks passed. The keyboard check failed because its expectation included the old saved bytes on the fresh writer; observed fresh-shell delivery was only `\t`, confirming those bytes stayed isolated. Updating the assertion to check focus handoff and fresh-shell keys only.
Author
Owner

Second production browser run: 3/4 review checks passed. The terminal kept focus after both Tab and Shift+Tab; each produced a fresh-shell tab byte. The assertion counted only the first key; correcting it to expect both delivered bytes.

Second production browser run: 3/4 review checks passed. The terminal kept focus after both Tab and Shift+Tab; each produced a fresh-shell tab byte. The assertion counted only the first key; correcting it to expect both delivered bytes.
Author
Owner

Correction to my previous browser note: the latest production run showed one tab byte after Tab and Shift+Tab, not two. The textarea remained focused; Shift+Tab did not add another frame. I am making the browser assertion verify the fresh-shell Tab and that Shift+Tab leaves focus with the terminal, while the saved bytes remain absent.

Correction to my previous browser note: the latest production run showed one tab byte after Tab and Shift+Tab, not two. The textarea remained focused; Shift+Tab did not add another frame. I am making the browser assertion verify the fresh-shell Tab and that Shift+Tab leaves focus with the terminal, while the saved bytes remain absent.
Author
Owner

Production browser evidence: after a 100 ms settle, Tab and Shift+Tab delivered fresh-writer byte values 9, 27, 91, 90 (Tab then ESC [ Z); the terminal textarea kept focus. Earlier immediate samples raced the Shift+Tab frame. Updating the test to await the exact sequence and assert the old saved marker is absent.

Production browser evidence: after a 100 ms settle, Tab and Shift+Tab delivered fresh-writer byte values `9, 27, 91, 90` (Tab then ESC [ Z); the terminal textarea kept focus. Earlier immediate samples raced the Shift+Tab frame. Updating the test to await the exact sequence and assert the old saved marker is absent.
Author
Owner

Production browser review checks: 4/4 passed in 56.3 s on working tree based at a4e0c43b1. Verified both actions are announced, Ctrl+Shift+Space focuses Resend, Tab and Shift+Tab remain terminal input, fresh typing flows while the offer stays open, and Discard does not resend saved bytes. Screenshot: retained-typing-actions.png

Production browser review checks: 4/4 passed in 56.3 s on working tree based at a4e0c43b1. Verified both actions are announced, Ctrl+Shift+Space focuses Resend, Tab and Shift+Tab remain terminal input, fresh typing flows while the offer stays open, and Discard does not resend saved bytes. Screenshot: ![retained-typing-actions.png](https://git.kayg.org/attachments/65a4ef6e-11ef-43fa-ab7d-22a591ac26ef)
Author
Owner

scripts/verify iterate reached the TypeScript connection suite: 65 passed, 2 failed, 229 assertions. Both connection-review-refusal-input.test.ts sent-before-drop variants expected the retained 11 bytes in the live queue; the implementation now stores them in retainedInput until consent. Updating the fixture assertions to match the separate buffer and checking queue state after resend.

`scripts/verify iterate` reached the TypeScript connection suite: 65 passed, 2 failed, 229 assertions. Both `connection-review-refusal-input.test.ts` sent-before-drop variants expected the retained 11 bytes in the live queue; the implementation now stores them in `retainedInput` until consent. Updating the fixture assertions to match the separate buffer and checking queue state after resend.
Author
Owner

Implementation committed as 460064f26. bun run check passed; all connection tests passed: 67/67 across 9 files, 243 assertions. This includes both refused-resume send-state variants and the retained-input/discard cases.

Implementation committed as `460064f26`. `bun run check` passed; all connection tests passed: 67/67 across 9 files, 243 assertions. This includes both refused-resume send-state variants and the retained-input/discard cases.
Author
Owner

First scripts/verify fast reached static builds successfully, but the Rust test row failed only in unrelated crates/plugins/ssh/tests/install.rs:3483: review_inode_reuse_after_diagnostics_preserves_live_replacement could not reproduce inode reuse in 256 allocations (93 passed, 1 failed, 1 ignored in that binary). Host load average was 3.75 / 9.88 / 11.98. This is outside the gate's named host-load exceptions; I will rerun the isolated test and the full gate, with no source change unless evidence identifies a defect.

First `scripts/verify fast` reached static builds successfully, but the Rust test row failed only in unrelated `crates/plugins/ssh/tests/install.rs:3483`: `review_inode_reuse_after_diagnostics_preserves_live_replacement` could not reproduce inode reuse in 256 allocations (93 passed, 1 failed, 1 ignored in that binary). Host load average was 3.75 / 9.88 / 11.98. This is outside the gate's named host-load exceptions; I will rerun the isolated test and the full gate, with no source change unless evidence identifies a defect.
Author
Owner

Reran the exact failing test on unchanged HEAD 460064f26: review_inode_reuse_after_diagnostics_preserves_live_replacement passed (1 passed, 94 filtered, 0.34 s). No source change. Rerunning the full fast gate to confirm the complete suite.

Reran the exact failing test on unchanged HEAD `460064f26`: `review_inode_reuse_after_diagnostics_preserves_live_replacement` passed (1 passed, 94 filtered, 0.34 s). No source change. Rerunning the full fast gate to confirm the complete suite.
Author
Owner

D243 static size comparison, same locked release package and target: merge base 724f14de produced 21,100,176 bytes; branch 460064f2 produced 21,100,176 bytes. Delta: 0 bytes. The branch remains exactly at the x86_64 size cap. Build used the existing per-job target under /home/kayg/.cache/codex-scratch/resume-refused-loop-r3/target.

D243 static size comparison, same locked release package and target: merge base `724f14de` produced 21,100,176 bytes; branch `460064f2` produced 21,100,176 bytes. Delta: 0 bytes. The branch remains exactly at the x86_64 size cap. Build used the existing per-job target under `/home/kayg/.cache/codex-scratch/resume-refused-loop-r3/target`.
Author
Owner

Finished #244 at 460064f2616b87575429d12187414b692281720c. Published resume-refused-loop-r3 and fast-forwarded origin/resume-refused-loop to the same head. Worktree is clean.

Saved uncertain typing now stays separate from fresh shell input. The retained typing notice offers Resend typing and Discard; both choices resume normal typing. Ctrl+Shift+Space / ⌘⇧Space focuses the actions only while the choice is visible; Tab and Shift+Tab remain shell input. Connection tests: 67 passed, 0 failed. Production browser review: 4 passed, including the keyboard, screen reader announcement, resend and discard paths.

retained-typing-actions.png

D243 size comparison: stripped static x86_64 branch binary 21,100,176 bytes; merge base 724f14de 21,100,176 bytes; delta 0 bytes. Static gate also reports the aarch64 artifact at 19,328,840 bytes, at its cap. Full scripts/verify fast transcript: verify-fast-rerun.log.

Successful scripts/verify fast gate output:

+---------------------------+--------------+
| Rust gate                 | Result       |
+---------------------------+--------------+
| fmt                       | PASS         |
| VT native fmt             | PASS         |
| CLI plugin compile-out    | PASS         |
| clippy                    | PASS         |
| test                      | PASS         |
| cargo-deny                | PASS         |
| static builds             | PASS         |
+---------------------------+--------------+

 37 pass
 0 fail
 34463 expect() calls
Ran 37 tests across 10 files. [2.39s]
Finished #244 at `460064f2616b87575429d12187414b692281720c`. Published `resume-refused-loop-r3` and fast-forwarded `origin/resume-refused-loop` to the same head. Worktree is clean. Saved uncertain typing now stays separate from fresh shell input. The retained typing notice offers Resend typing and Discard; both choices resume normal typing. Ctrl+Shift+Space / ⌘⇧Space focuses the actions only while the choice is visible; Tab and Shift+Tab remain shell input. Connection tests: 67 passed, 0 failed. Production browser review: 4 passed, including the keyboard, screen reader announcement, resend and discard paths. ![retained-typing-actions.png](https://git.kayg.org/attachments/65a4ef6e-11ef-43fa-ab7d-22a591ac26ef) D243 size comparison: stripped static x86_64 branch binary 21,100,176 bytes; merge base `724f14de` 21,100,176 bytes; delta 0 bytes. Static gate also reports the aarch64 artifact at 19,328,840 bytes, at its cap. Full `scripts/verify fast` transcript: [verify-fast-rerun.log](https://git.kayg.org/attachments/132fb351-8e9f-4d47-b6b6-9964df775288). Successful `scripts/verify fast` gate output: ``` +---------------------------+--------------+ | Rust gate | Result | +---------------------------+--------------+ | fmt | PASS | | VT native fmt | PASS | | CLI plugin compile-out | PASS | | clippy | PASS | | test | PASS | | cargo-deny | PASS | | static builds | PASS | +---------------------------+--------------+ 37 pass 0 fail 34463 expect() calls Ran 37 tests across 10 files. [2.39s] ```
Author
Owner

Round-3 delta review starting: branch review-resume-refused-loop-r3, base/head f57cdd479. Read all 66 comments on #244; no parent link. Reviewing 724f14de0..f57cdd479 including prior review controls. Checking consent/lifetime, keyboard registry and terminal coexistence, every toast-related browser spec, 67 connection tests and final fast gate. No deployment; push only review-resume-refused-loop-r3. Evidence and findings remain in job scratch.

Round-3 delta review starting: branch review-resume-refused-loop-r3, base/head f57cdd479. Read all 66 comments on #244; no parent link. Reviewing 724f14de0..f57cdd479 including prior review controls. Checking consent/lifetime, keyboard registry and terminal coexistence, every toast-related browser spec, 67 connection tests and final fast gate. No deployment; push only review-resume-refused-loop-r3. Evidence and findings remain in job scratch.
Author
Owner

Round-3 finding, provisional P2: keyboard focus handoff is one-way. Ctrl+Shift+Space -> Tab -> Enter on Discard (and Enter on Send again) hides the toast but leaves the terminal textarea inactive. Both new production-browser tests review: keyboard Discard returns typing to the live shell / review: keyboard Send again returns typing to the live shell fail at terminal focus after the action. Original 4 browser controls and repeated native activation pass (5 pass / 2 fail). Strengthening the reproductions to observe post-choice delivery; all 22 toast-related spec files now running on unique port 4519, omitting only the canvas frame-time budget case because this brief forbids unlisted hosts and timing evidence must come from the perf VM. No new timing claim. Unit audit now checks zeroing of held references on Discard/session replacement/dispose: 67 pass, 247 assertions; TypeScript passes. Full gate stopped during the initial compile to finish review tests first; final fast follows committed tests.

Round-3 finding, provisional P2: keyboard focus handoff is one-way. Ctrl+Shift+Space -> Tab -> Enter on Discard (and Enter on Send again) hides the toast but leaves the terminal textarea inactive. Both new production-browser tests `review: keyboard Discard returns typing to the live shell` / `review: keyboard Send again returns typing to the live shell` fail at terminal focus after the action. Original 4 browser controls and repeated native activation pass (5 pass / 2 fail). Strengthening the reproductions to observe post-choice delivery; all 22 toast-related spec files now running on unique port 4519, omitting only the canvas frame-time budget case because this brief forbids unlisted hosts and timing evidence must come from the perf VM. No new timing claim. Unit audit now checks zeroing of held references on Discard/session replacement/dispose: 67 pass, 247 assertions; TypeScript passes. Full gate stopped during the initial compile to finish review tests first; final fast follows committed tests.
Author
Owner

Review audit step pushed: bf56ae517 (retained-byte zeroing controls only). TypeScript check passes; connection suite 67 pass / 0 fail / 247 assertions. Mutation audit temporarily omitted the production retainedInput.fill(0) calls and restored the exact original source afterwards: original lifetime oracle 6 pass / 0 fail; strengthened oracle 3 pass / 3 fail. No shipping defect added to counts. Initial browser reproduction confirms both keyboard choices lose terminal focus; delivery-focused regressions plus storage/console/sign-out control are included in the full toast-related run.

Review audit step pushed: bf56ae517 (retained-byte zeroing controls only). TypeScript check passes; connection suite 67 pass / 0 fail / 247 assertions. Mutation audit temporarily omitted the production retainedInput.fill(0) calls and restored the exact original source afterwards: original lifetime oracle 6 pass / 0 fail; strengthened oracle 3 pass / 3 fail. No shipping defect added to counts. Initial browser reproduction confirms both keyboard choices lose terminal focus; delivery-focused regressions plus storage/console/sign-out control are included in the full toast-related run.
Author
Owner

Review step 187e2e727: strengthen two-window consent with distinct markers and exact frame contents (the old identical markers could conceal swapped ownership). TypeScript check passes; 67 connection tests pass / 250 assertions. No production change. Full toast run has confirmed an existing test selector failure in add-host-prototype ten-hosts: .ui-toast-action now resolves to Review plus the hidden secondary button. This is recorded as test maintenance, not evidence of a broken visible Review button; sessions-canvas has the same selector and remains in the run.

Review step 187e2e727: strengthen two-window consent with distinct markers and exact frame contents (the old identical markers could conceal swapped ownership). TypeScript check passes; 67 connection tests pass / 250 assertions. No production change. Full toast run has confirmed an existing test selector failure in add-host-prototype ten-hosts: .ui-toast-action now resolves to Review plus the hidden secondary button. This is recorded as test maintenance, not evidence of a broken visible Review button; sessions-canvas has the same selector and remains in the run.
Author
Owner

Evidence for the provisional P2 and defensive audit: initial production-browser result 5 pass / 2 fail (both keyboard choices leave Terminal input inactive); original clearing oracle under omission 6 pass / 0 fail vs strengthened oracle 3 pass / 3 fail; restored production source 67 connection tests pass / 250 assertions. Review commits bf56ae517 and 187e2e727 are pushed. Delivery-focused regressions and all six viewport/theme captures are in the remaining browser batch.

retained-browser.log
clearing-mutation.log
clearing-mutation-old-oracle.log
connections-isolation.log

Evidence for the provisional P2 and defensive audit: initial production-browser result 5 pass / 2 fail (both keyboard choices leave Terminal input inactive); original clearing oracle under omission 6 pass / 0 fail vs strengthened oracle 3 pass / 3 fail; restored production source 67 connection tests pass / 250 assertions. Review commits bf56ae517 and 187e2e727 are pushed. Delivery-focused regressions and all six viewport/theme captures are in the remaining browser batch. [retained-browser.log](https://git.kayg.org/attachments/cfd9f342-e55e-43e7-bf29-028f65e55cd2) [clearing-mutation.log](https://git.kayg.org/attachments/8031a7ef-613a-4b21-b733-b5fec8df3fd2) [clearing-mutation-old-oracle.log](https://git.kayg.org/attachments/25ecf44c-6ac6-405a-90ee-e86bca45265d) [connections-isolation.log](https://git.kayg.org/attachments/6c2b2a55-7c2b-4a86-bfc2-e4a50cdbfd81)
Author
Owner

Audit correction: the two focus-only browser regressions pass their new physical-key delivery assertion, then fail only on textarea focus. Physical ASCII typing still reaches the shell. Focus state alone is insufficient evidence of input loss, so the provisional P2 is not yet confirmed as a user-visible defect. The next controls exercise committed text without keydown events and a focused-terminal positive control. All six offer geometry/click captures pass; repeated activation, storage/console/sign-out, close and Ctrl+Space controls pass. No production change.

Audit correction: the two focus-only browser regressions pass their new physical-key delivery assertion, then fail only on textarea focus. Physical ASCII typing still reaches the shell. Focus state alone is insufficient evidence of input loss, so the provisional P2 is not yet confirmed as a user-visible defect. The next controls exercise committed text without keydown events and a focused-terminal positive control. All six offer geometry/click captures pass; repeated activation, storage/console/sign-out, close and Ctrl+Space controls pass. No production change.
Author
Owner

Confirmed remaining P2 in the keyboard choice workflow: physical ASCII input is delivered after Discard/Send again, but committed text sent through the browser text-input path is dropped. Focused-textarea positive control delivers the same synthetic 漢字 string. This is not a new polish regression: the pre-delta Resend button at 724f14de0 reproduces the same failure. Public renderer focus targets its editable container; text-only beforeinput handling lives on its textarea. Replaced the invalid internal-textarea focus oracle with observable delivery plus a public terminal-focus check. Final regressions will preserve this narrower, demonstrated failure.

Baseline browser comparison: all four DPR-3 short-toast ratios match exactly to four decimals (head/base: 0.2520, 0.4255, 0.2101, 0.3712 versus ceiling 0.1), using the identical repaired Reopen fixture with unchanged thresholds. Canvas resize/footer/shortcut, settings, ended-strip, four sign-in snapshots, and two product/sign-out checks also fail on 724f14de0. The palette sign-out check passed on baseline and is being rechecked on head. A separate sidebar setup race captured an initial count then waited for that obsolete count; the existing populated-tree assertion now performs the wait without that tautology. No production fixes or threshold relaxation.

Confirmed remaining P2 in the keyboard choice workflow: physical ASCII input is delivered after Discard/Send again, but committed text sent through the browser text-input path is dropped. Focused-textarea positive control delivers the same synthetic 漢字 string. This is not a new polish regression: the pre-delta Resend button at 724f14de0 reproduces the same failure. Public renderer focus targets its editable container; text-only beforeinput handling lives on its textarea. Replaced the invalid internal-textarea focus oracle with observable delivery plus a public terminal-focus check. Final regressions will preserve this narrower, demonstrated failure. Baseline browser comparison: all four DPR-3 short-toast ratios match exactly to four decimals (head/base: 0.2520, 0.4255, 0.2101, 0.3712 versus ceiling 0.1), using the identical repaired Reopen fixture with unchanged thresholds. Canvas resize/footer/shortcut, settings, ended-strip, four sign-in snapshots, and two product/sign-out checks also fail on 724f14de0. The palette sign-out check passed on baseline and is being rechecked on head. A separate sidebar setup race captured an initial count then waited for that obsolete count; the existing populated-tree assertion now performs the wait without that tautology. No production fixes or threshold relaxation.
Author
Owner

Review steps published on review-resume-refused-loop-r3: ae8070c00 repairs the unreachable glass-toast fixture; a9c1cd438 preserves the two committed-text failures and 15 passing retained-input controls; a8c02e84c uses named Review/Reopen buttons; e71893184 removes a transient-count sidebar wait. TypeScript passes. Review/Reopen cases and all four sidebar cases pass. Final focused browser run: 21 pass / 5 fail (two committed-text findings, three older sign-out checks); two of the sign-out checks also fail at 724f14de0, while the palette sign-out check passed once there and still fails on head, so it remains unattributed rather than counted as a new defect. No production source changed. Recovery preview is running; final scripts/verify fast and same-recipe static size comparison follow on head e718931840.

text-controls.log
baseline-browser.log
baseline-ghost-fixture.patch

Review steps published on review-resume-refused-loop-r3: ae8070c00 repairs the unreachable glass-toast fixture; a9c1cd438 preserves the two committed-text failures and 15 passing retained-input controls; a8c02e84c uses named Review/Reopen buttons; e71893184 removes a transient-count sidebar wait. TypeScript passes. Review/Reopen cases and all four sidebar cases pass. Final focused browser run: 21 pass / 5 fail (two committed-text findings, three older sign-out checks); two of the sign-out checks also fail at 724f14de0, while the palette sign-out check passed once there and still fails on head, so it remains unattributed rather than counted as a new defect. No production source changed. Recovery preview is running; final scripts/verify fast and same-recipe static size comparison follow on head e7189318403739c72b70e97877dd9bc947d0224a. [text-controls.log](https://git.kayg.org/attachments/26695caa-04a4-4be1-9091-226def33eec3) [baseline-browser.log](https://git.kayg.org/attachments/d7081c69-b14f-4265-b5e8-5db0fdf1905c) [baseline-ghost-fixture.patch](https://git.kayg.org/attachments/c447741e-340c-4253-a486-5f660bd943cb)
Author
Owner

Production-build saved-typing captures at 1440/393/375 px, ink/paper. All six assert message-above-actions, both buttons within the window/viewport, successful trial clicks on both, actual Send again/Discard selection, and phone targets >=44 px. No visual-quality grade or physical-phone claim. Final retained-typing controls are 15 pass / 2 fail for committed text; the focused-textarea positive control passes. Ordinary physical keys still arrive after both actions.

offer-393-ink.png
offer-375-ink.png
offer-1440-paper.png
offer-375-paper.png
offer-393-paper.png
offer-1440-ink.png
final-browser.log

Production-build saved-typing captures at 1440/393/375 px, ink/paper. All six assert message-above-actions, both buttons within the window/viewport, successful trial clicks on both, actual Send again/Discard selection, and phone targets >=44 px. No visual-quality grade or physical-phone claim. Final retained-typing controls are 15 pass / 2 fail for committed text; the focused-textarea positive control passes. Ordinary physical keys still arrive after both actions. ![offer-393-ink.png](https://git.kayg.org/attachments/289ec36d-d7fd-4ded-84c1-351dc139e482) ![offer-375-ink.png](https://git.kayg.org/attachments/58c4f2d6-cfc1-4134-822b-74a41d375179) ![offer-1440-paper.png](https://git.kayg.org/attachments/6a2d54df-bde8-4ef2-aaa7-c133ec1a2ea1) ![offer-375-paper.png](https://git.kayg.org/attachments/4c6505fc-0f1a-4a6d-b8e5-2ef6418e3502) ![offer-393-paper.png](https://git.kayg.org/attachments/b9be56c6-4258-43f9-9618-ba32b65793cc) ![offer-1440-ink.png](https://git.kayg.org/attachments/076e7683-b60d-46b4-906f-6f0427adca9f) [final-browser.log](https://git.kayg.org/attachments/18424357-1412-4f5c-b61d-ae539fe2f7b7)
Author
Owner

Final review head bbc7e418f8 is pushed and clean (seven test-only commits). The active recovery-card fixture repair is bbc7e418f; TypeScript and all 15 preview cases pass, including six additional audit/reviewer security controls. Baseline repeat also reproduces both recovery-selector failures and the palette sign-out failure (2/2), resolving the earlier attribution uncertainty.

Coverage audit against Playwright discovery: 308 requested tests in 22 toast-related files; 302 functional cases executed with 284 passes and 18 failures. Sixteen failing cases reproduce before the delta; two preserve the remaining committed-text P2 after keyboard choices. Six runtime-budget cases remain unverified because this brief forbids the required perf venue; incidental local timing output is not evidence. The six additional recovery security cases pass. No thresholds were loosened and no production source changed. Final scripts/verify fast is queued through build-slot on this head.

browser-matrix.txt
browser-coverage.txt
recovery-final.log
baseline-preview.log

baseline-retained-input-source.txt

Final review head bbc7e418f803b45ef5154edb60e37b884d266fbe is pushed and clean (seven test-only commits). The active recovery-card fixture repair is bbc7e418f; TypeScript and all 15 preview cases pass, including six additional audit/reviewer security controls. Baseline repeat also reproduces both recovery-selector failures and the palette sign-out failure (2/2), resolving the earlier attribution uncertainty. Coverage audit against Playwright discovery: 308 requested tests in 22 toast-related files; 302 functional cases executed with 284 passes and 18 failures. Sixteen failing cases reproduce before the delta; two preserve the remaining committed-text P2 after keyboard choices. Six runtime-budget cases remain unverified because this brief forbids the required perf venue; incidental local timing output is not evidence. The six additional recovery security cases pass. No thresholds were loosened and no production source changed. Final scripts/verify fast is queued through build-slot on this head. [browser-matrix.txt](https://git.kayg.org/attachments/4e16f3f5-ab76-4a33-a9d0-d54c1da5fd65) [browser-coverage.txt](https://git.kayg.org/attachments/6986686e-41a1-40b6-ae01-88f7a172d3bc) [recovery-final.log](https://git.kayg.org/attachments/25f3893b-8fe3-4b8f-9899-a6a6a0300ec6) [baseline-preview.log](https://git.kayg.org/attachments/1be631c0-aa6e-4714-91f3-202024773d34) [baseline-retained-input-source.txt](https://git.kayg.org/attachments/34d458da-e916-4514-bbb3-3352b102dea5)
Author
Owner

Additional shortcut audit: the maintained upstream input-method keymap assigns Ctrl+Shift+Space to InsertFullSpace in Composition, Conversion and Precomposition states. Primary keymap. The app registry has no duplicate and plain Ctrl+Space is preserved, but this documented text-input use prevents a universal no-collision claim. A native-browser composition reproduction is drafted outside the checkout; it will verify the isComposing precondition before treating any focus change as a defect. The in-flight native gate remains on clean bbc7e418f; no new finding count until the runtime check.

Additional shortcut audit: the maintained upstream input-method keymap assigns Ctrl+Shift+Space to InsertFullSpace in Composition, Conversion and Precomposition states. [Primary keymap](https://github.com/google/mozc/blob/master/src/data/keymap/ms-ime.tsv). The app registry has no duplicate and plain Ctrl+Space is preserved, but this documented text-input use prevents a universal no-collision claim. A native-browser composition reproduction is drafted outside the checkout; it will verify the isComposing precondition before treating any focus change as a defect. The in-flight native gate remains on clean bbc7e418f; no new finding count until the runtime check.
Author
Owner

Full scripts/verify fast completed with exit 0 on bbc7e418f8. All Rust rows pass; tracer units 256/256, connection 67/67 (250 assertions), protocol 37/37. Complete transcript retained for final attachment. Stripped static artifacts: x86_64 21,100,176 bytes; ARM64 19,328,840 bytes. Composition-control browser check is queued through build-slot; same-recipe merge-base size comparison follows. No production code changes.

Full scripts/verify fast completed with exit 0 on bbc7e418f803b45ef5154edb60e37b884d266fbe. All Rust rows pass; tracer units 256/256, connection 67/67 (250 assertions), protocol 37/37. Complete transcript retained for final attachment. Stripped static artifacts: x86_64 21,100,176 bytes; ARM64 19,328,840 bytes. Composition-control browser check is queued through build-slot; same-recipe merge-base size comparison follows. No production code changes.
Author
Owner

Second P2 confirmed and preserved in pushed test-only commit aa416b20f0. review: active composition survives the focus chord with a resolved typing choice passes; the pending-choice counterpart fails because compositionend occurs. Both establish native CDP composition and verify a trusted Space keydown with isComposing=true before testing lifetime. core-screen.ts:770 consumes the chord whenever hasPendingInputResend is true, without a composition guard. TypeScript passes. This is distinct from the post-choice committed-text loss: the new shortcut interrupts composition before any choice is made.

The primary input-method keymap reserves Ctrl Shift Space for InsertFullSpace during Composition/Conversion/Precomposition: https://github.com/google/mozc/blob/master/src/data/keymap/ms-ime.tsv . This is a documented conflict plus a native-browser composition reproduction, not a tested OS input-method installation.

Current HOLD: P0=0/P1=0/P2=2/P3=0. Full fast passed on bbc7; the final-head repeat and full 19-case retained-input suite are scheduled sequentially after the merge-base static build. Updated aggregate functional coverage: 304 cases, 285 pass/19 fail (16 older failures plus three regression cases for the two P2s); six runtime-budget cases still unverified.

composition.log
shortcut-reservations.txt
input-method-keymap.md

Second P2 confirmed and preserved in pushed test-only commit aa416b20f0485d3a87799dbe14309a6fae0db24b. `review: active composition survives the focus chord with a resolved typing choice` passes; the pending-choice counterpart fails because compositionend occurs. Both establish native CDP composition and verify a trusted Space keydown with isComposing=true before testing lifetime. core-screen.ts:770 consumes the chord whenever hasPendingInputResend is true, without a composition guard. TypeScript passes. This is distinct from the post-choice committed-text loss: the new shortcut interrupts composition before any choice is made. The primary input-method keymap reserves Ctrl Shift Space for InsertFullSpace during Composition/Conversion/Precomposition: https://github.com/google/mozc/blob/master/src/data/keymap/ms-ime.tsv . This is a documented conflict plus a native-browser composition reproduction, not a tested OS input-method installation. Current HOLD: P0=0/P1=0/P2=2/P3=0. Full fast passed on bbc7; the final-head repeat and full 19-case retained-input suite are scheduled sequentially after the merge-base static build. Updated aggregate functional coverage: 304 cases, 285 pass/19 fail (16 older failures plus three regression cases for the two P2s); six runtime-budget cases still unverified. [composition.log](https://git.kayg.org/attachments/7441f625-b3dd-474f-a741-5f985f82726f) [shortcut-reservations.txt](https://git.kayg.org/attachments/f5f38849-07fc-4005-beee-b599491a96aa) [input-method-keymap.md](https://git.kayg.org/attachments/c800f565-9f53-4b4b-9218-0b1647df3dc7)
Author
Owner

Final focused browser run on aa416b20f0: 16 pass / 3 fail, exactly the two committed-text cases and pending-composition case already reported. Both positive controls pass; six geometry/click captures pass again. All 13 recorded browser/server process IDs are gone. Fresh discovery confirms 310 tests in 22 toast-related files; aggregate functional coverage is 304 run, 285 pass/19 fail, with 16 failures reproduced before the delta. Six runtime-budget cases remain unverified; six additional recovery audit/reviewer cases pass.

Same-recipe merge-base x86_64 static build completed: 21,096,144 bytes at 5b2a1b9ee vs 21,100,176 for the reviewed native code (+4,032 bytes, the existing #244 cap). Baseline is stripped static-PIE. Final-head scripts/verify fast is now running; final artifact size/hash will be refreshed after it completes.

final-retained.log
browser-matrix.txt
browser-coverage.txt
toast-test-list-final.txt
final-retained-process-cleanup.txt

Final focused browser run on aa416b20f0485d3a87799dbe14309a6fae0db24b: 16 pass / 3 fail, exactly the two committed-text cases and pending-composition case already reported. Both positive controls pass; six geometry/click captures pass again. All 13 recorded browser/server process IDs are gone. Fresh discovery confirms 310 tests in 22 toast-related files; aggregate functional coverage is 304 run, 285 pass/19 fail, with 16 failures reproduced before the delta. Six runtime-budget cases remain unverified; six additional recovery audit/reviewer cases pass. Same-recipe merge-base x86_64 static build completed: 21,096,144 bytes at 5b2a1b9ee vs 21,100,176 for the reviewed native code (+4,032 bytes, the existing #244 cap). Baseline is stripped static-PIE. Final-head scripts/verify fast is now running; final artifact size/hash will be refreshed after it completes. [final-retained.log](https://git.kayg.org/attachments/ab0d222b-9105-4838-8c9d-f293ad72ec9d) [browser-matrix.txt](https://git.kayg.org/attachments/38db5d9a-f9e3-4aeb-823e-67e80cbddf2b) [browser-coverage.txt](https://git.kayg.org/attachments/50335d40-1689-4374-8865-173bf7f44ca9) [toast-test-list-final.txt](https://git.kayg.org/attachments/9d25d942-c8e1-432d-88e8-33f899cf95c3) [final-retained-process-cleanup.txt](https://git.kayg.org/attachments/5d00bf12-cba7-43da-b381-df7da6e0e97c)
Author
Owner

Final-head scripts/verify fast completed with exit 0 on aa416b20f0. All Rust rows pass; tracer 256/256, connection 67/67 (250 assertions), protocol 37/37. Final static x86_64 is 21,100,176 bytes against measured merge base 21,096,144 (+4,032); ARM64 is 19,328,840. Native hidden logout and absolute-expiry controls pass. Verbatim gate summary and complete stdout/stderr are attached below.

A cross-configuration scan added real/host-facts.spec.ts and the changed real/mobile-lease.spec.ts to the coverage audit. Initial real-server run: OS/kernel case passes; phone refusal case times out; mobile sees a refusal but no fresh Hello. They are not attributed to the delta yet. Pre-delta and head controls are running with the same native binary (no native delta 724f14de0..f57cdd479). Fixed stage labels locate the old phone selector wait; source audit found the real bridge discards delayed Close frames and drops the upstream close code/reason. Zero-delay controls will separate this fixture issue from product behavior and test the stale old-copy assertion. All real fixture state is private scratch; owner fixtures are untouched. Current confirmed verdict remains HOLD, P0=0/P1=0/P2=2/P3=0 pending these controls.

fast.log
fast-summary.txt
static-size-comparison.txt
hidden-authority-controls.txt
review-source-audit.txt

+---------------------------+--------------+
| Rust gate                 | Result       |
+---------------------------+--------------+
| fmt                       | PASS         |
| VT native fmt             | PASS         |
| CLI plugin compile-out    | PASS         |
| clippy                    | PASS         |
| test                      | PASS         |
| cargo-deny                | PASS         |
| static builds             | PASS         |
+---------------------------+--------------+

 256 pass
 0 fail
 11712 expect() calls
Ran 256 tests across 41 files. [1486.00ms]

 67 pass
 0 fail
 250 expect() calls
Ran 67 tests across 9 files. [299.00ms]

 37 pass
 0 fail
 34463 expect() calls
Ran 37 tests across 10 files. [4.69s]
Final-head scripts/verify fast completed with exit 0 on aa416b20f0485d3a87799dbe14309a6fae0db24b. All Rust rows pass; tracer 256/256, connection 67/67 (250 assertions), protocol 37/37. Final static x86_64 is 21,100,176 bytes against measured merge base 21,096,144 (+4,032); ARM64 is 19,328,840. Native hidden logout and absolute-expiry controls pass. Verbatim gate summary and complete stdout/stderr are attached below. A cross-configuration scan added real/host-facts.spec.ts and the changed real/mobile-lease.spec.ts to the coverage audit. Initial real-server run: OS/kernel case passes; phone refusal case times out; mobile sees a refusal but no fresh Hello. They are not attributed to the delta yet. Pre-delta and head controls are running with the same native binary (no native delta 724f14de0..f57cdd479). Fixed stage labels locate the old phone selector wait; source audit found the real bridge discards delayed Close frames and drops the upstream close code/reason. Zero-delay controls will separate this fixture issue from product behavior and test the stale old-copy assertion. All real fixture state is private scratch; owner fixtures are untouched. Current confirmed verdict remains HOLD, P0=0/P1=0/P2=2/P3=0 pending these controls. [fast.log](https://git.kayg.org/attachments/3b5141c1-e5d1-4913-90f1-63396069c7d0) [fast-summary.txt](https://git.kayg.org/attachments/cc42a29d-047c-46e9-b3a7-93915c77f786) [static-size-comparison.txt](https://git.kayg.org/attachments/1dca0fee-2daa-4271-b5cf-0cff5e4d283a) [hidden-authority-controls.txt](https://git.kayg.org/attachments/d641d115-6ee7-464e-92c9-1a31a171348e) [review-source-audit.txt](https://git.kayg.org/attachments/02fbdbc5-757d-49c7-98ad-c99788e85923) ``` +---------------------------+--------------+ | Rust gate | Result | +---------------------------+--------------+ | fmt | PASS | | VT native fmt | PASS | | CLI plugin compile-out | PASS | | clippy | PASS | | test | PASS | | cargo-deny | PASS | | static builds | PASS | +---------------------------+--------------+ 256 pass 0 fail 11712 expect() calls Ran 256 tests across 41 files. [1486.00ms] 67 pass 0 fail 250 expect() calls Ran 67 tests across 9 files. [299.00ms] 37 pass 0 fail 34463 expect() calls Ran 37 tests across 10 files. [4.69s] ```
Author
Owner

Finish: HOLD — P0=0 / P1=0 / P2=2 / P3=1. Reviewed 724f14de0..f57cdd479. Eight test-only commits pushed to review-resume-refused-loop-r3; clean head aa416b20f0. No production change, merge, deployment or issue closure.

  • P2: Ctrl+Shift+Space ends active native browser composition while saved typing is pending. review: active composition survives the focus chord with a pending typing choice fails on compositionend; the resolved-choice control passes. Both establish CDP composition and verify trusted Space with isComposing=true. core-screen.ts:770 checks only pending typing. The upstream input-method map also reserves this chord: https://github.com/google/mozc/blob/master/src/data/keymap/ms-ime.tsv . No installed OS input-method runtime was tested.
  • P2: review: keyboard Discard preserves committed text input in the live shell and the Send again counterpart fail on delivered committed text; focused-fresh-terminal control passes. Physical keys work. This remaining defect also reproduces through pre-delta Resend. Canvas window clicks route through frame.ts:103 / TerminalClient.focus at terminal.ts:779 to the renderer container; text-only beforeinput forwarding belongs to its textarea. The earlier focus-only claim was corrected.
  • P3: real/mobile-lease.spec.ts:78 still expects “Your waiting typing is saved.” Isolated zero-delay execution reaches fresh attach and visible Send again, then fails on that old sentence. The same full real-server/PTY flow with the intended current sentence passes, including six clickable captures and one actual resend. The failing assertion is already tracked in this branch.

Main retained-input suite: 16 pass / 3 fail. Expanded inventory: 313 original cases in 24 files, across both browser configs; 307 executed, 286 pass / 21 fail, six runtime-budget cases UNVERIFIED (brief forbids the required venue; local timings are not evidence). Eighteen failing cases also fail before the delta; the other three preserve the P2s. The mobile case additionally has the stale-copy oracle once its older bridge problem is controlled. Six extra recovery security cases and the supplemental real-phone/current-copy controls pass.

Defensive audit: held-reference checks reject removing the wipe (old oracle 6 pass/0 fail; strengthened 3 pass/3 fail). Distinct window samples, repeat activation, storage/console/sign-out/close, fresh typing, Tab/Shift+Tab and plain Ctrl+Space controls pass. Fixed stale selectors/setup oracles without weakening assertions or pixel ceilings. Original real fixtures also have an absent phone split selector and a delayed bridge that drops Close frames/code/reason; both reproduce before this delta. Registered-key phone control passes real refusal/Sessions taps. Zero injected delay preserves Close delivery and the corrected-copy real recovery flow passes. No physical-phone/WebKit or complete real multi-account certification is claimed. Screenshots are for human judgment.

D300/native liveness and connection.ts are unchanged by the reviewed delta; native hidden logout and absolute-expiry controls pass. Final stripped static x86_64 21,100,176 bytes vs measured merge base 5b2a1b9ee 21,096,144: +4,032 bytes, within the existing #244 cap. ARM64 19,328,840 bytes. Same pinned compiler/recipe on both comparison builds.

All recorded browser/server PIDs are gone. Owned baseline, build targets, fixture state, copied binaries and temporary harnesses removed; evidence retained outside the checkout. Reviewer checklist and chronological findings attached.

scripts/verify fast: exit 0 on the exact head above. Verbatim summary below; complete stdout/stderr is linked.

+---------------------------+--------------+
| Rust gate                 | Result       |
+---------------------------+--------------+
| fmt                       | PASS         |
| VT native fmt             | PASS         |
| CLI plugin compile-out    | PASS         |
| clippy                    | PASS         |
| test                      | PASS         |
| cargo-deny                | PASS         |
| static builds             | PASS         |
+---------------------------+--------------+

 256 pass
 0 fail
 11712 expect() calls
Ran 256 tests across 41 files. [1486.00ms]

 67 pass
 0 fail
 250 expect() calls
Ran 67 tests across 9 files. [299.00ms]

 37 pass
 0 fail
 34463 expect() calls
Ran 37 tests across 10 files. [4.69s]

Gate, size and source receipts:
fast.log
fast-summary.txt
static-size-comparison.txt
hidden-authority-controls.txt
review-source-audit.txt

Findings, audit and cleanup:
findings.md
cleanup.txt
cleanup-before-removal.txt
real-run-summary.txt
real-baseline-host-facts.spec.ts.patch
real-head-diagnostic-host-facts.spec.ts.patch
real-head-diagnostic-mobile-lease.spec.ts.patch
cleanup-final.txt
real-original-copy.log
browser-matrix.txt
browser-coverage.txt
real-test-list.txt
reviewer-checklist.txt

Real-server controls and production captures (synthetic fixture typing only):
real-host-facts.log
real-baseline.log
real-head-diagnostic.log
real-zero.log
real-phone-trigger-control.patch
real-current-copy-control.patch
retained-typing-ink-1440.png
retained-typing-ink-375.png
retained-typing-ink-393.png
retained-typing-paper-1440.png
retained-typing-paper-375.png
retained-typing-paper-393.png
refusal-phone.png
sessions-phone.png

Finish: **HOLD — P0=0 / P1=0 / P2=2 / P3=1.** Reviewed 724f14de0..f57cdd479. Eight test-only commits pushed to review-resume-refused-loop-r3; clean head aa416b20f0485d3a87799dbe14309a6fae0db24b. No production change, merge, deployment or issue closure. - **P2:** Ctrl+Shift+Space ends active native browser composition while saved typing is pending. `review: active composition survives the focus chord with a pending typing choice` fails on compositionend; the resolved-choice control passes. Both establish CDP composition and verify trusted Space with isComposing=true. core-screen.ts:770 checks only pending typing. The upstream input-method map also reserves this chord: https://github.com/google/mozc/blob/master/src/data/keymap/ms-ime.tsv . No installed OS input-method runtime was tested. - **P2:** `review: keyboard Discard preserves committed text input in the live shell` and the Send again counterpart fail on delivered committed text; focused-fresh-terminal control passes. Physical keys work. This remaining defect also reproduces through pre-delta Resend. Canvas window clicks route through frame.ts:103 / TerminalClient.focus at terminal.ts:779 to the renderer container; text-only beforeinput forwarding belongs to its textarea. The earlier focus-only claim was corrected. - **P3:** real/mobile-lease.spec.ts:78 still expects “Your waiting typing is saved.” Isolated zero-delay execution reaches fresh attach and visible Send again, then fails on that old sentence. The same full real-server/PTY flow with the intended current sentence passes, including six clickable captures and one actual resend. The failing assertion is already tracked in this branch. Main retained-input suite: **16 pass / 3 fail**. Expanded inventory: **313 original cases in 24 files**, across both browser configs; **307 executed, 286 pass / 21 fail**, six runtime-budget cases UNVERIFIED (brief forbids the required venue; local timings are not evidence). Eighteen failing cases also fail before the delta; the other three preserve the P2s. The mobile case additionally has the stale-copy oracle once its older bridge problem is controlled. Six extra recovery security cases and the supplemental real-phone/current-copy controls pass. Defensive audit: held-reference checks reject removing the wipe (old oracle 6 pass/0 fail; strengthened 3 pass/3 fail). Distinct window samples, repeat activation, storage/console/sign-out/close, fresh typing, Tab/Shift+Tab and plain Ctrl+Space controls pass. Fixed stale selectors/setup oracles without weakening assertions or pixel ceilings. Original real fixtures also have an absent phone split selector and a delayed bridge that drops Close frames/code/reason; both reproduce before this delta. Registered-key phone control passes real refusal/Sessions taps. Zero injected delay preserves Close delivery and the corrected-copy real recovery flow passes. No physical-phone/WebKit or complete real multi-account certification is claimed. Screenshots are for human judgment. D300/native liveness and connection.ts are unchanged by the reviewed delta; native hidden logout and absolute-expiry controls pass. Final stripped static x86_64 **21,100,176 bytes** vs measured merge base 5b2a1b9ee **21,096,144**: **+4,032 bytes**, within the existing #244 cap. ARM64 **19,328,840 bytes**. Same pinned compiler/recipe on both comparison builds. All recorded browser/server PIDs are gone. Owned baseline, build targets, fixture state, copied binaries and temporary harnesses removed; evidence retained outside the checkout. Reviewer checklist and chronological findings attached. `scripts/verify fast`: **exit 0 on the exact head above**. Verbatim summary below; complete stdout/stderr is linked. ``` +---------------------------+--------------+ | Rust gate | Result | +---------------------------+--------------+ | fmt | PASS | | VT native fmt | PASS | | CLI plugin compile-out | PASS | | clippy | PASS | | test | PASS | | cargo-deny | PASS | | static builds | PASS | +---------------------------+--------------+ 256 pass 0 fail 11712 expect() calls Ran 256 tests across 41 files. [1486.00ms] 67 pass 0 fail 250 expect() calls Ran 67 tests across 9 files. [299.00ms] 37 pass 0 fail 34463 expect() calls Ran 37 tests across 10 files. [4.69s] ``` Gate, size and source receipts: [fast.log](https://git.kayg.org/attachments/3b5141c1-e5d1-4913-90f1-63396069c7d0) [fast-summary.txt](https://git.kayg.org/attachments/cc42a29d-047c-46e9-b3a7-93915c77f786) [static-size-comparison.txt](https://git.kayg.org/attachments/1dca0fee-2daa-4271-b5cf-0cff5e4d283a) [hidden-authority-controls.txt](https://git.kayg.org/attachments/d641d115-6ee7-464e-92c9-1a31a171348e) [review-source-audit.txt](https://git.kayg.org/attachments/02fbdbc5-757d-49c7-98ad-c99788e85923) Findings, audit and cleanup: [findings.md](https://git.kayg.org/attachments/8c70b755-4f60-4813-83ab-049533cd2b51) [cleanup.txt](https://git.kayg.org/attachments/b36d34ea-3ef2-4138-9a36-40336e0dbab2) [cleanup-before-removal.txt](https://git.kayg.org/attachments/3f9e52cf-b2cc-4659-bc25-f880ffa86674) [real-run-summary.txt](https://git.kayg.org/attachments/275e2dfb-4568-4cfe-8350-2b60d67130c6) [real-baseline-host-facts.spec.ts.patch](https://git.kayg.org/attachments/eb937ee9-b1f6-4b67-aa8f-6911da5e470c) [real-head-diagnostic-host-facts.spec.ts.patch](https://git.kayg.org/attachments/210cc76d-c0b8-442f-ac8f-36df3ef3f127) [real-head-diagnostic-mobile-lease.spec.ts.patch](https://git.kayg.org/attachments/52ad6481-279a-452d-8a30-7616afb86f00) [cleanup-final.txt](https://git.kayg.org/attachments/c6ccfa75-4d4b-4bff-ab6b-f3384af537a1) [real-original-copy.log](https://git.kayg.org/attachments/a8701230-7ac5-4cb0-ab11-6752ed2ee747) [browser-matrix.txt](https://git.kayg.org/attachments/0556b19a-ce27-461f-8306-4d380f9caaf3) [browser-coverage.txt](https://git.kayg.org/attachments/9cead231-1830-41e2-95e0-3a3f4a282757) [real-test-list.txt](https://git.kayg.org/attachments/bdb1e301-612d-4b74-9547-06c585d642aa) [reviewer-checklist.txt](https://git.kayg.org/attachments/5d063ccc-2c0a-454e-8bc9-e166df33fe40) Real-server controls and production captures (synthetic fixture typing only): [real-host-facts.log](https://git.kayg.org/attachments/96172d53-7c52-4dd3-9c7a-2d5abbf35a6b) [real-baseline.log](https://git.kayg.org/attachments/5d48e323-0514-4751-b190-e37c66d275e4) [real-head-diagnostic.log](https://git.kayg.org/attachments/dcc2e5e9-6583-4c2b-9a04-03eea00f22fa) [real-zero.log](https://git.kayg.org/attachments/2414b2ca-7959-42a8-b01f-615f60336fd9) [real-phone-trigger-control.patch](https://git.kayg.org/attachments/09073b79-53b8-4c3e-887a-f7454d5ba5e2) [real-current-copy-control.patch](https://git.kayg.org/attachments/463321bf-fbd3-446b-aadf-854a5d6a1d51) ![retained-typing-ink-1440.png](https://git.kayg.org/attachments/333cad93-5c28-4bb2-8d59-7dfc66ceadeb) ![retained-typing-ink-375.png](https://git.kayg.org/attachments/de8c4192-8b50-4880-89e9-1a3a36583623) ![retained-typing-ink-393.png](https://git.kayg.org/attachments/b25c6f97-8bf3-46c7-a2a9-5194e5cad58b) ![retained-typing-paper-1440.png](https://git.kayg.org/attachments/ecce1a80-104a-4917-9ff9-da8870a310bf) ![retained-typing-paper-375.png](https://git.kayg.org/attachments/3ceb7300-2074-444f-a7b4-442acd38961d) ![retained-typing-paper-393.png](https://git.kayg.org/attachments/e0a99d1e-388a-4eea-a7b1-6b0d16f2a968) ![refusal-phone.png](https://git.kayg.org/attachments/b09ec846-2a84-493f-a7da-50400a4e11ae) ![sessions-phone.png](https://git.kayg.org/attachments/81c55a3e-1c77-4b19-90a9-06ae46d0f02c)
Author
Owner

Finish: branch resend-offer-p2, head 27f16f799 (base f57cdd479, review tests cherry-picked from review-resume-refused-loop-r3 unchanged).

Changes:

  • 5774b258b core-screen: the focus chord (Ctrl+Shift+Space) declines while the key event is part of an IME composition (isComposing / keyCode 229).
  • 6da182614 terminal: TerminalClient.focus (the shared helper) focuses the renderer's textarea, so committed text works after Send again / Discard.
  • 27f16f799 real/mobile-lease.spec.ts expects the current copy.

Tests: apps/tracer/test/retained-typing-review.spec.ts 18 pass first run; the one failure (393px paper geometry) passed alone, so it was load flake. tsc clean.

scripts/verify fast: Rust gate table
fmt PASS, VT native fmt PASS, CLI plugin compile-out PASS, clippy PASS, test FAIL (101), cargo-deny PASS, static builds PASS.
The test failure is environmental, not from this change: crates/plugins/mesh node_state tests (12) panic "test directory: NotFound" because they create their dir under cwd/target (crates/plugins/mesh/target) when CARGO_TARGET_DIR is unset, and that dir does not exist in a fresh worktree. With that directory created, cargo test --workspace --locked passes. Fix belongs in the mesh test helper (separate change).

Finish: branch `resend-offer-p2`, head 27f16f799 (base f57cdd479, review tests cherry-picked from review-resume-refused-loop-r3 unchanged). Changes: - 5774b258b core-screen: the focus chord (Ctrl+Shift+Space) declines while the key event is part of an IME composition (isComposing / keyCode 229). - 6da182614 terminal: TerminalClient.focus (the shared helper) focuses the renderer's textarea, so committed text works after Send again / Discard. - 27f16f799 real/mobile-lease.spec.ts expects the current copy. Tests: apps/tracer/test/retained-typing-review.spec.ts 18 pass first run; the one failure (393px paper geometry) passed alone, so it was load flake. tsc clean. scripts/verify fast: Rust gate table fmt PASS, VT native fmt PASS, CLI plugin compile-out PASS, clippy PASS, test FAIL (101), cargo-deny PASS, static builds PASS. The test failure is environmental, not from this change: crates/plugins/mesh node_state tests (12) panic "test directory: NotFound" because they create their dir under cwd/target (crates/plugins/mesh/target) when CARGO_TARGET_DIR is unset, and that dir does not exist in a fresh worktree. With that directory created, `cargo test --workspace --locked` passes. Fix belongs in the mesh test helper (separate change).
Author
Owner

Starting Release 6 on release-6, base/head c00c6364e695c6676edb5d0dcc82a6388e5a1e59 (origin/release-prod-live, release 5). Read all 83 comments on #244; no parent issue is linked. Continuing from reviewed resend-offer-p2 head 27f16f799. No push or deployment yet.

Starting Release 6 on `release-6`, base/head `c00c6364e695c6676edb5d0dcc82a6388e5a1e59` (`origin/release-prod-live`, release 5). Read all 83 comments on #244; no parent issue is linked. Continuing from reviewed `resend-offer-p2` head `27f16f799`. No push or deployment yet.
Author
Owner

Merge audit: target c00c6364e (release 5), source 27f16f799 (resend-offer-p2), common base 5b2a1b9ee (release 3). The source range contains no merge commits; it carries the reviewed #244 work only. git merge-tree identifies conflicts in docs/PROCESS.md and scripts/verify.d/rust.sh. The source has release-3 size caps and an older CLI gate; release 5 records 21,225,872 B x86_64 / 19,427,688 B aarch64 in its manifest and checks the newer CLI group output. I will retain release-5 gate behavior and documentation, then set exact size caps from the release-6 artifacts.

Merge audit: target `c00c6364e` (release 5), source `27f16f799` (`resend-offer-p2`), common base `5b2a1b9ee` (release 3). The source range contains no merge commits; it carries the reviewed #244 work only. `git merge-tree` identifies conflicts in `docs/PROCESS.md` and `scripts/verify.d/rust.sh`. The source has release-3 size caps and an older CLI gate; release 5 records 21,225,872 B x86_64 / 19,427,688 B aarch64 in its manifest and checks the newer CLI group output. I will retain release-5 gate behavior and documentation, then set exact size caps from the release-6 artifacts.
Author
Owner

Baseline check: cargo test --locked --package infraternal-plugin-mesh --lib on release 5 passed 24/24 tests with CARGO_TARGET_DIR outside the checkout. This does not reproduce the prior Directory::new issue, so I am not cherry-picking 6f7cde60a.

Baseline check: `cargo test --locked --package infraternal-plugin-mesh --lib` on release 5 passed 24/24 tests with `CARGO_TARGET_DIR` outside the checkout. This does not reproduce the prior `Directory::new` issue, so I am not cherry-picking `6f7cde60a`.
Author
Owner

Starting Release 6 on release-6, base/head 857823ce433bc3f729c04571e32813073b1cc37e (origin/release-prod-live). Read all 86 comments on #244; the issue has no parent link. The prior release-6 comment used the older c00c6364e base; this worktree is at the requested production base. Verifying origin/resend-offer-p2 and the release-5 staging recipes before the merge. No push or deployment yet.

Starting Release 6 on `release-6`, base/head `857823ce433bc3f729c04571e32813073b1cc37e` (`origin/release-prod-live`). Read all 86 comments on #244; the issue has no parent link. The prior release-6 comment used the older `c00c6364e` base; this worktree is at the requested production base. Verifying `origin/resend-offer-p2` and the release-5 staging recipes before the merge. No push or deployment yet.
Author
Owner

Merge audit: target 857823ce4 (release 5 + #245), source 27f16f799 (origin/resend-offer-p2), common base 5b2a1b9ee. The source range contains 33 files and only #244 commits. git merge-tree reports six both-changed files: apps/tracer/src/connection-idle.test.ts, connection-liveness.test.ts, connection.ts, terminal.ts, docs/PROCESS.md, and scripts/verify.d/rust.sh. I will preserve the #245 route-liveness changes and release-5 CLI gate behavior, then measure and set exact static caps. The release-5 artifact files report 21,225,872 B x86_64 and 19,427,688 B aarch64. A baseline mesh test with the job target outside the checkout passed 24/24, so I am not bringing in 6f7cde60a unless the release gate needs it. No #230, #231 or #243 changes are in the source range.

Merge audit: target `857823ce4` (release 5 + #245), source `27f16f799` (`origin/resend-offer-p2`), common base `5b2a1b9ee`. The source range contains 33 files and only #244 commits. `git merge-tree` reports six both-changed files: `apps/tracer/src/connection-idle.test.ts`, `connection-liveness.test.ts`, `connection.ts`, `terminal.ts`, `docs/PROCESS.md`, and `scripts/verify.d/rust.sh`. I will preserve the #245 route-liveness changes and release-5 CLI gate behavior, then measure and set exact static caps. The release-5 artifact files report 21,225,872 B x86_64 and 19,427,688 B aarch64. A baseline mesh test with the job target outside the checkout passed 24/24, so I am not bringing in `6f7cde60a` unless the release gate needs it. No #230, #231 or #243 changes are in the source range.
Author
Owner

Merge test finding: tracer TypeScript check passes, but the combined connection suite is 84/93 with 9 failures in apps/tracer/src/connection-idle.test.ts. The release-5 test cases assert retirement after 276 ms or within 725 ms using the previous max(250, srtt + 4*rttvar + 50) allowance. #244 changes that path to two D300 allowances (2 * clamp(2*srtt + 4*rttvar + 75, 250, 2000)); the failures are the now-stale deterministic ceilings after a resumed browser stall. Visibility, refusal-backoff and retained-input tests pass. I will update only those browser test bounds to D300's measured contract shape and rerun the complete connection suite; no host timing claim is inferred from this model.

Merge test finding: tracer TypeScript check passes, but the combined connection suite is 84/93 with 9 failures in `apps/tracer/src/connection-idle.test.ts`. The release-5 test cases assert retirement after 276 ms or within 725 ms using the previous `max(250, srtt + 4*rttvar + 50)` allowance. #244 changes that path to two D300 allowances (`2 * clamp(2*srtt + 4*rttvar + 75, 250, 2000)`); the failures are the now-stale deterministic ceilings after a resumed browser stall. Visibility, refusal-backoff and retained-input tests pass. I will update only those browser test bounds to D300's measured contract shape and rerun the complete connection suite; no host timing claim is inferred from this model.
Author
Owner

Merged connection coverage now passes: 93/93 tests across 9 files (339 expectations). The tracer TypeScript check passes. Updated the deterministic idle test bounds for D300's two-allowance window; no runtime timing claim is taken from this host. Proceeding to iterate gate and static size measurement.

Merged connection coverage now passes: 93/93 tests across 9 files (339 expectations). The tracer TypeScript check passes. Updated the deterministic idle test bounds for D300's two-allowance window; no runtime timing claim is taken from this host. Proceeding to iterate gate and static size measurement.
Author
Owner

Starting Release 6 on release-6, base 857823ce433bc3f729c04571e32813073b1cc37e (origin/release-prod-live). Read all 90 comments on #244; no parent issue is linked. Continuing from reviewed #244 head 27f16f799; #243 shared-layout merge follows it. No merge or deployment yet.

Starting Release 6 on `release-6`, base `857823ce433bc3f729c04571e32813073b1cc37e` (`origin/release-prod-live`). Read all 90 comments on #244; no parent issue is linked. Continuing from reviewed #244 head `27f16f799`; #243 shared-layout merge follows it. No merge or deployment yet.
Author
Owner

Finding: the merge-tree audit from release-6 base 857823ce4 to #244 head 27f16f799 reports content conflicts in apps/tracer/src/connection-idle.test.ts, apps/tracer/src/connection.ts, docs/PROCESS.md, and scripts/verify.d/rust.sh; connection-liveness.test.ts and terminal.ts auto-merge. I will retain #245 route-bound liveness behavior and the reviewed #244 refusal fallback, focus handling, retained typing, and current gate behavior. Release-5 manifest sizes are 21,225,872 B x86_64 and 19,427,688 B aarch64. No merge result has been committed.

Finding: the merge-tree audit from release-6 base `857823ce4` to #244 head `27f16f799` reports content conflicts in `apps/tracer/src/connection-idle.test.ts`, `apps/tracer/src/connection.ts`, `docs/PROCESS.md`, and `scripts/verify.d/rust.sh`; `connection-liveness.test.ts` and `terminal.ts` auto-merge. I will retain #245 route-bound liveness behavior and the reviewed #244 refusal fallback, focus handling, retained typing, and current gate behavior. Release-5 manifest sizes are 21,225,872 B x86_64 and 19,427,688 B aarch64. No merge result has been committed.
Author
Owner

#244 finding: the merged connection-idle unit file currently reports 54 pass / 9 fail. Six stalled-reply cases and two late-timer cases expect route retirement at 276 ms; the D300 two-allowance estimator keeps the route through that window. The continuous-typing case retires at 750 ms against its inherited 725 ms bound. Full output: connection-idle-merge-regression.log. I’m reconciling those bounds with D300 while retaining #245’s correlated-reply, stall-grace, and route-bound confirmation behavior before committing the merge.

#244 finding: the merged connection-idle unit file currently reports 54 pass / 9 fail. Six stalled-reply cases and two late-timer cases expect route retirement at 276 ms; the D300 two-allowance estimator keeps the route through that window. The continuous-typing case retires at 750 ms against its inherited 725 ms bound. Full output: [connection-idle-merge-regression.log](https://git.kayg.org/attachments/fac3f73c-53ad-4ca7-abd5-dd1df1003f01). I’m reconciling those bounds with D300 while retaining #245’s correlated-reply, stall-grace, and route-bound confirmation behavior before committing the merge.
Author
Owner

#244 finding: the first scripts/verify iterate run reached the Rust test row, then failed only the real-binary daemon oracle because my configured test-state path produced a 112-byte AF_UNIX path (scripts/agent_fixture.py:55). This is a test-root setup error, not a code or permitted host-load failure. Full output: merge-244-iterate.log. I’m rerunning with the same scratch state under the shorter release-6/t path.

#244 finding: the first `scripts/verify iterate` run reached the Rust test row, then failed only the real-binary daemon oracle because my configured test-state path produced a 112-byte AF_UNIX path (`scripts/agent_fixture.py:55`). This is a test-root setup error, not a code or permitted host-load failure. Full output: [merge-244-iterate.log](https://git.kayg.org/attachments/615ef895-f23d-436e-b8ac-26c1ea92a2bf). I’m rerunning with the same scratch state under the shorter `release-6/t` path.
Author
Owner

Resuming release-6 at production base 857823ce433bc3f729c04571e32813073b1cc37e. The #244 merge is active with source 27f16f7994b77be26ebd9fcd6cd4bbaec22d0e89; its reviewed changes are staged, with two unstaged liveness reconciliations preserving #245 behavior. I’m finishing that merge, then integrating #243 3603f0b86 and the required mesh test fix 6f7cde60a. No push or deployment yet.

Resuming `release-6` at production base `857823ce433bc3f729c04571e32813073b1cc37e`. The #244 merge is active with source `27f16f7994b77be26ebd9fcd6cd4bbaec22d0e89`; its reviewed changes are staged, with two unstaged liveness reconciliations preserving #245 behavior. I’m finishing that merge, then integrating #243 `3603f0b86` and the required mesh test fix `6f7cde60a`. No push or deployment yet.
Author
Owner

Finding: the corrected scripts/verify iterate run still exited 1 at the workspace test row. In crates/plugins/ssh/tests/recovery_support.rs, 8 passed / 3 failed / 1 ignored: the cached-helper case panicked with path must be shorter than SUN_LEN; two live-session socket cases saw UnexpectedEof after child AF_UNIX path too long errors. The isolated previous_attempt_shell oracle passes 1/1 with INFRATERNAL_TEST_RUNTIME_HELPER=/home/kayg/.cache/codex-scratch/release-6/target/debug/examples/recovery-helper, so the release-brief helper condition is not the failing row. I’m correcting the SSH fixture root configuration; no product fix is inferred.

Finding: the corrected `scripts/verify iterate` run still exited 1 at the workspace test row. In `crates/plugins/ssh/tests/recovery_support.rs`, 8 passed / 3 failed / 1 ignored: the cached-helper case panicked with `path must be shorter than SUN_LEN`; two live-session socket cases saw `UnexpectedEof` after child `AF_UNIX path too long` errors. The isolated `previous_attempt_shell` oracle passes 1/1 with `INFRATERNAL_TEST_RUNTIME_HELPER=/home/kayg/.cache/codex-scratch/release-6/target/debug/examples/recovery-helper`, so the release-brief helper condition is not the failing row. I’m correcting the SSH fixture root configuration; no product fix is inferred.
Author
Owner

Follow-up finding: a short /tmp/r6-244... root fixed the AF_UNIX length but made six infraternal restart tests fail with EXDEV/PermissionDenied because their replacement files must stay on the cargo target filesystem. I’m keeping the canonical cache root for the workspace and adding a test-only short-root override for recovery_support, whose fixtures alone need the shorter socket path.

Follow-up finding: a short `/tmp/r6-244...` root fixed the AF_UNIX length but made six `infraternal` restart tests fail with `EXDEV`/`PermissionDenied` because their replacement files must stay on the cargo target filesystem. I’m keeping the canonical cache root for the workspace and adding a test-only short-root override for `recovery_support`, whose fixtures alone need the shorter socket path.
Author
Owner

Finding: the split-root iterate run passed the earlier fixture-path cases, then failed one SSH install fixture: review_inode_reuse_after_diagnostics_preserves_live_replacement could not reproduce inode reuse within 256 allocations (crates/plugins/ssh/tests/install.rs; 93 passed / 1 failed / 1 ignored in that target). I’m isolating the fixture and checking its filesystem assumptions before classification; no product fix is inferred.

Finding: the split-root iterate run passed the earlier fixture-path cases, then failed one SSH install fixture: `review_inode_reuse_after_diagnostics_preserves_live_replacement` could not reproduce inode reuse within 256 allocations (`crates/plugins/ssh/tests/install.rs`; 93 passed / 1 failed / 1 ignored in that target). I’m isolating the fixture and checking its filesystem assumptions before classification; no product fix is inferred.
Author
Owner

Finding: the workspace iterate run reported crates/plugins/ssh/tests/install.rs::review_inode_reuse_after_diagnostics_preserves_live_replacement failing to reproduce inode reuse in 256 allocations. The isolated test passes 1/1 on the same ext4 filesystem (0.73 s), so this is not yet classified as a branch regression. Full iterate is queued for a rerun; evidence: verify-iterate-split-root.log and install-inode-isolated.log under the release-6 scratch evidence directory.

Finding: the workspace iterate run reported crates/plugins/ssh/tests/install.rs::review_inode_reuse_after_diagnostics_preserves_live_replacement failing to reproduce inode reuse in 256 allocations. The isolated test passes 1/1 on the same ext4 filesystem (0.73 s), so this is not yet classified as a branch regression. Full iterate is queued for a rerun; evidence: verify-iterate-split-root.log and install-inode-isolated.log under the release-6 scratch evidence directory.
Author
Owner

Finding: scripts/verify iterate reported runtime_lock::tests::session_inspection_finds_bound_endpoints_by_identity failing at crates/plugins/remote/src/runtime_lock_tests.rs:266: left: Err(73), right: Ok(()). The previous workspace run failed a different inode-reuse fixture; both tests pass or fail depending on the run, so I am isolating this case before another full iterate. Full log: verify-iterate-rerun.log in release-6 scratch evidence.

Finding: scripts/verify iterate reported `runtime_lock::tests::session_inspection_finds_bound_endpoints_by_identity` failing at crates/plugins/remote/src/runtime_lock_tests.rs:266: `left: Err(73)`, `right: Ok(())`. The previous workspace run failed a different inode-reuse fixture; both tests pass or fail depending on the run, so I am isolating this case before another full iterate. Full log: verify-iterate-rerun.log in release-6 scratch evidence.
Author
Owner

Update: the failing runtime_lock test passes alone with the workspace feature set (agent,server,test-support,tokio/rt-multi-thread): 1 passed, 112 filtered out. The full iterate failure is not reproduced in isolation; I am running another full iterate. Exact isolated command/output is in session-inspection-isolated.log; full failure is in verify-iterate-rerun.log.

Update: the failing runtime_lock test passes alone with the workspace feature set (`agent,server,test-support,tokio/rt-multi-thread`): 1 passed, 112 filtered out. The full iterate failure is not reproduced in isolation; I am running another full iterate. Exact isolated command/output is in `session-inspection-isolated.log`; full failure is in `verify-iterate-rerun.log`.
Author
Owner

Completed #244 merge on release-6: fc31822ccfecb78426444e31dc7b128cca94a398 (parents 857823ce4, 27f16f799). The merge keeps #245’s one-shot route-stall grace and reconciles it with the refused-resume backoff and two-miss deadline. bun run check passed; the targeted connection suite passed 93/93; the isolated runtime-lock test passed 1/1.

The full iterate run passed. Earlier full runs exposed two intermittent fixtures (inode reuse and runtime-lock inspection); both passed when isolated, and the third full run passed without exceptions.

Gate output:

ITERATE gate passed. This is not the final gate: run scripts/verify fast before reporting done.

Evidence: verify-iterate-third.log, session-inspection-isolated.log. Static sizes for this merge are the next step.

Completed #244 merge on `release-6`: `fc31822ccfecb78426444e31dc7b128cca94a398` (parents `857823ce4`, `27f16f799`). The merge keeps #245’s one-shot route-stall grace and reconciles it with the refused-resume backoff and two-miss deadline. `bun run check` passed; the targeted connection suite passed 93/93; the isolated runtime-lock test passed 1/1. The full iterate run passed. Earlier full runs exposed two intermittent fixtures (inode reuse and runtime-lock inspection); both passed when isolated, and the third full run passed without exceptions. Gate output: ``` ITERATE gate passed. This is not the final gate: run scripts/verify fast before reporting done. ``` Evidence: [verify-iterate-third.log](https://git.kayg.org/attachments/d0f10dc6-9f1c-4ee3-a53a-79faa47a951d), [session-inspection-isolated.log](https://git.kayg.org/attachments/a23356b3-0ef9-42e0-a6c1-8a5f4591ca89). Static sizes for this merge are the next step.
Author
Owner

Static size measurement after #244, built with the pinned release toolchain and Zig under the release-6 target directory. Both binaries are stripped and static; x86_64 is static-pie.

Stage x86_64 bytes aarch64 bytes
Release 5 21,225,872 19,427,688
After #244 21,229,648 (+3,776) 19,431,008 (+3,320)

Both deltas are below D243’s 16 KB justification threshold. The final caps will be set to the measured release-6 binaries after #243.

Receipt: static-sizes-after-244.log.

Static size measurement after #244, built with the pinned release toolchain and Zig under the release-6 target directory. Both binaries are stripped and static; x86_64 is static-pie. | Stage | x86_64 bytes | aarch64 bytes | |---|---:|---:| | Release 5 | 21,225,872 | 19,427,688 | | After #244 | 21,229,648 (+3,776) | 19,431,008 (+3,320) | Both deltas are below D243’s 16 KB justification threshold. The final caps will be set to the measured release-6 binaries after #243. Receipt: [static-sizes-after-244.log](https://git.kayg.org/attachments/55ef187b-dd6e-40b6-b984-08554d65a31c).
Author
Owner

Resuming Release 6 work on release-6 at bbefb76e8b4f86554b689e690aa84b206f95ef7b, based on production 857823ce433bc3f729c04571e32813073b1cc37e. #244 and #243 are merged, the size ceilings are measured, and the required mesh fixture fix is committed. No push or deployment yet. Continuing with release artifacts, perf-VM database/browser staging, final fast gate, and issue receipts.

Resuming Release 6 work on `release-6` at `bbefb76e8b4f86554b689e690aa84b206f95ef7b`, based on production `857823ce433bc3f729c04571e32813073b1cc37e`. #244 and #243 are merged, the size ceilings are measured, and the required mesh fixture fix is committed. No push or deployment yet. Continuing with release artifacts, perf-VM database/browser staging, final fast gate, and issue receipts.
Author
Owner

Artifact packaging finding: the static build succeeded and produced x86_64 21,344,304 B and aarch64 19,535,600 B binaries, but the first manifest pass exited 1 because sha256sum * encountered the web/fonts/ directory. The partial packaging log is attached: artifact-build.log. I’m switching the scratch manifest step to hash every regular file recursively and rerunning packaging/checksum verification; no repository files changed.

Artifact packaging finding: the static build succeeded and produced x86_64 21,344,304 B and aarch64 19,535,600 B binaries, but the first manifest pass exited 1 because `sha256sum *` encountered the `web/fonts/` directory. The partial packaging log is attached: [artifact-build.log](https://git.kayg.org/attachments/68b0bb4c-3aa4-4464-9b5a-a4764743f02d). I’m switching the scratch manifest step to hash every regular file recursively and rerunning packaging/checksum verification; no repository files changed.
Author
Owner

Release artifact step complete at current head bbefb76e8b4f86554b689e690aa84b206f95ef7b. scripts/package-release produced the server bundle and both x86_64/aarch64 host and session payloads; the web distribution has 223 files. Bundle and recursive web SHA256 checks passed locally and on the perf VM. Static sizes: x86_64 21,344,304 B (ccc0cb3a…e015); aarch64 19,535,600 B (3e460eb1…8d7c). Web tar SHA256 cb85b883…fea86. Evidence: manifest, bundle checks, web checks, perf-VM hashes. Next: v27 database staging and real-browser specs.

Release artifact step complete at current head `bbefb76e8b4f86554b689e690aa84b206f95ef7b`. `scripts/package-release` produced the server bundle and both x86_64/aarch64 host and session payloads; the web distribution has 223 files. Bundle and recursive web SHA256 checks passed locally and on the perf VM. Static sizes: x86_64 21,344,304 B (`ccc0cb3a…e015`); aarch64 19,535,600 B (`3e460eb1…8d7c`). Web tar SHA256 `cb85b883…fea86`. Evidence: [manifest](https://git.kayg.org/attachments/c885ae6d-7481-4e61-94e5-2c7f182a0d98), [bundle checks](https://git.kayg.org/attachments/0ae5e4b7-5e4d-4542-96dc-1a09dd21a2e9), [web checks](https://git.kayg.org/attachments/dd4db2fd-ec4b-4ba3-ac40-ff35c06487aa), [perf-VM hashes](https://git.kayg.org/attachments/c952b80d-edd5-4e27-96f7-6260fad8c6b1). Next: v27 database staging and real-browser specs.
Author
Owner

Database staging finding: Release 5 created schema v27 and passed the initial health check, then the synthetic mesh seed hit the schema's unique mesh_nodes.dataplane_host constraint on row two; SQLite rolled the transaction back. Receipt: perf-db-stage.log. I’m assigning distinct dataplane host values to all four fixture rows and rerunning the v27-copy-to-v28 startup proof.

Database staging finding: Release 5 created schema v27 and passed the initial health check, then the synthetic mesh seed hit the schema's unique `mesh_nodes.dataplane_host` constraint on row two; SQLite rolled the transaction back. Receipt: [perf-db-stage.log](https://git.kayg.org/attachments/20c3af10-a7dd-4e8d-a839-75053b85f183). I’m assigning distinct dataplane host values to all four fixture rows and rerunning the v27-copy-to-v28 startup proof.
Author
Owner

Database staging follow-up: the host-name uniqueness fix allowed all four fixture inserts, but the proof incorrectly expected four total mesh rows. The release-5 server already creates one server node; inspection shows integrity ok, 5 total rows, and exactly 4 release6-mesh-* fixture rows. Receipts: failed proof, read-only schema inspection. I’m making the prep script recreate only its own staging databases before seeding and assert the four named fixture rows while preserving the server-created node.

Database staging follow-up: the host-name uniqueness fix allowed all four fixture inserts, but the proof incorrectly expected four total mesh rows. The release-5 server already creates one `server` node; inspection shows integrity `ok`, 5 total rows, and exactly 4 `release6-mesh-*` fixture rows. Receipts: [failed proof](https://git.kayg.org/attachments/b5e30dd7-ecbd-4938-9369-c501701a8337), [read-only schema inspection](https://git.kayg.org/attachments/b95f6510-547d-4c80-928d-544e0ed76cb9). I’m making the prep script recreate only its own staging databases before seeding and assert the four named fixture rows while preserving the server-created node.
Author
Owner

Production-shaped database staging passed on the perf VM. Release 5 started from an isolated directory and created schema v27; four uniquely named mesh rows were added beside its existing server row. On a copy, the Release 6 server applied migrations 28/28, integrity_check=ok, retained all four fixture rows and canvas_heads, and served the production shell with HTTP 200. Both server PIDs are confirmed gone. Receipts: migration/startup result, process cleanup.

Production-shaped database staging passed on the perf VM. Release 5 started from an isolated directory and created schema v27; four uniquely named mesh rows were added beside its existing server row. On a copy, the Release 6 server applied migrations 28/28, `integrity_check=ok`, retained all four fixture rows and `canvas_heads`, and served the production shell with HTTP 200. Both server PIDs are confirmed gone. Receipts: [migration/startup result](https://git.kayg.org/attachments/61df5480-63c4-486b-a0d2-44c19e23bbc0), [process cleanup](https://git.kayg.org/attachments/019b2b7f-69e0-4580-806f-e9155adf4300).
Author
Owner

Signed-staging safety finding: preflight review caught an outer EXIT trap that could erase the next job’s /var/lock/perf-bench.owner marker after our lock was released. I interrupted the local staging build before any NetBird connection or perf-VM lock acquisition, removed that outer cleanup, and regenerated the wrapper so only the measurement-shell trap clears its marker while holding the lock. No remote staging transcript was created. Review receipt: signed-staging-owner-cleanup-review.txt.

Signed-staging safety finding: preflight review caught an outer EXIT trap that could erase the next job’s `/var/lock/perf-bench.owner` marker after our lock was released. I interrupted the local staging build before any NetBird connection or perf-VM lock acquisition, removed that outer cleanup, and regenerated the wrapper so only the measurement-shell trap clears its marker while holding the lock. No remote staging transcript was created. Review receipt: [signed-staging-owner-cleanup-review.txt](https://git.kayg.org/attachments/eb588655-9359-4bbc-ba08-39b56b3e4f79).
Author
Owner

Perf-VM staging finding: the signed deployment harness acquired the lock and ran on infraternal-perf-test (kernel 6.12.111+deb13-amd64), then stopped at deploy_staging_tests.rs:97 because its fixture guard only accepts /root/infraternal-bench/deploy/...; this task's isolated root is /root/infraternal-bench/release-6/signed/.... The remote run directory was removed (STAGING teardown_directory_absent=true). Receipt: signed-staging-perf.log. I’ll generalize the test and Python helper guards to accept a normalized per-job signed/ root while preserving containment and traversal checks.

Perf-VM staging finding: the signed deployment harness acquired the lock and ran on `infraternal-perf-test` (kernel 6.12.111+deb13-amd64), then stopped at `deploy_staging_tests.rs:97` because its fixture guard only accepts `/root/infraternal-bench/deploy/...`; this task's isolated root is `/root/infraternal-bench/release-6/signed/...`. The remote run directory was removed (`STAGING teardown_directory_absent=true`). Receipt: [signed-staging-perf.log](https://git.kayg.org/attachments/20620ed0-cb31-4615-8925-ea63217019bb). I’ll generalize the test and Python helper guards to accept a normalized per-job `signed/` root while preserving containment and traversal checks.
Author
Owner

Browser-harness finding: the first perf-VM suite stopped before Chromium launch because playwright.real.config.ts could not resolve test/evidence-path. The scratch uploader pre-created apps/tracer/test and copied the source directory into it, nesting the suite under test/test. Receipt: perf-browser-suites.log. I’m changing the scratch copy to place the source directory contents directly at apps/tracer/test, then will rerun all required specs; no timing result is claimed from this failed setup.

Browser-harness finding: the first perf-VM suite stopped before Chromium launch because `playwright.real.config.ts` could not resolve `test/evidence-path`. The scratch uploader pre-created `apps/tracer/test` and copied the source directory into it, nesting the suite under `test/test`. Receipt: [perf-browser-suites.log](https://git.kayg.org/attachments/051770e9-cec1-4071-813c-799660eee881). I’m changing the scratch copy to place the source directory contents directly at `apps/tracer/test`, then will rerun all required specs; no timing result is claimed from this failed setup.
Author
Owner

Perf browser harness finding: Playwright discovered all 11 layout-review cases, but each failed before server startup because the runner set INFRATERNA_BIN while apps/tracer/real/server.ts:114 reads INFRATERNAL_BIN; it therefore tried the absent repository target path. Receipt: perf-browser-suites-final.log. I’m correcting the harness variable and will rerun the suites; no product test result or timing claim is taken from this setup run.

Perf browser harness finding: Playwright discovered all 11 `layout-review` cases, but each failed before server startup because the runner set `INFRATERNA_BIN` while `apps/tracer/real/server.ts:114` reads `INFRATERNAL_BIN`; it therefore tried the absent repository target path. Receipt: [perf-browser-suites-final.log](https://git.kayg.org/attachments/1a2d7d52-aff5-4b58-a1f5-3ca5740a3a9b). I’m correcting the harness variable and will rerun the suites; no product test result or timing claim is taken from this setup run.
Author
Owner

Perf browser harness follow-up: the corrected binary path reached the browser evidence guard, which rejected $job/evidence because the copied test tree treats /root/infraternal-bench/release-6 as its checkout. This is an evidence-path setup failure before the spec starts. Receipt: perf-browser-suites-final2.log. I’m moving perf-VM browser receipts to /root/.cache/codex-scratch/release-6/evidence, outside the copied checkout, and will rerun.

Perf browser harness follow-up: the corrected binary path reached the browser evidence guard, which rejected `$job/evidence` because the copied test tree treats `/root/infraternal-bench/release-6` as its checkout. This is an evidence-path setup failure before the spec starts. Receipt: [perf-browser-suites-final2.log](https://git.kayg.org/attachments/07e2367a-3649-4e3b-8d8a-ba14a9f4812e). I’m moving perf-VM browser receipts to `/root/.cache/codex-scratch/release-6/evidence`, outside the copied checkout, and will rerun.
Author
Owner

Real-server mobile resume spec failed on perf VM: layout suites passed; the #244 spec recorded 1 refused resume Close, then 0 fresh Hello frames with resume disabled within 30 seconds at apps/tracer/real/mobile-lease.spec.ts:73. This leaves the Send again/Discard checks unrun. Machine: infraternal-perf-test, 4 vCPU, kernel 6.12.111+deb13-amd64; suite load before 4.17 1.91 0.74, after 1.45 1.55 0.70. Evidence: perf browser suite log.

Real-server mobile resume spec failed on perf VM: layout suites passed; the #244 spec recorded 1 refused resume Close, then 0 fresh Hello frames with resume disabled within 30 seconds at apps/tracer/real/mobile-lease.spec.ts:73. This leaves the Send again/Discard checks unrun. Machine: infraternal-perf-test, 4 vCPU, kernel 6.12.111+deb13-amd64; suite load before 4.17 1.91 0.74, after 1.45 1.55 0.70. Evidence: [perf browser suite log](https://git.kayg.org/attachments/109512ae-bd8d-481c-8b3b-dba65e31dbff).
Author
Owner

Second perf-VM run confirms the #244 failure. It recorded the refusal on bridge 3 with helloResume=true, then no fresh helloResume=false bridge; at failure the page was visible and the terminal status was connecting. The 30-second fresh-Hello poll failed again. Machine: infraternal-perf-test, 4 vCPU, kernel 6.12.111+deb13-amd64; load before 0.00 0.20 0.35, after 0.38 0.29 0.37. Evidence: mobile resume diagnostic log.

Second perf-VM run confirms the #244 failure. It recorded the refusal on bridge 3 with `helloResume=true`, then no fresh `helloResume=false` bridge; at failure the page was visible and the terminal status was `connecting`. The 30-second fresh-Hello poll failed again. Machine: infraternal-perf-test, 4 vCPU, kernel 6.12.111+deb13-amd64; load before 0.00 0.20 0.35, after 0.38 0.29 0.37. Evidence: [mobile resume diagnostic log](https://git.kayg.org/attachments/46359618-4586-4f81-bace-d59e0d8a188c).
Author
Owner

Real-server layout gate complete on infraternal-perf-test (4 vCPU, kernel 6.12.111+deb13-amd64): layout-review 11/11, layout-sync 2/2, layout-phone 7/7. The ten-window sync case used a 300 ms RTT profile and measured 11.7 ms work, 17.7 ms edit-to-paint, and 329.5 ms remote paint. Loads before/after: review 0.09 0.07 0.02 / 3.09 0.99 0.35; sync 3.09 0.99 0.35 / 3.16 1.19 0.43; phone 3.16 1.19 0.43 / 4.17 1.91 0.74. Suite logs and desktop/phone ten-window screenshots are attached: review, sync, phone, desktop screenshot, phone screenshot.

Real-server layout gate complete on infraternal-perf-test (4 vCPU, kernel 6.12.111+deb13-amd64): layout-review 11/11, layout-sync 2/2, layout-phone 7/7. The ten-window sync case used a 300 ms RTT profile and measured 11.7 ms work, 17.7 ms edit-to-paint, and 329.5 ms remote paint. Loads before/after: review 0.09 0.07 0.02 / 3.09 0.99 0.35; sync 3.09 0.99 0.35 / 3.16 1.19 0.43; phone 3.16 1.19 0.43 / 4.17 1.91 0.74. Suite logs and desktop/phone ten-window screenshots are attached: [review](https://git.kayg.org/attachments/80e02203-8bbe-4334-b2fa-b1ffc308df1a), [sync](https://git.kayg.org/attachments/533581c6-7018-4aec-9f17-6850f0b21ae6), [phone](https://git.kayg.org/attachments/670857b4-8a07-4c0b-97df-2a2ffa5996af), [desktop screenshot](https://git.kayg.org/attachments/93c226c3-219e-4c7a-9bef-cc1cb274a12a), [phone screenshot](https://git.kayg.org/attachments/ca1c0dc1-1037-46cf-bf8f-d72b0617bd04).
Author
Owner

Perf-VM frame diagnostics identify the cause in apps/tracer/real/server.ts: the bridge decoded the server's stream-zero refused-resume Close, then Chromium observed WebSocket close code 1000 with no reason. Subsequent bridges b4–b10 sent Hello+Resume and received another Close; none sent a fresh Hello. The relay drops the already received, delayed protocol frame after bridge.closed becomes true and closes the browser route normally. This is a harness ordering bug; the client fallback remains unverified until the relay forwards in-flight frames before closing the browser socket. Evidence: WebSocket diagnostic log.

Perf-VM frame diagnostics identify the cause in `apps/tracer/real/server.ts`: the bridge decoded the server's stream-zero refused-resume Close, then Chromium observed WebSocket close code 1000 with no reason. Subsequent bridges b4–b10 sent Hello+Resume and received another Close; none sent a fresh Hello. The relay drops the already received, delayed protocol frame after `bridge.closed` becomes true and closes the browser route normally. This is a harness ordering bug; the client fallback remains unverified until the relay forwards in-flight frames before closing the browser socket. Evidence: [WebSocket diagnostic log](https://git.kayg.org/attachments/d5e0f29b-2059-4c85-8d14-e8f87f64cc6b).
Author
Owner

The first relay adjustment was insufficient: the post-change mobile-lease real-server run still produced 0 fresh non-resume Hellos and stopped at the same assertion. Inspection shows the upstream close handler closes the browser socket immediately, before the configured 75 ms downstream frame delay expires. The relay must drain already received server frames before closing that route. Evidence: post-change mobile lease log.

The first relay adjustment was insufficient: the post-change `mobile-lease` real-server run still produced 0 fresh non-resume Hellos and stopped at the same assertion. Inspection shows the upstream close handler closes the browser socket immediately, before the configured 75 ms downstream frame delay expires. The relay must drain already received server frames before closing that route. Evidence: [post-change mobile lease log](https://git.kayg.org/attachments/6856229d-c400-4177-8689-bbe7110ae102).
Author
Owner

Release 6 browser run on infraternal-perf-test (4 vCPU, kernel 6.12.111+deb13-amd64): layout-review passed 11/11. Layout-sync functional assertions passed, but its timing budget failed once: work 18.8 ms > 16 ms; edit-to-paint 24.7 ms; remote paint 348.3 ms vs receipt 333.9 ms (the receipt-based bound passed). Load before/after was 4.56 2.65 1.44 / 4.94 2.95 1.59. I will retry this timing case after target load settles. Evidence: layout-sync high-load run.

Release 6 browser run on infraternal-perf-test (4 vCPU, kernel 6.12.111+deb13-amd64): layout-review passed 11/11. Layout-sync functional assertions passed, but its timing budget failed once: work 18.8 ms > 16 ms; edit-to-paint 24.7 ms; remote paint 348.3 ms vs receipt 333.9 ms (the receipt-based bound passed). Load before/after was 4.56 2.65 1.44 / 4.94 2.95 1.59. I will retry this timing case after target load settles. Evidence: [layout-sync high-load run](https://git.kayg.org/attachments/f8c750fb-236f-4540-923e-c62cbbc0382e).
Author
Owner

Finding: the retained-typing retry did not reach resume behavior. The fixture navigated to /?theme=... without the product-canvas test route; the default server-held canvas had no saved window for this fresh test account. Captured Playwright context shows no .cl[data-view=console] .ui-window and a timeout at the initial live-window assertion. I’m updating the fixture URL and rerunning with the preview build. Log: retained-typing-retry.log.

Finding: the retained-typing retry did not reach resume behavior. The fixture navigated to `/?theme=...` without the product-canvas test route; the default server-held canvas had no saved window for this fresh test account. Captured Playwright context shows no `.cl[data-view=console] .ui-window` and a timeout at the initial live-window assertion. I’m updating the fixture URL and rerunning with the preview build. Log: [retained-typing-retry.log](https://git.kayg.org/attachments/a64e72e8-6dee-4a99-a3a3-7bebe4857467).
Author
Owner

Finding: after adding the product-canvas test route, the full retained-typing suite reached all 19 cases: 18 passed and the sign-out/storage case failed only after reload. The fixture URL included fresh=1, which tells the test double to restore preview authentication on reload; the observed page remained signed in. I’m removing fresh=1 (each test already resets the test double before opening the page) and rerunning the full suite. Evidence: full run, failure context.

Finding: after adding the product-canvas test route, the full retained-typing suite reached all 19 cases: 18 passed and the sign-out/storage case failed only after reload. The fixture URL included `fresh=1`, which tells the test double to restore preview authentication on reload; the observed page remained signed in. I’m removing `fresh=1` (each test already resets the test double before opening the page) and rerunning the full suite. Evidence: [full run](https://git.kayg.org/attachments/a02af103-56ef-4d4a-8c8f-6f83c28e772c), [failure context](https://git.kayg.org/attachments/13e5d9cc-13cb-4ee2-95b7-23614daedfbc).
Author
Owner

Retained-typing browser gate: 19/19 passed in 52.1s, one worker, port 4360. Perf VM: 4 vCPU; load average before 0.83 0.94 1.08, after 2.96 1.48 1.25. The fixture uses the product-canvas test route without fresh=1, preserving sign-out across reload. Run log. Offer screenshots: desktop 393px 375px.

Retained-typing browser gate: 19/19 passed in 52.1s, one worker, port 4360. Perf VM: 4 vCPU; load average before 0.83 0.94 1.08, after 2.96 1.48 1.25. The fixture uses the product-canvas test route without `fresh=1`, preserving sign-out across reload. [Run log](https://git.kayg.org/attachments/9a11ce69-99c0-445d-a32f-5ab756b9d40c). Offer screenshots: ![desktop](https://git.kayg.org/attachments/446f32f6-3c9f-422b-8bce-8985a045d290) ![393px](https://git.kayg.org/attachments/d6f35147-9354-4c6d-85a0-dc56ceb4acea) ![375px](https://git.kayg.org/attachments/0799d578-7382-4915-a38e-bb0f082e4f37).
Author
Owner

Committed retained-typing fixture routing as b03803f56. D308 server-held layout made the previous bare-route setup windowless; the preview route now supplies a test layout and preserves sign-out on reload. Gates: retained browser suite 19/19 in 52.1s on port 4360; bun run check passed with no diagnostics.

Committed retained-typing fixture routing as `b03803f56`. D308 server-held layout made the previous bare-route setup windowless; the preview route now supplies a test layout and preserves sign-out on reload. Gates: retained browser suite 19/19 in 52.1s on port 4360; `bun run check` passed with no diagnostics.
Author
Owner

Committed the delayed-frame drain fix as fc4b466ca. When the real-server bridge delays already-received frames, it now sends them before closing the browser side; this preserves the refused-resume Close ordering and allows fresh attach. With the fix present: mobile-lease 1/1 passed; layout-review 11/11, layout-sync 2/2 and layout-phone 7/7 passed; retained-typing 19/19 passed; bun run check passed. Mobile lease log · resumed state.

Committed the delayed-frame drain fix as `fc4b466ca`. When the real-server bridge delays already-received frames, it now sends them before closing the browser side; this preserves the refused-resume Close ordering and allows fresh attach. With the fix present: mobile-lease 1/1 passed; layout-review 11/11, layout-sync 2/2 and layout-phone 7/7 passed; retained-typing 19/19 passed; `bun run check` passed. [Mobile lease log](https://git.kayg.org/attachments/59f2a61c-ea87-41d4-a090-a37ae81ecf44) · [resumed state](https://git.kayg.org/attachments/335e8ac8-0ab3-43f8-a6c7-446b71e5acf1).
Author
Owner

Release 6 complete. Head 8f8c84e37b40cb6fb3159815b502debeb837694d is pushed to release-6; no deployment was made.

Integration and conflict resolutions

  • Merged #244 (27f16f799) as fc31822cc onto production base 857823ce4. In connection.ts, retained the base #245 one-shot local-stall grace and route confirmation while adding the refused-resume fallback. The timer and socket-reply paths use the same two-miss deadline; subscriptions reconnect. Retained pending typing with explicit Send again/Discard and foreground recovery after background suspension.
  • Merged #243 (3603f0b86) as 5d110f803. Preserved #245 liveness handling, #244 resume recovery, and terminal focus/fit lifetimes across the layout integration. Kept the mobile-visibility and canvas socket test modules in the verifier. The layout branch's migration 0026_canvas_layout.sql was renumbered to 0028_canvas_layout.sql; shipped production migrations 0026 and 0027 were left unchanged. The production-shaped 0027→0028 and fresh ordered 0001→0028 migration test passed (1/1).
  • Included the mesh test-directory isolation fix as bbefb76e8 (patch-identical to dev commit 6f7cde60a). Later test-only fixes are b03803f56, fc4b466ca, b9ca6ced0, f43d6caad, and 8f8c84e37.

Size against release 5 (stripped static binaries; bytes)

Target Release 5 After #244 Final after #243 Δ vs release 5
x86_64-unknown-linux-musl 21,225,872 21,229,648 21,344,304 +118,432
aarch64-unknown-linux-musl 19,427,688 19,431,008 19,535,600 +107,912

D308's x86_64 stop line was 21,369,232 bytes (+140 KiB); final is 24,928 bytes below it. The final fast gate confirms both exact size caps.

Artifact SHA-256 (all packaged checksums verified)

Artifact SHA-256
infraternal-x86_64-musl ccc0cb3a0f9aba1c8b901eb2f150c383a09b18f101ea90e5f89bc53dee99e015
infraternal-aarch64-musl 3e460eb1682bdf8eb28fe60a592dd55f3886d8f80e80f14802eac636908d8d7c
web-dist.tar cb85b883a72fc9b8cb033ee2717eca07ff32276f9b59185d0a999853a5bfea86
bundle/infraternal ccc0cb3a0f9aba1c8b901eb2f150c383a09b18f101ea90e5f89bc53dee99e015
bundle/infraternal-x86_64-musl 24f652c770683fe25f80de12cae34ca3dde6965df6e00cb6f14a3bde1b829cfb
bundle/infraternal-aarch64-musl 887475d130a9a3f088d4502ea8120ad085ac3b9815203aa1fc55a8f3cd6a2618
bundle/infraternal-x86_64-session-musl 0f357e9f573aaff647d7521eb22483f6b6a807f0967c0fb58656175a61d171e9
bundle/infraternal-aarch64-session-musl 5489f111cc722950875a92784f8ac6ca0b97d5c241d1cd75e4b9054c41a82209
web-SHA256SUMS 79b877570df6dac5d4bb275a9c9f518f2d00f4b4192ad76379011651b416e51a
bundle/SHA256SUMS be7a3450c55e49c0ba39fd8eb04cc15153debe6ae8d3bccba1d2c14dedd265b9

Browser and staging results

  • Perf VM real-server layout suites: layout-review 11/11, layout-sync 2/2, layout-phone 7/7. The 300 ms RTT sync case measured 11.2 ms work, 18.8 ms edit-to-paint, 346.9 ms remote paint and 331.2 ms receipt. Desktop and phone screenshots show the same ten-window layout. The legacy infraternal.canvas.<account> localStorage layout migrated to the server and appeared in a second phone context; restart retained it.
  • #244 real-server mobile-lease 1/1 and retained-typing 19/19 (52.1 s, port 4360) passed, including resumed input after backgrounding, refused-session fresh attach, Send again and Discard.
  • Signed staging on the perf VM passed: 12 handoffs; listener-gap p50/p99 3927.363/4037.721 ms; max probe interval 105.706 ms; 128/128 shim PIDs survived and 128/128 sessions resumed input/output; 6 retained browser connections answered probes; rollback retained 10,000 mesh nodes and 50 users. Load average was 0.52 0.11 0.11 before and 1.54 0.64 0.31 after; staging teardown directory was absent.

Final scripts/verify fast output

+---------------------------+--------------+
| Rust gate                 | Result       |
+---------------------------+--------------+
| fmt                       | PASS         |
| VT native fmt             | PASS         |
| CLI plugin compile-out    | PASS         |
| clippy                    | PASS         |
| test                      | PASS         |
| cargo-deny                | PASS         |
| static builds             | PASS         |
+---------------------------+--------------+

 37 pass
 0 fail
 34463 expect() calls
Ran 37 tests across 10 files. [2.67s]

Receipts and screenshots:

Release 6 complete. Head `8f8c84e37b40cb6fb3159815b502debeb837694d` is pushed to `release-6`; no deployment was made. **Integration and conflict resolutions** - Merged #244 (`27f16f799`) as `fc31822cc` onto production base `857823ce4`. In `connection.ts`, retained the base #245 one-shot local-stall grace and route confirmation while adding the refused-resume fallback. The timer and socket-reply paths use the same two-miss deadline; subscriptions reconnect. Retained pending typing with explicit Send again/Discard and foreground recovery after background suspension. - Merged #243 (`3603f0b86`) as `5d110f803`. Preserved #245 liveness handling, #244 resume recovery, and terminal focus/fit lifetimes across the layout integration. Kept the mobile-visibility and canvas socket test modules in the verifier. The layout branch's migration `0026_canvas_layout.sql` was renumbered to `0028_canvas_layout.sql`; shipped production migrations 0026 and 0027 were left unchanged. The production-shaped 0027→0028 and fresh ordered 0001→0028 migration test passed (1/1). - Included the mesh test-directory isolation fix as `bbefb76e8` (patch-identical to dev commit `6f7cde60a`). Later test-only fixes are `b03803f56`, `fc4b466ca`, `b9ca6ced0`, `f43d6caad`, and `8f8c84e37`. **Size against release 5** (stripped static binaries; bytes) | Target | Release 5 | After #244 | Final after #243 | Δ vs release 5 | | --- | ---: | ---: | ---: | ---: | | x86_64-unknown-linux-musl | 21,225,872 | 21,229,648 | 21,344,304 | +118,432 | | aarch64-unknown-linux-musl | 19,427,688 | 19,431,008 | 19,535,600 | +107,912 | D308's x86_64 stop line was 21,369,232 bytes (+140 KiB); final is 24,928 bytes below it. The final fast gate confirms both exact size caps. **Artifact SHA-256** (all packaged checksums verified) | Artifact | SHA-256 | | --- | --- | | infraternal-x86_64-musl | `ccc0cb3a0f9aba1c8b901eb2f150c383a09b18f101ea90e5f89bc53dee99e015` | | infraternal-aarch64-musl | `3e460eb1682bdf8eb28fe60a592dd55f3886d8f80e80f14802eac636908d8d7c` | | web-dist.tar | `cb85b883a72fc9b8cb033ee2717eca07ff32276f9b59185d0a999853a5bfea86` | | bundle/infraternal | `ccc0cb3a0f9aba1c8b901eb2f150c383a09b18f101ea90e5f89bc53dee99e015` | | bundle/infraternal-x86_64-musl | `24f652c770683fe25f80de12cae34ca3dde6965df6e00cb6f14a3bde1b829cfb` | | bundle/infraternal-aarch64-musl | `887475d130a9a3f088d4502ea8120ad085ac3b9815203aa1fc55a8f3cd6a2618` | | bundle/infraternal-x86_64-session-musl | `0f357e9f573aaff647d7521eb22483f6b6a807f0967c0fb58656175a61d171e9` | | bundle/infraternal-aarch64-session-musl | `5489f111cc722950875a92784f8ac6ca0b97d5c241d1cd75e4b9054c41a82209` | | web-SHA256SUMS | `79b877570df6dac5d4bb275a9c9f518f2d00f4b4192ad76379011651b416e51a` | | bundle/SHA256SUMS | `be7a3450c55e49c0ba39fd8eb04cc15153debe6ae8d3bccba1d2c14dedd265b9` | **Browser and staging results** - Perf VM real-server layout suites: layout-review 11/11, layout-sync 2/2, layout-phone 7/7. The 300 ms RTT sync case measured 11.2 ms work, 18.8 ms edit-to-paint, 346.9 ms remote paint and 331.2 ms receipt. Desktop and phone screenshots show the same ten-window layout. The legacy `infraternal.canvas.<account>` localStorage layout migrated to the server and appeared in a second phone context; restart retained it. - #244 real-server mobile-lease 1/1 and retained-typing 19/19 (52.1 s, port 4360) passed, including resumed input after backgrounding, refused-session fresh attach, Send again and Discard. - Signed staging on the perf VM passed: 12 handoffs; listener-gap p50/p99 3927.363/4037.721 ms; max probe interval 105.706 ms; 128/128 shim PIDs survived and 128/128 sessions resumed input/output; 6 retained browser connections answered probes; rollback retained 10,000 mesh nodes and 50 users. Load average was 0.52 0.11 0.11 before and 1.54 0.64 0.31 after; staging teardown directory was absent. **Final `scripts/verify fast` output** ```text +---------------------------+--------------+ | Rust gate | Result | +---------------------------+--------------+ | fmt | PASS | | VT native fmt | PASS | | CLI plugin compile-out | PASS | | clippy | PASS | | test | PASS | | cargo-deny | PASS | | static builds | PASS | +---------------------------+--------------+ 37 pass 0 fail 34463 expect() calls Ran 37 tests across 10 files. [2.67s] ``` Receipts and screenshots: - [final fast gate log](https://git.kayg.org/attachments/ebaca38c-1a02-4d77-8bf4-6d5310030e31) - [size table](https://git.kayg.org/attachments/bd1c7921-042a-484a-8682-fd87df71ac08) - [web checksums](https://git.kayg.org/attachments/1d993a5d-56e3-45f6-82a5-9e92dff99b42) · [bundle checksums](https://git.kayg.org/attachments/6dec4bc9-968a-4dd5-96ed-e65c49d7cf8f) - [0028 migration test](https://git.kayg.org/attachments/05e8f30d-4859-4e84-aebf-4fae2900a34d) - layout [review](https://git.kayg.org/attachments/a5e17192-5379-4adf-b6cb-2546f52ab7dd) · [sync](https://git.kayg.org/attachments/fb0b32c0-bb98-4c91-8033-07244516edb7) · [phone](https://git.kayg.org/attachments/9b764aa5-90b1-4518-967a-e2e5f6472bee) · [desktop screenshot](https://git.kayg.org/attachments/8d09668d-1f51-4836-9554-828c9a75da29) · [phone screenshot](https://git.kayg.org/attachments/435e224b-ca5d-49ae-9022-1a6a6cbaa794) - [signed staging log](https://git.kayg.org/attachments/078f4f07-c954-4d60-b8a3-5d328527e85f) - #244: [mobile resume log](https://git.kayg.org/attachments/ba0077c4-502a-4aa1-be10-539dae714226) · [resumed screenshot](https://git.kayg.org/attachments/f44917a5-e83d-458b-80cd-41a2b83b5f66) · [retained typing log](https://git.kayg.org/attachments/fc3d6ed2-407b-4da8-a221-38786b518946) · [offer desktop](https://git.kayg.org/attachments/4dbcd199-9bd2-4d17-a432-ea58a48a4773) · [offer phone](https://git.kayg.org/attachments/9f1ba102-ec52-4ba2-bd0f-7d37d86df7c8) · [Send again](https://git.kayg.org/attachments/c4645f3f-faf1-479a-a167-64dad5d12f0e) · [Discard](https://git.kayg.org/attachments/d105a1b3-0787-4178-9e7f-129dc39ed6f2)
Author
Owner

Deployed to production as release 6 at 8f8c84e37 (orchestrator, 2026-10-19 ~19:47 IST). Contents: #244 phone resume / refused-session recovery with Send again / Discard, and #243 server-held canvas layout shared across devices (D308 size accepted). healthz ok, new MainPID 124534 (server restarted, so the CA must be unlocked). Backup /var/backups/infraternal/20261019-161717-8f8c84e37…. release-prod-live → 8f8c84e37, merged into dev (8a6949a07).

Owner test: unlock the CA; open the canvas on desktop and phone: both show the same windows; move/split/close on one, it follows on the other; reload keeps it. Phone: background the app for a minute, come back: no resume loop; if the old shell is gone, the offer reads "New shell. Offline typing may not have arrived." with Send again / Discard.

Deployed to production as release 6 at 8f8c84e37 (orchestrator, 2026-10-19 ~19:47 IST). Contents: #244 phone resume / refused-session recovery with Send again / Discard, and #243 server-held canvas layout shared across devices (D308 size accepted). healthz ok, new MainPID 124534 (server restarted, so the CA must be unlocked). Backup /var/backups/infraternal/20261019-161717-8f8c84e37…. release-prod-live → 8f8c84e37, merged into dev (8a6949a07). Owner test: unlock the CA; open the canvas on desktop and phone: both show the same windows; move/split/close on one, it follows on the other; reload keeps it. Phone: background the app for a minute, come back: no resume loop; if the old shell is gone, the offer reads "New shell. Offline typing may not have arrived." with Send again / Discard.
Sign in to join this conversation.
No labels
launch-qa
No milestone
No project
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#244
No description provided.