Skip to content

fix(shields): support nested OpenShell PID namespaces - #6568

Merged
apurvvkumaria merged 8 commits into
mainfrom
fix/6565_openshell_supervised_config_guard
Jul 9, 2026
Merged

fix(shields): support nested OpenShell PID namespaces#6568
apurvvkumaria merged 8 commits into
mainfrom
fix/6565_openshell_supervised_config_guard

Conversation

@chengjiew

@chengjiew chengjiew commented Jul 9, 2026

Copy link
Copy Markdown
Contributor

Summary

Fix OpenClaw shields config-guard startup detection when openshell-sandbox is PID 1 and nemoclaw-start is PID 1 inside OpenShell's nested workload PID namespace. The guard now recognizes that authenticated topology without weakening the existing process identity checks.

Related Issue

Fixes #6565

Changes

  • Accept a stable nested workload PID namespace when the pinned direct child reports NSpid 1, including when Landlock hides namespace inode links.
  • Preserve the existing UID, exact command line, direct-parent, double-read, and pinned-proc identity checks.
  • Add OpenClaw regression coverage for readable and Landlock-restricted namespace evidence while retaining Hermes and spoofing negative controls.

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: Restores the intended OpenShell runtime topology without changing commands, configuration, or documented workflow.
  • 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: Focused security review confirmed the new branch retains pinned proc identity, two stable reads, PPID 1, effective UID, exact command line, and duplicate-process rejection; only the authenticated nested PID namespace shape is added.
  • Non-success, skipped, or missing CI check accepted by maintainer — check name, approval link, and follow-up issue:

Verification

  • PR description includes the DCO sign-off declaration 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: 46 integration tests and 54 shields CLI tests passed.
  • Applicable broad gate passed — npm test for broad runtime/test-harness changes; npm run check for repo-wide validation/coverage changes — command/result:
  • 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: Chengjie Wang chengjiew@nvidia.com

Summary by CodeRabbit

  • Bug Fixes

    • Improved supervised startup process identity detection across same-namespace and nested PID-namespace scenarios, including more reliable command-line matching and additional validation to confirm correct runtime topology.
    • Updated nested PID-namespace access-denial behavior to align with actual observed results.
  • Tests

    • Expanded startup-process identity coverage for nested PID namespaces, including added supervised entrypoint and argv-spoof scenarios.
    • Updated parameterized expectations and added new OpenShell nested variants (including cross-namespace and landlock denial cases).

Signed-off-by: Chengjie Wang <chengjiew@nvidia.com>
@coderabbitai

coderabbitai Bot commented Jul 9, 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

The guard now parses nemoclaw-start cmdlines more precisely, validates same-namespace and nested PID-namespace topologies, and requires both cmdline and topology checks. The identity test harness adds nested namespace scenarios, direct-entrypoint coverage, and updated OpenClaw/OpenShell assertions.

Changes

Nested Namespace Topology Matching

Layer / File(s) Summary
Guard command-line and topology checks
scripts/openclaw-config-guard.py
Parses cmdline bytes into arguments, matches direct and bash-wrapped nemoclaw-start invocations, and replaces the old namespace check with same-namespace and nested-namespace PID topology handling.
Nested namespace test scenarios
test/startup-process-identity.test.ts
Adds nested namespace paths, variable namespace selectors, direct and argv-spoof proof cases, and updates the TypeScript assertions and expected JSON for the new scenarios.

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

Suggested labels: security

Suggested reviewers: ericksoa, cv

Sequence Diagram(s)

sequenceDiagram
  participant openclaw_config_guard as openclaw-config-guard.py
  participant procfs as /proc
  participant readiness as readiness predicate
  openclaw_config_guard->>procfs: read cmdline and namespace state
  procfs-->>openclaw_config_guard: NUL-separated args and PID topology
  openclaw_config_guard->>readiness: require cmdline matches and topology_matches
Loading
🚥 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
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly describes the main change: supporting nested OpenShell PID namespaces.
Linked Issues check ✅ Passed The code and tests address the reported nested PID-namespace startup failure while preserving the existing identity checks.
Out of Scope Changes check ✅ Passed The added tests and harness updates are all directly tied to the nested namespace authentication fix.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch fix/6565_openshell_supervised_config_guard

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

@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)
test/startup-process-identity.test.ts (1)

103-109: 🎯 Functional Correctness | 🔵 Trivial | ⚡ Quick win

Validate the namespace selector in the harness.

The optional tuple tail silently falls back to namespace_path for any value other than exactly ["nested"]. Tighten this so typoed or accidentally omitted nested selectors fail loudly instead of weakening these regression scenarios.

As per path instructions, “Migration tests must prove the superseded path is unreachable or removed, not merely prove that the new path also works.”

Proposed harness hardening
-            pid, start_time, cmdline, effective_uid, inner_pid, parent_pid, *namespace = process
+            pid, start_time, cmdline, effective_uid, inner_pid, parent_pid, *namespace = process
+            if namespace not in ([], ["nested"]):
+                raise AssertionError(f"unsupported namespace selector: {namespace!r}")
             write_process(
                 proc_root,
                 pid,
                 start_time,
                 cmdline,
-                nested_namespace_path if namespace == ["nested"] else namespace_path,
+                nested_namespace_path if namespace == ["nested"] else namespace_path,

Also applies to: 179-184

🤖 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 `@test/startup-process-identity.test.ts` around lines 103 - 109, The test
harness in the process fixture currently treats any namespace tail other than
exactly ["nested"] as a fallback to namespace_path, which can mask typos or
missing selectors. Tighten the selector logic used in the process loop and
write_process call so only the expected nested namespace value is accepted and
any other non-empty or unexpected tail causes the test to fail loudly, keeping
the regression scenarios in startup-process-identity.test.ts strict.

Source: Path instructions

🤖 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 `@test/startup-process-identity.test.ts`:
- Around line 103-109: The test harness in the process fixture currently treats
any namespace tail other than exactly ["nested"] as a fallback to
namespace_path, which can mask typos or missing selectors. Tighten the selector
logic used in the process loop and write_process call so only the expected
nested namespace value is accepted and any other non-empty or unexpected tail
causes the test to fail loudly, keeping the regression scenarios in
startup-process-identity.test.ts strict.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: ca3dda7c-d907-4a71-b477-6bd690415f81

📥 Commits

Reviewing files that changed from the base of the PR and between 5476b9d and e50c58d.

📒 Files selected for processing (2)
  • scripts/openclaw-config-guard.py
  • test/startup-process-identity.test.ts

@github-actions

github-actions Bot commented Jul 9, 2026

Copy link
Copy Markdown
Contributor

PR Review Advisor (Nemotron Ultra) — Changes requested

Merge posture: Do not merge yet
Primary next action: Fix PRA-1: Duplicated startup identity verification logic across OpenClaw and Hermes guards; then add or justify PRA-T1.
Open items: 2 required · 5 warnings · 0 suggestions · 8 test follow-ups
Since last review: 2 prior items resolved · 5 still apply · 2 new items found

Action checklist

  • PRA-1 Fix: Duplicated startup identity verification logic across OpenClaw and Hermes guards in scripts/openclaw-config-guard.py:544
  • PRA-7 Fix: Nested namespace topology mismatch: Landlock-supervisor-hidden case incorrectly accepted in scripts/openclaw-config-guard.py:870
  • PRA-2 Resolve or justify: Widened argv acceptance pattern for bash wrapper increases attack surface in scripts/openclaw-config-guard.py:560
  • PRA-3 Resolve or justify: Nested PID namespace support diverges between OpenClaw and Hermes guards in test/startup-process-identity.test.ts:270
  • PRA-4 Resolve or justify: Nested namespace compatibility workaround lacks automated removal tracking in scripts/openclaw-config-guard.py:720
  • PRA-5 Resolve or justify: Action readiness protocol changes for nested namespaces lack authorization test coverage in scripts/openclaw-config-guard.py:1130
  • PRA-6 Resolve or justify: Missing runtime/integration validation for config guard startup identity in live sandbox in scripts/openclaw-config-guard.py:1
  • PRA-T1 Add or justify test follow-up: Runtime validation
  • PRA-T2 Add or justify test follow-up: Runtime validation
  • PRA-T3 Add or justify test follow-up: Runtime validation
  • PRA-T4 Add or justify test follow-up: Runtime validation
  • PRA-T5 Add or justify test follow-up: Runtime validation
  • PRA-T6 Add or justify test follow-up: Missing runtime/integration validation for config guard startup identity in live sandbox
  • PRA-T7 Add or justify test follow-up: scripts/openclaw-config-guard.py:720 (comment referencing security: verify runtime OpenShell version against credential boundary manifest #6256)
  • PRA-T8 Add or justify test follow-up: agents/hermes/runtime-config-guard.py:558-560 (SOURCE_OF_TRUTH_REVIEW comment referencing [DGX Spark][Sandbox] NemoHermes sandbox PID 1 exits 1 at ensure-api-key on startup in v0.0.71 #6110)

Findings index

ID Severity Category Location Required action
PRA-1 Required security scripts/openclaw-config-guard.py:544 Extract shared startup identity verification into a common module (e.g., scripts/startup_identity.py) imported by both guards. Ensure both guards receive identical security fixes. At minimum, apply the nested-namespace topology_matches logic to Hermes or document the intentional divergence with a security review.
PRA-2 Resolve/justify security scripts/openclaw-config-guard.py:560 Audit the bash-wrapper pattern for bypasses: verify basename extraction (rsplit(b'/', 1)[-1]) handles all path forms, confirm no other shell names are accepted, ensure the exact two-argument constraint cannot be subverted. Consider whether the bash wrapper is strictly necessary or if direct exec can be enforced.
PRA-3 Resolve/justify architecture test/startup-process-identity.test.ts:270 Either add Hermes nested namespace support with its own reproduction/acceptance, or document the permanent topology split with a security review confirming Hermes deployment model will never require nested PID namespaces. Add a TODO comment with GitHub issue link for automated tracking.
PRA-4 Resolve/justify architecture scripts/openclaw-config-guard.py:720 Add a CI check or test that fails when #6256 is merged (detectable via linked PR/issue closure) reminding maintainers to remove the nested_namespace_matches branch and related topology_matches logic. Alternatively, add a TODO comment with a GitHub issue link that can be queried programmatically.
PRA-5 Resolve/justify correctness scripts/openclaw-config-guard.py:1130 Add unit test coverage for _validate_action_readiness exercising each action type under the five topologies. Verify allow/deny decisions match expected policy.
PRA-6 Resolve/justify tests scripts/openclaw-config-guard.py:1 Add or reference a runtime integration test (e.g., in test/e2e/live/) that spawns a real OpenShell sandbox with the config guard and verifies startup identity authentication. Link the test from this PR or document why unit coverage is sufficient.
PRA-7 Required correctness scripts/openclaw-config-guard.py:870 Fix the topology_matches logic to reject this case, or update the test expectation with a security justification. The nested_namespace_matches branch should require expected_namespace_inode to be non-None when the child is in a nested namespace, or add an explicit check that the child's inner PID==1 only matches when the supervisor inode is known and different.

🚨 Required before merge

Address these before merging unless a maintainer explicitly overrides the advisor with rationale.

PRA-1 Required — Duplicated startup identity verification logic across OpenClaw and Hermes guards

  • Location: scripts/openclaw-config-guard.py:544
  • Category: security
  • Problem: Functions _cmdline_is_nemoclaw_start, _parse_process_parent_pid, _process_status_identity, _pinned_process_matches_supervised_nonroot_start are duplicated nearly verbatim between scripts/openclaw-config-guard.py and agents/hermes/runtime-config-guard.py. Hermes lacks the new nested-namespace topology_matches/nested_namespace_matches branches added to OpenClaw in this PR. A security fix applied to one guard may not propagate to the other, leaving a sandbox escape vector in the unpatched guard.
  • Impact: Security fix divergence between guards; Hermes missing nested PID namespace support; increased maintenance burden and risk of inconsistent patching.
  • Required action: Extract shared startup identity verification into a common module (e.g., scripts/startup_identity.py) imported by both guards. Ensure both guards receive identical security fixes. At minimum, apply the nested-namespace topology_matches logic to Hermes or document the intentional divergence with a security review.
  • Expected follow-up: Fix before merge or get explicit maintainer override.
  • Verification: Diff the two guard files for functions _cmdline_is_nemoclaw_start, _pinned_process_matches_supervised_nonroot_start, _process_status_identity, _parse_process_parent_pid. Confirm Hermes lacks topology_matches and nested_namespace_matches branches.
  • Missing regression test: Add a parity test that runs the same startup identity test vectors against both guards and asserts identical pass/fail results for all shared scenarios (remapped, stale, spoof, nonroot, noninit, wrong_namespace, duplicate, openshell_supervised, openshell_spoof, openshell_duplicate, openshell_required_child, openshell_wrong_required_child).
  • Done when: The required change is committed and verification passes: Diff the two guard files for functions _cmdline_is_nemoclaw_start, _pinned_process_matches_supervised_nonroot_start, _process_status_identity, _parse_process_parent_pid. Confirm Hermes lacks topology_matches and nested_namespace_matches branches.
  • Evidence: scripts/openclaw-config-guard.py:544-712 (duplicated functions) agents/hermes/runtime-config-guard.py:225-393 (duplicated functions) test/startup-process-identity.test.ts:270-271 (openshell_nested_pid_namespace gated to OpenClaw only)

PRA-7 Required — Nested namespace topology mismatch: Landlock-supervisor-hidden case incorrectly accepted

  • Location: scripts/openclaw-config-guard.py:870
  • Category: correctness
  • Problem: For test case openshell_cross_namespace_outer_pid (nested PID namespace, supervisor namespace inode hidden by Landlock), the new topology_matches logic evaluates to true but the test expects false. Trace: expected_namespace_inode=None (supervisor hidden), first_namespace_inode=second_namespace_inode (child nested namespace). same_namespace_matches=true (expected=None), same_namespace_pid_matches=false (inner PID 1 != outer PID 412). nested_namespace_matches=true (expected=None), nested_namespace_pid_matches=true (inner PID==1). topology_matches = (true AND false) OR (true AND true) = true. Test at test/startup-process-identity.test.ts expects false for both guards.
  • Impact: Config guard incorrectly authenticates a nested namespace workload when supervisor namespace inode is hidden by Landlock, potentially allowing unauthorized config mutations in that topology.
  • Required action: Fix the topology_matches logic to reject this case, or update the test expectation with a security justification. The nested_namespace_matches branch should require expected_namespace_inode to be non-None when the child is in a nested namespace, or add an explicit check that the child's inner PID==1 only matches when the supervisor inode is known and different.
  • Expected follow-up: Fix before merge or get explicit maintainer override.
  • Verification: Run the test for openshell_cross_namespace_outer_pid against both guards. Trace topology_matches evaluation at scripts/openclaw-config-guard.py:870-910 with expected_namespace_inode=None, child inner PID=1, outer PID=412.
  • Missing regression test: Add explicit test case for nested namespace with Landlock hiding supervisor inode: verify guard rejects when child inner PID=1 but outer PID != 1 and supervisor inode unknown. Currently openshell_cross_namespace_outer_pid serves this but expectation may be wrong.
  • Done when: The required change is committed and verification passes: Run the test for openshell_cross_namespace_outer_pid against both guards. Trace topology_matches evaluation at scripts/openclaw-config-guard.py:870-910 with expected_namespace_inode=None, child inner PID=1, outer PID=412.
  • Evidence: scripts/openclaw-config-guard.py:870-910 (topology_matches logic) test/startup-process-identity.test.ts:190-195 (openshell_cross_namespace_outer_pid scenario), 270-271 (expected false for both guards)
Review findings by urgency: 2 required fixes, 5 items to resolve/justify, 0 in-scope improvements

⚠️ Resolve or justify before merge

Investigate these in the current review; either fix them, explain why they are not applicable, or document the accepted risk.

PRA-2 Resolve/justify — Widened argv acceptance pattern for bash wrapper increases attack surface

  • Location: scripts/openclaw-config-guard.py:560
  • Category: security
  • Problem: The _cmdline_is_nemoclaw_start function now accepts two patterns: (1) direct single-argument nemoclaw-start, and (2) two-argument argv where argv[0] basename is 'bash' and argv[1] is nemoclaw-start. Tests cover argv_spoof (python3 /tmp/evil.py /usr/local/bin/nemoclaw-start), noncanonical_bash (/tmp/bash), misplaced_start, empty_argument_spoof — all correctly rejected. However, alternate shell basenames (sh, dash, zsh), symlink traversal in argv[0] (/proc/self/exe, /dev/fd/...), argv[0] with directory components beyond basename, and argv length > 2 with nemoclaw-start at position > 1 are not exercised.
  • Impact: If the bash-wrapper pattern has edge cases, an attacker could craft argv that passes _cmdline_is_nemoclaw_start but executes arbitrary code, bypassing startup identity verification.
  • Recommended action: Audit the bash-wrapper pattern for bypasses: verify basename extraction (rsplit(b'/', 1)[-1]) handles all path forms, confirm no other shell names are accepted, ensure the exact two-argument constraint cannot be subverted. Consider whether the bash wrapper is strictly necessary or if direct exec can be enforced.
  • Expected follow-up: Resolve in this PR or explain why the risk is acceptable.
  • Verification: Review _cmdline_is_nemoclaw_start at scripts/openclaw-config-guard.py:560-570 and agents/hermes/runtime-config-guard.py:240-250. Check test vectors argv_spoof and nested_argv_spoof in test/startup-process-identity.test.ts:140-141, 173-174.
  • Missing regression test: Add fuzz-style test cases for _cmdline_is_nemoclaw_start covering: symlinks in argv[0] (/proc/self/exe, /dev/fd/...), alternate shell basenames (sh, dash, zsh), extra null bytes, argv[0] with directory traversal, argv length > 2 with nemoclaw-start at position > 1. Verify all return False.
  • Done when: The risk is fixed or explicitly justified in the PR. Verification: Review _cmdline_is_nemoclaw_start at scripts/openclaw-config-guard.py:560-570 and agents/hermes/runtime-config-guard.py:240-250. Check test vectors argv_spoof and nested_argv_spoof in test/startup-process-identity.test.ts:140-141, 173-174.
  • Evidence: scripts/openclaw-config-guard.py:560-570 (new _cmdline_is_nemoclaw_start) agents/hermes/runtime-config-guard.py:240-250 (identical change) test/startup-process-identity.test.ts:140-141 (argv_spoof), 173-174 (nested_argv_spoof)

PRA-3 Resolve/justify — Nested PID namespace support diverges between OpenClaw and Hermes guards

  • Location: test/startup-process-identity.test.ts:270
  • Category: architecture
  • Problem: Test comment at line 270 states: '[Brev][Policy&Network] shields up/down fails with CRITICAL "requires NemoClaw PID 1" on openshell-sandbox topology (v0.0.75) #6565 reproduces nested PID namespaces only for OpenClaw. Hermes keeps its independently tested same-namespace topology until it has a Hermes-specific reproduction or acceptance requirement.' This intentional divergence is documented but lacks automated tracking or timeline for Hermes support. The topology_matches/nested_namespace_matches branches exist only in OpenClaw.
  • Impact: Long-term maintenance burden; Hermes may need nested namespace support in future without clear migration path; security fixes for nested topology must be duplicated.
  • Recommended action: Either add Hermes nested namespace support with its own reproduction/acceptance, or document the permanent topology split with a security review confirming Hermes deployment model will never require nested PID namespaces. Add a TODO comment with GitHub issue link for automated tracking.
  • Expected follow-up: Resolve in this PR or explain why the risk is acceptable.
  • Verification: Check test/startup-process-identity.test.ts:270-271 for the gated test expectation. Compare topology_matches logic in scripts/openclaw-config-guard.py:870-910 vs agents/hermes/runtime-config-guard.py equivalent.
  • Missing regression test: Add a test that documents the topology split expectation and fails if Hermes unexpectedly gains nested namespace support without review, or if OpenClaw loses it.
  • Done when: The risk is fixed or explicitly justified in the PR. Verification: Check test/startup-process-identity.test.ts:270-271 for the gated test expectation. Compare topology_matches logic in scripts/openclaw-config-guard.py:870-910 vs agents/hermes/runtime-config-guard.py equivalent.
  • Evidence: test/startup-process-identity.test.ts:270-271 (openshell_nested_pid_namespace gated to OpenClaw) scripts/openclaw-config-guard.py:870-910 (topology_matches with nested_namespace_matches) agents/hermes/runtime-config-guard.py: lacks nested_namespace_matches branch

PRA-4 Resolve/justify — Nested namespace compatibility workaround lacks automated removal tracking

PRA-5 Resolve/justify — Action readiness protocol changes for nested namespaces lack authorization test coverage

  • Location: scripts/openclaw-config-guard.py:1130
  • Category: correctness
  • Problem: _validate_action_readiness at line 1130 now handles nested PID namespaces with Landlock interaction. The function branches for: (a) strict PID 1 startup with capability protocol, (b) supervised non-root same-namespace, (c) supervised non-root nested namespace, (d) source-injected helper in old image, (e) installed helper with missing capability. No unit tests exercise these branches to verify allow/deny decisions match expected policy.
  • Impact: Authorization logic for config guard actions (lock, unlock, write-config, seal-restart, etc.) may have gaps in nested namespace deployments; Landlock namespace denial path untested.
  • Recommended action: Add unit test coverage for _validate_action_readiness exercising each action type under the five topologies. Verify allow/deny decisions match expected policy.
  • Expected follow-up: Resolve in this PR or explain why the risk is acceptable.
  • Verification: Review _validate_action_readiness at scripts/openclaw-config-guard.py:1130-1220. Check test/startup-process-identity.test.ts for any _validate_action_readiness calls (none found).
  • Missing regression test: Add test cases for _validate_action_readiness covering: (a) strict PID1 startup with capability, (b) supervised same-namespace, (c) supervised nested namespace, (d) source-injected helper old image, (e) installed helper missing capability. Test each action: revoke-startup-ready, publish-startup-ready, recover, lock, unlock, write-config, seal-restart, unseal-restart.
  • Done when: The risk is fixed or explicitly justified in the PR. Verification: Review _validate_action_readiness at scripts/openclaw-config-guard.py:1130-1220. Check test/startup-process-identity.test.ts for any _validate_action_readiness calls (none found).
  • Evidence: scripts/openclaw-config-guard.py:1130-1220 (_validate_action_readiness) test/startup-process-identity.test.ts: no _validate_action_readiness tests

PRA-6 Resolve/justify — Missing runtime/integration validation for config guard startup identity in live sandbox

  • Location: scripts/openclaw-config-guard.py:1
  • Category: tests
  • Problem: Test coverage is limited to unit-level procfs fixture simulation in test/startup-process-identity.test.ts. No test in test/e2e/live/ or similar that spawns a real OpenShell sandbox, runs the config guard, and verifies startup identity authentication succeeds for valid workloads and fails for spoofed argv/nested namespace attacks.
  • Impact: Unit test fixtures may not capture real kernel/procfs behavior, Landlock interactions, or Docker entrypoint argv handling. Integration gaps could allow sandbox escape vectors that pass unit tests but fail in production.
  • Recommended action: Add or reference a runtime integration test (e.g., in test/e2e/live/) that spawns a real OpenShell sandbox with the config guard and verifies startup identity authentication. Link the test from this PR or document why unit coverage is sufficient.
  • Expected follow-up: Resolve in this PR or explain why the risk is acceptable.
  • Verification: Search test/e2e/live/ for config guard startup identity tests. Check if assertHermesGpuStartupProof() in test/e2e/live/hermes-gpu-startup-proof.ts covers OpenClaw config guard.
  • Missing regression test: Add test/e2e/live/openclaw-config-guard-startup-proof.ts that: (1) spawns OpenShell sandbox with nemoclaw-start entrypoint, (2) verifies config guard authenticates valid startup, (3) verifies rejection of spoofed argv, (4) verifies nested PID namespace topology if supported.
  • Done when: The risk is fixed or explicitly justified in the PR. Verification: Search test/e2e/live/ for config guard startup identity tests. Check if assertHermesGpuStartupProof() in test/e2e/live/hermes-gpu-startup-proof.ts covers OpenClaw config guard.
  • Evidence: test/startup-process-identity.test.ts: unit-only procfs fixtures test/e2e/live/hermes-gpu-startup-proof.ts: exists for Hermes GPU but not OpenClaw config guard scripts/openclaw-config-guard.py:1 (file scope)

💡 In-scope improvements

These are lower-risk, not throwaway. Prefer fixing them in this PR when they are local to changed code; defer only with rationale or a linked follow-up.

  • None.
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 Runtime validation — Add or identify targeted runtime/integration validation for the changed behavior; do not report external E2E job pass/fail here.. Runtime/sandbox/infrastructure paths need behavioral runtime validation: agents/hermes/runtime-config-guard.py, scripts/openclaw-config-guard.py. Unit test coverage significantly expanded with 14 new scenarios covering bash-wrapper variants, argv spoofs, nested namespace topologies, Landlock interactions, and required_pid matching. However, runtime/sandbox/infrastructure paths need behavioral runtime validation: no test in test/e2e/live/ spawns real OpenShell sandbox with config guard. _validate_action_readiness authorization logic (5 topologies × 8 actions) has zero test coverage.
  • PRA-T2 Runtime validation — Add _validate_action_readiness unit tests covering 5 topologies × 8 actions (F-005). Runtime/sandbox/infrastructure paths need behavioral runtime validation: agents/hermes/runtime-config-guard.py, scripts/openclaw-config-guard.py. Unit test coverage significantly expanded with 14 new scenarios covering bash-wrapper variants, argv spoofs, nested namespace topologies, Landlock interactions, and required_pid matching. However, runtime/sandbox/infrastructure paths need behavioral runtime validation: no test in test/e2e/live/ spawns real OpenShell sandbox with config guard. _validate_action_readiness authorization logic (5 topologies × 8 actions) has zero test coverage.
  • PRA-T3 Runtime validation — Add fuzz-style test cases for _cmdline_is_nemoclaw_start argv edge cases (F-002). Runtime/sandbox/infrastructure paths need behavioral runtime validation: agents/hermes/runtime-config-guard.py, scripts/openclaw-config-guard.py. Unit test coverage significantly expanded with 14 new scenarios covering bash-wrapper variants, argv spoofs, nested namespace topologies, Landlock interactions, and required_pid matching. However, runtime/sandbox/infrastructure paths need behavioral runtime validation: no test in test/e2e/live/ spawns real OpenShell sandbox with config guard. _validate_action_readiness authorization logic (5 topologies × 8 actions) has zero test coverage.
  • PRA-T4 Runtime validation — Add live sandbox integration test in test/e2e/live/openclaw-config-guard-startup-proof.ts (F-006). Runtime/sandbox/infrastructure paths need behavioral runtime validation: agents/hermes/runtime-config-guard.py, scripts/openclaw-config-guard.py. Unit test coverage significantly expanded with 14 new scenarios covering bash-wrapper variants, argv spoofs, nested namespace topologies, Landlock interactions, and required_pid matching. However, runtime/sandbox/infrastructure paths need behavioral runtime validation: no test in test/e2e/live/ spawns real OpenShell sandbox with config guard. _validate_action_readiness authorization logic (5 topologies × 8 actions) has zero test coverage.
  • PRA-T5 Runtime validation — Add parity test for shared startup identity vectors across both guards (F-001). Runtime/sandbox/infrastructure paths need behavioral runtime validation: agents/hermes/runtime-config-guard.py, scripts/openclaw-config-guard.py. Unit test coverage significantly expanded with 14 new scenarios covering bash-wrapper variants, argv spoofs, nested namespace topologies, Landlock interactions, and required_pid matching. However, runtime/sandbox/infrastructure paths need behavioral runtime validation: no test in test/e2e/live/ spawns real OpenShell sandbox with config guard. _validate_action_readiness authorization logic (5 topologies × 8 actions) has zero test coverage.
  • PRA-T6 Missing runtime/integration validation for config guard startup identity in live sandbox — Add or reference a runtime integration test (e.g., in test/e2e/live/) that spawns a real OpenShell sandbox with the config guard and verifies startup identity authentication. Link the test from this PR or document why unit coverage is sufficient.
  • PRA-T7 scripts/openclaw-config-guard.py:720 (comment referencing security: verify runtime OpenShell version against credential boundary manifest #6256) — CI job or test that checks for open GitHub issue security: verify runtime OpenShell version against credential boundary manifest #6256 and fails with reminder to remove workaround branches when closed.. scripts/openclaw-config-guard.py:720 (comment referencing security: verify runtime OpenShell version against credential boundary manifest #6256); scripts/openclaw-config-guard.py:870-910 (topology_matches with nested_namespace_matches)
  • PRA-T8 agents/hermes/runtime-config-guard.py:558-560 (SOURCE_OF_TRUTH_REVIEW comment referencing [DGX Spark][Sandbox] NemoHermes sandbox PID 1 exits 1 at ensure-api-key on startup in v0.0.71 #6110) — assertHermesGpuStartupProof() in test/e2e/live/hermes-gpu-startup-proof.ts validates GPU recreate preserves empty Config.Cmd.. agents/hermes/runtime-config-guard.py:558-560 (SOURCE_OF_TRUTH_REVIEW comment referencing [DGX Spark][Sandbox] NemoHermes sandbox PID 1 exits 1 at ensure-api-key on startup in v0.0.71 #6110); test/e2e/live/hermes-gpu-startup-proof.ts
Since last review details

Current findings, using the urgency labels above:

PRA-1 Required — Duplicated startup identity verification logic across OpenClaw and Hermes guards

  • Location: scripts/openclaw-config-guard.py:544
  • Category: security
  • Problem: Functions _cmdline_is_nemoclaw_start, _parse_process_parent_pid, _process_status_identity, _pinned_process_matches_supervised_nonroot_start are duplicated nearly verbatim between scripts/openclaw-config-guard.py and agents/hermes/runtime-config-guard.py. Hermes lacks the new nested-namespace topology_matches/nested_namespace_matches branches added to OpenClaw in this PR. A security fix applied to one guard may not propagate to the other, leaving a sandbox escape vector in the unpatched guard.
  • Impact: Security fix divergence between guards; Hermes missing nested PID namespace support; increased maintenance burden and risk of inconsistent patching.
  • Required action: Extract shared startup identity verification into a common module (e.g., scripts/startup_identity.py) imported by both guards. Ensure both guards receive identical security fixes. At minimum, apply the nested-namespace topology_matches logic to Hermes or document the intentional divergence with a security review.
  • Expected follow-up: Fix before merge or get explicit maintainer override.
  • Verification: Diff the two guard files for functions _cmdline_is_nemoclaw_start, _pinned_process_matches_supervised_nonroot_start, _process_status_identity, _parse_process_parent_pid. Confirm Hermes lacks topology_matches and nested_namespace_matches branches.
  • Missing regression test: Add a parity test that runs the same startup identity test vectors against both guards and asserts identical pass/fail results for all shared scenarios (remapped, stale, spoof, nonroot, noninit, wrong_namespace, duplicate, openshell_supervised, openshell_spoof, openshell_duplicate, openshell_required_child, openshell_wrong_required_child).
  • Done when: The required change is committed and verification passes: Diff the two guard files for functions _cmdline_is_nemoclaw_start, _pinned_process_matches_supervised_nonroot_start, _process_status_identity, _parse_process_parent_pid. Confirm Hermes lacks topology_matches and nested_namespace_matches branches.
  • Evidence: scripts/openclaw-config-guard.py:544-712 (duplicated functions) agents/hermes/runtime-config-guard.py:225-393 (duplicated functions) test/startup-process-identity.test.ts:270-271 (openshell_nested_pid_namespace gated to OpenClaw only)

PRA-2 Resolve/justify — Widened argv acceptance pattern for bash wrapper increases attack surface

  • Location: scripts/openclaw-config-guard.py:560
  • Category: security
  • Problem: The _cmdline_is_nemoclaw_start function now accepts two patterns: (1) direct single-argument nemoclaw-start, and (2) two-argument argv where argv[0] basename is 'bash' and argv[1] is nemoclaw-start. Tests cover argv_spoof (python3 /tmp/evil.py /usr/local/bin/nemoclaw-start), noncanonical_bash (/tmp/bash), misplaced_start, empty_argument_spoof — all correctly rejected. However, alternate shell basenames (sh, dash, zsh), symlink traversal in argv[0] (/proc/self/exe, /dev/fd/...), argv[0] with directory components beyond basename, and argv length > 2 with nemoclaw-start at position > 1 are not exercised.
  • Impact: If the bash-wrapper pattern has edge cases, an attacker could craft argv that passes _cmdline_is_nemoclaw_start but executes arbitrary code, bypassing startup identity verification.
  • Recommended action: Audit the bash-wrapper pattern for bypasses: verify basename extraction (rsplit(b'/', 1)[-1]) handles all path forms, confirm no other shell names are accepted, ensure the exact two-argument constraint cannot be subverted. Consider whether the bash wrapper is strictly necessary or if direct exec can be enforced.
  • Expected follow-up: Resolve in this PR or explain why the risk is acceptable.
  • Verification: Review _cmdline_is_nemoclaw_start at scripts/openclaw-config-guard.py:560-570 and agents/hermes/runtime-config-guard.py:240-250. Check test vectors argv_spoof and nested_argv_spoof in test/startup-process-identity.test.ts:140-141, 173-174.
  • Missing regression test: Add fuzz-style test cases for _cmdline_is_nemoclaw_start covering: symlinks in argv[0] (/proc/self/exe, /dev/fd/...), alternate shell basenames (sh, dash, zsh), extra null bytes, argv[0] with directory traversal, argv length > 2 with nemoclaw-start at position > 1. Verify all return False.
  • Done when: The risk is fixed or explicitly justified in the PR. Verification: Review _cmdline_is_nemoclaw_start at scripts/openclaw-config-guard.py:560-570 and agents/hermes/runtime-config-guard.py:240-250. Check test vectors argv_spoof and nested_argv_spoof in test/startup-process-identity.test.ts:140-141, 173-174.
  • Evidence: scripts/openclaw-config-guard.py:560-570 (new _cmdline_is_nemoclaw_start) agents/hermes/runtime-config-guard.py:240-250 (identical change) test/startup-process-identity.test.ts:140-141 (argv_spoof), 173-174 (nested_argv_spoof)

PRA-3 Resolve/justify — Nested PID namespace support diverges between OpenClaw and Hermes guards

  • Location: test/startup-process-identity.test.ts:270
  • Category: architecture
  • Problem: Test comment at line 270 states: '[Brev][Policy&Network] shields up/down fails with CRITICAL "requires NemoClaw PID 1" on openshell-sandbox topology (v0.0.75) #6565 reproduces nested PID namespaces only for OpenClaw. Hermes keeps its independently tested same-namespace topology until it has a Hermes-specific reproduction or acceptance requirement.' This intentional divergence is documented but lacks automated tracking or timeline for Hermes support. The topology_matches/nested_namespace_matches branches exist only in OpenClaw.
  • Impact: Long-term maintenance burden; Hermes may need nested namespace support in future without clear migration path; security fixes for nested topology must be duplicated.
  • Recommended action: Either add Hermes nested namespace support with its own reproduction/acceptance, or document the permanent topology split with a security review confirming Hermes deployment model will never require nested PID namespaces. Add a TODO comment with GitHub issue link for automated tracking.
  • Expected follow-up: Resolve in this PR or explain why the risk is acceptable.
  • Verification: Check test/startup-process-identity.test.ts:270-271 for the gated test expectation. Compare topology_matches logic in scripts/openclaw-config-guard.py:870-910 vs agents/hermes/runtime-config-guard.py equivalent.
  • Missing regression test: Add a test that documents the topology split expectation and fails if Hermes unexpectedly gains nested namespace support without review, or if OpenClaw loses it.
  • Done when: The risk is fixed or explicitly justified in the PR. Verification: Check test/startup-process-identity.test.ts:270-271 for the gated test expectation. Compare topology_matches logic in scripts/openclaw-config-guard.py:870-910 vs agents/hermes/runtime-config-guard.py equivalent.
  • Evidence: test/startup-process-identity.test.ts:270-271 (openshell_nested_pid_namespace gated to OpenClaw) scripts/openclaw-config-guard.py:870-910 (topology_matches with nested_namespace_matches) agents/hermes/runtime-config-guard.py: lacks nested_namespace_matches branch

PRA-4 Resolve/justify — Nested namespace compatibility workaround lacks automated removal tracking

PRA-5 Resolve/justify — Action readiness protocol changes for nested namespaces lack authorization test coverage

  • Location: scripts/openclaw-config-guard.py:1130
  • Category: correctness
  • Problem: _validate_action_readiness at line 1130 now handles nested PID namespaces with Landlock interaction. The function branches for: (a) strict PID 1 startup with capability protocol, (b) supervised non-root same-namespace, (c) supervised non-root nested namespace, (d) source-injected helper in old image, (e) installed helper with missing capability. No unit tests exercise these branches to verify allow/deny decisions match expected policy.
  • Impact: Authorization logic for config guard actions (lock, unlock, write-config, seal-restart, etc.) may have gaps in nested namespace deployments; Landlock namespace denial path untested.
  • Recommended action: Add unit test coverage for _validate_action_readiness exercising each action type under the five topologies. Verify allow/deny decisions match expected policy.
  • Expected follow-up: Resolve in this PR or explain why the risk is acceptable.
  • Verification: Review _validate_action_readiness at scripts/openclaw-config-guard.py:1130-1220. Check test/startup-process-identity.test.ts for any _validate_action_readiness calls (none found).
  • Missing regression test: Add test cases for _validate_action_readiness covering: (a) strict PID1 startup with capability, (b) supervised same-namespace, (c) supervised nested namespace, (d) source-injected helper old image, (e) installed helper missing capability. Test each action: revoke-startup-ready, publish-startup-ready, recover, lock, unlock, write-config, seal-restart, unseal-restart.
  • Done when: The risk is fixed or explicitly justified in the PR. Verification: Review _validate_action_readiness at scripts/openclaw-config-guard.py:1130-1220. Check test/startup-process-identity.test.ts for any _validate_action_readiness calls (none found).
  • Evidence: scripts/openclaw-config-guard.py:1130-1220 (_validate_action_readiness) test/startup-process-identity.test.ts: no _validate_action_readiness tests

PRA-6 Resolve/justify — Missing runtime/integration validation for config guard startup identity in live sandbox

  • Location: scripts/openclaw-config-guard.py:1
  • Category: tests
  • Problem: Test coverage is limited to unit-level procfs fixture simulation in test/startup-process-identity.test.ts. No test in test/e2e/live/ or similar that spawns a real OpenShell sandbox, runs the config guard, and verifies startup identity authentication succeeds for valid workloads and fails for spoofed argv/nested namespace attacks.
  • Impact: Unit test fixtures may not capture real kernel/procfs behavior, Landlock interactions, or Docker entrypoint argv handling. Integration gaps could allow sandbox escape vectors that pass unit tests but fail in production.
  • Recommended action: Add or reference a runtime integration test (e.g., in test/e2e/live/) that spawns a real OpenShell sandbox with the config guard and verifies startup identity authentication. Link the test from this PR or document why unit coverage is sufficient.
  • Expected follow-up: Resolve in this PR or explain why the risk is acceptable.
  • Verification: Search test/e2e/live/ for config guard startup identity tests. Check if assertHermesGpuStartupProof() in test/e2e/live/hermes-gpu-startup-proof.ts covers OpenClaw config guard.
  • Missing regression test: Add test/e2e/live/openclaw-config-guard-startup-proof.ts that: (1) spawns OpenShell sandbox with nemoclaw-start entrypoint, (2) verifies config guard authenticates valid startup, (3) verifies rejection of spoofed argv, (4) verifies nested PID namespace topology if supported.
  • Done when: The risk is fixed or explicitly justified in the PR. Verification: Search test/e2e/live/ for config guard startup identity tests. Check if assertHermesGpuStartupProof() in test/e2e/live/hermes-gpu-startup-proof.ts covers OpenClaw config guard.
  • Evidence: test/startup-process-identity.test.ts: unit-only procfs fixtures test/e2e/live/hermes-gpu-startup-proof.ts: exists for Hermes GPU but not OpenClaw config guard scripts/openclaw-config-guard.py:1 (file scope)

PRA-7 Required — Nested namespace topology mismatch: Landlock-supervisor-hidden case incorrectly accepted

  • Location: scripts/openclaw-config-guard.py:870
  • Category: correctness
  • Problem: For test case openshell_cross_namespace_outer_pid (nested PID namespace, supervisor namespace inode hidden by Landlock), the new topology_matches logic evaluates to true but the test expects false. Trace: expected_namespace_inode=None (supervisor hidden), first_namespace_inode=second_namespace_inode (child nested namespace). same_namespace_matches=true (expected=None), same_namespace_pid_matches=false (inner PID 1 != outer PID 412). nested_namespace_matches=true (expected=None), nested_namespace_pid_matches=true (inner PID==1). topology_matches = (true AND false) OR (true AND true) = true. Test at test/startup-process-identity.test.ts expects false for both guards.
  • Impact: Config guard incorrectly authenticates a nested namespace workload when supervisor namespace inode is hidden by Landlock, potentially allowing unauthorized config mutations in that topology.
  • Required action: Fix the topology_matches logic to reject this case, or update the test expectation with a security justification. The nested_namespace_matches branch should require expected_namespace_inode to be non-None when the child is in a nested namespace, or add an explicit check that the child's inner PID==1 only matches when the supervisor inode is known and different.
  • Expected follow-up: Fix before merge or get explicit maintainer override.
  • Verification: Run the test for openshell_cross_namespace_outer_pid against both guards. Trace topology_matches evaluation at scripts/openclaw-config-guard.py:870-910 with expected_namespace_inode=None, child inner PID=1, outer PID=412.
  • Missing regression test: Add explicit test case for nested namespace with Landlock hiding supervisor inode: verify guard rejects when child inner PID=1 but outer PID != 1 and supervisor inode unknown. Currently openshell_cross_namespace_outer_pid serves this but expectation may be wrong.
  • Done when: The required change is committed and verification passes: Run the test for openshell_cross_namespace_outer_pid against both guards. Trace topology_matches evaluation at scripts/openclaw-config-guard.py:870-910 with expected_namespace_inode=None, child inner PID=1, outer PID=412.
  • Evidence: scripts/openclaw-config-guard.py:870-910 (topology_matches logic) test/startup-process-identity.test.ts:190-195 (openshell_cross_namespace_outer_pid scenario), 270-271 (expected false for both guards)

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.

@github-code-quality

github-code-quality Bot commented Jul 9, 2026

Copy link
Copy Markdown
Contributor

Code Coverage Overview

Languages: TypeScript

TypeScript / code-coverage/plugin

The overall coverage remains at 96%, unchanged from the main branch.

TypeScript / code-coverage/cli

The overall coverage in the fix/6565_openshell_s... branch remains at 77%, unchanged from the main branch.

Show a code coverage summary of the most impacted files.
File main 4df9fc2 fix/6565_openshell_s... e69f149 +/-
src/lib/actions...ge-preflight.ts 89% 74% -15%
src/lib/runner.ts 80% 72% -8%
src/lib/inference/config.ts 98% 93% -5%
src/lib/messagi.../persistence.ts 95% 92% -3%
src/lib/credentials/store.ts 61% 59% -2%
src/lib/actions...estore-phase.ts 87% 93% +6%
src/lib/actions...de-preflight.ts 51% 60% +9%
src/lib/onboard...e-patch-flow.ts 61% 71% +10%
src/lib/actions...confirmation.ts 69% 81% +12%
src/lib/actions...light-guards.ts 71% 88% +17%

Updated July 09, 2026 17:07 UTC
Code Coverage is in Public Preview. Learn more and provide us with your feedback.

@github-actions

github-actions Bot commented Jul 9, 2026

Copy link
Copy Markdown
Contributor

E2E Advisor Recommendation

Required E2E: shields-config, hermes-shields-config, security-posture, build-hermes-sandbox-image
Optional E2E: gateway-guard-recovery, hermes-gpu-startup

Dispatch hint: shields-config,hermes-shields-config,security-posture

Workflow run

Full advisor summary

E2E Recommendation Advisor

Base: origin/main
Head: HEAD
Confidence: high

Required E2E

  • shields-config (45 min): Runs the real OpenClaw shields/config boundary against an OpenShell sandbox, exercising openclaw-config-guard.py readiness, chmod/chown lock state, config hash protection, host-root tamper, audit records, and auto-restore behavior affected by the startup identity changes.
  • hermes-shields-config (45 min): Validates a fresh OpenShell-managed non-root Hermes sandbox and two real shields down/up cycles, directly covering Hermes runtime-config-guard.py startup trigger, config hash anchoring, and locked/mutable config posture.
  • security-posture (75 min): Exercises real OpenClaw and Hermes live startup/security posture paths in OpenShell sandboxes; this is the broadest existing live validation for entrypoint process identity and host/sandbox privilege posture after changes to startup authentication.
  • build-hermes-sandbox-image (150 min): Builds the Hermes production image and runs the existing Hermes sandbox secret-boundary and root-entrypoint smoke tests, covering the changed Hermes runtime guard in the packaged image and the direct /usr/local/bin/nemoclaw-start startup mode.

Optional E2E

  • gateway-guard-recovery (45 min): Adjacent OpenClaw lifecycle confidence: proves authenticated startup/recovery restores the gateway guard chain after a pod-recreate-equivalent wipe. Useful because the same guard/startup authority assumptions are touched, but the PR does not directly change recovery orchestration.
  • hermes-gpu-startup (75 min): Optional expensive GPU topology confidence for Hermes startup integrity, especially because the guard comments and historical coverage mention GPU startup proof and Docker CMD/ENTRYPOINT argv behavior.

New E2E recommendations

  • startup-process-identity-live-attack-proof (high): The unit harness now covers exact argv smuggling and nested PID namespace cases, but existing live E2E jobs do not appear to deliberately construct a real OpenShell/OpenClaw and Hermes argv-smuggling or nested workload PID namespace attack fixture. A focused live test would close that gap for this security boundary.
    • Suggested test: Add a live startup-process-identity E2E that creates real OpenShell-managed OpenClaw and Hermes sandboxes, verifies accepted canonical direct/bash entrypoint argv with Docker CMD trailing args, rejects a trusted script path smuggled later in unrelated argv, and captures nested PID namespace evidence when the runtime supports it.

Dispatch hint

  • Workflow: .github/workflows/e2e.yaml
  • jobs input: shields-config,hermes-shields-config,security-posture

@github-actions

github-actions Bot commented Jul 9, 2026

Copy link
Copy Markdown
Contributor

E2E Target Recommendation

Required E2E targets: shields-config, hermes-shields-config
Optional E2E targets: hermes-gpu-startup

Dispatch required E2E targets:

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

Workflow run

Full E2E target advisor summary

E2E Target Advisor

Base: origin/main
Head: HEAD
Confidence: high

Required E2E targets

  • shields-config: OpenClaw config guard startup identity/readiness logic changed; the shields-config live job exercises a real OpenClaw sandbox, config guard lock/unlock, readiness, and shields transitions against the installed helper.
    • Dispatch: gh workflow run e2e.yaml --ref <pr-head-ref> --field jobs=shields-config
  • hermes-shields-config: Hermes runtime config guard startup identity logic changed; the hermes-shields-config live job proves fresh OpenShell-managed non-root Hermes startup and real shields down/up transitions using the installed runtime guard.
    • Dispatch: gh workflow run e2e.yaml --ref <pr-head-ref> --field jobs=hermes-shields-config

Optional E2E targets

  • hermes-gpu-startup: Adjacent GPU-specific Hermes startup proof covers the same runtime-config-guard startup authority boundary on the native GPU route; keep optional because it requires a special GPU runner and CPU Hermes shields coverage is the required floor.
    • Dispatch: gh workflow run e2e.yaml --ref <pr-head-ref> --field jobs=hermes-gpu-startup

Relevant changed files

  • agents/hermes/runtime-config-guard.py
  • scripts/openclaw-config-guard.py
  • test/startup-process-identity.test.ts

@github-actions

github-actions Bot commented Jul 9, 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 · 8 test follow-ups
Since last review: 0 prior items resolved · 0 still apply · 0 new items found

Action checklist

  • PRA-T1 Add or justify test follow-up: Runtime validation
  • PRA-T2 Add or justify test follow-up: Runtime validation
  • PRA-T3 Add or justify test follow-up: Runtime validation
  • PRA-T4 Add or justify test follow-up: Runtime validation
  • PRA-T5 Add or justify test follow-up: Acceptance clause
  • PRA-T6 Add or justify test follow-up: Acceptance clause
  • PRA-T7 Add or justify test follow-up: Acceptance clause
  • PRA-T8 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 Runtime validation — Add or identify targeted runtime/integration validation for the changed behavior; do not report external E2E job pass/fail here.. Runtime/sandbox/infrastructure paths need behavioral runtime validation: agents/hermes/runtime-config-guard.py, scripts/openclaw-config-guard.py. Static regression coverage is behavior-specific and imports the real guard modules, but the changed files are runtime/sandbox startup guards and the harness simulates `/proc` and namespace access rather than proving behavior in a live OpenShell/Docker/Landlock environment.
  • PRA-T2 Runtime validation — Add or identify targeted runtime/integration validation for `shields up/down` when `openshell-sandbox` is container PID 1 and OpenClaw `nemoclaw-start` is PID 1 inside a nested workload PID namespace.. Runtime/sandbox/infrastructure paths need behavioral runtime validation: agents/hermes/runtime-config-guard.py, scripts/openclaw-config-guard.py. Static regression coverage is behavior-specific and imports the real guard modules, but the changed files are runtime/sandbox startup guards and the harness simulates `/proc` and namespace access rather than proving behavior in a live OpenShell/Docker/Landlock environment.
  • PRA-T3 Runtime validation — Include namespace-link-denied runtime behavior, confirming the fallback still authenticates the stable direct-child and NSpid evidence without requiring readable namespace inode links.. Runtime/sandbox/infrastructure paths need behavioral runtime validation: agents/hermes/runtime-config-guard.py, scripts/openclaw-config-guard.py. Static regression coverage is behavior-specific and imports the real guard modules, but the changed files are runtime/sandbox startup guards and the harness simulates `/proc` and namespace access rather than proving behavior in a live OpenShell/Docker/Landlock environment.
  • PRA-T4 Runtime validation — Keep the existing static regression coverage for argv smuggling, noncanonical bash, misplaced start path, duplicate child, wrong supervisor, wrong UID, wrong parent, wrong required child, and cross-namespace outer-PID rejection.. Runtime/sandbox/infrastructure paths need behavioral runtime validation: agents/hermes/runtime-config-guard.py, scripts/openclaw-config-guard.py. Static regression coverage is behavior-specific and imports the real guard modules, but the changed files are runtime/sandbox startup guards and the harness simulates `/proc` and namespace access rather than proving behavior in a live OpenShell/Docker/Landlock environment.
  • PRA-T5 Acceptance clause — Platform scope: Reproduced on Brev (GCP Ubuntu 22.04) only; other platforms not tested — add test evidence or identify existing coverage. The review found generic procfs/OpenShell guard logic and simulated regression coverage, but did not verify live Brev/GCP Ubuntu 22.04 behavior or other platforms.
  • PRA-T6 Acceptance clause — Regression: Unknown — earlier versions not tested for shields on this topology — add test evidence or identify existing coverage. The diff adds regression coverage for the described topology, but this review did not assess historical releases.
  • PRA-T7 Acceptance clause — 1. Install NemoClaw v0.0.75 on Ubuntu 22.04 (GCP instance) — add test evidence or identify existing coverage. No live installation validation was performed in this read-only review.
  • PRA-T8 Acceptance clause — 2. `nemoclaw onboard` with NVIDIA provider (completes successfully) — add test evidence or identify existing coverage. The changed files do not touch onboarding code, and this review did not run onboarding.

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.

Signed-off-by: Chengjie Wang <chengjiew@nvidia.com>
@apurvvkumaria apurvvkumaria self-assigned this Jul 9, 2026
@github-actions

github-actions Bot commented Jul 9, 2026

Copy link
Copy Markdown
Contributor

E2E Target Results — ✅ All selected jobs passed

Run: 29032896048
Workflow ref: fix/6565_openshell_supervised_config_guard
Requested targets: ubuntu-repo-cloud-openclaw
Requested jobs: (default — all default-enabled free-standing jobs; explicit-only jobs openshell-gateway-auth-contract, mcp-bridge-dev, hermes-gpu-startup, sandbox-rlimits-connect, and jetson-nvmap-gpu are skipped unless selected)
Summary: 1 passed, 0 failed, 0 cancelled, 0 skipped

Job Result
live ✅ success

@github-actions

github-actions Bot commented Jul 9, 2026

Copy link
Copy Markdown
Contributor

E2E Target Results — ❌ Some jobs failed

Run: 29032896112
Workflow ref: fix/6565_openshell_supervised_config_guard
Requested targets: (default — all supported)
Requested jobs: shields-config,cloud-onboard
Summary: 1 passed, 1 failed, 0 cancelled, 0 skipped

Job Result
cloud-onboard ✅ success
shields-config ❌ failure

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

Accept only canonical direct or bash nemoclaw-start launch shapes.

Require both procfs command-line reads to remain identical.

Cover same-namespace and nested-PID extra-argument spoof attempts.

Co-authored-by: Chengjie Wang <chengjiew@nvidia.com>
Signed-off-by: Apurv Kumaria <akumaria@nvidia.com>
@github-actions

github-actions Bot commented Jul 9, 2026

Copy link
Copy Markdown
Contributor

E2E Target Results — ❌ Some jobs failed

Run: 29032896112
Workflow ref: fix/6565_openshell_supervised_config_guard
Requested targets: (default — all supported)
Requested jobs: shields-config,cloud-onboard
Summary: 1 passed, 1 failed, 0 cancelled, 0 skipped

Job Result
cloud-onboard ✅ success
shields-config ❌ failure

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

@github-actions

github-actions Bot commented Jul 9, 2026

Copy link
Copy Markdown
Contributor

E2E Target Results — ✅ All selected jobs passed

Run: 29033682489
Workflow ref: fix/6565_openshell_supervised_config_guard
Requested targets: ubuntu-repo-cloud-openclaw
Requested jobs: (default — all default-enabled free-standing jobs; explicit-only jobs openshell-gateway-auth-contract, mcp-bridge-dev, hermes-gpu-startup, sandbox-rlimits-connect, and jetson-nvmap-gpu are skipped unless selected)
Summary: 1 passed, 0 failed, 0 cancelled, 0 skipped

Job Result
live ✅ success

@github-actions

github-actions Bot commented Jul 9, 2026

Copy link
Copy Markdown
Contributor

E2E Target Results — ❌ Some jobs failed

Run: 29033682473
Workflow ref: fix/6565_openshell_supervised_config_guard
Requested targets: (default — all supported)
Requested jobs: cloud-onboard,shields-config
Summary: 1 passed, 1 failed, 0 cancelled, 0 skipped

Job Result
cloud-onboard ✅ success
shields-config ❌ failure

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

cv added 2 commits July 9, 2026 09:35
Signed-off-by: Carlos Villela <cvillela@nvidia.com>
Signed-off-by: Carlos Villela <cvillela@nvidia.com>
@cv

cv commented Jul 9, 2026

Copy link
Copy Markdown
Collaborator

Maintainer follow-up on exact head e69f149a8ff622a8e077400e34eee67f4cea46d3:

  • Synced current main with a signed merge commit.
  • Added the missing topology cross-product and nested required-PID negatives.
  • Tightened both OpenClaw and Hermes to require the canonical direct or approved bash + nemoclaw-start prefix and identical double-read cmdline evidence. Opaque trailing Docker CMD arguments remain allowed after that authenticated prefix; internal empty arguments are preserved, accepted bash argv0 values are restricted to bash, /bin/bash, and /usr/bin/bash, and misplaced/noncanonical prefixes are rejected.
  • Hermes keeps its independently tested same-namespace topology because [Brev][Policy&Network] shields up/down fails with CRITICAL "requires NemoClaw PID 1" on openshell-sandbox topology (v0.0.75) #6565 has no Hermes nested-PID reproduction.
  • Made test assertions linear and added the Landlock/NSpid topology rationale inline.

The first strict two-argument version was caught by exact-head test-non-root-sandbox-smoke: Docker legitimately appends CMD after ENTRYPOINT, so PID 1 was rejected. That regression is fixed on this head, and the fresh non-root production-image smoke now passes.

Local verification is green: focused process-identity and Hermes guard suites pass 26/26, Python compilation succeeds, and npm run check:diff passes. The primary exact-head advisor is merge_as_is.

The security review verdict remains warning, no demonstrated code-blocking vulnerability under the supported OpenShell v0.0.72 threat model. The nested path relies on kernel-owned NSpid plus direct-child/process-stability evidence; the supported sandbox UID cannot create or join a PID namespace under the pinned controls. The predicate remains process-shape/readiness evidence rather than same-UID provenance, consistent with the documented trust boundary.

Fresh exact-head runtime validation is running in:

Approval remains gated on those runs, settled current-head CI/advisors, and the normal merge gate.

The final documentation review found no durable docs change: standard Docker ENTRYPOINT/CMD composition and the existing command, troubleshooting, runtime-control, and security guidance remain accurate. This compatibility/security fix belongs in the v0.0.79 release notes.

@github-actions

github-actions Bot commented Jul 9, 2026

Copy link
Copy Markdown
Contributor

E2E Target Results — ❌ Some jobs failed

Run: 29034109789
Workflow ref: fix/6565_openshell_supervised_config_guard
Requested targets: (selector rejected by workflow validation)
Requested jobs: (selector rejected by workflow validation)
Summary: 0 passed, 1 failed, 0 cancelled, 0 skipped

Job Result
generate-matrix ❌ failure

Failed jobs: generate-matrix. Check run artifacts for logs.

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

github-actions Bot commented Jul 9, 2026

Copy link
Copy Markdown
Contributor

E2E Target Results — ❌ Some jobs failed

Run: 29033682473
Workflow ref: fix/6565_openshell_supervised_config_guard
Requested targets: (default — all supported)
Requested jobs: cloud-onboard,shields-config
Summary: 1 passed, 1 failed, 0 cancelled, 0 skipped

Job Result
cloud-onboard ✅ success
shields-config ❌ failure

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

@github-actions

github-actions Bot commented Jul 9, 2026

Copy link
Copy Markdown
Contributor

E2E Target Results — ✅ All selected jobs passed

Run: 29034314857
Workflow ref: fix/6565_openshell_supervised_config_guard
Requested targets: ubuntu-repo-cloud-openclaw
Requested jobs: (default — all default-enabled free-standing jobs; explicit-only jobs openshell-gateway-auth-contract, mcp-bridge-dev, hermes-gpu-startup, sandbox-rlimits-connect, and jetson-nvmap-gpu are skipped unless selected)
Summary: 1 passed, 0 failed, 0 cancelled, 0 skipped

Job Result
live ✅ success

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

github-actions Bot commented Jul 9, 2026

Copy link
Copy Markdown
Contributor

E2E Target Results — ⚠️ Run cancelled — no signal

Run: 29034312582
Workflow ref: fix/6565_openshell_supervised_config_guard
Requested targets: (default — all supported)
Requested jobs: shields-config,cloud-onboard
Summary: 0 passed, 0 failed, 2 cancelled, 0 skipped

Job Result
cloud-onboard ⚠️ cancelled
shields-config ⚠️ cancelled

@github-actions

github-actions Bot commented Jul 9, 2026

Copy link
Copy Markdown
Contributor

E2E Target Results — ✅ All requested jobs passed

Run: 29034503546
Workflow ref: fix/6565_openshell_supervised_config_guard
Requested targets: (default — all supported)
Requested jobs: cloud-onboard,shields-config
Summary: 2 passed, 0 failed, 0 cancelled, 0 skipped

Job Result
cloud-onboard ✅ success
shields-config ✅ success

@github-actions

github-actions Bot commented Jul 9, 2026

Copy link
Copy Markdown
Contributor

E2E Target Results — ✅ All selected jobs passed

Run: 29034503592
Workflow ref: fix/6565_openshell_supervised_config_guard
Requested targets: ubuntu-repo-cloud-openclaw
Requested jobs: (default — all default-enabled free-standing jobs; explicit-only jobs openshell-gateway-auth-contract, mcp-bridge-dev, hermes-gpu-startup, sandbox-rlimits-connect, and jetson-nvmap-gpu are skipped unless selected)
Summary: 1 passed, 0 failed, 0 cancelled, 0 skipped

Job Result
live ✅ success

@github-actions

github-actions Bot commented Jul 9, 2026

Copy link
Copy Markdown
Contributor

E2E Target Results — ⚠️ Run cancelled — no signal

Run: 29034958190
Workflow ref: fix/6565_openshell_supervised_config_guard
Requested targets: ubuntu-repo-cloud-openclaw
Requested jobs: (default — all default-enabled free-standing jobs; explicit-only jobs openshell-gateway-auth-contract, mcp-bridge-dev, hermes-gpu-startup, sandbox-rlimits-connect, and jetson-nvmap-gpu are skipped unless selected)
Summary: 0 passed, 0 failed, 1 cancelled, 0 skipped

Job Result
live ⚠️ cancelled

@github-actions

github-actions Bot commented Jul 9, 2026

Copy link
Copy Markdown
Contributor

E2E Target Results — ⚠️ Run cancelled — no signal

Run: 29034956116
Workflow ref: fix/6565_openshell_supervised_config_guard
Requested targets: (default — all supported)
Requested jobs: hermes-e2e,hermes-gpu-startup,hermes-shields-config,shields-config
Summary: 0 passed, 0 failed, 4 cancelled, 0 skipped

Job Result
hermes-e2e ⚠️ cancelled
hermes-gpu-startup ⚠️ cancelled
hermes-shields-config ⚠️ cancelled
shields-config ⚠️ cancelled

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

cv commented Jul 9, 2026

Copy link
Copy Markdown
Collaborator

Exact-head maintainer disposition for e69f149a8ff622a8e077400e34eee67f4cea46d3:

All ordinary CI is green, including the production-image non-root smoke that caught the earlier Docker CMD regression. The primary exact-head PR Review Advisor is merge_as_is.

Required runtime evidence is green:

  • Selective live run 29035702418: shields-config, hermes-shields-config, and both OpenClaw/Hermes security-posture matrix jobs passed.
  • Hermes image run 29035704292: build-hermes-sandbox-image, its secret-boundary test, and its root-entrypoint smoke passed; the entire workflow also finished green.

I audited the uploaded artifacts rather than relying on job conclusions alone. OpenClaw shields reported all 10 config/readiness/drift/audit assertions true. Hermes shields reported config preservation, the fresh non-root trigger, and both down/up cycles true. OpenClaw and Hermes security-posture artifacts both reported configureGuard, non-root host, locked rc/runtime-proxy state, and clean startup logs true. Hermes image artifacts reported every secret-boundary and root-entrypoint assertion true. Every audited target-result.json is passed, all JSON is valid, and every cleanup.json has an empty failure list.

Disposition of the secondary Nemotron findings:

  • PRA-1 / PRA-3: the OpenClaw-versus-Hermes nested-topology split is intentional and scoped. Issue [Brev][Policy&Network] shields up/down fails with CRITICAL "requires NemoClaw PID 1" on openshell-sandbox topology (v0.0.75) #6565 reproduces the nested PID namespace only for OpenClaw. Adding Hermes nested-topology behavior or extracting both security guards into a shared module without a Hermes reproduction would broaden this fix beyond its acceptance boundary. The shared argv/double-read hardening was applied to both guards; the topology difference was explicitly security-reviewed.
  • PRA-7: this conflates two distinct fixtures. openshell_cross_namespace_outer_pid has a readable supervisor namespace inode and is rejected, as the focused 26/26 suite proves. The separately modeled supervisor-inode-hidden nested case is intentionally accepted only with stable pinned-fd/start-time/cmdline/UID evidence, direct outer PPid: 1, and kernel-owned inner NSpid: 1; that fallback was accepted by the supported OpenShell v0.0.72 threat-model review.
  • PRA-2: its description is stale relative to this head. The current matcher authenticates only a canonical direct startup prefix or one of the three approved bash argv0 values followed immediately by nemoclaw-start, preserves internal empty arguments, and allows only opaque trailing Docker CMD arguments. Misplaced, noncanonical-bash, empty-argument, same-namespace, and nested argv spoofs are rejected. The exact production-image smoke confirms the legitimate trailing-CMD form.
  • PRA-4: the compatibility branches already carry linked source-of-truth review references for security: verify runtime OpenShell version against credential boundary manifest #6256 and [DGX Spark][Sandbox] NemoHermes sandbox PID 1 exits 1 at ensure-api-key on startup in v0.0.71 #6110. Adding a network-dependent CI issue-state query is not required for this runtime fix.
  • PRA-5, PRA-6, and the runtime test follow-ups are answered by the focused process-identity suite plus the audited exact-head shields, both-agent security-posture, secret-boundary, root-entrypoint, and non-root production-image evidence above.

No further source change is warranted from those secondary findings. Approval remains subject to the final deterministic post-report merge gate; this comment does not merge the PR.

@github-actions

github-actions Bot commented Jul 9, 2026

Copy link
Copy Markdown
Contributor

E2E Target Results — ✅ All requested jobs passed

Run: 29035702418
Workflow ref: fix/6565_openshell_supervised_config_guard
Requested targets: (default — all supported)
Requested jobs: shields-config,hermes-shields-config,security-posture
Summary: 3 passed, 0 failed, 0 cancelled, 0 skipped

Job Result
hermes-shields-config ✅ success
security-posture ✅ success
shields-config ✅ success

@cv cv 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 on exact head e69f149a8ff622a8e077400e34eee67f4cea46d3 after the Docker CMD compatibility regression was caught and fixed. All ordinary CI, the primary merge_as_is advisor, focused 26/26 identity/guard tests, audited OpenClaw and Hermes shields/security-posture runs, and audited Hermes image secret-boundary/root-entrypoint smokes are green. Secondary advisor dispositions and the accepted scoped threat-model rationale are recorded in the exact-head maintainer comment.

@github-actions

github-actions Bot commented Jul 9, 2026

Copy link
Copy Markdown
Contributor

E2E Target Results — ✅ All selected jobs passed

Run: 29035917175
Workflow ref: fix/6565_openshell_supervised_config_guard
Requested targets: ubuntu-repo-cloud-openclaw
Requested jobs: (default — all default-enabled free-standing jobs; explicit-only jobs openshell-gateway-auth-contract, mcp-bridge-dev, hermes-gpu-startup, sandbox-rlimits-connect, and jetson-nvmap-gpu are skipped unless selected)
Summary: 1 passed, 0 failed, 0 cancelled, 0 skipped

Job Result
live ✅ success

@github-actions

github-actions Bot commented Jul 9, 2026

Copy link
Copy Markdown
Contributor

E2E Target Results — ✅ All requested jobs passed

Run: 29035917181
Workflow ref: fix/6565_openshell_supervised_config_guard
Requested targets: (default — all supported)
Requested jobs: shields-config,hermes-shields-config
Summary: 2 passed, 0 failed, 0 cancelled, 0 skipped

Job Result
hermes-shields-config ✅ success
shields-config ✅ success

@apurvvkumaria
apurvvkumaria merged commit 4479da6 into main Jul 9, 2026
284 checks passed
@apurvvkumaria
apurvvkumaria deleted the fix/6565_openshell_supervised_config_guard branch July 9, 2026 17:30
@jyaunches jyaunches mentioned this pull request Jul 9, 2026
21 tasks
cv pushed a commit that referenced this pull request Jul 9, 2026
<!-- markdownlint-disable MD041 -->
## Summary
Adds the pre-tag v0.0.79 release notes entry to
`docs/about/release-notes.mdx` so the release plan can be generated
after docs merge.
The entry summarizes the merged v0.0.79 release train across inference,
diagnostics, runtime hardening, policies, onboarding recovery, and
release validation.

## Changes
- Added the v0.0.79 release notes section with linked follow-up
documentation for OpenRouter onboarding, managed vLLM changes,
completion and logging, Deep Agents runtime limits, policy updates,
onboarding recovery, and release validation.
- Source summary:
- #6461 -> `docs/about/release-notes.mdx`: Documents OpenRouter
onboarding support and links to inference/provider references.
- #6271 and #6272 -> `docs/about/release-notes.mdx`: Documents shell
completion and structured logging highlights.
- #6465, #6539, #6570, and #6528 -> `docs/about/release-notes.mdx`:
Documents status route-drift, orphaned sandbox, gateway cleanup, and DGX
Spark express-install diagnostics.
- #6523, #6551, #6484, #6488, #6324, and #6542 ->
`docs/about/release-notes.mdx`: Documents managed vLLM, Qwen3.6 tool
parser, compaction, and timeout/readiness improvements.
- #6559, #6538, #6560, #6568, #6552, #6567, and #6587 ->
`docs/about/release-notes.mdx`: Documents runtime, credential, proxy,
PID namespace, TOML, and provider-state hardening.
- #6541, #5415, #6246, #6496, and #6573 ->
`docs/about/release-notes.mdx`: Documents GitHub policy, Gmail policy,
MCP allowlist, WhatsApp, and messaging-variant updates.
- #6253, #6572, #6444, #6536, and #5860 ->
`docs/about/release-notes.mdx`: Documents onboarding resume and
create-step recovery improvements.
- #6508, #6527, #5506, #6588, #6446, #6447, #6582, #6296, #6367, #6397,
and #6505 -> `docs/about/release-notes.mdx`: Documents docs,
release-risk, and E2E validation 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
<!-- Check exactly one tests line and one docs line. Check other lines
when applicable. Add every requested justification or approval
reference. -->
- [ ] Tests added or updated for changed behavior
- [ ] Existing tests cover changed behavior — justification:
- [x] Tests not applicable — justification: Release-note prose only.
- [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
<!-- Check each applicable item only when supported by the requested
evidence. Run targeted tests once per relevant change set and rerun
after later edits or hook autofixes that can affect the tested behavior.
Do not rerun hook-covered checks. -->
- [x] PR description includes the DCO sign-off declaration 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 — command/result or justification: Tests
not applicable, release-note prose only.
- [ ] Applicable broad gate passed — `npm test` for broad
runtime/test-harness changes; `npm run check` for repo-wide
validation/coverage changes — command/result:
- [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)

Docs validation note: `npm run docs:check-agent-variants && npm run
docs:check-routes && git diff --check` passed. Full `npm run docs` is
currently blocked before Fern validation because the pinned
`fern-api@5.65.2` package is unavailable from npm (`ETARGET No matching
version found`).

---
<!-- DCO sign-off is required in this PR description, and every commit
must appear as Verified in GitHub. Run: git config user.name && git
config user.email -->
Signed-off-by: Julie Yaunches <jyaunches@nvidia.com>


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

## Summary by CodeRabbit

* **Documentation**
* Added release notes for v0.0.79 with a new summary of recent
improvements, including onboarding and inference options, operator/CLI
diagnostics, sandbox recovery hardening, runtime limits, network policy
behavior, and release validation updates.
  * Added updated references and links for the latest release.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
@wscurran wscurran added area: security Security controls, permissions, secrets, or hardening bug-fix PR fixes a bug or regression platform: brev Affects Brev hosted development environments labels Jul 12, 2026
Hadar301 pushed a commit to Hadar301/NemoClaw-OpenShift that referenced this pull request Jul 12, 2026
<!-- markdownlint-disable MD041 -->
## Summary
Fix OpenClaw shields config-guard startup detection when
`openshell-sandbox` is PID 1 and `nemoclaw-start` is PID 1 inside
OpenShell's nested workload PID namespace. The guard now recognizes that
authenticated topology without weakening the existing process identity
checks.

## Related Issue
Fixes NVIDIA#6565

## Changes
- Accept a stable nested workload PID namespace when the pinned direct
child reports `NSpid` 1, including when Landlock hides namespace inode
links.
- Preserve the existing UID, exact command line, direct-parent,
double-read, and pinned-proc identity checks.
- Add OpenClaw regression coverage for readable and Landlock-restricted
namespace evidence while retaining Hermes and spoofing negative
controls.

## 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
<!-- Check exactly one tests line and one docs line. Check other lines
when applicable. Add every requested justification or approval
reference. -->
- [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: Restores the intended
OpenShell runtime topology without changing commands, configuration, or
documented workflow.
- [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: Focused security review
confirmed the new branch retains pinned proc identity, two stable reads,
PPID 1, effective UID, exact command line, and duplicate-process
rejection; only the authenticated nested PID namespace shape is added.
- [ ] Non-success, skipped, or missing CI check accepted by maintainer —
check name, approval link, and follow-up issue:

## Verification
<!-- Check each applicable item only when supported by the requested
evidence. Run targeted tests once per relevant change set and rerun
after later edits or hook autofixes that can affect the tested behavior.
Do not rerun hook-covered checks. -->
- [x] PR description includes the DCO sign-off declaration 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 — command/result or justification: 46
integration tests and 54 shields CLI tests passed.
- [ ] Applicable broad gate passed — `npm test` for broad
runtime/test-harness changes; `npm run check` for repo-wide
validation/coverage changes — command/result:
- [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)

---
<!-- DCO sign-off is required in this PR description, and every commit
must appear as Verified in GitHub. Run: git config user.name && git
config user.email -->
Signed-off-by: Chengjie Wang <chengjiew@nvidia.com>


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

* **Bug Fixes**
* Improved supervised startup process identity detection across
same-namespace and nested PID-namespace scenarios, including more
reliable command-line matching and additional validation to confirm
correct runtime topology.
* Updated nested PID-namespace access-denial behavior to align with
actual observed results.

* **Tests**
* Expanded startup-process identity coverage for nested PID namespaces,
including added supervised entrypoint and argv-spoof scenarios.
* Updated parameterized expectations and added new OpenShell nested
variants (including cross-namespace and landlock denial cases).
<!-- end of auto-generated comment: release notes by coderabbit.ai -->

---------

Signed-off-by: Chengjie Wang <chengjiew@nvidia.com>
Signed-off-by: Apurv Kumaria <akumaria@nvidia.com>
Signed-off-by: Carlos Villela <cvillela@nvidia.com>
Co-authored-by: Apurv Kumaria <akumaria@nvidia.com>
Co-authored-by: Carlos Villela <cvillela@nvidia.com>
Hadar301 pushed a commit to Hadar301/NemoClaw-OpenShift that referenced this pull request Jul 12, 2026
<!-- markdownlint-disable MD041 -->
## Summary
Adds the pre-tag v0.0.79 release notes entry to
`docs/about/release-notes.mdx` so the release plan can be generated
after docs merge.
The entry summarizes the merged v0.0.79 release train across inference,
diagnostics, runtime hardening, policies, onboarding recovery, and
release validation.

## Changes
- Added the v0.0.79 release notes section with linked follow-up
documentation for OpenRouter onboarding, managed vLLM changes,
completion and logging, Deep Agents runtime limits, policy updates,
onboarding recovery, and release validation.
- Source summary:
- NVIDIA#6461 -> `docs/about/release-notes.mdx`: Documents OpenRouter
onboarding support and links to inference/provider references.
- NVIDIA#6271 and NVIDIA#6272 -> `docs/about/release-notes.mdx`: Documents shell
completion and structured logging highlights.
- NVIDIA#6465, NVIDIA#6539, NVIDIA#6570, and NVIDIA#6528 -> `docs/about/release-notes.mdx`:
Documents status route-drift, orphaned sandbox, gateway cleanup, and DGX
Spark express-install diagnostics.
- NVIDIA#6523, NVIDIA#6551, NVIDIA#6484, NVIDIA#6488, NVIDIA#6324, and NVIDIA#6542 ->
`docs/about/release-notes.mdx`: Documents managed vLLM, Qwen3.6 tool
parser, compaction, and timeout/readiness improvements.
- NVIDIA#6559, NVIDIA#6538, NVIDIA#6560, NVIDIA#6568, NVIDIA#6552, NVIDIA#6567, and NVIDIA#6587 ->
`docs/about/release-notes.mdx`: Documents runtime, credential, proxy,
PID namespace, TOML, and provider-state hardening.
- NVIDIA#6541, NVIDIA#5415, NVIDIA#6246, NVIDIA#6496, and NVIDIA#6573 ->
`docs/about/release-notes.mdx`: Documents GitHub policy, Gmail policy,
MCP allowlist, WhatsApp, and messaging-variant updates.
- NVIDIA#6253, NVIDIA#6572, NVIDIA#6444, NVIDIA#6536, and NVIDIA#5860 ->
`docs/about/release-notes.mdx`: Documents onboarding resume and
create-step recovery improvements.
- NVIDIA#6508, NVIDIA#6527, NVIDIA#5506, NVIDIA#6588, NVIDIA#6446, NVIDIA#6447, NVIDIA#6582, NVIDIA#6296, NVIDIA#6367, NVIDIA#6397,
and NVIDIA#6505 -> `docs/about/release-notes.mdx`: Documents docs,
release-risk, and E2E validation 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
<!-- Check exactly one tests line and one docs line. Check other lines
when applicable. Add every requested justification or approval
reference. -->
- [ ] Tests added or updated for changed behavior
- [ ] Existing tests cover changed behavior — justification:
- [x] Tests not applicable — justification: Release-note prose only.
- [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
<!-- Check each applicable item only when supported by the requested
evidence. Run targeted tests once per relevant change set and rerun
after later edits or hook autofixes that can affect the tested behavior.
Do not rerun hook-covered checks. -->
- [x] PR description includes the DCO sign-off declaration 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 — command/result or justification: Tests
not applicable, release-note prose only.
- [ ] Applicable broad gate passed — `npm test` for broad
runtime/test-harness changes; `npm run check` for repo-wide
validation/coverage changes — command/result:
- [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)

Docs validation note: `npm run docs:check-agent-variants && npm run
docs:check-routes && git diff --check` passed. Full `npm run docs` is
currently blocked before Fern validation because the pinned
`fern-api@5.65.2` package is unavailable from npm (`ETARGET No matching
version found`).

---
<!-- DCO sign-off is required in this PR description, and every commit
must appear as Verified in GitHub. Run: git config user.name && git
config user.email -->
Signed-off-by: Julie Yaunches <jyaunches@nvidia.com>


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

## Summary by CodeRabbit

* **Documentation**
* Added release notes for v0.0.79 with a new summary of recent
improvements, including onboarding and inference options, operator/CLI
diagnostics, sandbox recovery hardening, runtime limits, network policy
behavior, and release validation updates.
  * Added updated references and links for the latest release.

<!-- 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: security Security controls, permissions, secrets, or hardening bug-fix PR fixes a bug or regression platform: brev Affects Brev hosted development environments

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Brev][Policy&Network] shields up/down fails with CRITICAL "requires NemoClaw PID 1" on openshell-sandbox topology (v0.0.75)

4 participants