From ecbe43f5ab441e42318acf99a6b8243195d03bb0 Mon Sep 17 00:00:00 2001 From: l0ng-ai <24760907+l0ng-ai@users.noreply.github.com> Date: Sun, 23 Aug 2026 05:37:23 +0800 Subject: [PATCH] docs(changelog): four more, one of them the largest on the list MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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. --- CHANGELOG.md | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index d51c85d6..1cd60676 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -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