Skip to content

fix(shields): seal config hash during auto-restore - #5681

Merged
cv merged 8 commits into
mainfrom
fix/4343-shields-autorestore-lockdown
Jun 26, 2026
Merged

fix(shields): seal config hash during auto-restore#5681
cv merged 8 commits into
mainfrom
fix/4343-shields-autorestore-lockdown

Conversation

@ericksoa

@ericksoa ericksoa commented Jun 23, 2026

Copy link
Copy Markdown
Contributor

Summary

  • ensure .config-hash is always part of the shields lock/unlock/verify target set
  • make expired auto-restore/status recovery use the same lock path as explicit shields up
  • add regression coverage for dead-timer inline recovery sealing .config-hash

Fixes #4343

Test plan

  • npm run build:cli
  • ./node_modules/.bin/vitest run src/lib/shields/index.test.ts src/lib/shields/timer.test.ts src/lib/shields/verify-lock.test.ts src/lib/shields/flow.test.ts
  • ./node_modules/.bin/biome lint src/lib/shields/index.ts src/lib/shields/index.test.ts src/lib/shields/flow.test.ts
  • npm run typecheck:cli
  • git diff --check

Local note: the broad test-cli hook was skipped for commit/push after producing unrelated timeout fallout in the full local coverage sweep; remote CI/advisors are the gate.

Summary by CodeRabbit

  • Tests
    • Added coverage for shields status recovery when the inline auto-restore timer PID is missing/expired.
    • Enhanced the shields test harness to allow deterministic, customizable mocked command outputs.
    • Updated inline auto-restore unit tests to use clearer configurable paths for config hashing artifacts.
  • Bug Fixes
    • Strengthened configuration protection by treating the per-config .config-hash artifact as sensitive during unlock/lock and status checks.
    • Improved shields status drift classification and recovery messaging, including baseline acceptance recovery when seals are missing/legacy.

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

coderabbitai Bot commented Jun 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

Adds .config-hash normalization across shields lock, unlock, inspect, verify, and status flows. The test harness now supports custom docker command emulation, and new tests cover dead-timer relock behavior and missing-seal drift messaging.

Changes

Shields .config-hash coverage

Layer / File(s) Summary
.config-hash helpers and normalization call sites
src/lib/shields/index.ts
Adds configHashPath and ensureConfigHashSensitiveFile helpers, then normalizes agent config targets through them in unlock, lock, inspect, repair, snapshot restore, shields down, shields up, and shields status paths so .config-hash participates in permission and seal handling.
shieldsStatus recovery messaging
src/lib/shields/index.ts
Refactors shieldsStatus drift handling to distinguish real hash trust failures from missing-seal and legacy-baseline cases, and prints tailored recovery lines for each outcome.
Flow harness and dead-timer recovery test
src/lib/shields/flow.test.ts
Extends the flow test harness to expose shieldsStatus and accept an optional dockerExecFileSync override, then adds a shieldsStatus test that simulates an expired timer state, records docker commands, and asserts relock, hash updates, timer-file deletion, and expected log output.
Index recovery test updates
src/lib/shields/index.test.ts
Updates the inline recovery test to use named config and hash paths, adjusts the mocked filesystem probes to match those paths, and adds a shieldsStatus drift test for missing seals with the new baseline-rebuild recovery output.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Poem

🐇 I hopped through the lock and sniffed the hash,
.config-hash joined the guarded stash.
Dead timers sighed, then shields stood tall,
With tighter seals and runtime calls. ✨
When seals go missing, the rabbit still knows:
Rebuild the burrow, and steady it glows.

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 25.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title accurately summarizes the main change: sealing the config hash during auto-restore.
Linked Issues check ✅ Passed The changes address #4343 by including .config-hash in lock/unlock/verify flows and adding auto-restore recovery coverage.
Out of Scope Changes check ✅ Passed The code and tests stay focused on shields auto-restore relocking and recovery behavior, with no clear unrelated changes.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch fix/4343-shields-autorestore-lockdown

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

@github-code-quality

github-code-quality Bot commented Jun 23, 2026

Copy link
Copy Markdown
Contributor

Code Coverage Overview

Languages: TypeScript

TypeScript / code-coverage/plugin

The overall coverage in the fix/4343-shields-aut... branch is 96%. Coverage data for the main branch is not yet available.

Show a code coverage summary of the most covered files.
File main fix/4343-shields-aut... 0fc5f07 +/-
nemoclaw/src/se...cret-scanner.ts 100%
nemoclaw/src/commands/slash.ts 100%
nemoclaw/src/li...bprocess-env.ts 100%
nemoclaw/src/bl...eprint/state.ts 98%
nemoclaw/src/onboard/config.ts 98%
nemoclaw/src/bl...int/snapshot.ts 97%
nemoclaw/src/bl...print/runner.ts 95%
nemoclaw/src/co...ration-state.ts 94%
nemoclaw/src/bl...ate-networks.ts 94%
nemoclaw/src/index.ts 94%

TypeScript / code-coverage/cli

The overall coverage in the fix/4343-shields-aut... branch is 47%. Coverage data for the main branch is not yet available.

Show a code coverage summary of the most covered files.
File main fix/4343-shields-aut... 0fc5f07 +/-
src/lib/state/o...oard-session.ts 91%
src/lib/sandbox/config.ts 72%
src/lib/actions...dbox/rebuild.ts 71%
src/lib/onboard/preflight.ts 64%
src/lib/shields/index.ts 62%
src/lib/actions...licy-channel.ts 60%
src/lib/state/sandbox.ts 55%
src/lib/policy/index.ts 49%
src/lib/onboard...er-gpu-patch.ts 44%
src/lib/onboard.ts 19%

Updated June 25, 2026 19:06 UTC
Code Coverage is in Public Preview. Learn more and provide us with your feedback.

@github-actions

github-actions Bot commented Jun 23, 2026

Copy link
Copy Markdown
Contributor

E2E Advisor Recommendation

Required E2E: shields-config-vitest
Optional E2E: network-policy-vitest

Dispatch hint: shields-config-vitest

Workflow run

Full advisor summary

E2E Recommendation Advisor

Base: origin/main
Head: HEAD
Confidence: high

Required E2E

  • shields-config-vitest (high): Required because the source change affects shields security boundaries, sandbox config lock/unlock, policy snapshot restore, and dead auto-restore recovery. This live Vitest job runs the touched shields-config scenario against a real OpenShell/Docker sandbox and directly validates the new .config-hash sealing and inline recovery behavior.

Optional E2E

  • network-policy-vitest (high): Optional adjacent confidence: shields down/up applies permissive policy and restores restrictive snapshots. The dedicated network-policy scenario can catch broader policy-application regressions, but shields-config-vitest is the merge-blocking coverage for this PR.

New E2E recommendations

  • None.

Dispatch hint

  • Workflow: .github/workflows/e2e-vitest-scenarios.yaml
  • jobs input: shields-config-vitest

@github-actions

github-actions Bot commented Jun 23, 2026

Copy link
Copy Markdown
Contributor

Vitest E2E Scenario Recommendation

Required Vitest E2E scenarios: shields-config-vitest
Optional Vitest E2E scenarios: None

Dispatch required Vitest E2E scenarios:

  • gh workflow run e2e-vitest-scenarios.yaml --ref <pr-head-ref> --field jobs=shields-config-vitest

Workflow run

Full Vitest E2E advisor summary

Vitest E2E Scenario Advisor

Base: origin/main
Head: HEAD
Confidence: high

Required Vitest E2E scenarios

  • shields-config-vitest: Focused free-standing Vitest job wired for changed live test test/e2e-scenario/live/shields-config.test.ts.
    • Dispatch: gh workflow run e2e-vitest-scenarios.yaml --ref <pr-head-ref> --field jobs=shields-config-vitest

Optional Vitest E2E scenarios

  • None.

Relevant changed files

  • src/lib/shields/index.ts
  • test/e2e-scenario/live/shields-config.test.ts

@ericksoa ericksoa changed the title Fix shields auto-restore config hash locking fix(shields): seal config hash during auto-restore Jun 23, 2026
@github-actions

github-actions Bot commented Jun 23, 2026

Copy link
Copy Markdown
Contributor

PR Review Advisor — No blocking findings

Merge posture: No blocking advisor findings
Primary next action: Add or justify PRA-T1 and any related test follow-ups.
Open items: 0 required · 0 warnings · 0 suggestions · 1 test follow-up
Since last review: 0 prior items resolved · 0 still apply · 0 new items found

Action checklist

  • PRA-T1 Add or justify test follow-up: Acceptance clause
Test follow-ups to resolve or justify

If these cover changed behavior, prefer adding them in this PR; otherwise state why existing coverage is enough or link the follow-up.

  • PRA-T1 Acceptance clause — 4. Confirm `shields-timer.js` is the child: — add test evidence or identify existing coverage. The E2E does not run `ps`, but production recovery defends this identity boundary with `verifyTimerMarkerIdentity(marker)` before trusting a live PID; tests cover dead PID and wrong-cmdline PID recovery paths.

Workflow run details

This is an automated, non-binding review; it still expects maintainers and agents to respond to each required or warning item. Treat suggestions as current-PR improvements when they touch changed code; defer only with maintainer rationale or a linked follow-up. A human maintainer must make the final merge decision.

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

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
src/lib/shields/index.ts (1)

1465-1497: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

Separate missing .config-hash seals from real content drift.

Line 1465 expands status verification to .config-hash; existing locked states whose fileHashes predate this PR can now emit "no seal recorded" for that path. The current hasHashTrouble branch treats that upgrade case like tamper/unverifiable content, while shieldsUp already supports explicit baseline acceptance for missing seals.

Suggested fix
-        const hasHashTrouble = driftIssues.some(isHashVerificationIssue);
-        if (hasHashTrouble) {
+        const hashIssues = driftIssues.filter(isHashVerificationIssue);
+        const realHashDrift = hashIssues.filter((entry) => !entry.includes("no seal recorded"));
+        const hasMissingSeals = hashIssues.length > realHashDrift.length;
+        if (realHashDrift.length > 0) {
           console.error(
             `  Recovery: restore the original file content from a trusted source, or rebuild the sandbox, then run \`nemoclaw ${sandboxName} shields up\` to re-seal.`,
           );
+        } else if (hasMissingSeals) {
+          console.error("  Recovery: rebuild the sandbox for a known-good baseline,");
+          console.error(
+            `  or set NEMOCLAW_SHIELDS_ACCEPT_LEGACY_BASELINE=1 and re-run \`nemoclaw ${sandboxName} shields up\` to seal the current bytes.`,
+          );
         } else {
           console.error(`  Recovery: nemoclaw ${sandboxName} shields up   # re-lock and re-verify`);
         }
🤖 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/shields/index.ts` around lines 1465 - 1497, The current code treats
all hash-related drift issues the same way, but missing `.config-hash` seals in
pre-existing locked states are an upgrade scenario, not actual tampering.
Separate the logic that identifies hash troubles: create a new check (similar to
isHashVerificationIssue) to specifically detect missing seal issues like "no
seal recorded", then in the recovery branch, differentiate between
hasHashTrouble (actual tamper/unverifiable) and hasMissingSeals (upgrade case).
For missing seals, provide a recovery message that mentions baseline acceptance
via shieldsUp, while keeping the current tamper recovery message for actual hash
troubles.
🤖 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.

Outside diff comments:
In `@src/lib/shields/index.ts`:
- Around line 1465-1497: The current code treats all hash-related drift issues
the same way, but missing `.config-hash` seals in pre-existing locked states are
an upgrade scenario, not actual tampering. Separate the logic that identifies
hash troubles: create a new check (similar to isHashVerificationIssue) to
specifically detect missing seal issues like "no seal recorded", then in the
recovery branch, differentiate between hasHashTrouble (actual
tamper/unverifiable) and hasMissingSeals (upgrade case). For missing seals,
provide a recovery message that mentions baseline acceptance via shieldsUp,
while keeping the current tamper recovery message for actual hash troubles.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: 710e410c-9dd9-4856-9f1e-e37c8c450805

📥 Commits

Reviewing files that changed from the base of the PR and between 6571684 and 0b061da.

📒 Files selected for processing (3)
  • src/lib/shields/flow.test.ts
  • src/lib/shields/index.test.ts
  • src/lib/shields/index.ts

Signed-off-by: Aaron Erickson <aerickson@nvidia.com>
Comment thread src/lib/shields/flow.test.ts Fixed
Comment thread src/lib/shields/flow.test.ts Fixed
ericksoa added 2 commits June 23, 2026 11:30
Signed-off-by: Aaron Erickson <aerickson@nvidia.com>
Signed-off-by: Aaron Erickson <aerickson@nvidia.com>
@wscurran wscurran added area: sandbox OpenShell sandbox lifecycle, runtime, config, or recovery bug-fix PR fixes a bug or regression labels Jun 23, 2026
@wscurran

Copy link
Copy Markdown
Contributor

@jyaunches jyaunches added v0.0.68 and removed v0.0.67 labels Jun 24, 2026
@github-actions

Copy link
Copy Markdown
Contributor

Vitest E2E Scenario Results — ❌ Some jobs failed

Run: 28179520585
Workflow ref: fix/4343-shields-autorestore-lockdown
Requested scenarios: (default — all supported)
Requested jobs: shields-config-vitest
Summary: 0 passed, 1 failed, 0 cancelled, 0 skipped

Job Result
shields-config-vitest ❌ failure

Failed jobs: shields-config-vitest. Check run artifacts for logs.

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

Copy link
Copy Markdown
Contributor

Vitest E2E Scenario Results — ❌ Some jobs failed

Run: 28189236521
Workflow ref: fix/4343-shields-autorestore-lockdown
Requested scenarios: (default — all supported)
Requested jobs: shields-config-vitest
Summary: 0 passed, 1 failed, 0 cancelled, 0 skipped

Job Result
shields-config-vitest ❌ failure

Failed jobs: shields-config-vitest. Check run artifacts for logs.

@github-actions

Copy link
Copy Markdown
Contributor

Vitest E2E Scenario Results — ❌ Some jobs failed

Run: 28189246214
Workflow ref: fix/4343-shields-autorestore-lockdown
Requested scenarios: (default — all supported)
Requested jobs: shields-config-vitest
Summary: 0 passed, 1 failed, 0 cancelled, 0 skipped

Job Result
shields-config-vitest ❌ failure

Failed jobs: shields-config-vitest. Check run artifacts for logs.

@github-actions

Copy link
Copy Markdown
Contributor

Vitest E2E Scenario Results — ✅ All requested jobs passed

Run: 28193762082
Workflow ref: fix/4343-shields-autorestore-lockdown
Requested scenarios: (default — all supported)
Requested jobs: shields-config-vitest
Summary: 1 passed, 0 failed, 0 cancelled, 0 skipped

Job Result
shields-config-vitest ✅ success

@wscurran wscurran added NV QA Bugs found by the NVIDIA QA Team VDR Linked to VDR finding labels Jun 26, 2026
@cv
cv merged commit 0c2c31a into main Jun 26, 2026
110 checks passed
@cv
cv deleted the fix/4343-shields-autorestore-lockdown branch June 26, 2026 04:54
cv pushed a commit that referenced this pull request Jun 29, 2026
## Summary
Adds the v0.0.69 release notes to the published release-notes page so
users can see the shipped sandbox recovery, Deep Agents Code, Hermes,
inference, policy, and release-validation changes.
The section is based on the v0.0.69 announcement and links each
user-facing theme to the deeper docs pages that already cover the
behavior.

## Changes
- Added a new `v0.0.69` section to `docs/about/release-notes.mdx`.
- Linked release-note themes to lifecycle, backup, troubleshooting, Deep
Agents Code, commands, workspace, messaging, Hermes, inference,
security, monitoring, and network-policy docs.

Source summary:
- #5455 -> `docs/about/release-notes.mdx`: Summarized persistent
workspace and state cleanup during sandbox destroy.
- #5738 -> `docs/about/release-notes.mdx`: Summarized nonzero exit
status preservation for failed hosted endpoint validation.
- #5786 -> `docs/about/release-notes.mdx`: Summarized live sandbox
rediscovery when local registry state is missing.
- #5881 -> `docs/about/release-notes.mdx`: Summarized the
`nemo-deepagents` alias command surface.
- #5594 -> `docs/about/release-notes.mdx`: Summarized the Hermes Agent
2026.6.19 update.
- #5777 -> `docs/about/release-notes.mdx`: Summarized manifest-derived
messaging channel support.
- #5825 -> `docs/about/release-notes.mdx`: Summarized DeepSeek V4 Flash
managed-vLLM defaults for DGX Station.
- #5877 -> `docs/about/release-notes.mdx`: Summarized provider switch
metadata preservation.
- #5932 -> `docs/about/release-notes.mdx`: Summarized transient
inference smoke retry behavior.
- #5934 -> `docs/about/release-notes.mdx`: Summarized constrained
inference smoke retry boundaries.
- #5681 -> `docs/about/release-notes.mdx`: Summarized Shields
config-hash sealing during auto-restore.
- #5682 -> `docs/about/release-notes.mdx`: Summarized sandbox connect
process-limit enforcement.
- #5683 -> `docs/about/release-notes.mdx`: Summarized JSON agent failure
provenance warnings.
- #5711 -> `docs/about/release-notes.mdx`: Summarized sparse-source log
breadcrumbs.
- #5838 -> `docs/about/release-notes.mdx`: Summarized host-authoritative
Shields status.
- #5880 -> `docs/about/release-notes.mdx`: Summarized policy round-trip
documentation updates.
- #5886 -> `docs/about/release-notes.mdx`: Summarized network request
approval-flow documentation updates.

## 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: doc-only release-notes
prose; no runtime behavior changed.
- [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:

## Verification
- [x] PR description includes the DCO sign-off declaration and every
commit appears as `Verified` in GitHub
- [x] Git hooks passed during commit and push, or `npx prek run
--from-ref main --to-ref HEAD` passes
- [ ] Targeted tests pass for changed behavior
- [ ] Full `npm test` passes (broad runtime changes only)
- [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)
- [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)

`npm run docs` passed with 0 errors and the existing Fern light-mode
accent contrast warning.
`fern check --warnings` reported the same accent-color warning.

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

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

* **Documentation**
* Added release notes for **v0.0.69**, covering improved sandbox
lifecycle recovery (state preservation across
destroy/recreate/rebuild/recovery/validation failures), clearer Deep
Agents Code terminal/CLI behavior, and safer Hermes messaging/provider
switching with manifest-driven channels.
* Improved inference setup validation guidance, including handling of
local/compatible endpoints and redaction of sensitive validation errors.
* Refreshed release-gate documentation with clearer approval examples
and validation behavior for NVIDIA API keys vs hosted inference keys.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
Hadar301 pushed a commit to Hadar301/NemoClaw-OpenShift that referenced this pull request Jul 12, 2026
## Summary
- ensure `.config-hash` is always part of the shields lock/unlock/verify
target set
- make expired auto-restore/status recovery use the same lock path as
explicit `shields up`
- add regression coverage for dead-timer inline recovery sealing
`.config-hash`

Fixes NVIDIA#4343

## Test plan
- `npm run build:cli`
- `./node_modules/.bin/vitest run src/lib/shields/index.test.ts
src/lib/shields/timer.test.ts src/lib/shields/verify-lock.test.ts
src/lib/shields/flow.test.ts`
- `./node_modules/.bin/biome lint src/lib/shields/index.ts
src/lib/shields/index.test.ts src/lib/shields/flow.test.ts`
- `npm run typecheck:cli`
- `git diff --check`

Local note: the broad `test-cli` hook was skipped for commit/push after
producing unrelated timeout fallout in the full local coverage sweep;
remote CI/advisors are the gate.

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

* **Tests**
* Added coverage for shields status recovery when the inline
auto-restore timer PID is missing/expired.
* Enhanced the shields test harness to allow deterministic, customizable
mocked command outputs.
* Updated inline auto-restore unit tests to use clearer configurable
paths for config hashing artifacts.
* **Bug Fixes**
* Strengthened configuration protection by treating the per-config
`.config-hash` artifact as sensitive during unlock/lock and status
checks.
* Improved `shields status` drift classification and recovery messaging,
including baseline acceptance recovery when seals are missing/legacy.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->

---------

Signed-off-by: Aaron Erickson <aerickson@nvidia.com>
Hadar301 pushed a commit to Hadar301/NemoClaw-OpenShift that referenced this pull request Jul 12, 2026
## Summary
Adds the v0.0.69 release notes to the published release-notes page so
users can see the shipped sandbox recovery, Deep Agents Code, Hermes,
inference, policy, and release-validation changes.
The section is based on the v0.0.69 announcement and links each
user-facing theme to the deeper docs pages that already cover the
behavior.

## Changes
- Added a new `v0.0.69` section to `docs/about/release-notes.mdx`.
- Linked release-note themes to lifecycle, backup, troubleshooting, Deep
Agents Code, commands, workspace, messaging, Hermes, inference,
security, monitoring, and network-policy docs.

Source summary:
- NVIDIA#5455 -> `docs/about/release-notes.mdx`: Summarized persistent
workspace and state cleanup during sandbox destroy.
- NVIDIA#5738 -> `docs/about/release-notes.mdx`: Summarized nonzero exit
status preservation for failed hosted endpoint validation.
- NVIDIA#5786 -> `docs/about/release-notes.mdx`: Summarized live sandbox
rediscovery when local registry state is missing.
- NVIDIA#5881 -> `docs/about/release-notes.mdx`: Summarized the
`nemo-deepagents` alias command surface.
- NVIDIA#5594 -> `docs/about/release-notes.mdx`: Summarized the Hermes Agent
2026.6.19 update.
- NVIDIA#5777 -> `docs/about/release-notes.mdx`: Summarized manifest-derived
messaging channel support.
- NVIDIA#5825 -> `docs/about/release-notes.mdx`: Summarized DeepSeek V4 Flash
managed-vLLM defaults for DGX Station.
- NVIDIA#5877 -> `docs/about/release-notes.mdx`: Summarized provider switch
metadata preservation.
- NVIDIA#5932 -> `docs/about/release-notes.mdx`: Summarized transient
inference smoke retry behavior.
- NVIDIA#5934 -> `docs/about/release-notes.mdx`: Summarized constrained
inference smoke retry boundaries.
- NVIDIA#5681 -> `docs/about/release-notes.mdx`: Summarized Shields
config-hash sealing during auto-restore.
- NVIDIA#5682 -> `docs/about/release-notes.mdx`: Summarized sandbox connect
process-limit enforcement.
- NVIDIA#5683 -> `docs/about/release-notes.mdx`: Summarized JSON agent failure
provenance warnings.
- NVIDIA#5711 -> `docs/about/release-notes.mdx`: Summarized sparse-source log
breadcrumbs.
- NVIDIA#5838 -> `docs/about/release-notes.mdx`: Summarized host-authoritative
Shields status.
- NVIDIA#5880 -> `docs/about/release-notes.mdx`: Summarized policy round-trip
documentation updates.
- NVIDIA#5886 -> `docs/about/release-notes.mdx`: Summarized network request
approval-flow documentation updates.

## 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: doc-only release-notes
prose; no runtime behavior changed.
- [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:

## Verification
- [x] PR description includes the DCO sign-off declaration and every
commit appears as `Verified` in GitHub
- [x] Git hooks passed during commit and push, or `npx prek run
--from-ref main --to-ref HEAD` passes
- [ ] Targeted tests pass for changed behavior
- [ ] Full `npm test` passes (broad runtime changes only)
- [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)
- [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)

`npm run docs` passed with 0 errors and the existing Fern light-mode
accent contrast warning.
`fern check --warnings` reported the same accent-color warning.

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

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

* **Documentation**
* Added release notes for **v0.0.69**, covering improved sandbox
lifecycle recovery (state preservation across
destroy/recreate/rebuild/recovery/validation failures), clearer Deep
Agents Code terminal/CLI behavior, and safer Hermes messaging/provider
switching with manifest-driven channels.
* Improved inference setup validation guidance, including handling of
local/compatible endpoints and redaction of sensitive validation errors.
* Refreshed release-gate documentation with clearer approval examples
and validation behavior for NVIDIA API keys vs hosted inference keys.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
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 VDR Linked to VDR finding

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[NemoClaw][Ubuntu 24.04][Security] Shields auto-restore reports lockdown active but leaves sandbox config hash writable

5 participants