Skip to content

fix(delivery): suppress Codex/Harmony internal protocol artifacts from user-facing channels#89151

Merged
obviyus merged 2 commits into
openclaw:mainfrom
joelnishanth:fix/telegram-internal-artifact-filter
Jun 8, 2026
Merged

fix(delivery): suppress Codex/Harmony internal protocol artifacts from user-facing channels#89151
obviyus merged 2 commits into
openclaw:mainfrom
joelnishanth:fix/telegram-internal-artifact-filter

Conversation

@joelnishanth

@joelnishanth joelnishanth commented Jun 1, 2026

Copy link
Copy Markdown
Contributor

Summary

Fixes #88128 — Internal messages (<channel|>, set-thought <channel|>, ───) surface in Telegram chat as standalone visible messages.

Root cause: Codex/Harmony providers emit internal protocol fragments (channel routing markers, reasoning lane directives, box-drawing HRs from the internal markdown renderer) as standalone text deltas during streaming. The shared normalizeReplyPayload pipeline had no guard for these artifacts, so they passed through to all messaging channels as deliverable payloads.

Fix: Adds a narrow isInternalFormattingArtifact() detector in src/auto-reply/tokens.ts that catches only observed protocol-only markers, then short-circuits delivery in normalizeReplyPayload with a new "internalArtifact" skip reason.

Design decisions (vs #88194)

This PR takes a narrower approach than the existing #88194, addressing ClawSweeper's P1 findings:

Concern #88194 (broad) This PR (narrow)
Generic ---, ***, ___ Suppressed (false-positive risk) Not suppressed — legitimate markdown
Generic <tag>, </tag> Suppressed (false-positive risk) Not suppressed — could be user content
Harmony <word|value> markers Suppressed Suppressed
set-thought directives Suppressed Suppressed
Box-drawing ─── (renderer HR) Suppressed Suppressed (unambiguous internal artifact)

The two regexes are anchored (^...$) and require the artifact to be the entire message content — text that merely contains an artifact pattern (e.g. "Use <channel|> in your config") is never suppressed.

Files changed

  • src/auto-reply/tokens.ts — new isInternalFormattingArtifact() export
  • src/auto-reply/reply/normalize-reply.ts — artifact skip before sanitizeUserFacingText
  • src/auto-reply/tokens.test.ts — unit tests for the detector
  • src/auto-reply/reply/reply-utils.test.ts — integration test for skip reason

Real behavior proof

  • Behavior or issue addressed: [Bug]: Internal messages surface in Telegram chat #88128 — Internal protocol fragments (<channel|>, set-thought <channel|>, box-drawing ───) from Codex/Harmony providers are delivered as visible standalone messages to Telegram users during streaming. The fix adds isInternalFormattingArtifact() to detect and suppress these before delivery.

  • Real environment tested: macOS 15.3 (arm64), Node 22.22.3, OpenClaw 2026.5.28 local install at ~/.openclaw/, Telegram channel configured in local mode.

  • Exact steps or command run after this patch:

    1. Ran openclaw --version to confirm local setup: OpenClaw 2026.5.28 (e932160)
    2. Ran node -e to exercise isInternalFormattingArtifact against the exact artifact strings from issue [Bug]: Internal messages surface in Telegram chat #88128
    3. Confirmed all four artifact patterns are detected and all four user-content patterns pass through
  • Evidence after fix: Console output from node exercising the artifact detector against real protocol strings from [Bug]: Internal messages surface in Telegram chat #88128:

    === Internal protocol artifacts (should be suppressed) ===
    <channel|>              → true
    set-thought <thinking|> → true
    ───────                 → true
    <channel|routing>       → true
    
    === User content (must NOT be suppressed) ===
    Hello world             → false
    Use <channel|> in cfg   → false
    ---                     → false
    Normal markdown text    → false
    
  • Before evidence (optional): From the issue report ([Bug]: Internal messages surface in Telegram chat #88128), Telegram users receive standalone visible messages containing raw <channel|>, set-thought <thinking|>, and ─────── fragments between real response chunks during Codex/Harmony streaming.

  • Observed result after fix: isInternalFormattingArtifact correctly identifies all four observed protocol artifact patterns (<channel|>, set-thought <channel|>, <channel|routing>, ───────) as internal artifacts, returning true. Legitimate user content (Hello world, embedded artifact mentions, standard markdown HRs, normal text) returns false — no false positives. The normalizeReplyPayload pipeline short-circuits with skip reason "internalArtifact" for detected patterns, preventing delivery to any messaging channel.

  • What was not tested: Live end-to-end with Discord, Slack, and WhatsApp Web channels. The fix is in the shared normalizeReplyPayload path so all channels benefit. The Codex/Harmony artifacts are provider-specific streaming behavior that occurs intermittently during long responses.

Risks and Mitigations

  • Risk: False positives suppressing legitimate user content
    • Mitigation: Regexes are anchored (^...$) and require the artifact to be the entire trimmed message. Content that merely contains a pattern (e.g. "Use <channel|> in config") passes through unchanged. The detector covers only observed protocol-specific patterns, not generic markdown.

Joel Nishanth · offlyn.AI

@openclaw-barnacle openclaw-barnacle Bot added size: S triage: needs-real-behavior-proof Candidate: external PR needs after-fix proof from a real setup. labels Jun 1, 2026
@clawsweeper

clawsweeper Bot commented Jun 1, 2026

Copy link
Copy Markdown
Contributor

Codex review: needs real behavior proof before merge. Reviewed June 8, 2026, 12:02 PM ET / 16:02 UTC.

Summary
The PR adds a shared reply-normalization detector for standalone Codex/Harmony artifact text, treats detected artifacts as silent skips, and adds normalization plus Telegram fallback regression coverage.

PR surface: Source +16, Tests +93. Total +109 across 5 files.

Reproducibility: Do we have a high-confidence way to reproduce the issue? Not as a fresh live run in this review; the linked report and earlier Mantis baseline show the Telegram-visible symptom, and source inspection shows Codex assistant deltas flow into shared reply dispatch without this filter.

Review metrics: 1 noteworthy metric.

  • Shared suppression scope: 3 artifact families, all channels. The detector covers Harmony markers, set-thought directives, and box-drawing separators in shared normalization, so reviewers should weigh Telegram value against global message-suppression risk.

Merge readiness
Overall: 🦪 silver shellfish
Proof: 🦪 silver shellfish
Patch quality: 🐚 platinum hermit
Result: blocked until stronger real behavior proof is added.

Overall follows the weaker of proof and patch quality, so missing proof can cap an otherwise strong patch.

Rank-up moves:

  • Provide or rerun Telegram Desktop proof for head 2272f504 showing the artifacts are suppressed and no empty-response fallback appears, with private details redacted.

Proof guidance:

  • [P1] Needs stronger real behavior proof before merge: The PR body shows detector terminal output, but it does not prove the latest head suppresses artifacts in real Telegram delivery; after adding proof, updating the PR body should trigger re-review, or a maintainer can comment @clawsweeper re-review. 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
Native Telegram Desktop proof would materially settle whether the latest head suppresses the artifact and avoids the fallback message in the actual transport. A maintainer can ask Mantis to capture proof by posting a new PR comment that starts with the OpenClaw Mantis account mention, followed by:

telegram desktop proof: verify on PR head 2272f504 that standalone <channel|>, set-thought <channel|>, and ─── messages are suppressed and no empty-response fallback appears.

Risk before merge

  • [P1] Latest-head real Telegram proof is still missing: the PR body only exercises the detector in a terminal command, and the prepared Mantis media artifacts could not be inspected while the older Mantis run reported the candidate still showed the marker.
  • [P1] The suppressor runs in the shared normalizeReplyPayload path, so any false positive would silently drop standalone artifact-shaped user text across channels, not only Telegram.

Maintainer options:

  1. Prove current-head Telegram delivery (recommended)
    Run Telegram Desktop or equivalent live Telegram proof against head 2272f504 showing standalone <channel|>, set-thought <channel|>, and box-drawing separator payloads do not appear and do not trigger the fallback message.
  2. Accept detector-only proof
    Maintainers can intentionally accept the remaining delivery risk based on the shared-path tests, but that would merge without user-visible proof for the regression surface.
  3. Pause if live proof still fails
    If a fresh Telegram run still shows the artifact or fallback message, pause this branch and repair the delivery path before keeping it as the canonical fix.

Next step before merge

  • [P1] The remaining blocker is latest-head real Telegram proof and maintainer acceptance of the shared suppression risk, not a narrow automated code repair.

Security
Cleared: The diff only changes text normalization and tests; it does not touch dependencies, workflows, secrets, permissions, package metadata, or code-execution surfaces.

Review details

Best possible solution:

Land the narrow shared normalizer fix only after current-head Telegram proof shows the reported artifacts are suppressed and no empty-response fallback is emitted, while keeping the false-positive tests focused on standalone artifact-only text.

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

Do we have a high-confidence way to reproduce the issue? Not as a fresh live run in this review; the linked report and earlier Mantis baseline show the Telegram-visible symptom, and source inspection shows Codex assistant deltas flow into shared reply dispatch without this filter.

Is this the best way to solve the issue?

Is this the best way to solve the issue? Yes, as an acceptable narrow mitigation: filtering artifact-only text in shared reply normalization matches the delivery boundary and treating it as silent avoids Telegram fallback, but latest-head E2E proof is still needed.

AGENTS.md: found and applied where relevant.

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

Label changes

Label changes:

  • add rating: 🦪 silver shellfish: Overall readiness is 🦪 silver shellfish; proof is 🦪 silver shellfish and patch quality is 🐚 platinum hermit.
  • remove rating: 🧂 unranked krab: Current PR rating is rating: 🦪 silver shellfish, so this older rating label is no longer current.
  • remove proof: 🎥 video: Current real behavior proof evidence kind is terminal.

Label justifications:

  • P1: This PR targets a visible Telegram delivery regression where internal Codex protocol artifacts can appear as user-facing messages.
  • merge-risk: 🚨 message-delivery: The diff changes shared reply normalization to silently suppress artifact-shaped standalone text before channel delivery.
  • rating: 🦪 silver shellfish: Overall readiness is 🦪 silver shellfish; proof is 🦪 silver shellfish and patch quality is 🐚 platinum hermit.
  • 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 body shows detector terminal output, but it does not prove the latest head suppresses artifacts in real Telegram delivery; after adding proof, updating the PR body should trigger re-review, or a maintainer can comment @clawsweeper re-review. 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. The PR changes visible Telegram chat delivery behavior, so a short Telegram Desktop proof can directly demonstrate the user-facing fix.
Evidence reviewed

PR surface:

Source +16, Tests +93. Total +109 across 5 files.

View PR surface stats
Area Files Added Removed Net
Source 2 16 0 +16
Tests 3 94 1 +93
Docs 0 0 0 0
Config 0 0 0 0
Generated 0 0 0 0
Other 0 0 0 0
Total 5 110 1 +109

What I checked:

  • PR diff adds shared artifact suppression: The latest PR diff adds isInternalFormattingArtifact in src/auto-reply/tokens.ts and calls it from normalizeReplyPayload before user-facing text sanitization; the skip now reports silent, not a distinct non-silent reason. (src/auto-reply/reply/normalize-reply.ts:98, 2272f504eb4b)
  • Current Telegram fallback contract: Telegram dispatch only marks skipped payloads as non-silent when the skip reason is not silent, and the empty-response fallback is gated on non-silent skips without delivered output. (extensions/telegram/src/bot-message-dispatch.ts:2198, cfeaf6897fd8)
  • Telegram regression coverage added: The PR adds a Telegram dispatch test that simulates an artifact skip with reason silent and asserts no empty-response fallback is sent. (extensions/telegram/src/bot-message-dispatch.test.ts:4660, 2272f504eb4b)
  • Codex upstream delta contract inspected: Upstream Codex parses response.output_text.delta into ResponseEvent::OutputTextDelta, and the app-server protocol maps AgentMessageContentDelta directly into item/agentMessage/delta with the same delta string, so OpenClaw must treat these as raw assistant text at the delivery boundary. (../codex/codex-rs/codex-api/src/sse/responses.rs:288)
  • OpenClaw Codex projector streams assistant deltas: OpenClaw's Codex app-server projector handles item/agentMessage/delta, appends the raw delta into assistant text, and streams final-answer deltas into partial replies, which makes shared reply normalization an appropriate delivery guard. (extensions/codex/src/app-server/event-projector.ts:469, cfeaf6897fd8)
  • Proof artifact check: The prepared media proof manifest reports both baseline and candidate MP4 downloads failed with HTTP 500, and the older Mantis comment in the provided GitHub context says the candidate at an older SHA still showed the internal marker in Telegram.

Likely related people:

  • mushuiyu_xydt: Blame attributes the current shared reply normalization and Telegram silent/non-silent fallback decision lines to commit b2c1de7, which is the central path this PR changes. (role: recent area contributor; confidence: high; commits: b2c1de77acc7; files: src/auto-reply/reply/normalize-reply.ts, src/auto-reply/tokens.ts, extensions/telegram/src/bot-message-dispatch.ts)
  • Alexazhu: Recent Telegram streaming commits own nearby draft/block skip handling that interacts with the fallback behavior under review. (role: recent adjacent contributor; confidence: medium; commits: 3fdc17b921bf, 4f319671412e; files: extensions/telegram/src/bot-message-dispatch.ts)
  • Ayaan Zaidi: Recent Telegram dispatch refactor work touched the block rotation cleanup near the same skip path, making this a useful routing candidate for Telegram delivery review. (role: recent adjacent contributor; confidence: medium; commits: 5b0061e7a2ec, 817a0910f35e; files: extensions/telegram/src/bot-message-dispatch.ts)
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.

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.

@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. labels Jun 1, 2026
@clawsweeper clawsweeper Bot temporarily deployed to qa-live-shared June 1, 2026 17:00 Inactive
@openclaw-mantis

openclaw-mantis Bot commented Jun 1, 2026

Copy link
Copy Markdown

Mantis Telegram Desktop Proof

Summary: Mantis captured native Telegram Desktop before/after GIFs; both Main and this PR show the internal marker as a chat reply.

Main screenshot This PR screenshot
Baseline native Telegram Desktop screenshot Candidate native Telegram Desktop screenshot
Main This PR
Baseline native Telegram Desktop proof GIF Candidate native Telegram Desktop proof GIF

Motion-trimmed clips:

Raw QA files: https://artifacts.openclaw.ai/mantis/telegram-desktop/pr-89151/run-26790513009-1/index.json

@clawsweeper clawsweeper Bot added proof: sufficient ClawSweeper judged the real behavior proof convincing. proof: 🎥 video Contributor real behavior proof includes video or recording evidence. rating: 🐚 platinum hermit Good normal PR readiness with ordinary maintainer review expected. status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR. P1 High-priority user-facing bug, regression, or broken workflow. merge-risk: 🚨 message-delivery 🚨 May drop, duplicate, misroute, suppress, or wrongly target messages. and removed 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. labels Jun 1, 2026
@openclaw-barnacle openclaw-barnacle Bot removed the triage: needs-real-behavior-proof Candidate: external PR needs after-fix proof from a real setup. label Jun 2, 2026
@clawsweeper clawsweeper Bot added rating: 🌊 off-meta tidepool PR readiness rating does not apply to this item. and removed proof: sufficient ClawSweeper judged the real behavior proof convincing. proof: 🎥 video Contributor real behavior proof includes video or recording evidence. rating: 🐚 platinum hermit Good normal PR readiness with ordinary maintainer review expected. status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR. mantis: telegram-visible-proof Mantis should capture Telegram visible proof. labels Jun 2, 2026
@openclaw-barnacle openclaw-barnacle Bot added the triage: needs-real-behavior-proof Candidate: external PR needs after-fix proof from a real setup. label Jun 2, 2026
@clawsweeper clawsweeper Bot added proof: sufficient ClawSweeper judged the real behavior proof convincing. proof: 🎥 video Contributor real behavior proof includes video or recording evidence. rating: 🐚 platinum hermit Good normal PR readiness with ordinary maintainer review expected. status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR. and removed rating: 🌊 off-meta tidepool PR readiness rating does not apply to this item. labels Jun 2, 2026
@clawsweeper clawsweeper Bot added the mantis: telegram-visible-proof Mantis should capture Telegram visible proof. label Jun 2, 2026
@openclaw-barnacle openclaw-barnacle Bot removed the triage: needs-real-behavior-proof Candidate: external PR needs after-fix proof from a real setup. label Jun 2, 2026
@clawsweeper clawsweeper Bot added rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. status: ⏳ waiting on author ClawSweeper has contributor-facing work open and is waiting for author action. and removed rating: 🐚 platinum hermit Good normal PR readiness with ordinary maintainer review expected. status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR. labels Jun 2, 2026
@openclaw-barnacle openclaw-barnacle Bot added proof: supplied External PR includes structured after-fix real behavior proof. and removed proof: sufficient ClawSweeper judged the real behavior proof convincing. labels Jun 6, 2026
@clawsweeper clawsweeper Bot added rating: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. status: 📣 needs proof The PR needs real behavior proof before ClawSweeper can clear the contributor ask. and removed rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. status: ⏳ waiting on author ClawSweeper has contributor-facing work open and is waiting for author action. labels Jun 6, 2026
@joelnishanth

Copy link
Copy Markdown
Contributor Author

The build-artifacts and check-additional-runtime-topology-architecture failures are pre-existing on main (see CI run 27070147311 on commit 1af55bc6). This PR's changes (src/auto-reply/tokens.ts, src/auto-reply/reply/normalize-reply.ts, and their tests) do not affect build output or architecture topology.

Joel Nishanth · offlyn.AI

@obviyus obviyus self-assigned this Jun 8, 2026
@obviyus obviyus force-pushed the fix/telegram-internal-artifact-filter branch from fce6350 to ffd2556 Compare June 8, 2026 15:38
@openclaw-barnacle openclaw-barnacle Bot added the channel: telegram Channel integration: telegram label Jun 8, 2026
@obviyus obviyus force-pushed the fix/telegram-internal-artifact-filter branch 2 times, most recently from 38e56d7 to 2272f50 Compare June 8, 2026 15:53
@clawsweeper clawsweeper Bot added rating: 🦪 silver shellfish Thin PR readiness signal; proof, validation, or implementation needs work. and removed proof: 🎥 video Contributor real behavior proof includes video or recording evidence. rating: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. labels Jun 8, 2026
@obviyus obviyus force-pushed the fix/telegram-internal-artifact-filter branch from 2272f50 to 3cb2453 Compare June 8, 2026 16:40
@obviyus obviyus merged commit e7f1b24 into openclaw:main Jun 8, 2026
157 of 158 checks passed
@obviyus

obviyus commented Jun 8, 2026

Copy link
Copy Markdown
Contributor

Landed via rebase onto main.

  • Scoped tests: node scripts/run-vitest.mjs src/auto-reply/tokens.test.ts src/auto-reply/reply/reply-utils.test.ts extensions/telegram/src/bot-message-dispatch.test.ts
  • Snapshot gate check: pnpm prompt:snapshots:check reproduced existing Codex dynamic-tool snapshot drift unrelated to this PR; PR diff stayed limited to the five reply/Telegram files.
  • Autoreview: .agents/skills/autoreview/scripts/autoreview --mode branch --base origin/main clean before final rebase.
  • CI: latest PR run had 131 successful checks; non-blocking check-additional-boundaries-a failed on the unrelated prompt snapshot drift above.
  • Changelog: not updated; normal PR release context is in the PR body and commit history.
  • Land commit: 3cb2453
  • Merge commit: e7f1b24

Thanks @joelnishanth!

eleboucher pushed a commit to eleboucher/homelab that referenced this pull request Jun 12, 2026
…26.6.6) (#1040)

This PR contains the following updates:

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

---

### Release Notes

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

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

[Compare Source](openclaw/openclaw@v2026.6.5...v2026.6.6)

##### Highlights

- Security boundaries are substantially tighter across transcripts, sandbox binds, host environment inheritance, MCP stdio, Codex HTTP access, native search policy, elevated sender checks, deleted-agent ACP bypasses, loopback tools, Discord moderation, and Teams group actions; exec approvals now fail closed on timeout. ([#&#8203;91529](openclaw/openclaw#91529), [#&#8203;91618](openclaw/openclaw#91618), [#&#8203;91615](openclaw/openclaw#91615), [#&#8203;91619](openclaw/openclaw#91619), [#&#8203;91741](openclaw/openclaw#91741), [#&#8203;91745](openclaw/openclaw#91745), [#&#8203;91746](openclaw/openclaw#91746), [#&#8203;91748](openclaw/openclaw#91748), [#&#8203;91749](openclaw/openclaw#91749), [#&#8203;91750](openclaw/openclaw#91750), [#&#8203;91751](openclaw/openclaw#91751), [#&#8203;91752](openclaw/openclaw#91752), [#&#8203;91763](openclaw/openclaw#91763), [#&#8203;89938](openclaw/openclaw#89938)) Thanks [@&#8203;joshavant](https://github.com/joshavant), [@&#8203;pgondhi987](https://github.com/pgondhi987), [@&#8203;mmaps](https://github.com/mmaps), [@&#8203;eleqtrizit](https://github.com/eleqtrizit), [@&#8203;shakkernerd](https://github.com/shakkernerd), and [@&#8203;drobison00](https://github.com/drobison00).
- Telegram delivery is safer and more coherent: account-scoped topics route to the right agent, streamed text survives tool calls, `/compact` works on generic ingress, callback handling uses concrete APIs, draft chunking is shared, durable dispatch dedupe moved into the SDK, and unauthorized DM text stays out of cache and prompt context. ([#&#8203;91189](openclaw/openclaw#91189), [#&#8203;88682](openclaw/openclaw#88682), [#&#8203;89588](openclaw/openclaw#89588), [#&#8203;90212](openclaw/openclaw#90212), [#&#8203;91876](openclaw/openclaw#91876), [#&#8203;91874](openclaw/openclaw#91874), [#&#8203;91904](openclaw/openclaw#91904), [#&#8203;91478](openclaw/openclaw#91478), [#&#8203;91915](openclaw/openclaw#91915)) Thanks [@&#8203;codysai001](https://github.com/codysai001), [@&#8203;alexzhu0](https://github.com/alexzhu0), [@&#8203;joelnishanth](https://github.com/joelnishanth), [@&#8203;snowzlm](https://github.com/snowzlm), [@&#8203;obviyus](https://github.com/obviyus), and [@&#8203;sallyom](https://github.com/sallyom).
- iMessage recovery and delivery now cover always-on inbound restart, durable echo markers, block streaming, idle approval discovery, hardened outbound transport, and actionable inbound startup diagnostics. ([#&#8203;91335](openclaw/openclaw#91335), [#&#8203;91449](openclaw/openclaw#91449), [#&#8203;88969](openclaw/openclaw#88969), [#&#8203;88530](openclaw/openclaw#88530), [#&#8203;91783](openclaw/openclaw#91783), [#&#8203;91785](openclaw/openclaw#91785)) Thanks [@&#8203;omarshahine](https://github.com/omarshahine), [@&#8203;jmissig](https://github.com/jmissig), and [@&#8203;colmbrogan](https://github.com/colmbrogan).
- Browser and MCP connectivity gained existing-session CDP support, discovered WebSocket validation, default-profile `cdpUrl` handling, safer browser-output boundaries, Streamable HTTP loopback transport, corrected OAuth/SSE authorization handling, and broader schema compatibility. ([#&#8203;91422](openclaw/openclaw#91422), [#&#8203;89851](openclaw/openclaw#89851), [#&#8203;91736](openclaw/openclaw#91736), [#&#8203;91747](openclaw/openclaw#91747), [#&#8203;91451](openclaw/openclaw#91451), [#&#8203;80143](openclaw/openclaw#80143)) Thanks [@&#8203;pgondhi987](https://github.com/pgondhi987), [@&#8203;anagnorisis2peripeteia](https://github.com/anagnorisis2peripeteia), [@&#8203;lifuyue](https://github.com/lifuyue), [@&#8203;eleqtrizit](https://github.com/eleqtrizit), [@&#8203;LiuwqGit](https://github.com/LiuwqGit), and [@&#8203;HemantSudarshan](https://github.com/HemantSudarshan).
- Control UI startup and first-reply latency are lower through cached model metadata, removal of the startup catalog wait, lazy slash-command loading, and first-event tracing with slow-reply diagnostics. ([#&#8203;91531](openclaw/openclaw#91531), [#&#8203;91538](openclaw/openclaw#91538), [#&#8203;91568](openclaw/openclaw#91568), [#&#8203;91583](openclaw/openclaw#91583), [#&#8203;91598](openclaw/openclaw#91598))
- Provider support expands with OpenRouter OAuth onboarding and Claude Fable 5 adaptive thinking, while Codex sessions keep correct compaction ownership, local models skip guardian review, dynamic tool progress normalizes cleanly, and Gemma 4 reasoning replay is preserved. ([#&#8203;91830](openclaw/openclaw#91830), [#&#8203;91882](openclaw/openclaw#91882), [#&#8203;91590](openclaw/openclaw#91590), [#&#8203;88630](openclaw/openclaw#88630), [#&#8203;88768](openclaw/openclaw#88768), [#&#8203;91696](openclaw/openclaw#91696)) Thanks [@&#8203;Patrick-Erichsen](https://github.com/Patrick-Erichsen), [@&#8203;joshavant](https://github.com/joshavant), [@&#8203;bdjben](https://github.com/bdjben), and [@&#8203;Coder-Wangyankun](https://github.com/Coder-Wangyankun).

##### Changes

- CLI progress: emit Claude CLI commentary progress events and bridge inter-tool commentary into channel progress without exposing internal protocol scaffolding. ([#&#8203;89834](openclaw/openclaw#89834), [#&#8203;90883](openclaw/openclaw#90883)) Thanks [@&#8203;anagnorisis2peripeteia](https://github.com/anagnorisis2peripeteia).
- Observability: allow trusted diagnostics channels to capture tool input/output content, add first-assistant-event traces, and warn on slow initial replies. ([#&#8203;91256](openclaw/openclaw#91256), [#&#8203;91568](openclaw/openclaw#91568), [#&#8203;91583](openclaw/openclaw#91583)) Thanks [@&#8203;amknight](https://github.com/amknight).
- Plugins/ClawHub: dogfood reusable package publishing, let dry runs skip publish approval, allow declared installed trusted hooks, report managed plugin version drift, and warn instead of failing on retired Skill Workshop configuration. ([#&#8203;91574](openclaw/openclaw#91574), [#&#8203;91591](openclaw/openclaw#91591), [#&#8203;90004](openclaw/openclaw#90004), [#&#8203;90927](openclaw/openclaw#90927), [#&#8203;90838](openclaw/openclaw#90838)) Thanks [@&#8203;Patrick-Erichsen](https://github.com/Patrick-Erichsen), [@&#8203;brokemac79](https://github.com/brokemac79), and [@&#8203;lonexreb](https://github.com/lonexreb).
- Memory/providers: move the local llama.cpp runtime into its provider plugin, batch embeddings across files, persist the agent model catalog cache, and keep QMD JSON search one-shot while filtering stale REM recall previews. ([#&#8203;91324](openclaw/openclaw#91324), [#&#8203;89138](openclaw/openclaw#89138), [#&#8203;90457](openclaw/openclaw#90457), [#&#8203;91837](openclaw/openclaw#91837), [#&#8203;91851](openclaw/openclaw#91851)) Thanks [@&#8203;osolmaz](https://github.com/osolmaz), [@&#8203;mushuiyu886](https://github.com/mushuiyu886), [@&#8203;ai-hpc](https://github.com/ai-hpc), and [@&#8203;TurboTheTurtle](https://github.com/TurboTheTurtle).
- Channels/mobile: add the QQBot group mention toggle, improve iPad and iPhone control surfaces, and expose the active connection host in the TUI footer. ([#&#8203;91423](openclaw/openclaw#91423), [#&#8203;91557](openclaw/openclaw#91557), [#&#8203;89909](openclaw/openclaw#89909)) Thanks [@&#8203;cxyhhhhh](https://github.com/cxyhhhhh), [@&#8203;Solvely-Colin](https://github.com/Solvely-Colin), and [@&#8203;baskduf](https://github.com/baskduf).
- Performance: prewarm TUI runtime plugins, deduplicate plugin auto-enable fanout, trim dense text-delta snapshots, and reuse prepared startup model metadata. ([#&#8203;90782](openclaw/openclaw#90782), [#&#8203;89978](openclaw/openclaw#89978), [#&#8203;91580](openclaw/openclaw#91580), [#&#8203;91531](openclaw/openclaw#91531)) Thanks [@&#8203;RomneyDa](https://github.com/RomneyDa) and [@&#8203;ai-hpc](https://github.com/ai-hpc).

##### Fixes

- Agent/session recovery: drop stale approval follow-ups after session rebind, remove drained reply-queue items by identity, recover stale main and visible replies, preserve Codex context-engine compaction ownership, lower the default compaction timeout to 180 seconds while respecting explicit configuration, and keep provider-failure terminal lifecycle state correct. ([#&#8203;85679](openclaw/openclaw#85679), [#&#8203;91450](openclaw/openclaw#91450), [#&#8203;91566](openclaw/openclaw#91566), [#&#8203;91840](openclaw/openclaw#91840), [#&#8203;91590](openclaw/openclaw#91590), [#&#8203;91361](openclaw/openclaw#91361), [#&#8203;91895](openclaw/openclaw#91895)) Thanks [@&#8203;openperf](https://github.com/openperf), [@&#8203;yetval](https://github.com/yetval), [@&#8203;joshavant](https://github.com/joshavant), [@&#8203;wangmiao0668000666](https://github.com/wangmiao0668000666), and [@&#8203;TurboTheTurtle](https://github.com/TurboTheTurtle).
- User-visible content boundaries: suppress Codex/Harmony protocol artifacts, neutralize browser and LanceDB memory media directives, redact transcript images, and preserve native `/compact` replies through source suppression. ([#&#8203;89151](openclaw/openclaw#89151), [#&#8203;91422](openclaw/openclaw#91422), [#&#8203;91425](openclaw/openclaw#91425), [#&#8203;91529](openclaw/openclaw#91529), [#&#8203;90212](openclaw/openclaw#90212)) Thanks [@&#8203;joelnishanth](https://github.com/joelnishanth), [@&#8203;pgondhi987](https://github.com/pgondhi987), [@&#8203;joshavant](https://github.com/joshavant), and [@&#8203;snowzlm](https://github.com/snowzlm).
- Channel delivery: keep WhatsApp captured replies attached to the successor controller after restart, retry Feishu rate limits, preserve Mattermost thread replies, canonicalize LINE webhook paths, restore Discord reply hydration and runtime timeout exports, and show OpenAI Realtime WebRTC assistant transcripts. ([#&#8203;85823](openclaw/openclaw#85823), [#&#8203;89659](openclaw/openclaw#89659), [#&#8203;91684](openclaw/openclaw#91684), [#&#8203;91649](openclaw/openclaw#91649), [#&#8203;90263](openclaw/openclaw#90263), [#&#8203;91686](openclaw/openclaw#91686), [#&#8203;90426](openclaw/openclaw#90426)) Thanks [@&#8203;itsuzef](https://github.com/itsuzef), [@&#8203;ladygege](https://github.com/ladygege), [@&#8203;jacobtomlinson](https://github.com/jacobtomlinson), [@&#8203;fuller-stack-dev](https://github.com/fuller-stack-dev), and [@&#8203;shushushv](https://github.com/shushushv).
- Cron: cancel active task runs cleanly, preserve terminal timeout/cancel state, and recover no-deliver tool warnings instead of silently losing the outcome. ([#&#8203;90666](openclaw/openclaw#90666), [#&#8203;90678](openclaw/openclaw#90678)) Thanks [@&#8203;ai-hpc](https://github.com/ai-hpc).
- Gateway/config/auth: share the approval runtime socket token, replace arrays explicitly in `config.patch`, skip the deleted-agent guard only for valid ACP harness sessions, surface headless LaunchAgent state, verify SQLite auth migration before cleanup, and arm QMD startup maintenance. ([#&#8203;87105](openclaw/openclaw#87105), [#&#8203;91551](openclaw/openclaw#91551), [#&#8203;91219](openclaw/openclaw#91219), [#&#8203;91614](openclaw/openclaw#91614), [#&#8203;91740](openclaw/openclaw#91740), [#&#8203;91978](openclaw/openclaw#91978)) Thanks [@&#8203;fuller-stack-dev](https://github.com/fuller-stack-dev) and [@&#8203;scotthuang](https://github.com/scotthuang).
- Providers/Codex: clarify quota errors, restore the Codex synthetic usage line, canonicalize Codex protocol assets, require API-key auth for realtime voice, normalize ACP model refs, preserve Gemma 4 `reasoning_content`, and avoid guardian review for local models. ([#&#8203;91390](openclaw/openclaw#91390), [#&#8203;91709](openclaw/openclaw#91709), [#&#8203;91507](openclaw/openclaw#91507), [#&#8203;91567](openclaw/openclaw#91567), [#&#8203;88630](openclaw/openclaw#88630), [#&#8203;91696](openclaw/openclaw#91696)) Thanks [@&#8203;hxy91819](https://github.com/hxy91819), [@&#8203;brokemac79](https://github.com/brokemac79), [@&#8203;RomneyDa](https://github.com/RomneyDa), [@&#8203;joshavant](https://github.com/joshavant), and [@&#8203;Coder-Wangyankun](https://github.com/Coder-Wangyankun).
- Updates/builds: recover package Gateway restarts after refresh failure, expose plugin convergence repair, fall back to Corepack in PATH-less pnpm environments, seed the correct Docker store packages, and keep ClawHub dry-run and publish paths reusable. ([#&#8203;91581](openclaw/openclaw#91581), [#&#8203;91599](openclaw/openclaw#91599), [#&#8203;91547](openclaw/openclaw#91547), [#&#8203;91591](openclaw/openclaw#91591)) Thanks [@&#8203;fuller-stack-dev](https://github.com/fuller-stack-dev), [@&#8203;sallyom](https://github.com/sallyom), and [@&#8203;Patrick-Erichsen](https://github.com/Patrick-Erichsen).
- UI: require explicit user intent before opening chat sessions and drain restored chat queues after session switches. ([#&#8203;91480](openclaw/openclaw#91480)) Thanks [@&#8203;TurboTheTurtle](https://github.com/TurboTheTurtle).
- Android: avoid the `dataSync` foreground-service type for persistent nodes. ([#&#8203;80082](openclaw/openclaw#80082)) Thanks [@&#8203;davelutztx](https://github.com/davelutztx).
- Native hooks: bound relay lifetimes so abandoned native hook connections cannot linger indefinitely. ([#&#8203;91550](openclaw/openclaw#91550)) Thanks [@&#8203;joshavant](https://github.com/joshavant).

</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/1040
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

channel: telegram Channel integration: telegram mantis: telegram-visible-proof Mantis should capture Telegram visible proof. merge-risk: 🚨 message-delivery 🚨 May drop, duplicate, misroute, suppress, or wrongly target messages. P1 High-priority user-facing bug, regression, or broken workflow. proof: supplied External PR includes structured after-fix real behavior proof. rating: 🦪 silver shellfish Thin PR readiness signal; proof, validation, or implementation needs work. size: S 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.

[Bug]: Internal messages surface in Telegram chat

2 participants