{
"schemaVersion": 1,
"sandbox": "harmony",
"status": "fail",
"failed": 1,
"warnings": 0,
"checks": [
{ "group": "Host", "label": "CLI build", "status": "ok", "detail": "dist/nemoclaw.js present" },
{ "group": "Host", "label": "Docker daemon", "status": "ok", "detail": "server 29.8.0" },
{ "group": "Host", "label": "OpenShell CLI", "status": "ok", "detail": "/home/abt/.local/bin/openshell" },
{ "group": "Gateway", "label": "Registered gateway binding", "status": "ok", "detail": "resolved to 'nemoclaw'" },
{ "group": "Gateway", "label": "OpenShell status", "status": "ok", "detail": "connected to nemoclaw" },
{ "group": "Sandbox", "label": "Live sandbox", "status": "fail", "detail": "harmony present (Error)", "hint": "run `nemoclaw harmony status` or `nemoclaw harmony logs --follow`" },
{ "group": "Inference", "label": "Route", "status": "ok", "detail": "openai-api / gpt-5.4" },
{ "group": "Inference", "label": "Inference route (gateway)", "status": "info", "detail": "skipped because the sandbox is not reachable through its named gateway" },
{ "group": "Inference", "label": "Provider health (upstream)", "status": "info", "detail": "OpenAI health requires OPENAI_API_KEY; skipping model-invocation probe instead of reporting endpoint reachability as healthy." },
{ "group": "Inference", "label": "Serving process", "status": "info", "detail": "not checked — serving-process probing is not implemented" },
{ "group": "Sandbox", "label": "Agent version", "status": "ok", "detail": "OpenClaw v2026.7.1" },
{ "group": "Sandbox", "label": "Lifecycle registration", "status": "ok", "detail": "registry entry has lifecycle metadata for snapshot, rebuild, upgrade, recovery, and reboot" },
{ "group": "Sandbox", "label": "Config permissions", "status": "ok", "detail": "runtime config permission contract verified" },
{ "group": "Messaging", "label": "Channels", "status": "info", "detail": "telegram enabled; telegram inbound delivery is not inferred from conflict signatures", "hint": "run `nemoclaw harmony channels status --channel telegram` to probe inbound delivery" },
{ "group": "Messaging", "label": "Runtime channel registry", "status": "info", "detail": "skipped because the sandbox is not reachable through its named gateway", "hint": "fix the gateway and live sandbox checks, then rerun `nemoclaw harmony doctor`" },
{ "group": "Local services", "label": "Ollama", "status": "info", "detail": "not reachable or invalid response at http://127.0.0.1:11434/api/tags" },
{ "group": "Local services", "label": "cloudflared", "status": "info", "detail": "stopped", "hint": "no cloudflared process; run `nemoclaw tunnel start` to start it" }
]
}
User Story
As an operator running a production NemoClaw/OpenShell sandbox with a live messaging
channel (Telegram) attached, after the gateway's log-push RPC connection to a sandbox
is disrupted and the underlying container later recovers on its own, I need the gateway
to correctly re-recognize the sandbox as Ready, so that the web dashboard and CLI-based
recovery commands remain usable for that sandbox without requiring a destructive
destroy + re-onboard.
Problem Statement
A sandbox (
harmony) is permanently stuck inPhase: Erroras reported byopenshell sandbox listandnemoclaw <name> status, even though:docker psshowsUp ... (healthy))getUpdatesevery ~30s and successfully processing real conversations via GPT-5.4 inference)
127.0.0.1:8080) shows healthyESTABLISHEDconnections with no drops or timeoutsnemoclaw doctorreports every other check asok(Docker daemon, OpenShell CLI,gateway binding, gateway connection, inference route)
Both
nemoclaw <name> startandnemoclaw <name> gateway restartfail to clear theError phase, and no combination of these commands re-triggers a successful readiness
check against the already-running, already-healthy container.
Suspected root cause / trigger event:
The sandbox was healthy prior to a host-level event:
.wslconfigwas edited (settinga memory cap) and
wsl --shutdownwas run to apply it. This interrupted thesandbox↔gateway internal log-push RPC connection:
This connection never re-established on its own, and the sandbox's underlying Docker
container eventually crashed (
exit 255). After a laterdocker start <container>brought the container back up (Docker-level health: healthy, service resumed
normally), the OpenShell/NemoClaw state layer never re-synced — it appears the
gateway's own reconciliation/recovery scan may have run at a moment when the
container was down, latched the sandbox into
Error, and does not re-checksandboxes already marked
Error.This looks similar in nature to #1765 ("fix: resume unspecified sandbox phase") —
a gateway-restart-time reconciliation scan misclassifying a sandbox state if it runs
during a window when the container isn't up yet, and not re-scanning sandboxes
already in
Error.Impact / Why This Matters
conversations are being handled correctly throughout.
because it depends on the sandbox being recognized as
Ready. Anydashboard-dependent workflow (monitoring, manual intervention, session
management via the web UI) is blocked.
start,gateway restart,recover) do not clear thestuck state, and there is no documented CLI command to force a phase re-check or
manually clear
Errorshort of destroying and rebuilding the sandbox (destroy+re-
onboard), which is high-risk for a production sandbox and was avoided.process (stdout/stderr for the gateway process point to an internal socket, not a
file; no systemd journal entries; no
*.log/*.jsonlfiles found under~/.local/state/nemoclaw), making this hard to self-diagnose further.Error, downstreamdoctorchecks that depend onreaching it through the named gateway are also skipped (
Inference route (gateway),Runtime channel registry), reducing the diagnostic visibility intothe very state that needs debugging.
Acceptance Criteria
Up (healthy)after an interruptionis correctly re-recognized as
Readywithout requiringdestroy+ re-onboard.start/recover) exists to force the gateway tore-run its readiness/reconciliation check against a sandbox currently in
Error,independent of whatever cached decision put it there.
causes
nemoclaw start/gateway restartto wait ~41–59s and then re-latch toError) is surfaced in--json/verbose output, so the failing check isidentifiable without needing gateway-internal log access.
Reproduction Steps
channel (Telegram) attached.
our case:
wsl --shutdownwhile the sandbox was active).docker start <container>brings the container back toUp (healthy), and thein-container service resumes working correctly (verified via real Telegram
conversations, real GPT-5.4 inference calls in logs).
openshell sandbox listcontinues to reportPhase: Errorfor this sandboxindefinitely.
Note: exact trigger not confirmed reproducible on demand — observed once via the
above sequence.
Diagnostics performed (ruling out other causes):
docker ps -a:Up ... (healthy), confirmed via repeated checks over timedocker inspect(RestartCount, StartedAt/FinishedAt): manually restarted viadocker start; no crash loopnemoclaw <name> doctor --json: all checksokexceptSandbox / Live sandbox=
fail, detail:"harmony present (Error)"docker version,docker info): fully healthyps aux): single long-running background process (notsystemd-managed), stable, no crash/restart
lsof -p <gateway pid>: only holds fds on its own SQLite state db;fuseronthat db shows no other process holding a lock
nemoclaw <name> gateway restart: reportsgateway health passedbut fails withWarning: OpenShell ForwardTcp 18789 for harmony did not start: OpenShell forward service exited before binding 0.0.0.0:18789 (status 1)—Failure layer: forward recovery failurelsof -i :18789andss -tlnp— not a portconflict
ss -tlnp/ss -tnpshow healthyESTABLISHEDconnections from the gateway process to itself via127.0.0.1:8080(routed into sandbox netns) — no drops, no timeouts
nemoclaw <name> start: detects container isalready running, attempts to"restore sandbox startup state," waits ~41–59s, then reports:
Sandbox 'harmony' entered 'Error' statenemoclaw <name> logs --follow): show completely normaloperation — policy load, network namespace setup, Landlock rules applied, live
Telegram
getUpdatespolling every ~30s, successful GPT-5.4 inference calls,successful
sendMessageEnvironment
plugin work in a separate sandbox
/home/abt/.local/bin/openshell-gateway, run as a plainbackground process (not systemd-managed)
Logs
log push RPC failed ... peer closed connection without sending TLS close_notify Warning: OpenShell ForwardTcp 18789 for harmony did not start: OpenShell forward service exited before binding 0.0.0.0:18789 (status 1) Failure layer: forward recovery failurenemoclaw harmony doctor --jsonfull output{ "schemaVersion": 1, "sandbox": "harmony", "status": "fail", "failed": 1, "warnings": 0, "checks": [ { "group": "Host", "label": "CLI build", "status": "ok", "detail": "dist/nemoclaw.js present" }, { "group": "Host", "label": "Docker daemon", "status": "ok", "detail": "server 29.8.0" }, { "group": "Host", "label": "OpenShell CLI", "status": "ok", "detail": "/home/abt/.local/bin/openshell" }, { "group": "Gateway", "label": "Registered gateway binding", "status": "ok", "detail": "resolved to 'nemoclaw'" }, { "group": "Gateway", "label": "OpenShell status", "status": "ok", "detail": "connected to nemoclaw" }, { "group": "Sandbox", "label": "Live sandbox", "status": "fail", "detail": "harmony present (Error)", "hint": "run `nemoclaw harmony status` or `nemoclaw harmony logs --follow`" }, { "group": "Inference", "label": "Route", "status": "ok", "detail": "openai-api / gpt-5.4" }, { "group": "Inference", "label": "Inference route (gateway)", "status": "info", "detail": "skipped because the sandbox is not reachable through its named gateway" }, { "group": "Inference", "label": "Provider health (upstream)", "status": "info", "detail": "OpenAI health requires OPENAI_API_KEY; skipping model-invocation probe instead of reporting endpoint reachability as healthy." }, { "group": "Inference", "label": "Serving process", "status": "info", "detail": "not checked — serving-process probing is not implemented" }, { "group": "Sandbox", "label": "Agent version", "status": "ok", "detail": "OpenClaw v2026.7.1" }, { "group": "Sandbox", "label": "Lifecycle registration", "status": "ok", "detail": "registry entry has lifecycle metadata for snapshot, rebuild, upgrade, recovery, and reboot" }, { "group": "Sandbox", "label": "Config permissions", "status": "ok", "detail": "runtime config permission contract verified" }, { "group": "Messaging", "label": "Channels", "status": "info", "detail": "telegram enabled; telegram inbound delivery is not inferred from conflict signatures", "hint": "run `nemoclaw harmony channels status --channel telegram` to probe inbound delivery" }, { "group": "Messaging", "label": "Runtime channel registry", "status": "info", "detail": "skipped because the sandbox is not reachable through its named gateway", "hint": "fix the gateway and live sandbox checks, then rerun `nemoclaw harmony doctor`" }, { "group": "Local services", "label": "Ollama", "status": "info", "detail": "not reachable or invalid response at http://127.0.0.1:11434/api/tags" }, { "group": "Local services", "label": "cloudflared", "status": "info", "detail": "stopped", "hint": "no cloudflared process; run `nemoclaw tunnel start` to start it" } ] }