fix(security): patch npm-private ip-address - #8196
Conversation
Signed-off-by: Senthil Ravichandran <senthilr@nvidia.com>
|
Note Reviews pausedIt looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the Use the following commands to manage reviews:
Use the checkboxes below for quick actions:
📝 WalkthroughWalkthroughChangesThe change adds a TypeScript utility that verifies and replaces npm’s bundled npm ip-address remediation
Estimated code review effort: 4 (Complex) | ~60 minutes Possibly related PRs
Suggested labels: Suggested reviewers: Sequence Diagram(s)sequenceDiagram
participant DockerBuild
participant PatchUtility
participant NpmInstallation
participant Registry
DockerBuild->>PatchUtility: run with npm root
PatchUtility->>NpmInstallation: inspect bundled ip-address
PatchUtility->>Registry: fetch pinned 10.3.1 tarball
Registry-->>PatchUtility: return verified archive
PatchUtility->>NpmInstallation: stage, replace, and verify package
NpmInstallation-->>DockerBuild: patched npm installation
🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✨ Finishing Touches 💡 1📝 Generate docstrings 💡
🧪 Generate unit tests (beta)
Comment |
Code Coverage OverviewLanguages: TypeScript TypeScript / code-coverage/pluginThe overall coverage in commit 4cd4101 in the TypeScript / code-coverage/cliThe overall coverage in commit 4cd4101 in the Show a code coverage summary of the most impacted files.
Updated |
PR Review Advisor — No blocking findings reportedAdvisor assessment: No blocking advisor findings reported Model lanes
2 additional E2E selections from the second opinionAdvisory only. The primary lane did not select these E2E jobs or targets.
Second-opinion terminology and E2E selections are advisory. They do not change the primary assessment or E2E / PR Gate. E2E guidanceAdvisory only. E2E / PR Gate selects and runs jobs independently. Recommended E2E: This automated review informs maintainers. Warnings and suggestions do not require a response. A maintainer decides whether to merge. |
There was a problem hiding this comment.
🧹 Nitpick comments (4)
test/patch-bundled-npm-ip-address.test.ts (1)
43-51: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick winBind the npm fixture version to
REVIEWED_NPM_VERSION.Lines 47 and 83 hardcode
"11.18.0".scripts/lib/patch-bundled-npm-ip-address.mtsalready exportsREVIEWED_NPM_VERSIONas the single source of that pin. When the pin moves, this fixture writes a stale npm manifest, and every test in the file fails withnpm package identity has driftedinstead of the intended assertion.The literal
"11.18.0"intest/bundled-npm-ip-address-dockerfile-contract.test.tsis a deliberate contract assertion and should stay. This one is fixture setup.♻️ Proposed fix
import { AFFECTED_IP_ADDRESS_VERSION, FIXED_IP_ADDRESS_VERSION, patchBundledNpmIpAddress, patchBundledNpmIpAddressFromRegistry, + REVIEWED_NPM_VERSION, verifyBundledNpmIpAddress, } from "../scripts/lib/patch-bundled-npm-ip-address.mts";- writeJson(path.join(npmRoot, "package.json"), { name: "npm", version: "11.18.0" }); + writeJson(path.join(npmRoot, "package.json"), { name: "npm", version: REVIEWED_NPM_VERSION });expect(patchBundledNpmIpAddress(target)).toMatchObject({ ipAddressVersion: FIXED_IP_ADDRESS_VERSION, - npmVersion: "11.18.0", + npmVersion: REVIEWED_NPM_VERSION, state: "fixed", });🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@test/patch-bundled-npm-ip-address.test.ts` around lines 43 - 51, Update the fixture setup in fixture to import and use REVIEWED_NPM_VERSION when writing the npm package manifest, replacing the hardcoded "11.18.0" values in this test file. Keep the deliberate contract assertion in bundled-npm-ip-address-dockerfile-contract.test.ts unchanged.test/bundled-npm-ip-address-dockerfile-contract.test.ts (2)
54-54: 🎯 Functional Correctness | 🔵 Trivial | ⚡ Quick winScope the
--npm-rootassertion to the patch instruction.
source.slice(patch)covers every remaining byte of the Dockerfile. Any later instruction that mentions--npm-root /usr/local/lib/node_modules/npmsatisfies this assertion. Each final Dockerfile already runs thetarandbrace-expansionpatches with that same flag, so a future reorder could leave theip-addressinstruction without its--npm-rootargument while this test still passes.Assert the flag inside the patch instruction's own line continuation instead.
♻️ Proposed fix
+function instructionBody(source: string, start: number): string { + const remainder = source.slice(start); + const end = remainder.search(/\n(?!\s)/u); + return end === -1 ? remainder : remainder.slice(0, end); +}expect(patch, file).toBeGreaterThan(upgrade); - expect(source.slice(patch)).toContain("--npm-root /usr/local/lib/node_modules/npm"); + expect(instructionBody(source, patch), file).toContain( + "--npm-root /usr/local/lib/node_modules/npm", + );expect(ipAddressPatch, file).toBeGreaterThan(bracePatch); - expect(source.slice(ipAddressPatch)).toContain("--npm-root /usr/local/lib/node_modules/npm"); + expect(instructionBody(source, ipAddressPatch), file).toContain( + "--npm-root /usr/local/lib/node_modules/npm", + );Also applies to: 72-72
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@test/bundled-npm-ip-address-dockerfile-contract.test.ts` at line 54, Update the assertions in the bundled npm Dockerfile contract test to scope the --npm-root check to the ip-address patch instruction’s own continued line, rather than the entire source.slice(patch) remainder. Apply the same change to both affected assertions so later tar or brace-expansion instructions cannot satisfy the check.
37-40: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick winPin the exact integrity value, not only its shape.
Line 38 asserts the exact tarball URL, and lines 35-36 assert the exact npm and
ip-addressversions. Line 37 asserts only thatFIXED_IP_ADDRESS_INTEGRITYlooks like a base64 SHA-512 SRI string. An edit that replaces the digest with a different well-formed digest passes this test. The mismatch then surfaces only during a real image build that reaches the download path.Assert the committed digest exactly, so it matches how the URL and versions are treated.
♻️ Proposed fix
- expect(FIXED_IP_ADDRESS_INTEGRITY).toMatch(/^sha512-[A-Za-z0-9+/]+=*$/u); + expect(FIXED_IP_ADDRESS_INTEGRITY).toBe( + "sha512-1e9d3kb97NHJTIJDZW9rKqW2h6+dFa50Dy0fpPSMQp2ADje5gvKsXmdiK6dwY5t76TaTt5+P5N1Y/LoToIxP6g==", + );🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@test/bundled-npm-ip-address-dockerfile-contract.test.ts` around lines 37 - 40, Update the FIXED_IP_ADDRESS_INTEGRITY assertion in the bundled npm ip-address contract test to compare against the exact committed SHA-512 SRI digest, replacing the format-only regular expression check. Preserve the existing exact assertions for the npm package, version, and FIXED_IP_ADDRESS_TARBALL.scripts/lib/patch-bundled-npm-ip-address.mts (1)
245-256: 🩺 Stability & Availability | 🔵 Trivial | ⚡ Quick winDo not fail a verified patch when backup cleanup fails, and do not mask the original error during rollback.
Two error-handling gaps exist in the transaction epilogue:
- Lines 245-249 retry the identical
rmSync(backupPath, ...)call with no delay and no change in arguments. If the second attempt also throws, the error propagates out ofpatchBundledNpmIpAddresseven thoughverifyBundledNpmIpAddressalready confirmed the fixed package on disk. The image build then fails for a leftover backup directory, not for an unremediated npm tree. The remainingip-address.nemoclaw-backup-*directory is also skipped bycollectIpAddressVersions, so a later inspection would still pass.- Line 254 calls
renameSync(backupPath, livePath)inside thecatchblock. If that call throws, it replaces the original failure with a rollback failure, and the operator loses the reason the patch was rejected.Report a failed backup cleanup as a non-fatal condition, and preserve the original error when rollback fails.
♻️ Proposed error-handling fix
const fixed = verifyBundledNpmIpAddress(npmRoot); rollbackRequired = false; try { rmSync(backupPath, { force: true, recursive: true }); } catch { - rmSync(backupPath, { force: true, recursive: true }); + try { + rmSync(backupPath, { force: true, recursive: true }); + } catch (cleanupError) { + process.stderr.write( + `WARNING: verified replacement retained; backup cleanup failed at ${backupPath}: ${String(cleanupError)}\n`, + ); + } } return fixed; } catch (error) { if (rollbackRequired) { - rmSync(livePath, { force: true, recursive: true }); - renameSync(backupPath, livePath); + try { + rmSync(livePath, { force: true, recursive: true }); + renameSync(backupPath, livePath); + } catch (rollbackError) { + throw new AggregateError( + [error, rollbackError], + `npm bundled ip-address rollback failed; ${livePath} may be incomplete and ${backupPath} holds the original tree`, + ); + } } throw error; } finally {🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@scripts/lib/patch-bundled-npm-ip-address.mts` around lines 245 - 256, Update the transaction epilogue in patchBundledNpmIpAddress: after verifyBundledNpmIpAddress confirms the patch, make backup cleanup failure non-fatal rather than retrying the identical rmSync call and propagating its error. In the rollback path guarded by rollbackRequired, contain any renameSync failure so it cannot replace the original caught error; preserve and rethrow the initial patch failure while reporting cleanup or rollback failures as secondary conditions.
🤖 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.
Nitpick comments:
In `@scripts/lib/patch-bundled-npm-ip-address.mts`:
- Around line 245-256: Update the transaction epilogue in
patchBundledNpmIpAddress: after verifyBundledNpmIpAddress confirms the patch,
make backup cleanup failure non-fatal rather than retrying the identical rmSync
call and propagating its error. In the rollback path guarded by
rollbackRequired, contain any renameSync failure so it cannot replace the
original caught error; preserve and rethrow the initial patch failure while
reporting cleanup or rollback failures as secondary conditions.
In `@test/bundled-npm-ip-address-dockerfile-contract.test.ts`:
- Line 54: Update the assertions in the bundled npm Dockerfile contract test to
scope the --npm-root check to the ip-address patch instruction’s own continued
line, rather than the entire source.slice(patch) remainder. Apply the same
change to both affected assertions so later tar or brace-expansion instructions
cannot satisfy the check.
- Around line 37-40: Update the FIXED_IP_ADDRESS_INTEGRITY assertion in the
bundled npm ip-address contract test to compare against the exact committed
SHA-512 SRI digest, replacing the format-only regular expression check. Preserve
the existing exact assertions for the npm package, version, and
FIXED_IP_ADDRESS_TARBALL.
In `@test/patch-bundled-npm-ip-address.test.ts`:
- Around line 43-51: Update the fixture setup in fixture to import and use
REVIEWED_NPM_VERSION when writing the npm package manifest, replacing the
hardcoded "11.18.0" values in this test file. Keep the deliberate contract
assertion in bundled-npm-ip-address-dockerfile-contract.test.ts unchanged.
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Enterprise
Run ID: f6982bd3-511b-4611-bed3-768e2fde7d49
📒 Files selected for processing (15)
DockerfileDockerfile.baseagents/hermes/Dockerfileagents/hermes/Dockerfile.baseagents/langchain-deepagents-code/Dockerfileagents/langchain-deepagents-code/Dockerfile.basescripts/lib/patch-bundled-npm-ip-address.mtssrc/lib/sandbox-base-image/source-identity.test.tssrc/lib/sandbox-base-image/source-identity.tssrc/lib/sandbox/build-context.tstest/bundled-npm-ip-address-dockerfile-contract.test.tstest/hermes-final-image-layout.test.tstest/openclaw-final-image-layout.test.tstest/patch-bundled-npm-ip-address.test.tstest/sandbox-build-context.test.ts
Signed-off-by: Senthil Ravichandran <senthilr@nvidia.com>
Signed-off-by: Senthil Ravichandran <senthilr@nvidia.com>
Signed-off-by: Senthil Ravichandran <senthilr@nvidia.com>
Signed-off-by: Senthil Ravichandran <senthilr@nvidia.com>
|
Addressed the review findings in
Focused tests: 69 passed; exact-head build, type-check, repository checks, and real npm 11.18.0 artifact verification passed. |
|
Exact-head CI follow-up for acb9a03: the authoritative aggregate checks job is red on two branch-owned contracts: (1) test/sandbox-base-image-layout.test.ts still expects 24 Dockerfile steps after this PR adds two, and (2) test/dcode-base-image-workflow.test.ts reports scripts/lib/patch-bundled-npm-ip-address.mts is missing from the Hermes and DCode publisher workflow trigger lists. The dashboard remote-bind failure in the same run appears unrelated/base drift, but these two failures need a new head before review. I am not rerunning or editing the author branch. |
Signed-off-by: Senthil Ravichandran <senthilr@nvidia.com>
Signed-off-by: Senthil Ravichandran <senthilr@nvidia.com>
|
Addressed at |
|
Exact-head E2E triage for
Artifact receipt: child run https://github.com/NVIDIA/NemoClaw/actions/runs/30890429416, failed job I do not see a branch-owned code fix indicated by this evidence. The required gate still needs a green exact-head rerun after the hosted model/test contract is healthy (or a maintainer waiver with a tracked gate issue); I have not rerun or edited the author branch. |
Signed-off-by: Julie Yaunches <jyaunches@nvidia.com>
There was a problem hiding this comment.
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
Dockerfile (1)
241-245: 🩺 Stability & Availability | 🟠 Major | ⚡ Quick winConfigure curl trust before the registry-backed remediation.
When the bundled
ip-addressversion is affected, the helper downloads the replacement archive withcurl.NODE_EXTRA_CA_CERTSdoes not configure curl.
Dockerfile#L241-L245: Move thisRUNafter CA decoding and setCURL_CA_BUNDLE=/usr/local/share/nemoclaw/corporate-ca.pem.agents/langchain-deepagents-code/Dockerfile#L150-L153: Set the sameCURL_CA_BUNDLEvalue after the final-stage CA decode and before thisRUN.🤖 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 `@Dockerfile` around lines 241 - 245, Configure curl trust before the registry-backed remediation: in Dockerfile lines 241-245, move the RUN invoking patch-bundled-npm-ip-address.mts until after CA decoding and set CURL_CA_BUNDLE to /usr/local/share/nemoclaw/corporate-ca.pem; make the same environment setting after final-stage CA decoding and before the corresponding RUN in agents/langchain-deepagents-code/Dockerfile lines 150-153.Source: Path instructions
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Outside diff comments:
In `@Dockerfile`:
- Around line 241-245: Configure curl trust before the registry-backed
remediation: in Dockerfile lines 241-245, move the RUN invoking
patch-bundled-npm-ip-address.mts until after CA decoding and set CURL_CA_BUNDLE
to /usr/local/share/nemoclaw/corporate-ca.pem; make the same environment setting
after final-stage CA decoding and before the corresponding RUN in
agents/langchain-deepagents-code/Dockerfile lines 150-153.
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Enterprise
Run ID: 2ac9face-4beb-425d-8f9d-616cf052704a
📒 Files selected for processing (11)
.github/workflows/base-image.yamlDockerfileagents/hermes/Dockerfileagents/hermes/Dockerfile.baseagents/langchain-deepagents-code/Dockerfileagents/langchain-deepagents-code/Dockerfile.basesrc/lib/onboard/dockerfile-remote-dashboard-bind-contract.tssrc/lib/sandbox/build-context.tstest/hermes-final-image-layout.test.tstest/openclaw-final-image-layout.test.tstest/sandbox-build-context.test.ts
🚧 Files skipped from review as they are similar to previous changes (9)
- test/sandbox-build-context.test.ts
- test/hermes-final-image-layout.test.ts
- src/lib/onboard/dockerfile-remote-dashboard-bind-contract.ts
- agents/hermes/Dockerfile
- agents/hermes/Dockerfile.base
- .github/workflows/base-image.yaml
- test/openclaw-final-image-layout.test.ts
- agents/langchain-deepagents-code/Dockerfile.base
- src/lib/sandbox/build-context.ts
Signed-off-by: Julie Yaunches <jyaunches@nvidia.com>
Signed-off-by: Julie Yaunches <jyaunches@nvidia.com>
<!-- markdownlint-disable MD041 --> ## Summary Prepares the canonical v0.0.102 release documentation from the current release-labeled scope. The change adds a dated changelog for all 38 user-facing shipping PRs and corrects the OpenClaw agent command reference for the behavior delivered by #8191. ## Changes - Add `docs/changelog/2026-08-04.mdx` with the v0.0.102 release summary, detailed behavior changes, support boundaries, security evidence links, and links to durable documentation. - Update `docs/reference/commands.mdx` to describe non-JSON OpenClaw output capture, its combined limit, marker handling, stream suppression, recovery guidance, and exit behavior. - [#8167](#8167) -> `docs/changelog/2026-08-04.mdx`: Records authenticated attachment of operator-managed llama.cpp servers. - [#8129](#8129) -> `docs/changelog/2026-08-04.mdx`: Records the Experimental managed vLLM profile for two DGX Spark systems. - [#7983](#7983) -> `docs/changelog/2026-08-04.mdx`: Records qualification of the May 2026 GB300WS factory image. - [#8207](#8207) -> `docs/changelog/2026-08-04.mdx`: Records the qualified DGX Station driver transaction. - [#8208](#8208) -> `docs/changelog/2026-08-04.mdx`: Records mode-bound Express resume state. - [#8158](#8158) -> `docs/changelog/2026-08-04.mdx`: Records recovery of host-global dual-Station runtime ownership. - [#8145](#8145) -> `docs/changelog/2026-08-04.mdx`: Records Windows-host Ollama validation from Docker Desktop's network context. - [#8190](#8190) -> `docs/changelog/2026-08-04.mdx`: Records HTTP model pulls when WSL has no local Ollama executable. - [#8195](#8195) -> `docs/changelog/2026-08-04.mdx`: Records reuse of a healthy installer-managed CLI. - [#8053](#8053) -> `docs/changelog/2026-08-04.mdx`: Records early rejection of incompatible OpenShell gateway versions. - [#8098](#8098) -> `docs/changelog/2026-08-04.mdx`: Records the bounded package-service-to-standalone gateway recovery transition. - [#8216](#8216) -> `docs/changelog/2026-08-04.mdx`: Records the final dashboard port selected during multi-sandbox onboarding. - [#8146](#8146) -> `docs/changelog/2026-08-04.mdx`: Records managed startup-state restoration for stopped sandboxes. - [#8092](#8092) -> `docs/changelog/2026-08-04.mdx`: Records gateway watchdog recovery for classified not-serving states. - [#8182](#8182) -> `docs/changelog/2026-08-04.mdx`: Records consistent managed-recovery wait configuration. - [#8040](#8040) -> `docs/changelog/2026-08-04.mdx`: Records Docker sandbox rollback authority through late validation. - [#8130](#8130) -> `docs/changelog/2026-08-04.mdx`: Records bounded Shields deadline recovery and durable containment. - [#8086](#8086) -> `docs/changelog/2026-08-04.mdx`: Records repair of narrowly validated permission-only configuration drift. - [#8122](#8122) -> `docs/changelog/2026-08-04.mdx`: Records prompt failure and guidance for corrupt transition locks. - [#8124](#8124) -> `docs/changelog/2026-08-04.mdx`: Records policy restoration flags, previews, and target revalidation. - [#7886](#7886) -> `docs/changelog/2026-08-04.mdx`: Records explicit destruction after pre-delete Shields hardening failures while preserving recovery authority. - [#7901](#7901) -> `docs/changelog/2026-08-04.mdx`: Records multi-port uninstall behavior and shared-resource preservation. - [#7984](#7984) -> `docs/changelog/2026-08-04.mdx`: Records one classified transient remote MCP startup retry. - [#7954](#7954) -> `docs/changelog/2026-08-04.mdx`: Records bounded hosted-inference probe replies. - [#7574](#7574) -> `docs/changelog/2026-08-04.mdx`: Records preservation of validated reasoning capabilities through onboarding. - [#8089](#8089) -> `docs/changelog/2026-08-04.mdx`: Records proxy routing for Hermes WhatsApp pairing and media traffic. - [#7682](#7682) -> `docs/changelog/2026-08-04.mdx`: Records native Hermes session deletion and identifier validation. - [#8150](#8150) -> `docs/changelog/2026-08-04.mdx`: Records corporate CA trust for LangChain Deep Agents Code image builds. - [#8156](#8156) -> `docs/changelog/2026-08-04.mdx`: Records reviewed managed runtime dependency remediation. - [#8180](#8180) -> `docs/changelog/2026-08-04.mdx`: Records reviewed MCP discovery runtime dependency updates. - [#8196](#8196) -> `docs/changelog/2026-08-04.mdx`: Records private npm dependency remediation across managed images. - [#8203](#8203) -> `docs/changelog/2026-08-04.mdx`: Records reviewed Hermes and LangChain Deep Agents Code Python dependency updates. - [#8125](#8125) -> `docs/changelog/2026-08-04.mdx`: Records bounded diagnostics for invalid enumerated CLI values. - [#8193](#8193) -> `docs/changelog/2026-08-04.mdx`: Records bounded diagnostics for unresolved sandbox base images. - [#8118](#8118) -> `docs/changelog/2026-08-04.mdx`: Records bounded diagnostics for changed gateway authority. - [#8191](#8191) -> `docs/changelog/2026-08-04.mdx`, `docs/reference/commands.mdx`: Records output capture, marker handling, recovery guidance, and exit behavior for non-JSON OpenClaw agent commands. - [#8187](#8187) -> `docs/changelog/2026-08-04.mdx`: Records the aligned interactive-installation start across supported agents. - [#8153](#8153) -> `docs/changelog/2026-08-04.mdx`: Records current product capabilities and support boundaries. ## Type of Change - [ ] Code change (feature, bug fix, or refactor) - [ ] Code change with doc updates - [x] Doc only (prose changes, no code sample modifications) - [ ] Doc only (includes code sample changes) ## Quality Gates - [ ] Tests added or updated for changed behavior - [ ] Existing tests cover changed behavior — justification: - [x] Tests not applicable — justification: This documentation-only release preparation does not change executable behavior. Existing changelog and published-route tests pass. - [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: ## Documentation Writer Review - [x] Documentation writer subagent reviewed the completed changes - Result: `docs-updated` - Evidence: Independently reviewed `docs/changelog/2026-08-04.mdx` and `docs/reference/commands.mdx` at commit `b89913780`. All 38 user-facing v0.0.102 PRs are represented, #8191 behavior matches the implementation, and the writing rules, documentation style, controlled terminology, route structure, and skip policy pass review. Targeted tests pass 36/36 and the documentation build completes with 0 errors. - Agent: Codex Desktop independent documentation writer <!-- docs-review-head-sha: b899137 --> <!-- docs-review-agents-blob-sha: 3dd7c24 --> ## DGX Station Hardware Evidence - [ ] Tested on DGX Station - Tested commit: Not applicable - Station profile/scenario: Not applicable - Result: Not applicable - Supporting evidence: Not applicable ## Verification - [x] PR description includes a `Signed-off-by:` line and every commit appears as `Verified` in GitHub - [x] Normal `pre-commit`, `commit-msg`, and `pre-push` hooks passed, or `npm run validate:pr` passed after refreshing `origin/main` when hooks were skipped or unavailable - [x] Targeted behavior tests pass for the current change set, or tests are marked not applicable above — `npx vitest run --project integration test/changelog-docs.test.ts test/check-docs-published-routes.test.ts` passed 36/36. - [x] Applicable broad gate passed — not applicable to documentation-only changes; `npm run docs` completed successfully with 0 errors. - [x] Quality Gates section completed with required justifications or waivers - [x] No secrets, API keys, or credentials committed - [ ] `npm run docs` builds without warnings (doc changes only) — completed with 0 errors and 2 existing Fern warnings. - [x] Doc pages follow the [style guide](https://github.com/NVIDIA/NemoClaw/blob/main/docs/CONTRIBUTING.md) (doc changes only) - [x] New doc pages include SPDX header and frontmatter (new pages only) — the native dated changelog uses the required parser-safe MDX SPDX comment and intentionally has no frontmatter. --- Signed-off-by: Apurv Kumaria <akumaria@nvidia.com> <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit - **Documentation** - Added release notes for v0.0.102, covering authentication, hardware setup, WSL, installer recovery, sandbox resilience, policy management, inference reliability, CLI improvements, and unified quickstarts. - Updated command documentation to explain how non-JSON agent output is collected, replayed, and reported. - **Bug Fixes** - Improved command-output recovery guidance when output exceeds limits or contains unsupported fallback markers. - Preserved accurate command exit-status reporting after output processing. <!-- end of auto-generated comment: release notes by coderabbit.ai --> Signed-off-by: Apurv Kumaria <akumaria@nvidia.com>
Summary
NemoClaw-managed images currently inherit
ip-address10.2.0 from npm 11.18.0's private dependency tree. This change replaces that private package with the reviewed, integrity-pinned 10.3.1 release that addresses GHSA-mwp4-54f8-5fhr, while preserving the npm package contract.Changes
ip-addresslayouts, verifies the registry archive with SHA-512 SRI, and rolls back an incomplete replacement.Type of Change
Quality Gates
acb9a03ccpassed all nine repository security categories. The archive is registry- and SRI-pinned, package and npm identities fail closed on drift, unsafe members are rejected, cleanup remains fail-closed, and rollback paths preserve primary and secondary errors.Documentation Writer Review
no-docs-neededip-addresspackage during managed-image assembly and preserves existing corporate-CA trust for its registry download in OpenClaw and LangChain Deep Agents Code. It changes no user-facing API, CLI, configuration, workflow, default, or documented runtime behavior. Changed comments, errors, output, and test titles comply with repository writing rules. Exact-head validation passed 114/114 focused tests across eight files, including 5/5 corporate-CA tests; repository, source-shape, and commit-hook checks also passed.DGX Station Hardware Evidence
Verification
Signed-off-by:line and every commit appears asVerifiedin GitHubpre-commit,commit-msg, andpre-pushhooks passed, ornpm run validate:prpassed after refreshingorigin/mainwhen hooks were skipped or unavailableip-address10.3.1 registry artifact.npm testfor broad runtime/test-harness changes;npm run checkfor repo-wide validation/coverage changes — command/result: Not applicable to this path-scoped image dependency remediation; managed multi-platform image validation remains in CI.npm run docsbuilds without warnings (doc changes only)Signed-off-by: Senthil Ravichandran senthilr@nvidia.com
Summary by CodeRabbit
Security
Reliability