specs/037-pane-swap-move/spec.md
Specification: pane.swap and pane.move
Created: 2026-10-10. Status: clarified.
herdr scripts can swap two panes and move a pane next to another. In
signaltty the only way is tab.set_layout, which works within one tab and
cannot change the tab a pane belongs to.
Acceptance
pane.swap {pane_id, target_pane_id}exchanges the two panes' slots. The tree shape and the ratios do not change. Across tabs, each pane changes tab and each tab's focus stays on its slot.pane.move {pane_id, target_pane_id, direction?}removes the pane from its layout, collapsing the parent split, and splits the target with it (rightby default), evening out the run likepane.split. A source tab left without panes is empty, as afterpane.close.- Processes, PTYs and output are untouched. Each touched tab emits
tab.updated. A pane that changed tab emitspane.updated. The result is{tabs}. - The same pane twice, panes in different workspaces, or a pane that is not
in its tab layout →
BAD_PARAMS. An unknown pane →NO_SUCH_PANE. - Both are in
docs/08,method::ALL, the CLI (pane swap,pane move) and integration tests.
Scope and clarification
Moves across workspaces are out of scope. A workspace owns its cwd and git
state, so a pane would carry a stale context. herdr's pane.zoom is not
added. Zoom in signaltty is a per-window GUI view that is cleared on
navigation, so a server flag would fight it.