Skip to content

fix(onboard): debounce transient sandbox Error during readiness wait (#6043) - #6164

Merged
cv merged 6 commits into
mainfrom
fix/6043-dgx-spark-sandbox-error
Jul 3, 2026
Merged

fix(onboard): debounce transient sandbox Error during readiness wait (#6043)#6164
cv merged 6 commits into
mainfrom
fix/6043-dgx-spark-sandbox-error

Conversation

@yimoj

@yimoj yimoj commented Jul 2, 2026

Copy link
Copy Markdown
Collaborator

Summary

On a fresh nemoclaw onboard, the OpenShell gateway can (re)start its supervisor session and re-register the just-created sandbox. During that window openshell sandbox list briefly reports the sandbox in the transient Error phase before it flips to Ready (observed on DGX Spark, where the dashboard port fallback 18789 → 18794 and the supervisor restart race the sandbox bootstrap). The create/readiness waiter fast-failed on the first Error poll, turning a recoverable transient into a terminal onboard failure. This PR applies a bounded consecutive-Error debounce so the transient recovers, while genuinely terminal phases still fail immediately.

Related Issue

Fixes #6043

Changes

  • src/lib/onboard/sandbox-readiness-tracing.ts: waitForCreatedSandboxReadyWithTrace now requires consecutive Error polls before declaring a terminal failure, instead of bailing on the first Error poll. Default is 30 polls (~60s at the 2s poll interval), configurable via NEMOCLAW_SANDBOX_READY_ERROR_DEBOUNCE; the counter resets on any non-Error poll so only sustained Error is terminal. Mirrors the existing docker-gpu-supervisor-reconnect.ts debounce.
  • Debounce is scoped to Error only. Failed and CrashLoopBackOff are genuinely terminal and still fast-fail immediately (addresses CodeRabbit r3510182513 and PR Review Advisor PRA-2).
  • Terminal failures are not hidden: sustained Error still fast-fails after the bounded window (well before the readiness timeout), and the caller still captures full failure diagnostics (collectSandboxCreateFailureDiagnostics). Callers can pass errorPhaseDebouncePolls: 1 to restore the original fast-fail.
  • Added a source-of-truth / removal-contract comment block (invalid state → OpenShell sandbox list cache boundary → why tolerated locally → regression evidence → removal condition), mirroring docker-gpu-supervisor-reconnect.ts (PRA-3).
  • Added transient_failure_phase trace event and last_failure_phase on the timeout trace.
  • Tests moved into a focused src/lib/onboard/sandbox-readiness-tracing.test.ts (out of the docker-gpu-patch.test.ts hotspot, which shrinks; PRA-4). New direct coverage: default 30, env override, empty/non-finite (""/abc/NaN/Infinity) fallback, clamp-to-1, fractional rounding (env) and truncation (param) semantics, non-Error immediate-terminal, counter reset on flap, and a deterministic replay of the reporter's DGX Spark sandbox list sequence through the real waiter (PRA-5).

Type of Change

  • Code change (feature, bug fix, or refactor)

Quality Gates

  • Tests added or updated for changed behavior
  • Docs not applicable — justification: internal onboarding readiness-wait timing/recovery; no user-facing doc surface.
  • Sensitive paths changed (security, policy, credentials, preflight, onboarding, inference, runner, sandbox, or messaging)
  • Sensitive-path review completed or maintainer-approved waiver recorded — reviewer/approval link/justification: high-effort /code-review on the diff returned no findings; CodeRabbit r3510182513 (Error-only scoping) and PR Review Advisor items PRA-2/PRA-3/PRA-4/PRA-5 addressed in code/tests; change reuses the reviewed supervisor-reconnect debounce pattern.

Verification

  • PR description includes the DCO sign-off declaration and every commit appears as Verified in GitHub
  • Targeted tests pass — vitest run src/lib/onboard/sandbox-readiness-tracing.test.ts src/lib/onboard/docker-gpu-patch.test.ts (70 tests)
  • Full npm test (cli lane) passes — vitest run --project cli: 508 files / 5336 tests
  • Biome check clean on changed files
  • No secrets, API keys, or credentials committed

E2E / reproduction

DGX Spark hardware was unavailable in this session, and the failure is a timing-dependent transient Error during gateway re-registration that cannot be forced deterministically on substitute GPU hardware (a healthy onboard on the available Linux/GPU host yimoj-colossus-dev would not enter the Error branch). Per the acceptance guidance, the fix is gated by a checked-in deterministic replay (sandbox-readiness-tracing.test.ts → "DGX Spark fresh-onboard readiness replay (#6043)") that drives the reporter's exact sandbox list sequence through the real readiness waiter: the pre-fix (K=1) path reproduces the exact reporter line and the shipped default recovers to Ready.

The same replay against the built dist/ shipped code:

[transient Error (default) -> recovers]              polls=5 {"ready":true,"reason":"ready","failurePhase":null}
[Failed (default) -> immediate terminal]             polls=2 {"ready":false,"reason":"terminal_failure_phase","failurePhase":"Failed"}
[CrashLoopBackOff (default) -> immediate terminal]   polls=2 {"ready":false,"reason":"terminal_failure_phase","failurePhase":"CrashLoopBackOff"}

A real worktree-CLI onboard was also run on this host to prove the changed readiness waiter runs in the real command path without regression (node ./bin/nemoclaw.js onboard --non-interactive --yes --fresh --no-gpu --no-sandbox-gpu --agent openclaw --name nemoclaw-6043-e2e):

  Creating sandbox in gateway...
  Built image openshell/sandbox-from:1782969910
  Waiting for sandbox to become ready...          <- waitForCreatedSandboxReadyWithTrace (changed code)
  Sandbox reported Ready before create stream exited; continuing.
  ✓ Sandbox 'nemoclaw-6043-e2e' created
  ✓ OpenClaw gateway launched inside sandbox

openshell sandbox list afterward: nemoclaw-6043-e2e ... Ready. This exercises the changed waiter on the happy path (no Error branch, since the DGX Spark transient cannot be forced on a healthy non-DGX host); the Error-recovery branch is covered by the deterministic replay above.


Signed-off-by: Yimo Jiang yimoj@nvidia.com

Summary by CodeRabbit

  • New Features

    • Added configurable tolerance for transient Error phases during post-create sandbox readiness, with env-based default and a minimum of 1.
    • Supports overriding the tolerated Error poll count (including rounding for non-integers).
  • Bug Fixes

    • Improved readiness failure reporting: sustained Error now ends as a terminal Error (even when the debounce window expires), while other terminal phases still fail immediately.
  • Documentation

    • Documented the new tuning variable and the troubleshooting scenario for “entered Error phase before it became ready”.
  • Tests

    • Expanded and reorganized readiness tracing coverage for debounce, recovery, streak reset, and timeout/debounce edge cases.

On a fresh onboard the OpenShell gateway can (re)start its supervisor
session and re-register the just-created sandbox. During that window
`openshell sandbox list` briefly reports the sandbox in Error phase
before it flips to Ready (observed on DGX Spark, where the dashboard
port fallback + supervisor restart race the sandbox bootstrap). The
create/readiness waiter fast-failed on the first Error poll, turning
that transient into a terminal onboard failure:

  Sandbox '<name>' entered Error phase before it became ready
  (waited up to 1500s).

Apply a bounded consecutive-Error debounce in
waitForCreatedSandboxReadyWithTrace, mirroring the Docker GPU
supervisor-reconnect path: tolerate a transient Error (default 30
polls / ~60s, env NEMOCLAW_SANDBOX_READY_ERROR_DEBOUNCE) and recover if
the sandbox flips to Ready, while still fast-failing (with full failure
diagnostics) on sustained Error well before the readiness timeout.
Callers can pass errorPhaseDebouncePolls: 1 to restore the original
fast-fail behavior.

Fixes #6043

Signed-off-by: Yimo Jiang <yimoj@nvidia.com>
@coderabbitai

coderabbitai Bot commented Jul 2, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: e51885c1-bd56-484b-ac92-cf7462e0164c

📥 Commits

Reviewing files that changed from the base of the PR and between eb8c59a and 1c7c955.

📒 Files selected for processing (6)
  • docs/reference/commands-nemohermes.mdx
  • docs/reference/commands.mdx
  • docs/reference/troubleshooting.mdx
  • src/lib/onboard/docker-gpu-supervisor-reconnect.ts
  • src/lib/onboard/sandbox-readiness-tracing.test.ts
  • src/lib/onboard/sandbox-readiness-tracing.ts
✅ Files skipped from review due to trivial changes (3)
  • docs/reference/commands.mdx
  • docs/reference/commands-nemohermes.mdx
  • docs/reference/troubleshooting.mdx
🚧 Files skipped from review as they are similar to previous changes (3)
  • src/lib/onboard/docker-gpu-supervisor-reconnect.ts
  • src/lib/onboard/sandbox-readiness-tracing.test.ts
  • src/lib/onboard/sandbox-readiness-tracing.ts

📝 Walkthrough

Walkthrough

Adds configurable debounce for sandbox Error-phase readiness polling, updates readiness handling for terminal versus transient failure phases, aligns reconnect rounding, and moves related coverage and docs to match the new behavior.

Changes

Sandbox error-phase debounce handling

Layer / File(s) Summary
Debounce configuration and readiness polling
src/lib/onboard/sandbox-readiness-tracing.ts
Adds SANDBOX_READY_ERROR_DEBOUNCE_ENV, getSandboxReadyErrorDebouncePolls, an errorPhaseDebouncePolls option, and Error-only debounce behavior in the readiness loop.
Supervisor reconnect rounding
src/lib/onboard/docker-gpu-supervisor-reconnect.ts
Rounds non-integer debounce overrides to match the env-driven debounce semantics while keeping the minimum at 1.
Coverage, cleanup, and docs
src/lib/onboard/sandbox-readiness-tracing.test.ts, src/lib/onboard/docker-gpu-patch.test.ts, docs/reference/commands.mdx, docs/reference/commands-nemohermes.mdx, docs/reference/troubleshooting.mdx
Adds replay, contract, and scenario tests for the new debounce behavior, removes the moved readiness-wait test from the GPU patch test file, and documents the new environment variable and troubleshooting guidance.

Estimated code review effort: 4 (Complex) | ~45 minutes

Suggested labels: bug-fix, area: sandbox, platform: dgx-spark, area: cli

Suggested reviewers: cv, jyaunches

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly matches the main change: debouncing transient sandbox Error during onboard readiness wait.
Linked Issues check ✅ Passed The PR implements the requested DGX Spark fix by debouncing transient Error phases while preserving terminal failures.
Out of Scope Changes check ✅ Passed The code, tests, and docs all align with the sandbox Error debounce fix; no unrelated changes are evident.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch fix/6043-dgx-spark-sandbox-error

Comment @coderabbitai help to get the list of available commands.

@github-code-quality

github-code-quality Bot commented Jul 2, 2026

Copy link
Copy Markdown
Contributor

Code Coverage Overview

Languages: TypeScript

TypeScript / code-coverage/plugin

The overall coverage in the fix/6043-dgx-spark-s... branch is 96%. Coverage data for the main branch is not yet available.

Show a code coverage summary of the most covered files.
File main fix/6043-dgx-spark-s... 1c7c955 +/-
nemoclaw/src/se...cret-scanner.ts 100%
nemoclaw/src/commands/slash.ts 100%
nemoclaw/src/li...bprocess-env.ts 100%
nemoclaw/src/bl...eprint/state.ts 98%
nemoclaw/src/onboard/config.ts 98%
nemoclaw/src/bl...int/snapshot.ts 97%
nemoclaw/src/bl...print/runner.ts 95%
nemoclaw/src/co...ration-state.ts 94%
nemoclaw/src/bl...ate-networks.ts 94%
nemoclaw/src/index.ts 94%

TypeScript / code-coverage/cli

The overall coverage in the fix/6043-dgx-spark-s... branch is 69%. Coverage data for the main branch is not yet available.

Show a code coverage summary of the most covered files.
File main fix/6043-dgx-spark-s... 1c7c955 +/-
src/lib/actions...dbox/rebuild.ts 82%
src/lib/actions...all/run-plan.ts 80%
src/lib/state/o...oard-session.ts 79%
src/lib/shields/index.ts 75%
src/lib/state/sandbox.ts 73%
src/lib/onboard/preflight.ts 69%
src/lib/onboard...er-gpu-patch.ts 59%
src/lib/actions...licy-channel.ts 58%
src/lib/policy/index.ts 56%
src/lib/onboard.ts 20%

Updated July 02, 2026 06:30 UTC
Code Coverage is in Public Preview. Learn more and provide us with your feedback.

@github-actions

github-actions Bot commented Jul 2, 2026

Copy link
Copy Markdown
Contributor

PR Review Advisor (Nemotron Ultra) — Changes requested

Merge posture: Do not merge yet
Primary next action: Fix PRA-2: Missing scheduled CI workflow for upstream OpenShell fix detection; then add or justify PRA-T1.
Open items: 1 required · 2 warnings · 3 suggestions · 6 test follow-ups
Since last review: 3 prior items resolved · 4 still apply · 0 new items found

Action checklist

  • PRA-2 Fix: Missing scheduled CI workflow for upstream OpenShell fix detection in .github/workflows
  • PRA-1 Resolve or justify: Source-of-truth review needed: waitForCreatedSandboxReadyWithTrace Error-phase debounce
  • PRA-3 Resolve or justify: Default 30-poll debounce adds ~60s latency for genuine fresh-create Error failures in src/lib/onboard/sandbox-readiness-tracing.ts:173
  • PRA-T1 Add or justify test follow-up: Runtime validation
  • PRA-T2 Add or justify test follow-up: Runtime validation
  • PRA-T3 Add or justify test follow-up: Runtime validation
  • PRA-T4 Add or justify test follow-up: Test name could be clearer about debounce > timeout boundary
  • PRA-T5 Add or justify test follow-up: Add runtime validation test for fresh-onboard Error-phase latency on real hardware
  • PRA-T6 Add or justify test follow-up: waitForCreatedSandboxReadyWithTrace Error-phase debounce
  • PRA-4 In-scope improvement: Timeout-path trace event logs readyAttempts (planned) not actual polls executed in src/lib/onboard/sandbox-readiness-tracing.ts:246
  • PRA-5 In-scope improvement: Test name could be clearer about debounce > timeout boundary in src/lib/onboard/sandbox-readiness-tracing.test.ts:123
  • PRA-6 In-scope improvement: Add runtime validation test for fresh-onboard Error-phase latency on real hardware in src/lib/onboard/sandbox-readiness-tracing.test.ts

Findings index

ID Severity Category Location Required action
PRA-1 Resolve/justify architecture Identify the invalid state, source boundary, source-fix constraint, regression test, and removal condition before merging the localized behavior.
PRA-2 Required architecture .github/workflows Add a lightweight scheduled GitHub Actions workflow (e.g., weekly) that runs the skipped test against a nightly OpenShell build. Configure the workflow to fail when the test passes (no transient Error), alerting maintainers to remove the debounce. Reference the workflow in the source-of-truth comment and skipped test comment.
PRA-3 Resolve/justify security src/lib/onboard/sandbox-readiness-tracing.ts:173 Lower the default for fresh create (e.g., 10 polls = ~20s) since the reported DGX Spark transient lasted only 3 polls. Alternatively, add a separate env var NEMOCLAW_SANDBOX_READY_ERROR_DEBOUNCE_CREATE for create vs. reconnect contexts. At minimum, explicitly quantify the fresh-create latency impact in the JSDoc trade-off note.
PRA-4 Improvement correctness src/lib/onboard/sandbox-readiness-tracing.ts:246 Change the trace event to include `attempt: i + 1` (actual polls executed) instead of `attempts: readyAttempts`. Low priority; current behavior is functionally correct.
PRA-5 Improvement tests src/lib/onboard/sandbox-readiness-tracing.test.ts:123 Rename test to 'reports terminal Error phase when readiness timeout expires before debounce window completes' for clarity.
PRA-6 Improvement tests src/lib/onboard/sandbox-readiness-tracing.test.ts Add an integration test (or document as future follow-up) that triggers a real Error phase during fresh onboard on healthy hardware and measures time-to-failure. If DGX Spark CI runner unavailable, document as known gap with acceptance via replay test.

🚨 Required before merge

Address these before merging unless a maintainer explicitly overrides the advisor with rationale.

PRA-2 Required — Missing scheduled CI workflow for upstream OpenShell fix detection

  • Location: .github/workflows
  • Category: architecture
  • Problem: The Error-phase debounce is a localized workaround for OpenShell gateway bug ([DGX Spark][Sandbox] sandbox enters Error phase during onboard — gateway restart recovery fails #6043). The removal-signal test `upstream_openshell_sandbox_list_error_transient_fixed` exists but has no CI automation. Without a scheduled workflow running this test against nightly OpenShell builds, the workaround may persist indefinitely after the upstream fix lands, adding unnecessary ~60s latency to genuine terminal failures.
  • Impact: Workaround persists undetected post-upstream-fix, degrading fresh-onboard UX by ~60s for real failures and accumulating technical debt.
  • Required action: Add a lightweight scheduled GitHub Actions workflow (e.g., weekly) that runs the skipped test against a nightly OpenShell build. Configure the workflow to fail when the test passes (no transient Error), alerting maintainers to remove the debounce. Reference the workflow in the source-of-truth comment and skipped test comment.
  • Expected follow-up: Fix before merge or get explicit maintainer override.
  • Verification: Search .github/workflows/ for a scheduled workflow referencing 'upstream_openshell_sandbox_list_error_transient_fixed' or 'NEMOCLAW_SANDBOX_READY_ERROR_DEBOUNCE'.
  • Missing regression test: Scheduled CI workflow that executes the skipped test against a nightly OpenShell build and fails when the transient Error no longer appears (i.e., when the workaround can be removed).
  • Done when: The required change is committed and verification passes: Search .github/workflows/ for a scheduled workflow referencing 'upstream_openshell_sandbox_list_error_transient_fixed' or 'NEMOCLAW_SANDBOX_READY_ERROR_DEBOUNCE'.
  • Evidence: sandbox-readiness-tracing.ts:58 has GitHub URL; sandbox-readiness-tracing.test.ts:317 has URL in skipped test comment; no workflow file references either.
Review findings by urgency: 1 required fix, 2 items to resolve/justify, 3 in-scope improvements

⚠️ Resolve or justify before merge

Investigate these in the current review; either fix them, explain why they are not applicable, or document the accepted risk.

PRA-1 Resolve/justify — Source-of-truth review needed: waitForCreatedSandboxReadyWithTrace Error-phase debounce

  • Location: not file-specific
  • Category: architecture
  • Problem: The advisor marked localized patch analysis as needs_followup.
  • Impact: A localized workaround can preserve or hide an invalid state when the source boundary is unclear.
  • Recommended action: Identify the invalid state, source boundary, source-fix constraint, regression test, and removal condition before merging the localized behavior.
  • Expected follow-up: Resolve in this PR or explain why the risk is acceptable.
  • Verification: Inspect the localized patch and source-of-truth review fields for a concrete invalid state, source boundary, source-fix constraint, regression test, and removal condition.
  • Missing regression test: DGX Spark fresh-onboard readiness replay test (deterministic replay); skipped upstream_openshell_sandbox_list_error_transient_fixed test as executable checkpoint
  • Done when: The risk is fixed or explicitly justified in the PR. Verification: Inspect the localized patch and source-of-truth review fields for a concrete invalid state, source boundary, source-fix constraint, regression test, and removal condition.
  • Evidence: sandbox-readiness-tracing.ts:13-60 source-of-truth comment block; sandbox-readiness-tracing.test.ts:270-327 replay and skipped test

PRA-3 Resolve/justify — Default 30-poll debounce adds ~60s latency for genuine fresh-create Error failures

  • Location: src/lib/onboard/sandbox-readiness-tracing.ts:173
  • Category: security
  • Problem: The default debounce of 30 polls (~60s at 2s interval) applies to fresh sandbox create via onboard.ts:3102, which passes no errorPhaseDebouncePolls override. A genuinely stuck Error phase on fresh create waits ~60s before surfacing, vs. original fast-fail behavior. JSDoc acknowledges trade-off but keeps conservative default; no create-specific env var exists.
  • Impact: Fresh onboard on healthy hardware hitting a real Error phase waits up to ~60s longer before failure surfaces, degrading UX and delaying failure detection.
  • Recommended action: Lower the default for fresh create (e.g., 10 polls = ~20s) since the reported DGX Spark transient lasted only 3 polls. Alternatively, add a separate env var NEMOCLAW_SANDBOX_READY_ERROR_DEBOUNCE_CREATE for create vs. reconnect contexts. At minimum, explicitly quantify the fresh-create latency impact in the JSDoc trade-off note.
  • Expected follow-up: Resolve in this PR or explain why the risk is acceptable.
  • Verification: Check onboard.ts:3102 call to waitForCreatedSandboxReadyWithTrace — confirm no errorPhaseDebouncePolls passed. Verify default 30 polls = 60s at 2s interval.
  • Missing regression test: Integration test that a fresh onboard on healthy hardware hitting a real Error phase fails within ~60s (not the full timeout) and surfaces the Error phase in the failure message.
  • Done when: The risk is fixed or explicitly justified in the PR. Verification: Check onboard.ts:3102 call to waitForCreatedSandboxReadyWithTrace — confirm no errorPhaseDebouncePolls passed. Verify default 30 polls = 60s at 2s interval.
  • Evidence: onboard.ts:3102 calls waitForCreatedSandboxReadyWithTrace without errorPhaseDebouncePolls; SANDBOX_READY_ERROR_PHASE_DEFAULT_DEBOUNCE_POLLS = 30; poll interval 2s hardcoded in loop.

💡 In-scope improvements

These are lower-risk, not throwaway. Prefer fixing them in this PR when they are local to changed code; defer only with rationale or a linked follow-up.

PRA-4 Improvement — Timeout-path trace event logs readyAttempts (planned) not actual polls executed

  • Location: src/lib/onboard/sandbox-readiness-tracing.ts:246
  • Category: correctness
  • Problem: The trace event at line 246 (`addTraceEvent('not_ready', { attempts: readyAttempts, ... })`) records the planned attempt count (ceiling of timeoutSecs/2) rather than the actual number of polls executed (i + 1). This makes trace analysis less accurate for debugging timeout vs. debounce-exceeded scenarios.
  • Impact: Trace data shows planned attempts, not actual execution count, reducing diagnostic value for timeout investigations.
  • Suggested action: Change the trace event to include `attempt: i + 1` (actual polls executed) instead of `attempts: readyAttempts`. Low priority; current behavior is functionally correct.
  • Expected follow-up: Prefer a current-PR fix when local to changed code; defer only with rationale or linked follow-up.
  • Verification: Inspect sandbox-readiness-tracing.ts line 246: verify `addTraceEvent('not_ready', { attempt: i + 1, ... })` is used.
  • Missing regression test: Unit test asserting the trace event payload includes actual attempt count when timeout expires.
  • Done when: The local improvement is applied, or the PR notes why it should be deferred.
  • Evidence: sandbox-readiness-tracing.ts:246 shows `attempts: readyAttempts`; loop variable `i` tracks actual polls.

PRA-5 Improvement — Test name could be clearer about debounce > timeout boundary

  • Location: src/lib/onboard/sandbox-readiness-tracing.test.ts:123
  • Category: tests
  • Problem: Test at line 123 is named 'reports the Error phase (not a generic timeout) when the debounce outlasts the timeout'. A more precise name would clarify that this tests the readiness timeout expiring before the debounce window completes.
  • Impact: Test name ambiguity makes it harder to understand the specific boundary condition being verified.
  • Suggested action: Rename test to 'reports terminal Error phase when readiness timeout expires before debounce window completes' for clarity.
  • Expected follow-up: Prefer a current-PR fix when local to changed code; defer only with rationale or linked follow-up.
  • Verification: Inspect sandbox-readiness-tracing.test.ts line 123 for the updated test name.
  • Missing regression test: N/A — test exists and passes; only naming improvement needed.
  • Done when: The local improvement is applied, or the PR notes why it should be deferred.
  • Evidence: Test at line 123-147 covers debounce > timeout scenario with timeoutSecs: 2 (1 poll) vs default 30-poll debounce.

PRA-6 Improvement — Add runtime validation test for fresh-onboard Error-phase latency on real hardware

  • Location: src/lib/onboard/sandbox-readiness-tracing.test.ts
  • Category: tests
  • Problem: Validation context recommends runtime validation. The deterministic replay test covers the DGX Spark sequence, but no integration test measures actual fresh-create latency when a real Error phase occurs on healthy hardware.
  • Impact: Cannot verify the ~60s latency impact (PRA-4) on real hardware; relies on unit test mocks only.
  • Suggested action: Add an integration test (or document as future follow-up) that triggers a real Error phase during fresh onboard on healthy hardware and measures time-to-failure. If DGX Spark CI runner unavailable, document as known gap with acceptance via replay test.
  • Expected follow-up: Prefer a current-PR fix when local to changed code; defer only with rationale or linked follow-up.
  • Verification: Search for integration test that spawns real onboard and measures readiness failure latency when sandbox enters Error phase.
  • Missing regression test: Integration test measuring fresh-onboard failure latency when sandbox enters genuine Error phase (not transient), confirming it fails within ~60s and surfaces Error phase.
  • Done when: The local improvement is applied, or the PR notes why it should be deferred.
  • Evidence: Validation context verdict: runtime_validation_recommended; PR description notes DGX Spark hardware unavailable, healthy host cannot force Error branch.
Test follow-ups to resolve or justify

If these cover changed behavior, prefer adding them in this PR; otherwise state why existing coverage is enough or link the follow-up.

  • PRA-T1 Runtime validation — Add scheduled GitHub Actions workflow (weekly) running upstream_openshell_sandbox_list_error_transient_fixed against nightly OpenShell build. Comprehensive unit test coverage (18 new tests) for all debounce behaviors, env contract, rounding, edge cases, and DGX Spark replay acceptance. Missing: scheduled CI workflow for upstream fix detection (architecture gap), integration test measuring fresh-create latency with real Error phase, runtime validation on actual DGX Spark or equivalent ARM64 GPU hardware.
  • PRA-T2 Runtime validation — Add integration test measuring fresh-onboard failure latency when sandbox enters genuine Error phase on healthy hardware. Comprehensive unit test coverage (18 new tests) for all debounce behaviors, env contract, rounding, edge cases, and DGX Spark replay acceptance. Missing: scheduled CI workflow for upstream fix detection (architecture gap), integration test measuring fresh-create latency with real Error phase, runtime validation on actual DGX Spark or equivalent ARM64 GPU hardware.
  • PRA-T3 Runtime validation — When DGX Spark CI runner available, replace/augment replay with live fresh-onboard E2E. Comprehensive unit test coverage (18 new tests) for all debounce behaviors, env contract, rounding, edge cases, and DGX Spark replay acceptance. Missing: scheduled CI workflow for upstream fix detection (architecture gap), integration test measuring fresh-create latency with real Error phase, runtime validation on actual DGX Spark or equivalent ARM64 GPU hardware.
  • PRA-T4 Test name could be clearer about debounce > timeout boundary — Rename test to 'reports terminal Error phase when readiness timeout expires before debounce window completes' for clarity.
  • PRA-T5 Add runtime validation test for fresh-onboard Error-phase latency on real hardware — Add an integration test (or document as future follow-up) that triggers a real Error phase during fresh onboard on healthy hardware and measures time-to-failure. If DGX Spark CI runner unavailable, document as known gap with acceptance via replay test.
  • PRA-T6 waitForCreatedSandboxReadyWithTrace Error-phase debounce — DGX Spark fresh-onboard readiness replay test (deterministic replay); skipped upstream_openshell_sandbox_list_error_transient_fixed test as executable checkpoint. sandbox-readiness-tracing.ts:13-60 source-of-truth comment block; sandbox-readiness-tracing.test.ts:270-327 replay and skipped test
Since last review details

Current findings, using the urgency labels above:

PRA-1 Resolve/justify — Source-of-truth review needed: waitForCreatedSandboxReadyWithTrace Error-phase debounce

  • Location: not file-specific
  • Category: architecture
  • Problem: The advisor marked localized patch analysis as needs_followup.
  • Impact: A localized workaround can preserve or hide an invalid state when the source boundary is unclear.
  • Recommended action: Identify the invalid state, source boundary, source-fix constraint, regression test, and removal condition before merging the localized behavior.
  • Expected follow-up: Resolve in this PR or explain why the risk is acceptable.
  • Verification: Inspect the localized patch and source-of-truth review fields for a concrete invalid state, source boundary, source-fix constraint, regression test, and removal condition.
  • Missing regression test: DGX Spark fresh-onboard readiness replay test (deterministic replay); skipped upstream_openshell_sandbox_list_error_transient_fixed test as executable checkpoint
  • Done when: The risk is fixed or explicitly justified in the PR. Verification: Inspect the localized patch and source-of-truth review fields for a concrete invalid state, source boundary, source-fix constraint, regression test, and removal condition.
  • Evidence: sandbox-readiness-tracing.ts:13-60 source-of-truth comment block; sandbox-readiness-tracing.test.ts:270-327 replay and skipped test

PRA-2 Required — Missing scheduled CI workflow for upstream OpenShell fix detection

  • Location: .github/workflows
  • Category: architecture
  • Problem: The Error-phase debounce is a localized workaround for OpenShell gateway bug ([DGX Spark][Sandbox] sandbox enters Error phase during onboard — gateway restart recovery fails #6043). The removal-signal test `upstream_openshell_sandbox_list_error_transient_fixed` exists but has no CI automation. Without a scheduled workflow running this test against nightly OpenShell builds, the workaround may persist indefinitely after the upstream fix lands, adding unnecessary ~60s latency to genuine terminal failures.
  • Impact: Workaround persists undetected post-upstream-fix, degrading fresh-onboard UX by ~60s for real failures and accumulating technical debt.
  • Required action: Add a lightweight scheduled GitHub Actions workflow (e.g., weekly) that runs the skipped test against a nightly OpenShell build. Configure the workflow to fail when the test passes (no transient Error), alerting maintainers to remove the debounce. Reference the workflow in the source-of-truth comment and skipped test comment.
  • Expected follow-up: Fix before merge or get explicit maintainer override.
  • Verification: Search .github/workflows/ for a scheduled workflow referencing 'upstream_openshell_sandbox_list_error_transient_fixed' or 'NEMOCLAW_SANDBOX_READY_ERROR_DEBOUNCE'.
  • Missing regression test: Scheduled CI workflow that executes the skipped test against a nightly OpenShell build and fails when the transient Error no longer appears (i.e., when the workaround can be removed).
  • Done when: The required change is committed and verification passes: Search .github/workflows/ for a scheduled workflow referencing 'upstream_openshell_sandbox_list_error_transient_fixed' or 'NEMOCLAW_SANDBOX_READY_ERROR_DEBOUNCE'.
  • Evidence: sandbox-readiness-tracing.ts:58 has GitHub URL; sandbox-readiness-tracing.test.ts:317 has URL in skipped test comment; no workflow file references either.

PRA-3 Resolve/justify — Default 30-poll debounce adds ~60s latency for genuine fresh-create Error failures

  • Location: src/lib/onboard/sandbox-readiness-tracing.ts:173
  • Category: security
  • Problem: The default debounce of 30 polls (~60s at 2s interval) applies to fresh sandbox create via onboard.ts:3102, which passes no errorPhaseDebouncePolls override. A genuinely stuck Error phase on fresh create waits ~60s before surfacing, vs. original fast-fail behavior. JSDoc acknowledges trade-off but keeps conservative default; no create-specific env var exists.
  • Impact: Fresh onboard on healthy hardware hitting a real Error phase waits up to ~60s longer before failure surfaces, degrading UX and delaying failure detection.
  • Recommended action: Lower the default for fresh create (e.g., 10 polls = ~20s) since the reported DGX Spark transient lasted only 3 polls. Alternatively, add a separate env var NEMOCLAW_SANDBOX_READY_ERROR_DEBOUNCE_CREATE for create vs. reconnect contexts. At minimum, explicitly quantify the fresh-create latency impact in the JSDoc trade-off note.
  • Expected follow-up: Resolve in this PR or explain why the risk is acceptable.
  • Verification: Check onboard.ts:3102 call to waitForCreatedSandboxReadyWithTrace — confirm no errorPhaseDebouncePolls passed. Verify default 30 polls = 60s at 2s interval.
  • Missing regression test: Integration test that a fresh onboard on healthy hardware hitting a real Error phase fails within ~60s (not the full timeout) and surfaces the Error phase in the failure message.
  • Done when: The risk is fixed or explicitly justified in the PR. Verification: Check onboard.ts:3102 call to waitForCreatedSandboxReadyWithTrace — confirm no errorPhaseDebouncePolls passed. Verify default 30 polls = 60s at 2s interval.
  • Evidence: onboard.ts:3102 calls waitForCreatedSandboxReadyWithTrace without errorPhaseDebouncePolls; SANDBOX_READY_ERROR_PHASE_DEFAULT_DEBOUNCE_POLLS = 30; poll interval 2s hardcoded in loop.

PRA-4 Improvement — Timeout-path trace event logs readyAttempts (planned) not actual polls executed

  • Location: src/lib/onboard/sandbox-readiness-tracing.ts:246
  • Category: correctness
  • Problem: The trace event at line 246 (`addTraceEvent('not_ready', { attempts: readyAttempts, ... })`) records the planned attempt count (ceiling of timeoutSecs/2) rather than the actual number of polls executed (i + 1). This makes trace analysis less accurate for debugging timeout vs. debounce-exceeded scenarios.
  • Impact: Trace data shows planned attempts, not actual execution count, reducing diagnostic value for timeout investigations.
  • Suggested action: Change the trace event to include `attempt: i + 1` (actual polls executed) instead of `attempts: readyAttempts`. Low priority; current behavior is functionally correct.
  • Expected follow-up: Prefer a current-PR fix when local to changed code; defer only with rationale or linked follow-up.
  • Verification: Inspect sandbox-readiness-tracing.ts line 246: verify `addTraceEvent('not_ready', { attempt: i + 1, ... })` is used.
  • Missing regression test: Unit test asserting the trace event payload includes actual attempt count when timeout expires.
  • Done when: The local improvement is applied, or the PR notes why it should be deferred.
  • Evidence: sandbox-readiness-tracing.ts:246 shows `attempts: readyAttempts`; loop variable `i` tracks actual polls.

PRA-5 Improvement — Test name could be clearer about debounce > timeout boundary

  • Location: src/lib/onboard/sandbox-readiness-tracing.test.ts:123
  • Category: tests
  • Problem: Test at line 123 is named 'reports the Error phase (not a generic timeout) when the debounce outlasts the timeout'. A more precise name would clarify that this tests the readiness timeout expiring before the debounce window completes.
  • Impact: Test name ambiguity makes it harder to understand the specific boundary condition being verified.
  • Suggested action: Rename test to 'reports terminal Error phase when readiness timeout expires before debounce window completes' for clarity.
  • Expected follow-up: Prefer a current-PR fix when local to changed code; defer only with rationale or linked follow-up.
  • Verification: Inspect sandbox-readiness-tracing.test.ts line 123 for the updated test name.
  • Missing regression test: N/A — test exists and passes; only naming improvement needed.
  • Done when: The local improvement is applied, or the PR notes why it should be deferred.
  • Evidence: Test at line 123-147 covers debounce > timeout scenario with timeoutSecs: 2 (1 poll) vs default 30-poll debounce.

PRA-6 Improvement — Add runtime validation test for fresh-onboard Error-phase latency on real hardware

  • Location: src/lib/onboard/sandbox-readiness-tracing.test.ts
  • Category: tests
  • Problem: Validation context recommends runtime validation. The deterministic replay test covers the DGX Spark sequence, but no integration test measures actual fresh-create latency when a real Error phase occurs on healthy hardware.
  • Impact: Cannot verify the ~60s latency impact (PRA-4) on real hardware; relies on unit test mocks only.
  • Suggested action: Add an integration test (or document as future follow-up) that triggers a real Error phase during fresh onboard on healthy hardware and measures time-to-failure. If DGX Spark CI runner unavailable, document as known gap with acceptance via replay test.
  • Expected follow-up: Prefer a current-PR fix when local to changed code; defer only with rationale or linked follow-up.
  • Verification: Search for integration test that spawns real onboard and measures readiness failure latency when sandbox enters Error phase.
  • Missing regression test: Integration test measuring fresh-onboard failure latency when sandbox enters genuine Error phase (not transient), confirming it fails within ~60s and surfaces Error phase.
  • Done when: The local improvement is applied, or the PR notes why it should be deferred.
  • Evidence: Validation context verdict: runtime_validation_recommended; PR description notes DGX Spark hardware unavailable, healthy host cannot force Error branch.

Workflow run details

This is an automated, non-binding review; it still expects maintainers and agents to respond to each required or warning item. Treat suggestions as current-PR improvements when they touch changed code; defer only with maintainer rationale or a linked follow-up. A human maintainer must make the final merge decision.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🧹 Nitpick comments (2)
src/lib/onboard/docker-gpu-patch.test.ts (2)

963-1013: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

No direct unit tests for getSandboxReadyErrorDebouncePolls.

The new exported helper (env override, default fallback, Math.max(1, ...) clamping) has no dedicated coverage in this file — only exercised indirectly via the readiness-wait tests, which don't pass invalid/overridden env values.

Want me to draft tests covering default value, env override, and clamping of non-positive/invalid env values?

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/lib/onboard/docker-gpu-patch.test.ts` around lines 963 - 1013, Add direct
unit coverage for getSandboxReadyErrorDebouncePolls, since it is only exercised
indirectly by waitForCreatedSandboxReadyWithTrace. Write tests around the
helper’s env override behavior, its default fallback, and the Math.max(1, ...)
clamping for non-positive or invalid values, so the exported helper is verified
independently of the sandbox readiness flow.

963-988: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Test relies on the implicit environment-derived default debounce value.

This test doesn't pass errorPhaseDebouncePolls, so it depends on getSandboxReadyErrorDebouncePolls() reading process.env.NEMOCLAW_SANDBOX_READY_ERROR_DEBOUNCE at run time. If another test in the suite stubs/sets this env var (e.g., to test the override path) without restoring it, or a .env file sets it, this test's poll-count assertion (toHaveBeenCalledTimes(4)) could flake.

♻️ Suggested fix: pass an explicit debounce value
     const ready = waitForCreatedSandboxReadyWithTrace({
       sandboxName: "my-sandbox",
       timeoutSecs: 600,
       runCaptureOpenshell,
       isSandboxReady,
       getSandboxFailurePhase,
+      errorPhaseDebouncePolls: 30,
       sleep,
     });
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/lib/onboard/docker-gpu-patch.test.ts` around lines 963 - 988, This test
is relying on the environment-derived default debounce, which makes the polling
assertion brittle if NEMOCLAW_SANDBOX_READY_ERROR_DEBOUNCE is changed elsewhere.
Update the test around waitForCreatedSandboxReadyWithTrace to pass an explicit
errorPhaseDebouncePolls value instead of depending on
getSandboxReadyErrorDebouncePolls() at runtime. Keep the existing recovery
scenario and assertion, but make the debounce setting local to the test so the
expected runCaptureOpenshell call count stays deterministic.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@src/lib/onboard/sandbox-readiness-tracing.ts`:
- Around line 116-122: The debounce in the sandbox readiness wait is currently
applied to every non-null failure phase, but it should only apply to Error;
update the logic around getSandboxFailurePhase so Failed and CrashLoopBackOff
are treated as immediately terminal while only Error uses
errorPhaseDebouncePolls. Use the existing sandbox readiness wait loop and the
getSandboxFailurePhase helper to add a separate non-Error terminal-phase check,
preserving the current fast-fail behavior for genuinely terminal failures.

---

Nitpick comments:
In `@src/lib/onboard/docker-gpu-patch.test.ts`:
- Around line 963-1013: Add direct unit coverage for
getSandboxReadyErrorDebouncePolls, since it is only exercised indirectly by
waitForCreatedSandboxReadyWithTrace. Write tests around the helper’s env
override behavior, its default fallback, and the Math.max(1, ...) clamping for
non-positive or invalid values, so the exported helper is verified independently
of the sandbox readiness flow.
- Around line 963-988: This test is relying on the environment-derived default
debounce, which makes the polling assertion brittle if
NEMOCLAW_SANDBOX_READY_ERROR_DEBOUNCE is changed elsewhere. Update the test
around waitForCreatedSandboxReadyWithTrace to pass an explicit
errorPhaseDebouncePolls value instead of depending on
getSandboxReadyErrorDebouncePolls() at runtime. Keep the existing recovery
scenario and assertion, but make the debounce setting local to the test so the
expected runCaptureOpenshell call count stays deterministic.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: 8456ff24-a143-49bc-824c-82e24680e73a

📥 Commits

Reviewing files that changed from the base of the PR and between bdaecbc and d9d5aef.

📒 Files selected for processing (2)
  • src/lib/onboard/docker-gpu-patch.test.ts
  • src/lib/onboard/sandbox-readiness-tracing.ts

Comment thread src/lib/onboard/sandbox-readiness-tracing.ts
@github-actions

github-actions Bot commented Jul 2, 2026

Copy link
Copy Markdown
Contributor

E2E Advisor Recommendation

Required E2E: cloud-onboard, onboard-resume, onboard-repair, gpu-e2e
Optional E2E: full-e2e, gpu-double-onboard

Dispatch hint: cloud-onboard,onboard-resume,onboard-repair,gpu-e2e

Workflow run

Full advisor summary

E2E Recommendation Advisor

Base: origin/main
Head: HEAD
Confidence: high

Required E2E

  • cloud-onboard (high; hosted inference live onboarding, timeout-minutes 70): Required because the changed post-create readiness waiter can affect full hosted onboarding from source/public install through sandbox creation, readiness, policy/inference validation, and trace artifact handling.
  • onboard-resume (medium-high; live onboarding resume flow, timeout-minutes 45): Required by the onboarding resume rule because the PR changes onboarding readiness/state-transition behavior after sandbox creation; resume must prove an interrupted onboard can continue through the updated readiness semantics.
  • onboard-repair (high; live repair flow, timeout-minutes 75): Required by the onboarding resume rule because readiness/state-transition changes can affect repair decisions after partial or failed onboarding state; repair must validate recovery with the updated Error debounce behavior.
  • gpu-e2e (very high; dedicated GPU runner and cold model pull, timeout-minutes 90): Required because the PR changes the Docker GPU supervisor reconnect debounce path and the readiness change is motivated by GPU/DGX Spark transient Error behavior. Existing GPU E2E is the closest live validation for GPU sandbox lifecycle and inference readiness.

Optional E2E

  • full-e2e (high; full live E2E, timeout-minutes 75): Useful extra confidence for the complete install/onboard/sandbox verify/live inference/CLI user journey on a standard hosted-inference path, but cloud-onboard plus resume/repair already cover the merge-blocking onboarding risks.
  • gpu-double-onboard (very high; GPU live lifecycle validation): Adjacent confidence for repeated GPU onboarding/lifecycle behavior if maintainers want more coverage around transient gateway/supervisor state, but gpu-e2e is the primary required GPU validation.

New E2E recommendations

  • DGX Spark / ARM64 GPU fresh onboarding readiness (high): The PR adds deterministic unit replay for the reported DGX Spark Error->Ready transient, but existing live E2E does not appear to run on DGX Spark or an equivalent ARM64 GPU host that reproduces the OpenShell gateway re-registration/dashboard-port-fallback race.
    • Suggested test: Add a live DGX Spark or ARM64 GPU fresh-onboard E2E that captures openshell sandbox list during create, asserts transient Error polls can recover to Ready under the default debounce, and fails if Failed/CrashLoopBackOff are not fast-failed.

Dispatch hint

  • Workflow: .github/workflows/e2e.yaml
  • jobs input: cloud-onboard,onboard-resume,onboard-repair,gpu-e2e

@github-actions

github-actions Bot commented Jul 2, 2026

Copy link
Copy Markdown
Contributor

E2E Target Recommendation

Required E2E targets: ubuntu-repo-cloud-openclaw, onboard-resume, onboard-repair, gpu-e2e
Optional E2E targets: jetson-nvmap-gpu

Dispatch required E2E targets:

  • gh workflow run e2e.yaml --ref <pr-head-ref> --field targets=ubuntu-repo-cloud-openclaw
  • gh workflow run e2e.yaml --ref <pr-head-ref> --field jobs=onboard-resume
  • gh workflow run e2e.yaml --ref <pr-head-ref> --field jobs=onboard-repair
  • gh workflow run e2e.yaml --ref <pr-head-ref> --field jobs=gpu-e2e

Workflow run

Full E2E target advisor summary

E2E Target Advisor

Base: origin/main
Head: HEAD
Confidence: high

Required E2E targets

  • ubuntu-repo-cloud-openclaw: The PR changes shared sandbox create/readiness handling used during fresh OpenClaw onboarding. Run the smallest live-supported registry target that exercises standard Ubuntu Docker cloud OpenClaw onboarding and readiness validation.
    • Dispatch: gh workflow run e2e.yaml --ref <pr-head-ref> --field targets=ubuntu-repo-cloud-openclaw
  • onboard-resume: The readiness change alters onboarding phase transition behavior around created sandboxes entering Error and later Ready. Per the onboarding resume rule, onboarding state-transition changes require the onboard-resume live job.
    • Dispatch: gh workflow run e2e.yaml --ref <pr-head-ref> --field jobs=onboard-resume
  • onboard-repair: The same readiness waiter can affect repair/backstop flows that create or recover sandboxes from persisted onboarding state, so onboard-repair should run with onboard-resume rather than being treated as optional.
    • Dispatch: gh workflow run e2e.yaml --ref <pr-head-ref> --field jobs=onboard-repair
  • gpu-e2e: The PR changes Docker GPU supervisor reconnect Error-phase debounce behavior. gpu-e2e is the wired live E2E job that exercises the GPU onboarding path affected by src/lib/onboard/docker-gpu-supervisor-reconnect.ts.
    • Dispatch: gh workflow run e2e.yaml --ref <pr-head-ref> --field jobs=gpu-e2e

Optional E2E targets

  • jetson-nvmap-gpu: Optional adjacent special-runner coverage for ARM64/Jetson GPU behavior related to the Docker GPU patch path and DGX-class transient readiness context. Run only if the Jetson runner is available.
    • Dispatch: gh workflow run e2e.yaml --ref <pr-head-ref> --field jobs=jetson-nvmap-gpu

Relevant changed files

  • src/lib/onboard/docker-gpu-supervisor-reconnect.ts
  • src/lib/onboard/sandbox-readiness-tracing.ts
  • src/lib/onboard/docker-gpu-patch.test.ts
  • src/lib/onboard/sandbox-readiness-tracing.test.ts

@github-actions

github-actions Bot commented Jul 2, 2026

Copy link
Copy Markdown
Contributor

PR Review Advisor — No blocking findings

Merge posture: No blocking advisor findings
Primary next action: Add or justify PRA-T1 and any related test follow-ups.
Open items: 0 required · 0 warnings · 0 suggestions · 3 test follow-ups
Since last review: 0 prior items resolved · 2 still apply · 0 new items found

Action checklist

  • PRA-T1 Add or justify test follow-up: Runtime validation
  • PRA-T2 Add or justify test follow-up: Runtime validation
  • PRA-T3 Add or justify test follow-up: Acceptance clause
Test follow-ups to resolve or justify

If these cover changed behavior, prefer adding them in this PR; otherwise state why existing coverage is enough or link the follow-up.

  • PRA-T1 Runtime validation — Add a checked-in onboard-level mocked flow where sandbox create/readiness returns Provisioning -> Error -> Ready, then assert onboarding reaches the registration path without calling printReadinessFailure, collectSandboxCreateFailureDiagnostics, or openshell sandbox delete cleanup.. Focused unit coverage is strong for the changed waiter and negative paths, but this is sandbox lifecycle infrastructure. An onboard-boundary validation would increase confidence that the caller proceeds to registration rather than entering diagnostics/delete cleanup when the waiter observes transient Error -> Ready. The external NVBug reference also needs maintainer evidence or justification because it is not inspectable from the public issue context.
  • PRA-T2 Runtime validation — Identify existing internal evidence or add a checked-in acceptance note/test fixture showing that the public DGX Spark replay covers NVB#6395862; if the NVBug has additional symptoms, add behavior-specific coverage for those symptoms.. Focused unit coverage is strong for the changed waiter and negative paths, but this is sandbox lifecycle infrastructure. An onboard-boundary validation would increase confidence that the caller proceeds to registration rather than entering diagnostics/delete cleanup when the waiter observes transient Error -> Ready. The external NVBug reference also needs maintainer evidence or justification because it is not inspectable from the public issue context.
  • PRA-T3 Acceptance clause — [NVB#6395862](https://nvbugspro.nvidia.com/bug/6395862\) — add test evidence or identify existing coverage. The public linked issue contains only the external NVBug reference; this review could not inspect the private NVBug content. The checked-in replay covers the public GitHub symptoms, but maintainers should identify existing internal evidence or state that the public replay is the acceptance evidence for this external reference.

Workflow run details

This is an automated, non-binding review; it still expects maintainers and agents to respond to each required or warning item. Treat suggestions as current-PR improvements when they touch changed code; defer only with maintainer rationale or a linked follow-up. A human maintainer must make the final merge decision.

yimoj added 5 commits July 2, 2026 05:22
Address review feedback on the #6043 create/readiness Error debounce:

- Scope the debounce to the transient "Error" phase only. "Failed" and
  "CrashLoopBackOff" are genuinely terminal and now fast-fail immediately
  instead of burning the debounce window (CodeRabbit r3510182513, advisor
  PRA-2).
- Add a source-of-truth / removal-contract comment block mirroring
  docker-gpu-supervisor-reconnect.ts: invalid state, OpenShell sandbox-list
  cache boundary, why tolerated locally, regression evidence, removal
  condition (advisor PRA-3).
- Move the readiness-wait tests into a focused
  sandbox-readiness-tracing.test.ts (out of the docker-gpu-patch.test.ts
  hotspot) and add direct env-contract coverage (default 30, override,
  empty/non-finite/NaN/Infinity fallback, clamp-to-1, fractional
  round/truncate), non-Error immediate-terminal, counter reset on flap, and a
  deterministic replay of the reporter's DGX Spark sandbox-list sequence
  through the real waiter (advisor PRA-4, PRA-5).

Signed-off-by: Yimo Jiang <yimoj@nvidia.com>
…tract

Address second-round review on the #6043 readiness Error debounce:

- Surface the terminal Error phase (not a phase-less timeout) when the sandbox
  is still in Error on the final poll — happens when the debounce window
  outlasts a low readiness timeout, which previously misreported a stuck Error
  as "did not become ready" and dropped the phase (advisor PRA-1).
- Document the ~60s default-debounce latency trade-off and the intentional
  trunc-vs-envInt-rounding difference on the errorPhaseDebouncePolls JSDoc
  (advisor PRA-4, PRA-6).
- Add a maintainer-enableable removal-signal test
  (upstream_openshell_sandbox_list_error_transient_fixed) and a real-DGX E2E
  follow-up note on the replay fixture (advisor PRA-3, PRA-5).

Signed-off-by: Yimo Jiang <yimoj@nvidia.com>
Third-round review (PR Review Advisor Nemotron):

- Round the programmatic errorPhaseDebouncePolls override (Math.round) so it
  matches the env-var path's envInt rounding — one consistent rule across both
  entry points (PRA-3).
- Document the removal-signal tracking mechanism in the source-of-truth block:
  the maintainer-enabled upstream_openshell_sandbox_list_error_transient_fixed
  test is the executable checkpoint; escalate to a tracking issue if the
  workaround outlives a release cycle (PRA-2).
- Expand the errorPhaseDebouncePolls JSDoc to call out the fresh-create latency
  trade-off and justify the conservative 30-poll default (re-registration
  scales with host/gateway speed; a too-low default risks re-introducing #6043;
  env-tunable) (PRA-4).

Signed-off-by: Yimo Jiang <yimoj@nvidia.com>
…racker

Fourth-round review (PR Review Advisor Nemotron):

- Align the docker-gpu-supervisor-reconnect.ts programmatic override to
  Math.round so both onboard debounce modules and the env-var path share one
  rounding rule (PRA-5).
- Reference NemoClaw #6043 as the removal tracker in the source-of-truth block
  and the removal-signal test comment, so the workaround has a concrete tracking
  handle without inventing a duplicate issue (PRA-2, PRA-3).

Signed-off-by: Yimo Jiang <yimoj@nvidia.com>
Fifth-round review (PR Review Advisor Nemotron):

- Document the new NEMOCLAW_SANDBOX_READY_ERROR_DEBOUNCE env var (default 30,
  Error-only scope, K=1 fast-fail opt-out) in the commands + commands-nemohermes
  env-var tables, and add a troubleshooting entry for the "entered Error phase
  before it became ready" message — mirroring the existing sibling docs for
  NEMOCLAW_DOCKER_GPU_SUPERVISOR_RECONNECT_ERROR_DEBOUNCE (PRA-5).
- Add the full NemoClaw #6043 issue URL to the source-of-truth block and the
  removal-signal test comment as the removal tracker (PRA-2, PRA-3).

Signed-off-by: Yimo Jiang <yimoj@nvidia.com>
@github-actions

github-actions Bot commented Jul 2, 2026

Copy link
Copy Markdown
Contributor

@yimoj yimoj added the v0.0.73 label Jul 2, 2026
@wscurran wscurran added area: onboarding Onboarding FSM, provider setup, sandbox launch, or first-run flow area: sandbox OpenShell sandbox lifecycle, runtime, config, or recovery bug-fix PR fixes a bug or regression platform: dgx-spark Affects DGX Spark hardware or workflows labels Jul 2, 2026
@wscurran

wscurran commented Jul 2, 2026

Copy link
Copy Markdown
Contributor

@cv cv added v0.0.74 and removed v0.0.73 labels Jul 2, 2026
@github-actions

github-actions Bot commented Jul 3, 2026

Copy link
Copy Markdown
Contributor

Vitest E2E Target Results — ✅ All selected jobs passed

Run: 28636624709
Workflow ref: fix/6043-dgx-spark-sandbox-error
Requested targets: ubuntu-repo-cloud-openclaw
Requested jobs: (default — all default-enabled free-standing jobs; explicit-only jobs openshell-gateway-auth-contract, jetson-nvmap-gpu, and sandbox-rlimits-connect are skipped unless selected)
Summary: 1 passed, 0 failed, 0 cancelled, 0 skipped

Job Result
live ✅ success

@github-actions

github-actions Bot commented Jul 3, 2026

Copy link
Copy Markdown
Contributor

Vitest E2E Target Results — ✅ All requested jobs passed

Run: 28636624715
Workflow ref: fix/6043-dgx-spark-sandbox-error
Requested targets: (default — all supported)
Requested jobs: onboard-resume,onboard-repair,gpu-e2e
Summary: 3 passed, 0 failed, 0 cancelled, 0 skipped

Job Result
gpu-e2e ✅ success
onboard-repair ✅ success
onboard-resume ✅ success

@cv cv left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reviewed the Error-only debounce, bounded failure behavior, source-of-truth/removal contract, deterministic DGX replay, and focused tests. I accept the 30-poll default: it covers slower DGX-class registration while remaining bounded well below the readiness timeout and is operator-configurable. I am overriding the separate scheduled-nightly suggestion because #6043 plus the executable removal checkpoint provide a concrete tracking path, while no stable upstream nightly signal is defined; adding a privileged scheduled workflow is not warranted in this fix. All four required exact-head E2E targets passed; CI, CodeRabbit, GPT PR Advisor, DCO, and verification are clean. Approved for v0.0.74.

@cv
cv merged commit f09d538 into main Jul 3, 2026
209 of 212 checks passed
@cv
cv deleted the fix/6043-dgx-spark-sandbox-error branch July 3, 2026 04:00
@ericksoa ericksoa mentioned this pull request Jul 4, 2026
21 tasks
ericksoa added a commit that referenced this pull request Jul 4, 2026
<!-- markdownlint-disable MD041 -->
## Summary
This PR prepares the user-facing documentation for v0.0.74 before the
release plan is frozen.
It expands the release notes across the 56-commit train and closes
durable documentation gaps found during the pre-tag commit scan.

## Changes
- Expand the `v0.0.74` release notes to cover OpenShell 0.0.72, managed
MCP, progressive tool disclosure, LangChain Deep Agents Code,
onboarding, local inference, messaging, recovery, and contributor
workflows.
- Correct the `destroy` contract for retained per-name volumes,
gateway-unreachable `--force` cleanup, managed MCP ownership, and
same-name recovery.
- Document separate remediation for an unreachable container DNS
resolver versus one that answers with `NXDOMAIN` or `REFUSED`.
- Document the Windows on Arm N1X automatic Ollama safeguard and its
remaining large-model limitations.
- State that messaging conflicts abort rebuild before backup or
deletion, leaving the original sandbox intact.
- Link the agent-runnable value benchmark from the contributor task
index.
- Synchronize generated agent command variants.
- Validate with `npm run docs:sync-agent-variants` and `npm run docs`;
Fern completed with 0 errors and 2 existing warnings.
- Source summary:
- [#6020](#6020) and
[#5876](#5876) ->
`docs/about/release-notes.mdx`: Consolidate the OpenShell 0.0.72 policy
boundary and managed MCP lifecycle.
- [#6251](#6251) and
[#5989](#5989) ->
`docs/about/release-notes.mdx`: Summarize progressive tool disclosure
and sandbox-first inference controls.
- [#6232](#6232),
[#6082](#6082),
[#6219](#6219),
[#6214](#6214),
[#6215](#6215),
[#6230](#6230), and
[#6260](#6260) ->
`docs/about/release-notes.mdx`: Summarize the experimental LangChain
Deep Agents Code status, secret, version, rebuild, snapshot, and MCP
boundaries.
- [#6166](#6166),
[#6254](#6254),
[#6265](#6265),
[#6164](#6164), and
[#6017](#6017) ->
`docs/about/release-notes.mdx`: Summarize BuildKit prebuild, validated
image reuse, bounded readiness, and preflight improvements.
- [#6150](#6150) ->
`docs/about/release-notes.mdx` and `docs/reference/troubleshooting.mdx`:
Separate unreachable-resolver remediation from reachable-but-rejected
DNS responses.
- [#6234](#6234) ->
`docs/about/release-notes.mdx`,
`docs/inference/use-local-inference.mdx`, and
`docs/get-started/windows-preparation.mdx`: Document N1X automatic 9B
selection and the remaining explicit-large-model boundary.
- [#6129](#6129),
[#5987](#5987),
[#5955](#5955), and
[#6220](#6220) ->
`docs/about/release-notes.mdx`,
`docs/manage-sandboxes/messaging-channels.mdx`,
`docs/reference/commands.mdx`, and
`docs/reference/commands-nemohermes.mdx`: Document messaging policy
persistence, status, and the pre-destructive conflict check.
- [#5963](#5963),
[#6050](#6050),
[#6094](#6094),
[#6238](#6238),
[#5988](#5988),
[#6235](#6235),
[#6181](#6181), and
[#5986](#5986) ->
`docs/about/release-notes.mdx`, `docs/reference/commands.mdx`, and
`docs/reference/commands-nemohermes.mdx`: Summarize day-two recovery and
clarify retained-volume and local-only destroy semantics.
- [#6200](#6200),
[#6248](#6248),
[#6168](#6168),
[#6270](#6270), and
[#5649](#5649) ->
`docs/about/release-notes.mdx` and `CONTRIBUTING.md`: Summarize
contributor setup and verification improvements and expose the advisory
value benchmark.

## Type of Change

- [ ] Code change (feature, bug fix, or refactor)
- [ ] Code change with doc updates
- [ ] Doc only (prose changes, no code sample modifications)
- [x] Doc only (includes code sample changes)

## Quality Gates
<!-- Check exactly one tests line and one docs line. Check other lines
when applicable. Add every requested justification or approval
reference. -->
- [ ] Tests added or updated for changed behavior
- [ ] Existing tests cover changed behavior — justification:
- [x] Tests not applicable — justification: documentation-only release
preparation; generated-variant synchronization and the Fern docs build
validate the changed pages and routes.
- [x] Docs updated for user-facing behavior changes
- [ ] Docs not applicable — justification:
- [ ] Sensitive paths changed (security, policy, credentials, preflight,
onboarding, inference, runner, sandbox, or messaging)
- [ ] Sensitive-path review completed or maintainer-approved waiver
recorded — reviewer/approval link/justification:
- [ ] Non-success, skipped, or missing CI check accepted by maintainer —
check name, approval link, and follow-up issue:

## Verification
<!-- Check each applicable item only when supported by the requested
evidence. Run targeted tests once per relevant change set and rerun
after later edits or hook autofixes that can affect the tested behavior.
Do not rerun hook-covered checks. -->
- [x] PR description includes the DCO sign-off declaration and every
commit appears as `Verified` in GitHub
- [x] Normal `pre-commit`, `commit-msg`, and `pre-push` hooks passed, or
`npm run check:diff` passed when hooks were skipped or unavailable
- [x] Targeted behavior tests pass for the current change set, or tests
are marked not applicable above — command/result or justification: tests
are not applicable to this documentation-only change; `npm run docs`
validates the source and generated routes.
- [ ] Applicable broad gate passed — `npm test` for broad
runtime/test-harness changes; `npm run check` for repo-wide
validation/coverage changes — command/result:
- [x] Quality Gates section completed with required justifications or
waivers
- [x] No secrets, API keys, or credentials committed
- [ ] `npm run docs` builds without warnings (doc changes only)
- [x] Doc pages follow the [style
guide](https://github.com/NVIDIA/NemoClaw/blob/main/docs/CONTRIBUTING.md)
(doc changes only)
- [ ] New doc pages include SPDX header and frontmatter (new pages only)

---
<!-- DCO sign-off is required in this PR description, and every commit
must appear as Verified in GitHub. Run: git config user.name && git
config user.email -->
Signed-off-by: Aaron Erickson <aerickson@nvidia.com>


<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

* **Documentation**
* Expanded setup guidance for Windows on Arm devices with safer default
local model selection.
* Clarified local inference and sandbox messaging behavior, including
conflict checks before rebuilds and safer recovery steps.
* Updated destroy/rebuild/reference docs with more detailed warnings,
failure handling, and volume-retention guidance.
* Improved troubleshooting instructions for Docker DNS issues with
clearer paths for unreachable vs. blocked resolvers.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->

---------

Signed-off-by: Aaron Erickson <aerickson@nvidia.com>
Hadar301 pushed a commit to Hadar301/NemoClaw-OpenShift that referenced this pull request Jul 12, 2026
…VIDIA#6043) (NVIDIA#6164)

## Summary

On a fresh `nemoclaw onboard`, the OpenShell gateway can (re)start its
supervisor session and re-register the just-created sandbox. During that
window `openshell sandbox list` briefly reports the sandbox in the
transient **Error** phase before it flips to **Ready** (observed on DGX
Spark, where the dashboard port fallback `18789 → 18794` and the
supervisor restart race the sandbox bootstrap). The create/readiness
waiter fast-failed on the *first* Error poll, turning a recoverable
transient into a terminal onboard failure. This PR applies a bounded
consecutive-**Error** debounce so the transient recovers, while
genuinely terminal phases still fail immediately.

## Related Issue

Fixes NVIDIA#6043

## Changes

- `src/lib/onboard/sandbox-readiness-tracing.ts`:
`waitForCreatedSandboxReadyWithTrace` now requires **consecutive Error**
polls before declaring a terminal failure, instead of bailing on the
first Error poll. Default is 30 polls (~60s at the 2s poll interval),
configurable via `NEMOCLAW_SANDBOX_READY_ERROR_DEBOUNCE`; the counter
resets on any non-Error poll so only *sustained* Error is terminal.
Mirrors the existing `docker-gpu-supervisor-reconnect.ts` debounce.
- **Debounce is scoped to `Error` only.** `Failed` and
`CrashLoopBackOff` are genuinely terminal and still fast-fail
immediately (addresses CodeRabbit `r3510182513` and PR Review Advisor
PRA-2).
- Terminal failures are **not** hidden: sustained Error still fast-fails
after the bounded window (well before the readiness timeout), and the
caller still captures full failure diagnostics
(`collectSandboxCreateFailureDiagnostics`). Callers can pass
`errorPhaseDebouncePolls: 1` to restore the original fast-fail.
- Added a source-of-truth / removal-contract comment block (invalid
state → OpenShell `sandbox list` cache boundary → why tolerated locally
→ regression evidence → removal condition), mirroring
`docker-gpu-supervisor-reconnect.ts` (PRA-3).
- Added `transient_failure_phase` trace event and `last_failure_phase`
on the timeout trace.
- Tests moved into a focused
`src/lib/onboard/sandbox-readiness-tracing.test.ts` (out of the
`docker-gpu-patch.test.ts` hotspot, which shrinks; PRA-4). New direct
coverage: default `30`, env override, empty/non-finite
(`""`/`abc`/`NaN`/`Infinity`) fallback, clamp-to-1, fractional rounding
(env) and truncation (param) semantics, non-Error immediate-terminal,
counter reset on flap, and a **deterministic replay of the reporter's
DGX Spark `sandbox list` sequence** through the real waiter (PRA-5).

## Type of Change

- [x] Code change (feature, bug fix, or refactor)

## Quality Gates
- [x] Tests added or updated for changed behavior
- [x] Docs not applicable — justification: internal onboarding
readiness-wait timing/recovery; no user-facing doc surface.
- [x] Sensitive paths changed (security, policy, credentials, preflight,
onboarding, inference, runner, sandbox, or messaging)
- [x] Sensitive-path review completed or maintainer-approved waiver
recorded — reviewer/approval link/justification: high-effort
`/code-review` on the diff returned no findings; CodeRabbit
`r3510182513` (Error-only scoping) and PR Review Advisor items
PRA-2/PRA-3/PRA-4/PRA-5 addressed in code/tests; change reuses the
reviewed supervisor-reconnect debounce pattern.

## Verification
- [x] PR description includes the DCO sign-off declaration and every
commit appears as `Verified` in GitHub
- [x] Targeted tests pass — `vitest run
src/lib/onboard/sandbox-readiness-tracing.test.ts
src/lib/onboard/docker-gpu-patch.test.ts` (70 tests)
- [x] Full `npm test` (cli lane) passes — `vitest run --project cli`:
508 files / 5336 tests
- [x] Biome check clean on changed files
- [x] No secrets, API keys, or credentials committed

### E2E / reproduction

DGX Spark hardware was unavailable in this session, and the failure is a
**timing-dependent transient Error** during gateway re-registration that
cannot be forced deterministically on substitute GPU hardware (a healthy
onboard on the available Linux/GPU host `yimoj-colossus-dev` would not
enter the Error branch). Per the acceptance guidance, the fix is gated
by a **checked-in deterministic replay**
(`sandbox-readiness-tracing.test.ts` → "DGX Spark fresh-onboard
readiness replay (NVIDIA#6043)") that drives the reporter's exact `sandbox
list` sequence through the real readiness waiter: the pre-fix (`K=1`)
path reproduces the exact reporter line and the shipped default recovers
to Ready.

The same replay against the built `dist/` shipped code:

```
[transient Error (default) -> recovers]              polls=5 {"ready":true,"reason":"ready","failurePhase":null}
[Failed (default) -> immediate terminal]             polls=2 {"ready":false,"reason":"terminal_failure_phase","failurePhase":"Failed"}
[CrashLoopBackOff (default) -> immediate terminal]   polls=2 {"ready":false,"reason":"terminal_failure_phase","failurePhase":"CrashLoopBackOff"}
```

A **real worktree-CLI onboard** was also run on this host to prove the
changed readiness waiter runs in the real command path without
regression (`node ./bin/nemoclaw.js onboard --non-interactive --yes
--fresh --no-gpu --no-sandbox-gpu --agent openclaw --name
nemoclaw-6043-e2e`):

```
  Creating sandbox in gateway...
  Built image openshell/sandbox-from:1782969910
  Waiting for sandbox to become ready...          <- waitForCreatedSandboxReadyWithTrace (changed code)
  Sandbox reported Ready before create stream exited; continuing.
  ✓ Sandbox 'nemoclaw-6043-e2e' created
  ✓ OpenClaw gateway launched inside sandbox
```

`openshell sandbox list` afterward: `nemoclaw-6043-e2e ... Ready`. This
exercises the changed waiter on the happy path (no Error branch, since
the DGX Spark transient cannot be forced on a healthy non-DGX host); the
Error-recovery branch is covered by the deterministic replay above.

---
Signed-off-by: Yimo Jiang <yimoj@nvidia.com>


<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **New Features**
* Added configurable tolerance for transient **Error** phases during
post-create sandbox readiness, with env-based default and a minimum of
1.
* Supports overriding the tolerated **Error** poll count (including
rounding for non-integers).

* **Bug Fixes**
* Improved readiness failure reporting: sustained **Error** now ends as
a terminal **Error** (even when the debounce window expires), while
other terminal phases still fail immediately.

* **Documentation**
* Documented the new tuning variable and the troubleshooting scenario
for “entered Error phase before it became ready”.

* **Tests**
* Expanded and reorganized readiness tracing coverage for debounce,
recovery, streak reset, and timeout/debounce edge cases.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->

---------

Signed-off-by: Yimo Jiang <yimoj@nvidia.com>
Hadar301 pushed a commit to Hadar301/NemoClaw-OpenShift that referenced this pull request Jul 12, 2026
<!-- markdownlint-disable MD041 -->
## Summary
This PR prepares the user-facing documentation for v0.0.74 before the
release plan is frozen.
It expands the release notes across the 56-commit train and closes
durable documentation gaps found during the pre-tag commit scan.

## Changes
- Expand the `v0.0.74` release notes to cover OpenShell 0.0.72, managed
MCP, progressive tool disclosure, LangChain Deep Agents Code,
onboarding, local inference, messaging, recovery, and contributor
workflows.
- Correct the `destroy` contract for retained per-name volumes,
gateway-unreachable `--force` cleanup, managed MCP ownership, and
same-name recovery.
- Document separate remediation for an unreachable container DNS
resolver versus one that answers with `NXDOMAIN` or `REFUSED`.
- Document the Windows on Arm N1X automatic Ollama safeguard and its
remaining large-model limitations.
- State that messaging conflicts abort rebuild before backup or
deletion, leaving the original sandbox intact.
- Link the agent-runnable value benchmark from the contributor task
index.
- Synchronize generated agent command variants.
- Validate with `npm run docs:sync-agent-variants` and `npm run docs`;
Fern completed with 0 errors and 2 existing warnings.
- Source summary:
- [NVIDIA#6020](NVIDIA#6020) and
[NVIDIA#5876](NVIDIA#5876) ->
`docs/about/release-notes.mdx`: Consolidate the OpenShell 0.0.72 policy
boundary and managed MCP lifecycle.
- [NVIDIA#6251](NVIDIA#6251) and
[NVIDIA#5989](NVIDIA#5989) ->
`docs/about/release-notes.mdx`: Summarize progressive tool disclosure
and sandbox-first inference controls.
- [NVIDIA#6232](NVIDIA#6232),
[NVIDIA#6082](NVIDIA#6082),
[NVIDIA#6219](NVIDIA#6219),
[NVIDIA#6214](NVIDIA#6214),
[NVIDIA#6215](NVIDIA#6215),
[NVIDIA#6230](NVIDIA#6230), and
[NVIDIA#6260](NVIDIA#6260) ->
`docs/about/release-notes.mdx`: Summarize the experimental LangChain
Deep Agents Code status, secret, version, rebuild, snapshot, and MCP
boundaries.
- [NVIDIA#6166](NVIDIA#6166),
[NVIDIA#6254](NVIDIA#6254),
[NVIDIA#6265](NVIDIA#6265),
[NVIDIA#6164](NVIDIA#6164), and
[NVIDIA#6017](NVIDIA#6017) ->
`docs/about/release-notes.mdx`: Summarize BuildKit prebuild, validated
image reuse, bounded readiness, and preflight improvements.
- [NVIDIA#6150](NVIDIA#6150) ->
`docs/about/release-notes.mdx` and `docs/reference/troubleshooting.mdx`:
Separate unreachable-resolver remediation from reachable-but-rejected
DNS responses.
- [NVIDIA#6234](NVIDIA#6234) ->
`docs/about/release-notes.mdx`,
`docs/inference/use-local-inference.mdx`, and
`docs/get-started/windows-preparation.mdx`: Document N1X automatic 9B
selection and the remaining explicit-large-model boundary.
- [NVIDIA#6129](NVIDIA#6129),
[NVIDIA#5987](NVIDIA#5987),
[NVIDIA#5955](NVIDIA#5955), and
[NVIDIA#6220](NVIDIA#6220) ->
`docs/about/release-notes.mdx`,
`docs/manage-sandboxes/messaging-channels.mdx`,
`docs/reference/commands.mdx`, and
`docs/reference/commands-nemohermes.mdx`: Document messaging policy
persistence, status, and the pre-destructive conflict check.
- [NVIDIA#5963](NVIDIA#5963),
[NVIDIA#6050](NVIDIA#6050),
[NVIDIA#6094](NVIDIA#6094),
[NVIDIA#6238](NVIDIA#6238),
[NVIDIA#5988](NVIDIA#5988),
[NVIDIA#6235](NVIDIA#6235),
[NVIDIA#6181](NVIDIA#6181), and
[NVIDIA#5986](NVIDIA#5986) ->
`docs/about/release-notes.mdx`, `docs/reference/commands.mdx`, and
`docs/reference/commands-nemohermes.mdx`: Summarize day-two recovery and
clarify retained-volume and local-only destroy semantics.
- [NVIDIA#6200](NVIDIA#6200),
[NVIDIA#6248](NVIDIA#6248),
[NVIDIA#6168](NVIDIA#6168),
[NVIDIA#6270](NVIDIA#6270), and
[NVIDIA#5649](NVIDIA#5649) ->
`docs/about/release-notes.mdx` and `CONTRIBUTING.md`: Summarize
contributor setup and verification improvements and expose the advisory
value benchmark.

## Type of Change

- [ ] Code change (feature, bug fix, or refactor)
- [ ] Code change with doc updates
- [ ] Doc only (prose changes, no code sample modifications)
- [x] Doc only (includes code sample changes)

## Quality Gates
<!-- Check exactly one tests line and one docs line. Check other lines
when applicable. Add every requested justification or approval
reference. -->
- [ ] Tests added or updated for changed behavior
- [ ] Existing tests cover changed behavior — justification:
- [x] Tests not applicable — justification: documentation-only release
preparation; generated-variant synchronization and the Fern docs build
validate the changed pages and routes.
- [x] Docs updated for user-facing behavior changes
- [ ] Docs not applicable — justification:
- [ ] Sensitive paths changed (security, policy, credentials, preflight,
onboarding, inference, runner, sandbox, or messaging)
- [ ] Sensitive-path review completed or maintainer-approved waiver
recorded — reviewer/approval link/justification:
- [ ] Non-success, skipped, or missing CI check accepted by maintainer —
check name, approval link, and follow-up issue:

## Verification
<!-- Check each applicable item only when supported by the requested
evidence. Run targeted tests once per relevant change set and rerun
after later edits or hook autofixes that can affect the tested behavior.
Do not rerun hook-covered checks. -->
- [x] PR description includes the DCO sign-off declaration and every
commit appears as `Verified` in GitHub
- [x] Normal `pre-commit`, `commit-msg`, and `pre-push` hooks passed, or
`npm run check:diff` passed when hooks were skipped or unavailable
- [x] Targeted behavior tests pass for the current change set, or tests
are marked not applicable above — command/result or justification: tests
are not applicable to this documentation-only change; `npm run docs`
validates the source and generated routes.
- [ ] Applicable broad gate passed — `npm test` for broad
runtime/test-harness changes; `npm run check` for repo-wide
validation/coverage changes — command/result:
- [x] Quality Gates section completed with required justifications or
waivers
- [x] No secrets, API keys, or credentials committed
- [ ] `npm run docs` builds without warnings (doc changes only)
- [x] Doc pages follow the [style
guide](https://github.com/NVIDIA/NemoClaw/blob/main/docs/CONTRIBUTING.md)
(doc changes only)
- [ ] New doc pages include SPDX header and frontmatter (new pages only)

---
<!-- DCO sign-off is required in this PR description, and every commit
must appear as Verified in GitHub. Run: git config user.name && git
config user.email -->
Signed-off-by: Aaron Erickson <aerickson@nvidia.com>


<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

* **Documentation**
* Expanded setup guidance for Windows on Arm devices with safer default
local model selection.
* Clarified local inference and sandbox messaging behavior, including
conflict checks before rebuilds and safer recovery steps.
* Updated destroy/rebuild/reference docs with more detailed warnings,
failure handling, and volume-retention guidance.
* Improved troubleshooting instructions for Docker DNS issues with
clearer paths for unreachable vs. blocked resolvers.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->

---------

Signed-off-by: Aaron Erickson <aerickson@nvidia.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area: onboarding Onboarding FSM, provider setup, sandbox launch, or first-run flow area: sandbox OpenShell sandbox lifecycle, runtime, config, or recovery bug-fix PR fixes a bug or regression platform: dgx-spark Affects DGX Spark hardware or workflows

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[DGX Spark][Sandbox] sandbox enters Error phase during onboard — gateway restart recovery fails

3 participants