Skip to content

fix(channels): suppress verbose failed-tool dumps#84303

Closed
VACInc wants to merge 8 commits into
openclaw:mainfrom
VACInc:fix-channel-late-tool-output
Closed

fix(channels): suppress verbose failed-tool dumps#84303
VACInc wants to merge 8 commits into
openclaw:mainfrom
VACInc:fix-channel-late-tool-output

Conversation

@VACInc

@VACInc VACInc commented May 19, 2026

Copy link
Copy Markdown
Contributor

Supersedes #84178. Same branch/head, no code changes from the reviewed PR head; this replacement PR exists because the old review thread became overloaded with pasted base64 screenshot payloads.

Summary

  • Keeps failed tool calls visible as compact regular verbose progress while suppressing raw text-only failed tool output that can otherwise arrive after the final chat reply.
  • Stops Telegram and Discord progress/draft paths from accepting late text-only tool updates once final delivery has started or completed.
  • Tells the shared embedded runner to suppress terminal lastToolError fallback warnings only when regular verbose progress is visible; verbose full keeps terminal error detail available.
  • Preserves media tool results, message-tool reads, and exec approval payloads so attachment/approval flows are not hidden by the suppression.

Root Cause

Before/RCA proof:

  • Current-main source proof: src/auto-reply/reply/dispatch-from-config.ts allowed text-only failed tool results through the compact-progress suppression path because the old guard only suppressed default tool progress when deliveryPayload.isError !== true. That made failed command output special: successful text-only tool progress could be compact/suppressed, while failed text-only output could still become an extra chat message.
  • Regression trigger proof: 57da466ecbb5f63b5a1881ae8caa7359c02ec40c (Fix Discord verbose tool progress delivery (#80042), merged May 17, 2026) changed source-suppressed verbose progress from direct-chat-only to sourceReplyDeliveryMode === "message_tool_only". That correctly restored compact verbose progress in channel/message-tool flows, but it also exposed the older failed-tool isError bypass in Telegram and Discord turns.
  • Codex-app-server proof: extensions/codex/src/app-server/event-projector.ts records failed native tool output and lastToolError; src/auto-reply/reply/agent-runner-execution.ts passes reply options into the embedded runner; src/agents/pi-embedded-runner/run/payloads.ts appends a terminal fallback warning when lastToolError remains after a user-facing reply. In regular verbose, compact failed-tool progress is already visible, so that terminal fallback becomes a duplicate post-final dump.
  • Live RCA proof: a production Telegram repro on regular verbose produced compact failed tool progress, a final assistant acknowledgement, and then an extra failed-tool warning/output after the final answer. The visible behavior was not stale code and not a Telegram-only adapter problem; it came from the shared Codex/app-server embedded runner plus channel delivery gates.
  • Superseded attempt proof: a temporary payload-regex fix for concise exit 1 acknowledgements was tested and then reverted because the later live repro was a terminal lastToolError fallback, not a missing acknowledgement phrase. Final head removes that regex patch and moves the decision to dispatch, where OpenClaw knows whether compact regular verbose progress is already visible.
  • Overloaded Codex session used for proof reconstruction: 019e4086-b491-7fb1-9aa5-e27c91bdbb2c.
  • Scope proof: Telegram and Discord are the visible channel surfaces, but the correct boundary is shared dispatch/embedded runner behavior plus the Telegram/Discord final-delivery gates.

Real behavior proof

Behavior addressed: Regular verbose (verbose=on) still shows failed tools as compact progress before/finalizing the answer, but raw failed tool output and terminal failed-tool fallback warnings no longer dump to chat after the final response. verbose full remains the raw/detail mode.

Real environment tested: Tmp worktree branch fix-channel-late-tool-output at head 42fccfb3eb550e80cc46951dfc41b36912163ce3; live production gateway was updated with the PR overlay and has been running the fix. Private Telegram topic/session identifiers and credentials are not included in this public PR.

Exact steps or command run after this patch:

  • pnpm exec oxfmt --check --threads=1 <13 touched files>
  • git diff --check HEAD~2..HEAD
  • node scripts/run-vitest.mjs src/auto-reply/reply/dispatch-from-config.test.ts src/auto-reply/reply/agent-runner-execution.test.ts src/agents/pi-embedded-subscribe.subscribe-embedded-pi-session.suppresses-message-end-block-replies-message-tool.test.ts extensions/discord/src/monitor/message-handler.process.test.ts extensions/telegram/src/bot-message-dispatch.test.ts
  • codex -s danger-full-access -a never --disable plugins review --commit HEAD
  • pnpm exec oxfmt --check --threads=1 src/agents/pi-embedded-runner/run/payloads.ts src/agents/pi-embedded-runner/run/payloads.errors.test.ts (superseded regex attempt)
  • node scripts/run-vitest.mjs src/agents/pi-embedded-runner/run/payloads.errors.test.ts src/auto-reply/reply/dispatch-from-config.test.ts extensions/codex/src/app-server/event-projector.test.ts (superseded regex attempt)
  • git revert --no-edit dbe415b907821e97b280018b259068ec6919cd0e
  • pnpm exec oxfmt --check --threads=1 src/auto-reply/reply/dispatch-from-config.ts src/auto-reply/reply/dispatch-from-config.test.ts
  • git diff --check
  • node scripts/run-vitest.mjs src/auto-reply/reply/dispatch-from-config.test.ts
  • node scripts/run-vitest.mjs src/auto-reply/reply/dispatch-from-config.test.ts src/auto-reply/reply/agent-runner-execution.test.ts extensions/codex/src/app-server/event-projector.test.ts
  • oc-update --skip-codex
  • systemctl --user status openclaw-gateway --no-pager -l | sed -n '1,80p'
  • rg -n "suppressToolErrorWarnings" dist | head -20
  • openclaw health

Evidence after fix:

  • Focused 13-file format: All matched files use the correct format. Finished in 41ms on 13 files using 1 threads.
  • Focused whitespace check: git diff --check HEAD~2..HEAD produced no output.
  • Focused regression suite: Test Files 6 passed (6); Tests 400 passed (400); Duration 10.95s.
  • Codex review: completed with codex -s danger-full-access -a never --disable plugins review --commit HEAD; it found three actionable P2 regressions in the early patch. Those findings were accepted and fixed in the current branch. No later codex-review rerun was performed after maintainer instruction to stop rerunning it.
  • Superseded regex attempt proof: oxfmt passed in 7ms on 2 files, git diff --check produced no output, and Test Files 3 passed (3); Tests 235 passed (235); Duration 8.15s. This attempt was reverted by acc513bdcb because it targeted the wrong boundary.
  • Final dispatch correction proof: oxfmt passed in 19ms on 2 files; git diff --check produced no output; dispatch-from-config.test.ts passed with Test Files 1 passed (1); Tests 132 passed (132); Duration 5.50s; scoped regression rerun passed with Test Files 3 passed (3); Tests 295 passed (295); Duration 7.40s.
  • Production update proof: oc-update --skip-codex applied PR fix(channels): suppress late raw tool output #84178, built core/UI, reinstalled/restarted the gateway, and health check completed.
  • Loaded service proof: openclaw-gateway.service was active after the corrected reload, running the built gateway from the live checkout.
  • Built artifact proof: built dist contained the corrected regular-verbose suppressToolErrorWarnings handoff and passed it into resolver options.
  • Health proof after reload: openclaw health reported gateway event loop ok; Telegram and Discord were configured.
  • Before screenshot proof, converted from pasted base64 to PNG: Before: regular verbose still emitted a post-final failed-tool warning
  • After screenshot proof, converted from pasted base64 to PNG: After: regular verbose keeps compact failed-tool progress without a post-final dump
  • Screenshot review result: the before image shows compact failed-tool progress, the final assistant reply, and then a separate failed-tool warning after the final reply. The after image shows compact failed-tool progress followed by the final assistant reply with no post-final failed-tool dump.
  • New shared dispatch coverage proves compact onCommandOutput failed status still reaches the channel progress path while raw text-only failed onToolResult output is suppressed in message-tool-only regular verbose.
  • New embedded subscription coverage proves text-only tool summaries after committed message-tool delivery are suppressed.
  • New Codex projector coverage marks non-success native tool output as isError, so dispatch can apply the regular-vs-full policy correctly.
  • New Discord coverage proves the progress draft can show pre-final compact Exec state and is not updated by late failed command output after final delivery.
  • New Telegram coverage proves post-final text-only tool payloads are suppressed, media/approval payloads remain deliverable, and command-output callbacks do not restart progress drafts after the final answer.

Observed result after fix: Compact failed-tool progress remains visible before/finalizing the answer; regular verbose no longer appends raw failed tool output or terminal failed-tool warnings after the final response; verbose full still receives terminal error detail.

What was not tested: A fresh live Discord E2E posting with a real Discord account/channel was not run. The live proof path used production Telegram behavior plus focused shared/Telegram/Discord/Codex regression tests. Pre-existing local security audit warnings observed during oc-update were unrelated to this PR.

Verification

  • pnpm exec oxfmt --check --threads=1 <13 touched files>
  • git diff --check HEAD~2..HEAD
  • node scripts/run-vitest.mjs src/auto-reply/reply/dispatch-from-config.test.ts src/auto-reply/reply/agent-runner-execution.test.ts src/agents/pi-embedded-subscribe.subscribe-embedded-pi-session.suppresses-message-end-block-replies-message-tool.test.ts extensions/discord/src/monitor/message-handler.process.test.ts extensions/telegram/src/bot-message-dispatch.test.ts
  • codex -s danger-full-access -a never --disable plugins review --commit HEAD (three P2 findings accepted and fixed before final head)
  • node scripts/run-vitest.mjs src/auto-reply/reply/dispatch-from-config.test.ts
  • node scripts/run-vitest.mjs src/auto-reply/reply/dispatch-from-config.test.ts src/auto-reply/reply/agent-runner-execution.test.ts extensions/codex/src/app-server/event-projector.test.ts
  • oc-update --skip-codex
  • openclaw health

What was not tested

A fresh live Discord E2E posting with a real Discord account/channel was not run. The screenshots are Telegram proof images converted from the pasted base64 payloads, and private topic/session identifiers are intentionally omitted.

@openclaw-barnacle openclaw-barnacle Bot added docs Improvements or additions to documentation channel: discord Channel integration: discord channel: telegram Channel integration: telegram agents Agent runtime and tooling extensions: codex proof: supplied External PR includes structured after-fix real behavior proof. size: L labels May 19, 2026
@clawsweeper

clawsweeper Bot commented May 19, 2026

Copy link
Copy Markdown
Contributor

Codex review: needs maintainer review before merge.

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 branch suppresses raw text-only failed-tool progress and terminal fallback warnings after final replies in regular verbose mode for shared, Telegram, Discord, and Codex runner paths while preserving media, exec approval, and /verbose full behavior.

Reproducibility: yes. source-backed with supplied real proof: current main lets failed isError tool payloads bypass compact suppression, and the before screenshot shows a post-final failed-tool warning. I did not rerun the live Telegram or Discord scenario locally in this read-only review.

PR rating
Overall: 🐚 platinum hermit
Proof: 🦞 diamond lobster ✨ media proof bonus
Patch quality: 🐚 platinum hermit
Summary: Strong Telegram proof and broad focused tests support the fix, while the delivery-semantics risk and pending CI keep the overall rating at normal mergeable quality rather than exceptional.

Rank-up moves:

  • Let required queued CI finish on the exact head SHA.
  • Add fresh live Discord proof if maintainers want transport parity before merge.
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.

PR egg
✨ Hatched: 🌱 uncommon Mossy Merge Sprite

        .--^^^^--.           
     .-'  o    o  '-.        
    /       \__/      \      
   |    /\  ____  /\   |     
   |   /  \/____\/  \  |     
    \  \_.------._/  /       
     '._  `----'  _.'        
        '-.____.-'           
       _/|_|  |_|\_          
      /__|      |__\         
       .-----------.         
      '-------------'        

Rarity: 🌱 uncommon.
Trait: keeps receipts.
Image traits: location artifact grotto; accessory CI status badge; palette plum, gold, and soft gray; mood determined; pose holding its accessory up for inspection; shell frosted glass shell; lighting calm overcast light; background tiny artifact crates.
Share on X: post this hatch
Copy: My PR egg hatched a 🌱 uncommon Mossy Merge Sprite 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.
  • How to hatch it: reach status: 👀 ready for maintainer look or status: 🚀 automerge armed; that usually means sufficient real-behavior proof, no blocking P0/P1/P2 findings, no security attention needed, and clean correctness.
  • When the egg is hatchable, the PR author or a maintainer can comment @clawsweeper hatch to generate its image.
  • 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.

Real behavior proof
Sufficient (screenshot): The PR body includes structured after-fix real behavior proof with inspected before/after Telegram screenshots showing the post-final failed-tool dump removed; the missing fresh Discord E2E remains a merge-risk gap, not absent proof.

Mantis proof suggestion
A native Telegram Desktop proof would materially confirm the visible regular-verbose behavior at the transport layer before merge. A maintainer can ask Mantis to capture proof by posting a new PR comment that starts with the OpenClaw Mantis account mention, followed by:

telegram desktop proof: verify that regular verbose failed tools show compact progress and do not post a raw failed-tool dump after the final reply.

Risk before merge
Why this matters: - The PR intentionally changes regular /verbose on behavior so raw failed-tool detail is withheld unless /verbose full is selected; maintainers should accept that compatibility tradeoff before merge.

  • The patch gates Telegram and Discord message delivery after final-reply start, so the main merge risk is accidentally suppressing a legitimate late text-only progress message in a real transport path.
  • A fresh live Discord E2E was not supplied, and several CI checks were still queued during this review.

Maintainer options:

  1. Merge after checks and policy acceptance (recommended)
    If maintainers accept that regular verbose is compact-only for failed-tool details, wait for required CI to finish and merge with the supplied Telegram proof plus focused regression tests.
  2. Request live Discord proof
    Ask for a fresh Discord transport proof if maintainers want real-channel coverage for the Discord draft/final-delivery gate before merge.
  3. Pause if verbose-on raw detail must stay
    Pause or redirect the PR if maintainers decide existing /verbose on users must keep raw failed-tool detail without switching to /verbose full.

Next step before merge
No narrow automated repair is identified; the remaining action is maintainer review of delivery-semantics risk, proof expectations, and required CI completion.

Security
Cleared: The diff changes TypeScript delivery gates, tests, and docs only; it does not add dependencies, workflows, package metadata, permissions, secret handling, or new code-execution supply-chain surface.

Review details

Best possible solution:

Land the shared dispatch/runner/channel suppression only after maintainers accept /verbose full as the raw-detail mode and required checks or equivalent transport proof cover the changed delivery paths.

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

Yes, source-backed with supplied real proof: current main lets failed isError tool payloads bypass compact suppression, and the before screenshot shows a post-final failed-tool warning. I did not rerun the live Telegram or Discord scenario locally in this read-only review.

Is this the best way to solve the issue?

Likely yes: the PR moves the fix to the dispatch/runner/channel delivery boundary, preserves media, exec approvals, and /verbose full, and avoids the superseded payload-regex approach. The main solution-fit question is maintainer acceptance of the regular-verbose compatibility change.

Label justifications:

  • P2: This fixes a user-visible channel progress/delivery bug with limited blast radius across Telegram, Discord, and shared agent runner paths.
  • merge-risk: 🚨 compatibility: Regular /verbose on no longer includes raw failed-tool detail, which is an intentional behavior change for existing verbose users.
  • merge-risk: 🚨 message-delivery: The diff suppresses late text-only tool payloads after final delivery starts, so an overly broad gate could hide a legitimate channel progress message.

Acceptance criteria:

  • node scripts/run-vitest.mjs src/auto-reply/reply/dispatch-from-config.test.ts src/auto-reply/reply/agent-runner-execution.test.ts src/agents/pi-embedded-subscribe.subscribe-embedded-pi-session.suppresses-message-end-block-replies-message-tool.test.ts extensions/discord/src/monitor/message-handler.process.test.ts extensions/telegram/src/bot-message-dispatch.test.ts
  • node scripts/run-vitest.mjs src/auto-reply/reply/dispatch-from-config.test.ts src/auto-reply/reply/agent-runner-execution.test.ts extensions/codex/src/app-server/event-projector.test.ts
  • pnpm exec oxfmt --check --threads=1
  • git diff --check

What I checked:

Likely related people:

  • Josh Avant: Current-main blame for the central dispatch, agent-runner, Codex projector, embedded subscribe, payload, and Discord delivery ranges points to the recent final-delivery/session-refresh work. (role: recent area contributor; confidence: medium; commits: e99615973810; files: src/auto-reply/reply/dispatch-from-config.ts, src/auto-reply/reply/agent-runner-execution.ts, extensions/discord/src/monitor/message-handler.process.ts)
  • Patrick Erichsen: Git history shows the Telegram progress preview flow was recently added in the same file this PR gates after final delivery. (role: recent Telegram progress contributor; confidence: medium; commits: d60ab485114a; files: extensions/telegram/src/bot-message-dispatch.ts)
  • anyech: The linked merged Discord verbose-progress PR is the stated regression trigger that made the failed-tool bypass visible in message-tool-only channel delivery. (role: recent Discord verbose-progress contributor; confidence: medium; commits: 57da466ecbb5; files: extensions/discord/src/monitor/message-handler.process.ts, src/auto-reply/reply/dispatch-from-config.ts)

Codex review notes: model gpt-5.5, reasoning high; reviewed against 3d96111a5afe.

@clawsweeper clawsweeper Bot added proof: sufficient ClawSweeper judged the real behavior proof convincing. proof: 📸 screenshot Contributor real behavior proof includes screenshot evidence. rating: 🐚 platinum hermit Good normal PR readiness with ordinary maintainer review expected. status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR. mantis: telegram-visible-proof Mantis should capture Telegram visible proof. 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 automerge is enabled.

Draft PRs stay fix-only until GitHub marks them ready for review. Pause with /clawsweeper stop.

Automerge progress:

  • 2026-05-19 21:14:44 UTC review queued 42fccfb3eb55 (queued)

@clawsweeper

clawsweeper Bot commented May 19, 2026

Copy link
Copy Markdown
Contributor

ClawSweeper 🐠 reef update

Thanks for the work here. ClawSweeper could not write to the source branch, so it opened a replacement PR rather than letting the fix drift. attribution still points back here.

Why replacement: ClawSweeper could not update the source PR branch directly; GitHub did not grant sufficient push rights to the bot for that branch.
Replacement PR: #84354
Why close: this run explicitly closes the superseded source PR after the credited replacement PR is open, so review continues in one place.
This source PR is being closed only under the explicit source-close setting for this ClawSweeper run.
The replacement PR keeps the contributor trail visible for review and changelog credit.
Co-author credit kept:

fish notes: model gpt-5.5, reasoning high; reviewed against 4aa5c96.

@clawsweeper clawsweeper Bot closed this May 19, 2026
eleboucher pushed a commit to eleboucher/homelab that referenced this pull request May 21, 2026
…026.5.20) (#615)

This PR contains the following updates:

| Package | Update | Change |
|---|---|---|
| [ghcr.io/openclaw/openclaw](https://openclaw.ai) ([source](https://github.com/openclaw/openclaw)) | patch | `2026.5.19` → `2026.5.20` |

---

> ⚠️ **Warning**
>
> Some dependencies could not be looked up. Check the [Dependency Dashboard](issues/567) for more information.

---

### Release Notes

<details>
<summary>openclaw/openclaw (ghcr.io/openclaw/openclaw)</summary>

### [`v2026.5.20`](https://github.com/openclaw/openclaw/blob/HEAD/CHANGELOG.md#2026520)

[Compare Source](openclaw/openclaw@v2026.5.19...v2026.5.20)

##### Changes

- Exec approvals: remove the old `cat SKILL.md && printf ... && <skill-wrapper>` allowlist compatibility path so skill files must be loaded with the read tool and only the real skill executable is auto-allowed.
- Discord: let voice sessions follow configured Discord users into voice channels, with allowed-channel checks, multi-user handoff, bounded reconciliation, and DAVE recovery preservation. ([#&#8203;84264](openclaw/openclaw#84264)) Thanks [@&#8203;fuller-stack-dev](https://github.com/fuller-stack-dev).
- Discord/voice: include bounded `IDENTITY.md`, `USER.md`, and `SOUL.md` profile context in realtime voice session instructions by default, with `voice.realtime.bootstrapContextFiles: []` available to disable it. ([#&#8203;84499](openclaw/openclaw#84499)) Thanks [@&#8203;fuller-stack-dev](https://github.com/fuller-stack-dev).
- Dependencies: bump the bundled Codex harness to `@openai/codex` `0.132.0` and refresh the app-server model-list docs for the new catalog.
- CLI/policy: add the bundled Policy plugin for policy-backed channel conformance checks, doctor lint findings, and opt-in workspace repair. ([#&#8203;80407](openclaw/openclaw#80407)) Thanks [@&#8203;giodl73-repo](https://github.com/giodl73-repo).
- Agents/config: allow `agents.list[].experimental.localModelLean` so lean local-model mode can be enabled for one configured agent instead of globally.
- Providers/xAI: add device-code OAuth login so remote and headless setups can authorize xAI without a localhost browser callback. ([#&#8203;84005](openclaw/openclaw#84005)) Thanks [@&#8203;fuller-stack-dev](https://github.com/fuller-stack-dev).
- Providers/OpenRouter: honor provider-level `params.provider` routing policy for OpenRouter requests, with model and agent params overriding the defaults. Thanks [@&#8203;amknight](https://github.com/amknight).

##### Fixes

- CLI/tasks: include stale-running task maintenance decisions in `openclaw tasks maintenance --json` so retained and reconcile candidates explain backing-session, cron, CLI, and wedged-subagent state. ([#&#8203;84691](openclaw/openclaw#84691)) Thanks [@&#8203;efpiva](https://github.com/efpiva).
- Codex app-server: keep system-prompt reports working when bootstrap hooks provide workspace files with only a path and content, so hook-supplied SOUL/IDENTITY/TOOLS/USER context still reports injected characters correctly. ([#&#8203;84736](openclaw/openclaw#84736)) Thanks [@&#8203;JARVIS-Glasses](https://github.com/JARVIS-Glasses).
- Providers/MiniMax music: stop advertising `durationSeconds` control and remove prompt-injected duration hints, so `music_generate` reports MiniMax duration as an unsupported override instead of suggesting MiniMax can enforce track length. Fixes [#&#8203;84508](openclaw/openclaw#84508). Thanks [@&#8203;neeravmakwana](https://github.com/neeravmakwana).
- Doctor: warn when sandbox tool policy hides configured MCP server tools before provider requests. ([#&#8203;84699](openclaw/openclaw#84699)) Thanks [@&#8203;nxmxbbd](https://github.com/nxmxbbd).
- WhatsApp: update Baileys to `7.0.0-rc12`.
- Build: suppress per-locale `rolldown-plugin-dts:fake-js` CommonJS dts warnings emitted while bundling the intentionally-inlined `zod/v4/locales/*.d.cts` files, so `pnpm build` output stays readable after the 0.25.1 plugin bump. Thanks [@&#8203;romneyda](https://github.com/romneyda).
- CLI/nodes: route lazy plugin-registration logs to stderr for JSON-mode `openclaw nodes` commands so stdout stays parseable. ([#&#8203;84684](openclaw/openclaw#84684)) Thanks [@&#8203;TurboTheTurtle](https://github.com/TurboTheTurtle).
- Approvals: route manual `/approve` decisions through the trusted approval runtime so active exec and plugin approvals no longer look unknown or expired.
- Mac app: update the About settings copyright year to 2026. ([#&#8203;84385](openclaw/openclaw#84385)) Thanks [@&#8203;pejmanjohn](https://github.com/pejmanjohn).
- Dependencies: update `@openclaw/fs-safe` to `0.2.7` so OpenClaw's default Python-helper-off policy keeps best-effort Node write fallbacks for private stores, secret writes, run logs, and media attachments on Linux/macOS.
- Infra/secrets: restore the fail-closed contract for `tryReadSecretFileSync` so credential loaders that pass `rejectSymlink: true` (Telegram, LINE, Zalo, IRC, Nextcloud Talk tokens) refuse symlinked credential files instead of silently accepting them, and the infra-state CI shard's secret-file symlink test passes again. Thanks [@&#8203;romneyda](https://github.com/romneyda).
- Browser: honor the configured image sanitization limit for screenshots and labeled snapshots so browser-captured images follow the same resize policy as other image results. ([#&#8203;84595](openclaw/openclaw#84595))
- Doctor: remove unrecognized `models.providers.*.models[*].compat.thinkingFormat` values during `doctor --fix` so stale provider model config can validate after upgrade. Fixes [#&#8203;77803](openclaw/openclaw#77803).
- Doctor: warn when `openclaw.json` stores plaintext secret-bearing config fields, including model provider API keys and sensitive provider headers. ([#&#8203;84718](openclaw/openclaw#84718)) Thanks [@&#8203;lukaIvanic](https://github.com/lukaIvanic).
- Status: show the configured default, session-selected model, reason, clear hint, and docs link when a session remains pinned to a model that differs from `agents.defaults.model.primary`.
- WebChat: clear stale typing indicators when session change events mark the active chat run complete.
- Mac app: keep local packaging signed with a stable app identity for permission testing and fix Control UI production builds under current Vite/Highlight.js exports.
- macOS app: update the embedded Peekaboo bridge to 3.2.1 so OpenClaw-hosted UI automation works with current Peekaboo CLI capture flows.
- Cron: deliver preferred final assistant output for successful scheduled runs when trailing plain tool warnings remain in diagnostics instead of marking the run failed.
- fix(mattermost): fail closed on missing channel type \[AI]. ([#&#8203;84091](openclaw/openclaw#84091)) Thanks [@&#8203;pgondhi987](https://github.com/pgondhi987).
- Recheck rebuilt system.run argv \[AI]. ([#&#8203;84090](openclaw/openclaw#84090)) Thanks [@&#8203;pgondhi987](https://github.com/pgondhi987).
- CLI: keep the private QA subcommand out of exported command descriptors unless `OPENCLAW_ENABLE_PRIVATE_QA_CLI=1`, so root help and subcommand markers match runtime registration. ([#&#8203;84519](openclaw/openclaw#84519))
- CLI/cron: bound `openclaw cron show` job lookup pagination so non-advancing or unbounded `cron.list` responses fail instead of hanging the command. Fixes [#&#8203;83856](openclaw/openclaw#83856). ([#&#8203;83989](openclaw/openclaw#83989))
- Agents/messages: stop message-tool-only turns after a successful source-channel `message` send while keeping transcript mirrors under the session write lock. ([#&#8203;84289](openclaw/openclaw#84289))
- Agents: filter silent heartbeat response-tool transcript artifacts out of embedded context snapshots so later user turns are not polluted by heartbeat no-op messages. ([#&#8203;83477](openclaw/openclaw#83477)) Thanks [@&#8203;fuller-stack-dev](https://github.com/fuller-stack-dev).
- Agents/OpenAI: log repeated strict tool-schema downgrade diagnostics once per provider/model/tool signature, reducing duplicate debug noise while preserving `strict=false` fallback behavior. Fixes [#&#8203;82930](openclaw/openclaw#82930). ([#&#8203;82933](openclaw/openclaw#82933)) Thanks [@&#8203;galiniliev](https://github.com/galiniliev).
- Agents/code mode: spell out the `exec` tool's JavaScript/TypeScript, no Node module, and catalog-bridge constraints in model-visible schema text so agents can use enabled tools without trial-and-error. ([#&#8203;84269](openclaw/openclaw#84269)) Thanks [@&#8203;Kaspre](https://github.com/Kaspre).
- Codex: give `image_generate` dynamic-tool calls a 120s default watchdog when no per-call or configured image timeout is set, so image generation no longer falls back to the generic 30s bridge timeout. ([#&#8203;84254](openclaw/openclaw#84254)) Thanks [@&#8203;moritzmmayerhofer](https://github.com/moritzmmayerhofer).
- Codex: avoid duplicate dynamic tool terminal diagnostics while large diagnostic backlogs drain without blocking tool responses. ([#&#8203;82937](openclaw/openclaw#82937)) Thanks [@&#8203;galiniliev](https://github.com/galiniliev).
- CLI/message: include a stable top-level `messageId` in `openclaw message --json` output when channel sends return one. ([#&#8203;84191](openclaw/openclaw#84191)) Thanks [@&#8203;100menotu001](https://github.com/100menotu001).
- Cron: preserve legacy top-level array `jobs.json` stores when loading or adding scheduled jobs so old cron jobs are no longer treated as an empty store during upgrade. Fixes [#&#8203;60799](openclaw/openclaw#60799). ([#&#8203;84433](openclaw/openclaw#84433)) Thanks [@&#8203;IWhatsskill](https://github.com/IWhatsskill).
- Gateway/agents: use an agent's `identity.name` in Gateway agent summaries when `agents.list[].name` is unset, so configured agent labels remain visible in clients. ([#&#8203;84355](openclaw/openclaw#84355); refs [#&#8203;57835](openclaw/openclaw#57835)) Thanks [@&#8203;luoyanglang](https://github.com/luoyanglang).
- Channels/replies: keep normal `/verbose` failed-tool progress compact in message-tool replies and prevent late text-only tool output from appearing after the final answer. ([#&#8203;84303](openclaw/openclaw#84303)) Thanks [@&#8203;VACInc](https://github.com/VACInc).
- Plugins/hooks: apply a default 30-second timeout to `before_compaction` and `after_compaction` hooks so a hung plugin handler no longer blocks compaction completion. ([#&#8203;84153](openclaw/openclaw#84153))
- Discord: preserve disabled presentation buttons when adapting and rendering Discord message controls. ([#&#8203;84188](openclaw/openclaw#84188)) Thanks [@&#8203;100menotu001](https://github.com/100menotu001).
- Twitch: add a test-only client-manager registry reset helper so non-isolated Twitch tests can clear cached managers between cases. Fixes [#&#8203;83887](openclaw/openclaw#83887). ([#&#8203;84244](openclaw/openclaw#84244)) Thanks [@&#8203;hclsys](https://github.com/hclsys).
- Cron: run main-session scheduled work on a cron-owned wake lane while preserving reply delivery context, so background cron turns no longer block human main-session chat. Fixes [#&#8203;82766](openclaw/openclaw#82766). ([#&#8203;82767](openclaw/openclaw#82767)) Thanks [@&#8203;galiniliev](https://github.com/galiniliev).
- Cron: use structured embedded-run denial metadata for isolated scheduled tasks so blocked exec requests fail the job without treating ordinary assistant prose as a denial. ([#&#8203;84067](openclaw/openclaw#84067)) Thanks [@&#8203;abnershang](https://github.com/abnershang).
- Cron: keep recovered tool warnings diagnostic for successful scheduled runs so final cron output is delivered instead of being replaced by a post-processing warning. ([#&#8203;84045](openclaw/openclaw#84045)) Thanks [@&#8203;abnershang](https://github.com/abnershang).
- Plugins/perf: thread explicit plugin discovery results through `loadBundledCapabilityRuntimeRegistry`, `resolveBundledPluginSources`, and `listChannelCatalogEntries` so callers that already hold a discovery result skip redundant filesystem walks. Thanks [@&#8203;SebTardif](https://github.com/SebTardif).
- harden update restart script creation \[AI]. ([#&#8203;84088](openclaw/openclaw#84088)) Thanks [@&#8203;pgondhi987](https://github.com/pgondhi987).
- Docker: keep the bundled Codex plugin in official release image keep lists so the default OpenAI agent harness remains available after Docker pruning. Fixes [#&#8203;83613](openclaw/openclaw#83613). ([#&#8203;83626](openclaw/openclaw#83626)) Thanks [@&#8203;YuanHanzhong](https://github.com/YuanHanzhong).
- CLI/channels: preserve the first line of `openclaw channels logs` output when the rolling tail window starts exactly on a line boundary, mirroring the already-fixed `readLogSlice` behavior in `src/logging/log-tail.ts`.
- Control UI: treat terminal session status as authoritative over stale active-run flags so completed terminal runs stop showing abort/live UI. ([#&#8203;84057](openclaw/openclaw#84057))
- CLI: preserve embedded equals signs in inline root option values instead of truncating after the second separator. ([#&#8203;83995](openclaw/openclaw#83995)) Thanks [@&#8203;ThiagoCAltoe](https://github.com/ThiagoCAltoe).
- Matrix/config: accept `messages.queue.byChannel.matrix` queue overrides and keep queue provider schema/type keys aligned for Matrix, Google Chat, and Mattermost. Thanks [@&#8203;bdjben](https://github.com/bdjben).
- CLI: format `openclaw acp client` failures through the shared error formatter so object-shaped errors stay readable instead of printing `[object Object]`. Fixes [#&#8203;83904](openclaw/openclaw#83904). ([#&#8203;84080](openclaw/openclaw#84080))
- Providers/Ollama: default unknown-capabilities models to tool-capable so discovered native Ollama models can use tools when `/api/show` omits capabilities. ([#&#8203;84055](openclaw/openclaw#84055)) Thanks [@&#8203;dutifulbob](https://github.com/dutifulbob).
- Installer/Windows: launch `install.ps1` onboarding as an attached child process so fresh native Windows installs do not freeze visibly at `Starting setup...` or corrupt the wizard's terminal rendering.
- CLI/update: keep restart health checks working across one-version CLI/Gateway protocol skew and use the managed Gateway service Node for all follow-up commands even when the package root is unchanged, so `openclaw update` no longer silently switches the gateway to a different Node binary when multiple Node installations are present. Thanks [@&#8203;amknight](https://github.com/amknight).
- CLI/gateway: include the running Gateway version in `gateway status` JSON output, preserving existing server metadata while falling back to status RPC data for read probes. Fixes [#&#8203;56222](openclaw/openclaw#56222). Thanks [@&#8203;galiniliev](https://github.com/galiniliev).
- Memory/search: close local embedding providers when active-memory searches time out so pending local model loads and embedding contexts are aborted and released. ([#&#8203;83858](openclaw/openclaw#83858)) Thanks [@&#8203;brokemac79](https://github.com/brokemac79).
- CLI/nodes: request pending node surface approval scopes before `openclaw nodes approve` so exec-capable node approval can use admin-scoped Gateway credentials instead of failing with `missing scope: operator.admin`. ([#&#8203;84392](openclaw/openclaw#84392)) Thanks [@&#8203;joshavant](https://github.com/joshavant).
- Gateway: reject slow node event sends before outbound buffers grow unbounded and log the rejected payload diagnostic. ([#&#8203;84387](openclaw/openclaw#84387)) Thanks [@&#8203;samzong](https://github.com/samzong).
- Agents: include bounded trajectory queued-writer diagnostics in `pi-trajectory-flush` timeout warnings so flush stalls show pending writes, queued bytes, and append state. Fixes [#&#8203;82961](openclaw/openclaw#82961). ([#&#8203;82962](openclaw/openclaw#82962)) Thanks [@&#8203;galiniliev](https://github.com/galiniliev).
- Agents/subagents: recover stale completion announces by retrying unsupported transcript-wait wakes without transcript waiting and forcing a message-tool handoff when the requester run is already stale. Fixes [#&#8203;83699](openclaw/openclaw#83699). ([#&#8203;83700](openclaw/openclaw#83700)) Thanks [@&#8203;galiniliev](https://github.com/galiniliev).
- Agents/subagents: constrain wildcard subagent target allowlists to configured agents while preserving explicitly listed compatibility targets. Fixes [#&#8203;84040](openclaw/openclaw#84040). ([#&#8203;84357](openclaw/openclaw#84357)) Thanks [@&#8203;joshavant](https://github.com/joshavant).
- Providers/Anthropic: route Anthropic model refs selected with Claude CLI auth through the Claude CLI runtime so shorthand refs such as `anthropic/opus-4.7` no longer fall back to embedded Anthropic billing. Fixes [#&#8203;84222](openclaw/openclaw#84222). ([#&#8203;84374](openclaw/openclaw#84374)) Thanks [@&#8203;joshavant](https://github.com/joshavant).
- Agents: honor explicit `models.providers.<id>.timeoutSeconds` values above the default idle watchdog for cloud and self-hosted providers, so long first-token waits no longer fall back at \~120s when the provider timeout is higher. ([#&#8203;83979](openclaw/openclaw#83979)) Thanks [@&#8203;yujiawei](https://github.com/yujiawei).
- Agents/Codex: keep encrypted Responses reasoning replay provenance-bound so stale mirrored Codex transcripts drop invalid encrypted content before request assembly while preserving matching same-session replay. Fixes [#&#8203;83836](openclaw/openclaw#83836). ([#&#8203;84367](openclaw/openclaw#84367)) Thanks [@&#8203;joshavant](https://github.com/joshavant).
- Agents/subagents: skip stale embedded-run wake probes for dormant completion requesters, so late subagent completions go straight to requester-agent/direct handoff instead of producing `reason=no_active_run` queue noise. ([#&#8203;82964](openclaw/openclaw#82964)) Thanks [@&#8203;galiniliev](https://github.com/galiniliev).
- CLI: retry config snapshot reads after a transient failure so one rejected read no longer poisons later commands in the same process. ([#&#8203;83931](openclaw/openclaw#83931)) Thanks [@&#8203;honor2030](https://github.com/honor2030).
- Media: decode URL path basenames before using them as remote media fallback filenames, so files like `My%20Report.pdf` are surfaced as `My Report.pdf`. Fixes [#&#8203;84050](openclaw/openclaw#84050). ([#&#8203;84052](openclaw/openclaw#84052)) Thanks [@&#8203;jbetala7](https://github.com/jbetala7).
- WhatsApp: clarify inbound group diagnostics so observed but unregistered groups point to `channels.whatsapp.groups` without changing routing or sender authorization. ([#&#8203;83846](openclaw/openclaw#83846)) Thanks [@&#8203;neeravmakwana](https://github.com/neeravmakwana).
- WhatsApp: drain pending outbound deliveries on a 30s periodic timer in addition to the reconnect handler, so messages enqueued while the provider is already connected no longer wait for the next reconnect to send. ([#&#8203;79083](openclaw/openclaw#79083)) Thanks [@&#8203;Oviemudiaga](https://github.com/Oviemudiaga).
- CLI/TUI: include gateway plugin slash commands in TUI autocomplete, so connected sessions can suggest plugin-owned commands exposed by the running Gateway. ([#&#8203;83640](openclaw/openclaw#83640)) Thanks [@&#8203;se7en-agent](https://github.com/se7en-agent).
- Gateway/mobile: restore QR setup-code handoff of bounded operator tokens for iOS and Android onboarding while keeping admin and pairing scopes out of bootstrap. ([#&#8203;83684](openclaw/openclaw#83684)) Thanks [@&#8203;ngutman](https://github.com/ngutman).
- iOS: repair Release archive compilation for the TestFlight build. ([#&#8203;84255](openclaw/openclaw#84255)) Thanks [@&#8203;ngutman](https://github.com/ngutman).
- Agents/compaction: bound plugin-owned CLI transcript compaction with the host safety timeout so a hung context engine can no longer stall post-turn cleanup. ([#&#8203;84083](openclaw/openclaw#84083)) Thanks [@&#8203;100yenadmin](https://github.com/100yenadmin).
- Control UI/usage: truncate long context skill, tool, and file names in the usage panel while keeping the full name available on hover. ([#&#8203;42197](openclaw/openclaw#42197)) Thanks [@&#8203;Rain120](https://github.com/Rain120).
- Codex: respect explicit `models auth order set` and `config.auth.order` precedence over stale `lastGood` in `/codex account`, and show `no working credential` when every explicit-order profile is ineligible instead of marking a lower-ranked profile as active. Fixes [#&#8203;84386](openclaw/openclaw#84386). ([#&#8203;84412](openclaw/openclaw#84412)) Thanks [@&#8203;openperf](https://github.com/openperf).
- Agents: honor `messages.suppressToolErrors` for mutating tool failures so configured chat surfaces do not receive separate warning payloads. ([#&#8203;81561](openclaw/openclaw#81561)) Thanks [@&#8203;moeedahmed](https://github.com/moeedahmed).
- Agents/fallback: surface billing guidance for mixed rate-limit plus billing fallback exhaustion instead of generic failure copy. Fixes [#&#8203;79396](openclaw/openclaw#79396). ([#&#8203;79489](openclaw/openclaw#79489)) Thanks [@&#8203;aayushprsingh](https://github.com/aayushprsingh).

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about these updates again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My4xMDEuMSIsInVwZGF0ZWRJblZlciI6IjQzLjEwMS4xIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6WyJyZW5vdmF0ZS9jb250YWluZXIiLCJ0eXBlL3BhdGNoIl19-->

Reviewed-on: https://git.erwanleboucher.dev/eleboucher/homelab/pulls/615
@VACInc

VACInc commented May 28, 2026

Copy link
Copy Markdown
Contributor Author

@clawsweeper hatch

@clawsweeper

clawsweeper Bot commented May 28, 2026

Copy link
Copy Markdown
Contributor

🦞👀
ClawSweeper could not hatch this PR egg yet.

Reason: hatch requires an open pull request.

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

Labels

agents Agent runtime and tooling channel: discord Channel integration: discord channel: telegram Channel integration: telegram clawsweeper:automerge Maintainer opted this PR into bounded ClawSweeper-reviewed automerge docs Improvements or additions to documentation extensions: codex mantis: telegram-visible-proof Mantis should capture Telegram visible proof. proof: 📸 screenshot Contributor real behavior proof includes screenshot evidence. proof: sufficient ClawSweeper judged the real behavior proof convincing. proof: supplied External PR includes structured after-fix real behavior proof. rating: 🐚 platinum hermit Good normal PR readiness with ordinary maintainer review expected. size: L status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants