Skip to content

ci(images): add protected buildless qualification batch - #8234

Merged
ericksoa merged 33 commits into
mainfrom
feat/buildless-protected-qualification-batch
Aug 4, 2026
Merged

ci(images): add protected buildless qualification batch#8234
ericksoa merged 33 commits into
mainfrom
feat/buildless-protected-qualification-batch

Conversation

@ericksoa

@ericksoa ericksoa commented Aug 4, 2026

Copy link
Copy Markdown
Contributor

Summary

  • activates the already-trusted exact-head all-agent managed-image startup lane for native amd64 and arm64
  • adds an exact-image production managed-bootstrap harness for OpenClaw, Hermes, and Deep Agents Code
  • adds a dormant protected amd64 runtime lane covering real NVIDIA GPU access, host-local Ollama, NVIDIA NIM, vLLM, transactional bootstrap rollback, and exact owned cleanup for every agent
  • keeps the new runtime lane explicit-only until a follow-on activation marker can qualify it from trusted main

Stack

Validation

  • npm run checks:repository
  • npm run typecheck:cli
  • npm run source-shape:check
  • npm run test-size:check
  • npm run test-conditionals:scan -- --top 25
  • npm run test:e2e-phases:check
  • 9 protected runtime contract tests
  • 4 protected runtime workflow-boundary tests
  • 95 risk-plan and runtime contract tests
  • 50 E2E workflow, upload, preparation, mock-parity, and PR-gate tests

Safety boundary

The trusted workflow and its fail-closed validator land before activation. The NVIDIA credential is scoped only to host-side NGC/NIM setup; managed sandboxes receive generated local route tokens, and the E2E artifact sink redacts the workflow secret.

Signed-off-by: Aaron Erickson aerickson@nvidia.com

Summary by CodeRabbit

  • New Features

    • Added protected managed-image GPU qualification for local inference, startup, rollback, cleanup, and container health.
    • Added multi-architecture activation for Linux AMD64 and ARM64 environments.
    • Added support for Ollama, NVIDIA NIM, and vLLM inference runtimes.
    • Added isolated runtime validation and qualification artifacts.
  • Security

    • Strengthened safeguards for trusted sources, credentials, immutable images, and cleanup.
  • Tests

    • Expanded end-to-end, contract, workflow, risk-plan, and mock-parity coverage.

ericksoa added 15 commits August 4, 2026 06:10
Reconstruct the net #8077 terminal-outcome slice on current main.

Signed-off-by: Aaron Erickson <aerickson@nvidia.com>
(cherry picked from commit ce6f313e9f7705aa9374c0184710ca995dafdfa8)
Reconstruct the net #8078 shared-state authority slice on current main.

Signed-off-by: Aaron Erickson <aerickson@nvidia.com>
(cherry picked from commit 31236f767aa79c9e110be55bc1bf56b5396b227a)
Reconstruct the net #8080 journal-compatibility slice on current main.

Signed-off-by: Aaron Erickson <aerickson@nvidia.com>
(cherry picked from commit c52370db1119ec1b8f3365a0ce4c22beebdd28e4)
Signed-off-by: Aaron Erickson <aerickson@nvidia.com>
Signed-off-by: Aaron Erickson <aerickson@nvidia.com>
(cherry picked from commit c3fea51)
Signed-off-by: Aaron Erickson <aerickson@nvidia.com>
(cherry picked from commit 2060e9c)
Signed-off-by: Aaron Erickson <aerickson@nvidia.com>
(cherry picked from commit 5976d9d)
Signed-off-by: Aaron Erickson <aerickson@nvidia.com>
(cherry picked from commit c9a92ae)
Signed-off-by: Aaron Erickson <aerickson@nvidia.com>
Signed-off-by: Aaron Erickson <aerickson@nvidia.com>
Signed-off-by: Aaron Erickson <aerickson@nvidia.com>
Signed-off-by: Aaron Erickson <aerickson@nvidia.com>
Signed-off-by: Aaron Erickson <aerickson@nvidia.com>
Signed-off-by: Aaron Erickson <aerickson@nvidia.com>
Signed-off-by: Aaron Erickson <aerickson@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

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: 63efaf1e-47f1-4ec4-9097-4b3e20f2448c

📥 Commits

Reviewing files that changed from the base of the PR and between 8820c0b and ff85f48.

📒 Files selected for processing (3)
  • scripts/checks/run-managed-image-openshell-e2e.ts
  • test/managed-image-protected-runtime-contract.test.ts
  • test/protected-managed-image-build-script.test.ts

📝 Walkthrough

Walkthrough

Adds an explicit protected managed-image GPU E2E lane. It validates trusted workflow execution, immutable images, local inference through Ollama, NIM, and vLLM, rollback, cleanup, artifact upload, and risk-plan activation.

Changes

Protected managed-image runtime

Layer / File(s) Summary
Activation and inference contracts
ci/protected-managed-image-*-activation-v1.json, scripts/checks/managed-image-protected-runtime-contract.ts, test/*managed-image*contract.test.ts
Defines activation contracts and local-inference routes for Ollama, NIM, and vLLM.
Managed OpenShell E2E harness
scripts/checks/run-managed-image-openshell-e2e.ts, scripts/checks/build-protected-managed-images.sh, test/protected-managed-image-build-script.test.ts
Validates inputs, builds and launches exact images, checks GPU and inference behavior, verifies rollback, and cleans up owned resources.
GPU runtime qualification
test/e2e/live/managed-image-protected-runtime*.ts, test/e2e/mock-parity.json
Qualifies protected agents against Ollama, vLLM, and NIM, then verifies CUDA placement, rollback, cleanup, and summary artifacts.
Protected workflow execution and boundaries
.github/workflows/e2e.yaml, tools/e2e/*managed-image*, tools/e2e/*workflow-boundary.mts, test/e2e/support/*managed-image*
Adds trusted checkouts, digest-pinned base resolution, isolated image builds, qualification execution, cleanup, artifact upload, and workflow validation.
Risk classification and E2E gates
tools/advisors/risk-plan.mts, test/pr-risk-plan.test.ts, test/pr-e2e-gate*.test.ts, test/e2e/support/e2e-cross-runtime-compatibility.test.ts
Adds protected-runtime activation and updates risk-plan, required-job, signal-shard, lifecycle, digest, and mock-parity expectations.

Estimated code review effort: 5 (Critical) | ~120 minutes

Sequence Diagram(s)

sequenceDiagram
  participant GitHubActions
  participant TrustedWorkflow
  participant CandidateSource
  participant LocalRegistry
  participant OpenShellE2E
  GitHubActions->>TrustedWorkflow: validate trusted dispatch metadata
  TrustedWorkflow->>CandidateSource: checkout exact candidate sources
  TrustedWorkflow->>LocalRegistry: build digest-pinned protected images
  TrustedWorkflow->>OpenShellE2E: run GPU and local-inference qualification
  OpenShellE2E-->>TrustedWorkflow: report rollback and cleanup status
  TrustedWorkflow->>LocalRegistry: remove owned registry
Loading

Possibly related PRs

Suggested labels: feature, area: e2e, area: inference, area: security, platform: container, platform: arm64

Suggested reviewers: cv, apurvvkumaria

🚥 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
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly summarizes the main change: adding a protected, buildless image qualification batch.
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.
✨ 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 feat/buildless-protected-qualification-batch

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 ff85f48 in the feat/buildless-prote... branch remains at 96%, unchanged from commit 0b4a210 in the main branch.

TypeScript / code-coverage/cli

The overall coverage in commit ff85f48 in the feat/buildless-prote... branch remains at 81%, unchanged from commit 3f7097b in the main branch.

Show a code coverage summary of the most impacted files.
File main 3f7097b feat/buildless-prote... ff85f48 +/-
src/lib/credentials/store.ts 56% 55% -1%
src/lib/sandbox...rce-identity.ts 87% 87% 0%
src/lib/domain/.../connect-env.ts 89% 97% +8%
src/lib/onboard...ualification.ts 0% 100% +100%

Updated August 04, 2026 19:42 UTC

Comment thread scripts/checks/managed-image-protected-runtime-contract.ts Fixed
@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 · 3 suggestions
  • Model comparison: normalized findings differ; normalized terminology decisions differ; normalized E2E selections match; Nemotron reported the same number of blockers, the same number of warnings, 3 more suggestions.
5 terminology differences from the second opinion

Advisory only. These are normalized differences from the primary terminology receipt.

  • exact-head dispatch at .github/workflows/e2e.yaml:2066: selected only by the second-opinion lane as established.
  • protected managed-image at .github/workflows/e2e.yaml:2041: selected only by the second-opinion lane as established.
  • transactional rollback at test/e2e/live/managed-image-protected-runtime.test.ts:24: selected only by the second-opinion lane as justified.
  • protected runtime at .github/workflows/e2e.yaml:2040: selected only by the second-opinion lane as justified.
  • bootstrap-completion-failure at scripts/checks/run-managed-image-openshell-e2e.ts:105: selected only by the second-opinion lane as define.

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

3 semantic terminology decisions

Terminology decisions are advisory. They affect the assessment only when a separate finding identifies concrete semantic impact.

  • justified — protected managed-image runtime at .github/workflows/e2e.yaml:2037: Keep this term for the distinct runtime qualification lane.
  • justified — trusted qualification at tools/e2e/managed-image-protected-runtime-workflow-boundary.mts:280: Keep the modifier where the workflow trust boundary and credential scope matter.
  • established — exact PR image at test/e2e/live/managed-image-protected-runtime.test.ts:24: Keep the established term for immutable candidate-image evidence.

E2E guidance

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

Recommended E2E: cloud-inference, cloud-onboard, managed-image-multiarch-startup, security-posture

Workflow run details

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

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

# Conflicts:
#	test/pr-risk-plan.test.ts
#	tools/advisors/risk-plan.mts
@ericksoa

ericksoa commented Aug 4, 2026

Copy link
Copy Markdown
Contributor Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Aug 4, 2026

Copy link
Copy Markdown
Contributor
✅ Action performed

Review finished.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

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

Actionable comments posted: 5

🧹 Nitpick comments (10)
test/e2e/live/managed-image-protected-runtime.test.ts (1)

20-28: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Derive the declared agent list from the contract constant.

Line 24 repeats the agent inventory as literals. PROTECTED_MANAGED_IMAGE_AGENTS already holds the same list, and test/e2e/live/managed-image-protected-runtime-helpers.ts line 404 writes the summary artifact from that constant. If the activation contract in ci/protected-managed-image-multiarch-activation-v1.json changes, this declaration drifts silently.

Import the constant and spread it here.

🤖 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/e2e/live/managed-image-protected-runtime.test.ts` around lines 20 - 28,
The managed-image declaration should derive its agent inventory from the
existing PROTECTED_MANAGED_IMAGE_AGENTS contract constant instead of duplicating
string literals. Import PROTECTED_MANAGED_IMAGE_AGENTS from the shared helpers
module and spread it into the agents field of artifacts.target.declare, keeping
the remaining declaration unchanged.
scripts/checks/run-managed-image-openshell-e2e.ts (2)

713-725: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Drop the prebuild conditions that cannot fail.

Line 713 constructs prebuild with imageRef: null, imageId: null, and createArgs: [...createArgs]. The first three conditions on lines 715-717 then test that same literal. They are constant-false and cannot detect any renderer behavior. Only the launch.createArgv conditions on lines 718-722 exercise the exact-image identity claim.

Keep the launch.createArgv checks and remove the self-referential ones, so the guard states one testable claim.

♻️ Proposed fix
     const prebuild = { createArgs: [...createArgs], imageRef: null, imageId: null };
     if (
-      prebuild.imageId !== null ||
-      prebuild.imageRef !== null ||
-      prebuild.createArgs.join("\0") !== createArgs.join("\0") ||
       launch.createArgv.filter((value) => value === "--from").length !== 1 ||
🤖 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/checks/run-managed-image-openshell-e2e.ts` around lines 713 - 725,
Update the guard following the prebuild declaration by removing the checks
against prebuild.imageId, prebuild.imageRef, and prebuild.createArgs, since they
only compare unchanged literals. Preserve the launch.createArgv checks for
--from and --policy so the guard validates the rendered image identity.

Source: Path instructions


848-850: 🩺 Stability & Availability | 🔵 Trivial | ⚡ Quick win

Preserve the original failure when cleanup also fails.

The finally block throws at line 943. A throw inside finally replaces any exception that the try block raised. If the qualification fails at line 833 or a probe fails, and cleanup then records an error, the reported error is only the cleanup error. The protected lane runs for up to 300 minutes, so the discarded root cause is expensive to recover.

Capture the primary error and report both.

♻️ Proposed fix
 async function run(input: Inputs): Promise<void> {
@@
   let failureInjectionQualified = false;
+  let primaryError: unknown = null;
   try {
@@
+  } catch (error) {
+    primaryError = error;
+    throw error;
   } finally {
     const cleanupErrors: string[] = [];
@@
     if (cleanupErrors.length > 0) {
-      throw new Error(`managed-image OpenShell cleanup failed: ${cleanupErrors.join("; ")}`);
+      const detail = `managed-image OpenShell cleanup failed: ${cleanupErrors.join("; ")}`;
+      if (primaryError) {
+        throw new Error(
+          `${primaryError instanceof Error ? primaryError.message : String(primaryError)}; ${detail}`,
+          { cause: primaryError },
+        );
+      }
+      throw new Error(detail);
     }

Also applies to: 942-944

🤖 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/checks/run-managed-image-openshell-e2e.ts` around lines 848 - 850,
Update the cleanup flow around the finally block and its cleanupErrors throw to
preserve any exception from the protected try block. Capture the primary
failure, then report it together with cleanup errors when both occur; only throw
cleanup errors when no primary failure exists.

Source: Linters/SAST tools

test/e2e/live/managed-image-protected-runtime-helpers.ts (1)

335-408: 🩺 Stability & Availability | 🔵 Trivial

Consider the total time budget for the four phases.

The per-command timeouts add up beyond the test timeout. test/e2e/live/managed-image-protected-runtime.test.ts line 7 sets 220 minutes, and the workflow job allows 300 minutes. The bounded waits in this file reach much more: nine agent qualifications at 20 minutes each, three rollback runs at 20 minutes each, plus a 45 minute Ollama pull and roughly 31 minutes for vLLM and 20 minutes for NIM.

A slow run therefore ends at the test timeout instead of at a specific command timeout, which makes the failing phase harder to identify. The registered disposables at lines 343-356 still run, so cleanup is preserved.

Consider lowering the per-run timeoutMs values so that the sum fits inside the test timeout, and record the phase in the failure path.

🤖 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/e2e/live/managed-image-protected-runtime-helpers.ts` around lines 335 -
408, Rebalance the bounded waits used by qualifyProtectedManagedImageRuntime and
its helpers so the combined Ollama, vLLM, NIM, agent-qualification, and rollback
budgets fit within the 220-minute test timeout. Preserve cleanup registration
while reducing the relevant timeoutMs values, and record the active
progress.phase in the failure path so timeout errors identify the phase that
failed.
.github/workflows/e2e.yaml (2)

2249-2250: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Declare shell: bash for consistency.

Every other run step in this job declares shell: bash. This step omits it and also omits set -euo pipefail. The default shell on the Linux runner already fails on error, so behavior is correct. Add shell: bash to match the surrounding steps.

♻️ Proposed change
       - name: Install OpenShell CLI
+        shell: bash
         run: env -u DOCKER_CONFIG -u DOCKERHUB_USERNAME -u DOCKERHUB_TOKEN -u NVIDIA_API_KEY -u NVIDIA_INFERENCE_API_KEY -u GITHUB_TOKEN bash scripts/install-openshell.sh
🤖 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/e2e.yaml around lines 2249 - 2250, Add an explicit shell:
bash setting to the “Install OpenShell CLI” workflow step, matching the shell
declaration used by the other run steps in the job; leave the existing command
unchanged.

2152-2229: 📐 Maintainability & Code Quality | 🔵 Trivial | 🏗️ Heavy lift

The protected runtime lane duplicates the multiarch lane in both the workflow and its validator. The new lane was created by copying managed-image-multiarch-startup rather than extracting the shared parts, so the digest-pinning and registry-isolation guarantees now exist twice, and each copy is pinned by its own validator text. The two copies can drift independently while both validators still pass.

  • .github/workflows/e2e.yaml#L2152-L2229: extract the resolve_base function and the registry start/stop bodies into a shared script under scripts/checks/, and call it from both this job and managed-image-multiarch-startup (lines 1832-1912, 1992-2016).
  • tools/e2e/managed-image-protected-runtime-workflow-boundary.mts#L183-L201: after the shared script exists, replace these requireFragments shell-text assertions with assertions on the shared script invocation, and share the common step expectations with the multiarch validator instead of restating them.
🤖 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/e2e.yaml around lines 2152 - 2229, Extract the shared
resolve_base logic and protected registry start/stop bodies from
.github/workflows/e2e.yaml lines 2152-2229 and the corresponding
managed-image-multiarch-startup sections at lines 1832-1912 and 1992-2016 into a
script under scripts/checks/, then invoke that script from both jobs. Update
tools/e2e/managed-image-protected-runtime-workflow-boundary.mts lines 183-201 to
assert the shared-script invocation and reuse common step expectations with the
multiarch validator instead of duplicating shell fragments.
test/e2e/support/managed-image-protected-runtime-workflow.test.ts (1)

24-28: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Replace the non-null assertion with an explicit assertion.

namedStep uses ! on the find result. If a step name changes, the test fails with a TypeError on an unrelated line instead of naming the missing step. An explicit expect(...).toBeDefined() reports the real cause.

♻️ Proposed change
 function namedStep(value: WorkflowRecord, name: string): Record<string, unknown> {
-  return (runtimeJob(value).steps as Array<Record<string, unknown>>).find(
+  const step = (runtimeJob(value).steps as Array<Record<string, unknown>>).find(
     (step) => step.name === name,
-  )!;
+  );
+  expect(step, `workflow step '${name}' is missing`).toBeDefined();
+  return step as Record<string, unknown>;
 }
🤖 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/e2e/support/managed-image-protected-runtime-workflow.test.ts` around
lines 24 - 28, Update namedStep to store the find result, assert it is defined
with expect(...).toBeDefined(), and then return it without using a non-null
assertion; preserve the existing step-name lookup and ensure failures identify
the missing named step.
tools/advisors/risk-plan.mts (3)

446-446: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Use a job-id constant for consistency.

The sibling rule on line 425 references PROTECTED_MANAGED_IMAGE_MULTIARCH_JOB_ID. This rule inlines the literal "managed-image-protected-runtime", and the same literal also appears as the rule id on line 442 and in the RiskFamilyId union on line 98. Introduce a constant so the workflow job id has one definition in this file.

🤖 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 `@tools/advisors/risk-plan.mts` at line 446, Introduce a shared constant for
the managed image protected runtime job ID and replace the literal in the rule’s
requiredJobs, rule id, and RiskFamilyId union with that constant, matching the
existing PROTECTED_MANAGED_IMAGE_MULTIARCH_JOB_ID pattern.

76-84: 🚀 Performance & Scalability | 🔵 Trivial

Consider the CI cost of the broad prefixes.

scripts/, nemoclaw/, and nemoclaw-blueprint/ are wide prefixes. Any change under them now requires the 210-minute managed-image-multiarch-startup job, and test/pr-e2e-gate-signal-shards.test.ts confirms the broad shard count rises from 13 to 14 and the flattened count from 15 to 17. If this scope is intentional, plan for the added GPU and runner queue time. If not, narrow the prefixes to the directories that actually feed the managed images.

🤖 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 `@tools/advisors/risk-plan.mts` around lines 76 - 84, Review
MANAGED_IMAGE_MULTIARCH_INPUT_PREFIXES and narrow the broad scripts/, nemoclaw/,
and nemoclaw-blueprint/ entries to only the subdirectories or files that feed
the managed images, unless the full-prefix scope is explicitly intentional.
Preserve the required managed-image trigger coverage while avoiding unnecessary
managed-image-multiarch-startup jobs and shard-count increases.

59-84: 🗄️ Data Integrity & Integration | 🔵 Trivial | 🏗️ Heavy lift

Enforce synchronization with the managed-image workflow path filter.

MANAGED_IMAGE_MULTIARCH_INPUTS and MANAGED_IMAGE_MULTIARCH_INPUT_PREFIXES currently cover the workflow filter. PROTECTED_MANAGED_IMAGE_ACTIVATION_PATH is the intentional extra. Existing tests cover risk-plan matching but do not parse the workflow. Derive the inventory from .github/workflows/managed-images.yaml, or add a parser test that permits only this exception and covers false-positive paths.

🤖 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 `@tools/advisors/risk-plan.mts` around lines 59 - 84, Synchronize the risk-plan
inventory with the path filters in managed-images.yaml by deriving
MANAGED_IMAGE_MULTIARCH_INPUTS and MANAGED_IMAGE_MULTIARCH_INPUT_PREFIXES from
that workflow, or add a parser-based test that validates every workflow path and
permits only PROTECTED_MANAGED_IMAGE_ACTIVATION_PATH as an intentional extra.
Include false-positive path cases to ensure unrelated files are excluded.

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.

Inline comments:
In @.github/workflows/e2e.yaml:
- Line 2055: Update the managed-image-protected-runtime job configuration to
remove NEMOCLAW_CLI_BIN, matching managed-image-multiarch-startup, or
alternatively enable CLI building in Prepare E2E workspace so bin/nemoclaw.js
has its required dist/nemoclaw output.

In `@scripts/checks/run-managed-image-openshell-e2e.ts`:
- Around line 154-156: Update managedImageOpenShellBasePolicyPath to resolve the
module directory through the repository’s CJS/ESM normalization pattern instead
of assuming __dirname, so it works under both tsx and Vitest. Replace the
require.main === module entrypoint check with the repository’s dual-mode guard,
ensuring imported modules do not execute the CLI while direct execution still
does.

In `@test/e2e/live/managed-image-protected-runtime-helpers.ts`:
- Around line 217-224: Update the timeout failure command in the readiness
script to add Docker’s --tail option to the docker logs invocation, limiting the
vLLM log dump to a bounded number of recent lines while preserving stderr output
and the existing exit behavior.
- Around line 384-397: The NEMOCLAW_VLLM_LOCAL_TOKEN values passed to
qualifyEveryAgent in both the vllm and nim phases are hardcoded
source-controlled literals instead of being dynamically generated per-run.
Either generate unique tokens for each qualification phase instead of the static
"protected-local-vllm" and "protected-local-nim" strings, or update the
credentialBoundary configuration to align with these static credential values.
Ensure the approach matches how the sandbox provider credential is actually
registered and used.

In `@test/e2e/support/managed-image-protected-runtime-workflow.test.ts`:
- Around line 14-18: Update workflow() to resolve e2e.yaml using
import.meta.dirname instead of __dirname, matching the ESM path-resolution
pattern used by sibling support tests. Preserve the existing relative workflow
path and YAML parsing behavior.

---

Nitpick comments:
In @.github/workflows/e2e.yaml:
- Around line 2249-2250: Add an explicit shell: bash setting to the “Install
OpenShell CLI” workflow step, matching the shell declaration used by the other
run steps in the job; leave the existing command unchanged.
- Around line 2152-2229: Extract the shared resolve_base logic and protected
registry start/stop bodies from .github/workflows/e2e.yaml lines 2152-2229 and
the corresponding managed-image-multiarch-startup sections at lines 1832-1912
and 1992-2016 into a script under scripts/checks/, then invoke that script from
both jobs. Update
tools/e2e/managed-image-protected-runtime-workflow-boundary.mts lines 183-201 to
assert the shared-script invocation and reuse common step expectations with the
multiarch validator instead of duplicating shell fragments.

In `@scripts/checks/run-managed-image-openshell-e2e.ts`:
- Around line 713-725: Update the guard following the prebuild declaration by
removing the checks against prebuild.imageId, prebuild.imageRef, and
prebuild.createArgs, since they only compare unchanged literals. Preserve the
launch.createArgv checks for --from and --policy so the guard validates the
rendered image identity.
- Around line 848-850: Update the cleanup flow around the finally block and its
cleanupErrors throw to preserve any exception from the protected try block.
Capture the primary failure, then report it together with cleanup errors when
both occur; only throw cleanup errors when no primary failure exists.

In `@test/e2e/live/managed-image-protected-runtime-helpers.ts`:
- Around line 335-408: Rebalance the bounded waits used by
qualifyProtectedManagedImageRuntime and its helpers so the combined Ollama,
vLLM, NIM, agent-qualification, and rollback budgets fit within the 220-minute
test timeout. Preserve cleanup registration while reducing the relevant
timeoutMs values, and record the active progress.phase in the failure path so
timeout errors identify the phase that failed.

In `@test/e2e/live/managed-image-protected-runtime.test.ts`:
- Around line 20-28: The managed-image declaration should derive its agent
inventory from the existing PROTECTED_MANAGED_IMAGE_AGENTS contract constant
instead of duplicating string literals. Import PROTECTED_MANAGED_IMAGE_AGENTS
from the shared helpers module and spread it into the agents field of
artifacts.target.declare, keeping the remaining declaration unchanged.

In `@test/e2e/support/managed-image-protected-runtime-workflow.test.ts`:
- Around line 24-28: Update namedStep to store the find result, assert it is
defined with expect(...).toBeDefined(), and then return it without using a
non-null assertion; preserve the existing step-name lookup and ensure failures
identify the missing named step.

In `@tools/advisors/risk-plan.mts`:
- Line 446: Introduce a shared constant for the managed image protected runtime
job ID and replace the literal in the rule’s requiredJobs, rule id, and
RiskFamilyId union with that constant, matching the existing
PROTECTED_MANAGED_IMAGE_MULTIARCH_JOB_ID pattern.
- Around line 76-84: Review MANAGED_IMAGE_MULTIARCH_INPUT_PREFIXES and narrow
the broad scripts/, nemoclaw/, and nemoclaw-blueprint/ entries to only the
subdirectories or files that feed the managed images, unless the full-prefix
scope is explicitly intentional. Preserve the required managed-image trigger
coverage while avoiding unnecessary managed-image-multiarch-startup jobs and
shard-count increases.
- Around line 59-84: Synchronize the risk-plan inventory with the path filters
in managed-images.yaml by deriving MANAGED_IMAGE_MULTIARCH_INPUTS and
MANAGED_IMAGE_MULTIARCH_INPUT_PREFIXES from that workflow, or add a parser-based
test that validates every workflow path and permits only
PROTECTED_MANAGED_IMAGE_ACTIVATION_PATH as an intentional extra. Include
false-positive path cases to ensure unrelated files are excluded.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: f4e79d32-0289-4082-a7dd-1f59b84b562b

📥 Commits

Reviewing files that changed from the base of the PR and between ab12cc8 and 5b7c9bf.

📒 Files selected for processing (18)
  • .github/workflows/e2e.yaml
  • ci/protected-managed-image-multiarch-activation-v1.json
  • scripts/checks/managed-image-protected-runtime-contract.ts
  • scripts/checks/run-managed-image-openshell-e2e.ts
  • test/e2e/live/managed-image-protected-runtime-helpers.ts
  • test/e2e/live/managed-image-protected-runtime.test.ts
  • test/e2e/mock-parity.json
  • test/e2e/support/managed-image-protected-runtime-workflow.test.ts
  • test/managed-image-protected-runtime-contract.test.ts
  • test/pr-e2e-gate-signal-shards.test.ts
  • test/pr-e2e-gate.test.ts
  • test/pr-risk-plan.test.ts
  • test/protected-managed-image-contract.test.ts
  • tools/advisors/risk-plan.mts
  • tools/e2e/managed-image-protected-runtime-workflow-boundary.mts
  • tools/e2e/prepare-e2e-workflow-boundary.mts
  • tools/e2e/upload-e2e-artifacts-workflow-boundary.mts
  • tools/e2e/workflow-boundary.mts

Comment thread .github/workflows/e2e.yaml
Comment thread scripts/checks/run-managed-image-openshell-e2e.ts
Comment thread test/e2e/live/managed-image-protected-runtime-helpers.ts
Comment thread test/e2e/live/managed-image-protected-runtime-helpers.ts Outdated
Comment thread test/e2e/support/managed-image-protected-runtime-workflow.test.ts
@wscurran wscurran added area: ci CI workflows, checks, release automation, or GitHub Actions area: packaging Packages, images, registries, installers, or distribution chore Build, CI, dependency, or tooling maintenance integration: dcode LangChain Deep Code integration behavior labels Aug 4, 2026
@ericksoa

ericksoa commented Aug 4, 2026

Copy link
Copy Markdown
Contributor Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Aug 4, 2026

Copy link
Copy Markdown
Contributor
✅ Action performed

Review finished.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

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

ericksoa commented Aug 4, 2026

Copy link
Copy Markdown
Contributor Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Aug 4, 2026

Copy link
Copy Markdown
Contributor
✅ Action performed

Review finished.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@cv

cv commented Aug 4, 2026

Copy link
Copy Markdown
Collaborator

Coordination note for future Pi qualification

This PR should remain the current OpenClaw, Hermes, and Deep Agents Code protected buildless qualification batch. #7923 proposes Pi as a future shipped agent, but #7926 has not accepted its product contract. Do not add Pi to this PR or make the evidence for this PR responsible for a fourth agent runtime.

After the current buildless activation batch merges, Pi should use the same managed-image contract, direct startup harness, native amd64/arm64 publication evidence, protected bootstrap and runtime checks, rollback, and cleanup of identified resources. Pi image work belongs to #7925. Lifecycle and qualification work belongs to #7927 and #7928.

If Pi activates before Podman, a later #7744 qualification or activation change must add Pi to the all-shipped-agent gate before NemoClaw documents Podman support. Do not add a Pi-specific provider or workflow execution branch.

@ericksoa ericksoa added area: e2e End-to-end tests, nightly failures, or validation infrastructure area: inference Inference routing, serving, model selection, or outputs area: local-models Local model providers, downloads, launch, or connectivity area: onboarding Onboarding FSM, provider setup, sandbox launch, or first-run flow area: security Security controls, permissions, secrets, or hardening integration: openclaw OpenClaw integration behavior integration: hermes Hermes integration behavior platform: arm64 Affects ARM64 or aarch64 architecture platform: container Affects Docker, containerd, Podman, or images v0.0.102 labels Aug 4, 2026
@ericksoa
ericksoa merged commit dd7db61 into main Aug 4, 2026
63 of 66 checks passed
@ericksoa
ericksoa deleted the feat/buildless-protected-qualification-batch branch August 4, 2026 19:56
cv added a commit that referenced this pull request Aug 4, 2026
Signed-off-by: Carlos Villela <cvillela@nvidia.com>
cv added a commit that referenced this pull request Aug 4, 2026
Signed-off-by: Carlos Villela <cvillela@nvidia.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area: ci CI workflows, checks, release automation, or GitHub Actions area: e2e End-to-end tests, nightly failures, or validation infrastructure area: inference Inference routing, serving, model selection, or outputs area: local-models Local model providers, downloads, launch, or connectivity area: onboarding Onboarding FSM, provider setup, sandbox launch, or first-run flow area: packaging Packages, images, registries, installers, or distribution area: security Security controls, permissions, secrets, or hardening chore Build, CI, dependency, or tooling maintenance integration: dcode LangChain Deep Code integration behavior integration: hermes Hermes integration behavior integration: openclaw OpenClaw integration behavior platform: arm64 Affects ARM64 or aarch64 architecture platform: container Affects Docker, containerd, Podman, or images

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants