Tasks are treated like email: one global, cross-project inbox optimized for triage — sweep, snooze, done. The Inbox lives above projects in the sidebar. Untriaged tasks carry unread weight; triaged ones recede. Two-pane surface: list on the left, reading pane on the right. Keyboard triage (e done, h snooze, j/k move) makes a morning sweep of fourteen tasks a sub-minute ritual.
tested against: busy inbox (9 open) · inbox zero · task detail #245 w/ provenance + attempts · capture mid-run (log mode, agent stays Working) · start → focused thread (live attempt, task stays Open) · blocked #231 / done #212 w/ evidence · mobile home + swipe triage · mobile quick capture
Close the palette with Esc and keyboard focus silently lands on body — the visible focus ring disappears until the next pointer click. Tab order still works, so it passes automated checks. Repro on Safari and Chrome; regression window points at the palette portal refactor.
reconnect before the
server diff arrives, so the list paints twice. I’ll hold the render behind a 250 ms settle window
and drop the interim frame.Edit apps/web/src/stores/threadStore.tsClose the palette with Esc and keyboard focus silently lands on body — the visible focus ring disappears until the next pointer click. Tab order still works…
Read apps/web/src/palette/CommandPalette.tsxGrep "restoreFocus" — 3 matchesrestoreFocus, so the
stored element is already detached. That matches the “focus fell back to the document root” quote.