Skip to content

fix(inference): mark the Windows-ARM N1X iGPU compute-constrained - #6234

Merged
cv merged 7 commits into
mainfrom
fix-n1x-igpu-compute-constrained
Jul 4, 2026
Merged

fix(inference): mark the Windows-ARM N1X iGPU compute-constrained#6234
cv merged 7 commits into
mainfrom
fix-n1x-igpu-compute-constrained

Conversation

@latenighthackathon

@latenighthackathon latenighthackathon commented Jul 3, 2026

Copy link
Copy Markdown
Collaborator

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 (#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 --gpus CUDA 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 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 #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 #3707 after this merges.

Related Issue

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

  • Code change (feature, bug fix, or refactor)

Quality Gates

  • Tests added or updated for changed behavior
  • Docs not applicable — justification: internal GPU-detection metadata; no user-facing docs.

Verification

  • PR description includes the DCO sign-off declaration and every commit appears as Verified in GitHub
  • Git hooks passed during commit and push
  • Targeted tests pass for changed behavior
  • 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

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

coderabbitai Bot commented Jul 3, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

detectGpu now marks NVIDIA GPUs as compute-constrained when the Windows-ARM WSL2 Docker Desktop proof succeeds, not only on Jetson platforms. The doc comment was updated, and a new Vitest suite verifies the Windows-ARM iGPU and discrete GPU cases.

Changes

Compute-constrained flag update

Layer / File(s) Summary
detectGpu computeConstrained condition update
src/lib/inference/nim.ts, src/lib/inference/local.ts
computeConstrained is now set for jetson platforms or when wslDockerDesktopGpuProofPassed is true; the comment now also names the Windows-ARM N1X integrated GPU case.
New computeConstrained tagging test suite
src/lib/inference/nim-igpu-compute-constrained.test.ts
A new Vitest suite mocks firmware, filesystem, and runner behavior to assert computeConstrained is set for the N1X iGPU path and unset for a genuine discrete NVIDIA GPU.

Estimated code review effort: 2 (Simple) | ~12 minutes

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Linked Issues check ✅ Passed The PR addresses the core issue by marking the Windows-ARM N1X iGPU compute-constrained so 35B-class models are avoided.
Out of Scope Changes check ✅ Passed The diff stays on target with a logic change, doc update, and test for the same Windows-ARM inference path.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly and concisely describes the main change: marking the Windows-ARM N1X iGPU as compute-constrained.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch fix-n1x-igpu-compute-constrained

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

@github-code-quality

github-code-quality Bot commented Jul 3, 2026

Copy link
Copy Markdown
Contributor

Code Coverage Overview

Languages: TypeScript

TypeScript / code-coverage/plugin

The overall coverage in the fix-n1x-igpu-compute... branch is 96%. Coverage data for the main branch is not yet available.

Show a code coverage summary of the most covered files.
File main fix-n1x-igpu-compute... b722833 +/-
nemoclaw/src/se...cret-scanner.ts 100%
nemoclaw/src/commands/slash.ts 100%
nemoclaw/src/bl...eprint/state.ts 98%
nemoclaw/src/onboard/config.ts 98%
nemoclaw/src/bl...int/snapshot.ts 97%
nemoclaw/src/blueprint/ssrf.ts 97%
nemoclaw/src/bl...print/runner.ts 95%
nemoclaw/src/co...ration-state.ts 94%
nemoclaw/src/bl...ate-networks.ts 94%
nemoclaw/src/index.ts 94%

TypeScript / code-coverage/cli

The overall coverage in the fix-n1x-igpu-compute... branch is 70%. Coverage data for the main branch is not yet available.

Show a code coverage summary of the most covered files.
File main fix-n1x-igpu-compute... b722833 +/-
src/lib/actions...all/run-plan.ts 81%
src/lib/actions...dbox/rebuild.ts 80%
src/lib/state/o...oard-session.ts 80%
src/lib/shields/index.ts 75%
src/lib/state/sandbox.ts 74%
src/lib/policy/index.ts 70%
src/lib/onboard...er-gpu-patch.ts 69%
src/lib/onboard/preflight.ts 69%
src/lib/actions...licy-channel.ts 57%
src/lib/onboard.ts 20%

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

@github-actions

github-actions Bot commented Jul 3, 2026

Copy link
Copy Markdown
Contributor

PR Review Advisor (Nemotron Ultra) — Changes requested

Merge posture: Do not merge yet
Primary next action: Fix PRA-2: Jetson tegraGpu fallback test missing computeConstrained assertion (PRA-2); then add or justify PRA-T1.
Open items: 1 required · 7 warnings · 1 suggestion · 8 test follow-ups
Since last review: 0 prior items resolved · 7 still apply · 2 new items found

Action checklist

  • PRA-2 Fix: Jetson tegraGpu fallback test missing computeConstrained assertion (PRA-2) in src/lib/inference/nim.test.ts:1227
  • PRA-1 Resolve or justify: Source-of-truth review needed: src/lib/inference/nim.ts:540-620 (unified-memory fallback path)
  • PRA-3 Resolve or justify: Unified-memory fallback path missing wslDockerDesktopGpuProofPassed check for computeConstrained (PRA-3) in src/lib/inference/nim.ts:607
  • PRA-4 Resolve or justify: Source-of-truth review: Unified-memory fallback computeConstrained condition asymmetry (PRA-1/PRA-4) in src/lib/inference/nim.ts:540
  • PRA-5 Resolve or justify: Missing test: N1X denylist rejection in unified-memory fallback (PRA-5) in src/lib/inference/nim.test.ts
  • PRA-6 Resolve or justify: Missing test: DGX Station unified-memory fallback computeConstrained behavior (PRA-6) in src/lib/inference/nim.test.ts
  • PRA-8 Resolve or justify: Missing security regression tests for fallback trust-boundary paths (SEC-8) in src/lib/inference/nim-igpu-compute-constrained.test.ts
  • PRA-9 Resolve or justify: Asymmetry between primary path and unified-memory fallback computeConstrained conditions (SEC-9) in src/lib/inference/nim.ts:540
  • PRA-T1 Add or justify test follow-up: Runtime validation
  • PRA-T2 Add or justify test follow-up: Runtime validation
  • PRA-T3 Add or justify test follow-up: Runtime validation
  • PRA-T4 Add or justify test follow-up: Runtime validation
  • PRA-T5 Add or justify test follow-up: Runtime validation
  • PRA-T6 Add or justify test follow-up: Jetson tegraGpu fallback test missing computeConstrained assertion (PRA-2)
  • PRA-T7 Add or justify test follow-up: Missing test: N1X denylist rejection in unified-memory fallback (PRA-5)
  • PRA-T8 Add or justify test follow-up: Missing test: DGX Station unified-memory fallback computeConstrained behavior (PRA-6)
  • PRA-7 In-scope improvement: Test imports ollama-model-registry for producer-to-selector contract; consider direct behavior test (PRA-7) in src/lib/inference/nim-igpu-compute-constrained.test.ts:10

Findings index

ID Severity Category Location Required action
PRA-1 Resolve/justify architecture Identify the invalid state, source boundary, source-fix constraint, regression test, and removal condition before merging the localized behavior.
PRA-2 Required tests src/lib/inference/nim.test.ts:1227 Add expect(result?.computeConstrained).toBe(true) to the test's toMatchObject assertion at nim.test.ts:1227.
PRA-3 Resolve/justify architecture src/lib/inference/nim.ts:607 Add a test documenting the denylist rejection of N1X JMJWOA-Generic name on generic firmware in the unified-memory fallback (PRA-5). This locks the effective guard without restructuring the fallback to access the proof result. Do not mirror the condition in the fallback since it lacks access to wslDockerDesktopGpuProofPassed.
PRA-4 Resolve/justify architecture src/lib/inference/nim.ts:540 Add the denylist rejection test (PRA-5) to lock the effective guard. Document in code comments that the fallback relies on denylist rejection for N1X, not computeConstrained symmetry. Consider follow-up to pass proof result to fallback or restructure fallback to re-prove.
PRA-5 Resolve/justify tests src/lib/inference/nim.test.ts Add test 'detectGpu: unified-memory fallback rejects JMJWOA-Generic on Microsoft firmware' in nim.test.ts or nim-igpu-compute-constrained.test.ts.
PRA-6 Resolve/justify tests src/lib/inference/nim.test.ts Add test 'detectGpu: unified-memory fallback for DGX Station (platform==="station") does not tag computeConstrained' to document current behavior.
PRA-7 Improvement tests src/lib/inference/nim-igpu-compute-constrained.test.ts:10 Keep current test as integration coverage. Consider adding a pure unit test in ollama-model-registry.test.ts for 'computeConstrained: true excludes computeIntensive tags' if not already covered (ollama-model-registry.test.ts:210 appears to cover this). No deletion needed - current test provides valuable end-to-end validation.
PRA-8 Resolve/justify correctness src/lib/inference/nim-igpu-compute-constrained.test.ts Add the missing fallback tests (PRA-2, PRA-5, PRA-6) before merge. These are security-relevant regression tests for trust-boundary classification logic.
PRA-9 Resolve/justify correctness src/lib/inference/nim.ts:540 Add PRA-5 test to lock the denylist rejection guard. Add code comment at line 607 documenting that fallback relies on denylist rejection for N1X, not computeConstrained symmetry. Track as technical debt for future restructuring to pass proof result to fallback.

🚨 Required before merge

Address these before merging unless a maintainer explicitly overrides the advisor with rationale.

PRA-2 Required — Jetson tegraGpu fallback test missing computeConstrained assertion (PRA-2)

  • Location: src/lib/inference/nim.test.ts:1227
  • Category: tests
  • Problem: Test 'detects Jetson/Tegra GPUs from firmware when nvidia-smi is absent' exercises the tegraGpu fallback path (nim.ts:632) which sets computeConstrained: tegraGpu.platform === 'jetson', but the test's toMatchObject assertion does not verify computeConstrained: true. This symmetry with the primary path (nim.ts:517) and unified-memory fallback (nim.ts:607) is untested.
  • Impact: If the tegraGpu fallback path diverges from the primary path, a regression could silently allow computeIntensive models on Jetson devices, causing agent-loop timeouts.
  • Required action: Add expect(result?.computeConstrained).toBe(true) to the test's toMatchObject assertion at nim.test.ts:1227.
  • Expected follow-up: Fix before merge or get explicit maintainer override.
  • Verification: Run vitest on nim.test.ts - the test 'detects Jetson/Tegra GPUs from firmware when nvidia-smi is absent' should pass with the new assertion. Check nim.ts line 632: fallback sets computeConstrained for platform==='jetson'.
  • Missing regression test: Test: tegraGpu fallback for Jetson firmware sets computeConstrained: true
  • Done when: The required change is committed and verification passes: Run vitest on nim.test.ts - the test 'detects Jetson/Tegra GPUs from firmware when nvidia-smi is absent' should pass with the new assertion. Check nim.ts line 632: fallback sets computeConstrained for platform==='jetson'.
  • Evidence: nim.ts:632 sets computeConstrained for platform==='jetson' in fallback; nim.test.ts:1227 tests this fallback path but only asserts platform: 'jetson', not computeConstrained. Primary path at line 517 sets it identically.
Review findings by urgency: 1 required fix, 7 items to resolve/justify, 1 in-scope improvement

⚠️ Resolve or justify before merge

Investigate these in the current review; either fix them, explain why they are not applicable, or document the accepted risk.

PRA-1 Resolve/justify — Source-of-truth review needed: src/lib/inference/nim.ts:540-620 (unified-memory fallback path)

  • Location: not file-specific
  • Category: architecture
  • Problem: The advisor marked localized patch analysis as needs_followup.
  • Impact: A localized workaround can preserve or hide an invalid state when the source boundary is unclear.
  • Recommended action: Identify the invalid state, source boundary, source-fix constraint, regression test, and removal condition before merging the localized behavior.
  • Expected follow-up: Resolve in this PR or explain why the risk is acceptable.
  • Verification: Inspect the localized patch and source-of-truth review fields for a concrete invalid state, source boundary, source-fix constraint, regression test, and removal condition.
  • Missing regression test: Test: unified-memory fallback rejects denylisted JMJWOA-Generic name on generic firmware (Microsoft Corporation Virtual Machine) — PRA-5
  • Done when: The risk is fixed or explicitly justified in the PR. Verification: Inspect the localized patch and source-of-truth review fields for a concrete invalid state, source boundary, source-fix constraint, regression test, and removal condition.
  • Evidence: nim.ts:517 primary path condition includes proof flag; nim.ts:607 fallback condition lacks it; nim.ts:585 denylist rejection in fallback is effective guard for N1X on generic firmware. Comment at wsl-docker-desktop-gpu.ts:85 documents removal condition.

PRA-3 Resolve/justify — Unified-memory fallback path missing wslDockerDesktopGpuProofPassed check for computeConstrained (PRA-3)

  • Location: src/lib/inference/nim.ts:607
  • Category: architecture
  • Problem: Unified-memory fallback path (lines 540-620) sets computeConstrained only for platform === 'jetson', missing the wslDockerDesktopGpuProofPassed check that the primary path has (line 517: platform === 'jetson' || wslDockerDesktopGpuProofPassed). The fallback relies on denylist rejection at line 585 to block N1X on generic firmware as the effective guard.
  • Impact: Consistency risk: if denylist rejection at line 585 is weakened or removed, the fallback path would not tag proof-passed N1X as computeConstrained, allowing computeIntensive models on hardware that cannot serve them in-loop.
  • Recommended action: Add a test documenting the denylist rejection of N1X JMJWOA-Generic name on generic firmware in the unified-memory fallback (PRA-5). This locks the effective guard without restructuring the fallback to access the proof result. Do not mirror the condition in the fallback since it lacks access to wslDockerDesktopGpuProofPassed.
  • Expected follow-up: Resolve in this PR or explain why the risk is acceptable.
  • Verification: Inspect nim.ts lines 517 vs 607 - primary path has 'platform === "jetson" || wslDockerDesktopGpuProofPassed', fallback has only 'platform === "jetson"'. Check line 585: fallback rejects denylisted names on non-unified-memory firmware.
  • Missing regression test: Test: unified-memory fallback rejects denylisted JMJWOA-Generic name on generic firmware (Microsoft Corporation Virtual Machine)
  • Done when: The risk is fixed or explicitly justified in the PR. Verification: Inspect nim.ts lines 517 vs 607 - primary path has 'platform === "jetson" || wslDockerDesktopGpuProofPassed', fallback has only 'platform === "jetson"'. Check line 585: fallback rejects denylisted names on non-unified-memory firmware.
  • Evidence: nim.ts:517 primary path condition includes proof flag; nim.ts:607 fallback condition lacks it; nim.ts:585 denylist rejection in fallback is the effective guard for N1X on generic firmware.

PRA-4 Resolve/justify — Source-of-truth review: Unified-memory fallback computeConstrained condition asymmetry (PRA-1/PRA-4)

  • Location: src/lib/inference/nim.ts:540
  • Category: architecture
  • Problem: Unified-memory fallback path (lines 540-620) has no access to wslDockerDesktopGpuProofPassed from the primary path, creating an asymmetry where proof-passed N1X would not be tagged computeConstrained if it reached the fallback. The current effective guard is the denylist rejection at line 585 which blocks JMJWOA-Generic-* on generic firmware, preventing N1X from reaching the fallback tagging logic. This is a localized workaround preserving an invalid state (asymmetry) when the source boundary (proof result not accessible in fallback) is not fixed.
  • Impact: A localized workaround can preserve or hide an invalid state when the source boundary is unclear. Future changes to denylist logic could silently break the effective guard.
  • Recommended action: Add the denylist rejection test (PRA-5) to lock the effective guard. Document in code comments that the fallback relies on denylist rejection for N1X, not computeConstrained symmetry. Consider follow-up to pass proof result to fallback or restructure fallback to re-prove.
  • Expected follow-up: Resolve in this PR or explain why the risk is acceptable.
  • Verification: Inspect nim.ts:517 primary path condition includes proof flag; nim.ts:607 fallback condition lacks it; nim.ts:585 denylist rejection in fallback is the effective guard for N1X on generic firmware.
  • Missing regression test: Test: unified-memory fallback rejects denylisted JMJWOA-Generic name on generic firmware (Microsoft Corporation Virtual Machine)
  • Done when: The risk is fixed or explicitly justified in the PR. Verification: Inspect nim.ts:517 primary path condition includes proof flag; nim.ts:607 fallback condition lacks it; nim.ts:585 denylist rejection in fallback is the effective guard for N1X on generic firmware.
  • Evidence: nim.ts:517 primary path has 'platform === "jetson" || wslDockerDesktopGpuProofPassed'; nim.ts:607 fallback has only 'platform === "jetson"'; nim.ts:585 fallback rejects denylisted names on non-unified-memory firmware.

PRA-5 Resolve/justify — Missing test: N1X denylist rejection in unified-memory fallback (PRA-5)

  • Location: src/lib/inference/nim.test.ts
  • Category: tests
  • Problem: No test exists for the unified-memory fallback path rejecting N1X denylisted name (JMJWOA-Generic) on generic firmware. This test would lock the effective guard that prevents N1X from reaching the fallback's computeConstrained tagging logic without the proof flag.
  • Impact: Without this test, a future change to the denylist logic could silently allow N1X on generic firmware to pass the fallback and be tagged without computeConstrained.
  • Recommended action: Add test 'detectGpu: unified-memory fallback rejects JMJWOA-Generic on Microsoft firmware' in nim.test.ts or nim-igpu-compute-constrained.test.ts.
  • Expected follow-up: Resolve in this PR or explain why the risk is acceptable.
  • Verification: Run vitest - the new test should exercise the fallback path (nvidia-smi --query-gpu=name) with firmware that doesn't vouch for NVIDIA platform and a denylisted GPU name, expecting null return.
  • Missing regression test: Test: detectGpu unified-memory fallback rejects JMJWOA-Generic on Microsoft firmware
  • Done when: The risk is fixed or explicitly justified in the PR. Verification: Run vitest - the new test should exercise the fallback path (nvidia-smi --query-gpu=name) with firmware that doesn't vouch for NVIDIA platform and a denylisted GPU name, expecting null return.
  • Evidence: nim.ts:585 denylist check in fallback path; no existing test exercises this path with denylisted name on non-unified-memory firmware.

PRA-6 Resolve/justify — Missing test: DGX Station unified-memory fallback computeConstrained behavior (PRA-6)

  • Location: src/lib/inference/nim.test.ts
  • Category: tests
  • Problem: No test documents the DGX Station unified-memory fallback computeConstrained behavior. The fallback at line 607 only tags computeConstrained for platform === 'jetson', so Station (platform === 'station') would not be computeConstrained in the fallback path.
  • Impact: Behavior is undocumented and untested. If Station firmware confirmation is missing but nvidia-smi reports unified-memory tags, the fallback would classify as platform 'linux' without computeConstrained.
  • Recommended action: Add test 'detectGpu: unified-memory fallback for DGX Station (platform==="station") does not tag computeConstrained' to document current behavior.
  • Expected follow-up: Resolve in this PR or explain why the risk is acceptable.
  • Verification: Run vitest - the new test should exercise the fallback with firmwarePlatform === 'station' and unified-memory GPU names, verifying computeConstrained is not present.
  • Missing regression test: Test: detectGpu unified-memory fallback for DGX Station does not tag computeConstrained
  • Done when: The risk is fixed or explicitly justified in the PR. Verification: Run vitest - the new test should exercise the fallback with firmwarePlatform === 'station' and unified-memory GPU names, verifying computeConstrained is not present.
  • Evidence: nim.ts:595 classifies platform as 'station' for Station firmware; nim.ts:607 only tags computeConstrained for 'jetson'; no test covers Station in fallback.

PRA-8 Resolve/justify — Missing security regression tests for fallback trust-boundary paths (SEC-8)

  • Location: src/lib/inference/nim-igpu-compute-constrained.test.ts
  • Category: correctness
  • Problem: New test file covers primary path for N1X and Jetson computeConstrained tagging, but fallback paths (unified-memory fallback, tegraGpu fallback) lack computeConstrained regression tests. Security testing requires negative tests verifying forbidden actions are denied.
  • Impact: Fallback paths are security-relevant trust boundaries (GPU classification affects model selection). Missing negative tests for fallback paths means regressions in denylist or computeConstrained logic could go undetected.
  • Recommended action: Add the missing fallback tests (PRA-2, PRA-5, PRA-6) before merge. These are security-relevant regression tests for trust-boundary classification logic.
  • Expected follow-up: Resolve in this PR or explain why the risk is acceptable.
  • Verification: Run vitest --coverage on nim.test.ts and nim-igpu-compute-constrained.test.ts - verify branch coverage for all three GPU detection paths (primary, unified-memory fallback, tegraGpu fallback).
  • Missing regression test: Tests for tegraGpu fallback computeConstrained (PRA-2), unified-memory fallback denylist rejection (PRA-5), DGX Station fallback behavior (PRA-6)
  • Done when: The risk is fixed or explicitly justified in the PR. Verification: Run vitest --coverage on nim.test.ts and nim-igpu-compute-constrained.test.ts - verify branch coverage for all three GPU detection paths (primary, unified-memory fallback, tegraGpu fallback).
  • Evidence: nim-igpu-compute-constrained.test.ts covers primary path only; nim.test.ts:1227 covers tegraGpu fallback but missing computeConstrained assertion; no tests for unified-memory fallback denylist rejection or Station behavior.

PRA-9 Resolve/justify — Asymmetry between primary path and unified-memory fallback computeConstrained conditions (SEC-9)

  • Location: src/lib/inference/nim.ts:540
  • Category: correctness
  • Problem: Asymmetry between primary path and unified-memory fallback for computeConstrained condition creates a consistency risk. The denylist rejection in fallback is a localized workaround that could be silently weakened by future changes.
  • Impact: If denylist logic at line 585 is modified (e.g., pattern change, new placeholder names), N1X on generic firmware could bypass the fallback guard and be classified without computeConstrained, allowing computeIntensive models on insufficient hardware.
  • Recommended action: Add PRA-5 test to lock the denylist rejection guard. Add code comment at line 607 documenting that fallback relies on denylist rejection for N1X, not computeConstrained symmetry. Track as technical debt for future restructuring to pass proof result to fallback.
  • Expected follow-up: Resolve in this PR or explain why the risk is acceptable.
  • Verification: Inspect nim.ts lines 517, 585, 607 - verify denylist rejection at 585 is the only guard for N1X in fallback. Check that PRA-5 test exists and passes.
  • Missing regression test: Test: unified-memory fallback rejects denylisted JMJWOA-Generic name on generic firmware (PRA-5)
  • Done when: The risk is fixed or explicitly justified in the PR. Verification: Inspect nim.ts lines 517, 585, 607 - verify denylist rejection at 585 is the only guard for N1X in fallback. Check that PRA-5 test exists and passes.
  • Evidence: nim.ts:517 primary path has proof flag in computeConstrained condition; nim.ts:607 fallback lacks it; nim.ts:585 denylist rejection in fallback is effective guard.

💡 In-scope improvements

These are lower-risk, not throwaway. Prefer fixing them in this PR when they are local to changed code; defer only with rationale or a linked follow-up.

PRA-7 Improvement — Test imports ollama-model-registry for producer-to-selector contract; consider direct behavior test (PRA-7)

  • Location: src/lib/inference/nim-igpu-compute-constrained.test.ts:10
  • Category: tests
  • Problem: The new test file imports fittableOllamaModelTags and largestFittableOllamaModelTag from ollama-model-registry for producer-to-selector contract testing. This provides valuable end-to-end integration coverage but couples the test to the registry implementation.
  • Impact: Test fragility if registry internals change. Pure unit test for computeConstrained exclusion logic would be more isolated.
  • Suggested action: Keep current test as integration coverage. Consider adding a pure unit test in ollama-model-registry.test.ts for 'computeConstrained: true excludes computeIntensive tags' if not already covered (ollama-model-registry.test.ts:210 appears to cover this). No deletion needed - current test provides valuable end-to-end validation.
  • Expected follow-up: Prefer a current-PR fix when local to changed code; defer only with rationale or linked follow-up.
  • Verification: Check ollama-model-registry.test.ts for existing computeConstrained exclusion test at line 210.
  • Missing regression test: None - current test provides valuable end-to-end validation
  • Done when: The local improvement is applied, or the PR notes why it should be deferred.
  • Evidence: nim-igpu-compute-constrained.test.ts:10 imports from ollama-model-registry; test at lines 58-63 verifies computeConstrained excludes computeIntensive tags via registry functions.
Test follow-ups to resolve or justify

If these cover changed behavior, prefer adding them in this PR; otherwise state why existing coverage is enough or link the follow-up.

  • PRA-T1 Runtime validation — Add test: tegraGpu fallback for Jetson firmware sets computeConstrained: true (PRA-2 blocker). Runtime/sandbox/infrastructure paths need behavioral runtime validation: src/lib/inference/local.ts, src/lib/inference/nim.ts. Windows ARM N1X hardware validation is manual; CI cannot cover the physical hardware path. Fallback paths lack security regression tests.
  • PRA-T2 Runtime validation — Add test: unified-memory fallback rejects JMJWOA-Generic on Microsoft firmware (PRA-5). Runtime/sandbox/infrastructure paths need behavioral runtime validation: src/lib/inference/local.ts, src/lib/inference/nim.ts. Windows ARM N1X hardware validation is manual; CI cannot cover the physical hardware path. Fallback paths lack security regression tests.
  • PRA-T3 Runtime validation — Add test: unified-memory fallback for DGX Station does not tag computeConstrained (PRA-6). Runtime/sandbox/infrastructure paths need behavioral runtime validation: src/lib/inference/local.ts, src/lib/inference/nim.ts. Windows ARM N1X hardware validation is manual; CI cannot cover the physical hardware path. Fallback paths lack security regression tests.
  • PRA-T4 Runtime validation — Add test: N1X proof-fails (prover returns passed: false) returns null. Runtime/sandbox/infrastructure paths need behavioral runtime validation: src/lib/inference/local.ts, src/lib/inference/nim.ts. Windows ARM N1X hardware validation is manual; CI cannot cover the physical hardware path. Fallback paths lack security regression tests.
  • PRA-T5 Runtime validation — Add test: Mixed GPU rows - denylisted + plausible name filtered correctly per nim.ts:481. Runtime/sandbox/infrastructure paths need behavioral runtime validation: src/lib/inference/local.ts, src/lib/inference/nim.ts. Windows ARM N1X hardware validation is manual; CI cannot cover the physical hardware path. Fallback paths lack security regression tests.
  • PRA-T6 Jetson tegraGpu fallback test missing computeConstrained assertion (PRA-2) — Add expect(result?.computeConstrained).toBe(true) to the test's toMatchObject assertion at nim.test.ts:1227.
  • PRA-T7 Missing test: N1X denylist rejection in unified-memory fallback (PRA-5) — Add test 'detectGpu: unified-memory fallback rejects JMJWOA-Generic on Microsoft firmware' in nim.test.ts or nim-igpu-compute-constrained.test.ts.
  • PRA-T8 Missing test: DGX Station unified-memory fallback computeConstrained behavior (PRA-6) — Add test 'detectGpu: unified-memory fallback for DGX Station (platform==="station") does not tag computeConstrained' to document current behavior.
Since last review details

Current findings, using the urgency labels above:

PRA-1 Resolve/justify — Source-of-truth review needed: src/lib/inference/nim.ts:540-620 (unified-memory fallback path)

  • Location: not file-specific
  • Category: architecture
  • Problem: The advisor marked localized patch analysis as needs_followup.
  • Impact: A localized workaround can preserve or hide an invalid state when the source boundary is unclear.
  • Recommended action: Identify the invalid state, source boundary, source-fix constraint, regression test, and removal condition before merging the localized behavior.
  • Expected follow-up: Resolve in this PR or explain why the risk is acceptable.
  • Verification: Inspect the localized patch and source-of-truth review fields for a concrete invalid state, source boundary, source-fix constraint, regression test, and removal condition.
  • Missing regression test: Test: unified-memory fallback rejects denylisted JMJWOA-Generic name on generic firmware (Microsoft Corporation Virtual Machine) — PRA-5
  • Done when: The risk is fixed or explicitly justified in the PR. Verification: Inspect the localized patch and source-of-truth review fields for a concrete invalid state, source boundary, source-fix constraint, regression test, and removal condition.
  • Evidence: nim.ts:517 primary path condition includes proof flag; nim.ts:607 fallback condition lacks it; nim.ts:585 denylist rejection in fallback is effective guard for N1X on generic firmware. Comment at wsl-docker-desktop-gpu.ts:85 documents removal condition.

PRA-2 Required — Jetson tegraGpu fallback test missing computeConstrained assertion (PRA-2)

  • Location: src/lib/inference/nim.test.ts:1227
  • Category: tests
  • Problem: Test 'detects Jetson/Tegra GPUs from firmware when nvidia-smi is absent' exercises the tegraGpu fallback path (nim.ts:632) which sets computeConstrained: tegraGpu.platform === 'jetson', but the test's toMatchObject assertion does not verify computeConstrained: true. This symmetry with the primary path (nim.ts:517) and unified-memory fallback (nim.ts:607) is untested.
  • Impact: If the tegraGpu fallback path diverges from the primary path, a regression could silently allow computeIntensive models on Jetson devices, causing agent-loop timeouts.
  • Required action: Add expect(result?.computeConstrained).toBe(true) to the test's toMatchObject assertion at nim.test.ts:1227.
  • Expected follow-up: Fix before merge or get explicit maintainer override.
  • Verification: Run vitest on nim.test.ts - the test 'detects Jetson/Tegra GPUs from firmware when nvidia-smi is absent' should pass with the new assertion. Check nim.ts line 632: fallback sets computeConstrained for platform==='jetson'.
  • Missing regression test: Test: tegraGpu fallback for Jetson firmware sets computeConstrained: true
  • Done when: The required change is committed and verification passes: Run vitest on nim.test.ts - the test 'detects Jetson/Tegra GPUs from firmware when nvidia-smi is absent' should pass with the new assertion. Check nim.ts line 632: fallback sets computeConstrained for platform==='jetson'.
  • Evidence: nim.ts:632 sets computeConstrained for platform==='jetson' in fallback; nim.test.ts:1227 tests this fallback path but only asserts platform: 'jetson', not computeConstrained. Primary path at line 517 sets it identically.

PRA-3 Resolve/justify — Unified-memory fallback path missing wslDockerDesktopGpuProofPassed check for computeConstrained (PRA-3)

  • Location: src/lib/inference/nim.ts:607
  • Category: architecture
  • Problem: Unified-memory fallback path (lines 540-620) sets computeConstrained only for platform === 'jetson', missing the wslDockerDesktopGpuProofPassed check that the primary path has (line 517: platform === 'jetson' || wslDockerDesktopGpuProofPassed). The fallback relies on denylist rejection at line 585 to block N1X on generic firmware as the effective guard.
  • Impact: Consistency risk: if denylist rejection at line 585 is weakened or removed, the fallback path would not tag proof-passed N1X as computeConstrained, allowing computeIntensive models on hardware that cannot serve them in-loop.
  • Recommended action: Add a test documenting the denylist rejection of N1X JMJWOA-Generic name on generic firmware in the unified-memory fallback (PRA-5). This locks the effective guard without restructuring the fallback to access the proof result. Do not mirror the condition in the fallback since it lacks access to wslDockerDesktopGpuProofPassed.
  • Expected follow-up: Resolve in this PR or explain why the risk is acceptable.
  • Verification: Inspect nim.ts lines 517 vs 607 - primary path has 'platform === "jetson" || wslDockerDesktopGpuProofPassed', fallback has only 'platform === "jetson"'. Check line 585: fallback rejects denylisted names on non-unified-memory firmware.
  • Missing regression test: Test: unified-memory fallback rejects denylisted JMJWOA-Generic name on generic firmware (Microsoft Corporation Virtual Machine)
  • Done when: The risk is fixed or explicitly justified in the PR. Verification: Inspect nim.ts lines 517 vs 607 - primary path has 'platform === "jetson" || wslDockerDesktopGpuProofPassed', fallback has only 'platform === "jetson"'. Check line 585: fallback rejects denylisted names on non-unified-memory firmware.
  • Evidence: nim.ts:517 primary path condition includes proof flag; nim.ts:607 fallback condition lacks it; nim.ts:585 denylist rejection in fallback is the effective guard for N1X on generic firmware.

PRA-4 Resolve/justify — Source-of-truth review: Unified-memory fallback computeConstrained condition asymmetry (PRA-1/PRA-4)

  • Location: src/lib/inference/nim.ts:540
  • Category: architecture
  • Problem: Unified-memory fallback path (lines 540-620) has no access to wslDockerDesktopGpuProofPassed from the primary path, creating an asymmetry where proof-passed N1X would not be tagged computeConstrained if it reached the fallback. The current effective guard is the denylist rejection at line 585 which blocks JMJWOA-Generic-* on generic firmware, preventing N1X from reaching the fallback tagging logic. This is a localized workaround preserving an invalid state (asymmetry) when the source boundary (proof result not accessible in fallback) is not fixed.
  • Impact: A localized workaround can preserve or hide an invalid state when the source boundary is unclear. Future changes to denylist logic could silently break the effective guard.
  • Recommended action: Add the denylist rejection test (PRA-5) to lock the effective guard. Document in code comments that the fallback relies on denylist rejection for N1X, not computeConstrained symmetry. Consider follow-up to pass proof result to fallback or restructure fallback to re-prove.
  • Expected follow-up: Resolve in this PR or explain why the risk is acceptable.
  • Verification: Inspect nim.ts:517 primary path condition includes proof flag; nim.ts:607 fallback condition lacks it; nim.ts:585 denylist rejection in fallback is the effective guard for N1X on generic firmware.
  • Missing regression test: Test: unified-memory fallback rejects denylisted JMJWOA-Generic name on generic firmware (Microsoft Corporation Virtual Machine)
  • Done when: The risk is fixed or explicitly justified in the PR. Verification: Inspect nim.ts:517 primary path condition includes proof flag; nim.ts:607 fallback condition lacks it; nim.ts:585 denylist rejection in fallback is the effective guard for N1X on generic firmware.
  • Evidence: nim.ts:517 primary path has 'platform === "jetson" || wslDockerDesktopGpuProofPassed'; nim.ts:607 fallback has only 'platform === "jetson"'; nim.ts:585 fallback rejects denylisted names on non-unified-memory firmware.

PRA-5 Resolve/justify — Missing test: N1X denylist rejection in unified-memory fallback (PRA-5)

  • Location: src/lib/inference/nim.test.ts
  • Category: tests
  • Problem: No test exists for the unified-memory fallback path rejecting N1X denylisted name (JMJWOA-Generic) on generic firmware. This test would lock the effective guard that prevents N1X from reaching the fallback's computeConstrained tagging logic without the proof flag.
  • Impact: Without this test, a future change to the denylist logic could silently allow N1X on generic firmware to pass the fallback and be tagged without computeConstrained.
  • Recommended action: Add test 'detectGpu: unified-memory fallback rejects JMJWOA-Generic on Microsoft firmware' in nim.test.ts or nim-igpu-compute-constrained.test.ts.
  • Expected follow-up: Resolve in this PR or explain why the risk is acceptable.
  • Verification: Run vitest - the new test should exercise the fallback path (nvidia-smi --query-gpu=name) with firmware that doesn't vouch for NVIDIA platform and a denylisted GPU name, expecting null return.
  • Missing regression test: Test: detectGpu unified-memory fallback rejects JMJWOA-Generic on Microsoft firmware
  • Done when: The risk is fixed or explicitly justified in the PR. Verification: Run vitest - the new test should exercise the fallback path (nvidia-smi --query-gpu=name) with firmware that doesn't vouch for NVIDIA platform and a denylisted GPU name, expecting null return.
  • Evidence: nim.ts:585 denylist check in fallback path; no existing test exercises this path with denylisted name on non-unified-memory firmware.

PRA-6 Resolve/justify — Missing test: DGX Station unified-memory fallback computeConstrained behavior (PRA-6)

  • Location: src/lib/inference/nim.test.ts
  • Category: tests
  • Problem: No test documents the DGX Station unified-memory fallback computeConstrained behavior. The fallback at line 607 only tags computeConstrained for platform === 'jetson', so Station (platform === 'station') would not be computeConstrained in the fallback path.
  • Impact: Behavior is undocumented and untested. If Station firmware confirmation is missing but nvidia-smi reports unified-memory tags, the fallback would classify as platform 'linux' without computeConstrained.
  • Recommended action: Add test 'detectGpu: unified-memory fallback for DGX Station (platform==="station") does not tag computeConstrained' to document current behavior.
  • Expected follow-up: Resolve in this PR or explain why the risk is acceptable.
  • Verification: Run vitest - the new test should exercise the fallback with firmwarePlatform === 'station' and unified-memory GPU names, verifying computeConstrained is not present.
  • Missing regression test: Test: detectGpu unified-memory fallback for DGX Station does not tag computeConstrained
  • Done when: The risk is fixed or explicitly justified in the PR. Verification: Run vitest - the new test should exercise the fallback with firmwarePlatform === 'station' and unified-memory GPU names, verifying computeConstrained is not present.
  • Evidence: nim.ts:595 classifies platform as 'station' for Station firmware; nim.ts:607 only tags computeConstrained for 'jetson'; no test covers Station in fallback.

PRA-7 Improvement — Test imports ollama-model-registry for producer-to-selector contract; consider direct behavior test (PRA-7)

  • Location: src/lib/inference/nim-igpu-compute-constrained.test.ts:10
  • Category: tests
  • Problem: The new test file imports fittableOllamaModelTags and largestFittableOllamaModelTag from ollama-model-registry for producer-to-selector contract testing. This provides valuable end-to-end integration coverage but couples the test to the registry implementation.
  • Impact: Test fragility if registry internals change. Pure unit test for computeConstrained exclusion logic would be more isolated.
  • Suggested action: Keep current test as integration coverage. Consider adding a pure unit test in ollama-model-registry.test.ts for 'computeConstrained: true excludes computeIntensive tags' if not already covered (ollama-model-registry.test.ts:210 appears to cover this). No deletion needed - current test provides valuable end-to-end validation.
  • Expected follow-up: Prefer a current-PR fix when local to changed code; defer only with rationale or linked follow-up.
  • Verification: Check ollama-model-registry.test.ts for existing computeConstrained exclusion test at line 210.
  • Missing regression test: None - current test provides valuable end-to-end validation
  • Done when: The local improvement is applied, or the PR notes why it should be deferred.
  • Evidence: nim-igpu-compute-constrained.test.ts:10 imports from ollama-model-registry; test at lines 58-63 verifies computeConstrained excludes computeIntensive tags via registry functions.

PRA-8 Resolve/justify — Missing security regression tests for fallback trust-boundary paths (SEC-8)

  • Location: src/lib/inference/nim-igpu-compute-constrained.test.ts
  • Category: correctness
  • Problem: New test file covers primary path for N1X and Jetson computeConstrained tagging, but fallback paths (unified-memory fallback, tegraGpu fallback) lack computeConstrained regression tests. Security testing requires negative tests verifying forbidden actions are denied.
  • Impact: Fallback paths are security-relevant trust boundaries (GPU classification affects model selection). Missing negative tests for fallback paths means regressions in denylist or computeConstrained logic could go undetected.
  • Recommended action: Add the missing fallback tests (PRA-2, PRA-5, PRA-6) before merge. These are security-relevant regression tests for trust-boundary classification logic.
  • Expected follow-up: Resolve in this PR or explain why the risk is acceptable.
  • Verification: Run vitest --coverage on nim.test.ts and nim-igpu-compute-constrained.test.ts - verify branch coverage for all three GPU detection paths (primary, unified-memory fallback, tegraGpu fallback).
  • Missing regression test: Tests for tegraGpu fallback computeConstrained (PRA-2), unified-memory fallback denylist rejection (PRA-5), DGX Station fallback behavior (PRA-6)
  • Done when: The risk is fixed or explicitly justified in the PR. Verification: Run vitest --coverage on nim.test.ts and nim-igpu-compute-constrained.test.ts - verify branch coverage for all three GPU detection paths (primary, unified-memory fallback, tegraGpu fallback).
  • Evidence: nim-igpu-compute-constrained.test.ts covers primary path only; nim.test.ts:1227 covers tegraGpu fallback but missing computeConstrained assertion; no tests for unified-memory fallback denylist rejection or Station behavior.

PRA-9 Resolve/justify — Asymmetry between primary path and unified-memory fallback computeConstrained conditions (SEC-9)

  • Location: src/lib/inference/nim.ts:540
  • Category: correctness
  • Problem: Asymmetry between primary path and unified-memory fallback for computeConstrained condition creates a consistency risk. The denylist rejection in fallback is a localized workaround that could be silently weakened by future changes.
  • Impact: If denylist logic at line 585 is modified (e.g., pattern change, new placeholder names), N1X on generic firmware could bypass the fallback guard and be classified without computeConstrained, allowing computeIntensive models on insufficient hardware.
  • Recommended action: Add PRA-5 test to lock the denylist rejection guard. Add code comment at line 607 documenting that fallback relies on denylist rejection for N1X, not computeConstrained symmetry. Track as technical debt for future restructuring to pass proof result to fallback.
  • Expected follow-up: Resolve in this PR or explain why the risk is acceptable.
  • Verification: Inspect nim.ts lines 517, 585, 607 - verify denylist rejection at 585 is the only guard for N1X in fallback. Check that PRA-5 test exists and passes.
  • Missing regression test: Test: unified-memory fallback rejects denylisted JMJWOA-Generic name on generic firmware (PRA-5)
  • Done when: The risk is fixed or explicitly justified in the PR. Verification: Inspect nim.ts lines 517, 585, 607 - verify denylist rejection at 585 is the only guard for N1X in fallback. Check that PRA-5 test exists and passes.
  • Evidence: nim.ts:517 primary path has proof flag in computeConstrained condition; nim.ts:607 fallback lacks it; nim.ts:585 denylist rejection in fallback is effective guard.

Workflow run details

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.

@github-actions

github-actions Bot commented Jul 3, 2026

Copy link
Copy Markdown
Contributor

E2E Advisor Recommendation

Required E2E: gpu-e2e, inference-routing
Optional E2E: jetson-nvmap-gpu, wsl-e2e

Dispatch hint: gpu-e2e,inference-routing

Workflow run

Full advisor summary

E2E Recommendation Advisor

Base: origin/main
Head: HEAD
Confidence: high

Required E2E

  • gpu-e2e (high): Validates the live GPU Ollama onboarding path, sandbox inference.local, auth proxy, and projected OpenClaw model config after changes to GPU detection and Ollama bootstrap model sizing.
  • inference-routing (medium): Exercises real onboarded inference routing boundaries and sandbox inference.local behavior, providing merge-blocking coverage for changes under src/lib/inference even when the exact N1X hardware path is not available.

Optional E2E

  • jetson-nvmap-gpu (high): Useful adjacent confidence because Jetson/Tegra is also marked computeConstrained in the same detectGpu return path; run when Jetson hardware is available to confirm the existing Jetson Ollama/GPU onboarding contract remains intact.
  • wsl-e2e (high): Optional platform confidence for WSL-specific inference/onboarding behavior, especially because the changed N1X path is Windows-ARM/WSL-related; the standard WSL lane may not provide the required N1X GPU but can catch broader WSL regressions.

New E2E recommendations

  • Windows-ARM N1X / WSL Docker Desktop GPU local Ollama onboarding (high): Existing live GPU E2E appears to run on discrete NVIDIA Linux GPU, and WSL E2E does not appear to guarantee a Windows-ARM N1X/JMJWOA integrated GPU with Docker Desktop CUDA proof. The changed behavior is specifically that proof-passed N1X is accepted but constrained away from 30B/35B Ollama bootstrap models.
    • Suggested test: Add a hardware-gated live E2E target that runs on Windows-ARM N1X WSL2 with Docker Desktop GPU proof, onboards with NEMOCLAW_PROVIDER=ollama, asserts the selected Ollama/OpenClaw model is not a computeIntensive 30B/35B tag, and verifies sandbox inference.local completes a small chat request.

Dispatch hint

  • Workflow: .github/workflows/e2e.yaml
  • jobs input: gpu-e2e,inference-routing

@github-actions

github-actions Bot commented Jul 3, 2026

Copy link
Copy Markdown
Contributor

E2E Target Recommendation

Required E2E targets: ubuntu-repo-cloud-openclaw
Optional E2E targets: None

Dispatch required E2E targets:

  • gh workflow run e2e.yaml --ref <pr-head-ref> --field targets=ubuntu-repo-cloud-openclaw

Workflow run

Full E2E target advisor summary

E2E Target Advisor

Base: origin/main
Head: HEAD
Confidence: medium

Required E2E targets

  • ubuntu-repo-cloud-openclaw: The PR changes GPU detection and local inference model-selection surfaces used during onboarding/preflight and inference setup. The live-supported baseline OpenClaw target is the smallest dispatch that validates the standard repo-current Docker onboarding path and inference suite after these changes.
    • Dispatch: gh workflow run e2e.yaml --ref <pr-head-ref> --field targets=ubuntu-repo-cloud-openclaw

Optional E2E targets

  • None.

Relevant changed files

  • src/lib/inference/local.ts
  • src/lib/inference/nim.ts

@github-actions

github-actions Bot commented Jul 3, 2026

Copy link
Copy Markdown
Contributor

PR Review Advisor — No blocking findings

Merge posture: No blocking advisor findings
Primary next action: Add or justify PRA-T1 and any related test follow-ups.
Open items: 0 required · 0 warnings · 0 suggestions · 7 test follow-ups
Since last review: 0 prior items resolved · 0 still apply · 0 new items found

Action checklist

  • PRA-T1 Add or justify test follow-up: Runtime validation
  • PRA-T2 Add or justify test follow-up: Runtime validation
  • PRA-T3 Add or justify test follow-up: Acceptance clause
  • PRA-T4 Add or justify test follow-up: Acceptance clause
  • PRA-T5 Add or justify test follow-up: Acceptance clause
  • PRA-T6 Add or justify test follow-up: Acceptance clause
  • PRA-T7 Add or justify test follow-up: Acceptance clause
Test follow-ups to resolve or justify

If these cover changed behavior, prefer adding them in this PR; otherwise state why existing coverage is enough or link the follow-up.

  • PRA-T1 Runtime validation — On a Windows-ARM N1X host with WSL Docker Desktop and a proof-passed `JMJWOA-Generic-GPU`, validate the NemoClaw onboard Ollama model-selection path does not offer or default to `qwen3.6:35b` or `nemotron-3-nano:30b` and recommends/selects `qwen3.5:9b`.. Unit coverage is strong for the changed static behavior: the producer flag, selector output, Jetson preservation, and discrete-GPU negative path are covered. Because the user-visible behavior spans Windows-ARM WSL Docker Desktop detection, the bounded Docker GPU proof, onboard model selection, and Ollama bootstrap UX, one targeted runtime/integration validation would increase confidence.
  • PRA-T2 Runtime validation — If mixed GPU rows are a supported N1X scenario, add a unit test for a proof-passed `JMJWOA-Generic-GPU` row plus a plausible NVIDIA row documenting whether the whole detection should remain `computeConstrained` and proving the intended selector result.. Unit coverage is strong for the changed static behavior: the producer flag, selector output, Jetson preservation, and discrete-GPU negative path are covered. Because the user-visible behavior spans Windows-ARM WSL Docker Desktop detection, the bounded Docker GPU proof, onboard model selection, and Ollama bootstrap UX, one targeted runtime/integration validation would increase confidence.
  • PRA-T3 Acceptance clause[WSL2][Inference] qwen3.6:35b yields no token within 300s under OpenClaw agent loop on ARM64/aarch64 (64 GB iGPU) #3707 Description: "On ARM64/aarch64 (Snapdragon X + NVIDIA JMJWOA-Generic-GPU, **64 GB iGPU** — hardware upgraded from earlier 8 GB SKU), the guide-recommended Ollama model qwen3.6:35b is still functionally unusable under the OpenClaw agent loop: every sanity prompt returns no token within OpenClaw's 300s wait window, and the openclaw-gateway then crashes with 1006 abnormal closure, dropping into the EMBEDDED FALLBACK path." — add test evidence or identify existing coverage. `src/lib/inference/nim.ts` now sets `computeConstrained: true` when the denylisted JMJWOA/N1X row has passed the bounded WSL Docker Desktop GPU proof. `src/lib/inference/nim-igpu-compute-constrained.test.ts` proves that this detection excludes `qwen3.6:35b` from the NemoClaw selector. The diff does not change OpenClaw token streaming, gateway 1006 handling, or embedded fallback behavior.
  • PRA-T4 Acceptance clause[WSL2][Inference] qwen3.6:35b yields no token within 300s under OpenClaw agent loop on ARM64/aarch64 (64 GB iGPU) #3707 Description: "Three different prompts (file create / quicksort exec / URL fetch) all hit the same silent-timeout pattern, EXIT=124 from `timeout 300`, with `~/openclaw-sanity/` left completely empty (no tool actually fired)." — add test evidence or identify existing coverage. No OpenClaw prompt execution, gateway, filesystem side-effect, timeout, or URL-fetch code is changed. The new tests are focused on NemoClaw GPU detection and Ollama model selection.
  • PRA-T5 Acceptance clause[WSL2][Inference] qwen3.6:35b yields no token within 300s under OpenClaw agent loop on ARM64/aarch64 (64 GB iGPU) #3707 Expected Result: "qwen3.6:35b on a 64 GB iGPU should return tokens within OpenClaw's standard wait window (NEMOCLAW_LOCAL_INFERENCE_TIMEOUT default 180s; OpenClaw's 300s agent-step timeout)." — add test evidence or identify existing coverage. The PR avoids selecting `qwen3.6:35b` on proof-passed N1X iGPU hosts; it does not alter qwen3.6 serving performance, Ollama streaming, NemoClaw inference timeouts, or OpenClaw agent-step timeout behavior.
  • PRA-T6 Acceptance clause[WSL2][Inference] qwen3.6:35b yields no token within 300s under OpenClaw agent loop on ARM64/aarch64 (64 GB iGPU) #3707 Expected Result: "For the canonical sanity prompts in the DGX Spark + Windows ARM reference host guide, `test.txt` should land on disk with the expected content, quicksort should run and print `[1,2,3,6,7,8]`, and the URL-fetch prompt should return the article's author." — add test evidence or identify existing coverage. No tool execution, gateway routing, workspace persistence, quicksort execution, or URL-fetch path is changed. The new test file covers only `detectGpu()` metadata and registry selector output.
  • PRA-T7 Acceptance clause[WSL2][Inference] qwen3.6:35b yields no token within 300s under OpenClaw agent loop on ARM64/aarch64 (64 GB iGPU) #3707 Suggested Fix / Short term / 2. "In OpenClaw onboarding / preflight, detect Windows ARM reference host (JMJWOA-Generic-GPU) and warn / refuse 35B+ class models with an actionable error pointing at the 8B-class recommendation, similar to how the existing preflight detects insufficient RAM." — add test evidence or identify existing coverage. The NemoClaw selector path now marks the proof-passed JMJWOA/N1X GPU as `computeConstrained`, so existing registry helpers refuse registered `computeIntensive` 30B/35B tags. The diff does not add explicit OpenClaw warning/refusal UX.

Workflow run details

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.

The GpuInfo.computeConstrained doc described Jetson-only population; extend it
to the Windows-ARM N1X proof-pass integrated GPU, matching detectGpu() (#3707).

Refs #3707

Signed-off-by: latenighthackathon <latenighthackathon@users.noreply.github.com>
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>

@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

🧹 Nitpick comments (1)
src/lib/inference/nim-igpu-compute-constrained.test.ts (1)

106-118: 🩺 Stability & Availability | 🔵 Trivial | ⚡ Quick win

Consider 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/model reads. If the CI runner's actual firmware strings ever match a jetson-detected pattern, computeConstrained would unexpectedly be set, since only platform === "jetson" or wslDockerDesktopGpuProofPassed trigger 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

📥 Commits

Reviewing files that changed from the base of the PR and between c0a768d and 7f777a5.

📒 Files selected for processing (2)
  • src/lib/inference/nim-igpu-compute-constrained.test.ts
  • src/lib/inference/nim.ts
🚧 Files skipped from review as they are similar to previous changes (1)
  • src/lib/inference/nim.ts

Comment thread src/lib/inference/nim-igpu-compute-constrained.test.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>
@cv cv added the v0.0.74 label Jul 4, 2026
@cv
cv merged commit 6f5ccbc into main Jul 4, 2026
41 checks passed
@cv
cv deleted the fix-n1x-igpu-compute-constrained branch July 4, 2026 07:05
ericksoa added a commit that referenced this pull request Jul 4, 2026
<!-- 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>
Hadar301 pushed a commit to Hadar301/NemoClaw-OpenShift that referenced this pull request Jul 12, 2026
…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>
Hadar301 pushed a commit to Hadar301/NemoClaw-OpenShift that referenced this pull request Jul 12, 2026
<!-- 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>
@wscurran wscurran added area: inference Inference routing, serving, model selection, or outputs bug-fix PR fixes a bug or regression platform: arm64 Affects ARM64 or aarch64 architecture platform: windows Affects native Windows environments labels Aug 1, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area: inference Inference routing, serving, model selection, or outputs bug-fix PR fixes a bug or regression platform: arm64 Affects ARM64 or aarch64 architecture platform: windows Affects native Windows environments

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants