Configuration
- Assign — which assign to inspect.
- Bail when
- value is empty (default): trips on
nil, empty string, empty list, or empty map. Matches the common “upstream lookup found nothing” pattern. - value is nil: strict nil-only check. Empty strings/lists/maps pass through — useful when an empty collection is a real value.
- value is falsey: trips on
nilorfalse. Use when a boolean assign signals “go” vs “stop”. - value is defined: inverse — trips when the assign has any value. Useful for “skip if already exists” flows.
- rule holds: trips when the Rule text is true. The Assign
above is the rule’s subject, so
salary_amount > 40000reads it directly; other assigns are reachable by name (count(absences where twine_time_type = "sick_leave") >= 1). A blank rule passes. See Expressions for the full language. - condition holds: trips when this node’s own inner graph produces a true result. Drill in to build the condition the same way you’d build a Flow Filter predicate — compare, match, check membership, combine with and/or. Use this whenever “is it empty?” isn’t the question: bail when the salary code is one of these, bail when the employee number starts with TMP, bail when the amount is zero. The Assign above becomes the condition’s subject, so Attribute nodes inside it can read that entity’s fields directly.
- value is empty (default): trips on
- On condition error (condition mode only) — what happens when the
condition graph itself fails to evaluate:
- Halt flow (default): fail the run. A guard that can’t tell you whether to proceed shouldn’t guess.
- Skip branch: stop this path only. The failure is still logged and the run still finishes completed with issues — a condition that blew up never counts as “the condition didn’t hold”.
- On bail
- Skip branch (default): stop only this path. Parallel branches keep going. Inside Flow Each, the next iteration runs normally. Nothing is recorded as an error.
- Halt flow: stop the whole run. Marked as aborted in the run history.
- Reason (optional) — the message surfaced when the guard trips.
Supports
{assign_key}interpolation. Defaults to an auto-generated message. - Completion key (optional) — when set, a Skip branch bail
also writes a completion marker for this key (the same store a
Completion Guard reads). Supports
{assign_key}interpolation. Halt flow bails never write a marker. Leave blank to disable. - Completion key assign (optional) — alternatively, name an assign whose raw value is the marker key — the natural choice when the key is an external reference string. The literal key above wins when both are set.
- Counter (optional) — when a counter name is set, a Skip
branch bail also increments that run counter (shown on the run
page, same as a Flow Counter node). Name and category support
{assign_key}interpolation; the increment defaults to 1. Halt flow bails never count. Leave the name blank to disable.
Tips
- Use Halt flow for invariants you want to fail loudly (e.g. “external id must be set before proceeding”). Use Skip branch for “best-effort” paths.
0,false, a whitespace-only string, a list containing nil, a map with nil values, and any record are not empty — they’re real values. Pick value is nil if you want only the literal nil to trip, or value is falsey to treatfalseas a stop signal alongside nil.- Set Completion key to make this guard backfill the local completion store from a remote “already done” check: a cheap upstream Completion Guard on the same key then short-circuits future runs without re-querying the remote. Handy when adding completion-guarding to a flow that has already processed entities the local store never recorded.
- Best practice: only set Completion key when a bail means the entity is permanently done — the natural fit is value is defined / “already exists”. With value is empty it permanently skips an entity whose lookup was only transiently empty.