@tdd_issue @tdd_issue_10512
Feature: MCPToolAdapter releases RLock during transport calls
  As a developer using MCPToolAdapter concurrently
  I want the adapter to release its RLock before making transport calls
  So that concurrent operations are not blocked by slow transport calls

  # -------------------------------------------------------------------
  # Bug #10512: MCPToolAdapter holds RLock during entire transport call,
  # blocking concurrent operations.
  #
  # The fix releases the lock before the transport.call() and
  # re-acquires it only when shared state must be mutated.
  # -------------------------------------------------------------------

  Scenario: Concurrent invoke calls are not blocked by a slow transport
    Given a connected MCP adapter with a concurrency-tracking transport tool "slow_op" taking 0.05 seconds
    When I invoke "slow_op" concurrently from 3 threads
    Then all 3 concurrent invocations should succeed
    And at least 2 invocations should have been in-flight simultaneously

  Scenario: Concurrent discover_tools calls are not blocked by a slow transport
    Given a connected MCP adapter with a concurrency-tracking discovery transport taking 0.05 seconds
    When I call discover_tools concurrently from 3 threads
    Then all 3 concurrent discoveries should succeed
    And at least 2 discoveries should have been in-flight simultaneously

  Scenario: Lock is not held during invoke transport call
    Given a connected MCP adapter with a lock-checking transport tool "check_lock"
    When I invoke "check_lock" with arguments {}
    Then the invocation should succeed
    And the lock should not have been held during the transport call

  Scenario: Lock is not held during discover_tools transport call
    Given a connected MCP adapter with a lock-checking discovery transport
    When I discover tools from the adapter
    Then the lock should not have been held during the discovery transport call

  Scenario: Invoke still validates under lock before transport call
    Given a connected MCP adapter with a slow transport tool "slow_op" taking 0.1 seconds
    When I invoke "nonexistent_tool" with arguments {}
    Then the invocation should fail
    And the invocation error should mention "not found"

  Scenario: Invoke on disconnected adapter still raises under lock
    Given an MCP adapter with a mock transport
    When I invoke MCP tool "any_tool" while disconnected
    Then the adapter error should mention "not connected"

  Scenario: Discover on disconnected adapter still raises under lock
    Given an MCP adapter with a mock transport
    When I discover tools expecting an error
    Then the adapter error should mention "not connected"
