docs(changelog): four more, one of them the largest on the list

Every pane ran with SIGTERM blocked. The daemon blocks it on its main thread
so one waiter can run the shutdown save, and that mask crossed `fork` and
survived `execve` — so `kill`, `pkill`, `timeout`, a supervisor and a CI
cancellation could not stop anything running in a pane, and only `kill -9`
would. That is the biggest thing still missing from these notes.

With it: panes the window put down while squaring its layout were never hung
up, because that path dropped the daemon's reply; a killed server left its
throwaway shell directories behind, 3,850 of them on this machine; and
`send`, `capture` and `procs` reported a raw `os error 2` instead of saying
the server was down, unlike every verb that goes to the control socket.

Thirty-three written up. No code changes.
This commit is contained in:
l0ng-ai
2026-08-23 05:37:23 +08:00
parent 58145dace1
commit ecbe43f5ab
+29
View File
@@ -153,6 +153,35 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Fixed
- **`kill` and `timeout` work inside a pane again.** The daemon blocks SIGTERM
on its main thread before any other starts, so that one waiter can run the
shutdown save — deliberate, and it also reached where it was never meant to:
`fork` copies the calling thread's signal mask into the child and `execve`
keeps it, so every pane ran with SIGTERM blocked. `kill`, `pkill`,
`timeout`, a supervisor, a CI cancellation — none of them could stop
anything running in a pane, and only `kill -9` would.
- **Panes the window puts down while squaring its layout are hung up.** The
daemon cannot tell a pane ending from a pane moving to another tab — the
removal is identical — so whoever sent the operation has to say. `tty7 pane
close` always did; the window did it only where a person closed something,
and never for the identical operations its own reconciliation raises,
because that path dropped the reply on the floor.
- **A killed server no longer leaves its throwaway shell directories behind.**
Every zsh pane gets a scratch `ZDOTDIR` under the temp directory that the
pane's own teardown removes, so a clean stop leaves none. A server that is
killed never runs that teardown and nothing went back to look: this machine
had 3,850 of them, from months of crashes and `kill -9`. A later startup
sweeps them, beside the stale-socket cleanup.
- **Three verbs say the server is down instead of "No such file or
directory".** Most verbs go to the control socket and answer "could not
reach the tty7 server on this machine — `tty7 server start` brings one up".
`send`, `capture` and `procs` go to a pane instead, and reported the raw
`os error 2` from the missing socket file, which names nothing a reader can
act on.
- **A newline in a name no longer breaks the row drawing it.** A filename is
bytes to the kernel, so `touch $'a\nb'` makes a file the tree has to draw,
and the layout breaks text on a newline whatever the row asks for: the row