The failure this prevents is specific — a sub-agent burns the end of a limit window and the session the owner is actually sitting in dies mid-turn, because the credits went somewhere nobody was watching. So it is a condition on spawning rather than a refinement: an endpoint that can start unattended work without checking is wrong from its first call, and the symptom lands on someone else's conversation. Wired into POST /command-hq/commanders/new, which — this is the finding — already IS the spawn mechanism the sub-agents item was asking for. It starts a turn with ws: null, waits only for session:claude, and returns the transcript id, with command_hq_sessions naming, listing and costing it. So "commander or something lighter" answers itself: a commander costs nothing extra and a lighter thing would need its own registry to be visible at all. What is still missing is only the agent-callable surface. Refuses rather than queues or downgrades. Queueing means holding work against a window Officer does not control, and the reset it would wait for is a claim about a shared pool — every claude on the machine spends these, including terminals and pipelines. A refusal naming the window, the percentage and the reset is something a caller can act on now. The floor is 15% and the reasoning is in the file: the interactive failure is not "cannot start a chat", it is "a turn already in flight is cut off", and a turn costs a fraction of a window. Fails OPEN, deliberately. The numbers come from an external endpoint with a credential Officer does not own, so a blip or a signed-out CLI must not stop every spawn on the machine with an error about usage that has nothing to do with usage. The problem is reported so a caller can say "started, but unchecked". Seven tests on the pure rule — tightest window decides rather than the average, no limits allowed rather than blocked, exactly-at-the-ceiling refuses. Verified against the live account, where it correctly refuses right now at Session 90%. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2.0 KiB
id, title, theme, status, created, date_source, order
| id | title | theme | status | created | date_source | order |
|---|---|---|---|---|---|---|
| shell/a-spotlight-style-launcher-on-ctrl-space | A Spotlight-style launcher, on `shift-space` | shell | done | 2026-08-20 | assumed | 1 |
A Spotlight-style launcher, on ctrl-space. The dock is full and cannot grow; navigation
already borrows from macOS (see docs/navigation-audit.md), so the launcher is the same borrowing
taken one step further. Type a few letters, get routes, chats, files, plugins, settings sections —
and hit enter. Dock settings already exist, so the other half is pruning the dock down to what is
actually used and letting the launcher carry the rest.
Trigger to confirm: alt-space is the owner's preferred chord but is already load-bearing for
him elsewhere, so ctrl-space unless that clashes too.
Built 2026-08-21 (81f32a1f, retriggered in a2cca526). shift-space in the end: ctrl-space
focuses the address bar in Brave and never reached the app.
It indexes the dock rather than keeping a list of its own — the dock is already the composed, permission-filtered answer to "what can this account open here", so a plugin appears in the launcher for the reason it appears in the dock, and nothing is edited when one is installed. Settings sections are added on top, hand-listed, which is a known cost written into the file.
Matching is subsequence with weighted scoring in its own testable file: chq finds Command HQ, apik
finds API keys, fi gives Files rather than Profile. Nine tests, all about ORDER rather than matching.
Stands down inside inputs and textareas, because shift-space types a space there. The consequence is real and stated: focus is usually in the chat composer, so opening it from there means clicking out first — double-tap shift is the escape hatch if that bites.
Still open, and the other half of this item: pruning the dock, and dock auto-hide with effects. Those
live in shell/dock-effects-and-auto-hide. Chats, files and actions are not in the index yet — routes
and settings are known client-side, so this slice needed no API.