Skip to content

fix(cli): warn on cross-sandbox messaging credential conflicts in channels add#4652

Merged
cv merged 9 commits into
NVIDIA:mainfrom
TonyLuo-NV:fix/4305-channels-add-cross-sandbox-conflict
Jun 4, 2026
Merged

fix(cli): warn on cross-sandbox messaging credential conflicts in channels add#4652
cv merged 9 commits into
NVIDIA:mainfrom
TonyLuo-NV:fix/4305-channels-add-cross-sandbox-conflict

Conversation

@TonyLuo-NV
Copy link
Copy Markdown
Contributor

@TonyLuo-NV TonyLuo-NV commented Jun 2, 2026

Summary

nemoclaw <name> channels add <channel> accepted the same messaging bot credential (e.g. a Telegram bot token) on a second sandbox with no warning, silently overlapping two sandboxes on a single-consumer channel — Telegram getUpdates allows one consumer, so the loser loops on HTTP 409. This adds the cross-sandbox conflict check the onboard path already performs, bringing channels add to parity so it warns / prompts / aborts instead of failing silently.

Related Issue

Fixes #4305

Changes

  • Add checkChannelAddConflict() plus a tri-state gateway probe (makeChannelsConflictProbe()) to addSandboxChannel, reusing the existing messaging-conflict.ts primitives and mirroring the onboard check (src/lib/actions/sandbox/policy-channel.ts). The check runs after token acquisition but before any gateway/registry mutation, so declining leaves nothing half-wired.
  • Interactive runs warn (naming the conflicting sandbox + the 409 risk) and prompt Continue anyway? [y/N] (default No). Non-interactive runs abort with exit(1) and actionable guidance (channels remove on the other sandbox, or --force).
  • New --force flag on channels add as the documented override (src/lib/sandbox/channels-command-support.ts).
  • Only non-secret credential hashes are compared or surfaced — raw tokens are never logged. QR-paired (tokenless) adds and --dry-run are unaffected; an idempotent same-sandbox re-add does not self-conflict; a different token does not false-positive.
  • Tests: new src/lib/actions/sandbox/policy-channel-conflict.test.ts (16 scenarios — matching/unknown token, interactive continue/abort, non-interactive abort, --force, dry-run, idempotent re-add, QR skip, Slack two-token, probe failure swallowed, no token in output) + src/commands/sandbox/channels/mutate.test.ts flag-mapping (7).

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

  • npx prek run --all-files passes — see note
  • npm test passes — see note
  • Tests added or updated for new or changed behavior
  • No secrets, API keys, or credentials committed
  • Docs updated for user-facing behavior changes — follow-up (see note)

Note: The --project cli tests for this change pass (23/23) and tsc -p tsconfig.cli.json --noEmit is clean. Remaining full-suite / prek failures are pre-existing environment issues unrelated to this change — plugin deps not installed in the dev sandbox (json5 ENOENT), integration tests requiring docker/ssh/brev timing out at 5s (snapshot.test.ts, e2e-lib-helpers.test.ts), and the source-shape budget hook scanning unrelated local git worktrees. None touch the channels / messaging-conflict modules.

This is a user-facing behavior change (channels add can now block, and gains a --force flag). A docs + release-note update should follow in the normal docs refresh.


Signed-off-by: Tony Luo xialuo@nvidia.com

Summary by CodeRabbit

  • New Features

    • Added a --force option to "channels add" to bypass cross-sandbox credential conflict warnings; dry-run still skips credential/prompt actions.
    • Sandbox connect now runs an auto-pair approval pass during recovery/finalization (best-effort).
  • Bug Fixes

    • Approval pass skipped when gateway probe reports down; approval subprocess env/timeouts tightened.
  • Documentation

    • CLI references updated to document the new --force flag for channels add.
  • Tests

    • Expanded coverage for force/dry-run/flag parity, conflict scenarios, approval pass behavior, and output-safety.

…nnels add

`nemoclaw <name> channels add <channel>` accepted the same messaging bot
credential (e.g. a Telegram bot token) on a second sandbox with no warning,
so two sandboxes silently competed for the single allowed getUpdates/gateway
consumer and one looped on HTTP 409. The onboard path already guarded against
this; the channels-add path did not.

Mirror the onboard conflict check inside addSandboxChannel: after token
acquisition but before the gateway/registry mutation, hash the acquired
credentials and call findChannelConflicts against the other sandboxes in the
registry (with a tri-state gateway probe to backfill legacy entries). On a
matching or unverifiable token, interactive runs warn and prompt
`Continue anyway? [y/N]` (default no); non-interactive runs abort with
`exit(1)` and actionable guidance; a new `--force` flag is the documented
override. The check runs before any gateway/registry mutation, so declining
leaves nothing half-wired. QR-paired (tokenless) adds and `--dry-run` are
unaffected, and only non-secret credential hashes — never raw tokens — are
compared or surfaced.

Fixes NVIDIA#4305

Signed-off-by: Tony Luo <xialuo@nvidia.com>

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Jun 2, 2026

Review Change Stack

📝 Walkthrough

Walkthrough

Adds a --force flag to channels add, threads it into ChannelMutationOptions and the add command, inserts a gateway/backfill-backed pre-flight cross-sandbox credential conflict probe into addSandboxChannel that prompts or aborts (non-interactive exit) unless forced, updates docs, and adds comprehensive tests plus connect/onboard approval tuning and tests.

Changes

Cross-sandbox channel conflict detection with force bypass

Layer / File(s) Summary
Force flag and CLI wiring
src/lib/sandbox/channels-command-support.ts, src/commands/sandbox/channels/add.ts, src/commands/sandbox/channels/mutate.test.ts, docs/reference/commands.mdx, docs/reference/commands-nemohermes.mdx
Introduces --force as channelAddFlags, extends ChannelMutationOptions and channelMutationOptions() to include force: boolean, updates ChannelsAddCommand.usage/flags, updates tests to assert force propagation and that only channels add exposes --force, and documents the new flag.
Conflict detection helpers and integration
src/lib/actions/sandbox/policy-channel.ts
Adds makeChannelsConflictProbe() and checkChannelAddConflict() which probe gateway liveness/backfill, hash credentials, detect cross-sandbox conflicts, redact secrets, and enforce abort/prompt behavior unless force is set; integrates an early guard into addSandboxChannel.
Comprehensive conflict scenario tests
src/lib/actions/sandbox/policy-channel-conflict.test.ts
New Vitest suite loading compiled hash logic exercises 11 scenarios: interactive continue/abort/default-no, non-interactive abort guidance, --force bypass, unknown-token messaging, hash mismatch/idempotency, --dry-run safety, WeChat/WhatsApp branches, backfill failure handling, and output redaction.
Connect auto-pair approval tuning
src/lib/actions/sandbox/connect.ts, test/sandbox-connect-inference.test.ts
Calls runConnectAutoPairApprovalPass during probe/recover, reduces max approvals, increases outer timeout, increases per-approval devices approve timeout to 10s, and strips gateway env vars in the embedded approval script; tests validate execution, env stripping, and budget invariants.
Onboard finalization wiring & tests
src/lib/onboard.ts, src/lib/onboard/machine/handlers/finalization.ts, src/lib/onboard/machine/handlers/finalization.test.ts
Adds autoPairScopeApproval dependency and calls it after process recovery in finalization; tests assert call order, agent-agnostic invocation, and best-effort semantics.

Sequence Diagram

sequenceDiagram
  participant CLI
  participant addSandboxChannel
  participant GatewayProbe
  participant Backfill
  participant ChannelsRegistry
  participant Prompt

  CLI->>addSandboxChannel: invoke with flags (dry-run?, force?)
  addSandboxChannel->>GatewayProbe: probe gateway/provider liveness
  GatewayProbe-->>addSandboxChannel: tri-state (present/absent/error)
  addSandboxChannel->>Backfill: attempt non-fatal backfill
  Backfill-->>addSandboxChannel: backfill result
  addSandboxChannel->>ChannelsRegistry: lookup other sandboxes' credential hashes
  ChannelsRegistry-->>addSandboxChannel: conflicts found / none
  addSandboxChannel->>Prompt: show "Continue anyway?" (interactive) / exit (non-interactive) unless force
  Prompt-->>addSandboxChannel: user decision (continue/abort)
  addSandboxChannel-->>ChannelsRegistry: register/update channel if not aborted or if forced
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Possibly related PRs

  • NVIDIA/NemoClaw#4577: Modifies addSandboxChannel flow; related code-level area (preset preflight/rollback) overlaps functionally with this PR.
  • NVIDIA/NemoClaw#4582: Also touches addSandboxChannel preflight logic and Slack credential validation; related to conflict-check/control-flow changes.

Suggested reviewers

  • cv
  • ericksoa

🐰 I hopped through flags and hashes bright,
I whispered "force" to skip the fight.
A prompt, a check, redacted trace —
Tests hum softly, secrets safe.
Hooray for channels snug in place.

🚥 Pre-merge checks | ✅ 3 | ❌ 2

❌ Failed checks (1 warning, 1 inconclusive)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 40.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
Out of Scope Changes check ❓ Inconclusive Changes to src/lib/actions/sandbox/connect.ts and related onboarding finalization logic appear beyond the stated #4305 scope but are justified as part of the onboarding flow consolidation mentioned in PR objectives; however, these changes lack explicit connection to the channels add conflict detection work. Clarify the relationship between the connect.ts auto-pair approval changes and the channels add conflict detection feature, or consider splitting into separate PRs if these are independent improvements.
✅ Passed checks (3 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title 'fix(cli): warn on cross-sandbox messaging credential conflicts in channels add' directly and accurately describes the main change: adding a warning mechanism for cross-sandbox messaging credential conflicts in the channels add command.
Linked Issues check ✅ Passed The PR successfully implements all coding requirements from issue #4305: cross-sandbox conflict detection with hash comparison, interactive warnings naming conflicting sandboxes, non-interactive abort with exit(1), a new --force flag override, secret-safe credential handling, and comprehensive test coverage (23 scenarios across two test files).

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

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

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

TonyLuo-NV and others added 2 commits June 2, 2026 15:03
The `--force` override added for the cross-sandbox messaging conflict check
(NVIDIA#4305) lived on the shared channelMutationFlags, so it surfaced as a no-op
`--force` on `channels remove/start/stop` and failed the CLI/docs flag-parity
check (the flag was undocumented on those commands).

Move `--force` into an add-only flag set, document it under the `channels add`
reference section, and update the command-layer test to assert the flag is
exposed only on add. No behavior change to the conflict check itself.

Signed-off-by: Tony Luo <xialuo@nvidia.com>

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
verifyChannelBridgeAfterRebuild (run after a successful interactive
`channels add`) probes the sandbox via executeSandboxExecCommand, which calls
getOpenshellBinary() -> process.exit(1) when the openshell binary is absent. On
the CI unit-test runner openshell is not installed, so that exit fired (caught
by the exec wrapper, but still recorded by the process.exit spy), failing the
"add proceeds" assertion expect(exitMock).not.toHaveBeenCalled() in
policy-channel-conflict.test.ts. Locally openshell is installed, so it only
reproduced in CI.

Stub executeSandboxExecCommand/executeSandboxCommand at the process-recovery
boundary (matching channel-status.test.ts) so the downstream bridge
verification never shells out. Test-only; no source/behavior change.

Signed-off-by: Tony Luo <xialuo@nvidia.com>

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@TonyLuo-NV TonyLuo-NV added the v0.0.60 Release target label Jun 3, 2026
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

🧹 Nitpick comments (1)
docs/reference/commands.mdx (1)

1604-1614: ⚡ Quick win

Keep one full sentence per source line in this section.

These paragraphs wrap single sentences across multiple lines; reflow so each sentence is contained on exactly one line to match docs diff/readability conventions.

As per coding guidelines: "One sentence per line in source (makes diffs readable). Flag paragraphs where multiple sentences appear on the same line."

Also applies to: 1631-1634

🤖 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 `@docs/reference/commands.mdx` around lines 1604 - 1614, The paragraph in
docs/reference/commands.mdx contains multiple sentences on the same source
lines; reflow each sentence so each appears on its own line (one sentence per
source line) to follow the docs diff/readability convention—specifically split
the block starting with "NemoClaw registers a hidden `internal` command
namespace." so every sentence is a separate line, and do the same for the other
affected block referenced around lines 1631-1634; ensure you preserve
punctuation and spacing but break lines at sentence boundaries without altering
wording.
🤖 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 `@docs/reference/commands.mdx`:
- Around line 1604-1614: The paragraph in docs/reference/commands.mdx contains
multiple sentences on the same source lines; reflow each sentence so each
appears on its own line (one sentence per source line) to follow the docs
diff/readability convention—specifically split the block starting with "NemoClaw
registers a hidden `internal` command namespace." so every sentence is a
separate line, and do the same for the other affected block referenced around
lines 1631-1634; ensure you preserve punctuation and spacing but break lines at
sentence boundaries without altering wording.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: 27b44dc9-e516-4a2a-bdd1-21c382ebab0f

📥 Commits

Reviewing files that changed from the base of the PR and between ba7f16d and cbd1f37.

📒 Files selected for processing (1)
  • docs/reference/commands.mdx

@wscurran wscurran added area: cli Command line interface, flags, terminal UX, or output area: messaging Messaging channels, bridges, manifests, or channel lifecycle bug-fix PR fixes a bug or regression labels Jun 3, 2026
@wscurran
Copy link
Copy Markdown
Contributor

wscurran commented Jun 3, 2026

TonyLuo-NV and others added 2 commits June 4, 2026 09:57
The agent-variant parity check (preview job) requires
commands-nemohermes.mdx to mirror commands.mdx. Regenerate via
docs:sync-agent-variants to propagate the new --force flag row that was
added to commands.mdx. Generated file; no manual content.

Signed-off-by: Tony Luo <xialuo@nvidia.com>

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@TonyLuo-NV TonyLuo-NV added v0.0.59 Release target and removed v0.0.60 Release target labels Jun 4, 2026
TonyLuo-NV and others added 2 commits June 4, 2026 16:43
…rocess test)

The `checks` prek Test (CLI) hook runs vitest at the default 5s timeout;
test/repro-2666-silent-list-status.test.ts spawns the real CLI per case and
intermittently exceeds it under runner load. Unrelated to this PR's files;
passed in prior runs. Empty commit to re-run CI (no rerun admin on the repo).

Signed-off-by: Tony Luo <xialuo@nvidia.com>

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🧹 Nitpick comments (1)
src/lib/onboard/machine/handlers/finalization.test.ts (1)

22-23: ⚡ Quick win

Harden ordering tests with an async/deferred approval mock.

Current assertions validate call order, but not that verification waits for approval completion. Add one test with a deferred autoPairScopeApproval promise and assert verify is not called until it resolves.

Also applies to: 43-43, 183-229

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

In `@src/lib/onboard/machine/handlers/finalization.test.ts` around lines 22 - 23,
Replace the synchronous autoPairScopeApproval mock with a deferred Promise in
the finalization tests: create a deferred (resolve/reject) object, have the
autoPairScopeApproval mock return deferred.promise, call the code that should
wait for approval, assert that verify (the mocked verification function) has not
been called yet, then resolve the deferred and assert verify is called after
resolution; update any other affected tests (lines referencing
autoPairScopeApproval/getChatUiUrl and the verify assertions) to follow this
pattern so ordering is hardened and verification truly waits for approval
completion.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@src/lib/onboard.ts`:
- Around line 7032-7036: The new autoPairScopeApproval hook wiring was added
directly inside src/lib/onboard.ts (the autoPairScopeApproval property calling
connect.runConnectAutoPairApprovalPass), which increases the file size and
violates growth guardrails; move this wiring into a new or existing helper under
src/lib/onboard/** (preferably
src/lib/onboard/machine/handlers/finalization.ts): create the same function or
handler there that requires ./actions/sandbox/connect and calls
connect.runConnectAutoPairApprovalPass(name), then import or reference that
handler from onboard.ts (or better, register the handler from the new module) so
that src/lib/onboard.ts remains net-neutral; ensure exported symbol names (e.g.,
autoPairScopeApproval handler) match the original usage so no callers change.

---

Nitpick comments:
In `@src/lib/onboard/machine/handlers/finalization.test.ts`:
- Around line 22-23: Replace the synchronous autoPairScopeApproval mock with a
deferred Promise in the finalization tests: create a deferred (resolve/reject)
object, have the autoPairScopeApproval mock return deferred.promise, call the
code that should wait for approval, assert that verify (the mocked verification
function) has not been called yet, then resolve the deferred and assert verify
is called after resolution; update any other affected tests (lines referencing
autoPairScopeApproval/getChatUiUrl and the verify assertions) to follow this
pattern so ordering is hardened and verification truly waits for approval
completion.
🪄 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: 43d2b252-f6e9-413e-9ca7-a900447abc40

📥 Commits

Reviewing files that changed from the base of the PR and between 0f2533d and a0085a7.

📒 Files selected for processing (5)
  • src/lib/actions/sandbox/connect.ts
  • src/lib/onboard.ts
  • src/lib/onboard/machine/handlers/finalization.test.ts
  • src/lib/onboard/machine/handlers/finalization.ts
  • test/sandbox-connect-inference.test.ts

Comment thread src/lib/onboard.ts Outdated
Comment on lines +7032 to +7036
autoPairScopeApproval: (name) => {
const connect: typeof import("./actions/sandbox/connect") =
require("./actions/sandbox/connect");
connect.runConnectAutoPairApprovalPass(name);
},
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.

⚠️ Potential issue | 🟠 Major | 🏗️ Heavy lift

CI blocker: move this new hook wiring out of src/lib/onboard.ts to satisfy growth guardrails.

This added block is part of the net +5 growth currently failing codebase-growth-guardrails, which blocks merge. Please relocate this wiring into src/lib/onboard/machine/handlers/finalization.ts (or another src/lib/onboard/** helper) and keep src/lib/onboard.ts net-neutral.

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

In `@src/lib/onboard.ts` around lines 7032 - 7036, The new autoPairScopeApproval
hook wiring was added directly inside src/lib/onboard.ts (the
autoPairScopeApproval property calling connect.runConnectAutoPairApprovalPass),
which increases the file size and violates growth guardrails; move this wiring
into a new or existing helper under src/lib/onboard/** (preferably
src/lib/onboard/machine/handlers/finalization.ts): create the same function or
handler there that requires ./actions/sandbox/connect and calls
connect.runConnectAutoPairApprovalPass(name), then import or reference that
handler from onboard.ts (or better, register the handler from the new module) so
that src/lib/onboard.ts remains net-neutral; ensure exported symbol names (e.g.,
autoPairScopeApproval handler) match the original usage so no callers change.

Commit a0085a7 was intended as an empty CI re-trigger but accidentally
swept in staged work from a parallel branch (sandbox connect auto-pair,
NVIDIA#4462/NVIDIA#4504): connect.ts, onboard.ts, finalization handler + test. Revert
restores the tree to 0f2533d so this PR contains only the NVIDIA#4305
cross-sandbox channels-add conflict changes. The connect-autopair work lives
on its own branch (fix/4504-onboard-scope-upgrade-autopair).

Signed-off-by: Tony Luo <xialuo@nvidia.com>

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@prekshivyas prekshivyas self-assigned this Jun 4, 2026
Copy link
Copy Markdown
Contributor

@prekshivyas prekshivyas left a comment

Choose a reason for hiding this comment

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

LGTM — approving. Verified the conflict-check logic:

  • Security: only hashCredential(token) hashes are compared and surfaced; raw tokens never appear in the probe, warning, or abort message. Good.
  • Fail-open: makeChannelsConflictProbe returns "error" when the gateway isn't alive, backfillMessagingChannels is try/caught, and findChannelConflicts returning on throw all degrade to "no conflict → proceed". A flaky gateway never wrongly blocks an add — correct direction for an advisory check. It reuses the same fail-safe providerExistsInGateway as the onboard path, so the two checks stay consistent.
  • QR/tokenless adds (empty acquired) short-circuit to proceed, avoiding "unknown-token" noise; --force and the non-interactive abort path are both wired with actionable guidance.

Test coverage is thorough (16 scenarios incl. matching/unknown token, interactive continue/abort, non-interactive abort, --force, dry-run, idempotent re-add, QR skip, Slack two-token, probe-failure-swallowed, no-token-in-output). CI is green.

Note: CodeRabbit's lone finding points at src/lib/onboard.ts:7036 / a guardrail failure, but onboard.ts isn't in this PR and codebase-growth-guardrails passes — it's stale, disregard.

Non-blocking suggestion: move the checkChannelAddConflict(...) call above persistChannelTokens(acquired). The check hashes acquired directly and doesn't depend on the persist, so as written an aborted conflicted add still writes the token to the host credential store via saveCredential. Reordering makes "declining leaves nothing wired" literally true at the host-store level too (it's already true for gateway/registry). Low-harm either way — fine to merge as-is.

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

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

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

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

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

* **Documentation**
  * Updated default model for local Ollama inference setup to qwen3.5:9b
  * Added Nemotron 3 Ultra 550B as an NVIDIA Endpoints model option
* Clarified credential storage and reuse behavior for post-deployment
(day-two) operations
* Added v0.0.59 release notes covering OpenClaw compatibility, inference
options, Hermes messaging sync, and troubleshooting
* Clarified CLI selection guidance and updated OpenClaw version example
in status output
* Revised release-prep instructions and docs review guidance for CLI
alias usage
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area: cli Command line interface, flags, terminal UX, or output area: messaging Messaging channels, bridges, manifests, or channel lifecycle bug-fix PR fixes a bug or regression v0.0.59 Release target

Projects

None yet

4 participants