Symptom
With human approval on, a second after_model middleware that returns {"jump_to": "tools"} runs a tool call the person rejected. No exception is printed.
Evidence what you'll see
- The control line is
CONTROL (no jump middleware): rejected tool executed = False. - The jump line is
EXPERIMENT (jump_to='tools'): rejected tool executed = True. - The issue's error-message section is empty.
Why it happens
HumanInTheLoopMiddleware stores the call in pending_tool_calls and interrupts. Another after_model middleware that returns the documented jump_to value tools sends the graph straight to the tool node, so the review middleware never runs. A tool_call_id already sitting in pending_tool_calls is not checked again on that path.
Affected versions
Linux, Python 3.12.3, langchain 1.4.0, langchain_core 1.6.2, langgraph 1.2.11. The linked issue does not name a Node version.
Fix steps
0 of 2 done
Your check marks stay in this browser only.
How to check it worked
- A rejected call stays unexecuted. The issue's control print is
rejected tool executed = False.
If it still fails
- The issue says a call whose
tool_call_idis already inpending_tool_callsis not dropped on the bypassed path. The linked issue does not name alangchainrelease after1.4.0.
Sources and credit
Summarized in our own words from these public reports. Credit goes to their authors.
Provided as is, without warranty. Try changes in a non-production environment and back up first. Security-related steps: verify against the official docs. Terms · Request removal or attribution change
Hit an error we don't cover? Submit it