mirror of
https://github.com/l0ng-ai/tty7.git
synced 2026-09-22 00:02:23 +00:00
Closing a tab straight after making it stranded a live shell — six times out of six, reproducibly. It holds a pty and an fd and runs until the machine does not. A person cannot type that fast; an agent loop that opens a tab per task and closes it when the task is done meets it on nearly every iteration, which is the shape this product is built for. The rule for judging a pane was already here and already right: one that no window is showing and no workspace on the machine names is nobody's. Two earlier attempts failed because of what was put in front of it. Both parked panes at the *site* that dropped them, and the leak does not live at a site: a hydration whose whole session is discarded never compares a before against an after, so its panes were never offered for judgement at all. So the window now keeps a census of every pane it has brought into existence, taken at the one point both spawn routes meet, and judges the census rather than a list of suspects. The second half is when. The sweep ran only on a landing that rebuilt from a full machine tree, and the failures do not lead there — a refused operation calls `desync`, which primes, and a prime pulls this workspace's mirror alone. Instrumented, the sweep did not run once across three cycles that stranded three shells. It now also runs after a prime, and pays for the machine-wide pull only when a censused pane is not on screen anywhere; while everything the window made is still showing, that is one set comparison and no request. Measured against a live window, same reproducer, same machine: before 6 create-and-close cycles 6 stranded shells after 16 create-and-close cycles 0 and nothing else was harmed: four unrelated panes kept their ids and their scrollback across ten churn cycles and a GUI restart, which is the failure this has to be judged on — a leaked shell is recoverable with `pane close --orphans`, a shell killed under a live window is not.