Description
When onboarding returns normally with an incomplete but resumable state, the saved onboarding session is recorded as failed rather than in_progress, and its failure record is flagged as interrupted even though the process was never interrupted.
This is the exact condition covered by GitHub issue #9048, whose acceptance criteria are:
- A normally returned incomplete machine state exits with status 1.
- The session retains in_progress and its last completed checkpoint.
- An unhandled exception or abnormal exit still records failed.
The fix for that issue, #9065 "fix(onboard): preserve resumable incomplete sessions", is contained in the v0.0.111 tag used here, so the first two criteria should hold. They do not on the inference-validation path.
The reproduction below matches the shape described in #9048: the inference route returns HTTP 503, onboarding retries, gives up, and returns on its own with exit status 1. No signal is sent and the process is not killed. The product itself reports the run as resumable, printing the resume command. Despite that, the session records status failed, machine state failed, and failure.interrupted true.
The interrupted flag is the notable part. Nothing interrupted this run, so a graceful route-validation failure appears to be classified as an interruption, which is plausibly what routes it into the abnormal-exit branch that is supposed to be reserved for unhandled exceptions.
User impact is a misleading recorded state rather than lost function: --resume does continue afterwards. Any operator or automation that inspects the session to distinguish "stopped part way, can be resumed" from "failed outright" is misled, and the documented contract is not met.
Note on scope: the documentation describing in_progress is correct and matches the intended design. This is a product defect only.
Platform scope: Reproduced on Ubuntu 26.04 x86_64. Other platforms not tested.
Regression: Unknown - the behaviour required by #9048 is not observed in a build that contains its fix, but whether it ever worked in a shipped release was not tested.
OpenShell issue: No
Environment
Device: x86_64 Ubuntu server
OS: Ubuntu 26.04 LTS
Architecture: x86_64
Node.js: v22.23.2
npm: 10.9.8
Docker: Docker version 29.6.1, build 8900f1d
OpenShell CLI: openshell 0.0.101
NemoClaw: nemoclaw v0.0.111
OpenClaw: 2026.7.1
Steps to Reproduce
1. Start a server on 127.0.0.1 port 8000 that answers every request with HTTP 503.
2. Remove any existing onboarding session so the run starts clean.
3. Point onboarding at that endpoint and let it run to completion without sending any signal:
NEMOCLAW_PROVIDER=custom
NEMOCLAW_ENDPOINT_URL=http://localhost:8000/v1
NEMOCLAW_MODEL={model}
NEMOCLAW_COMPATIBLE_AUTH_MODE=none
nemoclaw onboard --non-interactive --name {sandbox} --no-gpu
4. Observe that onboarding retries the validation probes, gives up, prints the resume command, and returns exit status 1 on its own.
5. Inspect the saved onboarding session and read status, checkpoint.machineState, and failure.interrupted.
Do not terminate the process to reproduce this. Killing onboarding is the separate abnormal-exit path, where a failed status is correct.
Expected Result
Per the acceptance criteria of the issue whose fix this build contains: the run exits 1, and the session retains status in_progress at its last completed checkpoint. failure.interrupted is not set for a run that returned normally.
Actual Result
The run exits 1 and is reported by the product as resumable, but the session records status failed, machine state failed, and failure.interrupted true.
Logs
# Endpoint answers 503 for everything
$ curl -s -o /dev/null -w '%{http_code}' http://127.0.0.1:8000/v1/models
503
# Onboarding returns on its own, no signal sent
$ nemoclaw onboard --non-interactive --name {sandbox} --no-gpu
Responses API with tool calling validation returned HTTP 503; retrying in 5s...
Responses API with tool calling validation returned HTTP 503; retrying in 15s...
Responses API with tool calling validation returned HTTP 503; retrying in 30s...
Chat Completions API validation returned HTTP 503; retrying in 5s...
Chat Completions API validation returned HTTP 503; retrying in 15s...
Chat Completions API validation returned HTTP 503; retrying in 30s...
Validation probe summary: Responses API with tool calling: HTTP 503; Chat Completions API: HTTP 503.
Onboarding did not finish. Resume from the step that failed with:
nemoclaw onboard --resume --name {sandbox}
exit=1
# Saved onboarding session as written by that run
status = 'failed' [expected: 'in_progress']
resumable = True
checkpoint.machineState = 'failed'
failure.interrupted = True [nothing interrupted this run]
Description
When onboarding returns normally with an incomplete but resumable state, the saved onboarding session is recorded as failed rather than in_progress, and its failure record is flagged as interrupted even though the process was never interrupted.
This is the exact condition covered by GitHub issue #9048, whose acceptance criteria are:
The fix for that issue, #9065 "fix(onboard): preserve resumable incomplete sessions", is contained in the v0.0.111 tag used here, so the first two criteria should hold. They do not on the inference-validation path.
The reproduction below matches the shape described in #9048: the inference route returns HTTP 503, onboarding retries, gives up, and returns on its own with exit status 1. No signal is sent and the process is not killed. The product itself reports the run as resumable, printing the resume command. Despite that, the session records status failed, machine state failed, and failure.interrupted true.
The interrupted flag is the notable part. Nothing interrupted this run, so a graceful route-validation failure appears to be classified as an interruption, which is plausibly what routes it into the abnormal-exit branch that is supposed to be reserved for unhandled exceptions.
User impact is a misleading recorded state rather than lost function: --resume does continue afterwards. Any operator or automation that inspects the session to distinguish "stopped part way, can be resumed" from "failed outright" is misled, and the documented contract is not met.
Note on scope: the documentation describing in_progress is correct and matches the intended design. This is a product defect only.
Platform scope: Reproduced on Ubuntu 26.04 x86_64. Other platforms not tested.
Regression: Unknown - the behaviour required by #9048 is not observed in a build that contains its fix, but whether it ever worked in a shipped release was not tested.
OpenShell issue: No
Environment
Steps to Reproduce
Expected Result
Per the acceptance criteria of the issue whose fix this build contains: the run exits 1, and the session retains status in_progress at its last completed checkpoint. failure.interrupted is not set for a run that returned normally.
Actual Result
The run exits 1 and is reported by the product as resumable, but the session records status failed, machine state failed, and failure.interrupted true.
Logs