fix(sandbox): let destroy --force clean up when the OpenShell gateway is down (#6046) - #6050
Conversation
… is down (#6046) When the gateway is not listening, every gateway call (including the final sandbox delete) returns a connection-refused/transport error. destroy treated that as fatal with no bypass, so a sandbox could not be removed while the gateway was down — unlike status/doctor, which auto-start it. Classify gateway-transport delete failures (isGatewayUnreachableDeleteOutput) separately from real rejections. Under --force, fall back to local cleanup (remove the registry entry/local artifacts) with a clear warning that the sandbox may persist if the gateway returns; gateway teardown is skipped since the delete was not confirmed. Without --force, destroy still fails but now points at starting the gateway or re-running with --force. Real (non-transport) delete errors stay fatal. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Signed-off-by: Jason Ma <jama@nvidia.com>
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: CHILL Plan: Enterprise Run ID: 📒 Files selected for processing (3)
💤 Files with no reviewable changes (3)
📝 WalkthroughWalkthroughAdds gateway-unreachable detection to sandbox delete outcomes and updates destroy so ChangesGateway-Unreachable Destroy Handling
Estimated code review effort: 4 (Complex) | ~45 minutes Sequence Diagram(s)sequenceDiagram
participant CLI
participant destroySandbox
participant getSandboxDeleteOutcome
participant registry
participant tunnelServices
CLI->>destroySandbox: destroy --force
destroySandbox->>getSandboxDeleteOutcome: inspect openshell delete result
getSandboxDeleteOutcome-->>destroySandbox: gatewayUnreachable=true
destroySandbox->>registry: remove local sandbox record
destroySandbox->>tunnelServices: skip shared teardown on forcedLocalCleanup
destroySandbox-->>CLI: success or failure with guidance
Suggested reviewers: 🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
Comment |
Code Coverage OverviewLanguages: TypeScript TypeScript / code-coverage/pluginThe overall coverage in the Show a code coverage summary of the most covered files.
TypeScript / code-coverage/cliThe overall coverage in the Show a code coverage summary of the most covered files.
Updated |
E2E Advisor RecommendationRequired E2E: Dispatch hint: Full advisor summaryE2E Recommendation AdvisorBase: Required E2E
Optional E2E
New E2E recommendations
Dispatch hint
|
E2E Target RecommendationRequired E2E targets: Dispatch required E2E targets:
Full E2E target advisor summaryE2E Target AdvisorBase: Required E2E targets
Optional E2E targets
Relevant changed files
|
PR Review Advisor — Changes requestedMerge posture: Do not merge yet Action checklist
Findings index
Review findings by urgency: 0 required fixes, 6 items to resolve/justify, 0 in-scope improvements
|
PR Review Advisor (Nemotron Ultra) — BlockedMerge posture: Do not merge until addressed Action checklist
Findings index
🚨 Required before mergeAddress these before merging unless a maintainer explicitly overrides the advisor with rationale.
|
There was a problem hiding this comment.
Actionable comments posted: 1
🤖 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/actions/sandbox/destroy.ts`:
- Around line 434-439: The host-service shutdown decision is using
forcedLocalCleanup as if the sandbox delete was confirmed, which can stop shared
services for a sandbox that may still exist. Update destroy.ts so
shouldStopHostServicesAfterDestroy() receives only the real delete-confirmed
state from deleteSucceededOrAlreadyGone (or alreadyGone), and keep
forcedLocalCleanup limited to local artifact cleanup in the destroy flow. Verify
the call site around shouldStopHostServicesAfterDestroy and the destroy cleanup
path do not let forcedLocalCleanup bypass the public delete confirmation
boundary.
🪄 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: ce1277fe-b9c8-4ec1-a7ea-8e32bdc0c57d
📒 Files selected for processing (4)
src/lib/actions/sandbox/destroy.tssrc/lib/domain/sandbox/destroy.test.tssrc/lib/domain/sandbox/destroy.tstest/cli/destroy-gateway-unreachable.test.ts
…onsumers (#6046) getSandboxDeleteOutcome now returns a third field (gatewayUnreachable); update the image-cleanup equality assertion and the snapshot test mock to match, fixing the cli-test-shards (5) failure. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Signed-off-by: Jason Ma <jama@nvidia.com>
…eanup (#6046) Forced local cleanup (gateway unreachable + --force) removes the local sandbox record but cannot confirm the gateway-side delete — the sandbox may still exist. The host-service teardown decision passed `deleteSucceededOrAlreadyGone || forcedLocalCleanup` into shouldStopHostServicesAfterDestroy(), so a forced cleanup of the last registered sandbox would stop shared host services for a sandbox that was never confirmed deleted (CodeRabbit review on #6050). Gate host-service teardown on the confirmed delete state only, matching the neighboring gateway-cleanup decision. Add a destroy-flow regression test asserting stopAll() is not called when --force cleans up the last sandbox with the gateway down. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Signed-off-by: Jason Ma <jama@nvidia.com>
There was a problem hiding this comment.
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
src/lib/actions/sandbox/destroy.ts (1)
422-432: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick winFinal success message contradicts the forced-cleanup warning.
Line 492 unconditionally prints
✓ Sandbox '${sandboxName}' destroyedeven whenforcedLocalCleanupis true. But the warnings just printed at lines 429-431 explicitly say the gateway-side delete was never confirmed and the sandbox "may still exist." Ending with an unqualified success checkmark contradicts that warning and could lead users to believe cleanup is fully done and stop following up (e.g. never runningopenshell sandbox deleteonce the gateway returns).🪄 Proposed fix
- console.log(` ${G}✓${R} Sandbox '${sandboxName}' destroyed`); + if (forcedLocalCleanup) { + console.log( + ` ${G}✓${R} Local record for '${sandboxName}' removed; gateway-side delete unconfirmed.`, + ); + } else { + console.log(` ${G}✓${R} Sandbox '${sandboxName}' destroyed`); + }As per path instructions, "Destructive lifecycle operations must validate before mutation, preserve state/backup invariants, and cover failure, recovery, rebuild, and resume behavior without bypassing the public action boundary."
Also applies to: 486-492
🤖 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/actions/sandbox/destroy.ts` around lines 422 - 432, The final success message in destroy flow is misleading when forcedLocalCleanup is true, because the sandbox was only removed locally and the gateway-side delete was not confirmed. Update the success reporting in destroy.ts around the forcedLocalCleanup branch and the final success print so that the checkmark message is conditional on a confirmed remote destroy; otherwise emit a clearly qualified message that reflects the local-only cleanup state. Use forcedLocalCleanup, sandboxName, and the existing success/warning logging in destroy() to keep the wording consistent.Source: Path instructions
🧹 Nitpick comments (1)
src/lib/actions/sandbox/destroy-flow.test.ts (1)
186-205: 🎯 Functional Correctness | 🔵 Trivial | ⚡ Quick winGood regression coverage for the host-service gating fix.
Asserts observable side effects (
removeSandboxSpycalled,stopAllSpy/cleanupGatewaySpynot called, noprocess.exit) via the publicdestroySandboxcall rather than internal implementation details — solid behavioral test for the#6046fix.Consider also asserting the console output doesn't falsely claim full success, given the sibling
destroy.tscomment about the misleading "✓ destroyed" message on the forced-cleanup path.🤖 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/actions/sandbox/destroy-flow.test.ts` around lines 186 - 205, The forced-cleanup regression test should also verify the user-facing output from destroySandbox does not report a misleading full-success message on the gateway-unconfirmed path. Update the existing destroy-flow test to assert the relevant console/logger output from createDestroyHarness or the destroySandbox call excludes the “✓ destroyed” success text when deleteStatus/deleteOutput indicate the unconfirmed cleanup case. Keep the focus on observable behavior alongside the existing stopAllSpy, cleanupGatewaySpy, and exitSpy assertions.
🤖 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.
Outside diff comments:
In `@src/lib/actions/sandbox/destroy.ts`:
- Around line 422-432: The final success message in destroy flow is misleading
when forcedLocalCleanup is true, because the sandbox was only removed locally
and the gateway-side delete was not confirmed. Update the success reporting in
destroy.ts around the forcedLocalCleanup branch and the final success print so
that the checkmark message is conditional on a confirmed remote destroy;
otherwise emit a clearly qualified message that reflects the local-only cleanup
state. Use forcedLocalCleanup, sandboxName, and the existing success/warning
logging in destroy() to keep the wording consistent.
---
Nitpick comments:
In `@src/lib/actions/sandbox/destroy-flow.test.ts`:
- Around line 186-205: The forced-cleanup regression test should also verify the
user-facing output from destroySandbox does not report a misleading full-success
message on the gateway-unconfirmed path. Update the existing destroy-flow test
to assert the relevant console/logger output from createDestroyHarness or the
destroySandbox call excludes the “✓ destroyed” success text when
deleteStatus/deleteOutput indicate the unconfirmed cleanup case. Keep the focus
on observable behavior alongside the existing stopAllSpy, cleanupGatewaySpy, and
exitSpy assertions.
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Enterprise
Run ID: 18e8868e-fef4-4999-82f7-51d67ce34943
📒 Files selected for processing (2)
src/lib/actions/sandbox/destroy-flow.test.tssrc/lib/actions/sandbox/destroy.ts
…6046) Integrate origin/main into fix/6046-destroy-force-gateway-down. main wrapped the destroy destructive path (wipe + active-timer shieldsUp hardening + provider detach + delete) in withTimerBoundShieldsMutationLock, returning a fail-closed {ok:false} on delete failure. This branch added the --force gateway-unreachable local-cleanup fallback (#6046). Resolution folds the forcedLocalCleanup decision inside the lock: an unreachable-gateway delete under --force returns ok:true (proceed to local cleanup) instead of failing closed, while every other delete failure still preserves the hardened locked state. gatewayUnreachable is surfaced to the post-lock failure branch so the no --force path keeps main's error plus the recovery hint. deleteSucceededOrAlreadyGone stays false for forcedLocalCleanup, so host-service and gateway teardown remain gated on a confirmed delete. Tests: kept main's active-timer ordering/hardening-failure cases and this branch's --force host-service-preservation case; unioned DestroyHarness options (registeredSandboxCount + shieldsUpError) and the harness spies (stopAllSpy + shieldsUpSpy + event-tracking killTimerSpy). Verified locally: typecheck:cli clean, biome clean, destroy-flow / destroy-gateway-unreachable / snapshot / domain destroy / image-cleanup suites green. Signed-off-by: Jason Ma <jama@nvidia.com>
<!-- 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>
… is down (NVIDIA#6046) (NVIDIA#6050) ## Summary When the OpenShell gateway is not listening on `127.0.0.1:8080`, every gateway call — including the final `sandbox delete` — returns a connection-refused/transport error. `destroy` treated that as fatal with no bypass (neither `--force` nor `--yes` helped, since both only skip the confirmation prompt), so there was no supported way to remove a sandbox while the gateway was down. This makes `--force` fall back to local cleanup. ## Related Issue Fixes NVIDIA#6046 ## Changes - `src/lib/domain/sandbox/destroy.ts`: add `isGatewayUnreachableDeleteOutput()` and surface `gatewayUnreachable` from `getSandboxDeleteOutcome()` — classifying gateway-transport failures (connection refused / `os error 61|111` / tcp connect error / …) separately from real delete rejections. - `src/lib/actions/sandbox/destroy.ts`: - With `--force` + gateway-unreachable: fall back to **local cleanup** (remove the registry entry and local artifacts) with a clear warning that the sandbox may still exist if the gateway returns. Gateway teardown is intentionally skipped (the gateway-side delete was not confirmed). - Without `--force`: still fails, but now points at the recovery paths (`<name> status` to start the gateway, or `--force`). - Real (non-transport) delete errors stay fatal, unchanged. - Tests: domain classification unit tests; CLI E2E (`destroy --force` removes the local record when the fake gateway delete returns connection-refused; `destroy -y` without `--force` fails with the recovery hint and preserves the registry entry). ## Type of Change - [x] Code change (feature, bug fix, or refactor) - [ ] Code change with doc updates - [ ] Doc only (prose changes, no code sample modifications) - [ ] Doc only (includes code sample changes) ## Quality Gates - [x] Tests added or updated for changed behavior - [ ] Existing tests cover changed behavior — justification: - [ ] Tests not applicable — justification: - [ ] Docs updated for user-facing behavior changes - [x] Docs not applicable — justification: `--force` is already documented for destroy; this extends its effect (gateway-down fallback) without a new flag/command 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: sandbox-destroy/data-lifecycle path. The fallback is gated behind explicit `--force` AND a gateway-transport classification; it only removes the *local* record (no gateway teardown), warns that the sandbox may persist, and leaves real delete errors fatal. The pre-existing `alreadyGone` / real-error paths are unchanged and still covered (37 destroy/rebuild tests pass). - [ ] Non-success, skipped, or missing CI check accepted by maintainer — check name, approval link, and follow-up issue: ## Verification - [x] PR description includes the DCO sign-off declaration and every commit appears as `Verified` in GitHub - [x] Git hooks passed during commit and push, or `npx prek run --from-ref main --to-ref HEAD` passes - [x] Targeted tests pass for changed behavior - [ ] Full `npm test` passes (broad runtime changes only) - [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) - [ ] Doc pages follow the style guide (doc changes only) - [ ] New doc pages include SPDX header and frontmatter (new pages only) --- Signed-off-by: Jason Ma <jama@nvidia.com> <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **Bug Fixes** * Improved `sandbox delete` handling when the remote gateway is unreachable by detecting connection/transport failures and surfacing that outcome to callers. * `alpha destroy --force` now safely performs local cleanup even when gateway-side deletion can’t be reached, while avoiding shared host teardown. * Non-forced runs now provide clearer recovery messaging, including guidance to retry with `--force` when the gateway is unavailable. * Warning text now clarifies that local sandbox removal happened without confirming gateway-side deletion. * **Tests** * Added CLI regression coverage for the gateway-unreachable `alpha destroy` scenario. <!-- end of auto-generated comment: release notes by coderabbit.ai --> --------- Signed-off-by: Jason Ma <jama@nvidia.com> Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
<!-- 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>
Summary
When the OpenShell gateway is not listening on
127.0.0.1:8080, every gateway call — including the finalsandbox delete— returns a connection-refused/transport error.destroytreated that as fatal with no bypass (neither--forcenor--yeshelped, since both only skip the confirmation prompt), so there was no supported way to remove a sandbox while the gateway was down. This makes--forcefall back to local cleanup.Related Issue
Fixes #6046
Changes
src/lib/domain/sandbox/destroy.ts: addisGatewayUnreachableDeleteOutput()and surfacegatewayUnreachablefromgetSandboxDeleteOutcome()— classifying gateway-transport failures (connection refused /os error 61|111/ tcp connect error / …) separately from real delete rejections.src/lib/actions/sandbox/destroy.ts:--force+ gateway-unreachable: fall back to local cleanup (remove the registry entry and local artifacts) with a clear warning that the sandbox may still exist if the gateway returns. Gateway teardown is intentionally skipped (the gateway-side delete was not confirmed).--force: still fails, but now points at the recovery paths (<name> statusto start the gateway, or--force).destroy --forceremoves the local record when the fake gateway delete returns connection-refused;destroy -ywithout--forcefails with the recovery hint and preserves the registry entry).Type of Change
Quality Gates
--forceis already documented for destroy; this extends its effect (gateway-down fallback) without a new flag/command surface.--forceAND a gateway-transport classification; it only removes the local record (no gateway teardown), warns that the sandbox may persist, and leaves real delete errors fatal. The pre-existingalreadyGone/ real-error paths are unchanged and still covered (37 destroy/rebuild tests pass).Verification
Verifiedin GitHubnpx prek run --from-ref main --to-ref HEADpassesnpm testpasses (broad runtime changes only)npm run docsbuilds without warnings (doc changes only)Signed-off-by: Jason Ma jama@nvidia.com
Summary by CodeRabbit
sandbox deletehandling when the remote gateway is unreachable by detecting connection/transport failures and surfacing that outcome to callers.alpha destroy --forcenow safely performs local cleanup even when gateway-side deletion can’t be reached, while avoiding shared host teardown.--forcewhen the gateway is unavailable.alpha destroyscenario.