Skip to content

fix(macos): restore VM inference and Hermes Discord paths#3445

Merged
ericksoa merged 28 commits into
mainfrom
fix/macos-vm-skip-docker-bridge-probe
May 14, 2026
Merged

fix(macos): restore VM inference and Hermes Discord paths#3445
ericksoa merged 28 commits into
mainfrom
fix/macos-vm-skip-docker-bridge-probe

Conversation

@ericksoa
Copy link
Copy Markdown
Contributor

@ericksoa ericksoa commented May 13, 2026

Summary

  • Restore affected macOS OpenShell VM sandboxes by treating the VM driver as a separate compatibility path from Docker/Kubernetes.
  • Patch the macOS VM sandbox rootfs DNS to the gvproxy resolver (192.168.127.1) so inference.local resolves from inside VM sandboxes.
  • Skip legacy Kubernetes/Docker DNS-proxy repair only for VM sandboxes and fall back to OpenShell route reapply when appropriate.
  • Gate VM sandbox-create early detach on NemoClaw startup output so Ready alone cannot advance onboarding before the sandbox startup command is actually running.
  • Fix downstream Hermes/Discord issues exposed by the VM path: locked-aware non-root Hermes config verification, guild-only Discord authorization, regional *.discord.gg websocket policy, and stricter Slack provider reuse checks.

Direction / Scope Guardrail

This PR is not the strategic macOS driver direction. It is a narrow compatibility bridge for already-created or explicitly selected OpenShell VM sandboxes while NemoClaw is pinned to the OpenShell behavior that exposed this regression.

Normal macOS onboarding should move back to Docker/Colima in #3454 (fix(onboard): use Docker driver on macOS). This PR should not default OPENSHELL_DRIVERS=vm, should not add installer requirements for VM helper assets, and should not make VM the preferred macOS runtime.

OpenShell #1375 has merged upstream and keeps VM driver selection opt-in. Once NemoClaw can consume that OpenShell release path, the durable direction is to rely on Docker/Colima for normal macOS onboarding and keep this VM shim only for explicit/legacy VM cases until it can be removed.

Root Cause

Earlier PR text blamed #3441. That was too narrow and is not accurate for the final fix. The reverted Docker bridge reachability probe was one visible blocker, but it was not the underlying inference.local failure, and that bridge-probe code is no longer part of this PR's final diff.

The affected failure chain is a macOS VM-driver mismatch:

  • Ubuntu uses the Docker/Kubernetes sandbox path, where NemoClaw's legacy DNS proxy and bridge assumptions apply.
  • The affected macOS flow used OpenShell's VM driver, where sandbox networking is backed by the VM/gvproxy path rather than a Docker/Kubernetes gateway container.
  • The VM rootfs could end up with public DNS fallback resolvers (8.8.8.8 / 8.8.4.4). Those can resolve public hostnames, but they cannot resolve OpenShell/NemoClaw synthetic hostnames such as inference.local.
  • When inference.local failed, NemoClaw tried the legacy DNS repair path, which produced misleading gateway-container warnings instead of repairing VM DNS.
  • Separately, the VM driver can report the sandbox Ready before NemoClaw startup output appears. On macOS that allowed onboarding to detach before dashboard/Hermes/OpenClaw startup was actually observable.

The Discord failures were downstream runtime issues exposed after the VM sandbox got far enough to run. Discord may use regional websocket hosts such as gateway-us-east1-d.discord.gg, and Hermes guild-only configuration without explicit user IDs must permit guild members instead of rejecting every Discord user as unauthorized.

Tradeoff / Follow-up

The DNS portion of this PR is intentionally a narrow emergency compatibility shim, not the ideal long-term owner boundary. It is Darwin + OpenShell VM-driver gated, best-effort, and disableable with NEMOCLAW_DISABLE_VM_DNS_MONKEYPATCH=1, but it still depends on today's OpenShell VM rootfs layout, init-script shape, and gvproxy resolver IP (192.168.127.1). That is acceptable only as a compatibility bridge for explicit/legacy VM sandboxes.

Durable follow-up is split by owner:

Regression Risk

  • macOS VM path: intentional behavior change. The VM DNS patch is gated to openshellDriver === "vm" on Darwin, is best-effort, and can be disabled with NEMOCLAW_DISABLE_VM_DNS_MONKEYPATCH=1.
  • Normal macOS Docker path: intentionally out of scope here and owned by fix(onboard): use Docker driver on macOS #3454. This PR should not default macOS to VM.
  • Linux/Docker path: low risk. The VM DNS patch does not run for Docker sandboxes, and legacy DNS proxy repair remains available for non-VM drivers.
  • Discord policy: low risk. The change adds websocket-specific *.discord.gg handling with credential rewrite; it does not broadly open Discord REST beyond the existing Discord policy surface.
  • Messaging reuse: lower risk than before. Slack reuse now requires both -slack-bridge and -slack-app, avoiding partial provider reuse.

Validation

  • npm run build:cli
  • git diff --check
  • npx vitest run src/lib/actions/sandbox/vm-dns-monkeypatch.test.ts test/sandbox-connect-inference.test.ts test/onboard.test.ts --fileParallelism=false
  • Focused suite result on current head: 262 tests passed.
  • Manual macOS VM validation during debugging: https://inference.local/v1/models and chat completions returned 200 from inside the VM sandbox after the DNS patch.
  • Manual Discord validation during debugging: Hermes Discord responded after the regional gateway websocket policy was applied.
  • Current full nightly dispatch: https://github.com/NVIDIA/NemoClaw/actions/runs/25861533504

Summary by CodeRabbit

  • New Features

    • Non-interactive onboarding can reuse stored messaging channels to speed setup
    • Added WebSocket support for Discord gateways with credential rewrite handling
    • Create-stream option to require startup output before considering sandboxes "ready"
  • Bug Fixes

    • Improved VM/macOS DNS setup and repair paths; refined sandbox driver selection
    • More robust inference-route repair behavior for sandboxes
  • Tests

    • Expanded tests for messaging reuse, VM DNS patching, sandbox creation/connect, and policy validation

Review Change Stack

Signed-off-by: Aaron Erickson <aerickson@nvidia.com>
@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented May 13, 2026

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: 5fe50b6e-00ce-4d34-9c70-247350f0d8f9

📥 Commits

Reviewing files that changed from the base of the PR and between 55296c4 and 69698b7.

📒 Files selected for processing (1)
  • src/lib/onboard.ts
🚧 Files skipped from review as they are similar to previous changes (1)
  • src/lib/onboard.ts

📝 Walkthrough

Walkthrough

Adds VM rootfs DNS monkeypatching and driver-aware inference repair, non-interactive messaging-channel reuse, create-stream readiness output gating, and Discord WebSocket policy/config updates with tests.

Changes

Discord WebSocket messaging support

Layer / File(s) Summary
Discord WebSocket policy endpoints
agents/hermes/policy-additions.yaml, agents/hermes/policy-permissive.yaml, agents/openclaw/policy-permissive.yaml, nemoclaw-blueprint/policies/openclaw-sandbox-permissive.yaml, nemoclaw-blueprint/policies/presets/discord.yaml
Discord network policies across deployment contexts are extended to allow WebSocket traffic to *.discord.gg on port 443 with websocket_credential_rewrite: true and explicit GET/WEBSOCKET_TEXT allow rules.
Discord allowed-users configuration
agents/hermes/config/messaging-config.ts, test/generate-hermes-config.test.ts
buildMessagingEnvLines now emits DISCORD_ALLOW_ALL_USERS=true when Discord is enabled but no explicit per-user allowlist is configured; tests verify behavior including blank guild keys.
Discord policy validation tests
test/policies.test.ts, test/validate-blueprint.test.ts
Policy/preset tests extended to include wildcard *.discord.gg host patterns in native preset and Hermes gateway validations.

VM DNS monkeypatch and sandbox integration

Layer / File(s) Summary
Non-interactive messaging channel reuse
src/lib/onboard/messaging-reuse.ts, src/lib/onboard/messaging-reuse.test.ts
New module computes reusable messaging channels for non-interactive resume flows by mapping channel names to provider bridge names, filtering disabled channels, and gating reuse on provider/token and sandbox existence.
VM DNS monkeypatch implementation
src/lib/actions/sandbox/vm-dns-monkeypatch.ts, src/lib/actions/sandbox/vm-dns-monkeypatch.test.ts
Implements safe rootfs-based DNS patching for macOS OpenShell VM sandboxes: safe path resolution, resolver normalization (gvproxy-first), init-script patching, ext4-layout detection, gated application, and structured non-throwing result reporting with tests.
Onboarding VM DNS monkeypatch wrapper
src/lib/onboard/vm-dns-monkeypatch.ts
Wrapper that forwards sandbox context to the core patcher, supports optional DI for apply/log/warn, and logs applied/skipped/failed outcomes.
Sandbox create stream readiness gating
src/lib/sandbox/create-stream.ts, src/lib/sandbox/create-stream.test.ts
Adds readyCheckOutputPatterns option and VM-specific default patterns to defer early detach/forced-ready until matching startup output is observed; flushes partial lines and emits a one-time waiting progress message; tests cover VM readiness gating and partial-line edge cases.
Driver-aware sandbox inference route repair
src/lib/actions/sandbox/connect.ts, test/sandbox-connect-inference.test.ts
Repair logic now accepts resolved SandboxEntry and branches by openshellDriver: for VM-like drivers it may apply the VM DNS monkeypatch and recheck health before reissuing openshell inference set; legacy path preserves DNS-proxy repair. Tests expand fake openshell harness and VM rootfs fixtures to validate flows.

Onboarding flow enhancements

Layer / File(s) Summary
Onboarding messaging reuse and DNS integration
src/lib/onboard.ts
Threads sandboxName into recorded-channel reuse logic (getRecordedMessagingChannelsForResume) and sets selectedMessagingChannels from reuse candidates when present; computes sandboxRuntimeFields once (darwin→"vm", linux-docker-driver→"docker", else "kubernetes"), gates DNS proxy setup to kubernetes, and applies VM DNS wrapper after sandbox registration.
Hermes non-root configuration verification
agents/hermes/start.sh, test/sandbox-init.test.ts
Non-root fallback uses verify_config_integrity_if_locked instead of the hash-based form; test asserts the modified verification call in non-root vs root blocks.
Onboarding test coverage and reliability
test/onboard.test.ts
Adds unit tests for VM DNS wrapper behavior, increases timeouts for long-running onboarding tests, updates structural resume messaging checks to include sandbox name, and validates provider/gateway gating for messaging reuse.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Possibly related PRs

  • NVIDIA/NemoClaw#3454: Both PRs modify src/lib/onboard.ts's openshellDriver runtime mapping and DNS-proxy setup conditions during sandbox creation.
  • NVIDIA/NemoClaw#3424: Related onboarding/inference UX and onboarding command wiring changes.

Suggested labels

Sandbox

Suggested reviewers

  • prekshivyas
  • jyaunches

🐰 Ipatched DNS in a tiny hop,
Discord webs now reach each top,
Channels reuse without a fight,
VM roots patched in quiet night,
Onboarding hums — the rabbit's pleased.

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 1.96% 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 'fix(macos): restore VM inference and Hermes Discord paths' directly and specifically reflects the main changes: macOS VM DNS patching for inference resolution and Discord/messaging fixes.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ 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/macos-vm-skip-docker-bridge-probe

Warning

There were issues while running some tools. Please review the errors and either fix the tool's configuration or disable the tool if it's a critical failure.

🔧 ESLint

If the error stems from missing dependencies, add them to the package.json file. For unrecoverable errors (e.g., due to private dependencies), disable the tool in the CodeRabbit configuration.

ESLint skipped: no ESLint configuration detected in root package.json. To enable, add eslint to devDependencies.


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

Keep the macOS VM-driver bridge-probe fix under the onboard entrypoint
line budget by passing the driver option inline at the existing call sites.

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

github-actions Bot commented May 13, 2026

E2E Advisor Recommendation

Required E2E: macos-e2e, hermes-discord-e2e, messaging-providers-e2e, network-policy-e2e, inference-routing-e2e, onboard-resume-e2e
Optional E2E: hermes-e2e, hermes-slack-e2e, sandbox-operations-e2e, double-onboard-e2e, rebuild-hermes-e2e

Dispatch hint: hermes-discord-e2e,messaging-providers-e2e,network-policy-e2e,inference-routing-e2e,onboard-resume-e2e

Auto-dispatched E2E: hermes-discord-e2e, messaging-providers-e2e, network-policy-e2e, inference-routing-e2e, onboard-resume-e2e via nightly-e2e.yaml at 7a22871ed2af1b3d980baac4ec1e22767ee0c008nightly run

Workflow run

Full advisor summary

E2E Recommendation Advisor

Base: origin/main
Head: HEAD
Confidence: high

Required E2E

  • macos-e2e (high): Required because the PR changes macOS-specific OpenShell VM sandbox detection, create-stream early detach behavior, and VM DNS repair/monkeypatch code that only a macOS runner with Docker can validate end-to-end.
  • hermes-discord-e2e (high): Required because Hermes Discord config and Discord WebSocket network policies changed. This E2E specifically validates Hermes Discord schema, placeholder/token isolation, and native Discord Gateway WebSocket credential rewrite.
  • messaging-providers-e2e (high): Required because OpenClaw/Hermes messaging policy changes touch Discord gateway WebSocket routing and credential rewriting, and onboard messaging reuse can affect provider attachment. This test covers Telegram, Discord, and Slack provider/placeholder/L7 proxy behavior.
  • network-policy-e2e (high): Required because multiple YAML policy assets changed, including Discord wildcard WebSocket endpoints and protocol/enforcement fields. This validates policy application, hot reload, restricted/permissive behavior, and security boundary expectations.
  • inference-routing-e2e (medium): Required because sandbox connect inference.local repair now diverges for VM versus legacy drivers and may reapply OpenShell inference routes. This validates inference routing through the gateway proxy and sandbox inference behavior.
  • onboard-resume-e2e (medium): Required because non-interactive onboarding now reuses stored messaging channel configuration and registry/provider state, which can affect resume behavior after interrupted onboard sessions.

Optional E2E

  • hermes-e2e (high): Useful broader Hermes confidence after entrypoint integrity-verification changes and Hermes policy/config changes, but hermes-discord-e2e is the more targeted merge-blocking check.
  • hermes-slack-e2e (high): Adjacent confidence for Hermes messaging provider behavior and Slack two-provider reuse logic, although the PR's policy changes are primarily Discord-focused.
  • sandbox-operations-e2e (medium): Useful confidence for sandbox connect/recovery/lifecycle changes, especially connect probe behavior, but it is less targeted than macOS VM and inference-routing coverage.
  • double-onboard-e2e (medium): Useful adjacent coverage for repeated non-interactive onboarding and reuse behavior after messaging-channel reuse changes.
  • rebuild-hermes-e2e (high): Useful confidence that Hermes rebuilds preserve and regenerate messaging policy/config correctly after the Discord and entrypoint changes.

New E2E recommendations

  • OpenShell VM DNS monkeypatch (high): Existing macOS full E2E may catch broad failures, but there is no targeted E2E that creates an OpenShell VM sandbox, intentionally verifies inference.local/DNS inside the VM rootfs path, exercises connect-time repair, and asserts the gvproxy resolver survives recreate/reconnect.
    • Suggested test: Add a macOS VM DNS repair E2E that onboards on the VM driver, probes inference.local from inside the sandbox, corrupts or removes the resolver fallback if safe, runs connect --probe-only, and verifies the VM DNS monkeypatch restores inference.local without leaking credentials.
  • Discord wildcard gateway policy (medium): Hermes Discord E2E validates the gateway path, but current coverage may not explicitly prove wildcard *.discord.gg endpoints are selected when Discord returns a regional or sharded gateway host.
    • Suggested test: Extend the fake Discord gateway proof to return a non-gateway.discord.gg host such as shard-0.discord.gg and assert the sandbox can establish the WebSocket path with credential rewrite enabled.
  • Non-interactive messaging reuse (medium): Unit tests cover provider existence decisions, but there is no dedicated E2E that starts with an existing sandbox with configured messaging channels and no fresh token env vars, then verifies non-interactive onboard reuses only enabled channels with all required providers present.
    • Suggested test: Add a non-interactive onboard messaging-reuse E2E covering Discord/Slack configured channels, disabled channel filtering, and the Slack bridge plus app provider requirement.

Dispatch hint

  • Workflow: .github/workflows/nightly-e2e.yaml
  • jobs input: hermes-discord-e2e,messaging-providers-e2e,network-policy-e2e,inference-routing-e2e,onboard-resume-e2e

@copy-pr-bot
Copy link
Copy Markdown

copy-pr-bot Bot commented May 13, 2026

This pull request requires additional validation before any workflows can run on NVIDIA's runners.

Pull request vetters can view their responsibilities here.

Contributors can view more details about this message here.

Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

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

Inline comments:
In `@src/lib/onboard.ts`:
- Line 4449: The new declaration of bridgeProbeOptions is causing a net +1 line;
remove that extra line by inlining or merging it where used: locate the const
bridgeProbeOptions = { drivers: gatewayEnv.OPENSHELL_DRIVERS } and either inline
the object literal at its call site or merge its property into the nearest
existing options object so the standalone declaration is removed and the file
length is reduced by one line.
🪄 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: 485df84d-a4d8-4a69-97a4-b64d9f2f3e6d

📥 Commits

Reviewing files that changed from the base of the PR and between c517d62 and 6d08d7a.

📒 Files selected for processing (3)
  • src/lib/onboard.ts
  • src/lib/onboard/gateway-sandbox-reachability.test.ts
  • src/lib/onboard/gateway-sandbox-reachability.ts

Comment thread src/lib/onboard.ts Outdated
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

Caution

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

⚠️ Outside diff range comments (1)
src/lib/sandbox/create-stream.ts (1)

318-324: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Flush pending tail output before the close-time ready recovery check.

Line 323 checks readyCheckOutputMatched before the buffered trailing line is parsed. A final unterminated startup line can be missed, causing an incorrect non-zero result.

Suggested fix
     child.on("close", (code) => {
       // One last ready-check: the sandbox may have become Ready between the
       // last poll tick and the stream exit (e.g. SSH 255 after "Created sandbox:").
+      if (pending) {
+        const trailing = pending;
+        pending = "";
+        flushLine(trailing);
+      }
       if (code && code !== 0 && options.readyCheck) {
         try {
           if (options.readyCheck() && readyCheckOutputMatched) {
             finish(0, { forcedReady: true });
             return;
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/lib/sandbox/create-stream.ts` around lines 318 - 324, The close handler
checks readyCheckOutputMatched before the final buffered trailing output is
parsed, so flush/parse any pending tail buffer before that check: inside the
child.on("close", ...) callback call the same buffered-tail processing function
used elsewhere (the routine that consumes the accumulated tail/line buffer used
by the ready-check parsing) so any unterminated startup line is processed, then
evaluate options.readyCheck() and readyCheckOutputMatched and call finish(0, {
forcedReady: true }) if appropriate.
♻️ Duplicate comments (1)
src/lib/onboard.ts (1)

5921-5934: ⚠️ Potential issue | 🟠 Major | ⚡ Quick win

CI blocker: reduce net line growth in src/lib/onboard.ts.

Line 5921 introduces a multiline block, and onboard-entrypoint-budget is currently failing (+9 net lines). Please collapse this section (and trim a few additional lines if needed) before merge.

✂️ One compacting option
-  const selectedOpenShellDrivers = (process.env.OPENSHELL_DRIVERS ??
-    (process.platform === "darwin" ? "vm" : "docker"))
-    .split(",")
-    .map((driver) => driver.trim())
-    .filter(Boolean);
-  const waitForStartupOutputBeforeReadyDetach = selectedOpenShellDrivers.includes("vm");
+  const waitForStartupOutputBeforeReadyDetach = (process.env.OPENSHELL_DRIVERS ??
+    (process.platform === "darwin" ? "vm" : "docker"))
+    .split(",")
+    .some((driver) => driver.trim() === "vm");
   const createResult = await streamSandboxCreate(createCommand, sandboxEnv, {
@@
-    readyCheckOutputPatterns: waitForStartupOutputBeforeReadyDetach
-      ? [/Setting up NemoClaw/]
-      : undefined,
+    readyCheckOutputPatterns: waitForStartupOutputBeforeReadyDetach ? [/Setting up NemoClaw/] : undefined,
   });
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/lib/onboard.ts` around lines 5921 - 5934, Collapse the multiline
driver/env/setup block to reduce lines: replace the multi-line
selectedOpenShellDrivers and waitForStartupOutputBeforeReadyDetach declarations
and the streamSandboxCreate options object into a more compact form (e.g.,
single-line declaration for selectedOpenShellDrivers using
process.env.OPENSHELL_DRIVERS ?? (process.platform === "darwin" ? "vm" :
"docker") and inline the waitForStartupOutputBeforeReadyDetach ternary in
readyCheckOutputPatterns) while keeping behavior identical for
selectedOpenShellDrivers, waitForStartupOutputBeforeReadyDetach, and the
readyCheck callback passed to streamSandboxCreate; update references to
selectedOpenShellDrivers, waitForStartupOutputBeforeReadyDetach, createResult,
streamSandboxCreate, readyCheck, and readyCheckOutputPatterns accordingly so the
logic and patterns are unchanged but the code occupies fewer lines.
🧹 Nitpick comments (1)
src/lib/onboard.ts (1)

4440-4573: Run the onboarding E2E slice for this change.

Given this touches gateway reuse logic and sandbox readiness gating, run at least sandbox-operations-e2e and openshell-gateway-upgrade-e2e on this branch.

As per coding guidelines: src/lib/onboard.ts is core onboarding logic and includes explicit E2E recommendations for these flows.

Also applies to: 5921-5935

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

In `@src/lib/onboard.ts` around lines 4440 - 4573, This change affects gateway
reuse and sandbox readiness in startDockerDriverGateway (and related helpers
like registerDockerDriverGatewayEndpoint,
verifySandboxBridgeGatewayReachableOrExit, isDockerDriverGatewayHttpReady), so
run the onboarding E2E slice including at minimum sandbox-operations-e2e and
openshell-gateway-upgrade-e2e against this branch (locally or in CI) to validate
gateway reuse, restart/drift handling, and sandbox gating; checkout the branch,
run the project's E2E runner for those two suites (or trigger the CI jobs),
reproduce scenarios for existing gateway PID reuse, port-listener adoption, and
fresh gateway startup, and report/fix any failing assertions before merging.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Outside diff comments:
In `@src/lib/sandbox/create-stream.ts`:
- Around line 318-324: The close handler checks readyCheckOutputMatched before
the final buffered trailing output is parsed, so flush/parse any pending tail
buffer before that check: inside the child.on("close", ...) callback call the
same buffered-tail processing function used elsewhere (the routine that consumes
the accumulated tail/line buffer used by the ready-check parsing) so any
unterminated startup line is processed, then evaluate options.readyCheck() and
readyCheckOutputMatched and call finish(0, { forcedReady: true }) if
appropriate.

---

Duplicate comments:
In `@src/lib/onboard.ts`:
- Around line 5921-5934: Collapse the multiline driver/env/setup block to reduce
lines: replace the multi-line selectedOpenShellDrivers and
waitForStartupOutputBeforeReadyDetach declarations and the streamSandboxCreate
options object into a more compact form (e.g., single-line declaration for
selectedOpenShellDrivers using process.env.OPENSHELL_DRIVERS ??
(process.platform === "darwin" ? "vm" : "docker") and inline the
waitForStartupOutputBeforeReadyDetach ternary in readyCheckOutputPatterns) while
keeping behavior identical for selectedOpenShellDrivers,
waitForStartupOutputBeforeReadyDetach, and the readyCheck callback passed to
streamSandboxCreate; update references to selectedOpenShellDrivers,
waitForStartupOutputBeforeReadyDetach, createResult, streamSandboxCreate,
readyCheck, and readyCheckOutputPatterns accordingly so the logic and patterns
are unchanged but the code occupies fewer lines.

---

Nitpick comments:
In `@src/lib/onboard.ts`:
- Around line 4440-4573: This change affects gateway reuse and sandbox readiness
in startDockerDriverGateway (and related helpers like
registerDockerDriverGatewayEndpoint, verifySandboxBridgeGatewayReachableOrExit,
isDockerDriverGatewayHttpReady), so run the onboarding E2E slice including at
minimum sandbox-operations-e2e and openshell-gateway-upgrade-e2e against this
branch (locally or in CI) to validate gateway reuse, restart/drift handling, and
sandbox gating; checkout the branch, run the project's E2E runner for those two
suites (or trigger the CI jobs), reproduce scenarios for existing gateway PID
reuse, port-listener adoption, and fresh gateway startup, and report/fix any
failing assertions before merging.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: c27303de-f842-4197-87ca-9930efd4c0d0

📥 Commits

Reviewing files that changed from the base of the PR and between c98d291 and 26b66cd.

📒 Files selected for processing (3)
  • src/lib/onboard.ts
  • src/lib/sandbox/create-stream.test.ts
  • src/lib/sandbox/create-stream.ts

Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

♻️ Duplicate comments (1)
src/lib/onboard.ts (1)

2036-2058: ⚠️ Potential issue | 🟠 Major | ⚡ Quick win

CI blocker: src/lib/onboard.ts still fails the entrypoint budget check.

onboard-entrypoint-budget is failing because src/lib/onboard.ts grew by 34 lines. This needs to be neutralized before merge (for example, move the newly added messaging reuse helpers into src/lib/onboard/ and import them here).

Also applies to: 10668-10777

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

In `@src/lib/onboard.ts` around lines 2036 - 2058, The two new helpers
getMessagingProviderNamesForChannel and
getReusableStoredMessagingChannelsForNonInteractive are causing the entrypoint
budget overflow; extract them into a new module (e.g., onboard messaging
helpers) and import them into this file so the main onboard.ts shrinks. Move the
implementations as-is but keep their dependencies (isNonInteractive, registry,
getKnownMessagingChannels, providerExistsInGateway) as imports in the new
module, export the two functions, then replace the inline functions in
onboard.ts with imports of getMessagingProviderNamesForChannel and
getReusableStoredMessagingChannelsForNonInteractive; ensure types/signatures are
unchanged and update any local references.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@src/lib/onboard.ts`:
- Around line 2036-2040: The Slack provider name check in
getMessagingProviderNamesForChannel only returns `${sandboxName}-slack-bridge`,
which can allow reuse when `${sandboxName}-slack-app` is missing; update
getMessagingProviderNamesForChannel to return both `${sandboxName}-slack-bridge`
and `${sandboxName}-slack-app` for the "slack" channel and make the same change
in the other similar function/block around the second occurrence (lines
referenced near 2053-2057) so reusable Slack validation requires both providers
to be present.

---

Duplicate comments:
In `@src/lib/onboard.ts`:
- Around line 2036-2058: The two new helpers getMessagingProviderNamesForChannel
and getReusableStoredMessagingChannelsForNonInteractive are causing the
entrypoint budget overflow; extract them into a new module (e.g., onboard
messaging helpers) and import them into this file so the main onboard.ts
shrinks. Move the implementations as-is but keep their dependencies
(isNonInteractive, registry, getKnownMessagingChannels, providerExistsInGateway)
as imports in the new module, export the two functions, then replace the inline
functions in onboard.ts with imports of getMessagingProviderNamesForChannel and
getReusableStoredMessagingChannelsForNonInteractive; ensure types/signatures are
unchanged and update any local references.
🪄 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: a6a4fd4a-c223-472a-8449-4d7d30e09c43

📥 Commits

Reviewing files that changed from the base of the PR and between a458b2f and d3fbfeb.

📒 Files selected for processing (5)
  • agents/hermes/start.sh
  • src/lib/onboard.ts
  • test/gateway-liveness-probe.test.ts
  • test/onboard.test.ts
  • test/sandbox-init.test.ts

Comment thread src/lib/onboard.ts Outdated
Comment thread src/lib/actions/sandbox/vm-dns-monkeypatch.ts Fixed
Comment thread src/lib/actions/sandbox/vm-dns-monkeypatch.ts Fixed
@github-actions
Copy link
Copy Markdown
Contributor

Selective E2E Results — ❌ Some jobs failed

Run: 25793891047
Branch: fix/macos-vm-skip-docker-bridge-probe
Requested jobs: all (no filter)
Summary: 2 passed, 31 failed, 2 skipped

Job Result
brave-search-e2e ✅ success
cloud-e2e ❌ failure
cloud-inference-e2e ❌ failure
cloud-onboard-e2e ❌ failure
credential-migration-e2e ❌ failure
credential-sanitization-e2e ❌ failure
deployment-services-e2e ❌ failure
device-auth-health-e2e ❌ failure
diagnostics-e2e ❌ failure
docs-validation-e2e ❌ failure
double-onboard-e2e ❌ failure
gpu-double-onboard-e2e ⏭️ skipped
gpu-e2e ⏭️ skipped
hermes-discord-e2e ❌ failure
hermes-e2e ❌ failure
hermes-inference-switch-e2e ❌ failure
hermes-slack-e2e ❌ failure
inference-routing-e2e ⚠️ cancelled
issue-2478-crash-loop-recovery-e2e ❌ failure
kimi-inference-compat-e2e ⚠️ cancelled
launchable-smoke-e2e ❌ failure
messaging-compatible-endpoint-e2e ❌ failure
messaging-providers-e2e ❌ failure
network-policy-e2e ❌ failure
onboard-repair-e2e ❌ failure
onboard-resume-e2e ❌ failure
openclaw-inference-switch-e2e ❌ failure
openshell-gateway-upgrade-e2e ⚠️ cancelled
overlayfs-autofix-e2e ✅ success
rebuild-hermes-e2e ⚠️ cancelled
rebuild-hermes-stale-base-e2e ⚠️ cancelled
rebuild-openclaw-e2e ⚠️ cancelled
runtime-overrides-e2e ❌ failure
sandbox-operations-e2e ❌ failure
sandbox-survival-e2e ❌ failure
shields-config-e2e ❌ failure
skill-agent-e2e ❌ failure
snapshot-commands-e2e ❌ failure
telegram-injection-e2e ❌ failure
token-rotation-e2e ❌ failure
upgrade-stale-sandbox-e2e ❌ failure

Failed jobs: cloud-e2e, cloud-inference-e2e, cloud-onboard-e2e, credential-migration-e2e, credential-sanitization-e2e, deployment-services-e2e, device-auth-health-e2e, diagnostics-e2e, docs-validation-e2e, double-onboard-e2e, hermes-discord-e2e, hermes-e2e, hermes-inference-switch-e2e, hermes-slack-e2e, issue-2478-crash-loop-recovery-e2e, launchable-smoke-e2e, messaging-compatible-endpoint-e2e, messaging-providers-e2e, network-policy-e2e, onboard-repair-e2e, onboard-resume-e2e, openclaw-inference-switch-e2e, runtime-overrides-e2e, sandbox-operations-e2e, sandbox-survival-e2e, shields-config-e2e, skill-agent-e2e, snapshot-commands-e2e, telegram-injection-e2e, token-rotation-e2e, upgrade-stale-sandbox-e2e. Check run artifacts for logs.

@github-actions
Copy link
Copy Markdown
Contributor

Selective E2E Results — ❌ Some jobs failed

Run: 25794009369
Branch: fix/macos-vm-skip-docker-bridge-probe
Requested jobs: all (no filter)
Summary: 5 passed, 34 failed, 2 skipped

Job Result
brave-search-e2e ✅ success
cloud-e2e ❌ failure
cloud-inference-e2e ❌ failure
cloud-onboard-e2e ❌ failure
credential-migration-e2e ❌ failure
credential-sanitization-e2e ❌ failure
deployment-services-e2e ❌ failure
device-auth-health-e2e ❌ failure
diagnostics-e2e ❌ failure
docs-validation-e2e ❌ failure
double-onboard-e2e ❌ failure
gpu-double-onboard-e2e ⏭️ skipped
gpu-e2e ⏭️ skipped
hermes-discord-e2e ❌ failure
hermes-e2e ❌ failure
hermes-inference-switch-e2e ❌ failure
hermes-slack-e2e ❌ failure
inference-routing-e2e ✅ success
issue-2478-crash-loop-recovery-e2e ❌ failure
kimi-inference-compat-e2e ✅ success
launchable-smoke-e2e ❌ failure
messaging-compatible-endpoint-e2e ❌ failure
messaging-providers-e2e ❌ failure
network-policy-e2e ❌ failure
onboard-repair-e2e ❌ failure
onboard-resume-e2e ❌ failure
openclaw-inference-switch-e2e ❌ failure
openshell-gateway-upgrade-e2e ❌ failure
overlayfs-autofix-e2e ✅ success
rebuild-hermes-e2e ❌ failure
rebuild-hermes-stale-base-e2e ❌ failure
rebuild-openclaw-e2e ✅ success
runtime-overrides-e2e ❌ failure
sandbox-operations-e2e ❌ failure
sandbox-survival-e2e ❌ failure
shields-config-e2e ❌ failure
skill-agent-e2e ❌ failure
snapshot-commands-e2e ❌ failure
telegram-injection-e2e ❌ failure
token-rotation-e2e ❌ failure
upgrade-stale-sandbox-e2e ❌ failure

Failed jobs: cloud-e2e, cloud-inference-e2e, cloud-onboard-e2e, credential-migration-e2e, credential-sanitization-e2e, deployment-services-e2e, device-auth-health-e2e, diagnostics-e2e, docs-validation-e2e, double-onboard-e2e, hermes-discord-e2e, hermes-e2e, hermes-inference-switch-e2e, hermes-slack-e2e, issue-2478-crash-loop-recovery-e2e, launchable-smoke-e2e, messaging-compatible-endpoint-e2e, messaging-providers-e2e, network-policy-e2e, onboard-repair-e2e, onboard-resume-e2e, openclaw-inference-switch-e2e, openshell-gateway-upgrade-e2e, rebuild-hermes-e2e, rebuild-hermes-stale-base-e2e, runtime-overrides-e2e, sandbox-operations-e2e, sandbox-survival-e2e, shields-config-e2e, skill-agent-e2e, snapshot-commands-e2e, telegram-injection-e2e, token-rotation-e2e, upgrade-stale-sandbox-e2e. Check run artifacts for logs.

ericksoa added 2 commits May 13, 2026 03:53
…ker-bridge-probe

# Conflicts:
#	src/lib/onboard.ts
#	src/lib/onboard/gateway-sandbox-reachability.test.ts
#	src/lib/onboard/gateway-sandbox-reachability.ts
#	test/gateway-liveness-probe.test.ts
@github-actions
Copy link
Copy Markdown
Contributor

Selective E2E Results — ❌ Some jobs failed

Run: 25794586425
Branch: fix/macos-vm-skip-docker-bridge-probe
Requested jobs: all (no filter)
Summary: 18 passed, 2 failed, 2 skipped

Job Result
brave-search-e2e ✅ success
cloud-e2e ❌ failure
cloud-inference-e2e ✅ success
cloud-onboard-e2e ✅ success
credential-migration-e2e ⚠️ cancelled
credential-sanitization-e2e ✅ success
deployment-services-e2e ⚠️ cancelled
device-auth-health-e2e ⚠️ cancelled
diagnostics-e2e ⚠️ cancelled
docs-validation-e2e ✅ success
double-onboard-e2e ⚠️ cancelled
gpu-double-onboard-e2e ⏭️ skipped
gpu-e2e ⏭️ skipped
hermes-discord-e2e ✅ success
hermes-e2e ✅ success
hermes-inference-switch-e2e ✅ success
hermes-slack-e2e ✅ success
inference-routing-e2e ⚠️ cancelled
issue-2478-crash-loop-recovery-e2e ⚠️ cancelled
kimi-inference-compat-e2e ✅ success
launchable-smoke-e2e ✅ success
messaging-compatible-endpoint-e2e ✅ success
messaging-providers-e2e ⚠️ cancelled
network-policy-e2e ⚠️ cancelled
onboard-repair-e2e ⚠️ cancelled
onboard-resume-e2e ⚠️ cancelled
openclaw-inference-switch-e2e ⚠️ cancelled
openshell-gateway-upgrade-e2e ⚠️ cancelled
overlayfs-autofix-e2e ✅ success
rebuild-hermes-e2e ✅ success
rebuild-hermes-stale-base-e2e ✅ success
rebuild-openclaw-e2e ⚠️ cancelled
runtime-overrides-e2e ⚠️ cancelled
sandbox-operations-e2e ⚠️ cancelled
sandbox-survival-e2e ❌ failure
shields-config-e2e ✅ success
skill-agent-e2e ⚠️ cancelled
snapshot-commands-e2e ✅ success
telegram-injection-e2e ✅ success
token-rotation-e2e ⚠️ cancelled
upgrade-stale-sandbox-e2e ⚠️ cancelled

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

@github-actions
Copy link
Copy Markdown
Contributor

Selective E2E Results — ❌ Some jobs failed

Run: 25795005190
Branch: fix/macos-vm-skip-docker-bridge-probe
Requested jobs: all (no filter)
Summary: 32 passed, 2 failed, 2 skipped

Job Result
brave-search-e2e ✅ success
cloud-e2e ✅ success
cloud-inference-e2e ✅ success
cloud-onboard-e2e ✅ success
credential-migration-e2e ✅ success
credential-sanitization-e2e ✅ success
deployment-services-e2e ✅ success
device-auth-health-e2e ✅ success
diagnostics-e2e ✅ success
docs-validation-e2e ✅ success
double-onboard-e2e ⚠️ cancelled
gpu-double-onboard-e2e ⏭️ skipped
gpu-e2e ⏭️ skipped
hermes-discord-e2e ✅ success
hermes-e2e ✅ success
hermes-inference-switch-e2e ✅ success
hermes-slack-e2e ✅ success
inference-routing-e2e ✅ success
issue-2478-crash-loop-recovery-e2e ✅ success
kimi-inference-compat-e2e ✅ success
launchable-smoke-e2e ❌ failure
messaging-compatible-endpoint-e2e ✅ success
messaging-providers-e2e ✅ success
network-policy-e2e ❌ failure
onboard-repair-e2e ⚠️ cancelled
onboard-resume-e2e ✅ success
openclaw-inference-switch-e2e ✅ success
openshell-gateway-upgrade-e2e ⚠️ cancelled
overlayfs-autofix-e2e ✅ success
rebuild-hermes-e2e ✅ success
rebuild-hermes-stale-base-e2e ✅ success
rebuild-openclaw-e2e ✅ success
runtime-overrides-e2e ✅ success
sandbox-operations-e2e ⚠️ cancelled
sandbox-survival-e2e ✅ success
shields-config-e2e ✅ success
skill-agent-e2e ✅ success
snapshot-commands-e2e ✅ success
telegram-injection-e2e ✅ success
token-rotation-e2e ⚠️ cancelled
upgrade-stale-sandbox-e2e ✅ success

Failed jobs: launchable-smoke-e2e, network-policy-e2e. Check run artifacts for logs.

@ericksoa ericksoa added v0.0.41 Release target Platform: macOS Support for macOS OpenShell Support for OpenShell, a safe, private runtime for autonomous AI agents Integration: Discord Use this label to identify Discord bot integration issues with NemoClaw. Integration: Hermes labels May 13, 2026
@ericksoa ericksoa self-assigned this May 13, 2026
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 3

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

Inline comments:
In `@src/lib/actions/sandbox/connect.ts`:
- Around line 41-42: The current LEGACY_CLUSTER_DRIVERS set special-cases too
many drivers (null/undefined/""/"kubernetes") causing Docker to be treated as
non-legacy; change the logic so only the VM driver is special-cased: update the
LEGACY_CLUSTER_DRIVERS definition (and the other occurrence at the same block
referenced in the comment) to only include the VM identifier (e.g., "vm"),
ensuring Docker (e.g., openshellDriver: "docker") falls through the legacy DNS
repair path so repairSandboxInferenceRouteIfNeeded() still calls
runSetupDnsProxy(...); add a small regression test using openshellDriver:
"docker" to verify the legacy path is used.

In `@src/lib/actions/sandbox/vm-dns-monkeypatch.ts`:
- Around line 142-174: realpathIfPresent returning null can mean a dangling
symlink; treat that as a rejected case instead of "missing" to avoid following
the symlink later. After calling realpathIfPresent(target) in the function that
returns {ok, path} (using symbols realpathIfPresent, isPathInside,
opts.mustExist, rootfsReal, relativePath), add a check that calls fs.lstat (or a
helper lstatIfPresent) for target and if it exists and isSymbolicLink() but
realpath returned null, return { ok: false, reason: `refusing to patch
${path.join(...relativePath)} because it is a dangling symlink` } (respecting
existing messaging style); only treat as "missing" when lstat shows no entry.
Also add a regression test for a dangling symlink whose target does not exist.

In `@test/onboard.test.ts`:
- Line 5146: The regex used in the regression assertion makes the third argument
to createSandbox optional by using (?:, sandboxName)?, weakening the test;
update the pattern so the third argument is mandatory (remove the optional
quantifier) so the sequence that includes
getRecordedMessagingChannelsForResume(..., session, sandboxName),
selectedMessagingChannels assignments, setupMessagingChannels(),
readMessagingChannelConfigFromEnv(), onboardSession.updateSession(...
current.messagingChannels/current.messagingChannelConfig ...), and the call to
createSandbox(gpu, model, provider, preferredInferenceApi, sandboxName,
nextWebSearchConfig, selectedMessagingChannels, fromDockerfile, agent,
opts.controlUiPort || null, sandboxGpuConfig) requires sandboxName to be
present.
🪄 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: 250033a0-2cdf-4157-8e53-82b65d3d10e8

📥 Commits

Reviewing files that changed from the base of the PR and between 242a624 and 32056fa.

📒 Files selected for processing (6)
  • src/lib/actions/sandbox/connect.ts
  • src/lib/actions/sandbox/vm-dns-monkeypatch.test.ts
  • src/lib/actions/sandbox/vm-dns-monkeypatch.ts
  • src/lib/onboard/vm-dns-monkeypatch.ts
  • test/onboard.test.ts
  • test/sandbox-connect-inference.test.ts
🚧 Files skipped from review as they are similar to previous changes (1)
  • test/sandbox-connect-inference.test.ts

Comment thread src/lib/actions/sandbox/connect.ts Outdated
Comment thread src/lib/actions/sandbox/vm-dns-monkeypatch.ts
Comment thread test/onboard.test.ts Outdated
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

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

Inline comments:
In `@src/lib/actions/sandbox/connect.ts`:
- Around line 166-172: The reapplyVmInferenceRoute function currently
short-circuits health checking when runOpenshell(["inference","set",...])
returns non-zero and omits --no-verify; change it to always append the
"--no-verify" flag to the runOpenshell args (matching the earlier route-switch
path) and do not use the command exit status to decide success—instead always
call isSandboxInferenceRouteHealthy(sandboxName) after runOpenshell (you can
still pass ignoreError: true) and return that probe result; update references to
runOpenshell and isSandboxInferenceHealthy in reapplyVmInferenceRoute
accordingly.
🪄 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: 1d989603-4ffd-422c-bf3c-6e62b3edbce3

📥 Commits

Reviewing files that changed from the base of the PR and between d7a3b25 and 70a4887.

📒 Files selected for processing (5)
  • src/lib/actions/sandbox/connect.ts
  • src/lib/actions/sandbox/vm-dns-monkeypatch.test.ts
  • src/lib/actions/sandbox/vm-dns-monkeypatch.ts
  • test/onboard.test.ts
  • test/sandbox-connect-inference.test.ts
🚧 Files skipped from review as they are similar to previous changes (3)
  • test/sandbox-connect-inference.test.ts
  • test/onboard.test.ts
  • src/lib/actions/sandbox/vm-dns-monkeypatch.ts

Comment thread src/lib/actions/sandbox/connect.ts Outdated
cv added 2 commits May 13, 2026 15:15
…ker-bridge-probe

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

# Conflicts:
#	src/lib/sandbox/create-stream.test.ts
#	src/lib/sandbox/create-stream.ts
Copy link
Copy Markdown
Collaborator

@cv cv left a comment

Choose a reason for hiding this comment

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

Resolved the merge conflicts by merging main and preserving both the VM startup-output gate and Docker GPU failure-check paths in create-stream. Reviewed the VM DNS monkeypatch, messaging reuse, Hermes Discord config, and policy changes; no blocking issues found. Local focused suite and PR checks are green.

@github-actions
Copy link
Copy Markdown
Contributor

Selective E2E Results — ✅ All requested jobs passed

Run: 25832402958
Target ref: 5a84abbae9485ee8b9d0f5002ab6f00ec5157b42
Workflow ref: main
Requested jobs: hermes-discord-e2e,network-policy-e2e
Summary: 2 passed, 0 failed, 0 skipped

Job Result
hermes-discord-e2e ✅ success
network-policy-e2e ✅ success

@cv cv added v0.0.42 Release target and removed v0.0.41 Release target labels May 14, 2026
@github-actions
Copy link
Copy Markdown
Contributor

Selective E2E Results — ✅ All requested jobs passed

Run: 25859064427
Target ref: 2646709f0bda0a22e4492350d80e8f0d9c37ddeb
Workflow ref: main
Requested jobs: hermes-e2e,hermes-discord-e2e,network-policy-e2e,onboard-resume-e2e,token-rotation-e2e
Summary: 5 passed, 0 failed, 0 skipped

Job Result
hermes-discord-e2e ✅ success
hermes-e2e ✅ success
network-policy-e2e ✅ success
onboard-resume-e2e ✅ success
token-rotation-e2e ✅ success

@github-actions
Copy link
Copy Markdown
Contributor

Selective E2E Results — ✅ All requested jobs passed

Run: 25860706571
Target ref: 2646709f0bda0a22e4492350d80e8f0d9c37ddeb
Workflow ref: fix/macos-vm-skip-docker-bridge-probe
Requested jobs: all (no filter)
Summary: 36 passed, 0 failed, 2 skipped

Job Result
brave-search-e2e ✅ success
cloud-e2e ✅ success
cloud-inference-e2e ✅ success
cloud-onboard-e2e ✅ success
credential-migration-e2e ✅ success
credential-sanitization-e2e ✅ success
deployment-services-e2e ✅ success
device-auth-health-e2e ✅ success
diagnostics-e2e ✅ success
docs-validation-e2e ✅ success
double-onboard-e2e ⚠️ cancelled
gpu-double-onboard-e2e ⏭️ skipped
gpu-e2e ⏭️ skipped
hermes-discord-e2e ✅ success
hermes-e2e ✅ success
hermes-inference-switch-e2e ✅ success
hermes-slack-e2e ✅ success
inference-routing-e2e ✅ success
issue-2478-crash-loop-recovery-e2e ✅ success
kimi-inference-compat-e2e ✅ success
launchable-smoke-e2e ✅ success
messaging-compatible-endpoint-e2e ✅ success
messaging-providers-e2e ✅ success
network-policy-e2e ✅ success
onboard-repair-e2e ✅ success
onboard-resume-e2e ✅ success
openclaw-inference-switch-e2e ✅ success
openshell-gateway-upgrade-e2e ✅ success
overlayfs-autofix-e2e ✅ success
rebuild-hermes-e2e ✅ success
rebuild-hermes-stale-base-e2e ✅ success
rebuild-openclaw-e2e ✅ success
runtime-overrides-e2e ✅ success
sandbox-operations-e2e ⚠️ cancelled
sandbox-survival-e2e ✅ success
shields-config-e2e ✅ success
skill-agent-e2e ✅ success
snapshot-commands-e2e ✅ success
telegram-injection-e2e ✅ success
token-rotation-e2e ⚠️ cancelled
upgrade-stale-sandbox-e2e ✅ success

@github-actions
Copy link
Copy Markdown
Contributor

Selective E2E Results — ✅ All requested jobs passed

Run: 25861634603
Target ref: 4c36539fb1de09f5161254449564dd9443fad04d
Workflow ref: main
Requested jobs: hermes-discord-e2e,hermes-e2e,messaging-providers-e2e,network-policy-e2e,onboard-resume-e2e,cloud-onboard-e2e
Summary: 6 passed, 0 failed, 0 skipped

Job Result
cloud-onboard-e2e ✅ success
hermes-discord-e2e ✅ success
hermes-e2e ✅ success
messaging-providers-e2e ✅ success
network-policy-e2e ✅ success
onboard-resume-e2e ✅ success

@github-actions
Copy link
Copy Markdown
Contributor

Selective E2E Results — ✅ All requested jobs passed

Run: 25861533504
Target ref: 4c36539fb1de09f5161254449564dd9443fad04d
Workflow ref: fix/macos-vm-skip-docker-bridge-probe
Requested jobs: all (no filter)
Summary: 39 passed, 0 failed, 2 skipped

Job Result
brave-search-e2e ✅ success
cloud-e2e ✅ success
cloud-inference-e2e ✅ success
cloud-onboard-e2e ✅ success
credential-migration-e2e ✅ success
credential-sanitization-e2e ✅ success
deployment-services-e2e ✅ success
device-auth-health-e2e ✅ success
diagnostics-e2e ✅ success
docs-validation-e2e ✅ success
double-onboard-e2e ✅ success
gpu-double-onboard-e2e ⏭️ skipped
gpu-e2e ⏭️ skipped
hermes-discord-e2e ✅ success
hermes-e2e ✅ success
hermes-inference-switch-e2e ✅ success
hermes-slack-e2e ✅ success
inference-routing-e2e ✅ success
issue-2478-crash-loop-recovery-e2e ✅ success
kimi-inference-compat-e2e ✅ success
launchable-smoke-e2e ✅ success
messaging-compatible-endpoint-e2e ✅ success
messaging-providers-e2e ✅ success
network-policy-e2e ✅ success
onboard-repair-e2e ✅ success
onboard-resume-e2e ✅ success
openclaw-inference-switch-e2e ✅ success
openshell-gateway-upgrade-e2e ✅ success
overlayfs-autofix-e2e ✅ success
rebuild-hermes-e2e ✅ success
rebuild-hermes-stale-base-e2e ✅ success
rebuild-openclaw-e2e ✅ success
runtime-overrides-e2e ✅ success
sandbox-operations-e2e ✅ success
sandbox-survival-e2e ✅ success
shields-config-e2e ✅ success
skill-agent-e2e ✅ success
snapshot-commands-e2e ✅ success
telegram-injection-e2e ✅ success
token-rotation-e2e ✅ success
upgrade-stale-sandbox-e2e ✅ success

@ericksoa ericksoa added v0.0.42 Release target and removed v0.0.42 Release target labels May 14, 2026
@github-actions
Copy link
Copy Markdown
Contributor

Selective E2E Results — ✅ All requested jobs passed

Run: 25877688734
Target ref: 55296c4d13f6dd4d6a145b0b6db8b1bea3635b7b
Workflow ref: main
Requested jobs: messaging-providers-e2e,hermes-discord-e2e,network-policy-e2e,sandbox-operations-e2e,inference-routing-e2e,onboard-resume-e2e
Summary: 6 passed, 0 failed, 0 skipped

Job Result
hermes-discord-e2e ✅ success
inference-routing-e2e ✅ success
messaging-providers-e2e ✅ success
network-policy-e2e ✅ success
onboard-resume-e2e ✅ success
sandbox-operations-e2e ✅ success

@ericksoa ericksoa merged commit 278e28a into main May 14, 2026
18 checks passed
@ericksoa ericksoa deleted the fix/macos-vm-skip-docker-bridge-probe branch May 14, 2026 20:18
@github-actions
Copy link
Copy Markdown
Contributor

Selective E2E Results — ✅ All requested jobs passed

Run: 25883112020
Target ref: 7a22871ed2af1b3d980baac4ec1e22767ee0c008
Workflow ref: main
Requested jobs: hermes-discord-e2e,messaging-providers-e2e,network-policy-e2e,inference-routing-e2e,onboard-resume-e2e
Summary: 5 passed, 0 failed, 0 skipped

Job Result
hermes-discord-e2e ✅ success
inference-routing-e2e ✅ success
messaging-providers-e2e ✅ success
network-policy-e2e ✅ success
onboard-resume-e2e ✅ success

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bug Something isn't working fix Integration: Discord Use this label to identify Discord bot integration issues with NemoClaw. Integration: Hermes OpenShell Support for OpenShell, a safe, private runtime for autonomous AI agents Platform: macOS Support for macOS v0.0.42 Release target

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants