Use case · LangGraph

Human-in-the-loop approvals for LangGraph

LangGraph has interrupts for human input, but you still own the reviewer surface, the policy, and the audit trail. Drop gate.require() into a node and Seal handles routing to Slack, enforcing the verdict, and recording a tamper-evident log — so a graph can pause on exactly the risky edges.

async function transferNode(state) {
  await gate.require("payments.transfer", state.transfer);
}

Where it fits

  • Gate a node that performs an irreversible action mid-graph
  • Require approval only when state crosses a policy threshold
  • Record which human resumed the graph and why

Frequently asked questions

How is Seal different from LangGraph's interrupt?+

interrupt() pauses the graph and hands control back to your app; you still build the approval UI, policy, and audit trail. Seal is the approval control itself — Slack routing, verdict enforcement, and a hash-chained log — callable from inside a node.

Can I use Seal with LangGraph checkpoints?+

Yes. gate.require() is a plain async call inside a node, so it composes with checkpointing and resumable graphs without special wiring.