GraphInterrupt Not Re-raised in awrap_tool_call Wrapper Path
Observed agent action
ToolNode's awrap_tool_call wrapper path catches GraphInterrupt in a generic except Exception block and passes it to handle_tool_errors, producing a ToolMessage with error content instead of suspending the graph.
Expected boundary
GraphInterrupt (a GraphBubbleUp subclass) must be re-raised untouched at any exception boundary inside tool execution, including inside awrap_tool_call middleware, so the graph suspends instead of treating it as a tool failure.
Runtime context
LangGraph 1.2.6, Python 3.12, a ToolNode configured with both awrap_tool_call middleware and handle_tool_errors, executing a tool that calls interrupt() to pause for human approval.
Evidence supplied
Removing awrap_tool_call restores correct suspension behavior, and the printed output literally shows the Interrupt payload stringified inside a 'Tool call failed (GraphInterrupt)' error message rather than the graph halting.
Evidence needed next
- No obvious evidence gaps in the first submission.
Commercial routing
Use the public artifact for broadly useful redacted failures; use the private audit path when the evidence is sensitive or the operator needs a concrete fix, guardrail, or receipt proof.
Next proof step
Convert the submitted failure into the smallest reusable control: a deterministic guardrail, receipt proof, public autopsy entry, or private diagnosis if evidence is sensitive.