mirror of
https://github.com/anthropics/claude-code.git
synced 2026-04-19 01:52:42 +00:00
Compare commits
11 Commits
claude/sla
...
claude/sla
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b5cc83f600 | ||
|
|
eb87245010 | ||
|
|
3680637065 | ||
|
|
2192c86c20 | ||
|
|
dfd3494132 | ||
|
|
e8cca9a7af | ||
|
|
6358669884 | ||
|
|
ace0a82778 | ||
|
|
e095e1270a | ||
|
|
69da5e8269 | ||
|
|
7069a25987 |
123
.github/issues/duplicate-tool-result-bug.md
vendored
123
.github/issues/duplicate-tool-result-bug.md
vendored
@@ -1,123 +0,0 @@
|
||||
# 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
|
||||
64
CHANGELOG.md
64
CHANGELOG.md
@@ -1,5 +1,69 @@
|
||||
# Changelog
|
||||
|
||||
## 2.0.69
|
||||
|
||||
- Improved `/resume` summaries after compaction to show what was actually being worked on instead of generic compaction messages
|
||||
- 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.
|
||||
|
||||
@@ -93,11 +93,6 @@ 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:
|
||||
@@ -108,8 +103,6 @@ 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
|
||||
|
||||
Reference in New Issue
Block a user