feat(onboard): bind managed create to runtime providers - #8040
Conversation
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>
|
@coderabbitai review |
✅ Action performedReview finished.
|
There was a problem hiding this comment.
♻️ Duplicate comments (1)
src/lib/onboard/docker-gpu-sandbox-create.ts (1)
376-461: 🗄️ Data Integrity & Integration | 🔴 Critical | ⚡ Quick win
commitAfterReadycan resolve successfully after a failed commit or rollback.Three branches in
commitAfterReadyreport a failure only throughonPatchFailureExitand then return (or fall off the end of the async IIFE) without throwing:
- Line 378-395 (
needsSupervisorWaitbranch): callsonPatchFailureExit(...), thenreturn;.- Line 404-433 (
managedBootstrapCutover.commit()catch branch): callsonPatchFailureExit(...), thenreturn;.- Line 439-449 (backup-removal-failure branch): calls
onPatchFailureExit(...)with no followingthroworreturn.
onPatchFailureExitdefaults toprintDockerGpuPatchFailureAndExit, which callsprocess.exit(1)and never returns. A managed-bootstrap override ofonPatchFailureExitcan 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 alwaysthrows the original failure directly, independent of whatonPatchFailureExitdoes.commitAfterReadyshould 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 theneedsSupervisorWaitbranch 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 winAdd coverage for
commitAfterReadyrejecting on a failed commit or rollback.The shown tests exercise
rollbackManagedStartupAfterCreateFailureandverifyGpuOrExit, but no test callscommitAfterReady()whileneedsSupervisorWaitis still true, or while amanagedBootstrapCutover.commit()mock rejects, to confirm the returned promise rejects. Add such a test once the fix onsrc/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
📒 Files selected for processing (14)
ci/source-shape-test-budget.jsondocs/inference/verify-inference-route.mdxdocs/reference/commands.mdxdocs/reference/troubleshooting.mdxsrc/lib/onboard.tssrc/lib/onboard/docker-gpu-local-inference.test.tssrc/lib/onboard/docker-gpu-local-inference.tssrc/lib/onboard/docker-gpu-sandbox-create-lifecycle.test.tssrc/lib/onboard/docker-gpu-sandbox-create.tssrc/lib/onboard/managed-bootstrap/README.mdsrc/lib/onboard/managed-bootstrap/runtime-create.tssrc/lib/onboard/sandbox-gpu-create-flow.tssrc/lib/onboard/sandbox-gpu-create-run-attempt.tstest/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
<!-- 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>
|
🌿 Preview your docs: https://nvidia-preview-pr-8040.docs.buildwithfern.com/nemoclaw |
Signed-off-by: Aaron Erickson <aerickson@nvidia.com>
|
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. |
<!-- 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>
<!-- markdownlint-disable MD041 --> ## Summary Prepares the canonical v0.0.102 release documentation from the current release-labeled scope. The change adds a dated changelog for all 38 user-facing shipping PRs and corrects the OpenClaw agent command reference for the behavior delivered by #8191. ## Changes - Add `docs/changelog/2026-08-04.mdx` with the v0.0.102 release summary, detailed behavior changes, support boundaries, security evidence links, and links to durable documentation. - Update `docs/reference/commands.mdx` to describe non-JSON OpenClaw output capture, its combined limit, marker handling, stream suppression, recovery guidance, and exit behavior. - [#8167](#8167) -> `docs/changelog/2026-08-04.mdx`: Records authenticated attachment of operator-managed llama.cpp servers. - [#8129](#8129) -> `docs/changelog/2026-08-04.mdx`: Records the Experimental managed vLLM profile for two DGX Spark systems. - [#7983](#7983) -> `docs/changelog/2026-08-04.mdx`: Records qualification of the May 2026 GB300WS factory image. - [#8207](#8207) -> `docs/changelog/2026-08-04.mdx`: Records the qualified DGX Station driver transaction. - [#8208](#8208) -> `docs/changelog/2026-08-04.mdx`: Records mode-bound Express resume state. - [#8158](#8158) -> `docs/changelog/2026-08-04.mdx`: Records recovery of host-global dual-Station runtime ownership. - [#8145](#8145) -> `docs/changelog/2026-08-04.mdx`: Records Windows-host Ollama validation from Docker Desktop's network context. - [#8190](#8190) -> `docs/changelog/2026-08-04.mdx`: Records HTTP model pulls when WSL has no local Ollama executable. - [#8195](#8195) -> `docs/changelog/2026-08-04.mdx`: Records reuse of a healthy installer-managed CLI. - [#8053](#8053) -> `docs/changelog/2026-08-04.mdx`: Records early rejection of incompatible OpenShell gateway versions. - [#8098](#8098) -> `docs/changelog/2026-08-04.mdx`: Records the bounded package-service-to-standalone gateway recovery transition. - [#8216](#8216) -> `docs/changelog/2026-08-04.mdx`: Records the final dashboard port selected during multi-sandbox onboarding. - [#8146](#8146) -> `docs/changelog/2026-08-04.mdx`: Records managed startup-state restoration for stopped sandboxes. - [#8092](#8092) -> `docs/changelog/2026-08-04.mdx`: Records gateway watchdog recovery for classified not-serving states. - [#8182](#8182) -> `docs/changelog/2026-08-04.mdx`: Records consistent managed-recovery wait configuration. - [#8040](#8040) -> `docs/changelog/2026-08-04.mdx`: Records Docker sandbox rollback authority through late validation. - [#8130](#8130) -> `docs/changelog/2026-08-04.mdx`: Records bounded Shields deadline recovery and durable containment. - [#8086](#8086) -> `docs/changelog/2026-08-04.mdx`: Records repair of narrowly validated permission-only configuration drift. - [#8122](#8122) -> `docs/changelog/2026-08-04.mdx`: Records prompt failure and guidance for corrupt transition locks. - [#8124](#8124) -> `docs/changelog/2026-08-04.mdx`: Records policy restoration flags, previews, and target revalidation. - [#7886](#7886) -> `docs/changelog/2026-08-04.mdx`: Records explicit destruction after pre-delete Shields hardening failures while preserving recovery authority. - [#7901](#7901) -> `docs/changelog/2026-08-04.mdx`: Records multi-port uninstall behavior and shared-resource preservation. - [#7984](#7984) -> `docs/changelog/2026-08-04.mdx`: Records one classified transient remote MCP startup retry. - [#7954](#7954) -> `docs/changelog/2026-08-04.mdx`: Records bounded hosted-inference probe replies. - [#7574](#7574) -> `docs/changelog/2026-08-04.mdx`: Records preservation of validated reasoning capabilities through onboarding. - [#8089](#8089) -> `docs/changelog/2026-08-04.mdx`: Records proxy routing for Hermes WhatsApp pairing and media traffic. - [#7682](#7682) -> `docs/changelog/2026-08-04.mdx`: Records native Hermes session deletion and identifier validation. - [#8150](#8150) -> `docs/changelog/2026-08-04.mdx`: Records corporate CA trust for LangChain Deep Agents Code image builds. - [#8156](#8156) -> `docs/changelog/2026-08-04.mdx`: Records reviewed managed runtime dependency remediation. - [#8180](#8180) -> `docs/changelog/2026-08-04.mdx`: Records reviewed MCP discovery runtime dependency updates. - [#8196](#8196) -> `docs/changelog/2026-08-04.mdx`: Records private npm dependency remediation across managed images. - [#8203](#8203) -> `docs/changelog/2026-08-04.mdx`: Records reviewed Hermes and LangChain Deep Agents Code Python dependency updates. - [#8125](#8125) -> `docs/changelog/2026-08-04.mdx`: Records bounded diagnostics for invalid enumerated CLI values. - [#8193](#8193) -> `docs/changelog/2026-08-04.mdx`: Records bounded diagnostics for unresolved sandbox base images. - [#8118](#8118) -> `docs/changelog/2026-08-04.mdx`: Records bounded diagnostics for changed gateway authority. - [#8191](#8191) -> `docs/changelog/2026-08-04.mdx`, `docs/reference/commands.mdx`: Records output capture, marker handling, recovery guidance, and exit behavior for non-JSON OpenClaw agent commands. - [#8187](#8187) -> `docs/changelog/2026-08-04.mdx`: Records the aligned interactive-installation start across supported agents. - [#8153](#8153) -> `docs/changelog/2026-08-04.mdx`: Records current product capabilities and support boundaries. ## Type of Change - [ ] Code change (feature, bug fix, or refactor) - [ ] Code change with doc updates - [x] Doc only (prose changes, no code sample modifications) - [ ] Doc only (includes code sample changes) ## Quality Gates - [ ] Tests added or updated for changed behavior - [ ] Existing tests cover changed behavior — justification: - [x] Tests not applicable — justification: This documentation-only release preparation does not change executable behavior. Existing changelog and published-route tests pass. - [x] Docs updated for user-facing behavior changes - [ ] Docs not applicable — justification: - [ ] Sensitive paths changed (security, policy, credentials, preflight, onboarding, inference, runner, sandbox, or messaging) - [ ] Sensitive-path review completed or maintainer-approved waiver recorded — reviewer/approval link/justification: - [ ] Non-success, skipped, or missing CI check accepted by maintainer — check name, approval link, and follow-up issue: ## Documentation Writer Review - [x] Documentation writer subagent reviewed the completed changes - Result: `docs-updated` - Evidence: Independently reviewed `docs/changelog/2026-08-04.mdx` and `docs/reference/commands.mdx` at commit `b89913780`. All 38 user-facing v0.0.102 PRs are represented, #8191 behavior matches the implementation, and the writing rules, documentation style, controlled terminology, route structure, and skip policy pass review. Targeted tests pass 36/36 and the documentation build completes with 0 errors. - Agent: Codex Desktop independent documentation writer <!-- docs-review-head-sha: b899137 --> <!-- docs-review-agents-blob-sha: 3dd7c24 --> ## DGX Station Hardware Evidence - [ ] Tested on DGX Station - Tested commit: Not applicable - Station profile/scenario: Not applicable - Result: Not applicable - Supporting evidence: Not applicable ## Verification - [x] PR description includes a `Signed-off-by:` line and every commit appears as `Verified` in GitHub - [x] Normal `pre-commit`, `commit-msg`, and `pre-push` hooks passed, or `npm run validate:pr` passed after refreshing `origin/main` when hooks were skipped or unavailable - [x] Targeted behavior tests pass for the current change set, or tests are marked not applicable above — `npx vitest run --project integration test/changelog-docs.test.ts test/check-docs-published-routes.test.ts` passed 36/36. - [x] Applicable broad gate passed — not applicable to documentation-only changes; `npm run docs` completed successfully with 0 errors. - [x] Quality Gates section completed with required justifications or waivers - [x] No secrets, API keys, or credentials committed - [ ] `npm run docs` builds without warnings (doc changes only) — completed with 0 errors and 2 existing Fern warnings. - [x] Doc pages follow the [style guide](https://github.com/NVIDIA/NemoClaw/blob/main/docs/CONTRIBUTING.md) (doc changes only) - [x] New doc pages include SPDX header and frontmatter (new pages only) — the native dated changelog uses the required parser-safe MDX SPDX comment and intentionally has no frontmatter. --- Signed-off-by: Apurv Kumaria <akumaria@nvidia.com> <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit - **Documentation** - Added release notes for v0.0.102, covering authentication, hardware setup, WSL, installer recovery, sandbox resilience, policy management, inference reliability, CLI improvements, and unified quickstarts. - Updated command documentation to explain how non-JSON agent output is collected, replayed, and reported. - **Bug Fixes** - Improved command-output recovery guidance when output exceeds limits or contains unsupported fallback markers. - Preserved accurate command exit-status reporting after output processing. <!-- end of auto-generated comment: release notes by coderabbit.ai --> Signed-off-by: Apurv Kumaria <akumaria@nvidia.com>
Summary
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
rolledBack: false, and emit manual-cleanup guidance only when exact rollback does not complete.Type of Change
Quality Gates
Documentation Writer Review
docs-updated7ed953c7d0934b4c8781b125a4ce57757591781dand append-only graft48526666b6b975d6e6173f7f2bc7a76ab0f46361share exact tree048dc1f0dd8e0dbbe8de6511bbac75b18828dc61. 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 child34b43764dd37885b88d1b931861cdf6de92b508bchanges only the stale local-NIM docs contract assertion, so every reviewed documentation blob remains unchanged; the exact assertion now passes 23/23.DGX Station Hardware Evidence
Verification
c63e7eb5ec07448e26a6cd8617a24601216bec35/34b43764dd37885b88d1b931861cdf6de92b508b.+1,842/-313.dad9c0a58cb8b696a0a29c787ff116a0438190b0.91d6f4f300ace2ce4f7110e397b09f9f153a936bf1cde28140219f857e2c4f2e.7ed953c7d0934b4c8781b125a4ce57757591781d, direct child of merged feat(onboard): add transactional Docker bootstrap adapter #8128 mainc63e7eb5ec07448e26a6cd8617a24601216bec35; graft tree equality is exact at048dc1f0dd8e0dbbe8de6511bbac75b18828dc61. Final test-only qualification child34b43764dd37885b88d1b931861cdf6de92b508bhas treecc3b68897023975c70225ddde2559a3d44357e5d.48526666b6b975d6e6173f7f2bc7a76ab0f46361has preserved prior live headc14be060337d19318be9324e883cf4ddf5040d72as first parent and clean reconstruction7ed953c7d0934b4c8781b125a4ce57757591781das second parent. Signed+DCO child34b43764dd37885b88d1b931861cdf6de92b508bis a normal fast-forward. No remote history is rewritten.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, andhold/podman-stack/pr8041-base-34b43764d.Risk Plan
Stack
c63e7eb5ec07448e26a6cd8617a24601216bec35.feat/managed-bootstrap-provider-create, exact head34b43764dd37885b88d1b931861cdf6de92b508b.hold/podman-stack/pr8041-base-34b43764d.Signed-off-by: Aaron Erickson aerickson@nvidia.com
Summary by CodeRabbit
New Features
Bug Fixes
Documentation