fix(telegram): deliver durable reasoning when enabled#97875
Conversation
|
Codex review: needs maintainer review before merge. Reviewed June 29, 2026, 8:30 PM ET / 00:30 UTC. Summary PR surface: Source +21, Tests +194. Total +215 across 5 files. Reproducibility: yes. from source inspection: current main suppresses Review metrics: 1 noteworthy metric.
Root-cause cluster Members:
Proposal only: this assessment does not dispatch repair, suppress jobs, mutate sibling items, close, or merge anything. Merge readiness Overall follows the weaker of proof and patch quality, so missing proof can cap an otherwise strong patch. Rank-up moves:
Mantis proof suggestion Risk before merge
Maintainer options:
Next step before merge
Security Review detailsBest possible solution: Land this as the canonical Telegram durable-reasoning fix after maintainers accept the explicit reply-option opt-in and decide whether the existing generic live Telegram proof is enough or a focused Do we have a high-confidence way to reproduce the issue? Yes from source inspection: current main suppresses Is this the best way to solve the issue? Yes, this appears to be the best bounded fix shape: it uses a channel-owned opt-in instead of a Telegram-name allowlist, preserves generic-channel suppression, strips the marker only before outbound normalization, and avoids synthesizing reasoning into TTS. The safer alternative is only needed if maintainers reject the new exported reply option and want a different internal capability contract. AGENTS.md: found and applied where relevant. Codex review notes: model internal, reasoning high; reviewed against e87b0df67575. Label changesLabel changes:
Label justifications:
Evidence reviewedPR surface: Source +21, Tests +194. Total +215 across 5 files. View PR surface stats
What I checked:
Likely related people:
What the crustacean ranks mean
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
|
Mantis Telegram Live QASummary: Mantis ran the Telegram live QA lane with Convex-leased credentials, rendered a redacted transcript in a Crabbox desktop browser, and captured screenshot/video evidence for PR review.
Telegram live transcript Telegram motion preview Motion-trimmed clips: Full videos: |
c2399f6 to
f62e70e
Compare
f62e70e to
d3befea
Compare
|
Land-ready maintainer proof for head What changed after review:
Local proof:
CI / remote proof:
Known caveat:
|
… payloads Mirror json's reasoningPayloadsEnabled seam (openclaw#97875) for the 💬 commentary lane: add GetReplyOptions.commentaryPayloadsEnabled and an isCommentary payload tag next to isReasoning across the payload types; default-suppress isCommentary in dispatch-from-config (block stream + final loops) unless the channel opts in; exclude commentary from TTS exactly like reasoning; thread the tag through the block-reply coalescer, reply-delivery direct-lane, and realtime consult so it cannot be dropped mid-pipeline. Discord opts in when its commentary lane is active. No durable producer is wired yet (preserves the obviyus-approved 3-part Anthropic withhold invariant; handlers.messages.ts unchanged). Also regenerates docs/.generated/config-baseline.sha256 and bumps the plugin-SDK surface budgets to actual post-openclaw#97875-rebase values. Co-Authored-By: Claude Opus 4.8 <[email protected]>
Preserve shared reasoning suppression by default while letting Telegram opt into durable reasoning payloads only when it has a deliverable reasoning lane. Covers persistent /reasoning on, separate reasoning stream lanes, and progress-stream suppression.\n\nVerification:\n- node scripts/run-vitest.mjs src/auto-reply/reply/dispatch-from-config.test.ts extensions/telegram/src/bot-message-dispatch.test.ts\n- git diff --check upstream/main...HEAD\n- .agents/skills/autoreview/scripts/autoreview --mode branch --base upstream/main --stream-engine-output\n- CI run 28411526182 green, including QA Smoke CI and check-test-types\n- Real behavior proof run 28411676681 passed\n\nPR: openclaw#97875
… payloads Mirror json's reasoningPayloadsEnabled seam (openclaw#97875) for the 💬 commentary lane: add GetReplyOptions.commentaryPayloadsEnabled and an isCommentary payload tag next to isReasoning across the payload types; default-suppress isCommentary in dispatch-from-config (block stream + final loops) unless the channel opts in; exclude commentary from TTS exactly like reasoning; thread the tag through the block-reply coalescer, reply-delivery direct-lane, and realtime consult so it cannot be dropped mid-pipeline. Discord opts in when its commentary lane is active. No durable producer is wired yet (preserves the obviyus-approved 3-part Anthropic withhold invariant; handlers.messages.ts unchanged). Also regenerates docs/.generated/config-baseline.sha256 and bumps the plugin-SDK surface budgets to actual post-openclaw#97875-rebase values. Co-Authored-By: Claude Opus 4.8 <[email protected]>
Preserve shared reasoning suppression by default while letting Telegram opt into durable reasoning payloads only when it has a deliverable reasoning lane. Covers persistent /reasoning on, separate reasoning stream lanes, and progress-stream suppression.\n\nVerification:\n- node scripts/run-vitest.mjs src/auto-reply/reply/dispatch-from-config.test.ts extensions/telegram/src/bot-message-dispatch.test.ts\n- git diff --check upstream/main...HEAD\n- .agents/skills/autoreview/scripts/autoreview --mode branch --base upstream/main --stream-engine-output\n- CI run 28411526182 green, including QA Smoke CI and check-test-types\n- Real behavior proof run 28411676681 passed\n\nPR: openclaw#97875
Preserve shared reasoning suppression by default while letting Telegram opt into durable reasoning payloads only when it has a deliverable reasoning lane. Covers persistent /reasoning on, separate reasoning stream lanes, and progress-stream suppression.\n\nVerification:\n- node scripts/run-vitest.mjs src/auto-reply/reply/dispatch-from-config.test.ts extensions/telegram/src/bot-message-dispatch.test.ts\n- git diff --check upstream/main...HEAD\n- .agents/skills/autoreview/scripts/autoreview --mode branch --base upstream/main --stream-engine-output\n- CI run 28411526182 green, including QA Smoke CI and check-test-types\n- Real behavior proof run 28411676681 passed\n\nPR: openclaw#97875
Preserve shared reasoning suppression by default while letting Telegram opt into durable reasoning payloads only when it has a deliverable reasoning lane. Covers persistent /reasoning on, separate reasoning stream lanes, and progress-stream suppression.\n\nVerification:\n- node scripts/run-vitest.mjs src/auto-reply/reply/dispatch-from-config.test.ts extensions/telegram/src/bot-message-dispatch.test.ts\n- git diff --check upstream/main...HEAD\n- .agents/skills/autoreview/scripts/autoreview --mode branch --base upstream/main --stream-engine-output\n- CI run 28411526182 green, including QA Smoke CI and check-test-types\n- Real behavior proof run 28411676681 passed\n\nPR: openclaw#97875


Related: #94937
Related: #95051
Related: #96106
What Problem This Solves
Fixes an issue where Telegram users with reasoning enabled could lose durable reasoning replies when an agent emitted them as reasoning block or final payloads. The shared reply dispatcher suppressed those payloads before Telegram's reasoning lane could render them.
Why This Change Was Made
This adds an explicit shared
reasoningPayloadsEnabledopt-in for channels that own a separate reasoning lane. Telegram enables that opt-in only when its resolved reasoning level is notoff; generic channels keep the historical suppression, and shared TTS no longer synthesizes reasoning payloads.User Impact
Telegram can show durable reasoning in the reasoning lane when users have reasoning enabled, without exposing hidden reasoning when the lane is off. Other channels keep their previous behavior unless they deliberately opt into the shared reasoning payload path.
Evidence
node scripts/run-vitest.mjs src/auto-reply/reply/dispatch-from-config.test.ts extensions/telegram/src/bot-message-dispatch.test.tsgit diff --check.agents/skills/autoreview/scripts/autoreview --mode local --base upstream/main-> clean: no accepted/actionable findings reportedAI-assisted with Codex.