Skip to content

feat(installer): add DGX Station Nemotron Ultra express install#6883

Merged
ericksoa merged 22 commits into
mainfrom
feat/dgx-station-express-install-v2
Jul 15, 2026
Merged

feat(installer): add DGX Station Nemotron Ultra express install#6883
ericksoa merged 22 commits into
mainfrom
feat/dgx-station-express-install-v2

Conversation

@ericksoa

@ericksoa ericksoa commented Jul 14, 2026

Copy link
Copy Markdown
Contributor

Summary

DGX Station now uses the existing express-install and onboarding FSM to offer a one-confirmation managed-vLLM install. The express default is the canonical pinned NVIDIA Nemotron 3 Ultra 550B recipe; --station-deepseek selects the existing DeepSeek V4 Flash recipe for demos.

This PR does not add a parallel launcher, a local-machine image dependency, or a new network mode. The previously proposed experimental-single-user profile has been removed because its qualified Docker config ID was not published as a registry manifest.

Supersedes #6881 with a clean history after #6875 merged; repository policy disables force-pushing the original PR branch.

Changes

  • Detect DGX Station in the existing installer path and offer express setup with no follow-up model/configuration choices after confirmation.
  • Select Nemotron 3 Ultra by default for Station express setup while preserving --station-deepseek as the explicit DeepSeek V4 Flash override.
  • Keep managed vLLM on NemoClaw's existing Docker bridge topology: --ipc=host, explicit -p 8000:8000, no --network host override.
  • Pin Ultra to:
    • model nvidia/NVIDIA-Nemotron-3-Ultra-550B-A55B-NVFP4
    • revision 183968f87ae4cedce3039313cac1fd43d112c578
    • served identity nvidia/nemotron-3-ultra-550b-a55b
    • context length 262144
    • runtime vllm/vllm-openai@sha256:0fec7ec5f3e6bc168e54899935fb0557da908a4832a1dbc88e2debcf2f889416
    • 150 GiB CPU offload, 16 GiB shared memory, memlock/stack ulimits, MTP, nemotron_v3, and qwen3_coder
  • Add the approximately 352 GB Hugging Face cache preflight, post-image-pull capacity recheck, a 3600-second Ultra startup timeout, managed-container ownership protection, and expected-versus-detected model handling when port 8000 is occupied. Inconclusive model-cache probes now require explicit interactive confirmation and fail closed in non-interactive setup unless the exact disk-space override is set.
  • Normalize the canonical Ultra served alias back to the registered installer slug before managed-vLLM selection. Validate explicit Station-only and conflicting flags before license state, Docker setup, OpenShell build dependencies, or any other host mutation.
  • Require every effective managed-vLLM runtime to use a pullable immutable repository@sha256:<manifest> reference. Bare Docker image/config IDs and mutable tags fail before callbacks, prompts, pulls, or container launch.
  • Keep explicit pulls against the immutable digest even on cache hits; download and long-lived containers use --pull=never afterward so Docker cannot substitute another image.
  • Update Station express, managed-vLLM, storage, security, and Deferred-validation documentation.

Distribution and Network Boundary

All four shipped managed-vLLM refs were resolved directly from their registries without pulling layers. Each returned HTTP 200 and a Docker-Content-Digest equal to the requested digest:

  • vllm/vllm-openai@sha256:0fec7ec5f3e6bc168e54899935fb0557da908a4832a1dbc88e2debcf2f889416 — multi-arch index containing Linux ARM64 and AMD64.
  • nvcr.io/nvidia/vllm@sha256:9204569b17ee4c0eff75194b8e6e458479c8aee18953b5ab9cf359fcdac659e2 — Linux ARM64.
  • nvcr.io/nvidia/vllm@sha256:447995cbb57e6c7cf792cab95e9852e5f62b5fb6d2f39e030fa4eda9a54eadb4 — Linux ARM64.
  • nvcr.io/nvidia/vllm@sha256:7be6c2f676c36059a494fe17254e69ae5c677535ba6191044e5fc8e42a91c773 — Linux AMD64.

The Station Ultra runtime follows the same network boundary as standard managed vLLM. 0.0.0.0 is inside the container network namespace and Docker publishes only port 8000. Because Docker's default publication can bind on all host interfaces, the existing default-deny firewall guidance still applies; this PR introduces no additional host-network exception.

Runtime Selection

Station path Selection Runtime image Network
Express default Nemotron 3 Ultra 550B published immutable Docker Hub digest above existing bridge + -p 8000:8000
--station-deepseek DeepSeek V4 Flash published immutable NGC digest above existing bridge + -p 8000:8000
Interactive managed vLLM existing Station registry/default behavior published immutable registry digest existing bridge + -p 8000:8000

There is no installer-selectable experimental/local-only profile in this PR. A future qualified single-user recipe can be proposed only after its exact runtime is published as a pullable immutable manifest and integrated through this same registry/FSM path.

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
  • Docs updated for user-facing behavior changes
  • Sensitive paths changed (preflight, onboarding, inference, and container launch)
  • Product/design scope is being coordinated directly with the PM team; code/security review remains requested on the exact head.
  • Non-success, skipped, or missing CI check accepted by maintainer — no waiver requested.

Verification

Exact local head: 7624d02c7da6d96bb49058bd49474941740e9bd1.

  • Commit and pre-push hooks passed, including repository checks, formatting, lint, ShellCheck, secret scan, installer env-var documentation, and CLI typecheck.
  • Cumulative focused changed-surface verification: 342 passed, 1 existing skip across installer, vLLM registry/runtime/storage, onboarding FSM, Hermes config/dashboard, CLI dispatch, and docs-contract suites; the latest storage/ordering remediation subset is 144 passed, 1 existing skip.
  • npm run typecheck passed.
  • npm run docs:strict passed with zero errors and two existing Fern warnings.
  • npm run check:installer-hash, bash -n install.sh scripts/install.sh, and shellcheck install.sh scripts/install.sh passed.
  • Synthetic merge-tree comparison against the pre-experiment boundary plus current merged-main state found only the intended alias normalization, canonical command assertions, occupied-port assertion, and registry-digest enforcement; canonical Ultra and --station-deepseek behavior are unchanged by the cleanup.
  • All shipped managed-vLLM image manifests resolve remotely at their exact pinned digests.
  • Fresh physical DGX Station qualification remains tracked by the existing Deferred platform status; this PR does not claim to advance that status.
  • No secrets, API keys, credentials, local image IDs, or host-network runtime overrides are committed.

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

ericksoa added 5 commits July 14, 2026 12:32
Signed-off-by: Aaron Erickson <aerickson@nvidia.com>
Signed-off-by: Aaron Erickson <aerickson@nvidia.com>
Signed-off-by: Aaron Erickson <aerickson@nvidia.com>
Signed-off-by: Aaron Erickson <aerickson@nvidia.com>
Signed-off-by: Aaron Erickson <aerickson@nvidia.com>
@ericksoa ericksoa added area: docs Documentation, examples, guides, or docs build area: inference Inference routing, serving, model selection, or outputs platform: dgx-station Affects DGX Station hardware or workflows labels Jul 14, 2026
@ericksoa ericksoa self-assigned this Jul 14, 2026
@coderabbitai

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

Adds a pinned DGX Station Nemotron 3 Ultra managed-vLLM recipe, runtime-specific installation and storage safeguards, express-install model selection, onboarding validation, regression tests, and updated platform documentation.

Changes

DGX Station managed vLLM

Layer / File(s) Summary
Model and profile serving contract
src/lib/inference/vllm-models.ts, src/lib/inference/vllm-models.test.ts
Adds Station model metadata, runtime/profile resolution, validation, and model-specific serving commands.
Runtime installation and storage safeguards
src/lib/inference/vllm.ts, src/lib/inference/vllm-storage.ts, src/lib/inference/vllm.test.ts, src/lib/inference/vllm-storage.test.ts, src/lib/inference/vllm-experimental-single-user.test.ts
Applies pinned runtime overrides, protected model downloads, cache checks, readiness validation, GPU qualification, and token scoping.
Station express installer and onboarding wiring
scripts/install.sh, install.sh, src/lib/onboard/*, src/lib/actions/sandbox/*, src/lib/inference/local*
Adds Station express flags, exports selected model/profile settings, updates onboarding validation, and isolates profile environment state.
Installer and routing regression coverage
test/install-express-prompt.test.ts, test/onboard-selection-vllm.test.ts, test/generate-hermes-config.test.ts, test/seed-hermes-dashboard-config.test.ts, test/inference-options-docs.test.ts
Validates profile qualification, preloaded-image requirements, readiness, safety checks, installer conflicts, generated routing configuration, and documentation content.
Documentation and support matrix
ci/platform-matrix.json, docs/get-started/*, docs/inference/*, docs/reference/*
Documents Station express behavior, runtime digests, model defaults, storage checks, authentication prompts, deferred validation, and recognized model selectors.

Estimated code review effort: 5 (Critical) | ~120 minutes

Possibly related issues

Possibly related PRs

  • NVIDIA/NemoClaw#3417: Both changes adjust onboarding behavior for running local vLLM versus managed install-vllm selection.

Suggested labels: feature, area: install, area: onboarding

Suggested reviewers: zyang-dev, cv

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 23.73% 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 Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly summarizes the main change: adding DGX Station Nemotron Ultra express install support.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/dgx-station-express-install-v2

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

@github-code-quality

github-code-quality Bot commented Jul 14, 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 feat/dgx-station-exp... branch remains at 80%, unchanged from the main branch.

Show a code coverage summary of the most impacted files.
File main f1eef2c feat/dgx-station-exp... 7624d02 +/-
src/lib/inferen...del-registry.ts 100% 66% -34%
src/lib/inference/local.ts 84% 77% -7%
src/lib/inferen...vllm-storage.ts 92% 87% -5%
src/lib/adapter...shell/client.ts 88% 83% -5%
src/lib/onboard...tup-nim-vllm.ts 89% 88% -1%
src/lib/inferen...time-context.ts 92% 94% +2%
src/lib/agent/m...fest-readers.ts 95% 97% +2%
src/lib/inference/vllm.ts 79% 84% +5%
src/lib/agent/dashboard-ui.ts 85% 91% +6%
src/lib/inferen.../vllm-models.ts 66% 82% +16%

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

@github-actions

Copy link
Copy Markdown
Contributor

@github-actions

github-actions Bot commented Jul 14, 2026

Copy link
Copy Markdown
Contributor

PR Review Advisor — Informational

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

Model lanes

  • GPT-5.6 Terra (primary): Completed · high confidence · 0 blockers · 2 warnings · 0 suggestions
  • Nemotron 3 Ultra (second opinion): Completed · high confidence · 0 blockers · 0 warnings · 0 suggestions
  • Model comparison: normalized findings differ; normalized E2E selections match; Nemotron reported the same number of blockers, 2 fewer warnings, 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, inference-routing, network-policy, onboard-repair, onboard-resume

2 optional E2E recommendations
  • gpu-e2e
  • spark-install
2 warnings · 0 suggestions

Warnings

Warnings do not block.

PRA-1 Warning — Document the legacy cache-ownership workaround's source and retirement boundary

  • Location: src/lib/inference/vllm.ts:920
  • Category: architecture
  • Problem: The new fail-closed handling for an unwritable Hugging Face cache identifies a possible root-owned legacy downloader and instructs the operator to repair ownership, but it does not establish where that invalid cache state is created, why that producer cannot be corrected here, or when this compatibility behavior may be removed.
  • Impact: The workaround and its operator-facing remediation can become permanent without a source-level ownership contract, leaving future cache producers able to regress to root-owned state while the product only detects it after setup has begun.
  • Recommendation: Document the named legacy cache producer/source boundary and why it remains outside this change, or fix that producer; record a measurable removal condition alongside this recovery path.
  • Verification: Read `ensureHfCacheDir` and its callers, then trace earlier managed-vLLM cache writers to identify whether any current NemoClaw path can create a root-owned cache.
  • Test coverage: Add or retain a regression test proving every current NemoClaw cache-writing path runs with host UID/GID, plus the existing fail-closed test for a pre-existing unwritable tree.
  • Evidence: `src/lib/inference/vllm.ts:905-925` creates/checks the cache and reports that it 'may have been created by an earlier root-run downloader' but does not name the producer or retirement condition. `src/lib/inference/vllm.test.ts:1324-1341` covers detection and safe remediation text, not the originating cache writer's ownership contract.

PRA-2 Warning — Do not run the new remote-code runtime with host IPC

  • Location: src/lib/inference/vllm-models.ts:259
  • Category: security
  • Problem: The Ultra model's runtime override appends memory-related Docker flags but inherits the Station profile's `--ipc=host`; its serve command also enables `--trust-remote-code`. This gives code from the newly introduced Docker Hub runtime access to the host IPC namespace even though the recipe already specifies a 16 GiB shared-memory allocation.
  • Impact: A compromised or malicious runtime/model component can inspect or interfere with host IPC objects, weakening the managed inference container boundary.
  • Recommendation: Remove inherited `--ipc=host` for the Ultra runtime and use the model-specific `--shm-size 16g` allocation, unless a documented, tested runtime requirement proves host IPC is necessary; if it is necessary, minimize and explicitly justify that boundary exception.
  • Verification: Inspect the final `buildDockerRunFlags()` output for the Station Ultra profile and confirm it contains `--ipc=host`; verify whether the runtime starts and serves with only `--shm-size 16g`.
  • Test coverage: Add a launch-argv test asserting the Ultra profile omits `--ipc=host` while retaining `--shm-size 16g`, plus an integration-level readiness check for that constrained configuration.
  • Evidence: `src/lib/inference/vllm.ts:180-243` builds Station flags through `vllmDockerRunFlags`, which includes `--ipc=host`, and `resolveVllmRuntimeProfile` preserves those flags. `src/lib/inference/vllm-models.ts:204-259` adds the Ultra Docker Hub runtime, `--trust-remote-code`, and `dockerRunArgs: ["--shm-size", "16g", ...]`. `src/lib/inference/vllm.test.ts:672-744` asserts the recipe has `--shm-size 16g` but does not assert removal of host IPC.

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/inference/vllm.ts`:
- Line 801: Update the runtime resolution flow around resolveVllmRuntimeProfile
so a model-specific NEMOCLAW_VLLM_MODEL override is rejected when
profile.platform is not included in model.platforms, before beforeInstall or any
Docker operations. Preserve supported-platform behavior, and add a regression
test covering a generic Linux override against the Station-only Ultra runtime.
🪄 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: a2394c65-f742-44d7-a911-dd6442d454b2

📥 Commits

Reviewing files that changed from the base of the PR and between c181e9e and f9f5416.

📒 Files selected for processing (14)
  • ci/platform-matrix.json
  • docs/get-started/quickstart.mdx
  • docs/inference/choose-inference-provider.mdx
  • docs/inference/set-up-vllm.mdx
  • docs/reference/commands.mdx
  • docs/reference/platform-support.mdx
  • scripts/install.sh
  • src/lib/inference/vllm-models.test.ts
  • src/lib/inference/vllm-models.ts
  • src/lib/inference/vllm.test.ts
  • src/lib/inference/vllm.ts
  • src/lib/onboard/setup-nim-flow.test.ts
  • test/inference-options-docs.test.ts
  • test/install-express-prompt.test.ts

Comment thread src/lib/inference/vllm.ts Outdated
Signed-off-by: Aaron Erickson <aerickson@nvidia.com>

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

This is a strong implementation overall. The pinned runtime, model revision, Station guard, tool/reasoning parsers, canonical model identity, tests, and documentation all look well structured.

I found three operational gaps I think we should address before treating this as the Station express path:

Existing vLLM can override the Ultra express selection

Could we cover the case where port 8000 is already serving DeepSeek?

Today, NEMOCLAW_PROVIDER=install-vllm is converted to the existing vllm option when a server is already running. A user can therefore accept an express install that promises Nemotron Ultra, but onboarding can continue with the existing DeepSeek server after printing a note.

I think the safe behavior is:

  • Reuse the server if /v1/models advertises the expected Ultra model.
  • Otherwise stop with a clear expected-versus-detected model message and instructions to stop the existing server or choose detailed setup.

Could we add a production-shaped test for Station express with DeepSeek already occupying port 8000?

Model-cache disk preflight

The express prompt discloses the approximately 352 GB model download, but the current storage preflight only checks capacity for the 10.67 GB Docker image. The Hugging Face cache can still run out of space partway through the model download.

Could we add a model download size to the registry and preflight the filesystem containing ~/.cache/huggingface before starting hf download? This seems especially important because Ultra is selected automatically in the non-interactive express path.

Ultra load timeout

Ultra currently inherits Station's 1800-second load timeout. In our physical GB300 testing, a warm Ultra load took approximately 21 minutes, leaving limited margin for slower first loads or runtime initialization.

Could the runtime override support loadTimeoutSec, with Ultra using at least 3600 seconds? Our manual validation helper currently allows 3600 seconds.

Non-blocking hardening and validation notes

  • The official Station recipe also includes --ulimit memlock=-1 and --ulimit stack=67108864, while this runtime override adds only --shm-size 16g. If the ulimits are intentionally omitted for NemoClaw's managed runtime, it would be useful to document the reason and validate the exact command on Station.
  • The temporary hf download container runs as root while mounting the user's Hugging Face cache. During our Ultra testing this created root-owned cache paths and later prevented user-level tools from writing additional datasets. This is an existing managed-vLLM concern rather than something introduced solely here, but the 352 GB default download amplifies it. Running the download with the host UID/GID, or documenting ownership recovery, would help.
  • When HF_TOKEN is exported, it is also forwarded into the long-lived vLLM container and retained in Docker container metadata. Since Ultra is currently anonymously accessible and the explicit download completes before serving starts, limiting token forwarding to the temporary download container would be a useful managed-vLLM hardening follow-up.

Before changing Station's validation status, I suggest testing the exact PR-generated command on the GB300 for fresh express install, an existing DeepSeek server on port 8000, cold/warm startup, canonical /v1/models identity, direct chat and automatic tool calling, OpenClaw tool execution, interrupted-download recovery, and restart/reboot behavior.

I'm happy to run that physical end-to-end validation on the Station.

Signed-off-by: Aaron Erickson <aerickson@nvidia.com>
@ericksoa ericksoa changed the title feat(installer): add DGX Station express install feat(installer): default DGX Station express to Nemotron Ultra Jul 15, 2026
@ericksoa

ericksoa commented Jul 15, 2026

Copy link
Copy Markdown
Contributor Author

Thanks, Senthil — I addressed the three operational gaps and the related hardening items on d348ed885:

  • Existing server: Station express now sets the expected served-model identity explicitly. A matching server on port 8000 remains reusable; DeepSeek occupying the port while Ultra is selected stops with an expected-versus-detected model error plus instructions to stop/retry or keep the detected model through detailed setup. This has a production-shaped subprocess regression test.
  • Model storage: Ultra declares its pinned 352,381,245,521-byte snapshot size. Before any download, NemoClaw checks the filesystem backing ~/.cache/huggingface, accounts for an exact partial pinned snapshot, and reserves the remaining bytes plus 3 GiB of staging headroom. It re-probes after a cold image pull so Docker and model checks cannot independently overcommit a shared filesystem. Non-interactive setup stops on verified insufficient capacity unless the existing explicit disk override is set.
  • Load timeout: the Ultra runtime now uses 3600 seconds.
  • Recipe parity: added --ulimit memlock=-1, --ulimit stack=67108864, and the canonical three-token Nemotron H-MTP speculative configuration.
  • Cache/token hardening: the temporary downloader runs with the host UID/GID, legacy unwritable/root-owned cache trees stop before image pull with a safely quoted ownership-repair command, and Hugging Face credentials are forwarded only to that downloader rather than retained by the long-lived vLLM container.

The existing Station express path now defaults to Ultra, with --station-deepseek preserving the DeepSeek demo option. DGX Station remains Deferred; this PR does not claim physical validation.

Changed-surface validation on this head is green (183 passed, 1 existing skip), along with typecheck, strict docs, and the full pre-commit stage. The local manual coverage run had 15,003 passes, 182 skips, and 17 failures confined to nine unrelated macOS/environment-sensitive test files; the pushed Linux CI matrix is now running.

Once CI settles, could you run your proposed GB300 validation against exact head d348ed885, including fresh/resumed download, cold/warm startup, the occupied-port case, model identity, tool execution, and restart/reboot behavior?

Signed-off-by: Aaron Erickson <aerickson@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 `@scripts/install.sh`:
- Around line 2701-2724: Update the Ultra case arm in
configure_station_express_model to also match the served-model ID
nvidia/nemotron-3-ultra-550b-a55b, ensuring it assigns
STATION_ULTRA_SERVED_MODEL to NEMOCLAW_MODEL like the existing Ultra
identifiers.
🪄 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: fd0e73a3-ba7d-462a-a37e-645d425293ad

📥 Commits

Reviewing files that changed from the base of the PR and between 6e0b01b and 35f9c10.

📒 Files selected for processing (18)
  • ci/platform-matrix.json
  • docs/get-started/quickstart.mdx
  • docs/inference/set-up-vllm.mdx
  • docs/reference/commands.mdx
  • docs/reference/platform-support.mdx
  • install.sh
  • scripts/install.sh
  • src/lib/inference/vllm-models.test.ts
  • src/lib/inference/vllm-models.ts
  • src/lib/inference/vllm-storage.test.ts
  • src/lib/inference/vllm-storage.ts
  • src/lib/inference/vllm.test.ts
  • src/lib/inference/vllm.ts
  • src/lib/onboard/setup-nim-vllm.test.ts
  • src/lib/onboard/setup-nim-vllm.ts
  • test/inference-options-docs.test.ts
  • test/install-express-prompt.test.ts
  • test/onboard-selection-vllm.test.ts
🚧 Files skipped from review as they are similar to previous changes (6)
  • docs/get-started/quickstart.mdx
  • src/lib/inference/vllm-models.test.ts
  • docs/reference/platform-support.mdx
  • ci/platform-matrix.json
  • docs/inference/set-up-vllm.mdx
  • src/lib/inference/vllm-models.ts

Comment thread scripts/install.sh
ericksoa added 2 commits July 15, 2026 09:40
Signed-off-by: Aaron Erickson <aerickson@nvidia.com>
Signed-off-by: Aaron Erickson <aerickson@nvidia.com>
@ericksoa ericksoa changed the title feat(installer): default DGX Station express to Nemotron Ultra feat(installer): add DGX Station Nemotron Ultra express profiles Jul 15, 2026
Signed-off-by: Aaron Erickson <aerickson@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: 2

Caution

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

⚠️ Outside diff range comments (1)
scripts/install.sh (1)

2758-2791: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

Clear or reject an ambient profile for non-experimental express installs.

An exported NEMOCLAW_VLLM_PROFILE=experimental-single-user survives the default and --station-deepseek branches, so downstream onboarding can select the experimental runtime without its explicit flag—or combine it with DeepSeek. Not exporting the variable does not remove an inherited export.

Proposed fix
   if [ "${STATION_EXPERIMENTAL_SINGLE_USER:-}" = "1" ]; then
     export NEMOCLAW_VLLM_PROFILE
+  else
+    unset NEMOCLAW_VLLM_PROFILE
   fi

As per path instructions, in-scope callers must use one authoritative replacement path rather than retaining competing runtime paths.

🤖 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 2758 - 2791, Update
configure_station_express_model to clear or reject any inherited
NEMOCLAW_VLLM_PROFILE before handling the default and STATION_DEEPSEEK branches,
ensuring only STATION_EXPERIMENTAL_SINGLE_USER=1 can select the experimental
profile. Preserve the existing experimental export behavior, and ensure
non-experimental express installs cannot pass an ambient experimental profile
downstream or combine it with DeepSeek.

Source: Path instructions

🧹 Nitpick comments (1)
src/lib/inference/vllm-models.ts (1)

514-522: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Extract the "profile requires model X" check into a shared helper instead of repeating the hardcoded model slug.

The literal nemotron-3-ultra-550b-a55b is duplicated across three throw sites: resolveVllmModelProfile (Lines 517-521) and twice in preflightVllmModelEnv (Lines 644-649, 654-659). None of these derive the value from the model that actually registers the profile (model.profiles), so the message is only correct because Ultra is currently the sole owner of EXPERIMENTAL_SINGLE_USER_PROFILE. If a second model ever registers this (or a future) profile ID, all three sites silently produce a wrong/incomplete hint, and every future profile needs three synchronized edits.

♻️ Proposed refactor: derive the required-model hint from the registry
+function modelsRegisteringProfile(profileId: VllmModelProfileId): string {
+  return VLLM_MODELS.filter((m) => m.profiles?.[profileId])
+    .map((m) => m.envValue)
+    .join("' or '");
+}
+
 export function resolveVllmModelProfile(
   model: VllmModelDef,
   platform: VllmPlatform,
   env: NodeJS.ProcessEnv = process.env,
 ): ResolvedVllmModelProfile {
   const profileId = selectVllmModelProfileFromEnv(env);
   if (!profileId) return { model, profile: null };

   const profile = model.profiles?.[profileId];
   if (!profile) {
     throw new Error(
       VLLM_PROFILE_ENV +
         "='" +
         profileId +
-        "' requires NEMOCLAW_VLLM_MODEL='nemotron-3-ultra-550b-a55b'.",
+        "' requires NEMOCLAW_VLLM_MODEL='" +
+        modelsRegisteringProfile(profileId) +
+        "'.",
     );
   }

Apply the same substitution at the two sites in preflightVllmModelEnv (Lines 644-649, 654-659).

Also applies to: 629-660

🤖 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/inference/vllm-models.ts` around lines 514 - 522, Extract a shared
helper for the “profile requires model” validation used by
resolveVllmModelProfile and both checks in preflightVllmModelEnv. Have it derive
the required model slug from the model registry entry that defines the profile
instead of hardcoding nemotron-3-ultra-550b-a55b, and reuse it at all three
throw sites so future profile registrations remain accurate.
🤖 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/inference/vllm-experimental-single-user.test.ts`:
- Line 143: Append the required (`#6883`) suffix to the runtime-profile describe
title at src/lib/inference/vllm-experimental-single-user.test.ts:143-143 and the
install describe title at
src/lib/inference/vllm-experimental-single-user.test.ts:222-222, leaving their
child test titles unchanged.

In `@src/lib/inference/vllm.ts`:
- Line 502: Update buildVllmServeCommand() so host-network mode explicitly
passes VLLM_PORT to vLLM via its port option, while preserving the existing
Docker port publication for non-host networking. Ensure readiness continues
targeting the configured VLLM_PORT when it differs from 8000.

---

Outside diff comments:
In `@scripts/install.sh`:
- Around line 2758-2791: Update configure_station_express_model to clear or
reject any inherited NEMOCLAW_VLLM_PROFILE before handling the default and
STATION_DEEPSEEK branches, ensuring only STATION_EXPERIMENTAL_SINGLE_USER=1 can
select the experimental profile. Preserve the existing experimental export
behavior, and ensure non-experimental express installs cannot pass an ambient
experimental profile downstream or combine it with DeepSeek.

---

Nitpick comments:
In `@src/lib/inference/vllm-models.ts`:
- Around line 514-522: Extract a shared helper for the “profile requires model”
validation used by resolveVllmModelProfile and both checks in
preflightVllmModelEnv. Have it derive the required model slug from the model
registry entry that defines the profile instead of hardcoding
nemotron-3-ultra-550b-a55b, and reuse it at all three throw sites so future
profile registrations remain accurate.
🪄 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: 74af9cf1-ef7c-4a32-963d-622558d5f078

📥 Commits

Reviewing files that changed from the base of the PR and between d348ed8 and 3170c00.

📒 Files selected for processing (24)
  • docs/get-started/quickstart.mdx
  • docs/inference/choose-inference-provider.mdx
  • docs/inference/set-up-vllm.mdx
  • docs/reference/commands.mdx
  • docs/reference/platform-support.mdx
  • install.sh
  • scripts/install.sh
  • src/lib/actions/sandbox/connect-vllm-preflight.ts
  • src/lib/actions/sandbox/rebuild-env-isolation.test.ts
  • src/lib/actions/sandbox/rebuild-env-isolation.ts
  • src/lib/inference/vllm-experimental-single-user.test.ts
  • src/lib/inference/vllm-models.test.ts
  • src/lib/inference/vllm-models.ts
  • src/lib/inference/vllm.test.ts
  • src/lib/inference/vllm.ts
  • src/lib/onboard/setup-nim-vllm.test.ts
  • src/lib/onboard/setup-nim-vllm.ts
  • src/lib/onboard/vllm-model-preflight.ts
  • test/cli/dispatch-basics.test.ts
  • test/generate-hermes-config.test.ts
  • test/inference-options-docs.test.ts
  • test/install-express-prompt.test.ts
  • test/onboard-selection-vllm.test.ts
  • test/seed-hermes-dashboard-config.test.ts
🚧 Files skipped from review as they are similar to previous changes (7)
  • test/inference-options-docs.test.ts
  • src/lib/onboard/setup-nim-vllm.ts
  • docs/reference/platform-support.mdx
  • test/onboard-selection-vllm.test.ts
  • test/install-express-prompt.test.ts
  • src/lib/inference/vllm.test.ts
  • docs/inference/set-up-vllm.mdx

Comment thread src/lib/inference/vllm-experimental-single-user.test.ts Outdated
Comment thread src/lib/inference/vllm.ts Outdated
ericksoa added 3 commits July 15, 2026 09:55
Signed-off-by: Aaron Erickson <aerickson@nvidia.com>
Signed-off-by: Aaron Erickson <aerickson@nvidia.com>
Signed-off-by: Aaron Erickson <aerickson@nvidia.com>
@ericksoa
ericksoa requested a review from cv July 15, 2026 19:07
Signed-off-by: Aaron Erickson <aerickson@nvidia.com>

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

Re-reviewed exact head 15d405d0. My earlier existing-server, timeout, downloader ownership, HF-token containment, and canonical ulimit concerns are addressed. Model-cache sizing was added, with one remaining failure-path issue below.

I am not repeating the product-scope, image-publication, network-boundary, and physical-acceptance blockers already captured in the existing changes-requested review. I agree those blockers remain valid.

Blocker: automatic restart bypasses qualification.

buildVllmRunArgs() applies --restart unless-stopped to the qualified profile. A host or Docker-daemon restart can relaunch the container without rerunning GB300 selection and health checks, HBM/ECC qualification, readiness checks, or startup monitoring.

Qualified profiles should disable automatic restart or use a supervisor that reruns qualification. Please add coverage for the daemon/host-restart path.

Blocker: startup monitoring does not enforce the claimed qualification boundary.

waitForVllmReady() samples HBM/ECC every five seconds but reports the maximum observed sample as "peak HBM" and relies on that polling to enforce the boundary throughout startup. It can miss HBM excursions shorter than the polling interval and delays detection of ECC or telemetry failures.

The qualification artifact referenced by this PR records a 0.1-second fail-closed watcher. The shipped monitor should match the accepted qualification method, including monitor-liveness handling, or the contract must be narrowed and the shipped configuration requalified.

Major: the model-cache capacity probe fails open.

modelStorageAccepted() immediately permits the model download when host-cache capacity cannot be measured, including non-interactive express onboarding, without requiring NEMOCLAW_IGNORE_VLLM_DISK_SPACE=1.

Issue #6757 intentionally allowed an inconclusive probe only for the Docker image store and explicitly scoped itself to image pulls. For an approximately 352 GB model download, non-interactive setup should stop unless the explicit override is set. Interactive setup may instead require affirmative confirmation.

Major: invalid Station flags are rejected after host mutation.

ensure_docker and ensure_openshell_build_deps run before maybe_offer_express_install, where Station-only and conflicting flag combinations are validated. An invalid invocation can therefore install or enable Docker and install build dependencies before returning an error.

Please validate explicit Station flags before these host mutations and add an ordering regression test proving mutating helpers are not invoked for invalid combinations.

These implementation issues are separate from the already acknowledged product, image, security, and physical-qualification gates. Please address or clarify them in the next revision.

@ericksoa

Copy link
Copy Markdown
Contributor Author

Tiny exact-head follow-up: 0f42a7557c8424b5a90d3bf8238dc0a00e557822 rewrites only the registry-inventory test from conditional loops to a linear map/filter pipeline, satisfying codebase-growth-guardrails. Runtime behavior and the remediation summarized above are unchanged. The focused vLLM suite remains 69/69, typecheck passes, and commit/pre-push hooks pass.

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

At commit 3625653, the local-image and host-network blockers are resolved: the experimental profile is removed, the runtime is an immutable pullable manifest, and the existing bridge topology is retained. The PR is still not approvable.

The product scope gate remains open: #6951 is untriaged and no accepted issue or design decision establishes this new canonical Station express/default surface, its ownership, lifecycle, compatibility, security, or validation contract. Keeping platform status Deferred does not authorize adding the supported installer path, and there is still no current physical Station acceptance record for the behavior being shipped.

The current review also confirms four implementation blockers: automatic restart can bypass qualification; five-second startup sampling does not enforce the claimed HBM/ECC boundary or monitor liveness; an inconclusive roughly 352 GB model-cache probe fails open during non-interactive setup; and invalid Station flags are rejected only after host-mutating setup helpers run. Please resolve those with the requested regressions, then provide the accepted product decision and physical acceptance evidence before re-review.

@ericksoa
ericksoa requested review from cv and senthilr-nv July 15, 2026 19:10
@senthilr-nv

Copy link
Copy Markdown
Collaborator

@cv Correction after rechecking exact head 0f42a755: commits 36256535 and 0f42a755 crossed with my earlier review submission.

The experimental profile, runtime qualification, and HBM/ECC startup monitor have been removed. Therefore my automatic-restart qualification and five-second-monitor findings no longer apply. --restart unless-stopped remains, but it no longer bypasses a PR-added qualification contract.

The model-cache fail-open finding and pre-mutation --station-deepseek validation finding still reproduce on current head. Product-scope and physical-acceptance disposition remain with the existing maintainer/PM review.

I will complete the exact-head re-review once the current CI run settles.

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

Copy link
Copy Markdown
Contributor Author

Addressed the current review at exact head 7624d02c7da6d96bb49058bd49474941740e9bd1.

The two actionable implementation gaps are fixed:

  • Model-cache preflight now fails closed when capacity cannot be determined. Non-interactive installs stop before image/model download; interactive installs require an explicit y/yes; only the documented exact override NEMOCLAW_IGNORE_VLLM_DISK_SPACE=1 proceeds. Coverage includes initial and post-image-pull probes plus affirmative, negative, blank, and override cases.
  • Explicit Station flags are validated before host-mutating setup. --station-deepseek misuse, platform mismatch, and conflicting model selections now fail before license state, Docker setup, or OpenShell build dependencies. Parameterized tests assert those helpers are never called.

The two remaining implementation bullets no longer apply to the current PR scope:

  • The experimental single-user profile and all HBM/ECC qualification, monitoring, sampling, and related claims were removed entirely.
  • --restart unless-stopped is the existing managed-vLLM policy already present at base a8c47d7dd; this PR does not add or change it, and there is no experimental qualification path left for restart to bypass.

The earlier image/network concerns are also eliminated: every managed-vLLM image must now be a repository-qualified immutable registry digest, and Station uses the standard Docker bridge plus published port path. Bare local image/config IDs and mutable tags fail before Docker execution. No --network host override remains.

Product/design acceptance is being coordinated by the author directly with PM and should not remain a code blocker for this PR. DGX Station remains Deferred in the validation matrix; this PR does not claim to advance physical qualification status.

Focused remediation validation is 144 passed / 1 existing skip; cumulative changed-surface validation is 342 passed / 1 existing skip, with typecheck, strict docs, ShellCheck, hooks, and growth/size guards passing. Per request, I did not spend another cycle on a redundant full local E2E run; exact-head CI is running with no failures so far.

@senthilr-nv @cv please re-review exact head 7624d02c7da6d96bb49058bd49474941740e9bd1.

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

Re-reviewed exact head 7624d02c from the code and test perspective.

The model-cache preflight now fails closed when capacity is inconclusive, including the post-image-pull recheck. Explicit Station flag conflicts are also rejected before license, Docker, or build-dependency mutations, with regression coverage confirming those helpers are not invoked.

The earlier restart and HBM/ECC monitoring findings no longer apply after removal of the experimental profile.

No further code findings from this review. Approved pending completion of exact-head CI.

@ericksoa
ericksoa merged commit b6fb08e into main Jul 15, 2026
85 of 87 checks passed
@ericksoa
ericksoa deleted the feat/dgx-station-express-install-v2 branch July 15, 2026 19:39
cv pushed a commit that referenced this pull request Jul 16, 2026
<!-- markdownlint-disable MD041 -->
## Summary

Adds the canonical `docs/changelog/2026-07-15.mdx` entry with the exact
`## v0.0.84` heading for the release candidate range from `v0.0.83`
through `710d2b36b9eebcb6bca3c2b2f796a1bdb69c3a31`.
Fills two owner-page gaps for model-aware local inference health and
pre-write OpenClaw candidate validation.

## Changes

- Add the complete shared Fern changelog entry for `v0.0.84`, with
literal CLI names and root-absolute OpenClaw and Hermes routes.
- Document that sandbox status and doctor compare the configured Ollama
or vLLM model with provider inventory without issuing a completion.
- Document that host-side OpenClaw `config set` validates the complete
candidate before replacing live config or reaching gateway restart.
- Reconcile the `v0.0.84` release label with the commit range. PR #6773
is already contained in `v0.0.83` and remains documented there; CI,
test-harness, docs-infrastructure, and `.js` to `.mts` migration-only
changes require no additional user guidance.

### Source summary

- [#6882](#6882) ->
`docs/manage-sandboxes/backup-restore.mdx`,
`docs/changelog/2026-07-15.mdx`: Explain that OpenClaw runtime identity
and pairing state are excluded from snapshots and ignored during
restore.
- [#6873](#6873) ->
`docs/inference/set-up-ollama.mdx`, `docs/changelog/2026-07-15.mdx`:
Record the Ollama requested-model environment fallback and interactive
default.
- [#6835](#6835) ->
`docs/changelog/2026-07-15.mdx`: Include the sandbox name in the
documented rebuild resume-recovery behavior.
- [#6886](#6886) ->
`docs/inference/custom-endpoint-security.mdx`,
`docs/inference/set-up-openai-compatible-endpoint.mdx`,
`docs/changelog/2026-07-15.mdx`: Explain the exact-host trusted-private
endpoint opt-in and retained SSRF boundaries.
- [#6887](#6887) ->
`docs/reference/commands.mdx`, `docs/changelog/2026-07-15.mdx`: Document
Telegram channel health verdicts, summary behavior, and exit status.
- [#6863](#6863) ->
`docs/manage-sandboxes/lifecycle.mdx`, `docs/changelog/2026-07-15.mdx`:
Add the missing model-inventory behavior for local status and doctor
checks.
- [#6902](#6902) ->
`docs/manage-sandboxes/runtime-controls.mdx`,
`docs/changelog/2026-07-15.mdx`: Add the missing pre-write OpenClaw
candidate-validation contract.
- [#6916](#6916) ->
`docs/changelog/2026-07-15.mdx`: Preserve the failed-session
fresh-install recovery correction in the release entry.
- [#6934](#6934) ->
`docs/reference/commands.mdx`, `docs/reference/troubleshooting.mdx`,
`docs/security/credential-storage.mdx`, `docs/changelog/2026-07-15.mdx`:
Summarize completed-prompt checkpointing and validated credential reuse
during OpenClaw resume.
- [#6898](#6898) ->
`docs/inference/switch-models.mdx`,
`docs/inference/switch-providers.mdx`,
`docs/reference/troubleshooting.mdx`, `docs/changelog/2026-07-15.mdx`:
Explain Hermes dashboard convergence after in-place inference changes.
- [#6711](#6711) ->
`docs/manage-sandboxes/run-sandboxes.mdx`,
`docs/manage-sandboxes/uninstall-nemoclaw.mdx`,
`docs/reference/architecture.mdx`, `docs/reference/commands.mdx`,
`docs/changelog/2026-07-15.mdx`: Summarize port-scoped host state and
uninstall preservation.
- [#6767](#6767) ->
`docs/inference/configure-model-limits.mdx`,
`docs/inference/set-up-ollama.mdx`,
`docs/reference/troubleshooting.mdx`, `docs/changelog/2026-07-15.mdx`:
Record the Hermes `64000`-token Ollama floor and unchanged OpenClaw
floor.
- [#6862](#6862) ->
`docs/get-started/quickstart.mdx`,
`docs/inference/verify-inference-route.mdx`,
`docs/changelog/2026-07-15.mdx`: Explain retryable not-ready
finalization for unhealthy inference routes.
- [#6766](#6766) ->
`docs/security/tcb-boundary.mdx`, `docs/changelog/2026-07-15.mdx`:
Document definitive stale transition-lock recovery and fail-closed
ambiguous cases.
- [#6948](#6948) ->
`docs/manage-sandboxes/manage-mcp-servers.mdx`,
`docs/changelog/2026-07-15.mdx`: Include Hermes MCP apply-state race
recovery in the release entry without changing the established user
workflow.
- [#6964](#6964) ->
`docs/reference/troubleshooting.mdx`, `docs/changelog/2026-07-15.mdx`:
Record complete agent-specific fresh-install and resume recovery
commands.
- [#6883](#6883) ->
`docs/get-started/quickstart.mdx`, `docs/inference/set-up-vllm.mdx`,
`docs/reference/platform-support.mdx`, `docs/changelog/2026-07-15.mdx`:
Summarize the DGX Station Nemotron Ultra express path and pinned
managed-vLLM recipe.
- [#6985](#6985) ->
`docs/inference/set-up-vllm.mdx`, `docs/reference/commands.mdx`,
`docs/changelog/2026-07-15.mdx`: Capture the final automated and
interactive storage-warning behavior.

## 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 —
`test/changelog-docs.test.ts` validates the dated-entry structure, exact
version heading, and preserved history.
- [ ] 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:

## 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 passed)
- [ ] Applicable broad gate passed — `npm test` for broad
runtime/test-harness changes; `npm run check` for repo-wide
validation/coverage changes — not run for this doc-only change.
- [x] Quality Gates section completed with required justifications or
waivers
- [x] No secrets, API keys, or credentials committed
- [ ] `npm run docs` builds without warnings (doc changes only) —
completed with 0 errors; Fern reported the unchanged unauthenticated
redirect-check and light-theme contrast 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 intentionally has no frontmatter.

---
Signed-off-by: Prekshi Vyas <prekshiv@nvidia.com>


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

## Summary by CodeRabbit

* **Documentation**
* Added the v0.0.84 changelog entry covering setup, endpoint onboarding,
model handling, sandbox readiness, recovery, channel status, and
configuration safeguards.
* Clarified that sandbox health checks validate configured models
against local Ollama and vLLM provider inventories without generating
completions or consuming tokens.
* Documented that invalid runtime configuration changes are rejected
while preserving the existing working configuration.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
cv added a commit that referenced this pull request Jul 16, 2026
<!-- markdownlint-disable MD041 -->
## Summary

The copyable starter prompt now guides a non-technical user through an
end-to-end NemoClaw installation one question at a time, without leaving
interactive terminal menus running or exposing credentials. It retains
the DGX Station Express mapping while adding complete platform
readiness, provider, messaging, approval, sudo, Ollama,
credential-helper, and documentation-discovery guidance.

## Changes

- Point coding agents to official Markdown documentation examples for
OpenClaw, Hermes, and LangChain Deep Agents Code, and suggest the
NemoClaw docs MCP server when supported.
- Collect the operating system, agent, readiness evidence, provider,
model, sandbox, web search, messaging, policy, credential, download,
administrator-access, and final-install decisions one at a time.
- Reproduce Express outcomes non-interactively: use the installed
release's maintained Spark model, pin the Station Nemotron Ultra recipe
with its approximately 352 GB and Deferred-validation warnings, and
preserve the Windows WSL path.
- Offer existing vLLM, platform- and agent-eligible Ollama, managed
vLLM, OpenRouter, hosted providers, Model Router, and compatible
endpoints without starting duplicate local servers.
- Preserve the immutable credential-helper and form pins, complete
one-time URL, same-port loopback SSH forwarding, single-submission
boundary, approved absolute command, account-home scope, and
verified-installer requirement.
- Define safe sudo behavior, first-build messaging configuration, policy
and integration ordering, separate download/notice/final approvals, and
outcome verification.
- Add regression coverage for credential URL handling, sudo behavior,
Ollama eligibility, Express model behavior, approval timing, provider
mappings, documentation links, and Deep Agents selection.
- [#6875](#6875) ->
`docs/resources/starter-prompt.md`: Reflect DGX Station GB300 firmware
detection in the starter decision flow.
- [#6883](#6883) ->
`docs/resources/starter-prompt.md`: Preserve the merged Station Nemotron
Ultra Express selectors and explicit non-interactive equivalent.

## 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 — starter-prompt
contracts cover credential, sudo, Ollama, provider, Express, approval,
documentation-link, and agent-selection behavior.
- [ ] Existing tests cover changed behavior — justification:
- [ ] Tests not applicable — justification:
- [x] Docs updated for user-facing behavior changes
- [ ] Docs not applicable — justification:
- [x] Sensitive paths changed (security, policy, credentials, preflight,
onboarding, inference, runner, sandbox, or messaging)
- [x] Sensitive-path review completed or maintainer-approved waiver
recorded — implementation-backed review found no remaining must-fix
findings; helper pins, focused tests, and docs validation pass.
- [ ] 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 — `npx vitest run
test/starter-prompt-docs.test.ts test/changelog-docs.test.ts` passed 18
tests in 2 files.
- [ ] Applicable broad gate passed — `npm test` for broad
runtime/test-harness changes; `npm run check` for repo-wide
validation/coverage changes — not run for this documentation-only
change.
- [x] Quality Gates section completed with required justifications or
waivers
- [x] No secrets, API keys, or credentials committed
- [ ] `npm run docs` builds without warnings (doc changes only) — passed
with zero errors and two 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)

---
Signed-off-by: Miyoung Choi <miyoungc@nvidia.com>
Signed-off-by: San Dang <sdang@nvidia.com>


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

* **Documentation**
* Reworked the starter onboarding prompt into a stricter step-by-step
flow with one-question-at-a-time sequencing, including standardized
goal/agent selection and streamlined docs entry points.
* Expanded “Express Install” paths (Windows WSL and DGX Spark/Station)
and updated platform readiness checks, runtime/provider selection, and
local model guidance.
* Significantly tightened security for credentials and SSH tunnels with
immutable trust-boundary rules, preview/edit/confirm behavior, and
stricter policy/approval/checklists.

* **Tests**
* Updated and expanded starter-prompt documentation tests for redacted
key placeholders and stronger security/eligibility/onboarding wording
assertions.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
Signed-off-by: Carlos Villela <cvillela@nvidia.com>

---------

Signed-off-by: Miyoung Choi <miyoungc@nvidia.com>
Signed-off-by: San Dang <sdang@nvidia.com>
Signed-off-by: Carlos Villela <cvillela@nvidia.com>
Co-authored-by: San Dang <sdang@nvidia.com>
Co-authored-by: Carlos Villela <cvillela@nvidia.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area: docs Documentation, examples, guides, or docs build area: inference Inference routing, serving, model selection, or outputs platform: dgx-station Affects DGX Station hardware or workflows v0.0.84 Release target

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants