Skip to content

fix(onboard): retry Docker Desktop gateway bridge probe - #5754

Merged
cv merged 7 commits into
mainfrom
fix/gateway-bridge-probe-retry
Jun 28, 2026
Merged

fix(onboard): retry Docker Desktop gateway bridge probe#5754
cv merged 7 commits into
mainfrom
fix/gateway-bridge-probe-retry

Conversation

@zyang-dev

@zyang-dev zyang-dev commented Jun 24, 2026

Copy link
Copy Markdown
Contributor

Summary

Retries the Docker Desktop/VM-backed sandbox bridge gateway probe during onboarding when the initial host-gateway TCP check fails. This handles the short startup race where the OpenShell gateway is listening, but Docker Desktop’s host-gateway path is not reachable yet.

Fixes an onboarding race on non-native Linux Docker setups where the OpenShell gateway can be listening on 127.0.0.1:8080, but Docker’s host-gateway route is not reachable from sandbox containers yet. NemoClaw now retries transient host-gateway TCP probe failures before reporting the gateway as unreachable.

Related Issue

Fixes #5513

Changes

  • Add bounded retry/backoff for host_gateway sandbox bridge probes that fail with tcp_failed.
  • Limit retries to non-native Linux host-gateway probe failures.
  • Add tests covering successful host-gateway retry and non-retry behavior for bridge-gateway failures.

Type of Change

  • Code change (feature, bug fix, or refactor)
  • Code change with doc updates
  • Doc only (prose changes, no code sample modifications)
  • Doc only (includes code sample changes)

Verification

  • PR description includes the DCO sign-off declaration and every commit appears as Verified in GitHub
  • Git hooks passed during commit and push, or npx prek run --from-ref main --to-ref HEAD passes
  • Targeted tests pass for changed behavior
  • Full npm test passes (broad runtime changes only)
  • Tests added or updated for new or changed behavior
  • No secrets, API keys, or credentials committed
  • Docs updated for user-facing behavior changes
  • npm run docs builds without warnings (doc changes only)
  • Doc pages follow the style guide (doc changes only)
  • New doc pages include SPDX header and frontmatter (new pages only)

Signed-off-by: zyang-dev 267119621+zyang-dev@users.noreply.github.com

Summary by CodeRabbit

Summary

  • Bug Fixes
    • Improved sandbox gateway reachability checks by retrying only transient host-gateway tcp_failed failures before failing.
    • Added configurable retry attempts and delay between probes, with improved success/failure logging per attempt.
  • Tests
    • Added coverage for retry success, retry exhaustion behavior, and ensuring bridge-gateway tcp_failed does not trigger retries.

Signed-off-by: zyang-dev <267119621+zyang-dev@users.noreply.github.com>
Signed-off-by: zyang-dev <267119621+zyang-dev@users.noreply.github.com>
@coderabbitai

coderabbitai Bot commented Jun 24, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

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: 9ebf3623-3d98-4a91-b7e5-b1a996ad53b5

📥 Commits

Reviewing files that changed from the base of the PR and between e40bd41 and 144c3d0.

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

📝 Walkthrough

Walkthrough

Adds retry handling for sandbox bridge reachability probes when host-gateway TCP failures persist, plus tests covering recovery, exhaustion, defaults, and the non-retried bridge-gateway path.

Changes

Sandbox bridge reachability retries

Layer / File(s) Summary
Retry config and helpers
src/lib/onboard/gateway-sandbox-reachability.ts
Adds retry configuration constants, verifier overrides, a retriable-failure predicate, and the sleep helper used between attempts.
Retry loop in verifier
src/lib/onboard/gateway-sandbox-reachability.ts
verifySandboxBridgeGatewayReachableOrExit re-runs the reachability probe for retriable host-gateway tcp_failed failures, logs each attempt, sleeps between retries, and returns early on success.
Retry behavior tests
src/lib/onboard/gateway-sandbox-reachability.test.ts
Adds coverage for transient success after retries, exhausted retries, default retry budget behavior, and the non-retried bridge-gateway failure path.

Sequence Diagram(s)

sequenceDiagram
  participant verifySandboxBridgeGatewayReachableOrExit
  participant reachabilityImpl
  participant sleepMs
  verifySandboxBridgeGatewayReachableOrExit->>reachabilityImpl: initial probe
  reachabilityImpl-->>verifySandboxBridgeGatewayReachableOrExit: host_gateway tcp_failed
  alt retriable and attempts remain
    verifySandboxGatewayReachableOrExit->>sleepMs: wait retryDelayMs
    verifySandboxGatewayReachableOrExit->>reachabilityImpl: retry probe
    reachabilityImpl-->>verifySandboxGatewayReachableOrExit: reach.ok or next failure
  else non-retriable or attempts exhausted
    verifySandboxGatewayReachableOrExit-->>verifySandboxGatewayReachableOrExit: continue failure handling
  end
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Possibly related issues

Poem

Hop, hop, the bridge got tried once more,
then snoozed a bit and tried again.
A tcp_failed turned into success galore,
and bunny ears went up in rain. 🐰

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly summarizes the main change: retrying the Docker Desktop gateway bridge probe.
Linked Issues check ✅ Passed The retry logic matches the linked issue's goal of making Docker Desktop WSL onboarding tolerate host-gateway probe failures.
Out of Scope Changes check ✅ Passed The changes are focused on gateway probe retry behavior and related tests, with no clear unrelated additions.

✏️ 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/gateway-bridge-probe-retry

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

@github-code-quality

github-code-quality Bot commented Jun 24, 2026

Copy link
Copy Markdown
Contributor

Code Coverage Overview

Languages: TypeScript

TypeScript / code-coverage/plugin

The overall coverage in the fix/gateway-bridge-p... branch is 96%. Coverage data for the main branch is not yet available.

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

TypeScript / code-coverage/cli

The overall coverage in the fix/gateway-bridge-p... branch is 47%. Coverage data for the main branch is not yet available.

Show a code coverage summary of the most covered files.
File main fix/gateway-bridge-p... efda069 +/-
src/lib/state/o...oard-session.ts 91%
src/lib/inference/local.ts 76%
src/lib/sandbox/config.ts 72%
src/lib/actions...dbox/rebuild.ts 71%
src/lib/onboard/preflight.ts 64%
src/lib/actions...licy-channel.ts 60%
src/lib/state/sandbox.ts 56%
src/lib/policy/index.ts 49%
src/lib/onboard...er-gpu-patch.ts 44%
src/lib/onboard.ts 19%

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

@github-actions

github-actions Bot commented Jun 24, 2026

Copy link
Copy Markdown
Contributor

E2E Advisor Recommendation

Required E2E: cloud-onboard-e2e
Optional E2E: onboard-negative-paths-e2e, network-policy-e2e

Dispatch hint: cloud-onboard-e2e

Workflow run

Full advisor summary

E2E Recommendation Advisor

Base: origin/main
Head: HEAD
Confidence: high

Required E2E

  • cloud-onboard-e2e (medium): Required because the PR changes onboarding preflight networking behavior that can block or allow the real hosted OpenClaw onboarding user flow. This E2E runs a full cloud onboarding path with a live sandbox and exercises the gateway/sandbox setup path around this verifier.

Optional E2E

  • onboard-negative-paths-e2e (medium): Useful adjacent confidence for onboarding failure handling and user-facing diagnostics, since this PR changes retry/failure behavior and unreachable-gateway messaging paths. Not merge-blocking because the changed host-gateway retry path is primarily covered by unit tests and cloud-onboard is the critical real onboarding flow.
  • network-policy-e2e (high): Optional adjacent coverage because the repository already has host.openshell.internal/host-gateway E2E coverage in the network-policy suite. This does not directly exercise the onboarding reachability verifier retry loop, but can catch regressions in host-gateway routing assumptions.

New E2E recommendations

  • sandbox-networking-gateway-reachability (medium): Existing E2E coverage does not appear to directly force a transient host-gateway TCP failure during onboarding and assert that the retry budget recovers without surfacing UFW bridge-gateway instructions. The new behavior is currently validated mainly by unit tests.
    • Suggested test: Add an onboarding/networking E2E scenario that simulates or runs on a Docker Desktop/VM-backed host-gateway route where the first gateway probe fails transiently, then succeeds, and verifies onboarding completes with the retry log and without UFW remediation text.

Dispatch hint

  • Workflow: nightly-e2e.yaml
  • jobs input: cloud-onboard-e2e

@github-actions

github-actions Bot commented Jun 24, 2026

Copy link
Copy Markdown
Contributor

Vitest E2E Scenario Recommendation

Required Vitest E2E scenarios: ubuntu-repo-cloud-openclaw
Optional Vitest E2E scenarios: None

Dispatch required Vitest E2E scenarios:

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

Workflow run

Full Vitest E2E advisor summary

Vitest E2E Scenario Advisor

Base: origin/main
Head: HEAD
Confidence: high

Required Vitest E2E scenarios

  • ubuntu-repo-cloud-openclaw: The PR changes the live onboarding sandbox bridge gateway reachability verifier, including retry behavior for host-gateway TCP failures. The Ubuntu repo Docker cloud OpenClaw scenario is the smallest live-supported typed scenario that runs the real onboarding path using Docker and exercises this preflight/reachability surface.
    • Dispatch: gh workflow run e2e-vitest-scenarios.yaml --ref <pr-head-ref> --field scenarios=ubuntu-repo-cloud-openclaw

Optional Vitest E2E scenarios

  • None.

Relevant changed files

  • src/lib/onboard/gateway-sandbox-reachability.ts

@github-actions

github-actions Bot commented Jun 24, 2026

Copy link
Copy Markdown
Contributor

PR Review Advisor — Blocked

Merge posture: Do not merge until addressed
Primary next action: Fix PRA-2: Retry-only change does not satisfy #5513's Docker Desktop WSL bind-address fix; then add or justify PRA-T1.
Open items: 1 required · 2 warnings · 0 suggestions · 8 test follow-ups
Since last review: 0 prior items resolved · 3 still apply · 0 new items found

Action checklist

  • PRA-2 Fix: Retry-only change does not satisfy [WSL2][Policy&Network] OpenShell gateway unreachable from sandbox containers on Docker Desktop WSL (binds to 127.0.0.1:8080) #5513's Docker Desktop WSL bind-address fix in src/lib/onboard/gateway-sandbox-reachability.ts:528
  • PRA-1 Resolve or justify: Source-of-truth review needed: Host-gateway TCP failure retry in `verifySandboxBridgeGatewayReachableOrExit()`
  • PRA-3 Resolve or justify: Host-gateway retry workaround still lacks source-of-truth proof in src/lib/onboard/gateway-sandbox-reachability.ts:531
  • PRA-T1 Add or justify test follow-up: Runtime validation
  • PRA-T2 Add or justify test follow-up: Runtime validation
  • PRA-T3 Add or justify test follow-up: Runtime validation
  • PRA-T4 Add or justify test follow-up: Runtime validation
  • PRA-T5 Add or justify test follow-up: Acceptance clause
  • PRA-T6 Add or justify test follow-up: Acceptance clause
  • PRA-T7 Add or justify test follow-up: Acceptance clause
  • PRA-T8 Add or justify test follow-up: Acceptance clause

Findings index

ID Severity Category Location Required action
PRA-1 Resolve/justify architecture Identify the invalid state, source boundary, source-fix constraint, regression test, and removal condition before merging the localized behavior.
PRA-2 Required acceptance src/lib/onboard/gateway-sandbox-reachability.ts:528 Either implement the Docker Desktop WSL source fix in this PR by selecting a container-reachable gateway bind address for that host class, and add the corresponding cleanup behavior if this PR continues to claim the full #5513 fix, or narrow the PR claim so it no longer says it fixes #5513's bind-address and orphaned-gateway clauses. Keep the retry as a complementary mitigation only if its scope remains restricted to `host_gateway` TCP failures.
PRA-3 Resolve/justify architecture src/lib/onboard/gateway-sandbox-reachability.ts:531 Before merging the retry as a fix, document or encode the source boundary: identify the invalid state, where it is created, why a source fix is not part of this PR, what evidence proves the retry is safe for the target platform, and when the retry can be removed. Prefer making the invalid bind state impossible at gateway startup if the linked issue's bind-address diagnosis remains the verified source.

🚨 Required before merge

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

PRA-2 Required — Retry-only change does not satisfy #5513's Docker Desktop WSL bind-address fix

  • Location: src/lib/onboard/gateway-sandbox-reachability.ts:528
  • Category: acceptance
  • Problem: The PR body says `Fixes [WSL2][Policy&Network] OpenShell gateway unreachable from sandbox containers on Docker Desktop WSL (binds to 127.0.0.1:8080) #5513`, but the linked issue's expected result is for the OpenShell gateway on Docker Desktop WSL to bind to an interface reachable from sandbox containers via `host.openshell.internal:host-gateway`. This diff only retries `host_gateway`/`tcp_failed` probe results; it does not change the gateway bind-address source or startup environment. The linked issue comments also call out fatal-probe cleanup as a separate [WSL2][Policy&Network] OpenShell gateway unreachable from sandbox containers on Docker Desktop WSL (binds to 127.0.0.1:8080) #5513 symptom, while this function still exits on fatal unreachable without an `onUnreachable` cleanup hook.
  • Impact: Docker Desktop WSL hosts with a deterministic loopback-only gateway listener can still fail after the retry budget, so closing [WSL2][Policy&Network] OpenShell gateway unreachable from sandbox containers on Docker Desktop WSL (binds to 127.0.0.1:8080) #5513 from this PR could leave the original onboarding blocker in place and obscure it behind an added delay. If the gateway remains running after failure, reruns may continue to collide with the stale loopback listener.
  • Required action: Either implement the Docker Desktop WSL source fix in this PR by selecting a container-reachable gateway bind address for that host class, and add the corresponding cleanup behavior if this PR continues to claim the full [WSL2][Policy&Network] OpenShell gateway unreachable from sandbox containers on Docker Desktop WSL (binds to 127.0.0.1:8080) #5513 fix, or narrow the PR claim so it no longer says it fixes [WSL2][Policy&Network] OpenShell gateway unreachable from sandbox containers on Docker Desktop WSL (binds to 127.0.0.1:8080) #5513's bind-address and orphaned-gateway clauses. Keep the retry as a complementary mitigation only if its scope remains restricted to `host_gateway` TCP failures.
  • Expected follow-up: Fix before merge or get explicit maintainer override.
  • Verification: Read `src/lib/core/gateway-address.ts` and `src/lib/onboard/docker-driver-gateway-env.ts`: `DEFAULT_GATEWAY_BIND_ADDRESS` remains `127.0.0.1`, and `getGatewayStartNetworkEnv()` still sets `OPENSHELL_BIND_ADDRESS: GATEWAY_BIND_ADDRESS`. Then read `src/lib/onboard/docker-driver-gateway-launch.ts`: the existing `0.0.0.0` compat bind applies only when `shouldUseContainerizedGateway()` chooses container compatibility mode, not as a Docker Desktop WSL host-mode branch. Finally inspect `verifySandboxBridgeGatewayReachableOrExit()` for the retry-only loop and unchanged fatal `process.exit(1)` path.
  • Missing regression test: Add a Docker Desktop WSL gateway startup/env test proving `OPENSHELL_BIND_ADDRESS` becomes container-reachable, such as `0.0.0.0` or the Docker Desktop bridge address, while preserving the existing wildcard-bind warning. If this PR continues to cover the orphaned-gateway clause, add a fatal-unreachable test proving the gateway started earlier is stopped before exit. Also add or identify runtime validation that a sandbox helper using `--add-host host.openshell.internal:host-gateway` can reach the started gateway on Docker Desktop WSL.
  • Done when: The required change is committed and verification passes: Read `src/lib/core/gateway-address.ts` and `src/lib/onboard/docker-driver-gateway-env.ts`: `DEFAULT_GATEWAY_BIND_ADDRESS` remains `127.0.0.1`, and `getGatewayStartNetworkEnv()` still sets `OPENSHELL_BIND_ADDRESS: GATEWAY_BIND_ADDRESS`. Then read `src/lib/onboard/docker-driver-gateway-launch.ts`: the existing `0.0.0.0` compat bind applies only when `shouldUseContainerizedGateway()` chooses container compatibility mode, not as a Docker Desktop WSL host-mode branch. Finally inspect `verifySandboxBridgeGatewayReachableOrExit()` for the retry-only loop and unchanged fatal `process.exit(1)` path.
  • Evidence: Linked issue expected result: "On Docker Desktop WSL, the OpenShell gateway should bind to an interface reachable from sandbox containers via `host.openshell.internal:host-gateway` — either `0.0.0.0:8080` or the Docker Desktop bridge interface." The diff adds only retry constants/options and a retry loop in `verifySandboxBridgeGatewayReachableOrExit()`, plus mocked unit tests.
Review findings by urgency: 1 required fix, 2 items to resolve/justify, 0 in-scope improvements

⚠️ Resolve or justify before merge

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

PRA-1 Resolve/justify — Source-of-truth review needed: Host-gateway TCP failure retry in `verifySandboxBridgeGatewayReachableOrExit()`

  • Location: not file-specific
  • Category: architecture
  • Problem: The advisor marked localized patch analysis as needs_followup.
  • Impact: A localized workaround can preserve or hide an invalid state when the source boundary is unclear.
  • Recommended action: Identify the invalid state, source boundary, source-fix constraint, regression test, and removal condition before merging the localized behavior.
  • Expected follow-up: Resolve in this PR or explain why the risk is acceptable.
  • Verification: Inspect the localized patch and source-of-truth review fields for a concrete invalid state, source boundary, source-fix constraint, regression test, and removal condition.
  • Missing regression test: Current tests mock `reachabilityImpl()` and verify control flow only. They do not prove real Docker Desktop WSL host-gateway readiness recovers, nor that the bind-address source cannot regress.
  • Done when: The risk is fixed or explicitly justified in the PR. Verification: Inspect the localized patch and source-of-truth review fields for a concrete invalid state, source boundary, source-fix constraint, regression test, and removal condition.
  • Evidence: The retry loop is added in `src/lib/onboard/gateway-sandbox-reachability.ts`, while nearby bind-source files remain unchanged and linked issue evidence conflicts between deterministic bind mismatch and transient readiness race.

PRA-3 Resolve/justify — Host-gateway retry workaround still lacks source-of-truth proof

  • Location: src/lib/onboard/gateway-sandbox-reachability.ts:531
  • Category: architecture
  • Problem: The retry handles a localized invalid state, `host_gateway` plus `tcp_failed` after gateway startup, but the diff does not establish whether that state is created by a transient Docker Desktop host-gateway readiness race or by NemoClaw's gateway bind-address selection. The linked issue contains competing evidence: the issue body and first comment describe a deterministic `127.0.0.1` bind mismatch, while a later comment describes a short readiness race.
  • Impact: A localized retry can preserve and delay a deterministic bind-address failure. Users may wait through the retry budget and still hit the same fatal onboarding error, and maintainers may lose the regression signal that the bind-address source is still wrong for Docker Desktop WSL.
  • Recommended action: Before merging the retry as a fix, document or encode the source boundary: identify the invalid state, where it is created, why a source fix is not part of this PR, what evidence proves the retry is safe for the target platform, and when the retry can be removed. Prefer making the invalid bind state impossible at gateway startup if the linked issue's bind-address diagnosis remains the verified source.
  • Expected follow-up: Resolve in this PR or explain why the risk is acceptable.
  • Verification: Compare the retry block in `verifySandboxBridgeGatewayReachableOrExit()` with the linked issue body/comment text that names `OPENSHELL_BIND_ADDRESS=127.0.0.1` as the root cause. Then inspect whether any changed code proves a later real probe can become reachable without changing the bind address; the current tests use mocked `reachabilityImpl()` results only.
  • Missing regression test: Add a runtime or integration-style validation showing a real first `host_gateway`/`tcp_failed` probe can become reachable after retry on Docker Desktop WSL without changing the gateway bind address. Also add a persistent loopback-only listener validation proving retries exhaust and the host-gateway diagnostic is surfaced rather than proceeding.
  • Done when: The risk is fixed or explicitly justified in the PR. Verification: Compare the retry block in `verifySandboxBridgeGatewayReachableOrExit()` with the linked issue body/comment text that names `OPENSHELL_BIND_ADDRESS=127.0.0.1` as the root cause. Then inspect whether any changed code proves a later real probe can become reachable without changing the bind address; the current tests use mocked `reachabilityImpl()` results only.
  • Evidence: New tests mock `reachabilityImpl()` to fail then succeed or always fail. They prove retry-loop control flow, but they do not prove the real Docker Desktop WSL failure mode is transient or that the bind-address source cannot regress.

💡 In-scope improvements

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

  • None.
Test follow-ups to resolve or justify

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

  • PRA-T1 Runtime validation — Add a Docker Desktop WSL gateway startup/env test proving host-mode startup selects a container-reachable `OPENSHELL_BIND_ADDRESS`, or narrow the PR so it no longer claims [WSL2][Policy&Network] OpenShell gateway unreachable from sandbox containers on Docker Desktop WSL (binds to 127.0.0.1:8080) #5513's bind-address behavior.. The changed unit tests are strong for retry control flow and negative route scoping, but the claimed linked issue is a runtime Docker Desktop WSL sandbox networking path involving gateway startup, bind address, Docker host-gateway routing, and onboarding progression.
  • PRA-T2 Runtime validation — Add or identify runtime validation that starts the OpenShell Docker-driver gateway on Docker Desktop WSL and verifies a helper container using `--add-host host.openshell.internal:host-gateway` can reach `host.openshell.internal:8080` after the retry path.. The changed unit tests are strong for retry control flow and negative route scoping, but the claimed linked issue is a runtime Docker Desktop WSL sandbox networking path involving gateway startup, bind address, Docker host-gateway routing, and onboarding progression.
  • PRA-T3 Runtime validation — Add a persistent loopback-only listener validation proving host-gateway retries exhaust and report the host-gateway unreachable diagnostic instead of proceeding.. The changed unit tests are strong for retry control flow and negative route scoping, but the claimed linked issue is a runtime Docker Desktop WSL sandbox networking path involving gateway startup, bind address, Docker host-gateway routing, and onboarding progression.
  • PRA-T4 Runtime validation — If this PR continues to claim the full [WSL2][Policy&Network] OpenShell gateway unreachable from sandbox containers on Docker Desktop WSL (binds to 127.0.0.1:8080) #5513 fix, add a fatal-unreachable cleanup test proving the gateway process started earlier in onboarding is stopped when the sandbox-bridge probe remains unreachable.. The changed unit tests are strong for retry control flow and negative route scoping, but the claimed linked issue is a runtime Docker Desktop WSL sandbox networking path involving gateway startup, bind address, Docker host-gateway routing, and onboarding progression.
  • PRA-T5 Acceptance clause — Issue title/body: "OpenShell gateway unreachable from sandbox containers on Docker Desktop WSL (binds to 127.0.0.1:8080)" and "fails ... because the OpenShell Docker-driver gateway binds to `127.0.0.1:8080` ... instead of an interface reachable from sandbox containers." — add test evidence or identify existing coverage. The diff does not modify bind-address selection. `DEFAULT_GATEWAY_BIND_ADDRESS` remains `127.0.0.1`, and `getGatewayStartNetworkEnv()` still emits `OPENSHELL_BIND_ADDRESS: GATEWAY_BIND_ADDRESS`.
  • PRA-T6 Acceptance clause — Issue body: "Docker Desktop routes containers' `host.openshell.internal:host-gateway` to the Docker Desktop virtual host bridge `192.168.65.254`, not to the WSL distro's loopback, so the probe always fails with `Connection refused`." — add test evidence or identify existing coverage. The new retry can recover only when a later probe returns `ok`. Persistent host-gateway TCP failures still fail after exhaustion, and no bind-source code changes the loopback-vs-bridge mismatch described by the issue.
  • PRA-T7 Acceptance clause — Expected Result: "On Docker Desktop WSL, the OpenShell gateway should bind to an interface reachable from sandbox containers via `host.openshell.internal:host-gateway` — either `0.0.0.0:8080` or the Docker Desktop bridge interface." — add test evidence or identify existing coverage. No changed file selects `0.0.0.0` or a Docker Desktop bridge address for Docker Desktop WSL host-mode gateway startup. Existing compat-container binding to `0.0.0.0` is outside this PR's diff and gated by `shouldUseContainerizedGateway()`.
  • PRA-T8 Acceptance clause — Expected Result: "The sandbox-bridge probe should succeed and onboard should proceed to `[3/8]`." — add test evidence or identify existing coverage. The added unit test proves a mocked transient `host_gateway` TCP failure can retry and return when a later mock succeeds. There is no runtime evidence that the real Docker Desktop WSL probe succeeds and onboarding progresses.
Since last review details

Current findings, using the urgency labels above:

PRA-1 Resolve/justify — Source-of-truth review needed: Host-gateway TCP failure retry in `verifySandboxBridgeGatewayReachableOrExit()`

  • Location: not file-specific
  • Category: architecture
  • Problem: The advisor marked localized patch analysis as needs_followup.
  • Impact: A localized workaround can preserve or hide an invalid state when the source boundary is unclear.
  • Recommended action: Identify the invalid state, source boundary, source-fix constraint, regression test, and removal condition before merging the localized behavior.
  • Expected follow-up: Resolve in this PR or explain why the risk is acceptable.
  • Verification: Inspect the localized patch and source-of-truth review fields for a concrete invalid state, source boundary, source-fix constraint, regression test, and removal condition.
  • Missing regression test: Current tests mock `reachabilityImpl()` and verify control flow only. They do not prove real Docker Desktop WSL host-gateway readiness recovers, nor that the bind-address source cannot regress.
  • Done when: The risk is fixed or explicitly justified in the PR. Verification: Inspect the localized patch and source-of-truth review fields for a concrete invalid state, source boundary, source-fix constraint, regression test, and removal condition.
  • Evidence: The retry loop is added in `src/lib/onboard/gateway-sandbox-reachability.ts`, while nearby bind-source files remain unchanged and linked issue evidence conflicts between deterministic bind mismatch and transient readiness race.

PRA-2 Required — Retry-only change does not satisfy #5513's Docker Desktop WSL bind-address fix

  • Location: src/lib/onboard/gateway-sandbox-reachability.ts:528
  • Category: acceptance
  • Problem: The PR body says `Fixes [WSL2][Policy&Network] OpenShell gateway unreachable from sandbox containers on Docker Desktop WSL (binds to 127.0.0.1:8080) #5513`, but the linked issue's expected result is for the OpenShell gateway on Docker Desktop WSL to bind to an interface reachable from sandbox containers via `host.openshell.internal:host-gateway`. This diff only retries `host_gateway`/`tcp_failed` probe results; it does not change the gateway bind-address source or startup environment. The linked issue comments also call out fatal-probe cleanup as a separate [WSL2][Policy&Network] OpenShell gateway unreachable from sandbox containers on Docker Desktop WSL (binds to 127.0.0.1:8080) #5513 symptom, while this function still exits on fatal unreachable without an `onUnreachable` cleanup hook.
  • Impact: Docker Desktop WSL hosts with a deterministic loopback-only gateway listener can still fail after the retry budget, so closing [WSL2][Policy&Network] OpenShell gateway unreachable from sandbox containers on Docker Desktop WSL (binds to 127.0.0.1:8080) #5513 from this PR could leave the original onboarding blocker in place and obscure it behind an added delay. If the gateway remains running after failure, reruns may continue to collide with the stale loopback listener.
  • Required action: Either implement the Docker Desktop WSL source fix in this PR by selecting a container-reachable gateway bind address for that host class, and add the corresponding cleanup behavior if this PR continues to claim the full [WSL2][Policy&Network] OpenShell gateway unreachable from sandbox containers on Docker Desktop WSL (binds to 127.0.0.1:8080) #5513 fix, or narrow the PR claim so it no longer says it fixes [WSL2][Policy&Network] OpenShell gateway unreachable from sandbox containers on Docker Desktop WSL (binds to 127.0.0.1:8080) #5513's bind-address and orphaned-gateway clauses. Keep the retry as a complementary mitigation only if its scope remains restricted to `host_gateway` TCP failures.
  • Expected follow-up: Fix before merge or get explicit maintainer override.
  • Verification: Read `src/lib/core/gateway-address.ts` and `src/lib/onboard/docker-driver-gateway-env.ts`: `DEFAULT_GATEWAY_BIND_ADDRESS` remains `127.0.0.1`, and `getGatewayStartNetworkEnv()` still sets `OPENSHELL_BIND_ADDRESS: GATEWAY_BIND_ADDRESS`. Then read `src/lib/onboard/docker-driver-gateway-launch.ts`: the existing `0.0.0.0` compat bind applies only when `shouldUseContainerizedGateway()` chooses container compatibility mode, not as a Docker Desktop WSL host-mode branch. Finally inspect `verifySandboxBridgeGatewayReachableOrExit()` for the retry-only loop and unchanged fatal `process.exit(1)` path.
  • Missing regression test: Add a Docker Desktop WSL gateway startup/env test proving `OPENSHELL_BIND_ADDRESS` becomes container-reachable, such as `0.0.0.0` or the Docker Desktop bridge address, while preserving the existing wildcard-bind warning. If this PR continues to cover the orphaned-gateway clause, add a fatal-unreachable test proving the gateway started earlier is stopped before exit. Also add or identify runtime validation that a sandbox helper using `--add-host host.openshell.internal:host-gateway` can reach the started gateway on Docker Desktop WSL.
  • Done when: The required change is committed and verification passes: Read `src/lib/core/gateway-address.ts` and `src/lib/onboard/docker-driver-gateway-env.ts`: `DEFAULT_GATEWAY_BIND_ADDRESS` remains `127.0.0.1`, and `getGatewayStartNetworkEnv()` still sets `OPENSHELL_BIND_ADDRESS: GATEWAY_BIND_ADDRESS`. Then read `src/lib/onboard/docker-driver-gateway-launch.ts`: the existing `0.0.0.0` compat bind applies only when `shouldUseContainerizedGateway()` chooses container compatibility mode, not as a Docker Desktop WSL host-mode branch. Finally inspect `verifySandboxBridgeGatewayReachableOrExit()` for the retry-only loop and unchanged fatal `process.exit(1)` path.
  • Evidence: Linked issue expected result: "On Docker Desktop WSL, the OpenShell gateway should bind to an interface reachable from sandbox containers via `host.openshell.internal:host-gateway` — either `0.0.0.0:8080` or the Docker Desktop bridge interface." The diff adds only retry constants/options and a retry loop in `verifySandboxBridgeGatewayReachableOrExit()`, plus mocked unit tests.

PRA-3 Resolve/justify — Host-gateway retry workaround still lacks source-of-truth proof

  • Location: src/lib/onboard/gateway-sandbox-reachability.ts:531
  • Category: architecture
  • Problem: The retry handles a localized invalid state, `host_gateway` plus `tcp_failed` after gateway startup, but the diff does not establish whether that state is created by a transient Docker Desktop host-gateway readiness race or by NemoClaw's gateway bind-address selection. The linked issue contains competing evidence: the issue body and first comment describe a deterministic `127.0.0.1` bind mismatch, while a later comment describes a short readiness race.
  • Impact: A localized retry can preserve and delay a deterministic bind-address failure. Users may wait through the retry budget and still hit the same fatal onboarding error, and maintainers may lose the regression signal that the bind-address source is still wrong for Docker Desktop WSL.
  • Recommended action: Before merging the retry as a fix, document or encode the source boundary: identify the invalid state, where it is created, why a source fix is not part of this PR, what evidence proves the retry is safe for the target platform, and when the retry can be removed. Prefer making the invalid bind state impossible at gateway startup if the linked issue's bind-address diagnosis remains the verified source.
  • Expected follow-up: Resolve in this PR or explain why the risk is acceptable.
  • Verification: Compare the retry block in `verifySandboxBridgeGatewayReachableOrExit()` with the linked issue body/comment text that names `OPENSHELL_BIND_ADDRESS=127.0.0.1` as the root cause. Then inspect whether any changed code proves a later real probe can become reachable without changing the bind address; the current tests use mocked `reachabilityImpl()` results only.
  • Missing regression test: Add a runtime or integration-style validation showing a real first `host_gateway`/`tcp_failed` probe can become reachable after retry on Docker Desktop WSL without changing the gateway bind address. Also add a persistent loopback-only listener validation proving retries exhaust and the host-gateway diagnostic is surfaced rather than proceeding.
  • Done when: The risk is fixed or explicitly justified in the PR. Verification: Compare the retry block in `verifySandboxBridgeGatewayReachableOrExit()` with the linked issue body/comment text that names `OPENSHELL_BIND_ADDRESS=127.0.0.1` as the root cause. Then inspect whether any changed code proves a later real probe can become reachable without changing the bind address; the current tests use mocked `reachabilityImpl()` results only.
  • Evidence: New tests mock `reachabilityImpl()` to fail then succeed or always fail. They prove retry-loop control flow, but they do not prove the real Docker Desktop WSL failure mode is transient or that the bind-address source cannot regress.

Workflow run details

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

@wscurran wscurran added area: networking DNS, proxy, TLS, ports, host aliases, or connectivity area: onboarding Onboarding FSM, provider setup, sandbox launch, or first-run flow bug-fix PR fixes a bug or regression labels Jun 24, 2026
@wscurran

Copy link
Copy Markdown
Contributor

Signed-off-by: zyang-dev <267119621+zyang-dev@users.noreply.github.com>

@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

🤖 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/gateway-sandbox-reachability.test.ts`:
- Around line 646-670: The test in verifySandboxBridgeGatewayReachableOrExit is
restoring console spies with manual mockRestore calls at the end, so a failing
assertion can leave console.log and console.error mocked for later tests. Wrap
the spy setup and assertions in a try/finally so the restore logic always runs,
and keep using the local log/error spies created with vi.spyOn(console, ...).
🪄 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: 00d4907b-b430-43c5-a0a9-bd5ab857163a

📥 Commits

Reviewing files that changed from the base of the PR and between 0fd00ea and a3bdf21.

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

Comment thread src/lib/onboard/gateway-sandbox-reachability.test.ts Outdated
zyang-dev and others added 3 commits June 24, 2026 17:04
Signed-off-by: zyang-dev <267119621+zyang-dev@users.noreply.github.com>
Signed-off-by: zyang-dev <267119621+zyang-dev@users.noreply.github.com>
@zyang-dev

Copy link
Copy Markdown
Contributor Author

Response to PR Review Advisor:
PRA-2, PRA-1, and PRA-3 are based on the earlier bind-address interpretation of #5513. The issue root cause has since been clarified: this is a short Docker Desktop/WSL host-gateway readiness race during onboarding, not a permanent 127.0.0.1 bind-address failure.

Test follow-up justification:
PRA-T1: Not applicable after the root-cause clarification. This PR is not changing Docker Desktop WSL gateway bind-address selection.
PRA-T2: Covered by manual runtime validation on the affected Docker Desktop + WSL + GPU host.
PRA-T3: Covered by the runtime validation above and the unit test for first host_gateway/tcp_failed then success.
PRA-T4: Covered by the retry-exhaustion unit test, which preserves the host-gateway unreachable diagnostic after the bounded retry budget.
PRA-T5: Fixes #5513 remains intentional because the issue root cause has been clarified to the transient readiness race fixed here.
PRA-T6: The original bind-address wording is superseded by the runtime evidence that the same 127.0.0.1 listener becomes reachable on retry.
PRA-T7: Same as PRA-T6; the fixed behavior does not require binding 0.0.0.0.
PRA-T8: The retry build allowed onboarding to proceed past [2/8] on the affected system.

@zyang-dev
zyang-dev requested a review from cv June 25, 2026 23:35
@wscurran wscurran added NV QA Bugs found by the NVIDIA QA Team UAT Issues flagged for User Acceptance Testing. VDR Linked to VDR finding labels Jun 26, 2026
@cv cv removed the v0.0.69 label Jun 28, 2026
@cv
cv merged commit 528d316 into main Jun 28, 2026
40 checks passed
@cv
cv deleted the fix/gateway-bridge-probe-retry branch June 28, 2026 22:46
@miyoungc miyoungc mentioned this pull request Jun 30, 2026
21 tasks
jyaunches pushed a commit that referenced this pull request Jun 30, 2026
## Summary
Refreshes the v0.0.70 release docs from the release announcement and the
`v0.0.69..v0.0.70` commit range.
It also documents the `channels start` policy restoration behavior that
was missing from the shared OpenClaw and Hermes command references, and
bumps the Fern CLI version used for docs validation.

## Changes
- Replaced the stale `v0.0.70` release-notes entry with the actual
release themes, including CLI, onboarding, inference, messaging,
Windows, documentation, and release-validation changes.
- Documented that `channels start` reapplies the matching built-in
network policy preset before rebuild and rolls back to disabled if
policy restoration fails.
- Bumped `fern/fern.config.json` from `5.55.0` to `5.59.0` for the docs
refresh.
- Source summary:
- #5754 -> `docs/about/release-notes.mdx`: Notes Docker Desktop gateway
bridge retry behavior during onboarding.
- #5930 -> `docs/about/release-notes.mdx`: Links `nemoclaw use` default
sandbox selection to the command reference.
- #5948 -> `docs/about/release-notes.mdx`: Links reasoning-compatible
endpoint validation to inference documentation.
- #5950 -> `docs/about/release-notes.mdx`: Links Windows bootstrap WSL
recovery behavior to Windows preparation and troubleshooting docs.
- #5856 -> `docs/about/release-notes.mdx`: Notes rebuilt policy preset
registry repair.
- #5882 and #5949 -> `docs/about/release-notes.mdx`: Notes Hermes stale
base-image state repair.
- #6016 -> `docs/reference/commands.mdx`,
`docs/reference/commands-nemohermes.mdx`, and
`docs/manage-sandboxes/messaging-channels.mdx`: Documents channel policy
restoration and rollback on `channels start`.
- #5859 -> `docs/about/release-notes.mdx`: Links quickstart network
approval guidance.
- #5863 -> `docs/about/release-notes.mdx`: Links Teams allowlist
guidance in the messaging page.
- #5756, #5926, #6010, and #6011 -> `docs/about/release-notes.mdx`:
Summarizes the Vitest E2E validation cutover.

## Type of Change

- [ ] Code change (feature, bug fix, or refactor)
- [ ] Code change with doc updates
- [x] Doc only (prose changes, no code sample modifications)
- [ ] Doc only (includes code sample changes)

## Quality Gates
- [ ] Tests added or updated for changed behavior
- [ ] Existing tests cover changed behavior — justification:
- [x] Tests not applicable — justification: doc-only prose refresh with
no runtime behavior change.
- [x] Docs updated for user-facing behavior changes
- [ ] Docs not applicable — justification:
- [ ] Sensitive paths changed (security, policy, credentials, preflight,
onboarding, inference, runner, sandbox, or messaging)
- [ ] Sensitive-path review completed or maintainer-approved waiver
recorded — reviewer/approval link/justification:
- [ ] Non-success, skipped, or missing CI check accepted by maintainer —
check name, approval link, and follow-up issue:

## Verification
- [x] PR description includes the DCO sign-off declaration and every
commit appears as `Verified` in GitHub
- [x] Git hooks passed during commit and push, or `npx prek run
--from-ref main --to-ref HEAD` passes
- [ ] Targeted tests pass for changed behavior
- [ ] Full `npm test` passes (broad runtime changes only)
- [x] Quality Gates section completed with required justifications or
waivers
- [x] No secrets, API keys, or credentials committed
- [ ] `npm run docs` builds without warnings (doc changes only)
- [x] Doc pages follow the [style
guide](https://github.com/NVIDIA/NemoClaw/blob/main/docs/CONTRIBUTING.md)
(doc changes only)
- [ ] New doc pages include SPDX header and frontmatter (new pages only)

`npm run docs` exited 0 and Fern reported one existing light-mode accent
contrast warning.
`fern check --warnings` confirmed the warning is the site theme contrast
ratio, not content introduced by this PR.

---
Signed-off-by: Miyoung Choi <miyoungc@nvidia.com>
Hadar301 pushed a commit to Hadar301/NemoClaw-OpenShift that referenced this pull request Jul 12, 2026
<!-- markdownlint-disable MD041 -->
## Summary
<!-- 1-3 sentences: what this PR does and why. -->
Retries the Docker Desktop/VM-backed sandbox bridge gateway probe during
onboarding when the initial `host-gateway` TCP check fails. This handles
the short startup race where the OpenShell gateway is listening, but
Docker Desktop’s host-gateway path is not reachable yet.

Fixes an onboarding race on non-native Linux Docker setups where the
OpenShell gateway can be listening on `127.0.0.1:8080`, but Docker’s
`host-gateway` route is not reachable from sandbox containers yet.
NemoClaw now retries transient `host-gateway` TCP probe failures before
reporting the gateway as unreachable.

## Related Issue
<!-- Fixes #NNN or Closes #NNN. Remove this section if none. -->
Fixes NVIDIA#5513

## Changes
<!-- Bullet list of key changes. -->
- Add bounded retry/backoff for `host_gateway` sandbox bridge probes
that fail with `tcp_failed`.
- Limit retries to non-native Linux `host-gateway` probe failures.
- Add tests covering successful host-gateway retry and non-retry
behavior for bridge-gateway failures.

## Type of Change

- [x] Code change (feature, bug fix, or refactor)
- [ ] Code change with doc updates
- [ ] Doc only (prose changes, no code sample modifications)
- [ ] Doc only (includes code sample changes)

## Verification
<!-- Check each item you ran and confirmed. Leave unchecked items you
skipped. Doc-only changes do not require npm test unless you ran it. -->
- [x] PR description includes the DCO sign-off declaration and every
commit appears as `Verified` in GitHub
- [x] Git hooks passed during commit and push, or `npx prek run
--from-ref main --to-ref HEAD` passes
- [x] Targeted tests pass for changed behavior
- [ ] Full `npm test` passes (broad runtime changes only)
- [x] Tests added or updated for new or changed behavior
- [x] No secrets, API keys, or credentials committed
- [ ] Docs updated for user-facing behavior changes
- [ ] `npm run docs` builds without warnings (doc changes only)
- [ ] Doc pages follow the [style
guide](https://github.com/NVIDIA/NemoClaw/blob/main/docs/CONTRIBUTING.md)
(doc changes only)
- [ ] New doc pages include SPDX header and frontmatter (new pages only)

---
<!-- DCO sign-off is required in this PR description, and every commit
must appear as Verified in GitHub. Run: git config user.name && git
config user.email -->
Signed-off-by: zyang-dev <267119621+zyang-dev@users.noreply.github.com>


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

## Summary
- **Bug Fixes**
- Improved sandbox gateway reachability checks by retrying only
transient `host-gateway` `tcp_failed` failures before failing.
- Added configurable retry attempts and delay between probes, with
improved success/failure logging per attempt.
- **Tests**
- Added coverage for retry success, retry exhaustion behavior, and
ensuring `bridge-gateway` `tcp_failed` does not trigger retries.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->

---------

Signed-off-by: zyang-dev <267119621+zyang-dev@users.noreply.github.com>
Co-authored-by: Carlos Villela <cvillela@nvidia.com>
Hadar301 pushed a commit to Hadar301/NemoClaw-OpenShift that referenced this pull request Jul 12, 2026
## Summary
Refreshes the v0.0.70 release docs from the release announcement and the
`v0.0.69..v0.0.70` commit range.
It also documents the `channels start` policy restoration behavior that
was missing from the shared OpenClaw and Hermes command references, and
bumps the Fern CLI version used for docs validation.

## Changes
- Replaced the stale `v0.0.70` release-notes entry with the actual
release themes, including CLI, onboarding, inference, messaging,
Windows, documentation, and release-validation changes.
- Documented that `channels start` reapplies the matching built-in
network policy preset before rebuild and rolls back to disabled if
policy restoration fails.
- Bumped `fern/fern.config.json` from `5.55.0` to `5.59.0` for the docs
refresh.
- Source summary:
- NVIDIA#5754 -> `docs/about/release-notes.mdx`: Notes Docker Desktop gateway
bridge retry behavior during onboarding.
- NVIDIA#5930 -> `docs/about/release-notes.mdx`: Links `nemoclaw use` default
sandbox selection to the command reference.
- NVIDIA#5948 -> `docs/about/release-notes.mdx`: Links reasoning-compatible
endpoint validation to inference documentation.
- NVIDIA#5950 -> `docs/about/release-notes.mdx`: Links Windows bootstrap WSL
recovery behavior to Windows preparation and troubleshooting docs.
- NVIDIA#5856 -> `docs/about/release-notes.mdx`: Notes rebuilt policy preset
registry repair.
- NVIDIA#5882 and NVIDIA#5949 -> `docs/about/release-notes.mdx`: Notes Hermes stale
base-image state repair.
- NVIDIA#6016 -> `docs/reference/commands.mdx`,
`docs/reference/commands-nemohermes.mdx`, and
`docs/manage-sandboxes/messaging-channels.mdx`: Documents channel policy
restoration and rollback on `channels start`.
- NVIDIA#5859 -> `docs/about/release-notes.mdx`: Links quickstart network
approval guidance.
- NVIDIA#5863 -> `docs/about/release-notes.mdx`: Links Teams allowlist
guidance in the messaging page.
- NVIDIA#5756, NVIDIA#5926, NVIDIA#6010, and NVIDIA#6011 -> `docs/about/release-notes.mdx`:
Summarizes the Vitest E2E validation cutover.

## Type of Change

- [ ] Code change (feature, bug fix, or refactor)
- [ ] Code change with doc updates
- [x] Doc only (prose changes, no code sample modifications)
- [ ] Doc only (includes code sample changes)

## Quality Gates
- [ ] Tests added or updated for changed behavior
- [ ] Existing tests cover changed behavior — justification:
- [x] Tests not applicable — justification: doc-only prose refresh with
no runtime behavior change.
- [x] Docs updated for user-facing behavior changes
- [ ] Docs not applicable — justification:
- [ ] Sensitive paths changed (security, policy, credentials, preflight,
onboarding, inference, runner, sandbox, or messaging)
- [ ] Sensitive-path review completed or maintainer-approved waiver
recorded — reviewer/approval link/justification:
- [ ] Non-success, skipped, or missing CI check accepted by maintainer —
check name, approval link, and follow-up issue:

## Verification
- [x] PR description includes the DCO sign-off declaration and every
commit appears as `Verified` in GitHub
- [x] Git hooks passed during commit and push, or `npx prek run
--from-ref main --to-ref HEAD` passes
- [ ] Targeted tests pass for changed behavior
- [ ] Full `npm test` passes (broad runtime changes only)
- [x] Quality Gates section completed with required justifications or
waivers
- [x] No secrets, API keys, or credentials committed
- [ ] `npm run docs` builds without warnings (doc changes only)
- [x] Doc pages follow the [style
guide](https://github.com/NVIDIA/NemoClaw/blob/main/docs/CONTRIBUTING.md)
(doc changes only)
- [ ] New doc pages include SPDX header and frontmatter (new pages only)

`npm run docs` exited 0 and Fern reported one existing light-mode accent
contrast warning.
`fern check --warnings` confirmed the warning is the site theme contrast
ratio, not content introduced by this PR.

---
Signed-off-by: Miyoung Choi <miyoungc@nvidia.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area: networking DNS, proxy, TLS, ports, host aliases, or connectivity area: onboarding Onboarding FSM, provider setup, sandbox launch, or first-run flow bug-fix PR fixes a bug or regression NV QA Bugs found by the NVIDIA QA Team UAT Issues flagged for User Acceptance Testing. VDR Linked to VDR finding

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[WSL2][Policy&Network] OpenShell gateway unreachable from sandbox containers on Docker Desktop WSL (binds to 127.0.0.1:8080)

3 participants