12 KiB
Tmux r2 — independent verdict: NOT APPROVED
Reviewer: filbert. Author/coordinator: darkwing. Date: 2026-09-07.
Authority: 2026-09-07_tmux-r2-review-request.md.
No competing assignment is known; I did not author or modify the candidate.
The export remained stable and the supplied executed suites pass. However, baseline/new-message correlation still permits false-positive confirmation when the actual draft is retained behind a prompt/footer lookalike. This was reproduced on real, reviewer-owned scratch tmux panes in both locales, including the wrapper. The no-automatic-extra-Enter change is independently supported and should be retained.
1. Exact reviewed candidate
Only the immutable export and its disposable copy were reviewed:
docs/plans/reviews/2026-09-07_tmux-r2-export/.
SHA-256 of its SHA256SUMS:
12f498a6e32bc3fe55a2c4707e8ce612e1c7e0801652619a78734e05bfce3244.
File under export tools/tmux/ |
SHA-256 |
|---|---|
agent-send.sh |
9a1edcafa2b6c575a6afb7fa4b4714b994f8abe2d33a852810ae897b5aca0eb6 |
agent-send.test.sh |
1916b48df4c0924d4d99892904ff8fef2bed50723ff7d3b0cd4accdd9b903cda |
README.md |
86dfbb34321957d025d85441641d272267ecf13604ce22b13968d9561d4a14f8 |
send-message.sh |
76e17e9e777e95e042f90eee95312f06031c3b66e3c4f56e30f02527fe3737cb |
test-agent-send-socket-live.sh |
ab2b8fd4f8b3e800f887c5552f935178e032582a449e8f1296aadf567498d607 |
test-send-message-socket.sh |
9831d6dbfb8bc87b9dd2cf56cdda57ebef255991c344a767c915b3d2fea070f2 |
test-send-message-verdict.sh |
43bd569e32f788e95efb7c9a08b6bdaa937364f71a422a4583ebe3b9d6355f6b |
All seven hashes passed before admission, after copying, and after execution in both export and copy; final recheck 2026-09-07T20:02:28Z. No mutable working-tree source was substituted. The earlier rejection remains untouched.
Disposable copy: /tmp/filbert-tmux-r2.0tfori1a.
Evidence: its evidence/ directory. Script copies were made executable; bytes were
unchanged. The export itself was neither edited nor chmodded.
2. Findings
F1 — BLOCKING / high: new visibility does not identify the current cleared editor
Locations: send-message.sh:139–174 (locate_input_box), particularly the final
prompt test at 143–145 and footer heuristic at 164–169; confirmation at 228–231;
exit-0 message at 242. agent-send.sh propagates this verdict.
The baseline proves only that the normalized body was absent from the earlier capture. The next capture can contain a draft preview, while the selected empty-looking region is transcript decoration rather than the current editor. Neither newly visible text nor the path/branch-shaped footer establishes the missing editor identity. The final-glyph branch has the same problem without needing rules.
Independent real-tmux reproduction
A small raw-TTY synthetic REPL supports bracketed paste and records:
pending, accepted, and submit_keys in a separate fixture-state file.
It has an honest accepting mode, a visible retained-draft mode, and hidden-editor
modes. Hidden modes retain the complete pasted message after the initial Enter;
they do not accept it. They render a preview above either:
Draft preview (NOT submitted): <complete message>
────────
────────
~/fixture (main)
or a final > transcript decoration line. The baseline contains no message and no
such editor-looking region. This is a hostile synthetic layout, not a claim that a
particular live application currently renders it.
Actual results in both LC_ALL=C and LC_ALL=C.UTF-8:
| Fixture | Actual receipt | Independently recorded state |
|---|---|---|
| Honest accepting REPL | exit 0, delivered | accepted count 1; pending empty |
| Visible retained draft | exit 2, draft | accepted count 0; 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 |
That is six false-positive confirmations and four honest controls. Every run
received exactly one submission key, even with -r 100. Unicode bodies were
preserved. This is not merely absence of a model acknowledgement: the fixture
positively records the uncleared draft, and the apparent cleared region is not its
editor. The “not ACK” qualification does not establish a current editor boundary.
The supplied transition stub covers static/repeated/new text with the same assumed editor shape; its successful new-transition case does not distinguish this retained- draft counterexample. Those passing fixtures therefore cannot close the rule-pair or hidden-editor audit.
Required disposition: leave such observations unconfirmed unless the supported runtime boundary supplies sufficient current-editor/message correlation. Do not restore extra Enter events to compensate. Add hostile retained-draft controls with independent state/key-count evidence and honest accepting controls. If the intended result is only “text appeared near a lookalike,” that is a different, weaker contract requiring explicit owner reconciliation—not a successful fix by relabeling.
F2 — BLOCKING / medium: source/help/test evidence contradicts the revised contract
Exact contradictions in this export:
send-message.sh:12–13: another Enter is recommended and double-Enter called safe; revised behavior sends no automatic extra Enter.send-message.sh:39, 176–186 and 226–227: queued-banner/flush/suffix success descriptions remain, despite the actual banner refusal and whole-body predicate.send-message.sh:128–130: the last rule pair is described as making detection safe; F1 demonstrates the missing boundary.send-message.sh:170–171: adjacent rules are described as a successful empty range, directly after code that now rejects them.agent-send.sh:23still advertises Enter-flush behavior;README.md:50still describes-r Nas Enter-flush attempts, contradicting its later compatibility text.test-send-message-verdict.sh:21and 142–144 describe the synthetic trailing em-dash fixture as measured live redraw behavior, contradicting the request's explicit correction. Its introductory “three” fixtures and flush-related comments are stale as well.
Required correction: make help, comments, README and fixture claims consistently state the chosen observation limit, no automatic extra keys, unconfirmed queued banners, and the exact qualified success predicate. Keep synthetic fixtures labeled synthetic; do not restore unsupported live-root-cause claims. Preserve prior records and record corrections honestly.
F3 — NONBLOCKING test-isolation gap: named-socket suite writes shared /tmp paths
test-send-message-socket.sh:76,85 redirect to fixed
/tmp/send-message-named.out and /tmp/agent-send-named.out, outside its private
scratch roots. Concurrent runs can overwrite each other's files; those paths can
also already belong to another task. I did not run this suite under an
isolated-only authorization and did not patch it to manufacture a passing receipt.
Use per-run output paths in the maintained test. Its coordinator PASS is not an
independent rerun here. The separate socket-contract suite was independently run.
3. Verified improvements and remaining limits
- Grouped UTF-8 rules and retained Unicode/wrapped-message controls pass in the supplied verdict suite under C and C.UTF-8. Unicode is no longer filtered away.
- Baseline and post-submission capture failures refuse, including failure with success-looking stdout; post-capture failure sends no additional key.
- Load/paste/submission-key failures refuse at the appropriate stage.
- Adjacent rules and unsupported-footer/history controls refuse in supplied tests.
- Repeated body already in baseline remains unconfirmed even with an empty-looking editor. This is conservative behavior, not a receipt for a second identical send.
- Queued banners alone remain unconfirmed; retained wrapped Unicode stays a draft.
- No automatic extra submission key occurred in the independent retained/hidden/ accepted/fault controls. That fixes the prior flush-safety concern, but not F1.
- Wrapper address/triage and scratch socket-selection controls pass within their tested scope. No remote-host delivery, deployment or live-seat acceptance was tested.
4. Actual commands and receipts
Versions: tmux 3.7c, GNU bash 5.3.15(1)-release.
All source/test commands were read before execution. Test environments used env -i
semantics (explicit environment dictionaries), PATH /usr/bin:/bin, synthetic HOME,
TMPDIR and TMUX_TMPDIR beneath the disposable root, with no inherited TMUX/TMUX_PANE
or Mosaic socket identity. Only reviewer-created sockets/panes were used. Scratch
socket-contract SSH operations use the test's capture stub, never a remote connection.
| Command/test from disposable copy | Actual result |
|---|---|
bash -n on all six shell files |
exit 0 |
bash tools/tmux/agent-send.test.sh, LC_ALL=C |
exit 0; 19/0 |
bash tools/tmux/test-send-message-verdict.sh, LC_ALL=C |
exit 0; 20/0 |
| Same verdict suite, LC_ALL=C.UTF-8 | exit 0; 20/0 |
bash tools/tmux/test-agent-send-socket-live.sh, LC_ALL=C |
exit 0; C1–C6 and effective sabotage controls pass; only private scratch fixtures |
python3 evidence/hostile-real.py |
exit 0 verifies the six false positives and four controls described in F1; not a candidate PASS |
python3 evidence/fault-probes.py |
exit 0; nine independent stub-transport controls pass |
bash tools/tmux/test-send-message-socket.sh |
NOT RUN, fixed shared output paths (F3) |
Independent fault controls cover: positive transition; repeated baseline body;
post-capture failure; baseline failure; load failure; both paste attempts failing;
submission-key failure; retained wrapped Unicode; and queued banner. Stub logs assert
zero or one submit-key call as appropriate, with -r 999. No actual socket is used
by that additional fault harness.
All seven candidate byte hashes still match in the export and disposable copy. No remaining responding servers were found in the reviewer-owned socket directory; suite-owned scratch servers were cleaned up by their traps. No private pane, default user server or live seat was inspected or mutated.
Selected evidence hashes, relative to /tmp/filbert-tmux-r2.0tfori1a/evidence/:
| Artifact | SHA-256 |
|---|---|
suite-results.json |
878348c276ceabf8e454d31ec0f71ff569cc46a1210dedc6b9185aaaf6ca8076 |
verdict-C.log and verdict-UTF8.log (identical) |
8a775338f565016d2ca5610386a0928822115426632d1be5ab97b8b7eee9a720 |
wrapper.log |
2df46e6e4285d1955ce93f1b3a51396ea23facb38b3cabea1e53d3dae8d34017 |
socket-contract.log |
3d794abd5ea59ff4b476f0614a186799141e6863f9fa98f6775d6fb6ad31119c |
editor-fixture.py |
4761eed8f12755380be751304f227e1d3e129e7069dab1e7c5e674c9b77fece0 |
hostile-real.py |
55e3cf501c44d9041bed4bae360da552ac1360a4eaff8fb343c5e317ab996ebe |
hostile-receipts.json |
c463b5c013436a622a46672dfdc7620d31bf55b4b34c897669fbd55a8ab6ee1b |
fault-receipts.json |
1fad321c1f862a8f549f713596f2d96bc3a23c9a0641b564d6d2ff692d356592 |
case2.state.json |
7d86d133a14a50cdeba668b5048f24e9627181044a26d6551f37b2f4cb8a766a |
case2.pane.txt |
c1b44e938f2cdd7a8cc1d23a77e77eb0deb1e91b5c7389271b07e560fbee15ca |
Scratch receipts are local/disposable, not durable publication. The described fixture and saved harness permit reproduction without a live agent.
5. Return
NOT APPROVED at this exact r2 export. Candidate stability is resolved; the confirmation-soundness audit is not. Return F1–F3 to darkwing for reconciliation and a newly frozen revision. No code fixes, export edits, dependency installs, private inspection, live sends, deployment, commits or push occurred. This verdict is the only repository write. No automatic resend, acceptance, timer or subsequent action is inferred.