Skip to content

fix(installer): enable stock DGX OS on Station GB300#7108

Merged
ericksoa merged 15 commits into
mainfrom
fix/dgxos-station-express
Jul 17, 2026
Merged

fix(installer): enable stock DGX OS on Station GB300#7108
ericksoa merged 15 commits into
mainfrom
fix/dgxos-station-express

Conversation

@ericksoa

@ericksoa ericksoa commented Jul 17, 2026

Copy link
Copy Markdown
Contributor

Summary

  • Enables the Station express recipe on physical Station GB300 systems running stock DGX OS 7.2.0, 7.4.0, or 7.5.0.
  • Requires bounded Station and GB300 DMI identifiers. Generic Ubuntu preparation also requires the exact NVIDIA GB300 PCI identity (10de:31c2) before any host mutation.
  • Accepts only a bounded, root-owned, non-writable /etc/dgx-release marker with a strict schema, well-formed OTA history, DGX_OTA_PRETTY_NAME="DGX OS", and DGX_PLATFORM="DGX Server for GALAXY-GB300".
  • Validates the factory GB300 driver, zero volatile ECC errors, local Docker/containerd/Buildx, nvidia-ctk CDI, and GPU visibility through both CDI and --gpus all before continuing.
  • Selects the local default Docker context before Station preparation and does not replace stock host packages, restart services, generate CDI configuration, or rewrite the Docker runtime.
  • On Station GB300 only, grants direct-GPU sandboxes the exact read-only BDF directory for each discovered NVIDIA display-class PCI device plus only existing CPU, memory, NUMA, and NVIDIA module-initialization paths. It does not grant /sys, the PCI parent subtree, or sysfs write access.
  • Keeps bare P3830, partial product matches, unknown DGX OS releases, NVIDIA BaseOS, unsafe markers, and other Station generations fail-closed.
  • Keeps DGX Station support status Deferred pending repeat clean-host qualification and CI coverage.

Why

Issue #7103 reports that the released express installer rejects the stock DGX OS image shipped on Station. The prior qualification also exposed the OpenShell sandbox CUDA failure tracked in NVIDIA/OpenShell#2343. NemoClaw can safely address that runtime behavior at its policy boundary while retaining released OpenShell 0.0.85.

This does not claim that NVIDIA/OpenShell#2343 is fixed upstream, promote Station support, or cover the dual-Station work in #7091.

Fixes #7103.

Physical Station evidence

A clean-application-baseline run at 58c11e9d6 passed end to end on physical DGX OS 7.5.0 Station GB300:

  • zero containers, GPU processes, 8000/8080 listeners, installed NemoClaw/OpenShell commands, and failed systemd units before installation;
  • exact installer source SHA verified after installation;
  • released OpenShell 0.0.85 and local nvidia/nemotron-3-ultra-550b-a55b serving;
  • sandbox CUDA validation on GB300 with driver 595.71.05 and volatile ECC 0/0;
  • Hermes one-shot and real TUI tool use with successful write_file and read_file operations.

A separate physical A/B policy test established the least-privilege sysfs boundary encoded at 2db0ea0bc:

  • no sysfs exception: sandbox CUDA initialization failed;
  • exact GPU BDF plus existing CPU, memory, NUMA, and NVIDIA module-init paths: sandbox CUDA initialization passed;
  • /sys/fs/cgroup/cgroup.controllers and /sys/class/net/lo/address remained denied;
  • neither /sys nor /sys/bus/pci/devices is added to the generated policy.

The exact 2db0ea0bc full clean-install acceptance then passed in 910 seconds:

  • resolved source SHA matched 2db0ea0bcc3ecce1406ffea497465070d6ec4b7f;
  • the effective policy contained only GPU BDF 0009:06:00.0, CPU, memory, NUMA, and NVIDIA module-init sysfs paths, with no broad /sys or PCI parent entry;
  • sandbox CUDA, local Nemotron Ultra, and Hermes Agent health passed;
  • Hermes used write_file and read_file, and the resulting two-line artifact was independently verified;
  • the exact GPU vendor path was readable while unrelated cgroup and loopback-network sysfs reads remained denied.

The final physical acceptance used code head 7a7414b3d80a9cb38257a276cd926fd48a93ec0e. The merge head 55fe0c11cc549374a2605b882d16bf3ec40b9c3d is a signed, empty CI-retry commit with the identical Git tree and zero source diff. From a clean application baseline on stock DGX OS 7.5.0 Station GB300:

  • the released installer completed in 934 seconds (about 16 minutes) and exited 0;
  • the persisted onboarding session was complete, non-resumable, and had no remaining Station intent, retirement claim, or resume receipt;
  • validation retained the factory runtime and CDI path without package, driver, service, or Docker-runtime mutation;
  • OpenShell 0.0.85, local Nemotron Ultra, Hermes Agent, host GPU discovery, sandbox GPU enablement, and CUDA verification were healthy;
  • the sandbox could read the exact NVIDIA GPU BDF while unrelated cgroup and loopback-network sysfs paths remained denied;
  • Hermes completed independently verified write_file and read_file tasks in both one-shot mode and the real interactive TUI.

The PR was squash-merged as 929389f6fa556f0b81139fa1d7d5f14926a05f1d. The release-tag gate is the complete default E2E fan-out on current main tag candidate e7e8b674e0d7fcaa37ad3806d5f39df352e702c4, which contains this merge. It was dispatched with no job or target selectors and the internal-NVIDIA inference override: https://github.com/NVIDIA/NemoClaw/actions/runs/29607823884

Verification

  • merged Station/resume/policy regression set: 326 passed, 1 skipped across 13 files;
  • focused installer and direct-GPU policy set: 191 passed, 1 skipped;
  • post-split Station identity/host-preparation set: 75 passed;
  • onboarding flow-slice regression set: 8 passed, including the Station completion lifecycle fallback;
  • CLI and JS-config TypeScript checks: passed;
  • ShellCheck, shell syntax, Biome, repository checks, docs generation/sync, test-size budget, source-shape budget, test-conditional scanner, and diff checks: passed;
  • squash merge is present on main; the complete tag-candidate E2E matrix is tracked separately as the release-tag gate.

Physical validation here is intentionally single-Station and does not change the platform matrix from Deferred.

v0.0.86 release evidence

  • Release commit: e7e8b674e0d7fcaa37ad3806d5f39df352e702c4, which contains squash merge 929389f6fa556f0b81139fa1d7d5f14926a05f1d.
  • Complete unfiltered tag-candidate E2E: run 29607823884, final result 87 successful, 5 expected explicit-only skips, and 1 itemized maintainer exception; 84 of 85 default execution shards passed. All five non-MCP first-attempt failures passed on fresh runners in attempt 2, including Hermes E2E, both Hermes rebuild paths, gateway recovery, and Bedrock Anthropic with Hermes.
  • Sole exception: mcp-bridge (deepagents) deterministically loses a tmpfs-only marker after a graceful gateway restart. The release exception is limited to that lifecycle expectation; the narrow correction is #7119 and is labeled for v0.0.87.
  • Physical Station proof: clean DGX OS 7.5.0 GB300 acceptance, including local Nemotron 3 Ultra, sandbox CUDA, least-privilege sysfs denial checks, and real Hermes TUI write/read tool use.
  • v0.0.86 is an annotated, SSH-signed GitHub-Verified tag object efd753e485520de4491e7733a58c3410d2a4eff4; latest is independently an annotated, SSH-signed GitHub-Verified tag object adb5eafa35f4a510f32a41ed81e160944374343d. Both peel to the exact release commit above. lkg remains unchanged at 45b1cb5a01f3408743c8479772af4ad9d4a91fc8.
  • Post-tag public docs, base-image, and latest-tag workflows all passed.
  • Release announcement: NemoClaw v0.0.86 is out!

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

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

coderabbitai Bot commented Jul 17, 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
  • 🔄 Running review...
📝 Walkthrough

Walkthrough

DGX Station express install now validates safe release markers, distinguishes stock DGX OS from generic Ubuntu preparation, and verifies factory GPU runtimes without host mutation. Installer guidance, support documentation, tests, and direct-GPU sysfs policies are updated.

Changes

DGX Station express qualification

Layer / File(s) Summary
Release qualification and stock runtime validation
scripts/prepare-dgx-station-host.sh, test/install-station-dgx-os.test.ts
Validated release markers select host profiles; stock hosts validate Docker, drivers, CDI, GPU visibility, services, and ECC state without generic package mutation.
Express installer integration
scripts/install.sh, test/install-express-prompt.test.ts, test/install-station-host-preparation.test.ts
Express detection, Docker context selection, boundary errors, and stock-versus-pinned preparation messaging use release classification.
Express-install and support documentation
docs/get-started/*, docs/inference/*, docs/reference/platform-support.mdx, ci/platform-matrix.json
Documentation describes eligibility, host preparation, stock validation, headless flows, sandbox restrictions, model selection, and deferred status.
Installer test project wiring
vitest.config.ts, scripts/checks/vitest-project-overlap.ts, test/test-boundary-guards.test.ts
The DGX OS suite is assigned to the installer-integration Vitest project.

Direct GPU policy sysfs access

Layer / File(s) Summary
Station sysfs discovery and policy generation
src/lib/onboard/initial-policy.ts, src/lib/onboard/initial-policy.test.ts
Direct GPU policies discover Station GB300 PCI paths and add scoped read-only sysfs entries with deduplication and read-write precedence preserved.

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

Sequence Diagram(s)

sequenceDiagram
  participant Installer
  participant HostPreparation
  participant Docker
  participant GPU
  Installer->>HostPreparation: classify Station release
  HostPreparation->>Docker: select local default daemon
  HostPreparation->>GPU: validate driver, ECC, CDI, and visibility
  GPU->>Docker: run CDI and --gpus all probes
  Docker-->>HostPreparation: validation result
  HostPreparation-->>Installer: continue or stop
Loading

Possibly related issues

Possibly related PRs

  • NVIDIA/NemoClaw#7090 — Also modifies DGX Station host preparation and Docker/driver validation behavior.
  • NVIDIA/NemoClaw#7047 — Adds related Vitest project wiring for the new DGX OS integration suite.

Suggested labels: area: security, feature

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Linked Issues check ✅ Passed The PR satisfies #7103 by supporting the shipped DGX OS images on GB300 Station hardware and preserving the documented fail-closed boundary.
Out of Scope Changes check ✅ Passed The docs, tests, CI, and policy updates all support the Station GB300 stock-DGX-OS enablement and sysfs policy changes.
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly captures the main change: enabling stock DGX OS support on Station GB300 in the installer.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch fix/dgxos-station-express

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 17, 2026

Copy link
Copy Markdown
Contributor

Code Coverage Overview

Languages: TypeScript

TypeScript / code-coverage/plugin

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


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

@github-actions

github-actions Bot commented Jul 17, 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): Completed · high confidence · 0 blockers · 0 warnings · 0 suggestions
  • Model comparison: normalized findings match; normalized E2E selections differ; severity counts match.

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, onboard-repair, onboard-resume

2 optional E2E recommendations
  • gpu-e2e
  • spark-install

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 `@scripts/prepare-dgx-station-host.sh`:
- Around line 84-90: Update the OTA history validation around the key-processing
loop in scripts/prepare-dgx-station-host.sh (lines 84-90) to require each
DGX_OTA_VERSION immediately followed by DGX_OTA_DATE, reject orphan dates,
duplicate or consecutive versions, and reject a dangling final version. Add
regression cases in test/install-station-dgx-os.test.ts (lines 87-114) covering
duplicate versions, orphan dates, and a missing final date.
🪄 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: 436a29d7-8426-4255-95e0-80d5bcb28c84

📥 Commits

Reviewing files that changed from the base of the PR and between b37e142 and 0da802e.

📒 Files selected for processing (10)
  • docs/get-started/prerequisites.mdx
  • docs/get-started/quickstart.mdx
  • scripts/checks/vitest-project-overlap.ts
  • scripts/install.sh
  • scripts/prepare-dgx-station-host.sh
  • test/install-express-prompt.test.ts
  • test/install-station-dgx-os.test.ts
  • test/install-station-host-preparation.test.ts
  • test/test-boundary-guards.test.ts
  • vitest.config.ts

Comment thread scripts/prepare-dgx-station-host.sh Outdated
This reverts commit 0da802e.

Signed-off-by: Aaron Erickson <aerickson@nvidia.com>
@ericksoa ericksoa changed the title fix(installer): support stock DGX OS on Station fix(installer): clarify DGX OS Station boundary Jul 17, 2026
@wscurran wscurran added area: install Install, setup, prerequisites, or uninstall flow bug-fix PR fixes a bug or regression platform: dgx-station Affects DGX Station hardware or workflows v0.0.86 Release target labels Jul 17, 2026
Signed-off-by: Aaron Erickson <aerickson@nvidia.com>
@ericksoa

Copy link
Copy Markdown
Contributor Author

Exact-head evidence for c5a0b3dff2b80bc7c17f2bb39e6307101950a43f:

  • DGX OS 7.5 passed host preparation, plain Docker CDI and --gpus all, managed Nemotron Ultra deployment, direct and routed inference, a tool-using task, and managed-vLLM restart/reuse.
  • The real OpenShell sandbox remained the disqualifying boundary: cuInit(0) segfaulted there while the host, equivalent plain CDI containers, and the generic Ubuntu 24.04 ARM64 control passed. Public runtime tracking: NVIDIA/OpenShell#2343.
  • Based on that result, the earlier stock-DGX-OS enablement was reverted. This head remains fail-closed before Station host mutation and adds only actionable boundary guidance plus regression coverage.

Physical Station cleanup/status after the bounded test:

  • Previous-test containers were removed under operator authorization.
  • Final state: zero containers, zero GPU processes, and no listener on port 8000; Docker/containerd remained active.
  • No package aggregate, Docker daemon configuration, NVIDIA runtime configuration, or CDI state was changed. The acceptance image was not pulled, and no preparation --apply or --verify step ran after the qualification no-go.

Exact-head local gates:

  • Installer integration: 239 passed, 2 skipped across 7 files.
  • Growth guardrails: 42/42 passed across 4 files.
  • Bash syntax, ShellCheck, generated-doc synchronization, repository checks, CLI typecheck, secret scan, and git diff --check: passed.
  • All three branch commits are signed and appear Verified on GitHub.

No private hostnames, endpoints, lab paths, credentials, or internal report links are included in this PR.

@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

🧹 Nitpick comments (1)
test/install-station-host-preparation.test.ts (1)

60-73: 📐 Maintainability & Code Quality | 🔵 Trivial | 🏗️ Heavy lift

Prefer behavioral assertions over source-text locking.

fs.readFileSync(...) plus literal substring and regex checks fail on harmless wording changes while not proving that the installer boundary behaves correctly. Prefer generated published output or a behavior-level contract, keeping only the minimum cross-file consistency check.

As per path instructions, tests should provide behavioral confidence rather than implementation or source-text lock-in.

🤖 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-station-host-preparation.test.ts` around lines 60 - 73, Replace
the source-text assertions in the test around the DGX OS sandbox boundary with
behavioral checks against generated or published station-preparation output.
Verify the resulting contract communicates the failed sandbox boundary, avoids
treating host probes as qualification, and preserves only the minimum necessary
cross-file consistency check; remove brittle literal and regex matching on
implementation wording.

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.

Inline comments:
In `@docs/get-started/quickstart.mdx`:
- Around line 216-219: Update the headless or CI installation guidance in the
quickstart to explicitly select the DeepSeek V4 Flash managed-vLLM recipe using
NEMOCLAW_PROVIDER=install-vllm and NEMOCLAW_VLLM_MODEL=deepseek-v4-flash, or
link directly to the corresponding concrete example in set-up-vllm.mdx; keep the
interactive --station-deepseek guidance unchanged.

In `@docs/inference/set-up-vllm.mdx`:
- Around line 160-163: Scope the managed-vLLM claims in the DGX Station setup
documentation to Station systems running the generic Ubuntu 24.04 ARM64 control:
update the default-availability statement and the provider-only installation
guidance, while leaving the existing qualification warning and other platform
guidance unchanged.

---

Nitpick comments:
In `@test/install-station-host-preparation.test.ts`:
- Around line 60-73: Replace the source-text assertions in the test around the
DGX OS sandbox boundary with behavioral checks against generated or published
station-preparation output. Verify the resulting contract communicates the
failed sandbox boundary, avoids treating host probes as qualification, and
preserves only the minimum necessary cross-file consistency check; remove
brittle literal and regex matching on implementation wording.
🪄 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: 0d93fb25-366e-4934-98c6-99705a2f6e6e

📥 Commits

Reviewing files that changed from the base of the PR and between 0da802e and c5a0b3d.

📒 Files selected for processing (10)
  • ci/platform-matrix.json
  • docs/get-started/prerequisites.mdx
  • docs/get-started/quickstart.mdx
  • docs/inference/choose-inference-provider.mdx
  • docs/inference/set-up-vllm.mdx
  • docs/reference/platform-support.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 docs/get-started/quickstart.mdx Outdated
Comment thread docs/inference/set-up-vllm.mdx Outdated
@ericksoa ericksoa self-assigned this Jul 17, 2026
ericksoa added 3 commits July 17, 2026 09:03
Signed-off-by: Aaron Erickson <aerickson@nvidia.com>
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)

3271-3280: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

Select the local Docker context before Station preparation.

run_station_host_preparation currently runs first, so the generic profile can inspect and probe an ambient remote DOCKER_HOST or context. The installer then switches to local Docker, meaning the runtime actually used by onboarding was not validated. Move the context selection before ensure_station_express_host.

Proposed fix
 prepare_installer_host() {
   maybe_offer_express_install
+  if [[ "${_SELECTED_EXPRESS_PLATFORM:-}" == "DGX Station" ]]; then
+    unset DOCKER_HOST
+    export DOCKER_CONTEXT=default
+  fi
   ensure_station_express_host
-  if [[ "${_SELECTED_EXPRESS_PLATFORM:-}" == "DGX Station" ]]; then
-    unset DOCKER_HOST
-    export DOCKER_CONTEXT=default
-  fi
   ensure_docker
🤖 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 3271 - 3280, Update prepare_installer_host
so the DGX Station local Docker context selection occurs before calling
ensure_station_express_host. Move the DOCKER_HOST unset and
DOCKER_CONTEXT=default export block ahead of Station preparation, preserving the
platform guard and leaving ensure_docker after preparation.
🧹 Nitpick comments (2)
src/lib/onboard/initial-policy.test.ts (2)

132-146: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Cover /sys already present in read_write.

buildDirectGpuPolicyYaml checks both policy lists, but these tests only cover /sys in read_only. Add a fixture with /sys in read_write and verify it is not duplicated into read_only.

As per path instructions, tests should provide behavioral confidence for the changed branches.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/lib/onboard/initial-policy.test.ts` around lines 132 - 146, Add a test
case in the existing initial-policy tests using buildDirectGpuPolicyYaml with
/sys already listed under filesystem_policy.read_write, then assert /sys is not
added or duplicated in filesystem_policy.read_only. Keep the fixture focused on
this branch and preserve the existing read_only coverage.

Source: Path instructions


128-130: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Avoid locking tests to array ordering.

The contract is presence, removal, and non-duplication; assert those properties with toContain/not.toContain and a count check for /sys instead of exact ordered arrays.

As per path instructions, tests should provide behavioral confidence rather than implementation lock-in.

Also applies to: 145-146

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/lib/onboard/initial-policy.test.ts` around lines 128 - 130, Update the
filesystem policy assertions in the GPU policy tests to avoid exact array
ordering: use containment checks for required paths, non-containment checks for
removed paths, and verify `/sys` appears exactly once. Apply the same assertion
style to the additional assertions around the referenced second location,
preserving coverage of presence, removal, and non-duplication.

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.

Inline comments:
In `@scripts/prepare-dgx-station-host.sh`:
- Around line 119-123: Restore the fail-closed stock DGX OS boundary: in
scripts/prepare-dgx-station-host.sh lines 119-123 remove stock version and
host-profile support; in scripts/install.sh lines 2962-2966 allow Station
express only for generic-ubuntu. Update test/install-express-prompt.test.ts
lines 681-704 and 760-788, test/install-station-dgx-os.test.ts lines 54-68 and
237-260, and test/install-station-host-preparation.test.ts lines 60-63 to assert
stock rejection, blocker guidance, and removal of unreachable stock validation.
Update prerequisites.mdx lines 44-74 and quickstart.mdx lines 122-134, 201-217,
and 240 to document rejection before mutation, generic Ubuntu or non-express
alternatives, and the unresolved OpenShell sandbox runtime blocker.

In `@src/lib/onboard/initial-policy.test.ts`:
- Line 82: Append the applicable local issue reference, such as (`#7103`), as the
final suffix to the changed test titles in the tests around the cases at lines
82 and 132, including the title beginning “prepares sysfs read access…”.

---

Outside diff comments:
In `@scripts/install.sh`:
- Around line 3271-3280: Update prepare_installer_host so the DGX Station local
Docker context selection occurs before calling ensure_station_express_host. Move
the DOCKER_HOST unset and DOCKER_CONTEXT=default export block ahead of Station
preparation, preserving the platform guard and leaving ensure_docker after
preparation.

---

Nitpick comments:
In `@src/lib/onboard/initial-policy.test.ts`:
- Around line 132-146: Add a test case in the existing initial-policy tests
using buildDirectGpuPolicyYaml with /sys already listed under
filesystem_policy.read_write, then assert /sys is not added or duplicated in
filesystem_policy.read_only. Keep the fixture focused on this branch and
preserve the existing read_only coverage.
- Around line 128-130: Update the filesystem policy assertions in the GPU policy
tests to avoid exact array ordering: use containment checks for required paths,
non-containment checks for removed paths, and verify `/sys` appears exactly
once. Apply the same assertion style to the additional assertions around the
referenced second location, preserving coverage of presence, removal, and
non-duplication.
🪄 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: fd34b3db-9553-4b2f-8a9d-2e3676d3bc0a

📥 Commits

Reviewing files that changed from the base of the PR and between c5a0b3d and 2d85bac.

📒 Files selected for processing (12)
  • docs/get-started/prerequisites.mdx
  • docs/get-started/quickstart.mdx
  • scripts/checks/vitest-project-overlap.ts
  • scripts/install.sh
  • scripts/prepare-dgx-station-host.sh
  • src/lib/onboard/initial-policy.test.ts
  • src/lib/onboard/initial-policy.ts
  • test/install-express-prompt.test.ts
  • test/install-station-dgx-os.test.ts
  • test/install-station-host-preparation.test.ts
  • test/test-boundary-guards.test.ts
  • vitest.config.ts

Comment thread scripts/prepare-dgx-station-host.sh
Comment thread src/lib/onboard/initial-policy.test.ts Outdated
@apurvvkumaria apurvvkumaria self-assigned this Jul 17, 2026

@apurvvkumaria apurvvkumaria left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Requesting changes on exact head 2d85bac48439cdf62d84ebdb1c628d3bdc6a19b8 for the following release and sandbox-safety blockers:

  1. The current installer and prerequisites enable stock DGX OS 7.2.0/7.4.0/7.5.0, while ci/platform-matrix.json, the vLLM documentation, and this PR's description state that no stock DGX OS release is qualified and record a CUDA initialization failure inside a real OpenShell sandbox. Host and plain-container GPU visibility is not sufficient for this boundary. Please restore the fail-closed stock-image behavior, or provide a successful exact-head physical OpenShell acceptance run and make the implementation, PR description, platform matrix, and all docs agree.

  2. ensure_station_express_host runs before the installer clears DOCKER_HOST and selects the local default context. The generic preparation path also uses the ambient Docker client for workload checks. That can inspect one daemon and then continue onboarding against another. Select and bind the intended local daemon before every preparation/workload check, prove the same daemon is used throughout, and add a regression for non-default DOCKER_HOST/DOCKER_CONTEXT input.

  3. The platform boundary is not strong enough for automatic host mutation. A standalone P3830 token passes the DMI predicate, after which the generic Ubuntu path can begin package changes before proving the expected GB300 GPU identity. The release-marker parser also claims to reject NVIDIA BaseOS but has no positive audited discriminator and can accept the same release-file schema/version. Please fail closed on an exact qualified product/image identity, prove the GPU identity before mutation, and add negative fixtures for BaseOS and unrelated P3830 hosts.

  4. The change adds the whole /sys tree read-only to every direct-GPU sandbox policy. That is a global isolation-boundary expansion, not a DGX-OS-only adjustment, and the current unit assertion does not establish least privilege or that it fixes the real OpenShell failure. Please scope it to the minimum required paths (or justify why that is impossible), add boundary coverage, and include successful real-sandbox acceptance evidence before relying on it to qualify this path.

The current codebase-growth-guardrails failure also needs to be resolved. I did not find an authorization, credential-exposure, command-injection, or unpinned-download regression in the reviewed diff, but the trust-boundary, fail-closed, isolation, and platform-identity findings above block approval.

ericksoa added 2 commits July 17, 2026 09:51
Signed-off-by: Aaron Erickson <aerickson@nvidia.com>
Signed-off-by: Aaron Erickson <aerickson@nvidia.com>
@ericksoa ericksoa changed the title fix(installer): clarify DGX OS Station boundary fix(installer): enable stock DGX OS on Station GB300 Jul 17, 2026

@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 (1)
docs/get-started/prerequisites.mdx (1)

44-50: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

Align all Station documentation with the fail-closed qualification boundary.

The same stale claim appears across the public docs: stock DGX OS is presented as accepted and sandbox cuInit(0) as validated, while the PR objective keeps stock images rejected before host mutation and the supplied qualification summary records a real-OpenShell cuInit(0) segfault.

  • docs/get-started/prerequisites.mdx#L44-L50: document generic Ubuntu 24.04 ARM64 as the express-qualified path and stock images as blocked.
  • docs/get-started/prerequisites.mdx#L65-L77: remove the implication that stock validation completed successfully.
  • docs/inference/set-up-vllm.mdx#L160-L165: describe the unresolved blocker instead of stock qualification.
  • docs/reference/platform-support.mdx#L85-L85: correct the generated Station platform row and regenerate it from the matrix source.
  • docs/reference/platform-support.mdx#L107-L107: remove the stock-DGX-OS managed-vLLM qualification claim.

Based on the supplied PR objectives and qualification summary.

🤖 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 `@docs/get-started/prerequisites.mdx` around lines 44 - 50, Align all Station
documentation with fail-closed qualification: in
docs/get-started/prerequisites.mdx lines 44-50, present generic Ubuntu 24.04
ARM64 as the only express-qualified path and state that stock DGX OS images are
blocked; update lines 65-77 to remove any claim of successful stock validation.
In docs/inference/set-up-vllm.mdx lines 160-165, describe the unresolved
real-OpenShell cuInit(0) blocker. Correct the generated Station row in
docs/reference/platform-support.mdx line 85 by updating and regenerating it from
the platform-support matrix source, and remove the stock-DGX-OS managed-vLLM
qualification claim at line 107.
🤖 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 `@docs/get-started/prerequisites.mdx`:
- Around line 44-50: Align all Station documentation with fail-closed
qualification: in docs/get-started/prerequisites.mdx lines 44-50, present
generic Ubuntu 24.04 ARM64 as the only express-qualified path and state that
stock DGX OS images are blocked; update lines 65-77 to remove any claim of
successful stock validation. In docs/inference/set-up-vllm.mdx lines 160-165,
describe the unresolved real-OpenShell cuInit(0) blocker. Correct the generated
Station row in docs/reference/platform-support.mdx line 85 by updating and
regenerating it from the platform-support matrix source, and remove the
stock-DGX-OS managed-vLLM qualification claim at line 107.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: 0ae1d629-6c49-4e66-8ed9-e7b6bc543538

📥 Commits

Reviewing files that changed from the base of the PR and between 2d85bac and 58c11e9.

📒 Files selected for processing (12)
  • ci/platform-matrix.json
  • docs/get-started/prerequisites.mdx
  • docs/get-started/quickstart.mdx
  • docs/inference/choose-inference-provider.mdx
  • docs/inference/set-up-vllm.mdx
  • docs/reference/platform-support.mdx
  • scripts/install.sh
  • scripts/prepare-dgx-station-host.sh
  • src/lib/onboard/initial-policy.test.ts
  • test/install-express-prompt.test.ts
  • test/install-station-dgx-os.test.ts
  • test/install-station-host-preparation.test.ts
🚧 Files skipped from review as they are similar to previous changes (6)
  • docs/inference/choose-inference-provider.mdx
  • src/lib/onboard/initial-policy.test.ts
  • docs/get-started/quickstart.mdx
  • ci/platform-matrix.json
  • scripts/install.sh
  • scripts/prepare-dgx-station-host.sh

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

Caution

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

⚠️ Outside diff range comments (1)
src/lib/onboard/initial-policy.ts (1)

324-334: 📐 Maintainability & Code Quality | 🟠 Major | ⚡ Quick win

Add one public-boundary regression test for the complete Station sysfs flow.

  • src/lib/onboard/initial-policy.ts#L324-L334: protect forwarding from stationGb300SysfsReadOnlyPaths into direct-GPU policy generation.
  • src/lib/onboard/initial-policy.test.ts#L158-L201: invoke prepareInitialSandboxCreatePolicy, inspect the generated policy, and run its cleanup.

As per path instructions, tests must prove that public entrypoints reach the new path.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/lib/onboard/initial-policy.ts` around lines 324 - 334, Add a
public-boundary regression test covering the complete Station sysfs flow. In
src/lib/onboard/initial-policy.ts lines 324-334, preserve forwarding of
stationGb300SysfsReadOnlyPaths into direct-GPU policy generation; in
src/lib/onboard/initial-policy.test.ts lines 158-201, invoke
prepareInitialSandboxCreatePolicy, inspect the generated policy for the
forwarded paths, and execute the returned cleanup.

Sources: Coding guidelines, 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.

Inline comments:
In `@test/install-station-host-preparation.test.ts`:
- Around line 123-124: Update the expectations in the Station product-identifier
test for “P3830” and “NVIDIA P3830 Rev A” from false to true, preserving the
existing test structure so both newly supported identities are accepted.

---

Outside diff comments:
In `@src/lib/onboard/initial-policy.ts`:
- Around line 324-334: Add a public-boundary regression test covering the
complete Station sysfs flow. In src/lib/onboard/initial-policy.ts lines 324-334,
preserve forwarding of stationGb300SysfsReadOnlyPaths into direct-GPU policy
generation; in src/lib/onboard/initial-policy.test.ts lines 158-201, invoke
prepareInitialSandboxCreatePolicy, inspect the generated policy for the
forwarded paths, and execute the returned cleanup.
🪄 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: efce602d-b72f-403f-a06c-49d83fe3809f

📥 Commits

Reviewing files that changed from the base of the PR and between 58c11e9 and 2db0ea0.

📒 Files selected for processing (12)
  • ci/platform-matrix.json
  • docs/get-started/prerequisites.mdx
  • docs/inference/choose-inference-provider.mdx
  • docs/inference/set-up-vllm.mdx
  • docs/reference/platform-support.mdx
  • scripts/install.sh
  • scripts/prepare-dgx-station-host.sh
  • src/lib/onboard/initial-policy.test.ts
  • src/lib/onboard/initial-policy.ts
  • test/install-express-prompt.test.ts
  • test/install-station-dgx-os.test.ts
  • test/install-station-host-preparation.test.ts
🚧 Files skipped from review as they are similar to previous changes (9)
  • docs/inference/set-up-vllm.mdx
  • docs/inference/choose-inference-provider.mdx
  • docs/reference/platform-support.mdx
  • ci/platform-matrix.json
  • test/install-station-dgx-os.test.ts
  • test/install-express-prompt.test.ts
  • scripts/install.sh
  • docs/get-started/prerequisites.mdx
  • scripts/prepare-dgx-station-host.sh

Comment thread test/install-station-host-preparation.test.ts Outdated
Signed-off-by: Aaron Erickson <aerickson@nvidia.com>
Signed-off-by: Aaron Erickson <aerickson@nvidia.com>
@apurvvkumaria apurvvkumaria added v0.0.87 Release target v0.0.86 Release target and removed v0.0.86 Release target v0.0.87 Release target labels Jul 17, 2026
@ericksoa ericksoa added v0.0.86 Release target and removed v0.0.87 Release target labels Jul 17, 2026
@apurvvkumaria apurvvkumaria added v0.0.87 Release target and removed v0.0.86 Release target labels Jul 17, 2026
Signed-off-by: Aaron Erickson <aerickson@nvidia.com>
@apurvvkumaria apurvvkumaria added v0.0.86 Release target and removed v0.0.87 Release target labels Jul 17, 2026
ericksoa added 2 commits July 17, 2026 11:49
Signed-off-by: Aaron Erickson <aerickson@nvidia.com>
Signed-off-by: Aaron Erickson <aerickson@nvidia.com>
@ericksoa
ericksoa merged commit 929389f into main Jul 17, 2026
49 of 51 checks passed
@ericksoa
ericksoa deleted the fix/dgxos-station-express branch July 17, 2026 19:20
@ericksoa

ericksoa commented Jul 17, 2026

Copy link
Copy Markdown
Contributor Author

Physical Station acceptance and release-tag gate

Validated code head 7a7414b3d80a9cb38257a276cd926fd48a93ec0e from a clean application baseline on physical stock DGX OS 7.5.0 Station GB300. Merge head 55fe0c11cc549374a2605b882d16bf3ec40b9c3d is a signed empty CI-retry commit with the identical Git tree and zero source diff.

  • Baseline: zero containers, GPU processes, listeners on ports 8000/8080, prior NemoClaw/OpenShell commands, and failed systemd units.
  • Installer: exact source resolved; completed in 934 seconds (about 16 minutes) and exited 0.
  • Lifecycle: session persisted complete and non-resumable; Station intent and retirement state cleared; resume receipt and retirement claims absent.
  • Host/runtime: validation-only stock DGX OS path; factory runtime/CDI/local Docker retained; OpenShell 0.0.85; local Nemotron Ultra healthy.
  • Isolation: exact GPU BDF plus bounded CPU, memory, NUMA, and NVIDIA module-initialization paths, with no broad /sys; CUDA passed while unrelated cgroup and loopback-network sysfs reads remained denied.
  • Functional proof: Hermes one-shot and the real interactive TUI each completed write_file and read_file tasks; both artifacts were independently verified.
  • Evidence: full terminal transcript retained privately with mode 0600.

The PR was squash-merged as 929389f6fa556f0b81139fa1d7d5f14926a05f1d. The release-tag gate is the complete default E2E fan-out on current main tag candidate e7e8b674e0d7fcaa37ad3806d5f39df352e702c4, which contains this merge. It was dispatched with no job or target selectors and the internal-NVIDIA inference override: https://github.com/NVIDIA/NemoClaw/actions/runs/29607823884

apurvvkumaria added a commit that referenced this pull request Jul 18, 2026
<!-- markdownlint-disable MD041 -->
## Summary

DGX Station host preparation now follows the host-profile boundary
established by merged PR #7108: generic Ubuntu requires the reviewed
exact prerequisite tuple, while qualifying stock DGX OS validates its
factory runtime without package or runtime mutation. The installer also
accepts an exact verified Docker `.asc` source, selects GB300 driver and
ECC rows by PCI identity on mixed-GPU systems, and keeps express output
concise while retaining the full audit log.

## Changes

- Reconcile the branch with current `main` and preserve the fail-closed
generic Ubuntu and validation-only stock DGX OS profiles from #7108.
Unknown package, driver, and CUDA-keyring drift is rejected; the
reviewed factory DKMS transition remains the only generic profile
exception.
- Pass the complete pinned prerequisite tuple unchanged through APT
availability, simulation, installation, and exact post-install
verification. This avoids a missing-only solve that could mutate
retained prerequisites.
- Reuse an existing Docker repository only when its source bytes exactly
match the reviewed `.gpg` or `.asc` form and the referenced key is
byte-identical to the freshly downloaded SHA-256 and
fingerprint-verified key. New repository configuration continues to use
the dearmored `.gpg` form.
- Match `nvidia-smi` rows to the GB300 through exact PCI vendor, device,
and display-class identity before applying driver and ECC qualification.
Auxiliary NVIDIA GPUs are reported and skipped.
- Show the Station audit-log path plus all warnings and errors in
express install, while keeping verbose preparation details in the
private log.
- Update prerequisites documentation and split focused Docker-repository
and package-transaction tests out of the host-preparation suite.

## Type of Change

- [ ] Code change (feature, bug fix, or refactor)
- [x] Code change with doc updates
- [ ] Doc only (prose changes, no code sample modifications)
- [ ] 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:
- [x] Sensitive paths changed (security, policy, credentials, preflight,
onboarding, inference, runner, sandbox, or messaging)
- [x] Sensitive-path review completed or maintainer-approved waiver
recorded — reviewer/approval link/justification: The current revision
implements the fail-closed boundaries requested in [maintainer
feedback](#7090 (comment))
and aligns profile handling with merged #7108. Exact-profile, full-tuple
APT, PCI-identity, CUDA-keyring, repository-file, rollback, and
file-safety contracts have focused regression coverage. The current head
awaits human re-review.
- [ ] 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 — full `npx vitest run --project
installer-integration --testTimeout=15000` (295 passed, 2 skipped);
Station platform identity (22 passed); `npm run test:projects:check`;
`npm run test-size:check`; Bash syntax and ShellCheck.
- [ ] Applicable broad gate passed — `npm test` for broad
runtime/test-harness changes; `npm run check` for repo-wide
validation/coverage changes — not applicable: this is a focused
installer revision, and the complete installer-integration project plus
diff-scoped repository gate passed.
- [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; Fern continues to report 2 existing 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: San Dang <sdang@nvidia.com>
Signed-off-by: Julie Yaunches <jyaunches@nvidia.com>

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

* **Bug Fixes**
* Improved DGX Station GPU detection and driver/ECC validation by
matching devices to their PCI identities.
* Added stricter Docker repository and signing-key compatibility checks.
* Prevented unsafe or unexpected package changes during host
preparation.
* Improved installer output by preserving useful logs, warnings, and
errors while filtering irrelevant details.

* **Improvements**
* Updated DGX Station host preparation version and strengthened
installation reliability.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->

---------

Signed-off-by: San Dang <sdang@nvidia.com>
Signed-off-by: Apurv Kumaria <akumaria@nvidia.com>
Signed-off-by: Carlos Villela <cvillela@nvidia.com>
Co-authored-by: Julie Yaunches <jyaunches@nvidia.com>
Co-authored-by: Apurv Kumaria <akumaria@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: install Install, setup, prerequisites, or uninstall flow bug-fix PR fixes a bug or regression platform: dgx-station Affects DGX Station hardware or workflows v0.0.86 Release target

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[DGX Station][Install] express install boundary refuses stock DGX OS on GB300 Station hardware

3 participants