Shadow failure case

GraphInterrupt Not Re-raised in awrap_tool_call Wrapper Path

Artifact graphinterrupt-not-re-raised-in-awrap-tool-call-wrap-292e4a05d8 · generated 2026-07-05T12:12:18.801927+00:00 · source: langchain-ai/langgraph #8217

This is the automatic first artifact from a falsification-bounty submission. It is redacted and public-safe by default; the next step is to turn the failure into a reusable proof, guardrail, or diagnosis.
Request private audit Follow the failure feed

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

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.