- Talon’s own health report, from talon-analyst’s health endpoint: each component, its status and latency, uptime history, metrics and configuration.
- Checks CoPilot’s backend makes itself: the connector, reachability, the API key, the Talon v2 setting and the last jobs.
The health endpoint arrived in talon-analyst 0.1.3. With an older Talon the page says “This Talon version has no health endpoint; upgrade to talon-analyst 0.1.3 or later” and still shows CoPilot’s own checks.
Who sees what
Everyone who can open the AI Analyst page sees the same health detail. It never includes secrets (keys, passwords, tokens). Per-customer items, such as which customers are in live write-back, show only the customers you are assigned to. Admins see all of them.The banner
At the top:- The overall state: All systems operational, Degraded or Down. This is Talon’s own verdict: Down when its database fails, its migrations aren’t at the running version, or the investigation model provider refuses its key; Degraded when any other component warns or fails. When Talon can’t answer at all, CoPilot shows Down with the reason (for example “Talon could not be reached”); with a Talon too old for the health endpoint it shows Status unknown.
- Talon’s version and uptime.
- When it was checked (“checked 12s ago”), and a Refresh button.
From CoPilot
A row that CoPilot’s backend measures itself, so it works even when Talon can’t answer:
For anyone but an admin, the last five cover only the customers assigned to you.
Components
The component grid is grouped into Core, MCP servers, Model and Tools. Each card has a status pill, the check’s latency, a short detail line, and a How to fix expander.
The fixes below are for whoever runs the Talon install (SOCFortress, for a supported install). Commands run in the install directory on the VM.
Core
api: the Talon service
api: the Talon service
The talon-analyst API that CoPilot calls. If it is down, CoPilot’s Reachable check fails too, and nothing else can be reported.
- Check
docker compose psanddocker compose logs api. - The api won’t start, with
SidecarUnavailableError: the sandbox’s SSH keys are missing or unreadable. Re-runscripts/sandbox_keys.sh, and check thatCOMPOSE_FILEin.envis exactlydocker-compose.yml:docker-compose.client.yml. - CoPilot can’t reach it but it is running: check that the connector’s URL is
http://talon-analyst-api:3100and that Talon is on CoPilot’s Docker network.
database: Postgres
database: Postgres
Talon’s Postgres: jobs, chat threads, the queue’s state, memory vectors and traces.
- Check
docker compose logs postgresand free disk space.
queue: the investigation queue
queue: the investigation queue
The durable queue investigations wait in. A deep or long-waiting queue means alerts are arriving faster than they are investigated, or runs are stuck.
- A burst of alerts drains on its own; three investigations run at once by default.
- Jobs fail with
DBOSUnexpectedStepErrorafter an upgrade: the upgrade ran with the queue not empty. Re-investigate those alerts. Always empty the queue before an upgrade. - A stuck job is failed automatically after its time limit, with the reason on the job.
migrations: the database schema
migrations: the database schema
Whether Talon’s database schema matches the running version. The api runs its migrations when it starts.
- Read
docker compose logs apifor the migration error. - Migrations only move forward: to go back to an older version after a migration ran, restore the backup taken before the upgrade.
mempalace: memory
mempalace: memory
MemPalace, Talon’s per-customer memory. Investigations and chat still run without it, but without memory.
- On a fresh install, “no palace yet” is expected: the palace is created on the first write (a lesson or a chat memory).
- The service or its database is down, or not on the pgvector backend: check
docker compose logs mempalace. - “MemPalace has no palace, but this install has written to one before”: the
mempalace-datavolume was detached or replaced. Don’t let it run like this, or its next write starts a new, empty palace. Restore the volume and the knowledge graph from the latest backup.
phoenix: traces
phoenix: traces
Arize Phoenix, which stores the traces behind CoPilot’s run timelines.
- Check
docker compose logs phoenix. - After a restore onto a fresh Phoenix, its keys no longer work: mint them again with the bootstrap’s
phoenix-keysstep, then set CoPilot’s Talon Phoenix connector again (connector --phoenix).
sandbox: the shell sidecar
sandbox: the shell sidecar
The isolated container that runs Talon’s sandboxed shell. It has no network route except to Talon’s api.
- The host has unprivileged user namespaces off: on Debian,
kernel.unprivileged_userns_clonemust be1anduser.max_user_namespacesabove0. - Its keys are missing: re-run
scripts/sandbox_keys.shas root. If an earlierdocker composecommand made directories where the key files belong, rundocker compose down, remove them, and run the script again.
MCP servers
The MCP servers are Talon’s read-only access to your stack. The three SOC tool servers are off until their read-only accounts exist and thesoc-tools profile is on; threat intel is off unless it was set up.
indexer_mcp: Wazuh indexer
indexer_mcp: Wazuh indexer
Reads alerts’ raw events and runs SIEM searches, always bound to the customer’s verified indices.
- Check
INDEXER_URL,INDEXER_USERNAMEandINDEXER_PASSWORDin.env, anddocker compose logs indexer-mcp. - Index rows stored unverified (onboarded before the SOC tools were on): run the bootstrap’s
index-mapstep for the customers.
wazuh_mcp: Wazuh manager API
wazuh_mcp: Wazuh manager API
Reads agent, inventory, SCA and rule data.
- It restarts in a loop:
WAZUH_USERNAMEorWAZUH_PASSWORDis empty. Re-runsh install.shto create the read-only account, or set them in.env.
velociraptor_mcp: Velociraptor
velociraptor_mcp: Velociraptor
Reads endpoint state and collection results. It is read-only: approved actions are run by CoPilot, not through this server.
- It won’t start, with
bind source path does not exist: the Velociraptor API config isn’t atVELOCIRAPTOR_API_CONFIG(default./velociraptor-api.config.yaml, owned by uid 10005, mode 600). - Queries are refused (
PERMISSION_DENIED) just after setup: a new API client can be refused for a few minutes on a running server. Wait 5 minutes and check again before suspecting its roles (readerandapi). - It can’t connect: the config’s
api_connection_stringmust be the Velociraptor server’s reachable host and port, not0.0.0.0or loopback. After changing it, re-runsh install.sh.
intel_mcp: threat intel
intel_mcp: threat intel
Looks up public indicators and vulnerabilities. Optional.
- Off: threat intel wasn’t set up.
TALON_SETUP_INTEL=yes sh install.shsets it up later. - Failing lookups: check the source keys in
.env.intel, and that the VM can reach the sources over HTTPS.
Model
model_provider: the model provider
model_provider: the model provider
Whether Talon can reach its model provider and the key works.
- No connection: the VM needs outbound HTTPS to
api.anthropic.com(andapi.openai.comif an OpenAI model is configured). - Anthropic answers 400: a key not scoped to one workspace (
sk-ant-usr-…) needsANTHROPIC_WORKSPACE_IDset to the workspace to bill. - The key is refused: put a working key in
.env(or re-runsh install.sh, which tests it), thendocker compose up -d api.
Tools
web_search: Web search (Tavily)
web_search: Web search (Tavily)
Talon’s web search, through Tavily. It is off until a Tavily API key is set (Installing Talon); off, the model isn’t offered web search, and web fetch still works.
- To turn it on: create a key at app.tavily.com, set
TAVILY_API_KEYin.env(or re-runsh install.sh), thendocker compose up -d apiwith the investigation queue empty. - “Tavily refused the key (401)” or “that isn’t a Tavily API key”: the key was revoked, mistyped or pasted with an extra character. Put the right key in
.envanddocker compose up -d api(replacing a key needs no empty queue). - “credits are used up”: the plan’s monthly credits are spent; raise the plan or turn on pay-as-you-go in Tavily’s dashboard.
- “Tavily unreachable”: the VM can’t reach
api.tavily.comon 443 (a proxy or firewall). “rate-limited (429)”: wait a few minutes.
Uptime
Under the grid, one row per component shows its status history, one bar per time slot, coloured by the worst status in it. A bar’s height also says it, so it reads without colour: failing is full height, warning three quarters, ok half, and no data a quarter. Each row ends with a summary in words (“2 failing of 96”), and each bar’s tooltip gives its time and counts. A 24 h / 7 d toggle above the uptime rows and the charts switches the window for both. Talon checks each component every minute: over 24 hours the bars are 15 minutes each, over 7 days one hour each. A slot with no checks (Talon wasn’t running, or the component was off) is no data.Charts
A metric with no data source shows no data, never 0. Show the numbers under the charts opens a table with every value, including model errors: failed model calls Talon recorded, a lower bound.
Configuration
A read-only panel of how the install is set up. It shows no secrets.- Write-back: the mode (Off, Shadow or Live), and which customers are live. For anyone but an admin, only the live customers assigned to you are listed.
- Automation: the maximum level and where the policy comes from (Talon’s own settings or CoPilot).
- Feature switches: v2, action tools, endpoint actions and the others.
- Models in use.
- Spend and budgets: what Talon spent today and this month (UTC) across all customers, and the default daily and monthly ceilings that apply to each customer without a budget of its own (Unlimited when none is set). Per-customer budgets are on the Budgets tab (admins, Talon v2 on).
