Skip to content
Expedify
9 min

The gate: Human Approval before anything happens

Where the gate sits, what an expired approval means, who actually gets asked, and how to make it fail closed.

Everything so far has been preparation. This is the node that makes the difference between a system that proposes and a system that acts: nothing irreversible happens until a human says so.

The gate, and both of its exits

The condition routes on the verdict. Approved work reaches a human; rejected work becomes a task somebody owns.

Loop BodyCompleteNoYes

Scroll for all 12 steps →

The five fields this build sets, described by the node's own schema.

prompt

What it holds
Question or prompt to show the user Defaults to Please review and approve to continue.

inputType

What it holds
Type of input interface One of: options · text · approval Defaults to approval.

timeout

What it holds
Timeout in seconds (0 for no timeout) Defaults to 300.

allowModification

What it holds
Allow user to modify the data before approval Defaults to true.

showData

What it holds
Display current data to the user Defaults to true.

The two questions everyone asks

What happens when the timeout expires?

The run ends. It does not proceed, and it does not quietly approve — on a verified run the execution sat paused for the full hour and then expired with nothing executed. That is the correct behaviour and it is worth stating as a design choice rather than a default: an expired approval is a rejection. A timeout of zero — wait forever — is also a decision, and it means a run of yours is pending somewhere until someone finds it.

Who actually gets asked?

Whoever is watching the surface the run was started from. This matters more than it sounds: a run started from a chat panel raises the approval card in that chat, while a run started by a schedule or a webhook pauses and waits for someone to go looking. If your gate is on an unattended workflow, decide now who is notified, because the node’s job is to stop — not to find you.

The gate fails closed

On one run the reviewer itself errored. The verdict never arrived, the condition compared an empty value, and the workflow took the false branch — escalating to a human instead of approving. That is the behaviour you want and it is worth checking deliberately in your own build, because the opposite arrangement is easy to write by accident: a gate that tests for rejection and lets everything else through will approve on every error it ever meets.

Write the condition so that approval is the narrow path. Compare for the exact value that means yes, and send everything else — rejections, errors, empty strings, surprises — down the branch where a human owns the outcome.

What the false branch has to do

An escalation that goes nowhere is worse than no gate at all, because it looks like control. The rejected path here creates a task, with a title that says what happened, the reviewer’s score, and a priority — a thing that appears in somebody’s queue rather than a message in a log nobody opens.

A defect worth knowing about, because you may hit its shape elsewhere. Until recently this node could not run at all in any workflow started by an API key, a webhook, a schedule or an integration: it recorded the approver’s identity in a field that only accepts a proper user id, and a machine-triggered run has no user. Every such run died at the gate. It was a one-line fix, and it had been invisible for a long time for the reason lesson 17 is about — the gate is the point past which nothing automated had ever reached.

The rule

The gate sits in front of the irreversible tier. Always. Not in front of the agent, which would make every lookup wait for a human, and not after the write, which is a notification rather than a control. Immediately before the first node that changes something you cannot change back.

Related lessons