Two silent data-loss bugs, both worth knowing about
Alt+won the last pane threw that pane away. Its own prompt calls it "quit roost", but it removed the pane and then quit — so the saved workspace named a pane its map no longer had, and the repair minted a blankshellspec on next launch. The session id, cwd, title and note of the pane you quit on were gone.Alt+qon the same pane kept all of them. (#147)- A recycled pane id inherited a dead pane's session-detection clock, so a new pane could scan hours back and resume a stranger's conversation, permanently. (#141)
Desktop notifications changed channel — read this if you use Apple Terminal or Alacritty
roost used to fork osascript, which macOS attributes to Script Editor — there is no flag for that; a CLI cannot post a notification under its own name. roost now asks the terminal instead, with a bell and an OSC 9. Ghostty, iTerm2, WezTerm and kitty raise a real notification from it, attributed to themselves, and it survives ssh.
A terminal that ignores OSC 9 — Apple Terminal, Alacritty — now gets only the bell, not a desktop banner. (#152)
And a pane's notification no longer arrives twice. There were two emitters; that was invisible as a duplicate only while one of them was the osascript fork. The named one won, so: one banner, saying which pane, and silence for the pane you are already looking at. (#153)
Idle cost, measured against v0.1.10 on one machine
| idle CPU | terminal traffic | |
|---|---|---|
| v0.1.10 | 2.20% / 3.48% | ~890 B/s |
| v0.1.11 | 0.36% / 0.28% | ~61 B/s |
Four shell panes at 200×50, no input, alternating runs to cancel drift. Flat in the pane count at every step, because it was all fixed per-frame chrome: the quick-launch picker's $PATH probe running ~1,500 stat(2) a second with no dialog on screen, plus the whole help table, on every frame (#144); an unconditional 30 fps repaint (#146); and 12 fps even with nothing animating (#149).
Under the hood
Three new fuzzers over input surfaces nothing reached before — the mouse router, the key router, and paste (#147, #148). The mouse one found the Alt+w bug on seed 15. rustfmt and clippy are now enforced in CI (#150), tuned to the style the tree already had rather than imposed; that turned up ten unsafe blocks missing the SAFETY: comment every other one in the tree has.
What's Changed
- panes: a recycled pane id inherited the dead pane's session-detection clock by @navbytes in #141
- CLAUDE.md: record main's protection, and that the tap sync is not optional by @navbytes in #145
- perf: the chrome computed the picker and the help table on every idle frame by @navbytes in #144
- perf: roost repainted 30 times a second whether or not anything moved by @navbytes in #146
- workspace: quitting with Alt+w threw away the pane it quit on by @navbytes in #147
- test: the last two unfuzzed input surfaces — the key router, and paste by @navbytes in #148
- perf: a fleet at rest still repainted twelve times a second by @navbytes in #149
- chore: rustfmt + clippy, enforced in CI by @navbytes in #150
- chore: keep the reformat out of git blame by @navbytes in #151
- notify: roost's notifications came from "Script Editor" by @navbytes in #152
- notify: two banners for one event, and neither said which pane by @navbytes in #153
- tests: three gates blamed roost for the machine being out of ptys by @navbytes in #154
- v0.1.11 everywhere: version badge, pin examples, landing page, release request by @navbytes in #155
Full Changelog: v0.1.10...v0.1.11