Lessons from tmux and zellij issue trackers #206

Open
opened 2026-10-13 12:42:43 +00:00 by kayg · 157 comments
Owner

Owner request (2026-10-13): "go through the tmux and zellij issue list, just the titles is fine and see which issues apply to us and how can we optimise those paths".

Scope: research only, no product code changes. Crawl every issue title (number, state, labels, comment count) of github.com/tmux/tmux and github.com/zellij-org/zellij, cluster them into themes that matter to infraternal (VT correctness, resize/reflow, scrollback/search, flood performance, input latency, memory per session, detach/reattach, persistence, copy/selection, keyboard protocols, TERM/terminfo, nesting/SSH, multi-client size, config pain, crashes), compare each theme with our shim, VT engine and tracer renderer, and propose ranked work items.

Deliverable: research/mux-issue-review/README.md on branch research-mux-issues (from origin/dev). Raw JSON stays outside the repo under ~/.cache/codex-scratch/research-mux-issues/. The summary and ranked list will be added here when done.

Summary (2026-10-13)

Crawled all 4245 tmux issues (15 open) and 2924 zellij issues (1561 open), titles only, and clustered them into themes. Report: research/mux-issue-review/README.md on branch research-mux-issues.

Three differences decide what we inherit: (1) the shim and the browser run the same Ghostty VT, which removes most of their Unicode, colour, terminfo and "garbage characters" class; (2) we own the renderer and input, so every browser input problem is ours (zellij's web client has 42 such issues, 29 open: IME duplication, Cmd sending "m", Escape in vim, reconnect loops); (3) network links and several viewers per session are our normal case, which makes their reattach, query-reply and flood bugs more likely for us.

Ranked proposed work (impact x likelihood)

  1. Query replies reaching the shell (zellij#5138, tmux#5540, tmux#2984; ours #160). Test: 2-3 attached viewers + reconnect mid-query + late reply; exactly one reply reaches the PTY. If not, only the active typist answers.
  2. Phone IME, autocorrect, dictation (zellij#4974, #4987, #4494, #5559). Real iPhone/Android input suite asserting PTY bytes; no prediction while composing or on replacement input.
  3. Floods: Ctrl-C latency, drawing bytes nobody reads (tmux#2217 with 210 comments, tmux#849, tmux#818; ours #73, #92, #197). 1 MiB credit / 300 ms RTT caps ~3.3 MiB/s. Gate Ctrl-C-to-prompt; measure skip-to-snapshot for viewers >2 RTT behind.
  4. Approximate restores more often than they look: snapshot.zig refuses exact snapshots on any OSC 133 state (fish 4 default) and on soft wraps at the screen edges. Report the production rate by reason; fixtures; sets D110 export priority.
  5. Browser key matrix (zellij#4787, #5190, #5048, #3789; tmux#2705). Modifiers x keys x kitty flags x layouts spec.
  6. COLORTERM not set (tmux#34, #4300): pty.rs sets only TERM=xterm-256color, so tools fall back to 256 colours. Set COLORTERM=truecolor + test (separate job).
  7. App vs engine Unicode width (tmux#4475, #4287, #3923, #3998; zellij#1538). Corpus from these titles through real zsh/bash at the right margin.
  8. Synchronized output over the network (tmux#5340; zellij#3208, #2828). ghostty-web's JS paint loop has no mode-2026 reference (to confirm). Split-frame spec; hold paints while set, with timeout.
  9. Resize reflow cost and size thrash (tmux#1269, #2657; zellij#3050, #4253). Bench resize at full 17 MiB scrollback and a 2 s edge drag; debounce typist switches (D178/#99).
  10. Browser reconnect UX (zellij#5341, #5325, #5275, #4794). Viewport stays anchored across reconnect; paint-liveness watchdog.
  11. OSC 52 and wrapped-line copy (tmux#1477, #2414; zellij#1330, #778). OSC 52 write with bound, read refused by default; copy tests.
  12. Memory soaks (zellij#3594, #1948, #236; tmux#1261; ours #205). Busy session ~25 MiB (17 MiB VT + 8 MiB ring). Attach/detach x10k, post-flood RSS, 10 GB soak; measure a smaller ring.
  13. Scrollback search safety (tmux#2140, #2258; zellij#533; ours #101). Literal first, linear-time regex, bounded and cancellable, never blocks the pump.
  14. Reboot/upgrade survival (zellij#575 with 103 comments, #1255; tmux#3143). Gate: agent vs shims of last 2 releases. D76 needs scrollback on disk: measure a spill on shutdown/idle (no idle timers).
  15. Images at S1.5 (tmux#3839, #3983; zellij#4124, #3173). Fuzz, per-session byte budget, clearing tests.

Lower: OSC 8 in scrollback/wrapped URLs; modes left on after an inner ssh dies (offer reset); paste fidelity and ESC[201~ injection; a fuzz target for output+resize+snapshot round trips; tmux/zellij nested inside a session; titles/cwd (avoided by D236); config/plugins (avoided by design: 1263 issues, 380 open in zellij).

Owner request (2026-10-13): "go through the tmux and zellij issue list, just the titles is fine and see which issues apply to us and how can we optimise those paths". Scope: research only, no product code changes. Crawl every issue title (number, state, labels, comment count) of github.com/tmux/tmux and github.com/zellij-org/zellij, cluster them into themes that matter to infraternal (VT correctness, resize/reflow, scrollback/search, flood performance, input latency, memory per session, detach/reattach, persistence, copy/selection, keyboard protocols, TERM/terminfo, nesting/SSH, multi-client size, config pain, crashes), compare each theme with our shim, VT engine and tracer renderer, and propose ranked work items. Deliverable: `research/mux-issue-review/README.md` on branch `research-mux-issues` (from origin/dev). Raw JSON stays outside the repo under `~/.cache/codex-scratch/research-mux-issues/`. The summary and ranked list will be added here when done. ## Summary (2026-10-13) Crawled all 4245 tmux issues (15 open) and 2924 zellij issues (1561 open), titles only, and clustered them into themes. Report: `research/mux-issue-review/README.md` on branch `research-mux-issues`. Three differences decide what we inherit: (1) the shim and the browser run the same Ghostty VT, which removes most of their Unicode, colour, terminfo and "garbage characters" class; (2) we own the renderer and input, so every browser input problem is ours (zellij's web client has 42 such issues, 29 open: IME duplication, Cmd sending "m", Escape in vim, reconnect loops); (3) network links and several viewers per session are our normal case, which makes their reattach, query-reply and flood bugs *more* likely for us. ## Ranked proposed work (impact x likelihood) 1. **Query replies reaching the shell** (zellij#5138, tmux#5540, tmux#2984; ours #160). Test: 2-3 attached viewers + reconnect mid-query + late reply; exactly one reply reaches the PTY. If not, only the active typist answers. 2. **Phone IME, autocorrect, dictation** (zellij#4974, #4987, #4494, #5559). Real iPhone/Android input suite asserting PTY bytes; no prediction while composing or on replacement input. 3. **Floods: Ctrl-C latency, drawing bytes nobody reads** (tmux#2217 with 210 comments, tmux#849, tmux#818; ours #73, #92, #197). 1 MiB credit / 300 ms RTT caps ~3.3 MiB/s. Gate Ctrl-C-to-prompt; measure skip-to-snapshot for viewers >2 RTT behind. 4. **Approximate restores more often than they look**: `snapshot.zig` refuses exact snapshots on any OSC 133 state (fish 4 default) and on soft wraps at the screen edges. Report the production rate by reason; fixtures; sets D110 export priority. 5. **Browser key matrix** (zellij#4787, #5190, #5048, #3789; tmux#2705). Modifiers x keys x kitty flags x layouts spec. 6. **`COLORTERM` not set** (tmux#34, #4300): `pty.rs` sets only `TERM=xterm-256color`, so tools fall back to 256 colours. Set `COLORTERM=truecolor` + test (separate job). 7. **App vs engine Unicode width** (tmux#4475, #4287, #3923, #3998; zellij#1538). Corpus from these titles through real zsh/bash at the right margin. 8. **Synchronized output over the network** (tmux#5340; zellij#3208, #2828). ghostty-web's JS paint loop has no mode-2026 reference (to confirm). Split-frame spec; hold paints while set, with timeout. 9. **Resize reflow cost and size thrash** (tmux#1269, #2657; zellij#3050, #4253). Bench resize at full 17 MiB scrollback and a 2 s edge drag; debounce typist switches (D178/#99). 10. **Browser reconnect UX** (zellij#5341, #5325, #5275, #4794). Viewport stays anchored across reconnect; paint-liveness watchdog. 11. **OSC 52 and wrapped-line copy** (tmux#1477, #2414; zellij#1330, #778). OSC 52 write with bound, read refused by default; copy tests. 12. **Memory soaks** (zellij#3594, #1948, #236; tmux#1261; ours #205). Busy session ~25 MiB (17 MiB VT + 8 MiB ring). Attach/detach x10k, post-flood RSS, 10 GB soak; measure a smaller ring. 13. **Scrollback search safety** (tmux#2140, #2258; zellij#533; ours #101). Literal first, linear-time regex, bounded and cancellable, never blocks the pump. 14. **Reboot/upgrade survival** (zellij#575 with 103 comments, #1255; tmux#3143). Gate: agent vs shims of last 2 releases. D76 needs scrollback on disk: measure a spill on shutdown/idle (no idle timers). 15. **Images at S1.5** (tmux#3839, #3983; zellij#4124, #3173). Fuzz, per-session byte budget, clearing tests. Lower: OSC 8 in scrollback/wrapped URLs; modes left on after an inner ssh dies (offer reset); paste fidelity and `ESC[201~` injection; a fuzz target for output+resize+snapshot round trips; tmux/zellij nested inside a session; titles/cwd (avoided by D236); config/plugins (avoided by design: 1263 issues, 380 open in zellij).
1.2 KiB
1.7 KiB
508 B
1.3 KiB
2.9 KiB
Author
Owner

Started. Branch research-mux-issues, worktree .worktrees/research-mux-issues, base dcf9dbb94b52d5d2e805a0474e74dd42764159fe (origin/dev). Crawling titles via the anonymous search API sliced by creation date (10 requests/min).

Started. Branch `research-mux-issues`, worktree `.worktrees/research-mux-issues`, base `dcf9dbb94b52d5d2e805a0474e74dd42764159fe` (origin/dev). Crawling titles via the anonymous search API sliced by creation date (10 requests/min).
Author
Owner

Finished. Report: https://git.kayg.org/kayg/infraternal/src/branch/research-mux-issues/research/mux-issue-review/README.md

Branch research-mux-issues, head 8508e1f66290c5a76a68e37ef1b7595b2c87819a (one commit on base dcf9dbb9, text only, pushed). Raw JSON (4245 tmux + 2924 zellij issues), crawler and clustering script: ~/.cache/codex-scratch/research-mux-issues/ on the build host. The ranked list is in the issue body.

scripts/verify fast on the branch head (full log: ~/.cache/codex-scratch/research-mux-issues/evidence/verify-fast.log). The artifact gate passes for this change; the two red rows are not caused by it (the commit adds one Markdown file) and reproduce from base dcf9dbb9's code: four infraternal tests unwrap an unset CARGO_TARGET_DIR, and the aarch64 static binary is over the size budget (the D263 one-time exception, #198).

==> Repository artifact size gate
repository artifact gate: PASS (1 changed path(s), merge base dcf9dbb94b52)
...
test restart::tests::deleted_path_review::relative_recovery_after_atomic_install_keeps_live_install_path ... FAILED
test restart::tests::path_review::late_recovery_from_path_invocation_keeps_install_target ... FAILED
test restart_image::tests::probe_never_inherits_the_control_descriptor ... FAILED
test restart_image::tests::snapshot_refuses_every_mutation_and_preserves_source_offset ... FAILED
(each: called `Option::unwrap()` on a `None` value at std::env::var_os("CARGO_TARGET_DIR").unwrap())
test result: FAILED. 72 passed; 4 failed; 1 ignored; 0 measured; 0 filtered out; finished in 12.98s
...
PT_INTERP: absent; size: 20014520 bytes (baseline 13555672 + allowance 262144 = max 13817816)
binary exceeds the 13817816-byte size budget: 20014520 bytes
+---------------------------+--------------+
| Rust gate                 | Result       |
+---------------------------+--------------+
| fmt                       | PASS         |
| VT native fmt             | PASS         |
| CLI plugin compile-out    | PASS         |
| clippy                    | PASS         |
| test                      | FAIL (101)   |
| cargo-deny                | PASS         |
| static builds             | FAIL (1)     |
+---------------------------+--------------+
exit 1
Finished. Report: https://git.kayg.org/kayg/infraternal/src/branch/research-mux-issues/research/mux-issue-review/README.md Branch `research-mux-issues`, head `8508e1f66290c5a76a68e37ef1b7595b2c87819a` (one commit on base `dcf9dbb9`, text only, pushed). Raw JSON (4245 tmux + 2924 zellij issues), crawler and clustering script: `~/.cache/codex-scratch/research-mux-issues/` on the build host. The ranked list is in the issue body. `scripts/verify fast` on the branch head (full log: `~/.cache/codex-scratch/research-mux-issues/evidence/verify-fast.log`). The artifact gate passes for this change; the two red rows are not caused by it (the commit adds one Markdown file) and reproduce from base `dcf9dbb9`'s code: four `infraternal` tests unwrap an unset `CARGO_TARGET_DIR`, and the aarch64 static binary is over the size budget (the D263 one-time exception, #198). ``` ==> Repository artifact size gate repository artifact gate: PASS (1 changed path(s), merge base dcf9dbb94b52) ... test restart::tests::deleted_path_review::relative_recovery_after_atomic_install_keeps_live_install_path ... FAILED test restart::tests::path_review::late_recovery_from_path_invocation_keeps_install_target ... FAILED test restart_image::tests::probe_never_inherits_the_control_descriptor ... FAILED test restart_image::tests::snapshot_refuses_every_mutation_and_preserves_source_offset ... FAILED (each: called `Option::unwrap()` on a `None` value at std::env::var_os("CARGO_TARGET_DIR").unwrap()) test result: FAILED. 72 passed; 4 failed; 1 ignored; 0 measured; 0 filtered out; finished in 12.98s ... PT_INTERP: absent; size: 20014520 bytes (baseline 13555672 + allowance 262144 = max 13817816) binary exceeds the 13817816-byte size budget: 20014520 bytes +---------------------------+--------------+ | Rust gate | Result | +---------------------------+--------------+ | fmt | PASS | | VT native fmt | PASS | | CLI plugin compile-out | PASS | | clippy | PASS | | test | FAIL (101) | | cargo-deny | PASS | | static builds | FAIL (1) | +---------------------------+--------------+ exit 1 ```
Author
Owner

Started term-env-sync on branch term-env-sync, based on origin/dev at 6f7cde60a430590a20f0b9384fc423df465bde7f. Continuing #206 items 6 (COLORTERM) and 8 (synchronized output). The worktree was clean; no remote term-env-sync branch exists. Read the required project docs and all #206 comments; no parent issue is recorded in Forgejo's issue view.

Started `term-env-sync` on branch `term-env-sync`, based on `origin/dev` at `6f7cde60a430590a20f0b9384fc423df465bde7f`. Continuing #206 items 6 (`COLORTERM`) and 8 (synchronized output). The worktree was clean; no remote `term-env-sync` branch exists. Read the required project docs and all #206 comments; no parent issue is recorded in Forgejo's issue view.
Author
Owner

Started query-replies (#206 item 1, #160) on branch query-replies, based on origin/dev at 6f7cde60a430590a20f0b9384fc423df465bde7f. The published origin/dev matches this base; no origin/query-replies branch exists. I’m tracing the current terminal input and query-answer paths before adding the multi-viewer, reconnect and late-reply regressions.

Started query-replies (#206 item 1, #160) on branch `query-replies`, based on `origin/dev` at `6f7cde60a430590a20f0b9384fc423df465bde7f`. The published `origin/dev` matches this base; no `origin/query-replies` branch exists. I’m tracing the current terminal input and query-answer paths before adding the multi-viewer, reconnect and late-reply regressions.
Author
Owner

Started query-replies (#206 item 1, #160) on branch query-replies, based on origin/dev at 6f7cde60a430590a20f0b9384fc423df465bde7f. The published origin/dev matches this base; no origin/query-replies branch exists. I’m tracing the current terminal input and query-answer paths before adding the multi-viewer, reconnect and late-reply regressions.

Started query-replies (#206 item 1, #160) on branch `query-replies`, based on `origin/dev` at `6f7cde60a430590a20f0b9384fc423df465bde7f`. The published `origin/dev` matches this base; no `origin/query-replies` branch exists. I’m tracing the current terminal input and query-answer paths before adding the multi-viewer, reconnect and late-reply regressions.
Author
Owner

Finding: crates/infraternal-shim/src/pty.rs clears the shell environment and sets TERM but not COLORTERM; the existing PTY environment regression checks only TERM. In apps/tracer/src/terminal.ts, drainOutput() writes each contiguous WebSocket output region directly to Ghostty, and installCursorLayerHook() wraps every renderer pass without a mode-2026 hold. D188's current transfer caps are 300/250 KiB critical gzip/Brotli and 50/44 KiB deferred. Capturing a production-build baseline before implementation.

Finding: `crates/infraternal-shim/src/pty.rs` clears the shell environment and sets `TERM` but not `COLORTERM`; the existing PTY environment regression checks only `TERM`. In `apps/tracer/src/terminal.ts`, `drainOutput()` writes each contiguous WebSocket output region directly to Ghostty, and `installCursorLayerHook()` wraps every renderer pass without a mode-2026 hold. D188's current transfer caps are 300/250 KiB critical gzip/Brotli and 50/44 KiB deferred. Capturing a production-build baseline before implementation.
Author
Owner

Build environment finding: the clean worktree has no installed tracer packages, so its first production bundle attempt failed resolving the lockfile dependency @scure/bip39 from apps/tracer/src/recovery.ts and apps/tracer/src/auth.ts. The failed attempt changed no tracked files. Installing apps/tracer dependencies from its checked-in bun.lock with the package cache under this job's scratch directory, then repeating the baseline capture.

Build environment finding: the clean worktree has no installed tracer packages, so its first production bundle attempt failed resolving the lockfile dependency `@scure/bip39` from `apps/tracer/src/recovery.ts` and `apps/tracer/src/auth.ts`. The failed attempt changed no tracked files. Installing `apps/tracer` dependencies from its checked-in `bun.lock` with the package cache under this job's scratch directory, then repeating the baseline capture.
Author
Owner

Baseline captured before code changes from 6f7cde60a430590a20f0b9384fc423df465bde7f using apps/tracer/build.ts and transfer-budget.ts; full receipt: ~/.cache/codex-scratch/term-env-sync/evidence/d188-before.log. D188 JavaScript: critical 969,830 identity / 300,187 gzip / 250,051 Brotli bytes (caps 307,200 / 256,000); deferred 141,031 / 49,071 / 43,444 (caps 51,200 / 45,056); largest on-demand chunk 15,097 / 13,462 (caps 20,480 / 18,432). All current caps pass; critical headroom is 7,013 gzip / 5,949 Brotli bytes, deferred headroom 2,129 / 1,612 bytes. Installed the 38 locked tracer packages after the clean worktree's first build could not resolve @scure/bip39; no tracked files changed.

Baseline captured before code changes from `6f7cde60a430590a20f0b9384fc423df465bde7f` using `apps/tracer/build.ts` and `transfer-budget.ts`; full receipt: `~/.cache/codex-scratch/term-env-sync/evidence/d188-before.log`. D188 JavaScript: critical 969,830 identity / 300,187 gzip / 250,051 Brotli bytes (caps 307,200 / 256,000); deferred 141,031 / 49,071 / 43,444 (caps 51,200 / 45,056); largest on-demand chunk 15,097 / 13,462 (caps 20,480 / 18,432). All current caps pass; critical headroom is 7,013 gzip / 5,949 Brotli bytes, deferred headroom 2,129 / 1,612 bytes. Installed the 38 locked tracer packages after the clean worktree's first build could not resolve `@scure/bip39`; no tracked files changed.
Author
Owner

spawned_login_shell_receives_selected_locale_without_other_host_variables now fails before the fix as intended (exit 101): /proc/<shell-pid>/environ lacks COLORTERM=truecolor; 0 passed, 1 failed, 92 filtered. The test also asks the real login shell to expand and print the value after the fix. Raw output: ~/.cache/codex-scratch/term-env-sync/evidence/colorterm-red.log.

`spawned_login_shell_receives_selected_locale_without_other_host_variables` now fails before the fix as intended (exit 101): `/proc/<shell-pid>/environ` lacks `COLORTERM=truecolor`; 0 passed, 1 failed, 92 filtered. The test also asks the real login shell to expand and print the value after the fix. Raw output: `~/.cache/codex-scratch/term-env-sync/evidence/colorterm-red.log`.
Author
Owner

Three-viewer browser regression reproduced against the tracer build and test-double server. A single attached viewer sends 15 reply bytes. With three viewers attached and the third typing last, per-viewer accepted input deltas are [15, 15, 15]; expected [0, 0, 15]. All attached renderers reply to the same live query. Browser run log

Three-viewer browser regression reproduced against the tracer build and test-double server. A single attached viewer sends 15 reply bytes. With three viewers attached and the third typing last, per-viewer accepted input deltas are `[15, 15, 15]`; expected `[0, 0, 15]`. All attached renderers reply to the same live query. [Browser run log](https://git.kayg.org/attachments/a287e4f0-ecd8-4d25-894d-c638c54dfb3f)
Author
Owner

Late-query browser regression reproduced with CPR split across output writes: send ESC [ 6, wait 1.1 seconds, then send n. The query completes after the response window, but the browser still sends 6 input bytes (expected 0). This proves a late reply reaches the server boundary in the browser/test-double path; it is not yet a real-shim PTY measurement. Browser run log

Late-query browser regression reproduced with CPR split across output writes: send `ESC [ 6`, wait 1.1 seconds, then send `n`. The query completes after the response window, but the browser still sends 6 input bytes (expected 0). This proves a late reply reaches the server boundary in the browser/test-double path; it is not yet a real-shim PTY measurement. [Browser run log](https://git.kayg.org/attachments/38525983-1b12-47f2-99c5-5d97e10021c5)
Author
Owner

Wire-contract blocker from source review: apps/tracer/src/terminal.ts routes Ghostty replies and keyboard bytes through the same onData → handleInput path. contracts/wire.md §4 defines leg-A Input as only u64 in_seq + bytes; contracts/shim.md §4 defines shim Input as only bytes. The shim uses newly accepted input to update active writer/geometry (crates/infraternal-shim/src/session.rs). Thus no existing frame tells the server or shim whether bytes are a parser reply, which viewer generated them as the last typist, or which output cursor caused them. Filtering by bytes or a short time window can drop legitimate typed bytes and cannot safely expire a response across reconnect.

An exact fix needs an additive reply marker that distinguishes parser replies from typing and carries their originating output cursor/query identity, with the server enforcing the D178 last-typist writer and expiry before forwarding. That changes the frozen leg-A and likely leg-B contracts; reply deadline semantics also need to be chosen. Per the brief, I am stopping before protocol/product changes. The test-only reproductions are on this issue above; no failing implementation commit is made.

Wire-contract blocker from source review: `apps/tracer/src/terminal.ts` routes Ghostty replies and keyboard bytes through the same `onData` → `handleInput` path. `contracts/wire.md` §4 defines leg-A `Input` as only `u64 in_seq + bytes`; `contracts/shim.md` §4 defines shim `Input` as only bytes. The shim uses newly accepted input to update active writer/geometry (`crates/infraternal-shim/src/session.rs`). Thus no existing frame tells the server or shim whether bytes are a parser reply, which viewer generated them as the last typist, or which output cursor caused them. Filtering by bytes or a short time window can drop legitimate typed bytes and cannot safely expire a response across reconnect. An exact fix needs an additive reply marker that distinguishes parser replies from typing and carries their originating output cursor/query identity, with the server enforcing the D178 last-typist writer and expiry before forwarding. That changes the frozen leg-A and likely leg-B contracts; reply deadline semantics also need to be chosen. Per the brief, I am stopping before protocol/product changes. The test-only reproductions are on this issue above; no failing implementation commit is made.
Author
Owner

Status on query-replies: stopping at the frozen-wire boundary as the brief directs. Head remains 6f7cde60a430590a20f0b9384fc423df465bde7f; no product or protocol code was changed and no commit was made. The worktree contains test-double input attribution plus three browser regression cases.

Verified red results: (1) three attached viewers each send 15 reply bytes after the third viewer types last; expected deltas [0, 0, 15], actual [15, 15, 15]; (2) a CPR split completed 1.1 seconds after the response window sends 6 bytes, expected 0. bun run check passed ($ bun x tsc --project tsconfig.json, exit 0). The reconnect-mid-query case is added but unrun: all four shared build slots remained occupied, and I did not bypass the scheduler. These browser runs use the test-double server; there is no real-shim PTY result.

scripts/verify fast was not run: there is no implementation to gate, and the requested fix needs an owner decision on an additive parser-reply marker carrying its originating output cursor/query identity and on expiry semantics. Both are required before a correct no-heuristic implementation can proceed under the frozen leg-A/leg-B contracts.

Status on `query-replies`: stopping at the frozen-wire boundary as the brief directs. Head remains `6f7cde60a430590a20f0b9384fc423df465bde7f`; no product or protocol code was changed and no commit was made. The worktree contains test-double input attribution plus three browser regression cases. Verified red results: (1) three attached viewers each send 15 reply bytes after the third viewer types last; expected deltas `[0, 0, 15]`, actual `[15, 15, 15]`; (2) a CPR split completed 1.1 seconds after the response window sends 6 bytes, expected 0. `bun run check` passed (`$ bun x tsc --project tsconfig.json`, exit 0). The reconnect-mid-query case is added but unrun: all four shared build slots remained occupied, and I did not bypass the scheduler. These browser runs use the test-double server; there is no real-shim PTY result. `scripts/verify fast` was not run: there is no implementation to gate, and the requested fix needs an owner decision on an additive parser-reply marker carrying its originating output cursor/query identity and on expiry semantics. Both are required before a correct no-heuristic implementation can proceed under the frozen leg-A/leg-B contracts.
Author
Owner

The fragmented DEC mode scanner and its five unit tests are in place; bun run check passes. The tests cover a mode split across byte/string writes, control strings and unrelated mode numbers, RIS reset, the 4096-byte CSI bound, and the 150 ms release. Browser baseline is queued behind occupied build slots and has not started yet.

The fragmented DEC mode scanner and its five unit tests are in place; `bun run check` passes. The tests cover a mode split across byte/string writes, control strings and unrelated mode numbers, RIS reset, the 4096-byte CSI bound, and the 150 ms release. Browser baseline is queued behind occupied build slots and has not started yet.
Author
Owner

Pre-fix split-frame browser spec fails as expected: after the first of three Output messages, canvas hash changed from 2316598229 to 3229246181 before DEC mode 2026 reset. The canvas update confirms the partial-frame paint. Receipt: log, initial frame screenshot.

Pre-fix split-frame browser spec fails as expected: after the first of three Output messages, canvas hash changed from 2316598229 to 3229246181 before DEC mode 2026 reset. The canvas update confirms the partial-frame paint. Receipt: [log](https://git.kayg.org/attachments/701ebafb-fbfb-4f2d-80e7-fef515a8be0e), [initial frame screenshot](https://git.kayg.org/attachments/f6233ca2-99e3-4eb6-a2af-c8b535b1fd0c).
Author
Owner

The first integrated run still observed the partial canvas because withholding the renderer call also withheld its write callback; the 150 ms timeout then released the queued write. I changed the write wrapper to complete the app's callback once parsing returns while the paint hold is active, so later fragments can reach the parser without presenting an intermediate canvas. Receipt: browser log.

The first integrated run still observed the partial canvas because withholding the renderer call also withheld its write callback; the 150 ms timeout then released the queued write. I changed the write wrapper to complete the app's callback once parsing returns while the paint hold is active, so later fragments can reach the parser without presenting an intermediate canvas. Receipt: [browser log](https://git.kayg.org/attachments/6fb546dd-a05c-435c-aeb1-6058e91f5377).
Author
Owner

Typing baseline (pre-integration production build) completed on infraternal-perf-test under systemd-run --user --scope -p CPUWeight=10000; load average before/after was 0.04 0.05 0.24 / 0.19 0.08 0.25. At configured 300 ms RTT, 20 predicted glyph samples were p50 14.30 ms / p99 14.90 ms (D41 budget 17 ms); confirmed echo was p50 331.40 ms / p99 332.30 ms. Receipt: log, production screenshot.

Typing baseline (pre-integration production build) completed on infraternal-perf-test under `systemd-run --user --scope -p CPUWeight=10000`; load average before/after was `0.04 0.05 0.24` / `0.19 0.08 0.25`. At configured 300 ms RTT, 20 predicted glyph samples were p50 14.30 ms / p99 14.90 ms (D41 budget 17 ms); confirmed echo was p50 331.40 ms / p99 332.30 ms. Receipt: [log](https://git.kayg.org/attachments/d8d17f92-9417-4eb9-8fc7-8dffd6fb25e9), [production screenshot](https://git.kayg.org/attachments/ca1ce689-ee0a-4d91-8a37-9d6f25d0a05b).
Author
Owner

The second integrated browser run kept canvas pixels unchanged through the split output, but the existing render-pass counter rose from 108 to 112 before reset. I added a test-only mode-hold metric assertion so the next run can distinguish an early timeout from render activity that does not change visible pixels. Receipt: browser log.

The second integrated browser run kept canvas pixels unchanged through the split output, but the existing render-pass counter rose from 108 to 112 before reset. I added a test-only mode-hold metric assertion so the next run can distinguish an early timeout from render activity that does not change visible pixels. Receipt: [browser log](https://git.kayg.org/attachments/8be94ac7-1c95-4d8e-9880-f68e68a6917c).
Author
Owner

The split-frame test was inheriting the 300 ms RTT fixture, which adds 150 ms one-way delay and matches the 150 ms paint deadline. The canvas stayed unchanged, while the pass counter advanced during the timeout observation. I set this functional browser spec to RTT 0 so it measures mode gating without the fixture consuming its bounded timeout; the dedicated typing benchmark keeps its 300 ms RTT.

The split-frame test was inheriting the 300 ms RTT fixture, which adds 150 ms one-way delay and matches the 150 ms paint deadline. The canvas stayed unchanged, while the pass counter advanced during the timeout observation. I set this functional browser spec to RTT 0 so it measures mode gating without the fixture consuming its bounded timeout; the dedicated typing benchmark keeps its 300 ms RTT.
Author
Owner

The synchronized-output Playwright spec contains a bounded-time assertion, so its evidence must come from the named perf VM. I cancelled the queued build-host run before it acquired a build slot. Earlier build-host runs remain functional diagnostics only; I will rerun the timed spec on the perf VM against the branch build.

The synchronized-output Playwright spec contains a bounded-time assertion, so its evidence must come from the named perf VM. I cancelled the queued build-host run before it acquired a build slot. Earlier build-host runs remain functional diagnostics only; I will rerun the timed spec on the perf VM against the branch build.
Author
Owner

Review found that the terminal write callback advances lastOutSeq and returns output credit only after paint (apps/tracer/src/terminal.ts, output drain callback). Calling it early would acknowledge bytes before pixels were painted. The integration now scans in receive order and submits held output as one queued write; the browser spec waits for received sequence while held and painted sequence after release. Verification pending.

Review found that the terminal write callback advances `lastOutSeq` and returns output credit only after paint (`apps/tracer/src/terminal.ts`, output drain callback). Calling it early would acknowledge bytes before pixels were painted. The integration now scans in receive order and submits held output as one queued write; the browser spec waits for received sequence while held and painted sequence after release. Verification pending.
Author
Owner

Step 1 complete: commit ba8085b7ca sets COLORTERM=truecolor beside TERM and verifies the login-shell environment. Test: 1 passed, 0 failed. cargo clippy --locked -p infraternal-shim --all-targets -- -D warnings passed; cargo fmt --all -- --check passed. Receipts: shell test, clippy.

Step 1 complete: commit ba8085b7ca1de3a3641f631688d7b09a605fb726 sets COLORTERM=truecolor beside TERM and verifies the login-shell environment. Test: 1 passed, 0 failed. `cargo clippy --locked -p infraternal-shim --all-targets -- -D warnings` passed; `cargo fmt --all -- --check` passed. Receipts: [shell test](https://git.kayg.org/attachments/f2656be6-f237-42f8-820b-12dce4b79da8), [clippy](https://git.kayg.org/attachments/bda19fed-02a4-46ec-b902-505fe64646b8).
Author
Owner

TypeScript check found the Playwright polling option must be intervals, not interval, in apps/tracer/test/synchronized-output.spec.ts. Corrected it; the original compiler error is attached: check output. The corrected check and unit tests are rerunning.

TypeScript check found the Playwright polling option must be `intervals`, not `interval`, in `apps/tracer/test/synchronized-output.spec.ts`. Corrected it; the original compiler error is attached: [check output](https://git.kayg.org/attachments/bdaae90a-6d48-47e4-bc20-49f2f688fc08). The corrected check and unit tests are rerunning.
Author
Owner

Step 2 complete: commit 583bafb443 adds the mode-2026 scanner, 150 ms hold bound, and five unit cases; the tracer TypeScript check and all five tests pass. Receipt: TypeScript check and unit tests.

Step 2 complete: commit 583bafb443a93446a223bed02f0d6d68ce017a7b adds the mode-2026 scanner, 150 ms hold bound, and five unit cases; the tracer TypeScript check and all five tests pass. Receipt: [TypeScript check and unit tests](https://git.kayg.org/attachments/a300a948-01d5-4f78-b80d-b411518e061f).
Author
Owner

Production bundle built and D188 budgets pass. Before→after: critical gzip 300187→301205 bytes (+1018; limit 307200), Brotli 250051→251001 (+950; limit 256000); deferred gzip 49071→49087 (+16; limit 51200), Brotli 43444→43517 (+73; limit 45056); largest on-demand gzip 15097→15101 (+4; limit 20480), Brotli 13462→13447 (-15; limit 18432). On-demand class totals are reported, not limited: gzip 87449→87484, Brotli 78055→78005. Receipt: after build budget log.

Production bundle built and D188 budgets pass. Before→after: critical gzip 300187→301205 bytes (+1018; limit 307200), Brotli 250051→251001 (+950; limit 256000); deferred gzip 49071→49087 (+16; limit 51200), Brotli 43444→43517 (+73; limit 45056); largest on-demand gzip 15097→15101 (+4; limit 20480), Brotli 13462→13447 (-15; limit 18432). On-demand class totals are reported, not limited: gzip 87449→87484, Brotli 78055→78005. Receipt: [after build budget log](https://git.kayg.org/attachments/7715395e-1212-4b92-94c0-f87cd5ecac25).
Author
Owner

Renderer review found that coalescing a wrapped output ring into one contiguous buffer could allocate up to the 1 MiB output credit per synchronized frame. The batch now feeds the ring's at most two contiguous views in one JS task and attaches the existing paint callback only to the final view, avoiding a full-frame copy while keeping acknowledgement after paint. Verification pending (apps/tracer/src/terminal.ts).

Renderer review found that coalescing a wrapped output ring into one contiguous buffer could allocate up to the 1 MiB output credit per synchronized frame. The batch now feeds the ring's at most two contiguous views in one JS task and attaches the existing paint callback only to the final view, avoiding a full-frame copy while keeping acknowledgement after paint. Verification pending (`apps/tracer/src/terminal.ts`).
Author
Owner

Detached origin/dev static x86_64 size baseline complete at 6f7cde60a4. Recipe: scripts/static-cargo build --locked --release --package infraternal --target x86_64-unknown-linux-musl; output is stripped static PIE, 21,225,872 bytes. This is the existing cap; branch comparison follows after integration.

Detached origin/dev static x86_64 size baseline complete at 6f7cde60a430590a20f0b9384fc423df465bde7f. Recipe: `scripts/static-cargo build --locked --release --package infraternal --target x86_64-unknown-linux-musl`; output is stripped static PIE, 21,225,872 bytes. This is the existing cap; branch comparison follows after integration.
Author
Owner

Final integration check: bun run check passed; bun test src/synchronized-output.test.ts passed 5/5; production bundle rebuilt after the ring-segment change and D188 budgets passed. Compared with the pre-change receipt, critical JS is gzip 300,187 -> 301,331 bytes (+1,144; 5,869 below 307,200) and Brotli 250,051 -> 251,101 (+1,050; 4,899 below 256,000). Deferred is gzip 49,071 -> 49,076 (+5), Brotli 43,444 -> 43,439 (-5). Largest on-demand chunk is gzip 15,097 -> 15,099 (+2), Brotli 13,462 -> 13,461 (-1); class totals gzip 87,449 -> 87,450 and Brotli 78,055 -> 78,013. Receipts: final budget output, production build output. The earlier D188 after numbers were from the pre-ring-refactor bundle; these replace them.

Final integration check: `bun run check` passed; `bun test src/synchronized-output.test.ts` passed 5/5; production bundle rebuilt after the ring-segment change and D188 budgets passed. Compared with the pre-change receipt, critical JS is gzip 300,187 -> 301,331 bytes (+1,144; 5,869 below 307,200) and Brotli 250,051 -> 251,101 (+1,050; 4,899 below 256,000). Deferred is gzip 49,071 -> 49,076 (+5), Brotli 43,444 -> 43,439 (-5). Largest on-demand chunk is gzip 15,097 -> 15,099 (+2), Brotli 13,462 -> 13,461 (-1); class totals gzip 87,449 -> 87,450 and Brotli 78,055 -> 78,013. Receipts: [final budget output](https://git.kayg.org/attachments/16a20b69-2893-4585-bfc8-630ccda20380), [production build output](https://git.kayg.org/attachments/50fdc1cb-1c00-42d4-91c9-5dc453377e4c). The earlier D188 after numbers were from the pre-ring-refactor bundle; these replace them.
Author
Owner

Review finding in apps/tracer/src/terminal.ts: a synchronized batch can cross the replay response fence before its one paint callback, leaving parser replies suppressed for live bytes beyond the fence. The batch write loop now splits at the fence, switches reply handling for subsequent bytes, and keeps paint/credit acknowledgement on the final fragment. TypeScript and browser verification are pending.

Review finding in `apps/tracer/src/terminal.ts`: a synchronized batch can cross the replay response fence before its one paint callback, leaving parser replies suppressed for live bytes beyond the fence. The batch write loop now splits at the fence, switches reply handling for subsequent bytes, and keeps paint/credit acknowledgement on the final fragment. TypeScript and browser verification are pending.
Author
Owner

Updated final bundle after the replay-fence correction: scanner tests passed 5/5, production build passed, and D188 transfer budgets passed. Compared with the pre-change receipt, critical JS is gzip 300,187 -> 301,453 bytes (+1,266; 5,747 below 307,200) and Brotli 250,051 -> 251,199 (+1,148; 4,801 below 256,000). Deferred is gzip 49,071 -> 49,083 (+12), Brotli 43,444 -> 43,494 (+50). Largest on-demand chunk is gzip 15,097 -> 15,099 (+2), Brotli 13,462 -> 13,472 (+10); class totals gzip 87,449 -> 87,487 and Brotli 78,055 -> 78,049. The prior “final” after-build numbers predated the replay-fence adjustment; this receipt replaces them: tests, build and transfer-budget output.

Updated final bundle after the replay-fence correction: scanner tests passed 5/5, production build passed, and D188 transfer budgets passed. Compared with the pre-change receipt, critical JS is gzip 300,187 -> 301,453 bytes (+1,266; 5,747 below 307,200) and Brotli 250,051 -> 251,199 (+1,148; 4,801 below 256,000). Deferred is gzip 49,071 -> 49,083 (+12), Brotli 43,444 -> 43,494 (+50). Largest on-demand chunk is gzip 15,097 -> 15,099 (+2), Brotli 13,462 -> 13,472 (+10); class totals gzip 87,449 -> 87,487 and Brotli 78,055 -> 78,049. The prior “final” after-build numbers predated the replay-fence adjustment; this receipt replaces them: [tests, build and transfer-budget output](https://git.kayg.org/attachments/7b1b52d8-992e-45f7-84a6-34bf3b7a5c67).
Author
Owner

The first perf-VM browser attempt exited 1 after 2 s (load average 0.00 -> 0.08 0.02 0.01). Its Playwright outputDir overlapped the evidence root, so Playwright cleanup removed the wrapper's run.log before it could be read. I separated playwright-runner/ from the evidence root and recopied the harness; retry is queued. Failed-run receipt: wrapper output.

The first perf-VM browser attempt exited 1 after 2 s (load average 0.00 -> 0.08 0.02 0.01). Its Playwright `outputDir` overlapped the evidence root, so Playwright cleanup removed the wrapper's `run.log` before it could be read. I separated `playwright-runner/` from the evidence root and recopied the harness; retry is queued. Failed-run receipt: [wrapper output](https://git.kayg.org/attachments/ab1b31ae-2253-4279-adc4-46bc6f61d376).
Author
Owner

The second perf-VM attempt exited 1 after 2 s at load average 0.07 0.02 0.00 -> 0.07 0.02 0.00. The minimal remote test project lacked apps/tracer/package.json; Node therefore treated test/evidence-path.ts as CommonJS and rejected import.meta. I copied the app package metadata (type: module) into that isolated test project and verified it with the pinned Node 22 runtime. Receipt: VM run log.

The second perf-VM attempt exited 1 after 2 s at load average 0.07 0.02 0.00 -> 0.07 0.02 0.00. The minimal remote test project lacked `apps/tracer/package.json`; Node therefore treated `test/evidence-path.ts` as CommonJS and rejected `import.meta`. I copied the app package metadata (`type: module`) into that isolated test project and verified it with the pinned Node 22 runtime. Receipt: [VM run log](https://git.kayg.org/attachments/f4288124-c1d6-4e1d-bf89-215aa0eb3320).
Author
Owner

The first actual browser spec run exited 1 after 10 s at load average 0.03 0.02 0.00 -> 0.02 0.02 0.00. The first frame fragment reached the test after its 150 ms hold had expired, so the held-state assertion saw false. The spec used Playwright's default 100 ms poll interval plus a canvas hash after every fragment. I reduced the receipt poll interval to 2 ms and moved the canvas comparison after all three messages while retaining per-message hold/render-pass assertions. Retry pending. Receipt: VM test output.

The first actual browser spec run exited 1 after 10 s at load average 0.03 0.02 0.00 -> 0.02 0.02 0.00. The first frame fragment reached the test after its 150 ms hold had expired, so the held-state assertion saw false. The spec used Playwright's default 100 ms poll interval plus a canvas hash after every fragment. I reduced the receipt poll interval to 2 ms and moved the canvas comparison after all three messages while retaining per-message hold/render-pass assertions. Retry pending. Receipt: [VM test output](https://git.kayg.org/attachments/430a80dd-dca8-4dcd-aeee-e464dedebce8).
Author
Owner

Correction: the 150 ms timeout explanation is a working hypothesis, not yet confirmed; the prior comment overstated it. The retry logs elapsed time and held state after each fragment, which will distinguish timeout from mode recognition failure.

Correction: the 150 ms timeout explanation is a working hypothesis, not yet confirmed; the prior comment overstated it. The retry logs elapsed time and held state after each fragment, which will distinguish timeout from mode recognition failure.
Author
Owner

The fourth VM run confirmed the timeout interaction at load average 1.09 0.34 0.12 -> 1.38 0.43 0.15: fragment 1 was checked at 176.8 ms (held), but fragment 2 only arrived at 363.9 ms (the 150 ms hold had released). The test's per-message HTTP and Playwright round trips were slower than its frame window. I changed the test double to send three distinct Output frames 20 ms apart in one request, then verify the final received sequence, unchanged render-pass count and canvas while mode 2026 remains held. The production timeout remains 150 ms. Receipt: VM run with per-fragment timings.

The fourth VM run confirmed the timeout interaction at load average 1.09 0.34 0.12 -> 1.38 0.43 0.15: fragment 1 was checked at 176.8 ms (held), but fragment 2 only arrived at 363.9 ms (the 150 ms hold had released). The test's per-message HTTP and Playwright round trips were slower than its frame window. I changed the test double to send three distinct Output frames 20 ms apart in one request, then verify the final received sequence, unchanged render-pass count and canvas while mode 2026 remains held. The production timeout remains 150 ms. Receipt: [VM run with per-fragment timings](https://git.kayg.org/attachments/b62ee317-f7a8-448f-8f9a-59978f0023cf).
Author
Owner

The production browser spec now passes 1/1 on infraternal-perf-test, with TRACER_TEST_PORT=4246, RTT 0 ms, and systemd-run --user --scope -p CPUWeight=10000. Load average was 2.96 2.87 1.78 before and 2.51 2.78 1.76 after. The spec sent three separate Output frames 20 ms apart: synchronized_output_frames=3 elapsed_ms=195.2 held=true; render-pass count and canvas stayed unchanged until reset, then the full frame painted. The missing-reset case released at 304.0 ms measured from before the HTTP request (including request/test overhead); the application hold remains capped at 150 ms from mode recognition. TypeScript check passed. Receipts: VM wrapper and load, Playwright result, before frame, completed frame, TypeScript check.

The production browser spec now passes 1/1 on infraternal-perf-test, with `TRACER_TEST_PORT=4246`, RTT 0 ms, and `systemd-run --user --scope -p CPUWeight=10000`. Load average was 2.96 2.87 1.78 before and 2.51 2.78 1.76 after. The spec sent three separate Output frames 20 ms apart: `synchronized_output_frames=3 elapsed_ms=195.2 held=true`; render-pass count and canvas stayed unchanged until reset, then the full frame painted. The missing-reset case released at 304.0 ms measured from before the HTTP request (including request/test overhead); the application hold remains capped at 150 ms from mode recognition. TypeScript check passed. Receipts: [VM wrapper and load](https://git.kayg.org/attachments/be0e4feb-7e54-49e7-a013-5f59f48f327e), [Playwright result](https://git.kayg.org/attachments/ec50ae09-9027-4d2f-a058-2ebd33a45f8c), [before frame](https://git.kayg.org/attachments/08b090c6-4474-4dac-9bcf-5b7a130c5cee), [completed frame](https://git.kayg.org/attachments/4d915d2e-d6f6-45d2-8c58-7fc3a57f612e), [TypeScript check](https://git.kayg.org/attachments/51d3a2e3-dbf9-417b-971b-6a7245bcbaa0).
Author
Owner

Finding: the local branch is two commits behind current origin/dev (HEAD 583bafb; origin/dev 4c95aabd, containing f29713863 and 4c95aabd). The in-progress iterate gate is running against the unchanged tree; after it exits I will merge origin/dev and re-run the gates on the resulting branch head.

Finding: the local branch is two commits behind current origin/dev (HEAD 583bafb; origin/dev 4c95aabd, containing f29713863 and 4c95aabd). The in-progress iterate gate is running against the unchanged tree; after it exits I will merge origin/dev and re-run the gates on the resulting branch head.
Author
Owner

Iteration gate finding: test shared_ownership_shell_preserves_recovery_and_refusal_invariants failed because previous_attempt_shell.py requires INFRATERNALE_TEST_RUNTIME_HELPER, which the gate command did not set (32 setup errors; Rust rows otherwise passed except test). The fixture binary exists at targets/rust/debug/examples/recovery-helper. I will rerun this test with the fixture path supplied, then run the final gate with that same test input. Full gate receipt: verify-iterate.log.

Iteration gate finding: `test shared_ownership_shell_preserves_recovery_and_refusal_invariants` failed because `previous_attempt_shell.py` requires `INFRATERNALE_TEST_RUNTIME_HELPER`, which the gate command did not set (32 setup errors; Rust rows otherwise passed except `test`). The fixture binary exists at `targets/rust/debug/examples/recovery-helper`. I will rerun this test with the fixture path supplied, then run the final gate with that same test input. Full gate receipt: [verify-iterate.log](https://git.kayg.org/attachments/658fcacf-9560-4af2-847a-9e810f5750ce).
Author
Owner

Correction to the previous gate note: the test itself is sound. I omitted its INFRATERNAL_TEST_RUNTIME_HELPER input from the first gate invocation. With that variable set to targets/rust/debug/examples/recovery-helper, previous_attempt_shell passes 1/1 in 6.95 s. Receipt: previous-attempt-shell-retry2.log. The next iterate run will include this fixture path.

Correction to the previous gate note: the test itself is sound. I omitted its `INFRATERNAL_TEST_RUNTIME_HELPER` input from the first gate invocation. With that variable set to `targets/rust/debug/examples/recovery-helper`, `previous_attempt_shell` passes 1/1 in 6.95 s. Receipt: [previous-attempt-shell-retry2.log](https://git.kayg.org/attachments/c5ea94d0-afe2-4b86-b885-4cd916deda98). The next iterate run will include this fixture path.
Author
Owner

Merged current origin/dev into the lane: base 4c95aabd (D307, D308), merge commit 1951ed6318. The lane changes remain in the worktree; rerunning scripts/verify iterate on this base with the required runtime-helper test input.

Merged current origin/dev into the lane: base 4c95aabd (D307, D308), merge commit 1951ed63187e5e84283cd320607651dd275ff9e6. The lane changes remain in the worktree; rerunning `scripts/verify iterate` on this base with the required runtime-helper test input.
Author
Owner

Iterate rerun finding: the runtime-helper fixture input is now set, but agent_daemon failed before exercising the daemon because the nested state root made its AF_UNIX fixture path 119 bytes. I will rerun with the job root itself as INFRATERNAL_TEST_STATE_ROOT, reducing the fixture prefix. Receipt: verify-iterate-merged.log.

Iterate rerun finding: the runtime-helper fixture input is now set, but `agent_daemon` failed before exercising the daemon because the nested state root made its AF_UNIX fixture path 119 bytes. I will rerun with the job root itself as `INFRATERNAL_TEST_STATE_ROOT`, reducing the fixture prefix. Receipt: [verify-iterate-merged.log](https://git.kayg.org/attachments/a75a9a3c-9b17-4e7a-8b12-fec6e51e4dce).
Author
Owner

The shortened state root fixes the fixture path: agent_daemon passes 1/1, including all 24 abrupt-stop/replay iterations (4,710,396 payload bytes). Receipt: agent-daemon-short-root.log. I will use the job root for the next full iterate run.

The shortened state root fixes the fixture path: `agent_daemon` passes 1/1, including all 24 abrupt-stop/replay iterations (4,710,396 payload bytes). Receipt: [agent-daemon-short-root.log](https://git.kayg.org/attachments/3ad15bdb-e5d3-4b89-9be7-fe6637484817). I will use the job root for the next full iterate run.
Author
Owner

Iterate rerun finding: agent_daemon and all earlier SSH tests passed with the short job root; five cases in recovery_support still failed because their longer absolute socket paths exceeded AF_UNIX sun_path. The tests document that this root must be shorter. I will keep fixture files in this job's scratch directory and expose that directory to the test process through a short inherited file-descriptor path, then rerun the affected test. Receipt: verify-iterate-final.log.

Iterate rerun finding: `agent_daemon` and all earlier SSH tests passed with the short job root; five cases in `recovery_support` still failed because their longer absolute socket paths exceeded AF_UNIX `sun_path`. The tests document that this root must be shorter. I will keep fixture files in this job's scratch directory and expose that directory to the test process through a short inherited file-descriptor path, then rerun the affected test. Receipt: [verify-iterate-final.log](https://git.kayg.org/attachments/105de98d-1612-4551-b30b-c446139dc63b).
Author
Owner

The private-mount test setup resolves the socket-path issue while keeping fixture storage in this job's scratch directory: recovery_support passes 11/11, 1 ignored, with /mnt bound to the job scratch root inside a private mount namespace. Receipt: recovery-support-mount-namespace.log. The next iterate and final fast runs will use this namespace and test root.

The private-mount test setup resolves the socket-path issue while keeping fixture storage in this job's scratch directory: `recovery_support` passes 11/11, 1 ignored, with `/mnt` bound to the job scratch root inside a private mount namespace. Receipt: [recovery-support-mount-namespace.log](https://git.kayg.org/attachments/df2996bf-8e3c-4172-bf6a-363e07a3aedb). The next iterate and final fast runs will use this namespace and test root.
Author
Owner

Perf VM lock wait has exceeded 45 minutes for the typing pair. Current /var/lock/perf-bench.owner content: addhost-readd-r3 root 2026-10-19T06:11:05.590962+00:00. VM load average: 0.00 0.00 0.05. Continuing to wait for the lock.

Perf VM lock wait has exceeded 45 minutes for the typing pair. Current `/var/lock/perf-bench.owner` content: `addhost-readd-r3 root 2026-10-19T06:11:05.590962+00:00`. VM load average: `0.00 0.00 0.05`. Continuing to wait for the lock.
Author
Owner

Correction: the full iterate attempt inside unshare --map-root-user changed the process UID and caused restart tests to fail with permission errors/timeouts. I replaced that setup with a transient user-systemd service using BindPaths to expose this job's scratch directory at /mnt, preserving the normal UID. Under that setup, recovery_support passes 11/11 (1 ignored) and the restart ownership test passes 1/1. I will rerun the full iterate gate and final fast gate through the same service wrapper. Receipts: failed namespace gate, recovery support, restart test.

Correction: the full iterate attempt inside `unshare --map-root-user` changed the process UID and caused restart tests to fail with permission errors/timeouts. I replaced that setup with a transient user-systemd service using `BindPaths` to expose this job's scratch directory at `/mnt`, preserving the normal UID. Under that setup, `recovery_support` passes 11/11 (1 ignored) and the restart ownership test passes 1/1. I will rerun the full iterate gate and final fast gate through the same service wrapper. Receipts: [failed namespace gate](https://git.kayg.org/attachments/1121718d-0e83-459a-a6b9-e69870c1afc2), [recovery support](https://git.kayg.org/attachments/f9c42442-fd71-49bd-aea8-cb989eef21ba), [restart test](https://git.kayg.org/attachments/a6939c3e-31ae-4c10-86dc-69dc104f7411).
Author
Owner

Gate setup finding: the short-path systemd scope exposes / as UID 65534, so restart admission tests reject the fixture ancestors by design. The same rootless replacement test passes on the host (1/1, 6.60s). The diagnostic service receipt confirms the mapped root; I am switching to an in-checkout relative socket root for the remaining gate run. restart-test-systemd-debug.log

Gate setup finding: the short-path systemd scope exposes `/` as UID 65534, so restart admission tests reject the fixture ancestors by design. The same rootless replacement test passes on the host (1/1, 6.60s). The diagnostic service receipt confirms the mapped root; I am switching to an in-checkout relative socket root for the remaining gate run. [restart-test-systemd-debug.log](https://git.kayg.org/attachments/edebf7f1-e479-4baa-8122-84b75df00d75)
Author
Owner

The AF_UNIX fixture path exceeded sun_path with the job scratch root. recovery_support now accepts a short socket-fixture root independently of the private state root; both roots remain inside this checkout/job scratch. Target suite: 11 passed, 1 ignored, 2.05s. Current HEAD: 1951ed63187e5e84283cd320607651dd275ff9e6. recovery-support-split-root.log

The AF_UNIX fixture path exceeded `sun_path` with the job scratch root. `recovery_support` now accepts a short socket-fixture root independently of the private state root; both roots remain inside this checkout/job scratch. Target suite: 11 passed, 1 ignored, 2.05s. Current HEAD: `1951ed63187e5e84283cd320607651dd275ff9e6`. [recovery-support-split-root.log](https://git.kayg.org/attachments/2fb55941-eee8-4ae5-8b05-6ec512c8c9bd)
Author
Owner

The latest iterate run reached previous_attempt_shell and failed because the invocation used INFRATERNALE_TEST_RUNTIME_HELPER; the test expects INFRATERNAL_TEST_RUNTIME_HELPER. I also found the SSH recovery fixture’s state-root spelling had the same extra E; it now follows the shared variable name. Restart unit tests passed (99/0/1 ignored), and agent_daemon passed (24 stop/replay cycles). I will rerun iterate with corrected names. Receipt: verify-iterate-short-socket-root.log.

The latest iterate run reached `previous_attempt_shell` and failed because the invocation used `INFRATERNALE_TEST_RUNTIME_HELPER`; the test expects `INFRATERNAL_TEST_RUNTIME_HELPER`. I also found the SSH recovery fixture’s state-root spelling had the same extra `E`; it now follows the shared variable name. Restart unit tests passed (99/0/1 ignored), and `agent_daemon` passed (24 stop/replay cycles). I will rerun iterate with corrected names. Receipt: [verify-iterate-short-socket-root.log](https://git.kayg.org/attachments/6c52d303-c079-4aa3-9ea4-14d75c39c233).
Author
Owner

Correction: the failed iterate invocation used the same extra E in all three configured test variables, so it did not apply the job state root, short socket root, or runtime helper path. The recovery_support fixture now uses the shared INFRATERNAL_TEST_* spelling, and its target passes with the intended split roots (11 passed, 1 ignored, 2.35s). Rerunning iterate with the corrected variables.

Correction: the failed iterate invocation used the same extra `E` in all three configured test variables, so it did not apply the job state root, short socket root, or runtime helper path. The `recovery_support` fixture now uses the shared `INFRATERNAL_TEST_*` spelling, and its target passes with the intended split roots (11 passed, 1 ignored, 2.35s). Rerunning iterate with the corrected variables.
Author
Owner

D307 query-reply work completed at 23723c0c836dd63e3415d478a56e4d87c9ce8e14. Atomically pushed origin/query-replies-d307 and fast-forwarded origin/query-replies to that head. No deployment.

The finish record on #160 contains the full verbatim green scripts/verify fast output, exact fixture environment/reproducer, nine passing browser specs, real static-shim PTY proof with three viewers and 10,000 unknown marked replies, strict codec/parser review, perf VM receipts, size deltas and cleanup proof. No failed gate row was waived. Earlier harness setup failures and their passing results are retained there.

Native static x86 −2,176 bytes; ARM ceiling −11,912; final critical JS gzip +1,000 / Brotli +782 bytes, all budgets pass. Typing budgets pass, with paired local echo p99 +0.08–0.11 ms disclosed rather than claiming identical latency. Separate complete first-run browser sign-in/reconnect budget failures are explicitly recorded on #160. Issues remain open.

D307 query-reply work completed at [23723c0c836dd63e3415d478a56e4d87c9ce8e14](https://git.kayg.org/kayg/infraternal/commit/23723c0c836dd63e3415d478a56e4d87c9ce8e14). Atomically pushed origin/query-replies-d307 and fast-forwarded origin/query-replies to that head. No deployment. The [finish record on #160](https://git.kayg.org/kayg/infraternal/issues/160) contains the full verbatim green scripts/verify fast output, exact fixture environment/reproducer, nine passing browser specs, real static-shim PTY proof with three viewers and 10,000 unknown marked replies, strict codec/parser review, perf VM receipts, size deltas and cleanup proof. No failed gate row was waived. Earlier harness setup failures and their passing results are retained there. Native static x86 −2,176 bytes; ARM ceiling −11,912; final critical JS gzip +1,000 / Brotli +782 bytes, all budgets pass. Typing budgets pass, with paired local echo p99 +0.08–0.11 ms disclosed rather than claiming identical latency. Separate complete first-run browser sign-in/reconnect budget failures are explicitly recorded on #160. Issues remain open.
Author
Owner

Corrected scripts/verify iterate passed: fmt, VT fmt, plugin compile-out, clippy, workspace tests, cargo-deny, transfer checks, and TypeScript tests (37 pass; stream differential 134 streams / 11,439 schedules / zero divergences). Current bundle vs base: critical gzip 301,453/307,200 (+1,266) and Brotli 251,160/256,000 (+1,109); deferred 49,087/51,200 (+16), 43,480/45,056 (+36); on-demand total 87,472 gzip / 78,030 Brotli, largest chunk 15,097 / 13,454. Current HEAD 1951ed63187e5e84283cd320607651dd275ff9e6. Receipt: verify-iterate-final-correct-env.log.

Corrected `scripts/verify iterate` passed: fmt, VT fmt, plugin compile-out, clippy, workspace tests, cargo-deny, transfer checks, and TypeScript tests (37 pass; stream differential 134 streams / 11,439 schedules / zero divergences). Current bundle vs base: critical gzip 301,453/307,200 (+1,266) and Brotli 251,160/256,000 (+1,109); deferred 49,087/51,200 (+16), 43,480/45,056 (+36); on-demand total 87,472 gzip / 78,030 Brotli, largest chunk 15,097 / 13,454. Current HEAD `1951ed63187e5e84283cd320607651dd275ff9e6`. Receipt: [verify-iterate-final-correct-env.log](https://git.kayg.org/attachments/9598e060-1e85-4810-a9a6-c099c11f4417).
Author
Owner

Correction to my previous note: the repository’s original INFRATERNAL_TEST_STATE_ROOT spelling was already correct. I introduced the extra E in the new socket-root fallback and in several runner invocations; both are now corrected. The successful iterate used the shared spelling.

Correction to my previous note: the repository’s original `INFRATERNAL_TEST_STATE_ROOT` spelling was already correct. I introduced the extra `E` in the new socket-root fallback and in several runner invocations; both are now corrected. The successful iterate used the shared spelling.
Author
Owner

Committed the socket-only test root as 3db72a9f3466a8d8bc9d12101167cffc2d764dee. recovery_support: 11 passed, 1 ignored (2.35s). The corrected scripts/verify iterate also passed, including workspace clippy and tests. Receipts: target suite, iterate gate.

Committed the socket-only test root as `3db72a9f3466a8d8bc9d12101167cffc2d764dee`. `recovery_support`: 11 passed, 1 ignored (2.35s). The corrected `scripts/verify iterate` also passed, including workspace clippy and tests. Receipts: [target suite](https://git.kayg.org/attachments/42422763-478e-46e8-854e-835683d4f873), [iterate gate](https://git.kayg.org/attachments/2514eb58-b50f-4099-8b67-89755873b6ee).
Author
Owner

Committed exhaustive split-boundary property coverage as 763c133392b8726d72edbc15aed3e8edc3430b99. bun test src/synchronized-output.test.ts: 6 passed, 0 failed, 1,281 assertions. It also passed in the corrected iterate run: gate receipt.

Committed exhaustive split-boundary property coverage as `763c133392b8726d72edbc15aed3e8edc3430b99`. `bun test src/synchronized-output.test.ts`: 6 passed, 0 failed, 1,281 assertions. It also passed in the corrected iterate run: [gate receipt](https://git.kayg.org/attachments/2514eb58-b50f-4099-8b67-89755873b6ee).
Author
Owner

Committed browser coverage and its test-server route as b2837b9a711c24b238a0bd1401aafdb5ff5bd9a2. The perf-VM spec passed 1/1: three separate Output frames remained off-canvas with no render-pass increase until reset; the missing-reset hold released at 304.0 ms including harness overhead (application cap: 150 ms). Load average was 2.96/2.87/1.78 before and 2.51/2.78/1.76 after. Receipts: Playwright run, before frame, completed frame.

Committed browser coverage and its test-server route as `b2837b9a711c24b238a0bd1401aafdb5ff5bd9a2`. The perf-VM spec passed 1/1: three separate Output frames remained off-canvas with no render-pass increase until reset; the missing-reset hold released at 304.0 ms including harness overhead (application cap: 150 ms). Load average was 2.96/2.87/1.78 before and 2.51/2.78/1.76 after. Receipts: [Playwright run](https://git.kayg.org/attachments/ec50ae09-9027-4d2f-a058-2ebd33a45f8c), [before frame](https://git.kayg.org/attachments/08b090c6-4474-4dac-9bcf-5b7a130c5cee), [completed frame](https://git.kayg.org/attachments/4d915d2e-d6f6-45d2-8c58-7fc3a57f612e).
Author
Owner

Typing latency pair still awaits the perf-VM lock after 45 minutes. /var/lock/perf-bench.owner: addhost-readd-r3 root 2026-10-19T06:43:13.006686+00:00. VM load: 0.04 0.03 0.00. I will keep waiting and run the prepared before/after pair as soon as the lock is released.

Typing latency pair still awaits the perf-VM lock after 45 minutes. `/var/lock/perf-bench.owner`: `addhost-readd-r3 root 2026-10-19T06:43:13.006686+00:00`. VM load: `0.04 0.03 0.00`. I will keep waiting and run the prepared before/after pair as soon as the lock is released.
Author
Owner

Committed the TerminalClient paint hold and bounded batch drain as 5efb7fe496319367310572c55d637d69a3fd9754. The 150 ms hold blocks terminal and cursor rendering until reset or timeout; the corrected iterate gate passed with workspace clippy/tests and the tracer TypeScript checks. Latest D188 transfer measurement: critical 301,453 gzip / 251,160 Brotli (budgets 307,200 / 256,000); deferred 49,087 / 43,480 (budgets 51,200 / 45,056); largest on-demand chunk 15,097 / 13,454 (budgets 20,480 / 18,432). Gate receipt.

Committed the TerminalClient paint hold and bounded batch drain as `5efb7fe496319367310572c55d637d69a3fd9754`. The 150 ms hold blocks terminal and cursor rendering until reset or timeout; the corrected iterate gate passed with workspace clippy/tests and the tracer TypeScript checks. Latest D188 transfer measurement: critical 301,453 gzip / 251,160 Brotli (budgets 307,200 / 256,000); deferred 49,087 / 43,480 (budgets 51,200 / 45,056); largest on-demand chunk 15,097 / 13,454 (budgets 20,480 / 18,432). [Gate receipt](https://git.kayg.org/attachments/2514eb58-b50f-4099-8b67-89755873b6ee).
Author
Owner

Restarted #206 items 6 and 8 on branch term-env-sync, worktree .worktrees/term-env-sync, continuing at local HEAD b2837b9a711c24b238a0bd1401aafdb5ff5bd9a2. Current fetched origin/dev is e2f1c646e0d7d0b06ae742cd9aed6cdb7943f592; the branch is 27 commits behind and I will merge this base before final gates. Reviewed the issue history; it records no parent issue.

Restarted #206 items 6 and 8 on branch `term-env-sync`, worktree `.worktrees/term-env-sync`, continuing at local HEAD `b2837b9a711c24b238a0bd1401aafdb5ff5bd9a2`. Current fetched `origin/dev` is `e2f1c646e0d7d0b06ae742cd9aed6cdb7943f592`; the branch is 27 commits behind and I will merge this base before final gates. Reviewed the issue history; it records no parent issue.
Author
Owner

Merged current origin/dev into the lane as 632ce5f664f99cd4e9345b32d2bb60e7d14a0160 (base e2f1c646). The merge auto-composed the shared apps/tracer/src/terminal.ts changes with the mode-2026 paint hold; no conflicts. Upstream also adds the current focus-intent and connection-liveness work. I’m reviewing the combined terminal path before running the gates.

Merged current `origin/dev` into the lane as `632ce5f664f99cd4e9345b32d2bb60e7d14a0160` (base `e2f1c646`). The merge auto-composed the shared `apps/tracer/src/terminal.ts` changes with the mode-2026 paint hold; no conflicts. Upstream also adds the current focus-intent and connection-liveness work. I’m reviewing the combined terminal path before running the gates.
Author
Owner

Perf VM lock remains held after more than 45 minutes: /var/lock/perf-bench.owner is addhost-readd-r3 root 2026-10-19T06:43:13.006686+00:00; systemctl --user is-active codex-addhost-readd-r3 reports inactive; VM load is 0.03 0.03 0.00. I have not changed or removed the shared lock and will continue waiting for the orchestrator to clear it before measurements.

Perf VM lock remains held after more than 45 minutes: `/var/lock/perf-bench.owner` is `addhost-readd-r3 root 2026-10-19T06:43:13.006686+00:00`; `systemctl --user is-active codex-addhost-readd-r3` reports `inactive`; VM load is `0.03 0.03 0.00`. I have not changed or removed the shared lock and will continue waiting for the orchestrator to clear it before measurements.
Author
Owner

Rechecked the committed synchronized-output scanner on merged HEAD 632ce5f664f99cd4e9345b32d2bb60e7d14a0160: bun test src/synchronized-output.test.ts passes 6/6 tests and 1,281 assertions, including every pair of input chunk boundaries, control-string exclusions, RIS reset, CSI bound and timeout release. The integrated gate remains queued for a build slot.

Rechecked the committed synchronized-output scanner on merged HEAD `632ce5f664f99cd4e9345b32d2bb60e7d14a0160`: `bun test src/synchronized-output.test.ts` passes 6/6 tests and 1,281 assertions, including every pair of input chunk boundaries, control-string exclusions, RIS reset, CSI bound and timeout release. The integrated gate remains queued for a build slot.
Author
Owner

The merged tracer TypeScript check passes at HEAD 632ce5f664f99cd4e9345b32d2bb60e7d14a0160: bun run check exits 0 (bun x tsc --project tsconfig.json). The shared build-slot wrapper is still waiting; the full iterate gate will repeat this check along with bundle and Rust gates.

The merged tracer TypeScript check passes at HEAD `632ce5f664f99cd4e9345b32d2bb60e7d14a0160`: `bun run check` exits 0 (`bun x tsc --project tsconfig.json`). The shared build-slot wrapper is still waiting; the full iterate gate will repeat this check along with bundle and Rust gates.
Author
Owner

The first integrated scripts/verify iterate failed only in previous_attempt_shell: 32 setup errors show that the test did not receive INFRATERNAL_TEST_RUNTIME_HELPER (KeyError at previous_attempt_shell.py:25). I misspelled the three fixture variables by omitting the final L, so the intended state root, short socket root and helper path were not applied. This was a test invocation error; no product test ran in that fixture. The host-load-sensitive repeated_tiny_credit_pauses_preserve_shell_progress passed. I’m correcting the variable names, checking the fixture alone, then rerunning iterate.

The first integrated `scripts/verify iterate` failed only in `previous_attempt_shell`: 32 setup errors show that the test did not receive `INFRATERNAL_TEST_RUNTIME_HELPER` (`KeyError` at `previous_attempt_shell.py:25`). I misspelled the three fixture variables by omitting the final `L`, so the intended state root, short socket root and helper path were not applied. This was a test invocation error; no product test ran in that fixture. The host-load-sensitive `repeated_tiny_credit_pauses_preserve_shell_progress` passed. I’m correcting the variable names, checking the fixture alone, then rerunning iterate.
Author
Owner

Corrected the fixture environment and isolated the failing test: cargo test --locked -p infraternal-plugin-ssh --test previous_attempt_shell passes 1/1 in 6.14 s. It resolves the prior gate failure as an omitted L in my runner environment, not a product regression. Rerunning the full iterate gate with INFRATERNAL_TEST_STATE_ROOT, INFRATERNAL_TEST_SOCKET_ROOT, and INFRATERNAL_TEST_RUNTIME_HELPER set correctly.

Corrected the fixture environment and isolated the failing test: `cargo test --locked -p infraternal-plugin-ssh --test previous_attempt_shell` passes 1/1 in 6.14 s. It resolves the prior gate failure as an omitted `L` in my runner environment, not a product regression. Rerunning the full iterate gate with `INFRATERNAL_TEST_STATE_ROOT`, `INFRATERNAL_TEST_SOCKET_ROOT`, and `INFRATERNAL_TEST_RUNTIME_HELPER` set correctly.
Author
Owner

The second iterate run passed previous_attempt_shell, but recovery_support failed 3/12 cases: I supplied the short socket root as relative t; those fixtures change the child working directory before binding, so Python reported FileNotFoundError at recovery_support.rs:331. Eight cases passed and one was ignored. I’m rerunning this suite with a short absolute /proc/<runner-pid>/fd/9 path backed by this job’s scratch directory; no product code changed.

The second iterate run passed `previous_attempt_shell`, but `recovery_support` failed 3/12 cases: I supplied the short socket root as relative `t`; those fixtures change the child working directory before binding, so Python reported `FileNotFoundError` at `recovery_support.rs:331`. Eight cases passed and one was ignored. I’m rerunning this suite with a short absolute `/proc/<runner-pid>/fd/9` path backed by this job’s scratch directory; no product code changed.
Author
Owner

The short absolute socket alias backed by this job’s scratch directory resolves the test harness issue: recovery_support passes 11/11 with 1 ignored in 4.01 s. I’ll use /proc/<runner-pid>/fd/9 for the full iterate run so child fixtures keep an absolute path after changing directories.

The short absolute socket alias backed by this job’s scratch directory resolves the test harness issue: `recovery_support` passes 11/11 with 1 ignored in 4.01 s. I’ll use `/proc/<runner-pid>/fd/9` for the full iterate run so child fixtures keep an absolute path after changing directories.
Author
Owner

Corrected branch-head scripts/verify iterate passed at 632ce5f664f99cd4e9345b32d2bb60e7d14a0160.

  • Rust workspace suites passed, including infraternal (99 passed, 1 ignored), agent_daemon (24 passed), and the SSH integration suites (previous_attempt_shell 1 passed; recovery_support 11 passed, 1 ignored).
  • Tracer tests: 321 passed, 0 failed, 13,156 assertions. Mesh client tests: 37 passed, 0 failed, 34,463 assertions. Stream differential: 134 streams, 11,439 schedules, zero divergences.
  • D188 production transfer budgets pass. Current branch: critical JS gzip 301,928/307,200 B, Brotli 251,553/256,000 B; deferred gzip 49,083/51,200 B, Brotli 43,488/45,056 B; largest on-demand chunk gzip 15,101/20,480 B, Brotli 13,457/18,432 B. Relative to the pre-change receipt (critical 300,187/250,051 B; deferred 49,071/43,444 B; largest on-demand 15,097/13,462 B), deltas are +1,741/+1,502 B; +12/+44 B; +4/−5 B.

Gate output:

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

origin/dev advanced by one decisions-only commit during this run; I will merge it before the final branch-head gates.

Corrected branch-head `scripts/verify iterate` passed at `632ce5f664f99cd4e9345b32d2bb60e7d14a0160`. - Rust workspace suites passed, including `infraternal` (99 passed, 1 ignored), `agent_daemon` (24 passed), and the SSH integration suites (`previous_attempt_shell` 1 passed; `recovery_support` 11 passed, 1 ignored). - Tracer tests: 321 passed, 0 failed, 13,156 assertions. Mesh client tests: 37 passed, 0 failed, 34,463 assertions. Stream differential: 134 streams, 11,439 schedules, zero divergences. - D188 production transfer budgets pass. Current branch: critical JS gzip 301,928/307,200 B, Brotli 251,553/256,000 B; deferred gzip 49,083/51,200 B, Brotli 43,488/45,056 B; largest on-demand chunk gzip 15,101/20,480 B, Brotli 13,457/18,432 B. Relative to the pre-change receipt (critical 300,187/250,051 B; deferred 49,071/43,444 B; largest on-demand 15,097/13,462 B), deltas are +1,741/+1,502 B; +12/+44 B; +4/−5 B. Gate output: ``` ITERATE gate passed. This is not the final gate: run scripts/verify fast before reporting done. ``` `origin/dev` advanced by one decisions-only commit during this run; I will merge it before the final branch-head gates.
Author
Owner

Merged the current origin/dev tip (4356e7989) into term-env-sync; merge commit: 5ebc67dc7187d3bc082fa24f9663092a46bea912. This was D309 decisions only (DECISIONS.md); no source code or generated assets changed. The preceding scripts/verify iterate remains green, with branch bundle sizes recorded in the previous update. Final branch-head scripts/verify fast, browser timing and binary-size comparisons are next.

Merged the current `origin/dev` tip (`4356e7989`) into `term-env-sync`; merge commit: `5ebc67dc7187d3bc082fa24f9663092a46bea912`. This was D309 decisions only (`DECISIONS.md`); no source code or generated assets changed. The preceding `scripts/verify iterate` remains green, with branch bundle sizes recorded in the previous update. Final branch-head `scripts/verify fast`, browser timing and binary-size comparisons are next.
Author
Owner

Perf-VM browser finding (port 4266, RTT 0, load 0.00/0.06/0.16): the split-frame spec failed once after 68.1 ms with mode 2026 held. renderPasses was 69 versus 61 before sending the batch; the next canvas-pixel assertion was not reached. A preceding run of the same spec passed, so this is not yet classified as a product failure or test-only race. I’m tracing the counter and output sequence before rerunning. Evidence: run log, Playwright error context.

Perf-VM browser finding (port 4266, RTT 0, load 0.00/0.06/0.16): the split-frame spec failed once after 68.1 ms with mode 2026 held. `renderPasses` was 69 versus 61 before sending the batch; the next canvas-pixel assertion was not reached. A preceding run of the same spec passed, so this is not yet classified as a product failure or test-only race. I’m tracing the counter and output sequence before rerunning. Evidence: [run log](https://git.kayg.org/attachments/91e635f9-22d8-4d5a-95e5-a2052cfc2345), [Playwright error context](https://git.kayg.org/attachments/09ba390d-275f-4e55-8522-292f00eb24f8).
Author
Owner

Root cause confirmed for the flaky assertion: the spec compares the render counter with a value captured before the opening Output frame reaches the browser. On a 90 ms diagnostic sample, renderPasses stayed at 61 from the first held sample (10.9 ms, received sequence 34) through the last held sample (94.1 ms, received sequence 58); outputSequence stayed at 10 and the canvas hash remained unchanged. A second trace had 68 passes from its first held sample at 14.1 ms through 147.6 ms, also unchanged throughout the hold. Thus the 61→69 test failure counts redraws before the first observed hold; it does not show a paint during mode 2026. The 90 ms diagnostic passed and the missing-reset timeout released in 300.2 ms. I’ll change the spec to compare render passes within the held interval, then rerun the production browser gate.

Evidence: 90 ms diagnostic log, longer trace showing stable 68 passes until timeout, canvas before the frame, canvas after release.

Root cause confirmed for the flaky assertion: the spec compares the render counter with a value captured before the opening Output frame reaches the browser. On a 90 ms diagnostic sample, `renderPasses` stayed at 61 from the first held sample (10.9 ms, received sequence 34) through the last held sample (94.1 ms, received sequence 58); `outputSequence` stayed at 10 and the canvas hash remained unchanged. A second trace had 68 passes from its first held sample at 14.1 ms through 147.6 ms, also unchanged throughout the hold. Thus the 61→69 test failure counts redraws before the first observed hold; it does not show a paint during mode 2026. The 90 ms diagnostic passed and the missing-reset timeout released in 300.2 ms. I’ll change the spec to compare render passes within the held interval, then rerun the production browser gate. Evidence: [90 ms diagnostic log](https://git.kayg.org/attachments/07f3e2df-75fb-4b65-83df-3a531f4ef040), [longer trace showing stable 68 passes until timeout](https://git.kayg.org/attachments/1a940b1f-3ef2-48a3-ad7d-691303df9684), [canvas before the frame](https://git.kayg.org/attachments/13fd23ea-9de2-4ad7-b220-159111b3f018), [canvas after release](https://git.kayg.org/attachments/064a84d0-492d-416b-b964-a9d7e5d7bb18).
Author
Owner

The spec now samples the renderer only after mode 2026 is observed and checks four animation frames while held. Production browser rerun passed on infraternal-perf-test, port 4266, RTT 0: 3 Output frames, 4 held samples across 133.5 ms, mode held throughout, output sequence unchanged, canvas pixels unchanged; missing-reset release was 427.4 ms (under the 500 ms browser assertion). Playwright: 1 passed in 5.9 s. Load average was 0.01/0.05/0.11 before and 0.09/0.06/0.12 after. Screenshots and log: run log, before frame, complete frame. The branch and merge-base stripped static x86_64 binaries both measured 21,225,872 bytes with the same recipe (preliminary delta 0 B); final fast-gate size check remains.

The spec now samples the renderer only after mode 2026 is observed and checks four animation frames while held. Production browser rerun passed on infraternal-perf-test, port 4266, RTT 0: 3 Output frames, 4 held samples across 133.5 ms, mode held throughout, output sequence unchanged, canvas pixels unchanged; missing-reset release was 427.4 ms (under the 500 ms browser assertion). Playwright: 1 passed in 5.9 s. Load average was 0.01/0.05/0.11 before and 0.09/0.06/0.12 after. Screenshots and log: [run log](https://git.kayg.org/attachments/3fe19407-5a20-4a34-9ad8-8aa07aa5879a), [before frame](https://git.kayg.org/attachments/72766600-2953-418e-b894-ae2ac2497b31), [complete frame](https://git.kayg.org/attachments/18eef336-7e89-488f-95ca-edfd50af6df1). The branch and merge-base stripped static x86_64 binaries both measured 21,225,872 bytes with the same recipe (preliminary delta 0 B); final fast-gate size check remains.
Author
Owner

Perf-VM normal-typing comparison, 300 ms RTT, 20 keys per run, same port 4266 and production typing harness. Prediction p99: 14.1→14.1 ms in pair 1 and 14.2→14.1 ms in pair 2. Confirmed echo p50: 313.9→313.9 ms and 313.9→313.5 ms. Confirmed echo p99: 316.2→321.0 ms and 315.3→320.7 ms (+4.8/+5.4 ms); I’m retaining this small tail spread in the record. Before/after load averages were 0.01/0.04/0.09 → 0.15/0.06/0.10 and 0.29/0.11/0.11 → 0.25/0.11/0.11. Every run painted 20/20 echoes and passed.

Receipts: before 1, after 1, before 2, after 2.

Perf-VM normal-typing comparison, 300 ms RTT, 20 keys per run, same port 4266 and production typing harness. Prediction p99: 14.1→14.1 ms in pair 1 and 14.2→14.1 ms in pair 2. Confirmed echo p50: 313.9→313.9 ms and 313.9→313.5 ms. Confirmed echo p99: 316.2→321.0 ms and 315.3→320.7 ms (+4.8/+5.4 ms); I’m retaining this small tail spread in the record. Before/after load averages were 0.01/0.04/0.09 → 0.15/0.06/0.10 and 0.29/0.11/0.11 → 0.25/0.11/0.11. Every run painted 20/20 echoes and passed. Receipts: [before 1](https://git.kayg.org/attachments/903c9983-74bb-466e-ace5-836be1a0a64e), [after 1](https://git.kayg.org/attachments/cd3d2616-90c0-4ade-853b-37ff87658715), [before 2](https://git.kayg.org/attachments/aad1d5cf-c8e5-4bc5-8611-5dbd9cc1786a), [after 2](https://git.kayg.org/attachments/d26daf91-a36e-4d1c-ae23-9a8d97d9a9fc).
Author
Owner

Committed the synchronized-output spec correction: 278ec65bbc235c160ecdd961f7c362201551245d. It compares renderer passes only after the browser observes mode 2026, samples four held animation frames, and checks the sequence and pixels stay unchanged. bun run check passed; src/synchronized-output.test.ts passed 6/6 with 1,281 assertions. The production Playwright run passed 1/1 on the perf VM (three Output frames, four held samples over 133.5 ms, timeout release 427.4 ms); screenshots and browser logs are in the prior update. TypeScript and unit-test receipt.

Committed the synchronized-output spec correction: `278ec65bbc235c160ecdd961f7c362201551245d`. It compares renderer passes only after the browser observes mode 2026, samples four held animation frames, and checks the sequence and pixels stay unchanged. `bun run check` passed; `src/synchronized-output.test.ts` passed 6/6 with 1,281 assertions. The production Playwright run passed 1/1 on the perf VM (three Output frames, four held samples over 133.5 ms, timeout release 427.4 ms); screenshots and browser logs are in the prior update. [TypeScript and unit-test receipt](https://git.kayg.org/attachments/2db7d97f-da15-4248-92a5-98b8f40193d7).
Author
Owner

Base provenance correction: the current merge base is 149793e5abb8aa27e563e1a326252073f6498632 (D310). It is already the second parent of merge commit 5ebc67dc7, so no additional merge was needed (git merge origin/dev reported already up to date). D310 adds only 14 lines to DECISIONS.md; the measured static baseline at its parent 4356e7989 has identical source/build inputs. The branch binary measured 21,225,872 bytes and the baseline binary measured 21,225,872 bytes with the same static recipe.

Base provenance correction: the current merge base is `149793e5abb8aa27e563e1a326252073f6498632` (D310). It is already the second parent of merge commit `5ebc67dc7`, so no additional merge was needed (`git merge origin/dev` reported already up to date). D310 adds only 14 lines to `DECISIONS.md`; the measured static baseline at its parent `4356e7989` has identical source/build inputs. The branch binary measured 21,225,872 bytes and the baseline binary measured 21,225,872 bytes with the same static recipe.
Author
Owner

Finding in the final scripts/verify fast: the infraternal-server test executable reported 562 passed, 1 failed, 52 ignored. The failure is auth::tests::socket_tests::review_subscription_refusal::oversized_refusal_cannot_reinstall_a_queued_mesh_subscription, panicking at crates/infraternal-server/src/auth/socket_tests/review_subscription_refusal.rs:48 with PoolTimedOut while opening its SQLite pool. The test is not one of the designated baseline-waiver timeout rows, so I will rerun it alone on the branch and diagnose any repeat. Failure excerpt.

Finding in the final `scripts/verify fast`: the `infraternal-server` test executable reported 562 passed, 1 failed, 52 ignored. The failure is `auth::tests::socket_tests::review_subscription_refusal::oversized_refusal_cannot_reinstall_a_queued_mesh_subscription`, panicking at `crates/infraternal-server/src/auth/socket_tests/review_subscription_refusal.rs:48` with `PoolTimedOut` while opening its SQLite pool. The test is not one of the designated baseline-waiver timeout rows, so I will rerun it alone on the branch and diagnose any repeat. [Failure excerpt](https://git.kayg.org/attachments/a087c9a8-5f66-42d0-9e84-f432c9a557e8).
Author
Owner

Fast gate completed at 278ec65bbc235c160ecdd961f7c362201551245d but failed two checks. The server test oversized_refusal_cannot_reinstall_a_queued_mesh_subscription timed out opening its SQLite pool at fixture line 48, before its test body; 562 passed, 1 failed, 52 ignored. Static x86_64 size is 21,225,872 bytes (cap pass); aarch64 is 19,427,816 bytes against 19,427,688 (+128 bytes), causing the static-size fixture check to fail. Full receipt: verify-fast-final.log. I will compare the aarch64 result to current origin/dev, then isolate the pool test and rerun the gate after resolving any branch-caused failure.

Fast gate completed at `278ec65bbc235c160ecdd961f7c362201551245d` but failed two checks. The server test `oversized_refusal_cannot_reinstall_a_queued_mesh_subscription` timed out opening its SQLite pool at fixture line 48, before its test body; 562 passed, 1 failed, 52 ignored. Static x86_64 size is 21,225,872 bytes (cap pass); aarch64 is 19,427,816 bytes against 19,427,688 (+128 bytes), causing the static-size fixture check to fail. Full receipt: [verify-fast-final.log](https://git.kayg.org/attachments/402df9e8-db1d-4c5b-a699-404f070acbdd). I will compare the aarch64 result to current `origin/dev`, then isolate the pool test and rerun the gate after resolving any branch-caused failure.
Author
Owner

Size attribution is confirmed: rebuilding 4356e798 (code identical to origin/dev; only DECISIONS.md differs from merge-base 149793e5) produced a stripped static aarch64 binary of 19,427,688 bytes, exactly at cap; the branch gate produced 19,427,816 bytes (+128). Baseline build receipt. I consolidated the fixed PTY environment entries into one OsStr iterator to share Command::env code, preserving HOME/USER/LOGNAME/SHELL/TERM/COLORTERM/PATH values. cargo fmt --all -- --check and git diff --check pass. I am measuring the branch artifact and running its shell environment test next.

Size attribution is confirmed: rebuilding `4356e798` (code identical to `origin/dev`; only DECISIONS.md differs from merge-base `149793e5`) produced a stripped static aarch64 binary of 19,427,688 bytes, exactly at cap; the branch gate produced 19,427,816 bytes (+128). [Baseline build receipt](https://git.kayg.org/attachments/304110df-040c-4e16-8bc1-54da85a8fc65). I consolidated the fixed PTY environment entries into one `OsStr` iterator to share `Command::env` code, preserving HOME/USER/LOGNAME/SHELL/TERM/COLORTERM/PATH values. `cargo fmt --all -- --check` and `git diff --check` pass. I am measuring the branch artifact and running its shell environment test next.
Author
Owner

The shell environment test passes with the compact PTY environment builder: 1 passed, 0 failed; the shell observed COLORTERM=truecolor. The pool-timeout test from the full gate also passes in isolation (1.49 s, 1 passed, 365 filtered); its earlier failure was at SQLite fixture pool connection, before the test body. Receipts: shim-env-test.log, pool-test-rerun.log. I will rerun scripts/verify fast at the final head after the aarch64 size check and atomic commit.

The shell environment test passes with the compact PTY environment builder: 1 passed, 0 failed; the shell observed `COLORTERM=truecolor`. The pool-timeout test from the full gate also passes in isolation (1.49 s, 1 passed, 365 filtered); its earlier failure was at SQLite fixture pool connection, before the test body. Receipts: [shim-env-test.log](https://git.kayg.org/attachments/d7f0e7de-33b3-4921-8f0e-d2f3f304c81b), [pool-test-rerun.log](https://git.kayg.org/attachments/fb52c009-4278-42cb-b5a0-90178d752c0e). I will rerun `scripts/verify fast` at the final head after the aarch64 size check and atomic commit.
Author
Owner

The final PTY environment candidate fits the aarch64 static cap: 19,427,432 bytes versus 19,427,688 (256 bytes under cap), compared with the pre-optimization branch's 19,427,816 bytes. It reuses a borrowed Path for the readiness /bin/sh path, preserving the shell selection while avoiding PathBuf allocation. The direct TERM/COLORTERM chain and shell-visible test remain intact. cargo fmt --all -- --check, git diff --check, shim clippy (-D warnings), and the PTY shell environment test pass. Receipts: aarch64 build, shell test. The x86_64 static artifact and final fast gate remain to be measured.

The final PTY environment candidate fits the aarch64 static cap: 19,427,432 bytes versus 19,427,688 (256 bytes under cap), compared with the pre-optimization branch's 19,427,816 bytes. It reuses a borrowed `Path` for the readiness `/bin/sh` path, preserving the shell selection while avoiding `PathBuf` allocation. The direct `TERM`/`COLORTERM` chain and shell-visible test remain intact. `cargo fmt --all -- --check`, `git diff --check`, shim clippy (`-D warnings`), and the PTY shell environment test pass. Receipts: [aarch64 build](https://git.kayg.org/attachments/23d3fe17-724e-46a9-94e8-f6e0e62ae2b6), [shell test](https://git.kayg.org/attachments/81ff9c7f-b4c0-4596-b280-caff4183011f). The x86_64 static artifact and final fast gate remain to be measured.
Author
Owner

Both shipping static targets fit without changing D243 caps. Using the same scripts/static-cargo recipe and target directory: x86_64 branch = 21,225,104 bytes vs merge base = 21,225,872 (-768); aarch64 branch = 19,427,432 vs merge-base cap/artifact = 19,427,688 (-256). The PTY shell environment test passes, shim clippy passes with -D warnings, and fmt/diff checks pass. Receipts: x86_64 build, aarch64 build, PTY shell test. I’m committing the borrowed readiness shell path as a size/performance fix; it preserves the selected path while avoiding a PathBuf allocation. The full fast gate remains pending on the final head.

Both shipping static targets fit without changing D243 caps. Using the same `scripts/static-cargo` recipe and target directory: x86_64 branch = 21,225,104 bytes vs merge base = 21,225,872 (-768); aarch64 branch = 19,427,432 vs merge-base cap/artifact = 19,427,688 (-256). The PTY shell environment test passes, shim clippy passes with `-D warnings`, and fmt/diff checks pass. Receipts: [x86_64 build](https://git.kayg.org/attachments/2968c598-f9bf-4f9f-a85c-64275193f0cc), [aarch64 build](https://git.kayg.org/attachments/23d3fe17-724e-46a9-94e8-f6e0e62ae2b6), [PTY shell test](https://git.kayg.org/attachments/81ff9c7f-b4c0-4596-b280-caff4183011f). I’m committing the borrowed readiness shell path as a size/performance fix; it preserves the selected path while avoiding a `PathBuf` allocation. The full fast gate remains pending on the final head.
Author
Owner

Committed 986254154 (Use a borrowed path for the PTY fallback shell). The commit keeps the fixed static size caps and removes the readiness-shell PathBuf allocation. cargo fmt --all -- --check, shim clippy with -D warnings, and the shell environment test pass (1/1). Stripped static sizes: x86_64 21,225,104 bytes (-768 vs merge base); aarch64 19,427,432 bytes (-256). I’m starting the required final scripts/verify fast on this head.

Committed `986254154` (`Use a borrowed path for the PTY fallback shell`). The commit keeps the fixed static size caps and removes the readiness-shell `PathBuf` allocation. `cargo fmt --all -- --check`, shim clippy with `-D warnings`, and the shell environment test pass (1/1). Stripped static sizes: x86_64 21,225,104 bytes (-768 vs merge base); aarch64 19,427,432 bytes (-256). I’m starting the required final `scripts/verify fast` on this head.
Author
Owner

Final-head fast gate at 986254154 passed fmt, VT native fmt, CLI plugin compile-out, clippy, the full Rust workspace test suite, and cargo-deny. The only failed row is static builds: x86_64 now measures 21,225,104 bytes, 768 below the old 21,225,872-byte ceiling, so the fixture correctly requires a ratchet. The separately measured aarch64 artifact is 19,427,432 bytes, 256 below its 19,427,688-byte ceiling; both caps now need to be lowered per D243. Full receipt: verify-fast-head.log.

Final-head fast gate at `986254154` passed fmt, VT native fmt, CLI plugin compile-out, clippy, the full Rust workspace test suite, and cargo-deny. The only failed row is static builds: x86_64 now measures 21,225,104 bytes, 768 below the old 21,225,872-byte ceiling, so the fixture correctly requires a ratchet. The separately measured aarch64 artifact is 19,427,432 bytes, 256 below its 19,427,688-byte ceiling; both caps now need to be lowered per D243. Full receipt: [verify-fast-head.log](https://git.kayg.org/attachments/e40c29ea-178f-4381-8629-ce6eb9e8c4ea).
Author
Owner

Updated the D243 static size ceilings to the measured stripped artifacts: x86_64 21,225,104 bytes and aarch64 19,427,432 bytes. bash -n scripts/verify.d/rust.sh passes. scripts/test-static-size.py passes for each exact cap, rejects cap+1, requires ratchets for smaller artifacts, and rejects unsupported targets. Receipt: static-size-ratchet-test.log. I’m committing this gate-only ratchet before the final fast run.

Updated the D243 static size ceilings to the measured stripped artifacts: x86_64 21,225,104 bytes and aarch64 19,427,432 bytes. `bash -n scripts/verify.d/rust.sh` passes. `scripts/test-static-size.py` passes for each exact cap, rejects cap+1, requires ratchets for smaller artifacts, and rejects unsupported targets. Receipt: [static-size-ratchet-test.log](https://git.kayg.org/attachments/58d4f02a-58b8-43c7-9aab-d6103de505eb). I’m committing this gate-only ratchet before the final fast run.
Author
Owner

Committed b9c7dc68a (Ratchet static size ceilings to the measured PTY artifacts). bash -n scripts/verify.d/rust.sh and scripts/test-static-size.py pass: exact caps pass; each cap+1 is rejected; smaller artifacts require ratcheting; unsupported target is rejected. The full Rust test row passed in the prior final-head run. Starting the required full scripts/verify fast on this head now.

Committed `b9c7dc68a` (`Ratchet static size ceilings to the measured PTY artifacts`). `bash -n scripts/verify.d/rust.sh` and `scripts/test-static-size.py` pass: exact caps pass; each cap+1 is rejected; smaller artifacts require ratcheting; unsupported target is rejected. The full Rust test row passed in the prior final-head run. Starting the required full `scripts/verify fast` on this head now.
Author
Owner

Finished at b9c7dc68a8a7ef075008a5b0a29802014d53a0a5; worktree is clean. scripts/verify fast exited 0. Full transcript: verify-fast-final-head.log.

Final stripped static sizes are 21,225,104 bytes x86_64 and 19,427,432 bytes aarch64, each at its ratcheted D243 ceiling. Compared with merge base, they are -768 and -256 bytes. Boundary checks passed at cap, rejected cap+1, and require ratchets for smaller artifacts.

D188 transfer budgets, pre-change → final: critical gzip/Brotli 300,187/250,051 → 301,925/251,551 (+1,738/+1,500); deferred 49,071/43,444 → 49,093/43,536 (+22/+92); largest on-demand chunk 15,097/13,462 → 15,100/13,457 (+3/-5).

Perf VM typing comparison (300 ms RTT, 20 keys per run, two pairs): predicted glyph p50/p99 was 13.3/14.1 → 13.2/14.1 ms and 13.4/14.2 → 12.6/14.1 ms. Confirmed echo p50/p99 was 313.9/316.2 → 313.9/321.0 ms and 313.9/315.3 → 313.5/320.7 ms. Echo p50 was stable; p99 rose 4.8 and 5.4 ms in the two pairs.

Verbatim final gate output:

PT_INTERP: absent; size: 21225104 bytes; cap: 21225104 bytes; delta: +0 bytes
key memory: x86_64-unknown-linux-musl; memlock=8388608 bytes
Key memory initialization=1; locked pages and dump exclusion enabled
PT_INTERP: absent; size: 19427432 bytes; cap: 19427432 bytes; delta: +0 bytes
key memory: aarch64-unknown-linux-musl runtime not checked (host x86_64; native execution required)
x86_64-unknown-linux-musl: exact 21225104-byte cap PASS; 21225105 bytes rejected PASS; smaller artifact requires ratchet PASS
aarch64-unknown-linux-musl: exact 19427432-byte cap PASS; 19427433 bytes rejected PASS; smaller artifact requires ratchet PASS
unsupported target: rejected PASS

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

321 pass
0 fail
13156 expect() calls

JavaScript transfer, critical: identity=976751 gzip=301925/307200 brotli=251551/256000 bytes
JavaScript transfer, deferred: identity=141054 gzip=49093/51200 brotli=43536/45056 bytes
JavaScript transfer, onDemand: identity=219874 gzip=87487/20480 brotli=78093/18432 bytes
JavaScript transfer, onDemand largest chunk chunk-6wnhfkxp.js: gzip=15100/20480 brotli=13457/18432 bytes (class total gzip=87487 brotli=78093, not limited)
stream differential: 134 streams, 11439 schedules, zero divergences
37 pass
0 fail
34463 expect() calls
Ran 37 tests across 10 files. [4.20s]
Finished at `b9c7dc68a8a7ef075008a5b0a29802014d53a0a5`; worktree is clean. `scripts/verify fast` exited 0. Full transcript: [verify-fast-final-head.log](https://git.kayg.org/attachments/2643e982-0bb3-462c-ba94-d9dedba372b4). Final stripped static sizes are 21,225,104 bytes x86_64 and 19,427,432 bytes aarch64, each at its ratcheted D243 ceiling. Compared with merge base, they are -768 and -256 bytes. Boundary checks passed at cap, rejected cap+1, and require ratchets for smaller artifacts. D188 transfer budgets, pre-change → final: critical gzip/Brotli 300,187/250,051 → 301,925/251,551 (+1,738/+1,500); deferred 49,071/43,444 → 49,093/43,536 (+22/+92); largest on-demand chunk 15,097/13,462 → 15,100/13,457 (+3/-5). Perf VM typing comparison (300 ms RTT, 20 keys per run, two pairs): predicted glyph p50/p99 was 13.3/14.1 → 13.2/14.1 ms and 13.4/14.2 → 12.6/14.1 ms. Confirmed echo p50/p99 was 313.9/316.2 → 313.9/321.0 ms and 313.9/315.3 → 313.5/320.7 ms. Echo p50 was stable; p99 rose 4.8 and 5.4 ms in the two pairs. Verbatim final gate output: ```text PT_INTERP: absent; size: 21225104 bytes; cap: 21225104 bytes; delta: +0 bytes key memory: x86_64-unknown-linux-musl; memlock=8388608 bytes Key memory initialization=1; locked pages and dump exclusion enabled PT_INTERP: absent; size: 19427432 bytes; cap: 19427432 bytes; delta: +0 bytes key memory: aarch64-unknown-linux-musl runtime not checked (host x86_64; native execution required) x86_64-unknown-linux-musl: exact 21225104-byte cap PASS; 21225105 bytes rejected PASS; smaller artifact requires ratchet PASS aarch64-unknown-linux-musl: exact 19427432-byte cap PASS; 19427433 bytes rejected PASS; smaller artifact requires ratchet PASS unsupported target: rejected PASS +---------------------------+--------------+ | Rust gate | Result | +---------------------------+--------------+ | fmt | PASS | | VT native fmt | PASS | | CLI plugin compile-out | PASS | | clippy | PASS | | test | PASS | | cargo-deny | PASS | | static builds | PASS | +---------------------------+--------------+ 321 pass 0 fail 13156 expect() calls JavaScript transfer, critical: identity=976751 gzip=301925/307200 brotli=251551/256000 bytes JavaScript transfer, deferred: identity=141054 gzip=49093/51200 brotli=43536/45056 bytes JavaScript transfer, onDemand: identity=219874 gzip=87487/20480 brotli=78093/18432 bytes JavaScript transfer, onDemand largest chunk chunk-6wnhfkxp.js: gzip=15100/20480 brotli=13457/18432 bytes (class total gzip=87487 brotli=78093, not limited) stream differential: 134 streams, 11439 schedules, zero divergences 37 pass 0 fail 34463 expect() calls Ran 37 tests across 10 files. [4.20s] ```
Author
Owner

Started break-it review #206 on branch review-term-env-sync, reviewing git diff origin/dev...b9c7dc68a. HEAD is b9c7dc68a8a7ef075008a5b0a29802014d53a0a5; merge base with origin/dev is 149793e5abb8aa27e563e1a326252073f6498632. Issue history has no parent issue. I’m checking PTY environment coverage, synchronized-output parser/renderer edge cases, reconnect and multi-window isolation, and the perf-VM typing comparison.

Started break-it review #206 on branch `review-term-env-sync`, reviewing `git diff origin/dev...b9c7dc68a`. HEAD is `b9c7dc68a8a7ef075008a5b0a29802014d53a0a5`; merge base with `origin/dev` is `149793e5abb8aa27e563e1a326252073f6498632`. Issue history has no parent issue. I’m checking PTY environment coverage, synchronized-output parser/renderer edge cases, reconnect and multi-window isolation, and the perf-VM typing comparison.
Author
Owner

Source review: all PTY creation funnels through Pty::spawn_with_readiness, which sets TERM=xterm-256color and COLORTERM=truecolor together (crates/infraternal/src/pty.rs). The six scanner unit tests pass (1,281 assertions), including reset without set and chunk-spanning control sequences. SynchronizedOutput has a 150 ms first-set timer, independent state per TerminalClient, and reset on stream retry/snapshot replacement. handleInput() and PredictiveEcho.input() are not behind the hold. I found no source-level P0/P1; production browser timing and reconnect probes remain in progress.

Source review: all PTY creation funnels through `Pty::spawn_with_readiness`, which sets `TERM=xterm-256color` and `COLORTERM=truecolor` together (`crates/infraternal/src/pty.rs`). The six scanner unit tests pass (1,281 assertions), including reset without set and chunk-spanning control sequences. `SynchronizedOutput` has a 150 ms first-set timer, independent state per `TerminalClient`, and reset on stream retry/snapshot replacement. `handleInput()` and `PredictiveEcho.input()` are not behind the hold. I found no source-level P0/P1; production browser timing and reconnect probes remain in progress.
Author
Owner

Perf VM browser finding (infraternal-perf-test; load before the 5-sample run was 0.08 0.80 1.13): directly measured missing-reset holds were 150.1–156.8 ms; reconnect cleared the hold at 150.2/150.5 ms. The split-frame test received all 3 Output chunks while the canvas stayed unchanged. With RTT 80 ms, the probe confirms host echo was received during the hold; predicted overlay appeared at 9.3–22.3 ms, but host echo was paint-visible 18.2–39.6 ms after release, with 3/5 samples over 34 ms. The existing split-frame spec's 704.6 ms end-to-end assertion begins before the HTTP output request; the direct scanner timer confirms the actual hold deadline. Logs are in $HOME/.cache/codex-scratch/review-term-env-sync/evidence/{browser-probes,direct-hold,direct-hold-repeat,direct-hold-repeat-5}.log; counting actual post-release animation frames is in progress.

Perf VM browser finding (infraternal-perf-test; load before the 5-sample run was 0.08 0.80 1.13): directly measured missing-reset holds were 150.1–156.8 ms; reconnect cleared the hold at 150.2/150.5 ms. The split-frame test received all 3 Output chunks while the canvas stayed unchanged. With RTT 80 ms, the probe confirms host echo was received during the hold; predicted overlay appeared at 9.3–22.3 ms, but host echo was paint-visible 18.2–39.6 ms after release, with 3/5 samples over 34 ms. The existing split-frame spec's 704.6 ms end-to-end assertion begins before the HTTP output request; the direct scanner timer confirms the actual hold deadline. Logs are in `$HOME/.cache/codex-scratch/review-term-env-sync/evidence/{browser-probes,direct-hold,direct-hold-repeat,direct-hold-repeat-5}.log`; counting actual post-release animation frames is in progress.
Author
Owner

Follow-up to the held-echo finding: the prior 18.2–39.6 ms values observed when outputSequence became visible could include an extra RAF polling interval. I enabled the existing PerformanceProbe onPaintedOutput callback, timestamped after the renderer callback. A production-bundle sample on infraternal-perf-test (load before 0.67 0.85 1.10, measured RTT 82.1 ms) held for 152.3 ms and painted the host echo at +27.7 ms after release. That exceeds one 60 Hz frame (~16.7 ms); I’m repeating the exact callback measurement. Log: $HOME/.cache/codex-scratch/review-term-env-sync/evidence/paint-callback.log.

Follow-up to the held-echo finding: the prior 18.2–39.6 ms values observed when outputSequence became visible could include an extra RAF polling interval. I enabled the existing PerformanceProbe `onPaintedOutput` callback, timestamped after the renderer callback. A production-bundle sample on infraternal-perf-test (load before 0.67 0.85 1.10, measured RTT 82.1 ms) held for 152.3 ms and painted the host echo at +27.7 ms after release. That exceeds one 60 Hz frame (~16.7 ms); I’m repeating the exact callback measurement. Log: `$HOME/.cache/codex-scratch/review-term-env-sync/evidence/paint-callback.log`.
Author
Owner

Exact callback repeat on infraternal-perf-test (candidate bundle, RTT 60.3–89.1 ms, rAF median 16.70 ms): all 5 samples saw the host echo received while the hold remained active. (hold_ms, RTT_ms, paint callback after release) were (157.3,60.3,32.3), (150.2,73.5,114.1), (154.5,78.4,13.1), (150.1,70.2,14.4), (155.5,89.1,14.9). Three painted within one measured frame; two missed, including one at 114.1 ms. This is a repeatable path with an outlier still under review; log: $HOME/.cache/codex-scratch/review-term-env-sync/evidence/paint-frame-scaled.log.

Exact callback repeat on infraternal-perf-test (candidate bundle, RTT 60.3–89.1 ms, rAF median 16.70 ms): all 5 samples saw the host echo received while the hold remained active. `(hold_ms, RTT_ms, paint callback after release)` were `(157.3,60.3,32.3)`, `(150.2,73.5,114.1)`, `(154.5,78.4,13.1)`, `(150.1,70.2,14.4)`, `(155.5,89.1,14.9)`. Three painted within one measured frame; two missed, including one at 114.1 ms. This is a repeatable path with an outlier still under review; log: `$HOME/.cache/codex-scratch/review-term-env-sync/evidence/paint-frame-scaled.log`.
Author
Owner

The existing 20-key typing harness baseline A ran on infraternal-perf-test at configured RTT 300 ms (measured 312.90 ms): confirmed echo with prediction p50 327.50 ms / p99 330.70 ms; predicted glyph p50 12.50 / p99 13.70 ms; prediction CPU p99 0.300 ms. The full test exited nonzero at its separate reconnect-resumed check (p99 1,526.30 ms, budget 900 ms). Metrics were emitted before that assertion; the run log is $HOME/.cache/codex-scratch/review-term-env-sync/evidence/typing-pairs.log. I am preserving that exit status and continuing candidate runs.

The existing 20-key typing harness baseline A ran on infraternal-perf-test at configured RTT 300 ms (measured 312.90 ms): confirmed echo with prediction p50 327.50 ms / p99 330.70 ms; predicted glyph p50 12.50 / p99 13.70 ms; prediction CPU p99 0.300 ms. The full test exited nonzero at its separate reconnect-resumed check (p99 1,526.30 ms, budget 900 ms). Metrics were emitted before that assertion; the run log is `$HOME/.cache/codex-scratch/review-term-env-sync/evidence/typing-pairs.log`. I am preserving that exit status and continuing candidate runs.
Author
Owner

Paired 20-key typing results on infraternal-perf-test (configured RTT 300 ms): baseline A/B measured RTT 312.90/307.20 ms and confirmed echo p50/p99 327.50/330.70 and 313.60/326.80 ms; candidate A/B measured RTT 312.10/298.40 ms and p50/p99 314.00/328.60 and 307.10/313.80 ms. Candidate p99 deltas were -2.10 and -13.00 ms; no consistent slowdown. Predicted-glyph p99 was baseline 13.70/24.00 ms and candidate 14.00/14.00 ms; prediction CPU p99 0.2–0.3 ms with no fallback. All complete runs emitted metrics but exited at unrelated harness thresholds (baseline reconnect p99 1,526.3/1,493.6 ms vs 900 ms; candidate A reconnect 1,528.7 vs 900 ms; candidate B sign-in p99 5,009.1 vs 5,000 ms). Logs: $HOME/.cache/codex-scratch/review-term-env-sync/evidence/typing-pairs.log and typing-followups.log.

Paired 20-key typing results on infraternal-perf-test (configured RTT 300 ms): baseline A/B measured RTT 312.90/307.20 ms and confirmed echo p50/p99 327.50/330.70 and 313.60/326.80 ms; candidate A/B measured RTT 312.10/298.40 ms and p50/p99 314.00/328.60 and 307.10/313.80 ms. Candidate p99 deltas were -2.10 and -13.00 ms; no consistent slowdown. Predicted-glyph p99 was baseline 13.70/24.00 ms and candidate 14.00/14.00 ms; prediction CPU p99 0.2–0.3 ms with no fallback. All complete runs emitted metrics but exited at unrelated harness thresholds (baseline reconnect p99 1,526.3/1,493.6 ms vs 900 ms; candidate A reconnect 1,528.7 vs 900 ms; candidate B sign-in p99 5,009.1 vs 5,000 ms). Logs: `$HOME/.cache/codex-scratch/review-term-env-sync/evidence/typing-pairs.log` and `typing-followups.log`.
Author
Owner

P1 finding; verdict HOLD. The scanner timeout is bounded at 150.1–157.3 ms, but the visible repaint is not reliably within one frame after release. Six exact onPaintedOutput callbacks under RTT 60.3–89.1 ms, with measured rAF interval 16.70 ms, followed release by 27.7, 32.3, 114.1, 13.1, 14.4, and 14.9 ms. Three exceed one frame; one sample held for 150.2 ms then painted 114.1 ms later, leaving the prior screen visible for about 264.3 ms. The echo sequence was received while the hold was still active. This crosses the requested ~200 ms freeze bound and misses one-frame echo behavior. No code changes made. Evidence: direct callback samples.

P1 finding; verdict HOLD. The scanner timeout is bounded at 150.1–157.3 ms, but the visible repaint is not reliably within one frame after release. Six exact `onPaintedOutput` callbacks under RTT 60.3–89.1 ms, with measured rAF interval 16.70 ms, followed release by 27.7, 32.3, 114.1, 13.1, 14.4, and 14.9 ms. Three exceed one frame; one sample held for 150.2 ms then painted 114.1 ms later, leaving the prior screen visible for about 264.3 ms. The echo sequence was received while the hold was still active. This crosses the requested ~200 ms freeze bound and misses one-frame echo behavior. No code changes made. Evidence: [direct callback samples](https://git.kayg.org/attachments/9fb1382f-e71b-49d9-b0a5-dd2c6951e8e2).
Author
Owner

Final-gate finding: corrected scripts/verify fast used the exact helper key from crates/plugins/ssh/tests/common/mod.rs and a short state root. The test row failed in review_inode_reuse_after_diagnostics_preserves_live_replacement at crates/plugins/ssh/tests/install.rs:3483: the fixture did not reproduce inode reuse within 256 allocations (sampled inodes ranged from 4,880,834 to 4,881,880). The rest of the test suite passed. fmt, VT native fmt, CLI plugin compile-out, clippy, cargo-deny and static builds passed. Static sizes were x86_64 21,225,104 bytes and aarch64 19,427,432 bytes, each at its cap. Checking whether the fixture failure repeats in isolation.

Final-gate finding: corrected `scripts/verify fast` used the exact helper key from `crates/plugins/ssh/tests/common/mod.rs` and a short state root. The test row failed in `review_inode_reuse_after_diagnostics_preserves_live_replacement` at `crates/plugins/ssh/tests/install.rs:3483`: the fixture did not reproduce inode reuse within 256 allocations (sampled inodes ranged from 4,880,834 to 4,881,880). The rest of the test suite passed. fmt, VT native fmt, CLI plugin compile-out, clippy, cargo-deny and static builds passed. Static sizes were x86_64 21,225,104 bytes and aarch64 19,427,432 bytes, each at its cap. Checking whether the fixture failure repeats in isolation.
Author
Owner

Verdict: HOLD (P1, no P0). The scanner releases a forgotten DEC 2026 hold at 150 ms, but the canvas can still visibly withhold the host's keystroke echo after release. With a measured 16.70 ms rAF interval, 3 of 6 exact onPaintedOutput callbacks were later than one frame after the timeout: 32.3, 114.1 and 27.7 ms. The worst measured visible hold was 264.3 ms (150.2 + 114.1 ms), over the roughly 200 ms freeze threshold. Host echo was received while the hold was active. Predicted glyphs appeared in 9.3–22.3 ms and did not wait for the hold.

Paired typing runs at configured 300 ms RTT showed no consistent p99 slowdown: host echo p99 was 330.7 ms baseline / 328.6 ms candidate in pair A, and 326.8 / 313.8 ms in pair B. Predicted glyph p99 was 13.7 / 14.0 ms and 24.0 / 14.0 ms. Other reviewed cases passed: COLORTERM is set beside TERM at the shared PTY spawn path; split WebSocket frames stayed off canvas until complete; nested set/reset, reset without set, cross-chunk reset, 64 simultaneous holds, background windows, reconnect, and alternate-screen switches behaved as expected. Critical gzip grew 1,738 bytes; stripped x86_64 size fell 768 bytes.

Final scripts/verify fast at head b9c7dc68a8a7ef075008a5b0a29802014d53a0a5 exited 1. One unrelated workspace test failed: review_inode_reuse_after_diagnostics_preserves_live_replacement could not reproduce inode reuse within 256 allocations (crates/plugins/ssh/tests/install.rs:3483). All other test cases passed; fmt, VT native fmt, CLI plugin compile-out, clippy, cargo-deny and static builds passed. Static sizes were x86_64 21,225,104 bytes and aarch64 19,427,432 bytes, both at their caps.

Verbatim final Rust gate summary:

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

Full gate transcript: verify-fast-final.log. Review findings and evidence index: findings.md.

Verdict: **HOLD (P1, no P0).** The scanner releases a forgotten DEC 2026 hold at 150 ms, but the canvas can still visibly withhold the host's keystroke echo after release. With a measured 16.70 ms rAF interval, 3 of 6 exact `onPaintedOutput` callbacks were later than one frame after the timeout: 32.3, 114.1 and 27.7 ms. The worst measured visible hold was 264.3 ms (150.2 + 114.1 ms), over the roughly 200 ms freeze threshold. Host echo was received while the hold was active. Predicted glyphs appeared in 9.3–22.3 ms and did not wait for the hold. Paired typing runs at configured 300 ms RTT showed no consistent p99 slowdown: host echo p99 was 330.7 ms baseline / 328.6 ms candidate in pair A, and 326.8 / 313.8 ms in pair B. Predicted glyph p99 was 13.7 / 14.0 ms and 24.0 / 14.0 ms. Other reviewed cases passed: COLORTERM is set beside TERM at the shared PTY spawn path; split WebSocket frames stayed off canvas until complete; nested set/reset, reset without set, cross-chunk reset, 64 simultaneous holds, background windows, reconnect, and alternate-screen switches behaved as expected. Critical gzip grew 1,738 bytes; stripped x86_64 size fell 768 bytes. Final `scripts/verify fast` at head `b9c7dc68a8a7ef075008a5b0a29802014d53a0a5` exited 1. One unrelated workspace test failed: `review_inode_reuse_after_diagnostics_preserves_live_replacement` could not reproduce inode reuse within 256 allocations (`crates/plugins/ssh/tests/install.rs:3483`). All other test cases passed; fmt, VT native fmt, CLI plugin compile-out, clippy, cargo-deny and static builds passed. Static sizes were x86_64 21,225,104 bytes and aarch64 19,427,432 bytes, both at their caps. Verbatim final Rust gate summary: ```text +---------------------------+--------------+ | Rust gate | Result | +---------------------------+--------------+ | fmt | PASS | | VT native fmt | PASS | | CLI plugin compile-out | PASS | | clippy | PASS | | test | FAIL (101) | | cargo-deny | PASS | | static builds | PASS | +---------------------------+--------------+ ``` Full gate transcript: [verify-fast-final.log](https://git.kayg.org/attachments/033ac112-ec67-4c25-a1f7-3d8e7f70eed4). Review findings and evidence index: [findings.md](https://git.kayg.org/attachments/d9924d4b-27c0-48b3-965d-1c62017470ed).
Author
Owner

Follow-up to the finish record: the optional isolated retry of review_inode_reuse_after_diagnostics_preserves_live_replacement remained queued behind active host builds for about 67 seconds; the test never started, so I canceled only that queued command. The full scripts/verify fast result in the finish comment remains the observed result. No repository files were changed.

Updated evidence notes: findings.md.

Follow-up to the finish record: the optional isolated retry of `review_inode_reuse_after_diagnostics_preserves_live_replacement` remained queued behind active host builds for about 67 seconds; the test never started, so I canceled only that queued command. The full `scripts/verify fast` result in the finish comment remains the observed result. No repository files were changed. Updated evidence notes: [findings.md](https://git.kayg.org/attachments/3e5a675f-737b-4e40-a5cd-4b80dd85ed1e).
Author
Owner

Started round 2 on branch term-env-sync-r2, based on origin/term-env-sync at b9c7dc68a8a7ef075008a5b0a29802014d53a0a5. Read all #206 comments; Forgejo records no parent issue. Continuing the P1: release-time painting must land on the first animation frame after reset or timeout, and timeout release must not depend on later output.

Started round 2 on branch `term-env-sync-r2`, based on `origin/term-env-sync` at `b9c7dc68a8a7ef075008a5b0a29802014d53a0a5`. Read all #206 comments; Forgejo records no parent issue. Continuing the P1: release-time painting must land on the first animation frame after reset or timeout, and timeout release must not depend on later output.
Author
Owner

Finding: the renderer callback can be one frame late even when the synchronized hold is released. SynchronizedOutput.setEnabled(false) clears paintHeld without scheduling a release paint (apps/tracer/src/synchronized-output.ts:196-204). The output drain serializes writes until a prior Ghostty callback completes (apps/tracer/src/terminal.ts:1429-1460); if that callback runs after the renderer pass, it drains the held queue and Ghostty schedules the next write callback with another requestAnimationFrame (apps/tracer/vendor/ghostty-web/dist/ghostty-web.js, writeInternal). I’ll schedule a release-frame render and finish any already-applied queued write only after that render, keeping the 150 ms hold and receive ordering.

Finding: the renderer callback can be one frame late even when the synchronized hold is released. `SynchronizedOutput.setEnabled(false)` clears `paintHeld` without scheduling a release paint (`apps/tracer/src/synchronized-output.ts:196-204`). The output drain serializes writes until a prior Ghostty callback completes (`apps/tracer/src/terminal.ts:1429-1460`); if that callback runs after the renderer pass, it drains the held queue and Ghostty schedules the next write callback with another `requestAnimationFrame` (`apps/tracer/vendor/ghostty-web/dist/ghostty-web.js`, `writeInternal`). I’ll schedule a release-frame render and finish any already-applied queued write only after that render, keeping the 150 ms hold and receive ordering.
Author
Owner

cargo test --workspace --locked in scripts/verify iterate failed only in the documented SSH fixture flake review_inode_reuse_after_diagnostics_preserves_live_replacement (crates/plugins/ssh/tests/install.rs:3417): “fixture could not reproduce inode reuse in 256 allocations.” The same failure repeated in a captured workspace-test rerun; all other Rust test binaries passed. This task changes only tracer TypeScript. Continuing with the requested browser measurement and final fast gate.

`cargo test --workspace --locked` in `scripts/verify iterate` failed only in the documented SSH fixture flake `review_inode_reuse_after_diagnostics_preserves_live_replacement` (`crates/plugins/ssh/tests/install.rs:3417`): “fixture could not reproduce inode reuse in 256 allocations.” The same failure repeated in a captured workspace-test rerun; all other Rust test binaries passed. This task changes only tracer TypeScript. Continuing with the requested browser measurement and final fast gate.
Author
Owner

Production browser measurement on infraternal-perf-test, run under systemd-run --user --scope -p CPUWeight=10000: 20/20 host echoes arrived while the hold was active and painted after release at p50 9.1 ms / max 14.2 ms. Measured rAF median was 16.70 ms. Hold duration was p50 148.2 ms / max 152.0 ms. Configured RTT was 80 ms (30 ms jitter); self-test measured p50 81.76 ms / p99 105.64 ms. Load average before/after: 0.03 0.06 0.03 / 0.10 0.08 0.04. The production split-frame check kept pixels and outputSequence unchanged through all three chunks, then displayed the complete frame after reset. Receipts: measurement and split check, production screenshot.

Production browser measurement on infraternal-perf-test, run under `systemd-run --user --scope -p CPUWeight=10000`: 20/20 host echoes arrived while the hold was active and painted after release at p50 9.1 ms / max 14.2 ms. Measured rAF median was 16.70 ms. Hold duration was p50 148.2 ms / max 152.0 ms. Configured RTT was 80 ms (30 ms jitter); self-test measured p50 81.76 ms / p99 105.64 ms. Load average before/after: `0.03 0.06 0.03` / `0.10 0.08 0.04`. The production split-frame check kept pixels and `outputSequence` unchanged through all three chunks, then displayed the complete frame after reset. Receipts: [measurement and split check](https://git.kayg.org/attachments/56c9edd8-2d77-4d13-a07e-fafbaaa25c64), [production screenshot](https://git.kayg.org/attachments/e0903062-c352-4e8d-9a80-698987a9a5f4).
Author
Owner

Committed 291a4348797950efb544da0704b2f14cf6cc1e01. The release frame now draws the latest parser state and completes its pending write; if an earlier write occupied the callback slot, the same frame also drains and draws the queued atomic batch. The timeout still drains without waiting for another output message. bun run check passed; the deterministic synchronized-output unit tests passed (6 tests, 1,294 assertions).

On the production bundle at 80 ms configured RTT, 20/20 echoes arrived during the hold and painted after release at p50 3.8 ms / max 16.8 ms; measured rAF median was 16.7 ms. Hold duration was p50 148.3 ms / max 151.3 ms. The split-frame check kept the screen unchanged across all three received chunks and showed the whole frame after reset. Measurement log, screenshot. scripts/verify fast is running.

Committed `291a4348797950efb544da0704b2f14cf6cc1e01`. The release frame now draws the latest parser state and completes its pending write; if an earlier write occupied the callback slot, the same frame also drains and draws the queued atomic batch. The timeout still drains without waiting for another output message. `bun run check` passed; the deterministic synchronized-output unit tests passed (6 tests, 1,294 assertions). On the production bundle at 80 ms configured RTT, 20/20 echoes arrived during the hold and painted after release at p50 3.8 ms / max 16.8 ms; measured rAF median was 16.7 ms. Hold duration was p50 148.3 ms / max 151.3 ms. The split-frame check kept the screen unchanged across all three received chunks and showed the whole frame after reset. [Measurement log](https://git.kayg.org/attachments/e31b3b34-1150-44d4-a23e-76bc434922f2), [screenshot](https://git.kayg.org/attachments/4c674997-32cd-4183-8a3a-6789a4dc2e44). `scripts/verify fast` is running.
Author
Owner

Fast gate finding at 291a434879: infraternal-plugin-remote unit test runtime_lock::tests::session_inspection_finds_bound_endpoints_by_identity failed once. In crates/plugins/remote/src/runtime_lock_tests.rs:266, after dropping the bound socket, the fixture received Err(73) instead of Ok(()). The adjacent inode-reuse SSH fixture passed (94 passed, 0 failed, 1 ignored). I am checking whether the socket result reproduces; no code changes are involved.

Fast gate finding at 291a4348797950efb544da0704b2f14cf6cc1e01: `infraternal-plugin-remote` unit test `runtime_lock::tests::session_inspection_finds_bound_endpoints_by_identity` failed once. In `crates/plugins/remote/src/runtime_lock_tests.rs:266`, after dropping the bound socket, the fixture received `Err(73)` instead of `Ok(())`. The adjacent inode-reuse SSH fixture passed (94 passed, 0 failed, 1 ignored). I am checking whether the socket result reproduces; no code changes are involved.
Author
Owner

Full fast gate rerun at 291a434879: the prior runtime_lock::tests::session_inspection_finds_bound_endpoints_by_identity passed, but the remote library test group failed in two different tests. runtime_lock::tests::legacy_inspection_finds_a_real_bound_socket returned Some(true) after its listener dropped (crates/plugins/remote/src/runtime_lock_tests.rs:224); remote_quic::probe_tests::lost_path_proof_spends_its_reserved_retry_margin failed its retry-margin assertion (crates/plugins/remote/src/remote_probe_tests.rs:202). The SSH install group passed 94 tests, 0 failed, 1 ignored. I am retrying when shared build activity is lower; no code changes are involved.

Full fast gate rerun at 291a4348797950efb544da0704b2f14cf6cc1e01: the prior `runtime_lock::tests::session_inspection_finds_bound_endpoints_by_identity` passed, but the remote library test group failed in two different tests. `runtime_lock::tests::legacy_inspection_finds_a_real_bound_socket` returned `Some(true)` after its listener dropped (`crates/plugins/remote/src/runtime_lock_tests.rs:224`); `remote_quic::probe_tests::lost_path_proof_spends_its_reserved_retry_margin` failed its retry-margin assertion (`crates/plugins/remote/src/remote_probe_tests.rs:202`). The SSH install group passed 94 tests, 0 failed, 1 ignored. I am retrying when shared build activity is lower; no code changes are involved.
Author
Owner

Next full fast gate at 291a434879: runtime_lock::tests::session_inspection_finds_bound_endpoints_by_identity passed. Two other remote library tests failed: runtime_lock::tests::legacy_inspection_finds_a_real_bound_socket saw Some(true) after listener close (crates/plugins/remote/src/runtime_lock_tests.rs:224), and remote_quic::probe_tests::lost_path_proof_spends_its_reserved_retry_margin failed its retry-margin assertion (crates/plugins/remote/src/remote_probe_tests.rs:202). The Rust test row reported 96 passed, 2 failed, 15 ignored. I will rerun after the concurrent build jobs finish; no code changes are involved.

Next full fast gate at 291a4348797950efb544da0704b2f14cf6cc1e01: `runtime_lock::tests::session_inspection_finds_bound_endpoints_by_identity` passed. Two other remote library tests failed: `runtime_lock::tests::legacy_inspection_finds_a_real_bound_socket` saw `Some(true)` after listener close (`crates/plugins/remote/src/runtime_lock_tests.rs:224`), and `remote_quic::probe_tests::lost_path_proof_spends_its_reserved_retry_margin` failed its retry-margin assertion (`crates/plugins/remote/src/remote_probe_tests.rs:202`). The Rust test row reported 96 passed, 2 failed, 15 ignored. I will rerun after the concurrent build jobs finish; no code changes are involved.
Author
Owner

Static binary size comparison completed at 291a434879 using the same x86_64 static-cargo release recipe. Base b9c7dc68a8: 21,225,104 bytes stripped static-pie. Branch: 21,225,104 bytes. Delta: +0 bytes. Receipt

Static binary size comparison completed at 291a4348797950efb544da0704b2f14cf6cc1e01 using the same x86_64 static-cargo release recipe. Base b9c7dc68a8a7ef075008a5b0a29802014d53a0a5: 21,225,104 bytes stripped static-pie. Branch: 21,225,104 bytes. Delta: +0 bytes. [Receipt](https://git.kayg.org/attachments/00b225cb-b87a-4176-a8be-c993dc7b8947)
Author
Owner

Finding: the serial scripts/verify fast run failed only auth::tests::socket_tests::close_logging::agent_stream_loss_logs_its_safe_close_reason_and_reaches_the_browser. Its 10-second browser-close wait elapsed at crates/infraternal-server/src/auth/socket_tests/close_logging.rs:248; the test target reported 562 passed, 1 failed, 52 ignored in 523.57s. The full log is attached: verify-fast-final.log. I am comparing this exact test on detached dev per the host-load gate rule; current host load average is 21.17.

Finding: the serial `scripts/verify fast` run failed only `auth::tests::socket_tests::close_logging::agent_stream_loss_logs_its_safe_close_reason_and_reaches_the_browser`. Its 10-second browser-close wait elapsed at `crates/infraternal-server/src/auth/socket_tests/close_logging.rs:248`; the test target reported 562 passed, 1 failed, 52 ignored in 523.57s. The full log is attached: [verify-fast-final.log](https://git.kayg.org/attachments/eefbb70c-20cf-46fb-adb4-db3a90a95cca). I am comparing this exact test on detached `dev` per the host-load gate rule; current host load average is 21.17.
Author
Owner

The required detached dev baseline comparison did not reproduce the timeout. With --features remote, the exact test auth::tests::socket_tests::close_logging::agent_stream_loss_logs_its_safe_close_reason_and_reaches_the_browser passed: 1 passed, 0 failed, finished in 1.18s (test profile compiled in 3m59s). Receipt: baseline-auth-timeout.log. The first default-feature invocation selected zero tests and was discarded. I am rerunning the full branch gate because the baseline did not confirm a host-load failure.

The required detached `dev` baseline comparison did not reproduce the timeout. With `--features remote`, the exact test `auth::tests::socket_tests::close_logging::agent_stream_loss_logs_its_safe_close_reason_and_reaches_the_browser` passed: 1 passed, 0 failed, finished in 1.18s (test profile compiled in 3m59s). Receipt: [baseline-auth-timeout.log](https://git.kayg.org/attachments/58b56a00-ee16-4730-bd49-34cafd692aca). The first default-feature invocation selected zero tests and was discarded. I am rerunning the full branch gate because the baseline did not confirm a host-load failure.
Author
Owner

Finished #206 at 291a4348797950efb544da0704b2f14cf6cc1e01. Pushed term-env-sync-r2 and fast-forwarded origin/term-env-sync from b9c7dc68a8a7ef075008a5b0a29802014d53a0a5 to this commit; both remote refs now point to the head.

The deterministic fake-clock/frame test covers reset and timeout release. Production measurement on the perf VM: 20 samples, echo paint after release p50 3.8 ms / max 16.8 ms, median rAF 16.7 ms; hold duration p50 148.3 ms / max 151.3 ms. All 20 echoes arrived during the hold and split-frame protection passed. The initial gate's auth close timeout passed on the detached dev comparison and in the final branch run.

Static stripped size stayed unchanged: x86_64 21,225,104 bytes (+0); aarch64 19,427,432 bytes (+0). Receipts: production measurement, screenshot, size comparison, full final gate log.

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. [4.71s]
Finished #206 at `291a4348797950efb544da0704b2f14cf6cc1e01`. Pushed `term-env-sync-r2` and fast-forwarded `origin/term-env-sync` from `b9c7dc68a8a7ef075008a5b0a29802014d53a0a5` to this commit; both remote refs now point to the head. The deterministic fake-clock/frame test covers reset and timeout release. Production measurement on the perf VM: 20 samples, echo paint after release p50 3.8 ms / max 16.8 ms, median rAF 16.7 ms; hold duration p50 148.3 ms / max 151.3 ms. All 20 echoes arrived during the hold and split-frame protection passed. The initial gate's auth close timeout passed on the detached `dev` comparison and in the final branch run. Static stripped size stayed unchanged: x86_64 21,225,104 bytes (+0); aarch64 19,427,432 bytes (+0). Receipts: [production measurement](https://git.kayg.org/attachments/e31b3b34-1150-44d4-a23e-76bc434922f2), [screenshot](https://git.kayg.org/attachments/4c674997-32cd-4183-8a3a-6789a4dc2e44), [size comparison](https://git.kayg.org/attachments/00b225cb-b87a-4176-a8be-c993dc7b8947), [full final gate log](https://git.kayg.org/attachments/50d859a2-7292-45b5-8d1c-17059f53b9d1). 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. [4.71s] ```
Author
Owner

Started break-it review #206 on branch review-term-env-sync-r2, based on origin/term-env-sync-r2 at 291a4348797950efb544da0704b2f14cf6cc1e01. Read the required repo documents and all #206 comments; Forgejo records no parent issue. I’m reviewing the round-1-to-round-2 release-frame diff and its interactions against the listed hold, reconnect, resize, multi-viewer, and background-tab cases.

Started break-it review #206 on branch `review-term-env-sync-r2`, based on `origin/term-env-sync-r2` at `291a4348797950efb544da0704b2f14cf6cc1e01`. Read the required repo documents and all #206 comments; Forgejo records no parent issue. I’m reviewing the round-1-to-round-2 release-frame diff and its interactions against the listed hold, reconnect, resize, multi-viewer, and background-tab cases.
Author
Owner

Finding: the explicit “hold never blocks input” case fails. On the round-2 production bundle, 20 perf-VM samples had zero inputs accepted during the hold; host acceptance was 30.95 ms p50 / 65.00 ms max after timeout release. The hold duration observed from the test-side state was 140.60 ms p50 / 145.80 ms max, and key dispatch was 7.45 ms p50 / 15.50 ms max. Load average was 0.74 1.02 0.65 before and 0.85 1.02 0.66 after. The same committed browser assertion fails against both exact b9c7dc68a round-1 and 291a43487 round-2 production bundles: accepted input is 2, but the hold is already false. This is P2 and is pre-existing at round 1, so it is not a round-2 regression; it still fails the case requested for this review. I added the failing regression test locally at apps/tracer/test/synchronized-output-input.spec.ts.

Evidence: round-2 20-sample input timing, round-1 baseline failure, round-2 failure.

Finding: the explicit “hold never blocks input” case fails. On the round-2 production bundle, 20 perf-VM samples had zero inputs accepted during the hold; host acceptance was 30.95 ms p50 / 65.00 ms max after timeout release. The hold duration observed from the test-side state was 140.60 ms p50 / 145.80 ms max, and key dispatch was 7.45 ms p50 / 15.50 ms max. Load average was 0.74 1.02 0.65 before and 0.85 1.02 0.66 after. The same committed browser assertion fails against both exact b9c7dc68a round-1 and 291a43487 round-2 production bundles: accepted input is 2, but the hold is already false. This is P2 and is pre-existing at round 1, so it is not a round-2 regression; it still fails the case requested for this review. I added the failing regression test locally at apps/tracer/test/synchronized-output-input.spec.ts. Evidence: [round-2 20-sample input timing](https://git.kayg.org/attachments/883fecf1-af09-4b98-9dba-0fbca1cb8277), [round-1 baseline failure](https://git.kayg.org/attachments/4acc541b-6151-47d0-ba90-fd7cdb844021), [round-2 failure](https://git.kayg.org/attachments/dae31794-cc10-4781-a343-342bed20b966).
Author
Owner

Committed the failing held-input browser case: a5aac70f9. It asserts keyboard input is accepted while a mode-2026 hold remains active; round 1 and round 2 both fail with input accepted only after timeout release. TypeScript check passed. Running the required branch-head gate next.

Committed the failing held-input browser case: `a5aac70f9`. It asserts keyboard input is accepted while a mode-2026 hold remains active; round 1 and round 2 both fail with input accepted only after timeout release. TypeScript check passed. Running the required branch-head gate next.
Author
Owner

The branch-head scripts/verify fast run is still queued in the required build-slot wrapper. All three configured slots are occupied by other builds; the verifier has not started. Waiting for a slot to free; branch head remains a5aac70f9.

The branch-head `scripts/verify fast` run is still queued in the required build-slot wrapper. All three configured slots are occupied by other builds; the verifier has not started. Waiting for a slot to free; branch head remains `a5aac70f9`.
Author
Owner

Verdict: HOLD P2. Branch review-term-env-sync-r2 is pushed at a5aac70f9012b6cb5af0bcac7ad84318263556fd.

The round-2 paint fix is confirmed: 20 delayed host echoes arrived during the hold and painted after release at 9.00 ms p50 / 16.60 ms max; observed hold was 134.75 ms p50 / 144.60 ms max. The reset, nested/repeated transition, timeout/disconnect, snapshot reattach, resize, background resume, and two-viewer cases passed on the round-2 bundle. Binary size delta remains +0 bytes.

P2: keyboard input is not accepted while a mode-2026 hold remains active. Across 20 samples, 0 input bytes were accepted during the hold; acceptance occurred 30.95 ms p50 / 65.00 ms max after timeout release. The committed browser case reproduces against both round 1 (b9c7dc68a8a7ef075008a5b0a29802014d53a0a5) and round 2, so this is pre-existing, not a round-2 regression. Product code was left unchanged. Input and passing-case receipts are attached above; the full fast-gate log is verify-fast.log.

The fast gate also failed outside the review diff: latest::tests::startup_reclaims_only_owned_inactive_private_metadata and latest::tests::cancellation_joins_verification panicked on Option::unwrap(); the static build could not find Zig at /home/kayg/.cache/codex-scratch/release-2/staging/target/auth-tools/zig/zig. These are not in the contract’s load-sensitive exception list.

Final scripts/verify fast summary, verbatim:

+---------------------------+--------------+
| Rust gate                 | Result       |
+---------------------------+--------------+
| fmt                       | PASS         |
| VT native fmt             | PASS         |
| CLI plugin compile-out    | PASS         |
| clippy                    | PASS         |
| test                      | FAIL (101)   |
| cargo-deny                | PASS         |
| static builds             | FAIL (101)   |
+---------------------------+--------------+
Verdict: HOLD P2. Branch `review-term-env-sync-r2` is pushed at `a5aac70f9012b6cb5af0bcac7ad84318263556fd`. The round-2 paint fix is confirmed: 20 delayed host echoes arrived during the hold and painted after release at 9.00 ms p50 / 16.60 ms max; observed hold was 134.75 ms p50 / 144.60 ms max. The reset, nested/repeated transition, timeout/disconnect, snapshot reattach, resize, background resume, and two-viewer cases passed on the round-2 bundle. Binary size delta remains +0 bytes. P2: keyboard input is not accepted while a mode-2026 hold remains active. Across 20 samples, 0 input bytes were accepted during the hold; acceptance occurred 30.95 ms p50 / 65.00 ms max after timeout release. The committed browser case reproduces against both round 1 (`b9c7dc68a8a7ef075008a5b0a29802014d53a0a5`) and round 2, so this is pre-existing, not a round-2 regression. Product code was left unchanged. Input and passing-case receipts are attached above; the full fast-gate log is [verify-fast.log](https://git.kayg.org/attachments/4dc29e13-aad4-45d3-92a8-337d0ba3c855). The fast gate also failed outside the review diff: `latest::tests::startup_reclaims_only_owned_inactive_private_metadata` and `latest::tests::cancellation_joins_verification` panicked on `Option::unwrap()`; the static build could not find Zig at `/home/kayg/.cache/codex-scratch/release-2/staging/target/auth-tools/zig/zig`. These are not in the contract’s load-sensitive exception list. Final `scripts/verify fast` summary, verbatim: ``` +---------------------------+--------------+ | Rust gate | Result | +---------------------------+--------------+ | fmt | PASS | | VT native fmt | PASS | | CLI plugin compile-out | PASS | | clippy | PASS | | test | FAIL (101) | | cargo-deny | PASS | | static builds | FAIL (101) | +---------------------------+--------------+ ```
Author
Owner

Started #206 on branch sync-hold-input, base 291a4348797950efb544da0704b2f14cf6cc1e01 (origin/term-env-sync-r2). Read the repository contract and all #206 comments; the issue history records no parent issue. I’m merging the review branch to bring in its failing input-during-hold reproducer, then tracing why accepted keyboard input waits for the hold to release.

Started #206 on branch `sync-hold-input`, base `291a4348797950efb544da0704b2f14cf6cc1e01` (`origin/term-env-sync-r2`). Read the repository contract and all #206 comments; the issue history records no parent issue. I’m merging the review branch to bring in its failing input-during-hold reproducer, then tracing why accepted keyboard input waits for the hold to release.
Author
Owner

Merged origin/review-term-env-sync-r2 into sync-hold-input by fast-forward to a5aac70f9012b6cb5af0bcac7ad84318263556fd. This brings in apps/tracer/test/synchronized-output-input.spec.ts; the worktree is clean.

Merged `origin/review-term-env-sync-r2` into `sync-hold-input` by fast-forward to `a5aac70f9012b6cb5af0bcac7ad84318263556fd`. This brings in `apps/tracer/test/synchronized-output-input.spec.ts`; the worktree is clean.
Author
Owner

Finding: the merged reproducer passed once on the existing production bundle. In a 20-run timing attempt, all 20 keydowns and server acceptance observations occurred while the hold was active; 7 runs exceeded the 16 ms threshold because the measurement timestamp came from a browser HTTP state-poll response (9.7–31.7 ms across samples), so that probe measured polling latency as well as input delivery. Perf VM load was 0.00 0.03 0.06 before and 1.07 0.32 0.15 after. I replaced the timing measurement with a timestamp at the browser WebSocket Input-frame send boundary while retaining the held-acceptance assertion. Raw run.

Finding: the merged reproducer passed once on the existing production bundle. In a 20-run timing attempt, all 20 keydowns and server acceptance observations occurred while the hold was active; 7 runs exceeded the 16 ms threshold because the measurement timestamp came from a browser HTTP state-poll response (9.7–31.7 ms across samples), so that probe measured polling latency as well as input delivery. Perf VM load was 0.00 0.03 0.06 before and 1.07 0.32 0.15 after. I replaced the timing measurement with a timestamp at the browser WebSocket Input-frame send boundary while retaining the held-acceptance assertion. [Raw run](https://git.kayg.org/attachments/2ccdfd38-59b9-4b48-a48b-c2b212e83d2e).
Author
Owner

Finding: with the direct send probe, the 20-run input test sent and accepted all keys while the hold was active; WebSocket send latency was 0.8–1.4 ms. The merged reproducer passed 20/20, and the existing synchronized-output regression passed (3 frames held; 4 held-frame samples; timeout release 180.3 ms). The added echo-after-timeout assertion measured 6.2–19.9 ms (3/20 above a fixed 17 ms threshold). I am capturing animation-frame intervals now to determine whether those samples missed a frame or reflect the VM's frame cadence. Inputs and output samples are from the perf VM; its load was 0.06 0.29 0.21 before and 1.32 0.55 0.30 after. Evidence: direct input, original reproducer, synchronized output, echo timing.

Finding: with the direct send probe, the 20-run input test sent and accepted all keys while the hold was active; WebSocket send latency was 0.8–1.4 ms. The merged reproducer passed 20/20, and the existing synchronized-output regression passed (3 frames held; 4 held-frame samples; timeout release 180.3 ms). The added echo-after-timeout assertion measured 6.2–19.9 ms (3/20 above a fixed 17 ms threshold). I am capturing animation-frame intervals now to determine whether those samples missed a frame or reflect the VM's frame cadence. Inputs and output samples are from the perf VM; its load was 0.06 0.29 0.21 before and 1.32 0.55 0.30 after. Evidence: [direct input](https://git.kayg.org/attachments/2d82acd2-98ef-4fc3-8a6c-752496d53ae5), [original reproducer](https://git.kayg.org/attachments/22eda957-f0f4-44d4-9523-59365092c838), [synchronized output](https://git.kayg.org/attachments/c1be82a2-7c07-4eeb-892e-4b38c184460c), [echo timing](https://git.kayg.org/attachments/e68357d9-7c81-45b0-9d43-10b4ee5cd2c3).
Author
Owner

The corrected browser measurement passed 20/20 on the perf VM. Keydown-to-WebSocket Input send was p50 1.00 ms, max 2.20 ms; each send and each host acceptance occurred while the hold remained active. Echo painted in the same or first animation frame after release in 20/20 runs (0 or 1 frame boundary; measured frame periods 16.5–16.8 ms), with paint delay p50 8.90 ms and max 17.40 ms. The existing synchronized-output browser regression passed 1/1; the original merged input reproducer passed 20/20. The earlier fixed-17-ms check was replaced with a frame-boundary assertion because timer-to-paint wall time can exceed one frame period while still landing in the first available frame. I have moved real input handling before waking the renderer and am verifying the branch-built bundle and gates. Final 20-sample receipt.

The corrected browser measurement passed 20/20 on the perf VM. Keydown-to-WebSocket Input send was p50 1.00 ms, max 2.20 ms; each send and each host acceptance occurred while the hold remained active. Echo painted in the same or first animation frame after release in 20/20 runs (0 or 1 frame boundary; measured frame periods 16.5–16.8 ms), with paint delay p50 8.90 ms and max 17.40 ms. The existing synchronized-output browser regression passed 1/1; the original merged input reproducer passed 20/20. The earlier fixed-17-ms check was replaced with a frame-boundary assertion because timer-to-paint wall time can exceed one frame period while still landing in the first available frame. I have moved real input handling before waking the renderer and am verifying the branch-built bundle and gates. [Final 20-sample receipt](https://git.kayg.org/attachments/448c0a38-f378-458a-9db0-aec6ccc7788f).
Author
Owner

Step 1 committed as 452ad8de9: the input regression now measures the WebSocket Input send boundary, verifies host acceptance while paint remains held, and counts animation-frame boundaries through echo paint. bun run check passed. On the perf VM, the corrected case passed 20/20 (send p50 1.00 ms, max 2.20 ms; echo painted within 0–1 frame in all runs, p50 8.90 ms, max 17.40 ms). The merged reproducer passed 20/20 and the existing synchronized-output browser test passed 1/1. Receipt: 20-sample run.

Step 1 committed as 452ad8de9: the input regression now measures the WebSocket Input send boundary, verifies host acceptance while paint remains held, and counts animation-frame boundaries through echo paint. `bun run check` passed. On the perf VM, the corrected case passed 20/20 (send p50 1.00 ms, max 2.20 ms; echo painted within 0–1 frame in all runs, p50 8.90 ms, max 17.40 ms). The merged reproducer passed 20/20 and the existing synchronized-output browser test passed 1/1. Receipt: [20-sample run](https://git.kayg.org/attachments/448c0a38-f378-458a-9db0-aec6ccc7788f).
Author
Owner

The production bundle rebuilt from this worktree, including the input-before-render-wake change, passed the corrected browser case 20/20 on the perf VM. Keydown-to-Input send was p50 1.10 ms, max 1.60 ms; every frame was sent and accepted while the hold was active. Echo painted in the same or first frame boundary after release in 20/20 runs; paint delay p50 10.75 ms, max 18.70 ms. The existing synchronized-output browser regression passed 1/1; it held three frames across four samples and released by timeout in 488.1 ms (<500 ms). Perf VM load was 0.15 0.73 0.55 before and 0.84 0.84 0.60 after the 20-run case. Evidence: branch bundle input/echo, synchronized-output regression. The runtime change remains uncommitted pending the repository iteration gate.

The production bundle rebuilt from this worktree, including the input-before-render-wake change, passed the corrected browser case 20/20 on the perf VM. Keydown-to-Input send was p50 1.10 ms, max 1.60 ms; every frame was sent and accepted while the hold was active. Echo painted in the same or first frame boundary after release in 20/20 runs; paint delay p50 10.75 ms, max 18.70 ms. The existing synchronized-output browser regression passed 1/1; it held three frames across four samples and released by timeout in 488.1 ms (<500 ms). Perf VM load was 0.15 0.73 0.55 before and 0.84 0.84 0.60 after the 20-run case. Evidence: [branch bundle input/echo](https://git.kayg.org/attachments/2e9d720b-1de4-4f11-a674-57332ca588b6), [synchronized-output regression](https://git.kayg.org/attachments/bf42fa91-5dd8-47a5-b005-5cd2b60f2ff4). The runtime change remains uncommitted pending the repository iteration gate.
Author
Owner

Step 2 committed as 875cef413: real terminal input is now handled and sent before cursor-blink restart and render-loop wake; parser replies retain the wake path. The branch-built bundle passed the perf-VM input/echo test 20/20 (send p50 1.10 ms, max 1.60 ms; 0–1 frame to paint echo, p50 10.75 ms, max 18.70 ms) and the existing synchronized-output browser regression 1/1. bun run check passed. Evidence: input/echo run, synchronized-output run.

Step 2 committed as 875cef413: real terminal input is now handled and sent before cursor-blink restart and render-loop wake; parser replies retain the wake path. The branch-built bundle passed the perf-VM input/echo test 20/20 (send p50 1.10 ms, max 1.60 ms; 0–1 frame to paint echo, p50 10.75 ms, max 18.70 ms) and the existing synchronized-output browser regression 1/1. `bun run check` passed. Evidence: [input/echo run](https://git.kayg.org/attachments/2e9d720b-1de4-4f11-a674-57332ca588b6), [synchronized-output run](https://git.kayg.org/attachments/bf42fa91-5dd8-47a5-b005-5cd2b60f2ff4).
Author
Owner

Finding: scripts/verify iterate failed once in the unrelated remote runtime lifecycle test: retained_runtime_registry_keeps_lifetime_ownership_after_listener_abort panicked at crates/infraternal-agent/src/plugin_control.rs:1040 (probe.try_lock().is_ok()); the crate reported 143 passed, 1 failed, 20 ignored. A filtered rerun with --features remote passed 1/1. I am rerunning the full gate to establish a clean result. Full gate log: $HOME/.cache/codex-scratch/sync-hold-input/evidence/verify-iterate.log.

Finding: `scripts/verify iterate` failed once in the unrelated remote runtime lifecycle test: `retained_runtime_registry_keeps_lifetime_ownership_after_listener_abort` panicked at `crates/infraternal-agent/src/plugin_control.rs:1040` (`probe.try_lock().is_ok()`); the crate reported 143 passed, 1 failed, 20 ignored. A filtered rerun with `--features remote` passed 1/1. I am rerunning the full gate to establish a clean result. Full gate log: `$HOME/.cache/codex-scratch/sync-hold-input/evidence/verify-iterate.log`.
Author
Owner

Finding: the next full scripts/verify iterate run failed one test in crates/plugins/ssh/tests/install.rs: review_inode_reuse_after_diagnostics_preserves_live_replacement could not reproduce inode reuse in 256 allocations (93 passed, 1 failed, 1 ignored in that suite). This differs from the earlier isolated lifecycle test, which passed with --features remote. I am rerunning the SSH test alone, then will repeat the full gate. Gate log: $HOME/.cache/codex-scratch/sync-hold-input/evidence/verify-iterate-rerun.log.

Finding: the next full `scripts/verify iterate` run failed one test in `crates/plugins/ssh/tests/install.rs`: `review_inode_reuse_after_diagnostics_preserves_live_replacement` could not reproduce inode reuse in 256 allocations (93 passed, 1 failed, 1 ignored in that suite). This differs from the earlier isolated lifecycle test, which passed with `--features remote`. I am rerunning the SSH test alone, then will repeat the full gate. Gate log: `$HOME/.cache/codex-scratch/sync-hold-input/evidence/verify-iterate-rerun.log`.
Author
Owner

The SSH fixture failure was isolated to its shared default test-state directory: review_inode_reuse_after_diagnostics_preserves_live_replacement failed 0/1 there, then passed 1/1 with INFRATERNAL_TEST_STATE_ROOT=$HOME/.cache/codex-scratch/sync-hold-input/test-state. Full iterate is being rerun with the per-job test-state root to prevent fixture contention.

The SSH fixture failure was isolated to its shared default test-state directory: `review_inode_reuse_after_diagnostics_preserves_live_replacement` failed 0/1 there, then passed 1/1 with `INFRATERNAL_TEST_STATE_ROOT=$HOME/.cache/codex-scratch/sync-hold-input/test-state`. Full iterate is being rerun with the per-job test-state root to prevent fixture contention.
Author
Owner

The prior per-job root included an extra /test-state segment and made a fixture Unix-socket path 119 bytes (the harness limit is 108), causing agent_daemon to fail before the test. Using the shorter per-job root $HOME/.cache/codex-scratch/sync-hold avoids the shared SSH fixture directory and stays within the socket limit: agent_daemon passed 1/1 with all 24 restart positions; review_inode_reuse_after_diagnostics_preserves_live_replacement passed 1/1. Rerunning iterate with this root.

The prior per-job root included an extra `/test-state` segment and made a fixture Unix-socket path 119 bytes (the harness limit is 108), causing `agent_daemon` to fail before the test. Using the shorter per-job root `$HOME/.cache/codex-scratch/sync-hold` avoids the shared SSH fixture directory and stays within the socket limit: `agent_daemon` passed 1/1 with all 24 restart positions; `review_inode_reuse_after_diagnostics_preserves_live_replacement` passed 1/1. Rerunning iterate with this root.
Author
Owner

With the short per-job fixture root, agent_daemon passed 1/1 (all 24 restart positions), but the workspace run still had review_inode_reuse_after_diagnostics_preserves_live_replacement fail after 256 allocations; the same SSH test passes 1/1 in isolation. The fixture depends on filesystem inode reuse and is sensitive to concurrent test fixture allocations. I am rerunning iterate with RUST_TEST_THREADS=1 to serialize the Rust harness tests while retaining the per-job root.

With the short per-job fixture root, `agent_daemon` passed 1/1 (all 24 restart positions), but the workspace run still had `review_inode_reuse_after_diagnostics_preserves_live_replacement` fail after 256 allocations; the same SSH test passes 1/1 in isolation. The fixture depends on filesystem inode reuse and is sensitive to concurrent test fixture allocations. I am rerunning iterate with `RUST_TEST_THREADS=1` to serialize the Rust harness tests while retaining the per-job root.
Author
Owner

Gate update: serial scripts/verify iterate has been queued through the host build-slot wrapper since 21:37 local time and has not started. All three slots are currently occupied by other workspace checks (gate-private-reader-regression-atomic.sh, scripts/verify iterate, and scripts/verify fast, per the slot records at 22:16). The working tree is unchanged; I am waiting for a shared slot to open before continuing.

Gate update: serial `scripts/verify iterate` has been queued through the host build-slot wrapper since 21:37 local time and has not started. All three slots are currently occupied by other workspace checks (`gate-private-reader-regression-atomic.sh`, `scripts/verify iterate`, and `scripts/verify fast`, per the slot records at 22:16). The working tree is unchanged; I am waiting for a shared slot to open before continuing.
Author
Owner

The serial iterate run passed the SSH install suite (94/94) and the runtime lifecycle test, then failed previous_attempt_shell because its Python oracle requires INFRATERNAL_TEST_RUNTIME_HELPER. The compiled fixture exists at $HOME/.cache/codex-scratch/sync-hold-input/target/debug/examples/recovery-helper; rerunning that shell oracle with the variable set passed 1/1 (34 nested checks). The next iterate retry will carry this explicit fixture path along with the isolated state root and serial test harness.

The serial iterate run passed the SSH install suite (94/94) and the runtime lifecycle test, then failed `previous_attempt_shell` because its Python oracle requires `INFRATERNAL_TEST_RUNTIME_HELPER`. The compiled fixture exists at `$HOME/.cache/codex-scratch/sync-hold-input/target/debug/examples/recovery-helper`; rerunning that shell oracle with the variable set passed 1/1 (34 nested checks). The next iterate retry will carry this explicit fixture path along with the isolated state root and serial test harness.
Author
Owner

The next serial iterate run passed the install suite (94/94) and previous_attempt_shell (1/1 with the runtime helper), then exposed three recovery_support failures because the home-cache fixture path made AF_UNIX names exceed sun_path. Setting INFRATERNAL_TEST_SOCKET_ROOT=/tmp/sync-hold-206 for these small runtime fixtures passes that target 11/11 (1 ignored). Build targets and the job evidence remain under $HOME/.cache/codex-scratch; the /tmp fixture root will be removed after the gates.

The next serial iterate run passed the install suite (94/94) and `previous_attempt_shell` (1/1 with the runtime helper), then exposed three `recovery_support` failures because the home-cache fixture path made AF_UNIX names exceed `sun_path`. Setting `INFRATERNAL_TEST_SOCKET_ROOT=/tmp/sync-hold-206` for these small runtime fixtures passes that target 11/11 (1 ignored). Build targets and the job evidence remain under `$HOME/.cache/codex-scratch`; the `/tmp` fixture root will be removed after the gates.
Author
Owner

Step complete at 875cef413987d681fea5dafecade2f33cd0c5247: scripts/verify iterate passed with all Rust rows PASS, compiler metadata tests 2/2, tracer/type checks, and protocol tests 37/37. Rust tests ran serially with isolated test roots (INFRATERNAL_TEST_STATE_ROOT, INFRATERNAL_TEST_SOCKET_ROOT, INFRATERNAL_TEST_RUNTIME_HELPER) to avoid fixture collisions and AF_UNIX path overflow. Verbatim final line: ITERATE gate passed. This is not the final gate: run scripts/verify fast before reporting done. Starting the required fast gate.

Step complete at `875cef413987d681fea5dafecade2f33cd0c5247`: `scripts/verify iterate` passed with all Rust rows PASS, compiler metadata tests 2/2, tracer/type checks, and protocol tests 37/37. Rust tests ran serially with isolated test roots (`INFRATERNAL_TEST_STATE_ROOT`, `INFRATERNAL_TEST_SOCKET_ROOT`, `INFRATERNAL_TEST_RUNTIME_HELPER`) to avoid fixture collisions and AF_UNIX path overflow. Verbatim final line: `ITERATE gate passed. This is not the final gate: run scripts/verify fast before reporting done.` Starting the required fast gate.
Author
Owner

Fast-gate finding at 875cef413987d681fea5dafecade2f33cd0c5247: x86_64 and aarch64 static release checks passed at their exact caps (21,225,104 and 19,427,432 bytes; both delta +0). The aggregate test row failed only in shared_ownership_shell_preserves_recovery_and_refusal_invariants: 32 Python setup errors, each KeyError: INFRATERNAL_TEST_RUNTIME_HELPER (crates/plugins/ssh/tests/previous_attempt_shell.py:25). I passed the helper under a misspelled environment variable. Rerunning the full fast gate with the correct isolated test environment; no source change is implicated.

Fast-gate finding at `875cef413987d681fea5dafecade2f33cd0c5247`: x86_64 and aarch64 static release checks passed at their exact caps (21,225,104 and 19,427,432 bytes; both delta +0). The aggregate test row failed only in `shared_ownership_shell_preserves_recovery_and_refusal_invariants`: 32 Python setup errors, each `KeyError: INFRATERNAL_TEST_RUNTIME_HELPER` (`crates/plugins/ssh/tests/previous_attempt_shell.py:25`). I passed the helper under a misspelled environment variable. Rerunning the full fast gate with the correct isolated test environment; no source change is implicated.
Author
Owner

The first merge-base size build failed because the fresh release-baseline target did not have the pinned Zig executable at auth-tools/zig/zig; I invoked the static build without the scripts/auth-toolchain setup that scripts/verify fast runs first. OpenSSL and SQLite then failed to find the compiler (see attached size-baseline-build.log). The branch fast gate remains green. Reusing the already verified pinned tool from this job’s target and retrying the same merge-base build.

The first merge-base size build failed because the fresh `release-baseline` target did not have the pinned Zig executable at `auth-tools/zig/zig`; I invoked the static build without the `scripts/auth-toolchain` setup that `scripts/verify fast` runs first. OpenSSL and SQLite then failed to find the compiler (see attached [size-baseline-build.log](https://git.kayg.org/attachments/e8d569ac-8fb8-4a65-9e9b-c5f19598b617)). The branch fast gate remains green. Reusing the already verified pinned tool from this job’s target and retrying the same merge-base build.
Author
Owner

Perf-VM rerun with load recorded before the run (load average: 0.06, 0.01, 0.00): all 20 keys were sent and host-accepted during the active hold; input send was 0.5–0.9 ms. The run returned 19 passed / 1 failed because the test read its rAF sample list immediately after seeing painted echo, before a second post-release rAF sample existed; it failed the measurement probe precondition at spec line 173, not the input or paint assertion. Attaching the raw run as perf-load-20.log. I’ll make the probe wait for its frame samples before calculating the echo frame count, then rerun 20/20 on the perf VM.

Perf-VM rerun with load recorded before the run (`load average: 0.06, 0.01, 0.00`): all 20 keys were sent and host-accepted during the active hold; input send was 0.5–0.9 ms. The run returned 19 passed / 1 failed because the test read its rAF sample list immediately after seeing painted echo, before a second post-release rAF sample existed; it failed the measurement probe precondition at spec line 173, not the input or paint assertion. Attaching the raw run as [perf-load-20.log](https://git.kayg.org/attachments/f76cc040-c8c7-45ca-85e6-e65d5080de62). I’ll make the probe wait for its frame samples before calculating the echo frame count, then rerun 20/20 on the perf VM.
Author
Owner

Probe sampling fix committed as 6c544133cde0cad7d89b61e51831083b3e4645c6; bun run check passed. Perf VM, CPUWeight=10000, load average before/after 0.16, 0.18, 0.08 / 1.01, 0.35, 0.14: 20/20 passed; all 20 inputs were sent and accepted during the hold. Send latency p50/min/max 0.60/0.50/1.00 ms; echo paint p50/max 12.85/15.10 ms, within one frame in all 20. perf-load-20-final.log. Running the final fast gate on this branch head next.

Probe sampling fix committed as `6c544133cde0cad7d89b61e51831083b3e4645c6`; `bun run check` passed. Perf VM, `CPUWeight=10000`, load average before/after `0.16, 0.18, 0.08` / `1.01, 0.35, 0.14`: 20/20 passed; all 20 inputs were sent and accepted during the hold. Send latency p50/min/max `0.60/0.50/1.00 ms`; echo paint p50/max `12.85/15.10 ms`, within one frame in all 20. [perf-load-20-final.log](https://git.kayg.org/attachments/8d9db7a6-58c5-45f9-bd54-b7d3b5c4fd05). Running the final fast gate on this branch head next.
Author
Owner

Finished at head 6c544133cde0cad7d89b61e51831083b3e4645c6; worktree clean. No push or deploy.

The onData path now sends real user input through handleInput before cursor-blink work and renderer wake; the parser-response branch still wakes rendering and returns without sending input. The test measures WebSocket input send and mock-host acceptance while synchronized paint is held, then waits for rAF samples before counting release frames. No visual styles, components or dependencies changed.

Perf VM, CPUWeight=10000, 20/20 repetitions passed. All 20 keys were sent and accepted during the hold. Send latency p50/min/max: 0.60/0.50/1.00 ms. Echo paint p50/max: 12.85/15.10 ms; all 20 painted within one frame. Load average before/after: 0.16, 0.18, 0.08 / 1.01, 0.35, 0.14. Existing synchronized-output browser regression also passed 1/1; hold release was 488.1 ms and echoed output painted within one frame.

Stripped static x86_64 size against merge base 149793e5abb8aa27e563e1a326252073f6498632: base 21,225,872 bytes, branch 21,225,104 bytes, delta -768 bytes.

Final scripts/verify fast summary (verbatim; complete transcript attached):

+---------------------------+--------------+
| 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. [3.42s]

Receipts: final fast log, perf-VM 20/20 with load, size comparison, existing synchronized-output browser test.

Finished at head `6c544133cde0cad7d89b61e51831083b3e4645c6`; worktree clean. No push or deploy. The `onData` path now sends real user input through `handleInput` before cursor-blink work and renderer wake; the parser-response branch still wakes rendering and returns without sending input. The test measures WebSocket input send and mock-host acceptance while synchronized paint is held, then waits for rAF samples before counting release frames. No visual styles, components or dependencies changed. Perf VM, `CPUWeight=10000`, 20/20 repetitions passed. All 20 keys were sent and accepted during the hold. Send latency p50/min/max: `0.60/0.50/1.00 ms`. Echo paint p50/max: `12.85/15.10 ms`; all 20 painted within one frame. Load average before/after: `0.16, 0.18, 0.08` / `1.01, 0.35, 0.14`. Existing synchronized-output browser regression also passed 1/1; hold release was 488.1 ms and echoed output painted within one frame. Stripped static x86_64 size against merge base `149793e5abb8aa27e563e1a326252073f6498632`: base `21,225,872` bytes, branch `21,225,104` bytes, delta `-768` bytes. Final `scripts/verify fast` summary (verbatim; complete transcript attached): ```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. [3.42s] ``` Receipts: [final fast log](https://git.kayg.org/attachments/4337fcf9-6142-4c41-ab35-e66aee4b4863), [perf-VM 20/20 with load](https://git.kayg.org/attachments/8d9db7a6-58c5-45f9-bd54-b7d3b5c4fd05), [size comparison](https://git.kayg.org/attachments/7faf2c07-7933-4464-aae3-41d676d9f42b), [existing synchronized-output browser test](https://git.kayg.org/attachments/bf42fa91-5dd8-47a5-b005-5cd2b60f2ff4).
Author
Owner

Release 8 started on release-8, production base 173a9ba14f. Worktree clean. Applying the reviewed D307 production-line merge, then only each requested dev branch’s own non-merge commits with -x. No deploy; monitor01 untouched. Final gates, size table, artifact hashes and perf-VM copied-database staging evidence will follow.

Release 8 started on release-8, production base 173a9ba14f458a8451d31c6e72e86cd73b8911f3. Worktree clean. Applying the reviewed D307 production-line merge, then only each requested dev branch’s own non-merge commits with -x. No deploy; monitor01 untouched. Final gates, size table, artifact hashes and perf-VM copied-database staging evidence will follow.
Author
Owner

Release-8 step pushed: 202d6f2f3d45b21d28e04606bdfc9e5ef28287a6, source ba8085b7ca1de3a3641f631688d7b09a605fb726 with -x provenance; 1 changed files. Passed: staged whitespace, fmt, touched-crate clippy, touched Rust tests. No deploy. Full fast gate and browser qualification follow on the final combined head.

Release-8 step pushed: `202d6f2f3d45b21d28e04606bdfc9e5ef28287a6`, source `ba8085b7ca1de3a3641f631688d7b09a605fb726` with -x provenance; 1 changed files. Passed: staged whitespace, fmt, touched-crate clippy, touched Rust tests. No deploy. Full fast gate and browser qualification follow on the final combined head.
Author
Owner

Release-8 step pushed: bac2f044ce937c245bfca4e9d41227d79cde252c, source 583bafb443a93446a223bed02f0d6d68ce017a7b with -x provenance; 3 changed files. Passed: staged whitespace, tracer typecheck, connection/reply unit suites, available synchronized-output/stale unit suites, shell syntax. No deploy. Full fast gate and browser qualification follow on the final combined head.

Release-8 step pushed: `bac2f044ce937c245bfca4e9d41227d79cde252c`, source `583bafb443a93446a223bed02f0d6d68ce017a7b` with -x provenance; 3 changed files. Passed: staged whitespace, tracer typecheck, connection/reply unit suites, available synchronized-output/stale unit suites, shell syntax. No deploy. Full fast gate and browser qualification follow on the final combined head.
Author
Owner

Release-8 step pushed: 7d510df4ceac26aab4cb62fc5e5f81eba48e64e9, source 3db72a9f3466a8d8bc9d12101167cffc2d764dee with -x provenance; 1 changed files. Passed: staged whitespace, fmt, touched-crate clippy, touched Rust tests. No deploy. Full fast gate and browser qualification follow on the final combined head.

Release-8 step pushed: `7d510df4ceac26aab4cb62fc5e5f81eba48e64e9`, source `3db72a9f3466a8d8bc9d12101167cffc2d764dee` with -x provenance; 1 changed files. Passed: staged whitespace, fmt, touched-crate clippy, touched Rust tests. No deploy. Full fast gate and browser qualification follow on the final combined head.
Author
Owner

Release-8 step pushed: e345c5fcf576df4938028042228261d72090ac26, source 5efb7fe496319367310572c55d637d69a3fd9754 with -x provenance; 5 changed files. Passed: staged whitespace, tracer typecheck, connection/reply unit suites, available synchronized-output/stale unit suites. No deploy. Full fast gate and browser qualification follow on the final combined head.

Release-8 step pushed: `e345c5fcf576df4938028042228261d72090ac26`, source `5efb7fe496319367310572c55d637d69a3fd9754` with -x provenance; 5 changed files. Passed: staged whitespace, tracer typecheck, connection/reply unit suites, available synchronized-output/stale unit suites. No deploy. Full fast gate and browser qualification follow on the final combined head.
Author
Owner

Release-8 step pushed: aca32908f9a5911a78d5384c7e7fa579f77254b7, source 763c133392b8726d72edbc15aed3e8edc3430b99 with -x provenance; 1 changed files. Passed: staged whitespace, tracer typecheck, connection/reply unit suites, available synchronized-output/stale unit suites. No deploy. Full fast gate and browser qualification follow on the final combined head.

Release-8 step pushed: `aca32908f9a5911a78d5384c7e7fa579f77254b7`, source `763c133392b8726d72edbc15aed3e8edc3430b99` with -x provenance; 1 changed files. Passed: staged whitespace, tracer typecheck, connection/reply unit suites, available synchronized-output/stale unit suites. No deploy. Full fast gate and browser qualification follow on the final combined head.
Author
Owner

Release-8 integration finding for 5efb7fe49: constructor-less #244/D307 TerminalClient fixtures lacked the new required synchronizedOutput control. First run: 90 pass / 10 fail; restartCursors threw before refusal/attach assertions. Resolved by supplying the lifecycle control in the three fixtures, not weakening the production field. Rerun: 100 pass / 0 fail / 387 assertions; renderer/reply scope tests 17 pass / 0 fail / 1,794 assertions. Committed/pushed e345c5fcf. Both ordinary and atomic writes keep D307 reply marking and replay offsets.

Failing fixture run · Passing rerun. No extra dev dependency.

Release-8 integration finding for 5efb7fe49: constructor-less #244/D307 TerminalClient fixtures lacked the new required synchronizedOutput control. First run: 90 pass / 10 fail; restartCursors threw before refusal/attach assertions. Resolved by supplying the lifecycle control in the three fixtures, not weakening the production field. Rerun: 100 pass / 0 fail / 387 assertions; renderer/reply scope tests 17 pass / 0 fail / 1,794 assertions. Committed/pushed e345c5fcf. Both ordinary and atomic writes keep D307 reply marking and replay offsets. [Failing fixture run](https://git.kayg.org/attachments/f9718048-0307-4712-a3c4-f0d48dc172ae) · [Passing rerun](https://git.kayg.org/attachments/db54edc5-7eb4-4384-a62e-eb7ae45b4284). No extra dev dependency.
Author
Owner

Release-8 step pushed: cc01421d228172770067931cce45d0c0b971ad4d, source b2837b9a711c24b238a0bd1401aafdb5ff5bd9a2 with -x provenance; 2 changed files. Passed: staged whitespace, tracer typecheck, connection/reply unit suites, available synchronized-output/stale unit suites. No deploy. Full fast gate and browser qualification follow on the final combined head.

Release-8 step pushed: `cc01421d228172770067931cce45d0c0b971ad4d`, source `b2837b9a711c24b238a0bd1401aafdb5ff5bd9a2` with -x provenance; 2 changed files. Passed: staged whitespace, tracer typecheck, connection/reply unit suites, available synchronized-output/stale unit suites. No deploy. Full fast gate and browser qualification follow on the final combined head.
Author
Owner

Release-8 step pushed: 2976cc1dc8d7622900ec0af5d243c07337a78d99, source 278ec65bbc235c160ecdd961f7c362201551245d with -x provenance; 1 changed files. Passed: staged whitespace, tracer typecheck, connection/reply unit suites, available synchronized-output/stale unit suites. No deploy. Full fast gate and browser qualification follow on the final combined head.

Release-8 step pushed: `2976cc1dc8d7622900ec0af5d243c07337a78d99`, source `278ec65bbc235c160ecdd961f7c362201551245d` with -x provenance; 1 changed files. Passed: staged whitespace, tracer typecheck, connection/reply unit suites, available synchronized-output/stale unit suites. No deploy. Full fast gate and browser qualification follow on the final combined head.
Author
Owner

Release-8 step pushed: bf6f6a04fc2aae3d2275394b41ad4a79f6969aa5, source 9862541540b0c5f32011bb6a5550f849fdbe3206 with -x provenance; 1 changed files. Passed: staged whitespace, fmt, touched-crate clippy, touched Rust tests. No deploy. Full fast gate and browser qualification follow on the final combined head.

Release-8 step pushed: `bf6f6a04fc2aae3d2275394b41ad4a79f6969aa5`, source `9862541540b0c5f32011bb6a5550f849fdbe3206` with -x provenance; 1 changed files. Passed: staged whitespace, fmt, touched-crate clippy, touched Rust tests. No deploy. Full fast gate and browser qualification follow on the final combined head.
Author
Owner

Release-8 step pushed: 9a8efc6bdc0799fae0f2adadfb89db4d6c3e33ab, source b9c7dc68a8a7ef075008a5b0a29802014d53a0a5 with -x provenance; 1 changed files. Passed: staged whitespace, shell syntax. No deploy. Full fast gate and browser qualification follow on the final combined head.

Release-8 step pushed: `9a8efc6bdc0799fae0f2adadfb89db4d6c3e33ab`, source `b9c7dc68a8a7ef075008a5b0a29802014d53a0a5` with -x provenance; 1 changed files. Passed: staged whitespace, shell syntax. No deploy. Full fast gate and browser qualification follow on the final combined head.
Author
Owner

Release-8 step pushed: c0ea705e276d8b4a68ac318b36494a4f6d84d52a, source 291a4348797950efb544da0704b2f14cf6cc1e01 with -x provenance; 7 changed files. Passed: staged whitespace, tracer typecheck, connection/reply unit suites, available synchronized-output/stale unit suites. No deploy. Full fast gate and browser qualification follow on the final combined head.

Release-8 step pushed: `c0ea705e276d8b4a68ac318b36494a4f6d84d52a`, source `291a4348797950efb544da0704b2f14cf6cc1e01` with -x provenance; 7 changed files. Passed: staged whitespace, tracer typecheck, connection/reply unit suites, available synchronized-output/stale unit suites. No deploy. Full fast gate and browser qualification follow on the final combined head.
Author
Owner

Release-8 step pushed: a789e6a434049cf606431a824af5bf3a4a24d5c2, source a5aac70f9012b6cb5af0bcac7ad84318263556fd with -x provenance; 1 changed files. Passed: staged whitespace, tracer typecheck, connection/reply unit suites, available synchronized-output/stale unit suites. No deploy. Full fast gate and browser qualification follow on the final combined head.

Release-8 step pushed: `a789e6a434049cf606431a824af5bf3a4a24d5c2`, source `a5aac70f9012b6cb5af0bcac7ad84318263556fd` with -x provenance; 1 changed files. Passed: staged whitespace, tracer typecheck, connection/reply unit suites, available synchronized-output/stale unit suites. No deploy. Full fast gate and browser qualification follow on the final combined head.
Author
Owner

Release-8 step pushed: c4f978b80a1b13dd1c9602c6da5091299821e95e, source 452ad8de952c789b2c8c477fe95fee219c610a4a with -x provenance; 1 changed files. Passed: staged whitespace, tracer typecheck, connection/reply unit suites, available synchronized-output/stale unit suites. No deploy. Full fast gate and browser qualification follow on the final combined head.

Release-8 step pushed: `c4f978b80a1b13dd1c9602c6da5091299821e95e`, source `452ad8de952c789b2c8c477fe95fee219c610a4a` with -x provenance; 1 changed files. Passed: staged whitespace, tracer typecheck, connection/reply unit suites, available synchronized-output/stale unit suites. No deploy. Full fast gate and browser qualification follow on the final combined head.
Author
Owner

Release-8 step pushed: 0bde5622238e774bf43edc34cbb2902f0cc063b4, source 875cef413987d681fea5dafecade2f33cd0c5247 with -x provenance; 1 changed files. Passed: staged whitespace, tracer typecheck, connection/reply unit suites, available synchronized-output/stale unit suites. No deploy. Full fast gate and browser qualification follow on the final combined head.

Release-8 step pushed: `0bde5622238e774bf43edc34cbb2902f0cc063b4`, source `875cef413987d681fea5dafecade2f33cd0c5247` with -x provenance; 1 changed files. Passed: staged whitespace, tracer typecheck, connection/reply unit suites, available synchronized-output/stale unit suites. No deploy. Full fast gate and browser qualification follow on the final combined head.
Author
Owner

Native #206 measurement committed/pushed as 9a8efc6bd (source b9c7dc68a, production-specific cap adaptation). x86_64 21,387,184 B; aarch64 19,559,112 B. Deltas from D307: -640 / -512; from release 7: +1,920 / -11,144. x86 is 18,080 bytes below the stop line. Both images stripped/static with no PT_INTERP; production-trust and exact/+1-byte/downward-ratchet checks PASS. The source commit’s dev-line measurements are not the production measurements.

Both static builds and SHA256s · cap/trust boundary checks. Final-head fast/repro/browser gates remain pending. No deploy.

Native #206 measurement committed/pushed as 9a8efc6bd (source b9c7dc68a, production-specific cap adaptation). x86_64 21,387,184 B; aarch64 19,559,112 B. Deltas from D307: -640 / -512; from release 7: +1,920 / -11,144. x86 is 18,080 bytes below the stop line. Both images stripped/static with no PT_INTERP; production-trust and exact/+1-byte/downward-ratchet checks PASS. The source commit’s dev-line measurements are not the production measurements. [Both static builds and SHA256s](https://git.kayg.org/attachments/9cbdbc65-07af-48f1-8734-6d53f44b66cf) · [cap/trust boundary checks](https://git.kayg.org/attachments/393f5ed6-257f-41b1-91a5-80cc28eafb44). Final-head fast/repro/browser gates remain pending. No deploy.
Author
Owner

Release-8 step pushed: 7419591b6548b501e8042bfd9b3ea570eb5005cf, source 6c544133cde0cad7d89b61e51831083b3e4645c6 with -x provenance; 1 changed files. Passed: staged whitespace, tracer typecheck, connection/reply unit suites, available synchronized-output/stale unit suites. No deploy. Full fast gate and browser qualification follow on the final combined head.

Release-8 step pushed: `7419591b6548b501e8042bfd9b3ea570eb5005cf`, source `6c544133cde0cad7d89b61e51831083b3e4645c6` with -x provenance; 1 changed files. Passed: staged whitespace, tracer typecheck, connection/reply unit suites, available synchronized-output/stale unit suites. No deploy. Full fast gate and browser qualification follow on the final combined head.
Author
Owner

Perf-VM staging passed at 85b0285b73: 11/11 reviewed real-server specs and 5/5 additional real-PTY acceptance checks. Production web and full-server image bc3e7b2fa2bde97d06b548981954a96d68f4a8524fed2b41a7c80d99348de58b.

  • Copied v29 database: 50 users, 10,000 seeded nodes plus the fixture's existing node, migration checksums preserved, integrity=ok.
  • 393×852 phone: every column >=349 px; the reviewed floor case measured [349,349,349,349]. Canonical layout revision and weights unchanged by phone use. Copied-database capture retained revision 8.
  • Silent shell: both viewers showed “screen may be out of date”; typing cleared both notes.
  • Full-screen mode 2026: input send 0.9 ms, hold-to-send 10.1 ms, release-to-paint 2.0 ms / one frame.
  • Desktop and phone: one cursor-query reply each, including a query inside a synchronized frame. Three-viewer corpus: 30 query forms, one PTY copy each.
  • Real resume refusal (1008): fresh typing accepted; Discard dropped old typing; Send again sent it once.

Machine: infraternal-perf-test, 4 vCPU, kernel 6.12.111+deb13-amd64; final acceptance load 1.35/0.84/0.40 before, 2.42/1.20/0.54 after; separate lock holds; CPUWeight=10000. No deployment. Bundle and final gates remain in progress.

staging-final-driver.log
real-reviewed.log
staging-capture-driver.log
release8-phone-canvas.png
release8-phone-stale-note.png
release8-desktop-stale-note.png
release8-phone-widths.json
release8-real-sync-echo.json

Perf-VM staging passed at 85b0285b733bac4c94d7540c58d4521d1a3410c4: 11/11 reviewed real-server specs and 5/5 additional real-PTY acceptance checks. Production web and full-server image bc3e7b2fa2bde97d06b548981954a96d68f4a8524fed2b41a7c80d99348de58b. - Copied v29 database: 50 users, 10,000 seeded nodes plus the fixture's existing node, migration checksums preserved, integrity=ok. - 393×852 phone: every column >=349 px; the reviewed floor case measured [349,349,349,349]. Canonical layout revision and weights unchanged by phone use. Copied-database capture retained revision 8. - Silent shell: both viewers showed “screen may be out of date”; typing cleared both notes. - Full-screen mode 2026: input send 0.9 ms, hold-to-send 10.1 ms, release-to-paint 2.0 ms / one frame. - Desktop and phone: one cursor-query reply each, including a query inside a synchronized frame. Three-viewer corpus: 30 query forms, one PTY copy each. - Real resume refusal (1008): fresh typing accepted; Discard dropped old typing; Send again sent it once. Machine: infraternal-perf-test, 4 vCPU, kernel 6.12.111+deb13-amd64; final acceptance load 1.35/0.84/0.40 before, 2.42/1.20/0.54 after; separate lock holds; CPUWeight=10000. No deployment. Bundle and final gates remain in progress. [staging-final-driver.log](https://git.kayg.org/attachments/83a6af67-ffda-4186-bb47-988ee59d80d3) [real-reviewed.log](https://git.kayg.org/attachments/9e5ecf9d-385d-4b8a-9ff5-ba83f23f8ef7) [staging-capture-driver.log](https://git.kayg.org/attachments/3fb96db9-42d0-4a46-a33c-95d7695e376c) ![release8-phone-canvas.png](https://git.kayg.org/attachments/99927b8e-294d-4bf1-9e9c-90bcebd232b3) ![release8-phone-stale-note.png](https://git.kayg.org/attachments/866c160e-79ce-4c81-8499-a25641cb0b04) ![release8-desktop-stale-note.png](https://git.kayg.org/attachments/91eb41ef-9187-4b7d-a4fa-49fee9c8429c) [release8-phone-widths.json](https://git.kayg.org/attachments/b7212fa7-b6d0-4342-a1a2-b863f50863df) [release8-real-sync-echo.json](https://git.kayg.org/attachments/6bb66b9b-4331-45f9-b377-cf0b55be839c)
Author
Owner

Final-head browser regression gate passed: 35/35 requested browser regressions, plus synchronized-output-input.spec.ts 20/20 repeated runs, on the perf VM under the shared lock and CPUWeight=10000. Every repeated run sent and accepted typing while held, then painted the echo one frame after release. Input send 0.5–0.9 ms (p95 0.8 ms); release-to-echo 4.6–16.3 ms (p95 13.8 ms). Native full-screen acceptance independently passed at one frame.

Head 85b0285b73. The earlier real-server suite passed 11/11 and acceptance 5/5. Perf scopes are inactive, test ports closed, staged server bytes equal the completed bundle server, and the private VM job directory was removed after copying receipts. Final host gate and reproducibility are still running.

Verbatim browser/perf output
20-run measurements
Artifact manifest and hashes
Production trust/static linkage: seven images

Final-head browser regression gate passed: 35/35 requested browser regressions, plus synchronized-output-input.spec.ts 20/20 repeated runs, on the perf VM under the shared lock and CPUWeight=10000. Every repeated run sent and accepted typing while held, then painted the echo one frame after release. Input send 0.5–0.9 ms (p95 0.8 ms); release-to-echo 4.6–16.3 ms (p95 13.8 ms). Native full-screen acceptance independently passed at one frame. Head 85b0285b733bac4c94d7540c58d4521d1a3410c4. The earlier real-server suite passed 11/11 and acceptance 5/5. Perf scopes are inactive, test ports closed, staged server bytes equal the completed bundle server, and the private VM job directory was removed after copying receipts. Final host gate and reproducibility are still running. [Verbatim browser/perf output](https://git.kayg.org/attachments/d3e0b845-bb2f-4176-a1fa-0ec2468acd94) [20-run measurements](https://git.kayg.org/attachments/a6432ec8-5956-4d6f-ab89-48a92bd54100) [Artifact manifest and hashes](https://git.kayg.org/attachments/9f0cbf75-fdfb-4e4e-8395-f1ccc33853cc) [Production trust/static linkage: seven images](https://git.kayg.org/attachments/eab4b03b-1e69-45e7-a55f-2e2f930451bd)
Author
Owner

Release 8 qualification finished. Head 85b0285b733bac4c94d7540c58d4521d1a3410c4 is pushed only to release-8; production base 173a9ba14f458a8451d31c6e72e86cd73b8911f3. No deployment; monitor01 untouched. Issues remain open.

Applied history: D307 merge ed725f9db40aa69031c524950a02c276c340a43d has source parent 3e95f8262c993cd1cc38a81ff585e535dafc1e0a (41 D307 commits). Then 23 own source/review commits were cherry-picked oldest first with -x, followed by the release size documentation. No other dev lineage or dependency was imported. Full D307 history and commit bodies: ledger.

D307 merge -> ed725f9db40aa69031c524950a02c276c340a43d: Merge reviewed D307 terminal replies onto release 7 (#24)
ba8085b7ca1de3a3641f631688d7b09a605fb726 -> 202d6f2f3d45b21d28e04606bdfc9e5ef28287a6: Set true-color capability for PTY shells (#206)
583bafb443a93446a223bed02f0d6d68ce017a7b -> bac2f044ce937c245bfca4e9d41227d79cde252c: Track DEC 2026 synchronized paint holds (#206)
3db72a9f3466a8d8bc9d12101167cffc2d764dee -> 7d510df4ceac26aab4cb62fc5e5f81eba48e64e9: Allow a short root for SSH socket fixtures (#206)
5efb7fe496319367310572c55d637d69a3fd9754 -> e345c5fcf576df4938028042228261d72090ac26: Hold terminal paints for synchronized output (#206)
763c133392b8726d72edbc15aed3e8edc3430b99 -> aca32908f9a5911a78d5384c7e7fa579f77254b7: Test every DEC 2026 chunk split (#206)
b2837b9a711c24b238a0bd1401aafdb5ff5bd9a2 -> cc01421d228172770067931cce45d0c0b971ad4d: Test split synchronized frames in the browser (#206)
278ec65bbc235c160ecdd961f7c362201551245d -> 2976cc1dc8d7622900ec0af5d243c07337a78d99: test tracer: measure synchronized hold after mode entry (#206)
9862541540b0c5f32011bb6a5550f849fdbe3206 -> bf6f6a04fc2aae3d2275394b41ad4a79f6969aa5: Use a borrowed path for the PTY fallback shell
b9c7dc68a8a7ef075008a5b0a29802014d53a0a5 -> 9a8efc6bdc0799fae0f2adadfb89db4d6c3e33ab: Ratchet production PTY size ceilings to both measured artifacts (#206)
291a4348797950efb544da0704b2f14cf6cc1e01 -> c0ea705e276d8b4a68ac318b36494a4f6d84d52a: fix(tracer): paint synchronized output on release frame (#206)
a5aac70f9012b6cb5af0bcac7ad84318263556fd -> a789e6a434049cf606431a824af5bf3a4a24d5c2: test(tracer): cover input during synchronized output hold
452ad8de952c789b2c8c477fe95fee219c610a4a -> c4f978b80a1b13dd1c9602c6da5091299821e95e: test: measure keyboard input during synchronized holds
875cef413987d681fea5dafecade2f33cd0c5247 -> 0bde5622238e774bf43edc34cbb2902f0cc063b4: fix: send terminal input before renderer wake
6c544133cde0cad7d89b61e51831083b3e4645c6 -> 7419591b6548b501e8042bfd9b3ea570eb5005cf: test: wait for paint samples before measuring echo
5108da2db607373c7ca364e186f278fe5ca35497 -> faa7af66e00ff39191f4276fecb9d52c31521515: tracer: decide when a reattached screen may be out of date (D309, #248)
4210d220219b7342937e8f97ccc43e40a8a0d629 -> 8e4f480f6c137a9dbc69def72d354da1108935d2: ui: a quiet terminal note in the half away from the cursor (D309, #248)
94933af83686b6e2ddeda1b70f02477a2f6f926a -> c8aa3672722ad5525184342e50205d5bccc6b20a: tracer: show the stale-screen note after a reattach that stays silent (D309, #248)
9fd1bc40eb1929a306a754b4da473c3579cdae92 -> 3f8373bd9d71d688ae67db4c754007f53fa60d11: Add real stale-note D309 check
6fc234580ef948079dfa9893f0ae1d350e1f2d97 -> 7b2c649b0992e261052971accd2da201957838b0: canvas: draw every column at least a readable width on touch screens, display only (#243, D309)
7ce40989b117042cd363619c4facd51249514411 -> fd1098e984e0726a7f06615b0071edd2400204fe: test: a phone draws floor-weight columns readably and never rewrites the saved layout (#243, D309)
33d58f05d8684db12c4b77d35028858e876ff0e9 -> 5b580f368d2585e03eeea9233ef4de82ecdeb11d: canvas: re-apply the touch column minimum when the pointer kind changes (#243, D309)
ba317e3db75416c4880b503411010dd0f9729d9b -> ab63834fb81764f393999786e01117707561acc0: Add phone D309 regression coverage
1c6c8a342f08191a8c07980c3113ebcaa3acdcca -> 5739cf65cbbfca8af2240d92f27272ecda5b5937: Test pinch zoom against D309 server truth
release documentation -> 85b0285b733bac4c94d7540c58d4521d1a3410c4: Record the measured release-8 production sizes and migration scope (#24)
Stage x86_64 bytes aarch64 bytes
Release 7 21,385,264 19,570,256
D307 21,387,824 19,559,624
Sync and immediate input 21,387,184 19,559,112
Stale-screen note 21,387,184 19,559,112
Phone / final 21,387,184 19,559,112

Final delta against release 7: +1,920 x86_64 / −11,144 aarch64 bytes. The measured x86 increase differs from the expected approximate reduction; it is 18,080 bytes below the +20,000 stopline. Both ceilings equal the measured sizes. Stale-note and phone stages retain byte-identical native images. Same pinned static recipe and compiler as release 7; no Cargo.lock or migration changes.

Artifacts: /home/kayg/.cache/codex-scratch/release-8/artifacts in the release-7 layout, including both full images, bundle (both host and session architectures), production web, web-dist.tar, MANIFEST.txt and checksums. The bundle already carries the ARM host image; a later authorized deploy uses --bin, --bundle, --web. Seven executable images passed production trust and static-link checks. Staged server compared byte-identical to the completed bundle server.

bc3e7b2fa2bde97d06b548981954a96d68f4a8524fed2b41a7c80d99348de58b  infraternal-x86_64-musl
46812c6bfeffb01e536112d422d1db8809bb136f2504efde1bac8df7ca8ce26f  infraternal-aarch64-musl
7865016ed5a56d366dc1cc172c129a2d3136fa2179f199feec25cb203fae9a8a  web-dist.tar
d37fba961139bb4b07a511d08b3e0b5abb333a5ceb88aae000e4909dc03527a9  web-SHA256SUMS
e5673ff83c85e0bf56040c6f0946868012399bd6feadd88255e210e952185f1c  bundle/SHA256SUMS
bc3e7b2fa2bde97d06b548981954a96d68f4a8524fed2b41a7c80d99348de58b  bundle/infraternal
2e94b4ce12b8c0360297c90585cbd2709397727a5ed5c1141fba7c780fd6fdf6  bundle/infraternal-aarch64-musl
75801bc7ed1bc3668340b8df50eaa45a3772292c8a6038eef0a1ba8999bd4fc6  bundle/infraternal-aarch64-session-musl
f87c2b23144ac48453ea8277052193abef55af8172261973affe50b372c069df  bundle/infraternal-x86_64-musl
7094e3f52dd6eb3d90f052059656e8e50e2addde56565920447a31a5e195a9db  bundle/infraternal-x86_64-session-musl
Gate Result
build-slot scripts/verify fast, final head PASS, no waiver
build-slot python3 scripts/test-static-reproducibility.py PASS, both architectures byte-identical
Reviewed real-server specs, playwright.real.config.ts 11/11
Additional real-PTY acceptance, playwright.real.config.ts 5/5
Requested browser regression specs 35/35
synchronized-output-input repeat-each=20 20/20
Copied release-7 v29 database through SQLx startup PASS
Production trust / static linkage / checksums PASS

Host gates used private fixture state and the short socket-path alias required by the Unix-socket tests; the GNU runner forwards every test and skips no checks. Exact commands and environment are attached.

The existing query/refusal/retained-typing/synchronized-output/stale-screen browser specs depend on /__mock controls. They ran against a separate sealed preview-enabled test build; shipping web stayed preview-disabled. Real-server counterparts additionally covered real 1008 refusal + Discard/Send again, full-screen mode 2026 input/paint, stale replay, cursor queries and persisted phone geometry. Native binary and shipping assets came from this head.

Perf-VM staging (infraternal-perf-test, 4 vCPU, kernel 6.12.111+deb13-amd64, CPUWeight=10000, separate short lock holds):

  • Production-shaped v29 copy retained 29 migration checksums, 50 users, 10,000 seeded nodes, legacy null hostname and existing canvas; integrity=ok; web HTTP=200. No new migration exists to renumber. The enrolled browser copy additionally retained its pre-existing mesh node (10,001 total).
  • Desktop + 393×852 phone: reviewed widths [349,349,349,349]; the copied-database capture also met the >=349 minimum, with revision 8 unchanged by phone use. Direct persisted-layout review covered rotation, pinch, reload, pointer changes and desktop edits.
  • Silent shell: desktop and phone showed “screen may be out of date”; typing cleared both.
  • Full-screen mode 2026: input send 0.9 ms, hold-to-send 10.1 ms, release-to-paint 2.0 ms, one release frame.
  • Twenty repeated held-input runs: send 0.5–0.9 ms, p95 0.8 ms; echo after release 4.6–16.3 ms, p95 13.8 ms; all input sent/accepted while held, all echoes one release frame.
  • Desktop and phone each received one cursor-query reply, including a synchronized query. Three-viewer real PTY corpus: 30 query forms, one PTY copy each; sixteen outstanding requests, expiry and ordinary-input ordering passed.
  • Real resume refusal: fresh typing remained usable; Discard discarded old text; Send again sent it once.
  • Loads and machine details are in each raw receipt. The initial additional-copy assertion counted 10,000 total nodes and failed because the fixture already had one; only that external harness was corrected. Diagnostic. All corrected acceptance checks passed.

Author checklist: review receipt. All owned VM scopes are inactive, ports are closed, private VM job removed, and temporary host Cargo/upload/comparison roots removed. Artifacts and evidence are retained outside the checkout.

Verbatim final Rust gate table (full unmodified gate transcript attached below):

+---------------------------+--------------+
| Rust gate                 | Result       |
+---------------------------+--------------+
| fmt                       | PASS         |
| VT native fmt             | PASS         |
| CLI plugin compile-out    | PASS         |
| clippy                    | PASS         |
| SSH runtime test helper   | PASS         |
| test                      | PASS         |
| SSH inode reuse fixture   | PASS         |
| cargo-deny                | PASS         |
| static builds             | PASS         |
+---------------------------+--------------+

Verbatim final protocol gate output:

==> TypeScript protocol tests
bun test v1.4.2 (744846f84)

src/mesh-review-revocation.test.ts:
(pass) review forbidden event cancels pending snapshot publication [2.38ms]
(pass) subscription forbidden ends delivery before a late refresh rejection [1.51ms]
(pass) subscription not found ends delivery before a late refresh rejection [1.14ms]
(pass) subscription invalid input ends delivery before a late refresh rejection [1.14ms]
(pass) subscription mesh unavailable ends delivery before a late refresh rejection [1.12ms]
(pass) synchronous subscription refusal releases the transport exactly once [0.23ms]

src/codec.test.ts:
(pass) wire protocol golden vectors > encodes and decodes each frame exactly as the shared manifest describes [6.66ms]
(pass) wire protocol golden vectors > returns borrowed payload views and writes into reusable buffers [0.27ms]
(pass) wire protocol golden vectors > decodes muxed messages split across WebSocket messages [0.95ms]
(pass) wire protocol golden vectors > rejects oversized, non-canonical, unknown, and malformed frame bytes [0.20ms]
(pass) split mux header preserves trailing Close [0.23ms]
(pass) reply-marked Input uses an additive bounded layout without changing legacy input [0.46ms]
(pass) empty marked input reports the stable invalid-body decoder failure [0.10ms]

src/mesh-review-paged-error.test.ts:
(pass) review earlier snapshot continuation failure cannot replace a newer complete refresh [2.68ms]
(pass) review earlier snapshot continuation cannot overwrite a delivered revision [2.61ms]
(pass) a newer paged event owns publication before an earlier refresh resumes [2.49ms]

src/mesh-review-refresh.test.ts:
(pass) review superseded refresh failure cannot replace authoritative resync [1.38ms]
(pass) superseded failure preserves a newer pending refresh [2.66ms]

src/stream.test.ts:
stream differential: 141 streams, 11988 schedules, zero divergences
(pass) Rust and TypeScript preserve every frame at all boundaries and random multi-splits [2349.94ms]
(pass) maximum frame size and fragmented oversized prefix obey the allocation boundary [6.77ms]

src/mesh.test.ts:
(pass) Mesh actions map to their typed action IDs and JSON inputs [1.76ms]
(pass) Mesh watch coalesces change bursts and never publishes an older revision [3.79ms]
(pass) Mesh watch forwards server errors and stops delivering after unsubscribe [0.19ms]
(pass) Mesh enrollment carries an explicit authenticated host binding [0.24ms]

src/mesh-review-continuation.test.ts:
(pass) review continuation stops after stop [1.46ms]
(pass) review continuation stops after forbidden [1.17ms]
(pass) review continuation stops after superseded [1.14ms]

src/mesh-pagination.test.ts:
(pass) list assembles bounded pages using the same filter [0.19ms]
(pass) a changed revision discards earlier pages before assembling its restart [0.10ms]
(pass) malformed continuation is refused: {"revision":1,"offset":0} [0.23ms]
(pass) malformed continuation is refused: {"revision":2,"offset":1} [0.02ms]
(pass) malformed continuation is refused: {"revision":1,"offset":2}
(pass) watch never publishes a partial page; withdrawn=false [1.29ms]
(pass) watch never publishes a partial page; withdrawn=true [1.15ms]
(pass) a superseding equal-revision resync wins over pending page assembly [1.30ms]

src/mesh-review-resync.test.ts:
(pass) review watch applies same-revision authoritative resync [0.12ms]
(pass) authoritative resync keeps priority over an equal-revision pending list [1.34ms]

src/mesh-vectors.test.ts:
(pass) every shared Mesh action vector passes through the typed client unchanged [0.81ms]
(pass) shared Mesh event vectors drive the typed watch adapter [5.07ms]

 39 pass
 0 fail
 36135 expect() calls
Ran 39 tests across 10 files. [2.42s]

Verbatim reproducibility output:

Preparing worktree (detached HEAD 85b0285b7)
HEAD is now at 85b0285b7 Record the measured release-8 production sizes and migration scope (#24)
commit=85b0285b733bac4c94d7540c58d4521d1a3410c4
main_checkout=/home/kayg/Developer/infraternal/.worktrees/release-8
alternate_checkout=/home/kayg/.cache/codex-scratch/release-8/static-repro-work-gjktbxw6/long-root/with-a-distinct-and-deliberately-long-checkout-location/checkout-b
main_CARGO_HOME=/home/kayg/.cargo
alternate_CARGO_HOME=/home/kayg/.cache/codex-scratch/release-8/static-repro-work-gjktbxw6/cargo-home
main_target=/home/kayg/.cache/codex-scratch/release-8/target
alternate_target=/home/kayg/.cache/codex-scratch/release-8/static-repro-work-gjktbxw6/target
main_RUSTUP_HOME=/home/kayg/.rustup
alternate_RUSTUP_HOME=/home/kayg/.cache/codex-scratch/release-8/static-repro-work-gjktbxw6/rustup-home
SCCACHE_DIR=/home/kayg/.cache/sccache-infraternal
alternate_sccache_mode=forced-recache-through-shared-server
loadavg_start=3.51 2.74 3.45 3/1051 3581349
rust_sccache_remaps_visible=True
native_x86_sccache_remaps_visible=True
native_aarch64_sccache_remaps_visible=True
rust_registry_mappings_follow_cargo_home=True
x86_64-unknown-linux-musl: main_size=21387184 alternate_size=21387184 equal=True
x86_64-unknown-linux-musl: main_sha256=bc3e7b2fa2bde97d06b548981954a96d68f4a8524fed2b41a7c80d99348de58b alternate_sha256=bc3e7b2fa2bde97d06b548981954a96d68f4a8524fed2b41a7c80d99348de58b
aarch64-unknown-linux-musl: main_size=19559112 alternate_size=19559112 equal=True
aarch64-unknown-linux-musl: main_sha256=46812c6bfeffb01e536112d422d1db8809bb136f2504efde1bac8df7ca8ce26f alternate_sha256=46812c6bfeffb01e536112d422d1db8809bb136f2504efde1bac8df7ca8ce26f
static artifact reproducibility passed; evidence: /home/kayg/.cache/codex-scratch/release-8/evidence/static-repro-3565150

final-verify-fast.log
final-static-reproducibility.log
vm-cleanup-check.log
host-cleanup-check.txt
qualification-commands.txt

perf-driver.log
held-input-20-summary.json
vm-cleanup-check.log
MANIFEST.txt
artifact-SHA256SUMS.txt
artifact-seal.json
applied-first-parent.txt

staging-final-driver.log
real-reviewed.log
staging-capture-driver.log
release8-phone-canvas.png
release8-phone-stale-note.png
release8-desktop-stale-note.png
release8-phone-widths.json
release8-real-sync-echo.json

Release 8 qualification finished. Head `85b0285b733bac4c94d7540c58d4521d1a3410c4` is pushed only to `release-8`; production base `173a9ba14f458a8451d31c6e72e86cd73b8911f3`. No deployment; monitor01 untouched. Issues remain open. Applied history: D307 merge `ed725f9db40aa69031c524950a02c276c340a43d` has source parent `3e95f8262c993cd1cc38a81ff585e535dafc1e0a` (41 D307 commits). Then 23 own source/review commits were cherry-picked oldest first with `-x`, followed by the release size documentation. No other dev lineage or dependency was imported. Full D307 history and commit bodies: [ledger](https://git.kayg.org/attachments/a50798d5-4c45-4a12-9d4c-4246514a2ef5). ```text D307 merge -> ed725f9db40aa69031c524950a02c276c340a43d: Merge reviewed D307 terminal replies onto release 7 (#24) ba8085b7ca1de3a3641f631688d7b09a605fb726 -> 202d6f2f3d45b21d28e04606bdfc9e5ef28287a6: Set true-color capability for PTY shells (#206) 583bafb443a93446a223bed02f0d6d68ce017a7b -> bac2f044ce937c245bfca4e9d41227d79cde252c: Track DEC 2026 synchronized paint holds (#206) 3db72a9f3466a8d8bc9d12101167cffc2d764dee -> 7d510df4ceac26aab4cb62fc5e5f81eba48e64e9: Allow a short root for SSH socket fixtures (#206) 5efb7fe496319367310572c55d637d69a3fd9754 -> e345c5fcf576df4938028042228261d72090ac26: Hold terminal paints for synchronized output (#206) 763c133392b8726d72edbc15aed3e8edc3430b99 -> aca32908f9a5911a78d5384c7e7fa579f77254b7: Test every DEC 2026 chunk split (#206) b2837b9a711c24b238a0bd1401aafdb5ff5bd9a2 -> cc01421d228172770067931cce45d0c0b971ad4d: Test split synchronized frames in the browser (#206) 278ec65bbc235c160ecdd961f7c362201551245d -> 2976cc1dc8d7622900ec0af5d243c07337a78d99: test tracer: measure synchronized hold after mode entry (#206) 9862541540b0c5f32011bb6a5550f849fdbe3206 -> bf6f6a04fc2aae3d2275394b41ad4a79f6969aa5: Use a borrowed path for the PTY fallback shell b9c7dc68a8a7ef075008a5b0a29802014d53a0a5 -> 9a8efc6bdc0799fae0f2adadfb89db4d6c3e33ab: Ratchet production PTY size ceilings to both measured artifacts (#206) 291a4348797950efb544da0704b2f14cf6cc1e01 -> c0ea705e276d8b4a68ac318b36494a4f6d84d52a: fix(tracer): paint synchronized output on release frame (#206) a5aac70f9012b6cb5af0bcac7ad84318263556fd -> a789e6a434049cf606431a824af5bf3a4a24d5c2: test(tracer): cover input during synchronized output hold 452ad8de952c789b2c8c477fe95fee219c610a4a -> c4f978b80a1b13dd1c9602c6da5091299821e95e: test: measure keyboard input during synchronized holds 875cef413987d681fea5dafecade2f33cd0c5247 -> 0bde5622238e774bf43edc34cbb2902f0cc063b4: fix: send terminal input before renderer wake 6c544133cde0cad7d89b61e51831083b3e4645c6 -> 7419591b6548b501e8042bfd9b3ea570eb5005cf: test: wait for paint samples before measuring echo 5108da2db607373c7ca364e186f278fe5ca35497 -> faa7af66e00ff39191f4276fecb9d52c31521515: tracer: decide when a reattached screen may be out of date (D309, #248) 4210d220219b7342937e8f97ccc43e40a8a0d629 -> 8e4f480f6c137a9dbc69def72d354da1108935d2: ui: a quiet terminal note in the half away from the cursor (D309, #248) 94933af83686b6e2ddeda1b70f02477a2f6f926a -> c8aa3672722ad5525184342e50205d5bccc6b20a: tracer: show the stale-screen note after a reattach that stays silent (D309, #248) 9fd1bc40eb1929a306a754b4da473c3579cdae92 -> 3f8373bd9d71d688ae67db4c754007f53fa60d11: Add real stale-note D309 check 6fc234580ef948079dfa9893f0ae1d350e1f2d97 -> 7b2c649b0992e261052971accd2da201957838b0: canvas: draw every column at least a readable width on touch screens, display only (#243, D309) 7ce40989b117042cd363619c4facd51249514411 -> fd1098e984e0726a7f06615b0071edd2400204fe: test: a phone draws floor-weight columns readably and never rewrites the saved layout (#243, D309) 33d58f05d8684db12c4b77d35028858e876ff0e9 -> 5b580f368d2585e03eeea9233ef4de82ecdeb11d: canvas: re-apply the touch column minimum when the pointer kind changes (#243, D309) ba317e3db75416c4880b503411010dd0f9729d9b -> ab63834fb81764f393999786e01117707561acc0: Add phone D309 regression coverage 1c6c8a342f08191a8c07980c3113ebcaa3acdcca -> 5739cf65cbbfca8af2240d92f27272ecda5b5937: Test pinch zoom against D309 server truth release documentation -> 85b0285b733bac4c94d7540c58d4521d1a3410c4: Record the measured release-8 production sizes and migration scope (#24) ``` | Stage | x86_64 bytes | aarch64 bytes | |---|---:|---:| | Release 7 | 21,385,264 | 19,570,256 | | D307 | 21,387,824 | 19,559,624 | | Sync and immediate input | 21,387,184 | 19,559,112 | | Stale-screen note | 21,387,184 | 19,559,112 | | Phone / final | 21,387,184 | 19,559,112 | Final delta against release 7: **+1,920 x86_64 / −11,144 aarch64 bytes**. The measured x86 increase differs from the expected approximate reduction; it is 18,080 bytes below the +20,000 stopline. Both ceilings equal the measured sizes. Stale-note and phone stages retain byte-identical native images. Same pinned static recipe and compiler as release 7; no Cargo.lock or migration changes. Artifacts: `/home/kayg/.cache/codex-scratch/release-8/artifacts` in the release-7 layout, including both full images, bundle (both host and session architectures), production web, web-dist.tar, MANIFEST.txt and checksums. The bundle already carries the ARM host image; a later authorized deploy uses `--bin`, `--bundle`, `--web`. Seven executable images passed production trust and static-link checks. Staged server compared byte-identical to the completed bundle server. ```text bc3e7b2fa2bde97d06b548981954a96d68f4a8524fed2b41a7c80d99348de58b infraternal-x86_64-musl 46812c6bfeffb01e536112d422d1db8809bb136f2504efde1bac8df7ca8ce26f infraternal-aarch64-musl 7865016ed5a56d366dc1cc172c129a2d3136fa2179f199feec25cb203fae9a8a web-dist.tar d37fba961139bb4b07a511d08b3e0b5abb333a5ceb88aae000e4909dc03527a9 web-SHA256SUMS e5673ff83c85e0bf56040c6f0946868012399bd6feadd88255e210e952185f1c bundle/SHA256SUMS bc3e7b2fa2bde97d06b548981954a96d68f4a8524fed2b41a7c80d99348de58b bundle/infraternal 2e94b4ce12b8c0360297c90585cbd2709397727a5ed5c1141fba7c780fd6fdf6 bundle/infraternal-aarch64-musl 75801bc7ed1bc3668340b8df50eaa45a3772292c8a6038eef0a1ba8999bd4fc6 bundle/infraternal-aarch64-session-musl f87c2b23144ac48453ea8277052193abef55af8172261973affe50b372c069df bundle/infraternal-x86_64-musl 7094e3f52dd6eb3d90f052059656e8e50e2addde56565920447a31a5e195a9db bundle/infraternal-x86_64-session-musl ``` | Gate | Result | |---|---| | build-slot scripts/verify fast, final head | PASS, no waiver | | build-slot python3 scripts/test-static-reproducibility.py | PASS, both architectures byte-identical | | Reviewed real-server specs, playwright.real.config.ts | 11/11 | | Additional real-PTY acceptance, playwright.real.config.ts | 5/5 | | Requested browser regression specs | 35/35 | | synchronized-output-input repeat-each=20 | 20/20 | | Copied release-7 v29 database through SQLx startup | PASS | | Production trust / static linkage / checksums | PASS | Host gates used private fixture state and the short socket-path alias required by the Unix-socket tests; the GNU runner forwards every test and skips no checks. Exact commands and environment are attached. The existing query/refusal/retained-typing/synchronized-output/stale-screen browser specs depend on `/__mock` controls. They ran against a separate sealed preview-enabled test build; shipping web stayed preview-disabled. Real-server counterparts additionally covered real 1008 refusal + Discard/Send again, full-screen mode 2026 input/paint, stale replay, cursor queries and persisted phone geometry. Native binary and shipping assets came from this head. Perf-VM staging (infraternal-perf-test, 4 vCPU, kernel 6.12.111+deb13-amd64, CPUWeight=10000, separate short lock holds): - Production-shaped v29 copy retained 29 migration checksums, 50 users, 10,000 seeded nodes, legacy null hostname and existing canvas; integrity=ok; web HTTP=200. No new migration exists to renumber. The enrolled browser copy additionally retained its pre-existing mesh node (10,001 total). - Desktop + 393×852 phone: reviewed widths `[349,349,349,349]`; the copied-database capture also met the >=349 minimum, with revision 8 unchanged by phone use. Direct persisted-layout review covered rotation, pinch, reload, pointer changes and desktop edits. - Silent shell: desktop and phone showed “screen may be out of date”; typing cleared both. - Full-screen mode 2026: input send 0.9 ms, hold-to-send 10.1 ms, release-to-paint 2.0 ms, one release frame. - Twenty repeated held-input runs: send 0.5–0.9 ms, p95 0.8 ms; echo after release 4.6–16.3 ms, p95 13.8 ms; all input sent/accepted while held, all echoes one release frame. - Desktop and phone each received one cursor-query reply, including a synchronized query. Three-viewer real PTY corpus: 30 query forms, one PTY copy each; sixteen outstanding requests, expiry and ordinary-input ordering passed. - Real resume refusal: fresh typing remained usable; Discard discarded old text; Send again sent it once. - Loads and machine details are in each raw receipt. The initial additional-copy assertion counted 10,000 total nodes and failed because the fixture already had one; only that external harness was corrected. [Diagnostic](https://git.kayg.org/attachments/5a0f5c8a-348f-44a5-922e-3561e3c2aa80). All corrected acceptance checks passed. Author checklist: [review receipt](https://git.kayg.org/attachments/e68a8e19-ee35-4b35-9da7-e8c18e87f6a3). All owned VM scopes are inactive, ports are closed, private VM job removed, and temporary host Cargo/upload/comparison roots removed. Artifacts and evidence are retained outside the checkout. Verbatim final Rust gate table (full unmodified gate transcript attached below): ```text +---------------------------+--------------+ | Rust gate | Result | +---------------------------+--------------+ | fmt | PASS | | VT native fmt | PASS | | CLI plugin compile-out | PASS | | clippy | PASS | | SSH runtime test helper | PASS | | test | PASS | | SSH inode reuse fixture | PASS | | cargo-deny | PASS | | static builds | PASS | +---------------------------+--------------+ ``` Verbatim final protocol gate output: ```text ==> TypeScript protocol tests bun test v1.4.2 (744846f84) src/mesh-review-revocation.test.ts: (pass) review forbidden event cancels pending snapshot publication [2.38ms] (pass) subscription forbidden ends delivery before a late refresh rejection [1.51ms] (pass) subscription not found ends delivery before a late refresh rejection [1.14ms] (pass) subscription invalid input ends delivery before a late refresh rejection [1.14ms] (pass) subscription mesh unavailable ends delivery before a late refresh rejection [1.12ms] (pass) synchronous subscription refusal releases the transport exactly once [0.23ms] src/codec.test.ts: (pass) wire protocol golden vectors > encodes and decodes each frame exactly as the shared manifest describes [6.66ms] (pass) wire protocol golden vectors > returns borrowed payload views and writes into reusable buffers [0.27ms] (pass) wire protocol golden vectors > decodes muxed messages split across WebSocket messages [0.95ms] (pass) wire protocol golden vectors > rejects oversized, non-canonical, unknown, and malformed frame bytes [0.20ms] (pass) split mux header preserves trailing Close [0.23ms] (pass) reply-marked Input uses an additive bounded layout without changing legacy input [0.46ms] (pass) empty marked input reports the stable invalid-body decoder failure [0.10ms] src/mesh-review-paged-error.test.ts: (pass) review earlier snapshot continuation failure cannot replace a newer complete refresh [2.68ms] (pass) review earlier snapshot continuation cannot overwrite a delivered revision [2.61ms] (pass) a newer paged event owns publication before an earlier refresh resumes [2.49ms] src/mesh-review-refresh.test.ts: (pass) review superseded refresh failure cannot replace authoritative resync [1.38ms] (pass) superseded failure preserves a newer pending refresh [2.66ms] src/stream.test.ts: stream differential: 141 streams, 11988 schedules, zero divergences (pass) Rust and TypeScript preserve every frame at all boundaries and random multi-splits [2349.94ms] (pass) maximum frame size and fragmented oversized prefix obey the allocation boundary [6.77ms] src/mesh.test.ts: (pass) Mesh actions map to their typed action IDs and JSON inputs [1.76ms] (pass) Mesh watch coalesces change bursts and never publishes an older revision [3.79ms] (pass) Mesh watch forwards server errors and stops delivering after unsubscribe [0.19ms] (pass) Mesh enrollment carries an explicit authenticated host binding [0.24ms] src/mesh-review-continuation.test.ts: (pass) review continuation stops after stop [1.46ms] (pass) review continuation stops after forbidden [1.17ms] (pass) review continuation stops after superseded [1.14ms] src/mesh-pagination.test.ts: (pass) list assembles bounded pages using the same filter [0.19ms] (pass) a changed revision discards earlier pages before assembling its restart [0.10ms] (pass) malformed continuation is refused: {"revision":1,"offset":0} [0.23ms] (pass) malformed continuation is refused: {"revision":2,"offset":1} [0.02ms] (pass) malformed continuation is refused: {"revision":1,"offset":2} (pass) watch never publishes a partial page; withdrawn=false [1.29ms] (pass) watch never publishes a partial page; withdrawn=true [1.15ms] (pass) a superseding equal-revision resync wins over pending page assembly [1.30ms] src/mesh-review-resync.test.ts: (pass) review watch applies same-revision authoritative resync [0.12ms] (pass) authoritative resync keeps priority over an equal-revision pending list [1.34ms] src/mesh-vectors.test.ts: (pass) every shared Mesh action vector passes through the typed client unchanged [0.81ms] (pass) shared Mesh event vectors drive the typed watch adapter [5.07ms] 39 pass 0 fail 36135 expect() calls Ran 39 tests across 10 files. [2.42s] ``` Verbatim reproducibility output: ```text Preparing worktree (detached HEAD 85b0285b7) HEAD is now at 85b0285b7 Record the measured release-8 production sizes and migration scope (#24) commit=85b0285b733bac4c94d7540c58d4521d1a3410c4 main_checkout=/home/kayg/Developer/infraternal/.worktrees/release-8 alternate_checkout=/home/kayg/.cache/codex-scratch/release-8/static-repro-work-gjktbxw6/long-root/with-a-distinct-and-deliberately-long-checkout-location/checkout-b main_CARGO_HOME=/home/kayg/.cargo alternate_CARGO_HOME=/home/kayg/.cache/codex-scratch/release-8/static-repro-work-gjktbxw6/cargo-home main_target=/home/kayg/.cache/codex-scratch/release-8/target alternate_target=/home/kayg/.cache/codex-scratch/release-8/static-repro-work-gjktbxw6/target main_RUSTUP_HOME=/home/kayg/.rustup alternate_RUSTUP_HOME=/home/kayg/.cache/codex-scratch/release-8/static-repro-work-gjktbxw6/rustup-home SCCACHE_DIR=/home/kayg/.cache/sccache-infraternal alternate_sccache_mode=forced-recache-through-shared-server loadavg_start=3.51 2.74 3.45 3/1051 3581349 rust_sccache_remaps_visible=True native_x86_sccache_remaps_visible=True native_aarch64_sccache_remaps_visible=True rust_registry_mappings_follow_cargo_home=True x86_64-unknown-linux-musl: main_size=21387184 alternate_size=21387184 equal=True x86_64-unknown-linux-musl: main_sha256=bc3e7b2fa2bde97d06b548981954a96d68f4a8524fed2b41a7c80d99348de58b alternate_sha256=bc3e7b2fa2bde97d06b548981954a96d68f4a8524fed2b41a7c80d99348de58b aarch64-unknown-linux-musl: main_size=19559112 alternate_size=19559112 equal=True aarch64-unknown-linux-musl: main_sha256=46812c6bfeffb01e536112d422d1db8809bb136f2504efde1bac8df7ca8ce26f alternate_sha256=46812c6bfeffb01e536112d422d1db8809bb136f2504efde1bac8df7ca8ce26f static artifact reproducibility passed; evidence: /home/kayg/.cache/codex-scratch/release-8/evidence/static-repro-3565150 ``` [final-verify-fast.log](https://git.kayg.org/attachments/401a8486-dde3-4543-98f4-c855e768557f) [final-static-reproducibility.log](https://git.kayg.org/attachments/075519a5-c231-47a0-8871-4be151500fc3) [vm-cleanup-check.log](https://git.kayg.org/attachments/aa96d56b-2fcf-4ed6-8131-5d10013ca901) [host-cleanup-check.txt](https://git.kayg.org/attachments/fdad2f38-fe69-4228-8c9c-ebae553221c2) [qualification-commands.txt](https://git.kayg.org/attachments/6759ec18-14c4-4798-a123-14a07de05a61) [perf-driver.log](https://git.kayg.org/attachments/d3e0b845-bb2f-4176-a1fa-0ec2468acd94) [held-input-20-summary.json](https://git.kayg.org/attachments/a6432ec8-5956-4d6f-ab89-48a92bd54100) [vm-cleanup-check.log](https://git.kayg.org/attachments/0cf62414-a1a0-4dbb-8424-50ca5074b652) [MANIFEST.txt](https://git.kayg.org/attachments/9f0cbf75-fdfb-4e4e-8395-f1ccc33853cc) [artifact-SHA256SUMS.txt](https://git.kayg.org/attachments/43e1c788-f86a-4f9b-bf6a-c968419efcd9) [artifact-seal.json](https://git.kayg.org/attachments/eab4b03b-1e69-45e7-a55f-2e2f930451bd) [applied-first-parent.txt](https://git.kayg.org/attachments/63825eec-a7b2-4f53-b110-9d9542f55fba) [staging-final-driver.log](https://git.kayg.org/attachments/83a6af67-ffda-4186-bb47-988ee59d80d3) [real-reviewed.log](https://git.kayg.org/attachments/9e5ecf9d-385d-4b8a-9ff5-ba83f23f8ef7) [staging-capture-driver.log](https://git.kayg.org/attachments/3fb96db9-42d0-4a46-a33c-95d7695e376c) ![release8-phone-canvas.png](https://git.kayg.org/attachments/99927b8e-294d-4bf1-9e9c-90bcebd232b3) ![release8-phone-stale-note.png](https://git.kayg.org/attachments/866c160e-79ce-4c81-8499-a25641cb0b04) ![release8-desktop-stale-note.png](https://git.kayg.org/attachments/91eb41ef-9187-4b7d-a4fa-49fee9c8429c) [release8-phone-widths.json](https://git.kayg.org/attachments/b7212fa7-b6d0-4342-a1a2-b863f50863df) [release8-real-sync-echo.json](https://git.kayg.org/attachments/6bb66b9b-4331-45f9-b377-cf0b55be839c)
Author
Owner

Deployed to production: release 8, 85b0285b7 at 09:32 IST (2026-10-20).

  • Command: deploy-prod.sh 85b0285b7 --bin infraternal-x86_64-musl --bundle bundle --web web (no --arm).
  • Result: DEPLOYED 85b0285b733bac4c94d7540c58d4521d1a3410c4 (backup /var/backups/infraternal/20261020-060227-85b0285b733bac4c94d7540c58d4521d1a3410c4)
  • /healthz 200, new MainPID 140788, active since 04:02:31 UTC.
  • All 5 installed binaries match the release manifest SHA256 (x86 bc3e7b2f…, aarch64 2e94b4ce…, aarch64-session 75801bc7…, x86-musl f87c2b23…, x86-session 7094e3f5…).
  • No migration (schema stays at 0029).
  • Sizes: x86_64 21,387,184 (+1,920 vs release 7), aarch64 19,559,112 (−11,144).
  • release-prod-live → 85b0285b7. Merging back into dev runs as job merge-release8-dev (inputs.rs needs a semantic merge of D307 reply isolation with the per-user pool).

The server restart re-locked the CA: the owner must unlock it.

**Deployed to production: release 8, `85b0285b7`** at 09:32 IST (2026-10-20). - Command: `deploy-prod.sh 85b0285b7 --bin infraternal-x86_64-musl --bundle bundle --web web` (no `--arm`). - Result: `DEPLOYED 85b0285b733bac4c94d7540c58d4521d1a3410c4 (backup /var/backups/infraternal/20261020-060227-85b0285b733bac4c94d7540c58d4521d1a3410c4)` - `/healthz` 200, new MainPID 140788, active since 04:02:31 UTC. - All 5 installed binaries match the release manifest SHA256 (x86 `bc3e7b2f…`, aarch64 `2e94b4ce…`, aarch64-session `75801bc7…`, x86-musl `f87c2b23…`, x86-session `7094e3f5…`). - No migration (schema stays at 0029). - Sizes: x86_64 21,387,184 (+1,920 vs release 7), aarch64 19,559,112 (−11,144). - `release-prod-live` → `85b0285b7`. Merging back into dev runs as job `merge-release8-dev` (inputs.rs needs a semantic merge of D307 reply isolation with the per-user pool). The server restart re-locked the CA: the owner must unlock it.
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#206
No description provided.