A developer building a code assistant notices that tool_use response blocks are being returned by Claude but the tool results are sometimes ignored by subsequent Claude turns — Claude proceeds as if the tool was never called. Debugging shows the conversation history is being correctly appended. The issue occurs specifically when tool_result blocks are returned with is_error: true. What is the most likely root cause and fix?
Select an answer to reveal the explanation.
Short Explanation and Infographic
Here's the deal — the tool_use_id mismatch is the classic cause of tool results being 'ignored.' Every tool_use block Claude emits contains a unique tool_use_id (e.g., 'toolu_01A...'). The corresponding tool_result block in the next user message must reference the exact same tool_use_id to establish the linkage.
Full explanation below image
Full Explanation
The tool_use_id mismatch is the classic cause of tool results being 'ignored.' Every tool_use block Claude emits contains a unique tool_use_id (e.g., 'toolu_01A...'). The corresponding tool_result block in the next user message must reference the exact same tool_use_id to establish the linkage. If the developer's code generates a new ID, copies it incorrectly, or there's a serialization error, the IDs won't match — Claude cannot associate the result with the original tool call and proceeds without it. This issue surfaces specifically with error results if the error-handling code path has a bug in ID propagation that the success path doesn't. Option B describes a real structural error but doesn't explain why it specifically manifests with is_error: true. Option A is factually incorrect — Claude processes is_error: true results; the error flag is informational, not a filter trigger. Option D is also incorrect — the content field in error tool results can be empty strings; the API does not silently drop empty-content error results.