Skip to content

Observability Overview

Catalyst ships with an agent observability stack so you can see what autonomous workers are doing in real time — which phase they’re in, whether their PR is still open, whether their process is still alive, and how long each phase took.

The stack has four layers:

LayerWhat it doesWhere it runs
InstrumentationClaude Code emits OTLP telemetry (events, metrics, logs) via claude-code-otelPer-worker, in the Claude Code process
Signal files + global stateWorkers write JSON status to workers/<ticket>.json; orchestrator aggregates into ~/catalyst/state.jsonFilesystem
orch-monitor web dashboardAggregates signal files, polls GitHub, serves a live web UI with SSE event streamsSingle Bun process
Terminal UIANSI-rendered compact dashboard for headless environmentsSame process (optional)

When you run a /catalyst-dev:orchestrate wave, the observability stack lets you answer:

  • Is the worker’s Claude process still alive? (PID liveness check every 5s)
  • What phase is it in — researching, planning, implementing, validating, shipping?
  • How long has the PR been open? How long from open to merged?
  • Did CI pass, fail, or is it still running?
  • Are there unresolved review threads blocking merge?
  • Where is the wave stuck — which ticket, which phase, for how long?

All of this is visible without tailing logs or attaching to the Claude session.

If you just want to get the dashboard running for an active orchestrator:

Terminal window
# In a separate terminal (from any worktree)
bun run plugins/dev/scripts/orch-monitor/server.ts
# Dashboard: http://localhost:7400

The server watches ~/catalyst/wt/ for orchestrator directories (matching orch-*) and reads their signal files automatically.

For headless environments, pass --terminal to get an ANSI-rendered view in the same process:

Terminal window
bun run plugins/dev/scripts/orch-monitor/server.ts --terminal

The OTel stack adds process startup overhead and network I/O. For single-ticket, single-session work — just running /catalyst-dev:oneshot or manual phase-by-phase skills — you usually don’t need it. Observability becomes essential when:

  • You run /catalyst-dev:orchestrate with multiple workers in parallel
  • You want post-hoc phase timelines (Gantt-style) for retros
  • You need to page an on-call human when a worker stalls
  • You’re debugging reward-hacking or verification failures across many runs

For everything else, the default signal file + global state layer is enough — no external infrastructure required.