Applied AI
LangGraph.js can show one subgraph approval more than once
Deduplicate streamed interrupt IDs and verify pending graph state before presenting human approvals.
November 8, 2026
One human approval should appear once. A recent LangGraph.js issue shows streamEvents(..., { version: "v3" }) listing the same subgraph interrupt twice in run.interrupts, with the same interruptId. A deeper nested subgraph can surface it three times. In the reporter’s example, invoke() and getState() show only one pending interrupt. A UI that renders every streamed entry can ask a reviewer the same question repeatedly.
Confirm the pending decision
Capture the graph and subgraph version, stream API, interruptId, namespace, and count. Compare the streamed list with persisted graph state for the same thread. The issue’s minimal graph pauses for one refund approval inside a subgraph; it is not evidence that the user has two separate decisions to make. LangGraph’s interrupt documentation explains that the graph pauses and waits for external input, then resumes the affected node.
Present one approval per stable ID
At the UI boundary, group pending entries by interruptId while preserving their namespace and payload. If the same ID arrives with conflicting payloads, stop and investigate rather than silently picking one. Before enabling the approval button, read current pending state so the user is not approving an interrupt that has already been resolved or superseded. On submit, bind the response to the stable ID and current thread state. This is a guard for the reported duplication, not a substitute for upstream correctness.
Test nested and resumed flows
Cover a root interrupt, one subgraph, two nested subgraphs, and a resume after reconnect. Assert the screen shows the expected count and that one response advances the graph once. Keep the raw stream trace for a support or upstream report. Remove the UI guard only after a release is verified in your deployment; the issue currently describes a proposed source-level change, not a confirmed release.
Adovo’s view
Approval is an authority boundary, not a stream decoration. If the same decision appears twice, people lose confidence in what they authorized. Identify the decision once, bind it to current state, and make the system prove what happened after the response.
