feat(installer): prepare DGX Station host prerequisites - #6991
Conversation
Signed-off-by: Aaron Erickson <aerickson@nvidia.com>
|
Note Reviews pausedIt looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the Use the following commands to manage reviews:
Use the checkboxes below for quick actions:
📝 WalkthroughWalkthroughDGX Station express installation now prepares pinned host prerequisites, validates NVIDIA runtime support, persists and resumes setup across reboot status 10, and adds integration coverage and documentation for the flow. ChangesDGX Station express installation
Estimated code review effort: 4 (Complex) | ~60 minutes Sequence Diagram(s)sequenceDiagram
participant User
participant Installer
participant HostPreparation
participant DGXStation
User->>Installer: Start express install
Installer->>HostPreparation: Prepare Station host
HostPreparation->>DGXStation: Check and install pinned prerequisites
DGXStation-->>HostPreparation: Reboot required
HostPreparation-->>Installer: Exit status 10 and persist model
User->>Installer: Rerun after reboot
Installer->>HostPreparation: Resume Station preparation
HostPreparation->>DGXStation: Verify Docker, CDI, and GPU
DGXStation-->>Installer: Host ready
Possibly related PRs
Suggested labels: Suggested reviewers: 🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
Comment |
Code Coverage OverviewLanguages: TypeScript TypeScript / code-coverage/pluginThe overall coverage remains at 96%, unchanged from the TypeScript / code-coverage/cliThe overall coverage in the Show a code coverage summary of the most impacted files.
Updated |
|
🌿 Preview your docs: https://nvidia-preview-pr-6991.docs.buildwithfern.com/nemoclaw |
PR Review Advisor — Blocking findings reportedAdvisor assessment: Blockers require maintainer review Model lanes
Nemotron output stays in workflow artifacts and does not change the assessment above. E2E guidanceAdvisory only. E2E / PR Gate selects and runs jobs independently. Recommended E2E: 3 optional E2E recommendations
Blockers
|
There was a problem hiding this comment.
Actionable comments posted: 6
🧹 Nitpick comments (1)
test/install-station-host-preparation.test.ts (1)
228-323: 🔒 Security & Privacy | 🔵 Trivial | ⚡ Quick winExercise the symlink-safe resume-state contract.
The tests cover file mode and malformed content, but not a pre-existing
station-express-resumesymlink. Add public-boundary tests proving resume loading and persistence reject symlinks without reading or modifying their target.🤖 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 228 - 323, Add public-boundary tests covering a pre-existing symlink at station-express-resume for both load_station_express_resume and ensure_station_express_host. Verify each operation rejects the symlink, does not read its target during resume loading, and does not modify the target during persistence, while preserving the existing error/status expectations.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/install.sh`:
- Line 3092: Disclose that DGX Station support remains Deferred and pending
physical end-to-end validation across all four sites: scripts/install.sh lines
3092-3092, docs/get-started/prerequisites.mdx lines 44-49, and
docs/get-started/quickstart.mdx lines 124-125 and 195-197. Add the status before
installation and reboot acceptance in the installer, add a warning in
prerequisites, and qualify both quickstart reboot-and-resume Station flows;
preserve the existing recipe and explicitly state that validation remains open.
- Around line 3146-3150: Update the DGX Station resume path around
load_station_express_resume and activate_express_install to evaluate the
existing NEMOCLAW_PROVIDER override guard before resuming; when an explicit
provider is set, skip this branch so activate_express_install cannot overwrite
it, and remove the later duplicate provider guard.
In `@scripts/prepare-dgx-station-host.sh`:
- Around line 278-289: Update the Docker detection branch around `containers` so
an inactive Docker daemon is not represented as an empty container list.
Preserve the unavailable/unknown state when `systemctl is-active --quiet
docker.service` is false, and ensure the later startup logic around the
workload-safety check cannot auto-start workloads until container state has been
successfully verified.
- Around line 425-433: Update ensure_docker_group so adding Docker membership
via usermod records the host as requiring reboot/resume and returns status 10
instead of reporting success; preserve status 0 when membership is already
active or non-sudo Docker access is verified, matching install.sh’s existing
status handling.
- Around line 368-383: Update the repository setup flow around dpkg -i, Docker
key installation, and Docker source-list creation to preserve existing
configuration before mutation: reuse files that exactly match the expected
content, and reject mismatched existing files or package state instead of
downgrading or overwriting them. Apply the existing package-pin contract and
relevant validation/backup helpers consistently across the CUDA keyring and
Docker repository configuration.
In `@test/install-station-host-preparation.test.ts`:
- Around line 16-29: Add timeout: 15_000 and killSignal: "SIGKILL" to the
spawnSync options in runSourced and both resume-state probe call sites, ensuring
all three synchronous Bash subprocesses are forcibly bounded without changing
their existing environment or commands.
---
Nitpick comments:
In `@test/install-station-host-preparation.test.ts`:
- Around line 228-323: Add public-boundary tests covering a pre-existing symlink
at station-express-resume for both load_station_express_resume and
ensure_station_express_host. Verify each operation rejects the symlink, does not
read its target during resume loading, and does not modify the target during
persistence, while preserving the existing error/status expectations.
🪄 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: a1d595cd-0728-4042-84f6-82efd78d9ff6
📒 Files selected for processing (8)
docs/get-started/prerequisites.mdxdocs/get-started/quickstart.mdxscripts/checks/vitest-project-overlap.tsscripts/install.shscripts/prepare-dgx-station-host.shtest/install-express-prompt.test.tstest/install-station-host-preparation.test.tsvitest.config.ts
Signed-off-by: Aaron Erickson <aerickson@nvidia.com>
Signed-off-by: Aaron Erickson <aerickson@nvidia.com>
Signed-off-by: Aaron Erickson <aerickson@nvidia.com>
|
Reviewed current head Blocker — the clean-factory DKMS transition is rejected. The audited CLEAN Ubuntu image starts with Please allow only the explicit High — the pre-mutation platform gate accepts non-GB300 DGX Stations.
Require both Station and GB300 in the initial DMI gate before any sudo mutation, and add negative tests for Please address or clarify these in the next revision. |
|
Security review of current head The SHA-256, GPG-fingerprint, exact-version, and container-digest checks are good. I found no hardcoded secret, shell-injection path, or newly exposed service. Before promoting the pilot helper into the installer, please address or clarify these boundaries. Major — privileged configuration paths are not fully validated.
Medium — the boot marker permits same-user file clobbering.
Major — reboot resume is not bound to an immutable installer revision. The default install reference is mutable Security contract — Docker-group membership is a persistent root-equivalent grant. The Station helper automatically runs Holistic posture — pilot service exceptions are too broad for a canonical installer.
These are separate from the existing automated-review comments and the functional clean-factory/GB300 findings. Please address or clarify them in the next revision. |
Signed-off-by: Aaron Erickson <aerickson@nvidia.com>
There was a problem hiding this comment.
Actionable comments posted: 1
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@test/install-station-host-preparation.test.ts`:
- Around line 425-440: Update the test for prepare_installer_host to stub the
production boundary ensure_station_express_host instead of the indirect
run_station_host_preparation helper. Emit the existing PREPARE_STATION marker
from that stub and keep the assertions verifying it is absent and that
ENSURE_DOCKER precedes ENSURE_BUILD_DEPS.
🪄 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: 8a0ec0ed-eb3f-4836-a733-88b9b7228bf1
📒 Files selected for processing (3)
scripts/install.shscripts/prepare-dgx-station-host.shtest/install-station-host-preparation.test.ts
🚧 Files skipped from review as they are similar to previous changes (2)
- scripts/install.sh
- scripts/prepare-dgx-station-host.sh
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>
cv
left a comment
There was a problem hiding this comment.
Blocking exact head fb2be367c5580158353a7a21ca6893345358119b. This creates a new supported, privileged DGX Station installer surface without an accepted product-scope decision defining ownership, lifecycle, compatibility, security, and physical validation, so the repository product-scope gate is not satisfied. The implementation also still has unresolved host-safety and resume-integrity issues: DKMS/package transition handling and GB300 gating are incomplete; repository/keyring files and resume state are not protected by the required metadata/symlink/TOCTOU contracts; reboot state is mutable; Docker group activation and inactive-daemon/container-state handling can report unsafe success; and service/workload mutation remains too broad. The current CodeRabbit findings about provider override ordering, repository preservation, Docker membership/reboot, inactive daemon state, symlink-safe resume, and bounded subprocess tests are valid. Please obtain the product decision first, then resolve these contracts and provide physical Station E2E evidence before this can target v0.0.85.
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: Senthil Kumar Ravichandran <senthilr@nvidia.com>
…st-prereqs Signed-off-by: Senthil Kumar Ravichandran <senthilr@nvidia.com>
Signed-off-by: Senthil Kumar Ravichandran <senthilr@nvidia.com>
|
Current head
Current-head validation: installer integration 233 passed, 2 skipped; ShellCheck/shfmt passed; docs built with 0 errors (2 existing warnings). All ordinary CI, image E2Es, CodeQL, and both review-advisor lanes passed. The trusted gate hit a transient GitHub API 500 before the selected credentialed E2Es could start; its retry confirmed that maintainer authorization is now required for Physical clean-host validation was performed on prior head Please authorize the selected credentialed E2Es and independently rereview current head. |
|
Exact-head handoff for
The physical Station run remains a recovered prior-head E2E: chat, tool use, and ECC passed after an HF 429 required authenticated resume. @ericksoa, please authorize the selected exact-head jobs. @cv, please independently rereview this exact head after they complete. |
Signed-off-by: Aaron Erickson <aerickson@nvidia.com>
|
Maintainer waiver for the exact-head non-success I am accepting only the Hermes This waiver is narrow: it does not accept a product/test assertion failure, missing evidence from a completed test, or any future head. Follow-up #7052 tracks safe exact-diff E2E retry recovery; its current draft implementation does not yet classify this runner-loss shape. |
<!-- markdownlint-disable MD041 --> ## Summary Add the canonical dated changelog entry required before the v0.0.85 release plan can be generated. The entry summarizes the user-visible OpenShell, DGX Station, inference, MCP, onboarding, and recovery changes merged since v0.0.84 and links to their owning guides. ## Changes - Add `docs/changelog/2026-07-16.mdx` with the exact `## v0.0.85` heading, parser-safe SPDX comment, release summary, and detailed bullets. - Link every documented theme to its most specific published OpenClaw guide routes. - Reconcile the release entry with these merged source PRs: - #6726 -> `docs/changelog/2026-07-16.mdx`: Document the supported OpenShell v0.0.85 upgrade, immutable consumed artifacts, multiline exec, credential rewrite diagnostics, and child-process TLS boundary. - #6986 -> `docs/changelog/2026-07-16.mdx`: Document managed MCP behavior shared across supported agents. - #6991 and #7045 -> `docs/changelog/2026-07-16.mdx`: Document qualified DGX Station host preparation and the interactive-terminal boundary for `--station-deepseek`. - #6992, #7001, #7006, and #7044 -> `docs/changelog/2026-07-16.mdx`: Document managed-model reasoning behavior, safe inference route mutation, and verified vLLM served aliases. - #6865, #7010, and #7028 -> `docs/changelog/2026-07-16.mdx`: Document onboarding DNS recovery, explicit notice acceptance, and upgrades with user-local OpenShell. - #7005, #7021, #7029, and #7049 -> `docs/changelog/2026-07-16.mdx`: Document rebuild backup safety, no-dashboard state, managed gateway discovery, and Hermes shields topology checks. ## Type of Change - [ ] Code change (feature, bug fix, or refactor) - [ ] Code change with doc updates - [x] Doc only (prose changes, no code sample modifications) - [ ] Doc only (includes code sample changes) ## Quality Gates - [ ] Tests added or updated for changed behavior - [x] Existing tests cover changed behavior — justification: `test/changelog-docs.test.ts` validates the canonical heading, parser-safe SPDX comment, and detailed entry structure; the docs build validates published routes. - [ ] 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` passed 6/6. - [ ] Applicable broad gate passed — `npm test` for broad runtime/test-harness changes; `npm run check` for repo-wide validation/coverage changes — not applicable to this doc-only entry. - [x] Quality Gates section completed with required justifications or waivers - [x] No secrets, API keys, or credentials committed - [ ] `npm run docs` builds without warnings (doc changes only) — passed with 0 errors and 2 pre-existing Fern warnings. - [x] Doc pages follow the [style guide](https://github.com/NVIDIA/NemoClaw/blob/main/docs/CONTRIBUTING.md) (doc changes only) - [x] New doc pages include SPDX header and frontmatter (new pages only) — native changelog entries use the required parser-safe MDX SPDX comment instead of frontmatter. --- Signed-off-by: Charan Jagwani <cjagwani@nvidia.com> <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **Documentation** * Added release notes for NemoClaw v0.0.85. * Documented improvements to compatibility, credential handling, setup validation, recovery workflows, endpoint configuration, gateway discovery, and runtime validation. * Added links to relevant user-guide sections. <!-- end of auto-generated comment: release notes by coderabbit.ai --> Signed-off-by: Charan Jagwani <cjagwani@nvidia.com>
<!-- markdownlint-disable MD041 --> ## Summary DGX Station Express now records its secret-free provider, model, sandbox, and interaction intent before managed vLLM setup can fail. Running `nemoclaw onboard --resume` restores those choices and retries the failed Express step instead of returning to the generic provider and model prompts. This follow-up is refreshed onto current `main` after #6991 merged and contains only the Station Express resume fix. Supersedes #7053, which GitHub automatically closed when its stacked base branch was removed after merge. ## Related Issue Fixes #7048 ## Changes - Mark only the DGX Station Express installer path so DGX Spark and generic onboarding remain unchanged. - Persist a versioned, validated, secret-free Station Express resume intent in the existing owner-only onboarding session. - Restore the managed-vLLM model and Express defaults for failed or interrupted sessions, reject conflicting or malformed state, and clear the intent after successful completion or `--fresh`. - Persist the exact validated vLLM served model selected during provider setup, accept compatible registered identities, reject aliases for a different model, and require the same identity on later resumes. - Retire the owner/path-validated Station installer reboot receipt after successful onboarding or explicit `onboard --fresh`, so a later installer run cannot restore stale Express choices. - Cover initial capture, injected provider failure, failed-session resume, completed provider reuse, cleanup, post-success installer re-entry, malformed state, and the Station/Spark installer boundary. - Correct the command reference to include resumable failed onboarding sessions. ## 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) - [ ] Sensitive-path review completed or maintainer-approved waiver recorded — reviewer/approval link/justification: Apurv approved prior exact head `98d6f503`; exact-head rereview requested for `3dd789c5` after the alias-validation and success/fresh receipt-lifecycle fixes - [ ] 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 — current-head verification: 28 Station wrapper/session tests, 68 general session tests, and all 59 Station installer integration tests passed; the preceding provider/vLLM selection coverage also passed; `npm run typecheck:cli`, normal commit hooks, and push-time CLI typecheck passed - [ ] Applicable broad gate passed — `npx vitest run --project cli` completed with 9,084 passed, 20 skipped, and four unrelated local failures (missing Python `yaml`, a temp-directory cleanup race, and two existing five-second timeouts) - [ ] 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: Senthil Ravichandran <senthilr@nvidia.com> <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **New Features** * DGX Station Express onboarding now persists a validated, secret-free resume intent through session setup, including optional served-model support. * “Fresh” onboarding now discards prior Station Express resume state and skips restoring any prior express recipe. * **Bug Fixes** * Prevented Station Express environment flags from leaking into non–DGX Station express flows. * Improved Station Express resume guardrails: detects conflicting/invalid persisted intents, preserves/resets provider/model state safely, and avoids completing provider selection on failure. * **Documentation** * Updated `onboard --resume` guidance to cover resumable interrupted or failed sessions (keeping existing restrictions). * **Tests** * Expanded Station Express/session-state and resume integration coverage, including prompt/output assertions for `STATION_EXPRESS`. <!-- end of auto-generated comment: release notes by coderabbit.ai --> --------- Signed-off-by: Senthil Ravichandran <senthilr@nvidia.com> Signed-off-by: Apurv Kumaria <akumaria@nvidia.com> Co-authored-by: Apurv Kumaria <akumaria@nvidia.com> Co-authored-by: Aaron Erickson 🦞 <aerickson@nvidia.com>
Summary
DGX Station express install now probes the validated host prerequisites before generic Docker setup, reuses exact matches, and installs missing pinned packages without additional choices.
When package preparation requires the validated reboot boundary, rerunning the same installer command resumes the accepted Station recipe without another prompt.
This automation does not change DGX Station's Deferred support status.
Related Issue
Related to #6951; this does not close the physical DGX Station end-to-end validation gate.
Changes
10requires a reboot, then clear it after successful installation.--gpus alllaunches.Parallel Download Analysis
The current cold path is ordered as Station consent -> host preparation/reboot -> Node, NemoClaw, and OpenShell setup -> vLLM image pull -> model-storage re-probe -> model download -> vLLM launch. The package-manager, DKMS, reboot, and Docker-runtime mutation portion must remain serialized.
A digest-pinned image-only prefetch is viable, but DMI detection or the read-only host check is too early. The safe lower bound is after the user accepts Station express install, the effective Ultra/DeepSeek model is fixed, and Station host preparation returns complete on the final post-reboot run. Before that boundary, Docker may be absent, upgraded, restarted, or using a host state that preparation will reject.
hf downloadinside that exact image with--pull=never; another downloader would add a new trust/configuration path.The image is 2.94% of the cold image-plus-model transfer bytes, but hiding it can still remove its full latency from the critical path: approximately 14.2 minutes at 100 Mbps, 2.8 minutes at 500 Mbps, or 1.4 minutes at 1 Gbps before registry unpack/finalization overhead. The gain is bounded by the amount of independent setup work and shrinks when downloads saturate the same link.
The coherent implementation is an ephemeral prefetch task on the existing onboarding lifecycle:
idle -> skipped|pulling -> ready|failed|cancelled -> joined. Start it after Station host readiness and canonical profile resolution, then join it before the managed-vLLM provider branch starts the model download. Reuse the existing TypeScript runtime-profile resolver, digest assertion, local-Docker context, storage probes, Docker environment, and pull watchdog; do not duplicate the digest ininstall.sh. The exact Docker digest is the resume truth, so no PID is persisted. Signal cleanup must cancel and await the worker without pruning shared Docker content.Eligibility must be fail-closed: local/default Docker context, conclusive storage probes, no foreign managed-vLLM container, and sufficient capacity for both stores when they share a filesystem. The current conservative guards imply approximately 32.8 GiB for the image store plus 331.2 GiB for the Ultra model cache, or about 364 GiB combined. The canonical foreground path must still inspect the exact digest and re-probe model storage after the prefetch.
Acceptance coverage for a future implementation must prove no speculative pull before consent, on non-Station hosts, on exit
10/pending reboot, or after host-prep failure; exact Ultra versus DeepSeek digest selection; cache-hit no-op; one owner and one join; join-before-model ordering; canonical retry after worker failure; signal cleanup; second-run cache reuse; and physical Station cold-cache timing.Type of Change
Quality Gates
E2E / PR Gate; maintainer waiver accepts only the two exact-head Hermes hosted-runner shutdowns with no assertion; follow-up Trusted PR E2E gate cannot retry a completed exact-diff check #7052 tracks safe exact-diff retry recovery.Verification
Signed-off-by:line and every commit appears asVerifiedin GitHubpre-commit,commit-msg, andpre-pushhooks passed, ornpm run check:diffpassed when hooks were skipped or unavailablenpx vitest run test/install-station-host-preparation.test.ts --project installer-integration --testTimeout=15000: 41 passednpm testfor broad runtime/test-harness changes;npm run checkfor repo-wide validation/coverage changes —npm test: 17,505 passed, 186 skipped, and 10 unrelated local failures across existing macOS locale, corporate-DNS SSRF, and 5-15 second timing-sensitive tests; no failing test touches this changenpm run docsbuilds without warnings (doc changes only) — command passed; Fern reported 2 existing warningsSigned-off-by: Aaron Erickson aerickson@nvidia.com
Summary by CodeRabbit