Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion ci/source-architecture-budget.json
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@
"src/lib/inference/web-search.ts": 21,
"src/lib/messaging/channels/index.ts": 26,
"src/lib/onboard/gateway-binding.ts": 48,
"src/lib/runner.ts": 89,
"src/lib/runner.ts": 88,
"src/lib/security/redact.ts": 51,
"src/lib/state/onboard-session.ts": 36,
"src/lib/state/registry.ts": 101,
Expand Down
8 changes: 8 additions & 0 deletions docs/manage-sandboxes/runtime-controls.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -114,6 +114,14 @@ NemoClaw does not signal that process because portable process inspection cannot
After the owner releases the lock, auto-restore restores the restrictive policy and config posture.
The ownership check includes both the process ID and process start identity so PID reuse does not grant control over an unrelated process.

Before a manual Shields transition replaces a policy, NemoClaw requires exact Model Context Protocol (MCP) agreement among the sandbox registry, generated-policy record, and live gateway policy.
`shields down` carries the proven managed MCP policy entries into the relaxed policy.
Restoration removes snapshot-time managed MCP entries before it overlays current exact entries.
If exact agreement is absent, a manual Shields transition refuses the replacement policy.
At an expired deadline, auto-restore omits unproven managed MCP policy entries, restores lockdown, and records the omission count in its audit entry.
An MCP server removed during the shields-down window stays removed.
A surviving server keeps its recorded endpoint and address pins while its policy ownership remains exact.

When an interactive command takes over an expired timer, NemoClaw makes up to 7 restoration attempts over an additional 30-second completion-grace window.
The deadline gate remains closed during those attempts.
If restoration cannot commit, NemoClaw records durable containment before the command returns an error.
Expand Down
8 changes: 8 additions & 0 deletions docs/reference/commands.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -1172,6 +1172,14 @@ Durable containment blocks new mutations until you complete exact-generation ope
Stop all NemoClaw processes for the sandbox, then follow the paths, identities, tokens, and removal order in the reported error.
Verify each recorded generation is unchanged, remove only the exact stale generations first, and remove the exact containment generation last.

Before a manual Shields transition replaces a policy, NemoClaw requires exact agreement among the sandbox registry, generated-policy record, and live gateway policy.
`shields down` carries the proven managed MCP policy entries into the relaxed policy.
Restoration removes snapshot-time managed MCP entries before it overlays current exact entries.
If exact agreement is absent, a manual Shields transition refuses the replacement policy.
At an expired deadline, auto-restore omits unproven managed MCP policy entries, restores lockdown, and records the omission count in its audit entry.
An MCP server removed during the shields-down window stays removed.
A surviving server keeps its recorded endpoint and address pins while its policy ownership remains exact.

<AgentOnly variant="openclaw,hermes">

### `$$nemoclaw <name> recover`
Expand Down
2 changes: 1 addition & 1 deletion scripts/checks/openshell-policy-mutation-read.mts
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ export const MUTATION_READS: readonly AuditedMutationRead[] = [
},
{
relativePath: "src/lib/shields/index.ts",
expectedReadCalls: 1,
expectedReadCalls: 3,
baseCommand: "runCapture(buildPolicyGetCommand(sandboxName))",
unsafeBaseCommand: "runCapture(buildPolicyGetCommand(sandboxName), {",
fullCommand: "runCapture(buildPolicyGetFullCommand(sandboxName))",
Expand Down
Loading