Skip to content

fix(sandbox): re-establish gateway pairing after cross-sandbox snapshot restore - #7437

Merged
prekshivyas merged 17 commits into
mainfrom
fix/snapshot-restore-gateway-pairing
Jul 24, 2026
Merged

fix(sandbox): re-establish gateway pairing after cross-sandbox snapshot restore#7437
prekshivyas merged 17 commits into
mainfrom
fix/snapshot-restore-gateway-pairing

Conversation

@laitingsheng

@laitingsheng laitingsheng commented Jul 23, 2026

Copy link
Copy Markdown
Contributor

Summary

A sandbox created by a cross-sandbox snapshot restore (snapshot restore --to <new>) started without gateway device credentials, so its first openclaw agent run failed with GatewayCredentialsRequiredError. Device identity and pairing tokens are deliberately never captured into snapshots, and — unlike onboard — the restore path never re-established them before handoff. The restore path now runs the same pairing finalisation onboard runs, so a restored destination holds working gateway credentials and its agent runs immediately.

Related Issue

Fixes #7431

Changes

  • src/lib/actions/sandbox/snapshot.ts: after a successful OpenClaw cross-sandbox restore, invoke gateway pairing establishment for the freshly created destination. Hermes and Deep Agents destinations skip the OpenClaw-only step; self-restore remains untouched.
  • src/lib/actions/sandbox/restore-gateway-pairing.ts: orchestrates the onboard warm-up, auto-pair approval, and strict authenticated verification sequence. Failures propagate so restore exits nonzero with repair guidance.
  • src/lib/adapters/openshell/restore-gateway-pairing.ts (new): owns the OpenShell process boundary for the authenticated verification run, with a 30-second timeout and embedded/fallback transport rejection.\n- src/lib/adapters/openshell/restore-gateway-pairing.test.ts and src/lib/actions/sandbox/restore-gateway-pairing.test.ts: cover success, nonzero exit, timeout, missing executable, spawn failure, orchestration order, and propagated failures.
  • src/lib/actions/sandbox/snapshot-restore-lifecycle.test.ts: asserts a cross-sandbox restore establishes and verifies pairing, verification failure returns repair guidance, and a self-restore does not touch credentials.

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: maintainer-reviewed. Pairing remains cross-sandbox only, reuses the existing allowlisted warm-up and approval primitives, and now verifies authenticated gateway use without exposing tokens. Runtime authentication state remains excluded from snapshots, self-restores remain untouched, and verification failure exits nonzero with repair guidance.
  • 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/manage-sandboxes/backup-restore.mdx documents authenticated OpenClaw pairing verification after cross-sandbox restore, retained restored state on verification failure, the nonzero result, and the exact connect recovery command.
  • Agent: Codex Desktop
  • PR: fix(sandbox): re-establish gateway pairing after cross-sandbox snapshot restore #7437

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 check:diff passed when hooks were skipped or unavailable
  • Targeted behavior tests pass for the current change set, or tests are marked not applicable above — command/result or justification: snapshot and pairing adapter/action suites → 7 files / 91 tests pass; npm run typecheck:cli, npm run checks, and npm run check:diff pass.
  • Applicable broad gate passed — npm test for broad runtime/test-harness changes; npm run check for repo-wide validation/coverage changes — command/result: not applicable; the change is a localised sandbox action fix, not a broad runtime/test-harness or repo-wide validation change.
  • 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: Tinson Lai tinsonl@nvidia.com

Summary by CodeRabbit

  • New Features
    • Restoring a snapshot into a different sandbox now automatically performs gateway pairing for the destination, including warmup, approval, and authenticated verification.
    • Restoring into the same sandbox preserves existing gateway credentials and skips pairing.
  • Bug Fixes
    • If gateway pairing verification fails during restoration, the restore now stops with a clear error and retry guidance (e.g., run the destination connect command).
  • Tests
    • Added/expanded tests covering pairing call order, propagated failure behavior, and snapshot-restore integration for cross- vs self-restore scenarios.
  • Documentation
    • Updated backup/restore guidance to explain destination pairing behavior and what happens when verification fails.

…ot restore

A destination created by a cross-sandbox restore starts without device
identity or pairing tokens, which are never captured into snapshots. Run the
onboard warm-up and auto-pair approval on that path so the restored sandbox
holds working gateway credentials before handoff, matching the fresh-onboard
fallback. Self-restore keeps its live credentials untouched.

Signed-off-by: Tinson Lai <tinsonl@nvidia.com>
@coderabbitai

coderabbitai Bot commented Jul 23, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

Snapshot restoration now establishes and verifies gateway pairing for newly created destination sandboxes. Cross-sandbox restores run pairing after reconciliation, while self-restores skip it. Pairing and verification failures propagate with retry guidance.

Changes

Restored gateway pairing

Layer / File(s) Summary
Gateway pairing helper
src/lib/actions/sandbox/restore-gateway-pairing.ts, src/lib/actions/sandbox/restore-gateway-pairing.test.ts
Adds gateway verification constants, sandbox-execution verification, dependency wiring, ordered warmup/approval/verification, enriched errors, and unit coverage.
Snapshot restore integration
src/lib/actions/sandbox/snapshot.ts, src/lib/actions/sandbox/snapshot-restore-lifecycle.test.ts, src/lib/actions/sandbox/snapshot-restore-test-fixture.ts, src/lib/actions/sandbox/snapshot.test.ts
Runs pairing after cross-sandbox restore reconciliation, reports verification failures as command errors, skips self-restore pairing, and mocks the helper in snapshot tests.
Restore behavior documentation
docs/manage-sandboxes/backup-restore.mdx
Documents destination pairing preservation, authenticated verification, nonzero failures, and retrying with connect.

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

Sequence Diagram(s)

sequenceDiagram
  participant SnapshotRestore
  participant PairingHelper
  participant ScopeWarmup
  participant ScopeApproval
  participant GatewayVerification

  SnapshotRestore->>PairingHelper: cross-sandbox restore completed
  PairingHelper->>ScopeWarmup: warm up scope upgrade
  ScopeWarmup-->>PairingHelper: completion
  PairingHelper->>ScopeApproval: approve scope pairing
  ScopeApproval-->>PairingHelper: completion
  PairingHelper->>GatewayVerification: execute authenticated verification
  GatewayVerification-->>PairingHelper: success or failure
  PairingHelper-->>SnapshotRestore: complete or raise retryable command error
Loading

Suggested labels: integration: openclaw

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Linked Issues check ✅ Passed The changes address #7431 by automatically re-pairing cross-sandbox restores so restored sandboxes regain gateway credentials.
Out of Scope Changes check ✅ Passed The added verification, tests, and documentation all support the restore-pairing fix and do not introduce unrelated scope.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly summarizes the main change: restoring gateway pairing after cross-sandbox snapshot restores.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch fix/snapshot-restore-gateway-pairing

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

@laitingsheng laitingsheng added NV QA Bugs found by the NVIDIA QA Team area: sandbox OpenShell sandbox lifecycle, runtime, config, or recovery bug-fix PR fixes a bug or regression labels Jul 23, 2026
@github-code-quality

github-code-quality Bot commented Jul 23, 2026

Copy link
Copy Markdown
Contributor

Code Coverage Overview

Languages: TypeScript

TypeScript / code-coverage/plugin

The overall coverage in commit 63e83b3 in the fix/snapshot-restore... branch remains at 96%, unchanged from commit 3f65c23 in the main branch.


Updated July 24, 2026 03:34 UTC

@github-actions

github-actions Bot commented Jul 23, 2026

Copy link
Copy Markdown
Contributor

PR Review Advisor — Informational

Advisor assessment: Informational / medium confidence
Next action: No advisor follow-up needed.
Findings: 0 blockers · 0 warnings · 0 suggestions
Status: No actionable findings remain in the canonical review ledger.

Model lanes

  • GPT-5.6 Terra (primary): Completed · medium confidence · 0 blockers · 0 warnings · 0 suggestions
  • Nemotron 3 Ultra (second opinion): Failed after a partial review · low confidence · 0 blockers · 12 warnings · 1 suggestion

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

3 optional E2E recommendations
  • snapshot-commands
  • rebuild-openclaw
  • issue-4462-scope-upgrade-approval

Workflow run details

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

@prekshivyas prekshivyas self-assigned this Jul 23, 2026
Signed-off-by: Prekshi Vyas <prekshiv@nvidia.com>
Signed-off-by: Prekshi Vyas <prekshiv@nvidia.com>
@github-actions

Copy link
Copy Markdown
Contributor

Signed-off-by: Prekshi Vyas <prekshiv@nvidia.com>
Signed-off-by: Prekshi Vyas <prekshiv@nvidia.com>

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🤖 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/restore-gateway-pairing.test.ts`:
- Line 38: Append the final issue-reference suffix "(`#7431`)" to the test titles
at src/lib/actions/sandbox/restore-gateway-pairing.test.ts lines 38, 56, and 66,
and at src/lib/actions/sandbox/snapshot-restore-lifecycle.test.ts line 240,
preserving the existing title text.

In `@src/lib/actions/sandbox/restore-gateway-pairing.ts`:
- Around line 44-68: Move OpenShell resolution and spawnSync execution from
verifyRestoredSandboxGatewayPairing into a dedicated adapter, then have the
action delegate gateway verification through that adapter. In
src/lib/actions/sandbox/restore-gateway-pairing.ts lines 44-68, retain the
action’s orchestration and boolean outcome contract. In
src/lib/actions/sandbox/restore-gateway-pairing.test.ts lines 66-74, mock the
adapter and replace RESTORE_GATEWAY_PAIRING_VERIFY_SCRIPT text assertions with
coverage for successful verification, failed verification, and timeout behavior.
🪄 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: 0c246b91-80a2-48e2-82fc-a4a377fe155b

📥 Commits

Reviewing files that changed from the base of the PR and between bdf1fd6 and b2a6780.

📒 Files selected for processing (5)
  • docs/manage-sandboxes/backup-restore.mdx
  • src/lib/actions/sandbox/restore-gateway-pairing.test.ts
  • src/lib/actions/sandbox/restore-gateway-pairing.ts
  • src/lib/actions/sandbox/snapshot-restore-lifecycle.test.ts
  • src/lib/actions/sandbox/snapshot.ts
🚧 Files skipped from review as they are similar to previous changes (2)
  • docs/manage-sandboxes/backup-restore.mdx
  • src/lib/actions/sandbox/snapshot.ts

Comment thread src/lib/actions/sandbox/restore-gateway-pairing.test.ts Outdated
Comment thread src/lib/actions/sandbox/restore-gateway-pairing.ts Outdated
Signed-off-by: Prekshi Vyas <prekshiv@nvidia.com>

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick comments (1)
src/lib/actions/sandbox/snapshot-restore-lifecycle.test.ts (1)

194-295: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Add the #7431 issue-reference suffix to the new test titles.

This whole suite exists to fix issue #7431 (gateway credentials missing after cross-sandbox restore), but none of the new describe/it titles carry the (#1234) suffix required by the coding guideline.

As per coding guidelines, **/*.test.{js,ts}: "Use behavior-oriented test titles and place local issue references in a final (#1234) suffix."

✏️ Suggested title update
-describe("runSandboxSnapshot restore: gateway pairing on a freshly created destination", () => {
+describe("runSandboxSnapshot restore: gateway pairing on a freshly created destination (`#7431`)", () => {
🤖 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/snapshot-restore-lifecycle.test.ts` around lines 194
- 295, Append the issue-reference suffix "(`#7431`)" to the new describe and it
titles in the runSandboxSnapshot restore suite. Keep the existing
behavior-oriented wording unchanged and place the suffix at the end of each
title, including the self-restore test.

Source: Coding guidelines

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Nitpick comments:
In `@src/lib/actions/sandbox/snapshot-restore-lifecycle.test.ts`:
- Around line 194-295: Append the issue-reference suffix "(`#7431`)" to the new
describe and it titles in the runSandboxSnapshot restore suite. Keep the
existing behavior-oriented wording unchanged and place the suffix at the end of
each title, including the self-restore test.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: 602bfdcb-de87-482e-bc55-2d4a736cf628

📥 Commits

Reviewing files that changed from the base of the PR and between b2a6780 and 5ebdc36.

📒 Files selected for processing (2)
  • src/lib/actions/sandbox/snapshot-restore-lifecycle.test.ts
  • src/lib/actions/sandbox/snapshot-restore-test-fixture.ts

Signed-off-by: Prekshi Vyas <prekshiv@nvidia.com>
Signed-off-by: Prekshi Vyas <prekshiv@nvidia.com>
Signed-off-by: Prekshi Vyas <prekshiv@nvidia.com>
Signed-off-by: Prekshi Vyas <prekshiv@nvidia.com>

@prekshivyas prekshivyas left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Approved at exact head af4fc2d after the maintainer gate passed: current-base CI and selected E2E are green, mergeable, DCO/Verified complete, and no unresolved major review findings remain.

@prekshivyas
prekshivyas merged commit bf3471d into main Jul 24, 2026
73 of 78 checks passed
@prekshivyas
prekshivyas deleted the fix/snapshot-restore-gateway-pairing branch July 24, 2026 03:40
prekshivyas added a commit that referenced this pull request Jul 24, 2026
<!-- markdownlint-disable MD041 -->
## Summary

This PR adds the canonical dated release entry for NemoClaw v0.0.94
before the tag is cut.
The entry reconciles all 26 commits since v0.0.93 and links each
user-visible change to its owning documentation.

## Changes

- Add `docs/changelog/2026-07-24.mdx` with the exact `## v0.0.94`
heading, parser-safe SPDX comment, release summary, and detailed
bullets.
- Record sandbox restore and update behavior, onboarding and inference
changes, network policy behavior, security evidence, Hermes build
performance, DGX Station guidance, and E2E validation changes.
- Preserve `docs/` as the source of truth without changing the AI-agent
documentation routing skill.
- Use [E2E run
30075443016](https://github.com/NVIDIA/NemoClaw/actions/runs/30075443016)
for release QA evidence at exact tested SHA
`04e6dfa883071dda9df429c66e73168e1a995cba`.

### Source summary

- [#7461](#7461) ->
`docs/changelog/2026-07-24.mdx`: Record the ownership-preserving Hermes
image layer reduction and hosted timing comparison.
- [#7460](#7460) ->
`docs/changelog/2026-07-24.mdx`: Record removal of candidate Hermes swap
setup from E2E validation.
- [#7458](#7458) ->
`docs/security/fern-5.80.1-dependency-review.md`,
`docs/changelog/2026-07-24.mdx`: Record the reviewed Fern CLI update.
- [#7457](#7457) ->
`docs/changelog/2026-07-24.mdx`: Record periodic runner-pressure
telemetry.
- [#7455](#7455) ->
`docs/changelog/2026-07-24.mdx`: Record non-blocking absent Fern
previews.
- [#7450](#7450) ->
`docs/changelog/2026-07-24.mdx`: Record stable cancellation handling for
live-test child processes.
- [#7449](#7449) ->
`docs/changelog/2026-07-24.mdx`: Record parallel plugin EXDEV coverage.
- [#7448](#7448) ->
`docs/changelog/2026-07-24.mdx`: Record isolated long-running E2E lanes.
- [#7444](#7444) ->
`docs/changelog/2026-07-24.mdx`: Record exact-head Hermes swap
validation.
- [#7437](#7437) ->
`docs/manage-sandboxes/backup-restore.mdx`,
`docs/changelog/2026-07-24.mdx`: Record gateway pairing and
authenticated verification after cross-sandbox restore.
- [#7436](#7436) ->
`docs/manage-sandboxes/backup-restore.mdx`,
`docs/reference/commands.mdx`, `docs/changelog/2026-07-24.mdx`: Record
selected stale-state cleanup and Hermes virtual-environment access
repair.
- [#7385](#7385) ->
`docs/network-policy/customize-network-policy.mdx`,
`docs/changelog/2026-07-24.mdx`: Record the read-only agent-variant
route check.
- [#7371](#7371) ->
`docs/changelog/2026-07-24.mdx`: Record host-artifact verification for
session exports.
- [#7359](#7359) ->
`docs/changelog/2026-07-24.mdx`: Record platform validation for managed
vLLM model overrides.
- [#7356](#7356) ->
`docs/changelog/2026-07-24.mdx`: Record token-shaped value redaction for
`sandbox doctor --json`.
- [#7354](#7354) ->
`docs/security/advisory-early-warning.md`,
`docs/changelog/2026-07-24.mdx`: Record advisory correlation and
retained audit provenance.
- [#7352](#7352) ->
`docs/network-policy/customize-network-policy.mdx`,
`docs/network-policy/integration-policy-examples.mdx`,
`docs/reference/commands.mdx`, `docs/changelog/2026-07-24.mdx`: Record
preset reapplication and bounded `tls: skip` guidance.
- [#7345](#7345) ->
`docs/security/openclaw-2026.6.10-dependency-review.md`,
`docs/security/openclaw-2026.7.1-dependency-review.md`,
`docs/changelog/2026-07-24.mdx`: Record reviewed npm audit exception
enforcement.
- [#7340](#7340) ->
`docs/network-policy/customize-network-policy.mdx`,
`docs/changelog/2026-07-24.mdx`: Record the repaired CLI-reference
route.
- [#7334](#7334) ->
`docs/get-started/dgx-station-preparation.mdx`,
`docs/changelog/2026-07-24.mdx`: Record the qualified OTA metadata
fallback and narrowed override wording.
- [#7322](#7322) ->
`docs/changelog/2026-07-24.mdx`: Reconcile the gateway source tag added
to plugin registration banners.
- [#7284](#7284) ->
`docs/manage-sandboxes/update-sandboxes.mdx`,
`docs/changelog/2026-07-24.mdx`: Record read-only `upgrade-sandboxes
--check` behavior and recorded-gateway selection.
- [#7277](#7277) ->
`docs/changelog/2026-07-24.mdx`: Reconcile deterministic gateway TCP
refusal coverage.
- [#7234](#7234) ->
`docs/reference/troubleshooting.mdx`, `docs/changelog/2026-07-24.mdx`:
Record preserved DGX Spark managed vLLM Express intent on resume.
- [#7185](#7185) ->
`docs/reference/troubleshooting.mdx`, `docs/changelog/2026-07-24.mdx`:
Record IPv4 fallback DNS selection and exact resolver probing.
- [#6820](#6820) ->
`docs/reference/commands.mdx`, `docs/changelog/2026-07-24.mdx`: Record
the versioned, redacted `--events=jsonl` onboarding stream.

## 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: `npx vitest
run test/changelog-docs.test.ts` passed 6/6 tests.
- [ ] 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-24.mdx`; the writing rules,
documentation style, exact release range, skip terms, published routes,
and product scope were reviewed; the changelog test passed 6/6; `npm run
docs` passed with route checking OK, zero errors, and two existing
warnings.
- Agent: Codex Desktop
<!-- docs-review-head-sha: 65368f9 -->
<!-- docs-review-agents-blob-sha: 9c9b36d -->

## DGX Station Hardware Evidence

- [ ] Tested on DGX Station
- Tested commit: Not applicable
- Station profile/scenario: Not applicable
- Result: Not applicable
- Supporting evidence: Not applicable. This PR does not change
`scripts/prepare-dgx-station-host.sh`.

## 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 check:diff` passed when hooks were skipped or unavailable
- [x] Targeted behavior tests pass for the current change set, or tests
are marked not applicable above — `npx vitest run
test/changelog-docs.test.ts` passed 6/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 applicable to the
dated changelog entry.
- [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 passed with zero errors and two 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 dated changelog entries use the required parser-safe MDX
SPDX comment and no frontmatter.

---
Signed-off-by: Prekshi Vyas <prekshiv@nvidia.com>


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

## Summary by CodeRabbit

* **Documentation**
  * Added the v0.0.94 release changelog.
  * Documented improvements to sandbox snapshot and restore behavior.
* Added updates for gateway selection, policy comparisons, onboarding
event output, and DGX recovery workflows.
* Documented enhanced diagnostics redaction, npm audit provenance, image
assembly performance, and validation stability improvements.


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

Signed-off-by: Prekshi Vyas <prekshiv@nvidia.com>
cv added a commit that referenced this pull request Jul 27, 2026
<!-- markdownlint-disable MD041 -->
## Summary

Cross-sandbox snapshot restore could inspect a gateway-global
pending-device list and approve a different sandbox's request before
verifying the restored clone. After restore, this change restarts and
warms the clone, approves at most one bounded pairing or scope-upgrade
request that matches the clone's local identity, restarts its gateway,
and treats one ordinary authenticated verifier as the sole success
condition.

## Related Issue

Related to #7431 and #4462. Corrects the restore-pairing lifecycle
introduced by #7437.

## Changes

- Keep the established `restart → warm-up → approval → restart →
authenticated verification` sequence to publish approved state before
verification.
- Select only one pending CLI/operator request whose public key and
derived device ID match the restored clone.
- Accept canonical pairing-only requests plus bounded write-scope
initial or repair requests, including OpenClaw's pre-convergence
`isRepair: false`, `scopes: ["operator.write"]` shape; reject malformed,
ambiguous, duplicate, foreign, empty, read-only, noncanonical, or
over-scoped requests.
- Preserve the canonical OpenClaw approval command, stripped gateway
credentials, existing one-request budget, and existing timeouts.
- Remove the former two-cycle retry path; verification runs exactly once
and is the only success condition.
- Classify production and live-test failures with fixed, output-free
values.
- Route the live pairing probe through the clone's sandbox environment
and hermetic inference fixture.
- Require trusted PR E2E planning to include `snapshot-commands` when
restored-gateway pairing production modules change.
- Add focused lifecycle, identity/scope, environment-isolation,
redaction, and risk-plan regressions, including invalid clone identity
and nonrepair write-only cases.

## Type of Change

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

## Quality Gates

- [x] Tests added or updated for changed behavior
- [ ] Existing tests cover changed behavior — justification:
- [ ] Tests not applicable — justification:
- [ ] Docs updated for user-facing behavior changes
- [x] Docs not applicable — justification: This repairs internal clone
pairing selection and restart ordering without changing the documented
snapshot restore contract.
- [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: Independent
exact-final-head nine-category review passed with no findings at
`9f439dfd418d89be4870c4f3378c57af8a530b3c` against `origin/main`
`1bc0283144062b560e7496baa92d3293e4a65089`. It reviewed all 16 changed
files and confirmed accepted product scope, clone-only
environment/inference routing, exact paired device/public-key binding,
bounded canonical scopes, stored `operator.pairing` authorization for
the pre-convergence write request, canonical locked publication, fixed
output-free classifications, and the unchanged one-approval/one-verifier
sequence without retries or longer timeouts.
- [ ] 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: `no-docs-needed`
- Evidence: At exact final head
`9f439dfd418d89be4870c4f3378c57af8a530b3c`, the writer reviewed the
complete 16-file diff. Existing snapshot documentation already defines
automatic clone pairing, ordinary authenticated verification, nonzero
failure, retained restored state, and `connect` recovery. The OpenClaw
`2026.7.1` dependency review already bounds exact CLI/operator
pairing/read/write transitions through stored-device authentication and
canonical fail-closed approval. This internal repair adds no CLI syntax,
flag, configuration, API, schema, policy, or supported workflow, so no
docs, changelog, or docs build is required.
- Agent: Codex Desktop
<!-- docs-review-head-sha: 9f439df -->
<!-- docs-review-agents-blob-sha: be20a09 -->

## 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
published commit appears as `Verified` in GitHub; exact head
`9f439dfd418d89be4870c4f3378c57af8a530b3c` has a valid SSH signature and
DCO trailer, and GitHub reports `verified: true` with reason `valid`.
- [x] Normal `pre-commit`, `commit-msg`, and `pre-push` hooks passed, or
`npm run check:diff` passed when hooks were skipped or unavailable
- [x] Targeted behavior tests pass for the current change set, or tests
are marked not applicable above — command/result or justification: At
exact final head `9f439dfd418d89be4870c4f3378c57af8a530b3c`, 299/299
targeted tests passed: compiled OpenClaw patch regressions 53/53, clone
pairing lifecycle 32/32, snapshot helper 17/17, real pinned OpenClaw
dist proof 6/6, and adjacent
risk/lifecycle/workflow/dependency/provenance suites 191/191. `npm run
typecheck:cli`, `git diff --check`, signed commit hooks, and exact
committed `npm run check:diff` all passed.
- [ ] Applicable broad gate passed — `npm test` for broad
runtime/test-harness changes; `npm run check` for repo-wide
validation/coverage changes — command/result: not applicable to this
focused restore-path repair; affected and exact suites plus `check:diff`
passed.
- [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)
- [ ] 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)

Trusted E2E on exact prior head
`2193b9ea83e001bcca6b92cb6467eda7d835f037` (child run `30249871943`,
snapshot job `89925344542`) failed `snapshot-commands` with fixed
classification `scope-upgrade-pending`; that SHA was not retried.
Trusted E2E on exact prior head
`d2808095c7da86640b29affe911b0600dc5fdb11` (child run `30259361580`,
snapshot job `89955535331`) passed seven selected lanes and failed only
`snapshot-commands` with the same fixed classification; that SHA was not
retried. Trusted E2E on exact prior head
`c45892130795ce1e22143af00046b386bb24ee72` (controller `30263636883`,
child `30263933229`, snapshot job `89970220974`) again passed seven
selected lanes and failed only `snapshot-commands` at restore-to-clone
with fixed classification `command-failure`; its captured verifier layer
was `scope-upgrade-pending`. Retry/reconciliation steps were skipped and
that SHA will not be retried. Trusted E2E on exact prior head
`f2fd8676e156bdd31ca29ec51660a8c9a6d04525` (controller `30269186094`,
child `30269513049`, snapshot job `89988454045`) passed every companion
selected lane and failed only `snapshot-commands` at the first
restore-to-clone phase. Artifact `8654481473`
(`sha256:74af24bfafbc6fa1fb1cf7abe1233a4c1b202d5d70f086c6a9afd77bad154906`)
recorded fixed outer classification `command-failure` and verifier layer
`scope-upgrade-pending`, exit 1 without timeout. Evidence verification
passed, every retry step was skipped, and that SHA will not be retried.
Fresh ordinary gates and automated review must pass on
`9f439dfd418d89be4870c4f3378c57af8a530b3c` before authorizing only its
exact trusted coverage.

---
Signed-off-by: Carlos Villela <cvillela@nvidia.com>

---------

Signed-off-by: Carlos Villela <cvillela@nvidia.com>
Signed-off-by: Apurv Kumaria <akumaria@nvidia.com>
Co-authored-by: Apurv Kumaria <akumaria@nvidia.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area: sandbox OpenShell sandbox lifecycle, runtime, config, or recovery bug-fix PR fixes a bug or regression NV QA Bugs found by the NVIDIA QA Team

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Linux][Sandbox] snapshot restore does not preserve gateway websocket credentials causing agent invocations to fail

3 participants