Troubleshooting
Symptoms, causes, and fixes — seeded from the Doctor checks.
Start with Doctor
Every troubleshooting session starts in the same place: Settings ▸ Doctor. It stays available whatever your account state — signed out, lapsed, or fully verified — because it is the surface that fixes exactly those problems.
Doctor runs the full health catalog against your install and shows one row per check, in these groups:
| Group | Covers |
|---|---|
| Components | What Command Center installs for you — enable or skip any of it, any time |
| Core | Binaries (Node.js, npm, the agent CLI) · configuration files · folder trust · platform tree · doctrine · hooks |
| Runtime | uv · the managed Python · the per-service environments · the provisioner — install, update, and repair here |
| Daemons | The app-managed background services and ArcadeDB |
| Engines | Remotion and Hyperframes — the opt-in video engines |
| Media | ffmpeg/ffprobe, the pinned Node for video, and the Whisper speech-to-text models |
| Account | Sign-in and subscription state |
| Agent control planes | What agents may currently do unattended |
How to read the results
Three result states matter:
- Pass — the check verified the real condition (a binary answered on PATH, a daemon answered its health endpoint, a file exists where expected).
- Fail — a prerequisite is genuinely missing: a binary that is not on PATH, a missing environment file, a runtime environment that was never created or whose interpreter is broken, or a missing or partial platform tree. Nothing else in the catalog can fail.
- Info — a deliberate design choice worth understanding: "not started yet" is never treated as broken. A daemon that is not running, a component you skipped, an engine you have not installed, an API key you have not set, a control plane you switched off, or a check that cannot run because the daemon it needs is offline all show as info rows with a precise cause and, where possible, a one-click fix. An install with several info rows can be perfectly healthy.
Most rows carry a fix action (Start, Provision, Repair, Generate, Trust, Fetch, Enable, Refresh). These delegate to the exact same operations the Dashboard's Platform Health card uses — there is no separate "Doctor-only" mutation path, so a fix applied here behaves identically to one applied there.
When the app itself will not start
The same checks exist as a zero-dependency terminal script that runs before anything is provisioned — no daemons, no Python packages required:
python scripts/doctor.pyRun it from your install root. It is the fallback diagnostic for the rare case where the desktop app cannot boot at all.
The clusters below map the Doctor catalog onto the problems buyers actually hit, in rough order of likelihood. The per-check reference is at Reference ▸ Doctor checks.
Runtime prerequisites — binaries and Python environments
Command Center rides a small set of external binaries, and runs its own Python side in per-service environments it installs itself. Doctor splits these: the Core group checks the binaries, and the Runtime group owns everything Python.
| Symptom | Doctor row | Fix |
|---|---|---|
| Agent features do nothing; MCP servers never come up | Agent CLI (claude) — fail, "not found on PATH" | Install Claude Code from claude.ai/code and sign in with your own Claude account. The agent CLI is the one prerequisite Command Center cannot provision for you. |
| App UI or video engines will not build/install | Node.js / npm — fail | Install Node.js 22 or newer from nodejs.org; npm ships with it. If npm alone is missing, reinstall Node. For the video engines specifically, the Media group can install a pinned Node for you instead. |
| Nothing Python-backed can be set up at all | Bootstrap Python — fail, "no Python to bootstrap the provisioner" | Install any Python 3.8 or newer. It is used only to launch the provisioner — Command Center installs its own Python 3.12 for the background services, so your system version does not need to match. Present is an info row, not a pass, for exactly that reason. |
| Daemons exit immediately; MCP servers report missing modules | One or more venv rows, or Runtime provisioner — fail | Press Provision on the Runtime provisioner row (below). |
| A single service misbehaves while the rest are fine | That service's venv row — fail, "venv present · interpreter broken" | Press Repair on that row — it recreates just that environment from scratch. |
Use the Provision button
Doctor's Runtime group installs and repairs; it does not only report.
- Provision on the Runtime provisioner row installs uv, a pinned Python, and every missing environment in one pass. Expect several minutes on first run — it downloads an interpreter.
- Re-provision on the same row rebuilds against refreshed dependencies.
- Provision / Repair on an individual environment row targets just that one.
The command-line equivalent still ships:
python scripts/provision_runtime.pyRun it from your install root. Reach for it when the app will not open — when it does open, the buttons do the same work and report progress.
Two info states worth knowing:
- "cannot verify yet" on a binary row — the tool-detection command shipped in this build but needs one app restart to activate. Restart Command Center and re-run Doctor before concluding anything is missing.
- "platform updated since last provision" on the Runtime provisioner row — an app update refreshed the platform tree, but Python environments are never touched automatically on update. Re-provision to pick up refreshed dependencies.
A component you skipped
Command Center asks during first-run setup which parts it should install for you, and everything is on unless you say otherwise. If a capability never appears and no row explains why, check Doctor's Components group first: a skipped component shows as an info row naming exactly what stops working, with an Enable button beside it.
| Symptom | Doctor row | Fix |
|---|---|---|
| Nothing Python-backed will provision, and no error explains it | Managed Python runtime — info, "skipped" | Enable, then Provision from the Runtime group. |
| Cortex and the knowledge base have no graph to read or write | Knowledge graph — info, "skipped" | Enable, then Provision on the ArcadeDB row. |
| Footage or video work reports no media tooling | Media tools (ffmpeg) — info, "skipped" | Enable, or press Fetch now on the ffmpeg row — an explicit install always proceeds regardless of the flag. |
| The video engines cannot be installed | Video engine runtime (Node) — info, "skipped" | Enable, then Install Node on the Media row. |
| Transcription is unavailable or silently falls back | Speech-to-text (Whisper) — info, "skipped" | Enable, then install a model from Settings ▸ Speech-to-Text. |
Skipping never deletes anything already installed — it only stops future automatic provisioning — and it is never a lock: pressing an install button elsewhere on the board proceeds anyway, because asking for the install is the act of enabling it.
API keys — presence and reachability
No API key is required to boot Command Center. Two optional Gemini slots unlock specific capabilities, and Doctor checks both presence and whether the running services can actually use them.
| Symptom | Doctor row | Fix |
|---|---|---|
| Semantic memory search returns nothing; knowledge-base embeddings unavailable | Gemini key (KB · memory · embeddings) — info, "not set" | Set GEMINI_API_KEY in Settings ▸ API Keys (free tier). Keyword memory search and graph queries keep working without it. |
| Key is set, but semantic search still fails | Same row — info, "the running memory daemon has no key loaded" | The service started before the key was saved. Restart Shared Memory from Dashboard ▸ Platform Health. (If an agent session is currently hosting that surface instead, restarting the session is the equivalent.) |
| Search stops working on a knowledge-base workspace that used to search | No row — the search itself answers "Full-mode search needs a Gemini key" | Full-depth workspaces need the key at query time, not only when they were built. Restore the key, or search the same corpus through its structure and entity layers, which need no key. |
| Covers and generated images fail | Gemini image key (imagegen) — info, "not set" | Set GEMINI_IMAGE_API_KEY in Settings ▸ API Keys. This slot is paid-tier and used only by image generation. The imagegen service itself still runs and reports itself unconfigured — a dark image feature is not a dead daemon. |
| Image key is set but generation errors out | Same row — info, "a key is configured but the provider did not answer" | Two different causes, in this order: the daemon started before the key was saved (restart it from Platform Health), or the key itself is rejected (check its value and billing state in your Google account). Doctor distinguishes them, so read the detail line before going to your billing page. |
Two rules explain most key problems:
- Keys are read at process start. A key saved while a daemon is running is invisible to it until that daemon restarts. Doctor cross-checks the live daemon's own view and names this state explicitly.
- Key writes are restart-bound. Settings ▸ API Keys writes your local
.envfile (and creates it on first save — the ".env configured" row passes from then on). After changing keys, restart the affected daemon (Dashboard ▸ Platform Health).
Daemon health
The platform's substance runs in local background daemons, all bound to
loopback (127.0.0.1) only. Doctor's Daemons group probes each one's health
endpoint.
| Daemon | What stops working without it |
|---|---|
| Observer | News and feed harvesting, source scheduling |
| Routines | Scheduled agent jobs, the video/products/footage job engine |
| Knowledge Base | Ingest, graph sync, Cortex data |
| Imagegen | Image generation |
| Voice | The Voice assistant |
| The Email view — sending, listing, monitoring | |
| MCP Gateway | The shared MCP endpoint |
| Shared Memory | Cross-agent memory search and writes |
| ArcadeDB | The knowledge graph itself (see the next cluster) |
| Symptom | Check | Fix |
|---|---|---|
| A view sits empty or shows "offline" | The matching daemon row — info, "not running" | Click Start on the row, or use Dashboard ▸ Platform Health. |
| Everything daemon-backed is down after a reboot | Autostart toggles | Autostart is on by default, so the usual cause is that it was turned off for that service. Check Dashboard ▸ Platform Health, then Start the row. |
| Shared Memory shows "not running" while other daemons are fine | Shared Memory row | Press Start, exactly like the others. It is an app-managed service. |
| You stopped Shared Memory and it came back | Shared Memory row, detail ends "hosted by a Claude Code session" | An agent session can host the same surface as a hot spare, and Command Center can only stop a host it owns. The row names which host is answering; close that session if you need the surface genuinely down. |
| A daemon-backed Doctor row says "daemon offline — cannot check" | The daemon rows above it | This is by design: daemon-down is a first-class state, not an error. Start the daemon, then re-run Doctor for the dependent rows. |
A daemon being down never crashes the shell — dependent views go quiet and recover as soon as the daemon is back. Restarting a daemon from Platform Health is also the standard step after configuration changes, and it never requires restarting the app. See Infrastructure ▸ Daemons for the full map.
Knowledge-graph backend (ArcadeDB)
The knowledge graph runs on ArcadeDB. The default mode is provisioned local: Command Center installs and manages its own no-Docker instance (a Java runtime plus a pinned package) inside your install. No container runtime is required.
| Symptom | Doctor row state | Fix |
|---|---|---|
| Cortex is dark; ingest and graph queries fail on a fresh install | ArcadeDB — info, "not provisioned yet" | Click Provision. This downloads and sets up the local instance — expect a few minutes. When it finishes, Doctor brings the database up and restarts the Knowledge Base daemon automatically. |
| Graph worked before, dark now | ArcadeDB — info, "provisioned, not running" | Click Start, or manage it from Settings ▸ Database. |
| Provisioning reports an error | Row detail names the failure | Read arcadedb/local/_provision.log in your install root for the exact step that failed, fix the cause (usually disk space or a blocked download), and provision again. |
| Docker/remote mode shows "unreachable" | ArcadeDB — info, docker/remote mode | You have pointed the graph at an external ArcadeDB server. Check that server, or switch back to provisioned-local in Settings ▸ Database. |
The graph store is derived data — it is rebuilt from your files by root sync and re-ingest. A damaged graph is an inconvenience, never data loss; your documents are the source of truth. See Concepts ▸ Knowledge graph.
Sign-in and subscription
Command Center requires sign-in with an active Pro or Ultra subscription. Verification happens online, periodically, and the product is designed to degrade politely rather than punish you when it cannot reach the account service.
How long a machine works offline: up to 72 hours from its last successful verification. Verification renews automatically at the halfway point, so an install that loses contact keeps working somewhere between 36 and 72 hours depending on when it dropped. There is no additional grace period after that. App updates are governed separately and tolerate a staler record — a few extra days — so security patches keep arriving after feature access has paused.
While you are verified, Settings ▸ Account states this plainly: when the record was last confirmed, that it renews automatically, and how much longer the machine works without reaching the service.
When verification is not current, Doctor's Account row reads
degraded (<reason>) — treated as unsubscribed, and the reason is what tells
you what to do:
| What you see | What it means | What to do |
|---|---|---|
| "not signed in" | No account is connected on this install. | Sign in from Settings ▸ Account (Doctor's Account row has a shortcut). |
degraded (offline_too_long) | The machine has been offline past its window. Nothing is wrong with your account. | Reconnect, then click Refresh on the Account row. |
degraded (revoked) | This device was signed out — usually because you signed in on a third machine. Command Center allows two at a time, and a new sign-in evicts the least recently used device. | Sign in again on this machine. That evicts whichever of the other two was used least recently. |
degraded (expired) | It has been a while since this device signed in. | Sign in again. |
degraded (invalid) · (unverifiable) · (no_record) | The saved subscription record on this device is unusable or incomplete. | Sign in again — signing in replaces the record. |
degraded (account_unavailable) | The account itself is no longer active. | This one is terminal, so the row offers Open account rather than a Refresh that provably cannot work. Check billing, or contact support. |
| Signed in, verified, and everything paid-for is still locked | The record is valid but grants nothing — the usual cause is a payment that did not go through. | Fix billing, then click Refresh. This is a subscription state, not a broken install. |
Nothing is deleted in any of these states. Your files, configuration, and local data are untouched, and everything unlocks again on the next successful verification.
If a refresh fails while you are demonstrably online, check that your subscription is active, then contact support with the exact Account row text.
Something refused
These are the cases where the product is working exactly as configured and still says no. None of them is a fault; all of them are hard to diagnose without knowing where the switch is.
| Symptom | Cause | Fix |
|---|---|---|
| Your own Send button stops working. Drafts still save, reading and searching are fine. | The Email sending control plane is off. Your composer does not go through the agent tool surface, but it does go through the same mail client underneath, and the stop lives inside that client. While it is off, nothing leaves this machine by mail — agent or human. That is deliberate. | Settings ▸ Terminals ▸ Agent control planes ▸ Email sending → on. Doctor's Agent control planes group shows the same state with a shortcut to the card. |
| An agent reports it cannot write to the knowledge graph, while Cortex edits work normally | The Knowledge-graph writes plane is off. It gates the agent tool path; your own Cortex curation reaches the graph through a different service, so it is unaffected. | Same card, Knowledge-graph writes → on. |
| Agent-driven terminals, fleets, or window control stop responding | The Terminal control or Window & view control plane is off — or, for terminals, paused. A paused plane is enabled and refusing everything at once, which is why Doctor reports the two states separately. | Same card for the switch; the terminal pause has its own control in the Terminals view, and Doctor's row links you there. |
| Agents can read the schedule but cannot change it | The Calendar control plane is off. Agent writes are refused; reads still answer, and dispatch is unaffected. | Same card, Calendar control → on. |
| A tool call or a view answers "subscription required" although you are signed in | A tier gate, not a fault. Most of the MCP fabric and several daemon routes refuse in whole or in part on a lapsed or unsubscribed install, and the refusal is a normal tool result naming the capability and your current tier — never a crash. Graph reads, the memory tools, and window control stay open; mail and knowledge-base routes do not. | Check Doctor's Account row first — if it is degraded, the cluster above applies. If the account is fine, the feature is above your tier; see Tiers. |
What each plane governs, why they fail open, and what is recorded is on Autonomy and controls.
Nothing is happening on a fresh install
A brand-new install is deliberately quiet. Nothing schedules itself, so an install that looks complete and does nothing is usually behaving correctly.
| Symptom | Cause | Fix |
|---|---|---|
| No articles, no briefings, no harvest — everything looks installed | No routine is scheduled on a fresh install. Scheduling is per-routine state on your machine, and it ships off. | Open Routines and enable the ones you want, with the cadence you want. Expect roughly a minute of warm-up before the first run. See Routines. |
| Routines are enabled but nothing runs | The routines daemon is not running, so nothing can fire. | Start it from Dashboard ▸ Platform Health or Doctor's Routines row. |
| A fleet worker ignores an instruction you sent it | Messages to a running session are stored, not guaranteed to be delivered live. A recipient that is stopped, sitting at a permission prompt, or parked on a dialog receives it into its mailbox and drains it on its next turn. | Nothing to fix — check the mailbox rather than the pane. The message lands when the worker next acts. See Missions and the fleet. |
Harvested items disappear from the working set, and a folder inside documents/ reorganizes itself | Retention archives items after two weeks: files move to an archive folder and the index row survives, so nothing is forgotten and nothing is deleted. The first sweep over a backlog moves a lot at once, which reads as a disappearance. | Restore from the archive, or widen the window at Observer ▸ Settings ▸ Retention. Automatic deletion of the archive ships disabled. See the intelligence desk. |
Hooks, terminals, and folder trust
Two agent-harness conveniences ride hook scripts installed into your agent configuration — and uninstalled hooks fail silently, which makes them a classic "nothing errored, it just stopped happening" case.
| Symptom | Doctor row | Fix |
|---|---|---|
| Agent terminal panes no longer resume their sessions after an app restart | Fleet wake & session-resume hooks — info, "not installed" | Run python .claude/hooks/cc_install_hooks.py from your install root. It writes machine-correct paths; new terminal sessions pick the hooks up immediately. |
| Fleet workers idle indefinitely without being nudged | Same row | Same fix — the idle-nudge rides the same hooks. |
| A new agent session stops at a trust prompt every time | Folder trust (agent CLIs) — info | Agent CLIs trust folders individually. Use the row's Trust this folder action once for your install root; it trusts every installed engine in one go, so a second engine is never the one nobody remembered. |
| Agents behave as if an MCP server were an older version | MCP servers · code freshness — info | MCP servers are started by your agent CLI, not by Command Center, so restart the agent CLI. Restarting Command Center does not reload them. |
Install and update recovery
These rows cover the install's structural integrity — the platform tree, the generated agent configuration, and the doctrine files.
| Symptom | Doctor row | Fix |
|---|---|---|
| Nearly every Core row fails at once; daemons and agent paths resolve to nothing | Platform tree present — fail, "no platform tree at this root" | Either the home folder was never laid down here, or Settings points at the wrong folder. Use the row's Re-run lay-down here action, or point the project root (Settings) at the folder Command Center actually installed into. |
| Some platform folders exist, others are missing | Same row — fail, "a partial lay-down" | The initial copy did not finish. Re-run lay-down — it is idempotent and completes what is missing. |
| Agents cannot see their MCP servers on a fresh setup | .mcp.json (agent config) — info, "not generated yet" | Click Generate. This writes the agent configuration from your settings with real absolute paths for this machine. |
| A leftover configuration file from an early install | Config layout — info | The row names the stray file and offers Remove stray file. The active configuration is unaffected either way. |
| You want the original shipped agents/skills/protocols back after editing them | Doctrine (agents · skills · protocols) — info | Updates seed new doctrine but never overwrite a file you changed. Refresh doctrine is the explicit restore: it backs up every changed file to .backups/doctrine_refresh_<timestamp>/ inside your install before overwriting, seeds anything missing, and never removes doctrine you added yourself. |
For the full picture of what an update does and does not touch, see Concepts ▸ How updates work.
Video engines and media tools
The two video engines are opt-in installs — a fresh install without them is the normal state, not a problem.
| Symptom | Doctor row | Fix |
|---|---|---|
| Engine rows say "not installed" | Remotion / Hyperframes — info | Install per engine from the Video tab, where each engine's license gate lives. Doctor's row links you there. |
| Engine installed, first render slow or waiting | Engine row — info, "render browser not fetched yet" | The render browser downloads automatically on first render. Let it finish, or retry the fetch from the Video tab. |
| An engine will not install because Node is missing | Node.js (video engines) — info, "not installed" | Press Install Node on that row. It puts a pinned Node into Command Center's own tools folder and changes nothing about your system. On platforms without a bundled build, the row says so and points you at nodejs.org. |
| Footage or video work fails on a missing ffmpeg | ffmpeg / ffprobe — info, "not installed" | No action usually needed — it fetches automatically on first use. The row offers Fetch now if you want it ahead of time. |
| A media tool is installed twice and the wrong copy is being used | Any Media row — the Prefer control | Each Media row carries a Prefer choice: Auto, System, or Managed. Auto uses your system copy once its major version meets the pinned one and falls back to the managed copy otherwise. Setting a preference for an install you do not have is called out in the row's detail rather than silently ignored. |
| Transcription and local speech-to-text unavailable | Whisper models — info, "none installed yet" | Install a model from Settings ▸ Speech-to-Text. One install serves both footage transcription and the Voice assistant's local speech-to-text. |
Platform-specific behaviour
Two classes of symptom come from the machine rather than from Command Center. Both look like product faults and neither is.
Cortex draws no graph, but everything else in the view works
The graph canvas is GPU-rendered. Before drawing, Command Center tests whether this system can actually allocate what the renderer needs — not merely whether it claims to support it, because the two come apart on precisely the machines this affects. When the test fails, the canvas is replaced by an explanatory panel naming the reason and, where readable, the detected renderer.
Common causes: a virtual machine or virtual desktop with a paravirtual display adapter, an RDP or screen-shared session, hardware acceleration disabled by policy, or a very old or blocklisted graphics driver.
Everything else keeps working, and this is the point of the design. The knowledge graph itself is unaffected: Overview, Report, Lint and Log read the same data without a GPU, ingestion and search are untouched, and agents query the graph directly. There is deliberately no low-fidelity 2D fallback — a misleading picture of your graph would be worse than an honest panel.
The remedy is a host with working acceleration: enable hardware acceleration where policy allows it, connect to the machine locally instead of through a remote session, or use a machine with a GPU. See Cortex.
macOS
| Symptom | Cause | What to do |
|---|---|---|
| The first dictation of a session never starts and never reports an error, with the Command Center window hidden | macOS gates opening the microphone on window visibility, not focus. With the window hidden, the request is deferred and never settles. | Bring the window on screen and press again. After the first acquisition the stream stays warm, so later dictation works with the window hidden. |
| macOS says the microphone permission is already granted, and the microphone still does not work after reinstalling | Permission grants are bound to the exact signed build. Replacing the app can void a grant while the system still reports it as granted — and replacing the app is not a fresh install: your home folder, application support, keychain items, and permission grants all survive it. | Reset both Microphone and Accessibility for Command Center and grant them again. Resetting only the microphone leaves the other half stale. |
| After an update, the boot log reports the platform files were re-laid because the tree changed | The version stamp matched but file contents did not, so the platform files were refreshed. | Nothing — this is the healthy outcome, not an error. |
Still stuck?
Check the FAQ for the questions that come up most, or contact support — include your Doctor findings and the app version, and you will get a substantive answer rather than a canned one.