-
-
Notifications
You must be signed in to change notification settings - Fork 80.7k
[Bug] claude-cli backend: synthetic "No response requested." placeholder leaves Telegram turn fully silent with no observability #90789
Copy link
Copy link
Open
Labels
P2Normal backlog priority with limited blast radius.Normal backlog priority with limited blast radius.clawsweeper:fix-shape-clearClawSweeper found a clear likely implementation shape for this issue.ClawSweeper found a clear likely implementation shape for this issue.clawsweeper:linked-pr-openClawSweeper found an open linked pull request for this issue.ClawSweeper found an open linked pull request for this issue.clawsweeper:needs-maintainer-reviewClawSweeper marked this issue as needing maintainer review before automation.ClawSweeper marked this issue as needing maintainer review before automation.clawsweeper:needs-product-decisionClawSweeper marked this issue as needing a product or behavior decision.ClawSweeper marked this issue as needing a product or behavior decision.clawsweeper:no-new-fix-prClawSweeper does not recommend queueing a new automated fix PR for this issue.ClawSweeper does not recommend queueing a new automated fix PR for this issue.clawsweeper:source-reproClawSweeper found a high-confidence source-level issue reproduction.ClawSweeper found a high-confidence source-level issue reproduction.impact:message-lossChannel message delivery can be lost, duplicated, or misrouted.Channel message delivery can be lost, duplicated, or misrouted.issue-rating: 🦞 diamond lobsterVery strong issue quality with high-confidence source-level or clear reproduction.Very strong issue quality with high-confidence source-level or clear reproduction.
Description
Metadata
Metadata
Assignees
Labels
P2Normal backlog priority with limited blast radius.Normal backlog priority with limited blast radius.clawsweeper:fix-shape-clearClawSweeper found a clear likely implementation shape for this issue.ClawSweeper found a clear likely implementation shape for this issue.clawsweeper:linked-pr-openClawSweeper found an open linked pull request for this issue.ClawSweeper found an open linked pull request for this issue.clawsweeper:needs-maintainer-reviewClawSweeper marked this issue as needing maintainer review before automation.ClawSweeper marked this issue as needing maintainer review before automation.clawsweeper:needs-product-decisionClawSweeper marked this issue as needing a product or behavior decision.ClawSweeper marked this issue as needing a product or behavior decision.clawsweeper:no-new-fix-prClawSweeper does not recommend queueing a new automated fix PR for this issue.ClawSweeper does not recommend queueing a new automated fix PR for this issue.clawsweeper:source-reproClawSweeper found a high-confidence source-level issue reproduction.ClawSweeper found a high-confidence source-level issue reproduction.impact:message-lossChannel message delivery can be lost, duplicated, or misrouted.Channel message delivery can be lost, duplicated, or misrouted.issue-rating: 🦞 diamond lobsterVery strong issue quality with high-confidence source-level or clear reproduction.Very strong issue quality with high-confidence source-level or clear reproduction.
Type
Fields
Priority
None yet
Summary
When the bundled
claude-clibackend hits AbortError / no-output / wedged-session conditions, Claude Code CLI injects a synthetic assistant message withmodel: "<synthetic>"and content"No response requested.". OpenClaw's stream-json parser does not extract text from assistant message blocks (onlytool_use/tool_result), and the trailingtype: "result"event commonly carries an emptyresultstring in this case. The turn is then classified asemptyand dropped silently. The user sees no message, no status, no retry indicator.Why it matters
End users can't distinguish "OpenClaw is stuck" from "model decided not to reply." In a long-running multi-step session (workflows, deep-research, PDF generation), this consistently happens after large tool-heavy turns. The user has to manually probe with "are you there?" to trigger a fresh turn.
Reproduction shape
claude-cli/Claude-Opus-4.7(bundled@anthropic-ai/claude-code)telegram(group with topics, but also reproduces in DM){ "type": "assistant", "message": { "model": "<synthetic>", "role": "assistant", "content": [{"type": "text", "text": "No response requested."}], "stop_reason": "stop_sequence", "usage": {"input_tokens": 0, "output_tokens": 0} } }Root cause (from code inspection)
src/agents/cli-output.ts:573-602— assistant message handler only iteratestool_use/tool_resultblocks, notextextraction. Synthetic-message text is silently dropped at parse time.src/agents/cli-output.ts:374-388—type: "result"extractor returns{text: ""}when result string is empty (a real codepath for tool-only turns).src/agents/embedded-agent-runner/result-fallback-classifier.ts:11-13—hasDeliberateSilentTerminalReplycallsisSilentReplyPayloadText, which only matchesNO_REPLY(case-insensitive).No response requested.is not in the silent-token set.result-fallback-classifier.ts:73—if (!isGpt5ModelId(params.model)) return null— non-GPT-5 backends never trigger the auto-fallback/retry branch for empty/synthetic results.Background on the upstream placeholder
No response requested.is a Claude Code CLI synthetic assistant message injected byensureToolResultPairingand similar repair paths, exported asNO_RESPONSE_REQUESTEDinsrc/utils/messages.tsof Claude Code, marked withmodel: "<synthetic>"(sources: Yuyz0112/claude-code-reverse, claude-code-best/claude-code). It's a well-known noise string filtered out by third-party Claude Code GUIs (e.g. sting8k/pi-vcc, edmundmiller/dotfiles).Proposed fix
Minimum (correctness)
cli-output.tsparseClaudeStreamJsonResult, detectparsed.type === "assistant"withmessage.model === "<synthetic>"and content text matching the known synthetic-placeholder set ("No response requested.","Continue from where you left off."). Tag the result with a new classification, e.g.synthesized-placeholder.result-fallback-classifier.ts, treatsynthesized-placeholderashasDeliberateSilentTerminalReply === trueAND additionally surface a structured status signal back to the channel adapter (so Telegram can render a status reaction or one-shot debug breadcrumb).Nice-to-have (observability)
classifyEmbeddedAgentRunResultForModelFallback, or at least extend it to classifysynthesized-placeholderas retryable forclaude-clibackends (Claude CLI's own AbortError path already produces these placeholders; the retry could be one-shot to avoid loops).silentErrorReplies-style status surface for synthetic-placeholder turns so users can see "🟡 backend produced no output, no retry" instead of nothing.Related
No added response from me.)Environment
2026.6.1claude-cli/Claude-Opus-4.7