From 714953e277622db2d8ac479b0c4d1550c96ee191 Mon Sep 17 00:00:00 2001 From: marcie Date: Fri, 28 Aug 2026 20:57:41 -0500 Subject: [PATCH] framework tools/tmux: exact session matching in discovery AND sender target (codex PR #1466) tmux target syntax accepts an unambiguous PREFIX, so both the socket discovery loop and the sender's -t could match X-old for target X. Discovery now probes has-session -t =NAME; the sender target gets '=' prepended unless it is already exact or compound (session:win.pane). Arm A3 proves it: a prefix-named session no longer swallows a delivery aimed at the shorter name (sender fails target-not-found rc 1). --- .../mosaic/framework/tools/tmux/agent-send.sh | 19 ++++++++++++++++--- .../tools/tmux/test-send-message-socket.sh | 18 ++++++++++++++++++ 2 files changed, 34 insertions(+), 3 deletions(-) diff --git a/packages/mosaic/framework/tools/tmux/agent-send.sh b/packages/mosaic/framework/tools/tmux/agent-send.sh index adf9fb23..7bfec682 100755 --- a/packages/mosaic/framework/tools/tmux/agent-send.sh +++ b/packages/mosaic/framework/tools/tmux/agent-send.sh @@ -178,7 +178,10 @@ if [ -z "$SOCKET_NAME" ] && [ -z "$SSH_TARGET" ]; then for sf in "$socket_dir"/*; do [ -S "$sf" ] || continue sname="${sf##*/}" - tmux -L "$sname" has-session -t "$DST_SESSION" 2>/dev/null && hits="$hits$sname"$'\n' + # '=' forces exact session-name matching: tmux target syntax otherwise + # accepts an unambiguous PREFIX, so a session named X-old on a socket + # would count as a false hit for target X (codex PR #1466). + tmux -L "$sname" has-session -t "=$DST_SESSION" 2>/dev/null && hits="$hits$sname"$'\n' done hit_count=$(printf '%s' "$hits" | grep -c . || true) if [ "$hit_count" -gt 1 ]; then @@ -196,11 +199,21 @@ if [ -n "$SOCKET_NAME" ]; then socket_args=(-L "$SOCKET_NAME") fi +# Exact session matching for the sender target too (codex PR #1466): without +# '=', tmux target syntax accepts an unambiguous PREFIX, so a delivery aimed +# at session X can land in X-old. Compound targets (session:win.pane) and +# already-exact ('=...') forms pass through untouched. +DST_TARGET="$DST_SESSION" +case "$DST_SESSION" in + =*|*:*) ;; + *) DST_TARGET="=$DST_SESSION" ;; +esac + if [ -z "$SSH_TARGET" ]; then # Local pane: call the canonical sender directly. - exec "$SENDER" "${socket_args[@]}" -t "$DST_SESSION" -b "$B64" -r "$RETRIES" $vflag + exec "$SENDER" "${socket_args[@]}" -t "$DST_TARGET" -b "$B64" -r "$RETRIES" $vflag else # Remote pane: ship the sender over ssh and run it local to the target. ssh -o ConnectTimeout=10 "$SSH_TARGET" \ - "bash -s -- ${socket_args[*]@Q} -t '$DST_SESSION' -b '$B64' -r '$RETRIES' $vflag" < "$SENDER" + "bash -s -- ${socket_args[*]@Q} -t '$DST_TARGET' -b '$B64' -r '$RETRIES' $vflag" < "$SENDER" fi diff --git a/packages/mosaic/framework/tools/tmux/test-send-message-socket.sh b/packages/mosaic/framework/tools/tmux/test-send-message-socket.sh index 4fbbae4e..073818b8 100755 --- a/packages/mosaic/framework/tools/tmux/test-send-message-socket.sh +++ b/packages/mosaic/framework/tools/tmux/test-send-message-socket.sh @@ -121,6 +121,24 @@ tmux -L "$SOCKET" kill-session -t "$TWIN" >/dev/null 2>&1 || true # Arm B: session unique to ONE socket, no -L -> auto-resolve to that socket # and deliver there. +# Arm A3: prefix matching must not produce false socket hits (codex PR +# #1466): a session named TWIN-old must not count as a hit for target +# TWIN (tmux target syntax prefix-matches without '='). +PSEUDO="${TWIN}-old" +tmux new-session -d -s "$PSEUDO" -c "$TMPDIR" 'PS1="❯ " exec bash --noprofile --norc -i' +A3_ERR=$(mktemp) +a3_rc=0 +env -u MOSAIC_TMUX_SOCKET "$AGENT_SEND" -s "$TWIN" -m "prefix trap" >/dev/null 2>"$A3_ERR" || a3_rc=$? +# TWIN exists nowhere (both twins killed after arm A2); with '=' the +# PSEUDO session is not a hit, so the sender must fail target-not-found +# (rc 1) instead of delivering into the prefix-named session. +[ "$a3_rc" -eq 1 ] || fail "prefix false-hit: rc=$a3_rc want 1 (stderr: $(cat "$A3_ERR"))" +if tmux capture-pane -t "=$PSEUDO:0.0" -p 2>/dev/null | grep -qF "prefix trap"; then + fail "delivery landed in the prefix-named session (false socket hit)" +fi +tmux kill-session -t "$PSEUDO" >/dev/null 2>&1 || true +rm -f "$A3_ERR" + uniq_rc=0 env -u MOSAIC_TMUX_SOCKET "$AGENT_SEND" -s "$TARGET" -m "autoresolved hello" >$UNIQ_OUT 2>$UNIQ_ERR || uniq_rc=$? [ "$uniq_rc" -eq 0 ] || fail "unique auto-resolution: rc=$uniq_rc (stderr: $(cat $UNIQ_ERR))"