Skip to content

fix(status): recover visible post-reboot sandbox - #7848

Merged
cv merged 4 commits into
mainfrom
codex/issue-7824-recovery-fix
Jul 29, 2026
Merged

fix(status): recover visible post-reboot sandbox#7848
cv merged 4 commits into
mainfrom
codex/issue-7824-recovery-fix

Conversation

@jyaunches

@jyaunches jyaunches commented Jul 29, 2026

Copy link
Copy Markdown
Contributor

Summary

After a host reboot, OpenShell can restart a registered Docker sandbox and report it Ready before the managed OpenClaw gateway and host forward are restored. Status previously ran guarded delivery-chain recovery only when sandbox lookup itself had recovered a missing sandbox, so this visible-sandbox case could exit successfully while the gateway remained unreachable.

Status now proves or recovers the managed OpenClaw gateway and host forward for a present, Ready Docker/OpenClaw sandbox with a clear host preflight. It fails closed with sandbox_recovery_failed when that delivery chain cannot be proven, preserves higher-priority host and non-Ready diagnostics, and only claims Docker restoration when lookup actually recovered the sandbox.

The exact E2E then exposed a second production defect in the existing direct-recreation path: OpenShell can emit informational stdout while refusing the read-only readiness probe with the exact same-sandbox phase: Error response. The retry classifier required empty stdout and therefore treated that transient re-registration state as terminal. It now retries only that exact refusal; broader signatures remain constrained and unrelated errors remain terminal.

Related Issue

Fixes #7824

Changes

  • Run guarded process and forward recovery for present, Ready Docker/OpenClaw sandboxes with a clear host preflight even when lookup did not recover the sandbox.
  • Convert an unproven delivery chain into a precise nonzero recovery failure before inference probing.
  • Avoid reporting that a sandbox was restored from Docker without corresponding lookup evidence.
  • Retry the exact same-sandbox OpenShell phase: Error re-registration refusal even when the CLI also emits informational stdout.
  • Keep all broader retry signatures constrained to empty stdout and all unrelated failures terminal.
  • Cover markerless recovery success, recovery failure, diagnostic precedence, exact readiness stream shape, and rendering behavior.
  • Keep inference-route-only integration cases independent from Docker recovery by using their intended VM fixture.
  • Document present-sandbox delivery-chain verification and recovery for OpenClaw.

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-head nine-category security review completed with no findings.
  • 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: docs/reference/commands.mdx already documents the observable present-and-Ready OpenClaw recovery and fail-closed contract; no additional docs change was needed for the exact retry-classifier follow-up. Writing review found no issues. Biome, focused tests, CLI type-check, and hooks passed.
  • Agent: Codex Desktop

DGX Station Hardware Evidence

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

Verification

  • PR description includes a Signed-off-by: line and every commit appears as Verified in GitHub
  • Normal pre-commit, commit-msg, and pre-push hooks passed, or npm run validate:pr passed after refreshing origin/main when hooks were skipped or unavailable
  • Targeted behavior tests pass for the current change set, or tests are marked not applicable above — process-recovery.test.ts passed 43/43; prior focused status source tests passed 46/46; exact CI integration files passed 8/8 and 18/18. npm run test:changed passed 692/693 with one unrelated 5-second snapshot timeout that passed immediately in isolation.
  • Applicable broad gate passed — exact-head CI passed all required jobs; the trusted PR E2E controller succeeded; and its pinned child run passed ubuntu-repo-docker-post-reboot-recovery on caeacc131b387d7db81d4e0f0d15ea4706944fe2. Artifact evidence records post-reboot nemoclaw status exiting 0 with OpenClaw running and Docker healthy, followed by an HTTP 200 gateway probe.
  • Quality Gates section completed with required justifications or waivers
  • No secrets, API keys, or credentials committed
  • npm run docs builds without warnings (doc changes only)
  • Doc pages follow the style guide (doc changes only)
  • New doc pages include SPDX header and frontmatter (new pages only)

Signed-off-by: Julie Yaunches jyaunches@nvidia.com

@jyaunches jyaunches self-assigned this Jul 29, 2026
@jyaunches

Copy link
Copy Markdown
Contributor Author

Sensitive-path security review

Reviewed exact head 9648fbd96da2102198c656875360107109cda74b against base cd49b2fc1cf40de0e5e215fb1ee4e35e7a404325.

Files reviewed:

  • src/lib/actions/sandbox/status-snapshot.ts
  • src/lib/actions/sandbox/status-lookup-rendering.ts
  • src/lib/actions/sandbox/status-snapshot-recovery.test.ts
  • src/lib/actions/sandbox/status-flow.test.ts
  • docs/reference/commands.mdx

Result: PASS — no security findings.

  1. Secrets and credentials — PASS. No secret material, credential handling, or new environment-variable surface was added. The changed failure detail is normalized and bounded before rendering.
  2. Input validation and injection — PASS. No new external input parser or command construction was added. The new branch only broadens when the existing registered-sandbox recovery routine is invoked.
  3. Authentication and authorization — PASS. No authorization boundary changed. Recovery continues through the existing managed, pinned-container supervisor and registered-sandbox identity checks.
  4. Dependencies and supply chain — PASS. No dependency, lockfile, image, workflow action, or download changed.
  5. Errors, logs, and information exposure — PASS. An unproven gateway or forward becomes the existing nonzero sandbox_recovery_failed state; inference probing is skipped. Output identifies the failed layer without exposing sensitive data.
  6. Cryptography — PASS. No cryptographic behavior changed. Existing managed-recovery nonce and identity mechanisms remain unchanged.
  7. Configuration, network, and headers — PASS. No port, network policy, header, TLS, or configuration default changed. Existing forward ownership and health checks remain authoritative.
  8. Security testing — PASS. Focused tests cover successful markerless recovery, fail-closed recovery failure, suppression of inference probing after failure, and truthful recovery rendering. The two focused files passed all 43 tests.
  9. System and operational security — PASS. Scope is limited to present Docker/OpenClaw sandboxes; Hermes and terminal states are excluded from the markerless path. The existing recovery implementation keeps the healthy path a no-op, rejects occupied or unverifiable forwards, uses bounded waits, pins recreated-container identity, and runs under the timer-bound sandbox mutation lock.

Validation evidence:

  • npm exec -- vitest run --project cli src/lib/actions/sandbox/status-snapshot-recovery.test.ts src/lib/actions/sandbox/status-flow.test.ts — 43 tests passed.
  • npm run build:cli — passed.
  • npm run typecheck:cli — passed.
  • npm run validate:pr — passed.
  • npm run docs:sync-agent-variants — passed.
  • npm run docs — 0 errors; 2 pre-existing hidden-page warnings.

@coderabbitai

coderabbitai Bot commented Jul 29, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

📝 Walkthrough

Walkthrough

status now verifies managed OpenClaw gateway and host-forward delivery for present Docker-driver sandboxes, retries transient OpenShell readiness states, fails closed when proof is unavailable, and reports recovery failures accurately.

Changes

OpenClaw delivery recovery

Layer / File(s) Summary
OpenShell retry classification
src/lib/actions/sandbox/process-recovery.ts, src/lib/actions/sandbox/process-recovery.test.ts
OpenShell re-registration retries now require the intended stderr failure shape and empty stdout, with coverage for transient phase errors accompanied by informational output.
Managed delivery recovery gate
src/lib/actions/sandbox/status-snapshot.ts, src/lib/actions/sandbox/status-snapshot-recovery.test.ts, test/cli/sandbox-status-json.test.ts
Present Docker-driver OpenClaw sandboxes enter delivery recovery; tests cover successful proof, failed recovery, preserved diagnoses, and isolated VM-based inference route classification.
Recovery failure reporting
src/lib/actions/sandbox/status-lookup-rendering.ts, src/lib/actions/sandbox/status-flow.test.ts, docs/reference/commands.mdx
Status output distinguishes Docker-restored sandboxes from present sandboxes with unproven delivery chains, and the reference documents gateway and forward verification.

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

Sequence Diagram(s)

sequenceDiagram
  participant StatusCommand
  participant collectSandboxStatusSnapshot
  participant recoverSandboxProcesses
  participant InferenceGatewayProbe
  StatusCommand->>collectSandboxStatusSnapshot: collect status
  collectSandboxStatusSnapshot->>recoverSandboxProcesses: recover OpenClaw gateway and host forward
  recoverSandboxProcesses-->>collectSandboxStatusSnapshot: delivery-chain recovery result
  collectSandboxStatusSnapshot->>InferenceGatewayProbe: probe gateway when delivery is proven
  collectSandboxStatusSnapshot-->>StatusCommand: present or recovery failure
Loading

Possibly related PRs

  • NVIDIA/NemoClaw#7641: Both changes use Docker-driver recovery results and failure handling in sandbox status recovery.
  • NVIDIA/NemoClaw#7650: Both changes modify OpenShell readiness and re-registration retry classification.
  • NVIDIA/NemoClaw#7778: Both changes address Docker-driver post-reboot recovery, delivery verification, and fail-closed status handling.

Suggested labels: v0.0.98, integration: openclaw, bug-fix, area: cli, area: sandbox

Suggested reviewers: cv, cjagwani

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Linked Issues check ✅ Passed The changes restore or fail closed on post-reboot OpenClaw delivery-chain recovery and add focused regression coverage for #7824.
Out of Scope Changes check ✅ Passed The diff stays focused on sandbox status recovery, rendering, docs, and regression tests for the linked issue.
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly summarizes the main change: improving status recovery for visible post-reboot sandboxes.
✨ Finishing Touches 💡 1
📝 Generate docstrings 💡
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch codex/issue-7824-recovery-fix

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

@github-code-quality

github-code-quality Bot commented Jul 29, 2026

Copy link
Copy Markdown
Contributor

Code Coverage Overview

Languages: TypeScript

TypeScript / code-coverage/plugin

The overall coverage in commit caeacc1 in the codex/issue-7824-rec... branch remains at 96%, unchanged from commit 41d8d55 in the main branch.

TypeScript / code-coverage/cli

The overall coverage in commit caeacc1 in the codex/issue-7824-rec... branch remains at 81%, unchanged from commit 41d8d55 in the main branch.

Show a code coverage summary of the most impacted files.
File main 41d8d55 codex/issue-7824-rec... caeacc1 +/-
src/lib/onboard/docker-cdi.ts 80% 70% -10%
src/lib/onboard...host-anchors.ts 94% 90% -4%
src/lib/actions...eway-restart.ts 95% 94% -1%
src/lib/onboard/preflight.ts 80% 80% 0%
src/lib/actions...light-guards.ts 86% 90% +4%
src/lib/onboard...box-gpu-mode.ts 92% 97% +5%
src/lib/actions...confirmation.ts 69% 79% +10%
src/lib/actions...ocker-health.ts 65% 82% +17%
src/lib/onboard...box-prebuild.ts 74% 92% +18%
src/lib/onboard...flight-ports.ts 33% 67% +34%

Updated July 29, 2026 21:31 UTC

@github-actions

Copy link
Copy Markdown
Contributor

@github-actions

github-actions Bot commented Jul 29, 2026

Copy link
Copy Markdown
Contributor

PR Review Advisor — No blocking findings reported

Advisor assessment: No blocking advisor findings reported
Next action: Review the warnings below.
Findings: 0 blockers · 1 warning · 0 suggestions

Model lanes

  • GPT-5.6 Terra (primary): Completed · high confidence · 0 blockers · 1 warning · 0 suggestions
  • Nemotron 3 Ultra (second opinion): Failed after a partial review · low confidence · 2 blockers · 1 warning · 0 suggestions

Nemotron output stays in workflow artifacts and does not change the assessment above.

E2E guidance

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

Recommended E2E: onboard-repair, onboard-resume, state-backup-restore, upgrade-stale-sandbox, ubuntu-repo-docker-post-reboot-recovery

1 warning · 0 suggestions

Warnings

Warnings do not block.

PRA-1 Warning — Document the markerless recovery workaround boundary

  • Location: src/lib/actions/sandbox/status-snapshot.ts:426
  • Category: correctness
  • Problem: The new markerless-Ready recovery path handles an OpenShell state where a Docker/OpenClaw sandbox is reported Ready while its managed gateway or host forward is absent. Its comment identifies the invalid state, but does not explain why the OpenShell state source cannot be corrected in this change or when this status-side workaround can be removed.
  • Impact: Future changes can preserve or broaden a status-side workaround after the upstream readiness contract changes, obscuring the authoritative source of delivery state.
  • Recommendation: Extend the recovery-gate comment to name the OpenShell readiness-contract limitation, why it cannot be fixed here, and the condition that permits removing this markerless recovery path.
  • Verification: Read the comment and recovery gate at status-snapshot.ts:417-454; confirm it states the external source limitation and a concrete removal condition.
  • Test coverage: Existing tests in status-snapshot-recovery.test.ts cover the visible Ready state and fail-closed recovery result; no additional behavior test is required for this documentation-only correction.
  • Evidence: src/lib/actions/sandbox/status-snapshot.ts:417-454 gates recovery on a present Docker/OpenClaw sandbox with parsed phase Ready and documents the absent gateway/forward state. src/lib/actions/sandbox/status-snapshot-recovery.test.ts:76-120 covers the markerless Ready recovery and its fail-closed outcome. The linked issue is contributor-authored context and does not supply a maintainer decision that establishes a permanent workaround.

Workflow run details

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

@jyaunches

Copy link
Copy Markdown
Contributor Author

Sensitive-path security review

Reviewed exact head e8d2f590c51be4890648e591f877206feb8bfb0d against base cd49b2fc1cf40de0e5e215fb1ee4e35e7a404325.

Files reviewed:

  • src/lib/actions/sandbox/status-snapshot.ts
  • src/lib/actions/sandbox/status-lookup-rendering.ts
  • src/lib/actions/sandbox/status-snapshot-recovery.test.ts
  • src/lib/actions/sandbox/status-flow.test.ts
  • docs/reference/commands.mdx

Result: PASS — no security findings.

  1. Secrets and credentials — PASS. No secret material, credential handling, or new environment-variable surface was added. The changed failure detail is normalized and bounded before rendering.
  2. Input validation and injection — PASS. No new external input parser or command construction was added. The new branch only broadens when the existing registered-sandbox recovery routine is invoked.
  3. Authentication and authorization — PASS. No authorization boundary changed. Recovery continues through the existing managed, pinned-container supervisor and registered-sandbox identity checks.
  4. Dependencies and supply chain — PASS. No dependency, lockfile, image, workflow action, or download changed.
  5. Errors, logs, and information exposure — PASS. An unproven gateway or forward becomes the existing nonzero sandbox_recovery_failed state; inference probing is skipped. Output identifies the failed layer without exposing sensitive data.
  6. Cryptography — PASS. No cryptographic behavior changed. Existing managed-recovery nonce and identity mechanisms remain unchanged.
  7. Configuration, network, and headers — PASS. No port, network policy, header, TLS, or configuration default changed. Existing forward ownership and health checks remain authoritative.
  8. Security testing — PASS. Focused tests cover successful markerless recovery, fail-closed recovery failure, suppression of inference probing after failure, truthful recovery rendering, non-Ready phase precedence, and host-preflight precedence. The focused source files passed all 46 tests, and the exact CI-failing Docker-outage integration file passed all 8 tests after rebuilding the CLI.
  9. System and operational security — PASS. Scope is limited to present, Ready Docker/OpenClaw sandboxes with no host preflight failure; Hermes, terminal states, non-Ready states, and Docker/container/port failures are excluded from the markerless path. The existing recovery implementation keeps the healthy path a no-op, rejects occupied or unverifiable forwards, uses bounded waits, pins recreated-container identity, and runs under the timer-bound sandbox mutation lock.

Validation evidence:

  • npm exec -- vitest run --project cli src/lib/actions/sandbox/status-snapshot-recovery.test.ts src/lib/actions/sandbox/status-flow.test.ts — 46 tests passed.
  • npm run build:cli followed by npm exec -- vitest run --project integration test/cli/docker-outage.test.ts — 8 tests passed.
  • npm run build:cli — passed.
  • npm run typecheck:cli — passed.
  • npm run validate:pr — passed.
  • npm run docs:sync-agent-variants — passed.
  • npm run docs — 0 errors; 2 pre-existing hidden-page warnings.

@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: 1

🤖 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 `@src/lib/actions/sandbox/status-snapshot-recovery.test.ts`:
- Around line 126-148: The parameterized precedence tests in
src/lib/actions/sandbox/status-snapshot-recovery.test.ts:126-148 must assert
that snapshot output retains `Phase: ${phase}` in addition to the existing
recovery and lookup assertions. The related test at
src/lib/actions/sandbox/status-snapshot-recovery.test.ts:150-172 must assert the
observable preflight behavior, including suppression of the inference-gateway
probe, while preserving its existing expectations.
🪄 Autofix (Beta)

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: 44830d0f-ec06-4938-a003-684a8c5adb43

📥 Commits

Reviewing files that changed from the base of the PR and between 9648fbd and e8d2f59.

📒 Files selected for processing (3)
  • docs/reference/commands.mdx
  • src/lib/actions/sandbox/status-snapshot-recovery.test.ts
  • src/lib/actions/sandbox/status-snapshot.ts
🚧 Files skipped from review as they are similar to previous changes (1)
  • docs/reference/commands.mdx

Comment on lines +126 to +148
it.each([
"Provisioning",
"Failed",
])("keeps the existing %s phase diagnosis ahead of markerless recovery (#7824)", async (phase) => {
const deps = {
...snapshotDeps({
checked: true,
wasRunning: false,
recovered: false,
forwardRecovered: false,
}),
reconcile: () =>
Promise.resolve({
state: "present" as const,
output: `Phase: ${phase}`,
}),
};

const snapshot = await collectSandboxStatusSnapshot("alpha", { deps });

expect(deps.recoverSandboxProcesses).not.toHaveBeenCalled();
expect(snapshot.lookup.state).toBe("present");
});

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.

🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Strengthen the precedence regression assertions.

Both tests currently prove only that recovery was skipped and the lookup remained present; they do not prove that the existing diagnosis or preflight behavior was preserved.

  • src/lib/actions/sandbox/status-snapshot-recovery.test.ts#L126-L148: assert that the output retains Phase: ${phase}.
  • src/lib/actions/sandbox/status-snapshot-recovery.test.ts#L150-L172: assert the observable preflight effect, such as inference-gateway probe suppression.
📍 Affects 1 file
  • src/lib/actions/sandbox/status-snapshot-recovery.test.ts#L126-L148 (this comment)
  • src/lib/actions/sandbox/status-snapshot-recovery.test.ts#L150-L172
🤖 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/actions/sandbox/status-snapshot-recovery.test.ts` around lines 126 -
148, The parameterized precedence tests in
src/lib/actions/sandbox/status-snapshot-recovery.test.ts:126-148 must assert
that snapshot output retains `Phase: ${phase}` in addition to the existing
recovery and lookup assertions. The related test at
src/lib/actions/sandbox/status-snapshot-recovery.test.ts:150-172 must assert the
observable preflight behavior, including suppression of the inference-gateway
probe, while preserving its existing expectations.

Source: Path instructions

@jyaunches

Copy link
Copy Markdown
Contributor Author

Sensitive-path security review

Reviewed exact head b7c47f87882e1568e54c86c28b99baf81c417f06 against base cd49b2fc1cf40de0e5e215fb1ee4e35e7a404325.

Files reviewed:

  • src/lib/actions/sandbox/status-snapshot.ts
  • src/lib/actions/sandbox/status-lookup-rendering.ts
  • src/lib/actions/sandbox/status-snapshot-recovery.test.ts
  • src/lib/actions/sandbox/status-flow.test.ts
  • test/cli/sandbox-status-json.test.ts
  • docs/reference/commands.mdx

Result: PASS — no security findings.

  1. Secrets and credentials — PASS. No secret material, credential handling, or new environment-variable surface was added. The changed failure detail is normalized and bounded before rendering.
  2. Input validation and injection — PASS. No new external input parser or command construction was added. The new branch only broadens when the existing registered-sandbox recovery routine is invoked.
  3. Authentication and authorization — PASS. No authorization boundary changed. Recovery continues through the existing managed, pinned-container supervisor and registered-sandbox identity checks.
  4. Dependencies and supply chain — PASS. No dependency, lockfile, image, workflow action, or download changed.
  5. Errors, logs, and information exposure — PASS. An unproven gateway or forward becomes the existing nonzero sandbox_recovery_failed state; inference probing is skipped. Output identifies the failed layer without exposing sensitive data.
  6. Cryptography — PASS. No cryptographic behavior changed. Existing managed-recovery nonce and identity mechanisms remain unchanged.
  7. Configuration, network, and headers — PASS. No port, network policy, header, TLS, or configuration default changed. Existing forward ownership and health checks remain authoritative.
  8. Security testing — PASS. Focused tests cover successful markerless recovery, fail-closed recovery failure, suppression of inference probing after failure, truthful recovery rendering, non-Ready phase precedence, and host-preflight precedence. The focused source files passed all 46 tests, the exact CI-failing Docker-outage integration file passed all 8 tests after rebuilding the CLI, and the inference-route JSON fixture passed all 18 tests after being scoped to its intended VM driver.
  9. System and operational security — PASS. Scope is limited to present, Ready Docker/OpenClaw sandboxes with no host preflight failure; Hermes, terminal states, non-Ready states, and Docker/container/port failures are excluded from the markerless path. The existing recovery implementation keeps the healthy path a no-op, rejects occupied or unverifiable forwards, uses bounded waits, pins recreated-container identity, and runs under the timer-bound sandbox mutation lock.

Validation evidence:

  • npm exec -- vitest run --project cli src/lib/actions/sandbox/status-snapshot-recovery.test.ts src/lib/actions/sandbox/status-flow.test.ts — 46 tests passed.
  • npm run build:cli followed by npm exec -- vitest run --project integration test/cli/docker-outage.test.ts — 8 tests passed.
  • npm exec -- vitest run --project integration test/cli/sandbox-status-json.test.ts — 18 tests passed.
  • npm run build:cli — passed.
  • npm run typecheck:cli — passed.
  • npm run validate:pr — passed.
  • npm run docs:sync-agent-variants — passed.
  • npm run docs — 0 errors; 2 pre-existing hidden-page warnings.

Signed-off-by: Julie Yaunches <jyaunches@nvidia.com>
@jyaunches

Copy link
Copy Markdown
Contributor Author

Exact-head security review — caeacc1

Verdict: PASS. No security findings. The change remains fail-closed: it retries only the exact same-sandbox OpenShell phase Error refusal for the read-only true probe, while all broader transient signatures still require empty stdout and all unrelated failures remain terminal.

  1. Secrets and credentials — PASS: no credentials, tokens, keys, or secret-bearing fixtures added.
  2. Input validation and sanitization — PASS: the retry match requires exit status 1, no spawn error, nonempty stderr, and exact normalized text containing the requested sandbox name and phase Error; no new parsing, shell interpolation, path handling, SSRF, or user-input execution was added.
  3. Authentication and authorization — PASS: no auth boundary or resource authorization changed.
  4. Dependencies and third-party libraries — PASS: no dependency or supply-chain changes.
  5. Error handling and logging — PASS: recovery still returns a sanitized, nonzero sandbox_recovery_failed result when readiness cannot be proven; no sensitive output is newly logged.
  6. Cryptography and data protection — PASS: no cryptographic or protected-data behavior changed.
  7. Configuration and security headers — PASS: no container, policy, port, CORS, CSP, privilege, or runtime configuration changed.
  8. Security testing — PASS: added a regression test for informational stdout plus the exact same-sandbox refusal; existing tests retain terminal handling for another sandbox, another phase, and unrelated OpenShell errors.
  9. System security — PASS: the managed-health guard runs before every retry, the probe is read-only true, the retry budget remains bounded, and the patch does not bypass OpenShell or start forwarding before OpenShell returns success.

Files reviewed: docs/reference/commands.mdx; src/lib/actions/sandbox/process-recovery.ts and its test; status-snapshot.ts and recovery tests; status-lookup-rendering.ts; status-flow.test.ts; test/cli/sandbox-status-json.test.ts.

Evidence: exact-head diff and all changed files reviewed; git diff --check passed; process-recovery 43/43 passed; CLI type-check passed; commit hooks passed; GitHub verification is valid.

@cv
cv merged commit 795de98 into main Jul 29, 2026
115 of 122 checks passed
@cv
cv deleted the codex/issue-7824-recovery-fix branch July 29, 2026 21:59
@sandl99 sandl99 mentioned this pull request Jul 30, 2026
23 tasks
cv pushed a commit that referenced this pull request Jul 30, 2026
<!-- markdownlint-disable MD041 -->
## Summary

Add the canonical pre-tag release entry for NemoClaw v0.0.98.
The dated entry records the user-visible changes merged after v0.0.97
and links each release theme to its published documentation.

## Changes

- Add `docs/changelog/2026-07-29.mdx` with the exact `## v0.0.98`
release heading.
- Summarize Hermes 0.19, Deep Agents Code automation and skill safety,
readiness diagnostics, lifecycle recovery, uninstall behavior, messaging
conflicts, dependency hardening, and bounded diagnostics.
- Use the parser-safe MDX SPDX comment and root-absolute routes for
published OpenClaw, Hermes, and Deep Agents documentation.

### Source summary

- [#7849](#7849) ->
`docs/changelog/2026-07-29.mdx`: Record the Hermes 0.19 runtime
migration repairs for cron state, dashboard seeding, and MCP naming.
- [#7662](#7662) ->
`docs/changelog/2026-07-29.mdx`: Record bounded gateway and Docker
subprocess diagnostics.
- [#7850](#7850) ->
`docs/changelog/2026-07-29.mdx`: Record verified no-clobber Deep Agents
Code skill installation.
- [#7848](#7848) ->
`docs/changelog/2026-07-29.mdx`: Record post-reboot delivery-chain
recovery for visible OpenClaw sandboxes.
- [#7831](#7831) ->
`docs/changelog/2026-07-29.mdx`: Record OpenShell gateway-state
preservation during uninstall.
- [#7827](#7827) ->
`docs/changelog/2026-07-29.mdx`: Record the removal of upstream test
sources from published Hermes images.
- [#7775](#7775) ->
`docs/changelog/2026-07-29.mdx`: Record the blocking diagnostic for
unsupported `DOCKER_HOST` values.
- [#7833](#7833) ->
`docs/changelog/2026-07-29.mdx`: Record reviewed Python dependency
baselines for Hermes and Deep Agents Code images.
- [#7771](#7771) ->
`docs/changelog/2026-07-29.mdx`: Record the managed Hermes Agent 0.19.0
upgrade.
- [#7811](#7811) ->
`docs/changelog/2026-07-29.mdx`: Record fail-closed messaging channel
conflict handling.
- [#7797](#7797) ->
`docs/changelog/2026-07-29.mdx`: Record the managed non-interactive Deep
Agents Code JSON envelope.
- [#7782](#7782) ->
`docs/changelog/2026-07-29.mdx`: Record the storage-remediation
readiness capability.
- [#7784](#7784) ->
`docs/changelog/2026-07-29.mdx`: Record the 120-second OpenShell
readiness budget for sandbox recreation.
- [#7810](#7810) ->
`docs/changelog/2026-07-29.mdx`: Record rejection of stale Deep Agents
Code security inventories.

## 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
- [x] Existing tests cover changed behavior — justification:
`test/changelog-docs.test.ts` validates the native changelog contract,
including the version heading, MDX SPDX comment, and published routes.
- [ ] Tests not applicable — justification:
- [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: `docs/changelog/2026-07-29.mdx` was reviewed against
`docs/CONTRIBUTING.md` and `WRITING.md` for release meaning,
terminology, structure, voice, sentence form, MDX structure, published
routes, and code-sample presentation. The changelog contract passed 6
tests. The docs build completed with 0 errors and 2 existing Fern
warnings.
- Agent: Codex CLI
<!-- docs-review-head-sha: e3221d1 -->
<!-- docs-review-agents-blob-sha: c052d60 -->

## DGX Station Hardware Evidence

- [ ] Tested on DGX Station
- Tested commit: Not applicable. `scripts/prepare-dgx-station-host.sh`
is unchanged.
- 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
test/changelog-docs.test.ts` passed 6 tests.
- [ ] Applicable broad gate passed — `npm test` for broad
runtime/test-harness changes; `npm run check` for repo-wide
validation/coverage changes — command/result: Not run for this
documentation-only change.
- [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) — The
build 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)
- [ ] New doc pages include SPDX header and frontmatter (new pages only)
— Native changelog entries use the required parser-safe MDX SPDX comment
and do not use frontmatter.

---
Signed-off-by: San Dang <sdang@nvidia.com>


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

## Summary by CodeRabbit

- **New Features**
- Added managed Hermes upgrades with verified releases, version
reporting, and preserved configuration contracts.
- Improved Deep Agents Code JSON output and skill installation behavior.
  - Added clearer Docker host and system readiness reporting.
  - Improved post-reboot delivery recovery and sandbox readiness timing.
- **Bug Fixes**
  - Preserved gateway state when uninstalling with `--keep-openshell`.
- Prevented conflicting messaging credentials from blocking onboarding
and rebuilds.
- Improved gateway diagnostics, dependency security, runtime filesystem
protection, and evidence handling.
- **Documentation**
  - Published the v0.0.98 release notes.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
senthilr-nv added a commit that referenced this pull request Jul 31, 2026
#7947)

<!-- markdownlint-disable MD041 -->
## Summary

Documents the user-facing changes identified by the `v0.0.96..v0.0.97`
post-tag audit and publishes the existing agentic-documentation guide in
each documentation variant. Replaces repository-local DORI contributor
classification state with current-host capability detection so fresh
worktrees do not repeatedly prompt users. Links the internal Skill
Library and Template Library for explicit setup requests. Adds the
bounded `v0.0.98..v0.0.99` audit follow-ups for changelog accuracy,
memory-search prerequisites, two-DGX Station route verification, and
prose clarity.

## Changes

- Document the `invalid_docker_host` recovery procedure from #7775 and
the `sandbox_recovery_failed` state from #7848.
- Move Deep Agents runtime, automation, supervision, approval, and
identity guidance from the quickstart to a focused operation page while
preserving the existing anchor.
- Publish the existing
`docs/resources/engineer-agentic-documentation.mdx` page under Resources
in all guide variants and align its route description with the live TOC.
- Add rendered-page route tests for the Deep Agents operation page,
compatibility anchor, and agentic-documentation routes.
- Select the DORI documentation workflow from current host capabilities.
Use the checked-in writing guide when the verified NVIDIA Skill Library
is unavailable, and reserve DORI setup for explicit installation or
configuration requests.
- Link the NVIDIA Skill Library and Template Library from the DORI setup
guide with their distinct installation roles.
- Correct the Hermes dependency-review punctuation identified by the
audit.
- Correct the `v0.0.99` changelog attribution for the focused runtime
identity, two-DGX Station vLLM, and memory search pages.
- State the already-running Ollama embedding prerequisite and
`/api/tags` acceptance criterion for memory search.
- Add post-install route and runtime verification for the two-DGX
Station vLLM procedure, including the limits of the `reachable` status.
- Split dense Microsoft Entra and Hermes configuration-root explanations
without changing their supported behavior or information architecture.
- Reserve `sandbox_recovery_failed` guidance for an unproven agent
delivery chain and keep Docker readiness failures under their separate
preflight layers.

## 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:
- [ ] 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: Reviewed the full effective 17-file PR diff, including
`.gitignore`, `AGENTS.md`, `docs/AGENTS.md`, `docs/DORI_SETUP.md`,
`docs/index.yml`, `docs/changelog/2026-07-30.mdx`,
`docs/configure-agents/configure-memory-search.mdx`,
`docs/get-started/quickstart-langchain-deepagents-code.mdx`,
`docs/inference/set-up-vllm-on-two-dgx-stations.mdx`,
`docs/manage-sandboxes/run-deep-agents-code.mdx`,
`docs/reference/commands.mdx`,
`docs/reference/configure-runtime-identity.mdx`,
`docs/reference/troubleshooting.mdx`,
`docs/resources/engineer-agentic-documentation.mdx`,
`docs/security/hermes-0.19.0-dependency-review.md`,
`scripts/check-docs-published-routes.mts`, and
`test/check-docs-published-routes.test.ts`. The independent reviewer
checked product scope, writing rules, documentation style, terminology,
structure, voice, code samples, prerequisites, risks, navigation,
routes, guide variants, and source-backed technical claims. The headless
mutation warning now precedes the first `dcode -n` command. Plugin build
passed; the focused six-file Vitest suite passed 88 tests; `npm run
docs` passed with 65 guarded routes and 0 Fern errors. Final result:
PASS on `d65f1793`.
- Agent: Codex Desktop
<!-- docs-review-head-sha: d65f179 -->
<!-- docs-review-agents-blob-sha: 3dd7c24 -->

## DGX Station Hardware Evidence

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

## 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
test/changelog-docs.test.ts test/station-doc-ownership.test.ts
test/inference-options-docs.test.ts test/check-docs-links.test.ts
test/sync-agent-variant-docs.test.ts` passed 58 tests on the reviewed
head.
- [ ] Applicable broad gate passed — `npm test` for broad
runtime/test-harness changes; `npm run check` for repo-wide
validation/coverage changes — not applicable because this PR does not
change runtime behavior or repository-wide validation.
- [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) — it
passed with 0 errors and the existing Fern CLI upgrade warning.
- [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)

---
Signed-off-by: Miyoung Choi <miyoungc@nvidia.com>


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

- **Documentation**
- Added a comprehensive guide for running Deep Agents Code in managed
sandboxes, including interactive, headless, JSON, approval, and
troubleshooting workflows.
- Added navigation links for Deep Agents, OpenClaw, and Hermes
resources.
- Simplified the Deep Agents quickstart and linked to the dedicated
runtime guide.
  - Updated command references and documented recovery status handling.
- Added guidance for resolving invalid Docker host configuration errors.
  - Clarified documentation routing and setup guidance.

- **Tests**
  - Added coverage to validate published documentation routes and links.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->

---------

Signed-off-by: Miyoung Choi <miyoungc@nvidia.com>
Signed-off-by: Senthil Ravichandran <senthilr@nvidia.com>
Co-authored-by: Senthil Ravichandran <senthilr@nvidia.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bug-fix PR fixes a bug or regression integration: openclaw OpenClaw integration behavior

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Post-reboot recovery leaves OpenClaw gateway stopped after status reports success

4 participants