444ebf6e
docs: pin moving-text and shared tmux selection gaps
a73x 2026-09-06 10:28
Commit message
RETRO.md
| Old | New | ||
|---|---|---|---|
| @@ -1403,3 +1403,19 @@ or performance claim is made for this behavioral fix. | |||
| 1403 | The final full `make ci` run passed, including all e2e, agent and throughput | 1403 | The final full `make ci` run passed, including all e2e, agent and throughput |
| 1404 | gates. The prior nested-agent timeout did not recur. Hands-on acceptance is | 1404 | gates. The prior nested-agent timeout did not recur. Hands-on acceptance is |
| 1405 | still pending; source commit and tests do not imply user approval. | 1405 | still pending; source commit and tests do not imply user approval. |
| 1406 | |||
| 1407 | |||
| 1408 | ### Follow-up: moving text and tmux selection ownership | ||
| 1409 | |||
| 1410 | The user's two-client trial found two remaining gaps. First, retaining a range | ||
| 1411 | through redraws does not track the same line through terminal scrolling; the | ||
| 1412 | highlight must move with that line and subsequent copy must still name it. | ||
| 1413 | Second, foot's apparent tmux-owned drag can be visible in muxg because tmux paints | ||
| 1414 | it, whereas muxg's current local drag is not sent to tmux. Local desktop copy, | ||
| 1415 | tmux's paste buffer and shared selection rendering are distinct outcomes. | ||
| 1416 | |||
| 1417 | Added explicit acceptance scenarios to the text-selection plan: row-following | ||
| 1418 | belongs to the selection-identity slice; normal application drag, shared tmux | ||
| 1419 | selection, independent buffer/clipboard checks and required Shift+drag override | ||
| 1420 | belong to the application mouse slice. Neither gap is claimed fixed by the | ||
| 1421 | redraw-preservation commit. User acceptance of the overall feature is pending. | ||
docs/superpowers/plans/2026-09-06-native-text-selection.md
| Old | New | ||
|---|---|---|---|
| @@ -220,6 +220,12 @@ The following application mouse/clipboard slice must demonstrate: | |||
| 220 | - A gesture keeps its chosen owner through motion and release, including modifier | 220 | - A gesture keeps its chosen owner through motion and release, including modifier |
| 221 | changes and crossing another pane; cancellation cannot leave an application | 221 | changes and crossing another pane; cancellation cannot leave an application |
| 222 | with a stuck button or copy text from a different pane. | 222 | with a stuck button or copy text from a different pane. |
| 223 | - Attach foot and muxg to the same tmux session with mouse reporting enabled. | ||
| 224 | Normal drag in either client must enter tmux's selection/copy path and render | ||
| 225 | its selection in both clients; verify tmux's paste buffer independently. | ||
| 226 | Shift+drag in muxg remains a local highlight and desktop copy, with no tmux | ||
| 227 | mouse reports or paste-buffer mutation. Verify desktop clipboard separately | ||
| 228 | from tmux's buffer; a visible shared highlight alone does not prove copying. | ||
| 223 | - Application-issued clipboard writes reach the desktop through the existing | 229 | - Application-issued clipboard writes reach the desktop through the existing |
| 224 | validated clipboard-effect path. Verify actual PTY mouse reports and an | 230 | validated clipboard-effect path. Verify actual PTY mouse reports and an |
| 225 | independent clipboard reader, plus a real application's selection/copy flow. | 231 | independent clipboard reader, plus a real application's selection/copy flow. |
| @@ -261,3 +267,27 @@ Validation: full `make ci`, client/native units, full native integration and | |||
| 261 | actual NVIDIA Wayland selection/wheel checks passed. The counter runs inside | 267 | actual NVIDIA Wayland selection/wheel checks passed. The counter runs inside |
| 262 | real tmux for the Wayland selection check; eleven selection and ten wheel | 268 | real tmux for the Wayland selection check; eleven selection and ten wheel |
| 263 | checkpoints pass. Evidence: `dist/wheel-scrolling/active-selection-*.log`. | 269 | checkpoints pass. Evidence: `dist/wheel-scrolling/active-selection-*.log`. |
| 270 | |||
| 271 | |||
| 272 | ### Outstanding feedback: selection must follow moving text | ||
| 273 | |||
| 274 | The user expects a selected line and its highlight to move together when output | ||
| 275 | scrolls that line upward. Commit `7897f7d` only preserves a live coordinate range | ||
| 276 | through redraws; it does not track row identity through scrolling inside an | ||
| 277 | application. Wheel movement of the client's viewport is already handled, but | ||
| 278 | terminal scroll-region movement, insert/delete lines, reflow and capped-history | ||
| 279 | eviction require a distinct identity/transform solution. This gap remains open. | ||
| 280 | |||
| 281 | Acceptance: select a unique line, let genuine terminal output scroll it upward, | ||
| 282 | and verify its highlight follows that same line. Text already copied must remain | ||
| 283 | unchanged; copying again must still address the originally selected line. Cover | ||
| 284 | normal screen/history and alternate-screen scroll regions, plus offscreen return, | ||
| 285 | without guessing identity by matching strings (duplicate lines are valid). | ||
| 286 | Owner: the next selection-tracking slice, using Ghostty's existing engine-owned | ||
| 287 | pins/scroll semantics and an explicit client/daemon contract where required. | ||
| 288 | |||
| 289 | The user's foot/tmux comparison also exposes the already planned application | ||
| 290 | mouse gap: normal muxg drag is currently local, so tmux cannot render that | ||
| 291 | selection to other clients. This does not imply that local clipboard extraction | ||
| 292 | failed. Cross-client visibility, tmux paste buffers, and the desktop clipboard | ||
| 293 | must be tested as separate outcomes in the application mouse slice above. | ||