Skip to content

fix(installer): hand off existing Station vLLM#7285

Merged
cv merged 21 commits into
mainfrom
fix/station-force-existing-vllm
Jul 22, 2026
Merged

fix(installer): hand off existing Station vLLM#7285
cv merged 21 commits into
mainfrom
fix/station-force-existing-vllm

Conversation

@sandl99

@sandl99 sandl99 commented Jul 21, 2026

Copy link
Copy Markdown
Collaborator

Summary

DGX Station Express now keeps active-workload quiescence as a safety requirement and handles an existing vLLM as an explicit inference-ownership conflict. NemoClaw never stops, replaces, or silently reuses the workload.

Interactive users choose whether to preserve the managed Express recipe or switch seamlessly to the existing advanced manual Local vLLM flow. Keeping Express is the safe default for empty input and headless runs.

Tested evidence on Galaxy SKU2

[WARN]  Existing Docker container records will be preserved during Station preparation
[station-prepare] 2026-07-21T07:34:46Z ERROR: vLLM inference workload is active: container_id=80bffa20a7b8 stop_command='docker stop -- 80bffa20a7b8'. NemoClaw did not stop or modify it.
[WARN]  Existing vLLM detected: nemotron-ultra
  Express model: nvidia/nemotron-3-ultra-550b-a55b

  1. Keep Express with nvidia/nemotron-3-ultra-550b-a55b (default)
  2. Use existing vLLM with nemotron-ultra (advanced manual setup)
  Choose 1 or 2 [1]:  
[INFO]  Keep Express: stop the vLLM workload with the command shown above, then resume with:
[INFO]  curl -fsSL https://www.nvidia.com/nemoclaw.sh | NEMOCLAW_INSTALL_TAG=2d73ee34dab73809df8408ffff835266ab06b099 NEMOCLAW_AGENT=openclaw NEMOCLAW_SANDBOX_NAME=my-assistant NEMOCLAW_POLICY_TIER=balanced NEMOCLAW_GATEWAY_PORT=8080 NEMOCLAW_DASHBOARD_PORT=18789 NEMOCLAW_VLLM_PORT=8000 bash -s -- --force-station-install

Related Issue

Fixes #7287

Changes

  • Keep --force-station-install limited to DGX release-metadata qualification.
  • Detect vLLM containers and processes without printing their full command lines, and show an exact manual stop command.
  • Probe /v1/models with bounded time and response size to show the running model when safely available.
  • Keep the vLLM-specific probe and handoff flow in a lazy-loaded scripts/lib/station-vllm-conflict.sh module so the main installer retains only the Station conflict integration point.
  • Offer two concise choices:
    1. preserve the complete Express recipe and print exact stop-and-resume steps (default);
    2. leave vLLM untouched and continue in the same run through advanced manual Local vLLM validation and configuration.
  • Use the Express-preserving default for empty input, closed input, or a missing terminal.
  • Update Station and Quickstart documentation for the ownership handoff.

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:
  • 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: Maintainer approved the behavior contract in fix(installer): hand off existing Station vLLM #7285 (comment); review of the implementation remains pending.
  • Non-success, skipped, or missing CI check accepted by maintainer — check name, approval link, and follow-up issue:

DGX Station Hardware Evidence

  • Tested on DGX Station
  • Tested commit: 51ce3e27d378f6af9970e2699560aa82115d4c95
  • Station profile/scenario: DGX Station GB300 on generic Ubuntu 24.04 ARM64 with a bounded existing-vLLM Docker/process conflict; both the safe Express-preserving default and explicit Local vLLM continuation were exercised.
  • Result: PASS. NemoClaw left the workload unchanged, printed Docker-owner stop guidance and an immutable Express resume command, then preserved the exact-revision Local vLLM choice across interrupted retries. Final host integrity and ECC checks passed.
  • Supporting evidence: Physical DGX Station smoke for the exact tested commit

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 — npx vitest run test/install-station-host-preparation.test.ts test/install-station-container-coexistence.test.ts test/install-express-prompt.test.ts test/install-station-dgx-os.test.ts test/install-preflight.test.ts: 309 passed, 1 skipped.
  • Applicable broad gate passed — Not run; the targeted Station installer suite covers this focused shell and integration-test change.
  • Quality Gates section completed with required justifications or waivers — sensitive-path implementation review remains pending.
  • No secrets, API keys, or credentials committed
  • npm run docs builds without warnings — passed with 0 errors and 2 existing Fern warnings.
  • Doc pages follow the style guide
  • New doc pages include SPDX header and frontmatter — no new pages.

Signed-off-by: San Dang sdang@nvidia.com

Summary by CodeRabbit

Summary by CodeRabbit

  • New Features

    • DGX Station preparation now detects an existing local vLLM workload and guides you to either preserve Station Express (with stop/resume) or switch to manual local vLLM validation.
    • In non-interactive runs, it defaults to preserving Express while still providing stop/resume instructions.
  • Documentation

    • Clarified --force-station-install only bypasses DGX release-metadata qualification; workload quiescence and factory/runtime health checks still block preparation.
    • Updated warnings to better describe what unrelated Docker activity still prevents.
  • Bug Fixes

    • Improved installer messaging and conflict handling accuracy when agents, Docker workloads, or vLLM conflicts are present.

@sandl99 sandl99 added the area: docs Documentation, examples, guides, or docs build label Jul 21, 2026
@sandl99 sandl99 self-assigned this Jul 21, 2026
@copy-pr-bot

copy-pr-bot Bot commented Jul 21, 2026

Copy link
Copy Markdown

Auto-sync is disabled for draft pull requests in this repository. Workflows must be run manually.

Contributors can view more details about this message here.

@coderabbitai

coderabbitai Bot commented Jul 21, 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

The Station installer now detects existing vLLM workloads, reports exit status 12, and offers Express-preserving or manual Local vLLM handling. Forced-install messaging and documentation clarify that only release-metadata qualification is bypassed while workload and runtime checks remain enforced.

Changes

DGX Station vLLM conflict handling

Layer / File(s) Summary
Initial workload detection
scripts/prepare-dgx-station-host.sh, test/install-station-host-preparation.test.ts, test/install-station-container-coexistence.test.ts
Captures the Docker baseline before quiescence checks, distinguishes agent and vLLM conflicts, detects vLLM containers, and validates exit status 12 behavior.
Installer conflict resolution
scripts/lib/station-vllm-conflict.sh, scripts/install.sh, test/install-station-vllm-conflict.test.ts
Loads conflict helpers, reads the running model, sanitizes stop commands, prompts between Express resume and manual Local vLLM setup, and handles non-interactive execution.
Documentation and behavioral validation
docs/get-started/*, test/install-express-prompt.test.ts
Documents workload gating and forced-install checks, and tests model safety, prompt choices, resume state, and fallback behavior.

Estimated code review effort: 3 (Moderate) | ~25 minutes

Sequence Diagram(s)

sequenceDiagram
  participant Installer
  participant StationPreparation
  participant ConflictHelpers
  participant vLLM
  Installer->>StationPreparation: start Station host preparation
  StationPreparation->>StationPreparation: capture baseline and check workloads
  StationPreparation-->>Installer: return status 12 for active vLLM
  Installer->>ConflictHelpers: handle vLLM conflict
  ConflictHelpers->>vLLM: query running model
  vLLM-->>ConflictHelpers: return model identity
  ConflictHelpers-->>Installer: preserve Express or switch to Local vLLM
Loading

Possibly related PRs

  • NVIDIA/NemoClaw#6991: Shares the Station preparation and Express-install framework used by this conflict-handling flow.
  • NVIDIA/NemoClaw#7059: Shares Station Express resume compatibility and served-model identity handling.
  • NVIDIA/NemoClaw#7155: Shares Docker workload gating and container baseline behavior.

Suggested labels: bug

Suggested reviewers: senthilr-nv, cv, apurvvkumaria

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 11.11% 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
Linked Issues check ✅ Passed The changes detect existing vLLM, preserve the workload, and provide Express or Local vLLM continuation paths as requested in #7287.
Out of Scope Changes check ✅ Passed The docs, installer logic, helper module, and tests all support the vLLM conflict-handling objective without obvious unrelated additions.
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title is concise and accurately reflects the main change: handing off an existing Station vLLM workload.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch fix/station-force-existing-vllm

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

@github-actions

Copy link
Copy Markdown
Contributor

@github-code-quality

github-code-quality Bot commented Jul 21, 2026

Copy link
Copy Markdown
Contributor

Code Coverage Overview

Languages: TypeScript

TypeScript / code-coverage/plugin

The overall coverage in commit f8bcac0 in the fix/station-force-ex... branch remains at 96%, unchanged from commit c136c37 in the main branch.

TypeScript / code-coverage/cli

The overall coverage in commit f8bcac0 in the fix/station-force-ex... branch remains at 80%, unchanged from commit c136c37 in the main branch.

Show a code coverage summary of the most impacted files.
File main c136c37 fix/station-force-ex... f8bcac0 +/-
src/lib/domain/.../connect-env.ts 97% 89% -8%
src/lib/state/m...-acquisition.ts 89% 84% -5%
src/lib/platform.ts 89% 84% -5%
src/lib/messagi...nnels/policy.ts 100% 100% 0%
src/lib/sandbox...rce-identity.ts 87% 87% 0%
src/lib/securit...ntial-filter.ts 93% 93% 0%
src/lib/state/m...ock-identity.ts 95% 95% 0%
src/lib/state/m...lock-storage.ts 97% 97% 0%
src/lib/trace.ts 94% 94% 0%
src/lib/tunnel/services.ts 73% 73% 0%

Updated July 22, 2026 20:08 UTC

@github-actions

github-actions Bot commented Jul 21, 2026

Copy link
Copy Markdown
Contributor

PR Review Advisor — Informational

Advisor assessment: Informational / high confidence
Next action: No advisor follow-up needed.
Findings: 0 blockers · 0 warnings · 0 suggestions
Status: No actionable findings remain in the canonical review ledger.

Model lanes

  • GPT-5.6 Terra (primary): Completed · high confidence · 0 blockers · 0 warnings · 0 suggestions
  • Nemotron 3 Ultra (second opinion): Failed

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, credential-sanitization, security-posture

1 optional E2E recommendation
  • vllm-docker-storage

Workflow run details

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

@sandl99 sandl99 changed the title fix(installer): allow forced Station install with active vLLM feat(installer): permit active vLLM during forced Station validation Jul 21, 2026
@sandl99
sandl99 marked this pull request as ready for review July 21, 2026 03:48

@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: 2

🤖 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 `@scripts/install.sh`:
- Line 761: Update the --force-station-install help text and the corresponding
messages near the related lines to scope the override to initial factory-runtime
validation only: active workloads may be present during validation, but required
CDI, Docker, service, or reboot mutations must still block until workloads are
quiesced.

In `@test/install-station-host-preparation.test.ts`:
- Around line 453-479: Replace the direct check_initial_workload_quiescence
calls with the public preparation entry point that runs common_preflight and
captures the Docker baseline. Use controlled probes for the supported profile
whose agent/inference and Docker gates fail, then assert a nonzero result and
the workload-blocking output; retain the forced-factory-runtime case asserting
success and absence of those probes.
🪄 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: 0b542057-b51c-43a8-ba07-c4664c502018

📥 Commits

Reviewing files that changed from the base of the PR and between d5fa194 and 2ea781d.

📒 Files selected for processing (6)
  • docs/get-started/dgx-station-preparation.mdx
  • docs/get-started/quickstart.mdx
  • scripts/install.sh
  • scripts/prepare-dgx-station-host.sh
  • test/install-express-prompt.test.ts
  • test/install-station-host-preparation.test.ts

Comment thread scripts/install.sh Outdated
Comment thread test/install-station-host-preparation.test.ts Outdated
@senthilr-nv

Copy link
Copy Markdown
Collaborator

Thanks for taking this on. I think the safest user-facing contract is:

  • Keep --force-station-install limited to bypassing DGX release metadata.
  • If Express detects an existing vLLM, identify the running and requested models when possible, but do not automatically stop, replace, or reuse the workload.
  • Ask the user to choose:
    1. Managed Express: the user stops the existing workload, and NemoClaw preserves the selected Express recipe and prints the exact resume command.
    2. Use existing endpoint: the user explicitly opts in after NemoClaw validates the model, API, authentication, and connectivity. Treat it as externally managed inference, not NemoClaw-managed inference.
    3. Cancel: leave the existing workload and host unchanged.
  • For non-interactive installation, fail safely with the detected conflict and exact remediation and resume commands.

Even when the models match, reuse should require explicit user consent because NemoClaw does not own the existing workload configuration or lifecycle. For this PR, I suggest implementing the stop-and-resume behavior instead of skipping all initial workload checks for the forced profile.

@sandl99

sandl99 commented Jul 21, 2026

Copy link
Copy Markdown
Collaborator Author

@senthilr-nv

Agreed on keeping --force-station-install limited to release-metadata qualification and never automatically stopping or reusing an existing workload.
To make the installer path clean, I propose this appoarch

  • Express install => everything is clean, new, straightforward, shouldn't have potential conflict
  • Non-express install => customizable, flexible, put decision to customer.

Detail:
When Express detects a healthy existing vLLM workload, I propose this prompt:

Continue with non-Express setup and configure the existing vLLM as an Local vLLM? [y/N]:

  • Yes: Leave the workload untouched and seamlessly continue in the current installer run through Local vLLM. No installer restart is required.
  • No: Stop the installation without changing the workload or host, preserve the selected Express recipe, and print the exact resume command. The user stops the workload manually and then runs that command to continue Express setup.
  • No TTY or input: Fail safely, leave the workload and host unchanged, and print both available remediation paths.

When safely available, the message should identify the running and requested models.

This keeps endpoint reuse in the existing non-Express flow. The PR only improves conflict detection and handoff; it does not introduce another inference ownership or validation path.

@senthilr-nv

Copy link
Copy Markdown
Collaborator

Thanks @sandl99. I agree with your implementation direction: endpoint reuse should return to the existing non-Express flow instead of duplicating that setup inside Express.

The user-facing prompt should make the change in experience explicit because the user intentionally selected a managed Express recipe. When an existing vLLM is detected, show the running and requested models and offer:

  1. Keep my Express setup with <requested model>
    Preserve the complete Express recipe, leave the host unchanged, and print the exact stop-and-resume steps.

  2. Switch to advanced local-model setup using <running model>
    Leave the workload untouched and return to the existing non-Express Local vLLM flow for validation and configuration.

  3. Cancel without changes

Require an explicit choice with no default. For noninteractive installation, fail safely and print both continuation paths.

This keeps the implementation clean while preserving the original Express intent and making the switch to user-managed inference clear.

Signed-off-by: San Dang <sdang@nvidia.com>
@sandl99 sandl99 changed the title feat(installer): permit active vLLM during forced Station validation fix(installer): hand off existing Station vLLM Jul 21, 2026
@sandl99 sandl99 added area: install Install, setup, prerequisites, or uninstall flow platform: dgx-spark Affects DGX Spark hardware or workflows platform: dgx-station Affects DGX Station hardware or workflows bug-fix PR fixes a bug or regression v0.0.91 Release target labels Jul 21, 2026
@sandl99
sandl99 requested a review from senthilr-nv July 21, 2026 07:37

@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: 2

🤖 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 `@scripts/install.sh`:
- Line 3772: Update the prompt text in the force-station-install status message
to remove inference workloads from the list of workloads that block Station
preparation; retain active agent and Docker workload blocking, and keep the
existing qualification and validation details unchanged.

In `@scripts/prepare-dgx-station-host.sh`:
- Around line 1285-1289: The check_initial_workload_quiescence function must
validate agent and inference conflicts before vLLM container conflicts, ensuring
the agent block runs before check_vllm_container_conflicts can exit and hand off
to the manual vLLM path. Preserve the existing
require_no_running_docker_containers check after both conflict checks.
🪄 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: 7ebceb5a-c11e-4c85-aeca-cf97fd5a7bec

📥 Commits

Reviewing files that changed from the base of the PR and between 557b835 and 2d73ee3.

📒 Files selected for processing (8)
  • docs/get-started/dgx-station-preparation.mdx
  • docs/get-started/quickstart.mdx
  • scripts/install.sh
  • scripts/lib/station-vllm-conflict.sh
  • scripts/prepare-dgx-station-host.sh
  • test/install-express-prompt.test.ts
  • test/install-station-container-coexistence.test.ts
  • test/install-station-host-preparation.test.ts

Comment thread scripts/install.sh Outdated
Comment thread scripts/prepare-dgx-station-host.sh
Signed-off-by: San Dang <sdang@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.

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (3)
test/install-express-prompt.test.ts (3)

546-570: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Assert the complete resume instruction, not just one token.

The test title promises the exact stop-and-resume command, but Lines 565-567 only match menu text and an install-tag fragment. A malformed or incomplete user-facing command could still pass. Assert the complete emitted command or its documented arguments.

As per path instructions, tests should verify observable behavior through the public boundary.

🤖 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 `@test/install-express-prompt.test.ts` around lines 546 - 570, Update the test
case around ensure_station_express_host to assert the complete user-facing
stop-and-resume command, including all documented arguments and values such as
the install tag, rather than only checking an install-tag fragment. Keep
verification through the public installer output boundary and preserve the
existing menu and resume-file assertions.

Source: Path instructions


572-580: 🩺 Stability & Availability | 🟡 Minor | ⚡ Quick win

Verify the bounded-probe contract.

The curl stub ignores every argument and returns immediately, so this test passes even if production probes the wrong endpoint or omits timeout and response-size limits. Record and assert the probe contract, or add a separate test for bounded execution.

As per path instructions, broad mocks must not bypass the behavior under test.

🤖 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 `@test/install-express-prompt.test.ts` around lines 572 - 580, Strengthen the
test around station_existing_vllm_model by making the curl stub record its
arguments and asserting the production probe uses the expected health endpoint
with timeout and response-size bounds. Ensure the stub still returns the model
payload only for the valid bounded request, so incorrect endpoint or unbounded
execution cannot pass.

Source: Path instructions


600-636: 🗄️ Data Integrity & Integration | 🟡 Minor | ⚡ Quick win

Exercise the Local vLLM handoff and workload-preservation boundary.

This test stubs host preparation and only checks that variables are cleared and the resume file is absent. It never verifies that the advanced Local vLLM path is invoked or that stop/replace actions are not called, so the branch could exit early and still pass.

As per path instructions, the test should validate observable behavior rather than only internal state.

🤖 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 `@test/install-express-prompt.test.ts` around lines 600 - 636, Strengthen the
test around ensure_station_host_preparation so it verifies the advanced Local
vLLM handoff is actually invoked after the conflict choice, while confirming
stop, replace, or workload-changing actions are not called. Assert observable
setup behavior and preserve the existing checks for cleared state and absent
resume file, rather than allowing an early exit to satisfy the test.

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.

Outside diff comments:
In `@test/install-express-prompt.test.ts`:
- Around line 546-570: Update the test case around ensure_station_express_host
to assert the complete user-facing stop-and-resume command, including all
documented arguments and values such as the install tag, rather than only
checking an install-tag fragment. Keep verification through the public installer
output boundary and preserve the existing menu and resume-file assertions.
- Around line 572-580: Strengthen the test around station_existing_vllm_model by
making the curl stub record its arguments and asserting the production probe
uses the expected health endpoint with timeout and response-size bounds. Ensure
the stub still returns the model payload only for the valid bounded request, so
incorrect endpoint or unbounded execution cannot pass.
- Around line 600-636: Strengthen the test around
ensure_station_host_preparation so it verifies the advanced Local vLLM handoff
is actually invoked after the conflict choice, while confirming stop, replace,
or workload-changing actions are not called. Assert observable setup behavior
and preserve the existing checks for cleared state and absent resume file,
rather than allowing an early exit to satisfy the test.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: 76d7fc6c-989f-4931-8c2d-a4022f089d57

📥 Commits

Reviewing files that changed from the base of the PR and between 2d73ee3 and c24de5f.

📒 Files selected for processing (4)
  • scripts/install.sh
  • scripts/prepare-dgx-station-host.sh
  • test/install-express-prompt.test.ts
  • test/install-station-host-preparation.test.ts
🚧 Files skipped from review as they are similar to previous changes (1)
  • scripts/install.sh

Signed-off-by: San Dang <sdang@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

🤖 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 `@test/install-station-vllm-conflict.test.ts`:
- Around line 13-29: Update runInstallerSourced to remove the temporary home
directory created by fs.mkdtempSync after spawnSync completes. Wrap the shell
invocation and result construction in a try/finally block, and clean up the home
path in finally while preserving the existing return value and output 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: 05d8c265-5aa6-481e-9986-c12f7bbd8e7e

📥 Commits

Reviewing files that changed from the base of the PR and between c24de5f and 77936bb.

📒 Files selected for processing (4)
  • scripts/install.sh
  • scripts/lib/station-vllm-conflict.sh
  • test/install-express-prompt.test.ts
  • test/install-station-vllm-conflict.test.ts
🚧 Files skipped from review as they are similar to previous changes (3)
  • scripts/lib/station-vllm-conflict.sh
  • scripts/install.sh
  • test/install-express-prompt.test.ts

Comment thread test/install-station-vllm-conflict.test.ts Outdated
Signed-off-by: San Dang <sdang@nvidia.com>
@sandl99

sandl99 commented Jul 21, 2026

Copy link
Copy Markdown
Collaborator Author

CI gate failure at reviewed-npm-audit #7286

@github-actions

Copy link
Copy Markdown
Contributor

E2E Target Results — ❌ Some tests failed

Run: 29885582233
Workflow ref: fix/station-force-existing-vllm
Requested targets: cloud-onboard,credential-sanitization,security-posture
Requested test IDs: (default — all default-enabled tests; explicit-only tests openshell-gateway-auth-contract, mcp-bridge-dev, hermes-gpu-startup, sandbox-rlimits-connect, and jetson-nvmap-gpu are skipped unless selected)
Summary: 2 passed, 1 failed, 0 cancelled, 0 skipped, 0 unknown

Test Result Total wall clock time
cloud-onboard ❌ failure 55s
credential-sanitization ✅ success 5m 6s
security-posture ✅ success 9m 13s

Failed tests: cloud-onboard. Check the workflow run for all logs and artifacts.

@sandl99
sandl99 requested a review from cv July 22, 2026 03:29
@github-actions

Copy link
Copy Markdown
Contributor

E2E Target Results — ✅ All selected tests passed

Run: 29888433868
Workflow ref: fix/station-force-existing-vllm
Requested targets: cloud-onboard,credential-sanitization,security-posture
Requested test IDs: (default — all default-enabled tests; explicit-only tests openshell-gateway-auth-contract, mcp-bridge-dev, hermes-gpu-startup, sandbox-rlimits-connect, and jetson-nvmap-gpu are skipped unless selected)
Summary: 3 passed, 0 failed, 0 cancelled, 0 skipped, 0 unknown

Test Result Total wall clock time
cloud-onboard ✅ success 6m 12s
credential-sanitization ✅ success 5m 46s
security-posture ✅ success 12m 20s

@cjagwani cjagwani 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.

This cannot enter the approval path yet because it changes scripts/prepare-dgx-station-host.sh and the required DGX Station Hardware Evidence section still says the revised implementation evidence is pending. The pasted transcript demonstrates the original conflict and an earlier handoff shape, while the PR explicitly says the final interactive handoff has not been validated on hardware; the later cloud/security E2Es do not replace physical Station evidence.

Please run the current head on the stated GB300 existing-vLLM scenario and link reviewable evidence for the exact commit, covering both the safe Express-preserving default/stop-and-resume path and the explicit Local vLLM continuation without stopping, replacing, or silently reusing the workload. Then update the hardware-evidence fields so the sensitive-path implementation review can complete.

@senthilr-nv

Copy link
Copy Markdown
Collaborator

DGX Station hardware evidence

Physical smoke passed for the current PR head.

  • Tested commit: 51ce3e27d378f6af9970e2699560aa82115d4c95
  • Installer SHA-256: 00f24959e5ca68104fe91221c0a015dab6a4154618497fa36b969b661f418cc2
  • Station profile: DGX Station GB300, generic Ubuntu 24.04 ARM64, kernel 6.8.0-124-generic
  • Runtime: GB300 driver 610.43.02, Docker 29.6.1, ECC corrected/uncorrected 0/0
  • Scenario: a bounded disposable Docker workload whose container command and host process arguments both contained vllm; it had no GPU, network, host ports, or restart policy.

Express-preserving default

NemoClaw identified Docker as the workload owner and printed docker stop -- <container-id> rather than process-level kill guidance. Keeping the requested Express setup exited 12, preserved the OpenClaw + Nemotron 3 Ultra recipe, and printed an immutable resume command containing the exact commit, sandbox, policy tier, and gateway/dashboard/vLLM ports. The workload remained running with the same ID, start time, image, command, restart policy, network mode, and read-only state.

Explicit Local vLLM continuation

Option 2 left the workload unchanged, cleared the Express receipt, and wrote an owner-only mode-0600 receipt bound to the exact revision and gateway/vLLM ports. Retrying the exact revision reported Resuming the selected manual Local vLLM setup and skipped the Express prompt. Two intentional exit-130 interruptions preserved the receipt, demonstrating that an incomplete continuation does not consume the choice. Focused tests cover successful receipt cleanup and malformed, permission, revision, and port mismatch rejection.

Final integrity

The disposable workload and test-created state were removed. The Station retained the same boot ID and ended with an empty dpkg --audit, zero containers, zero NemoClaw/OpenShell state or listeners, and ECC 0/0. This was intentionally bounded before model download and agent onboarding; the tested contract is the existing-vLLM decision, ownership guidance, workload preservation, and durable exact-revision continuation requested by the hardware-evidence review.

@senthilr-nv senthilr-nv 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.

Approved on current head 51ce3e27d378f6af9970e2699560aa82115d4c95. The bounded physical DGX Station GB300 smoke covers both the safe Express-preserving default and the explicit Local vLLM continuation, confirms the existing workload remains unchanged, and records clean final host integrity with ECC 0/0. The implementation, focused tests, full installer-integration suite, and Station evidence satisfy this PR contract.

@senthilr-nv

Copy link
Copy Markdown
Collaborator

@cjagwani The requested current-head DGX Station evidence is now complete and linked from the PR description: #7285 (comment). It covers both the Express-preserving default/stop-and-resume path and the explicit Local vLLM continuation on commit 51ce3e27d378f6af9970e2699560aa82115d4c95, with the workload unchanged and final host integrity/ECC checks passing. I have re-reviewed and approved this head.

@senthilr-nv senthilr-nv removed the area: docs Documentation, examples, guides, or docs build label Jul 22, 2026
@senthilr-nv
senthilr-nv dismissed cjagwani’s stale review July 22, 2026 19:55

DGX evidence has been updated in the comment.

@cv
cv merged commit ee38e86 into main Jul 22, 2026
53 of 57 checks passed
@cv
cv deleted the fix/station-force-existing-vllm branch July 22, 2026 21:45
miyoungc added a commit that referenced this pull request Jul 22, 2026
<!-- markdownlint-disable MD041 -->
## Summary

The OpenClaw, Hermes, and Deep Agents Quickstarts now keep separate
source pages with consistent first-run platform ownership.
Each Quickstart retains immediate Docker, Windows, DGX Station, Express,
and model choices while linking durable details to their canonical
owners.
The refactor preserves published Quickstart routes, navigation,
supported workflows, and Commands and Troubleshooting content.

## Changes

- Condense duplicated Docker and platform prose in all three Quickstarts
into concise first-run summaries and canonical links.
- Keep Docker installation behavior in Prerequisites, Windows
preparation in its focused setup page, Station qualification and
preparation in the Station page, managed model and headless workflows in
Set Up vLLM, and validation status in Platform Support.
- Preserve Hermes-specific remote dashboard and API setup, including
`CHAT_UI_URL`, port forwarding, and API bearer-token retrieval.
- Make each Quickstart installer command set the sandbox name used by
its subsequent status, dashboard, and connect commands.
- Preserve the complete headless Station workflow and render the correct
OpenClaw, Hermes, and Deep Agents selection.
- Keep existing routes, navigation entries, and redirects unchanged
while generating agent-variant content from the canonical source pages.
- Incorporate merged PR #7331, including its PackageKit boundary,
without duplicating its integration-policy change.
- Incorporate merged PR #7327 while keeping Platform Support as the
canonical Station validation-status owner.
- Incorporate merged PR #7285 while keeping its existing-vLLM ownership
handoff in the canonical Station preparation page.

## Product Scope

Verdict: In scope.
The diff reorganizes existing Quickstart, Station, and vLLM
documentation and updates its ownership test.
It does not add an integration, solution recipe, custom image,
third-party stack, or supported product surface.

## 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

- [x] Tests added or updated for changed behavior
- [ ] Existing tests cover changed behavior — justification:
- [ ] 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:

## 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 in the PR diff.
- Station profile/scenario: Documentation ownership refactor only.
- Result: Not applicable.
- Supporting evidence: Not applicable.

## 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 —
canonical-base diff-aware hook stages passed against `upstream/main`.
- [x] Targeted behavior tests pass for the current change set, or tests
are marked not applicable above — `npx vitest run
test/station-doc-ownership.test.ts
test/check-docs-published-routes.test.ts test/check-docs-links.test.ts`
(3 files, 44 tests passed).
- [ ] Applicable broad gate passed — Not applicable; this is a focused
documentation ownership refactor with targeted tests and the full docs
build.
- [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) — passed
with 0 errors and 2 Fern 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)
— Not applicable; no pages were added.

Additional validation:

- `npm run docs:sync-agent-variants`
- `npm run docs`
- `npm run source-shape:check`
- `git diff --check upstream/main...HEAD`
- Generated OpenClaw, Hermes, and Deep Agents Set Up vLLM variants
contain the expected agent selection and no residual `<AgentOnly>`
directives.
- Repository-required documentation writer agent review found no content
loss, inaccurate claim, route or anchor drift, or agent-variant
regression. This was not a human review.
- Automated nine-category security review found no security issue in the
documentation and ownership-test diff. This was not a sensitive-path or
human security review.

Adjacent pre-existing debt, intentionally outside this refactor:

- The standalone Station override command and the generic installer
command printed by Windows preparation omit `NEMOCLAW_AGENT`, so users
following those commands directly must return to the agent-specific
Quickstart to preserve Hermes or Deep Agents selection.

---
Signed-off-by: Miyoung Choi <miyoungc@nvidia.com>
Signed-off-by: Senthil Ravichandran <senthilr@nvidia.com>

---------

Signed-off-by: Miyoung Choi <miyoungc@nvidia.com>
Signed-off-by: Senthil Ravichandran <senthilr@nvidia.com>
Co-authored-by: Senthil Ravichandran <senthilr@nvidia.com>
Co-authored-by: Carlos Villela <cvillela@nvidia.com>
@cv cv mentioned this pull request Jul 23, 2026
23 tasks
cv added a commit that referenced this pull request Jul 23, 2026
<!-- markdownlint-disable MD041 -->
## Summary

Adds the canonical dated `## v0.0.93` release entry to
`docs/changelog/2026-07-23.mdx`.
The entry records user-visible behavior, release validation, and
documentation controls merged after `v0.0.92`, while preserving the
pending DGX OS `7.6.x` Station Express qualification caveat.

## Changes

- Adds the parser-safe dated release entry with a summary, grouped
details, and published-route links.
- Reconciles the `v0.0.92..origin/main` commit range with merged
`v0.0.93` PRs.
- Records that no-OTA DGX OS `7.6.x` passed bounded host preflight,
while full Station Express end-to-end qualification remains pending.
- Leaves existing product pages unchanged because the source PRs already
document their supported behavior.

### Source summary

- #7285 -> `docs/changelog/2026-07-23.mdx`: Records the existing-vLLM
ownership choice and resumable Station handoff.
- #7419 -> `docs/changelog/2026-07-23.mdx`: Records bounded no-OTA DGX
OS `7.6.x` recognition and its pending end-to-end qualification.
- #7268 -> `docs/changelog/2026-07-23.mdx`: Records optional Hugging
Face authentication, output sanitization, and resumable HTTP `429`
recovery.
- #7442 -> `docs/changelog/2026-07-23.mdx`: Records clean SIGINT
handling at hidden credential prompts.
- #7299 -> `docs/changelog/2026-07-23.mdx`: Records Intel macOS
rejection before ref resolution or network work.
- #7296 -> `docs/changelog/2026-07-23.mdx`: Records the DGX Spark
non-interactive local-vLLM selection order.
- #7342 -> `docs/changelog/2026-07-23.mdx`: Records delegated protected
E2E approvals in the grouped release-validation bullet.
- #7373 -> `docs/changelog/2026-07-23.mdx`: Records base-image
publication gating before final-main fanout.
- #7388 -> `docs/changelog/2026-07-23.mdx`: Records semantic phase
runtime summaries.
- #7397 -> `docs/changelog/2026-07-23.mdx`: Records progress coverage
hardening.
- #7391 -> `docs/changelog/2026-07-23.mdx`: Records centralized
larger-runner routing.
- #7423 -> `docs/changelog/2026-07-23.mdx`: Records one retry for
confirmed hosted-runner loss.
- #7399 -> `docs/changelog/2026-07-23.mdx`: Records runner-comparison
telemetry.
- #7270 -> `docs/changelog/2026-07-23.mdx`: Records staging Brev
Launchable validation.
- #7426 -> `docs/changelog/2026-07-23.mdx`: Records filtering of
irrelevant base-image run history.
- #7333 -> `docs/changelog/2026-07-23.mdx`: Records aligned Quickstart
platform guidance.
- #7343 -> `docs/changelog/2026-07-23.mdx`: Records documentation-writer
receipt collection.
- #7400 -> `docs/changelog/2026-07-23.mdx`: Records the
documentation-writer receipt requirement for docs-only PRs.
- #7413 -> `docs/changelog/2026-07-23.mdx`: Records removal of redundant
receipt PR metadata.
- #7405 -> `docs/changelog/2026-07-23.mdx`: Records corrected inference
CLI references.
- #7389 -> `docs/changelog/2026-07-23.mdx`: Records completion of the
v0.0.91 documentation audit.

`#7384` is an internal refactor with no intended runtime behavior
change.
`#7401` updates internal CodeQL Actions dependencies.
`#7376` is already contained in `v0.0.92`, so it is outside the
release-entry scan range despite its retained planning label.

## 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, SPDX
syntax, and version headings.
- [ ] 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-23.mdx` against
`WRITING.md`, `docs/CONTRIBUTING.md`, `docs/.docs-skip`,
`docs/index.yml`, the six user-visible source PRs, and the remaining
grouped release commits. The review corrected an ambiguous qualification
claim, confirmed all published routes, preserved the DGX OS `7.6.x`
caveat, and found no remaining action.
- Agent: Codex Desktop
<!-- docs-review-head-sha: ec0a866 -->
<!-- docs-review-agents-blob-sha: 9c9b36d -->

## DGX Station Hardware Evidence

- [ ] Tested on DGX Station
- Tested commit: Not applicable. This PR does not change
`scripts/prepare-dgx-station-host.sh`.
- Station profile/scenario: Not applicable.
- Result: Not applicable.
- Supporting evidence: Not applicable.

## 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`: 1 file and 6 tests passed.
- [ ] Applicable broad gate passed — Not applicable to one native
changelog file.
- [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) —
completed with 0 errors and 2 existing Fern 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)
— not applicable because native changelog entries use a parser-safe MDX
SPDX comment without frontmatter.

---
Signed-off-by: Carlos Villela <cvillela@nvidia.com>


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

## Summary by CodeRabbit

* **Documentation**
* Added the v0.0.93 changelog covering onboarding and validation
improvements.
* Documented support for additional DGX Station Express workstation
releases and clearer handling of existing vLLM workloads.
* Added guidance for optional Hugging Face authentication, resumable
rate-limit recovery, and DGX Spark provider selection.
* Clarified installer behavior on Intel macOS, release validation
requirements, hosted-runner retries, documentation checks, and supported
CLI quickstart paths.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area: install Install, setup, prerequisites, or uninstall flow bug-fix PR fixes a bug or regression platform: dgx-spark Affects DGX Spark hardware or workflows platform: dgx-station Affects DGX Station hardware or workflows

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[DGX Station][Install] NemoClaw v0.0.89 installer blocks when vLLM inference workload is already running

5 participants