Status (2026-07-24): Phases 1–3 and the mobile screen have shipped (#426, #432); the board is now three columns — #435 folded "Needs review" into Done, since the outcome badge on each finished card already carried that signal. Phase 4 (fleet scope) is dropped by design: workspaces are per-person, so a cross-pod board would aggregate other people's agents — the per-workspace board already shows everything you own (this also sidesteps the #360 cross-agent visibility question). Remaining work is tracked in the reworked Phases section below.
Problem
Running more than one agent at a time means juggling three tabs: builds live in Build, hypervisor chats in Hypervisor, and orchestrator sub-agents are buried inside a build's Subagents sub-tab. There is no single answer to the only question that matters when you run a fleet: "what needs me right now?" A build blocked 14 minutes on a permission prompt is invisible unless you happen to open that tab. This also compounds #267 (sidebar overload) — each new work surface today becomes another tab.
Industry context: every major platform converged on exactly this surface in 2026 (Devin Desktop's Agent Command Center, GitHub Agent HQ, Claude Code's claude agents dashboard, Cursor's cloud-agent dashboard). With Ona acquired by OpenAI, there is no open-source self-hosted equivalent — Coder's closest offering is a paid add-on. kube-coder already has every data source; it's missing only the unifying view.
Proposal: Mission Control
A new top-level tab: a board that unifies builds + hypervisor chats + sub-agents (and later, other pods via the controller) into one priority queue, organized by what needs a human:
Running → Waiting on you → Needs review → Done today

Card anatomy
- Kind (BUILD / CHAT / SUB-AGENT), assistant + model, elapsed/wait time
- AI-written one-line headline of what the agent is doing right now ("Wiring per-trigger history into server.py — 8 files touched")
- Repo + worktree branch, lineage (parent build ↔ spawned sub-agents, cross-linked)
- Footer actions: Reply · Watch · Transcript · Kill (Retry on failed, Resume on parked)
The killer column: "Waiting on you"
When an agent blocks on a permission prompt or a question, the actual prompt renders on the card with quick-reply buttons — answer from the board without opening the session. Amber edge + wait-age ("⏸ 14m") makes stalls impossible to miss. Reuses the quick-reply plumbing from #276 and the waiting-state detection behind WaitingBadge.
Needs review
Finished work shows evidence chips (tsc ✓ · vitest 214 ✓ · screenshots ×4 · e2e ✕ 1 flaky) and a PR deep-link, so review starts from evidence, not from a raw diff.
Detail drawer
Selecting a card opens a drawer: activity timeline (started from issue → read files → spawned sub-agents → ran tests → currently editing), live token/tool-call rate, and a follow-up composer — steer any agent without leaving the board.
Pulse strip
One-glance fleet state: 3 running · 2 waiting on you · 1 needs review · oldest wait 14m · events 26/min.
Scope switcher
"This workspace / Fleet (N pods)" — phase 4 aggregates every workspace through the controller using the existing Bearer remote-task API.
Light mode

Mobile
Columns collapse to stacked swimlanes, Running/Waiting first — the "run your fleet from your phone" surface. Pairs naturally with Walkie: "what's my fleet doing?" → spoken pulse-strip summary.

Why this is cheap relative to how big it feels
Almost every data source already exists:
| Board element |
Existing source |
| Build cards, states, quick replies |
/api/claude/tasks (+ waiting detection, #276) |
| Chat cards |
/api/hypervisor/threads + activity classification (#312) |
| Sub-agent cards + lineage |
agent-orchestrator list_subagents / task-context lineage |
| Timeline drawer |
structured transcript (#294) + activity timeline (#298) |
| Live updates |
/api/events SSE |
| Fleet scope |
controller + Bearer remote-task API |
Genuinely new: a unified queue endpoint normalizing the three sources into one card schema, a cheap headline generator (classifier pass over recent transcript events), and the board UI.
GET /api/missioncontrol/queue
→ [{ id, kind: build|chat|subagent, assistant, model, state: running|waiting|review|done,
headline, title, repo, branch, started_at, waiting_since?, waiting_prompt?,
lineage: { parent?, children[] }, evidence?, links: { transcript, pr?, app? } }]
Phases
Remaining:
Mockups
Interactive HTML mock (uses the real design tokens from tokens.css): docs/mockups/mission-control/index.html — assets on branch mission-control-mockup-assets.
Related
#267 (sidebar overload — this absorbs the "too many places to look" problem structurally) · #312 (activity classification — reused for card kinds) · #276 (quick replies) · #250 (mobile parity) · #363 (product metrics could feed the pulse strip) · #360 (cross-agent output reading — fleet scope must respect whatever posture is decided there)
Problem
Running more than one agent at a time means juggling three tabs: builds live in Build, hypervisor chats in Hypervisor, and orchestrator sub-agents are buried inside a build's Subagents sub-tab. There is no single answer to the only question that matters when you run a fleet: "what needs me right now?" A build blocked 14 minutes on a permission prompt is invisible unless you happen to open that tab. This also compounds #267 (sidebar overload) — each new work surface today becomes another tab.
Industry context: every major platform converged on exactly this surface in 2026 (Devin Desktop's Agent Command Center, GitHub Agent HQ, Claude Code's
claude agentsdashboard, Cursor's cloud-agent dashboard). With Ona acquired by OpenAI, there is no open-source self-hosted equivalent — Coder's closest offering is a paid add-on. kube-coder already has every data source; it's missing only the unifying view.Proposal: Mission Control
A new top-level tab: a board that unifies builds + hypervisor chats + sub-agents (and later, other pods via the controller) into one priority queue, organized by what needs a human:
Running → Waiting on you → Needs review → Done today
Card anatomy
The killer column: "Waiting on you"
When an agent blocks on a permission prompt or a question, the actual prompt renders on the card with quick-reply buttons — answer from the board without opening the session. Amber edge + wait-age ("⏸ 14m") makes stalls impossible to miss. Reuses the quick-reply plumbing from #276 and the waiting-state detection behind WaitingBadge.
Needs review
Finished work shows evidence chips (tsc ✓ · vitest 214 ✓ · screenshots ×4 · e2e ✕ 1 flaky) and a PR deep-link, so review starts from evidence, not from a raw diff.
Detail drawer
Selecting a card opens a drawer: activity timeline (started from issue → read files → spawned sub-agents → ran tests → currently editing), live token/tool-call rate, and a follow-up composer — steer any agent without leaving the board.
Pulse strip
One-glance fleet state: 3 running · 2 waiting on you · 1 needs review · oldest wait 14m · events 26/min.
Scope switcher
"This workspace / Fleet (N pods)" — phase 4 aggregates every workspace through the controller using the existing Bearer remote-task API.
Light mode
Mobile
Columns collapse to stacked swimlanes, Running/Waiting first — the "run your fleet from your phone" surface. Pairs naturally with Walkie: "what's my fleet doing?" → spoken pulse-strip summary.
Why this is cheap relative to how big it feels
Almost every data source already exists:
/api/claude/tasks(+ waiting detection, #276)/api/hypervisor/threads+ activity classification (#312)list_subagents/ task-context lineage/api/eventsSSEGenuinely new: a unified queue endpoint normalizing the three sources into one card schema, a cheap headline generator (classifier pass over recent transcript events), and the board UI.
Phases
4. Fleet scope— dropped by design (2026-07-24): workspaces are per-person; no cross-pod aggregation neededRemaining:
server.pymarks the deferral) with a cheap classifier pass over recent transcript eventsMockups
Interactive HTML mock (uses the real design tokens from
tokens.css):docs/mockups/mission-control/index.html— assets on branchmission-control-mockup-assets.Related
#267 (sidebar overload — this absorbs the "too many places to look" problem structurally) · #312 (activity classification — reused for card kinds) · #276 (quick replies) · #250 (mobile parity) · #363 (product metrics could feed the pulse strip) · #360 (cross-agent output reading — fleet scope must respect whatever posture is decided there)