a73x

7e8bc30a

docs: mode 2048 — why the daemon speaks the size report

a73x   2026-08-22 19:47

Commit message
docs: mode 2048 — why the daemon speaks the size report

docs/decisions.md
Old New
@@ -5336,3 +5336,22 @@ from a tab as one named exception, which leaves "unknown types transit"
5336 exactly as wide as it was. Before `muxweb -A` this closes the silent-offerer 5336 exactly as wide as it was. Before `muxweb -A` this closes the silent-offerer
5337 hole at its source; after it, it is what stops a tab injecting `agent_data` 5337 hole at its source; after it, it is what stops a tab injecting `agent_data`
5338 into a channel the hub owns. 5338 into a channel the hub owns.
5339
5340 ## 2026-08-22 — in-band size reports (mode 2048): the daemon speaks them
5341
5342 nvim 0.11+ sends DECRQM 2048 on start; ghostty-vt's stock handler answers
5343 "recognised" (`?2048;2$y`) because ghostty proper supports it — in its APP
5344 layer (`Termio.sizeReportLocked`), which mux does not use. nvim then set the
5345 mode and, per the protocol, ignored SIGWINCH from then on, so a resized
5346 session stayed painted at its old size (a drag-resize: two screens overlaid;
5347 reattach could not clear it because the daemon's grid held that picture).
5348 A shell and Claude Code never opt in, which is why only nvim showed it.
5349
5350 Decision: implement the protocol rather than deny it. The engine queues
5351 `CSI 48;rows;cols;0;0 t` when the mode is set and after every resize;
5352 `applySize` flushes it, the one engine event that answers the app without
5353 a feed. Pixels are 0 (headless, allowed). Denying (`;0$y`) was one line but
5354 would have left nvim on the SIGWINCH race during drags. Measured: nvim
5355 `&lines x &columns` 26x80 → 60x180 after a 10-step grow burst; the e2e
5356 witness is `printf '\e[?2048h'; cat -v`, no nvim dependency. Fix is in
5357 muxd: every daemon (the LAN box included) needs the new build.