Skip to main content
A signal is a named message that you send to a node of a running execution. The WAIT_FOR_SIGNAL plugin uses signals for human-in-the-loop steps: it holds each message until its signal arrives, then lets the message go on, drops it or fails, depending on the decision.

Add a wait

Any decision other than reject lets the message through. The message is tagged with signal.name, signal.decision and signal.data, so a later branch can route on metadata.signal.decision. The engine’s idle timeout for this node is the wait plus 30 seconds, so the node does not time out while it waits.

Send a signal

The call needs the OPERATOR role. Signals go through the same ordering, review and audit as every other command. The same action is available as the MCP tool signal_node, in the web UI’s pending-approvals strip, and in the CLI.

When the node is not waiting yet

List pending approvals

returns every open wait of the session, oldest first, with the execution and node it belongs to. The MCP tool list_pending_approvals and the workflow page in the web UI show the same list.

After a restart

The wait itself is held in memory. An answered signal is recorded with the node’s checkpoint, so a resumed execution reuses the answer for the same message instead of waiting again; this needs a file or PostgreSQL checkpoint store. A timeout is not recorded. A pending approval is not visible after a restart until its node waits again, and live waits are not carried over on a high-availability takeover.

Limits and defaults