Gateway Troubleshooting: Deep Runbook for Commands and Updates
Deep troubleshooting runbook for gateway, channels, automation, nodes, and browser. Covers command ladder, healthy signals, post-update issues, and split brain installs.
Read this when
- The troubleshooting hub pointed you here for deeper diagnosis
- You need stable symptom based runbook sections with exact commands
This is the deep runbook. Start at /help/troubleshooting for the fast triage flow first.
Command ladder
Run in this order:
openclaw status
openclaw gateway status
openclaw logs --follow
openclaw doctor
openclaw channels status --probe
Healthy signals:
openclaw gateway statusdisplaysRuntime: running,Connectivity probe: ok, and aCapability: ...line.openclaw doctorreports no blocking config/service issues.openclaw channels status --probeshows live per-account transport status and, where supported,worksoraudit ok.
After an update
Use when an update finishes but the Gateway is down, channels are empty, or model calls fail with 401s.
openclaw status --all
openclaw update status --json
openclaw gateway status --deep
openclaw doctor --fix
openclaw gateway restart
Look for:
Update restartinopenclaw status/openclaw status --all. Pending or failed handoffs include the next command to run.plugin load failed: dependency tree corrupted; run openclaw doctor --fixunder Channels: the channel config still exists, but plugin registration failed before the channel could load.- Provider 401s after re-auth:
openclaw doctor --fixchecks for stale per-agent OAuth auth shadows and removes old copies so all agents resolve the current shared profile.
Split brain installs and newer config guard
Use when a gateway service unexpectedly stops after an update, or logs show one openclaw binary is older than the version that last wrote openclaw.json.
OpenClaw stamps config writes with meta.lastTouchedVersion. Read-only commands can inspect a config written by a newer OpenClaw, but process and service mutations refuse to run from an older binary. Blocked actions: gateway service start/stop/restart/uninstall, forced service reinstall, service-mode gateway startup, and gateway --force port cleanup.
which openclaw
openclaw --version
openclaw gateway status --deep
openclaw config get meta.lastTouchedVersion
Fix PATH
Fix PATH so openclaw resolves to the newer install, then rerun the action.
Reinstall the gateway service
Reinstall the intended gateway service from the newer install:
openclaw gateway install --force
openclaw gateway restart
Remove stale wrappers
Remove stale system package or old wrapper entries that still point at an old openclaw binary.
Warning
For intentional downgrade or emergency recovery only, set
OPENCLAW_ALLOW_OLDER_BINARY_DESTRUCTIVE_ACTIONS=1for the single command. Leave it unset for normal operation.
Protocol mismatch after rollback
Use when logs keep printing protocol mismatch after a downgrade or rollback. An older Gateway is running, but a newer local client process is still reconnecting with a protocol range the older Gateway cannot speak.
openclaw --version
which -a openclaw
openclaw gateway status --deep
openclaw doctor --deep
openclaw logs --follow
Look for:
protocol mismatch ... client=... v<version> min=<n> max=<n> expected=<n>in Gateway logs.Established clients:inopenclaw gateway status --deeporGateway clientsinopenclaw doctor --deep: active TCP clients connected to the Gateway port, with PIDs and command lines when the OS allows it.- A client process whose command line points at the newer OpenClaw install or wrapper you rolled back from.
Fix:
- Stop or restart the stale OpenClaw client process shown by
gateway status --deep. - Restart apps or wrappers that embed OpenClaw: local dashboards, editors, app-server helpers, or long-running
openclaw logs --followshells. - Re-run
openclaw gateway status --deeporopenclaw doctor --deepand confirm the stale client PID is gone.
Do not make an older Gateway accept a newer incompatible protocol. Protocol bumps protect the wire contract; rollback recovery is a process/version cleanup problem.
Skill symlink skipped as path escape
Use when logs include:
Skipping escaped skill path outside its configured root: ... reason=symlink-escape
Every skill root is a containment boundary. A symlink under ~/.agents/skills, <workspace>/.agents/skills, <workspace>/skills, or ~/.openclaw/skills is skipped when its real target resolves outside that root, unless the target is explicitly trusted.
Inspect the link:
ls -l ~/.agents/skills/<name>
realpath ~/.agents/skills/<name>
openclaw config get skills.load
If the target is intentional, configure both the direct skill root and the allowed symlink target:
{
skills: {
load: {
extraDirs: ["~/Projects/manager/skills"],
allowSymlinkTargets: ["~/Projects/manager/skills"],
},
},
}
Then start a new session or wait for the skills watcher to refresh. Restart the gateway if the running process predates the config change.
Do not use broad targets such as ~, /, or a whole synced project folder. Keep allowSymlinkTargets scoped to the real skill root that contains trusted SKILL.md directories.
If Skill Workshop apply should also write through those trusted symlinked workspace skill paths, enable skills.workshop.allowSymlinkTargetWrites. Keep it disabled for read-only shared skill roots.
Related:
Anthropic 429 extra usage required for long context
Use this when the logs or errors mention HTTP 429: rate_limit_error: Extra usage is required for long context requests.
openclaw logs --follow
openclaw models status
openclaw config get agents.defaults.models
Check for these signs:
- The selected Anthropic model is a GA-capable 1M Claude 4.x model (Opus 4.6/4.7/4.8, Sonnet 4.6), or the model config still includes the legacy
params.context1m: true. - The current Anthropic credential does not qualify for long-context usage.
- Failures happen only on long sessions or model runs that require the 1M context path.
Remedies:
Use a standard context window
Move to a model with a standard window, or strip the legacy context1m from older model config that lacks GA capability for 1M context.
Use an eligible credential
Pick an Anthropic credential that qualifies for long-context requests, or fall back to an Anthropic API key.
Configure fallback models
Set up fallback models so runs proceed when Anthropic rejects long-context requests.
See also:
Upstream 403 blocked responses
Use this when an upstream LLM provider answers with a generic 403 like Your request was blocked.
Do not assume an OpenClaw configuration problem every time. The reply may originate from an upstream security layer, for instance a CDN, WAF, bot-management rule, or reverse proxy sitting in front of an OpenAI-compatible endpoint.
openclaw status
openclaw gateway status
openclaw logs --follow
Check for:
- Multiple models under the same provider failing identically.
- HTML or generic security text where a normal provider API error should appear.
- Provider-side security events at the same time as the requests.
- A minimal direct
curlprobe succeeding while normal SDK-shaped requests fail.
When evidence points to a WAF/CDN block, address the provider-side filtering first. Prefer a narrowly scoped allow or skip rule for the API path OpenClaw uses, and avoid turning off protection for the entire site.
Warning
A successful minimal
curldoes not prove that real SDK-style requests will get through the same upstream security layer.
See also:
Local OpenAI-compatible backend passes direct probes but agent runs fail
Use this when:
curl ... /v1/modelsfunctions correctly.- Small direct
/v1/chat/completionscalls work. - OpenClaw model runs fail only on ordinary agent turns.
curl http://127.0.0.1:1234/v1/models
curl http://127.0.0.1:1234/v1/chat/completions \
-H 'content-type: application/json' \
-d '{"model":"<id>","messages":[{"role":"user","content":"hi"}],"stream":false}'
openclaw infer model run --model <provider/model> --prompt "hi" --json
openclaw logs --follow
Check for:
- Direct tiny calls succeed, but OpenClaw runs fail only with larger prompts.
model_not_foundor 404 errors even though direct/v1/chat/completionsworks with the same bare model id.- Backend errors stating that
messages[].contentexpects a string. - Sporadic
incomplete turn detected ... stopReason=stop payloads=0warnings with an OpenAI-compatible local backend. - Backend crashes that surface only with larger prompt-token counts or full agent runtime prompts.
Common signatures
model_not_foundwith a local MLX/vLLM-style server: confirmbaseUrlcontains/v1,apiis"openai-completions"for/v1/chat/completionsbackends, andmodels.providers.<provider>.models[].idis the bare provider-local id. Select it once with the provider prefix, for examplemlx/mlx-community/Qwen3-30B-A3B-6bit; keep the catalog entry asmlx-community/Qwen3-30B-A3B-6bit.messages[...].content: invalid type: sequence, expected a string: backend rejects structured Chat Completions content parts. Remedy: setmodels.providers.<provider>.models[].compat.requiresStringContent: true.validation.keysor allowed message keys like["role","content"]: backend rejects OpenAI-style replay metadata on Chat Completions messages. Remedy: setmodels.providers.<provider>.models[].compat.strictMessageKeys: true.incomplete turn detected ... stopReason=stop payloads=0: the backend finished the Chat Completions request but returned no user-visible assistant text for that turn. OpenClaw retries replay-safe empty OpenAI-compatible turns once; persistent failures usually mean the backend is emitting empty/non-text content or suppressing final-answer text.- Direct tiny requests succeed, but OpenClaw agent runs fail with backend/model crashes (for example Gemma on some
inferrsbuilds): OpenClaw transport is likely already correct; the backend is failing on the larger agent-runtime prompt shape. - Failures shrink after disabling tools but do not disappear: tool schemas were part of the pressure, but the remaining issue is still upstream model/server capacity or a backend bug.
Fix options
- Set
compat.requiresStringContent: truefor string-only Chat Completions backends. - Set
compat.strictMessageKeys: truefor strict Chat Completions backends that only acceptroleandcontenton each message. - Set
compat.supportsTools: falsefor models/backends that cannot handle OpenClaw's tool schema surface reliably. - Lower prompt pressure where possible: smaller workspace bootstrap, shorter session history, lighter local model, or a backend with stronger long-context support.
- If tiny direct requests keep passing while OpenClaw agent turns still crash inside the backend, treat it as an upstream server/model limitation and file a repro there with the accepted payload shape.
See also:
No replies
If channels are up but nothing answers, check routing and policy before reconnecting anything.
openclaw status
openclaw channels status --probe
openclaw pairing list --channel <channel> [--account <id>]
openclaw config get channels
openclaw logs --follow
Check for:
- Pairing pending for DM senders.
- Group mention gating (
requireMention,mentionPatterns). - Channel/group allowlist mismatches.
Common signatures:
drop guild message (mention required→ group message is ignored until the user is mentioned.pairing request→ the sender must be approved first.blocked/allowlist→ policy filtered out either the sender or the channel.
Related material:
Dashboard control UI connectivity
If the dashboard or control UI refuses to connect, double-check the URL, the authentication mode, and whether the secure context assumptions still hold.
openclaw gateway status
openclaw status
openclaw logs --follow
openclaw doctor
openclaw gateway status --json
Check for these issues:
- The probe URL and dashboard URL are correct.
- The auth mode or token does not match between the client and the gateway.
- HTTP is being used in a situation where device identity is mandatory.
When a local browser cannot reach 127.0.0.1:18789 following an update, start by restoring the local Gateway service and verifying that it is actually delivering the dashboard:
openclaw gateway restart
lsof -i :18789
curl http://127.0.0.1:18789
If curl responds with OpenClaw HTML, the Gateway is operational, and the problem most likely stems from browser caching, an outdated deep link, or a stale tab. Open http://127.0.0.1:18789 directly and navigate from the dashboard. Should the service stop after a restart, execute openclaw gateway start and then verify openclaw gateway status again.
Connect / auth signatures
device identity required→ either the context is non-secure or device authentication is absent.origin not allowed→ the browserOriginis missing fromgateway.controlUi.allowedOrigins(or the connection originates from a non-loopback browser origin without an explicit allowlist).device nonce required/device nonce mismatch→ the client never finishes the challenge-based device authentication flow (connect.challenge+device.nonce).device signature invalid/device signature expired→ the client signed the wrong payload, or the timestamp was stale, for the current handshake.AUTH_TOKEN_MISMATCHcombined withcanRetryWithDeviceToken=true→ the client may perform one trusted retry using a cached device token.- That cached-token retry reuses the cached scope set stored alongside the paired device token. Explicit
deviceToken/ explicitscopescallers instead keep the scope set they requested. AUTH_SCOPE_MISMATCH→ the device token was recognized, but its approved scopes do not cover this connect request; re-pair or approve the requested scope contract rather than rotating a shared gateway token.- Outside that retry path, connect auth precedence runs: explicit shared token or password first, then explicit
deviceToken, then the stored device token, then the bootstrap token. - On the async Tailscale Serve Control UI path, failed attempts for the same
{scope, ip}are serialized before the limiter records the failure. Two bad concurrent retries from the same client can therefore surfaceretry lateron the second attempt instead of two plain mismatches. too many failed authentication attempts (retry later)from a browser-origin loopback client → repeated failures from that same normalizedOrigintrigger a temporary lockout; another localhost origin uses a separate bucket.- Repeated
unauthorizedafter that retry → shared token or device token drift; refresh the token config and re-approve or rotate the device token if needed. gateway connect failed:→ the host, port, or URL target is wrong.
Auth detail codes quick map
Use error.details.code from the failed connect response to decide what to do next:
| Detail code | What it indicates | What you should do |
|---|---|---|
AUTH_TOKEN_MISSING | The client omitted a shared token that was required. | On the Gateway host, launch openclaw gateway auth-token --show in an interactive terminal, copy the result into the client, and attempt the request again. |
AUTH_TOKEN_MISMATCH | The shared token did not match the gateway's auth token. | When canRetryWithDeviceToken=true is true, permit a single trusted retry. Retries using cached tokens reuse previously approved scopes; callers that explicitly use deviceToken / scopes preserve their requested scopes. If the problem persists, follow the token drift recovery checklist. |
AUTH_DEVICE_TOKEN_MISMATCH | The cached per-device token is outdated or has been revoked. | Use the devices CLI to rotate or re-approve the device token, then establish a new connection. |
AUTH_SCOPE_MISMATCH | The device token is valid, but its approved role or scopes do not cover this connect request. | Re-pair the device or approve the requested scope contract; do not mistake this for shared-token drift. |
PAIRING_REQUIRED | Device identity requires approval. Inspect error.details.reason for not-paired, scope-upgrade, role-upgrade, or metadata-upgrade, and apply requestId / remediationHint when they are available. | Approve the pending request: run openclaw devices list then openclaw devices approve <requestId>. Scope or role upgrades follow the same procedure after you review the access being requested. |
Note
Direct loopback backend RPCs that authenticate with the shared gateway token or password should not rely on the CLI's paired-device scope baseline. If subagents or other internal calls still encounter
scope-upgrade, confirm the caller usesclient.id: "gateway-client"andclient.mode: "backend"and does not force an explicitdeviceIdentityor device token.
Device auth v2 migration check:
openclaw --version
openclaw doctor
openclaw gateway status
If the logs report nonce or signature errors, upgrade the connecting client and confirm it:
Wait for connect.challenge
The client waits for the gateway-issued connect.challenge.
Sign the payload
The client signs the payload bound to the challenge.
Send the device nonce
The client sends connect.params.device.nonce using the same challenge nonce.
If openclaw devices rotate / revoke / remove is denied without an obvious cause:
- Sessions using paired-device tokens can only manage their own device, unless the caller also holds
operator.admin. openclaw devices rotate --scope ...can request only operator scopes that the caller session already possesses.
Related:
- Configuration (gateway auth modes)
- Control UI
- Devices
- Remote access
- Trusted proxy auth
Gateway service not running
Use this when the service is installed but the process will not stay running.
openclaw gateway status
openclaw status
openclaw logs --follow
openclaw doctor
openclaw gateway status --deep # also scan system-level services
Check for:
Runtime: stoppedwith exit hints.- Service config mismatch (
Config (cli)vsConfig (service)). - Port or listener conflicts.
- Extra launchd/systemd/schtasks installs when
--deepis used. Other gateway-like services detected (best effort)cleanup hints.
Common signatures
Gateway start blocked: set gateway.mode=localorexisting config is missing gateway.mode→ local gateway mode is disabled, or the config file was overwritten andgateway.modeis missing. Fix: specifygateway.mode="local"in your config, or executeopenclaw onboard --mode local/openclaw setupagain to reapply the expected local-mode configuration. When OpenClaw runs under Podman, the default config path is~/.openclaw/openclaw.json.refusing to bind gateway ... without auth→ binding to a non-loopback address without a valid gateway auth path (token/password, or trusted-proxy where configured).another gateway instance is already listening/EADDRINUSE→ another process is already using the port.Other gateway-like services detected (best effort)→ leftover or concurrent launchd/systemd/schtasks units exist. Most deployments should run a single gateway per machine; if multiple are necessary, separate ports and config/state/workspace. Refer to /gateway#multiple-gateways-same-host.System-level OpenClaw gateway service detectedfrom doctor → a systemd system unit is present while the user-level service is absent. Remove or disable the duplicate before letting doctor install a user service, or setOPENCLAW_SERVICE_REPAIR_POLICY=externalif the system unit should be the supervisor.Gateway service port does not match current gateway config→ the installed supervisor still references the old--port. Runopenclaw doctor --fixoropenclaw gateway install --force, then restart the gateway service.
Related:
macOS gateway silently stops responding, then resumes when you touch the dashboard
Apply this when channels (Telegram, WhatsApp, etc.) on a macOS host stay silent for minutes to hours, and the gateway recovers as soon as you open the Control UI, SSH in, or otherwise touch the host. Typically, openclaw status shows nothing unusual because the gateway is already back by the time you check.
ls ~/.openclaw/logs/stability/ | tail -5
openclaw gateway stability --bundle latest
pmset -g log | grep -iE "sleep|wake|maintenance" | tail -50
launchctl print gui/$UID/ai.openclaw.gateway | grep -E "state|last exit|runs"
Look for:
- One or more
*-uncaught_exception.jsonbundles in~/.openclaw/logs/stability/whereerror.codeis a transient network code likeENETDOWN,ENETUNREACH,EHOSTUNREACH, orECONNREFUSED. pmset -g logentries such asEntering Sleep state due to 'Maintenance Sleep'oren0 driver is slow (msg: WillChangeState to 0)matching the crash timestamps. Power Nap / Maintenance Sleep briefly drops the Wi-Fi driver to state 0; any outboundconnect()hitting that window can fail withENETDOWNeven if the host otherwise has full network connectivity.launchctl printoutput showingstate = not runningwith several recentrunsand an exit code, especially when the gap between crash and next launch is around an hour rather than seconds. macOS launchd applies an undocumented respawn-protection gate after a crash burst, which can stop honoringKeepAlive=trueuntil an external trigger like interactive login, dashboard connection, orlaunchctl kickstartre-arms it.
Common signatures:
- A stability bundle with
error.codeset toENETDOWNor a sibling code, and the call stack pointing into NodenetlookupAndConnect/Socket.connect. OpenClaw2026.5.26and later treat these as benign transient network errors, so they no longer reach the top-level uncaught handler; on older releases, upgrade first. - Long quiet stretches ending the moment you connect to the Control UI or SSH in: the user-visible activity re-arms launchd's respawn gate, not anything the dashboard does to the gateway.
runscount climbing through the day with no matchingreceived SIG*; shutting downline in~/Library/Logs/openclaw/gateway.log: clean shutdowns log a signal; transient crashes do not.
What to do:
-
Upgrade the gateway if you are on a release before
2026.5.26. After upgrading, futureENETDOWNerrors become warnings instead of killing the process. -
Cut maintenance sleep activity on Mac mini / desktop hosts meant to run as always-on servers:
sudo pmset -a sleep 0 disksleep 0 standby 0 powernap 0This lowers, but does not fully remove, the underlying driver flap. The system can still do some maintenance sleeps for TCP keepalive and mDNS upkeep regardless of these flags.
-
Add a liveness watchdog so a future crash burst parked by launchd gets caught quickly:
# Example launchd-aware liveness check, suitable for a 5-minute cron or LaunchAgent state=$(launchctl print gui/$UID/ai.openclaw.gateway 2>/dev/null | awk -F'= ' '/state =/ {print $2; exit}') if [ "$state" != "running" ]; then launchctl kickstart -k gui/$UID/ai.openclaw.gateway fiThe goal is to externally re-arm the respawn gate;
KeepAlive=truealone is not enough on macOS after a crash burst.
Related:
macOS launchd supervisor loop with duplicate gateway/node LaunchAgents
Use this when a macOS install keeps restarting every few seconds, openclaw
health checks flip between healthy and unavailable, and channel dispatch stalls
even though the service appears to be running.
This issue appeared on older installations where both the ai.openclaw.gateway and ai.openclaw.node LaunchAgents were running, with each one injecting OPENCLAW_LAUNCHD_LABEL. Under those conditions, OpenClaw can recognize launchd supervision, attempt to return restart control to launchd, and end up in a rapid EADDRINUSE/respawn cycle rather than maintaining a single stable gateway process.
for i in 1 2 3 4; do
ps aux | grep 'openclaw.*index.js' | grep -v grep | awk '{print $2}'
sleep 10
done
openclaw gateway status --deep
openclaw node status
launchctl print gui/$UID/ai.openclaw.gateway | grep -E 'state|last exit|runs'
tail -n 80 ~/Library/Logs/openclaw/gateway.log
Check for:
- Multiple gateway PIDs appearing over the 30-second window instead of one consistent process.
- Entries like
EADDRINUSE,another gateway instance is already listening, or recurring restart/handoff messages ingateway.log. - Both
~/Library/LaunchAgents/ai.openclaw.gateway.plistand~/Library/LaunchAgents/ai.openclaw.node.plistloaded simultaneously on a host meant to run only one managed gateway service.
Resolution steps:
-
When this host is dedicated to the Gateway service alone, remove the managed node service through OpenClaw. Skip this step if you depend on the node service for remote node capabilities; removing it disables those features on this machine:
openclaw node uninstall -
Set up a persistent Gateway wrapper that clears the inherited launchd markers prior to launching OpenClaw. Use the supported
--wrapperoption, and avoid editing the generated file under~/.openclaw/service-env/, since service reinstall, update, and doctor repair recreate that file:mkdir -p ~/.local/bin cat >~/.local/bin/openclaw-launchd-workaround <<'EOF' #!/bin/sh set -eu unset OPENCLAW_LAUNCHD_LABEL LAUNCH_JOB_LABEL LAUNCH_JOB_NAME XPC_SERVICE_NAME || true exec openclaw "$@" EOF chmod 700 ~/.local/bin/openclaw-launchd-workaround openclaw gateway install \ --wrapper ~/.local/bin/openclaw-launchd-workaround \ --forceThe wrapper path is preserved by
gateway installacross forced reinstalls, updates, and doctor repairs. -
Confirm the Gateway is stable and handling RPC traffic, not just accepting connections:
openclaw gateway status --deep --require-rpc for i in 1 2 3 4; do ps aux | grep 'openclaw.*index.js' | grep -v grep | awk '{print $2}' sleep 10 doneThe PID sample should reveal one steady process rather than a changing set of PIDs, and inbound channel dispatch should start working again.
-
Once you upgrade to a release where the dual-LaunchAgent loop is corrected, remove this workaround and reinstall the standard managed service:
OPENCLAW_WRAPPER= openclaw gateway install --force rm ~/.local/bin/openclaw-launchd-workaround
Related:
Gateway exits during high memory use
Apply this when the Gateway vanishes under heavy load, the supervisor reports an OOM-style restart, or logs mention critical memory pressure bundle written.
openclaw gateway status --deep
openclaw logs --follow
openclaw gateway stability --bundle latest
openclaw gateway diagnostics export
Check for:
Reason: diagnostic.memory.pressure.criticalinside the most recent stability bundle.Memory pressure:accompanied bycritical/rss_threshold,critical/heap_threshold, orcritical/rss_growth.V8 heap:readings approaching the heap limit.Largest session files:records such asagents/<agent>/sessions/<session>.jsonlorsessions/<session>.jsonl.- Linux cgroup memory counters when the gateway runs within a container or a memory-constrained service.
Typical indicators:
critical memory pressure bundle writtenshows up right before a restart → OpenClaw saved a pre-OOM stability bundle. Examine it withopenclaw gateway stability --bundle latest.memory pressure: level=criticalappears in gateway logs → OpenClaw sensed critical memory pressure and stored the available in-process memory details.Largest session files:references a very large redacted transcript path → trim retained session history, check session growth, or relocate old transcripts out of the active store before restarting.V8 heap:used bytes sit near the heap limit → first reduce prompt/session pressure or cut concurrent work. For a managed service, look atGateway heap:inopenclaw gateway status; if it readsnot set, regenerate old service metadata withopenclaw gateway install --force. Ambient shellNODE_OPTIONSis deliberately ignored. Apply an explicit supervisor-level heap override only after verifying the sustained workload and preserving sufficient native-memory headroom.Memory pressure: critical/rss_growth→ memory expanded quickly within one sampling interval. Review the latest logs for a large import, runaway tool output, repeated retries, or a backlog of queued agent tasks.- Critical memory pressure logged but no bundle present → run
openclaw gateway diagnostics exportafter the event to gather the available operational evidence.
The stability bundle carries no payload. It contains operational memory evidence and redacted relative file paths, not message text, webhook bodies, credentials, tokens, cookies, or raw session ids. Attach the diagnostics export to bug reports rather than pasting raw logs.
Related:
Gateway rejected invalid config
Apply this when Gateway startup fails with Invalid config or hot reload logs indicate it skipped an invalid edit.
openclaw logs --follow
openclaw config file
openclaw config validate
openclaw doctor
Check for:
Invalid config at ...config reload skipped (invalid config): ...Config write rejected: ...- A timestamped
openclaw.json.rejected.*file next to the active config. - A timestamped
openclaw.json.clobbered.*file ifdoctor --fixfixed a broken direct edit. - OpenClaw keeps the latest 32
.clobbered.*files for each config path and discards older ones.
What happened
- Validation of the config can fail at startup, during hot reload, or when OpenClaw itself writes the file.
- When the Gateway boots, it fails closed rather than altering
openclaw.json. - Hot reload ignores invalid external modifications and leaves the current runtime config untouched.
- OpenClaw-owned writes block invalid or destructive payloads prior to committing, then store
.rejected.*. - Repair duties fall to
openclaw doctor --fix. It can strip non-JSON prefixes or bring back the last-known-good copy, all while keeping the rejected payload safe as.clobbered.*. - If a single config path triggers repeated repairs, OpenClaw cycles out older
.clobbered.*files so the most recent repaired payload remains accessible.
Inspect and repair
CONFIG="$(openclaw config file)"
ls -lt "$CONFIG".clobbered.* "$CONFIG".rejected.* 2>/dev/null | head
diff -u "$CONFIG" "$(ls -t "$CONFIG".clobbered.* 2>/dev/null | head -n 1)"
openclaw config validate
openclaw doctor
Common signatures
.clobbered.*being present means doctor fixed a broken external edit while keeping the active config repaired..rejected.*appearing indicates an OpenClaw-owned config write failed schema or clobber checks before commit.Config write rejected:signals the write attempted to drop required shape, shrink the file drastically, or persist invalid config.config reload skipped (invalid config):points to a direct edit that failed validation and was skipped by the running Gateway.Invalid config at ...means startup failed before Gateway services came up.missing-meta-vs-last-good,gateway-mode-missing-vs-last-good, orsize-drop-vs-last-good:*show an OpenClaw-owned write was rejected for losing fields or size relative to the last-known-good backup.Config last-known-good promotion skippedmeans the candidate held redacted secret placeholders like***.
Fix options
- Execute
openclaw doctor --fixso doctor can repair prefixed or clobbered config, or restore last-known-good. - Pull only the intended keys from
.clobbered.*or.rejected.*, then apply them usingopenclaw config setorconfig.patch. - Run
openclaw config validateprior to restarting. - For manual edits, retain the full JSON5 config rather than just the partial object you intended to change.
Related:
Gateway probe warnings
Employ this when openclaw gateway probe reaches something yet still emits a warning block.
openclaw gateway probe
openclaw gateway probe --json
openclaw gateway probe --ssh user@gateway-host
Check for:
warnings[].codeandprimaryTargetIdin the JSON output.- Whether the warning concerns SSH fallback, multiple gateways, missing scopes, or unresolved auth refs.
Typical signatures:
SSH tunnel failed to start; falling back to direct probes.indicates SSH setup failed, yet the command still attempted direct configured or loopback targets.multiple reachable gateway identities detectedmeans distinct gateways responded, or OpenClaw could not confirm reachable targets are the same gateway. An SSH tunnel, proxy URL, or configured remote URL pointing to the same gateway counts as one gateway with multiple transports, even when transport ports differ.Read-probe diagnostics are limited by gateway scopes (missing operator.read)shows connect succeeded, but detail RPC is scope-limited; pair the device identity or use credentials withoperator.read.Gateway accepted the WebSocket connection, but follow-up read diagnostics failedshows connect succeeded, but the full diagnostic RPC set timed out or failed. Treat this as a reachable Gateway with degraded diagnostics; compareconnect.okandconnect.rpcOkin--jsonoutput.Capability: pairing-pendingorgateway closed (1008): pairing requiredmeans the gateway answered, but this client still requires pairing or approval before normal operator access.- Unresolved
gateway.auth.*/gateway.remote.*SecretRef warning text means auth material was unavailable in this command path for the failed target.
Related:
Channel connected, messages not flowing
If channel state shows connected but message flow is stalled, direct attention to policy, permissions, and channel-specific delivery rules.
openclaw channels status --probe
openclaw pairing list --channel <channel> [--account <id>]
openclaw status --deep
openclaw logs --follow
openclaw config get channels
Look for:
- DM policy (
pairing,allowlist,open,disabled). - Group allowlist and mention requirements.
- Missing channel API permissions or scopes.
Typical signatures:
mention required→ group mention policy caused the message to be dropped.pairing/ pending approval traces → the sender has not been approved.missing_scope,not_in_channel,Forbidden,401/403→ a channel auth or permissions problem exists.
Related:
Cron and heartbeat delivery
When cron or heartbeat fails to run or deliver, check the scheduler state before inspecting the delivery target.
openclaw cron status
openclaw cron list
openclaw cron runs --id <jobId> --limit 20
openclaw system heartbeat last
openclaw logs --follow
Check for:
- Cron is enabled and the next wake time is set.
- Job run history status (
ok,skipped,error). - Heartbeat skip reasons (
quiet-hours,requests-in-flight,cron-in-progress,alerts-disabled,empty-heartbeat-file).
Common signatures
cron: scheduler disabled; jobs will not run automatically→ cron is turned off.cron: timer tick failed→ scheduler tick encountered an error; inspect file, log, or runtime issues.heartbeat skippedwithreason=quiet-hours→ the current time falls outside the active hours window.heartbeat skippedwithreason=empty-heartbeat-file→ the heartbeat monitor scratch contains only blank lines, comments, headers, fences, or empty checklist scaffolding, so OpenClaw omits the model call.heartbeat skippedwithreason=no-route→ the defaultownertarget lacks a concrete owner incommands.ownerAllowFromor channelallowFrom, the owner cannot be resolved to a DM, or no channel is set. An explicitlastalso requires a session conversation route.heartbeat: unknown accountId→ the account id for the heartbeat delivery target is invalid.heartbeat skippedwithreason=dm-blocked→ the heartbeat target resolved to a DM-style destination whileagents.defaults.heartbeat.directPolicy(or the per-agent override) is configured asblock.
Related:
Node paired, tool fails
If a node is paired but tools are failing, separate foreground, permission, and approval states for diagnosis.
openclaw nodes status
openclaw nodes describe --node <idOrNameOrIp>
openclaw approvals get --node <idOrNameOrIp>
openclaw logs --follow
openclaw status
Check for:
- Node is online with the expected capabilities.
- OS permission grants for camera, mic, location, and screen.
- Exec approvals and allowlist state.
Common signatures:
NODE_BACKGROUND_UNAVAILABLE→ the node app must be in the foreground.*_PERMISSION_REQUIRED/LOCATION_PERMISSION_REQUIRED→ an OS permission is missing.SYSTEM_RUN_DENIED: approval required→ exec approval is still pending.SYSTEM_RUN_DENIED: allowlist miss→ the allowlist is blocking the command.
Related:
Browser tool fails
Use this when browser tool actions fail while the gateway itself remains healthy.
openclaw browser status
openclaw browser start --browser-profile openclaw
openclaw browser profiles
openclaw logs --follow
openclaw doctor
Check for:
- Whether
plugins.allowis set and includesbrowser. - A valid browser executable path.
- CDP profile reachability.
- Local Chrome availability for
existing-session/userprofiles.
Plugin / executable signatures
unknown command "browser"orunknown command 'browser'→ the built-in browser plugin gets blocked byplugins.allow.- Browser tool missing or unavailable while
browser.enabled=true→plugins.allowblocksbrowser, so the plugin never loads. Failed to start Chrome CDP on port→ the browser process could not start.browser.executablePath not found→ the configured path is not valid.browser.cdpUrl must be http(s) or ws(s)→ the CDP URL you set uses an unsupported protocol, likefile:orftp:.browser.cdpUrl has invalid port→ the CDP URL's port is malformed or outside the valid range.Playwright is not available in this gateway build; '<feature>' is unsupported.→ the gateway installation is missing the core browser runtime dependency; reinstall or update OpenClaw and restart the gateway. ARIA snapshots and basic page screenshots remain functional, but navigation, AI snapshots, CSS-selector element screenshots, and PDF export stay unavailable.
Chrome MCP / existing-session signatures
Could not find DevToolsActivePort for chrome→ Chrome MCP existing-session could not attach to the chosen browser data directory yet. Open the browser inspect page, enable remote debugging, keep the browser open, approve the first attach prompt, then retry. If signed-in state is not needed, use the managedopenclawprofile instead.No browser tabs found for profile="user"→ the Chrome MCP attach profile has no open local Chrome tabs.Remote CDP for profile "<name>" is not reachable→ the gateway host cannot reach the configured remote CDP endpoint.Browser attachOnly is enabled ... not reachableorBrowser attachOnly is enabled and CDP websocket ... is not reachable→ attach-only profile has no reachable target, or the HTTP endpoint responded but the CDP WebSocket still failed to open.
Element / screenshot / upload signatures
fullPage is not supported for element screenshots→ the screenshot request combined--full-pagewith--refor--element.element screenshots are not supported for existing-session profiles; use ref from snapshot.→ Chrome MCP /existing-sessionscreenshot calls must use page capture or a snapshot--ref, not CSS--element.existing-session file uploads do not support element selectors; use ref/inputRef.→ Chrome MCP upload hooks require snapshot refs, not CSS selectors.existing-session file uploads currently support one file at a time.→ on Chrome MCP profiles, send only one upload per call.existing-session dialog handling does not support timeoutMs.→ dialog hooks on Chrome MCP profiles do not accept timeout overrides.existing-session type does not support timeoutMs overrides.→ leave outtimeoutMsforact:typeonprofile="user"/ Chrome MCP existing-session profiles, or use a managed/CDP browser profile when a custom timeout is required.response body is not supported for existing-session profiles yet.→responsebodystill needs a managed browser or raw CDP profile.- Stale viewport / dark-mode / locale / offline overrides on attach-only or remote CDP profiles → run
openclaw browser stop --browser-profile <name>to close the active control session and release Playwright/CDP emulation state without restarting the entire gateway.
Related:
If you upgraded and something suddenly broke
Most post-upgrade breakage comes from config drift or stricter defaults now being enforced.
1. Auth and URL override behavior changed
openclaw gateway status
openclaw config get gateway.mode
openclaw config get gateway.remote.url
openclaw config get gateway.auth.mode
What to check:
- If
gateway.mode=remote, CLI calls may be hitting remote while your local service is fine. - Explicit
--urlcalls do not fall back to stored credentials.
Common signatures:
gateway connect failed:→ wrong URL target.unauthorized→ endpoint reachable but wrong auth.
2. Bind and auth guardrails are stricter
openclaw config get gateway.bind
openclaw config get gateway.auth.mode
openclaw config get gateway.auth.token
openclaw gateway status
openclaw logs --follow
What to check:
- Non-loopback binds (
lan,tailnet,custom) need a valid gateway auth path: shared token/password auth, or a correctly configured non-loopbacktrusted-proxydeployment. - Old keys like
gateway.tokendo not replacegateway.auth.token.
Common signatures:
refusing to bind gateway ... without auth→ non-loopback bind without a valid gateway auth path.Connectivity probe: failedwhile runtime is running → gateway alive but inaccessible with current auth/url.
3. Pairing and device identity state changed
openclaw devices list
openclaw pairing list --channel <channel> [--account <id>]
openclaw logs --follow
openclaw doctor
Things to inspect:
- Device approvals that are still pending for dashboards or nodes.
- DM pairing requests awaiting approval following policy or identity changes.
Typical indicators:
device identity requiredpoints to unsatisfied device authentication.pairing requiredsignals that the sender or device has not yet been approved.
When configuration and runtime continue to disagree even after these checks, reinstall the service metadata using the same profile or state directory:
openclaw gateway install --force
openclaw gateway restart
See also: