J400: enable predictive local echo automatically from measured RTT (D130) #441
Open
opened 2026-11-09 00:29:15 +00:00 by kayg
·
27 comments
No Branch/Tag specified
main
j470b-server-mesh-rejoin
mesh-compat-382
j444b-d381-key-wins-flood
j461b-macos-utun-reader-thread
j475b-remove-host-motion
fix-reconnect-new-link
j481-d380
dev
j479-mesh-soak
fix/j476-host-facts
j475-motion-pill-split
j470-mac-node-join
root-upgrade-d376
j474-review-merge
latency-targets-120hz
nightly-suite-shards
gotatun-pin-j469
macos-utun-reader-thread
fix-flood-echo-stall
wip/j416
motion-fast-ease-out
mesh-addhost-j259
takeover-close-terminals-d368
kbd-instant-followups
fix-trust-key-double-click
nightly-suite-partial-report
appwin-icons-j207
rusqlite-slice1
swipe-content-first-d374
mesh-mtu-381
addhost-instant-open
glass-contrast-d365-mock
glass-contrast-d365
signout-followups-442
fix-startup-toast-red
research-gotatun-matrix-j317
themes-sync-j304
fix-load-flakes
fix-nix-zig-patch
fix-compute01-browser-baseline
ratchet-size-baseline-419
predict-auto-d130
revoke-coverage-d367
nightly-suite-queue-timeout
nightly-browser-suite
fix-rustsec-2026-0459
fonts-ioskeley-obel
log-retention-d375
fix-kbd-no-anim-427
fix-dev-red-specs-2
takeover-proof-305-j205
wip/j410-server-pump
ui-consistency-d372
fix-osc52-clipboard
libghostty-vt-1.0
forget-retired-host-d369
j404-merge-426
fix-setup-lock-race
fix-touch-select-426
revoke-access-report-ui
fix-predictive-echo-specs
fix-selinux-agent-exec
wip/j395-checkpoint2
wip/j395
j391-review-scratch
ui-consistency-j195-deferred-rebased
fix-rustc-paths-421
decisions-wording-341
fix-install-suite-red
fix-dev-rtt-specs
fix-pending-removal-align
fix-privileged-skip
fix-install-suite-404
review-j368
mesh-dns-j254
revoke-access-report-d356b
revoke-privilege-round5
fix-removal-confirm
review-j360
gotatun-rotation-367
deps-refresh-340
review-j354
review-J351
review-j350
addhost-takeover-d359
revoke-report-items-347
revoke-end-sessions-d362
review-j348
size-mesh-ssh-346
size-trim-337
revoke-access-diff-d356
j259-pre-rebase-b06c5a6
j305-ended-at-start-spec
addhost-sudo-consent
fix-layout-real-specs-411
fix-shell-open-411
fix-console-hosts-373
fix-shell-exit
fuzz-host-name-353
fix-host-details-410
macos-filter-j197
research-gotatun-tricks
revoke-p3-j216l
stale-state-pill
revoke-followups-j216k
revoke-progress-j216e
backup/macos01-20261106/lume/j197
backup/macos01-20261106/lume/appwin-icons-j207-stash0
backup/macos01-20261106/claude/stash-0
backup/macos01-20261106/claude/stash-1
backup/macos01-20261106/claude/J80-macos-s1
backup/macos01-20261106/claude/J80
backup/macos01-20261106/claude/J80-slice1-20261102
backup/macos01-20261106/claude/J16b-appwin-on-dev
backup/macos01-20261106/claude/appwin-launch-idle-146
backup/macos01-20261106/claude/J80-s1-run
wip/j259
trust-285-p3c
runtime-lock-j216f
mesh-ssh-p3-j175
tun-proof-p3b
trust-285-p3
terminal-polish-j271
tun-proof-p3
ssh-install-flakes-j216i
fuzz-fixes-j264
trust-285-a
trust-285-b
restart-oversized-fixture-j198
backup/macos01-20261106/lume/appwin-icons-j207
restart-bound-j216h
up-preflight-p3-j198
backup/macos01-20261106/lume/j251
up-preflight-j198
wip/up-preflight-j198-j245-p2
wip/up-preflight-j198-j245-p1
agent-fsync-offloop-j196
wip/up-preflight-j198-j245
settings-offscreen-j231
wip/up-preflight-j198-j226-inspection
wip/j103f
themes-j206
wip/up-preflight-j198-j226
flakes-j216c
backup/macos01-20261106/claude/j197
flakes-j216b
backup/macos01-20261106/claude/j197-red
wip/up-preflight-j198-review
flakes-j216
backup/macos01-20261106/claude/appwin-icons-j207
engineering-j208b
appwin-mock-j209
toast-stack-j165
engineering-j208
decisions-d351
decisions-d350
decisions-d349
appearance-presets-mock-j129
decisions-d348
docs-audit-spec
doc-coverage-baseline-raise
decisions-d347
decisions-d346b
decisions-d346
j88h-profile
ui-consistency-j195-deferred
ui-consistency-j195
engineering-practices-j194
preferred-login-ui-j166
signin-pools-263-j174
macos-node-265-s1
decisions-d345
decisions-d344
proxy-cgroup-j164
verify-quick-fuzz-329
proxy-start-io-j168
timing-flakes-j163
up-263-s1
mcp-events-j147
verify-quick-fuzz-j158
proxy-p3-j159
agent-resource-j157-detect
wip/j103d-final
remote-cancel-hang-j155
proxy-traefik-281-j62d
j149-verify-quick
proxy-traefik-281-j62b
j150-drop-unnamed
wip/j79d-red-r4
wip/j103d-d332
rootless-toast-j142
wip/j103d-head
wip/j103d
j125c-mcp
macos-build-j136
backup/macos01-20261106/claude/j136
wip/j79d-red-cli
wip/j79d-red-server
j121-link-liveness
j118c-tracer-failures
wip/j79c-head
release-desktop-j131
j124c-signed-macos
wip/j79c-red-p3
wip/j79c-red-p23
wip/j79c-red-p22
merge-j128-check
perf-deferred-j128
sidebar-toggle-260
j127-shortcut-changed-dot
j125-mcp
j118-tracer-failures
j126-account-summary
settings-sections-mock-j92
j120-pinch-lock
sidebar-292
backup/macos01-20261106/claude/j120
taste-2026-11-03
row-actions-242-215
backup/macos01-20261106/claude/stash-0-untracked
backup/macos01-20261106/claude/J80-265-s1-run
backup/macos01-20261106/claude/J80-macos-s1-20261102
j112-canvas-commands
ui-no-overshoot-scroll
fix-recovery-restart
backup/macos01-20261106/claude/stash-1-untracked
taste-2026-11-02
size-baseline-ratchet
machine-cards-structure-j108
j109-boot-copy-mockups
fix-dev-red
wip/up-263-s1
j95b-settings-rows
proxy-traefik-281
j95-option-rows
docs-human-j91
docs-keys-palette
fix-flood-1013-270-j38d
mesh-ssh-s1
mesh-ssh-s0
addhost-d291-tunnel
test-stability-load
mesh-relay-220
repro-296
shim-thp-off-24
mesh-pins-258-v2
mesh-dns
signin-d311-merged
docs-pages
ui-size-283
fix-ui-batch-specs
wip/j12b-edge-update
gate-on-arm
fix-rename-sync-293
trust-285-j60b
fix-focus-ring-clip
integ-ui-1101
edge-update-v2
signin-d311
taste-2026-11-01
layout-per-tab-250
ui-approved-splitopt-224
ui-approved-splitopt-224-on-dev
icon-text-centre-282
ui-approved-189-212-216
research-reverse-proxy
transfer-budget-320
review-mesh-pins-258-r2
sidebar-pill-259
review-mesh-relay-220
wip/j12-edge-update-v2
nix-package
status-crash-loop-237
fix-dev-test-failures
fix-fixture-socket-path
wip/mesh-relay-220-pre-dev-advance-rebase
fix-canvas-side-clip
research-head-to-head
frosted-real-256
review-mesh-pins-258
wip/mesh-relay-220-pre-final-rebase
review-layout-per-tab-250-r2
broad-suite-triage
nix-devshell
review-status-crash-loop-237-r3
wip/nix-devshell-pre-p3
taste-frosted-real
wip/code-serve-demo-2026-10-30
wip/code-serve-glass-2026-10-30
wip/code-serve-clusters-2026-10-30
wip/code-merge-release94-dev-2026-10-30
wip/rproxy-delta-scratch-2026-10-30
wip/stale-note-257-staged-2026-10-30
wip/d241-size-staged-2026-10-30
review-broad-suite-207
wip/mesh-pins-258-pre-split
wip/mesh-relay-220-pre-rebase
mesh-measure-220
plan-211-update
review-edge-autoupdate-r3
perf24-reconnect
review-stale-note-r2
release-prod-live
d241-shell-marker
review-mesh-pins-server-258
review-revocation-r3
review-setup-token-r2
review-sync-journal-r3
wip/review-mesh-pins-258-prune-review-1995fee46
frosted-scroll-256
sync-journal-r3
revocation-per-account-wip
review-tokio-asyncfd-0386
review-sync-p3s
wip/stash-8by64-stash0-2026-10-30
mesh-drag-r2
setup-token-data-wip
release-9-4
auth-busy-1013
mesh-view-overlap
sync-p3s
review-auth-busy-wake
review-readd-r8-wip
mesh-drag-bounds
audit-auth-93
app-windows-stream-start
review-authority-cap-r3
app-windows-r7-measure
readd-minimal-r6
readd-minimal-r5
app-windows-r7-soak
readd-minimal-r4
app-windows-r7
app-windows-r6
readd-minimal-r3
readd-minimal-r2
readd-minimal
merge-release8-dev
review-busy-page-liveness-r2
review-busy-page-liveness
mesh-view-trim
review-authority-read-retry-r2
review-remove-uninstall-r2
release-retry-reattach
release-retry
review-remove-uninstall
review-authority-read-retry
app-windows-ship
mesh-autoswitch-p2
mesh-ssh
mesh-relay
mesh-macos-node
screen-and-control
session-labels
review-real-logins-r5
review-real-logins-r4
review-real-logins-r3
shim-memory-r2
review-real-logins-r2
shim-memory
shadow-addhost-instant
shadow-real-logins
shadow-same-session-flood
shadow-prod-perf-fix
hosts-from-server
app-windows-real
app-windows-transport
release-prod-6w
mesh-policy-verify
quiet-close-toast
dev-merge-r4
review-mesh-agent-transport
review-app-windows-transport
settings-roundtrip
review-release-pipeline-r4
mesh-agent-transport
ended-strip-fix
review-audit-ca-update-d244
settings-rows
phone-width
signout-clear
fix-restart-tests
dev-merge-rp
signer-hardening
review-audit-ca-update
terminal-fidelity
review-audit-ca-update-wip
mesh-integrate
review-mesh-agent-transport-515d3712
review-mesh-dataplane-feec1988
mesh-dataplane
signout
research-canvas-node
wip/review-renderer-cost
wip/review-terminal-fidelity
padlock-glyph
review-release-pipeline-2e95b689
phone-polish
sidebar-polish
inbox-generic
review-mesh-dataplane-378d4055
prod-batch
ui-inbox
ui-ca-unlock
ui-machine-sections
review-mesh-dataplane-a5f744fb
tls-session-prod
session-bounds-prod
fix-dead-session
session-bounds
tls-session
palette-polish
shortcuts-d222
research-appmeta
phone-gutter
ui-centre-button
wip/ui-centre-button
wip/tls-session
review-addhost-breakit
ui-platform
renderer-cost
remote-agents
mesh-api
ssh-bootstrap
prod-hotfix2
prod-fixes
review-remote-agents
review-mesh-dataplane
session-life
research-browser
review-mesh-api
research-capture
review-mesh-api-round3
review-mesh-api-round1
gate-stability
review-gate-stability
review-relay-direct
review-mesh-api-findings
proto-sessions
font-picker
proto-addhost
proto-windows
mesh-core
latency-gate
research-bsd
research-discovery
keytray-mods
mock-core
ui-tweaks
fix-motion-sel
fix-motion
integrate2
fix-robust
t-web
t-server
vt-ghostty
fix-snap-echo
t-web-auth
review-vt2
t-agent
lane-protocol
lane-shim
lane-auth
s1-base
s1-contracts
s1-workspace
No results found.
No labels
launch-qa
Milestone
Clear milestone
No items
No milestone
Projects
Clear projects
No items
No project
Assignees
Clear assignees
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".
No due date set.
Dependencies
No dependencies set
Reference
kayg/infraternal#441
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Implement D130 automatic per-terminal predictive echo above about 60 ms with hysteresis, URL overrides, existing safety rules and misprediction cooldown. Follow-up to #438 and
fd4506480.Branch: predict-auto-d130
Base: origin/dev
44e80ccc5Plan (estimate: 3 hours): inspect engine and echo safety; write and run red production-browser specs; implement the smallest policy change; measure before/after at 300/30 ms RTT; run predictive-echo and terminal specs three times, verify quick, and verify fast on compute01. No merge or deployment.
Start: predict-auto-d130, base origin/dev
44e80ccc5.Finding 1: automatic enablement is missing as reported. main.ts:462 turns an absent predict flag into false, and terminal.ts:420 constructs no engine unless predictiveEcho is true.
Finding 2 (security/scope blocker): existing prediction does not satisfy D130 no-echo safety. predictive-echo.ts predicts before observing echo, then armTimeout() mutes only after 2*RTT + 64 ms. terminal-scenario.ts:172 and predictive-echo.spec.ts explicitly expect the first no-echo character to be drawn. There is no echo/raw-mode notification in contracts/wire.md or contracts/shim.md. Alternate-screen detection exists. Merely wiring auto-on would expose password input by default.
Next: production-build red reproducer using the existing 300 ms proxy, before deciding whether automatic enablement is safe to ship. A reliable pre-input safety signal would require a separate cross-layer design; output heuristics cannot distinguish a silent no-echo transition from an echoing terminal.
Blocked handoff, implementation is NOT complete. Branch predict-auto-d130, pushed head
dcf29ccb0b(atomic WIP red-spec commit only). No production behavior changed; no merge or deployment.Production-build evidence on dev-02 through build-slot (3 slots), 300 ms RTT test profile, Chromium, one worker:
All three are behavioral failures, not setup failures. RED_EXIT=1. Browser plugin unavailable; used the repository Playwright production-build workflow explicitly requested for dev-02.
Additional real-PTY check: an interactive /bin/bash --noprofile --norc -i prompt on dev-02 has ECHO=false and ICANON=false. Raw termios flags alone would also disable prediction during ordinary shell line editing. shell-mode.json is attached.
Why stopped: the browser sees identical state for an echoing shell and a silent no-echo transition until after it has already drawn input. The existing engine guesses, then mutes after 2*RTT+64 ms, which cannot meet "password prompt ... never show predictions". Past echo proofs or prompt-text matching cannot reliably establish current privacy safety. Enabling the existing engine by default would make that disclosure the default.
The scope leash in ~/infraternal-ops/BRIEF-COMMON.md says: "Do exactly the task, by the shortest safe path. Do NOT build general infrastructure, frameworks, updaters, harnesses or tooling the task does not need" and requires stopping/reporting when extra work is needed. A reliable, ordered per-terminal eligibility signal or shell-integration contract is a cross-layer prerequisite, beyond an RTT policy change. Recommendation to the orchestrator: resolve that prerequisite before enabling automatic prediction; do not accept timeout-based hiding as password safety. No question was sent to the owner.
Validation: verify quick passed (verbatim summary below). Predictive-echo/terminal three-pass gate and verify fast on compute01 were NOT run because implementation is blocked. Before/after input-to-photon latency at 300/30 ms was NOT measured; no completed implementation exists to compare. No performance claim is made. Browser/proxy processes exited; ports 5400/5401 are free; this job's 367 MiB target was removed. Evidence remains outside the checkout on dev-02 and code at ~/.cache/codex-scratch/j400/evidence/.
Resuming J400 at
dcf29ccb0b, base origin/dev44e80ccc5, branch predict-auto-d130. The orchestrator has decided the safety design within D130: host eligibility is !(ICANON && !ECHO), alternate screens remain forbidden, and every new prediction epoch first requires an exact echoed probe. Epochs restart on mode change, misprediction, cursor jumps and reattach. No owner question is needed.Plan (estimate 4 hours): add red real-PTY mode and browser epoch tests; add negotiated shim mode-state notification and forward it as an additive terminal.prediction_mode Event on the existing terminal stream; implement fail-closed client epochs, cooldown and RTT hysteresis with URL overrides; run production suites 3x on dev-02, real-shim branch-server proof on compute01 through 300 ms, before/after 300/30 ms measurements, quick and fast on compute01. No merge.
Initial inspection: neither VT state nor current shim frames expose termios. Existing terminal Events already traverse the host daemon and server and are additive. Proposed shim extension: capability bit 8, frame 0x24 with output cursor, raw mode bits ECHO/ICANON, selected only by new consumers. Send initial state on attach and subsequent states only when mode changes, ordered before associated output. Read termios on reactor activity without an idle polling timer; browser starts ineligible for older hosts and every reattach.
Progress: the additive mode codec has a behavioral red/green receipt (red-mode.log, green-mode-codec.log: 13 passed, 1 ignored). Six controlled-clock epoch/RTT tests pass (green-epochs.log); no functional wall-clock speed assertion was added. Current implementation samples termios on reactor activity, sends initial/changed state to negotiated peers, forwards terminal.prediction_mode through the authenticated terminal Event stream, and defaults prediction to auto with 70/60 ms hysteresis. ?predict=1 bypasses RTT only; both overrides retain all safety checks. New epochs reconcile the entire initial input queue invisibly using the existing bytewise echo engine. Each mismatch requires a fresh proof plus a one-second monotonic cooldown.
The queued production-browser run on dev-02 is validating activation/privacy/backoff before the full suites. Both VMs are busy; no extra slot is held by J400. Evidence paths remain ~/.cache/codex-scratch/j400/evidence/ on each VM.
J400 resumed at pushed head
50795ce158onpredict-auto-d130. The owner-selected design is implemented in that WIP snapshot: negotiated ECHO/ICANON state, fail-closed unknown modes, exact invisible echo epochs, 70/60 ms hysteresis and a 1 s mismatch cooldown. No merge or deployment.Production tracer checks on dev-02: the original three red regressions plus unknown-first-input and explicit-off checks pass (5 passed, 30 ms profile check separately pending). Receipt:
/home/claude/.cache/codex-scratch/j400/evidence/auto-green.log. Rust integration/quick checks and the three-pass full browser suites are next; real shim branch-server proof and latency measurements remain outstanding. Found missing initialization of the new per-peer field in existing internal Rust test fixtures; correcting before compiling them.Additional finding: the initial epoch implementation checked the final cursor position but accepted an echo containing a cursor jump that returned to the expected cell. Added a controlled-clock regression first; it failed with
epochConfirmed=truewhere false was required. The echo scanner now invalidates proof on cursor controls (including jumps inside a matching echo), while retaining styling/mode/query handling. Unit result: 7 pass, 0 fail, 26 assertions. Red/green receipts on dev-02:~/.cache/codex-scratch/j400/evidence/{red,green}-cursor-epoch.log.Full suites are queued through dev-02's three-slot launcher (PID 971074); quick is queued on compute01 (PID 507944). Real-process coverage reuses the existing private branch-server fixture and delayed WebSocket bridge. No production/test deployment is being replaced.
Full-suite finding: terminal scenario's probe counted the new epoch-priming space as a measured key (
Expected: abcdefghijklmnopqrst,Received: <space>abcdefghijklmnopqrst). Production renderer echoed all 20 probe keys correctly. The test now compares counters with a post-priming snapshot. Stopped the obsolete run by its recorded Playwright PID 1016656 (18 passed; one counter assertion failed); corrected three-pass suite queued assuites-300-v2.log.Quick's first run stopped before Rust compilation at D345 documentation checks on touched declarations/old test initializers. Added the required comments;
diff docs: ok (merge base 44e80ccc5e14). Second quick receipt:~/.cache/codex-scratch/j400/evidence/quick-v2.logon compute01 (queued). All raw failure evidence is retained.Latency finding, measured only on the perf VM through
perf-run(cpus 1–3, 6 GiB cap), production frontend before/after, no?predictoverride, 3 trials × 30 serialized keys per case:Method: synthetic keydown to the first visible animation-frame mark in the production tracer; test-double host behind the existing TCP link, zero jitter for the paired comparison. This measures browser input-to-visible-frame, not a physical display sensor. The independent real shim/password/full-screen proof on a compute01 branch server remains pending.
The normal ±30 ms jitter profile also completed (90 keys/case): 300 ms p50/p99 315.7/332.6 → 14.9/15.2 ms. Its 30 ms p99 moved by a frame under differing random delays; the paired zero-jitter follow-up above resolved that uncertainty. CPU p99 did not regress in either profile.
Receipts on
claude@infraternal-perf-01-backup01:~/.cache/codex-scratch/j400/evidence/latency-summary.json,measure.log,latency-{before,after}-{300,30}-{0,1,2}.json; jittered receipts are underevidence/jitter/; perf-run before/after quiet/load receipts are underevidence/perf-run/. Selected summary and log also copied to code at the same scratch path. Both runs exited 0; all browsers/proxies exited.The production repeat run exposed two return-path test failures (alternate-screen exit and canonical no-echo exit). Both tests changed host state through the undelayed HTTP admin endpoint while input was still crossing the 300 ms WebSocket link. The next focused run now fences input acceptance before changing mode, and fences alternate-screen exit output before sending the invisible proof. This preserves the safety assertions rather than retrying speculative keys.
Receipt: dev-02
~/.cache/codex-scratch/j400/evidence/suites-300-v2.log(15 passed, two return-path failures before stopping the obsolete repeat run by its recorded Playwright PID). Focused check is queued through build-slot; compute01 quick-v2 is also queued. No merge or deployment.Checkpoint: branch rebased onto current
origin/dev6b60f1fb7da71005da7c5f291ede28eb742fe583; pushed WIP headb5af811b8540506896055768cdfa2329328aae3b.The second quick attempt reached the cheap checks and found one adjacent pre-existing function requiring a D345 comment after the new PPU ordering test extended its diff hunk. Fixed. Receipt: compute01
~/.cache/codex-scratch/j400/evidence/quick-v2.log(fmt and coverage pass, doc comments fail, compilation not started).The next compute01 slot runs the PPU regression red, applies the narrow ordering fix, checks it green, then runs quick and builds the branch server. Dev-02's focused return-path checks are queued; these also cover an empty replay on a shared socket, where a reconnect must discard the previous echo proof even if the PTY mode bits remain identical. No production deployment or merge.
WIP checkpoint pushed:
6b64b4702onpredict-auto-d130. Added the production shared-socket empty-replay regression before changing its reset path. Both slot runs remain queued; no additional successful gate or real-shim proof is being claimed. Current receipts remain under each VM's~/.cache/codex-scratch/j400/evidence/.Finding confirmed by production browser regression: a shared terminal stream can reattach on its existing socket with an empty replay and unchanged mode bits. The old echo proof survived, so the first key after reattachment was predicted. The new red spec observed overlay appearances increase from 1 to 2 when that first key should stay invisible.
Fix: clear prediction mode/proof immediately in
retryStream; the new shim peer supplies its initial mode, and the first exact echo establishes the new epoch. No socket replacement or new polling is needed.Receipt: dev-02
~/.cache/codex-scratch/j400/evidence/focused-return.log: 2 passed (the fenced return-path checks), 1 failed (the new empty-replay safety regression). The complete 3× suites plus the separate 30 ms check are now queued with this fix.The first repeated production run verified the shared-stream reset fix (new regression PASS), then found the same test-admin/input ordering race in
terminal-scenario.ts:189. I had fenced the focused prediction spec but missed the scenario's copy. The failure is at the first proof after alternate-screen exit, with input/admin requests still crossing independently.Applied the same acceptance fence before changing modes, waited for the returning mode before the invisible
qproof, and waited for the alternate-screen exit output cursor before priming the new epoch. These are observable protocol boundaries, with no fixed sleeps or weaker safety assertions.Receipt: dev-02
~/.cache/codex-scratch/j400/evidence/suites-unfenced-terminal.log(21 passed; 1 scenario failure; 1 interrupted; stopped by recorded Playwright PID). Restarted all 3× suites plus the 30 ms case with the corrected scenario; logsuites-v4.log. Compute01's ordered-mode regression + quick + branch build remain queued.The corrected terminal scenario is green in repetition 1; prediction and glyph/cursor checks are also green through the start of repetition 2. The full required 3× run is still in progress, followed by the separate 30 ms case. Receipt: dev-02
~/.cache/codex-scratch/j400/evidence/suites-v4.log.Pushed reset checkpoint remains
e2dc7d05f2; the scenario fence adjustment is pending the full run. Compute01's pre-check/build pipeline is still queued, so the real-shim proof and final gate remain outstanding.Production browser gates PASS on dev-02 through build-slot (production build, 300 ms link, no retries):
Command:
bunx playwright test test/predictive-auto.spec.ts test/predictive-echo.spec.ts test/terminal.spec.ts --repeat-each=3Verbatim result:
The three skipped cases select the separate 30 ms profile. That command,
INFRATERNAL_TEST_RTT=30 bunx playwright test test/predictive-auto.spec.ts --grep 'below 60', also passed:Receipt:
~/.cache/codex-scratch/j400/evidence/suites-v4.log; screenshots underevidence/suites-300-v4/. Pushed WIP checkpointdc82fccd2includes the verified scenario fences and isolates the still-pending real proof from VM history/settings. Compute01's Rust red/green + quick + server build are still queued; real proof, real PTY measurements and final fast remain outstanding.Confirmed and fixed the optional process-per-user ordering edge. The deterministic real-session regression received
InputState → Output(prompt) → PredictionModeinstead of the requiredInputState → PredictionMode → Output(prompt). A wholly queued acknowledgement had allowed output to append while the mode publisher was waiting for an empty queue.The fix holds that output until this peer has queued the sampled mode ahead of it; no new timer, allocation or transport is introduced. The default session pump already waits for an empty queue and did not have this edge.
Red command:
cargo test -p infraternal-shim --features process-per-user changed_prediction_mode_precedes_output_after_a_state_reply --lib -- --nocaptureSame command after the narrow fix:
Receipts: compute01
~/.cache/codex-scratch/j400/evidence/{red,green}-ppu-order.log.verify quickis now running there, followed by the branch binary build.Compute01
verify quickcaught a missing exhaustive case for the new prediction-mode notice in the primed/hedged transport path (E0004, embedded_priming.rs). Mode changes have no snapshot cursor, so the filter now forwards each validated transition in stream order instead of treating mode bits as a monotonic sequence. Added coverage for shell → password → shell. Queued focused check,verify quick, and the real branch binary build through build-slot; no successful gate claimed yet.Found and reproduced a batched-echo epoch bug: after confirming
a, inputbcfollowed by host outputb!incorrectly left epochConfirmed=true. The matching prefix had overridden the later mismatch result. Red unit receipt: 7 pass / 1 fail, expected false received true. Reconciliation now reports the entire batch invalid on any disagreement; green: 8 pass / 0 fail, 29 assertions. This also proves that expiry of the cooldown alone cannot restore prediction: a fresh exact echo is required. Restarted the 3× production browser suites on dev-02 for the changed engine.Fresh production-browser gates after the batched-echo fix, dev-02 through build-slot:
The three skips select the low-RTT case out of the 300 ms repetitions; it passed separately at 30 ms. Compute01 is still queued for the focused mode-notice regression,
verify quick, and real branch binary build. Real PTY safety proof and finalverify fastremain outstanding.J400c (Claude Opus 5.5) is taking over from J400 after Codex hit its usage limit. Branch
predict-auto-d130, pushed headdc82fccd2, baseorigin/dev6b60f1fb7.J400 left four fixes uncommitted in its worktrees (the batched-echo invalidation from 88243, the
embedded_primingmode-notice arm from 88236, the PPU output-order hold from 88231, and the real-spec paint fences). I'll commit them atomically and push, then:verify quick.verify fast.Estimate: 2–3 h, mostly slot queues (compute01 is under its 25 G disk floor right now, with 5 busy and 2 queued).
Pushed
193cf3fb1(4 atomic commits on top ofdc82fccd2: batched-echo invalidation, primed-stream mode notices, PPU output-order hold, real-spec paint fences). J400's compute01verify quick(quick-v4.log, all 12 rows PASS) ran on a tree byte-identical to this head.Blocked on compute01 disk:
/is at 100% (591G size, 566G used, 1.2G free at 05:5x IST), and a 1 KiB script write failed withNo space left on device. This job's only target there is~/worktrees/j400/target(9.9G, needed for the real proof). I am not deleting other jobs' targets. The real-shim proof andverify fastwait until space returns; I'm polling in the foreground.Running meanwhile on dev-02 (build-slot PID 1569551): tracer unit tests, the 3× production suites at 300 ms, and the 30 ms case ×3. Log:
~/.cache/codex-scratch/j400c/evidence/suites.log.History rewritten, tree unchanged. J400's seven
WIP:commits plus my four fixes are now three atomic commits, rebased ontoorigin/dev966c52e07(which only adds the #345 CSS/tooltip audit):77b95cc9dhost publishes eligibility from termios (shim/agent/server/contracts),b5624eca9tracer automatic prediction with confirmed epochs (src + test double + specs),6f8f0dadbreal-shim proof spec. Before the rebase, the regrouped tree hash was byte-identical to193cf3fb1(5fe090440). Force-pushed with a lease;git ls-remoteshows6f8f0dadb197f5a1de2f4fa0db52d1a3600cf4b7.Production browser suites at
6f8f0dadb(dev-02 through build-slot, 300 ms link, retries 0; 30 ms case run 3× separately):Commands:
bun test src/predictive-echo.test.ts;bunx playwright test test/predictive-auto.spec.ts test/predictive-echo.spec.ts test/terminal.spec.ts --repeat-each=3;INFRATERNAL_TEST_RTT=30 bunx playwright test test/predictive-auto.spec.ts --grep "below 60" --repeat-each=3. Receipt: dev-02~/.cache/codex-scratch/j400c/evidence/suites.log, screenshots underevidence/suites-300/.Side note: my first restart failed with
localhost:5470/health is already used. Killing the obsolete playwright with TERM left its webServer group (latency proxy + mock server, PGID 1577659) alive. I killed that exact PGID; receiptsuites-port-busy.log.Next: the real-shim proof on compute01 (queue head, PID 3683548; 3 runs, private non-root sshd on 127.0.0.1:5422 for the ssh prompt), the latency remeasure at the final head on the perf VM (waiting for the perf-run lock), then
verify faston compute01.Real-shim proof on compute01: two fixture bugs found and fixed. The product behaved correctly both times.
Run 1 (
6f8f0dadb; receipt compute01~/.cache/codex-scratch/j400c/evidence/real-run1-mode-log-missing.log):The bridge created its mode log only under the unrelated
REAL_EVENT_TIMES=1switch. Fixed in6c89655f3(explicitrecordPredictionModesoption).Run 2 (
6c89655f3; receiptreal-run2-sudo-reprompt.log): the sudo mode check now passes (the shim reported canonical no-echo). The way back then hung:At sudo's PAM prompt, Ctrl+C counts as a failed try. sudo flushes typeahead and re-prompts, so the
printf BACKcommand was discarded. Fixed in7e3979382: the spec presses Ctrl+C untilD130>is painted again (bounded polls, no fixed sleep). The assertion is unchanged.Latency remeasured at the final tracer head (perf VM via
perf-run, cpus 1–3, 0 steal; production renderer, keydown to first visible frame, 3×30 serialized keys per case, zero-jitter TCP profile, no?predictoverride; before = J400's origin/dev frontend dist):CPU p99 (onData→wsSend): 300 ms 0.3 → 0.1 ms, 30 ms 0.2 → 0.2 ms. Receipts: perf VM
~/.cache/codex-scratch/j400c/evidence/{latency-summary.json,measure.log,latency-*.json,perf-run/}; summary also on code at the same path. Thereal/commits since then change no tracer runtime code.The real run at
7e3979382is queued on compute01 (14 runs queued), thenverify fast.Real-shim proof PASS 3/3 at
dc9e4db87on compute01: real branch server (target/debug/infraternal), real shim and PTY, production tracer build, Chromium, 150 ms each way (300 ms RTT) bridge, no?predictoverride, retries 0. The ssh prompt comes from a private non-root sshd on 127.0.0.1:5422 (UsePAM no, so it cannot authenticate; no valid password is ever typed). sudo prompts for real:claudehas no NOPASSWD on compute01.Run 1 of 3, verbatim (runs 2 and 3 are identical apart from the times):
Tail:
REAL_RUN_2_EXIT=0,REAL_RUN_3_EXIT=0,REAL_EXIT=0,SSHD_STOPPED=2840419(sshd stopped by its recorded PID).What each line proves: shell keys are predicted automatically once the first exact echo arrives. At
read -s,sudoand the ssh password prompt, the host reported{echo:false, canonical:true}for sudo and ssh, and "xy" typed at each prompt produced 0 overlay appearances. The counter is a MutationObserver that also catches an overlay hidden again within the same frame. vim and htop on the alternate screen: 0. A raw program that echoesaand then mis-echoesbas!:bwas drawn (confirmed epoch), andcstayed hidden (back-off). Screenshots attached. Receipt: compute01~/.cache/codex-scratch/j400c/evidence/real.logandreal-300/; failed earlier runs are kept asreal-run{1,2,3}-*.log.Branch rebased onto
origin/dev4754b14a7(dev added D373–D376, host Forget and remote removal; nothing in the terminal, shim or prediction path, and a clean rebase). Headb28cb7492.verify fastis queued on compute01;verify quickis queued on dev-02.Note for the orchestrator, from D375 (added today): the 120 Hz target for "key to letter on screen, prediction on" is 8.3 ms p99. This branch measures 14.9 / 15.1 ms p50/p99 in the perf-VM harness, where headless Chromium paces animation frames at 60 Hz (16.7 ms). So the number is "next 60 Hz frame", and this harness cannot show a 120 Hz frame. Meeting or measuring D375 needs a 120 Hz frame source (the Mac VM per the frame-performance rule). That is outside #441's scope; I have not changed any rendering.
verify fastatb28cb7492(compute01): one real finding, in a test fixture. Thetestrow failed insaturated_terminal_queues_preserve_every_byte_and_daemon_liveness. Its Python oracle (scripts/agent_fixture.py) treats every terminal-stream event as a replay marker:Every other row passed, including static builds. Verbatim table:
Fixed in
3a19e0ed0: the fixture validates the notice strictly (same session, exactly four keys, boolean bits), records it inprediction_modes, and keeps it out ofevents. That way the oracles that assert no events or count them (verify-vt-credit,verify-agent-snapshot) don't start depending on PTY mode timing.cargo teststops at the first failing binary, so a--no-fail-fastworkspace run at3a19e0ed0is queued on compute01 to surface any other test that assumes the old event set. The finalverify fastfollows. Receipt: compute01~/.cache/codex-scratch/j400c/evidence/fast-b28cb7492.log.verify quickatb28cb7492(dev-02): all 12 rows PASS (evidence/quick.log).cargo test --workspace --locked --no-fail-fastat3a19e0ed0(compute01; receipt~/.cache/codex-scratch/j400c/evidence/test-nff.log,TEST_EXIT=101) surfaced every test binary the gate's fail-fasttestrow never reached. 13 failures in total:initial_attach_requires_explicit_credit_before_replay:verify-agent-attach-credit.py→AssertionError: unfunded attach emitted frame 0x33. The new mode notice is attach metadata. It is not output and spends no credit, so the product behaviour is intended. The oracle now still allows only Acks before Credit, plus a strictly validated mode notice; Output, Snapshot and any other event still fail. Folded into the fixture commit, nowae253d847.releaseplugin latest/review_pool/review_restart, the server'sreview_revocation_r2,release_manifest,release_payloadand the desktopnative_surfacetest all panic atstd::env::var_os("CARGO_TARGET_DIR").unwrap()/ "use the job target directory".scripts/verifysets that variable; my barecargo testdid not. The same tests pass insideverify fast'stestrow.The final
verify fastatae253d847is queued on compute01 (position 16).verify fastatae253d847(compute01): every row PASS, includingtest(with both fixture fixes) and static builds, exceptcargo-deny:error[vulnerability]: libsqlite3-sys via C SQLite CVE-2026-119375(RUSTSEC-2026-0459,libsqlite3-sys 0.30.1). The branch changes no Cargo manifest. dev handled this since my base:ba79e6746(#473) adds a time-limiteddeny.tomlexception, andcargo deny checkon untouchedorigin/dev198c4a736printsadvisories ok, bans ok, licenses ok, sources ok(receiptevidence/deny-origin-dev.log).Correction to my previous comment: the 12
CARGO_TARGET_DIRfailures from the ad-hoc run are now proven to pass insideverify fast(itstestrow is PASS above). Until this run they had not been reached.Rebased onto
origin/dev198c4a736. dev added libghostty-vt 1.0 (#419), #442 (spec fixes, sign-out), OSC 52 and touch selection, and touches four files this branch also changes:terminal.ts,mock-server.ts,main.ts,user_host.rs. The only conflict was a doc comment inmain.ts(kept dev's). The new head is949b0ae13. The earlier receipts were taken on the old base, so I'm rerunning all of them on the new head: the 3× suites plus the 30 ms case (dev-02, queued), the real-shim proof ×3 (compute01, queued), thenverify quickandverify fast.