OpenClaw

OpenClaw separates private reasoning from visible replies

OpenClaw proposes stripping internal reflection blocks from visible replies, surfacing tool-only completions that otherwise look empty and diagnosing recovery states left idle without an owner. The cluster treats truthful user-visible output and truthful runtime ownership as the same reliability problem.

← Back to homeOriginal source ↗

openclaw/openclaw PR #122650 is the inspected primary source: “ fix(reasoning-tags): strip <internal> reflection blocks from visible replies.” The related records below were inspected as supporting context rather than independent confirmation.

The facts

- openclaw/openclaw PR #122650 was created 2026-08-12T14:28:36Z and was open at inspection; its title is “ fix(reasoning-tags): strip <internal> reflection blocks from visible replies.” - openclaw/openclaw PR #105765 was created 2026-07-12T23:51:04Z and was open at inspection; its title is “fix(auto-reply): surface empty message-tool-only completions.” - openclaw/openclaw PR #93247 was created 2026-06-15T10:11:55Z and was open at inspection; its title is “fix(diagnostics): idle ownerless state after failed recovery.” - The repository reported 386089 stars, 5529 open issues, default branch main, and last push 2026-08-13T00:59:58Z. - The latest tagged-release baseline checked was v2026.7.1-2 published 2026-08-04T00:41:26Z.

What changed

openclaw/openclaw PR #122650 reports: Closes #122623 Summary Model-produced … reflection blocks were not recognized by the canonical reasoning-tag sanitizer, so they survived both the automatic-reply path and the message-tool send path, delivering private assistant reasoning as visible chat messages. Adding "internal" to REASONING_TAG_NAMES makes the shared sanitizer strip these blocks for all channels. **Problem**: The REASONING_TAG_NAMES array in packages/markdown-core/src/reasoning-tag-parser.ts listed 12 known reasoning tag names (think, thinking, thought, reasoning, antthinking, antml:*, mm:*) but did not include internal. When a model emits … reflection blocks (e.g. in response to Signal/Telegram reply_to_id == message_id self-reply metadata), the canonical stripReasoningTagsFromText treated as an invalid tag and left the block intact. Both outbound delivery paths — sanitizeAssistantVisibleText (automatic replies, used by every channel adapter) and sanitizeMessageToolVisiblePayload → stripFormattedReasoningMessage (message-tool sends) — delegate to this shared stripper, so the content leaked through as user-visible chat messages. **Solution**: Add "internal" to REASONING_TAG_NAMES. The existing reasoning-tag parser already handles code-region protection, streaming partitioning, malformed-tag recovery, and strict/preserve modes for all listed tags — adding one entry extends all of that automatically. **What changed**: packages/markdown-core/src/reasoning-tag-parser.ts (+1 line:

openclaw/openclaw PR #105765 reports: Related: #99712 What Problem This Solves Fixes an issue where an interactive source-channel turn could finish with no visible reply when message_tool_only was active and the agent produced neither a message-tool delivery nor a final payload. Users could see progress and then silence, while OpenClaw logged that the visible channel turn had no queued reply payloads. This is a narrow follow-up to the empty interactive completion handling added in #100456. The broader cross-channel delivery contract in #87561 is intentionally out of scope. Why This Change Was Made Delivery mode is not evidence of deliberate silence. The change lets the existing sanitized, OpenClaw-owned empty-completion diagnostic pass through message_tool_only source suppression while keeping private model finals private. Explicit NO_REPLY, heartbeats, room/internal turns, configured silence, continuations, committed deliveries and side effects, terminal failures, and true stranded-reply retries retain their existing behavior. User Impact Users now receive a safe retry-oriented error instead of unexplained silence when an interactive turn genuinely completes without anything deliverable. No private assistant text, provider error detail, or transcript content is exposed. Evidence Semantic RED

openclaw/openclaw PR #93247 reports: Closes #91697 What This Fixes A failed stuck-session recovery must remove only stale, pre-recovery diagnostic activity. Earlier heads could also clear a tool or model start that arrived after recovery began, leaving live work falsely idle. Scope Keep the recovery generation guard and existing non-mutating outcomes. Reconcile stale ownerless activity before idling a failed recovery. Record the diagnostic-event watermark and preserve post-watermark tool/model activity, including activity queued immediately before the recovery promise rejects. Refresh the generated Plugin SDK contract hashes required by the repository gate. The public SDK declarations are unchanged. Evidence Rebase base: abe0cd691dfab5c7c906c79a790fb77416902258 Exact head: ba4e6ca8d1ea65cdbaac198effe10adba34ba3d4 Environment: isolated macOS source worktree; the contract generator was run directly with Node.js 24.19.0. Regression coverage Coverage includes stale pre-watermark tool/model cleanup, delivered and queued post-watermark tool/model starts, active embedded owners, newer generations, queued follow-up behavior, and recovery-runtime integration. Real production-heartbeat observation A standalone harness used production startDiagnosticHeartbeat, real 30-second intervals, the production diagnostic event queue, and production session/activity stores. It installed no fake timer. Each failed recovery callback first queued a fresh start event, confirmed it

Why it matters

An agent can finish useful work and still appear silent, or leak internal reflection and appear far too verbose. Output boundaries and recovery ownership must agree on what the user is allowed to see and whether anyone still owns the turn. The operator test is whether visible output, retained state and authority still describe the same event after retries, background work or restart.

Current

The primary record was open when captured on 2026-08-13. The tagged-release baseline was v2026.7.1-2 published 2026-08-04T00:41:26Z. Repository metadata, full source bodies, current pull requests and issues, releases, Google News, Hacker News, Lobsters, Metamesh and the rendered ClawCharts row were inspected. ClawCharts selected the subject; it did not prove the claim.

Evidence

The primary URL is https://github.com/openclaw/openclaw/pull/122650. Supporting records are https://github.com/openclaw/openclaw/pull/105765 and https://github.com/openclaw/openclaw/pull/93247. Source bodies, timestamps and states are preserved in the daily evidence bundle. Test counts and reproductions remain attributed to their authors unless identified as independently rerun.

Source boundary

Open work is described as open, closed work as closed, and operator reports as reports. A pull request is evidence of proposed or reviewed direction, not proof of a shipped release. Search residue, package mirrors and historically published source spines were excluded.

Operator take

Keep private reasoning structurally separate from delivery, emit an explicit completion state for tool-only turns, and make ownerless recovery a machine-visible fault rather than an idle-looking success. Preserve a before-state receipt, make the smallest reversible change, and verify the original failure independently.

Caveat

Public project records are mutable. Status, scope and evidence can change after publication. This brief records the inspected state and does not authorize changes to a reader’s deployment.

Source inspected; source state, environment and release boundary remain explicit.