Skip to content

feat(onboard): bind managed create to runtime providers - #8040

Merged
ericksoa merged 206 commits into
mainfrom
feat/managed-bootstrap-provider-create
Aug 3, 2026
Merged

feat(onboard): bind managed create to runtime providers#8040
ericksoa merged 206 commits into
mainfrom
feat/managed-bootstrap-provider-create

Conversation

@ericksoa

@ericksoa ericksoa commented Aug 1, 2026

Copy link
Copy Markdown
Contributor

Summary

Bind managed sandbox creation to the pluggable runtime-provider bundle without activating buildless support in production. The candidate Docker surface owns create lifecycle and routing, while central onboarding accepts the same contract from an MXC-style provider and keeps every current production bundle bootstrap-unsupported.

This slice also makes the existing Docker compatibility path retain rollback authority through readiness, GPU-proof, and applicable local-inference gates. A failed late rollback is propagated and reported instead of being treated as success.

Related Issue

Part of #7744.

Changes

  • Add one provider-neutral managed-create contract covering create lifecycle, routing, runtime patches, authority storage, and runtime snapshots.
  • Add an inert Docker candidate surface that composes the transactional bootstrap adapter; central orchestration does not select Docker, Podman, or MXC by switch.
  • Carry identity-bound held startup through OpenClaw, Hermes, and DCode launch construction without putting encoded profiles in sandbox argv.
  • Make GPU creation and host-local inference use the provider transaction, including exact rollback before fallback/failure and commit only after applicable readiness and inference gates.
  • Preserve the pre-patch container through late qualification, propagate rolledBack: false, and emit manual-cleanup guidance only when exact rollback does not complete.
  • Protect the abstraction with registry, MXC-style provider, all-agent launch, GPU lifecycle, local-inference, rollback-failure, and compatibility-path tests.
  • Update inference, commands, troubleshooting, and internal architecture documentation to match the exact rollback behavior.

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:
  • 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: Exact-tree local review covers provider neutrality, immutable rollback authority, all-agent held startup, late rollback outcome propagation, GPU/local-inference commit gates, and production dormancy. Public exact-head advisors and protected E2E remain required before merge.
  • Non-success, skipped, or missing CI check accepted by maintainer — check name, approval link, and follow-up issue:

Documentation Writer Review

  • Documentation writer subagent reviewed the completed changes
  • Result: docs-updated
  • Evidence: Clean candidate 7ed953c7d0934b4c8781b125a4ce57757591781d and append-only graft 48526666b6b975d6e6173f7f2bc7a76ab0f46361 share exact tree 048dc1f0dd8e0dbbe8de6511bbac75b18828dc61. Independent exact-diff review covered provider neutrality, the MXC-style path, production dormancy, rollback wording, and the four changed documentation files. Final signed+DCO qualification child 34b43764dd37885b88d1b931861cdf6de92b508b changes only the stale local-NIM docs contract assertion, so every reviewed documentation blob remains unchanged; the exact assertion now passes 23/23.
  • Agent: Codex Desktop

DGX Station Hardware Evidence

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

Verification

  • Exact base/head: c63e7eb5ec07448e26a6cd8617a24601216bec35 / 34b43764dd37885b88d1b931861cdf6de92b508b.
  • Review budget: 30 paths, +1,842/-313.
  • Stable patch ID: dad9c0a58cb8b696a0a29c787ff116a0438190b0.
  • Binary diff SHA-256: 91d6f4f300ace2ce4f7110e397b09f9f153a936bf1cde28140219f857e2c4f2e.
  • Clean exact-base reconstruction: signed+DCO commit 7ed953c7d0934b4c8781b125a4ce57757591781d, direct child of merged feat(onboard): add transactional Docker bootstrap adapter #8128 main c63e7eb5ec07448e26a6cd8617a24601216bec35; graft tree equality is exact at 048dc1f0dd8e0dbbe8de6511bbac75b18828dc61. Final test-only qualification child 34b43764dd37885b88d1b931861cdf6de92b508b has tree cc3b68897023975c70225ddde2559a3d44357e5d.
  • Append-only ancestry: signed+DCO graft 48526666b6b975d6e6173f7f2bc7a76ab0f46361 has preserved prior live head c14be060337d19318be9324e883cf4ddf5040d72 as first parent and clean reconstruction 7ed953c7d0934b4c8781b125a4ce57757591781d as second parent. Signed+DCO child 34b43764dd37885b88d1b931861cdf6de92b508b is a normal fast-forward. No remote history is rewritten.
  • Durable refs: backup/podman-stack/pr8040-live-head-c14be0603, backup/podman-stack/pr8040-clean-7ed953c7d, backup/podman-stack/pr8040-graft-48526666b, backup/podman-stack/pr8040-final-34b43764d, and hold/podman-stack/pr8041-base-34b43764d.
  • Exact c63-based focused behavior suite passed 164/164: 141 CLI tests and 23 integration tests. The hardened central-source boundary passed 8/8. Final docs contract test passed 23/23 after updating its stale local-NIM wording assertion.
  • CLI/plugin builds, all three typecheck surfaces, Biome, repository architecture, source-shape, test-size, conditional scan, documentation preparation and route checks, diff checks, gitleaks, markdownlint, and the complete commit-time pre-commit suite passed.
  • Documentation validation passed across OpenClaw, Hermes, and DCode variants.
  • Production provider construction still returns unsupported bootstrap/recovery surfaces; no selectable runtime or buildless activation is added.

Risk Plan

  • Primary risk: central orchestration acquiring a runtime-specific branch, or committing compatibility-path changes before late readiness/GPU/inference qualification and losing exact rollback authority.
  • Containment: one injected provider bundle owns managed create; MXC-style tests forbid Docker-specific central routing; commit is deferred through applicable gates; unsuccessful exact rollback is propagated and reported.
  • Regression risk: the compatibility path changes failure/recovery timing. Focused lifecycle and local-inference tests cover successful commit, pre-commit failure, exact rollback, rollback failure, and manual-cleanup reporting.
  • Rollback: the managed-create candidate remains unregistered; the compatibility-path change can be reverted independently if qualification exposes a regression.

Stack

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

Summary by CodeRabbit

  • New Features

    • Added managed startup and provider-driven sandbox creation support.
    • Added Docker GPU onboarding with native and compatibility routing.
    • Added durable sandbox identity resolution for OpenShell environments.
  • Bug Fixes

    • GPU verification now completes before changes are finalized.
    • Failed readiness, GPU, or inference checks attempt rollback and report recovery issues.
    • Improved diagnostics and error propagation during sandbox recreation.
  • Documentation

    • Expanded GPU rollback, diagnostics, cleanup, and local NVIDIA NIM guidance.

ericksoa added 30 commits July 30, 2026 14:50
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>
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>
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>
Preserve the exact reviewed tree while moving the stacked base to merged PR3.3.

Signed-off-by: Aaron Erickson <aerickson@nvidia.com>
Preserve the exact reviewed tree while moving the stacked base to restacked PR3.4a.

Signed-off-by: Aaron Erickson <aerickson@nvidia.com>
Preserve the exact reviewed tree while moving the stacked base to restacked PR3.4b.

Signed-off-by: Aaron Erickson <aerickson@nvidia.com>
Signed-off-by: Aaron Erickson <aerickson@nvidia.com>
Carry the reviewed PR3.4b slice unchanged onto the CodeRabbit feedback fix for PR3.4a.

Signed-off-by: Aaron Erickson <aerickson@nvidia.com>
Carry the reviewed PR3.5 slice unchanged onto the CodeRabbit feedback restack through PR3.4b.

Signed-off-by: Aaron Erickson <aerickson@nvidia.com>
Signed-off-by: Aaron Erickson <aerickson@nvidia.com>
Carry the reviewed PR3.4b slice unchanged onto the serialized PR3.4a transaction contract.

Signed-off-by: Aaron Erickson <aerickson@nvidia.com>
Carry the reviewed PR3.5 slice unchanged onto the serialized PR3.4a transaction contract.

The review patch remains unchanged through PR3.4b.

Signed-off-by: Aaron Erickson <aerickson@nvidia.com>
Signed-off-by: Aaron Erickson <aerickson@nvidia.com>
Restack PR3.4b without changing its review patch.

Signed-off-by: Aaron Erickson <aerickson@nvidia.com>
Restack PR3.5 without changing its review patch.

Signed-off-by: Aaron Erickson <aerickson@nvidia.com>
Signed-off-by: Aaron Erickson <aerickson@nvidia.com>
Preserve the reviewed append-only PR head while making the current main reconstruction and the managed-bootstrap helper environment repair explicit ancestry.

Signed-off-by: Aaron Erickson <aerickson@nvidia.com>
Signed-off-by: Aaron Erickson <aerickson@nvidia.com>
Signed-off-by: Aaron Erickson <aerickson@nvidia.com>
Preserve the reviewed PR source head while making the final transactional-bootstrap handoff and exact clean provider-create reconstruction explicit ancestry.

Signed-off-by: Aaron Erickson <aerickson@nvidia.com>
@ericksoa
ericksoa changed the base branch from hold/podman-stack/pr8040-base-2c643435a to hold/podman-stack/pr8040-base-206228343 August 3, 2026 15:49
@ericksoa

ericksoa commented Aug 3, 2026

Copy link
Copy Markdown
Contributor Author

@coderabbitai review

@coderabbitai

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

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

♻️ Duplicate comments (1)
src/lib/onboard/docker-gpu-sandbox-create.ts (1)

376-461: 🗄️ Data Integrity & Integration | 🔴 Critical | ⚡ Quick win

commitAfterReady can resolve successfully after a failed commit or rollback.

Three branches in commitAfterReady report a failure only through onPatchFailureExit and then return (or fall off the end of the async IIFE) without throwing:

  • Line 378-395 (needsSupervisorWait branch): calls onPatchFailureExit(...), then return;.
  • Line 404-433 (managedBootstrapCutover.commit() catch branch): calls onPatchFailureExit(...), then return;.
  • Line 439-449 (backup-removal-failure branch): calls onPatchFailureExit(...) with no following throw or return.

onPatchFailureExit defaults to printDockerGpuPatchFailureAndExit, which calls process.exit(1) and never returns. A managed-bootstrap override of onPatchFailureExit can return normally instead of exiting. When that happens, await patch.commitAfterReady() resolves without error even though the commit or rollback failed, and any caller (including a commit-after-verify wrapper) proceeds as if onboarding succeeded.

Compare this to verifyGpuOrExit (lines 505-512, 531-538), which always throws the original failure directly, independent of what onPatchFailureExit does. commitAfterReady should follow the same pattern on all three branches.

A prior review on an earlier commit of this file flagged exactly this defect for the commit-catch and backup-removal branches, and the thread states it was fixed in a descendant PR (#8077). That fix is not reflected in this file as shown here — the same missing-throw pattern is still present, and the needsSupervisorWait branch has the identical defect but was not covered by that earlier discussion. Confirm whether this PR should carry the fix directly, or whether it intentionally waits on the descendant PR; either way, the pattern remains exploitable in the code under review right now.

🐛 Proposed fix: throw after reporting on all three branches
       if (needsSupervisorWait) {
         const error = new Error(
           "Managed startup cannot commit before the recreated OpenShell supervisor reconnects.",
         );
         const rollbackError = await rollbackAfterFailure();
+        const failure = rollbackError
+          ? new Error(`${error.message} Rollback failed: ${rollbackError.message}`)
+          : error;
         onPatchFailureExit(
           options.sandboxName,
-          rollbackError
-            ? new Error(`${error.message} Rollback failed: ${rollbackError.message}`)
-            : error,
+          failure,
           {
             runCaptureOpenshell: options.deps.runCaptureOpenshell,
             dockerCapture: options.deps.dockerCapture,
             additionalSummaryLines: routeAdapter.additionalSummaryLines,
           },
         );
-        return;
+        throw failure;
       }
       ...
             onPatchFailureExit(options.sandboxName, failure, {
               runCaptureOpenshell: options.deps.runCaptureOpenshell,
               dockerCapture: options.deps.dockerCapture,
               additionalSummaryLines: routeAdapter.additionalSummaryLines,
               context: {
                 ...failureContext(),
                 rolledBack: rollbackError === null,
               },
             });
-            return;
+            throw failure;
           }
         }
         const finalizeOutcome = result
           ? finalizeBackup({ result, supervisorReady: true }, options.deps)
           : null;
         cutoverFinalized = true;
         if (!finalizeOutcome || finalizeOutcome.backupRemoved) return;
+        const backupFailure = new Error(
+          "Managed startup passed Ready, but its rollback backup could not be removed.",
+        );
         onPatchFailureExit(
           options.sandboxName,
-          new Error("Managed startup passed Ready, but its rollback backup could not be removed."),
+          backupFailure,
           {
             runCaptureOpenshell: options.deps.runCaptureOpenshell,
             dockerCapture: options.deps.dockerCapture,
             additionalSummaryLines: routeAdapter.additionalSummaryLines,
             context: failureContext(),
           },
         );
+        throw backupFailure;
🤖 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/onboard/docker-gpu-sandbox-create.ts` around lines 376 - 461, Update
commitAfterReady so each failure path throws its original failure after calling
onPatchFailureExit: the needsSupervisorWait branch should throw error, the
managedBootstrapCutover.commit catch should rethrow failure, and the
backup-removal failure branch should throw the constructed Error. Preserve the
existing reporting and rollback behavior while ensuring the method rejects even
when onPatchFailureExit returns normally.
🧹 Nitpick comments (1)
src/lib/onboard/docker-gpu-sandbox-create-lifecycle.test.ts (1)

87-167: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Add coverage for commitAfterReady rejecting on a failed commit or rollback.

The shown tests exercise rollbackManagedStartupAfterCreateFailure and verifyGpuOrExit, but no test calls commitAfterReady() while needsSupervisorWait is still true, or while a managedBootstrapCutover.commit() mock rejects, to confirm the returned promise rejects. Add such a test once the fix on src/lib/onboard/docker-gpu-sandbox-create.ts (lines 376-461) lands, so a regression to the silent-return pattern is caught.

🤖 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/onboard/docker-gpu-sandbox-create-lifecycle.test.ts` around lines 87
- 167, Add test coverage for
createDockerGpuSandboxCreatePatch.commitAfterReady() that keeps
needsSupervisorWait true and verifies the promise rejects when the
managedBootstrapCutover.commit() mock rejects. Assert the rejection error and
preserve the existing successful commit and rollback failure coverage.
🤖 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.

Duplicate comments:
In `@src/lib/onboard/docker-gpu-sandbox-create.ts`:
- Around line 376-461: Update commitAfterReady so each failure path throws its
original failure after calling onPatchFailureExit: the needsSupervisorWait
branch should throw error, the managedBootstrapCutover.commit catch should
rethrow failure, and the backup-removal failure branch should throw the
constructed Error. Preserve the existing reporting and rollback behavior while
ensuring the method rejects even when onPatchFailureExit returns normally.

---

Nitpick comments:
In `@src/lib/onboard/docker-gpu-sandbox-create-lifecycle.test.ts`:
- Around line 87-167: Add test coverage for
createDockerGpuSandboxCreatePatch.commitAfterReady() that keeps
needsSupervisorWait true and verifies the promise rejects when the
managedBootstrapCutover.commit() mock rejects. Assert the rejection error and
preserve the existing successful commit and rollback failure coverage.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: 9a2057f1-34eb-4dfd-afc1-e18ddf79700a

📥 Commits

Reviewing files that changed from the base of the PR and between 982be3a and c14be06.

📒 Files selected for processing (14)
  • ci/source-shape-test-budget.json
  • docs/inference/verify-inference-route.mdx
  • docs/reference/commands.mdx
  • docs/reference/troubleshooting.mdx
  • src/lib/onboard.ts
  • src/lib/onboard/docker-gpu-local-inference.test.ts
  • src/lib/onboard/docker-gpu-local-inference.ts
  • src/lib/onboard/docker-gpu-sandbox-create-lifecycle.test.ts
  • src/lib/onboard/docker-gpu-sandbox-create.ts
  • src/lib/onboard/managed-bootstrap/README.md
  • src/lib/onboard/managed-bootstrap/runtime-create.ts
  • src/lib/onboard/sandbox-gpu-create-flow.ts
  • src/lib/onboard/sandbox-gpu-create-run-attempt.ts
  • test/runtime-provider-source-shape.test.ts
💤 Files with no reviewable changes (1)
  • src/lib/onboard/managed-bootstrap/runtime-create.ts
🚧 Files skipped from review as they are similar to previous changes (6)
  • src/lib/onboard.ts
  • src/lib/onboard/docker-gpu-local-inference.test.ts
  • test/runtime-provider-source-shape.test.ts
  • src/lib/onboard/managed-bootstrap/README.md
  • src/lib/onboard/sandbox-gpu-create-flow.ts
  • src/lib/onboard/sandbox-gpu-create-run-attempt.ts

ericksoa added a commit that referenced this pull request Aug 3, 2026
<!-- markdownlint-disable MD041 -->
## Summary

Adds the second narrowed PR3.10B review unit: the dormant transactional
Docker managed-bootstrap adapter and shared-state cutover. It builds on
#8037's journal/spec primitives and remains unregistered and unsupported
by every production provider.

Preparation captures immutable original and replacement authority before
destructive activation. Cleanup requires an exact validated Ready
receipt; mutable-name reuse is retained and reported instead of deleted
unsafely. Every immutable Node helper receives a scrubbed environment,
and rollback is delegated to the immutable image's canonical receipt
parser with only the three capabilities required to restore ownership,
access owner-restricted state, and restore modes.

## Related Issue

Part of #7744

## Changes

- Prepare and inspect a stopped Docker replacement before cutover.
- Persist exact sandbox, container, image, launch-spec, bootstrap, and
shared-state authority.
- Separate prepare, activate, await, commit, rollback, and
incomplete-create cleanup phases.
- Preserve Docker GPU device/runtime/CDI evidence and snapshot
compatibility.
- Bind cleanup to a Ready receipt whose sandbox name, durable sandbox
ID, and driver match current inspection.
- Reject the complete root-process injection denylist before replacement
creation.
- Run immutable Node helpers through `/usr/bin/env -i`; clear loader
variables before the scrubber and clear `NODE_OPTIONS`/`NODE_PATH` at
the pre-entrypoint boundary as defense in depth.
- Keep rollback receipts opaque on the host and validate them
canonically inside the immutable image from a read-only mount.
- Drop all rollback-helper capabilities, then add only `CHOWN`,
`DAC_OVERRIDE`, and `FOWNER` for exact restoration.
- Add regressions for hostile launch environments, planted temp targets,
malformed rollback receipts, same-name identity reuse, and unsafe
cleanup refusal.
- Keep production Docker bootstrap explicitly unsupported and prove no
provider registration or activation import changes.

## Type of Change

- [x] Code change (feature, bug fix, or refactor)
- [x] Code change with doc updates
- [ ] Doc only (prose changes, no code sample modifications)
- [ ] Doc only (includes code sample changes)

## Quality Gates

- [x] Tests added or updated for changed behavior
- [ ] Existing tests cover changed behavior — justification:
- [ ] Tests not applicable — justification:
- [x] Docs updated for internal architecture and dormancy claims
- [x] Sensitive paths changed (security, policy, credentials, preflight,
onboarding, inference, runner, sandbox, or messaging)
- [x] Sensitive-path review completed — two independent exact-diff
reviews found no privilege widening, parser divergence, or activation
leak
- [ ] Non-success, skipped, or missing CI check accepted by maintainer —
check name, approval link, and follow-up issue:

## Documentation Writer Review

- [x] Documentation writer reviewed the completed changes
- Result: `docs-updated`
- Evidence: Candidate `875eab3f25f97134ed3347c51f8d7cc3ccc231a8` and
graft `eb8ee81cc157ea7c12e311ab4b53e87930e3ae17` share exact tree
`7ef10c62ab2f10773f8f0372dd78d41329d9f1ac`. Final qualification child
`00154381829ea31e214bc41955384755a39fe280` changes only tests, so the
reviewed documentation blobs are unchanged. Review confirmed accurate
pre-/post-cutover rollback wording, npm-package versus runtime-image
scope, activation/provider import scope, and dormant user-visible
lifecycle claims. `markdownlint-cli2`, the 8/8 source-shape contract,
and `git diff --check` pass.
- Agent: Codex Desktop
<!-- docs-review-head-sha: 0015438 -->
<!-- docs-review-agents-blob-sha:
3dd7c24 -->

## DGX Station Hardware Evidence

- [ ] Tested on DGX Station
- Tested commit:
- Station profile/scenario:
- Result:
- Supporting evidence:

## Verification

- Exact base/head: `8c542b214f15561f71b262523d80a61ed4a5e9c7` /
`00154381829ea31e214bc41955384755a39fe280` (22 files, `+4,868/-36`).
- Review budget: 21 paths, `+4,867/-35`.
- Stable patch ID: `07b3d062e2a26a8c9993f70e87ef1f5c7c0ca9db`.
- Binary diff SHA-256:
`ac4098a115e0bb14824ee7c49e211da15d268babc305a72be21b2c869b416f1d`.
- Clean reconstruction: signed+DCO commit
`875eab3f25f97134ed3347c51f8d7cc3ccc231a8`, direct child of live main
`8c542b214f15561f71b262523d80a61ed4a5e9c7`.
- Append-only graft: signed+DCO commit
`eb8ee81cc157ea7c12e311ab4b53e87930e3ae17`, first parent prior live head
`206228343ae124563be7d13b4dd620e9628f9db0`, second parent the clean
reconstruction, exact tree `7ef10c62ab2f10773f8f0372dd78d41329d9f1ac`.
Signed+DCO qualification child
`00154381829ea31e214bc41955384755a39fe280` is a normal fast-forward with
exact tree `7c3d307d40156375bf26d8b977a93d6149013650`. No remote history
was rewritten.
- Durable refs: `backup/podman-stack/pr8128-advisor-b23404994`,
`backup/podman-stack/pr8128-final-eb8ee81cc`,
`backup/podman-stack/pr8128-final-001543818`, and
`hold/podman-stack/pr8040-base-001543818`.
- Exact current-main changed-file tests passed 134/134. The complete
managed-bootstrap source reconstruction passed 149/149; security-focused
follow-up passed 20/20; source-shape dormancy passed 8/8. Final
qualification follow-up passed package-contract 8/8, temp-file 6/6, both
builds, Biome, diff checks, and hooks.
- CLI build, root/CLI/plugin typechecks, Biome, markdownlint, diff
check, test-size budget, test-conditional scan, normal commit hooks, and
normal pre-push hooks passed.
- Two independent security reviews found no blocker in the exact
advisor-fix diff. The capability set is unchanged, `/usr/bin/env -i`
remains the trusted Node boundary, immutable receipt validation remains
image-owned, and the new tests fail closed before restoration or symlink
following.
- Prior exact head `206228343ae124563be7d13b4dd620e9628f9db0` passed
ordinary CI, both advisors, CodeRabbit with zero unresolved threads,
CodeQL, and protected E2E child `30829525494` for rebuild-openclaw,
onboard-repair, onboard-resume, and state-backup-restore. Final exact
head `00154381829ea31e214bc41955384755a39fe280` must independently pass
its automatically approved current-head gates, including cloud-onboard.
- Every new commit is SSH-signed and carries Aaron's DCO trailer.
- Production provider construction still returns unsupported
bootstrap/recovery surfaces; no selectable runtime or activation is
added.

## Risk Plan

- Primary risk: destructive cutover or cleanup against stale/reused
identity, unsafe inherited process state, or loss of
GPU/spec/shared-state authority across replacement.
- Containment: exact immutable handles, validated Ready receipts,
process-injection rejection, clean helper environments, immutable
image-owned receipt validation, validated clone overrides,
provider-owned journal receipts, and preparation-before-activation.
Ambiguous cleanup fails closed and retains the workload.
- Regression risk: dormant adapter dependencies could alter existing
snapshot or GPU clone behavior. Focused compatibility tests and explicit
unsupported-provider/source-shape assertions remain green.
- Rollback: the adapter remains unregistered and independently
revertible.

## Stack

- Base: merged PR3.10B1 #8037 at main commit
`b30781c399d3456e6e071bae098c28c6000d80f9`.
- This slice: PR3.10B2 #8128, exact head
`00154381829ea31e214bc41955384755a39fe280`.
- Next: PR3.11 #8040 integrates provider/create and GPU-create flows
without activating buildless support.
- #8040's next exact handoff is protected at
`hold/podman-stack/pr8040-base-001543818` before its append-only
recascade.
- Buildless and Podman support remain disabled until all-agent,
multiarch, GPU/local-inference, recovery, installer, and protected-E2E
gates in #7744 pass.

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


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

- **New Features**
- Added Docker-based managed startup for workload creation, replacement,
activation, rollback, recovery, and cleanup.
- Added durable coordination for safe replacement commits and
interrupted operations.
- Added reliable sandbox identity detection from formatted command
output.
- Added support for preserving container names, entrypoints, and
commands during replacements.

- **Bug Fixes**
- Improved validation, cleanup, state recovery, and process-environment
safety during failed or interrupted replacements.

- **Documentation**
- Expanded managed startup documentation with Docker workflows, recovery
behavior, and operational limitations.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->

---------

Signed-off-by: Aaron Erickson <aerickson@nvidia.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Signed-off-by: Aaron Erickson <aerickson@nvidia.com>
Preserve the reviewed PR source head.

Record the exact post-merge reconstruction as explicit ancestry.

Signed-off-by: Aaron Erickson <aerickson@nvidia.com>
@ericksoa
ericksoa changed the base branch from hold/podman-stack/pr8040-base-206228343 to main August 3, 2026 18:12
@copy-pr-bot

copy-pr-bot Bot commented Aug 3, 2026

Copy link
Copy Markdown

This pull request requires additional validation before any workflows can run on NVIDIA's runners.

Pull request vetters can view their responsibilities here.

Contributors can view more details about this message here.

@github-actions

github-actions Bot commented Aug 3, 2026

Copy link
Copy Markdown
Contributor

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

ericksoa commented Aug 3, 2026

Copy link
Copy Markdown
Contributor Author

Maintainer disposition for advisor PRA-1 on exact head 34b4376: this is a false positive; no code change is appropriate. Production Local NVIDIA NIM selection sets state.provider to vllm-local in src/lib/onboard.ts:3121, and that exact state value is passed to verifyGpuSandboxLocalInferenceAndCommitAfterReady at src/lib/onboard.ts:2767-2769. vllm-local is already included in LOCAL_INFERENCE_PROVIDERS, so Local NIM receives the HTTP 2xx post-ready gate and rollback behavior. nvidia-nim is the remote NVIDIA Endpoints identity; adding it to the local-provider set would incorrectly apply host-local probing to a cloud provider. Existing setup and recovery tests explicitly assert the Local NIM vllm-local identity and distinguish the legacy/cloud nvidia-nim alias. The finding is therefore evidence-dispositioned as non-applicable. The separate reviewed-npm-audit failure remains external to this patch.

@ericksoa
ericksoa merged commit 35f5970 into main Aug 3, 2026
44 of 50 checks passed
@ericksoa
ericksoa deleted the feat/managed-bootstrap-provider-create branch August 3, 2026 19:40
ericksoa added a commit that referenced this pull request Aug 3, 2026
<!-- markdownlint-disable MD041 -->
## Summary

Persist managed-bootstrap mutation authority and image-owned
shared-state commit receipts so restart does not erase the facts needed
to prove, resume, or clean up one exact attempt. This slice remains
inert: it does not advertise or activate buildless support.

## Related Issue

Part of #7744.

## Changes

- Replace process-local Docker transaction and terminal state with
private, versioned, atomically written journal records and exact
commit/finalization receipts.
- Record provider, sandbox, plan, profile, immutable image, original and
replacement runtime identities, rollback target, preparation receipt,
and completion receipt.
- Keep durable journals identity-addressable in this slice;
unfinished-record enumeration and production phase reconciliation are
introduced together by the following recovery slice.
- Atomically convert image-owned shared-state backups into an
identity-bound durable commit receipt, reject post-commit rollback, and
clear the receipt only after external cleanup is proven.
- Preserve legacy null-identity commit and rollback CLI forms while
adding explicit identity-bound status, commit, rollback, and
receipt-cleanup forms.
- Cover OpenClaw, Hermes, and DCode persistence, restart reconstruction,
interrupted receipt compaction, exact cleanup, and ownership-reuse
defenses.
- Cover recreated-adapter rollback after committed terminal finalization
and reject same-timestamp phase mutations, closing the two valid
Nemotron coverage warnings.

## Type of Change

- [ ] Code change (feature, bug fix, or refactor)
- [x] Code change with doc updates
- [ ] Doc only (prose changes, no code sample modifications)
- [ ] Doc only (includes code sample changes)

## Quality Gates

- [x] Tests added or updated for changed behavior
- [ ] Existing tests cover changed behavior — justification:
- [ ] Tests not applicable — justification:
- [x] Docs updated for user-facing behavior changes
- [ ] Docs not applicable — justification:
- [x] Sensitive paths changed (security, policy, credentials, preflight,
onboarding, inference, runner, sandbox, or messaging)
- [x] Sensitive-path review completed or maintainer-approved waiver
recorded — reviewer/approval link/justification: Exact-tree
reconstruction review verified durable identity authority, image-owned
receipt semantics, provider neutrality, production dormancy, and the two
advisor-requested regression cases. Exact-head public advisors remain
part of the qualification wave.
- [x] Non-success, skipped, or missing CI check accepted by maintainer —
check name, approval link, and follow-up issue: `reviewed-npm-audit` is
being handled on the separate #8156/#8157 security stream and is
explicitly waived as a blocker for this stack. Its consequential
same-repository `E2E / PR Gate` blockage is waived with it; the manual
gate override is fork-only and cannot dispatch for this maintainer
branch.

## Documentation Writer Review

- [x] Documentation writer subagent reviewed the completed changes
- Result: `docs-updated`
- Evidence: The final reconstruction preserves the reviewed
`src/lib/onboard/managed-bootstrap/README.md` semantics from prior exact
head `a3571b2fb794a6bf082f05146fb24096d448548e`: provider-neutral/MXC
dormancy, pre-/post-cutover distinctions, durable identity-addressed
journals, finalization records, the image-owned commit receipt, and the
following recovery boundary. The restack changes no documentation
behavior.
- Agent: Codex Desktop
<!-- docs-review-head-sha: 3aa4ba6 -->
<!-- docs-review-agents-blob-sha:
3dd7c24 -->

## DGX Station Hardware Evidence

- [ ] Tested on DGX Station
- Tested commit:
- Station profile/scenario:
- Result:
- Supporting evidence:

## Verification

- Merged parent: #8040 produced main commit
`35f59704af0b917e1453ea2ebdc7ce817a36fd1c`.
- Exact public head: `3aa4ba69335c37ec36721cec48f7b58cea9b8e6d`.
- Review scope: 11 paths, `+1,743/-120`.
- Stable patch ID: `76f455f1e0d0a6d9977b5fa65dd61357742bff09`.
- Binary diff SHA-256:
`27b3d940a6af0a1b610eb5b676d0decc763f7dc9700c5d32853475c0bd7875a4`.
- Advisor test anchor: signed+DCO commit
`0623bd054e12fa149635c60efa38a3281efc2050`, direct child of the prior
public head.
- Clean reconstruction: signed+DCO commit
`79fd30710d194b619fe579d3daa201fec10a38e5`, direct child of merged #8040
main with exact tree `7fd1887c4ec0051ae5250a66252ddf17ca7b9e66`.
- Append-only graft: signed+DCO commit
`3aa4ba69335c37ec36721cec48f7b58cea9b8e6d`, first parent the preserved
public head `a3571b2fb794a6bf082f05146fb24096d448548e`, second parent
the clean reconstruction, and the identical clean tree. No remote
history was rewritten.
- Durable refs: `backup/podman-stack/pr8041-tests-0623bd05`,
`backup/podman-stack/pr8041-clean-79fd3071`,
`backup/podman-stack/pr8041-graft-3aa4ba69`, and
`hold/podman-stack/pr8043-base-3aa4ba693`.
- Focused validation passed 7 files and 148 tests, including both
advisor-requested cases. CLI build, source and CLI typechecks, and Biome
passed.
- Later main movement `d756d15d867cdf91a90cad81971a8a29febe3002` is the
separate audit-transition PR #8157. Its four changed paths do not
overlap this 11-path slice, so no restack or retest is warranted solely
for that movement.
- Every new commit is SSH-signed and carries Aaron's DCO trailer.
- Production provider bootstrap remains unsupported; no user-visible
buildless or Podman activation is added.

## Stack

- Base: merged PR3.11 #8040.
- This slice: PR3.12A #8041, branch
`feat/managed-bootstrap-durable-transactions`, exact head
`3aa4ba69335c37ec36721cec48f7b58cea9b8e6d`.
- Next: PR3.12B #8043; its source remains protected and its new base is
`hold/podman-stack/pr8043-base-3aa4ba693`.
- Buildless and Podman support remain disabled until the complete
all-agent, multiarch, GPU/local-inference, recovery, installer, and
protected-E2E activation gates in #7744 pass.

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

---------

Signed-off-by: Aaron Erickson <aerickson@nvidia.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
apurvvkumaria added a commit that referenced this pull request Aug 4, 2026
<!-- markdownlint-disable MD041 -->
## Summary

Prepares the canonical v0.0.102 release documentation from the current
release-labeled scope.
The change adds a dated changelog for all 38 user-facing shipping PRs
and corrects the OpenClaw agent command reference for the behavior
delivered by #8191.

## Changes

- Add `docs/changelog/2026-08-04.mdx` with the v0.0.102 release summary,
detailed behavior changes, support boundaries, security evidence links,
and links to durable documentation.
- Update `docs/reference/commands.mdx` to describe non-JSON OpenClaw
output capture, its combined limit, marker handling, stream suppression,
recovery guidance, and exit behavior.
- [#8167](#8167) ->
`docs/changelog/2026-08-04.mdx`: Records authenticated attachment of
operator-managed llama.cpp servers.
- [#8129](#8129) ->
`docs/changelog/2026-08-04.mdx`: Records the Experimental managed vLLM
profile for two DGX Spark systems.
- [#7983](#7983) ->
`docs/changelog/2026-08-04.mdx`: Records qualification of the May 2026
GB300WS factory image.
- [#8207](#8207) ->
`docs/changelog/2026-08-04.mdx`: Records the qualified DGX Station
driver transaction.
- [#8208](#8208) ->
`docs/changelog/2026-08-04.mdx`: Records mode-bound Express resume
state.
- [#8158](#8158) ->
`docs/changelog/2026-08-04.mdx`: Records recovery of host-global
dual-Station runtime ownership.
- [#8145](#8145) ->
`docs/changelog/2026-08-04.mdx`: Records Windows-host Ollama validation
from Docker Desktop's network context.
- [#8190](#8190) ->
`docs/changelog/2026-08-04.mdx`: Records HTTP model pulls when WSL has
no local Ollama executable.
- [#8195](#8195) ->
`docs/changelog/2026-08-04.mdx`: Records reuse of a healthy
installer-managed CLI.
- [#8053](#8053) ->
`docs/changelog/2026-08-04.mdx`: Records early rejection of incompatible
OpenShell gateway versions.
- [#8098](#8098) ->
`docs/changelog/2026-08-04.mdx`: Records the bounded
package-service-to-standalone gateway recovery transition.
- [#8216](#8216) ->
`docs/changelog/2026-08-04.mdx`: Records the final dashboard port
selected during multi-sandbox onboarding.
- [#8146](#8146) ->
`docs/changelog/2026-08-04.mdx`: Records managed startup-state
restoration for stopped sandboxes.
- [#8092](#8092) ->
`docs/changelog/2026-08-04.mdx`: Records gateway watchdog recovery for
classified not-serving states.
- [#8182](#8182) ->
`docs/changelog/2026-08-04.mdx`: Records consistent managed-recovery
wait configuration.
- [#8040](#8040) ->
`docs/changelog/2026-08-04.mdx`: Records Docker sandbox rollback
authority through late validation.
- [#8130](#8130) ->
`docs/changelog/2026-08-04.mdx`: Records bounded Shields deadline
recovery and durable containment.
- [#8086](#8086) ->
`docs/changelog/2026-08-04.mdx`: Records repair of narrowly validated
permission-only configuration drift.
- [#8122](#8122) ->
`docs/changelog/2026-08-04.mdx`: Records prompt failure and guidance for
corrupt transition locks.
- [#8124](#8124) ->
`docs/changelog/2026-08-04.mdx`: Records policy restoration flags,
previews, and target revalidation.
- [#7886](#7886) ->
`docs/changelog/2026-08-04.mdx`: Records explicit destruction after
pre-delete Shields hardening failures while preserving recovery
authority.
- [#7901](#7901) ->
`docs/changelog/2026-08-04.mdx`: Records multi-port uninstall behavior
and shared-resource preservation.
- [#7984](#7984) ->
`docs/changelog/2026-08-04.mdx`: Records one classified transient remote
MCP startup retry.
- [#7954](#7954) ->
`docs/changelog/2026-08-04.mdx`: Records bounded hosted-inference probe
replies.
- [#7574](#7574) ->
`docs/changelog/2026-08-04.mdx`: Records preservation of validated
reasoning capabilities through onboarding.
- [#8089](#8089) ->
`docs/changelog/2026-08-04.mdx`: Records proxy routing for Hermes
WhatsApp pairing and media traffic.
- [#7682](#7682) ->
`docs/changelog/2026-08-04.mdx`: Records native Hermes session deletion
and identifier validation.
- [#8150](#8150) ->
`docs/changelog/2026-08-04.mdx`: Records corporate CA trust for
LangChain Deep Agents Code image builds.
- [#8156](#8156) ->
`docs/changelog/2026-08-04.mdx`: Records reviewed managed runtime
dependency remediation.
- [#8180](#8180) ->
`docs/changelog/2026-08-04.mdx`: Records reviewed MCP discovery runtime
dependency updates.
- [#8196](#8196) ->
`docs/changelog/2026-08-04.mdx`: Records private npm dependency
remediation across managed images.
- [#8203](#8203) ->
`docs/changelog/2026-08-04.mdx`: Records reviewed Hermes and LangChain
Deep Agents Code Python dependency updates.
- [#8125](#8125) ->
`docs/changelog/2026-08-04.mdx`: Records bounded diagnostics for invalid
enumerated CLI values.
- [#8193](#8193) ->
`docs/changelog/2026-08-04.mdx`: Records bounded diagnostics for
unresolved sandbox base images.
- [#8118](#8118) ->
`docs/changelog/2026-08-04.mdx`: Records bounded diagnostics for changed
gateway authority.
- [#8191](#8191) ->
`docs/changelog/2026-08-04.mdx`, `docs/reference/commands.mdx`: Records
output capture, marker handling, recovery guidance, and exit behavior
for non-JSON OpenClaw agent commands.
- [#8187](#8187) ->
`docs/changelog/2026-08-04.mdx`: Records the aligned
interactive-installation start across supported agents.
- [#8153](#8153) ->
`docs/changelog/2026-08-04.mdx`: Records current product capabilities
and support boundaries.

## Type of Change

- [ ] Code change (feature, bug fix, or refactor)
- [ ] Code change with doc updates
- [x] Doc only (prose changes, no code sample modifications)
- [ ] Doc only (includes code sample changes)

## Quality Gates

- [ ] Tests added or updated for changed behavior
- [ ] Existing tests cover changed behavior — justification:
- [x] Tests not applicable — justification: This documentation-only
release preparation does not change executable behavior. Existing
changelog and published-route tests pass.
- [x] Docs updated for user-facing behavior changes
- [ ] Docs not applicable — justification:
- [ ] Sensitive paths changed (security, policy, credentials, preflight,
onboarding, inference, runner, sandbox, or messaging)
- [ ] Sensitive-path review completed or maintainer-approved waiver
recorded — reviewer/approval link/justification:
- [ ] Non-success, skipped, or missing CI check accepted by maintainer —
check name, approval link, and follow-up issue:

## Documentation Writer Review

- [x] Documentation writer subagent reviewed the completed changes
- Result: `docs-updated`
- Evidence: Independently reviewed `docs/changelog/2026-08-04.mdx` and
`docs/reference/commands.mdx` at commit `b89913780`. All 38 user-facing
v0.0.102 PRs are represented, #8191 behavior matches the implementation,
and the writing rules, documentation style, controlled terminology,
route structure, and skip policy pass review. Targeted tests pass 36/36
and the documentation build completes with 0 errors.
- Agent: Codex Desktop independent documentation writer
<!-- docs-review-head-sha: b899137 -->
<!-- docs-review-agents-blob-sha: 3dd7c24 -->

## DGX Station Hardware Evidence

- [ ] Tested on DGX Station
- Tested commit: Not applicable
- Station profile/scenario: Not applicable
- Result: Not applicable
- Supporting evidence: Not applicable

## Verification

- [x] PR description includes a `Signed-off-by:` line and every commit
appears as `Verified` in GitHub
- [x] Normal `pre-commit`, `commit-msg`, and `pre-push` hooks passed, or
`npm run validate:pr` passed after refreshing `origin/main` when hooks
were skipped or unavailable
- [x] Targeted behavior tests pass for the current change set, or tests
are marked not applicable above — `npx vitest run --project integration
test/changelog-docs.test.ts test/check-docs-published-routes.test.ts`
passed 36/36.
- [x] Applicable broad gate passed — not applicable to
documentation-only changes; `npm run docs` completed successfully with 0
errors.
- [x] Quality Gates section completed with required justifications or
waivers
- [x] No secrets, API keys, or credentials committed
- [ ] `npm run docs` builds without warnings (doc changes only) —
completed with 0 errors and 2 existing Fern warnings.
- [x] Doc pages follow the [style
guide](https://github.com/NVIDIA/NemoClaw/blob/main/docs/CONTRIBUTING.md)
(doc changes only)
- [x] New doc pages include SPDX header and frontmatter (new pages only)
— the native dated changelog uses the required parser-safe MDX SPDX
comment and intentionally has no frontmatter.

---
Signed-off-by: Apurv Kumaria <akumaria@nvidia.com>


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

## Summary by CodeRabbit

- **Documentation**
- Added release notes for v0.0.102, covering authentication, hardware
setup, WSL, installer recovery, sandbox resilience, policy management,
inference reliability, CLI improvements, and unified quickstarts.
- Updated command documentation to explain how non-JSON agent output is
collected, replayed, and reported.

- **Bug Fixes**
- Improved command-output recovery guidance when output exceeds limits
or contains unsupported fallback markers.
- Preserved accurate command exit-status reporting after output
processing.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->

Signed-off-by: Apurv Kumaria <akumaria@nvidia.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area: onboarding Onboarding FSM, provider setup, sandbox launch, or first-run flow area: security Security controls, permissions, secrets, or hardening feature PR adds or expands user-visible functionality platform: container Affects Docker, containerd, Podman, or images

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant