Skip to content

fix(telegram): serialize topic dispatch replies#85709

Merged
steipete merged 36 commits into
openclaw:mainfrom
jalehman:fix/telegram-dispatch-races-main
May 24, 2026
Merged

fix(telegram): serialize topic dispatch replies#85709
steipete merged 36 commits into
openclaw:mainfrom
jalehman:fix/telegram-dispatch-races-main

Conversation

@jalehman

Copy link
Copy Markdown
Contributor

What

Fixes Telegram forum-topic dispatch races where a user-visible turn could collide with an active reply operation and finish without a visible final response, and where recovered Telegram topic replies could lose the effective topic id before final delivery.

Why

Live Telegram testing showed a heartbeat/background turn could occupy the reply-operation lane for a topic-scoped session, then a real user message could continue without owning that operation and end silently. The same investigation found that final Telegram delivery could preserve threadId late while still carrying stale General/topic 1 facts in the message context, which is fragile before layering this with outbound context recording.

Changes

  • Serialize visible topic dispatch
  • Skip heartbeat lock collisions
  • Add abortable reply wait
  • Normalize Telegram topic context
  • Cover race regressions

Testing

  • node scripts/run-vitest.mjs src/auto-reply/reply/dispatch-from-config.test.ts src/auto-reply/reply/dispatch-from-config.acp-abort.test.ts extensions/telegram/src/bot-message-dispatch.test.ts
  • pnpm exec oxfmt --check --threads=1 extensions/telegram/src/bot-message-dispatch.test.ts extensions/telegram/src/bot-message-dispatch.ts src/auto-reply/reply/dispatch-from-config.test.ts src/auto-reply/reply/dispatch-from-config.ts
  • git diff --check

Real behavior proof

Behavior addressed: Telegram forum-topic user turns no longer continue ownerless after an active reply-operation collision, and final replies for topic-scoped turns preserve internally consistent message_thread_id facts instead of falling back to General/topic 1.

Real environment tested: Local OpenClaw worktree on fix/telegram-dispatch-races-main, based on upstream/main e0405ecc9b; regression tests model the live Telegram topic 3731 race and recovered-topic delivery shape.

Exact steps or command run after this patch: node scripts/run-vitest.mjs src/auto-reply/reply/dispatch-from-config.test.ts src/auto-reply/reply/dispatch-from-config.acp-abort.test.ts extensions/telegram/src/bot-message-dispatch.test.ts; pnpm exec oxfmt --check --threads=1 extensions/telegram/src/bot-message-dispatch.test.ts extensions/telegram/src/bot-message-dispatch.ts src/auto-reply/reply/dispatch-from-config.test.ts src/auto-reply/reply/dispatch-from-config.ts; git diff --check.

Evidence after fix: The targeted Vitest run passed 3 files / 240 tests, including the new heartbeat collision and Telegram topic-context regression coverage; formatting and diff whitespace checks passed.

Observed result after fix: User-visible Telegram topic dispatch waits for active reply operation ownership while heartbeat/background collisions skip; durable Telegram delivery receives threadId=3731 plus corrected ctxPayload.MessageThreadId=3731 and ctxPayload.TransportThreadId=3731.

What was not tested: No live Telegram Bot API send was run from this isolated main-based PR branch after the patch; live observation happened on the local gateway branch before this branch was prepared.

Refs #64810, #76920.

@openclaw-barnacle openclaw-barnacle Bot added channel: telegram Channel integration: telegram size: M maintainer Maintainer-authored PR labels May 23, 2026
@clawsweeper

clawsweeper Bot commented May 23, 2026

Copy link
Copy Markdown
Contributor

Codex review: needs real behavior proof before merge.

Latest ClawSweeper review: 2026-05-24 10:27 UTC / May 24, 2026, 6:27 AM ET.

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.

PR Surface
Source +697, Tests +956, Docs +1. Total +1654 across 24 files.

View PR surface stats
Area Files Added Removed Net
Source 12 859 162 +697
Tests 11 1042 86 +956
Docs 1 1 0 +1
Config 0 0 0 0
Generated 0 0 0 0
Other 0 0 0 0
Total 24 1902 248 +1654

Summary
This PR adds shared reply-turn admission for Telegram topic dispatch, recovers topic context for final Telegram delivery, defers busy follow-up drains, normalizes Telegram code-block HTML, and adds regression coverage plus a changelog entry.

Reproducibility: yes. at source/proof level, but not from an independent live run in this review. Current main has the active-reply-operation collision path, and the supplied live Telegram logs show the topic collision scenario; the current PR head still has a source-level timeout path that can reproduce the message-loss class for long active operations.

PR rating
Overall: 🧂 unranked krab
Proof: 🦪 silver shellfish
Patch quality: 🧂 unranked krab
Summary: The PR addresses a real high-impact bug, but current-head proof is stale and the patch still has a blocking visible-turn timeout defect.

Rank-up moves:

  • Fix the visible admission timeout/skipped-dedupe path for long active reply operations.
  • Attach current-head live Telegram proof or a Mantis artifact with private IDs, API keys, phone numbers, IPs, and non-public endpoints redacted.
  • Confirm the failing latest-head agentic-agents check is fixed or unrelated 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.

Real behavior proof
Needs stronger real behavior proof before merge: The PR has useful redacted live Telegram logs, but they were recorded on earlier heads and do not prove the current admission/queue/topic-recovery behavior after later force-pushes. After adding proof, update the PR body; ClawSweeper should re-review automatically. If it does not, the PR author or someone with repository write access can comment @clawsweeper re-review.

Mantis proof suggestion
A live Telegram lane would verify the transport-level collision, wait duration, and same-topic final delivery that unit tests cannot fully prove. 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 live: verify on current head 9a4f0e4 that a forum-topic user message sent while a long heartbeat/reply operation is active waits past 15 seconds if needed and posts the final reply in the same topic.

Risk before merge

  • A long active heartbeat or system-event reply operation can still cause a visible Telegram topic turn to time out after 15 seconds, be committed as skipped, and produce no final reply.
  • The live Telegram proof is useful but stale relative to the current head, which changed the central admission, abort, queue, and topic-recovery behavior after that proof was posted.
  • The PR changes shared reply-lane admission and follow-up drain behavior, so regressions can affect non-Telegram delivery, session state, or run availability.
  • The adjacent open topic-routing PR at fix(telegram): preserve forum topic routing #76920 still overlaps Telegram forum-topic routing and should be sequenced or reconciled before landing both.

Maintainer options:

  1. Fix visible-turn timeout before merge (recommended)
    Make user-visible admission wait until ownership is available or preserve/retry the inbound message instead of committing it as skipped after the registry default timeout.
  2. Refresh current-head Telegram proof
    Run the live Telegram forum-topic collision scenario on head 9a4f0e4 or newer and attach redacted logs or an artifact showing the final reply delivered in the same topic after waiting behind the active operation.
  3. Sequence the overlapping topic-routing work
    Have maintainers decide whether this PR lands before or after fix(telegram): preserve forum topic routing #76920 so topic fallback, recovered context, and async routing semantics do not drift.

Next step before merge
Human maintainer/contributor action is needed because the PR has a P1 code defect plus stale live proof on a protected Telegram maintainer-labeled branch.

Security
Cleared: No concrete security or supply-chain regression was found in the diff; it does not change dependencies, workflows, package resolution, secrets handling, or downloaded code execution.

Review findings

  • [P1] Do not time out visible reply admission — src/auto-reply/reply/reply-turn-admission.ts:57-59
Review details

Best possible solution:

Land the shared admission approach only after visible turns cannot be silently committed as skipped on long active operations, current-head Telegram proof shows the real topic collision path, and the overlapping topic-routing PR is sequenced.

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

Yes at source/proof level, but not from an independent live run in this review. Current main has the active-reply-operation collision path, and the supplied live Telegram logs show the topic collision scenario; the current PR head still has a source-level timeout path that can reproduce the message-loss class for long active operations.

Is this the best way to solve the issue?

No, not yet. Centralizing admission is the right direction, but the current implementation inherits a 15s wait for visible turns and then commits the inbound message as skipped, so it is not the safest fix until that path is repaired and proven live.

Label justifications:

  • P1: The PR targets and currently still risks a real Telegram topic message-loss/session-state regression affecting active user replies.
  • merge-risk: 🚨 message-delivery: The diff changes reply-lane admission and can still commit a visible user message as skipped with no final reply after a timed wait.
  • merge-risk: 🚨 session-state: The diff changes session-key admission, active session id reuse, and recovered Telegram topic context for final delivery.
  • merge-risk: 🚨 availability: The shared admission and follow-up queue changes can stall, defer, or drop turns when active reply operations do not end within the expected window.
  • rating: 🧂 unranked krab: Current PR rating is 🧂 unranked krab because proof is 🦪 silver shellfish, patch quality is 🧂 unranked krab, and The PR addresses a real high-impact bug, but current-head proof is stale and the patch still has a blocking visible-turn timeout defect.
  • status: 📣 needs proof: The PR needs real behavior proof before ClawSweeper can clear the contributor ask. Needs stronger real behavior proof before merge: The PR has useful redacted live Telegram logs, but they were recorded on earlier heads and do not prove the current admission/queue/topic-recovery behavior after later force-pushes. After adding proof, update the PR body; ClawSweeper should re-review automatically. If it does not, the PR author or someone with repository write access can comment @clawsweeper re-review.
  • mantis: telegram-visible-proof: Mantis should capture Telegram visible proof. This changes visible Telegram forum-topic reply delivery and can be demonstrated in a short live Telegram topic recording or transcript artifact.

Full review comments:

  • [P1] Do not time out visible reply admission — src/auto-reply/reply/reply-turn-admission.ts:57-59
    admitReplyTurn calls waitForIdle without a timeout, so visible turns inherit the registry's 15s default. If the active heartbeat/system operation runs longer, admission returns skipped, and finishReplyOperationBusyDispatch commits the inbound dedupe claim with queuedFinal: false; that still swallows the user's message, which is the bug this PR is meant to fix. Visible turns need to wait abortably until ownership is available or preserve/retry the inbound instead of committing it as processed.
    Confidence: 0.9

Overall correctness: patch is incorrect
Overall confidence: 0.88

What I checked:

  • Current main collision path: Current main dispatch creates a reply operation for the dispatch lane and, on ReplyRunAlreadyActiveError, borrows the active operation abort signal without owning the lane, matching the collision behavior this PR is trying to repair. (src/auto-reply/reply/dispatch-from-config.ts:921, 0a8af67c11bb)
  • PR admission timeout: The PR head's admitReplyTurn waits on replyRunRegistry.waitForIdle without passing a timeout, then returns skipped active-run when the wait reports false. (src/auto-reply/reply/reply-turn-admission.ts:57, 9a4f0e411a01)
  • Registry default timeout: The PR head's reply-run registry defaults waitForIdle to 15,000 ms, so visible admission waits are bounded even when the active Telegram/system turn is still legitimately running. (src/auto-reply/reply/reply-run-registry.ts:442, 9a4f0e411a01)
  • Skipped dispatch is committed: When admission reports busy, finishReplyOperationBusyDispatch records the message as skipped, marks idle, commits the inbound dedupe claim, and returns queuedFinal false, so a timed-out visible message is treated as processed rather than retried. (src/auto-reply/reply/dispatch-from-config.ts:1419, 9a4f0e411a01)
  • Live proof is stale for current head: The supplied live Telegram collision proof was run against earlier PR heads, while later force-pushes added the final shared admission, abort ownership, queue retry, and topic-recovery changes now present at 9a4f0e4. (9a4f0e411a01)
  • Maintainer note requires Telegram proof: The Telegram maintainer note says topic, transport, and reply-context changes need real Telegram proof, preferably a live Telegram probe over synthetic-only validation. (.agents/maintainer-notes/telegram.md:32)

Likely related people:

  • steipete: Peter Steinberger authored most later PR-head commits for centralized admission, queue retry, abort ownership, and Telegram topic recovery, and recent main history shows adjacent reply/Telegram dispatch work. (role: recent area contributor and branch follow-up owner; confidence: high; commits: b993f285f6a0, 5817a33d1996, f16698869827; files: src/auto-reply/reply/dispatch-from-config.ts, src/auto-reply/reply/reply-turn-admission.ts, src/auto-reply/reply/queue/drain.ts)
  • joshavant: Josh Avant has recent merged history in the reply abort/session ownership area that this PR extends, including reply-run registry and dispatch-session recovery work. (role: adjacent reply/session-state owner; confidence: medium; commits: 99a269f8b4f3, 0ab1449215f5; files: src/auto-reply/reply/reply-run-registry.ts, src/auto-reply/reply/dispatch-from-config.ts)

Codex review notes: model gpt-5.5, reasoning high; reviewed against 0a8af67c11bb.

@clawsweeper clawsweeper Bot added rating: 🦪 silver shellfish Thin PR readiness signal; proof, validation, or implementation needs work. status: 📣 needs proof The PR needs real behavior proof before ClawSweeper can clear the contributor ask. mantis: telegram-visible-proof Mantis should capture Telegram visible proof. P1 High-priority user-facing bug, regression, or broken workflow. merge-risk: 🚨 message-delivery 🚨 May drop, duplicate, misroute, suppress, or wrongly target messages. merge-risk: 🚨 session-state 🚨 May lose, corrupt, stale, or mis-associate session, agent, or context state. labels May 23, 2026
@clawsweeper

clawsweeper Bot commented May 23, 2026

Copy link
Copy Markdown
Contributor

ClawSweeper PR egg

🎁 Pass real behavior proof to wake the egg and unlock a hatchable treat.

Where did the egg go?
  • The egg game starts only after the PR passes the real-behavior proof check.
  • Before that, no creature or rarity is rolled. The treat waits for real proof.
  • This is still just collectible flavor: proof affects review readiness, not creature quality.

@jalehman

Copy link
Copy Markdown
Contributor Author

@openclaw-mantis telegram live: verify that a Telegram forum-topic user turn waits behind an active heartbeat/reply operation and posts the final reply in the same topic.

@jalehman

Copy link
Copy Markdown
Contributor Author

@clawsweeper re-review please

@clawsweeper

clawsweeper Bot commented May 23, 2026

Copy link
Copy Markdown
Contributor

🦞👀
ClawSweeper assist is taking a look at your question.

I queued a lightweight read-only assist pass. It will post a separate answer comment and will not edit the durable ClawSweeper review comment or trigger close, merge, repair, label, or branch changes.

Request: re-review please

@clawsweeper

clawsweeper Bot commented May 23, 2026

Copy link
Copy Markdown
Contributor

ClawSweeper assist: This asks for a full fresh correctness review, not a lightweight Q&A answer. Use @clawsweeper review to trigger the durable review flow for #85709.

Evidence:

Suggested next action: Comment @clawsweeper review after the Mantis proof lands, or wait for the proof result before requesting the fresh review.


Source: #85709 (comment)
Assist model: gpt-5.5, reasoning low.

@clawsweeper clawsweeper Bot added status: 🔁 re-review loop A fresh ClawSweeper review was explicitly requested after the latest review. and removed status: 📣 needs proof The PR needs real behavior proof before ClawSweeper can clear the contributor ask. labels May 23, 2026
@jalehman
jalehman force-pushed the fix/telegram-dispatch-races-main branch from ea2c3ab to 2cecc6a Compare May 23, 2026 14:35
@clawsweeper clawsweeper Bot added status: 📣 needs proof The PR needs real behavior proof before ClawSweeper can clear the contributor ask. and removed status: 🔁 re-review loop A fresh ClawSweeper review was explicitly requested after the latest review. labels May 23, 2026
@jalehman

Copy link
Copy Markdown
Contributor Author

Real behavior proof: Telegram topic reply-operation collision

Live proof was run against the local gateway built from PR #85709 head ea2c3ab73f2a1c1f8c31ce2a27ec6834e294eb15 (fix(telegram): satisfy dispatch race CI checks).

Scenario:

  1. Triggered a targeted heartbeat/system-event run for the Telegram forum topic session:
    agent:main:telegram:group:-1003774691294:topic:3731
  2. While that background run was active, sent a real Telegram user message in the same forum topic:
    PROOF_COLLISION_85709: reply exactly PROOF_COLLISION_DONE_85709.
  3. Verified the visible Telegram reply was not swallowed and was delivered back to topic 3731.

Evidence from /tmp/openclaw/openclaw-2026-05-23.log:

2026-05-23T14:51:14.625Z message received: channel=telegram chatId=telegram:-1003774691294:topic:3731 messageId=27861 sessionId=unknown sessionKey=agent:main:telegram:group:-1003774691294:topic:3731 source=dispatchInboundMessage

2026-05-23T14:51:14.683Z dispatch-from-config: reply operation already active for agent:main:telegram:group:-1003774691294:topic:3731; using active operation abort signal without ownership

2026-05-23T14:52:28.570Z message processed: channel=telegram chatId=telegram:-1003774691294:topic:3731 messageId=27861 sessionId=unknown sessionKey=agent:main:telegram:group:-1003774691294:topic:3731 outcome=completed duration=73944ms

2026-05-23T14:52:29.044Z telegram outbound send ok accountId=default chatId=-1003774691294 messageId=27866 operation=sendMessage deliveryKind=text threadId=3731 chunkCount=1

Why this proves the fix:

  • The real Telegram user turn used the topic-scoped session key agent:main:telegram:group:-1003774691294:topic:3731.
  • It hit the exact active reply-operation collision path (reply operation already active ... using active operation abort signal without ownership).
  • It completed instead of being skipped or swallowed (outcome=completed).
  • Its final visible reply was delivered to the same forum topic (threadId=3731).

Separate issue discovered during the proof:

2026-05-23T14:52:11.849Z telegram outbound send ok accountId=default chatId=-1003774691294 messageId=27865 operation=sendMessage deliveryKind=text chunkCount=1

That send has no threadId. It was the heartbeat/system-event response, not the visible Telegram collision reply. Because Telegram sends to a forum supergroup without message_thread_id land in the general/topic-1 thread, the heartbeat/system-event response appeared in topic 1.

This is a separate targeted heartbeat/system-event delivery bug: --session-key targeted the heartbeat run context to the topic session, but heartbeat delivery did not carry the Telegram message_thread_id. It should not be conflated with PR #85709's visible Telegram user-turn collision fix, which did deliver the visible reply to threadId=3731.

@jalehman

Copy link
Copy Markdown
Contributor Author

Real behavior proof: Telegram code blocks

Verified locally on PR #85709 head 2daa2cb640a911ab6e590b4054c8097832595d6f (fix(telegram): normalize raw code language tags).

Local branch state:

fix/telegram-dispatch-races-main
2daa2cb640 fix(telegram): normalize raw code language tags

Focused test verification:

OPENCLAW_VITEST_MAX_WORKERS=1 node scripts/test-projects.mjs extensions/telegram/src/format.test.ts extensions/telegram/src/send.test.ts --testNamePattern 'raw code language|copy buttons'

[test] starting test/vitest/vitest.extension-telegram.config.ts
Test Files  2 passed (2)
Tests       3 passed | 131 skipped (134)
[test] passed 1 Vitest shard in 7.70s

The focused tests cover:

  • markdownToTelegramHtml normalizing raw <code class="language-text">...</code> without leaking the class attribute.
  • fenced code block language rendering for Telegram native copy buttons.
  • sendMessageTelegram normalizing raw code language HTML before sending.

Live Telegram verification in the local gateway:

2026-05-23T15:36:09.867Z message received: channel=telegram chatId=telegram:-1003774691294:topic:3731 messageId=27895 sessionId=unknown sessionKey=agent:main:telegram:group:-1003774691294:topic:3731 source=dispatchInboundMessage

2026-05-23T15:36:32.154Z message processed: channel=telegram chatId=telegram:-1003774691294:topic:3731 messageId=27895 sessionId=unknown sessionKey=agent:main:telegram:group:-1003774691294:topic:3731 outcome=completed duration=22286ms

2026-05-23T15:36:32.764Z telegram outbound send ok accountId=default chatId=-1003774691294 messageId=27897 operation=sendMessage deliveryKind=text threadId=3731 chunkCount=1

Manual visible check:

  • Prompt: Send me a message with a couple of code blocks in it.
  • The gateway replied in topic 3731 with two fenced code blocks.
  • The Telegram message rendered correctly locally after the raw code language tag fix.

This verifies the code-block fix on the same local gateway/Telegram topic used for the dispatch-race proof, and confirms the final reply stayed in threadId=3731.

@steipete steipete self-assigned this May 23, 2026
@steipete
steipete force-pushed the fix/telegram-dispatch-races-main branch from 2daa2cb to 7c2969c Compare May 24, 2026 03:01
@steipete
steipete force-pushed the fix/telegram-dispatch-races-main branch from 9a4f0e4 to 3443ceb Compare May 24, 2026 10:42
@openclaw-barnacle openclaw-barnacle Bot added the scripts Repository scripts label May 24, 2026
@steipete

Copy link
Copy Markdown
Contributor

Maintainer refactor/update pushed and verified on final SHA 3443ceb950ade46ef4b5b0c320fb5d36cc86a3e1.

Behavior addressed: core reply-lane admission now owns visible reply serialization, including Telegram topic replies, deferred retry/follow-up dispatch, and abort-before-dispatch handoff. Telegram topic recovery is scoped to the current chat and now updates both transcript context and the BodyForAgent text consumed by the agent.

Real environment tested: local macOS checkout plus GitHub Actions on the final PR SHA.

Exact steps or command run after this patch:

  • CI=true OPENCLAW_VITEST_SHARD_NAME=agentic-agents OPENCLAW_TEST_PROJECTS_PARALLEL=2 pnpm exec node scripts/test-projects.mjs test/vitest/vitest.agents-core.config.ts test/vitest/vitest.agents-pi-embedded.config.ts test/vitest/vitest.agents-support.config.ts test/vitest/vitest.agents-tools.config.ts
  • pnpm test extensions/telegram/src/bot-message-dispatch.test.ts src/auto-reply/reply/agent-runner.runreplyagent.e2e.test.ts src/auto-reply/reply/followup-runner.test.ts src/auto-reply/reply/dispatch-from-config.acp-abort.test.ts src/auto-reply/reply/dispatch-from-config.test.ts src/auto-reply/reply/reply-turn-admission.test.ts
  • env -u OPENCLAW_TESTBOX -u OPENCLAW_CLOUDFLARE_ACCOUNT_ID -u OPENCLAW_R2_ACCOUNT_ID -u OPENCLAW_R2_S3_ENDPOINT pnpm check:changed
  • .agents/skills/autoreview/scripts/autoreview --mode branch --base origin/main --no-web-search --model gpt-5.4-mini --thinking low

Evidence after fix:

Observed result after fix: the old checks-node-agentic-agents unmatched explicit-target failure is green, visible reply turns wait for core lane ownership instead of continuing ownerless, and recovered Telegram topic context reaches the actual agent prompt body.

What was not tested: live Telegram network delivery was not run in this local pass; the PR is covered by mocked Telegram dispatch tests and PR CI.

@steipete
steipete merged commit 62b51a6 into openclaw:main May 24, 2026
106 of 108 checks passed
github-actions Bot pushed a commit to Desicool/openclaw that referenced this pull request May 24, 2026
* fix(telegram): serialize topic dispatch replies (clawdbot-b19)

* fix(telegram): normalize dispatch topic context

* fix(telegram): satisfy dispatch race CI checks

* fix(telegram): normalize raw code language tags

* refactor(reply): centralize turn admission

* fix(telegram): persist recovered topic routes

* fix(reply): preserve queue policy admission

* fix(reply): retain active abort owner

* fix(reply): split active abort ownership

* fix(reply): defer busy followup drains

* fix(reply): wire hook abort ownership

* fix(reply): preserve deferred queue summaries

* fix(reply): type queued summary retry

* fix(reply): abort embedded and core runs

* test(reply): keep final abort operation active

* test(reply): stabilize abort normalization test

* fix(reply): keep non-visible admission skips silent

* test(reply): avoid dispatch shard mock bleed

* fix(reply): merge deferred queue summaries

* fix(reply): abort active-lane resolver runs

* fix(reply): compose borrowed lane abort signals

* fix(reply): keep interrupt turns caller-owned

* fix(telegram): keep recovered topic history scoped

* fix(reply): retry deferred summary queues

* fix(reply): document deferred summary restore

* fix(telegram): rebuild recovered topic prompt body

* fix(reply): run admitted session ids

* fix(telegram): recover topic chat actions

* fix(reply): honor pre-dispatch aborts for handled replies

* fix(reply): guard local handled final aborts

* fix(reply): refresh admitted session files

* fix(telegram): trust final current-message marker

* fix(telegram): migrate recovered room history

* fix(telegram): scope recovered topics to current chat

* fix(reply): wait for visible reply lane ownership

* fix(telegram): pass recovered topic body to agent

---------

Co-authored-by: Peter Steinberger <[email protected]>
SebTardif pushed a commit to SebTardif/openclaw that referenced this pull request May 26, 2026
* fix(telegram): serialize topic dispatch replies (clawdbot-b19)

* fix(telegram): normalize dispatch topic context

* fix(telegram): satisfy dispatch race CI checks

* fix(telegram): normalize raw code language tags

* refactor(reply): centralize turn admission

* fix(telegram): persist recovered topic routes

* fix(reply): preserve queue policy admission

* fix(reply): retain active abort owner

* fix(reply): split active abort ownership

* fix(reply): defer busy followup drains

* fix(reply): wire hook abort ownership

* fix(reply): preserve deferred queue summaries

* fix(reply): type queued summary retry

* fix(reply): abort embedded and core runs

* test(reply): keep final abort operation active

* test(reply): stabilize abort normalization test

* fix(reply): keep non-visible admission skips silent

* test(reply): avoid dispatch shard mock bleed

* fix(reply): merge deferred queue summaries

* fix(reply): abort active-lane resolver runs

* fix(reply): compose borrowed lane abort signals

* fix(reply): keep interrupt turns caller-owned

* fix(telegram): keep recovered topic history scoped

* fix(reply): retry deferred summary queues

* fix(reply): document deferred summary restore

* fix(telegram): rebuild recovered topic prompt body

* fix(reply): run admitted session ids

* fix(telegram): recover topic chat actions

* fix(reply): honor pre-dispatch aborts for handled replies

* fix(reply): guard local handled final aborts

* fix(reply): refresh admitted session files

* fix(telegram): trust final current-message marker

* fix(telegram): migrate recovered room history

* fix(telegram): scope recovered topics to current chat

* fix(reply): wait for visible reply lane ownership

* fix(telegram): pass recovered topic body to agent

---------

Co-authored-by: Peter Steinberger <[email protected]>
SebTardif pushed a commit to SebTardif/openclaw that referenced this pull request May 26, 2026
* fix(telegram): serialize topic dispatch replies (clawdbot-b19)

* fix(telegram): normalize dispatch topic context

* fix(telegram): satisfy dispatch race CI checks

* fix(telegram): normalize raw code language tags

* refactor(reply): centralize turn admission

* fix(telegram): persist recovered topic routes

* fix(reply): preserve queue policy admission

* fix(reply): retain active abort owner

* fix(reply): split active abort ownership

* fix(reply): defer busy followup drains

* fix(reply): wire hook abort ownership

* fix(reply): preserve deferred queue summaries

* fix(reply): type queued summary retry

* fix(reply): abort embedded and core runs

* test(reply): keep final abort operation active

* test(reply): stabilize abort normalization test

* fix(reply): keep non-visible admission skips silent

* test(reply): avoid dispatch shard mock bleed

* fix(reply): merge deferred queue summaries

* fix(reply): abort active-lane resolver runs

* fix(reply): compose borrowed lane abort signals

* fix(reply): keep interrupt turns caller-owned

* fix(telegram): keep recovered topic history scoped

* fix(reply): retry deferred summary queues

* fix(reply): document deferred summary restore

* fix(telegram): rebuild recovered topic prompt body

* fix(reply): run admitted session ids

* fix(telegram): recover topic chat actions

* fix(reply): honor pre-dispatch aborts for handled replies

* fix(reply): guard local handled final aborts

* fix(reply): refresh admitted session files

* fix(telegram): trust final current-message marker

* fix(telegram): migrate recovered room history

* fix(telegram): scope recovered topics to current chat

* fix(reply): wait for visible reply lane ownership

* fix(telegram): pass recovered topic body to agent

---------

Co-authored-by: Peter Steinberger <[email protected]>
SebTardif pushed a commit to SebTardif/openclaw that referenced this pull request May 26, 2026
* fix(telegram): serialize topic dispatch replies (clawdbot-b19)

* fix(telegram): normalize dispatch topic context

* fix(telegram): satisfy dispatch race CI checks

* fix(telegram): normalize raw code language tags

* refactor(reply): centralize turn admission

* fix(telegram): persist recovered topic routes

* fix(reply): preserve queue policy admission

* fix(reply): retain active abort owner

* fix(reply): split active abort ownership

* fix(reply): defer busy followup drains

* fix(reply): wire hook abort ownership

* fix(reply): preserve deferred queue summaries

* fix(reply): type queued summary retry

* fix(reply): abort embedded and core runs

* test(reply): keep final abort operation active

* test(reply): stabilize abort normalization test

* fix(reply): keep non-visible admission skips silent

* test(reply): avoid dispatch shard mock bleed

* fix(reply): merge deferred queue summaries

* fix(reply): abort active-lane resolver runs

* fix(reply): compose borrowed lane abort signals

* fix(reply): keep interrupt turns caller-owned

* fix(telegram): keep recovered topic history scoped

* fix(reply): retry deferred summary queues

* fix(reply): document deferred summary restore

* fix(telegram): rebuild recovered topic prompt body

* fix(reply): run admitted session ids

* fix(telegram): recover topic chat actions

* fix(reply): honor pre-dispatch aborts for handled replies

* fix(reply): guard local handled final aborts

* fix(reply): refresh admitted session files

* fix(telegram): trust final current-message marker

* fix(telegram): migrate recovered room history

* fix(telegram): scope recovered topics to current chat

* fix(reply): wait for visible reply lane ownership

* fix(telegram): pass recovered topic body to agent

---------

Co-authored-by: Peter Steinberger <[email protected]>
eleboucher pushed a commit to eleboucher/homelab that referenced this pull request May 27, 2026
…026.5.26) (#682)

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.22` → `2026.5.26` |

---

> ⚠️ **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.26`](https://github.com/openclaw/openclaw/blob/HEAD/CHANGELOG.md#2026526)

[Compare Source](https://github.com/openclaw/openclaw/compare/v2026.5.22...v2026.5.26)

##### Highlights

- Faster Gateway and replies: startup avoids repeated plugin, channel, session, usage-cost, warning, scheduled-service, and filesystem scans; visible replies separate user-facing sends from slower follow-up work; Gateway runtime/session caches churn less under load.
- Transcripts are core: transcript-backed meeting summaries, source-provider chunks, cleaned user turns, media provenance, Codex mirrors, WebChat replies, and CLI/TUI replay now use one more reliable transcript path.
- More channels are production-ready: Telegram keeps typing/progress context and forum topics, iMessage handles attachment roots, remote media staging, and duplicate local Messages sources, WhatsApp restores group/media behavior, Discord improves voice playback and model picking, and Signal/iMessage/WhatsApp get reaction approvals.
- Better voice and Talk: realtime Talk runs can be inspected, steered, cancelled, or followed up from Web UI and Discord voice; wake-name handling is more tolerant without letting ambient speech trigger agents.
- Safer content boundaries: Browser snapshot reads honor SSRF policy, system-event text cannot spoof nested prompt markers, fetched file text is wrapped as external content, ClickClack inbound sender allowlists run before agent dispatch, stale device tokens are rejected, and serialized tool-call text is scrubbed from replies.
- Providers, Codex, and local models are steadier: named auth profiles, OpenAI sampling params, Codex app-server resume/timeout/usage-limit recovery, dynamic tool-schema guards, xAI usage-limit surfacing, Ollama top-p normalization, and local approval resolution reduce provider-specific dead ends.
- More reliable install/update/release paths: Alpine installs, trusted runtime fallback roots, stable update channels, Docker/package timeouts, Windows Scheduled Tasks, Windows/macOS proof lanes, Testbox/Crabbox delegation, plugin publish checks, and macOS runner bootstraps all got hardened.
- Better observability: Activity tab, gateway secret-prep traces, tool/model stream progress, explicit fast-mode status, systemd Gateway hygiene, OpenTelemetry LLM spans, release performance evidence, and richer telemetry signals make failures easier to inspect.

##### Changes

- Transcripts: add core transcript capture and source-provider support for transcript-backed meeting summaries, including the renamed Transcripts docs, CLI surface, source-provider chunks, and cleaned user-turn persistence.
- Auth: add named model login profiles and supported credential migration for Hermes, OpenCode, and Codex auth profiles, with explicit opt-out and non-interactive controls. ([#&#8203;85667](https://github.com/openclaw/openclaw/issues/85667)) Thanks [@&#8203;fuller-stack-dev](https://github.com/fuller-stack-dev).
- Diagnostics: trace gateway secret preparation, classify skill/tool usage, surface model stream progress, add OpenTelemetry LLM content spans, and expose alertable telemetry for blocked tools, failover, stale sessions, liveness, oversized payloads, and webhook ingress. ([#&#8203;83019](https://github.com/openclaw/openclaw/issues/83019), [#&#8203;80370](https://github.com/openclaw/openclaw/issues/80370), [#&#8203;86191](https://github.com/openclaw/openclaw/issues/86191))
- Channels: add Signal reaction approvals, iMessage thumb approval reactions, and WhatsApp thumb approval reaction support so mobile approval flows work without textual `/approve` commands. ([#&#8203;85894](https://github.com/openclaw/openclaw/issues/85894), [#&#8203;85952](https://github.com/openclaw/openclaw/issues/85952), [#&#8203;85477](https://github.com/openclaw/openclaw/issues/85477))
- Agents/API: forward OpenAI sampling params through the Gateway and expose estimated context-budget status for active agent runs. ([#&#8203;84094](https://github.com/openclaw/openclaw/issues/84094))
- TUI/status: queue prompts submitted while an agent is busy and show explicit fast-mode state plus richer systemd Gateway hygiene in status output. ([#&#8203;86722](https://github.com/openclaw/openclaw/issues/86722), [#&#8203;87115](https://github.com/openclaw/openclaw/issues/87115), [#&#8203;86976](https://github.com/openclaw/openclaw/issues/86976))
- Exec approvals: hide durable approval actions that are unavailable for the current prompt and keep approval runtime tokens local-only so stale prompts cannot offer misleading controls. ([#&#8203;86270](https://github.com/openclaw/openclaw/issues/86270), [#&#8203;86359](https://github.com/openclaw/openclaw/issues/86359))
- Plugin SDK: add reaction approval helpers and keep diagnostic event root exports discoverable across function-name and alias-bound module graphs. ([#&#8203;86735](https://github.com/openclaw/openclaw/issues/86735), [#&#8203;87084](https://github.com/openclaw/openclaw/issues/87084))
- Android/iOS: add the Android pair-new-gateway action and improve mobile Talk mode surfaces, including iOS realtime Talk mode and Android offline voice/gateway recovery. ([#&#8203;86798](https://github.com/openclaw/openclaw/issues/86798), [#&#8203;86355](https://github.com/openclaw/openclaw/issues/86355)) Thanks [@&#8203;ngutman](https://github.com/ngutman).
- Performance: cache plugin metadata snapshots, package realpaths, stable gateway metadata, model cost indexes, channel resolution, usage-cost indexes, and session/auth hot-path facts so common Gateway and reply paths do less rediscovery. ([#&#8203;84649](https://github.com/openclaw/openclaw/issues/84649), [#&#8203;85843](https://github.com/openclaw/openclaw/issues/85843), [#&#8203;86517](https://github.com/openclaw/openclaw/issues/86517), [#&#8203;86678](https://github.com/openclaw/openclaw/issues/86678))
- Voice: expose shared realtime turn-context tracking through the realtime voice SDK and reuse it for Discord speaker attribution and wake-name context recovery.
- Voice: reuse shared realtime output activity tracking in Google Meet command and node audio bridges, including recent-output checks for local barge-in detection.
- Voice: expose shared realtime output activity tracking through the realtime voice SDK and reuse it for Discord playback activity and barge-in decisions.
- Voice: expose shared realtime consult question matching, speakable-result extraction, and alias-aware forced-consult coordination through the realtime voice SDK, then reuse it in Gateway Talk, Voice Call, and Discord voice paths.
- Voice: share activation-name matching and consult-transcript screening through the realtime voice SDK so Discord, browser voice, and meeting surfaces can reuse one implementation.
- Cron: default `cron.maxConcurrentRuns` to 8 so scheduled automations and their isolated agent turns can make progress in parallel without explicit configuration.
- QA-Lab: add `qa coverage --match <query>` so focused proof selection can discover matching scenarios from existing metadata before running live or remote lanes.
- Discord/model picker: surface an alpha-bucket select (e.g. `A–G (12) · H–N (18) · O–Z (5)`) when the provider list or a provider's model list exceeds 25 items, so configs with `provider/*` wildcards stay one click from the right page instead of paginating through prev/next; falls back to numeric chunks when every item shares the same first letter.
- Control UI: add an ephemeral Activity tab for sanitized live tool activity summaries without persisting raw telemetry. Fixes [#&#8203;12831](https://github.com/openclaw/openclaw/issues/12831). Thanks [@&#8203;BunsDev](https://github.com/BunsDev).
- Build: include `ui:build` in the `full` and `ciArtifacts` profiles of `scripts/build-all.mjs` so `pnpm build` always rebuilds `dist/control-ui` after `tsdown` cleans `dist`, removing the second-command requirement and the missing-asset failure mode for source/runtime installs and CI artifact uploads. ([#&#8203;85206](https://github.com/openclaw/openclaw/issues/85206))
- iOS: improve Talk mode with direct realtime voice sessions, compact toolbar status, and responsive voice waveform feedback. ([#&#8203;86355](https://github.com/openclaw/openclaw/issues/86355)) Thanks [@&#8203;ngutman](https://github.com/ngutman).
- Media: replace the Sharp image backend with Rastermill for metadata, resizing, EXIF orientation, and PNG alpha-preserving optimization so OpenClaw no longer installs Sharp or the WhatsApp Jimp fallback for image processing. ([#&#8203;86437](https://github.com/openclaw/openclaw/issues/86437))
- Codex: update the bundled Codex CLI to 0.134.0 and keep native compaction disabled for budget-triggered app-server turns so OpenClaw owns the recovery boundary. ([#&#8203;86772](https://github.com/openclaw/openclaw/issues/86772))

##### Fixes

- Memory/security: reject prompt-like text submitted through the explicit `memory_store` tool before embedding or storage, matching the existing auto-capture prompt-injection filter. ([#&#8203;87142](https://github.com/openclaw/openclaw/issues/87142))

- Gateway/security: enable the default auth rate limiter for remote non-browser and HTTP gateway auth failures when `gateway.auth.rateLimit` is unset, while preserving the loopback exemption. ([#&#8203;87148](https://github.com/openclaw/openclaw/issues/87148))

- Prompt hardening: route untrusted group prompt metadata through sanitized untrusted structured context while preserving trusted operator-configured group system prompts and aligning the plugin SDK docs/test helpers. ([#&#8203;87144](https://github.com/openclaw/openclaw/issues/87144))

- Security/content boundaries: validate Browser snapshot tab URLs against SSRF policy before ChromeMCP or direct CDP reads, sanitize queued system-event text so untrusted plugin/channel labels cannot spoof nested prompt markers, wrap fetched file text and metadata as external content, apply ClickClack `allowFrom` sender allowlists before agent dispatch, reject RPCs from invalidated device-token clients during rotation, require staged sandbox media refs, and scrub serialized tool-call text from replies. ([#&#8203;78526](https://github.com/openclaw/openclaw/issues/78526), [#&#8203;87094](https://github.com/openclaw/openclaw/issues/87094), [#&#8203;87062](https://github.com/openclaw/openclaw/issues/87062), [#&#8203;83741](https://github.com/openclaw/openclaw/issues/83741), [#&#8203;70707](https://github.com/openclaw/openclaw/issues/70707), [#&#8203;86924](https://github.com/openclaw/openclaw/issues/86924)) Thanks [@&#8203;zsxsoft](https://github.com/zsxsoft), [@&#8203;ttzero25](https://github.com/ttzero25), and [@&#8203;mmaps](https://github.com/mmaps).

- Transcripts/user turns: persist CLI, WebChat, media, follow-up, hook, and Codex-mirror user turns to the admitted session target; keep cleaned transcript text, inline image routing, provenance metadata, replay hooks, and fallback paths idempotent when runtimes fail or restart.

- TUI/status/onboarding/UI: queue busy TUI prompts instead of dropping them, preserve the configured default model during onboarding, show failed tool results as errors, show config-open failures in Control UI, keep status JSON plugin scans healthy, preserve xAI usage-limit errors locally, and expose explicit fast-mode/systemd state. ([#&#8203;86722](https://github.com/openclaw/openclaw/issues/86722), [#&#8203;87000](https://github.com/openclaw/openclaw/issues/87000), [#&#8203;85786](https://github.com/openclaw/openclaw/issues/85786), [#&#8203;87108](https://github.com/openclaw/openclaw/issues/87108), [#&#8203;87001](https://github.com/openclaw/openclaw/issues/87001), [#&#8203;86614](https://github.com/openclaw/openclaw/issues/86614), [#&#8203;87115](https://github.com/openclaw/openclaw/issues/87115), [#&#8203;86976](https://github.com/openclaw/openclaw/issues/86976))

- Plugin commands/SDK: preserve plugin LLM command auth, bind native plugin command dispatch to the host agent's LLM auth, keep `onDiagnosticEvent` exports discoverable through `Function.name`, stabilize diagnostic event root aliases, correlate pathless read diagnostics, suppress transient runner failures in channel command paths, and repair local approval resolution. ([#&#8203;85936](https://github.com/openclaw/openclaw/issues/85936), [#&#8203;87084](https://github.com/openclaw/openclaw/issues/87084), [#&#8203;86977](https://github.com/openclaw/openclaw/issues/86977), [#&#8203;87069](https://github.com/openclaw/openclaw/issues/87069), [#&#8203;86771](https://github.com/openclaw/openclaw/issues/86771))

- Codex/providers: keep WebChat delivery hints out of user prompts, avoid false queued-terminal idle timeouts, share the native hook relay registry, quarantine unsupported dynamic tool schemas, preserve Claude resumed-session system prompts, normalize greedy Ollama `top_p`, preserve per-agent thinking defaults for ingress runs, and avoid native compaction takeover on budget-triggered Codex turns. ([#&#8203;87096](https://github.com/openclaw/openclaw/issues/87096), [#&#8203;73950](https://github.com/openclaw/openclaw/issues/73950), [#&#8203;87049](https://github.com/openclaw/openclaw/issues/87049), [#&#8203;86689](https://github.com/openclaw/openclaw/issues/86689), [#&#8203;86772](https://github.com/openclaw/openclaw/issues/86772))

- Gateway/perf/release: reuse startup-warning metadata and prepared auth stores, avoid cloning live-switch and lifecycle session caches on read paths, defer warning and scheduled-service fallback imports, trim Gateway session/startup/runtime CPU churn, skip duplicate turn session touches, stop chat timeout fallback cascades, drop stale subagent announce history, bound benchmark/watch/kitchen-sink teardown waits, bound macOS/package/onboarding/plugin smoke commands, bound install finalization probes, resolve Parallels npm-update commands from guest `PATH`, and bootstrap raw AWS macOS Node/pnpm commands through `/usr/bin/env`. ([#&#8203;86997](https://github.com/openclaw/openclaw/issues/86997))

- Reply/perf: reduce visible reply delivery latency by preserving Telegram typing/progress context, lazy-loading slash-command startup metadata, avoiding hot-path model hydration, flag-gating Codex profiler timing, deferring context compaction maintenance, and tracking delivery timing. ([#&#8203;86989](https://github.com/openclaw/openclaw/issues/86989), [#&#8203;86990](https://github.com/openclaw/openclaw/issues/86990), [#&#8203;86991](https://github.com/openclaw/openclaw/issues/86991), [#&#8203;86992](https://github.com/openclaw/openclaw/issues/86992), [#&#8203;86993](https://github.com/openclaw/openclaw/issues/86993), [#&#8203;86994](https://github.com/openclaw/openclaw/issues/86994)) Thanks [@&#8203;keshavbotagent](https://github.com/keshavbotagent).

- Reply/source delivery: keep TUI, Control UI, media, TTS, transcript, and Codex source-reply finals live without duplicate terminal events or stale replay artifacts.

- Agents/replay: repair legacy tool results before replay, preserve `sessions_spawn` transcript payloads, restore current guard checks, stage sandboxed workspace media, and keep duplicate transcripts tool display metadata from reappearing. ([#&#8203;82203](https://github.com/openclaw/openclaw/issues/82203), [#&#8203;86934](https://github.com/openclaw/openclaw/issues/86934), [#&#8203;87025](https://github.com/openclaw/openclaw/issues/87025)) Thanks [@&#8203;martingarramon](https://github.com/martingarramon), [@&#8203;vincentkoc](https://github.com/vincentkoc), and [@&#8203;joshavant](https://github.com/joshavant).

- Agents/sessions: handle active-fallback failures in `sessions_send` so fallback routing reports the real failure and does not leave callers with an ambiguous dropped send. ([#&#8203;86638](https://github.com/openclaw/openclaw/issues/86638))

- Agents/hooks/subagents: enforce default hook agent allowlists, recover failed subagent lifecycle completions, and keep node task lifecycle cleanup from closing the Gateway listener. ([#&#8203;86101](https://github.com/openclaw/openclaw/issues/86101))

- Codex: project newer OpenClaw chat history into resumed app-server threads and keep Codex turn timeouts inside the Codex runtime boundary so timeouts do not poison shared app-server clients or fall through to unrelated provider fallback. ([#&#8203;86677](https://github.com/openclaw/openclaw/issues/86677), [#&#8203;86476](https://github.com/openclaw/openclaw/issues/86476)) Thanks [@&#8203;TurboTheTurtle](https://github.com/TurboTheTurtle) and [@&#8203;pashpashpash](https://github.com/pashpashpash).

- Config/doctor/update: narrow profiled tool-section doctor repair, keep runtime-injected legacy web-search provider config out of user-authored config validation, and keep prerelease tags excluded from stable updater resolution. ([#&#8203;87030](https://github.com/openclaw/openclaw/issues/87030), [#&#8203;86818](https://github.com/openclaw/openclaw/issues/86818), [#&#8203;86559](https://github.com/openclaw/openclaw/issues/86559)) Thanks [@&#8203;joshavant](https://github.com/joshavant), [@&#8203;luoyanglang](https://github.com/luoyanglang), and [@&#8203;stevenepalmer](https://github.com/stevenepalmer).

- Doctor/runtime: validate active bundled MCP tool schemas through the same runtime projection path so unsupported MCP input schemas are reported and quarantined instead of poisoning assistant startup.

- CLI/Windows: add a Windows-only stack-size respawn for stack-heavy startup paths, default CLI logs to local timestamps, and validate timeout/banner TTY state more strictly. ([#&#8203;87031](https://github.com/openclaw/openclaw/issues/87031), [#&#8203;85387](https://github.com/openclaw/openclaw/issues/85387)) Thanks [@&#8203;giodl73-repo](https://github.com/giodl73-repo) and [@&#8203;vincentkoc](https://github.com/vincentkoc).

- Locking/security: require owner identity proof before stale plugin lock removal, memoize session lock owner arguments, and avoid writing default exec approval stores unless policy state actually changed. ([#&#8203;86814](https://github.com/openclaw/openclaw/issues/86814), [#&#8203;86964](https://github.com/openclaw/openclaw/issues/86964)) Thanks [@&#8203;Alix-007](https://github.com/Alix-007) and [@&#8203;vincentkoc](https://github.com/vincentkoc).

- Install/release: bound Docker package build, inventory, pack, and tarball preparation with process-group timeouts; pin shrinkwrap patch drift to the pnpm lock; harden macOS restart and dSYM packaging; and run release Docker/live timeout wrappers in the foreground so child processes cannot wedge gates.

- QA/Telegram: bound Telegram user credential tar and broker calls so live proof setup fails with a timeout instead of waiting for the outer Crabbox job deadline.

- QA/Tool Search: bound gateway E2E HTTP probes, run only the fixture plugin, and clean up temporary fixture trees after the compact tool-catalog proof completes.

- Telegram/network: treat `ENETDOWN` as a transient pre-connect network failure so Telegram sends, gateway unhandled-rejection handling, and cron network retries follow the same recovery path as sibling network outages. ([#&#8203;86762](https://github.com/openclaw/openclaw/issues/86762)) Thanks [@&#8203;TurboTheTurtle](https://github.com/TurboTheTurtle).

- Telegram: preserve inbound text entities, overlapping DM replies, account topic cache sidecars, outbound reply context, targeted bot-command mentions, durable group retry targets, forum topic names, and native progress callbacks. ([#&#8203;83873](https://github.com/openclaw/openclaw/issues/83873), [#&#8203;85361](https://github.com/openclaw/openclaw/issues/85361), [#&#8203;85555](https://github.com/openclaw/openclaw/issues/85555), [#&#8203;85656](https://github.com/openclaw/openclaw/issues/85656), [#&#8203;85709](https://github.com/openclaw/openclaw/issues/85709), [#&#8203;86299](https://github.com/openclaw/openclaw/issues/86299), [#&#8203;86553](https://github.com/openclaw/openclaw/issues/86553)) Thanks [@&#8203;SebTardif](https://github.com/SebTardif), [@&#8203;luoyanglang](https://github.com/luoyanglang), and [@&#8203;neeravmakwana](https://github.com/neeravmakwana).

- iMessage: read image attachments from local Messages attachment roots, dedupe duplicate local Messages-source accounts, seed direct DM history, fix image/group media attachment commands, advance catchup cursors after live handling, and keep slash-command acknowledgements in the source conversation. ([#&#8203;82642](https://github.com/openclaw/openclaw/issues/82642), [#&#8203;85475](https://github.com/openclaw/openclaw/issues/85475), [#&#8203;86569](https://github.com/openclaw/openclaw/issues/86569), [#&#8203;86705](https://github.com/openclaw/openclaw/issues/86705), [#&#8203;86706](https://github.com/openclaw/openclaw/issues/86706), [#&#8203;86770](https://github.com/openclaw/openclaw/issues/86770)) Thanks [@&#8203;homer-byte](https://github.com/homer-byte), [@&#8203;TurboTheTurtle](https://github.com/TurboTheTurtle), [@&#8203;swang430](https://github.com/swang430), and [@&#8203;OmarShahine](https://github.com/OmarShahine).

- WhatsApp/QQ/Twitch/IRC/Slack: restore WhatsApp ack identity and group-drop warnings, make QQ Bot media respect `OPENCLAW_HOME`, serialize Twitch auth disconnects, store IRC channel routes canonically, and keep Slack downloaded files out of reply media. ([#&#8203;83833](https://github.com/openclaw/openclaw/issues/83833), [#&#8203;85309](https://github.com/openclaw/openclaw/issues/85309), [#&#8203;85777](https://github.com/openclaw/openclaw/issues/85777), [#&#8203;85794](https://github.com/openclaw/openclaw/issues/85794), [#&#8203;85906](https://github.com/openclaw/openclaw/issues/85906), [#&#8203;86318](https://github.com/openclaw/openclaw/issues/86318), [#&#8203;86697](https://github.com/openclaw/openclaw/issues/86697)) Thanks [@&#8203;sliverp](https://github.com/sliverp), [@&#8203;neeravmakwana](https://github.com/neeravmakwana), and [@&#8203;Kailigithub](https://github.com/Kailigithub).

- Discord/voice: improve voice playback and wake replies, bucket large model picker menus, merge media captions into one message, route metadata through configured proxies, restore numeric channel sends, suppress self-reply echoes, and tighten wake matching without breaking fuzzy wake phrases. ([#&#8203;80227](https://github.com/openclaw/openclaw/issues/80227), [#&#8203;86238](https://github.com/openclaw/openclaw/issues/86238), [#&#8203;86487](https://github.com/openclaw/openclaw/issues/86487), [#&#8203;86571](https://github.com/openclaw/openclaw/issues/86571), [#&#8203;86595](https://github.com/openclaw/openclaw/issues/86595), [#&#8203;86601](https://github.com/openclaw/openclaw/issues/86601))

- Codex: preserve native web-search metadata, keep oversized native thread reuse, bridge CLI API-key auth into the app server, preserve sandbox bootstrap path style, recover context-window prompt errors, honor yolo approval policy, disable native thread personality, and route compaction through Codex auth. ([#&#8203;85378](https://github.com/openclaw/openclaw/issues/85378), [#&#8203;85542](https://github.com/openclaw/openclaw/issues/85542), [#&#8203;85891](https://github.com/openclaw/openclaw/issues/85891), [#&#8203;85909](https://github.com/openclaw/openclaw/issues/85909), [#&#8203;86408](https://github.com/openclaw/openclaw/issues/86408))

- Agents/runtime: enforce session lock max-hold reclaim, release embedded-attempt locks on all exits, treat aborted subagent runs as terminal, avoid runtime model hydration on hot paths, disclose scoped session list counts, derive overflow budgets from provider errors, and keep fallback errors scoped to the active model candidate. ([#&#8203;70473](https://github.com/openclaw/openclaw/issues/70473), [#&#8203;85764](https://github.com/openclaw/openclaw/issues/85764), [#&#8203;86014](https://github.com/openclaw/openclaw/issues/86014), [#&#8203;86134](https://github.com/openclaw/openclaw/issues/86134), [#&#8203;86427](https://github.com/openclaw/openclaw/issues/86427), [#&#8203;86944](https://github.com/openclaw/openclaw/issues/86944)) Thanks [@&#8203;openperf](https://github.com/openperf), [@&#8203;fuller-stack-dev](https://github.com/fuller-stack-dev), [@&#8203;zhangguiping-xydt](https://github.com/zhangguiping-xydt), and [@&#8203;ferminquant](https://github.com/ferminquant).

- Config/update/doctor: retry config recovery after failed backup restore, skip shell env fallback on Windows, exclude prerelease tags from the stable git channel, support deep config edits, warn instead of aborting on unreadable cron stores, prune stale bundled plugin paths, and avoid duplicate restart prompts when the Gateway is already healthy. ([#&#8203;85739](https://github.com/openclaw/openclaw/issues/85739), [#&#8203;85787](https://github.com/openclaw/openclaw/issues/85787), [#&#8203;86060](https://github.com/openclaw/openclaw/issues/86060), [#&#8203;86260](https://github.com/openclaw/openclaw/issues/86260), [#&#8203;86384](https://github.com/openclaw/openclaw/issues/86384), [#&#8203;86533](https://github.com/openclaw/openclaw/issues/86533)) Thanks [@&#8203;liaoyl830](https://github.com/liaoyl830).

- Install/release: support Alpine CLI installs and runtime floors, prefer trusted startup argv runtime fallback roots, reject stale CLI node runtimes, avoid npm `min-release-age` installer failures, bound npm/package/Docker install phases, restore config parent ownership in Docker, seed Docker lockfile package tarballs before prune, make release/plugin prerelease checks fail closed instead of hanging or false-greening, and use host-visible Crabbox local work roots for Docker-backed proof. ([#&#8203;85491](https://github.com/openclaw/openclaw/issues/85491))

- Windows daemon: keep Scheduled Task gateway launches running on battery power and avoid workgroup-machine prompts for a domain user during task installation. ([#&#8203;59299](https://github.com/openclaw/openclaw/issues/59299))

- Security: avoid printing Gateway tokens in Docker, validate plugin model-pattern regexes safely, escape transcript metadata field names, harden session allowlist glob matching, audit Claude permission overrides under YOLO, and require explicit allow for ACP auto approvals. ([#&#8203;85849](https://github.com/openclaw/openclaw/issues/85849), [#&#8203;85934](https://github.com/openclaw/openclaw/issues/85934), [#&#8203;86046](https://github.com/openclaw/openclaw/issues/86046), [#&#8203;86557](https://github.com/openclaw/openclaw/issues/86557))

- Media/images: replace Sharp with Rastermill, keep EXIF normalization best-effort, normalize HEIC/HEIF before image descriptions, route Codex image API keys through OpenAI, preserve image compression metadata, and auto-scale live tool result caps. ([#&#8203;85776](https://github.com/openclaw/openclaw/issues/85776), [#&#8203;86037](https://github.com/openclaw/openclaw/issues/86037), [#&#8203;86437](https://github.com/openclaw/openclaw/issues/86437), [#&#8203;86857](https://github.com/openclaw/openclaw/issues/86857), [#&#8203;86923](https://github.com/openclaw/openclaw/issues/86923))

- Memory: prevent semantic vector indexes from silently degrading when embeddings are unavailable, stop doctor OOMs on large session stores, preserve sidecar hooks/artifacts, write fallback dream diaries, use CJK-aware dreaming dedupe, and avoid per-file watcher FD fan-out. ([#&#8203;80613](https://github.com/openclaw/openclaw/issues/80613), [#&#8203;82928](https://github.com/openclaw/openclaw/issues/82928), [#&#8203;85060](https://github.com/openclaw/openclaw/issues/85060), [#&#8203;85704](https://github.com/openclaw/openclaw/issues/85704), [#&#8203;85967](https://github.com/openclaw/openclaw/issues/85967), [#&#8203;86701](https://github.com/openclaw/openclaw/issues/86701)) Thanks [@&#8203;brokemac79](https://github.com/brokemac79), [@&#8203;openperf](https://github.com/openperf), and [@&#8203;yaaboo-gif](https://github.com/yaaboo-gif).

- Agents/sessions: include visibility metadata on restricted `sessions_list` results so scoped counts are clearly reported without widening access or exposing hidden-session counts. ([#&#8203;86944](https://github.com/openclaw/openclaw/issues/86944)) Thanks [@&#8203;ferminquant](https://github.com/ferminquant).

- Gateway/DNS: validate wide-area discovery domains before deriving zone paths or writing zone files, so invalid `discovery.wideArea.domain` and `dns setup --domain` values fail with a DNS-name diagnostic instead of falling through to unrelated configuration errors. Thanks [@&#8203;mmaps](https://github.com/mmaps).

- Agents/BTW: route fallback side-question streams through the embedded stream resolver so Anthropic-compatible MiniMax requests use the same capped transport as normal chat. ([#&#8203;86312](https://github.com/openclaw/openclaw/issues/86312)) Thanks [@&#8203;neeravmakwana](https://github.com/neeravmakwana).

- Telegram: treat `/command@TargetBot` bot-command entities as explicit mentions for the addressed bot so `requireMention` groups no longer drop targeted commands or captions. Fixes [#&#8203;84462](https://github.com/openclaw/openclaw/issues/84462). ([#&#8203;86553](https://github.com/openclaw/openclaw/issues/86553)) Thanks [@&#8203;luoyanglang](https://github.com/luoyanglang).

- CI: bound Docker/Bash E2E tarball npm installs with `OPENCLAW_E2E_NPM_INSTALL_TIMEOUT` so package, onboarding, plugin, and upgrade lanes fail instead of hanging on a stuck npm install.

- CI: fail Parallels npm-update smoke jobs after the guest command timeout and cleanup backstop instead of only logging a timeout line.

- CI: bound kitchen-sink RPC HTTP probes so stalled gateway readiness or response bodies fail and retry instead of wedging the walker.

- CI: bound Telegram user Crabbox proof Bot API calls so stalled Telegram responses fail instead of wedging credential and desktop proof cleanup.

- CI: bound MCP channel stdio client initialization so Docker channel proof fails and closes the bridge transport instead of waiting for the outer job timeout.

- CI: keep `OPENCLAW_TESTBOX=1 pnpm check:changed` delegating to Blacksmith Testbox through Crabbox without forwarding local Testbox or worker env into the remote command.

- CI: send KILL after the TERM grace period for manual checkout fetch timeouts so stuck Testbox and workflow checkout retries cannot hang behind a wedged `git fetch`.

- CI: send KILL after the TERM grace period for Bun global install smoke command timeouts so trapped `openclaw` child processes cannot wedge the scheduled install smoke.

- iMessage: thread current channel/account inbound attachment roots into the image tool so iMessage-saved attachments under `~/Library/Messages/Attachments` (including the wildcard `/Users/*/Library/Messages/Attachments` root) are read through the existing inbound path policy instead of being rejected as `path-not-allowed`. Literal `localRoots` stays workspace-scoped. Fixes [#&#8203;30170](https://github.com/openclaw/openclaw/issues/30170). ([#&#8203;86569](https://github.com/openclaw/openclaw/issues/86569))

- QQ Bot: respect `OPENCLAW_HOME` for outbound media path resolution so `<qqmedia>` sends no longer silently fail when `HOME` and `OPENCLAW_HOME` differ (Docker / multi-user hosts). Persisted QQ Bot data (sessions, known users, refs) stays anchored on the OS home for upgrade compatibility. Fixes [#&#8203;83562](https://github.com/openclaw/openclaw/issues/83562). Thanks [@&#8203;sliverp](https://github.com/sliverp).

- Update: report the primary malformed `openclaw.extensions` payload error without adding a duplicate missing-main diagnostic. ([#&#8203;86596](https://github.com/openclaw/openclaw/issues/86596)) Thanks [@&#8203;ferminquant](https://github.com/ferminquant).

- Control UI: keep host-local Markdown file paths inert while preserving app-relative links. ([#&#8203;86620](https://github.com/openclaw/openclaw/issues/86620)) Thanks [@&#8203;BryanTegomoh](https://github.com/BryanTegomoh).

- Gateway: dampen repeated unauthenticated device-required probes per URL while preserving explicit-auth and paired recovery paths. ([#&#8203;86575](https://github.com/openclaw/openclaw/issues/86575)) Thanks [@&#8203;ferminquant](https://github.com/ferminquant).

- IRC: store inbound channel routes with the canonical `channel:#name` target and join transient channel sends before writing. ([#&#8203;85906](https://github.com/openclaw/openclaw/issues/85906)) Thanks [@&#8203;Kailigithub](https://github.com/Kailigithub).

- Usage: surface unknown all-zero model pricing as missing cost entries instead of a confident `$0` total. ([#&#8203;85882](https://github.com/openclaw/openclaw/issues/85882)) Thanks [@&#8203;MichaelZelbel](https://github.com/MichaelZelbel).

- Agents/Codex: honor yolo app-server approval policy only for the full `never` plus `danger-full-access` case. ([#&#8203;85909](https://github.com/openclaw/openclaw/issues/85909)) Thanks [@&#8203;earlvanze](https://github.com/earlvanze).

- Gateway/Gmail: clear Gmail watcher renewal intervals on re-entry so hot reloads do not leak lifecycle timers. ([#&#8203;82947](https://github.com/openclaw/openclaw/issues/82947)) Thanks [@&#8203;SebTardif](https://github.com/SebTardif).

- Logging: exit cleanly on broken stdout/stderr pipes without masking existing failure exit codes. ([#&#8203;80059](https://github.com/openclaw/openclaw/issues/80059)) Thanks [@&#8203;pavelzak](https://github.com/pavelzak).

- Gateway/security: escape transcript metadata field names while extracting oversized session line prefixes. ([#&#8203;85934](https://github.com/openclaw/openclaw/issues/85934)) Thanks [@&#8203;SebTardif](https://github.com/SebTardif).

- Plugins/security: validate manifest model pattern regexes with the safe-regex compiler so unsafe patterns are ignored before matching. ([#&#8203;86046](https://github.com/openclaw/openclaw/issues/86046)) Thanks [@&#8203;SebTardif](https://github.com/SebTardif).

- Discord: route gateway metadata REST lookups through the configured Discord proxy so proxied accounts do not fall back to direct `discord.com` connections before opening the WebSocket. Fixes [#&#8203;80227](https://github.com/openclaw/openclaw/issues/80227). Thanks [@&#8203;Clivilwalker](https://github.com/Clivilwalker).

- Agents/media: hydrate current-turn image attachments from filename-derived MIME types so active vision can see generated or forwarded images whose source omitted an image content type. ([#&#8203;84812](https://github.com/openclaw/openclaw/issues/84812)) Thanks [@&#8203;marchpure](https://github.com/marchpure).

- Agents/fs: point workspace-only scratch-path guidance at in-workspace temp directories while keeping host-root writes rejected by the tool guard. ([#&#8203;86501](https://github.com/openclaw/openclaw/issues/86501)) Thanks [@&#8203;tianxiaochannel-oss88](https://github.com/tianxiaochannel-oss88).

- Agents/media: keep async cron media completions scoped to their run session while preserving direct delivery for stale generated-media success and failure notifications. ([#&#8203;86529](https://github.com/openclaw/openclaw/issues/86529)) Thanks [@&#8203;ai-hpc](https://github.com/ai-hpc).

- Gateway: emit plugin `session_end`/`session_start` hooks when `agent.send` rotates or replaces a session id, keeping hook lifecycle state aligned with `sessions.changed` notifications. Fixes [#&#8203;83507](https://github.com/openclaw/openclaw/issues/83507). ([#&#8203;85875](https://github.com/openclaw/openclaw/issues/85875)) Thanks [@&#8203;brokemac79](https://github.com/brokemac79).

- OpenShell/SSH: reject malformed generated exec commands before sandbox/session setup so unresolved workflow placeholders fail fast instead of reaching the remote shell. Fixes [#&#8203;72373](https://github.com/openclaw/openclaw/issues/72373). Thanks [@&#8203;brokemac79](https://github.com/brokemac79).

- Google: stop normalizing `gemini-3.1-flash-lite` to the retired preview endpoint and update Flash Lite alias guidance to the GA model id. Fixes [#&#8203;86151](https://github.com/openclaw/openclaw/issues/86151). ([#&#8203;86240](https://github.com/openclaw/openclaw/issues/86240)) Thanks [@&#8203;SebTardif](https://github.com/SebTardif).

- Installer: make Alpine apk installs cover Git, verify the Node runtime floor, try `nodejs-current`, and report Alpine version guidance when repositories only provide older Node packages.

- Agents/status: prefer the active Claude CLI OAuth auth label over an unused Anthropic env API-key label for equivalent runtime aliases. Fixes [#&#8203;80184](https://github.com/openclaw/openclaw/issues/80184). ([#&#8203;86570](https://github.com/openclaw/openclaw/issues/86570)) Thanks [@&#8203;brokemac79](https://github.com/brokemac79).

- Agents/media: send direct fallback for generated media still missing after an active requester wake fails. ([#&#8203;85489](https://github.com/openclaw/openclaw/issues/85489)) Thanks [@&#8203;fuller-stack-dev](https://github.com/fuller-stack-dev).

- Agents: derive overflow compaction budgets from provider-reported and synthetic over-budget token counts so confirmed context overflows compact before retrying. ([#&#8203;70473](https://github.com/openclaw/openclaw/issues/70473)) Thanks [@&#8203;fuller-stack-dev](https://github.com/fuller-stack-dev).

- Agents/Codex: recover Codex context-window prompt errors through overflow compaction and surface reset guidance when recovery is exhausted. ([#&#8203;85542](https://github.com/openclaw/openclaw/issues/85542)) Thanks [@&#8203;fuller-stack-dev](https://github.com/fuller-stack-dev).

- Agents/Codex: allow Codex app-server runs to bootstrap from `CODEX_API_KEY` or `OPENAI_API_KEY` when no Codex auth profile is configured.

- Agents/Codex: keep selected Codex runtime routing on OpenAI-Codex while preserving direct OpenAI API-key compaction fallback. ([#&#8203;86408](https://github.com/openclaw/openclaw/issues/86408)) Thanks [@&#8203;funmerlin](https://github.com/funmerlin) and [@&#8203;VACInc](https://github.com/VACInc).

- Agent transcript: include OpenClaw agent session logs when finding local transcript candidates.

- Crabbox: bootstrap raw AWS macOS shell commands wrapped in absolute `time` paths so RSS probes can run Node and pnpm on fresh macOS runners.

- Crabbox: bootstrap raw AWS macOS shell commands even when setup statements precede Node or pnpm usage.

- TUI/local: skip unnecessary secret resolution, gateway model catalog loading, bootstrap, and skill scans in explicit local-model runs so startup reaches the model request faster.

- Sessions/doctor: load large session stores without clone amplification during read-only doctor checks and reclaim stale `sessions.json.*.tmp` sidecars. Fixes [#&#8203;56827](https://github.com/openclaw/openclaw/issues/56827). Thanks [@&#8203;openperf](https://github.com/openperf).

- Tests: clean successful plugin gateway gauntlet isolated temp roots while keeping an explicit preservation switch for failed/debug runs.

- Plugins/perf: reuse derived plugin metadata snapshots for the lifetime of the process so reply-time skill setup no longer rescans plugin metadata on every turn.

- Discord/OpenAI voice: keep wake-name master consults using the current speaker context after ignored ambient transcripts and shorten the default capture silence grace.

- Doctor: skip redundant Gateway restart prompts when a recent supervisor restart leaves the Gateway healthy. Fixes [#&#8203;86518](https://github.com/openclaw/openclaw/issues/86518). ([#&#8203;86533](https://github.com/openclaw/openclaw/issues/86533)) Thanks [@&#8203;liaoyl830](https://github.com/liaoyl830).

- Cron: restore suspended cron lanes to the configured/default concurrency instead of falling back to one after quota or circuit-breaker auto-resume.

- Gateway: keep session-only Control UI tool-start mirrors flowing during diagnostic queue pressure instead of silently dropping non-terminal tool updates.

- Agents/memory: return optional not-found context for missing date-only daily memory reads instead of logging benign first-run `ENOENT` failures. Fixes [#&#8203;82928](https://github.com/openclaw/openclaw/issues/82928). Thanks [@&#8203;galiniliev](https://github.com/galiniliev).

- Discord: merge streamed text captions into following media block replies so captions and attachments send as one message. ([#&#8203;86487](https://github.com/openclaw/openclaw/issues/86487)) Thanks [@&#8203;neeravmakwana](https://github.com/neeravmakwana).

- Gateway: avoid sending duplicate tool-event frames to Control UI connections that are subscribed by both run and session.

- Discord/OpenAI voice: accept broader edge-position fuzzy wake-name transcripts while keeping ambient speech gated.

- Discord/OpenAI voice: accept longer leading wake-name mistranscripts such as "Open Club" for OpenClaw.

- Agents/OpenAI-compatible: stop ModelStudio-compatible chat requests before sending system/tool-only payloads that have no usable user or assistant turn. ([#&#8203;86177](https://github.com/openclaw/openclaw/issues/86177)) Thanks [@&#8203;TurboTheTurtle](https://github.com/TurboTheTurtle).

- Gateway/plugins: reuse plugin package realpath checks while building installed plugin indexes so startup avoids repeated filesystem resolution work.

- Kilo Gateway: send string `stop` sequences as arrays so Kilo accepts OpenAI-compatible chat completions. ([#&#8203;86461](https://github.com/openclaw/openclaw/issues/86461)) Thanks [@&#8203;SebTardif](https://github.com/SebTardif).

- Discord/OpenAI voice: accept leading fuzzy wake-name transcripts such as "Monty" or "Moti" for a Molty agent while keeping ambient speech gated.

- Media understanding: convert HEIC and HEIF images to JPEG before image description providers run so iPhone photos work in direct and configured image-description flows. ([#&#8203;86037](https://github.com/openclaw/openclaw/issues/86037))

- Agents: release embedded-attempt session locks from outer teardown so post-prompt exceptions cannot wedge later requests behind `SessionWriteLockTimeoutError`. Fixes [#&#8203;86014](https://github.com/openclaw/openclaw/issues/86014). Thanks [@&#8203;openperf](https://github.com/openperf).

- Discord/OpenAI voice: rotate Realtime sessions at provider max duration without logging the expected session-expiry event as an error.

- Sessions: skip metadata-only entries during QMD-slugified session lookup so one incomplete row does not block transcript hit resolution. ([#&#8203;86327](https://github.com/openclaw/openclaw/issues/86327)) Thanks [@&#8203;abnershang](https://github.com/abnershang).

- Agents/media: derive bundled plugin local-media trust from plugin tool metadata instead of importing the full plugin registry on subscription paths. ([#&#8203;84409](https://github.com/openclaw/openclaw/issues/84409)) Thanks [@&#8203;samzong](https://github.com/samzong).

- Image tool: keep config-backed custom-provider API keys usable for auto-discovered vision models, including deferred image-tool execution without env keys or auth profiles. ([#&#8203;85733](https://github.com/openclaw/openclaw/issues/85733))

- Memory/local embeddings: run local GGUF embeddings in an isolated worker sidecar and degrade to configured fallback or keyword search on worker failure so native embedding crashes do not take down the Gateway. ([#&#8203;85348](https://github.com/openclaw/openclaw/issues/85348)) Thanks [@&#8203;osolmaz](https://github.com/osolmaz).

- Gateway: clear the runtime config snapshot before `SIGUSR1` in-process restarts so config changes survive the next gateway loop. ([#&#8203;86388](https://github.com/openclaw/openclaw/issues/86388)) Thanks [@&#8203;XuZehan-iCenter](https://github.com/XuZehan-iCenter).

- Models: show OAuth delegation markers as configured `models.json` auth while keeping runtime route usability checks strict. ([#&#8203;86378](https://github.com/openclaw/openclaw/issues/86378)) Thanks [@&#8203;rohitjavvadi](https://github.com/rohitjavvadi).

- Cron: seed active scheduled and manual cron task rows with a progress summary so status surfaces do not look blank while jobs run. ([#&#8203;86313](https://github.com/openclaw/openclaw/issues/86313)) Thanks [@&#8203;ferminquant](https://github.com/ferminquant).

- Cron: preserve unsupported persisted cron payload rows during routine store writes while keeping those rows non-runnable. Fixes [#&#8203;84922](https://github.com/openclaw/openclaw/issues/84922). ([#&#8203;86415](https://github.com/openclaw/openclaw/issues/86415)) Thanks [@&#8203;IWhatsskill](https://github.com/IWhatsskill).

- Updater: exclude prerelease git tags from stable channel resolution so source updates do not check out newer alpha/rc/preview/canary tags. ([#&#8203;86260](https://github.com/openclaw/openclaw/issues/86260)) Thanks [@&#8203;stevenepalmer](https://github.com/stevenepalmer).

- Security/Audit: flag webhook `hooks.token` reuse of active Gateway password auth in `openclaw security audit` while keeping password-mode startup compatibility. ([#&#8203;84338](https://github.com/openclaw/openclaw/issues/84338)) Thanks [@&#8203;coygeek](https://github.com/coygeek).

- QQBot: derive the outbound reply watchdog from configured agent and provider timeouts so slow local model replies are not cut off at five minutes. Fixes [#&#8203;85267](https://github.com/openclaw/openclaw/issues/85267). ([#&#8203;85271](https://github.com/openclaw/openclaw/issues/85271)) Thanks [@&#8203;SymbolStar](https://github.com/SymbolStar).

- Agents/heartbeat: stop heartbeat turns after the first valid `heartbeat_respond` so repeated response loops do not burn tokens. ([#&#8203;86357](https://github.com/openclaw/openclaw/issues/86357)) Thanks [@&#8203;udaymanish6](https://github.com/udaymanish6).

- Tasks: keep retained lost tasks out of default status health counts, explain their cleanup window during maintenance, and prune lost task records after 24 hours instead of the general 7-day terminal retention.

- Memory-core: keep REM dreaming focused on live light-staged memories and mark staged entries as considered so old recall history no longer dominates fresh candidates. ([#&#8203;86302](https://github.com/openclaw/openclaw/issues/86302)) Thanks [@&#8203;SebTardif](https://github.com/SebTardif).

- Memory: abort sync instead of downgrading an existing semantic vector index to FTS-only when the configured embedding provider is temporarily unavailable. ([#&#8203;85704](https://github.com/openclaw/openclaw/issues/85704)) Thanks [@&#8203;yaaboo-gif](https://github.com/yaaboo-gif).

- Telegram: propagate forum topic names through the account-scoped topic cache for native command context and topic create/edit actions. ([#&#8203;86299](https://github.com/openclaw/openclaw/issues/86299)) Thanks [@&#8203;SebTardif](https://github.com/SebTardif).

- Slack: keep downloaded read-only files out of reply media so Slack file reads do not echo files back to the conversation. ([#&#8203;86318](https://github.com/openclaw/openclaw/issues/86318)) Thanks [@&#8203;neeravmakwana](https://github.com/neeravmakwana).

- Cron: accept leading-plus relative durations such as `+5m` for one-shot `--at` schedules. ([#&#8203;86341](https://github.com/openclaw/openclaw/issues/86341)) Thanks [@&#8203;mushuiyu886](https://github.com/mushuiyu886).

- Agents/media: preserve async-started media tool metadata so background generation starts no longer surface generic incomplete-turn warnings while replay stays unsafe. ([#&#8203;85933](https://github.com/openclaw/openclaw/issues/85933)) Thanks [@&#8203;fuller-stack-dev](https://github.com/fuller-stack-dev).

- Docker E2E: dedupe scheduler lane resources so npm/service package lanes are not over-counted and serialized unnecessarily.

- QA/diagnostics: add a collector-backed OpenTelemetry smoke lane, make the OTLP payload leak check scenario-aware, and keep source QA builds from failing on optional dependency imports resolved through pnpm's temp module path.

- Crabbox: bootstrap Git metadata for sparse remote changed gates so raw synced workspaces can run `pnpm check:changed` from the intended diff.

- xAI/LM Studio: avoid buffering ordinary bracketed or `final` prose until stream completion while watching for plain-text tool-call fallbacks.

- Doctor: warn and continue when the cron job store exists but cannot be read so later health checks still run. Fixes [#&#8203;86102](https://github.com/openclaw/openclaw/issues/86102). ([#&#8203;86384](https://github.com/openclaw/openclaw/issues/86384)) Thanks [@&#8203;1052326311](https://github.com/1052326311).

- Discord: suppress a bot's previous reply body and referenced media from prompt context when a user replies to that bot message, while keeping reply metadata for routing. ([#&#8203;86238](https://github.com/openclaw/openclaw/issues/86238)) Thanks [@&#8203;fuller-stack-dev](https://github.com/fuller-stack-dev).

- Discord: restore bare numeric channel IDs for outbound message-tool sends while keeping explicit DM targets unambiguous. ([#&#8203;86571](https://github.com/openclaw/openclaw/issues/86571)) Thanks [@&#8203;joshavant](https://github.com/joshavant).

- Docker E2E: avoid rebuilding the Control UI twice while preparing the shared OpenClaw package tarball for package-backed scenario runs.

- Tests: avoid rebuilding the Control UI twice during the installer Docker smoke now that `pnpm build` includes `ui:build`.

- Tests: give QA config mutation RPCs enough native Windows budget to finish gateway config writes and restart settle after hot scenario runs.

- Tests: keep the gateway restart-inflight QA scenario focused on restart recovery on native Windows by allowing expected embedded prompt handoff errors and using the Windows-safe timeout budget.

- QA-Lab: make the synthetic OpenAI provider honor generic `reply exactly:` directives after required kickoff reads so restart-recovery scenarios do not fall through to generic repo-summary prose.

- Gateway: abort active `agent` RPC runs during forced restart shutdown so stale in-process turns cannot keep writing a session after the Gateway lifecycle restarts.

- Crabbox: sync clean sparse worktrees through a temporary full checkout even when reusing an existing lease so tracked build-time files are not omitted.

- Build: route `scripts/ui.js` through the shared pnpm runner and keep Control UI chunking helpers in sparse-included source so native Windows Corepack builds can produce `dist/control-ui`.

- Tests: give the memory fallback QA scenario enough turn budget to exercise native Windows gateway runs instead of failing on the client timeout while the mock agent is still dispatching.

- Tests: collect QA gateway CPU/RSS metrics on native Windows and give the channel baseline enough turn budget to report slow gateway runs instead of timing out before proof.

- Install/update: bypass npm `min-release-age` policies with `--min-release-age=0` instead of `--before` so hosted installers keep working on npm versions that reject the combined config. ([#&#8203;84749](https://github.com/openclaw/openclaw/issues/84749)) Thanks [@&#8203;TeodoroRodrigo](https://github.com/TeodoroRodrigo).

- Diagnostics: reclaim wedged session lanes when stale active-run bookkeeping blocks queued work despite no forward progress. Fixes [#&#8203;85639](https://github.com/openclaw/openclaw/issues/85639). Thanks [@&#8203;openperf](https://github.com/openperf).

- WebChat: keep message-tool replies visible in the chat while still summarizing internal tool results for the model. Fixes [#&#8203;86347](https://github.com/openclaw/openclaw/issues/86347). Thanks [@&#8203;shakkernerd](https://github.com/shakkernerd).

- Gateway/perf: fail startup benchmark samples when the Gateway process exits before benchmark teardown, including signal deaths after readiness probes.

- Gateway/perf: fail restart benchmark samples when the Gateway exits before benchmark teardown, including clean exits and signal deaths after successful restart probes.

- Agents/tests: keep model catalog visibility on static selection helpers so catalog visibility checks avoid the broad model-selection barrel import.

- Agents/commitments: serialize commitment store load-modify-save writes so concurrent heartbeat and CLI updates no longer lose dismissal, sent, or attempt state. ([#&#8203;81153](https://github.com/openclaw/openclaw/issues/81153)) Thanks [@&#8203;ai-hpc](https://github.com/ai-hpc).

- xAI/LM Studio: promote plain-text tool-call fallbacks into structured tool calls and strip leaked internal tool syntax before user-facing delivery. ([#&#8203;86222](https://github.com/openclaw/openclaw/issues/86222)) Thanks [@&#8203;fuller-stack-dev](https://github.com/fuller-stack-dev).

- CLI: suppress benign self-update version-skew warnings during package post-update finalization.

- Gateway/perf: tighten restart and startup benchmark failure handling so long profiling runs, failed probes, and fresh Linux runners no longer produce false passing or `n/a` results.

- Checks: keep intentional Knip unused-file findings optional so full CI and sparse proof workspaces stay aligned.

- Docker: restore writable `~/.config` in runtime images. Fixes [#&#8203;85968](https://github.com/openclaw/openclaw/issues/85968). Thanks [@&#8203;hkoessler](https://github.com/hkoessler) and [@&#8203;Bartok9](https://github.com/Bartok9).

- Plugin SDK: keep legacy root diagnostic subscriptions connected when built plugin SDK aliases resolve diagnostic helpers through a separate module graph.

- Diagnostics: export alertable OTel and Prometheus signals for blocked tools, model failover, stale sessions, liveness warnings, oversized payloads, and webhook ingress while fixing shared OTLP endpoints with query strings.

- Tests: normalize macOS canonical temp paths in exec allowlists, fs-safe trash assertions, installed plugin matching, Telegram topic-name stores, and built ACPX MCP server expectations so native macOS proof runners cover the intended behavior.

- Codex/app-server: preserve message-tool-only source reply delivery mode on active runs so sub-agent completion wakeups can steer the active Codex turn instead of being rejected. ([#&#8203;86287](https://github.com/openclaw/openclaw/issues/86287)) Thanks [@&#8203;ferminquant](https://github.com/ferminquant).

- Tests: sample the Windows kitchen-sink RPC gateway directly and serialize RSS probes so native runs keep the memory guard active.

- Tests: normalize bundled plugin lifecycle probe paths and state-root lookup so native Windows release sweeps accept valid packaged plugin installs.

- Agents/Claude CLI: route live native Bash permission requests through OpenClaw exec policy so Claude turns no longer stall on `control_request`, and document that OpenClaw exec policy is authoritative. Fixes [#&#8203;80819](https://github.com/openclaw/openclaw/issues/80819). ([#&#8203;86330](https://github.com/openclaw/openclaw/issues/86330), from [#&#8203;81971](https://github.com/openclaw/openclaw/issues/81971)) Thanks [@&#8203;guthirry](https://github.com/guthirry) and [@&#8203;sallyom](https://github.com/sallyom).

- Security audit: warn when YOLO OpenClaw exec policy overrides a restrictive raw Claude `--permission-mode` for managed live sessions. ([#&#8203;86557](https://github.com/openclaw/openclaw/issues/86557)) Thanks [@&#8203;sallyom](https://github.com/sallyom).

- Config: keep benign legacy metadata write anomalies out of default doctor and config command output while preserving explicit anomaly logging for diagnostics.

- Codex: log when implicit app-server `never` approvals are promoted for OpenClaw tool policy, including whether the trigger was a `before_tool_call` hook or trusted tool policy.

- Codex harness: make subscription usage-limit errors without reset times explain that OpenClaw cannot determine the reset and point users to wait until Codex is available, use another Codex account, or switch to another configured model/provider. Thanks [@&#8203;amknight](https://github.com/amknight).

- Google Vertex: support production ADC modes such as Workload Identity Federation, service-account credentials, and metadata-server ADC for the native Vertex transport. ([#&#8203;83971](https://github.com/openclaw/openclaw/issues/83971)) Thanks [@&#8203;damianFelixPago](https://github.com/damianFelixPago).

- Telegram: route normal `[telegram][diag]` polling diagnostics through `runtime.log` while keeping non-diag warnings and persistence failures on `runtime.error`, so healthy polling startup no longer looks like an error. Fixes [#&#8203;82957](https://github.com/openclaw/openclaw/issues/82957). ([#&#8203;82958](https://github.com/openclaw/openclaw/issues/82958)) Thanks [@&#8203;galiniliev](https://github.com/galiniliev).

- Providers/Ollama: strip inline Kimi cloud reasoning prefixes from streamed and final visible replies while keeping ordinary Kimi answers append-only. ([#&#8203;86286](https://github.com/openclaw/openclaw/issues/86286)) Thanks [@&#8203;jason-allen-oneal](https://github.com/jason-allen-oneal).

- Gateway: require Talk secret authority before setup-code handoff can include Talk secrets. ([#&#8203;85690](https://github.com/openclaw/openclaw/issues/85690)) Thanks [@&#8203;ngutman](https://github.com/ngutman).

- Agents: keep fallback error reporting scoped to the active model candidate so stale prior-provider quota/auth text is not reported for later fallback attempts. ([#&#8203;86134](https://github.com/openclaw/openclaw/issues/86134)) Thanks [@&#8203;zhangguiping-xydt](https://github.com/zhangguiping-xydt).

- iMessage: dedupe watcher startup when `channels.imessage.accounts` lists both `default` and a named account that point at the same local Messages source, so the gateway no longer spawns two `imsg rpc` processes or doubles inbound replies; the dedupe is scoped to watcher startup, leaving duplicate accounts addressable for outbound sends, status, and capability listings, and `openclaw doctor` flags the redundant account with a rebinding hint. Fixes [#&#8203;65141](https://github.com/openclaw/openclaw/issues/65141). ([#&#8203;86705](https://github.com/openclaw/openclaw/issues/86705)) Thanks [@&#8203;swang430](https://github.com/swang430).

</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/682
jameslcowan pushed a commit to jameslcowan/openclaw that referenced this pull request Jun 2, 2026
* fix(telegram): serialize topic dispatch replies (clawdbot-b19)

* fix(telegram): normalize dispatch topic context

* fix(telegram): satisfy dispatch race CI checks

* fix(telegram): normalize raw code language tags

* refactor(reply): centralize turn admission

* fix(telegram): persist recovered topic routes

* fix(reply): preserve queue policy admission

* fix(reply): retain active abort owner

* fix(reply): split active abort ownership

* fix(reply): defer busy followup drains

* fix(reply): wire hook abort ownership

* fix(reply): preserve deferred queue summaries

* fix(reply): type queued summary retry

* fix(reply): abort embedded and core runs

* test(reply): keep final abort operation active

* test(reply): stabilize abort normalization test

* fix(reply): keep non-visible admission skips silent

* test(reply): avoid dispatch shard mock bleed

* fix(reply): merge deferred queue summaries

* fix(reply): abort active-lane resolver runs

* fix(reply): compose borrowed lane abort signals

* fix(reply): keep interrupt turns caller-owned

* fix(telegram): keep recovered topic history scoped

* fix(reply): retry deferred summary queues

* fix(reply): document deferred summary restore

* fix(telegram): rebuild recovered topic prompt body

* fix(reply): run admitted session ids

* fix(telegram): recover topic chat actions

* fix(reply): honor pre-dispatch aborts for handled replies

* fix(reply): guard local handled final aborts

* fix(reply): refresh admitted session files

* fix(telegram): trust final current-message marker

* fix(telegram): migrate recovered room history

* fix(telegram): scope recovered topics to current chat

* fix(reply): wait for visible reply lane ownership

* fix(telegram): pass recovered topic body to agent

---------

Co-authored-by: Peter Steinberger <[email protected]>
SYU8384 pushed a commit to SYU8384/openclaw that referenced this pull request Jun 3, 2026
* fix(telegram): serialize topic dispatch replies (clawdbot-b19)

* fix(telegram): normalize dispatch topic context

* fix(telegram): satisfy dispatch race CI checks

* fix(telegram): normalize raw code language tags

* refactor(reply): centralize turn admission

* fix(telegram): persist recovered topic routes

* fix(reply): preserve queue policy admission

* fix(reply): retain active abort owner

* fix(reply): split active abort ownership

* fix(reply): defer busy followup drains

* fix(reply): wire hook abort ownership

* fix(reply): preserve deferred queue summaries

* fix(reply): type queued summary retry

* fix(reply): abort embedded and core runs

* test(reply): keep final abort operation active

* test(reply): stabilize abort normalization test

* fix(reply): keep non-visible admission skips silent

* test(reply): avoid dispatch shard mock bleed

* fix(reply): merge deferred queue summaries

* fix(reply): abort active-lane resolver runs

* fix(reply): compose borrowed lane abort signals

* fix(reply): keep interrupt turns caller-owned

* fix(telegram): keep recovered topic history scoped

* fix(reply): retry deferred summary queues

* fix(reply): document deferred summary restore

* fix(telegram): rebuild recovered topic prompt body

* fix(reply): run admitted session ids

* fix(telegram): recover topic chat actions

* fix(reply): honor pre-dispatch aborts for handled replies

* fix(reply): guard local handled final aborts

* fix(reply): refresh admitted session files

* fix(telegram): trust final current-message marker

* fix(telegram): migrate recovered room history

* fix(telegram): scope recovered topics to current chat

* fix(reply): wait for visible reply lane ownership

* fix(telegram): pass recovered topic body to agent

---------

Co-authored-by: Peter Steinberger <[email protected]>
sablehead pushed a commit to sablehead/openclaw that referenced this pull request Jun 10, 2026
* fix(telegram): serialize topic dispatch replies (clawdbot-b19)

* fix(telegram): normalize dispatch topic context

* fix(telegram): satisfy dispatch race CI checks

* fix(telegram): normalize raw code language tags

* refactor(reply): centralize turn admission

* fix(telegram): persist recovered topic routes

* fix(reply): preserve queue policy admission

* fix(reply): retain active abort owner

* fix(reply): split active abort ownership

* fix(reply): defer busy followup drains

* fix(reply): wire hook abort ownership

* fix(reply): preserve deferred queue summaries

* fix(reply): type queued summary retry

* fix(reply): abort embedded and core runs

* test(reply): keep final abort operation active

* test(reply): stabilize abort normalization test

* fix(reply): keep non-visible admission skips silent

* test(reply): avoid dispatch shard mock bleed

* fix(reply): merge deferred queue summaries

* fix(reply): abort active-lane resolver runs

* fix(reply): compose borrowed lane abort signals

* fix(reply): keep interrupt turns caller-owned

* fix(telegram): keep recovered topic history scoped

* fix(reply): retry deferred summary queues

* fix(reply): document deferred summary restore

* fix(telegram): rebuild recovered topic prompt body

* fix(reply): run admitted session ids

* fix(telegram): recover topic chat actions

* fix(reply): honor pre-dispatch aborts for handled replies

* fix(reply): guard local handled final aborts

* fix(reply): refresh admitted session files

* fix(telegram): trust final current-message marker

* fix(telegram): migrate recovered room history

* fix(telegram): scope recovered topics to current chat

* fix(reply): wait for visible reply lane ownership

* fix(telegram): pass recovered topic body to agent

---------

Co-authored-by: Peter Steinberger <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

channel: telegram Channel integration: telegram maintainer Maintainer-authored PR mantis: telegram-visible-proof Mantis should capture Telegram visible proof. merge-risk: 🚨 availability 🚨 May cause crashes, hangs, restart loops, stalls, or process outages. merge-risk: 🚨 message-delivery 🚨 May drop, duplicate, misroute, suppress, or wrongly target messages. merge-risk: 🚨 session-state 🚨 May lose, corrupt, stale, or mis-associate session, agent, or context state. P1 High-priority user-facing bug, regression, or broken workflow. plugin: meeting-notes rating: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. scripts Repository scripts size: XL status: 📣 needs proof The PR needs real behavior proof before ClawSweeper can clear the contributor ask.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants