# Observe (/observe)

Voice agents fail in ways logs don't show: a reply that came 400 ms late, an
interruption that wasn't, a tool that silently timed out. Cuelo records
**every step of every call** as an ordered stream of events, plus both audio
channels.

<ObserveDiagram />

## Three ways to use it [#three-ways-to-use-it]

<Cards>
<Card title="Dashboard" href="/observe/dashboard">
Replay any call with both channels and the transcript, see every turn-taking decision, and break
latency down per turn.
</Card>

<Card title="Events and hooks" href="/observe/events">
`on_event` in `src/events.py` gets every event as it happens, for logs, webhooks, analytics and
alerts.
</Card>

<Card title="Storage" href="/observe/storage">
SQLite by default, Postgres or MySQL in production, recordings on disk, and a read-only JSON API
over all of it.
</Card>
</Cards>

## A debugging loop that works [#a-debugging-loop-that-works]

1. Make a test call and open it in the dashboard.
2. Check the **latency** tab: which stage dominates TTFB? `vad_tail` points at
   end-of-turn tuning, `llm_ttft` at the model or the prompt length, and
   `tts_ttfa` at the voice provider.
3. Check **flags**: premature replies mean turn ends fire too early, and slow
   turns are listed with their cause.
4. Change one thing in `config.cuelo`. `cuelo dev` reloads it.
5. Call again and compare.