fix(inference): mark the Windows-ARM N1X iGPU compute-constrained - #6234
Conversation
The onboard bootstrap-model selector auto-selected a computeIntensive 35B/30B model on the Windows-ARM N1X (Snapdragon X) iGPU, which cannot produce a token within the agent-loop timeout (~300s), leaving the sandbox unusable (#3707). #4852 added the computeIntensive exclusion but only set computeConstrained for platform "jetson"; the N1X detects as "linux" via the JMJWOA-Generic placeholder that clears the bounded Docker CUDA proof. Set computeConstrained on the proof-pass path so the selector skips computeIntensive entries on the N1X. Only the placeholder-proof path (the N1X iGPU) reaches this branch; a real discrete WSL2 GPU has a genuine name and never sets wslDockerDesktopGpuProofPassed, so discrete GPUs are unaffected. Bumps the nim.test.ts legacy size budget by one line for the added assertion. Fixes #3707 Signed-off-by: latenighthackathon <latenighthackathon@users.noreply.github.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:
📝 WalkthroughWalkthrough
ChangesCompute-constrained flag update
Estimated code review effort: 2 (Simple) | ~12 minutes 🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✨ Finishing Touches🧪 Generate unit tests (beta)
Comment |
Code Coverage OverviewLanguages: TypeScript TypeScript / code-coverage/pluginThe overall coverage in the Show a code coverage summary of the most covered files.
TypeScript / code-coverage/cliThe overall coverage in the Show a code coverage summary of the most covered files.
Updated |
PR Review Advisor (Nemotron Ultra) — Changes requestedMerge posture: Do not merge yet Action checklist
Findings index
🚨 Required before mergeAddress these before merging unless a maintainer explicitly overrides the advisor with rationale.
|
E2E Advisor RecommendationRequired E2E: Dispatch hint: Full advisor summaryE2E Recommendation AdvisorBase: Required E2E
Optional E2E
New E2E recommendations
Dispatch hint
|
E2E Target RecommendationRequired E2E targets: Dispatch required E2E targets:
Full E2E target advisor summaryE2E Target AdvisorBase: Required E2E targets
Optional E2E targets
Relevant changed files
|
PR Review Advisor — No blocking findingsMerge posture: No blocking advisor findings Action checklist
Test follow-ups to resolve or justifyIf these cover changed behavior, prefer adding them in this PR; otherwise state why existing coverage is enough or link the follow-up.
This is an automated, non-binding review; it still expects maintainers and agents to respond to each required or warning item. Treat suggestions as current-PR improvements when they touch changed code; defer only with maintainer rationale or a linked follow-up. A human maintainer must make the final merge decision. |
Signed-off-by: latenighthackathon <latenighthackathon@users.noreply.github.com>
Add src/lib/inference/nim-igpu-compute-constrained.test.ts covering both the proof-passed N1X iGPU (tagged computeConstrained) and a genuine discrete NVIDIA GPU (left untagged), which adds the advisor-requested negative regression case. Revert the nim.test.ts assertion and its size-budget bump so the legacy suite is unchanged, and trim the nim.ts comment. Signed-off-by: latenighthackathon <latenighthackathon@users.noreply.github.com>
There was a problem hiding this comment.
Actionable comments posted: 1
🧹 Nitpick comments (1)
src/lib/inference/nim-igpu-compute-constrained.test.ts (1)
106-118: 🩺 Stability & Availability | 🔵 Trivial | ⚡ Quick winConsider pinning firmware model in the discrete-GPU test too.
Unlike the first test, this one doesn't wrap the assertion in
withFirmwareModel, so platform detection falls through to the real host's/sys/class/dmi/id/product_name//sys/firmware/devicetree/base/modelreads. If the CI runner's actual firmware strings ever match ajetson-detected pattern,computeConstrainedwould unexpectedly be set, since onlyplatform === "jetson"orwslDockerDesktopGpuProofPassedtrigger it. Pinning a neutral desktop firmware model here would make the test host-independent.🧪 Proposed fix
it("leaves a genuine discrete NVIDIA GPU unconstrained", () => { const { nimModule, restore } = loadNimWithMockedRunner( nvidiaSmiRunner("NVIDIA H100 80GB HBM3, 81920, 81000\n"), ); try { - const gpu = nimModule.detectGpu(); - expect(gpu).toMatchObject({ type: "nvidia", name: "NVIDIA H100 80GB HBM3" }); - expect(gpu).not.toHaveProperty("computeConstrained"); - expect(gpu).not.toHaveProperty("wslDockerDesktopGpuProofPassed"); + withFirmwareModel("Dell Inc. PowerEdge R750", () => { + const gpu = nimModule.detectGpu(); + expect(gpu).toMatchObject({ type: "nvidia", name: "NVIDIA H100 80GB HBM3" }); + expect(gpu).not.toHaveProperty("computeConstrained"); + expect(gpu).not.toHaveProperty("wslDockerDesktopGpuProofPassed"); + }); } finally { restore(); } });🤖 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/nim-igpu-compute-constrained.test.ts` around lines 106 - 118, The discrete-GPU test in nim-igpu-compute-constrained.test.ts is still using the host firmware detection path, so it can inherit a real machine’s /sys-based model and affect detectGpu() unexpectedly. Wrap the “leaves a genuine discrete NVIDIA GPU unconstrained” case in withFirmwareModel with a neutral desktop model, matching the pattern used in the other tests. Keep the assertions on nimModule.detectGpu() the same, but ensure the firmware is pinned so platform detection is host-independent.
🤖 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/nim-igpu-compute-constrained.test.ts`:
- Around line 16-28: Remove the added test-only conditionals in
nim-igpu-compute-constrained.test.ts so the file no longer increases its if
count. Refactor withFirmwareModel, nvidiaSmiRunner, and the afterEach cleanup to
avoid branching on path checks, array-type guards, or restore guards; instead
make the test setup deterministic and rely on the existing beforeEach/afterEach
flow and explicit stub values. Keep the focus on exercising production behavior
in the tested helpers rather than validating test wiring.
---
Nitpick comments:
In `@src/lib/inference/nim-igpu-compute-constrained.test.ts`:
- Around line 106-118: The discrete-GPU test in
nim-igpu-compute-constrained.test.ts is still using the host firmware detection
path, so it can inherit a real machine’s /sys-based model and affect detectGpu()
unexpectedly. Wrap the “leaves a genuine discrete NVIDIA GPU unconstrained” case
in withFirmwareModel with a neutral desktop model, matching the pattern used in
the other tests. Keep the assertions on nimModule.detectGpu() the same, but
ensure the firmware is pinned so platform detection is host-independent.
🪄 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: f8d8e136-c6cc-4a4c-bddc-fe435eb4abcc
📒 Files selected for processing (2)
src/lib/inference/nim-igpu-compute-constrained.test.tssrc/lib/inference/nim.ts
🚧 Files skipped from review as they are similar to previous changes (1)
- src/lib/inference/nim.ts
Rewrite the focused N1X computeConstrained suite to use ternaries and an object lookup instead of if statements, satisfying the growth-guardrails "no new if statements in changed test files" rule. Assertions unchanged. Signed-off-by: latenighthackathon <latenighthackathon@users.noreply.github.com>
…ed cases Extend the focused N1X suite with a producer-to-selector contract (the proof-passed detectGpu result excludes the computeIntensive qwen3.6:35b and nemotron-3-nano:30b and selects qwen3.5:9b) and a Jetson/Tegra computeConstrained assertion. Branch-free per the growth-guardrails rule. Signed-off-by: latenighthackathon <latenighthackathon@users.noreply.github.com>
Signed-off-by: latenighthackathon <latenighthackathon@users.noreply.github.com>
<!-- markdownlint-disable MD041 --> ## Summary This PR prepares the user-facing documentation for v0.0.74 before the release plan is frozen. It expands the release notes across the 56-commit train and closes durable documentation gaps found during the pre-tag commit scan. ## Changes - Expand the `v0.0.74` release notes to cover OpenShell 0.0.72, managed MCP, progressive tool disclosure, LangChain Deep Agents Code, onboarding, local inference, messaging, recovery, and contributor workflows. - Correct the `destroy` contract for retained per-name volumes, gateway-unreachable `--force` cleanup, managed MCP ownership, and same-name recovery. - Document separate remediation for an unreachable container DNS resolver versus one that answers with `NXDOMAIN` or `REFUSED`. - Document the Windows on Arm N1X automatic Ollama safeguard and its remaining large-model limitations. - State that messaging conflicts abort rebuild before backup or deletion, leaving the original sandbox intact. - Link the agent-runnable value benchmark from the contributor task index. - Synchronize generated agent command variants. - Validate with `npm run docs:sync-agent-variants` and `npm run docs`; Fern completed with 0 errors and 2 existing warnings. - Source summary: - [#6020](#6020) and [#5876](#5876) -> `docs/about/release-notes.mdx`: Consolidate the OpenShell 0.0.72 policy boundary and managed MCP lifecycle. - [#6251](#6251) and [#5989](#5989) -> `docs/about/release-notes.mdx`: Summarize progressive tool disclosure and sandbox-first inference controls. - [#6232](#6232), [#6082](#6082), [#6219](#6219), [#6214](#6214), [#6215](#6215), [#6230](#6230), and [#6260](#6260) -> `docs/about/release-notes.mdx`: Summarize the experimental LangChain Deep Agents Code status, secret, version, rebuild, snapshot, and MCP boundaries. - [#6166](#6166), [#6254](#6254), [#6265](#6265), [#6164](#6164), and [#6017](#6017) -> `docs/about/release-notes.mdx`: Summarize BuildKit prebuild, validated image reuse, bounded readiness, and preflight improvements. - [#6150](#6150) -> `docs/about/release-notes.mdx` and `docs/reference/troubleshooting.mdx`: Separate unreachable-resolver remediation from reachable-but-rejected DNS responses. - [#6234](#6234) -> `docs/about/release-notes.mdx`, `docs/inference/use-local-inference.mdx`, and `docs/get-started/windows-preparation.mdx`: Document N1X automatic 9B selection and the remaining explicit-large-model boundary. - [#6129](#6129), [#5987](#5987), [#5955](#5955), and [#6220](#6220) -> `docs/about/release-notes.mdx`, `docs/manage-sandboxes/messaging-channels.mdx`, `docs/reference/commands.mdx`, and `docs/reference/commands-nemohermes.mdx`: Document messaging policy persistence, status, and the pre-destructive conflict check. - [#5963](#5963), [#6050](#6050), [#6094](#6094), [#6238](#6238), [#5988](#5988), [#6235](#6235), [#6181](#6181), and [#5986](#5986) -> `docs/about/release-notes.mdx`, `docs/reference/commands.mdx`, and `docs/reference/commands-nemohermes.mdx`: Summarize day-two recovery and clarify retained-volume and local-only destroy semantics. - [#6200](#6200), [#6248](#6248), [#6168](#6168), [#6270](#6270), and [#5649](#5649) -> `docs/about/release-notes.mdx` and `CONTRIBUTING.md`: Summarize contributor setup and verification improvements and expose the advisory value benchmark. ## 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 <!-- Check exactly one tests line and one docs line. Check other lines when applicable. Add every requested justification or approval reference. --> - [ ] Tests added or updated for changed behavior - [ ] Existing tests cover changed behavior — justification: - [x] Tests not applicable — justification: documentation-only release preparation; generated-variant synchronization and the Fern docs build validate the changed pages and routes. - [x] Docs updated for user-facing behavior changes - [ ] Docs not applicable — justification: - [ ] Sensitive paths changed (security, policy, credentials, preflight, onboarding, inference, runner, sandbox, or messaging) - [ ] Sensitive-path review completed or maintainer-approved waiver recorded — reviewer/approval link/justification: - [ ] Non-success, skipped, or missing CI check accepted by maintainer — check name, approval link, and follow-up issue: ## Verification <!-- Check each applicable item only when supported by the requested evidence. Run targeted tests once per relevant change set and rerun after later edits or hook autofixes that can affect the tested behavior. Do not rerun hook-covered checks. --> - [x] PR description includes the DCO sign-off declaration 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 — command/result or justification: tests are not applicable to this documentation-only change; `npm run docs` validates the source and generated routes. - [ ] Applicable broad gate passed — `npm test` for broad runtime/test-harness changes; `npm run check` for repo-wide validation/coverage changes — command/result: - [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) - [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) --- <!-- DCO sign-off is required in this PR description, and every commit must appear as Verified in GitHub. Run: git config user.name && git config user.email --> Signed-off-by: Aaron Erickson <aerickson@nvidia.com> <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **Documentation** * Expanded setup guidance for Windows on Arm devices with safer default local model selection. * Clarified local inference and sandbox messaging behavior, including conflict checks before rebuilds and safer recovery steps. * Updated destroy/rebuild/reference docs with more detailed warnings, failure handling, and volume-retention guidance. * Improved troubleshooting instructions for Docker DNS issues with clearer paths for unreachable vs. blocked resolvers. <!-- end of auto-generated comment: release notes by coderabbit.ai --> --------- Signed-off-by: Aaron Erickson <aerickson@nvidia.com>
…IDIA#6234) ## Summary On the Windows-ARM N1X (Snapdragon X) iGPU, onboard auto-selected a `computeIntensive` 35B/30B model that cannot produce a token within the agent-loop timeout (~300s), leaving the sandbox unusable (NVIDIA#3707). NVIDIA#4852 added the `computeIntensive` exclusion but only set `computeConstrained` for `platform === "jetson"`; the N1X detects as `"linux"` via the `JMJWOA-Generic` placeholder that clears the bounded Docker `--gpus` CUDA proof (NVIDIA#4565), so it was never marked constrained. This is the NemoClaw-side model-selection mitigation for NVIDIA#3707: it stops the unusable 30B/35B default from being offered on the N1X iGPU. It is scoped intentionally as a partial fix, so it uses `Refs` rather than `Fixes` (see Scope). ## Scope The fix lands at model-selection time: marking the N1X iGPU `computeConstrained` makes the Ollama bootstrap-model selector (`ollama-model-registry.ts`) skip the `computeIntensive` entries it would otherwise pick, which is where the unusable model was being chosen. The remaining NVIDIA#3707 clauses are OpenClaw-owned and out of scope for this NemoClaw change: - making qwen3.6:35b actually return tokens within the wait window, - the gateway 1006 abnormal-closure / embedded-fallback behavior, - explicit 35B+ warn/refuse preflight UX, - per-model or SoC-level timeout coordination. Those stay tracked on NVIDIA#3707 after this merges. ## Related Issue Refs NVIDIA#3707 ## Changes - `src/lib/inference/nim.ts`: set `computeConstrained: true` on the GPU-proof-pass path (`wslDockerDesktopGpuProofPassed`), so the Ollama bootstrap-model selector skips `computeIntensive` entries on the N1X iGPU. Only the placeholder-proof path reaches this branch; a real discrete WSL2 GPU has a genuine name and never sets the flag, so discrete GPUs are unaffected. The unified-memory fallback path is not modified: it has no access to the proof result, and a `JMJWOA-Generic` name is already denylist-rejected there on generic firmware (covered by the existing `nim.test.ts` generic-firmware rejection cases). - `src/lib/inference/local.ts`: note the N1X iGPU proof-pass path in the `GpuInfo.computeConstrained` doc comment. - `src/lib/inference/nim-igpu-compute-constrained.test.ts` (new): focused suite covering (1) the proof-pass N1X iGPU is tagged `computeConstrained`, (2) the producer-to-selector contract — the proof-pass `detectGpu` result excludes `qwen3.6:35b` and `nemotron-3-nano:30b` and selects `qwen3.5:9b`, (3) a Jetson/Tegra GPU is tagged `computeConstrained`, and (4) a genuine discrete NVIDIA GPU stays untagged. Kept in a new file so the legacy `nim.test.ts` stays within its size budget and linear-test-body rules. ## Type of Change - [x] Code change (feature, bug fix, or refactor) ## Quality Gates - [x] Tests added or updated for changed behavior - [x] Docs not applicable — justification: internal GPU-detection metadata; no user-facing docs. ## Verification - [x] PR description includes the DCO sign-off declaration and every commit appears as `Verified` in GitHub - [x] Git hooks passed during commit and push - [x] Targeted tests pass for changed behavior - [x] No secrets, API keys, or credentials committed Ran: `npx @biomejs/biome check` (pass), `npm run typecheck` (pass), `npm run test-size:check` + `npm run test-conditionals:scan` (pass), `vitest run src/lib/inference/nim-igpu-compute-constrained.test.ts src/lib/inference/ollama-model-registry.test.ts` (pass). Repro is Windows-ARM N1X-only; validated via the focused unit suite (proof-pass path is tagged constrained and drives the model exclusion; a genuine discrete GPU is not). --- Signed-off-by: latenighthackathon <latenighthackathon@users.noreply.github.com> --------- Signed-off-by: latenighthackathon <latenighthackathon@users.noreply.github.com> Co-authored-by: latenighthackathon <latenighthackathon@users.noreply.github.com>
<!-- markdownlint-disable MD041 --> ## Summary This PR prepares the user-facing documentation for v0.0.74 before the release plan is frozen. It expands the release notes across the 56-commit train and closes durable documentation gaps found during the pre-tag commit scan. ## Changes - Expand the `v0.0.74` release notes to cover OpenShell 0.0.72, managed MCP, progressive tool disclosure, LangChain Deep Agents Code, onboarding, local inference, messaging, recovery, and contributor workflows. - Correct the `destroy` contract for retained per-name volumes, gateway-unreachable `--force` cleanup, managed MCP ownership, and same-name recovery. - Document separate remediation for an unreachable container DNS resolver versus one that answers with `NXDOMAIN` or `REFUSED`. - Document the Windows on Arm N1X automatic Ollama safeguard and its remaining large-model limitations. - State that messaging conflicts abort rebuild before backup or deletion, leaving the original sandbox intact. - Link the agent-runnable value benchmark from the contributor task index. - Synchronize generated agent command variants. - Validate with `npm run docs:sync-agent-variants` and `npm run docs`; Fern completed with 0 errors and 2 existing warnings. - Source summary: - [NVIDIA#6020](NVIDIA#6020) and [NVIDIA#5876](NVIDIA#5876) -> `docs/about/release-notes.mdx`: Consolidate the OpenShell 0.0.72 policy boundary and managed MCP lifecycle. - [NVIDIA#6251](NVIDIA#6251) and [NVIDIA#5989](NVIDIA#5989) -> `docs/about/release-notes.mdx`: Summarize progressive tool disclosure and sandbox-first inference controls. - [NVIDIA#6232](NVIDIA#6232), [NVIDIA#6082](NVIDIA#6082), [NVIDIA#6219](NVIDIA#6219), [NVIDIA#6214](NVIDIA#6214), [NVIDIA#6215](NVIDIA#6215), [NVIDIA#6230](NVIDIA#6230), and [NVIDIA#6260](NVIDIA#6260) -> `docs/about/release-notes.mdx`: Summarize the experimental LangChain Deep Agents Code status, secret, version, rebuild, snapshot, and MCP boundaries. - [NVIDIA#6166](NVIDIA#6166), [NVIDIA#6254](NVIDIA#6254), [NVIDIA#6265](NVIDIA#6265), [NVIDIA#6164](NVIDIA#6164), and [NVIDIA#6017](NVIDIA#6017) -> `docs/about/release-notes.mdx`: Summarize BuildKit prebuild, validated image reuse, bounded readiness, and preflight improvements. - [NVIDIA#6150](NVIDIA#6150) -> `docs/about/release-notes.mdx` and `docs/reference/troubleshooting.mdx`: Separate unreachable-resolver remediation from reachable-but-rejected DNS responses. - [NVIDIA#6234](NVIDIA#6234) -> `docs/about/release-notes.mdx`, `docs/inference/use-local-inference.mdx`, and `docs/get-started/windows-preparation.mdx`: Document N1X automatic 9B selection and the remaining explicit-large-model boundary. - [NVIDIA#6129](NVIDIA#6129), [NVIDIA#5987](NVIDIA#5987), [NVIDIA#5955](NVIDIA#5955), and [NVIDIA#6220](NVIDIA#6220) -> `docs/about/release-notes.mdx`, `docs/manage-sandboxes/messaging-channels.mdx`, `docs/reference/commands.mdx`, and `docs/reference/commands-nemohermes.mdx`: Document messaging policy persistence, status, and the pre-destructive conflict check. - [NVIDIA#5963](NVIDIA#5963), [NVIDIA#6050](NVIDIA#6050), [NVIDIA#6094](NVIDIA#6094), [NVIDIA#6238](NVIDIA#6238), [NVIDIA#5988](NVIDIA#5988), [NVIDIA#6235](NVIDIA#6235), [NVIDIA#6181](NVIDIA#6181), and [NVIDIA#5986](NVIDIA#5986) -> `docs/about/release-notes.mdx`, `docs/reference/commands.mdx`, and `docs/reference/commands-nemohermes.mdx`: Summarize day-two recovery and clarify retained-volume and local-only destroy semantics. - [NVIDIA#6200](NVIDIA#6200), [NVIDIA#6248](NVIDIA#6248), [NVIDIA#6168](NVIDIA#6168), [NVIDIA#6270](NVIDIA#6270), and [NVIDIA#5649](NVIDIA#5649) -> `docs/about/release-notes.mdx` and `CONTRIBUTING.md`: Summarize contributor setup and verification improvements and expose the advisory value benchmark. ## 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 <!-- Check exactly one tests line and one docs line. Check other lines when applicable. Add every requested justification or approval reference. --> - [ ] Tests added or updated for changed behavior - [ ] Existing tests cover changed behavior — justification: - [x] Tests not applicable — justification: documentation-only release preparation; generated-variant synchronization and the Fern docs build validate the changed pages and routes. - [x] Docs updated for user-facing behavior changes - [ ] Docs not applicable — justification: - [ ] Sensitive paths changed (security, policy, credentials, preflight, onboarding, inference, runner, sandbox, or messaging) - [ ] Sensitive-path review completed or maintainer-approved waiver recorded — reviewer/approval link/justification: - [ ] Non-success, skipped, or missing CI check accepted by maintainer — check name, approval link, and follow-up issue: ## Verification <!-- Check each applicable item only when supported by the requested evidence. Run targeted tests once per relevant change set and rerun after later edits or hook autofixes that can affect the tested behavior. Do not rerun hook-covered checks. --> - [x] PR description includes the DCO sign-off declaration 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 — command/result or justification: tests are not applicable to this documentation-only change; `npm run docs` validates the source and generated routes. - [ ] Applicable broad gate passed — `npm test` for broad runtime/test-harness changes; `npm run check` for repo-wide validation/coverage changes — command/result: - [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) - [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) --- <!-- DCO sign-off is required in this PR description, and every commit must appear as Verified in GitHub. Run: git config user.name && git config user.email --> Signed-off-by: Aaron Erickson <aerickson@nvidia.com> <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **Documentation** * Expanded setup guidance for Windows on Arm devices with safer default local model selection. * Clarified local inference and sandbox messaging behavior, including conflict checks before rebuilds and safer recovery steps. * Updated destroy/rebuild/reference docs with more detailed warnings, failure handling, and volume-retention guidance. * Improved troubleshooting instructions for Docker DNS issues with clearer paths for unreachable vs. blocked resolvers. <!-- end of auto-generated comment: release notes by coderabbit.ai --> --------- Signed-off-by: Aaron Erickson <aerickson@nvidia.com>
Summary
On the Windows-ARM N1X (Snapdragon X) iGPU, onboard auto-selected a
computeIntensive35B/30B model that cannot produce a token within the agent-loop timeout (~300s), leaving the sandbox unusable (#3707). #4852 added thecomputeIntensiveexclusion but only setcomputeConstrainedforplatform === "jetson"; the N1X detects as"linux"via theJMJWOA-Genericplaceholder that clears the bounded Docker--gpusCUDA proof (#4565), so it was never marked constrained.This is the NemoClaw-side model-selection mitigation for #3707: it stops the unusable 30B/35B default from being offered on the N1X iGPU. It is scoped intentionally as a partial fix, so it uses
Refsrather thanFixes(see Scope).Scope
The fix lands at model-selection time: marking the N1X iGPU
computeConstrainedmakes the Ollama bootstrap-model selector (ollama-model-registry.ts) skip thecomputeIntensiveentries it would otherwise pick, which is where the unusable model was being chosen. The remaining #3707 clauses are OpenClaw-owned and out of scope for this NemoClaw change:Those stay tracked on #3707 after this merges.
Related Issue
Refs #3707
Changes
src/lib/inference/nim.ts: setcomputeConstrained: trueon the GPU-proof-pass path (wslDockerDesktopGpuProofPassed), so the Ollama bootstrap-model selector skipscomputeIntensiveentries on the N1X iGPU. Only the placeholder-proof path reaches this branch; a real discrete WSL2 GPU has a genuine name and never sets the flag, so discrete GPUs are unaffected. The unified-memory fallback path is not modified: it has no access to the proof result, and aJMJWOA-Genericname is already denylist-rejected there on generic firmware (covered by the existingnim.test.tsgeneric-firmware rejection cases).src/lib/inference/local.ts: note the N1X iGPU proof-pass path in theGpuInfo.computeConstraineddoc comment.src/lib/inference/nim-igpu-compute-constrained.test.ts(new): focused suite covering (1) the proof-pass N1X iGPU is taggedcomputeConstrained, (2) the producer-to-selector contract — the proof-passdetectGpuresult excludesqwen3.6:35bandnemotron-3-nano:30band selectsqwen3.5:9b, (3) a Jetson/Tegra GPU is taggedcomputeConstrained, and (4) a genuine discrete NVIDIA GPU stays untagged. Kept in a new file so the legacynim.test.tsstays within its size budget and linear-test-body rules.Type of Change
Quality Gates
Verification
Verifiedin GitHubRan:
npx @biomejs/biome check(pass),npm run typecheck(pass),npm run test-size:check+npm run test-conditionals:scan(pass),vitest run src/lib/inference/nim-igpu-compute-constrained.test.ts src/lib/inference/ollama-model-registry.test.ts(pass). Repro is Windows-ARM N1X-only; validated via the focused unit suite (proof-pass path is tagged constrained and drives the model exclusion; a genuine discrete GPU is not).Signed-off-by: latenighthackathon latenighthackathon@users.noreply.github.com