You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
This is the single "when the next psmux tag lands" tracker for the psmux family under #288. Two separate upstream fixes are sitting on psmux main with no release carrying them — 3.3.7 (2026-07-20) is still the newest tag, and the only one our version gate admits:
select-window -t sess:@N rejected CLI-side; and the server focusing @N as index on ≥3-window sessions
33ea109
Everything below is what changes for us the day a tag ships both. Sections are split by what each item is actually gated on — the tag alone, the tag plus a code removal here, or something no release will ever fix.
A. Gated on the tag only — live smoke, real attached client, Windows 11
Several forms we rely on (or plan to, see #221) were never live-verified because 3.3.7 cannot exercise them.
switch-client -t %Nsame-session: the parked-window trailer's return move now actually lands on the originating pane (maintainer verified; confirm through our trailer end-to-end)
Unresolvable target exits non-zero → the trailer's switch-client -l fallback is now reachable; confirm the fallback itself works
switch-client -l semantics across psmux's per-session servers: does "last session" survive the server hop at all? (never live-tested; both trailers and switch_client(last_fallback=True) depend on it)
Cross-session sess:win selection: TUI/CLI attach to a control-session window from inside psmux (switch-client -t =bmad-loop-ctl:<win>) lands on that window, not the session's active one (fixed upstream in 6c76ff9; on 3.3.7 the window part is ignored)
= exact-match prefix in a qualified target (=sess:win): does the new dedicated switch-client handler parse it? (untested upstream form; upstream tests use bare sess:win)
B. Gated on the tag and a workaround removal here — psmux/psmux#497
Removal recipe and the reasoning are in the #291 comment. All in src/bmad_loop/adapters/psmux_backend.py, and the whole group goes at once:
Bump _LAST_UNSUPPORTED from (3, 3, 6) to the last release without33ea109 — this is the actual gate. While available() still admits 3.3.7, the workaround is load-bearing: on that build the id form does not merely fail, it focuses the wrong window on ≥3-window ctl sessions.
Delete the PsmuxMultiplexer.select_window override (base select-window -t session:@N works directly)
Delete _window_index — sole caller is that override; its renumber-race ceiling disappears with it
Delete the _QUALIFIED_ID class attribute — sole consumer is that override
Module docstring: drop the "select_window is the one verb that cannot take that form…" sentence; every id-taking verb becomes uniform
tests/test_psmux_backend.py: invert the id→index resolution tests (and the unresolvable-id pass-through case) to assert the qualified id reaches the verb untranslated
Not affected, do not touch: the session-qualification of new_window / list_window_ids / new_parked_window / list_windows / current_window_id. That is psmux/psmux#483's per-server-id model property, permanent, and independent of #497.
Also tag-dependent: #228's version gate (the rc-0 no-op ceiling) — it needs the same tag, and its _LAST_UNSUPPORTED bump is the same edit as the first box above. Sequence them together, not as two PRs fighting over one constant.
C. Not release-gated — no psmux tag fixes these
Recorded here so the "next tag" pass does not re-litigate them:
show-options listing can answer empty-with-success while keys exist: the plugin-drain copy of the ShowOptions handler (server/mod.rs:465-468 at v3.3.7) replies "" rc 0. Source-verified, not live-reproduced (race window). The psmux: per-window user options are session-scoped - the ctl-window project guard cannot discriminate and the parked-return mechanism is inert #310 backend treats {} as a real answer, so a read landing there degrades to "every key unset" for that one call; documented in _scoped_options' docstring, self-heals on the next sweep/list. No workaround worth its weight; recorded so a future mis-fallback debug does not start from zero.
Summary
This is the single "when the next psmux tag lands" tracker for the psmux family under #288. Two separate upstream fixes are sitting on psmux
mainwith no release carrying them — 3.3.7 (2026-07-20) is still the newest tag, and the only one our version gate admits:mainswitch-clientwindow/pane targets silently ignored (rc-0 no-op)d56d777+6c76ff9select-window -t sess:@Nrejected CLI-side; and the server focusing@Nas index on ≥3-window sessions33ea109Everything below is what changes for us the day a tag ships both. Sections are split by what each item is actually gated on — the tag alone, the tag plus a code removal here, or something no release will ever fix.
A. Gated on the tag only — live smoke, real attached client, Windows 11
Several forms we rely on (or plan to, see #221) were never live-verified because 3.3.7 cannot exercise them.
switch-client -t %Nsame-session: the parked-window trailer's return move now actually lands on the originating pane (maintainer verified; confirm through our trailer end-to-end)switch-client -lfallback is now reachable; confirm the fallback itself worksswitch-client -lsemantics across psmux's per-session servers: does "last session" survive the server hop at all? (never live-tested; both trailers andswitch_client(last_fallback=True)depend on it)sess:winselection: TUI/CLI attach to a control-session window from inside psmux (switch-client -t =bmad-loop-ctl:<win>) lands on that window, not the session's active one (fixed upstream in6c76ff9; on 3.3.7 the window part is ignored)=exact-match prefix in a qualified target (=sess:win): does the new dedicated switch-client handler parse it? (untested upstream form; upstream tests use baresess:win)sess:idx.idxorsess:%N): verify it live cross-session (ctl session → user session)switch_client()seam no longer returns a falseTrueon a no-op (rc-0 trust — self-heals with the release, confirm)select-window -t sess:@Nfocuses the right window on a ≥3-window session — the select-window -t session:@id: client-side existence check rejects window-id targets the server supports (3.3.7) psmux/psmux#497 part 2 defect (server fell back to id-number-as-index) only manifests there; a 2-window control is not a valid checkselect-window -t sess:@N.pane(select-window -t session:@id: client-side existence check rejects window-id targets the server supports (3.3.7) psmux/psmux#497 part 3,parse_targetdropping the pane suffix) — we do not target this form today, but confirm before anyone relies on itB. Gated on the tag and a workaround removal here — psmux/psmux#497
Removal recipe and the reasoning are in the #291 comment. All in
src/bmad_loop/adapters/psmux_backend.py, and the whole group goes at once:_LAST_UNSUPPORTEDfrom(3, 3, 6)to the last release without33ea109— this is the actual gate. Whileavailable()still admits 3.3.7, the workaround is load-bearing: on that build the id form does not merely fail, it focuses the wrong window on ≥3-window ctl sessions.PsmuxMultiplexer.select_windowoverride (baseselect-window -t session:@Nworks directly)_window_index— sole caller is that override; its renumber-race ceiling disappears with it_QUALIFIED_IDclass attribute — sole consumer is that overrideselect_windowis the one verb that cannot take that form…" sentence; every id-taking verb becomes uniformtests/test_psmux_backend.py: invert the id→index resolution tests (and the unresolvable-id pass-through case) to assert the qualified id reaches the verb untranslatedNot affected, do not touch: the session-qualification of
new_window/list_window_ids/new_parked_window/list_windows/current_window_id. That is psmux/psmux#483's per-server-id model property, permanent, and independent of #497.Also tag-dependent: #228's version gate (the rc-0 no-op ceiling) — it needs the same tag, and its
_LAST_UNSUPPORTEDbump is the same edit as the first box above. Sequence them together, not as two PRs fighting over one constant.C. Not release-gated — no psmux tag fixes these
Recorded here so the "next tag" pass does not re-litigate them:
show-options -wqv @bmad_return_panereturns''unconditionally, so neither theswitch-clientnor thedetachbranch ever fires. They need theRETURN_OPTIONchannel re-homed first (session-scoped option with the window id encoded in the option name, or run-dir sidecar state — both live-verified working on stock 3.3.7). The pure grammar items are unaffected: smoke them by feeding a target by hand. Update 2026-07-26: the re-homing is implemented on the psmux: per-window user options are session-scoped - the ctl-window project guard cannot discriminate and the parked-return mechanism is inert #310 branch (session-scoped@opt_@Nkeys; trailer self-probes its window id viadisplay-message -p -t $env:TMUX_PANE), so once that PR merges the section-A trailer items become exercisable on the next tag.set_return_pane's write (set-option -w) silently lands at session scope (rc 0), so even a fixed read channel must not assume the value is per-window. Update 2026-07-26: moot on the psmux: per-window user options are session-scoped - the ctl-window project guard cannot discriminate and the parked-return mechanism is inert #310 branch —@-option writes no longer use-wat all.;-token splitting is not quote-aware (found in psmux: per-window user options are session-scoped - the ctl-window project guard cannot discriminate and the parked-return mechanism is inert #310 round-4 verification, live-reproduced on 3.3.7): the one-shot CLI path chains commands throughsplit_chained_commands(config.rs:1282), which cuts on whitespace-delimited;/\;tokens with no quote-awareness —psmux set-option @k "a ; b"storesaand hands the rest to the server as a command;"a; b"(mid-token) is safe. The control-mode (-C) splitter (connection.rs:20) is quote-aware, so upstream likely never sees this on iTerm2-style clients. Workaround: the psmux: per-window user options are session-scoped - the ctl-window project guard cannot discriminate and the parked-return mechanism is inert #310_transportablegate refuses values containing standalone;/\;tokens. Filed upstream as set-option: ";" inside a double-quoted value splits the one-shot command line (value truncated, remainder executed) psmux/psmux#499 (repro incl. remainder-execution proof); when a tag ships the fix, the refusal can narrow to mirror the quote-aware splitter.show-optionslisting can answer empty-with-success while keys exist: the plugin-drain copy of theShowOptionshandler (server/mod.rs:465-468at v3.3.7) replies""rc 0. Source-verified, not live-reproduced (race window). The psmux: per-window user options are session-scoped - the ctl-window project guard cannot discriminate and the parked-return mechanism is inert #310 backend treats{}as a real answer, so a read landing there degrades to "every key unset" for that one call; documented in_scoped_options' docstring, self-heals on the next sweep/list. No workaround worth its weight; recorded so a future mis-fallback debug does not start from zero.Notes
ClientInfois never reaped, andClientDetachover-decrementsattached_clientspsmux/psmux#434.Refs: psmux/psmux#483, psmux/psmux#497, psmux/psmux#321, #221, #185, #228, #291, #310