Skip to content

fix(sandbox): refresh plugin registry after gateway start to recover non-bundled plugins (#2021)#4681

Merged
cv merged 13 commits into
mainfrom
fix/2021-plugin-registry-refresh
Jun 4, 2026
Merged

fix(sandbox): refresh plugin registry after gateway start to recover non-bundled plugins (#2021)#4681
cv merged 13 commits into
mainfrom
fix/2021-plugin-registry-refresh

Conversation

@cjagwani

@cjagwani cjagwani commented Jun 2, 2026

Copy link
Copy Markdown
Contributor

Summary

Temporary workaround for #2021. Under GPU sandbox onboard, OpenClaw's policy-change registry regen rebuilds plugins[] from bundled extensions only, dropping path-origin (nemoclaw) and npm-origin (openclaw-weixin) entries from the runtime registry view. Their installRecords survive on disk, but the runtime view forgets them — so the /nemoclaw slash command is unreachable in the TUI and openclaw plugins inspect nemoclaw returns "Plugin not found".

Run openclaw plugins registry --refresh as the sandbox user with HOME=/sandbox after the gateway has started; the refresh repopulates plugins[] from installRecords. Backgrounded so the gateway-wait loop is not blocked; PID is tracked in SANDBOX_CHILD_PIDS so SIGTERM still reaps it. Failure is non-fatal. Runs once per cold start and heals the initial post-start policy-regeneration regression. Later runtime policy mutations remain owned by the upstream OpenClaw fix tracked in openclaw/openclaw#89606.

Related Issue

Fixes #2021.

Why this is temporary

The root cause is upstream in OpenClaw's plugins registry --refresh (refreshReason: policy-changed) path: regen should rebuild plugins[] from installRecords ∪ bundled discovery, not bundled only. Tracking upstream as openclaw/openclaw#89606. Once that lands, this workaround block should be removed.

Reproduction confirmed today

Byte-for-byte reproduction on a fresh Brev T4 GPU instance (n1-highcpu-4:nvidia-tesla-t4:1), matching @wangericnv's evidence on the 0690 Spark:

{
  "refresh_reason": "policy-changed",
  "has_nemoclaw_install_record": true,
  "nemoclaw_in_plugins_array": 0,
  "has_weixin_install_record": true,
  "weixin_in_plugins_array": 0,
  "install_record_origins": [{"nemoclaw": "path"}, {"openclaw-weixin": "npm"}]
}

Verified openclaw plugins registry --refresh as the sandbox user repopulates the runtime registry and restores openclaw nemoclaw --help + openclaw plugins list recognition. Full evidence: #2021 (comment).

Changes

  • scripts/nemoclaw-start.sh: post-start_auto_pair block runs the refresh in a backgrounded subshell after the gateway becomes responsive; PID tracked in SANDBOX_CHILD_PIDS for cleanup.
  • test/nemoclaw-start-plugin-refresh.test.ts: behavior test that extracts the production block and drives it against a stub openclaw binary — verifies the refresh fires, both the readiness probe and refresh run with HOME=/sandbox even when the parent shell has HOME=/root, the PID is captured + tracked, the gateway-status wait loop actually loops across multiple failures, and the installRecords-present/plugins-missing slash-router state is healed without enabling stale slash records.

Type of Change

  • Code change (feature, bug fix, or refactor)

Verification

  • npx vitest run --project cli test/nemoclaw-start-plugin-refresh.test.ts test/sandbox-init.test.ts — 49 / 49 pass
  • npm run source-shape:check — 0 source-shape cases (behavior-shaped test)
  • bash -n scripts/nemoclaw-start.sh scripts/lib/sandbox-init.sh test/e2e/test-full-e2e.sh test/e2e-gateway-isolation.sh — syntax OK
  • End-to-end repro on Brev T4 GPU showed the refresh restores openclaw nemoclaw --help and openclaw plugins list recognition of nemoclaw + weixin
  • No secrets, API keys, or credentials committed

Summary by CodeRabbit

  • Bug Fixes

    • Start a background plugin registry refresh during gateway startup that logs safely to a protected temp file, uses a sandbox HOME, skips if gateway never becomes ready, treats failures as non-fatal, and records the refresh PID for cleanup.
  • Tests

    • Expanded unit and e2e coverage for refresh timing, HOME/sandbox step-down behavior, PID cleanup tracking, probe/retry behavior, and plugin-registration regression.
  • Documentation

    • Updated /tmp trust-boundary notes and stricter /tmp log validation (reject symlinks, tightened ownership/mode checks).

Latest E2E failure notes

The repeated cloud-e2e and openclaw-onboard-security-posture-e2e failures had two layers:

  1. The refresh readiness probe inherited the root entrypoint HOME=/root. In root mode the probe could not see /sandbox/.openclaw gateway state, skipped the refresh, and the plugin registry/slash-alias check failed with empty output because command logs were redirected inside the sandbox. The readiness probe now steps down with HOME=/sandbox.
  2. After that fix, openclaw plugins inspect nemoclaw passed, proving the registry refresh healed the [All Platform] /nemoclaw slash command not working in sandbox OpenClaw TUI #2021 path, but openclaw nemoclaw --help exited non-zero due an unrelated OpenClaw config warning for a missing qqbot plugin entry. The E2E now treats only NemoClaw-specific missing-command/help failures as fatal while keeping inspect + runtime-slash manifest checks as the acceptance signal.

cjagwani added 2 commits June 2, 2026 13:48
…non-bundled plugins

Under GPU sandbox onboard, OpenClaw's policy-change registry regen rebuilds
plugins[] from bundled extensions only, dropping path-origin (nemoclaw) and
npm-origin (openclaw-weixin) entries from the runtime registry view. Their
installRecords survive on disk, but the runtime view forgets them — so the
/nemoclaw slash command is unreachable in the TUI and `openclaw plugins
inspect nemoclaw` returns "Plugin not found". Reproduced today byte-for-byte
on a fresh Brev T4 GPU instance, matching wangericnv's evidence on a 0690
Spark (#2021).

Run `openclaw plugins registry --refresh` as the sandbox user after the
gateway has started. Backgrounded so the gateway-wait loop is not blocked;
PID is tracked in SANDBOX_CHILD_PIDS so SIGTERM still reaps it. Failure is
non-fatal so the gateway can still serve other plugins. Runs once per cold
start, so it also covers later policy mutations that re-trigger the regen.

This is a temporary workaround. The permanent fix is upstream in OpenClaw's
regen logic (openclaw/openclaw#89606) — once that lands, this block should
be removed.

Fixes #2021

Signed-off-by: Charan Jagwani <cjagwani@nvidia.com>
Extracts the workaround block from scripts/nemoclaw-start.sh and drives it
under bash with a stub openclaw binary. Verifies:

1. The refresh fires once `openclaw gateway status` reports ready.
2. The refresh runs with HOME=/sandbox even when the parent shell has
   HOME=/root — protects against the root-mode install bug where the
   plugin lands in /root/.openclaw/extensions/ instead of
   /sandbox/.openclaw/extensions/ and silently fails to repopulate the
   runtime plugins[].
3. PLUGIN_REFRESH_PID is captured and appended to SANDBOX_CHILD_PIDS so
   SIGTERM cleanup reaps the backgrounded subshell.
4. The loop waits across multiple `gateway status` failures before
   refreshing — simulates cold-start where the gateway needs a few
   seconds to start serving.

Behavior-shaped (not source-text); source-shape budget stays at 0.

Signed-off-by: Charan Jagwani <cjagwani@nvidia.com>
@coderabbitai

coderabbitai Bot commented Jun 2, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Note

Reviews paused

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

Use the following commands to manage reviews:

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

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

Adds a background, gateway-readiness-gated plugin registry refresh that logs to /tmp/nemoclaw-plugin-refresh.log, hardens /tmp log validation (rejects symlinks/non-regular files and tightens modes/ownership), and adds extraction/harness unit tests plus an e2e SSH plugin presence check.

Changes

Plugin registry refresh workaround

Layer / File(s) Summary
/tmp trust-boundary and validation
scripts/lib/sandbox-init.sh, test/sandbox-init.test.ts
Adds /tmp/nemoclaw-plugin-refresh.log to the trust map and tightens validate_tmp_permissions to reject symlinks/non-regular files and apply explicit per-file permission/ownership checks; adds a symlink rejection test.
Startup refresh workaround
scripts/nemoclaw-start.sh
Adds prepare_plugin_refresh_log and start_plugin_registry_refresh, probes "$OPENCLAW" gateway status for readiness, runs HOME=/sandbox "$OPENCLAW" plugins registry --refresh in background when ready, logs to the prepared file, and appends PLUGIN_REFRESH_PID to SANDBOX_CHILD_PIDS in both root and non-root startup paths.
Refresh block extraction and validation
test/nemoclaw-start-plugin-refresh.test.ts
Adds extractShellFunction/extractRefreshBlock, a generated wrapper that injects the refresh block with a stubbed openclaw, and tests verifying probe/retry timing, HOME override, STEP_DOWN_USER, PID capture, and gateway-never-ready behavior.
Test harness wiring & e2e plugin check
test/nemoclaw-start.test.ts, test/e2e/test-full-e2e.sh, test/e2e-gateway-isolation.sh
Wires prepare_plugin_refresh_log into pre-gateway test setup (with temp PLUGIN_REFRESH_LOG), stubs the refresh in the signal-handling test, adds Phase 3e SSH-based plugin presence check (looks for plugin-ok), and tightens sed anchoring when sourcing apply_model_override.

Sequence Diagram(s)

sequenceDiagram
  participant StartScript as start_plugin_registry_refresh
  participant OpenClaw as openclaw
  participant LogFile as /tmp/nemoclaw-plugin-refresh.log

  StartScript->>OpenClaw: gateway status probe
  OpenClaw-->>StartScript: status response
  alt gateway becomes ready
    StartScript->>OpenClaw: HOME=/sandbox plugins registry --refresh
    OpenClaw->>LogFile: append stdout/stderr
    StartScript->>StartScript: write PLUGIN_REFRESH_PID, append to SANDBOX_CHILD_PIDS
  else gateway never ready (after probes)
    StartScript-->>StartScript: skip refresh (non-fatal)
  end
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Suggested labels

fix, Sandbox, OpenShell

Suggested reviewers

  • cv
  • prekshivyas

Poem

🐰 I hopped to /tmp with careful paws,
I sniffed for symlinks, checked every clause.
When the gateway woke, I nudged refresh through,
Logged HOME in sandbox and a PID or two.
Soft fur, clean files — the plugins say “phew!”

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 44.44% 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
Title check ✅ Passed The PR title accurately summarizes the main change: implementing plugin registry refresh after gateway startup to recover non-bundled plugins, directly addressing issue #2021.
Linked Issues check ✅ Passed The code changes implement the required fix by refreshing the plugin registry after gateway startup with proper HOME environment and PID tracking, directly addressing the missing /nemoclaw command issue.
Out of Scope Changes check ✅ Passed All changes are scoped to plugin registry refresh functionality: startup script modifications, comprehensive test coverage, permission validation updates, and e2e verification. No unrelated changes detected.
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.

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

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch fix/2021-plugin-registry-refresh

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

@cjagwani cjagwani self-assigned this Jun 2, 2026
@cjagwani cjagwani added the v0.0.57 Release target label Jun 2, 2026
@github-actions

github-actions Bot commented Jun 2, 2026

Copy link
Copy Markdown
Contributor

E2E Advisor Recommendation

Required E2E: test-e2e-gateway-isolation, cloud-e2e, openclaw-tui-chat-correlation-e2e
Optional E2E: test-non-root-sandbox-smoke, test-e2e-sandbox

Dispatch hint: cloud-e2e,openclaw-tui-chat-correlation-e2e

Auto-dispatched E2E: cloud-e2e, openclaw-tui-chat-correlation-e2e via nightly-e2e.yaml at 05783397a67e94b398cbb593f0f126ddbffa3586nightly run

Workflow run

Full advisor summary

E2E Recommendation Advisor

Base: origin/main
Head: HEAD
Confidence: high

Required E2E

  • test-e2e-gateway-isolation (medium): Required because the PR changes the sandbox entrypoint and /tmp trust-boundary validation for a new plugin-refresh log. This existing image-level E2E exercises real container ownership, permissions, non-root behavior, and gateway isolation assumptions.
  • cloud-e2e (high): Required because the fix targets the post-onboard OpenClaw gateway/plugin registry state. The full E2E now explicitly verifies that the NemoClaw plugin remains registered with its runtime slash alias after sandbox policy initialization.
  • openclaw-tui-chat-correlation-e2e (high): Required because the affected behavior is the real user-facing /nemoclaw command surface in OpenClaw. The full E2E checks non-interactive registry state, while this existing scenario covers the interactive TUI/chat path that consumes the slash alias.

Optional E2E

  • test-non-root-sandbox-smoke (low): Useful confidence because the non-root entrypoint path also now prepares the plugin-refresh log and starts the background refresh. Unit tests cover much of this, but this smoke can catch image/runtime regressions specific to non-root startup.
  • test-e2e-sandbox (medium): Optional adjacent image smoke for OpenClaw CLI/plugin installation and blueprint assets. It is less targeted than gateway isolation or full onboard, but gives additional confidence that the rebuilt sandbox image still has a usable plugin payload.

New E2E recommendations

  • plugin registry refresh startup workaround (medium): Existing coverage now verifies the plugin after full onboard and unit-tests the refresh block, but there is no small focused E2E that creates the policy-regenerated installRecords-present/plugins-missing state inside a real sandbox and asserts startup refresh repairs it without requiring the full cloud flow.
    • Suggested test: Add a focused sandbox E2E that boots an OpenClaw sandbox with a deliberately stale runtime plugin registry, restarts the entrypoint/gateway, and asserts openclaw plugins inspect nemoclaw and /nemoclaw slash alias recover from installRecords.

Dispatch hint

  • Workflow: .github/workflows/nightly-e2e.yaml
  • jobs input: cloud-e2e,openclaw-tui-chat-correlation-e2e

@github-actions

github-actions Bot commented Jun 2, 2026

Copy link
Copy Markdown
Contributor

E2E Scenario Advisor Recommendation

Required scenario E2E: ubuntu-repo-cloud-openclaw
Optional scenario E2E: ubuntu-repo-cloud-hermes, gpu-repo-local-ollama-openclaw

Dispatch required scenario E2E:

  • gh workflow run e2e-scenarios.yaml --ref <pr-head-ref> --field scenarios=ubuntu-repo-cloud-openclaw

Workflow run

Full scenario advisor summary

E2E Scenario Advisor

Base: origin/main
Head: HEAD
Confidence: high

Required scenario E2E

  • ubuntu-repo-cloud-openclaw: Changes modify OpenClaw sandbox startup, gateway launch follow-up work, plugin registry refresh, and /tmp trust-boundary log validation. The default Ubuntu repo-current cloud OpenClaw scenario is the smallest primary scenario that exercises the changed entrypoint during onboarding and validates gateway/sandbox readiness plus inference routing.
    • Dispatch: gh workflow run e2e-scenarios.yaml --ref <pr-head-ref> --field scenarios=ubuntu-repo-cloud-openclaw

Optional scenario E2E

  • ubuntu-repo-cloud-hermes: scripts/lib/sandbox-init.sh is shared by OpenClaw and Hermes entrypoints. This adjacent scenario can catch regressions in the shared /tmp permission validation path for Hermes without expanding to all scenarios.
    • Dispatch: gh workflow run e2e-scenarios.yaml --ref <pr-head-ref> --field scenarios=ubuntu-repo-cloud-hermes
  • gpu-repo-local-ollama-openclaw: The plugin-refresh workaround comments call out GPU/local Ollama onboarding as an affected shape. This special-runner scenario exercises that adjacent OpenClaw startup path, but is optional because the required Ubuntu OpenClaw scenario already runs the modified startup hook.
    • Dispatch: gh workflow run e2e-scenarios.yaml --ref <pr-head-ref> --field scenarios=gpu-repo-local-ollama-openclaw

Relevant changed files

  • scripts/lib/sandbox-init.sh
  • scripts/nemoclaw-start.sh

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Actionable comments posted: 2

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

Inline comments:
In `@test/nemoclaw-start-plugin-refresh.test.ts`:
- Line 154: The TypeScript error occurs because result.stdout is typed as string
| NonSharedBuffer; in the regex match assignment for tracked you should cast
result.stdout to string before calling .match (e.g., use (result.stdout as
string)). Update the expression that defines tracked (the line using
result.stdout.match(/^SANDBOX_CHILD_PIDS=(.+)$/m) in the test) to cast
result.stdout to string so the regex call is properly typed.
- Line 151: The TypeScript error comes from using result.stdout.match(...) where
result.stdout is typed string | NonSharedBuffer; fix by normalizing stdout to a
string before calling match: create a local stdout variable (e.g., const stdout
= typeof result.stdout === 'string' ? result.stdout :
result.stdout.toString('utf8')) and then use
stdout.match(/^PLUGIN_REFRESH_PID=(\d+)$/m)?.[1] to assign pid; reference the
pid assignment and result.stdout in the test.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: c850cf94-983b-477c-8d2a-657a7cece7de

📥 Commits

Reviewing files that changed from the base of the PR and between 0c958cf and 05b8833.

📒 Files selected for processing (2)
  • scripts/nemoclaw-start.sh
  • test/nemoclaw-start-plugin-refresh.test.ts

Comment thread test/nemoclaw-start-plugin-refresh.test.ts Outdated
Comment thread test/nemoclaw-start-plugin-refresh.test.ts Outdated
@github-actions

github-actions Bot commented Jun 2, 2026

Copy link
Copy Markdown
Contributor

PR Review Advisor

Findings: 1 needs attention, 4 worth checking, 0 nice ideas
Since last review: 0 prior items resolved, 4 still apply, 0 new items found

Review findings

🛠️ Needs attention

  • Linked /nemoclaw TUI slash-command behavior is still not directly validated (test/e2e/test-full-e2e.sh:266): Issue [All Platform] /nemoclaw slash command not working in sandbox OpenClaw TUI #2021 and its verification comments are specifically about OpenClaw TUI/chat slash routing: autocomplete should find /nemoclaw, /help should list it, and pressing Enter on /nemoclaw should execute the command or show help instead of sending plain chat text. The changed E2E validates registry inspect, direct CLI help, and the manifest runtime-slash alias, but it explicitly does not drive the TUI/chat router surface that failed.
    • Recommendation: Add or identify targeted runtime validation for the actual slash-command surface after the refresh. Prefer an assertion that /help or the runtime command registry includes /nemoclaw and that a TUI/chat-compatible input such as /nemoclaw or /nemoclaw status is intercepted or returns plugin help. If this is owned by an existing TUI automation scenario, make that scenario assert these [All Platform] /nemoclaw slash command not working in sandbox OpenClaw TUI #2021 clauses rather than only plugin inspect/direct CLI help.
    • Evidence: The new check runs HOME=/sandbox openclaw plugins inspect nemoclaw, HOME=/sandbox openclaw nemoclaw --help, and greps /sandbox/.openclaw/extensions/nemoclaw/openclaw.plugin.json for name/runtime-slash. It does not launch openclaw tui/openclaw chat, inspect TUI /help output, assert autocomplete matches, or verify Enter dispatch. Issue [All Platform] /nemoclaw slash command not working in sandbox OpenClaw TUI #2021 expected result says typing /nemoclaw should show autocomplete hints and pressing Enter should execute the command or display help; comments 4574218252 and 4589214537 call out /help absence and Enter sending /nemoclaw as plain chat text.

🔎 Worth checking

  • Source-of-truth review needed: scripts/nemoclaw-start.sh post-gateway plugin registry refresh: The advisor marked localized patch analysis as needs_followup.
    • Recommendation: Identify the invalid state, source boundary, source-fix constraint, regression test, and removal condition before merging the localized behavior.
    • Evidence: scripts/nemoclaw-start.sh lines around the refresh document the invalid state, upstream source boundary, one-shot scope, and removal condition; test/nemoclaw-start-plugin-refresh.test.ts and test/e2e/test-full-e2e.sh provide indirect/stubbed regression evidence.
  • Post-policy plugin refresh still relies on OpenClaw to preserve plugin allowlist boundaries (scripts/nemoclaw-start.sh:2937): The workaround invokes OpenClaw's registry refresh after a policy-regeneration boundary. That restores non-bundled plugins from persisted installRecords, but NemoClaw does not scope the refresh to known NemoClaw-managed plugins or independently verify that stale or tampered installRecords cannot become enabled slash-router entries.
    • Recommendation: Add a real OpenClaw registry/policy negative test, or constrain/document the restore scope if only known NemoClaw-managed plugins should be re-enabled. At minimum, prove against the actual registry implementation that a stale or tampered installRecord is not promoted into plugins.allow or the slash-router by plugins registry --refresh.
    • Evidence: start_plugin_registry_refresh calls "$OPENCLAW" plugins registry --refresh without filtering. test/nemoclaw-start-plugin-refresh.test.ts simulates staleSlash staying empty, but that behavior is controlled by the fake openclaw stub rather than NemoClaw enforcement or a real OpenClaw registry assertion.
  • Real policy-changed registry shape and slash-router recovery are still only indirectly covered (test/nemoclaw-start-plugin-refresh.test.ts:301): The unit harness models the important installRecords-present/plugins-missing shape and verifies that the startup hook invokes a refresh with HOME=/sandbox, which is useful. However, it does not create or observe the concrete OpenClaw policy-changed state, plugins.allow validator behavior, or actual slash-router recovery that caused [All Platform] /nemoclaw slash command not working in sandbox OpenClaw TUI #2021. The full E2E observes only a healed post-start registry/direct-command/manifest state.
    • Recommendation: Add or identify a runtime/integration scenario that captures the pre-refresh invalid shape under the actual OpenClaw registry, then proves the refresh heals both plugin lookup and the user-visible slash-router state. If exact pre-refresh reproduction cannot be kept in-repo, document the owning runtime scenario and make it assert the closest observable facts: plugins inspect fails before refresh, refresh runs, plugins inspect succeeds after refresh, and /nemoclaw is visible to the slash router.
    • Evidence: The unit test writes a fake registry-state file with installRecords:nemoclaw,stale-plugin and empty plugins/slash, then the fake openclaw command rewrites it. test/e2e/test-full-e2e.sh checks post-start inspect/help/manifest only; it does not snapshot actual installs.json or plugins.allow before refresh, nor does it prove the real slash-router consumed the refreshed registry.
  • Source-of-truth workaround still needs a real upstream-regression proof (scripts/nemoclaw-start.sh:3306): The localized startup workaround is now well documented: it names the invalid state, OpenClaw source boundary, why NemoClaw cannot fix the source here, one-shot scope, and removal condition. The remaining source-of-truth gap is that the regression proof is still indirect and mostly stubbed, so the upstream registry behavior can regress without an in-repo test catching the actual invalid state or slash-router failure.
    • Recommendation: Keep the source-boundary comments, but add a real OpenClaw integration proof or identify the owning runtime scenario that fails before the refresh and passes after it. Include the actual policy-changed registry state and slash-router visibility, not only a stubbed installRecords model.
    • Evidence: scripts/nemoclaw-start.sh documents the policy-changed rebuild, upstream plugins registry --refresh (refreshReason: policy-changed) drops path/npm-origin plugins from plugins[] openclaw/openclaw#89606, and removal condition. test/nemoclaw-start-plugin-refresh.test.ts covers mechanics with stubs; test/e2e/test-full-e2e.sh observes a healed direct CLI/manifest state but not the actual source invalid state or TUI slash router.

🌱 Nice ideas

  • None.
Consider writing more tests for
  • **Runtime validation** — Add a runtime TUI/chat slash-router test that sends /nemoclaw or /nemoclaw status after gateway startup and asserts the input is intercepted as a slash command rather than sent as plain chat text.. Unit coverage is strong for the entrypoint mechanics, but the PR touches sandbox startup and a plugin registry workaround whose acceptance and security-policy confidence depend on real OpenClaw registry, plugins.allow, and TUI/chat slash-router behavior.
  • **Runtime validation** — Add a runtime /help or command-registry assertion that /nemoclaw appears in the actual OpenClaw TUI/chat slash-command list after the refresh.. Unit coverage is strong for the entrypoint mechanics, but the PR touches sandbox startup and a plugin registry workaround whose acceptance and security-policy confidence depend on real OpenClaw registry, plugins.allow, and TUI/chat slash-router behavior.
  • **Runtime validation** — Add autocomplete-level validation that filtering from / to /nemoclaw yields the NemoClaw command or subcommands, if the TUI automation harness supports it.. Unit coverage is strong for the entrypoint mechanics, but the PR touches sandbox startup and a plugin registry workaround whose acceptance and security-policy confidence depend on real OpenClaw registry, plugins.allow, and TUI/chat slash-router behavior.
  • **Runtime validation** — Add a real OpenClaw registry/policy negative test where a stale or tampered installRecord exists and plugins registry --refresh does not promote it into plugins.allow or the slash-router.. Unit coverage is strong for the entrypoint mechanics, but the PR touches sandbox startup and a plugin registry workaround whose acceptance and security-policy confidence depend on real OpenClaw registry, plugins.allow, and TUI/chat slash-router behavior.
  • **Runtime validation** — Add or identify an integration scenario that captures the actual policy-changed pre-refresh shape, then proves refresh changes plugin lookup from failing to passing and makes /nemoclaw visible to the slash router.. Unit coverage is strong for the entrypoint mechanics, but the PR touches sandbox startup and a plugin registry workaround whose acceptance and security-policy confidence depend on real OpenClaw registry, plugins.allow, and TUI/chat slash-router behavior.
  • **Real policy-changed registry shape and slash-router recovery are still only indirectly covered** — Add or identify a runtime/integration scenario that captures the pre-refresh invalid shape under the actual OpenClaw registry, then proves the refresh heals both plugin lookup and the user-visible slash-router state. If exact pre-refresh reproduction cannot be kept in-repo, document the owning runtime scenario and make it assert the closest observable facts: plugins inspect fails before refresh, refresh runs, plugins inspect succeeds after refresh, and /nemoclaw is visible to the slash router.
  • **Acceptance clause:** The /nemoclaw slash command registered by the NemoClaw plugin cannot be executed inside the OpenClaw TUI. — add test evidence or identify existing coverage. No changed test executes /nemoclaw inside openclaw tui, openclaw chat, or another TUI/chat-router-compatible surface. The new E2E uses direct CLI commands and manifest inspection.
  • **Acceptance clause:** Typing /nemoclaw in the chat input produces no response and no autocomplete/command hints. — add test evidence or identify existing coverage. No changed test types /nemoclaw into TUI/chat input or checks autocomplete/command hints.
Since last review details

Current findings:

  • Source-of-truth review needed: scripts/nemoclaw-start.sh post-gateway plugin registry refresh: The advisor marked localized patch analysis as needs_followup.
    • Recommendation: Identify the invalid state, source boundary, source-fix constraint, regression test, and removal condition before merging the localized behavior.
    • Evidence: scripts/nemoclaw-start.sh lines around the refresh document the invalid state, upstream source boundary, one-shot scope, and removal condition; test/nemoclaw-start-plugin-refresh.test.ts and test/e2e/test-full-e2e.sh provide indirect/stubbed regression evidence.
  • Linked /nemoclaw TUI slash-command behavior is still not directly validated (test/e2e/test-full-e2e.sh:266): Issue [All Platform] /nemoclaw slash command not working in sandbox OpenClaw TUI #2021 and its verification comments are specifically about OpenClaw TUI/chat slash routing: autocomplete should find /nemoclaw, /help should list it, and pressing Enter on /nemoclaw should execute the command or show help instead of sending plain chat text. The changed E2E validates registry inspect, direct CLI help, and the manifest runtime-slash alias, but it explicitly does not drive the TUI/chat router surface that failed.
    • Recommendation: Add or identify targeted runtime validation for the actual slash-command surface after the refresh. Prefer an assertion that /help or the runtime command registry includes /nemoclaw and that a TUI/chat-compatible input such as /nemoclaw or /nemoclaw status is intercepted or returns plugin help. If this is owned by an existing TUI automation scenario, make that scenario assert these [All Platform] /nemoclaw slash command not working in sandbox OpenClaw TUI #2021 clauses rather than only plugin inspect/direct CLI help.
    • Evidence: The new check runs HOME=/sandbox openclaw plugins inspect nemoclaw, HOME=/sandbox openclaw nemoclaw --help, and greps /sandbox/.openclaw/extensions/nemoclaw/openclaw.plugin.json for name/runtime-slash. It does not launch openclaw tui/openclaw chat, inspect TUI /help output, assert autocomplete matches, or verify Enter dispatch. Issue [All Platform] /nemoclaw slash command not working in sandbox OpenClaw TUI #2021 expected result says typing /nemoclaw should show autocomplete hints and pressing Enter should execute the command or display help; comments 4574218252 and 4589214537 call out /help absence and Enter sending /nemoclaw as plain chat text.
  • Post-policy plugin refresh still relies on OpenClaw to preserve plugin allowlist boundaries (scripts/nemoclaw-start.sh:2937): The workaround invokes OpenClaw's registry refresh after a policy-regeneration boundary. That restores non-bundled plugins from persisted installRecords, but NemoClaw does not scope the refresh to known NemoClaw-managed plugins or independently verify that stale or tampered installRecords cannot become enabled slash-router entries.
    • Recommendation: Add a real OpenClaw registry/policy negative test, or constrain/document the restore scope if only known NemoClaw-managed plugins should be re-enabled. At minimum, prove against the actual registry implementation that a stale or tampered installRecord is not promoted into plugins.allow or the slash-router by plugins registry --refresh.
    • Evidence: start_plugin_registry_refresh calls "$OPENCLAW" plugins registry --refresh without filtering. test/nemoclaw-start-plugin-refresh.test.ts simulates staleSlash staying empty, but that behavior is controlled by the fake openclaw stub rather than NemoClaw enforcement or a real OpenClaw registry assertion.
  • Real policy-changed registry shape and slash-router recovery are still only indirectly covered (test/nemoclaw-start-plugin-refresh.test.ts:301): The unit harness models the important installRecords-present/plugins-missing shape and verifies that the startup hook invokes a refresh with HOME=/sandbox, which is useful. However, it does not create or observe the concrete OpenClaw policy-changed state, plugins.allow validator behavior, or actual slash-router recovery that caused [All Platform] /nemoclaw slash command not working in sandbox OpenClaw TUI #2021. The full E2E observes only a healed post-start registry/direct-command/manifest state.
    • Recommendation: Add or identify a runtime/integration scenario that captures the pre-refresh invalid shape under the actual OpenClaw registry, then proves the refresh heals both plugin lookup and the user-visible slash-router state. If exact pre-refresh reproduction cannot be kept in-repo, document the owning runtime scenario and make it assert the closest observable facts: plugins inspect fails before refresh, refresh runs, plugins inspect succeeds after refresh, and /nemoclaw is visible to the slash router.
    • Evidence: The unit test writes a fake registry-state file with installRecords:nemoclaw,stale-plugin and empty plugins/slash, then the fake openclaw command rewrites it. test/e2e/test-full-e2e.sh checks post-start inspect/help/manifest only; it does not snapshot actual installs.json or plugins.allow before refresh, nor does it prove the real slash-router consumed the refreshed registry.
  • Source-of-truth workaround still needs a real upstream-regression proof (scripts/nemoclaw-start.sh:3306): The localized startup workaround is now well documented: it names the invalid state, OpenClaw source boundary, why NemoClaw cannot fix the source here, one-shot scope, and removal condition. The remaining source-of-truth gap is that the regression proof is still indirect and mostly stubbed, so the upstream registry behavior can regress without an in-repo test catching the actual invalid state or slash-router failure.
    • Recommendation: Keep the source-boundary comments, but add a real OpenClaw integration proof or identify the owning runtime scenario that fails before the refresh and passes after it. Include the actual policy-changed registry state and slash-router visibility, not only a stubbed installRecords model.
    • Evidence: scripts/nemoclaw-start.sh documents the policy-changed rebuild, upstream plugins registry --refresh (refreshReason: policy-changed) drops path/npm-origin plugins from plugins[] openclaw/openclaw#89606, and removal condition. test/nemoclaw-start-plugin-refresh.test.ts covers mechanics with stubs; test/e2e/test-full-e2e.sh observes a healed direct CLI/manifest state but not the actual source invalid state or TUI slash router.

Workflow run details

This is an automated advisory review. A human maintainer must make the final merge decision.

@cv cv assigned cv and unassigned cjagwani Jun 2, 2026
@github-actions

github-actions Bot commented Jun 2, 2026

Copy link
Copy Markdown
Contributor

Selective E2E Results — ✅ All requested jobs passed

Run: 26847979075
Target ref: 05b88331e3403c148961356db1227543b10b8ff2
Workflow ref: main
Requested jobs: cloud-e2e
Summary: 1 passed, 0 failed, 0 skipped

Job Result
cloud-e2e ✅ success

@cv cv added v0.0.58 Release target and removed v0.0.57 Release target labels Jun 2, 2026
@cjagwani cjagwani assigned cjagwani and cv and unassigned cv and cjagwani Jun 2, 2026

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🧹 Nitpick comments (2)
scripts/nemoclaw-start.sh (1)

2796-2821: 💤 Low value

Subshell uses return instead of exit.

Inside the backgrounded subshell at line 2808, return 0 works but is semantically unusual — in a subshell context, exit 0 is the idiomatic choice since there's no calling function to return to. The behavior is equivalent here (both exit the subshell with status 0), but using exit makes the intent clearer.

Suggested fix
     if [ "$ready" -ne 1 ]; then
       echo "[plugin-refresh] gateway did not become ready; skipping registry refresh" >&2
-      return 0
+      exit 0
     fi
🤖 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 `@scripts/nemoclaw-start.sh` around lines 2796 - 2821, The subshell in
start_plugin_registry_refresh uses "return 0" to terminate the backgrounded
subshell; change that to "exit 0" so the intent to exit the subshell is clear
and idiomatic — locate the start_plugin_registry_refresh function and replace
the "return 0" inside the subshell (the block that checks ready and prints
"[plugin-refresh] gateway did not become ready; skipping registry refresh") with
"exit 0".
test/e2e/test-full-e2e.sh (1)

274-286: ⚡ Quick win

Use an argv array for the optional timeout wrapper.

Storing timeout 90/gtimeout 90 in a scalar and expanding it unquoted relies on word-splitting and is likely to trip ShellCheck. An array keeps this shellcheck-clean and avoids accidental argument splitting.

Suggested refactor
-PLUGIN_CHECK_TIMEOUT_CMD=""
-command -v timeout >/dev/null 2>&1 && PLUGIN_CHECK_TIMEOUT_CMD="timeout 90"
-command -v gtimeout >/dev/null 2>&1 && PLUGIN_CHECK_TIMEOUT_CMD="gtimeout 90"
+plugin_check_timeout_cmd=()
+command -v timeout >/dev/null 2>&1 && plugin_check_timeout_cmd=(timeout 90)
+command -v gtimeout >/dev/null 2>&1 && plugin_check_timeout_cmd=(gtimeout 90)
 if openshell sandbox ssh-config "$SANDBOX_NAME" >"$ssh_config" 2>/dev/null; then
   for plugin_attempt in 1 2 3 4 5; do
-    plugin_check_output=$($PLUGIN_CHECK_TIMEOUT_CMD ssh -F "$ssh_config" \
+    plugin_check_output=$("${plugin_check_timeout_cmd[@]}" ssh -F "$ssh_config" \
       -o StrictHostKeyChecking=no \
       -o UserKnownHostsFile=/dev/null \
       -o ConnectTimeout=10 \
       -o LogLevel=ERROR \
       "openshell-${SANDBOX_NAME}" \
       "HOME=/sandbox openclaw plugins inspect nemoclaw >/tmp/nemoclaw-e2e-plugin-inspect.log 2>&1 && HOME=/sandbox openclaw nemoclaw --help >/tmp/nemoclaw-e2e-plugin-help.log 2>&1 && printf 'plugin-ok'" \
       2>&1) || true

As per coding guidelines: **/*.sh: All shell scripts must have shebangs and be executable, with ShellCheck enforcement via .shellcheckrc and formatting via shfmt.

🤖 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/e2e/test-full-e2e.sh` around lines 274 - 286, The current
PLUGIN_CHECK_TIMEOUT_CMD scalar relies on unquoted word-splitting; change it to
an argv-style array (e.g. PLUGIN_CHECK_TIMEOUT_CMD=() or
PLUGIN_CHECK_TIMEOUT_CMD=(timeout 90) / PLUGIN_CHECK_TIMEOUT_CMD=(gtimeout 90))
and invoke it using array expansion ("${PLUGIN_CHECK_TIMEOUT_CMD[@]}") when
building the ssh command that assigns plugin_check_output; update the logic that
sets PLUGIN_CHECK_TIMEOUT_CMD (the command -v checks) and the command
substitution that runs ssh -F "$ssh_config" ... "openshell-${SANDBOX_NAME}" so
they use the array form to avoid accidental argument splitting and satisfy
ShellCheck.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@test/nemoclaw-start.test.ts`:
- Line 3207: The test defines pluginRefreshLog (const pluginRefreshLog) and
injects prepare_plugin_refresh_log but never asserts that the refresh log path
is actually prepared; update the test to explicitly verify pluginRefreshLog by
either asserting the test harness stdout/stderr contains the pluginRefreshLog
path or by checking the file exists on-disk (e.g.,
fs.existsSync(pluginRefreshLog)) after the run; apply the same explicit
assertion at the other occurrence noted around lines 3246-3247 where
prepare_plugin_refresh_log is used.

---

Nitpick comments:
In `@scripts/nemoclaw-start.sh`:
- Around line 2796-2821: The subshell in start_plugin_registry_refresh uses
"return 0" to terminate the backgrounded subshell; change that to "exit 0" so
the intent to exit the subshell is clear and idiomatic — locate the
start_plugin_registry_refresh function and replace the "return 0" inside the
subshell (the block that checks ready and prints "[plugin-refresh] gateway did
not become ready; skipping registry refresh") with "exit 0".

In `@test/e2e/test-full-e2e.sh`:
- Around line 274-286: The current PLUGIN_CHECK_TIMEOUT_CMD scalar relies on
unquoted word-splitting; change it to an argv-style array (e.g.
PLUGIN_CHECK_TIMEOUT_CMD=() or PLUGIN_CHECK_TIMEOUT_CMD=(timeout 90) /
PLUGIN_CHECK_TIMEOUT_CMD=(gtimeout 90)) and invoke it using array expansion
("${PLUGIN_CHECK_TIMEOUT_CMD[@]}") when building the ssh command that assigns
plugin_check_output; update the logic that sets PLUGIN_CHECK_TIMEOUT_CMD (the
command -v checks) and the command substitution that runs ssh -F "$ssh_config"
... "openshell-${SANDBOX_NAME}" so they use the array form to avoid accidental
argument splitting and satisfy ShellCheck.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: aca83091-8fe3-49a7-9b5e-fd1d7f9d6140

📥 Commits

Reviewing files that changed from the base of the PR and between 05b8833 and bbe49e4.

📒 Files selected for processing (6)
  • scripts/lib/sandbox-init.sh
  • scripts/nemoclaw-start.sh
  • test/e2e/test-full-e2e.sh
  • test/nemoclaw-start-plugin-refresh.test.ts
  • test/nemoclaw-start.test.ts
  • test/sandbox-init.test.ts
🚧 Files skipped from review as they are similar to previous changes (1)
  • test/nemoclaw-start-plugin-refresh.test.ts

Comment thread test/nemoclaw-start.test.ts
@github-actions

github-actions Bot commented Jun 2, 2026

Copy link
Copy Markdown
Contributor

Selective E2E Results — ❌ Some jobs failed

Run: 26849857215
Target ref: bbe49e42c868eae8e934329cb45132f3ab90a8b1
Workflow ref: main
Requested jobs: cloud-e2e,openclaw-onboard-security-posture-e2e
Summary: 0 passed, 2 failed, 0 skipped

Job Result
cloud-e2e ❌ failure
openclaw-onboard-security-posture-e2e ❌ failure

Failed jobs: cloud-e2e, openclaw-onboard-security-posture-e2e. Check run artifacts for logs.

@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/e2e-gateway-isolation.sh (1)

516-519: ⚡ Quick win

Make the sed extraction more whitespace-tolerant (current pattern works as-is)

The new range /^apply_model_override() {/,/^}/p matches the current apply_model_override function in scripts/nemoclaw-start.sh (non-empty extraction: 138 lines; starts with apply_model_override() { and ends with a line containing }). For robustness, consider allowing leading whitespace / brace-style variations (e.g., ^[[:space:]]*apply_model_override\(\)[[:space:]]*{^[[:space:]]*}) and/or guarding against an empty extraction before source <(...) (Lines 516-519, 549).

🤖 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/e2e-gateway-isolation.sh` around lines 516 - 519, Make the sed range
extraction more robust for the apply_model_override function and avoid sourcing
an empty heredoc: change the sed pattern used in the source <(sed -n "...") call
to accept optional leading whitespace and spacing around the parentheses/brace
(match something like
^[[:space:]]*apply_model_override[[:space:]]*\(\)[[:space:]]*{ ...
^[[:space:]]*}) so it tolerates different brace/indent styles, and instead of
piping directly into source capture the sed output first (e.g., into a temp file
or variable), test that the extraction is non-empty (and non-zero size) and only
then source it; target the invocation that currently references
apply_model_override and the source <(sed -n "/^apply_model_override() {/,/^}/p"
/usr/local/bin/nemoclaw-start).
🤖 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/e2e-gateway-isolation.sh`:
- Around line 516-519: Make the sed range extraction more robust for the
apply_model_override function and avoid sourcing an empty heredoc: change the
sed pattern used in the source <(sed -n "...") call to accept optional leading
whitespace and spacing around the parentheses/brace (match something like
^[[:space:]]*apply_model_override[[:space:]]*\(\)[[:space:]]*{ ...
^[[:space:]]*}) so it tolerates different brace/indent styles, and instead of
piping directly into source capture the sed output first (e.g., into a temp file
or variable), test that the extraction is non-empty (and non-zero size) and only
then source it; target the invocation that currently references
apply_model_override and the source <(sed -n "/^apply_model_override() {/,/^}/p"
/usr/local/bin/nemoclaw-start).

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: 94c96490-d84b-4ad6-ab87-96474d0c78ce

📥 Commits

Reviewing files that changed from the base of the PR and between bbe49e4 and 1a69371.

📒 Files selected for processing (2)
  • test/e2e-gateway-isolation.sh
  • test/nemoclaw-start.test.ts
🚧 Files skipped from review as they are similar to previous changes (1)
  • test/nemoclaw-start.test.ts

@github-actions

github-actions Bot commented Jun 2, 2026

Copy link
Copy Markdown
Contributor

Selective E2E Results — ❌ Some jobs failed

Run: 26850629152
Target ref: 1a69371f588daed7058f041d47ccf76ca6d146f4
Workflow ref: main
Requested jobs: cloud-e2e,openclaw-onboard-security-posture-e2e
Summary: 0 passed, 2 failed, 0 skipped

Job Result
cloud-e2e ❌ failure
openclaw-onboard-security-posture-e2e ❌ failure

Failed jobs: cloud-e2e, openclaw-onboard-security-posture-e2e. Check run artifacts for logs.

@github-actions

github-actions Bot commented Jun 3, 2026

Copy link
Copy Markdown
Contributor

Selective E2E Results — ❌ Some jobs failed

Run: 26855454078
Target ref: 66a257d7edcb7c5eda32cc075fd9bdc25eb543f1
Workflow ref: main
Requested jobs: cloud-e2e,openclaw-onboard-security-posture-e2e,sandbox-operations-e2e
Summary: 1 passed, 2 failed, 0 skipped

Job Result
cloud-e2e ❌ failure
openclaw-onboard-security-posture-e2e ❌ failure
sandbox-operations-e2e ✅ success

Failed jobs: cloud-e2e, openclaw-onboard-security-posture-e2e. Check run artifacts for logs.

@cjagwani cjagwani self-assigned this Jun 3, 2026
@wscurran wscurran added area: integrations Third-party service integration behavior area: sandbox OpenShell sandbox lifecycle, runtime, config, or recovery bug-fix PR fixes a bug or regression labels Jun 3, 2026
@wscurran

wscurran commented Jun 3, 2026

Copy link
Copy Markdown
Contributor

@github-actions

github-actions Bot commented Jun 3, 2026

Copy link
Copy Markdown
Contributor

Selective E2E Results — ❌ Some jobs failed

Run: 26909213317
Target ref: e6d291e9c53ac2277e3b200117e159157e5b7e81
Workflow ref: main
Requested jobs: cloud-e2e,openclaw-onboard-security-posture-e2e,sandbox-survival-e2e
Summary: 1 passed, 2 failed, 0 skipped

Job Result
cloud-e2e ❌ failure
openclaw-onboard-security-posture-e2e ❌ failure
sandbox-survival-e2e ✅ success

Failed jobs: cloud-e2e, openclaw-onboard-security-posture-e2e. Check run artifacts for logs.

@cv cv added v0.0.60 Release target and removed v0.0.58 Release target labels Jun 3, 2026
Comment thread test/sandbox-init.test.ts Fixed
@github-actions

github-actions Bot commented Jun 3, 2026

Copy link
Copy Markdown
Contributor

Selective E2E Results — ❌ Some jobs failed

Run: 26914147793
Target ref: 450097eaa5a4d2d154c647f43bf198c428ab3346
Workflow ref: main
Requested jobs: cloud-e2e,openclaw-onboard-security-posture-e2e
Summary: 0 passed, 1 failed, 0 skipped

Job Result
cloud-e2e ❌ failure
openclaw-onboard-security-posture-e2e ⚠️ cancelled

Failed jobs: cloud-e2e. Check run artifacts for logs.

@github-actions

github-actions Bot commented Jun 3, 2026

Copy link
Copy Markdown
Contributor

Selective E2E Results — ❌ Some jobs failed

Run: 26914468544
Target ref: 92e4245e1aea16b1873b32a248b4db5276f82c0f
Workflow ref: main
Requested jobs: cloud-e2e,openclaw-onboard-security-posture-e2e
Summary: 0 passed, 2 failed, 0 skipped

Job Result
cloud-e2e ❌ failure
openclaw-onboard-security-posture-e2e ❌ failure

Failed jobs: cloud-e2e, openclaw-onboard-security-posture-e2e. Check run artifacts for logs.

@wscurran wscurran added v0.0.59 Release target and removed v0.0.59 Release target labels Jun 4, 2026
@github-actions

github-actions Bot commented Jun 4, 2026

Copy link
Copy Markdown
Contributor

Selective E2E Results — ❌ Some jobs failed

Run: 26975910960
Target ref: fa0e4de646cc320784ff9ef5107f16d3c1c20863
Workflow ref: main
Requested jobs: cloud-e2e,openclaw-onboard-security-posture-e2e
Summary: 0 passed, 2 failed, 0 skipped

Job Result
cloud-e2e ❌ failure
openclaw-onboard-security-posture-e2e ❌ failure

Failed jobs: cloud-e2e, openclaw-onboard-security-posture-e2e. Check run artifacts for logs.

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

github-actions Bot commented Jun 4, 2026

Copy link
Copy Markdown
Contributor

Selective E2E Results — ✅ All requested jobs passed

Run: 26976659667
Target ref: 05783397a67e94b398cbb593f0f126ddbffa3586
Workflow ref: main
Requested jobs: cloud-e2e,openclaw-onboard-security-posture-e2e
Summary: 0 passed, 0 failed, 0 skipped

Job Result
cloud-e2e ⚠️ cancelled
openclaw-onboard-security-posture-e2e ⚠️ cancelled

@github-actions

github-actions Bot commented Jun 4, 2026

Copy link
Copy Markdown
Contributor

Selective E2E Results — ✅ All requested jobs passed

Run: 26976848310
Target ref: 05783397a67e94b398cbb593f0f126ddbffa3586
Workflow ref: main
Requested jobs: cloud-e2e,openclaw-tui-chat-correlation-e2e
Summary: 2 passed, 0 failed, 0 skipped

Job Result
cloud-e2e ✅ success
openclaw-tui-chat-correlation-e2e ✅ success

@cv cv merged commit d0ac5cb into main Jun 4, 2026
28 of 30 checks passed
@cv cv deleted the fix/2021-plugin-registry-refresh branch June 4, 2026 20:26
@github-actions

github-actions Bot commented Jun 4, 2026

Copy link
Copy Markdown
Contributor

Selective E2E Results — ✅ All requested jobs passed

Run: 26977433313
Target ref: 05783397a67e94b398cbb593f0f126ddbffa3586
Workflow ref: main
Requested jobs: openclaw-onboard-security-posture-e2e
Summary: 1 passed, 0 failed, 0 skipped

Job Result
openclaw-onboard-security-posture-e2e ✅ success

cv pushed a commit that referenced this pull request Jun 5, 2026
## Summary
- Add the v0.0.59 release notes from the GitHub announcement discussion.
- Refresh local inference and credential-storage guidance for the
current release behavior.
- Regenerate the user skills from the updated Fern docs.
- Tighten release-prep and docs review guidance for generated skills, PR
labels, and shared `$$nemoclaw` command placeholders.

## Verification
- `python3 scripts/docs-to-skills.py docs/ .agents/skills/ --prefix
nemoclaw-user --doc-platform fern-mdx`
- `rg "permissive mode|shields down|shields up|shields status|config
rotate-token|rotate-token" --glob '*.{md,mdx}'`
- `git diff --check`
- `npm run docs` (rerun outside sandbox after sandbox-only `tsx` IPC
permission failure)
- `npm run typecheck:cli`
- Pre-commit hooks during commit passed, including markdownlint,
docs-to-skills verification, gitleaks, commitlint, and skills YAML
tests.

## Source Summary
- #3679, #4437, #4681, #4766, #4772, #4775, #4786 ->
`docs/about/release-notes.mdx`, `docs/reference/commands.mdx`,
`docs/reference/troubleshooting.mdx`: Summarize OpenClaw 2026.5.27
compatibility, runtime path pinning, plugin registry recovery, live
gateway reconciliation, and clearer host-alias/startup diagnostics.
- #4332, #4402, #4769, #4776, #4779 -> `docs/about/release-notes.mdx`,
`docs/inference/inference-options.mdx`,
`docs/inference/use-local-inference.mdx`,
`docs/inference/switch-inference-providers.mdx`: Document the release
inference changes covering Local NIM waits, Hermes Anthropic routing,
Nemotron 3 Ultra, the current Ollama starter fallback, and Spark
managed-vLLM context length.
- #4628, #4652, #4733, #4745 -> `docs/about/release-notes.mdx`,
`docs/security/credential-storage.mdx`,
`docs/manage-sandboxes/messaging-channels.mdx`,
`docs/reference/troubleshooting.mdx`: Capture permission healing,
gateway-stored credential reuse, cross-sandbox messaging credential
conflict checks, and CDI preflight diagnostics.
- #4728, #4737, #4743, #4744, #4782 -> `.agents/skills/nemoclaw-user-*`:
Regenerate the user skill references from the updated source docs.
- Follow-up maintenance ->
`.agents/skills/nemoclaw-contributor-update-docs/SKILL.md`,
`.coderabbit.yaml`: Add release-prep area labels for docs and skills
PRs, and teach docs review guidance that `$$nemoclaw` is the correct
shared command placeholder for examples that work across agent aliases.

Note: the `documentation` label was not present in the repository, so
this PR is labeled with `v0.0.59` only.

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

* **Documentation**
  * Updated default model for local Ollama inference setup to qwen3.5:9b
  * Added Nemotron 3 Ultra 550B as an NVIDIA Endpoints model option
* Clarified credential storage and reuse behavior for post-deployment
(day-two) operations
* Added v0.0.59 release notes covering OpenClaw compatibility, inference
options, Hermes messaging sync, and troubleshooting
* Clarified CLI selection guidance and updated OpenClaw version example
in status output
* Revised release-prep instructions and docs review guidance for CLI
alias usage
<!-- 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: integrations Third-party service integration behavior area: sandbox OpenShell sandbox lifecycle, runtime, config, or recovery bug-fix PR fixes a bug or regression v0.0.60 Release target

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[All Platform] /nemoclaw slash command not working in sandbox OpenClaw TUI

4 participants