Skip to content

fix(security): patch npm-private ip-address - #8196

Merged
senthilr-nv merged 10 commits into
mainfrom
codex/security-bundled-npm-ip-address
Aug 4, 2026
Merged

fix(security): patch npm-private ip-address#8196
senthilr-nv merged 10 commits into
mainfrom
codex/security-bundled-npm-ip-address

Conversation

@senthilr-nv

@senthilr-nv senthilr-nv commented Aug 4, 2026

Copy link
Copy Markdown
Collaborator

Summary

NemoClaw-managed images currently inherit ip-address 10.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

  • Add a fail-closed helper that accepts only the reviewed npm and ip-address layouts, verifies the registry archive with SHA-512 SRI, and rolls back an incomplete replacement.
  • Apply and reassert the private-package fix in the OpenClaw, Hermes, and LangChain Deep Agents Code base and final images.
  • Include the helper in optimized build contexts and base-image source identity.
  • Cover package drift, unsafe members, rollback, cleanup, Dockerfile ordering, and final-image contracts with focused tests.

Type of Change

  • Code change (feature, bug fix, or refactor)
  • Code change with doc updates
  • 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:
  • Tests not applicable — justification:
  • Docs updated for user-facing behavior changes
  • Docs not applicable — justification: This changes only a private package inside managed image assembly; no user-visible API, CLI, configuration, workflow, default, or documented runtime behavior changes.
  • 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: Security review at acb9a03cc passed 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.
  • Non-success, skipped, or missing CI check accepted by maintainer — check name, approval link, and follow-up issue:

Documentation Writer Review

  • Documentation writer subagent reviewed the completed changes
  • Result: no-docs-needed
  • Evidence: The change remediates npm's private ip-address package 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.
  • Agent: Codex Desktop

DGX Station Hardware Evidence

  • Tested on DGX Station
  • Tested commit:
  • Station profile/scenario:
  • Result:
  • Supporting evidence:

Verification

  • PR description includes a Signed-off-by: line and every commit appears as Verified in GitHub
  • 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
  • Targeted behavior tests pass for the current change set, or tests are marked not applicable above — command/result or justification: 114 focused tests passed across eight files, including 5/5 corporate-CA tests; repository checks, source-shape checks, and normal commit hooks passed. The registry remediation honors the baked corporate CA. A real npm 11.18.0 archive was patched and verified with the pinned ip-address 10.3.1 registry artifact.
  • Applicable broad gate passed — npm test for broad runtime/test-harness changes; npm run check for repo-wide validation/coverage changes — command/result: Not applicable to this path-scoped image dependency remediation; managed multi-platform image validation remains in CI.
  • Quality Gates section completed with required justifications or waivers
  • No secrets, API keys, or credentials committed
  • npm run docs builds without warnings (doc changes only)
  • Doc pages follow the style guide (doc changes only)
  • New doc pages include SPDX header and frontmatter (new pages only)

Signed-off-by: Senthil Ravichandran senthilr@nvidia.com

Summary by CodeRabbit

  • Security

    • Updated the bundled npm networking component in container images to a reviewed, integrity-verified release.
    • Added safeguards for unexpected package layouts, unsafe files, and incomplete updates.
    • Enabled safe rollback when verification fails.
  • Reliability

    • Applied the update consistently across supported base and final container images.
    • Added build-time validation for package inclusion, permissions, metadata, and execution order.
    • Added automated coverage for successful updates, failures, rollback, and cleanup scenarios.

Signed-off-by: Senthil Ravichandran <senthilr@nvidia.com>
@coderabbitai

coderabbitai Bot commented Aug 4, 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

Changes

The change adds a TypeScript utility that verifies and replaces npm’s bundled ip-address package with pinned version 10.3.1. Docker build contexts and base and final images include and run the utility. Tests cover package safety, rollback, staging, ordering, and image metadata.

npm ip-address remediation

Layer / File(s) Summary
Validated package inspection and replacement
scripts/lib/patch-bundled-npm-ip-address.mts, test/patch-bundled-npm-ip-address.test.ts
The utility validates npm layouts and symlinks, verifies the pinned tarball, performs transactional replacement, supports registry and CLI execution, and tests replacement, rollback, cleanup, and fail-closed behavior.
Build-context staging and base-image patching
src/lib/sandbox-base-image/*, src/lib/sandbox/build-context.ts, test/sandbox-build-context.test.ts, Dockerfile.base, agents/*/Dockerfile.base, test/bundled-npm-ip-address-dockerfile-contract.test.ts
The script enters base-image change detection and optimized build contexts. Base Dockerfiles run it after npm upgrades. Contract tests validate versions, integrity, URLs, and command order.
Final-image remediation and metadata validation
Dockerfile, agents/*/Dockerfile, test/hermes-final-image-layout.test.ts, test/openclaw-final-image-layout.test.ts
Final images copy and run the remediation script. Layout tests validate payload inclusion, ownership, permissions, and execution order.
Workflow and image contract updates
.github/workflows/base-image.yaml, src/lib/onboard/dockerfile-remote-dashboard-bind-contract.ts, test/sandbox-base-image-layout.test.ts
Workflow path monitoring, the canonical Dockerfile instruction digest, and the sandbox layer-count expectation are updated for the added remediation steps.

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

Possibly related PRs

Suggested labels: dependencies, area: packaging, platform: container

Suggested reviewers: apurvvkumaria, cv

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
Loading
🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly and concisely describes the main security fix for npm's private ip-address dependency.
✨ Finishing Touches 💡 1
📝 Generate docstrings 💡
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch codex/security-bundled-npm-ip-address

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

@github-code-quality

github-code-quality Bot commented Aug 4, 2026

Copy link
Copy Markdown
Contributor

Code Coverage Overview

Languages: TypeScript

TypeScript / code-coverage/plugin

The overall coverage in commit 4cd4101 in the codex/security-bundl... branch remains at 96%, unchanged from commit 3835080 in the main branch.

TypeScript / code-coverage/cli

The overall coverage in commit 4cd4101 in the codex/security-bundl... branch remains at 81%, unchanged from commit 3835080 in the main branch.

Show a code coverage summary of the most impacted files.
File main 3835080 codex/security-bundl... 4cd4101 +/-
src/lib/sandbox...rce-identity.ts 88% 87% -1%
src/lib/sandbox...uild-context.ts 42% 42% 0%
src/lib/state/m...-acquisition.ts 75% 75% 0%
src/lib/tunnel/services.ts 76% 76% 0%

Updated August 04, 2026 13:30 UTC

@senthilr-nv senthilr-nv added dependencies Pull requests that update a dependency file area: packaging Packages, images, registries, installers, or distribution area: sandbox OpenShell sandbox lifecycle, runtime, config, or recovery area: security Security controls, permissions, secrets, or hardening bug-fix PR fixes a bug or regression platform: container Affects Docker, containerd, Podman, or images security integration: openclaw OpenClaw integration behavior integration: hermes Hermes integration behavior integration: dcode LangChain Deep Code integration behavior v0.0.102 labels Aug 4, 2026
@github-actions

github-actions Bot commented Aug 4, 2026

Copy link
Copy Markdown
Contributor

PR Review Advisor — No blocking findings reported

Advisor assessment: No blocking advisor findings reported
Next action: No advisor follow-up needed.
Findings: 0 blockers · 0 warnings · 0 suggestions

Model lanes

  • GPT-5.6 Terra (primary): Completed · high confidence · 0 blockers · 0 warnings · 0 suggestions
  • Nemotron 3 Ultra (second opinion): Completed · high confidence · 0 blockers · 0 warnings · 0 suggestions
  • Model comparison: normalized findings match; normalized terminology decisions match; normalized E2E selections differ; severity counts match.
2 additional E2E selections from the second opinion

Advisory only. The primary lane did not select these E2E jobs or targets.

  • rebuild-hermes: The completed second-opinion lane identified E2E coverage that the primary lane omitted.
  • rebuild-openclaw: The completed second-opinion lane identified E2E coverage that the primary lane omitted.

Second-opinion terminology and E2E selections are advisory. They do not change the primary assessment or E2E / PR Gate.

E2E guidance

Advisory only. E2E / PR Gate selects and runs jobs independently.

Recommended E2E: cloud-onboard, full-e2e, hermes-e2e, hermes-inference-switch, security-posture, onboard-repair, onboard-resume, ubuntu-repo-cloud-langchain-deepagents-code

Workflow run details

This automated review informs maintainers. Warnings and suggestions do not require a response. A maintainer decides whether to merge.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🧹 Nitpick comments (4)
test/patch-bundled-npm-ip-address.test.ts (1)

43-51: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Bind the npm fixture version to REVIEWED_NPM_VERSION.

Lines 47 and 83 hardcode "11.18.0". scripts/lib/patch-bundled-npm-ip-address.mts already exports REVIEWED_NPM_VERSION as the single source of that pin. When the pin moves, this fixture writes a stale npm manifest, and every test in the file fails with npm package identity has drifted instead of the intended assertion.

The literal "11.18.0" in test/bundled-npm-ip-address-dockerfile-contract.test.ts is 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 win

Scope the --npm-root assertion 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/npm satisfies this assertion. Each final Dockerfile already runs the tar and brace-expansion patches with that same flag, so a future reorder could leave the ip-address instruction without its --npm-root argument 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 win

Pin 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-address versions. Line 37 asserts only that FIXED_IP_ADDRESS_INTEGRITY looks 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 win

Do 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:

  1. 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 of patchBundledNpmIpAddress even though verifyBundledNpmIpAddress already confirmed the fixed package on disk. The image build then fails for a leftover backup directory, not for an unremediated npm tree. The remaining ip-address.nemoclaw-backup-* directory is also skipped by collectIpAddressVersions, so a later inspection would still pass.
  2. Line 254 calls renameSync(backupPath, livePath) inside the catch block. 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

📥 Commits

Reviewing files that changed from the base of the PR and between 643a4ab and f6c0386.

📒 Files selected for processing (15)
  • Dockerfile
  • Dockerfile.base
  • agents/hermes/Dockerfile
  • agents/hermes/Dockerfile.base
  • agents/langchain-deepagents-code/Dockerfile
  • agents/langchain-deepagents-code/Dockerfile.base
  • scripts/lib/patch-bundled-npm-ip-address.mts
  • src/lib/sandbox-base-image/source-identity.test.ts
  • src/lib/sandbox-base-image/source-identity.ts
  • src/lib/sandbox/build-context.ts
  • test/bundled-npm-ip-address-dockerfile-contract.test.ts
  • test/hermes-final-image-layout.test.ts
  • test/openclaw-final-image-layout.test.ts
  • test/patch-bundled-npm-ip-address.test.ts
  • test/sandbox-build-context.test.ts

@senthilr-nv senthilr-nv removed integration: openclaw OpenClaw integration behavior dependencies Pull requests that update a dependency file integration: hermes Hermes integration behavior area: packaging Packages, images, registries, installers, or distribution area: sandbox OpenShell sandbox lifecycle, runtime, config, or recovery platform: container Affects Docker, containerd, Podman, or images integration: dcode LangChain Deep Code integration behavior labels Aug 4, 2026
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>
@senthilr-nv

Copy link
Copy Markdown
Collaborator Author

Addressed the review findings in 5358ce188 and validated the refreshed head acb9a03cc:

  • fixtures now use REVIEWED_NPM_VERSION
  • the Docker contract pins the exact SRI and scopes --npm-root to the patch instruction
  • cleanup and rollback failures preserve both primary and secondary errors
  • backup cleanup remains fail-closed so an affected backup tree cannot ship in the image

Focused tests: 69 passed; exact-head build, type-check, repository checks, and real npm 11.18.0 artifact verification passed.

@senthilr-nv
senthilr-nv requested a review from cv August 4, 2026 07:18
@cjagwani

cjagwani commented Aug 4, 2026

Copy link
Copy Markdown
Collaborator

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.

@senthilr-nv
senthilr-nv enabled auto-merge (squash) August 4, 2026 07:40
Signed-off-by: Senthil Ravichandran <senthilr@nvidia.com>
Signed-off-by: Senthil Ravichandran <senthilr@nvidia.com>
@senthilr-nv

Copy link
Copy Markdown
Collaborator Author

Addressed at f572d1706: the image publisher now tracks the npm patch helper, the base-image layer contract includes the added COPY and RUN steps, and the refreshed Dockerfile metadata digest restores the dashboard bind contract. The three previously failing CI tests now pass locally (40/40). The branch was refreshed from current main with a normal signed merge; squash auto-merge remains enabled.

@cjagwani

cjagwani commented Aug 4, 2026

Copy link
Copy Markdown
Collaborator

Exact-head E2E triage for f572d1706:

  • The selected ubuntu-repo-cloud-langchain-deepagents-code scenario passed initial onboarding, invalid-credential rebuild safety, state validation, the DCode runtime check, and the other selected live lanes.
  • The sole failure is 04-deepagents-code-fresh-reonboard.sh: initial onboarding with nvidia/nvidia/nemotron-3-ultra succeeds, then the check deliberately switches to openai/openai/gpt-5.5; the fresh onboarding probe receives HTTP 400 from the hosted Chat Completions endpoint and stops before recreating/building the sandbox.
  • This PR does not modify provider selection or that check. Its DCode image change legitimately selects the target, but the observed failure is at the hosted endpoint/model validation boundary before the changed image is exercised.

Artifact receipt: child run https://github.com/NVIDIA/NemoClaw/actions/runs/30890429416, failed job 91931155105; exact expected/tested SHA in risk-signal.json is f572d1706f8d4bae362cf2d4a40e52ead0511435.

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>

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Caution

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

⚠️ Outside diff range comments (1)
Dockerfile (1)

241-245: 🩺 Stability & Availability | 🟠 Major | ⚡ Quick win

Configure curl trust before the registry-backed remediation.

When the bundled ip-address version is affected, the helper downloads the replacement archive with curl. NODE_EXTRA_CA_CERTS does not configure curl.

  • Dockerfile#L241-L245: Move this RUN after CA decoding and set CURL_CA_BUNDLE=/usr/local/share/nemoclaw/corporate-ca.pem.
  • agents/langchain-deepagents-code/Dockerfile#L150-L153: Set the same CURL_CA_BUNDLE value after the final-stage CA decode and before this RUN.
🤖 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

📥 Commits

Reviewing files that changed from the base of the PR and between f572d17 and b3446fe.

📒 Files selected for processing (11)
  • .github/workflows/base-image.yaml
  • Dockerfile
  • agents/hermes/Dockerfile
  • agents/hermes/Dockerfile.base
  • agents/langchain-deepagents-code/Dockerfile
  • agents/langchain-deepagents-code/Dockerfile.base
  • src/lib/onboard/dockerfile-remote-dashboard-bind-contract.ts
  • src/lib/sandbox/build-context.ts
  • test/hermes-final-image-layout.test.ts
  • test/openclaw-final-image-layout.test.ts
  • test/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>
@senthilr-nv
senthilr-nv merged commit efc3499 into main Aug 4, 2026
81 of 83 checks passed
@senthilr-nv
senthilr-nv deleted the codex/security-bundled-npm-ip-address branch August 4, 2026 13:56
apurvvkumaria added a commit that referenced this pull request Aug 4, 2026
<!-- 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>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area: security Security controls, permissions, secrets, or hardening bug-fix PR fixes a bug or regression security

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants