First checks
ravi daemon statusdoes not list the Slack runnerravi-channels. Useravi channels status: a healthy runner showshealth: readyand the Slack adapter asconnected.health: stopped (not_running)means it is not online in PM2: never started, stopped or crashed.runtime: driftedmeans the CLI, daemon and runner run different versions. Runravi update, which installs the configured channel and restarts the managed processes. On@next, runravi update --nextunless you already used--nextonce; until then, a plainravi updateinstallslatest.omni-nats: not managed by PM2is expected if you run your ownnats-server.- On a Slack-only install the daemon logs
Omni not configured — no channel supportandCreating gateway without omni — channel delivery will fail. Slack replies go through the channel runner, so these lines are harmless there.
ravi doctor
The doctor does not check NATS, Omni, the channel runner, Slack tokens or provider credentials. A clean report does not prove a channel works.
The agent did not answer
Start by finding out whether the message reached a session:The agent answered but cannot use tools
The agent always replies, but what it may do depends on who is talking. A sender that Ravi cannot link to a contact gets zero capabilities.
To see what is allowed and watch denials live:
Claude answers but its SSH-side Ravi CLI fails
For an agent configured withremote, the SSH user has its own home and local
Ravi state. Forward both the issued RAVI_CONTEXT_KEY and RAVI_GATEWAY_URL so
its CLI authenticates to the actual daemon instead of opening an empty local
database. Do not give the SSH user access to the operator’s database.
The SSH launcher derives a gateway URL for loopback agents when the daemon HTTP
server is enabled with RAVI_HTTP_PORT (or RAVI_WEBHOOK_PORT). For another
host, configure an explicit URL reachable from that host. An explicitly
configured RAVI_GATEWAY_URL takes precedence.
Check command -v ravi and ravi --version as the SSH user. That installation
needs a version compatible with the daemon and its production dependencies.
An old wrapper can select a stale checkout despite a current package being
installed elsewhere. With the issued context and gateway, verify:
\\n between
exports, corrupting the forwarded token. After correcting the launcher and
validating the token through SSH, clear the stale pool health entry with
ravi runtime credentials reset-health <credential-id> --json.
The full-access runtime profile includes admin system:*; explicit
read-only Page capabilities listed beside it do not reduce that profile to
read-only. Inspect effective authority before adding grants.
Read the session trace
The trace is stored in~/.ravi/ravi.db and records every step of a session, from the incoming message to delivery.
Slack messages enter the trace at
prompt.published; Slack’s routing decisions are in ravi channels logs.
Common --explain findings:
--show-system-prompt, --show-user-prompt (with --turn) and --raw print full prompts and payloads. They can contain private content, so replace real ids, phone numbers and prompts with placeholders before sharing a trace.
For a session that is running right now, ravi sessions debug <name> tails its live events for 60 seconds.
Pages and Bases
Publish pages and Interactive pages with Bases cover these flows in depth.
Inspect NATS and JetStream
If the daemon repeatedly exits while ensuringRAVI_EVENTS, inspect the NATS
log for 10047: insufficient storage resources available and check disk space
with df -h. A connected Slack runner does not prove the daemon is running.
Free only verified disposable caches, then restart the managed NATS server
(pm2 restart omni-nats) so its storage budget is recalculated. Confirm that
RAVI_EVENTS restores and the daemon reaches Daemon ready; preserve the
JetStream data and Ravi databases. This is operator recovery, not automatic
cache deletion by Ravi.
Ravi needs NATS with JetStream at NATS_URL (default nats://127.0.0.1:4222). These streams exist on a typical install:
Omni also creates
IDENTITY, MEDIA, ACCESS, SESSION, CUSTOM, SYSTEM and AGENT. A KV_ravi-leader stream holds the leader lock that decides which daemon runs cron and heartbeat.
Ravi’s own commands cover most needs:
replay reads stored messages (default: the last 15 minutes from every non-KV stream). Include RAVI_EVENTS to see tool activity, responses, delivery and aborts; MESSAGE alone only has traffic from Omni channels such as WhatsApp.
With the nats CLI you can look at the server directly:
ingestMode: "history-sync") are stored but never run a turn.
Restart cleanly
-mis required: without it the restart fails withFlag -m é obrigatória. The message is passed to the main agent.- Restart the daemon after editing
~/.ravi/.envor changing provider credentials. - Restart the channel runner after
ravi channels createorset, after changing a Slack secret, and after a daemon restart ifravi channels statusis notready. Routes and instances reload on their own. - The runner must run the same Ravi version as the daemon. If
ravi channels startrefuses because of a bundle mismatch, runravi updatefirst (ravi update --nexton@next, as above). - Bring things up in order: NATS (Omni or your own
nats-server), then the daemon, then the channel runner.