Skip to content

fix(channels): hint at when bundled channel module is missing#76974

Merged
clawsweeper[bot] merged 5 commits into
openclaw:mainfrom
BSG2000:fix/bundled-channel-load-doctor-hint
May 21, 2026
Merged

fix(channels): hint at when bundled channel module is missing#76974
clawsweeper[bot] merged 5 commits into
openclaw:mainfrom
BSG2000:fix/bundled-channel-load-doctor-hint

Conversation

@BSG2000

@BSG2000 BSG2000 commented May 3, 2026

Copy link
Copy Markdown
Contributor

Summary

When a bundled channel plugin (e.g. nostr, discord, whatsapp, msteams) fails to load because its plugin-local runtime dependency hasn't been staged yet, the loader currently emits a bare warning like:

[channels] failed to load bundled channel nostr: Cannot find module 'nostr-tools'

This is alarming and not actionable — users have no signal that the supported repair path is openclaw doctor --fix, which is the design @steipete confirmed when closing #48803 ("doctor owns the repair path").

This PR detects ERR_MODULE_NOT_FOUND / MODULE_NOT_FOUND on the bundled channel load path and appends the canonical guidance to the warning detail, e.g.:

[channels] failed to load bundled channel nostr: Cannot find module 'nostr-tools' (run `openclaw doctor --fix` to install missing bundled runtime dependencies for channel nostr)

The hint phrasing matches existing usages in src/plugins/discovery.ts, src/plugins/plugin-registry-snapshot.ts, and src/cli/plugins-install-command.ts so users see a consistent remediation surface.

Why this approach

  • Maintainer-aligned — does not mirror plugin runtime deps to the root package.json (which fix: add nostr-tools to root dependencies #48803 explicitly rejected); just makes the existing per-plugin staging design discoverable when it hasn't run yet.
  • Surgical — pure UX/string change in one helper; behavior of the load path (warn-and-skip) is unchanged.
  • Symmetric — applied to all seven [channels] failed to load bundled channel ... warn sites in bundled.ts (entry, setup entry, plugin, secrets, account inspector, setup plugin, setup secrets), so any of them produces the same friendly hint.

Reproduction

npm install -g openclaw@2026.5.2 && openclaw gateway restart on a host that hasn't yet had openclaw doctor --fix stage the nostr plugin's runtime deps reproduces the warning.

Tests

  • pnpm exec vitest run --config test/vitest/vitest.channels.config.ts src/channels/plugins/bundled-root-caches.test.ts — 4 passed (existing tests cover the load-error path mocked with Cannot find module 'nostr-tools'; my change only enriches the warning string and does not alter control flow).
  • No assertions on the warning text exist anywhere in src//packages/, so no test updates were required.

Risk

Very low — appending to a warning string. No new exports, no public API, no control-flow changes. If extractErrorCode returns anything other than ERR_MODULE_NOT_FOUND/MODULE_NOT_FOUND the original formatErrorMessage(error) output is returned unchanged.

Changelog

Added under ## Unreleased > ### Fixes per repo convention.


🤖 Drafted with assistance from GitHub Copilot CLI.

@clawsweeper

clawsweeper Bot commented May 3, 2026

Copy link
Copy Markdown
Contributor

Codex review: passed.

Workflow note: Future ClawSweeper reviews update this same comment in place.

How this review workflow works
  • ClawSweeper keeps one durable marker-backed review comment per issue or PR.
  • Re-runs edit this comment so the latest verdict, findings, and automation markers stay together instead of adding duplicate bot comments.
  • A fresh review can be triggered by eligible @clawsweeper re-review comments, exact-item GitHub events, scheduled/background review runs, or manual workflow dispatch.
  • PR/issue authors and users with repository write access can comment @clawsweeper re-review or @clawsweeper re-run on an open PR or issue to request a fresh review only.
  • Maintainers can also comment @clawsweeper review to request a fresh review only.
  • Fresh-review commands do not start repair, autofix, rebase, CI repair, or automerge.
  • Maintainer-only repair and merge flows require explicit commands such as @clawsweeper autofix, @clawsweeper automerge, @clawsweeper fix ci, or @clawsweeper address review.
  • Maintainers can comment @clawsweeper explain to ask for more context, or @clawsweeper stop to stop active automation.

Summary
The PR adds a bundled-channel load-error formatter, wires it into the bundled-channel warning paths, adds focused tests, and updates the changelog.

Reproducibility: yes. source-level: current main logs bundled-channel load failures with bare formatErrorMessage output, and the module loader can hide MODULE_NOT_FOUND on .cause. The contributor's terminal proof demonstrates the same wrapped-error shape before and after the PR.

PR rating
Overall: 🦞 diamond lobster
Proof: 🦞 diamond lobster
Patch quality: 🦞 diamond lobster
Summary: Focused patch with strong terminal proof and targeted coverage; no blocking findings found.

What the crustacean ranks mean
  • 🦀 challenger crab: rare, exceptional readiness with strong proof, clean implementation, and convincing validation.
  • 🦞 diamond lobster: very strong readiness with only minor maintainer review expected.
  • 🐚 platinum hermit: good normal PR, likely mergeable with ordinary maintainer review.
  • 🦐 gold shrimp: useful signal, but proof or patch confidence is still limited.
  • 🦪 silver shellfish: thin signal; proof, validation, or implementation needs work.
  • 🧂 unranked krab: not merge-ready because proof is missing/unusable or there are serious correctness or safety concerns.
  • 🌊 off-meta tidepool: rating does not apply to this item.

Shiny media proof means a screenshot, video, or linked artifact directly shows the changed behavior. Runtime, network, CSP, and security claims still need visible diagnostics.

Real behavior proof
Sufficient (terminal): Sufficient terminal proof shows the after-fix PR helper import emits the openclaw doctor --fix hint for the wrapped missing-module error and does not add the hint for unrelated errors.

Risk before merge

  • This read-only review did not execute the PR tests locally; landing should still use current-head CI or the normal maintainer landing checks.

Maintainer options:

  1. Decide the mitigation before merge
    Land the focused formatter and tests after normal CI, preserving doctor-owned staged dependency repair instead of adding plugin runtime dependencies to the root package.
  2. Pause or close
    Do not merge this PR until maintainers decide whether the risk is worth taking.

Next step before merge
No automated repair is needed; the remaining action is ordinary maintainer review and landing checks for a clean PR that is currently paused by the human-review workflow state.

Security
Cleared: The diff only changes warning formatting, focused tests, and changelog text; it does not alter dependency resolution, permissions, package execution, workflows, or secrets handling.

Review details

Best possible solution:

Land the focused formatter and tests after normal CI, preserving doctor-owned staged dependency repair instead of adding plugin runtime dependencies to the root package.

Do we have a high-confidence way to reproduce the issue?

Yes, source-level: current main logs bundled-channel load failures with bare formatErrorMessage output, and the module loader can hide MODULE_NOT_FOUND on .cause. The contributor's terminal proof demonstrates the same wrapped-error shape before and after the PR.

Is this the best way to solve the issue?

Yes: a central formatter reused by all bundled-channel warning sites is the narrow maintainable fix and avoids the rejected root-dependency workaround. The deeper Feishu disable/runtime-dependency issue remains outside this PR's scope.

Label changes:

  • add status: 🚀 automerge armed: This PR is in ClawSweeper's automerge lane. Sufficient (terminal): Sufficient terminal proof shows the after-fix PR helper import emits the openclaw doctor --fix hint for the wrapped missing-module error and does not add the hint for unrelated errors.
  • remove status: 👀 ready for maintainer look: Current PR status label is status: 🚀 automerge armed.

Label justifications:

  • P3: This is a small user-facing diagnostic improvement to warning text with low blast radius.
  • rating: 🦞 diamond lobster: Current PR rating is 🦞 diamond lobster because proof is 🦞 diamond lobster, patch quality is 🦞 diamond lobster, and Focused patch with strong terminal proof and targeted coverage; no blocking findings found.
  • status: 🚀 automerge armed: This PR is in ClawSweeper's automerge lane. Sufficient (terminal): Sufficient terminal proof shows the after-fix PR helper import emits the openclaw doctor --fix hint for the wrapped missing-module error and does not add the hint for unrelated errors.
  • proof: sufficient: Contributor real behavior proof is sufficient. Sufficient terminal proof shows the after-fix PR helper import emits the openclaw doctor --fix hint for the wrapped missing-module error and does not add the hint for unrelated errors.

What I checked:

  • Current main bare warning path: Current main still calls formatErrorMessage(error) directly before the bundled-channel warning logs; the same pattern appears at the entry, setup entry, plugin, secrets, account inspector, setup plugin, and setup secrets load paths. (src/channels/plugins/bundled.ts:267, 8961eae3f022)
  • Wrapped native-require failures: The channel module loader wraps built JavaScript native-require failures with new Error(..., { cause: error }), so the Node MODULE_NOT_FOUND code can live on the nested cause rather than the top-level error. (src/channels/plugins/module-loader.ts:64, 8961eae3f022)
  • Error utility contract: extractErrorCode only reads the current object's code, while formatErrorMessage separately walks .cause for messages; the PR's explicit cause-chain code walk is therefore needed to classify wrapped module-not-found errors. (src/infra/errors.ts:3, 8961eae3f022)
  • PR implementation: The PR adds findMissingModuleCodeInChain and describeBundledChannelLoadError, then reuses that formatter at the bundled-channel warning sites without changing the warn-and-skip control flow. (src/channels/plugins/bundled.ts:248, 416a8a2e773d)
  • PR regression coverage: The added tests cover top-level MODULE_NOT_FOUND, top-level ERR_MODULE_NOT_FOUND, nested-cause MODULE_NOT_FOUND, unrelated errors, and a self-referential cause chain. (src/channels/plugins/bundled-load-error.test.ts:4, 416a8a2e773d)
  • Changelog entry: The PR records the user-facing bundled-channel warning improvement under the current Unreleased fixes section. (CHANGELOG.md:111, 416a8a2e773d)

Likely related people:

  • shakkernerd: Local blame and log history for src/channels/plugins/bundled.ts, src/channels/plugins/module-loader.ts, and src/infra/errors.ts attribute the current-main loader and error-formatting paths to Shakker's commit. (role: recent area contributor; confidence: medium; commits: 6ccca4ae9529; files: src/channels/plugins/bundled.ts, src/channels/plugins/module-loader.ts, src/infra/errors.ts)
  • steipete: The PR body and related context cite steipete's closure of the root-dependency workaround as confirming that openclaw doctor --fix owns this repair path. (role: prior repair-path decision owner; confidence: medium; files: src/channels/plugins/bundled.ts)

Codex review notes: model gpt-5.5, reasoning high; reviewed against 8961eae3f022.

@BSG2000 BSG2000 force-pushed the fix/bundled-channel-load-doctor-hint branch from b33226d to 947fa96 Compare May 3, 2026 22:35
BSG2000 added a commit to BSG2000/openclaw that referenced this pull request May 6, 2026
Native-require failures in module-loader.ts wrap the original Node error
in a new Error with { cause }, so MODULE_NOT_FOUND lives on the cause
rather than the top-level error. extractErrorCode only inspected the
top-level code, so packaged bundled-channel load failures missed the new
 hint.

Walk the .cause chain (with cycle protection) when classifying bundled
channel load errors, and add focused tests pinning the warning text for
top-level MODULE_NOT_FOUND, top-level ERR_MODULE_NOT_FOUND, nested-cause
MODULE_NOT_FOUND, unrelated errors, and self-referential cause chains.

Addresses clawsweeper review feedback on openclaw#76974.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@BSG2000 BSG2000 force-pushed the fix/bundled-channel-load-doctor-hint branch from 003206c to 25fb6c7 Compare May 6, 2026 09:53
@openclaw-barnacle openclaw-barnacle Bot added size: S triage: needs-real-behavior-proof Candidate: external PR needs after-fix proof from a real setup. and removed size: XS labels May 6, 2026
@BSG2000

BSG2000 commented May 6, 2026

Copy link
Copy Markdown
Contributor Author

Addressed @clawsweeper P2 in 25fb6c7:

  • Added findMissingModuleCodeInChain in src/channels/plugins/bundled.ts that walks the .cause chain (with cycle protection) before deciding whether to append the doctor hint, so packaged native-require failures wrapped by module-loader.ts (which throws new Error(..., { cause })) now get the same guidance.
  • Added focused coverage in src/channels/plugins/bundled-load-error.test.ts (5 tests): top-level MODULE_NOT_FOUND, top-level ERR_MODULE_NOT_FOUND, nested-cause MODULE_NOT_FOUND mirroring the native-require wrap, unrelated error returns the bare detail, and a self-referential cause chain does not loop.

Local: pnpm exec vitest run --config test/vitest/vitest.unit-fast.config.ts -t "describeBundledChannelLoadError" → 5/5 green.

Also rebased onto current main to clear the merge conflict.

@BSG2000

BSG2000 commented May 7, 2026

Copy link
Copy Markdown
Contributor Author

For the maintainer triaging this PR: there is now a user-reported issue #78321 (filed yesterday by @makingperfectmoves-oss) that describes the exact symptom this PR addresses — recurring Cannot find module '@larksuiteoapi/node-sdk' from the bundled feishu plugin with no clear remediation surface for the user.

To be precise: this PR does not fix the deeper architectural issues raised in #78321 (early enabled-flag honoring, optional peer-dep, or shipping the SDK). Those need a separate fix. What this PR does do is materially improve the user-visible warning in exactly that scenario — instead of a bare Cannot find module 'nostr-tools' / Cannot find module '@larksuiteoapi/node-sdk' line, the user sees the canonical doctor remediation hint inline. So this is related to #78321 rather than fixes it.

Happy to update the PR description / changelog wording to call out the relation explicitly if that helps triage.

@BSG2000

BSG2000 commented May 18, 2026

Copy link
Copy Markdown
Contributor Author

Comment for PR #76974 — fix(channels): hint at openclaw doctor --fix when bundled channel module is missing

Real-behavior proof against the latest published release (openclaw@2026.5.12, current on npm)

1) The seven warn sites are still bare in published 2026.5.12

mkdir -p /tmp/openclaw-512 && cd /tmp/openclaw-512
npm pack openclaw@2026.5.12 >/dev/null && tar xzf openclaw-2026.5.12.tgz
grep -n 'failed to load bundled channel' package/dist/bundled-Q4WXUmmu.js
305:log.warn(`[channels] failed to load bundled channel ${params.metadata.manifest.id}: ${detail}`);
324:log.warn(`[channels] failed to load bundled channel setup entry ${params.metadata.manifest.id}: ${detail}`);
495:log.warn(`[channels] failed to load bundled channel ${id}: ${detail}`);
512:log.warn(`[channels] failed to load bundled channel secrets ${id}: ${detail}`);
530:log.warn(`[channels] failed to load bundled channel account inspector ${id}: ${detail}`);
547:log.warn(`[channels] failed to load bundled channel setup ${id}: ${detail}`);
564:log.warn(`[channels] failed to load bundled channel setup secrets ${id}: ${detail}`);

All seven sites pass ${detail} (= formatErrorMessage(error)) straight through — no remediation surface.

2) Live warning a user actually sees when the bundled nostr channel runtime dep is absent

Faithful emulation of the bundled-channel native-require failure path used by src/channels/plugins/module-loader.ts (which throws new Error("failed to load channel plugin module with native require: …", { cause: nativeErr })):

node --input-type=module -e "
import { createRequire } from 'node:module';
const req = createRequire(import.meta.url);
const fmt = e => e instanceof Error ? e.message : String(e);
let captured;
try {
  try { req('nostr-tools'); }
  catch (cause) { throw new Error('failed to load channel plugin module with native require: nostr-tools', { cause }); }
} catch (e) { captured = e; }
console.log('WARN [channels] failed to load bundled channel nostr: ' + fmt(captured));
"

Output on a host where nostr-tools has not been staged yet (the exact precondition described in #78321):

WARN [channels] failed to load bundled channel nostr: failed to load channel plugin module with native require: nostr-tools

No mention of openclaw doctor --fix. The native MODULE_NOT_FOUND code lives on .cause (which is why this PR's findMissingModuleCodeInChain walk is necessary), and the formatted user-facing warning gives no actionable signal.

3) After this PR

With describeBundledChannelLoadError walking .cause, the same warn site emits:

WARN [channels] failed to load bundled channel nostr: failed to load channel plugin module with native require: nostr-tools (run `openclaw doctor --fix` to install missing bundled runtime dependencies for channel nostr)

— matching the canonical remediation phrasing already used in src/plugins/discovery.ts, src/plugins/plugin-registry-snapshot.ts, and src/cli/plugins-install-command.ts, and answering exactly the symptom @makingperfectmoves-oss reported in #78321.

@clawsweeper re-review

@clawsweeper

clawsweeper Bot commented May 18, 2026

Copy link
Copy Markdown
Contributor

🦞🧹
ClawSweeper re-review requested.

I asked ClawSweeper to review this item again.
Action: item re-review queued (workflow sweep.yml, event repository_dispatch).
Result: the existing ClawSweeper review comment will be edited in place when the review finishes.

Re-review progress:

@clawsweeper clawsweeper Bot added rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. status: 📣 needs proof The PR needs real behavior proof before ClawSweeper can clear the contributor ask. P3 Low-priority cleanup, docs, polish, ergonomics, or speculative work. labels May 18, 2026
BSG2000 and others added 3 commits May 18, 2026 13:00
…odule is missing

When a bundled channel plugin (e.g. `nostr`, `whatsapp`, `msteams`) fails to load because its plugin-local runtime dependency is not yet staged, the loader emitted a bare `Cannot find module 'X'` warning with no remediation hint. The intended repair path is `openclaw doctor --fix` (per openclaw#48803), so users were left to discover this themselves.

Detect `ERR_MODULE_NOT_FOUND` / `MODULE_NOT_FOUND` in the bundled channel load error path and append the canonical `run \`openclaw doctor --fix\` to install missing bundled runtime dependencies for channel <id>` guidance to the warning detail. Applied at all seven `[channels] failed to load bundled channel ...` warn sites in `bundled.ts`.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
(cherry picked from commit 17e6794)
Native-require failures in module-loader.ts wrap the original Node error
in a new Error with { cause }, so MODULE_NOT_FOUND lives on the cause
rather than the top-level error. extractErrorCode only inspected the
top-level code, so packaged bundled-channel load failures missed the new
 hint.

Walk the .cause chain (with cycle protection) when classifying bundled
channel load errors, and add focused tests pinning the warning text for
top-level MODULE_NOT_FOUND, top-level ERR_MODULE_NOT_FOUND, nested-cause
MODULE_NOT_FOUND, unrelated errors, and self-referential cause chains.

Addresses clawsweeper review feedback on openclaw#76974.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Re-place CHANGELOG entry under the current Unreleased > Fixes section
after rebase onto main (previous placement targeted a stale section).

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@BSG2000 BSG2000 force-pushed the fix/bundled-channel-load-doctor-hint branch from 0173a59 to 810f51a Compare May 18, 2026 11:02
…oad-doctor-hint

# Conflicts:
#	CHANGELOG.md
@BSG2000

BSG2000 commented May 18, 2026

Copy link
Copy Markdown
Contributor Author

Rebased onto current main and merged in upstream changes; current HEAD is fbe18d06d1. Only conflict was in CHANGELOG.md (a new top entry was added under ## Unreleased > ### Fixes upstream); resolved by keeping both entries. No code changes vs. previously-reviewed diff.

GitHub now reports mergeable=true. Real-behavior proof from the earlier comment still applies against the latest published openclaw@2026.5.12.

@clawsweeper re-review

@clawsweeper

clawsweeper Bot commented May 18, 2026

Copy link
Copy Markdown
Contributor

🦞🧹
ClawSweeper re-review requested.

I asked ClawSweeper to review this item again.
Action: item re-review queued (workflow sweep.yml, event repository_dispatch).
Result: the existing ClawSweeper review comment will be edited in place when the review finishes.

Re-review progress:

@BSG2000

BSG2000 commented May 19, 2026

Copy link
Copy Markdown
Contributor Author

Follow-up: after-fix real behavior proof (addresses ClawSweeper rank-up move)

Same wrapped-error reproduction as the earlier comment, now running the PR's new describeBundledChannelLoadError next to the current bare formatErrorMessage for direct comparison:

node --input-type=module -e "
import { createRequire } from 'node:module';
const req = createRequire(import.meta.url);
const formatErrorMessage = e => e instanceof Error ? e.message : String(e);

// Native-require wrap exactly as src/channels/plugins/module-loader.ts does it.
function buildWrappedNostrError() {
  try { req('nostr-tools'); }
  catch (cause) { return new Error('failed to load channel plugin module with native require: nostr-tools', { cause }); }
}

// BEFORE: the current 2026.5.12 path used at all seven warn sites.
const describeBefore = err => formatErrorMessage(err);

// AFTER: this PR's describeBundledChannelLoadError + findMissingModuleCodeInChain.
function describeAfter(error, channelId) {
  const detail = formatErrorMessage(error);
  const seen = new Set();
  let cur = error;
  while (cur && !seen.has(cur)) {
    seen.add(cur);
    const code = (cur && typeof cur === 'object' && 'code' in cur) ? cur.code : undefined;
    if (code === 'MODULE_NOT_FOUND' || code === 'ERR_MODULE_NOT_FOUND') {
      return detail + ' (run \`openclaw doctor --fix\` to install missing bundled runtime dependencies for channel ' + channelId + ')';
    }
    if (typeof cur !== 'object') break;
    cur = cur.cause;
  }
  return detail;
}

const err = buildWrappedNostrError();
console.log('cause.code on inner error:', err && err.cause && err.cause.code);
console.log('');
console.log('BEFORE WARN [channels] failed to load bundled channel nostr: ' + describeBefore(err));
console.log('AFTER  WARN [channels] failed to load bundled channel nostr: ' + describeAfter(err, 'nostr'));
console.log('');
// Negative case: a non-missing-module failure must NOT get the hint.
const generic = new Error('outer', { cause: new TypeError('something else') });
console.log('Edge: non-missing-module error, should NOT add hint:');
console.log('AFTER  WARN [channels] failed to load bundled channel nostr: ' + describeAfter(generic, 'nostr'));
"

Output on a clean Ubuntu 24.04 / Node 22.22.0 host where nostr-tools is not installed:

cause.code on inner error: MODULE_NOT_FOUND

BEFORE WARN [channels] failed to load bundled channel nostr: failed to load channel plugin module with native require: nostr-tools
AFTER  WARN [channels] failed to load bundled channel nostr: failed to load channel plugin module with native require: nostr-tools (run `openclaw doctor --fix` to install missing bundled runtime dependencies for channel nostr)

Edge: non-missing-module error, should NOT add hint:
AFTER  WARN [channels] failed to load bundled channel nostr: outer

So with the PR applied the warn site emits the openclaw doctor --fix hint (matching the canonical phrasing used in src/plugins/discovery.ts, src/plugins/plugin-registry-snapshot.ts, src/cli/plugins-install-command.ts), and the negative case confirms the hint is only added when a missing-module code is actually present on the cause chain — no over-triggering on unrelated TypeErrors. The same describeBundledChannelLoadError is wired in at all seven warn sites by this PR.

Current HEAD: fbe18d06d1 (rebased + merged onto current main; only conflict was a non-overlapping CHANGELOG.md entry; no code changes vs. previously-reviewed diff).

@clawsweeper re-review

@clawsweeper

clawsweeper Bot commented May 19, 2026

Copy link
Copy Markdown
Contributor

🦞🧹
ClawSweeper could not start a re-review for this item.

Reason: re-review requires an open issue or PR.

Re-review progress:

@BSG2000

BSG2000 commented May 19, 2026

Copy link
Copy Markdown
Contributor Author

Follow-up: PR-built proof via direct import + vitest on branch HEAD

Addresses the rank-up move "Attach redacted terminal or log output from a PR-built helper import, package, or gateway path showing the bundled-channel warning includes the openclaw doctor --fix hint." — runs the actual PR code via vitest (which imports describeBundledChannelLoadError from src/channels/plugins/bundled.ts on the branch) and via a tsx ESM import.

1) pnpm exec vitest run src/channels/plugins/bundled-load-error.test.ts on branch HEAD fbe18d06d1

 RUN  v4.1.6 /home/krohnf_adm/work/openclaw

 ✓  unit-fast  ../../src/channels/plugins/bundled-load-error.test.ts (5 tests) 20ms

 Test Files  1 passed (1)
      Tests  5 passed (5)
   Start at  08:45:30
   Duration  2.50s

The five tests in bundled-load-error.test.ts exercise the actual PR code path (import { describeBundledChannelLoadError } from "./bundled.js"):

  • ✓ appends the doctor --fix hint for a top-level MODULE_NOT_FOUND error
  • ✓ appends the doctor --fix hint for a top-level ERR_MODULE_NOT_FOUND error (covers ESM/CJS variants — feishu case)
  • ✓ appends the doctor --fix hint when the missing-module code is on a nested cause (native-require wrap, mirrors src/channels/plugins/module-loader.ts — discord case)
  • ✓ returns the bare detail when the error is unrelated (negative: TypeError → no hint)
  • ✓ does not loop on a self-referential cause chain (defensive: seen set in findMissingModuleCodeInChain)

2) Direct import of the PR's helper from the branch source

cd ~/work/openclaw && git rev-parse HEAD
# fbe18d06d1...
pnpm exec tsx -e "
import { describeBundledChannelLoadError } from './src/channels/plugins/bundled.ts';
import { createRequire } from 'node:module';
const req = createRequire(import.meta.url);

// Reproduce the exact native-require wrap from module-loader.ts:
let wrapped;
try { req('nostr-tools'); }
catch (cause) { wrapped = new Error('failed to load channel plugin module with native require: nostr-tools', { cause }); }

console.log('WARN [channels] failed to load bundled channel nostr:', describeBundledChannelLoadError(wrapped, 'nostr'));
"

Output on a clean Ubuntu 24.04 / Node 22.22.0 host:

WARN [channels] failed to load bundled channel nostr: failed to load channel plugin module with native require: nostr-tools (run `openclaw doctor --fix` to install missing bundled runtime dependencies for channel nostr)

So the actual function describeBundledChannelLoadError exported from src/channels/plugins/bundled.ts on this PR's HEAD — wired into all seven log.warn(...) sites by the rest of the diff — appends the openclaw doctor --fix hint for the real wrapped-error shape produced by module-loader.ts. Vitest green confirms the negative cases (unrelated errors, self-referential causes) as well.

Current HEAD: fbe18d06d1 (rebased + merged onto current main; only conflict was a non-overlapping CHANGELOG.md entry; no code changes vs. previously-reviewed diff).

@clawsweeper re-review

@clawsweeper clawsweeper Bot added proof: sufficient ClawSweeper judged the real behavior proof convincing. rating: 🦞 diamond lobster Very strong PR readiness with only minor maintainer review expected. and removed rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. labels May 19, 2026
@clawsweeper clawsweeper Bot added status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR. and removed status: 📣 needs proof The PR needs real behavior proof before ClawSweeper can clear the contributor ask. labels May 19, 2026
@Takhoffman

Copy link
Copy Markdown
Contributor

@clawsweeper automerge

@clawsweeper clawsweeper Bot added the clawsweeper:automerge Maintainer opted this PR into bounded ClawSweeper-reviewed automerge label May 19, 2026
@clawsweeper

clawsweeper Bot commented May 19, 2026

Copy link
Copy Markdown
Contributor

🦞✅
ClawSweeper merged this PR after the passing review.

Source: clawsweeper[bot]
Feedback: structured ClawSweeper verdict: pass (sha=416a8a2e773da13e053d600297b0a30ff5f3e073)
Merge status: merged by ClawSweeper automerge
Merged at: 2026-05-21T21:03:50Z
Merge commit: 98af51748d19

What merged:

  • The PR adds a bundled-channel load-error formatter, wires it into the bundled-channel warning paths, adds focused tests, and updates the changelog.
  • Reproducibility: yes. source-level: current main logs bundled-channel load failures with bare formatErrorMe ... cause. The contributor's terminal proof demonstrates the same wrapped-error shape before and after the PR.

Automerge notes:

  • PR branch already contained follow-up commit before automerge: fix(channels): walk error cause chain to detect missing bundled modules
  • PR branch already contained follow-up commit before automerge: docs(changelog): add Unreleased Fixes entry
  • PR branch already contained follow-up commit before automerge: Merge remote-tracking branch 'origin/main' into fix/bundled-channel-l…
  • PR branch already contained follow-up commit before automerge: Merge branch 'main' into fix/bundled-channel-load-doctor-hint

The automerge loop is complete.

Automerge progress:

  • 2026-05-19 17:30:21 UTC review queued 416a8a2e773d (queued)
  • 2026-05-21 21:00:40 UTC review passed 416a8a2e773d (structured ClawSweeper verdict: pass (sha=416a8a2e773da13e053d600297b0a30ff5f3e...)
  • 2026-05-21 21:03:52 UTC merged 416a8a2e773d (merged by ClawSweeper automerge)

@clawsweeper clawsweeper Bot added the clawsweeper:human-review Needs maintainer review before ClawSweeper can continue label May 19, 2026
@clawsweeper

clawsweeper Bot commented May 19, 2026

Copy link
Copy Markdown
Contributor

🦞✅
ClawSweeper is pausing this repair loop for human review.

Source: clawsweeper[bot]
Reason: No automated repair is needed; this clean PR is ready for ordinary maintainer review and landing checks.; Cleared: The diff only changes warning formatting, focused tests, and changelog text; it does not alter dependency resolution, workflows, permissions, package execution, or secrets handling. (sha=416a8a2e773da13e053d600297b0a30ff5f3e073)

Why human review is needed:
This item has security-sensitive risk. ClawSweeper is pausing instead of making an autonomous change that could affect trust, credentials, permissions, or exposure.

Recommended next action:
Have a maintainer review the security-sensitive detail and provide an explicit safe path before asking ClawSweeper to continue.

I added clawsweeper:human-review and left the final call with a maintainer.

@giodl73-repo giodl73-repo removed the triage: needs-real-behavior-proof Candidate: external PR needs after-fix proof from a real setup. label May 21, 2026
@openclaw-barnacle openclaw-barnacle Bot added the triage: needs-real-behavior-proof Candidate: external PR needs after-fix proof from a real setup. label May 21, 2026
@clawsweeper clawsweeper Bot added status: 🚀 automerge armed This PR is in ClawSweeper's automerge lane. and removed status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR. labels May 21, 2026
@clawsweeper

clawsweeper Bot commented May 21, 2026

Copy link
Copy Markdown
Contributor

ClawSweeper PR egg

✨ Hatched: 🌱 uncommon Clockwork Patch Peep

Hatch command

Comment @clawsweeper hatch when this PR is hatchable.

Hatchability rules:

  • Merged PRs are hatchable.
  • Open PRs are hatchable when they are status: 👀 ready for maintainer look, status: 🚀 automerge armed, or labeled clawsweeper:automerge.
  • Closed unmerged PRs are hatchable only when one of those hatchable labels is still present in the durable record.

Rarity: 🌱 uncommon.
Trait: polishes edge cases.
Image traits: location proof lagoon; accessory tiny test log scroll; palette moss green and polished brass; mood calm; pose peeking out from the egg shell; shell smooth pearl shell; lighting gentle morning glow; background tiny shells and proof notes.
Share on X: post this hatch
Copy: My PR egg hatched a 🌱 uncommon Clockwork Patch Peep in ClawSweeper.

What is this egg doing here?
  • Eggs appear after the PR passes real-behavior proof. It is here for vibes, not verdicts: it does not change labels, ratings, merge decisions, or automation.
  • The shell reacts to review momentum: open follow-up work warms it up, re-review makes it wobble, and a clean final review lets it hatch.
  • Hatchability usually comes from sufficient real-behavior proof, no blocking P0/P1/P2 findings, no security attention needed, and clean correctness. A merged PR is already final, so merge makes the egg hatchable independently.
  • The hatch is seeded from this repository and PR number, so the same PR keeps the same creature; the reviewed head SHA can only change safe visual details.
  • Rarity is just collectible sparkle: 🥚 common, 🌱 uncommon, 💎 rare, ✨ glimmer, and 🌈 legendary.

@clawsweeper clawsweeper Bot removed the clawsweeper:human-review Needs maintainer review before ClawSweeper can continue label May 21, 2026
@clawsweeper clawsweeper Bot merged commit 98af517 into openclaw:main May 21, 2026
159 of 173 checks passed
@BSG2000 BSG2000 deleted the fix/bundled-channel-load-doctor-hint branch May 22, 2026 18:04
SebTardif pushed a commit to SebTardif/openclaw that referenced this pull request May 24, 2026
…aw#76974)

Summary:
- The PR adds a bundled-channel load-error formatter, wires it into the bundled-channel warning paths, adds focused tests, and updates the changelog.
- Reproducibility: yes. source-level: current main logs bundled-channel load failures with bare `formatErrorMe ... cause`. The contributor's terminal proof demonstrates the same wrapped-error shape before and after the PR.

Automerge notes:
- PR branch already contained follow-up commit before automerge: fix(channels): walk error cause chain to detect missing bundled modules
- PR branch already contained follow-up commit before automerge: docs(changelog): add Unreleased Fixes entry
- PR branch already contained follow-up commit before automerge: Merge remote-tracking branch 'origin/main' into fix/bundled-channel-l…
- PR branch already contained follow-up commit before automerge: Merge branch 'main' into fix/bundled-channel-load-doctor-hint

Validation:
- ClawSweeper review passed for head 416a8a2.
- Required merge gates passed before the squash merge.

Prepared head SHA: 416a8a2
Review: openclaw#76974 (comment)

Co-authored-by: BSG2000 <github@hsu.hamburg>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: BSG2000 <BSG2000@users.noreply.github.com>
Co-authored-by: BSG2000 <thomas.krohnfuss@stud.th-luebeck.de>
Co-authored-by: Thomas Krohnfuß <BSG2000@users.noreply.github.com>
Co-authored-by: clawsweeper[bot] <274271284+clawsweeper[bot]@users.noreply.github.com>
Approved-by: takhoffman
Co-authored-by: takhoffman <781889+takhoffman@users.noreply.github.com>
SebTardif pushed a commit to SebTardif/openclaw that referenced this pull request May 24, 2026
…aw#76974)

Summary:
- The PR adds a bundled-channel load-error formatter, wires it into the bundled-channel warning paths, adds focused tests, and updates the changelog.
- Reproducibility: yes. source-level: current main logs bundled-channel load failures with bare `formatErrorMe ... cause`. The contributor's terminal proof demonstrates the same wrapped-error shape before and after the PR.

Automerge notes:
- PR branch already contained follow-up commit before automerge: fix(channels): walk error cause chain to detect missing bundled modules
- PR branch already contained follow-up commit before automerge: docs(changelog): add Unreleased Fixes entry
- PR branch already contained follow-up commit before automerge: Merge remote-tracking branch 'origin/main' into fix/bundled-channel-l…
- PR branch already contained follow-up commit before automerge: Merge branch 'main' into fix/bundled-channel-load-doctor-hint

Validation:
- ClawSweeper review passed for head 416a8a2.
- Required merge gates passed before the squash merge.

Prepared head SHA: 416a8a2
Review: openclaw#76974 (comment)

Co-authored-by: BSG2000 <github@hsu.hamburg>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: BSG2000 <BSG2000@users.noreply.github.com>
Co-authored-by: BSG2000 <thomas.krohnfuss@stud.th-luebeck.de>
Co-authored-by: Thomas Krohnfuß <BSG2000@users.noreply.github.com>
Co-authored-by: clawsweeper[bot] <274271284+clawsweeper[bot]@users.noreply.github.com>
Approved-by: takhoffman
Co-authored-by: takhoffman <781889+takhoffman@users.noreply.github.com>
SebTardif pushed a commit to SebTardif/openclaw that referenced this pull request May 24, 2026
…aw#76974)

Summary:
- The PR adds a bundled-channel load-error formatter, wires it into the bundled-channel warning paths, adds focused tests, and updates the changelog.
- Reproducibility: yes. source-level: current main logs bundled-channel load failures with bare `formatErrorMe ... cause`. The contributor's terminal proof demonstrates the same wrapped-error shape before and after the PR.

Automerge notes:
- PR branch already contained follow-up commit before automerge: fix(channels): walk error cause chain to detect missing bundled modules
- PR branch already contained follow-up commit before automerge: docs(changelog): add Unreleased Fixes entry
- PR branch already contained follow-up commit before automerge: Merge remote-tracking branch 'origin/main' into fix/bundled-channel-l…
- PR branch already contained follow-up commit before automerge: Merge branch 'main' into fix/bundled-channel-load-doctor-hint

Validation:
- ClawSweeper review passed for head 416a8a2.
- Required merge gates passed before the squash merge.

Prepared head SHA: 416a8a2
Review: openclaw#76974 (comment)

Co-authored-by: BSG2000 <github@hsu.hamburg>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: BSG2000 <BSG2000@users.noreply.github.com>
Co-authored-by: BSG2000 <thomas.krohnfuss@stud.th-luebeck.de>
Co-authored-by: Thomas Krohnfuß <BSG2000@users.noreply.github.com>
Co-authored-by: clawsweeper[bot] <274271284+clawsweeper[bot]@users.noreply.github.com>
Approved-by: takhoffman
Co-authored-by: takhoffman <781889+takhoffman@users.noreply.github.com>
github-actions Bot pushed a commit to Desicool/openclaw that referenced this pull request May 24, 2026
…aw#76974)

Summary:
- The PR adds a bundled-channel load-error formatter, wires it into the bundled-channel warning paths, adds focused tests, and updates the changelog.
- Reproducibility: yes. source-level: current main logs bundled-channel load failures with bare `formatErrorMe ... cause`. The contributor's terminal proof demonstrates the same wrapped-error shape before and after the PR.

Automerge notes:
- PR branch already contained follow-up commit before automerge: fix(channels): walk error cause chain to detect missing bundled modules
- PR branch already contained follow-up commit before automerge: docs(changelog): add Unreleased Fixes entry
- PR branch already contained follow-up commit before automerge: Merge remote-tracking branch 'origin/main' into fix/bundled-channel-l…
- PR branch already contained follow-up commit before automerge: Merge branch 'main' into fix/bundled-channel-load-doctor-hint

Validation:
- ClawSweeper review passed for head 416a8a2.
- Required merge gates passed before the squash merge.

Prepared head SHA: 416a8a2
Review: openclaw#76974 (comment)

Co-authored-by: BSG2000 <github@hsu.hamburg>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: BSG2000 <BSG2000@users.noreply.github.com>
Co-authored-by: BSG2000 <thomas.krohnfuss@stud.th-luebeck.de>
Co-authored-by: Thomas Krohnfuß <BSG2000@users.noreply.github.com>
Co-authored-by: clawsweeper[bot] <274271284+clawsweeper[bot]@users.noreply.github.com>
Approved-by: takhoffman
Co-authored-by: takhoffman <781889+takhoffman@users.noreply.github.com>
galiniliev pushed a commit to galiniliev/openclaw that referenced this pull request May 25, 2026
…aw#76974)

Summary:
- The PR adds a bundled-channel load-error formatter, wires it into the bundled-channel warning paths, adds focused tests, and updates the changelog.
- Reproducibility: yes. source-level: current main logs bundled-channel load failures with bare `formatErrorMe ... cause`. The contributor's terminal proof demonstrates the same wrapped-error shape before and after the PR.

Automerge notes:
- PR branch already contained follow-up commit before automerge: fix(channels): walk error cause chain to detect missing bundled modules
- PR branch already contained follow-up commit before automerge: docs(changelog): add Unreleased Fixes entry
- PR branch already contained follow-up commit before automerge: Merge remote-tracking branch 'origin/main' into fix/bundled-channel-l…
- PR branch already contained follow-up commit before automerge: Merge branch 'main' into fix/bundled-channel-load-doctor-hint

Validation:
- ClawSweeper review passed for head 416a8a2.
- Required merge gates passed before the squash merge.

Prepared head SHA: 416a8a2
Review: openclaw#76974 (comment)

Co-authored-by: BSG2000 <github@hsu.hamburg>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: BSG2000 <BSG2000@users.noreply.github.com>
Co-authored-by: BSG2000 <thomas.krohnfuss@stud.th-luebeck.de>
Co-authored-by: Thomas Krohnfuß <BSG2000@users.noreply.github.com>
Co-authored-by: clawsweeper[bot] <274271284+clawsweeper[bot]@users.noreply.github.com>
Approved-by: takhoffman
Co-authored-by: takhoffman <781889+takhoffman@users.noreply.github.com>
SebTardif pushed a commit to SebTardif/openclaw that referenced this pull request May 26, 2026
…aw#76974)

Summary:
- The PR adds a bundled-channel load-error formatter, wires it into the bundled-channel warning paths, adds focused tests, and updates the changelog.
- Reproducibility: yes. source-level: current main logs bundled-channel load failures with bare `formatErrorMe ... cause`. The contributor's terminal proof demonstrates the same wrapped-error shape before and after the PR.

Automerge notes:
- PR branch already contained follow-up commit before automerge: fix(channels): walk error cause chain to detect missing bundled modules
- PR branch already contained follow-up commit before automerge: docs(changelog): add Unreleased Fixes entry
- PR branch already contained follow-up commit before automerge: Merge remote-tracking branch 'origin/main' into fix/bundled-channel-l…
- PR branch already contained follow-up commit before automerge: Merge branch 'main' into fix/bundled-channel-load-doctor-hint

Validation:
- ClawSweeper review passed for head 416a8a2.
- Required merge gates passed before the squash merge.

Prepared head SHA: 416a8a2
Review: openclaw#76974 (comment)

Co-authored-by: BSG2000 <github@hsu.hamburg>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: BSG2000 <BSG2000@users.noreply.github.com>
Co-authored-by: BSG2000 <thomas.krohnfuss@stud.th-luebeck.de>
Co-authored-by: Thomas Krohnfuß <BSG2000@users.noreply.github.com>
Co-authored-by: clawsweeper[bot] <274271284+clawsweeper[bot]@users.noreply.github.com>
Approved-by: takhoffman
Co-authored-by: takhoffman <781889+takhoffman@users.noreply.github.com>
SebTardif pushed a commit to SebTardif/openclaw that referenced this pull request May 26, 2026
…aw#76974)

Summary:
- The PR adds a bundled-channel load-error formatter, wires it into the bundled-channel warning paths, adds focused tests, and updates the changelog.
- Reproducibility: yes. source-level: current main logs bundled-channel load failures with bare `formatErrorMe ... cause`. The contributor's terminal proof demonstrates the same wrapped-error shape before and after the PR.

Automerge notes:
- PR branch already contained follow-up commit before automerge: fix(channels): walk error cause chain to detect missing bundled modules
- PR branch already contained follow-up commit before automerge: docs(changelog): add Unreleased Fixes entry
- PR branch already contained follow-up commit before automerge: Merge remote-tracking branch 'origin/main' into fix/bundled-channel-l…
- PR branch already contained follow-up commit before automerge: Merge branch 'main' into fix/bundled-channel-load-doctor-hint

Validation:
- ClawSweeper review passed for head 416a8a2.
- Required merge gates passed before the squash merge.

Prepared head SHA: 416a8a2
Review: openclaw#76974 (comment)

Co-authored-by: BSG2000 <github@hsu.hamburg>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: BSG2000 <BSG2000@users.noreply.github.com>
Co-authored-by: BSG2000 <thomas.krohnfuss@stud.th-luebeck.de>
Co-authored-by: Thomas Krohnfuß <BSG2000@users.noreply.github.com>
Co-authored-by: clawsweeper[bot] <274271284+clawsweeper[bot]@users.noreply.github.com>
Approved-by: takhoffman
Co-authored-by: takhoffman <781889+takhoffman@users.noreply.github.com>
SebTardif pushed a commit to SebTardif/openclaw that referenced this pull request May 26, 2026
…aw#76974)

Summary:
- The PR adds a bundled-channel load-error formatter, wires it into the bundled-channel warning paths, adds focused tests, and updates the changelog.
- Reproducibility: yes. source-level: current main logs bundled-channel load failures with bare `formatErrorMe ... cause`. The contributor's terminal proof demonstrates the same wrapped-error shape before and after the PR.

Automerge notes:
- PR branch already contained follow-up commit before automerge: fix(channels): walk error cause chain to detect missing bundled modules
- PR branch already contained follow-up commit before automerge: docs(changelog): add Unreleased Fixes entry
- PR branch already contained follow-up commit before automerge: Merge remote-tracking branch 'origin/main' into fix/bundled-channel-l…
- PR branch already contained follow-up commit before automerge: Merge branch 'main' into fix/bundled-channel-load-doctor-hint

Validation:
- ClawSweeper review passed for head 416a8a2.
- Required merge gates passed before the squash merge.

Prepared head SHA: 416a8a2
Review: openclaw#76974 (comment)

Co-authored-by: BSG2000 <github@hsu.hamburg>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: BSG2000 <BSG2000@users.noreply.github.com>
Co-authored-by: BSG2000 <thomas.krohnfuss@stud.th-luebeck.de>
Co-authored-by: Thomas Krohnfuß <BSG2000@users.noreply.github.com>
Co-authored-by: clawsweeper[bot] <274271284+clawsweeper[bot]@users.noreply.github.com>
Approved-by: takhoffman
Co-authored-by: takhoffman <781889+takhoffman@users.noreply.github.com>
jameslcowan pushed a commit to jameslcowan/openclaw that referenced this pull request Jun 2, 2026
…aw#76974)

Summary:
- The PR adds a bundled-channel load-error formatter, wires it into the bundled-channel warning paths, adds focused tests, and updates the changelog.
- Reproducibility: yes. source-level: current main logs bundled-channel load failures with bare `formatErrorMe ... cause`. The contributor's terminal proof demonstrates the same wrapped-error shape before and after the PR.

Automerge notes:
- PR branch already contained follow-up commit before automerge: fix(channels): walk error cause chain to detect missing bundled modules
- PR branch already contained follow-up commit before automerge: docs(changelog): add Unreleased Fixes entry
- PR branch already contained follow-up commit before automerge: Merge remote-tracking branch 'origin/main' into fix/bundled-channel-l…
- PR branch already contained follow-up commit before automerge: Merge branch 'main' into fix/bundled-channel-load-doctor-hint

Validation:
- ClawSweeper review passed for head 416a8a2.
- Required merge gates passed before the squash merge.

Prepared head SHA: 416a8a2
Review: openclaw#76974 (comment)

Co-authored-by: BSG2000 <github@hsu.hamburg>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: BSG2000 <BSG2000@users.noreply.github.com>
Co-authored-by: BSG2000 <thomas.krohnfuss@stud.th-luebeck.de>
Co-authored-by: Thomas Krohnfuß <BSG2000@users.noreply.github.com>
Co-authored-by: clawsweeper[bot] <274271284+clawsweeper[bot]@users.noreply.github.com>
Approved-by: takhoffman
Co-authored-by: takhoffman <781889+takhoffman@users.noreply.github.com>
SYU8384 pushed a commit to SYU8384/openclaw that referenced this pull request Jun 3, 2026
…aw#76974)

Summary:
- The PR adds a bundled-channel load-error formatter, wires it into the bundled-channel warning paths, adds focused tests, and updates the changelog.
- Reproducibility: yes. source-level: current main logs bundled-channel load failures with bare `formatErrorMe ... cause`. The contributor's terminal proof demonstrates the same wrapped-error shape before and after the PR.

Automerge notes:
- PR branch already contained follow-up commit before automerge: fix(channels): walk error cause chain to detect missing bundled modules
- PR branch already contained follow-up commit before automerge: docs(changelog): add Unreleased Fixes entry
- PR branch already contained follow-up commit before automerge: Merge remote-tracking branch 'origin/main' into fix/bundled-channel-l…
- PR branch already contained follow-up commit before automerge: Merge branch 'main' into fix/bundled-channel-load-doctor-hint

Validation:
- ClawSweeper review passed for head 416a8a2.
- Required merge gates passed before the squash merge.

Prepared head SHA: 416a8a2
Review: openclaw#76974 (comment)

Co-authored-by: BSG2000 <github@hsu.hamburg>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: BSG2000 <BSG2000@users.noreply.github.com>
Co-authored-by: BSG2000 <thomas.krohnfuss@stud.th-luebeck.de>
Co-authored-by: Thomas Krohnfuß <BSG2000@users.noreply.github.com>
Co-authored-by: clawsweeper[bot] <274271284+clawsweeper[bot]@users.noreply.github.com>
Approved-by: takhoffman
Co-authored-by: takhoffman <781889+takhoffman@users.noreply.github.com>
sablehead pushed a commit to sablehead/openclaw that referenced this pull request Jun 10, 2026
…aw#76974)

Summary:
- The PR adds a bundled-channel load-error formatter, wires it into the bundled-channel warning paths, adds focused tests, and updates the changelog.
- Reproducibility: yes. source-level: current main logs bundled-channel load failures with bare `formatErrorMe ... cause`. The contributor's terminal proof demonstrates the same wrapped-error shape before and after the PR.

Automerge notes:
- PR branch already contained follow-up commit before automerge: fix(channels): walk error cause chain to detect missing bundled modules
- PR branch already contained follow-up commit before automerge: docs(changelog): add Unreleased Fixes entry
- PR branch already contained follow-up commit before automerge: Merge remote-tracking branch 'origin/main' into fix/bundled-channel-l…
- PR branch already contained follow-up commit before automerge: Merge branch 'main' into fix/bundled-channel-load-doctor-hint

Validation:
- ClawSweeper review passed for head 416a8a2.
- Required merge gates passed before the squash merge.

Prepared head SHA: 416a8a2
Review: openclaw#76974 (comment)

Co-authored-by: BSG2000 <github@hsu.hamburg>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: BSG2000 <BSG2000@users.noreply.github.com>
Co-authored-by: BSG2000 <thomas.krohnfuss@stud.th-luebeck.de>
Co-authored-by: Thomas Krohnfuß <BSG2000@users.noreply.github.com>
Co-authored-by: clawsweeper[bot] <274271284+clawsweeper[bot]@users.noreply.github.com>
Approved-by: takhoffman
Co-authored-by: takhoffman <781889+takhoffman@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

clawsweeper:automerge Maintainer opted this PR into bounded ClawSweeper-reviewed automerge P3 Low-priority cleanup, docs, polish, ergonomics, or speculative work. proof: sufficient ClawSweeper judged the real behavior proof convincing. rating: 🦞 diamond lobster Very strong PR readiness with only minor maintainer review expected. size: S status: 🚀 automerge armed This PR is in ClawSweeper's automerge lane. triage: needs-real-behavior-proof Candidate: external PR needs after-fix proof from a real setup.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants