Skip to content

fix(dcode): publish and validate sandbox base image - #6469

Merged
ericksoa merged 3 commits into
mainfrom
fix/dcode-base-image-publishing-6456
Jul 8, 2026
Merged

fix(dcode): publish and validate sandbox base image#6469
ericksoa merged 3 commits into
mainfrom
fix/dcode-base-image-publishing-6456

Conversation

@ericksoa

@ericksoa ericksoa commented Jul 8, 2026

Copy link
Copy Markdown
Contributor

Summary

Publishes the LangChain Deep Agents Code sandbox base image from the same main/tag workflow used by the other supported agents, closing the release-pipeline gap that left v0.0.76 resolving an obsolete deepagents-code 0.1.12 base. Base resolution now verifies the installed DCode distribution against the active manifest and fingerprints both the manifest and dependency lock so version or transitive dependency drift fails closed before final-image construction.

Related Issue

Refs #6456. Keep the issue open until the exact-main image run succeeds, the new GHCR package is public, and a clean ARM64 v0.0.76 install is revalidated.

Changes

  • Add a guarded, multi-architecture GHCR publisher for langchain-deepagents-code-sandbox-base with latest, release-tag, and short-SHA metadata.
  • Trigger base-image publication when the workflow, DCode base Dockerfile, manifest, or dependency lock changes, so merging this fix immediately publishes latest.
  • Reject published, cached, or overridden DCode bases unless /opt/venv contains the manifest-required deepagents-code version; the metadata-only probe is networkless, capability-dropped, no-new-privileges, and read-only.
  • Include the DCode manifest and dependency lock in base-resolution identity plus dirty/main-divergence checks, preventing version and transitive lock changes from reusing stale images.
  • Pin every Docker action in the package-writing workflow to an immutable commit.
  • Add focused resolver, workflow, source-invariant, and build-guard regression coverage for [DGX Spark][DGX Station][Onboard] Published Deep Agents base image fails NemoClaw v0.0.76 version check #6456.

Design Notes

  • The invalid state is a published or cached DCode image whose installed deepagents-code version differs from manifest.yaml expected_version. The manifest is the runtime acceptance contract and requirements.lock is the immutable image-build input; they serve different consumers and cannot safely be collapsed in this release fix. Their named invariant test runs in every PR's integration CI, so drift is merge-blocking. Remove the duplicated-field guard only when build tooling generates both consumers from one authoritative source.
  • Global Dockerfile.base and blueprint inputs intentionally remain in every agent resolution key under the resolver's pre-existing conservative policy. [DGX Spark][DGX Station][Onboard] Published Deep Agents base image fails NemoClaw v0.0.76 version check #6456 adds the DCode manifest/lock inputs without redefining cross-agent invalidation; removal requires a dedicated per-agent cache-policy design with migration and regression coverage.
  • DCode validation and DCode-specific resolution options are isolated in deep-agents-code-base-image.ts; the shared base-image module only selects those options. Hermes remains separate because it validates a different capability contract.
  • On exact head 29c17cd5, base-image.ts is 378 lines versus 373 on main, and the generic resolver test is 452 lines versus 452 on main; the prior monolith findings are resolved by the focused DCode module and agent-resolution test file.
  • dockerCapture exposes stdout, not an exit-status result. Empty output therefore means the container or metadata probe may have failed and is rejected with a warning; a non-empty wrong version follows the distinct stale-version path. Expanding the Docker adapter result type is outside this publication fix.
  • /opt/venv/bin/python3 is the DCode base Dockerfile's declared virtual-environment interpreter. Using the absolute path avoids PATH ambiguity; a future layout change intentionally fails closed, and the exact-head DCode onboarding E2E exercises the real image contract.
  • The deepagents-code distribution identifier comes from the top-level hash-locked requirement and is checked against the manifest version by required integration CI; any future package rename fails closed.
  • Coverage deliberately splits the two public contracts: focused DCode tests exercise manifest-to-validator binding, while the agent-resolution suite proves a pulled image is rejected when its supplied validator fails. Exact-head DCode onboarding and sandbox-rebuild E2E supply the composed runtime check.
  • The composed override/cache contract is covered at stable public seams: the DCode helper test binds the manifest version to the locked-down probe, the agent provisioning test passes that validator to resolution, the resolver test rejects an overridden candidate when validation fails, and the resolution-metadata test revalidates a cached hint before reuse. Exact-head DCode onboarding E2E validates the assembled runtime path; duplicating those private seams in one synthetic test would add coupling without a new behavior assertion.
  • Manifest/lock synchronization is CI-enforced: test/dcode-base-image-workflow.test.ts is in the integration project, .github/actions/ci-cli-coverage-shard/action.yaml runs both --project cli and --project integration for code PRs, and the required aggregate cli-tests check passed on this exact head.
  • Missing in-repo agent inputs are retained by normalization and hashed as <missing> by the resolution key. Only empty, repository-root, or out-of-repository paths are rejected, which is the intentional path-traversal boundary rather than silent missing-file handling.
  • The metadata probe has no network, capabilities, privilege escalation, writable root filesystem, or host mounts. Keeping the image's default user avoids requiring arbitrary override images to define a sandbox account; the command is read-only and fail-closed.
  • Image references are non-secret resolver inputs and are intentionally included in validation diagnostics so operators can identify a bad explicit override or cached tag; secret-bearing process output still passes through the existing runner redaction boundary.
  • Separate publisher jobs intentionally preserve package-specific failures, reruns, and tag observability. Converting all existing publishers to a matrix changes the release contract across three packages and is a separate workflow refactor, not prerequisite work for [DGX Spark][DGX Station][Onboard] Published Deep Agents base image fails NemoClaw v0.0.76 version check #6456.
  • packages: write is the minimum permission needed to publish the requested GHCR image and is pre-existing for this dedicated workflow; the only other workflow permission is contents: read, publisher jobs are repository-guarded, and all Docker actions are immutable-pinned.
  • PR chore(deps): bump actions/checkout from 6.0.3 to 7.0.0 #5755 is already conflicting with current main; its checkout dependency bump must rebase independently. PR fix(dcode): publish and validate sandbox base image #6469 remains mergeable and does not need to absorb that unrelated dependency update.

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: restores the documented hash-locked DCode runtime and stale-base fallback contracts without changing commands, flags, configuration, defaults, or policy.
  • 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: pending human review of base-image selection and release publication on this exact head.
  • Non-success, skipped, or missing CI check accepted by maintainer — check name, approval link, and follow-up issue:

Verification

  • PR description includes the DCO sign-off declaration and every commit appears as Verified in GitHub
  • Normal pre-commit, commit-msg, and pre-push hooks passed, or npm run check:diff passed when hooks were skipped or unavailable
  • Targeted behavior tests pass for the current change set, or tests are marked not applicable above — exact head 29c17cd5: changed resolver/base-image/workflow suites passed 56/56; the parent DCode image contract suites passed 83/83; JS-config and CLI typechecks, npm run checks, YAML/Biome validation, normal hooks, secret scan, import/shape checks, and test-size budgets passed. Exact-head E2E run 28948929160 passed DCode cloud onboarding and sandbox rebuild.
  • Applicable broad gate passed — npm test for broad runtime/test-harness changes; npm run check for repo-wide validation/coverage changes — command/result:
  • 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: Aaron Erickson aerickson@nvidia.com

Summary by CodeRabbit

  • New Features

    • Expanded automated image publishing to cover an additional agent base image and related dependency updates.
    • Base image rebuilds now respond to more relevant file changes, helping keep published images current.
  • Bug Fixes

    • Improved base image validation so outdated images are rejected more reliably.
    • Resolution logic now tracks dependency lockfile changes, reducing stale image reuse.

Signed-off-by: Aaron Erickson <aerickson@nvidia.com>
@ericksoa ericksoa self-assigned this Jul 8, 2026
@github-code-quality

github-code-quality Bot commented Jul 8, 2026

Copy link
Copy Markdown
Contributor

Code Coverage Overview

Languages: TypeScript

TypeScript / code-coverage/plugin

The overall coverage in the fix/dcode-base-image... 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/dcode-base-image... 29c17cd +/-
nemoclaw/src/se...cret-scanner.ts 100%
nemoclaw/src/commands/slash.ts 100%
nemoclaw/src/li...bprocess-env.ts 100%
nemoclaw/src/bl...eprint/state.ts 98%
nemoclaw/src/onboard/config.ts 98%
nemoclaw/src/bl...int/snapshot.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/dcode-base-image... branch is 76%. Coverage data for the main branch is not yet available.

Show a code coverage summary of the most covered files.
File main fix/dcode-base-image... 29c17cd +/-
src/lib/onboard/preflight.ts 82%
src/lib/state/o...oard-session.ts 82%
src/lib/actions...all/run-plan.ts 81%
src/lib/actions...licy-channel.ts 79%
src/lib/actions...box/snapshot.ts 79%
src/lib/state/sandbox.ts 75%
src/lib/onboard...er-gpu-patch.ts 69%
src/lib/policy/index.ts 65%
src/lib/shields/index.ts 61%
src/lib/onboard.ts 28%

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

@github-actions

github-actions Bot commented Jul 8, 2026

Copy link
Copy Markdown
Contributor

E2E Advisor Recommendation

Required E2E: ubuntu-repo-cloud-langchain-deepagents-code
Optional E2E: cloud-onboard, sandbox-rebuild

Dispatch hint: targets=ubuntu-repo-cloud-langchain-deepagents-code

Workflow run

Full advisor summary

E2E Recommendation Advisor

Base: origin/main
Head: HEAD
Confidence: high

Required E2E

  • ubuntu-repo-cloud-langchain-deepagents-code (high): Required because the PR changes Deep Agents Code base-image validation and generic sandbox-base-image resolution. This typed live target onboards the langchain-deepagents-code agent from the repo on Ubuntu with Docker, exercising real base-image resolution/build fallback, hosted NVIDIA credentials, inference-local routing, terminal-agent behavior, and Deep Agents Code policy suites.

Optional E2E

  • cloud-onboard (high): Useful adjacent confidence for the unchanged OpenClaw hosted onboarding path because the shared sandbox-base-image resolver changed. It is not merge-blocking if the Deep Agents Code typed target passes, since the resolver behavior for callers without inputPaths is intended to remain compatible.
  • sandbox-rebuild (high): Useful adjacent coverage for base-image metadata and rebuild lifecycle behavior after changes to resolution keys and validation flow, especially if maintainers want confidence that generic rebuild still preserves state and refreshes registry metadata.

New E2E recommendations

  • Deep Agents Code base-image publication (medium): There is unit/workflow-contract coverage for the new base-image publisher, but no existing E2E job appears to build the LangChain Deep Agents Code base image through .github/workflows/base-image.yaml and then consume that exact published/pinned artifact in onboarding.
    • Suggested test: Add a workflow-dispatched Deep Agents Code base-image smoke that builds the base image for linux/amd64 without pushing, runs the deepagents-code version probe against it, then onboards langchain-deepagents-code using NEMOCLAW_LANGCHAIN_DEEPAGENTS_CODE_SANDBOX_BASE_IMAGE_REF pointed at the locally built image.

Dispatch hint

  • Workflow: .github/workflows/e2e.yaml
  • jobs input: targets=ubuntu-repo-cloud-langchain-deepagents-code

@github-actions

github-actions Bot commented Jul 8, 2026

Copy link
Copy Markdown
Contributor

E2E Target Recommendation

Required E2E targets: ubuntu-repo-cloud-langchain-deepagents-code, 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-langchain-deepagents-code
  • 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: high

Required E2E targets

  • ubuntu-repo-cloud-langchain-deepagents-code: Exercises the changed LangChain Deep Agents Code base-image resolution, manifest/lockfile input tracking, runtime validation, and DCode live onboarding path.
    • Dispatch: gh workflow run e2e.yaml --ref <pr-head-ref> --field targets=ubuntu-repo-cloud-langchain-deepagents-code
  • ubuntu-repo-cloud-openclaw: Exercises the shared sandbox base-image resolver changes on the primary supported OpenClaw live path.
    • Dispatch: gh workflow run e2e.yaml --ref <pr-head-ref> --field targets=ubuntu-repo-cloud-openclaw

Optional E2E targets

  • None.

Relevant changed files

  • .github/workflows/base-image.yaml
  • src/lib/agent/base-image.ts
  • src/lib/agent/deep-agents-code-base-image.ts
  • src/lib/sandbox-base-image.ts
  • src/lib/sandbox-base-image/resolution-key.ts
  • src/lib/sandbox-base-image/types.ts

@github-actions

github-actions Bot commented Jul 8, 2026

Copy link
Copy Markdown
Contributor

PR Review Advisor (Nemotron Ultra) — Changes requested

Merge posture: Do not merge yet
Primary next action: Resolve or justify PRA-1: imageRef passed to docker run without explicit format validation.
Open items: 0 required · 2 warnings · 3 suggestions · 4 test follow-ups
Since last review: 0 prior items resolved · 0 still apply · 0 new items found

Action checklist

  • PRA-1 Resolve or justify: imageRef passed to docker run without explicit format validation in src/lib/agent/deep-agents-code-base-image.ts:32
  • PRA-2 Resolve or justify: Version probe workaround lacks tracking issue reference for removal in src/lib/agent/deep-agents-code-base-image.ts:12
  • 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: Missing negative test for malformed imageRef and validationDescription in warning
  • PRA-T4 Add or justify test follow-up: Add test for validationDescription propagation in warning message
  • PRA-3 In-scope improvement: Hardcoded /opt/venv/bin/python3 path couples validator to Dockerfile.base layout in src/lib/agent/deep-agents-code-base-image.ts:41
  • PRA-4 In-scope improvement: Missing negative test for malformed imageRef and validationDescription in warning in src/lib/agent/deep-agents-code-base-image.test.ts:1
  • PRA-5 In-scope improvement: Add test for validationDescription propagation in warning message in src/lib/agent/deep-agents-code-base-image.test.ts:1

Findings index

ID Severity Category Location Required action
PRA-1 Resolve/justify security src/lib/agent/deep-agents-code-base-image.ts:32 Add a lightweight image reference format check (e.g., regex for valid Docker image ref syntax: `^[a-z0-9]+([._-][a-z0-9]+)*(/[a-z0-9]+([._-][a-z0-9]+)*)*(:[a-zA-Z0-9._-]+)?(@sha256:[a-f0-9]{64})?$`) at the start of `deepAgentsCodeBaseImageMatchesVersion`, returning false with a warning on mismatch.
PRA-2 Resolve/justify correctness src/lib/agent/deep-agents-code-base-image.ts:12 Add a TODO comment with a GitHub issue number (e.g., `// TODO(#XXXX): Remove when per-agent cache-policy isolation lands`) or create a follow-up issue and reference it here.
PRA-3 Improvement correctness src/lib/agent/deep-agents-code-base-image.ts:41 Add a comment documenting the Dockerfile.base contract (VIRTUAL_ENV=/opt/venv) at the probe site, or make the python path discoverable via `which python3` in the container (still fail-closed if not found).
PRA-4 Improvement tests src/lib/agent/deep-agents-code-base-image.test.ts:1 Add two test cases: (1) 'rejects or safely handles malformed imageRef without command injection' passing invalid refs, (2) 'includes validationDescription in warning log on empty probe' verifying the warning message contains the expected version string.
PRA-5 Improvement tests src/lib/agent/deep-agents-code-base-image.test.ts:1 Add assertion in 'warns and fails closed when the probe returns no version' test that the warning includes the expected version string from validationDescription.
Review findings by urgency: 0 required fixes, 2 items to resolve/justify, 3 in-scope improvements

⚠️ 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 — imageRef passed to docker run without explicit format validation

  • Location: src/lib/agent/deep-agents-code-base-image.ts:32
  • Category: security
  • Problem: The `imageRef` parameter in `deepAgentsCodeBaseImageMatchesVersion` is passed directly to `docker run` via `dockerCapture` array args. While the resolver produces valid refs and Docker validates the format, explicit validation would strengthen defense-in-depth against potential resolver bugs or future callers.
  • Impact: Low-risk defense gap: if a future resolver bug or caller passes a malformed imageRef, Docker would reject it at runtime, but explicit validation catches it earlier and provides clearer diagnostics.
  • Recommended action: Add a lightweight image reference format check (e.g., regex for valid Docker image ref syntax: `^[a-z0-9]+([._-][a-z0-9]+)*(/[a-z0-9]+([._-][a-z0-9]+)*)*(:[a-zA-Z0-9._-]+)?(@sha256:[a-f0-9]{64})?$`) at the start of `deepAgentsCodeBaseImageMatchesVersion`, returning false with a warning on mismatch.
  • Expected follow-up: Resolve in this PR or explain why the risk is acceptable.
  • Verification: Read src/lib/agent/deep-agents-code-base-image.ts lines 32-48 and verify imageRef is used directly in dockerCapture args without validation.
  • Missing regression test: Add test case passing a malformed imageRef (e.g., containing shell metacharacters like `; rm -rf /` or invalid format `not-an-image@all`) to verify it is rejected before dockerCapture.
  • Done when: The risk is fixed or explicitly justified in the PR. Verification: Read src/lib/agent/deep-agents-code-base-image.ts lines 32-48 and verify imageRef is used directly in dockerCapture args without validation.
  • Evidence: dockerCapture called with array args (no shell injection), container runs with --network none --cap-drop ALL --security-opt no-new-privileges --read-only; resolver only produces GHCR or local tags it controls.

PRA-2 Resolve/justify — Version probe workaround lacks tracking issue reference for removal

  • Location: src/lib/agent/deep-agents-code-base-image.ts:12
  • Category: correctness
  • Problem: The JSDoc comment (lines 12-17) documents that the version probe at base-image resolution time is a workaround for cross-agent cache-policy reuse. The comment at line 69 mentions 'Per-agent cache-policy isolation is a separate cross-agent change' but no tracking issue or TODO is linked.
  • Impact: Without a linked tracking issue, the architectural debt is invisible to future maintainers and may persist indefinitely. The workaround is correct and fail-closed but should be traceable.
  • Recommended action: Add a TODO comment with a GitHub issue number (e.g., `// TODO(#XXXX): Remove when per-agent cache-policy isolation lands`) or create a follow-up issue and reference it here.
  • Expected follow-up: Resolve in this PR or explain why the risk is acceptable.
  • Verification: Read the JSDoc comment at src/lib/agent/deep-agents-code-base-image.ts lines 12-17 and the comment at line 69 about 'Per-agent cache-policy isolation is a separate cross-agent change.'
  • Missing regression test: No automated test can verify the architectural assumption; document the removal condition in code with a tracking reference.
  • Done when: The risk is fixed or explicitly justified in the PR. Verification: Read the JSDoc comment at src/lib/agent/deep-agents-code-base-image.ts lines 12-17 and the comment at line 69 about 'Per-agent cache-policy isolation is a separate cross-agent change.'.
  • Evidence: PR body design notes acknowledge this is a workaround; fail-closed behavior prevents silent regression; E2E validates composed path.

💡 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-3 Improvement — Hardcoded /opt/venv/bin/python3 path couples validator to Dockerfile.base layout

  • Location: src/lib/agent/deep-agents-code-base-image.ts:41
  • Category: correctness
  • Problem: The version probe uses `/opt/venv/bin/python3` which assumes the virtual environment path from Dockerfile.base (line 38: `ENV VIRTUAL_ENV=/opt/venv`). This creates coupling between validation code and base image layout.
  • Impact: If Dockerfile.base changes the venv path, the probe fails closed (intentional per design notes), but the failure mode is a version mismatch warning rather than a clear 'layout changed' diagnostic.
  • Suggested action: Add a comment documenting the Dockerfile.base contract (VIRTUAL_ENV=/opt/venv) at the probe site, or make the python path discoverable via `which python3` in the container (still fail-closed if not found).
  • Expected follow-up: Prefer a current-PR fix when local to changed code; defer only with rationale or linked follow-up.
  • Verification: Compare src/lib/agent/deep-agents-code-base-image.ts line 41 with agents/langchain-deepagents-code/Dockerfile.base line 38 (VIRTUAL_ENV=/opt/venv).
  • Missing regression test: Add an integration test that builds the actual Dockerfile.base and verifies the probe works against it (E2E already covers this per PR body).
  • Done when: The local improvement is applied, or the PR notes why it should be deferred.
  • Evidence: Design notes state: '/opt/venv/bin/python3 is the DCode base Dockerfile's declared virtual-environment interpreter. Using the absolute path avoids PATH ambiguity; a future layout change intentionally fails closed.'

PRA-4 Improvement — Missing negative test for malformed imageRef and validationDescription in warning

  • Location: src/lib/agent/deep-agents-code-base-image.test.ts:1
  • Category: tests
  • Problem: Tests cover happy path, version mismatch, locked-down flags, and empty output. Missing: adversarial test for malformed imageRef (though resolver should prevent) and verification that validationDescription appears in warning log.
  • Impact: Reduced confidence that defense-in-depth validation and diagnostic quality work as intended under adversarial or edge-case inputs.
  • Suggested action: Add two test cases: (1) 'rejects or safely handles malformed imageRef without command injection' passing invalid refs, (2) 'includes validationDescription in warning log on empty probe' verifying the warning message contains the expected version string.
  • Expected follow-up: Prefer a current-PR fix when local to changed code; defer only with rationale or linked follow-up.
  • Verification: Read src/lib/agent/deep-agents-code-base-image.test.ts and note the four existing test cases; consider what adversarial inputs are not covered.
  • Missing regression test: Add test: 'rejects malformed imageRef without command injection' and 'includes validationDescription in warning log on empty probe'.
  • Done when: The local improvement is applied, or the PR notes why it should be deferred.
  • Evidence: Existing tests at lines 13-82 cover match, mismatch, locked-down flags, empty output with warning.

PRA-5 Improvement — Add test for validationDescription propagation in warning message

  • Location: src/lib/agent/deep-agents-code-base-image.test.ts:1
  • Category: tests
  • Problem: The validationDescription ('deepagents-code==0.1.34') is passed to resolver but not explicitly verified in warning output when probe fails.
  • Impact: Operators may not see which version was expected when a base image is rejected, reducing debuggability.
  • Suggested action: Add assertion in 'warns and fails closed when the probe returns no version' test that the warning includes the expected version string from validationDescription.
  • Expected follow-up: Prefer a current-PR fix when local to changed code; defer only with rationale or linked follow-up.
  • Verification: Check deep-agents-code-base-image.test.ts lines 67-82; the warn spy checks for 'deepagents-code==0.1.34' but not that it comes from validationDescription parameter.
  • Missing regression test: Assert warn mock called with string containing the exact validationDescription value passed to createDeepAgentsCodeBaseImageResolutionOptions.
  • Done when: The local improvement is applied, or the PR notes why it should be deferred.
  • Evidence: Test at line 77 expects warn to contain 'deepagents-code==0.1.34' but this is hardcoded in test, not derived from validationDescription.
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 — rejects malformed imageRef without command injection. Unit tests comprehensively cover new validation logic, resolver integration, resolution key hashing, and workflow structure. E2E validation confirmed by PR body (run 28948929160 passed DCode cloud onboarding and sandbox rebuild). Two behavior-specific follow-up tests recommended for defense-in-depth.
  • PRA-T2 Runtime validation — includes validationDescription in warning log on empty probe. Unit tests comprehensively cover new validation logic, resolver integration, resolution key hashing, and workflow structure. E2E validation confirmed by PR body (run 28948929160 passed DCode cloud onboarding and sandbox rebuild). Two behavior-specific follow-up tests recommended for defense-in-depth.
  • PRA-T3 Missing negative test for malformed imageRef and validationDescription in warning — Add two test cases: (1) 'rejects or safely handles malformed imageRef without command injection' passing invalid refs, (2) 'includes validationDescription in warning log on empty probe' verifying the warning message contains the expected version string.
  • PRA-T4 Add test for validationDescription propagation in warning message — Add assertion in 'warns and fails closed when the probe returns no version' test that the warning includes the expected version string from validationDescription.
Since last review details

Current findings, using the urgency labels above:

PRA-1 Resolve/justify — imageRef passed to docker run without explicit format validation

  • Location: src/lib/agent/deep-agents-code-base-image.ts:32
  • Category: security
  • Problem: The `imageRef` parameter in `deepAgentsCodeBaseImageMatchesVersion` is passed directly to `docker run` via `dockerCapture` array args. While the resolver produces valid refs and Docker validates the format, explicit validation would strengthen defense-in-depth against potential resolver bugs or future callers.
  • Impact: Low-risk defense gap: if a future resolver bug or caller passes a malformed imageRef, Docker would reject it at runtime, but explicit validation catches it earlier and provides clearer diagnostics.
  • Recommended action: Add a lightweight image reference format check (e.g., regex for valid Docker image ref syntax: `^[a-z0-9]+([._-][a-z0-9]+)*(/[a-z0-9]+([._-][a-z0-9]+)*)*(:[a-zA-Z0-9._-]+)?(@sha256:[a-f0-9]{64})?$`) at the start of `deepAgentsCodeBaseImageMatchesVersion`, returning false with a warning on mismatch.
  • Expected follow-up: Resolve in this PR or explain why the risk is acceptable.
  • Verification: Read src/lib/agent/deep-agents-code-base-image.ts lines 32-48 and verify imageRef is used directly in dockerCapture args without validation.
  • Missing regression test: Add test case passing a malformed imageRef (e.g., containing shell metacharacters like `; rm -rf /` or invalid format `not-an-image@all`) to verify it is rejected before dockerCapture.
  • Done when: The risk is fixed or explicitly justified in the PR. Verification: Read src/lib/agent/deep-agents-code-base-image.ts lines 32-48 and verify imageRef is used directly in dockerCapture args without validation.
  • Evidence: dockerCapture called with array args (no shell injection), container runs with --network none --cap-drop ALL --security-opt no-new-privileges --read-only; resolver only produces GHCR or local tags it controls.

PRA-2 Resolve/justify — Version probe workaround lacks tracking issue reference for removal

  • Location: src/lib/agent/deep-agents-code-base-image.ts:12
  • Category: correctness
  • Problem: The JSDoc comment (lines 12-17) documents that the version probe at base-image resolution time is a workaround for cross-agent cache-policy reuse. The comment at line 69 mentions 'Per-agent cache-policy isolation is a separate cross-agent change' but no tracking issue or TODO is linked.
  • Impact: Without a linked tracking issue, the architectural debt is invisible to future maintainers and may persist indefinitely. The workaround is correct and fail-closed but should be traceable.
  • Recommended action: Add a TODO comment with a GitHub issue number (e.g., `// TODO(#XXXX): Remove when per-agent cache-policy isolation lands`) or create a follow-up issue and reference it here.
  • Expected follow-up: Resolve in this PR or explain why the risk is acceptable.
  • Verification: Read the JSDoc comment at src/lib/agent/deep-agents-code-base-image.ts lines 12-17 and the comment at line 69 about 'Per-agent cache-policy isolation is a separate cross-agent change.'
  • Missing regression test: No automated test can verify the architectural assumption; document the removal condition in code with a tracking reference.
  • Done when: The risk is fixed or explicitly justified in the PR. Verification: Read the JSDoc comment at src/lib/agent/deep-agents-code-base-image.ts lines 12-17 and the comment at line 69 about 'Per-agent cache-policy isolation is a separate cross-agent change.'.
  • Evidence: PR body design notes acknowledge this is a workaround; fail-closed behavior prevents silent regression; E2E validates composed path.

PRA-3 Improvement — Hardcoded /opt/venv/bin/python3 path couples validator to Dockerfile.base layout

  • Location: src/lib/agent/deep-agents-code-base-image.ts:41
  • Category: correctness
  • Problem: The version probe uses `/opt/venv/bin/python3` which assumes the virtual environment path from Dockerfile.base (line 38: `ENV VIRTUAL_ENV=/opt/venv`). This creates coupling between validation code and base image layout.
  • Impact: If Dockerfile.base changes the venv path, the probe fails closed (intentional per design notes), but the failure mode is a version mismatch warning rather than a clear 'layout changed' diagnostic.
  • Suggested action: Add a comment documenting the Dockerfile.base contract (VIRTUAL_ENV=/opt/venv) at the probe site, or make the python path discoverable via `which python3` in the container (still fail-closed if not found).
  • Expected follow-up: Prefer a current-PR fix when local to changed code; defer only with rationale or linked follow-up.
  • Verification: Compare src/lib/agent/deep-agents-code-base-image.ts line 41 with agents/langchain-deepagents-code/Dockerfile.base line 38 (VIRTUAL_ENV=/opt/venv).
  • Missing regression test: Add an integration test that builds the actual Dockerfile.base and verifies the probe works against it (E2E already covers this per PR body).
  • Done when: The local improvement is applied, or the PR notes why it should be deferred.
  • Evidence: Design notes state: '/opt/venv/bin/python3 is the DCode base Dockerfile's declared virtual-environment interpreter. Using the absolute path avoids PATH ambiguity; a future layout change intentionally fails closed.'

PRA-4 Improvement — Missing negative test for malformed imageRef and validationDescription in warning

  • Location: src/lib/agent/deep-agents-code-base-image.test.ts:1
  • Category: tests
  • Problem: Tests cover happy path, version mismatch, locked-down flags, and empty output. Missing: adversarial test for malformed imageRef (though resolver should prevent) and verification that validationDescription appears in warning log.
  • Impact: Reduced confidence that defense-in-depth validation and diagnostic quality work as intended under adversarial or edge-case inputs.
  • Suggested action: Add two test cases: (1) 'rejects or safely handles malformed imageRef without command injection' passing invalid refs, (2) 'includes validationDescription in warning log on empty probe' verifying the warning message contains the expected version string.
  • Expected follow-up: Prefer a current-PR fix when local to changed code; defer only with rationale or linked follow-up.
  • Verification: Read src/lib/agent/deep-agents-code-base-image.test.ts and note the four existing test cases; consider what adversarial inputs are not covered.
  • Missing regression test: Add test: 'rejects malformed imageRef without command injection' and 'includes validationDescription in warning log on empty probe'.
  • Done when: The local improvement is applied, or the PR notes why it should be deferred.
  • Evidence: Existing tests at lines 13-82 cover match, mismatch, locked-down flags, empty output with warning.

PRA-5 Improvement — Add test for validationDescription propagation in warning message

  • Location: src/lib/agent/deep-agents-code-base-image.test.ts:1
  • Category: tests
  • Problem: The validationDescription ('deepagents-code==0.1.34') is passed to resolver but not explicitly verified in warning output when probe fails.
  • Impact: Operators may not see which version was expected when a base image is rejected, reducing debuggability.
  • Suggested action: Add assertion in 'warns and fails closed when the probe returns no version' test that the warning includes the expected version string from validationDescription.
  • Expected follow-up: Prefer a current-PR fix when local to changed code; defer only with rationale or linked follow-up.
  • Verification: Check deep-agents-code-base-image.test.ts lines 67-82; the warn spy checks for 'deepagents-code==0.1.34' but not that it comes from validationDescription parameter.
  • Missing regression test: Assert warn mock called with string containing the exact validationDescription value passed to createDeepAgentsCodeBaseImageResolutionOptions.
  • Done when: The local improvement is applied, or the PR notes why it should be deferred.
  • Evidence: Test at line 77 expects warn to contain 'deepagents-code==0.1.34' but this is hardcoded in test, not derived from validationDescription.

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.

@coderabbitai

coderabbitai Bot commented Jul 8, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

📝 Walkthrough

Walkthrough

This PR adds CI support to build and push a base image for the langchain-deepagents-code agent, pins Docker action versions in existing workflow jobs, extends sandbox base-image resolution to hash and track extra input paths, and adds runtime version validation against the agent manifest.

Changes

Deep Agents Code base image support

Layer / File(s) Summary
CI workflow trigger and build job
.github/workflows/base-image.yaml, test/dcode-base-image-workflow.test.ts, test/openclaw-dependency-review.test.ts
Expands push-path triggers to cover deepagents Dockerfile/manifest/lockfile and the workflow file, pins docker/* actions to commit SHAs in existing jobs, adds the guarded build-and-push-langchain-deepagents-code job, and adds/updates tests validating job wiring and guard coverage.
Resolution key and input path tracking
src/lib/sandbox-base-image/types.ts, src/lib/sandbox-base-image/resolution-key.ts, src/lib/sandbox-base-image.ts, src/lib/sandbox-base-image/resolution-key.test.ts, src/lib/sandbox-base-image-agent-resolution.test.ts
Adds optional inputPaths to ResolveBaseImageOptions, includes those paths in dirty-input detection and resolution-key hashing, and adds tests for lockfile-driven key changes plus dirty/divergence and runtime-validation-rejection scenarios.
Deep Agents Code version validation
src/lib/agent/deep-agents-code-base-image.ts, src/lib/agent/deep-agents-code-base-image.test.ts, src/lib/agent/base-image.ts, src/lib/agent/base-image.test.ts
Adds a version-probing validator that runs a locked-down container command to compare installed package version against the manifest's expected version, wires this into agent base-image resolution options (requiring expectedVersion), and adds tests for match/mismatch, missing-version failure, and empty-output warnings.

Estimated code review effort: 3 (Moderate) | ~25 minutes

Sequence Diagram(s)

sequenceDiagram
  participant GitHub Actions
  participant base-image.yaml
  participant check-production-build-args.sh
  participant docker/build-push-action
  participant GHCR

  GitHub Actions->>base-image.yaml: push affecting workflow or Deep Agents inputs
  base-image.yaml->>check-production-build-args.sh: validate production build args
  base-image.yaml->>docker/build-push-action: build langchain-deepagents-code-sandbox-base
  docker/build-push-action->>GHCR: push multi-arch image
Loading
sequenceDiagram
  participant ensureAgentBaseImage
  participant resolveSandboxBaseImage
  participant Docker

  ensureAgentBaseImage->>resolveSandboxBaseImage: create options with expectedVersion and inputPaths
  resolveSandboxBaseImage->>Docker: run python3 importlib.metadata.version("deepagents-code")
  Docker-->>resolveSandboxBaseImage: installed package version
  resolveSandboxBaseImage-->>ensureAgentBaseImage: validateImage result / missing expectedVersion error
Loading

Suggested labels: area: ci, feature

Suggested reviewers: cv, kjw3

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
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 summarizes the main DCode sandbox base-image publishing and validation changes.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch fix/dcode-base-image-publishing-6456

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

@github-actions

github-actions Bot commented Jul 8, 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 · 5 test follow-ups
Top item: No actionable code findings

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: Runtime validation
  • PRA-T4 Add or justify test follow-up: Acceptance clause
  • PRA-T5 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 — Exercise DCode onboarding/build resolution with NEMOCLAW_LANGCHAIN_DEEPAGENTS_CODE_SANDBOX_BASE_IMAGE_REF set to a candidate image whose metadata probe returns a mismatched deepagents-code version, and assert final-image construction is not attempted.. The changed unit and workflow tests cover the resolver, validation, negative paths, and workflow contracts well. Because this PR touches sandbox base-image publication and runtime image selection, a real runtime validation path is still the highest-confidence confirmation, but no untested blocker was identified in the static review.
  • PRA-T2 Runtime validation — Exercise DCode base resolution after changing agents/langchain-deepagents-code/manifest.yaml without changing requirements.lock, and assert cached resolution metadata is invalidated before selecting a published base.. The changed unit and workflow tests cover the resolver, validation, negative paths, and workflow contracts well. Because this PR touches sandbox base-image publication and runtime image selection, a real runtime validation path is still the highest-confidence confirmation, but no untested blocker was identified in the static review.
  • PRA-T3 Runtime validation — Exercise DCode base resolution after changing agents/langchain-deepagents-code/requirements.lock without changing manifest.yaml, and assert dirty/main-divergence handling forces a validated current-input image instead of reusing latest.. The changed unit and workflow tests cover the resolver, validation, negative paths, and workflow contracts well. Because this PR touches sandbox base-image publication and runtime image selection, a real runtime validation path is still the highest-confidence confirmation, but no untested blocker was identified in the static review.
  • PRA-T4 Acceptance clause — Refs [DGX Spark][DGX Station][Onboard] Published Deep Agents base image fails NemoClaw v0.0.76 version check #6456. — add test evidence or identify existing coverage. The deterministic validation context reported linkedIssues: [], so the body/comments for [DGX Spark][DGX Station][Onboard] Published Deep Agents base image fails NemoClaw v0.0.76 version check #6456 were not available to extract or verify literally. The PR diff does reference [DGX Spark][DGX Station][Onboard] Published Deep Agents base image fails NemoClaw v0.0.76 version check #6456 in tests/comments and implements DCode base-image publication/validation behavior.
  • PRA-T5 Acceptance clause — Keep the issue open until the exact-main image run succeeds, the new GHCR package is public, and a clean ARM64 v0.0.76 install is revalidated. — add test evidence or identify existing coverage. This clause concerns issue/package/E2E state rather than the code diff. Per review instructions, external E2E/package status is not evaluated here; no code finding is raised from this release-state clause.

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.

@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 (3)
src/lib/sandbox-base-image-resolution.test.ts (1)

237-267: 🎯 Functional Correctness | 🔵 Trivial | ⚡ Quick win

Test outcome doesn't actually depend on the lockfile wiring.

toBeNull() here is guaranteed solely by the forced docker mock failures (status: 1), independent of whether inputPaths is threaded through correctly. If the lockfile were silently dropped from inputPaths in resolveSandboxBaseImage, this test would still pass — the only evidence that dependency-lock tracking works comes from the toHaveBeenCalledWith mock-call assertions, which lock in an implementation detail rather than an observable behavior difference.

Consider making sourceMocks.inputsDirty/inputsChanged return different values conditioned on whether the lockfile path is present, so the returned resolution result (null vs. an actual image) diverges based on correct wiring — that would give real behavioral confidence instead of relying purely on call-argument assertions.

Example approach
-    dockerMocks.imageInspect.mockReturnValue({ status: 1 });
-    dockerMocks.pull.mockReturnValue({ status: 1 });
+    dockerMocks.imageInspect.mockReturnValue({ status: 0 });
+    sourceMocks.inputsDirty.mockImplementation((_cwd, _env, paths) =>
+      paths.includes(lockfile),
+    );
     const options = resolutionOptions();

Then assert the resolved result differs when the lockfile is included vs. omitted.

🤖 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/sandbox-base-image-resolution.test.ts` around lines 237 - 267, The
test currently only proves the docker mock fails, not that
resolveSandboxBaseImage threads lockfile paths through inputPaths correctly.
Update the sandbox-base-image-resolution test setup so sourceMocks.inputsDirty
and inputsChanged return different values depending on whether the lockfile path
is present, using the resolveSandboxBaseImage flow to make the result itself
diverge (null versus a resolved image) when lockfile wiring is correct or
broken. Keep the existing identifiers like resolveSandboxBaseImage,
sourceMocks.inputsDirty, and sourceMocks.inputsChanged, but shift the assertion
from only mock-call arguments to an observable outcome difference.

Source: Path instructions

src/lib/agent/base-image.ts (1)

145-159: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Consider extracting shared docker-probe logic.

deepAgentsCodeBaseImageMatchesVersion duplicates the dockerCapture(..., { ignoreError: true, timeout: 20_000 }) pattern already used in hermesBaseImageSupportsMcp. A small shared helper (e.g., runPythonProbeInImage(imageRef, entrypoint, script)) would reduce duplication as more agent-specific validators are added.

Also applies to: 161-182

🤖 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/agent/base-image.ts` around lines 145 - 159, Extract the repeated
docker probe invocation shared by hermesBaseImageSupportsMcp and
deepAgentsCodeBaseImageMatchesVersion into a helper such as
runPythonProbeInImage that wraps dockerCapture with ignoreError and timeout,
then have both validators call it with their imageRef, entrypoint, and probe
script. Keep the existing behavior unchanged while centralizing the shared probe
setup so future validators can reuse the same path.
src/lib/agent/base-image.test.ts (1)

98-112: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Mock-call assertion locks in the internal docker command shape.

Asserting the exact args array passed to dockerCapture ties this test to the internal implementation of deepAgentsCodeBaseImageMatchesVersion; any refactor (e.g., extracting a shared docker-probe helper) that keeps validateImage behavior correct would still break this test. Consider dropping this assertion and relying on the validateImage return-value checks already present at lines 99 and 115 for behavioral confidence.

As per path instructions, "Prefer observable outcomes through the public boundary over source-text, private-shape, or mock-call assertions."

🤖 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/agent/base-image.test.ts` around lines 98 - 112, The test for
deepAgentsCodeBaseImageMatchesVersion is over-specifying the internal docker
command by asserting the exact dockerCapture call shape, which makes it brittle
to refactors. Update base-image.test.ts to focus on the observable behavior of
validateImage and remove the mock-call assertion against dockerCapture, keeping
the return-value checks around validateImage as the public boundary validation.

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.

Nitpick comments:
In `@src/lib/agent/base-image.test.ts`:
- Around line 98-112: The test for deepAgentsCodeBaseImageMatchesVersion is
over-specifying the internal docker command by asserting the exact dockerCapture
call shape, which makes it brittle to refactors. Update base-image.test.ts to
focus on the observable behavior of validateImage and remove the mock-call
assertion against dockerCapture, keeping the return-value checks around
validateImage as the public boundary validation.

In `@src/lib/agent/base-image.ts`:
- Around line 145-159: Extract the repeated docker probe invocation shared by
hermesBaseImageSupportsMcp and deepAgentsCodeBaseImageMatchesVersion into a
helper such as runPythonProbeInImage that wraps dockerCapture with ignoreError
and timeout, then have both validators call it with their imageRef, entrypoint,
and probe script. Keep the existing behavior unchanged while centralizing the
shared probe setup so future validators can reuse the same path.

In `@src/lib/sandbox-base-image-resolution.test.ts`:
- Around line 237-267: The test currently only proves the docker mock fails, not
that resolveSandboxBaseImage threads lockfile paths through inputPaths
correctly. Update the sandbox-base-image-resolution test setup so
sourceMocks.inputsDirty and inputsChanged return different values depending on
whether the lockfile path is present, using the resolveSandboxBaseImage flow to
make the result itself diverge (null versus a resolved image) when lockfile
wiring is correct or broken. Keep the existing identifiers like
resolveSandboxBaseImage, sourceMocks.inputsDirty, and sourceMocks.inputsChanged,
but shift the assertion from only mock-call arguments to an observable outcome
difference.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: 69f68664-f3c7-41fe-b010-452daaa4e6e7

📥 Commits

Reviewing files that changed from the base of the PR and between abc1a1d and ce89b3f.

📒 Files selected for processing (10)
  • .github/workflows/base-image.yaml
  • src/lib/agent/base-image.test.ts
  • src/lib/agent/base-image.ts
  • src/lib/sandbox-base-image-resolution.test.ts
  • src/lib/sandbox-base-image.ts
  • src/lib/sandbox-base-image/resolution-key.test.ts
  • src/lib/sandbox-base-image/resolution-key.ts
  • src/lib/sandbox-base-image/types.ts
  • test/dcode-base-image-workflow.test.ts
  • test/openclaw-dependency-review.test.ts

Signed-off-by: Aaron Erickson <aerickson@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.

🧹 Nitpick comments (1)
.github/workflows/base-image.yaml (1)

219-220: 🚀 Performance & Scalability | 🔵 Trivial | ⚡ Quick win

GHA cache will collide across the three build jobs.

type=gha without a scope defaults to buildkit for every job, so build-and-push, build-and-push-hermes, and this new build-and-push-langchain-deepagents-code job will thrash each other's cache — only the last job to finish in a run gets a hit, per docker/build-push-action#867 ("only the job that finished last in the previous run gets a cache hit").

♻️ Proposed fix: scope the cache per image
           cache-from: type=gha
-          cache-to: type=gha,mode=max
+          cache-from: type=gha,scope=langchain-deepagents-code
+          cache-to: type=gha,mode=max,scope=langchain-deepagents-code

Apply analogous scope= values to the build-and-push and build-and-push-hermes jobs as well.

🤖 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 @.github/workflows/base-image.yaml around lines 219 - 220, The GitHub Actions
cache configuration is shared across multiple build jobs, so the new job will
overwrite cache entries used by build-and-push and build-and-push-hermes. Update
the cache-from and cache-to settings in each build job to use a unique scope per
image/job, using the existing build-and-push, build-and-push-hermes, and
build-and-push-langchain-deepagents-code job definitions as the places to apply
the change.
🤖 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 @.github/workflows/base-image.yaml:
- Around line 219-220: The GitHub Actions cache configuration is shared across
multiple build jobs, so the new job will overwrite cache entries used by
build-and-push and build-and-push-hermes. Update the cache-from and cache-to
settings in each build job to use a unique scope per image/job, using the
existing build-and-push, build-and-push-hermes, and
build-and-push-langchain-deepagents-code job definitions as the places to apply
the change.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: 87012d0c-e880-4b72-9b53-ea7ed7b843f2

📥 Commits

Reviewing files that changed from the base of the PR and between ce89b3f and ccd04d9.

📒 Files selected for processing (5)
  • .github/workflows/base-image.yaml
  • src/lib/agent/base-image.test.ts
  • src/lib/agent/base-image.ts
  • src/lib/sandbox-base-image-resolution.test.ts
  • test/dcode-base-image-workflow.test.ts
🚧 Files skipped from review as they are similar to previous changes (3)
  • src/lib/agent/base-image.test.ts
  • test/dcode-base-image-workflow.test.ts
  • src/lib/agent/base-image.ts

@github-actions

github-actions Bot commented Jul 8, 2026

Copy link
Copy Markdown
Contributor

E2E Target Results — ✅ All selected jobs passed

Run: 28947533169
Workflow ref: fix/dcode-base-image-publishing-6456
Requested targets: ubuntu-repo-cloud-langchain-deepagents-code,sandbox-rebuild
Requested jobs: (default — all default-enabled free-standing jobs; explicit-only jobs openshell-gateway-auth-contract, mcp-bridge-dev, hermes-gpu-startup, sandbox-rlimits-connect, and jetson-nvmap-gpu are skipped unless selected)
Summary: 2 passed, 0 failed, 0 cancelled, 0 skipped

Job Result
live ✅ success
sandbox-rebuild ✅ success

Signed-off-by: Aaron Erickson <aerickson@nvidia.com>
@github-actions

github-actions Bot commented Jul 8, 2026

Copy link
Copy Markdown
Contributor

E2E Target Results — ✅ All selected jobs passed

Run: 28948929160
Workflow ref: fix/dcode-base-image-publishing-6456
Requested targets: ubuntu-repo-cloud-langchain-deepagents-code,sandbox-rebuild
Requested jobs: (default — all default-enabled free-standing jobs; explicit-only jobs openshell-gateway-auth-contract, mcp-bridge-dev, hermes-gpu-startup, sandbox-rlimits-connect, and jetson-nvmap-gpu are skipped unless selected)
Summary: 2 passed, 0 failed, 0 cancelled, 0 skipped

Job Result
live ✅ success
sandbox-rebuild ✅ success

@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 (1)
src/lib/sandbox-base-image-agent-resolution.test.ts (1)

66-95: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Test only checks mock call arguments, not an observable behavior change.

Both sourceMocks.inputsDirty and sourceMocks.inputsChanged return false throughout this test, so the assertions at Lines 87-94 only confirm that dockerfilePath/lockfile are forwarded as arguments — they never prove that a dirty/diverged lockfile actually changes resolution behavior (e.g., forces a rebuild or a different cache key). The null result here is caused solely by the pull failing (Line 68), unrelated to the dirty/divergence claim in the test title.

Consider adding a case where inputsDirty/inputsChanged return true and asserting a resulting behavioral difference (e.g., resolution key changes, or a cached candidate is bypassed), to give real confidence in the "#6456" tracking behavior rather than only pinning call arguments.

As per path instructions, "Prefer observable outcomes through the public boundary over source-text, private-shape, or mock-call assertions" for test files.

🤖 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/sandbox-base-image-agent-resolution.test.ts` around lines 66 - 95,
The test in resolveSandboxBaseImage only verifies that inputsDirty and
inputsChanged receive the lockfile arguments, but it does not prove any
observable change in resolveSandboxBaseImage behavior. Update this test to
exercise a case where sourceMocks.inputsDirty and sourceMocks.inputsChanged
return true, then assert a public-facing outcome such as a different resolution
result, cache-key behavior, or bypassed candidate in resolveSandboxBaseImage;
keep the existing lockfile setup and use the resolveSandboxBaseImage,
inputsDirty, and inputsChanged symbols to anchor the case.

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.

Nitpick comments:
In `@src/lib/sandbox-base-image-agent-resolution.test.ts`:
- Around line 66-95: The test in resolveSandboxBaseImage only verifies that
inputsDirty and inputsChanged receive the lockfile arguments, but it does not
prove any observable change in resolveSandboxBaseImage behavior. Update this
test to exercise a case where sourceMocks.inputsDirty and
sourceMocks.inputsChanged return true, then assert a public-facing outcome such
as a different resolution result, cache-key behavior, or bypassed candidate in
resolveSandboxBaseImage; keep the existing lockfile setup and use the
resolveSandboxBaseImage, inputsDirty, and inputsChanged symbols to anchor the
case.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: 5832e9e7-0975-4f96-b578-a99e68b37adf

📥 Commits

Reviewing files that changed from the base of the PR and between ccd04d9 and 29c17cd.

📒 Files selected for processing (5)
  • src/lib/agent/base-image.test.ts
  • src/lib/agent/base-image.ts
  • src/lib/agent/deep-agents-code-base-image.test.ts
  • src/lib/agent/deep-agents-code-base-image.ts
  • src/lib/sandbox-base-image-agent-resolution.test.ts

@ericksoa
ericksoa merged commit e0fb24a into main Jul 8, 2026
147 checks passed
@ericksoa
ericksoa deleted the fix/dcode-base-image-publishing-6456 branch July 8, 2026 14:48
@miyoungc miyoungc mentioned this pull request Jul 8, 2026
21 tasks
miyoungc added a commit that referenced this pull request Jul 8, 2026
<!-- markdownlint-disable MD041 -->
## Summary
Adds the v0.0.77 release-note section from the shipped release
announcement and release commit range.
This is post-release docs recovery, so the PR is labeled for the next
patch release train.

## Changes
- Added `v0.0.77` to `docs/about/release-notes.mdx` with links to the
deeper Deep Agents, architecture, inference, security, and agent-docs
pages.
- Source summary:
- #6469 -> `docs/about/release-notes.mdx`: Documents Deep Agents Code
base-image publication and stale-version validation.
- #6471 -> `docs/about/release-notes.mdx`: Documents the managed runtime
disabling LangGraph CLI analytics.
- #6462 -> `docs/about/release-notes.mdx`: Documents the TUI, launch
banner, and model-identity provider display behavior.
- #6460 -> `docs/about/release-notes.mdx`: Documents bounded,
best-effort OTLP trace credential scrubbing and the remaining
collector-side redaction requirement.
- #6423 -> `docs/about/release-notes.mdx`: Documents the checked-in
loopback-only local credential form used by starter prompts.

## 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
<!-- 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: release-note prose only, no
runtime behavior or code samples changed.
- [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
not applicable for release-note prose only.
- [ ] 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)

Verification note: `npm run docs` passed. `fern check --warnings`
reports the existing light-mode accent color contrast warning: `2.41:1`,
expected at least `3:1`.

---
<!-- 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: Miyoung Choi <miyoungc@nvidia.com>


<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

* **Documentation**
* Added a new release-notes entry for **v0.0.77** at the top of the
changelog.
* Highlighted improved package validation, tighter handling of telemetry
and trace data, and safer starter prompt behavior with stronger
redaction and local-only submission.


<!-- end of auto-generated comment: release notes by coderabbit.ai -->
Hadar301 pushed a commit to Hadar301/NemoClaw-OpenShift that referenced this pull request Jul 12, 2026
<!-- markdownlint-disable MD041 -->
## Summary
Publishes the LangChain Deep Agents Code sandbox base image from the
same main/tag workflow used by the other supported agents, closing the
release-pipeline gap that left v0.0.76 resolving an obsolete
`deepagents-code` 0.1.12 base. Base resolution now verifies the
installed DCode distribution against the active manifest and
fingerprints both the manifest and dependency lock so version or
transitive dependency drift fails closed before final-image
construction.

## Related Issue
Refs NVIDIA#6456. Keep the issue open until the exact-main image run succeeds,
the new GHCR package is public, and a clean ARM64 v0.0.76 install is
revalidated.

## Changes
- Add a guarded, multi-architecture GHCR publisher for
`langchain-deepagents-code-sandbox-base` with `latest`, release-tag, and
short-SHA metadata.
- Trigger base-image publication when the workflow, DCode base
Dockerfile, manifest, or dependency lock changes, so merging this fix
immediately publishes `latest`.
- Reject published, cached, or overridden DCode bases unless `/opt/venv`
contains the manifest-required `deepagents-code` version; the
metadata-only probe is networkless, capability-dropped,
no-new-privileges, and read-only.
- Include the DCode manifest and dependency lock in base-resolution
identity plus dirty/main-divergence checks, preventing version and
transitive lock changes from reusing stale images.
- Pin every Docker action in the package-writing workflow to an
immutable commit.
- Add focused resolver, workflow, source-invariant, and build-guard
regression coverage for NVIDIA#6456.

## Design Notes
- The invalid state is a published or cached DCode image whose installed
`deepagents-code` version differs from `manifest.yaml`
`expected_version`. The manifest is the runtime acceptance contract and
`requirements.lock` is the immutable image-build input; they serve
different consumers and cannot safely be collapsed in this release fix.
Their named invariant test runs in every PR's integration CI, so drift
is merge-blocking. Remove the duplicated-field guard only when build
tooling generates both consumers from one authoritative source.
- Global `Dockerfile.base` and blueprint inputs intentionally remain in
every agent resolution key under the resolver's pre-existing
conservative policy. NVIDIA#6456 adds the DCode manifest/lock inputs without
redefining cross-agent invalidation; removal requires a dedicated
per-agent cache-policy design with migration and regression coverage.
- DCode validation and DCode-specific resolution options are isolated in
`deep-agents-code-base-image.ts`; the shared base-image module only
selects those options. Hermes remains separate because it validates a
different capability contract.
- On exact head `29c17cd5`, `base-image.ts` is 378 lines versus 373 on
`main`, and the generic resolver test is 452 lines versus 452 on `main`;
the prior monolith findings are resolved by the focused DCode module and
agent-resolution test file.
- `dockerCapture` exposes stdout, not an exit-status result. Empty
output therefore means the container or metadata probe may have failed
and is rejected with a warning; a non-empty wrong version follows the
distinct stale-version path. Expanding the Docker adapter result type is
outside this publication fix.
- `/opt/venv/bin/python3` is the DCode base Dockerfile's declared
virtual-environment interpreter. Using the absolute path avoids `PATH`
ambiguity; a future layout change intentionally fails closed, and the
exact-head DCode onboarding E2E exercises the real image contract.
- The `deepagents-code` distribution identifier comes from the top-level
hash-locked requirement and is checked against the manifest version by
required integration CI; any future package rename fails closed.
- Coverage deliberately splits the two public contracts: focused DCode
tests exercise manifest-to-validator binding, while the agent-resolution
suite proves a pulled image is rejected when its supplied validator
fails. Exact-head DCode onboarding and sandbox-rebuild E2E supply the
composed runtime check.
- The composed override/cache contract is covered at stable public
seams: the DCode helper test binds the manifest version to the
locked-down probe, the agent provisioning test passes that validator to
resolution, the resolver test rejects an overridden candidate when
validation fails, and the resolution-metadata test revalidates a cached
hint before reuse. Exact-head DCode onboarding E2E validates the
assembled runtime path; duplicating those private seams in one synthetic
test would add coupling without a new behavior assertion.
- Manifest/lock synchronization is CI-enforced:
`test/dcode-base-image-workflow.test.ts` is in the integration project,
`.github/actions/ci-cli-coverage-shard/action.yaml` runs both `--project
cli` and `--project integration` for code PRs, and the required
aggregate `cli-tests` check passed on this exact head.
- Missing in-repo agent inputs are retained by normalization and hashed
as `<missing>` by the resolution key. Only empty, repository-root, or
out-of-repository paths are rejected, which is the intentional
path-traversal boundary rather than silent missing-file handling.
- The metadata probe has no network, capabilities, privilege escalation,
writable root filesystem, or host mounts. Keeping the image's default
user avoids requiring arbitrary override images to define a `sandbox`
account; the command is read-only and fail-closed.
- Image references are non-secret resolver inputs and are intentionally
included in validation diagnostics so operators can identify a bad
explicit override or cached tag; secret-bearing process output still
passes through the existing runner redaction boundary.
- Separate publisher jobs intentionally preserve package-specific
failures, reruns, and tag observability. Converting all existing
publishers to a matrix changes the release contract across three
packages and is a separate workflow refactor, not prerequisite work for
NVIDIA#6456.
- `packages: write` is the minimum permission needed to publish the
requested GHCR image and is pre-existing for this dedicated workflow;
the only other workflow permission is `contents: read`, publisher jobs
are repository-guarded, and all Docker actions are immutable-pinned.
- PR NVIDIA#5755 is already conflicting with current `main`; its checkout
dependency bump must rebase independently. PR NVIDIA#6469 remains mergeable
and does not need to absorb that unrelated dependency update.

## Type of Change

- [x] 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
<!-- Check exactly one tests line and one docs line. Check other lines
when applicable. Add every requested justification or approval
reference. -->
- [x] Tests added or updated for changed behavior
- [ ] Existing tests cover changed behavior — justification:
- [ ] Tests not applicable — justification:
- [ ] Docs updated for user-facing behavior changes
- [x] Docs not applicable — justification: restores the documented
hash-locked DCode runtime and stale-base fallback contracts without
changing commands, flags, configuration, defaults, or policy.
- [x] Sensitive paths changed (security, policy, credentials, preflight,
onboarding, inference, runner, sandbox, or messaging)
- [ ] Sensitive-path review completed or maintainer-approved waiver
recorded — reviewer/approval link/justification: pending human review of
base-image selection and release publication on this exact head.
- [ ] 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 — exact head `29c17cd5`: changed
resolver/base-image/workflow suites passed 56/56; the parent DCode image
contract suites passed 83/83; JS-config and CLI typechecks, `npm run
checks`, YAML/Biome validation, normal hooks, secret scan, import/shape
checks, and test-size budgets passed. Exact-head [E2E run
28948929160](https://github.com/NVIDIA/NemoClaw/actions/runs/28948929160)
passed DCode cloud onboarding and sandbox rebuild.
- [ ] Applicable broad gate passed — `npm test` for broad
runtime/test-harness changes; `npm run check` for repo-wide
validation/coverage changes — command/result:
- [ ] 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)
- [ ] 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

* **New Features**
* Expanded automated image publishing to cover an additional agent base
image and related dependency updates.
* Base image rebuilds now respond to more relevant file changes, helping
keep published images current.

* **Bug Fixes**
* Improved base image validation so outdated images are rejected more
reliably.
* Resolution logic now tracks dependency lockfile changes, reducing
stale image reuse.

<!-- 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
<!-- markdownlint-disable MD041 -->
## Summary
Adds the v0.0.77 release-note section from the shipped release
announcement and release commit range.
This is post-release docs recovery, so the PR is labeled for the next
patch release train.

## Changes
- Added `v0.0.77` to `docs/about/release-notes.mdx` with links to the
deeper Deep Agents, architecture, inference, security, and agent-docs
pages.
- Source summary:
- NVIDIA#6469 -> `docs/about/release-notes.mdx`: Documents Deep Agents Code
base-image publication and stale-version validation.
- NVIDIA#6471 -> `docs/about/release-notes.mdx`: Documents the managed runtime
disabling LangGraph CLI analytics.
- NVIDIA#6462 -> `docs/about/release-notes.mdx`: Documents the TUI, launch
banner, and model-identity provider display behavior.
- NVIDIA#6460 -> `docs/about/release-notes.mdx`: Documents bounded,
best-effort OTLP trace credential scrubbing and the remaining
collector-side redaction requirement.
- NVIDIA#6423 -> `docs/about/release-notes.mdx`: Documents the checked-in
loopback-only local credential form used by starter prompts.

## 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
<!-- 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: release-note prose only, no
runtime behavior or code samples changed.
- [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
not applicable for release-note prose only.
- [ ] 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)

Verification note: `npm run docs` passed. `fern check --warnings`
reports the existing light-mode accent color contrast warning: `2.41:1`,
expected at least `3:1`.

---
<!-- 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: Miyoung Choi <miyoungc@nvidia.com>


<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

* **Documentation**
* Added a new release-notes entry for **v0.0.77** at the top of the
changelog.
* Highlighted improved package validation, tighter handling of telemetry
and trace data, and safer starter prompt behavior with stronger
redaction and local-only submission.


<!-- end of auto-generated comment: release notes by coderabbit.ai -->
@wscurran wscurran added area: packaging Packages, images, registries, installers, or distribution bug-fix PR fixes a bug or regression integration: dcode LangChain Deep Code integration behavior labels Aug 1, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area: packaging Packages, images, registries, installers, or distribution bug-fix PR fixes a bug or regression integration: dcode LangChain Deep Code integration behavior

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants