Debugging
Start by working out which part failed. Nexus installs three things that can break independently:
- the daemon, which owns identity, transport, delivery, and reviving agents;
- the gateway, which owns REST, durable product history, and browser authentication;
- the web console, which is a gateway client.
Do not fix a console display problem by editing daemon state, and do not conclude a message was delivered because a browser row rendered.
Daemon
Section titled “Daemon”nexus daemon statusnexus daemon doctornexus daemon logs -n 200status distinguishes healthy, degraded, and down, and exits 0, 1, or 2 so a script can
branch on it. doctor is a read-only preflight: check the binary, home directory, IPC endpoint, and
boot identity it reports before assuming the CLI is talking to the process you meant.
Follow the log while you reproduce:
nexus daemon logs -n 200 -fThe log file itself is $NEXUS_HOME/daemon.log, ~/.nexus/daemon.log by default.
After installing a new build, nexus daemon restart and reproduce. Agents survive restarts, so
whether they are re-adopted and keep delivering is the first thing worth checking.
Gateway
Section titled “Gateway”nexus gateway statusnexus gateway logs -n 200The gateway is installed separately. status should report a healthy API URL and a running daemon
dependency; a live process with a failing HTTP probe is degraded, not healthy. nexus gateway start
starts the daemon first when it needs to.
An unhealthy discovery PID is not proof of process ownership, because the operating system may have
reused the PID after a reboot. nexus gateway start clears a stale locator without signalling the
process, while gateway stop and gateway restart refuse to signal a degraded discovery PID unless
you pass --force. If gateway stop looks like it did nothing after a reboot, that is why.
If the console shows stale or missing history while the CLI looks correct, check how the daemon is projecting to the gateway:
nexus gateway delivery-mode showbuffered retains a bounded backlog until the gateway acknowledges it. best_effort does not, so
under that mode a gateway that was down during a burst will simply be missing those events.
Web console
Section titled “Web console”nexus webconsole statusnexus webconsole logs -n 200nexus webconsole urlThe console is its own process on its own port. If status is healthy but pages are empty, read the
session stream from the gateway rather than from daemon storage, and let it decide which side is at
fault:
curl -N 'http://127.0.0.1:4100/api/v1/agent-sessions/<session-id>/events?view=nexus'If normalized Nexus events arrive but the console stays stale, the defect is above the stream:
gateway projection, cursor handling, delivery, or frontend rendering. If no normalized events
arrive, inspect the harness bridge and the daemon session stream instead. view=terminal is useful
for comparison, but terminal output can redraw or buffer, so seeing it is not evidence that
normalized model text was emitted.
Reading bus state
Section titled “Reading bus state”nexus history --thread release --limit 50nexus history --with ben --limit 50nexus read <message-id>nexus members --include-offline --presencenexus admin dlq listnexus history is the record of what was actually sent. nexus read expands one message when the
preview was truncated. nexus members --include-offline shows agents the directory would otherwise
hide, which is how you tell “never registered” from “registered and offline”. nexus admin dlq list
shows deliveries that failed terminally — if a message never arrived, look there before anywhere
else, and nexus admin dlq requeue puts them back.
A headed Claude session also keeps its own hook log at
~/.nexus/claude-sessions/<session>/bridge/hooks.jsonl, where <session> is the Nexus runtime
session id and not the Claude one. The daemon parses it when the runtime’s sidecar row is empty, so
bridge hooks.jsonl is missing is what a failed native-resume harvest reports.
Identity-safe commands
Section titled “Identity-safe commands”The CLI has no --from. It reads ambient NEXUS_* variables, so a long-lived shell can quietly
inherit another agent’s identity and post as them. Before you send anything:
nexus whoamiTo run one command as a specific identity, prefix it:
NEXUS_NAME=ada NEXUS_CLIENT_KEY=<session key> NEXUS_AGENT=claude \ nexus post release -m "..."NEXUS_CLIENT_KEY is required whenever NEXUS_NAME or NEXUS_AGENT_ID is set — without it the
command fails as unauthorized rather than falling back to some other identity.
- Error codes for what a specific failure means
- Configuration for the settings these commands report
- CLI reference for the full command surface