Compare commits

..

1 Commits

Author SHA1 Message Date
Claude
20c5837683 docs: Add bug report for duplicate tool_result blocks issue
Documents API error where multiple tool_result blocks are sent with
the same tool_use_id when a tool fails. The "Sibling tool call errored"
message is incorrectly being sent for the same tool that failed,
rather than only for other sibling tools in a parallel batch.

Includes:
- Root cause analysis
- Example JSON from reported incidents
- Suggested fix locations and pseudocode
- Related request IDs for debugging
2025-12-08 01:19:25 +00:00
4 changed files with 137 additions and 84 deletions

View File

@@ -0,0 +1,123 @@
# Bug Report: Duplicate tool_result blocks with same tool_use_id
## Summary
When a tool call fails (particularly observed with the Tmux tool), two `tool_result` blocks are incorrectly sent to the API with the same `tool_use_id`, causing an API error:
```
API Error: 400
{"type":"error","error":{"type":"invalid_request_error","message":"messages.X.content.1: each tool_use must have a single result. Found multiple `tool_result` blocks with id: toolu_XXX"}}
```
## Root Cause
The parallel tool execution error handling code sends a "Sibling tool call errored" message even for the tool that actually failed, when it should only send this message for OTHER sibling tools in the parallel batch.
## Reproduction
1. Execute a tool call that will fail (e.g., Tmux select-pane on a non-existent window)
2. Observe two tool_result messages being generated:
- First: The actual error result ("Window not found...")
- Second: A "<tool_use_error>Sibling tool call errored</tool_use_error>" message with the SAME tool_use_id
## Example JSON (from reported incident)
```json
// Assistant requests tool use
{
"type": "tool_use",
"id": "toolu_01K2K2KFvUrwA9PaHGp652zW",
"name": "Tmux",
"input": {"args": ["select-pane", "-t", "test-perms3:0.0"]}
}
// First tool_result (correct - actual error)
{
"type": "user",
"message": {
"role": "user",
"content": [{
"tool_use_id": "toolu_01K2K2KFvUrwA9PaHGp652zW",
"type": "tool_result",
"content": "Window not found. The specified window may not exist.",
"is_error": true
}]
}
}
// Second tool_result (BUG - same tool_use_id!)
{
"type": "user",
"message": {
"role": "user",
"content": [{
"type": "tool_result",
"content": "<tool_use_error>Sibling tool call errored</tool_use_error>",
"is_error": true,
"tool_use_id": "toolu_01K2K2KFvUrwA9PaHGp652zW"
}]
}
}
```
## Expected Behavior
- When a tool fails, only ONE tool_result should be sent for that tool_use_id
- The "Sibling tool call errored" message should ONLY be sent for OTHER tool_use_ids in a parallel batch, not for the tool that actually errored
## Suggested Fix Location
The fix should be in the code that handles parallel tool execution errors:
```typescript
// Pseudocode for the fix
function handleParallelToolResults(toolUseIds: string[], failedToolId: string, error: Error) {
const results = [];
for (const id of toolUseIds) {
if (id === failedToolId) {
// Send actual error for the failed tool
results.push({
tool_use_id: id,
type: "tool_result",
content: error.message,
is_error: true
});
} else {
// Only send sibling error for OTHER tools
results.push({
tool_use_id: id,
type: "tool_result",
content: "<tool_use_error>Sibling tool call errored</tool_use_error>",
is_error: true
});
}
}
return results;
}
```
Additionally, a deduplication check before sending to the API would prevent this:
```typescript
function deduplicateToolResults(messages: Message[]): Message[] {
const seenToolUseIds = new Set<string>();
return messages.filter(msg => {
if (msg.type === "tool_result") {
if (seenToolUseIds.has(msg.tool_use_id)) {
return false; // Skip duplicate
}
seenToolUseIds.add(msg.tool_use_id);
}
return true;
});
}
```
## Related CHANGELOG Fixes
Similar issues have been fixed before:
- v1.0.84: "Fix tool_use/tool_result id mismatch error when network is unstable"
- v2.0.0: "Hooks: Reduced PostToolUse 'tool_use' ids were found without 'tool_result' blocks errors"
- v2.0.22: "Fix bug causing duplicate permission prompts with parallel tool calls"
## Reported By
Issue reported via Slack with multiple reproductions showing the Tmux tool triggering this bug.
## Request IDs (for debugging)
- req_011CVt2KXhCGmrL2YN9sSZQP
- req_011CVtFYJLPxn9oB9FEkCnRr
- req_011CVtG1PREveTLikakXGEdn

View File

@@ -1,68 +1,5 @@
# Changelog
## 2.0.69
- Minor bugfixes
## 2.0.68
- Fixed IME (Input Method Editor) support for languages like Chinese, Japanese, and Korean by correctly positioning the composition window at the cursor
- Fixed a bug where disallowed MCP tools were visible to the model
- Fixed an issue where steering messages could be lost while a subagent is working
- Fixed Option+Arrow word navigation treating entire CJK (Chinese, Japanese, Korean) text sequences as a single word instead of navigating by word boundaries
- Improved plan mode exit UX: show simplified yes/no dialog when exiting with empty or missing plan instead of throwing an error
- Add support for enterprise managed settings. Contact your Anthropic account team to enable this feature.
## 2.0.67
- Thinking mode is now enabled by default for Opus 4.5
- Thinking mode configuration has moved to /config
- Added search functionality to `/permissions` command with `/` keyboard shortcut for filtering rules by tool name
- Show reason why autoupdater is disabled in `/doctor`
- Fixed false "Another process is currently updating Claude" error when running `claude update` while another instance is already on the latest version
- Fixed MCP servers from `.mcp.json` being stuck in pending state when running in non-interactive mode (`-p` flag or piped input)
- Fixed scroll position resetting after deleting a permission rule in `/permissions`
- Fixed word deletion (opt+delete) and word navigation (opt+arrow) not working correctly with non-Latin text such as Cyrillic, Greek, Arabic, Hebrew, Thai, and Chinese
- Fixed `claude install --force` not bypassing stale lock files
- Fixed consecutive @~/ file references in CLAUDE.md being incorrectly parsed due to markdown strikethrough interference
- Windows: Fixed plugin MCP servers failing due to colons in log directory paths
## 2.0.65
- Added ability to switch models while writing a prompt using alt+p (linux, windows), option+p (macos).
- Added context window information to status line input
- Added `fileSuggestion` setting for custom `@` file search commands
- Added `CLAUDE_CODE_SHELL` environment variable to override automatic shell detection (useful when login shell differs from actual working shell)
- Fixed prompt not being saved to history when aborting a query with Escape
- Fixed Read tool image handling to identify format from bytes instead of file extension
## 2.0.64
- Made auto-compacting instant
- Agents and bash commands can run asynchronously and send messages to wake up the main agent
- /stats now provides users with interesting CC stats, such as favorite model, usage graph, usage streak
- Added named session support: use `/rename` to name sessions, `/resume <name>` in REPL or `claude --resume <name>` from the terminal to resume them
- Added support for .claude/rules/`. See https://code.claude.com/docs/en/memory for details.
- Added image dimension metadata when images are resized, enabling accurate coordinate mappings for large images
- Fixed auto-loading .env when using native installer
- Fixed `--system-prompt` being ignored when using `--continue` or `--resume` flags
- Improved `/resume` screen with grouped forked sessions and keyboard shortcuts for preview (P) and rename (R)
- VSCode: Added copy-to-clipboard button on code blocks and bash tool inputs
- VSCode: Fixed extension not working on Windows ARM64 by falling back to x64 binary via emulation
- Bedrock: Improve efficiency of token counting
- Bedrock: Add support for `aws login` AWS Management Console credentials
- Unshipped AgentOutputTool and BashOutputTool, in favor of a new unified TaskOutputTool
## 2.0.62
- Added "(Recommended)" indicator for multiple-choice questions, with the recommended option moved to the top of the list
- Added `attribution` setting to customize commit and PR bylines (deprecates `includeCoAuthoredBy`)
- Fixed duplicate slash commands appearing when ~/.claude is symlinked to a project directory
- Fixed slash command selection not working when multiple commands share the same name
- Fixed an issue where skill files inside symlinked skill directories could become circular symlinks
- Fixed running versions getting removed because lock file incorrectly going stale
- Fixed IDE diff tab not closing when rejecting file changes
## 2.0.61
- Reverted VSCode support for multiple terminal clients due to responsiveness issues.

View File

@@ -22,29 +22,23 @@ Performs automated code review on a pull request using multiple specialized agen
- **Agent #4**: Analyze git blame/history for context-based issues
5. Scores each issue 0-100 for confidence level
6. Filters out issues below 80 confidence threshold
7. Outputs review (to terminal by default, or as PR comment with `--comment` flag)
7. Posts review comment with high-confidence issues only
**Usage:**
```bash
/code-review [--comment]
/code-review
```
**Options:**
- `--comment`: Post the review as a comment on the pull request (default: outputs to terminal only)
**Example workflow:**
```bash
# On a PR branch, run locally (outputs to terminal):
# On a PR branch, run:
/code-review
# Post review as PR comment:
/code-review --comment
# Claude will:
# - Launch 4 review agents in parallel
# - Score each issue for confidence
# - Output issues ≥80 confidence (to terminal or PR depending on flag)
# - Skip if no high-confidence issues found
# - Post comment with issues ≥80 confidence
# - Skip posting if no high-confidence issues found
```
**Features:**
@@ -120,23 +114,17 @@ This plugin is included in the Claude Code repository. The command is automatica
### Standard PR review workflow:
```bash
# Create PR with changes
# Run local review (outputs to terminal)
/code-review
# Review the automated feedback
# Make any necessary fixes
# Optionally post as PR comment
/code-review --comment
# Merge when ready
```
### As part of CI/CD:
```bash
# Trigger on PR creation or update
# Use --comment flag to post review comments
/code-review --comment
# Automatically posts review comments
# Skip if review already exists
```

View File

@@ -52,9 +52,7 @@ Note: Still review Claude generated PR's.
6. Filter out any issues that were not validated in step 5. This step will give us our list of high signal issues for our review.
7. Finally, output the review.
- If the `--comment` argument is provided, post the review as a comment on the pull request using `gh pr comment`
- Otherwise (default), output the review directly to the terminal for local viewing
7. Finally, comment on the pull request.
When writing your comment, follow these guidelines:
a. Keep your output brief
b. Avoid emojis
@@ -95,6 +93,11 @@ Found 3 issues:
<link to file and line with full sha1 + line range for context>
🤖 Generated with [Claude Code](https://claude.ai/code)
<sub>- If this code review was useful, please react with 👍. Otherwise, react with 👎.</sub>
---
- Or, if you found no issues:
@@ -105,6 +108,8 @@ Found 3 issues:
No issues found. Checked for bugs and CLAUDE.md compliance.
🤖 Generated with [Claude Code](https://claude.ai/code)
---
- When linking to code, follow the following format precisely, otherwise the Markdown preview won't render correctly: https://github.com/anthropics/claude-code/blob/c21d3c10bc8e898b7ac1a2d745bdc9bc4e423afe/package.json#L10-L15