Purpose: Honest inventory of what MC (Luci's dashboard, ~/workspace/mission-control/app.py, port 3001) does WELL today, before a Wingman-style UX redesign. Anything in "Must-Not-Regress" is a feature a polished black-box consumer agent (Wingman by Emergent) almost certainly lacks — do not lose it.
Research only. No code changed. Date: 2026-05-18.
MC is a single Flask app (app.py, ~10,966 lines) + models.py (~263KB query layer), Jinja2 templates, Alpine.js + HTMX, SSE + WebSocket, PWA service worker. ~150 routes. Surfaces:
/board, board() app.py:1569; board.html 17KB) — kanban ticket board, 30 cards + load-more, board-counts API (/api/v1/board-counts :5115), partial refresh (/partials/board-panel :1583)./ticket/<id>, app.py:1691; ticket.html 83KB) — per-ticket conversation, comments, tags, relationships, attempts, activity, vault context links, history replay./runtime-workbench, app.py:1574; ticket_runtime_workbench.html 89KB + .js 145KB) — live tmux-backed worker session view: start/send/harvest/stop/retry/switch, status capture, glass-box-ish tool-call stream./tasks, tasks_page() app.py:1719; tasks.html 30KB) + Task detail (/task/<id> :1800) + Task run log (/task-run/<run_id>/log :1854) — scheduler task list, run history, per-run logs, definition editor, schedule/notify/runtime-profile editors./activity :1593) — activity feed./team :4373) + org-chart partial (/partials/org-chart :7395) — agent roster.broadcast_sse() app.py:393; global + per-ticket client buckets (global_sse_clients, ticket_sse_clients :308–353); stale-client pruner thread (_prune_sse_clients :655); SSE_MAX_TOTAL_CLIENTS cap. Per-ticket stream /api/v1/tickets/<id>/stream :9628, tail :9761.mc_interactive.py), ws-token mint :5720./, app.py:1001; dashboard.html 39KB) — health tiles: heartbeat age, worktree count + GB (gold>20/red>50, empty-count), persistent-Luci online badge + runtime, Data Feeds grid (20 feeds, freshness)./api/server-health :4986, /api/health :4996, /api/v1/health/latency :1220, /api/v1/health/data-freshness :5098./logs :2060) + /api/v1/logs/tail :5052 — scheduler/heartbeat log tail./api/worktrees :1200, /api/v1/dashboard/worktrees :1151./api/dispatch-7d :1231, /api/v1/dashboard/dispatch :1122, /api/v1/dispatch/preview :5229./cost; cost.html) — token/USD spend tables./api/v1/usage :1193, /api/v1/dashboard/usage :1135./api/provider/default :4905, /api/provider/larry :4927, runtime profiles CRUD /api/runtime/profiles :4945 + preflight :4972, per-task runtime-profile /api/task/<id>/runtime-profile :4792./reports :2193) — HTML research reports + DELETE, PDF convert (:2329, :2396)./briefings :2489) — audio/slides, audio-library serving :2563, slides API :2584./brain :2738) — SecondBrain file + DB browser (/api/v1/brain/db :2877, schema :2970, row :3028)./wiki :1908) + SB-wiki (/sb-wiki :1937) + Bible (/bible :2073) + md-view (:2664)./skills :1685), Insights (/insights :4404), Timesheets (/timesheets :4429)./apps :3140) — external dashboards./spotify :3260) + Home Radio (/home-radio :3692) — playback control, mood, station toggles, mix rebuild./f1 :1880), Trading (/trading :4383), Price Watch (/api/price-watch/* :3170), Life Manager (/life-manager :1631)./api/vk/* :4278./api/v1/telegram/* :8182–8291./api/v1/persistent_luci/{status,start,send,harvest,stop,switch} :8291–8350.sw.js, CACHE_NAME='mctrl-v78-...'), app-shell route :1183, offline page, manifest.json, icons.Each of these is real, working, and almost certainly absent from Wingman. Losing any in the redesign is a regression.
Multi-worker, multi-host orchestration with live tmux-backed sessions. MC dispatches per-ticket background workers (mc_pickup.py), runs the Runtime Workbench against a real tmux session per active ticket (start/send/harvest/stop/retry/switch provider mid-run), AND remote-dispatches to Larry over SSH (elmar@46.225.208.1). Wingman is a single-agent consumer chat — no fleet, no remote hosts, no per-ticket session you can attach/reattach to. This is MC's core differentiator.
Provider switching + true cost/token accounting. MC routes work across Anthropic / GLM / Kimi / MiniMax via runtime profiles, with preflight checks, per-task profile pinning, and a Cost page + usage APIs recording real USD/token spend per run. A consumer product hides the model and the bill entirely — you cannot switch backends or see what a session cost. This is load-bearing for Luci's centralized cost control (CLAUDE.md runtime-profile rule).
Scheduled task engine with full transparency. scheduler.py tick runs everything in ~/workspace/tasks/; MC exposes the task list, run history, per-run logs, definition editor, schedule editor, notify-destination editor, and runtime-profile editor — all in-browser. Wingman has no cron, no recurring autonomous jobs, no run-history audit trail. The Tasks surface is an operational control plane, not a chat feature.
Deep health / observability instrumentation. Heartbeat age, worktree disk usage (count + GB + empty-count, color-thresholded), persistent-Luci online state, a 20-feed Data Freshness grid, server-health + latency endpoints, dispatch-7d analytics, MC canary. This is genuine ops monitoring — a consumer agent shows none of its own internals.
Full data ownership + glass-box ticket history. Everything lives in local mc.db (218MB SQLite, WAL) — tickets, comments, raw ticket_messages (thinking/tool_use/assistant/user), ticket_events (replayable stream-json), sessions FTS5 index, task_runs, heartbeats, ticket_context vault bridge. Nothing is in a vendor's cloud; every worker action is queryable, replayable, and auditable. Wingman is a black box — no export, no replay, no DB.
ticket_events exist but there is no clean per-tool-call card UI (collapsible input/output, status pill, duration). Comment in ticket_runtime_workbench.html:639 confirms tool_use entries "used to land in History" — no first-class glass-box tool panel like Wingman's step cards.ticket.html 83KB, ticket_runtime_workbench.html 89KB, dashboard.html 39KB, spotify.html 34KB). Per-page inline <style> blocks (e.g. cost.html) — no shared component system; visual inconsistency across pages.ASSET_VERSION in app.py:49 ("20260517-workbench-ticket-view-rebuild") AND CACHE_NAME + ASSET_VERSION in static/sw.js:1,7 ('mctrl-v78-...'). Any static JS/CSS change MUST bump BOTH CACHE_NAME and ASSET_VERSION in sw.js plus ASSET_VERSION in app.py, or phones serve stale code (memory: project_mc_asset_version_sync).luci-dashboard.service. NEVER spawn python3 app.py manually — orphan holds port 3001 and defeats systemd. Always systemctl restart luci-dashboard (memory: feedback_never_spawn_mc_manually).app.py + Jinja2 + Alpine.js + HTMX + SSE + flask-sock. No SPA build pipeline. A React/Vue rewrite would be a major architecture change — keep server-rendered partials unless explicitly approved.https://openclaw.tailb2ba18.ts.net / http://204.168.188.33:3001.migrate.py / migrations/.broadcast_sse(event_type, data) and the ticket_event SSE message shape are consumed by ticket_events replay; keep the contract or break live updates.git branch --show-current before commits (memory: project_mc_branch_drift)./api/v1/board-counts, create/list/route/comment/close ticket flow is exercised every 30 min; redesign must not break those endpoints.