fix(list): hide route-only reservations from list and status (#7609) - #7621
Conversation
A failed onboard that reserved the gateway inference route but never created the sandbox (e.g. an untrusted base-image override is rejected, or the agent image build fails) leaves a `pendingRouteReservation` registry entry with no `createdAt`. `nemoclaw list` and `nemoclaw status` rendered that route-only reservation as a real sandbox, so it appeared as a ghost that the user had to `destroy` even though it was never in the live gateway. This reproduced for OpenClaw, Hermes and LangChain Deep Agents Code because the reservation is written before, and independently of, the agent-specific create path. The reservation is intentionally preserved for `--resume` (#6572/#6626), so the fix filters it at the display boundary rather than releasing it: `buildSandboxInventory`, `getStatusReport` and `showStatusCommand` now exclude `isRouteOnlySandboxReservation` entries, matching what `maintenance` and `upgrade-sandboxes` already do. `isRouteOnlySandboxReservation` takes a structural parameter so the display entry type can reuse the single source of truth. Fixes #7609 Signed-off-by: Yanyun Liao <yanyunl@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 (1)
🚧 Files skipped from review as they are similar to previous changes (1)
📝 WalkthroughWalkthroughRoute-only sandbox reservations are represented in inventory data, filtered from inventory and status output, and covered by tests for exclusion, empty-state rendering, and visibility after creation. ChangesRoute-only reservation handling
Estimated code review effort: 3 (Moderate) | ~20 minutes Suggested labels: Suggested reviewers: 🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
Comment |
Code Coverage OverviewLanguages: TypeScript TypeScript / code-coverage/pluginThe overall coverage in commit 6a348e3 in the TypeScript / code-coverage/cliThe overall coverage in commit 6a348e3 in the Show a code coverage summary of the most impacted files.
Updated |
PR Review Advisor — No blocking findings reportedAdvisor assessment: No blocking advisor findings reported Model lanes
Nemotron output stays in workflow artifacts and does not change the assessment above. E2E guidanceAdvisory only. E2E / PR Gate selects and runs jobs independently. Recommended E2E: 1 optional E2E recommendation
This automated review informs maintainers. Warnings and suggestions do not require a response. A maintainer decides whether to merge. |
Signed-off-by: Prekshi Vyas <prekshiv@nvidia.com>
prekshivyas
left a comment
There was a problem hiding this comment.
Reviewed exact head 6a348e3. The route-only reservation filter is narrowly scoped, preserves resume state, and has appropriate regression coverage. The misleading default-resolution comment is corrected, the documentation-writer receipt is current, and no blocking correctness or security findings remain.
<!-- markdownlint-disable MD041 --> ## Summary `docs/changelog/2026-07-25.mdx` now includes the user-facing fixes that merged after #7607 and before the v0.0.96 tag. The follow-up covers safer bulk backup and clone restore behavior, policy and inference repairs, cleaner onboarding diagnostics, and OpenClaw base-image validation while leaving test-only and maintainer-internal merges out of the release entry. ## Changes - Document the Shields-safe `backup-all` flow from #7557 and the clone-specific restore pairing publication from #7608. - Record the Claude Code resolved-launcher policy repair from #7581, Hermes namespaced-model handling from #7604, and persisted Ollama proxy-token reuse from #7620. - Record OpenClaw immutable base-inventory validation from #7606, hidden route-only reservations from #7621, and clean invalid gateway-management errors from #7630. - Link the gateway lifecycle and snapshot authorities, retain #7622's already-merged Docker Engine wording, and exclude internal or test-only merges from the release entry. ## Type of Change - [ ] Code change (feature, bug fix, or refactor) - [ ] Code change with doc updates - [x] Doc only (prose changes, no code sample modifications) - [ ] Doc only (includes code sample changes) ## Quality Gates - [ ] Tests added or updated for changed behavior - [ ] Existing tests cover changed behavior — justification: - [x] Tests not applicable — justification: This PR changes release-entry prose only. The changelog contract test and Fern validation cover the dated entry, published routes, and rendering requirements. - [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: ## Documentation Writer Review - [x] Documentation writer subagent reviewed the completed changes - Result: `docs-updated` - Evidence: At exact PR head `29316da26`, a Codex Desktop documentation writer reviewed `docs/changelog/2026-07-25.mdx` against `AGENTS.md`, `WRITING.md`, and `docs/CONTRIBUTING.md`. The review confirmed that the full entry accurately reflects the merged user-visible behavior, retains #7622's existing wording, appropriately excludes internal and test-only PRs, and uses conforming terminology, structure, links, and release classification. It also confirmed that the review follow-ups use active third-person release-entry voice, name the actor and recovery requirement directly, and accurately preserve the trusted-backup, cached-release refresh, and local-build fallback constraints. The changelog test passed 6/6, and the docs build completed with 0 errors and 2 pre-existing hidden warnings. - Agent: Codex Desktop <!-- docs-review-head-sha: 29316da --> <!-- docs-review-agents-blob-sha: be20a09 --> ## DGX Station Hardware Evidence - [ ] Tested on DGX Station - Tested commit: - Station profile/scenario: - Result: - Supporting evidence: ## Verification - [x] PR description includes a `Signed-off-by:` line 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: `npx vitest run test/changelog-docs.test.ts` passed 6/6 tests after the final review fix. - [ ] Applicable broad gate passed — `npm test` for broad runtime/test-harness changes; `npm run check` for repo-wide validation/coverage changes — command/result: Not applicable to this prose-only changelog change. - [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) — exited 0 with 0 errors and 2 pre-existing hidden warnings after the final review fix. - [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) --- Signed-off-by: Carlos Villela <cvillela@nvidia.com> <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **Documentation** * Expanded the changelog to clarify persistent `policy exclude`/`policy restore` behavior across rebuilds and snapshot restores, including reporting on removed endpoints and exclusion consistency. * Updated `claude-code` preset guidance to allow the npm-installed OpenShell launcher path while maintaining endpoint/HTTP method scope. * Documented hardened handling for invalid gateway-management declarations, improved gateway/agent-version diagnostics scope, and clarified onboarding/restore credential and reasoning precedence. * Tightened bulk backup/restore guidance (safety windows, approval limits, and failure recovery) and refined OpenClaw base selection to avoid incompatible cached releases and `:latest` fallback. <!-- end of auto-generated comment: release notes by coderabbit.ai --> --------- Signed-off-by: Carlos Villela <cvillela@nvidia.com>
Summary
A failed onboard that reserved the gateway inference route but never created the sandbox leaves a
pendingRouteReservationregistry entry with nocreatedAt.nemoclaw listandnemoclaw statusrendered that route-only reservation as a real sandbox — a ghost the user had todestroyeven though it never existed in the live gateway. This PR filters route-only reservations at the display boundary.Closes #7609.
Reproduction
On our Ubuntu 24.04 x86_64 test host (no GPU), built from
main:Reproduced for OpenClaw, Hermes and LangChain Deep Agents Code (
--agent hermes/--agent dcode). OpenClaw fails at the base-image trust check; Hermes/dcode fail later in the image build — but all three leave the same ghost, because the route reservation is written before, and independently of, the agent-specific create path.Environment
mainHEAD0b1854981llama3.1:8b)Observed on
main(before fix)Registry entry left behind:
Observed on
fix/...(after fix)Analysis
The provider/inference onboard step reserves the gateway route by writing a registry entry via
registry.reserveSandboxInferenceRoute(src/lib/onboard/machine/handlers/provider-inference.ts), markedpendingRouteReservation: true. That marker is cleared only when the sandbox is actually created (or on a resume). When a later step throws — the untrusted base image is rejected inresolveSandboxBaseImage(src/lib/sandbox-base-image.ts) insidecreateSandboxWithBaseImageResolution(src/lib/onboard.ts), or the image build fails — the reservation is left behind.registry.isRouteOnlySandboxReservation(pendingRouteReservation === true && createdAt === undefined) already identifies exactly this entry, andmaintenance/upgrade-sandboxesalready exclude it from their listings.nemoclaw list(buildSandboxInventory) andnemoclaw status(getStatusReport/showStatusCommand) were the outliers that did not.The reservation is intentionally kept for
--resume(#6572, #6626), so the correct fix is to filter it at the display boundary — not to release it, which would break resume.Fix
src/lib/inventory/index.ts:buildSandboxInventory,getStatusReportandshowStatusCommandfilter outisRouteOnlySandboxReservationentries before rendering. Two passthrough fields (pendingRouteReservation,createdAt) are added to the displaySandboxEntry(they already ride on recovered rows at runtime) so the predicate can read them.src/lib/state/registry.ts:isRouteOnlySandboxReservationnow takes a structural parameter (just the two fields it reads) so the display entry type can reuse this single source of truth instead of re-deriving the predicate.Whole-class notes: the filter is keyed on the reservation shape, so it is independent of agent (OpenClaw/Hermes/dcode) and of the failure cause (trust rejection vs build failure) — verified on the test host for all three agents and both
listandstatus. Internal consumers that must still see reservations (resume,inference set,connect) are unchanged. No new failure path is introduced; the reservation persistence is intentional. No docs describe the previous ghost display, so none need updating.Tests (
src/lib/inventory/index.test.ts): a route-only reservation is hidden fromlist; a created sandbox with a lingering reservation flag is still shown (regression lock); the empty-state hint appears when only reservations remain; and route-only reservations are hidden fromstatustoo.Changes
src/lib/inventory/index.ts: filter route-only reservations fromlistandstatus; add passthrough fields to the display entry type.src/lib/state/registry.ts: widenisRouteOnlySandboxReservationto a structural parameter.src/lib/inventory/index.test.ts: coverage for the filter acrosslistandstatus.Type of Change
Documentation Writer Review
no-docs-neededdocs/reference/commands.mdxanddocs/manage-sandboxes/lifecycle.mdxalready definelistand globalstatusas registered-sandbox views and document environment-override precedence. The fix restores that documented behavior. The follow-up changes only a comment and accurately distinguishes the registry default from explicit environment overrides. Changed comments and test titles have no blockingWRITING.mdfindings.Verification
npx prek runpasses on the changed filesnpm testpasses (touched files at minimum)AI Disclosure
Signed-off-by: Yanyun Liao yanyunl@nvidia.com
Summary by CodeRabbit