feat(shelf): retire book on last-tab-close (reversed from empty-book state) master
Reverse an earlier design call. Closing the last tab of a book now removes the book from the Shelf entirely instead of keeping an empty placeholder — a lingering empty book read as dead weight on the shelf, and nothing truly needed the "still present but empty" state. Implementation: - `TerminalClient.Event.tabClosed` gains a `remainingTabs: Int` payload so AppFeature can tell a last-close apart from a routine close. `WorktreeTerminalManager.onTabClosed` now captures the post-close tab count and emits it. - AppFeature forwards `tabClosed` with `remainingTabs == 0` to `.repositories(.markWorktreeClosed(id))`. Other closes are ignored. - `RepositoriesFeature.markWorktreeClosed` removes the ID from `openedWorktreeIDs` — so its spine drops off. If Shelf is active and the closed book was the open one, the handler auto-advances to the first remaining book via `shelfBookSelectionEffect`; if no books remain, selection is left alone and ShelfView falls through to the "No book selected" empty state. In normal view the selection is untouched so the user's current context isn't disturbed. Three tests cover the behavior: plain removal when not open, auto- advance to the next book when the open one is retired, and selection untouched in normal-view context. Design doc updated with the reversed decision and a journal entry noting the motivation.