Skip to content

fix(onboard): validate Windows Ollama from Docker - #8145

Merged
cv merged 1 commit into
mainfrom
codex/fix-8127-wsl-ollama-probe
Aug 3, 2026
Merged

fix(onboard): validate Windows Ollama from Docker#8145
cv merged 1 commit into
mainfrom
codex/fix-8127-wsl-ollama-probe

Conversation

@cjagwani

@cjagwani cjagwani commented Aug 3, 2026

Copy link
Copy Markdown
Collaborator

Summary

Windows-host Ollama validation on WSL ran from the WSL host, where Docker Desktop does not define host.docker.internal. This change runs the credential-free validation request from Docker Desktop's network context and restricts that path to the configured Windows-host Ollama endpoint.

Related Issue

Fixes #8127

Changes

  • Add a Docker-context curl adapter that preserves validated curl arguments, rejects credential config files, and binds only the probe response directory under the operating-system temporary directory.
  • Use the adapter only for the configured http://host.docker.internal:<ollama-port>/v1 route with no API key, extra headers, query, fragment, or embedded URL credentials.
  • Keep the direct host probe for every other inference endpoint.
  • Add source tests for strict and compatibility validation paths, credential and route rejection, temp-directory mount boundaries, and Windows-host Ollama option selection.

The adapter is required because Docker Desktop defines host.docker.internal in the container network context, not in the WSL host resolver. src/lib/inference/onboard-host-docker-internal.test.ts protects the current Windows-host Ollama consumer and verifies that both validation modes execute through Docker.

Type of Change

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

Quality Gates

  • Tests added or updated for changed behavior
  • Existing tests cover changed behavior — justification:
  • Tests not applicable — justification:
  • Docs updated for user-facing behavior changes
  • Docs not applicable — justification: docs/inference/set-up-ollama.mdx already documents Windows-host Ollama from WSL, Docker Desktop integration, host.docker.internal:11434, validation, and the unauthenticated-port warning. This change restores that documented path.
  • 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: Codex Desktop reviewed command injection, authentication, credential handling, cryptography, network exposure, input parsing, dependencies, filesystem access, and logic. The path uses argv-based process execution, accepts only the configured credential-free Windows-host Ollama route, rejects curl credential configs, and limits the bind mount to the probe response directory under the operating-system temporary directory.
  • Non-success, skipped, or missing CI check accepted by maintainer — check name, approval link, and follow-up issue:

Documentation Writer Review

  • Documentation writer subagent reviewed the completed changes
  • Result: no-docs-needed
  • Evidence: Existing docs/inference/set-up-ollama.mdx and docs/reference/troubleshooting.mdx already cover the restored Windows-host Ollama behavior, validation, security warning, detection, and restart remediation. No documentation paths changed.
  • Agent: Codex Desktop

DGX Station Hardware Evidence

  • Tested on DGX Station
  • Tested commit:
  • Station profile/scenario:
  • Result:
  • Supporting evidence:

Verification

  • PR description includes a Signed-off-by: line and every commit appears as Verified in GitHub
  • Normal pre-commit, commit-msg, and pre-push hooks passed, or npm run validate:pr passed after refreshing origin/main when hooks were skipped or unavailable
  • Targeted behavior tests pass for the current change set, or tests are marked not applicable above — command/result or justification: npm exec vitest run -- --project cli src/lib/adapters/http/container-curl-probe.test.ts src/lib/inference/onboard-host-docker-internal.test.ts src/lib/inference/local.test.ts src/lib/onboard/inference-selection-validation.test.ts passed 112 tests in 4 files. npm run typecheck:cli passed.
  • Applicable broad gate passed — npm test for broad runtime/test-harness changes; npm run check for repo-wide validation/coverage changes — command/result: Not run; this change is limited to the Windows-host Ollama validation path and has focused source-test coverage.
  • Quality Gates section completed with required justifications or waivers
  • No secrets, API keys, or credentials committed
  • npm run docs builds without warnings (doc changes only)
  • Doc pages follow the style guide (doc changes only)
  • New doc pages include SPDX header and frontmatter (new pages only)

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

Summary by CodeRabbit

  • New Features

    • Added container-based connectivity checks for supported local AI endpoints.
    • Added validation for Docker-hosted Ollama endpoints, including port, route, credential, and output-path checks.
    • Added support for injecting and reusing custom probe processes during endpoint validation.
  • Bug Fixes

    • Improved Docker-context detection and fallback behavior when container probing is unavailable.
    • Prevented invalid or unsafe curl requests from being executed.

Signed-off-by: Charan Jagwani <cjagwani@nvidia.com>
@cjagwani cjagwani added area: inference Inference routing, serving, model selection, or outputs area: onboarding Onboarding FSM, provider setup, sandbox launch, or first-run flow bug-fix PR fixes a bug or regression platform: wsl Affects Windows Subsystem for Linux v0.0.101 labels Aug 3, 2026
@cjagwani cjagwani self-assigned this Aug 3, 2026
@coderabbitai

coderabbitai Bot commented Aug 3, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

📝 Walkthrough

Walkthrough

The PR adds a Docker-based curl probe, validates restricted Windows-host Ollama URLs, and propagates injectable process spawners through inference probing and retry paths.

Changes

Docker-context Ollama probing

Layer / File(s) Summary
Container curl probe
src/lib/adapters/http/container-curl-probe.ts, src/lib/adapters/http/container-curl-probe.test.ts, src/lib/inference/onboard-host-docker-internal.ts
Adds Docker curl execution with temporary-directory output restrictions, credential-file rejection, UID/GID matching, and validation tests.
Docker-context selection validation
src/lib/inference/local.ts, src/lib/inference/local.test.ts, src/lib/onboard/inference-selection-validation.ts, src/lib/inference/onboard-host-docker-internal.test.ts
Adds probeFromDocker options and enables them for host.docker.internal with the expected Ollama port. Tests cover host resolution, Docker invocation, credentials, headers, and URL variants.
Probe spawner propagation and routing
src/lib/inference/onboard-probes.ts
Propagates spawnSyncImpl through standard, tool-calling, timeout, retry, and fallback probes. Docker requests use the container probe and bypass optimized validation-session probing.

Estimated code review effort: 4 (Complex) | ~45 minutes

Sequence Diagram(s)

sequenceDiagram
  participant Onboarding
  participant OpenAILikeValidation
  participant ContainerCurlProbe
  participant Docker
  participant Ollama
  Onboarding->>OpenAILikeValidation: validate OpenAI-like selection
  OpenAILikeValidation->>ContainerCurlProbe: request Docker-context probe
  ContainerCurlProbe->>Docker: run curl container
  Docker->>Ollama: request host.docker.internal:11434
  Ollama-->>Docker: return endpoint response
  Docker-->>ContainerCurlProbe: return curl result
  ContainerCurlProbe-->>OpenAILikeValidation: return probe result
Loading

Possibly related PRs

Suggested labels: platform: container, area: security

Suggested reviewers: ericksoa, cv

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 25.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 identifies the onboarding fix for validating Windows-hosted Ollama from Docker.
Linked Issues check ✅ Passed The changes address issue #8127 by validating credential-free Windows-hosted Ollama endpoints through Docker context.
Out of Scope Changes check ✅ Passed The changes remain focused on Docker-based Ollama reachability validation, argument safety, and related tests.
✨ Finishing Touches 💡 1
📝 Generate docstrings 💡
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch codex/fix-8127-wsl-ollama-probe

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

@github-code-quality

github-code-quality Bot commented Aug 3, 2026

Copy link
Copy Markdown
Contributor

Code Coverage Overview

Languages: TypeScript

TypeScript / code-coverage/plugin

The overall coverage in commit add8bf0 in the codex/fix-8127-wsl-o... branch remains at 96%, unchanged from commit 8c542b2 in the main branch.

TypeScript / code-coverage/cli

The overall coverage in commit add8bf0 in the codex/fix-8127-wsl-o... branch remains at 81%, unchanged from commit 8c542b2 in the main branch.

Show a code coverage summary of the most impacted files.
File main 8c542b2 codex/fix-8127-wsl-o... add8bf0 +/-
src/lib/inferen...board-probes.ts 93% 91% -2%
src/lib/inferen...ompatibility.ts 95% 94% -1%
src/lib/inferen...ker-internal.ts 100% 100% 0%
src/lib/sandbox...rce-identity.ts 88% 88% 0%
src/lib/state/g...way-registry.ts 94% 94% 0%
src/lib/tunnel/services.ts 76% 76% 0%
src/lib/inference/local.ts 79% 80% +1%
src/lib/onboard...shboard-port.ts 90% 96% +6%
src/lib/adapter...r-curl-probe.ts 0% 85% +85%

Updated August 03, 2026 17:11 UTC

@github-actions

github-actions Bot commented Aug 3, 2026

Copy link
Copy Markdown
Contributor

PR Review Advisor — Informational

Advisor assessment: Informational / low confidence
Next action: Review the warnings below.
Findings: 0 blockers · 1 warning · 0 suggestions
Status: Partial review preserved 1 canonical finding(s) and 3 terminology decision(s) before the advisor stopped.

Model lanes

  • GPT-5.6 Terra (primary): Failed after a partial review · low confidence · 0 blockers · 1 warning · 0 suggestions
  • Nemotron 3 Ultra (second opinion): Failed after a partial review · low confidence · 0 blockers · 3 warnings · 2 suggestions

Second-opinion terminology and E2E selections are advisory. They do not change the primary assessment or E2E / PR Gate.

3 semantic terminology decisions

Terminology decisions are advisory. They affect the assessment only when a separate finding identifies concrete semantic impact.

  • justified — Docker-context validation at src/lib/inference/onboard-probes.ts:709: Keep this term for the restricted Docker Desktop probe path and contrast it with host-side validation when both paths are discussed.
  • established — Windows-host Ollama at src/lib/inference/onboard-host-docker-internal.test.ts:50: Keep the established term for this WSL and Docker Desktop route.
  • established — credential-free at src/lib/adapters/http/container-curl-probe.ts:33: Keep the controlled term for the Docker probe restriction.

E2E guidance

Advisory only. E2E / PR Gate selects and runs jobs independently.

Recommended E2E: inference-routing, network-policy, onboard-repair, onboard-resume, cloud-onboard

1 warning · 0 suggestions

Warnings

Warnings do not block.

PRA-1 Warning — Pin the Docker probe image by digest

  • Location: src/lib/adapters/http/container-curl-probe.ts:12
  • Category: security
  • Problem: The Docker-context probe executes curlimages/curl:8.10.1 by mutable tag.
  • Impact: If the tag is retargeted, onboarding can execute an image that was not reviewed with this change.
  • Recommendation: Replace the mutable tag with the verified curlimages/curl digest and keep the image reference in the probe tests.
  • Verification: Inspect CONTAINER_REACHABILITY_IMAGE and the docker run argv in container-curl-probe.ts to confirm that the reference includes an immutable sha256 digest.
  • Test coverage: Assert that the Docker probe argv contains the approved digest-pinned image reference.
  • Evidence: src/lib/adapters/http/container-curl-probe.ts:12 defines CONTAINER_REACHABILITY_IMAGE as curlimages/curl:8.10.1. The wrapper passes CONTAINER_REACHABILITY_IMAGE directly to docker run at src/lib/adapters/http/container-curl-probe.ts:58-64.

Workflow run details

This automated review informs maintainers. Warnings and suggestions do not require a response. A maintainer decides whether to merge.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🧹 Nitpick comments (1)
src/lib/inference/onboard-probes.ts (1)

811-850: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Thread spawnSyncImpl through the responsesProbe branches too.

Every other curl-executing site in this function (calibration, tool-calling probe, standard chat-completions probe, both doubled-timeout retry branches) now passes spawnSyncImpl: options.spawnSyncImpl. The two responsesProbe branches at Line 817-823 and Line 828-849 do not.

Today this gap is inert: options.probeFromDocker requires options.skipResponsesProbe === true (Line 700-706), and responsesProbe is only included in the probes array when !options.skipResponsesProbe (Line 881-883). So responsesProbe.execute cannot run while Docker-context probing is active.

If a future change relaxes that coupling, responsesProbe would silently fall back to the default host spawnSync instead of the container-mediated one, reintroducing the exact WSL/host.docker.internal unreachability regression this PR fixes, without any test catching it. Thread spawnSyncImpl through both branches now so the invariant is enforced structurally rather than by an implicit skip-flag coupling.

♻️ Proposed fix to thread spawnSyncImpl through the Responses probe branches
     const responsesProbe =
       options.requireResponsesToolCalling === true
         ? {
             name: "Responses API with tool calling",
             api: "openai-responses",
             execute: () =>
               probeResponsesToolCalling(endpointUrl, model, apiKey, {
                 authMode: options.authMode,
                 extraHeaders: options.extraHeaders,
                 pinnedAddresses,
                 trustedPrivateCapability: options.trustedPrivateCapability,
                 validationTiming,
+                spawnSyncImpl: options.spawnSyncImpl,
               }),
           }
         : {
             name: "Responses API",
             api: "openai-responses",
             execute: () =>
               runCurlProbe(
                 [...],
                 {
                   trustedConfigFiles: authConfig.trustedConfigFiles,
                   pinnedAddresses,
                   trustedPrivateCapability: options.trustedPrivateCapability,
+                  spawnSyncImpl: options.spawnSyncImpl,
                 },
               ),
           };
🤖 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/inference/onboard-probes.ts` around lines 811 - 850, Update both
`responsesProbe` branches to pass `spawnSyncImpl: options.spawnSyncImpl` into
their curl-execution paths: the `probeResponsesToolCalling` options in the
required-tool-calling branch and the `runCurlProbe` options in the standard
Responses API branch. Preserve all existing probe arguments and behavior while
ensuring both branches use the configured process-spawn implementation.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Nitpick comments:
In `@src/lib/inference/onboard-probes.ts`:
- Around line 811-850: Update both `responsesProbe` branches to pass
`spawnSyncImpl: options.spawnSyncImpl` into their curl-execution paths: the
`probeResponsesToolCalling` options in the required-tool-calling branch and the
`runCurlProbe` options in the standard Responses API branch. Preserve all
existing probe arguments and behavior while ensuring both branches use the
configured process-spawn implementation.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: 68d39bbb-0c46-4cc3-81fd-d4177ae05282

📥 Commits

Reviewing files that changed from the base of the PR and between 8c542b2 and add8bf0.

📒 Files selected for processing (8)
  • src/lib/adapters/http/container-curl-probe.test.ts
  • src/lib/adapters/http/container-curl-probe.ts
  • src/lib/inference/local.test.ts
  • src/lib/inference/local.ts
  • src/lib/inference/onboard-host-docker-internal.test.ts
  • src/lib/inference/onboard-host-docker-internal.ts
  • src/lib/inference/onboard-probes.ts
  • src/lib/onboard/inference-selection-validation.ts

@github-actions github-actions Bot added v0.0.102 and removed v0.0.101 labels Aug 3, 2026

@apurvvkumaria apurvvkumaria left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Approve — reviewed exact head add8bf0. The Docker-context probe is restricted to the canonical credential-free Windows-host Ollama route, uses argv-based execution, rejects curl credential configuration, and mounts only the temporary response directory. Focused coverage exercises strict and compatibility paths plus credential, route, and mount rejection, and the exact-head CI and selected E2E gate pass. I found no blocking correctness, security, compatibility, or regression defect. The existing automated mutable-image warning remains non-blocking and is not duplicated here.

@cv
cv merged commit e9fb170 into main Aug 3, 2026
71 of 78 checks passed
@cv
cv deleted the codex/fix-8127-wsl-ollama-probe branch August 3, 2026 23:16
cv added a commit that referenced this pull request Aug 4, 2026
…8118)

<!-- markdownlint-disable MD041 -->
## Summary

`resolveGatewayEffectAuthority` refuses gateway effects when a sandbox's
recorded gateway owner no longer matches the live one. Three callers let
that refusal escape as an uncaught exception, so the CLI crashed with a
raw Node stack trace instead of naming the migration. This PR raises the
refusal as a typed error and reports it at those boundaries.

Related report: issue 8103. This PR implements only the accepted
reporting subset and does not close the remaining managed MCP recovery
scope.

## Reproduction

Executed on our DGX Spark aarch64 test host (GB10 GPU), Ubuntu 24.04,
against `main` at `4cd4d64fe`.

```bash
nemoclaw onboard --name repro-8103 --non-interactive --yes   # records the live authority
# reconstruct the pre-migration recording: source packaged-service, live standalone
nemoclaw repro-8103 rebuild --yes
nemoclaw repro-8103 destroy --yes --cleanup-gateway
```

**How the drift was produced.** The reporter's sandbox was onboarded
while the packaged `openshell-gateway.service` was authoritative, then
the managed gateway migrated to standalone. On our test host the
packaged gateway service cannot start at all for an unrelated reason
(its `EnvironmentFile` supplies a quoted `DOCKER_HOST`, so the value
reaches the process with the quotes and the socket URL is invalid), so
onboarding against it is not possible here. The recorded authority was
therefore set to `packaged-service` directly in the onboarding
checkpoint after a normal onboard, which reproduces the recorded-vs-live
drift this issue is about while leaving the sandbox, gateway, and
registry real.

**Observed on `main` (before fix)**

`rebuild --yes`:

```text
Error: Gateway lifecycle authority changed since onboarding (nemoclaw@8080:nemoclaw-managed:packaged-service -> nemoclaw@8080:nemoclaw-managed:standalone). Changing authority requires a fresh onboarding run; gateway teardown will not perform gateway effects.
    at resolveGatewayEffectAuthority (.../dist/lib/onboard/gateway-teardown-authority.js:80:15)
    at resolveGatewayTeardownAuthority (.../dist/lib/onboard/gateway-teardown-authority.js:87:12)
    at openRebuildRecreateJournal (.../dist/lib/actions/sandbox/rebuild-recreate-journal.js:73:88)
    ...
Node.js v22.22.2
```

`destroy --yes --cleanup-gateway` crashed the same way from
`cleanupGatewayAfterLastSandbox`. Both exited `1`.

**Observed on `fix/...` (after fix)** — same host, same commit, same
drifted state

`rebuild --yes` (exit `1`, zero stack-trace lines):

```text
  ✓ State backed up (12 directories, 1 files)
    Refusing sandbox rebuild because the gateway lifecycle authority could not be revalidated.
  Gateway lifecycle authority changed since onboarding (nemoclaw@8080:nemoclaw-managed:packaged-service -> nemoclaw@8080:nemoclaw-managed:standalone). Changing authority requires a fresh onboarding run; gateway teardown will not perform gateway effects.
  Re-run onboarding to bind the current gateway authority before retrying.
```

`destroy --yes --cleanup-gateway` (exit `0`, zero stack-trace lines,
registry empty afterwards):

```text
  Refusing shared gateway cleanup because the gateway lifecycle authority could not be revalidated.
  Gateway lifecycle authority changed since onboarding (...packaged-service -> ...standalone). ...
  Re-run onboarding to bind the current gateway authority before retrying.
  The shared NemoClaw gateway was left running.
  ✓ Sandbox 'repro-8103' destroyed
```

The verification script asserts the built `dist/` actually contains the
change before running, because an earlier attempt silently tested an
unpatched build.

## Analysis

`resolveGatewayEffectAuthority`
(`src/lib/onboard/gateway-teardown-authority.ts`) threw plain `Error`s.
`credentials/command-support.ts` was the only caller that caught them,
so `credentials add`/`reset` already reported the refusal cleanly. The
remaining callers did not:

- `rebuild-recreate-journal.ts` — reached from `rebuild --yes`
- `onboard-recreate-journal.ts` — reached from `onboard
--recreate-sandbox`
- `destroy-gateway.ts` — reached from the final-sandbox gateway cleanup

There is no process-level error boundary in the CLI entry, so each of
those escaped as an uncaught exception and printed a Node stack trace.

## Fix

- `GatewayAuthorityError` is a distinct type, so boundaries recognise
the refusal without matching message text. All four refusal sites in the
resolver raise it; an invalid management declaration deliberately keeps
its own type because it is a different failure class.
- `gatewayAuthorityFailureLines` is the single source of the wording
`credentialsGatewayAuthorityFailureLines` already used. The remedy line
is binary-agnostic so this module takes no branding dependency, which
the source-architecture budget counts against every consumer.
- The catches live in the two modules that already import the resolver,
so no new import edges are added. `rebuild-recreate-journal` hands the
lines back through a new `onAuthorityRefusal` callback and the pipeline
routes it to its existing `bail`.
- Shared gateway cleanup reports and returns instead of throwing. The
sandbox and its registry entry are already gone at that point, so
refusing the optional last step must not undo the removal.

**The #6576 contract is preserved.** The catch sits at the resolver
call, before any gateway effect, so nothing touches the gateway before
authority is proven — the existing test asserting no side effects still
passes unchanged, and a new case pins the same guarantee for the typed
refusal. Any failure that is not an authority refusal still aborts
outright.

## Scope

This does not close issue 8103. The report also describes `destroy
--yes` failing in MCP-bridge teardown with managed MCP servers present;
that path raises `McpBridgeError`, a different root cause this PR does
not touch. Our repro had no managed MCP servers and `destroy --yes`
without `--cleanup-gateway` already succeeded on `main`, so that half is
unverified here and left for a separate change.

## Interaction with #8098

#8098 makes NemoClaw decline a packaged gateway service whose binary is
outside the blueprint version window, moving the resolved owner from
`packaged-service` to `standalone`. That is exactly the drift this PR
reports on, so landing this first (or together) keeps existing sandboxes
on a working path.

## Changes

- `src/lib/onboard/gateway-teardown-authority.ts`: add
`GatewayAuthorityError` and `gatewayAuthorityFailureLines`; raise the
typed error from every refusal site.
- `src/lib/actions/sandbox/destroy-gateway.ts`: report an authority
refusal and skip cleanup instead of throwing.
- `src/lib/actions/sandbox/rebuild-recreate-journal.ts`: surface the
refusal through an `onAuthorityRefusal` callback.
- `src/lib/actions/sandbox/rebuild-pipeline.ts`: route that callback to
the existing `bail`.
- tests: regression coverage for the typed refusal, the shared wording,
and the preserved no-side-effect guarantee.

## Type of Change

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

## Quality Gates

- [x] Tests added or updated for changed behavior
- [ ] Existing tests cover changed behavior — justification:
- [ ] Tests not applicable — justification:
- [ ] Docs updated for user-facing behavior changes
- [x] Docs not applicable — justification: Existing gateway lifecycle
authority and sandbox destroy documentation already describes the
unchanged fail-closed authority and optional cleanup boundaries; this PR
replaces raw stack traces with existing-pattern operator guidance.
- [x] Sensitive paths changed (security, policy, credentials, preflight,
onboarding, inference, runner, sandbox, or messaging)
- [x] Sensitive-path review completed or maintainer-approved waiver
recorded — reviewer/approval link/justification: Exact-head
nine-category security review at
`27a3a1f13c7be9b6a7ab87a73585b99ec6de11e4` against base
`e9fb170a2e3e4c4dcfa19e398232f71b8f2bace6`: PASS with no findings. Typed
refusals remain fail closed, unrelated and malformed-declaration errors
still propagate, diagnostics contain no credential material, and no
gateway effect runs before authority is proven. Base commit #8145
changes separate Docker-context inference validation and does not
interact with these typed errors.
- [ ] Non-success, skipped, or missing CI check accepted by maintainer —
check name, approval link, and follow-up issue:

## Documentation Writer Review

- [x] Documentation writer subagent reviewed the completed changes
- Result: `no-docs-needed`
- Evidence: Reviewed the complete eight-file diff at `27a3a1f13` against
base `e9fb170a2e3e4c4dcfa19e398232f71b8f2bace6`, stable patch ID
`2a1a9ce90bda5c03abf2788d381656fb42c301da`, and the NemoClaw writing
guide, controlled word list, documentation contributor guide, and shared
documentation-writing review contract. The change replaces raw Node.js
stack traces with existing-pattern operator guidance when gateway
lifecycle authority cannot be revalidated during rebuild, `onboard
--recreate-sandbox`, or final shared-gateway cleanup. It adds no
command, flag, default, configuration, schema, workflow, or supported
product surface. Existing documentation already states that authority
drift requires fresh onboarding and prevents gateway effects, while
command documentation describes final shared-gateway cleanup after
sandbox and registry deletion. Base commit #8145 adds credential-free
Windows Ollama validation from Docker's network context in separate
adapter and inference-selection files. It does not throw or consume
`GatewayAuthorityError` and does not interact with the changed
command-boundary handling. Exact-head validation passed: CLI and plugin
builds; 6 focused files and 104 tests; `npm run validate:pr`; and `git
diff --check`. No blocking findings.
- Agent: Codex Desktop documentation writer subagent
<!-- docs-review-head-sha: 27a3a1f -->
<!-- docs-review-agents-blob-sha: 3dd7c24 -->

## Verification

- [x] Exact-head maintainer validation at `27a3a1f13`: 6 focused files /
104 tests passed; CLI and plugin builds passed; `npm run validate:pr`
passed; `git diff --check` passed.
- [x] PR description includes a `Signed-off-by:` line and every current
commit appears as `Verified` in GitHub.

- [x] `npx prek run` passes on the changed files
- [x] `npm test` passes (640 files / 7228 tests under `src/lib/onboard`,
`src/lib/actions`, `src/lib/credentials`)
- [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
- [ ] `make 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)

Platform scope: reproduced and verified on aarch64 (DGX Spark), matching
the reporter's environment. The changed code is platform-independent;
x86_64 was not exercised.

## AI Disclosure
- [x] AI-assisted — tool: Claude Code

Signed-off-by: Yanyun Liao <yanyunl@nvidia.com>


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

* **Bug Fixes**
* Improved gateway teardown handling when ownership or authority cannot
be confirmed.
* Shared gateways remain running when authority checks fail, preventing
unintended cleanup.
* Sandbox rebuilds now report authority refusals clearly and stop
safely.
  * CLI errors provide actionable details without exposing stack traces.
  * Unrelated errors continue to surface normally.
* Gateway authority failure messages are standardized for invalid or
changed authorization details.
* **Tests**
* Added coverage for authority changes, credential updates, invalid
targets, declined checkpoints, malformed errors, and safe cleanup
behavior.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->

---------

Signed-off-by: yanyunl1991 <yanyunl@nvidia.com>
Signed-off-by: Prekshi Vyas <prekshiv@nvidia.com>
Co-authored-by: Prekshi Vyas <34834085+prekshivyas@users.noreply.github.com>
Co-authored-by: Prekshi Vyas <prekshiv@nvidia.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: Carlos Villela <cvillela@nvidia.com>
apurvvkumaria added a commit that referenced this pull request Aug 4, 2026
<!-- markdownlint-disable MD041 -->
## Summary

Prepares the canonical v0.0.102 release documentation from the current
release-labeled scope.
The change adds a dated changelog for all 38 user-facing shipping PRs
and corrects the OpenClaw agent command reference for the behavior
delivered by #8191.

## Changes

- Add `docs/changelog/2026-08-04.mdx` with the v0.0.102 release summary,
detailed behavior changes, support boundaries, security evidence links,
and links to durable documentation.
- Update `docs/reference/commands.mdx` to describe non-JSON OpenClaw
output capture, its combined limit, marker handling, stream suppression,
recovery guidance, and exit behavior.
- [#8167](#8167) ->
`docs/changelog/2026-08-04.mdx`: Records authenticated attachment of
operator-managed llama.cpp servers.
- [#8129](#8129) ->
`docs/changelog/2026-08-04.mdx`: Records the Experimental managed vLLM
profile for two DGX Spark systems.
- [#7983](#7983) ->
`docs/changelog/2026-08-04.mdx`: Records qualification of the May 2026
GB300WS factory image.
- [#8207](#8207) ->
`docs/changelog/2026-08-04.mdx`: Records the qualified DGX Station
driver transaction.
- [#8208](#8208) ->
`docs/changelog/2026-08-04.mdx`: Records mode-bound Express resume
state.
- [#8158](#8158) ->
`docs/changelog/2026-08-04.mdx`: Records recovery of host-global
dual-Station runtime ownership.
- [#8145](#8145) ->
`docs/changelog/2026-08-04.mdx`: Records Windows-host Ollama validation
from Docker Desktop's network context.
- [#8190](#8190) ->
`docs/changelog/2026-08-04.mdx`: Records HTTP model pulls when WSL has
no local Ollama executable.
- [#8195](#8195) ->
`docs/changelog/2026-08-04.mdx`: Records reuse of a healthy
installer-managed CLI.
- [#8053](#8053) ->
`docs/changelog/2026-08-04.mdx`: Records early rejection of incompatible
OpenShell gateway versions.
- [#8098](#8098) ->
`docs/changelog/2026-08-04.mdx`: Records the bounded
package-service-to-standalone gateway recovery transition.
- [#8216](#8216) ->
`docs/changelog/2026-08-04.mdx`: Records the final dashboard port
selected during multi-sandbox onboarding.
- [#8146](#8146) ->
`docs/changelog/2026-08-04.mdx`: Records managed startup-state
restoration for stopped sandboxes.
- [#8092](#8092) ->
`docs/changelog/2026-08-04.mdx`: Records gateway watchdog recovery for
classified not-serving states.
- [#8182](#8182) ->
`docs/changelog/2026-08-04.mdx`: Records consistent managed-recovery
wait configuration.
- [#8040](#8040) ->
`docs/changelog/2026-08-04.mdx`: Records Docker sandbox rollback
authority through late validation.
- [#8130](#8130) ->
`docs/changelog/2026-08-04.mdx`: Records bounded Shields deadline
recovery and durable containment.
- [#8086](#8086) ->
`docs/changelog/2026-08-04.mdx`: Records repair of narrowly validated
permission-only configuration drift.
- [#8122](#8122) ->
`docs/changelog/2026-08-04.mdx`: Records prompt failure and guidance for
corrupt transition locks.
- [#8124](#8124) ->
`docs/changelog/2026-08-04.mdx`: Records policy restoration flags,
previews, and target revalidation.
- [#7886](#7886) ->
`docs/changelog/2026-08-04.mdx`: Records explicit destruction after
pre-delete Shields hardening failures while preserving recovery
authority.
- [#7901](#7901) ->
`docs/changelog/2026-08-04.mdx`: Records multi-port uninstall behavior
and shared-resource preservation.
- [#7984](#7984) ->
`docs/changelog/2026-08-04.mdx`: Records one classified transient remote
MCP startup retry.
- [#7954](#7954) ->
`docs/changelog/2026-08-04.mdx`: Records bounded hosted-inference probe
replies.
- [#7574](#7574) ->
`docs/changelog/2026-08-04.mdx`: Records preservation of validated
reasoning capabilities through onboarding.
- [#8089](#8089) ->
`docs/changelog/2026-08-04.mdx`: Records proxy routing for Hermes
WhatsApp pairing and media traffic.
- [#7682](#7682) ->
`docs/changelog/2026-08-04.mdx`: Records native Hermes session deletion
and identifier validation.
- [#8150](#8150) ->
`docs/changelog/2026-08-04.mdx`: Records corporate CA trust for
LangChain Deep Agents Code image builds.
- [#8156](#8156) ->
`docs/changelog/2026-08-04.mdx`: Records reviewed managed runtime
dependency remediation.
- [#8180](#8180) ->
`docs/changelog/2026-08-04.mdx`: Records reviewed MCP discovery runtime
dependency updates.
- [#8196](#8196) ->
`docs/changelog/2026-08-04.mdx`: Records private npm dependency
remediation across managed images.
- [#8203](#8203) ->
`docs/changelog/2026-08-04.mdx`: Records reviewed Hermes and LangChain
Deep Agents Code Python dependency updates.
- [#8125](#8125) ->
`docs/changelog/2026-08-04.mdx`: Records bounded diagnostics for invalid
enumerated CLI values.
- [#8193](#8193) ->
`docs/changelog/2026-08-04.mdx`: Records bounded diagnostics for
unresolved sandbox base images.
- [#8118](#8118) ->
`docs/changelog/2026-08-04.mdx`: Records bounded diagnostics for changed
gateway authority.
- [#8191](#8191) ->
`docs/changelog/2026-08-04.mdx`, `docs/reference/commands.mdx`: Records
output capture, marker handling, recovery guidance, and exit behavior
for non-JSON OpenClaw agent commands.
- [#8187](#8187) ->
`docs/changelog/2026-08-04.mdx`: Records the aligned
interactive-installation start across supported agents.
- [#8153](#8153) ->
`docs/changelog/2026-08-04.mdx`: Records current product capabilities
and support boundaries.

## 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: This documentation-only
release preparation does not change executable behavior. Existing
changelog and published-route tests pass.
- [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:

## Documentation Writer Review

- [x] Documentation writer subagent reviewed the completed changes
- Result: `docs-updated`
- Evidence: Independently reviewed `docs/changelog/2026-08-04.mdx` and
`docs/reference/commands.mdx` at commit `b89913780`. All 38 user-facing
v0.0.102 PRs are represented, #8191 behavior matches the implementation,
and the writing rules, documentation style, controlled terminology,
route structure, and skip policy pass review. Targeted tests pass 36/36
and the documentation build completes with 0 errors.
- Agent: Codex Desktop independent documentation writer
<!-- docs-review-head-sha: b899137 -->
<!-- docs-review-agents-blob-sha: 3dd7c24 -->

## DGX Station Hardware Evidence

- [ ] Tested on DGX Station
- Tested commit: Not applicable
- Station profile/scenario: Not applicable
- Result: Not applicable
- Supporting evidence: Not applicable

## Verification

- [x] PR description includes a `Signed-off-by:` line and every commit
appears as `Verified` in GitHub
- [x] Normal `pre-commit`, `commit-msg`, and `pre-push` hooks passed, or
`npm run validate:pr` passed after refreshing `origin/main` when hooks
were skipped or unavailable
- [x] Targeted behavior tests pass for the current change set, or tests
are marked not applicable above — `npx vitest run --project integration
test/changelog-docs.test.ts test/check-docs-published-routes.test.ts`
passed 36/36.
- [x] Applicable broad gate passed — not applicable to
documentation-only changes; `npm run docs` completed successfully with 0
errors.
- [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) —
completed with 0 errors and 2 existing Fern warnings.
- [x] Doc pages follow the [style
guide](https://github.com/NVIDIA/NemoClaw/blob/main/docs/CONTRIBUTING.md)
(doc changes only)
- [x] New doc pages include SPDX header and frontmatter (new pages only)
— the native dated changelog uses the required parser-safe MDX SPDX
comment and intentionally has no frontmatter.

---
Signed-off-by: Apurv Kumaria <akumaria@nvidia.com>


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

## Summary by CodeRabbit

- **Documentation**
- Added release notes for v0.0.102, covering authentication, hardware
setup, WSL, installer recovery, sandbox resilience, policy management,
inference reliability, CLI improvements, and unified quickstarts.
- Updated command documentation to explain how non-JSON agent output is
collected, replayed, and reported.

- **Bug Fixes**
- Improved command-output recovery guidance when output exceeds limits
or contains unsupported fallback markers.
- Preserved accurate command exit-status reporting after output
processing.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->

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

Labels

area: inference Inference routing, serving, model selection, or outputs area: onboarding Onboarding FSM, provider setup, sandbox launch, or first-run flow bug-fix PR fixes a bug or regression platform: wsl Affects Windows Subsystem for Linux

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[WSL2][Onboard] Windows-hosted Ollama endpoint validation fails although the service is reachable

3 participants