Skip to content

🚨 CRITICAL: tool_use blocks missing tool_result blocks - Complete system failure #11777

@VincentJGeisler

Description

@VincentJGeisler

GitHub Issue Content for RooCodeInc/Roo-Code

Issue URL: https://github.com/RooCodeInc/Roo-Code/issues/new?template=bug_report.yml


Title

🚨 CRITICAL: tool_use blocks missing tool_result blocks - Complete system failure

Labels

  • bug
  • critical
  • P0
  • blocker

Bug Description

The Roo agent system is generating malformed API requests to Anthropic's Messages API, causing complete failure of all multi-tool operations. This is a CRITICAL BLOCKER preventing any productive use of the Roo plugin.

Error Message

Error: Unknown Error: The model returned the following errors: 
messages.14: tool_use ids were found without tool_result blocks immediately after: 
  - tooluse_B8gcmu8mnHEeUKh40Sisud
  - tooluse_QY8c3vPo2n5jQqDcTw7MXh
  - tooluse_Uj8iOkWzQsRKrjf7WVd0La
  - tooluse_nIz7ESflVjMzuaHL3cShPH

Each tool_use block must have a corresponding tool_result block in the next message.

To Reproduce

Steps:

  1. Start Roo agent in Debug mode (or any mode)
  2. Issue a request requiring 4+ parallel tool calls (e.g., "search codebase for X and read files Y, Z, W")
  3. Wait for tools to execute
  4. Error occurs when agent attempts next API call

Frequency: ~100% reproducible with 4+ parallel tools


Expected Behavior

All tool_use blocks should have corresponding tool_result blocks in the next user message per Anthropic API requirements.


Actual Behavior

The system sends API requests with tool_use blocks but missing or incomplete tool_result blocks, violating Anthropic's API contract and causing immediate failure.


Root Cause Analysis

Primary Diagnosis (80% confidence): Message history reconstruction bug

When rebuilding conversation history for the API request:

  1. Agent executes 4 tools in parallel ✅
  2. All 4 tool_use blocks recorded in assistant message ✅
  3. BUG: Tool results missing/incomplete when constructing next user message ❌
  4. Malformed API request sent ❌
  5. Anthropic API rejects request ❌

Impact

  • Complete system failure for multi-tool operations
  • No workaround available to end users
  • 100% blocker for Debug, Code, and Ask modes
  • All users affected when triggering 4+ parallel tools

Environment

  • OS: Linux 5.15
  • VSCode: Remote Server Environment
  • Roo Version: Latest (as of 2026-02-27)
  • Model: us.anthropic.claude-sonnet-4-5-20250929-v1:0
  • Date: 2026-02-27T02:31:57.048Z

Proposed Fix

1. Add Message History Validation

function validateMessageHistory(messages: Message[]): void {
  for (let i = 0; i < messages.length - 1; i++) {
    const current = messages[i];
    const next = messages[i + 1];
    
    if (current.role === "assistant") {
      const toolUses = current.content.filter(c => c.type === "tool_use");
      
      if (toolUses.length > 0 && next.role === "user") {
        const toolResults = next.content.filter(c => c.type === "tool_result");
        const toolUseIds = new Set(toolUses.map(t => t.id));
        const toolResultIds = new Set(toolResults.map(r => r.tool_use_id));
        
        // Ensure every tool_use has corresponding tool_result
        for (const id of toolUseIds) {
          if (!toolResultIds.has(id)) {
            throw new Error(`Missing tool_result for tool_use: ${id}`);
          }
        }
      }
    }
  }
}

2. Ensure Complete Result Collection

async function executeToolsAndCollectResults(tools: ToolCall[]): Promise<ToolResult[]> {
  // Wait for ALL tools to complete
  const results = await Promise.all(
    tools.map(tool => executeTool(tool))
  );
  
  // Verify result count matches tool count
  if (results.length !== tools.length) {
    throw new Error(`Tool count mismatch: ${tools.length} tools, ${results.length} results`);
  }
  
  return results;
}

3. Pre-Send API Validation

function validateBeforeSend(apiRequest: AnthropicRequest): void {
  validateMessageHistory(apiRequest.messages);
  
  // Additional validation for pending tool_uses
  const lastAssistant = apiRequest.messages.findLast(m => m.role === "assistant");
  if (lastAssistant) {
    const toolUses = lastAssistant.content.filter(c => c.type === "tool_use");
    if (toolUses.length > 0) {
      const nextMessage = apiRequest.messages[apiRequest.messages.indexOf(lastAssistant) + 1];
      if (!nextMessage || nextMessage.role !== "user") {
        throw new Error("tool_use blocks must be followed by user message with tool_results");
      }
    }
  }
}

Additional Context

Full technical analysis available: The user has created a comprehensive 500+ line technical report (ROO_CRITICAL_BUG_REPORT.md) with:

  • Detailed root cause analysis
  • Complete reproduction steps
  • Code examples for fixes
  • Testing requirements
  • Impact assessment

Tool IDs from error:

  • tooluse_B8gcmu8mnHEeUKh40Sisud
  • tooluse_QY8c3vPo2n5jQqDcTw7MXh
  • tooluse_Uj8iOkWzQsRKrjf7WVd0La
  • tooluse_nIz7ESflVjMzuaHL3cShPH

Priority Justification

Why P0/CRITICAL:

  1. Complete service outage for multi-tool operations
  2. No workaround available to users
  3. Affects all users (not configuration-specific)
  4. System reliability severely impacted
  5. In-progress work sessions terminated

Expected Resolution: Immediate (within 24 hours)


Attachments

Full detailed report available in project: ROO_CRITICAL_BUG_REPORT.md

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions