feat(gateway): manage the default gateway service - #7319
Conversation
Signed-off-by: San Dang <sdang@nvidia.com>
|
Note Reviews pausedIt looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the Use the following commands to manage reviews:
Use the checkboxes below for quick actions:
📝 WalkthroughWalkthroughThis PR adds managed OpenShell gateway installation and lifecycle handling across Linux and Apple Silicon macOS, including service ownership, port validation, secure environment-file updates, uninstall cleanup, reboot recovery, installer pinning, tests, and documentation. ChangesGateway lifecycle and platform support
Estimated code review effort: 5 (Critical) | ~120 minutes Possibly related issues
Possibly related PRs
Suggested labels: Suggested reviewers: 🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
Comment |
|
🌿 Preview your docs: https://nvidia-preview-pr-7319.docs.buildwithfern.com/nemoclaw |
Code Coverage OverviewLanguages: TypeScript TypeScript / code-coverage/pluginThe overall coverage in commit 617cbc1 in the TypeScript / code-coverage/cliThe overall coverage in commit 617cbc1 in the Show a code coverage summary of the most impacted files.
Updated |
Signed-off-by: San Dang <sdang@nvidia.com>
There was a problem hiding this comment.
🧹 Nitpick comments (6)
scripts/install-openshell.sh (2)
650-651: 🩺 Stability & Availability | 🔵 Trivial | ⚡ Quick winHarden the curl fallback with timeouts and TLS options.
Unlike
fetch_fileinscripts/check-installer-hash.sh(which uses--proto '=https' --tlsv1.2 --connect-timeout 10 --max-time 30 --retry), this fallback runs a barecurl -fL -sS. A stalled endpoint can hang the installer indefinitely, and the downloadedopenshell.rbis subsequently executed by Homebrew. Consider matching the hardened flags for consistent timeout/TLS behavior.🛡️ Proposed change
- curl -fL -sS "https://github.com/NVIDIA/OpenShell/releases/download/${release_tag}/openshell.rb" \ - -o "$output" + curl --proto '=https' --tlsv1.2 -fL -sS \ + --connect-timeout 10 --max-time 30 --retry 3 --retry-delay 1 --retry-all-errors \ + "https://github.com/NVIDIA/OpenShell/releases/download/${release_tag}/openshell.rb" \ + -o "$output"🤖 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 `@scripts/install-openshell.sh` around lines 650 - 651, Harden the curl invocation in the fallback download flow by adding enforced HTTPS/TLS 1.2, connection and total timeouts, and retry behavior consistent with fetch_file. Keep the existing release URL, output path, and fail/silent/show-error behavior unchanged.
781-786: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick winMake the standalone-fallback warning conditional on the missing
brew.The
warn "Homebrew is not installed…"is placed unconditionally after the innerif, so it is correct only becauseinstall_macos_homebrew_formulaalwaysexits. If that function is ever changed toreturnon a path, this branch would print "Homebrew is not installed" on a host where Homebrew is installed and then fall through to the standalone gateway. Move the warning into an explicitelse.♻️ Proposed structure
if [ "$OS" = "Darwin" ]; then if command -v brew >/dev/null 2>&1; then install_macos_homebrew_formula + else + warn "Homebrew is not installed; installing the standalone OpenShell gateway without reboot persistence." fi - warn "Homebrew is not installed; installing the standalone OpenShell gateway without reboot persistence." fi🤖 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 `@scripts/install-openshell.sh` around lines 781 - 786, In the Darwin branch, update the Homebrew check around install_macos_homebrew_formula so the standalone-fallback warning runs only in an explicit else branch when brew is unavailable. Preserve the existing formula installation path without warning or falling through when command -v brew succeeds.scripts/install.sh (1)
1366-1388: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick winKeep the OpenShell unit definition single-sourced
scripts/install.sh:1366-1388duplicatesbuildNemoclawOpenShellGatewayUserServiceinsrc/lib/onboard/docker-driver-gateway-service.ts; add a parity test or generate one from the other so the marker,EnvironmentFile, andExecStartPreargs don’t drift.🤖 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 `@scripts/install.sh` around lines 1366 - 1388, The OpenShell gateway user-service definition is duplicated between the installer heredoc and buildNemoclawOpenShellGatewayUserService. Make one source authoritative or add a parity test covering the marker, EnvironmentFile, and ExecStartPre certificate-generation arguments, so both definitions remain synchronized.src/lib/onboard.ts (1)
1984-2015: 📐 Maintainability & Code Quality | 🔵 Trivial | 🏗️ Heavy liftMove port-ownership policy into a focused gateway module.
These helpers add ownership decisions and lifecycle failure policy to
src/lib/onboard.ts; keep this entrypoint to dependency wiring and invoke a focused service/helper instead.As per path instructions,
src/lib/onboard.tsmust remain entry setup and dependency wiring, while lifecycle effects belong in focused services.🤖 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.ts` around lines 1984 - 2015, Move reportUntrustedGatewayPort and validateServicePortOwner out of the onboard entrypoint into a focused gateway port-ownership service/helper. Keep the ownership validation and exit/throw behavior unchanged, and update src/lib/onboard.ts to wire dependencies and invoke that service rather than implementing lifecycle policy locally.Source: Path instructions
src/lib/actions/uninstall/run-plan.ts (1)
763-862: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick winHardcoded
fs.*calls bypass the existing runtime DI pattern.
removeNemoclawOpenShellGatewayUserServiceandremoveNemoclawOpenShellGatewayEnvcallfs.lstatSync,fs.readFileSync,fs.writeFileSync, andfs.chmodSyncdirectly, while every other filesystem/process interaction in this file goes through the injectableUninstallRuntime(existsSync,rmSync,run). This is why the companion test (run-plan-gateway-service.test.ts) has to fall back tovi.spyOn(fs, "readFileSync")on the real module to simulate a read failure, instead of injecting a fake throughdeps/runtimelike the rest of the suite does.Consider adding these as injectable functions on
UninstallRunDeps/UninstallRuntimefor consistency with the rest of the file and to avoid global module monkey-patching in tests.As per path instructions, "actions orchestrate, domain modules make pure decisions, adapters own host/process/network boundaries, and state modules own persisted files and state I/O," and
src/lib/README.mdnotes to "avoid adding host-boundary/process/filesystem/OS concerns to domain logic... those belong insrc/lib/adapters/**so tests can inject fakes."🤖 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/uninstall/run-plan.ts` around lines 763 - 862, Replace the direct filesystem calls in removeNemoclawOpenShellGatewayUserService and removeNemoclawOpenShellGatewayEnv with injectable operations exposed through UninstallRunDeps and UninstallRuntime, including lstat, read, write, and chmod as needed. Thread the implementations through the runtime construction and update callers/tests to inject fakes, eliminating reliance on global fs spies while preserving the existing behavior and error handling.Source: Path instructions
src/lib/actions/uninstall/run-plan-gateway-segregation.test.ts (1)
519-522: 🎯 Functional Correctness | 🔵 Trivial | ⚡ Quick winImport the shared gateway marker constant here. This fixture duplicates the marker string; reusing
NEMOCLAW_OPENSHELL_GATEWAY_USER_SERVICE_MARKER_LINEkeeps the test aligned with the source of truth and avoids future drift.🤖 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/uninstall/run-plan-gateway-segregation.test.ts` around lines 519 - 522, Update the fixture in the relevant uninstall plan test to import and reuse NEMOCLAW_OPENSHELL_GATEWAY_USER_SERVICE_MARKER_LINE instead of duplicating the gateway marker string in fs.writeFileSync. Preserve the existing service content and formatting while sourcing the marker from the shared constant.Source: Path instructions
🤖 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.
Nitpick comments:
In `@scripts/install-openshell.sh`:
- Around line 650-651: Harden the curl invocation in the fallback download flow
by adding enforced HTTPS/TLS 1.2, connection and total timeouts, and retry
behavior consistent with fetch_file. Keep the existing release URL, output path,
and fail/silent/show-error behavior unchanged.
- Around line 781-786: In the Darwin branch, update the Homebrew check around
install_macos_homebrew_formula so the standalone-fallback warning runs only in
an explicit else branch when brew is unavailable. Preserve the existing formula
installation path without warning or falling through when command -v brew
succeeds.
In `@scripts/install.sh`:
- Around line 1366-1388: The OpenShell gateway user-service definition is
duplicated between the installer heredoc and
buildNemoclawOpenShellGatewayUserService. Make one source authoritative or add a
parity test covering the marker, EnvironmentFile, and ExecStartPre
certificate-generation arguments, so both definitions remain synchronized.
In `@src/lib/actions/uninstall/run-plan-gateway-segregation.test.ts`:
- Around line 519-522: Update the fixture in the relevant uninstall plan test to
import and reuse NEMOCLAW_OPENSHELL_GATEWAY_USER_SERVICE_MARKER_LINE instead of
duplicating the gateway marker string in fs.writeFileSync. Preserve the existing
service content and formatting while sourcing the marker from the shared
constant.
In `@src/lib/actions/uninstall/run-plan.ts`:
- Around line 763-862: Replace the direct filesystem calls in
removeNemoclawOpenShellGatewayUserService and removeNemoclawOpenShellGatewayEnv
with injectable operations exposed through UninstallRunDeps and
UninstallRuntime, including lstat, read, write, and chmod as needed. Thread the
implementations through the runtime construction and update callers/tests to
inject fakes, eliminating reliance on global fs spies while preserving the
existing behavior and error handling.
In `@src/lib/onboard.ts`:
- Around line 1984-2015: Move reportUntrustedGatewayPort and
validateServicePortOwner out of the onboard entrypoint into a focused gateway
port-ownership service/helper. Keep the ownership validation and exit/throw
behavior unchanged, and update src/lib/onboard.ts to wire dependencies and
invoke that service rather than implementing lifecycle policy locally.
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Enterprise
Run ID: 0af3104d-53b3-4139-8b54-de15ab5b5eba
📒 Files selected for processing (40)
ci/platform-matrix.jsonci/source-shape-test-budget.jsondocs/get-started/prerequisites.mdxdocs/manage-sandboxes/uninstall-nemoclaw.mdxdocs/reference/architecture.mdxdocs/reference/commands.mdxdocs/reference/platform-support.mdxdocs/reference/troubleshooting.mdxscripts/check-installer-hash.shscripts/checks/extract-installer-pins.mtsscripts/install-openshell.shscripts/install.shsrc/lib/actions/uninstall/run-plan-gateway-segregation.test.tssrc/lib/actions/uninstall/run-plan-gateway-service.test.tssrc/lib/actions/uninstall/run-plan.test.tssrc/lib/actions/uninstall/run-plan.tssrc/lib/onboard.tssrc/lib/onboard/docker-driver-gateway-env-deb-override.test.tssrc/lib/onboard/docker-driver-gateway-env-service.test.tssrc/lib/onboard/docker-driver-gateway-env.test.tssrc/lib/onboard/docker-driver-gateway-env.tssrc/lib/onboard/docker-driver-gateway-port-listener.test.tssrc/lib/onboard/docker-driver-gateway-port-listener.tssrc/lib/onboard/docker-driver-gateway-service.test.tssrc/lib/onboard/docker-driver-gateway-service.tssrc/lib/onboard/gateway-binding.test.tssrc/lib/onboard/gateway-binding.tssrc/lib/onboard/gateway-http-readiness.test.tssrc/lib/onboard/gateway-http-readiness.tssrc/lib/onboard/openshell-install.tstest/e2e/fixtures/phases/lifecycle.tstest/e2e/registry/definitions/baseline.tstest/e2e/registry/expected-states.tstest/e2e/support/e2e-expected-state.test.tstest/e2e/support/e2e-phase-lifecycle.test.tstest/install-openshell-gateway-service.test.tstest/install-openshell-version-check.test.tstest/installer-hash-check.test.tstest/onboard-gateway-prelaunch-cutover.test.tstest/reboot-recovery-docs.test.ts
PR Review Advisor — InformationalAdvisor assessment: Informational / high confidence 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: 3 optional E2E recommendations
This automated review informs maintainers. Warnings and suggestions do not require a response. A maintainer decides whether to merge. |
Signed-off-by: San Dang <sdang@nvidia.com>
Signed-off-by: San Dang <sdang@nvidia.com>
There was a problem hiding this comment.
🧹 Nitpick comments (2)
src/lib/adapters/fs/regular-file.ts (1)
36-46: 🎯 Functional Correctness | 🔵 Trivial | ⚡ Quick win
readUtf8is not idempotent across repeated calls.
fs.readFileSync(descriptor, ...)reads from the fd's current position and advances it; a secondreadUtf8()call on the sameOpenRegularFilewould return an empty string rather than the file content again, since the descriptor is already at EOF.replaceUtf8avoids this by using an explicit position (0), butreadUtf8doesn't. No current caller reads twice, but this is a silent-data-loss footgun for a shared, reusable adapter (used for credential/env files) if a future caller reads more than once per instance.🛡️ Proposed fix: read via explicit position
return { close, - readUtf8: () => String(fs.readFileSync(descriptor, "utf-8")), + readUtf8: () => { + const size = fs.fstatSync(descriptor).size; + const buffer = Buffer.alloc(size); + fs.readSync(descriptor, buffer, 0, size, 0); + return buffer.toString("utf-8"); + }, replaceUtf8: (contents, mode) => {Node's own docs/issue tracker confirm read-via-fd continues from the current position rather than always starting at the beginning, which is the mechanism behind this concern.
🤖 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/adapters/fs/regular-file.ts` around lines 36 - 46, Update the readUtf8 method in the returned OpenRegularFile adapter to read from offset 0 explicitly, matching replaceUtf8’s positioned I/O, so repeated calls always return the full file contents without depending on the descriptor’s current position.src/lib/actions/uninstall/run-plan.ts (1)
767-883: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick winSplit the two Linux gateway-cleanup helpers to reduce complexity.
removeNemoclawOpenShellGatewayUserServiceandremoveNemoclawOpenShellGatewayEnveach mix open/read/validate/disable/remove/reload steps in one function body, matching the tool's owncode_block_complexity_highsignal for this range. Extracting the "read + validate marker" step from the "disable/remove/reload" step (and similarly for the env cleanup) would make each piece independently testable and easier to reason about.As per coding guidelines, "Keep function complexity low and avoid introducing unnecessary complexity hotspots."
🤖 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/uninstall/run-plan.ts` around lines 767 - 883, Split removeNemoclawOpenShellGatewayUserService into focused helpers for reading and validating the managed service marker and for disabling, removing, and reloading the service, preserving its current return and warning behavior. Similarly decompose removeNemoclawOpenShellGatewayEnv so file access/content preservation and deletion are handled by smaller independently testable helpers. Keep the existing public helper names and cleanup outcomes unchanged.Source: Coding guidelines
🤖 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.
Nitpick comments:
In `@src/lib/actions/uninstall/run-plan.ts`:
- Around line 767-883: Split removeNemoclawOpenShellGatewayUserService into
focused helpers for reading and validating the managed service marker and for
disabling, removing, and reloading the service, preserving its current return
and warning behavior. Similarly decompose removeNemoclawOpenShellGatewayEnv so
file access/content preservation and deletion are handled by smaller
independently testable helpers. Keep the existing public helper names and
cleanup outcomes unchanged.
In `@src/lib/adapters/fs/regular-file.ts`:
- Around line 36-46: Update the readUtf8 method in the returned OpenRegularFile
adapter to read from offset 0 explicitly, matching replaceUtf8’s positioned I/O,
so repeated calls always return the full file contents without depending on the
descriptor’s current position.
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Enterprise
Run ID: f766cc62-694b-4697-8e22-b8cc0acd6c0b
📒 Files selected for processing (8)
scripts/checks/extract-installer-pins.mtsscripts/install-openshell.shsrc/lib/actions/uninstall/run-plan-gateway-segregation.test.tssrc/lib/actions/uninstall/run-plan-gateway-service.test.tssrc/lib/actions/uninstall/run-plan.tssrc/lib/adapters/fs/regular-file.test.tssrc/lib/adapters/fs/regular-file.tstest/install-openshell-gateway-service.test.ts
🚧 Files skipped from review as they are similar to previous changes (3)
- test/install-openshell-gateway-service.test.ts
- scripts/checks/extract-installer-pins.mts
- scripts/install-openshell.sh
Signed-off-by: San Dang <sdang@nvidia.com>
Signed-off-by: San Dang <sdang@nvidia.com>
Signed-off-by: San Dang <sdang@nvidia.com>
Signed-off-by: Senthil Ravichandran <senthilr@nvidia.com>
Signed-off-by: Senthil Ravichandran <senthilr@nvidia.com>
Signed-off-by: Senthil Ravichandran <senthilr@nvidia.com>
Signed-off-by: Senthil Ravichandran <senthilr@nvidia.com>
Signed-off-by: Senthil Ravichandran <senthilr@nvidia.com>
<!-- markdownlint-disable MD041 --> ## Summary Add the canonical `docs/changelog/2026-07-25.mdx` release entry with the exact `## v0.0.96` heading. The entry reconciles all 90 first-parent commits since v0.0.95 with all 92 merged PRs in the live `v0.0.96` label ledger and groups the user-visible changes by operator journey. ## Changes - Add the parser-safe dated MDX changelog entry for v0.0.96 with root-absolute links to the focused user guides. - Source summary: - [#7194](#7194) -> `docs/changelog/2026-07-25.mdx`: Document persistent baseline network policy exclusions and their inspection, rebuild, and snapshot behavior. - [#7188](#7188), [#7427](#7427), and [#7546](#7546) -> `docs/changelog/2026-07-25.mdx`: Document DNS-backed HTTPS inference routing, keyless loopback endpoints, and provider-marker isolation. - [#7238](#7238) -> `docs/changelog/2026-07-25.mdx`: Document blueprint sandbox and provider identifier validation before state writes or OpenShell calls, with bounded terminal-safe rejection previews. - [#7319](#7319), [#7274](#7274), [#7528](#7528), [#7353](#7353), and [#7560](#7560) -> `docs/changelog/2026-07-25.mdx`: Document the managed default gateway service, onboarding readiness, and container-runtime identity safeguards. - [#7349](#7349), [#7498](#7498), [#7406](#7406), [#7196](#7196), [#7559](#7559), [#7421](#7421), [#7510](#7510), [#7295](#7295), and [#7565](#7565) -> `docs/changelog/2026-07-25.mdx`: Document gateway-scoped status, lifecycle diagnostics, managed MCP recovery, delete-edge safeguards, and fail-closed CLI prompt and command output. - [#7591](#7591) -> `docs/changelog/2026-07-25.mdx`: Document opt-in authenticated MCP tool-name discovery, its bounded and names-only contract, probe interaction, and rebuild requirement. - [#7305](#7305), [#7480](#7480), [#7471](#7471), [#7365](#7365), and [#7541](#7541) -> `docs/changelog/2026-07-25.mdx`: Document installer version checks, version-tag reporting, license guidance, WSL Ollama selection, and DGX Station vLLM detection. - [#7482](#7482), [#7466](#7466), [#7208](#7208), [#7434](#7434), and [#7586](#7586) -> `docs/changelog/2026-07-25.mdx`: Document Ollama resource details, reasoning precedence, Hermes onboarding behavior, and preserved managed Hermes BuildKit failures. - [#6830](#6830), [#7492](#7492), [#7563](#7563), and [#7582](#7582) -> `docs/changelog/2026-07-25.mdx`: Document the authoritative OpenClaw production lock, fixed managed-image dependencies, immutable Hermes base adoption, and Hermes image-size reduction. - [#7505](#7505), [#7530](#7530), [#7547](#7547), [#7508](#7508), [#7548](#7548), [#7549](#7549), [#7537](#7537), [#7534](#7534), [#7515](#7515), [#7511](#7511), [#7551](#7551), [#7562](#7562), [#7575](#7575), [#7496](#7496), [#7594](#7594), [#7595](#7595), and [#7599](#7599) -> `docs/changelog/2026-07-25.mdx`: Summarize release validation, transient and bounded dispatch reconciliation, exact pre-tag qualification, identity revalidation, npm-audit retry, sharding, image reuse, timeout, telemetry, and workflow-hardening changes. - Reconciled without separate changelog prose: - [#7539](#7539), [#7526](#7526), [#7507](#7507), [#7506](#7506), [#7519](#7519), [#7516](#7516), [#7396](#7396), [#7254](#7254), [#7583](#7583), [#7596](#7596), and [#7598](#7598): Test-harness or fixture-only changes. - [#7403](#7403), [#7161](#7161), [#6877](#6877), [#7531](#7531), [#7525](#7525), [#7522](#7522), [#7536](#7536), [#7552](#7552), [#7566](#7566), [#7553](#7553), [#7561](#7561), [#7577](#7577), [#7569](#7569), [#7585](#7585), [#7584](#7584), [#7592](#7592), [#7580](#7580), [#7571](#7571), [#7517](#7517), [#7589](#7589), [#7402](#7402), [#7558](#7558), [#7544](#7544), and [#7601](#7601): Dependency, internal recovery, validation, contributor-workflow, E2E optimization, telemetry, or CI trust changes with no separate user-facing release claim. - [#7556](#7556), [#7573](#7573), [#7576](#7576), and [#7578](#7578): Experimental repository-maintainer conflict automation with no canonical user documentation surface. ## 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 - [x] Existing tests cover changed behavior — justification: `test/changelog-docs.test.ts` validates dated changelog structure, version headings, and published links. - [ ] Tests not applicable — justification: - [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: Reviewed `docs/changelog/2026-07-25.mdx` at exact head `0f5dedb47` against 90 first-parent release commits and 92 merged PRs labeled `v0.0.96`. Verified parser-safe MDX SPDX, the exact version heading, literal CLI names, writing style, skip terms, all 20 root-absolute published links, and the accepted #7591 opt-in authenticated discovery bounds. #7544, #7599, and #7601 remain internal or CI-only release-ledger entries. Changelog tests passed 6/6, the docs build passed with 0 errors and two pre-existing Fern warnings, and `npm run check:diff` plus the final diff check passed. - Agent: Codex Desktop documentation-writer subagent <!-- docs-review-head-sha: 0f5dedb --> <!-- 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 — `npx vitest run test/changelog-docs.test.ts`: 6/6 passed. - [ ] 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 entry. - [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) — the build passed with 0 errors and 2 existing Fern warnings; the published-route check passed. - [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) — native changelog files use the required parser-safe MDX SPDX comment and no frontmatter. --- Signed-off-by: Carlos Villela <cvillela@nvidia.com> <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **New Features** * Persistent network policy exclusions with consistent restore/exclusion reporting across rebuilds/snapshots. * Opt-in MCP tool discovery via `mcp status --tools` with bounded, redacted authenticated traffic. * Improved HTTPS inference switching for custom endpoints and refreshed onboarding/model menu details. * Refined OpenShell gateway defaults for port `8080`, including more reliable readiness checks. * **Bug Fixes** * Prevent incorrect provider/model restoration after compatible-provider update failures. * Preserve managed MCP state after exec loss and tighten gateway/doctor status scoping. * **Tests** * Stronger, fail-closed release validation with hardened evidence/artifact handoff and bounded timeouts/retries. <!-- end of auto-generated comment: release notes by coderabbit.ai --> --------- Signed-off-by: Prekshi Vyas <prekshiv@nvidia.com> Co-authored-by: Prekshi Vyas <prekshiv@nvidia.com>
<!-- markdownlint-disable MD041 --> ## Summary Source-checkout installs now retain an absolute executable selected through `NEMOCLAW_OPENSHELL_BIN` after refreshing user-local OpenShell discovery, while continuing to stage the existing gateway service. This prevents the Hermes GPU fallback test from silently bypassing its fault-injection wrapper and exercising the native route instead. ## Related Issue Related to #7140. Follow-up to #6333. ## Changes - Preserve the caller-selected absolute OpenShell executable in the source-checkout `if-missing` path after adding the user-local OpenShell directory to `PATH`. - Keep the #7319 gateway-service staging call and the fresh/pinned OpenShell installation path unchanged. - Add focused E2E-support coverage proving that service staging observes the fallback wrapper, the real gateway component, and the user-local discovery path. - Reject restoration of a relative executable selection so invalid overrides continue to fall back to the discovered user-local OpenShell binary. ## 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 <!-- Check one tests line and one docs line. Check other lines when applicable. Add every requested justification or approval reference. --> - [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: This restores the existing documented `NEMOCLAW_OPENSHELL_BIN` override contract and preserves the already-documented managed gateway-service behavior. - [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: Exact-head nine-category security review passed with no findings: #7710 (comment) - [ ] Non-success, skipped, or missing CI check accepted by maintainer — check name, approval link, and follow-up issue: ## Documentation Writer Review <!-- Required for code and documentation changes after the changes and applicable validation are complete. Keep one review checkbox and one instance of each visible or hidden field. For Evidence, list changed documentation paths. For documentation-only changes, also state that the writing rules and documentation style were reviewed. For other results, explain why no documentation change is needed or why the review is blocked. For Agent, use a consistent product and surface name, such as Codex Desktop, Codex CLI, Claude Code, or Cursor. After committing all review changes, put `git rev-parse --short HEAD` and `git rev-parse --short HEAD:AGENTS.md` in the hidden metadata below. Rerun the review and refresh that metadata after any new commit. This receipt is advisory during the data-collection pilot. --> - [x] Documentation writer subagent reviewed the completed changes - Result: `no-docs-needed` - Evidence: At exact head `03d134564`, the review confirmed that `docs/reference/commands.mdx` already documents the OpenShell executable override and `docs/reference/architecture.mdx` already documents managed gateway-service staging. Rejecting an absolute directory as a binary does not change a supported user workflow. - Agent: Codex Desktop <!-- docs-review-head-sha: 03d1345 --> <!-- docs-review-agents-blob-sha: be20a09 --> ## DGX Station Hardware Evidence <!-- Required only when scripts/prepare-dgx-station-host.sh changes. Maintainers must review the linked evidence before approving or merging. This is human-reviewed evidence, not authenticated hardware provenance. Exceptional bypasses use existing repository governance and must be documented on the PR. --> - [ ] Tested on DGX Station - Tested commit: Not applicable; `scripts/prepare-dgx-station-host.sh` is unchanged. - Station profile/scenario: Not applicable. - Result: Not applicable. - Supporting evidence: Not applicable. ## 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 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 — `hermes-gpu-startup-fallback.test.ts` passed 17/17 at exact head; `install-preflight.test.ts` passed 94/94; CLI type-check and diff-scoped hooks passed. - [ ] 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 two-file source-checkout selection repair; focused tests and diff-scoped hooks cover the changed behavior. - [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](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: Apurv Kumaria <akumaria@nvidia.com> <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **Bug Fixes** * Improved installer handling when a custom OpenShell executable is configured. * Preserved valid absolute executable selections during managed gateway setup. * Added safeguards to fall back to the correct installed OpenShell binary when configured paths are relative or point to directories. * Improved reliability of Hermes GPU startup fallback service selection. <!-- end of auto-generated comment: release notes by coderabbit.ai --> --------- Signed-off-by: Apurv Kumaria <akumaria@nvidia.com>
Summary
NemoClaw now gives its default OpenShell gateway on port
8080an explicit host-service owner: a validated systemd user service on Linux or the official Homebrew service on Apple Silicon. NemoClaw-managed custom ports retain the detached-process lifecycle, while a declared external supervisor retains authority on any matching port.Related Issue
Fixes #6903
Product Scope
Verdict: PASS. Issue #6903 contains the member-authored lifecycle, ownership, compatibility, security, and validation decision for the managed default gateway, and the decision is incorporated into the #7209 release-validation tracker. The refreshed implementation also preserves main's separately accepted external-supervisor contract from #7246.
This product-scope verdict is based on those design records. It is separate from, and does not infer approval from, GitHub's
mergeStateStatus.Changes
XDG_BIN_HOMEandXDG_CONFIG_HOMEvalues, while retaining their default paths.The service-selection path is required by #6903 so reboot ownership is explicit. Starting another detached process cannot provide that contract; the gateway service, installer service, uninstall, and lifecycle suites protect the selection and ownership boundaries.
Type of Change
Quality Gates
617cbc1d62and based3162e3422; independent human sensitive-path review remains outstanding.Documentation Writer Review
docs-updateddocs/get-started/prerequisites.mdx,docs/manage-sandboxes/uninstall-nemoclaw.mdx,docs/reference/architecture.mdx,docs/reference/commands.mdx,docs/reference/platform-support.mdx, anddocs/reference/troubleshooting.mdxat PR SHA617cbc1d6against base SHAd3162e342. Verified the complete exact-head/base diff, terminology, product-scope boundaries, lifecycle and uninstall accuracy, recovery commands, and code-sample presentation againstWRITING.mdanddocs/CONTRIBUTING.md; the readiness merge resolution preserves supplied environment input plus main’s Node 25 SNI behavior;git diff --checkpassed./root/pr7319_docs_review_118571DGX Station Hardware Evidence
Not applicable;
scripts/prepare-dgx-station-host.shis unchanged.Verification
Signed-off-by:line and every commit appears asVerifiedin GitHubpre-commit,commit-msg, andpre-pushhooks passed, ornpm run check:diffpassed when hooks were skipped or unavailabled07a0576b: 8 authority tests passed; the macOS E2E command passed 9 tests with 2 environment-skipped. Credential-sanitization fix: E2E-support passed 1,595 tests with 12 skipped, and the focused live test collected successfully without executing credentialed actions. Exact refreshed head33bb483259: gateway-service runtime tests passed 21/21, installer service tests passed 9/9, polling-helper tests passed 3/3, sandbox-provisioning tests passed 62/62, the live test collected successfully, test-size and CLI type checks passed, the documentation build passed, and the complete canonical-base diff-aware hook gate passed. Exact headd5e9e2d916: all 8 GPU rollback tests passed with deterministic terminal-phase fixtures. Exact refreshed head2788106318: 82 focused CLI tests and 68 provisioning/uninstall integration tests passed, the documentation build passed, and normal pre-commit and commit-message hooks passed. Exact headea29c8b28b: all 7 gateway-service uninstall tests passed after the current-main fixture update, and normal pre-commit and commit-message hooks passed. Exact refreshed headda79a35c73: 45 CLI recovery/service tests and 10 process-recovery integration tests passed. Exact refreshed headb0e9c86ceb: 133 focused Perl-runtime, sandbox-provisioning, runner, and workflow-boundary tests passed outside the restricted sandbox; the canonical-base pre-commit, commit-message, and pre-push hook suites passed. Exact head9a3148c0aa: 20 focused lifecycle/E2E-support tests passed after formatter output, staged pre-commit/security hooks passed, canonical-base pre-push checks passed, and the docs build passed. Exact refreshed headed20dfd741: 49 focused lifecycle and E2E scorecard tests passed; canonical-base pre-commit/security, commit-message, and pre-push hooks passed; the docs build passed. Exact refreshed head34fbcfb4ad: 182 focused service, lifecycle, installer, and E2E scorecard tests passed outside the restricted sandbox; canonical-base pre-commit/security, commit-message, and pre-push hooks passed; the docs build passed. Exact refreshed head611b8fe05f: the expanded service, lifecycle, installer, Hermes, and workflow suite passed 259 tests with 12 expected skips; canonical-base pre-commit/security, commit-message, and pre-push hooks passed; the docs build passed. Exact refreshed head0a69b289ac: the expanded service, lifecycle, installer, Hermes, and workflow suite passed 261 tests with 12 expected skips; canonical-base pre-commit/security, commit-message, and pre-push hooks passed; the docs build passed.npm testfor broad runtime/test-harness changes;npm run checkfor repo-wide validation/coverage changes — command/result: not run locally; the required full CI and exact-pair E2E gates are being monitored.npm run docsbuilds without warnings (doc changes only) — passed with 0 errors and 2 existing Fern warnings.Signed-off-by: San Dang sdang@nvidia.com