Skip to content

fix(cli): stop detached Hermes forward watcher during uninstall - #7184

Merged
cv merged 9 commits into
mainfrom
fix/hermes-forward-watcher-uninstall
Jul 19, 2026
Merged

fix(cli): stop detached Hermes forward watcher during uninstall#7184
cv merged 9 commits into
mainfrom
fix/hermes-forward-watcher-uninstall

Conversation

@laitingsheng

@laitingsheng laitingsheng commented Jul 19, 2026

Copy link
Copy Markdown
Contributor

Summary

A successful Hermes express onboard leaves a detached host-side Node watcher alive for the port 8642 forward (install.sh restore_onboard_forward_after_post_checks), but nemohermes uninstall had no cleanup path that matched it — the process shape is node …/hermes-<sandbox>-8642.forward.pid.js <openshell> 8642 <sandbox>, which neither the dashboard-port pgrep nor the openshell (sandbox create|ssh-proxy) scan catches. Uninstall printed No local OpenShell forward processes found and exited successfully while the watcher survived, then deleted its PID/script state, so the next Station express install failed its workload-quiescence preflight with Agent or inference workload is active. Uninstall now stops the managed watcher and its sandbox-scoped forward before removing state, and reports a non-zero exit if a watcher it owns cannot be stopped.

Related Issue

Fixes #7163

Changes

  • Add stopHermesForwardWatchers to src/lib/actions/uninstall/run-plan.ts, wired into the Stopping services step (non-scoped uninstall path). It enumerates ${nemoclawStateDir}/state/hermes-*-<port>.forward.pid, and for each entry only signals a PID that is both owned by the current user and whose ps -o args= contains the exact managed *.forward.pid.js script path, using kill + waitForPidExit with a SIGKILL fallback. Foreign-owned, reused (argv-mismatch), stale, and invalid PIDs are skipped without signalling. It also issues openshell forward stop <port> <sandbox> for the associated sandbox-scoped forward. Mirrors the existing stopOllamaAuthProxy ownership-safe pattern.
  • A managed watcher that cannot be stopped flips the run result so uninstall exits non-zero with the honest Uninstall completed with errors message instead of the success banner, rather than silently reporting no forward processes.

Type of Change

  • 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

  • Tests added or updated for changed behavior
  • Existing tests cover changed behavior — justification:
  • Tests not applicable — justification:
  • Docs updated for user-facing behavior changes
  • Docs not applicable — justification: no documentation references the forward watcher; this restores the expected uninstall behaviour with no new user-facing 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: process termination in the uninstall destroy path plus a sandbox-scoped forward stop; awaiting maintainer review on this PR.
  • Non-success, skipped, or missing CI check accepted by maintainer — check name, approval link, and follow-up issue:

Verification

  • PR description includes a Signed-off-by: line and every commit appears as Verified in GitHub
  • Normal pre-commit, commit-msg, and pre-push hooks passed, or npm run check:diff passed when hooks were skipped or unavailable
  • Targeted behavior tests pass for the current change set, or tests are marked not applicable above — command/result: npx vitest run --project cli src/lib/actions/uninstall/run-plan.test.ts src/lib/actions/uninstall/run-plan-hermes-forward-watcher.test.ts — 47 passed (40 existing + 7 new); npm run typecheck:cli — 0 errors.
  • Applicable broad gate passed — npm test for broad runtime/test-harness changes; npm run check for repo-wide validation/coverage changes — command/result:
  • Quality Gates section completed with required justifications or waivers
  • 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: Tinson Lai tinsonl@nvidia.com

Summary by CodeRabbit

  • New Features
    • Uninstall now stops managed Hermes forward watcher processes and performs sandbox-scoped forwarding cleanup for the selected gateway.
    • Cleanup uses safer verification and can retry after transient stop issues.
  • Bug Fixes
    • Avoids signaling unrelated or foreign watcher processes, rejects adversarial/inexact matches, and handles PID reuse.
    • Correctly handles invalid/stale watcher state and PID-file symlinks; preserves state and exits non-zero if cleanup can’t be confirmed.
  • Documentation
    • Updated uninstall command reference with Hermes cleanup behavior.
  • Tests
    • Added coverage for success/failure and edge cases.

Signed-off-by: Tinson Lai <tinsonl@nvidia.com>
@coderabbitai

coderabbitai Bot commented Jul 19, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Note

Reviews paused

It 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 reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

Uninstall now reads and validates managed Hermes forward watcher state, stops owned watcher processes and sandbox-scoped forwards, preserves state on failure, and reports unsuccessful cleanup. Regression tests cover ownership, command matching, stale state, gateway selection, process reuse, and failure cases.

Changes

Hermes watcher cleanup

Layer / File(s) Summary
Watcher state and process matching
src/lib/state/hermes-forward-watcher.ts, src/lib/domain/uninstall/hermes-forward-watcher.ts
Safely parses watcher PID files and requires exact owned-process command-line matches for managed Hermes watchers.
Process and sandbox-forward stopping
src/lib/adapters/openshell/hermes-forward-watcher.ts, src/lib/actions/uninstall/hermes-forward-watcher-cleanup.ts
Inspects, stops, and verifies owned watcher processes, escalates when necessary, and stops each sandbox-scoped OpenShell forward.
Uninstall integration and regression coverage
src/lib/actions/uninstall/run-plan.ts, src/lib/actions/uninstall/run-plan-hermes-forward-watcher.test.ts, docs/reference/commands.mdx
Runs cleanup during service stopping, propagates failures, tests edge cases and selective gateway cleanup, and documents the behavior.

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

Sequence Diagram(s)

sequenceDiagram
  participant runUninstallPlan
  participant stopHermesForwardWatchers
  participant stopHermesForwardWatcherProcess
  participant stopHermesSandboxForward
  runUninstallPlan->>stopHermesForwardWatchers: clean up watcher state
  stopHermesForwardWatchers->>stopHermesForwardWatcherProcess: stop verified watcher PID
  stopHermesForwardWatcherProcess-->>stopHermesForwardWatchers: process stop result
  stopHermesForwardWatchers->>stopHermesSandboxForward: stop sandbox forward
  stopHermesSandboxForward-->>stopHermesForwardWatchers: forward stop result
Loading

Suggested labels: integration: hermes, area: security

Suggested reviewers: senthilr-nv

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 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: uninstall now stops detached Hermes forward watchers.
Linked Issues check ✅ Passed The PR appears to satisfy #7163 by verifying ownership, stopping watcher and sandbox-forward processes, preserving uncertain state, and covering the required PID cases.
Out of Scope Changes check ✅ Passed The documented code, tests, and docs all support Hermes forward-watcher uninstall cleanup and do not show unrelated scope.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch fix/hermes-forward-watcher-uninstall

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

@github-code-quality

github-code-quality Bot commented Jul 19, 2026

Copy link
Copy Markdown
Contributor

Code Coverage Overview

Languages: TypeScript

TypeScript / code-coverage/plugin

The overall coverage remains at 96%, unchanged from the main branch.

TypeScript / code-coverage/cli

The overall coverage in the fix/hermes-forward-w... branch remains at 80%, unchanged from the main branch.

Show a code coverage summary of the most impacted files.
File main 6fbbcb3 fix/hermes-forward-w... c12d431 +/-
src/lib/domain/.../connect-env.ts 97% 89% -8%
src/lib/inferen...er-lifecycle.ts 71% 65% -6%
src/lib/actions...eway-restart.ts 93% 90% -3%
src/lib/actions...all/run-plan.ts 83% 84% +1%
src/lib/onboard...eway-cleanup.ts 55% 66% +11%
src/lib/onboard...box-prebuild.ts 69% 88% +19%
src/lib/adapter...ward-watcher.ts 0% 82% +82%
src/lib/actions...cher-cleanup.ts 0% 83% +83%
src/lib/state/h...ward-watcher.ts 0% 93% +93%
src/lib/domain/...ward-watcher.ts 0% 100% +100%

Updated July 19, 2026 15:03 UTC
Code Coverage is in Public Preview. Learn more and provide us with your feedback.

@apurvvkumaria apurvvkumaria self-assigned this Jul 19, 2026
@github-actions

github-actions Bot commented Jul 19, 2026

Copy link
Copy Markdown
Contributor

PR Review Advisor — Informational

Advisor assessment: Informational / high confidence
Next action: Review the warnings below.
Findings: 0 blockers · 1 warning · 0 suggestions
Status: Canonical ledger: 0 blocker(s), 1 warning(s), 0 suggestion(s).

Model lanes

  • GPT-5.6 Terra (primary): Completed · high confidence · 0 blockers · 1 warning · 0 suggestions
  • Nemotron 3 Ultra (second opinion): Completed · high confidence · 0 blockers · 0 warnings · 0 suggestions
  • Model comparison: normalized findings differ; normalized E2E selections differ; Nemotron reported the same number of blockers, 1 fewer warning, the same number of suggestions.

Nemotron output stays in workflow artifacts and does not change the assessment above.

E2E guidance

Advisory only. E2E / PR Gate selects and runs jobs independently.

Recommended E2E: cloud-onboard, onboard-repair, onboard-resume

3 optional E2E recommendations
  • hermes-e2e
  • hermes-gpu-startup
  • concurrent-gateway-ports
1 warning · 0 suggestions

Warnings

Warnings do not block.

PRA-1 Warning — Add a runtime regression for watcher cleanup before a fresh Hermes install

  • Location: src/lib/actions/uninstall/run-plan-hermes-forward-watcher.test.ts:196
  • Category: tests
  • Problem: The new coverage models process inspection, signal delivery, OpenShell forward stopping, and gateway isolation through an injected `UninstallRunDeps` harness. It does not exercise an installer-created detached watcher and its real OpenShell forward through uninstall followed by the next workload-quiescence preflight.
  • Impact: A mismatch between mocked host-command behavior and a supported Hermes/DGX runtime could still leave the watcher or its forward alive, blocking a fresh install despite the unit suite passing.
  • Recommendation: Add a focused checked-in Hermes lifecycle runtime/E2E scenario that creates the managed watcher, uninstalls, verifies the watcher and sandbox forward are absent, and confirms the subsequent workload-quiescence preflight succeeds.
  • Verification: Inspect the changed watcher-cleanup suite: every `run`, `kill`, process argv, and OpenShell response is provided by `createHarness`; compare it with the E2E inventory, which has no identified watcher-uninstall transition scenario.
  • Test coverage: A runtime Hermes install → uninstall → fresh-install/preflight test that asserts the managed watcher process and its sandbox-scoped forward have been removed, including the selected gateway state path.
  • Evidence: Risk plan lifecycle-state invariant requires partial-failure/retry convergence without stale ports and status agreement with independently probed runtime state. `src/lib/actions/uninstall/run-plan-hermes-forward-watcher.test.ts` uses injected `UninstallRunDeps` through `createHarness`, so process and OpenShell effects are mocked. The test-regressions context identifies runtime validation as recommended and no existing E2E scenario specifically covering this uninstall transition.

Workflow run details

This automated review informs maintainers. Warnings and suggestions do not require a response. A maintainer decides whether to merge.

@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

🤖 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/uninstall/run-plan.ts`:
- Around line 727-806: Move Hermes watcher cleanup responsibilities out of
stopHermesForwardWatchers in run-plan.ts: place ps/kill and OpenShell forwarding
operations in adapters, PID-file discovery and parsing in state, and the pure
ownership/argv classification in domain. Update the run-plan.ts call site and
stopHermesForwardWatchers to only orchestrate these helpers and propagate the
aggregate success result, removing the current direct fs, process, and OpenShell
interactions without leaving duplicate implementations.
🪄 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: 9f54c467-a3da-4b1c-a44b-3b94988dc9e7

📥 Commits

Reviewing files that changed from the base of the PR and between 4deebcf and 7c6f99b.

📒 Files selected for processing (2)
  • src/lib/actions/uninstall/run-plan-hermes-forward-watcher.test.ts
  • src/lib/actions/uninstall/run-plan.ts

Comment thread src/lib/actions/uninstall/run-plan.ts Outdated
@laitingsheng laitingsheng added bug-fix PR fixes a bug or regression area: cli Command line interface, flags, terminal UX, or output labels Jul 19, 2026
Keep selected-gateway cleanup scoped and verify exact process identity.

Preserve retry state when cleanup cannot be confirmed.

Co-authored-by: Tinson Lai <tinsonl@nvidia.com>
Signed-off-by: Apurv Kumaria <akumaria@nvidia.com>
@github-actions

Copy link
Copy Markdown
Contributor

Describe per-watcher cleanup, sibling gateway isolation, and retry behavior when watcher or forward cleanup cannot be confirmed.

Co-authored-by: Tinson Lai <tinsonl@nvidia.com>
Signed-off-by: Apurv Kumaria <akumaria@nvidia.com>

@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 (1)
src/lib/adapters/openshell/hermes-forward-watcher.ts (1)

99-118: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Redundant re-check between SIGTERM and SIGKILL.

waitForWatcherExit's own return value already reflects !isManagedWatcherRunning(...) at the same instant; the extra if (!isManagedWatcherRunning(watcher, host)) right after immediately repeats that same check (3 more ps spawns) and will practically never diverge from what waitForWatcherExit just returned. It's dead code that muddies the SIGTERM→SIGKILL escalation logic.

♻️ Proposed simplification
   host.kill(pid);
   if (waitForWatcherExit(watcher, host, 1000)) {
     host.log(`Stopped Hermes forward watcher ${pid}`);
     return true;
   }
-  if (!isManagedWatcherRunning(watcher, host)) {
-    host.log(`Stopped Hermes forward watcher ${pid}`);
-    return true;
-  }
   host.kill(pid, "SIGKILL");
🤖 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/openshell/hermes-forward-watcher.ts` around lines 99 - 118,
Remove the redundant isManagedWatcherRunning check after the first
waitForWatcherExit call in the watcher shutdown flow. Let a successful
waitForWatcherExit return immediately, and proceed directly to SIGKILL
escalation when it returns false; preserve the existing final wait, logging, and
failure behavior.
🤖 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 `@docs/reference/commands.mdx`:
- Around line 3076-3077: Reformat the paragraph near the Hermes uninstall
documentation so each sentence starts on its own source line. Keep the wording
and paragraph structure unchanged, including the sentences describing watcher
and sandbox-forward cleanup and the nonzero return behavior.

---

Nitpick comments:
In `@src/lib/adapters/openshell/hermes-forward-watcher.ts`:
- Around line 99-118: Remove the redundant isManagedWatcherRunning check after
the first waitForWatcherExit call in the watcher shutdown flow. Let a successful
waitForWatcherExit return immediately, and proceed directly to SIGKILL
escalation when it returns false; preserve the existing final wait, logging, and
failure behavior.
🪄 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: 66a54d9c-9c43-4a9b-a326-de435c846ef2

📥 Commits

Reviewing files that changed from the base of the PR and between 7c6f99b and 7486fec.

📒 Files selected for processing (7)
  • docs/reference/commands.mdx
  • src/lib/actions/uninstall/hermes-forward-watcher-cleanup.ts
  • src/lib/actions/uninstall/run-plan-hermes-forward-watcher.test.ts
  • src/lib/actions/uninstall/run-plan.ts
  • src/lib/adapters/openshell/hermes-forward-watcher.ts
  • src/lib/domain/uninstall/hermes-forward-watcher.ts
  • src/lib/state/hermes-forward-watcher.ts

Comment thread docs/reference/commands.mdx Outdated
Verify that a transient watcher-stop failure preserves retry state.

Confirm a successful second attempt removes the watcher, forward, and state.

Co-authored-by: Tinson Lai <tinsonl@nvidia.com>
Signed-off-by: Apurv Kumaria <akumaria@nvidia.com>

@apurvvkumaria apurvvkumaria 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 exact head 0958a8f. The cleanup is gateway-scoped, validates watcher ownership and exact argv before signaling, fails closed on unreadable state or incomplete cleanup, and has focused retry/foreign-PID coverage. Required CI, advisors, and protected E2E are green. No blocking findings.

@senthilr-nv

Copy link
Copy Markdown
Collaborator

Review result at head c12d4312: changes requested. The latest head only merges updated main; the #7184-specific implementation remains unchanged from the reviewed 623419f3 state.

Blocking findings

  1. [P1] Pin forward cleanup to the selected gateway.

    stopHermesForwardWatchers runs before removeOpenShellResources selects the target gateway. The adapter then executes bare openshell forward stop using ambient gateway state.

    With sibling gateways, this can stop a same-named forward on the active sibling while leaving the selected gateway's forward running. The sibling test validates state-directory selection but does not model the active OpenShell gateway or command ordering. Pin OPENSHELL_GATEWAY or select and verify the target gateway before any forward mutation, and add an active-sibling regression.

  2. [P1] Carry the exact managed OpenShell executable through cleanup.

    The installer accepts an arbitrary executable path through NEMOCLAW_OPENSHELL_BIN, but matchesExactArgv requires the basename to be exactly openshell. A direct matcher probe using /opt/nvidia/openshell-wrapper returns false, so the watcher is classified as unrelated and is not signalled. If the separate bare openshell forward stop succeeds, uninstall can report success and delete retry state while the watcher survives.

    An override outside PATH also cannot perform forward cleanup because the adapter invokes bare openshell. Carry the verified executable from watcher argv into the forward-stop operation and test a non-PATH, nonstandard-basename override.

  3. [P2] Prove the Station workload-quiescence lifecycle.

    The added suite mocks ps, signals, and all OpenShell calls. It does not create an installer-shaped detached Hermes watcher, run uninstall, then execute the Station workload-quiescence preflight. Issue bug(uninstall): detached Hermes forward watcher survives uninstall and blocks fresh install #7163's observable acceptance boundary is that the next Express install reports agent_inference_workloads=none; add that focused integration regression, including selected/sibling gateway isolation.

  4. [P2] Fix the new installer test on macOS.

    hermes-forward-watcher-installer.test.ts:65 compares lexical /var/... with the installer's canonical /private/var/... result from pwd -P. Focused local validation produced 54 passed, 1 failed. Compare canonical paths or assert only the intended absolute-executable contract.

Validation

  • npm run typecheck:cli passed.
  • Focused watcher suite: 54 passed, 1 macOS path failure.
  • git diff --check passed.
  • Current CI restarted for c12d4312 and is still in progress.

Security-review verdict: FAIL pending fixes. Argument-array execution, PID/port validation, symlink-resistant PID reading, secrets, serialization, dependencies, and logging look safe; the selected-gateway authorization boundary and managed-process identity contract do not yet satisfy the required lifecycle guarantees.

@cv
cv merged commit c4e86b5 into main Jul 19, 2026
56 of 57 checks passed
@cv
cv deleted the fix/hermes-forward-watcher-uninstall branch July 19, 2026 15:22
@ericksoa ericksoa mentioned this pull request Jul 20, 2026
21 tasks
ericksoa added a commit that referenced this pull request Jul 20, 2026
<!-- markdownlint-disable MD041 -->
## Summary

Add the canonical dated changelog entry for NemoClaw `v0.0.89` before
the release plan captures the tag commit.
The entry summarizes the user-visible Station preparation, inference,
recovery, policy-disclosure, and CLI-containment changes merged since
`v0.0.88`.

## Changes

- Add `docs/changelog/2026-07-20.mdx` with the exact `## v0.0.89`
release heading, parser-safe SPDX comment, summary, and detailed
bullets.
- Link each shipped theme to the most specific published OpenClaw
documentation routes.
- Keep internal E2E, advisory-registry, and review-workflow refactors
out of the user-facing release summary.

Source summary:

- #7214, #7241, #7237, #7223, #7204, #7202, #7183, and #7090 ->
`docs/changelog/2026-07-20.mdx`: Summarize qualified DGX Station
identity, package-state, PackageKit, DKMS, and reboot-handoff fixes.
- #7242, #7221, #7186, #7164, and #6874 ->
`docs/changelog/2026-07-20.mdx`: Summarize inference endpoint
provenance, provider attachment, managed vLLM cleanup and progress, and
Ollama selection guidance.
- #7225, #7216, #7192, #7136, #7096, and #6910 ->
`docs/changelog/2026-07-20.mdx`: Summarize sandbox readiness, recovery
guidance, rebuilt model routing, durable Hermes state, and gateway
restart behavior.
- #7187 -> `docs/changelog/2026-07-20.mdx`: Summarize complete effective
messaging-preset egress disclosure before policy mutation.
- #7218, #7165, and #7184 -> `docs/changelog/2026-07-20.mdx`: Summarize
structured output containment, terminal-safe route display, and Hermes
forward cleanup.

## 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 adds release-history
prose only; the focused changelog contract test validates its required
structure 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

- [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 — `mise exec node@22.23.1 -- npx vitest
run test/changelog-docs.test.ts` (6 passed).
- [ ] Applicable broad gate passed — `npm test` for broad
runtime/test-harness changes; `npm run check` for repo-wide
validation/coverage changes — not applicable to this doc-only release
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) — `mise
exec node@22.23.1 -- npm run docs` completed with 0 errors and 2
existing site-wide warnings.
- [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)
— the native changelog entry uses the required parser-safe MDX SPDX
comment and does not use frontmatter.

---
Signed-off-by: Aaron Erickson <aerickson@nvidia.com>


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

## Summary by CodeRabbit

* **New Features**
* Expanded DGX Station installation support for qualified GB300 and
OTA-upgraded environments.
* Preserved selected inference providers, endpoints, model pins, and
tuning settings during sandbox creation and rebuilds.
* Improved sandbox recovery by validating availability and stability
before restarting services.
* Added clearer policy output showing the complete effective messaging
egress configuration.

* **Bug Fixes**
* Hardened status and inference route displays by sanitizing terminal
control characters.
* Improved Hermes uninstall behavior by stopping detached dashboard
forwarding.

<!-- 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: cli Command line interface, flags, terminal UX, or output bug-fix PR fixes a bug or regression

Projects

None yet

Development

Successfully merging this pull request may close these issues.

bug(uninstall): detached Hermes forward watcher survives uninstall and blocks fresh install

4 participants