Feature: Bridge coverage boost for uncovered lines in bridge.py As a developer I want thorough tests for remaining uncovered lines in bridge.py So that code coverage reaches its maximum # Targets uncovered lines: # Line 64: early return from cleanup_tasks_async when no tasks exist # Lines 79-83: pending tasks that do not complete within timeout # Lines 89-93: late tasks added to _active_tasks during cleanup await # Line 149: MESSAGE_ROUTER node with "rules" in create_graph_from_config # Lines 282-290: execute_node inner coroutine in _create_node_operator Scenario: cleanup_tasks_async returns immediately when no tasks are active Given a bridge with an empty active tasks set When I call cleanup_tasks_async on the idle bridge Then the async cleanup should complete without error And the bridge active task set should remain empty Scenario: cleanup_tasks_async logs pending tasks that exceed timeout Given a bridge with a task that ignores cancellation When I call cleanup_tasks_async with a very short timeout Then pending tasks should be re-cancelled after the timeout And the bridge active task set should be cleared after timeout cleanup Scenario: cleanup_tasks_async cancels late tasks added during await Given a bridge with a task whose done-callback spawns a late task When I call cleanup_tasks_async allowing callback to fire Then the late task should be cancelled during cleanup And the bridge active task set should be cleared after late-task cleanup Scenario: create_graph_from_config sets rules metadata for MESSAGE_ROUTER nodes Given a bridge ready to create graphs from config When I create a graph with a MESSAGE_ROUTER node containing rules Then the node config metadata should contain the routing rules Scenario: Node operator executes the inner coroutine and updates state Given a bridge with a graph containing a mock executable node When I pipe a message through the node operator and await the result Then the node execute method should have been called And the state manager should have been updated with the node result And the returned message metadata should contain the node and graph names