Files
stack/docs/plans/reviews/2026-09-07_tmux-r3-verdict.md

11 KiB
Raw Permalink Blame History

Tmux R3 — independent verdict: NOT APPROVED

Reviewer: filbert. Author/coordinator: darkwing. Date: 2026-09-07. Authority: 2026-09-07_tmux-r3-review-request.md. No competing assignment is known. I did not author or modify the implementation.

The R2 confirmation-soundness blocker remains. R3 adds useful, tested reason diagnostics and corrects several claims, but its success predicate still reports success for a retained hidden draft behind a prompt/footer lookalike. Six independent real-scratch-pane counterexamples reproduce, including the wrapper, in both locales. A successful coordinator live send cannot establish that these negatives are safe.

1. Exact candidate and stable admission

Reviewed only the frozen docs/plans/reviews/2026-09-07_tmux-r3-export/ and its verified disposable copy. SHA-256 of export SHA256SUMS: 12e30fde5f8a6d35e01f6125e4963792d97f08172291e97b859999a47392d1d9.

File under export tools/tmux/ SHA-256
agent-send.sh d59b60d601a9076e152830ee769772f7b099aada0d194b6e3844f5fbdcd7f5d0
agent-send.test.sh 1916b48df4c0924d4d99892904ff8fef2bed50723ff7d3b0cd4accdd9b903cda
README.md 86dfbb34321957d025d85441641d272267ecf13604ce22b13968d9561d4a14f8
send-message.sh 0efe48969dd52db634b46c99410070811d3be78e2a33a373ab8f1bef128b2703
test-agent-send-socket-live.sh ab2b8fd4f8b3e800f887c5552f935178e032582a449e8f1296aadf567498d607
test-send-message-socket.sh 9831d6dbfb8bc87b9dd2cf56cdda57ebef255991c344a767c915b3d2fea070f2
test-send-message-verdict.sh a286cfb1c3bfa4a5a762250f0dbfb66b2b405b4602e739129b201a65e8c189d9

All seven hashes match before copying/execution and afterwards in both export and copy. Final recheck: 2026-09-07T20:15:16Z. Mutable working-tree source was not used. Earlier exports and verdicts remain untouched.

Disposable root: /tmp/filbert-tmux-r3.4cyawppa; evidence is under evidence/. Only disposable script permissions were made executable; candidate bytes and export permissions were preserved. Source/test changes were inspected before execution.

2. Findings and prior dispositions

F1 — BLOCKING / high, unchanged: newly visible text is not a cleared current editor

Locations: send-message.sh:139174, especially final-glyph acceptance at 143145 and rule/footer recognition at 164169; success predicate at 217222 and exit 0 at 238. The wrapper propagates that status.

R3 still checks that the normalized complete message was absent from the baseline, is present somewhere in the new capture, and is absent from a region selected by visual resemblance. It does not establish that this region is the current editor. A newly displayed draft preview satisfies the first two conditions while a transcript prompt or footer satisfies the third. Reason diagnostics affect unconfirmed cases; they do not prevent this erroneous success path.

I reran the independent raw-TTY scratch REPL from R2. It handles bracketed paste and records pending, accepted, and submit_keys separately from the display. Hidden modes retain the complete body after Enter and render its preview above either:

Draft preview (NOT submitted): <complete body>
────────

────────
~/fixture (main)

or a final > transcript decoration line. The baseline contains neither the message nor that editor-looking region. These are intentionally hostile synthetic layouts, not claims about an observed live application's rendering.

Actual results, independently repeated under LC_ALL=C and LC_ALL=C.UTF-8:

Mode Tool outcome Recorded application state
Honest acceptance control exit 0 accepted count 1, pending empty
Visible retained-draft control exit 2 / draft accepted count 0, entire body retained
Hidden draft + rule/footer lookalike exit 0 / delivered accepted count 0, entire body retained
Hidden draft + final glyph lookalike exit 0 / delivered accepted count 0, entire body retained
Wrapper into hidden rule/footer fixture exit 0 / delivered accepted count 0, entire prefixed body retained

Six false positives and four honest controls. Every run receives exactly one submission key, including direct sends with -r 100. Unicode bodies survive intact. The failure is not merely lack of a model ACK: the editor remains uncleared, and the region treated as cleared is not the editor. The weaker “not ACK” qualification does not resolve that distinction.

Required disposition: retain unconfirmed status when current-editor/message binding is unsupported; preserve the one-Enter safety property. Provide a bounded, justified runtime boundary and regression controls that distinguish acceptance from previewed retained drafts, or obtain explicit reconciliation of a weaker contract. Passing positive fixtures or another successful live send is not a substitute. Do not reintroduce extra submission keys or simply relabel these counterexamples as success.

F2 — partially corrected; remaining contract/evidence wording must be reconciled

R3 correctly removes the double-Enter recommendation, dead flush counter and several queued-success/flush comments. It now labels the em-dash renderer synthetic, not a measured live cause. Those corrections are credited.

Remaining contradictions in the frozen bytes:

  • send-message.sh:128130 still says anchoring on the last rule pair is what makes it safe, notwithstanding F1 and the later heuristic qualification.
  • Unchanged README.md:50 still describes -r N as Enter-flush attempts; its later contract and script help say it is compatibility-only with no extra Enter.
  • test-send-message-verdict.sh:1718 and the retained-renderer comment still describe behavior across flush Enters; the introductory “three” fixtures remains stale.

Do not claim all contradictory wording is closed. Reconcile these statements in the next authorized revision. They do not erase the independent F1 code blocker.

F3 — NONBLOCKING test-isolation gap remains

Unchanged test-send-message-socket.sh:76,85 writes fixed shared paths /tmp/send-message-named.out and /tmp/agent-send-named.out. I did not execute this suite under an isolated-only mandate or patch the test to manufacture a pass. Move these outputs under its private per-run scratch in a future revision. The separate C1C6 scratch socket-contract suite was independently executed and passes.

3. R3 diagnostic and safety verification

Eleven additional independent fake-transport controls verified:

  • Positive new-message/clear-region control: exit 0, one key.
  • Repeated baseline body: exit 2, reason=message-present-in-baseline.
  • Clear-looking region without new message: exit 2, reason=new-message-not-visible.
  • Unrecognized editor: exit 2, reason=editor-shape-unrecognized.
  • Queued banner: exit 2, reason=queued-banner-ambiguous.
  • Baseline and post-send capture failures, including success-looking partial stdout: exit 2; no extra key. Baseline failure causes no submission.
  • Load, paste and submission-key failures: exit 2 at the appropriate stage.
  • Retained wrapped Unicode: exit 2 / draft, one key.

The four reason identifiers are fixed and do not echo the test message. Counted submit-key calls are zero or one as appropriate even with -r 999. Repeated/common content already visible in the baseline conservatively prevents confirmation; it cannot prove acceptance of a new identical send. These passing controls support the diagnostics and no-extra-Enter improvements, not F1's false-positive path.

4. Actual execution and receipts

Versions: tmux 3.7c, GNU bash 5.3.15(1)-release. Tests used explicit clean environments: PATH /usr/bin:/bin; HOME, TMPDIR and TMUX_TMPDIR beneath the disposable root; no inherited TMUX/TMUX_PANE or Mosaic socket identity. Only reviewer-created scratch panes/sockets were used. The socket-contract suite's SSH is stubbed; no remote host was contacted.

Command in disposable copy Actual result
bash -n on all six shell files exit 0
bash tools/tmux/agent-send.test.sh, C locale exit 0; 19/0
bash tools/tmux/test-send-message-verdict.sh, C locale exit 0; 20/0, including updated diagnostic assertions
Same verdict suite, C.UTF-8 locale exit 0; 20/0
bash tools/tmux/test-agent-send-socket-live.sh, C locale exit 0; C1C6 and effective sabotage controls pass, private fixtures only
python3 evidence/hostile-real.py exit 0 verifies six false positives plus four controls; not a candidate PASS
python3 evidence/fault-probes.py exit 0; eleven independent transport/diagnostic controls pass
bash tools/tmux/test-send-message-socket.sh NOT RUN, shared output paths (F3)

No remaining responding servers were found in the reviewer-owned socket directory; suite-created scratch servers were cleaned up by their traps. Candidate hashes remain unchanged. No private pane/default user server/live seat was inspected or mutated.

The request's coordinator live ms-test success is not my independent live measurement. I performed no live verification, inspected no private pane and did not treat that receipt as proof against the demonstrated negatives. Earlier failed live receipts are not upgraded. Ten seconds remains a chosen observation budget, not a proved rendering guarantee.

Evidence hashes, relative to /tmp/filbert-tmux-r3.4cyawppa/evidence/:

Artifact SHA-256
suite-results.json 878348c276ceabf8e454d31ec0f71ff569cc46a1210dedc6b9185aaaf6ca8076
wrapper.log 2df46e6e4285d1955ce93f1b3a51396ea23facb38b3cabea1e53d3dae8d34017
verdict-C.log and verdict-UTF8.log (identical) 69c3819b6fa362684e4b401c0a6aa9cce95f599451e42343d41f9c4965808abd
socket-contract.log 3d794abd5ea59ff4b476f0614a186799141e6863f9fa98f6775d6fb6ad31119c
editor-fixture.py 4761eed8f12755380be751304f227e1d3e129e7069dab1e7c5e674c9b77fece0
hostile-real.py 08e95356ae96fffe2d64e27005ef103642fe03eeec0f9c50f630beb04d6e6ac2
hostile-receipts.json c463b5c013436a622a46672dfdc7620d31bf55b4b34c897669fbd55a8ab6ee1b
fault-receipts.json 52a79d7a2eb62da3563bab4edb357b681de129745d26027f29229d9dec3fe738

Equal R2/R3 hostile receipt hashes reflect identical measured outcomes, not reuse instead of execution: the harness was rerun against the newly verified R3 copy. Scratch is local/disposable evidence; no durable publication is claimed.

5. Return

NOT APPROVED at the exact R3 export. Stable admission and reason diagnostics are verified improvements. Confirmation soundness remains unresolved. Return the findings to darkwing for substantive reconciliation and a newly frozen candidate. No source/export edits, dependency installs, live sends, deployment, commits or push occurred. This verdict is the only repository write. No automatic acceptance, resend, timer, commit/push readiness or subsequent action is inferred.