Skip to content

Funnel

The Funnel operation joins many exclusive branches into one continuation. Each firing it passes to Out the one input that arrived on this firing — the lowest-numbered one when several did — and stops the path when none did. It is a router, not a transformer: it never inspects a value, so every port is Any.

With fewer than two inputs connected there is nothing to choose between, and the Editor shows an info badge on the Node saying so.

Inputs

PortTypeRequiredDescription
In 1AnyNoA branch’s value.
In 2AnyNoAnother branch’s value.
In (variable, up to 20 inputs in total)AnyNoFurther branches, added on demand in the Node’s Settings tab.

Every input is loose: the engine does not wait for its producer before running the Funnel, and the Editor offers no Validation rule on it. That is what lets each input sit on a branch the others exclude.

Outputs

PortTypeDefaultDescription
OutAnyNilThe value of the input that arrived. Unchanged when none did.

Properties

NameTypeDefaultDescription
On ErrorComboStop this branchPer-op On Error verb (Stop this branch / Continue with the last value / Continue with the fallback). See the Error Handling guide.
Out → Fallbackbool / int / float / stringNilPer-output fallback value used when Continue with the fallback fires. Edit in Settings under the Out port.

State on Reload

Funnel keeps no value of its own. Out is preserved across restarts like any port, within the configured time window.


  1. Look for an arrival — In port order, top to bottom, the Funnel asks each input whether its producer wrote it on this firing.

  2. One arrived — Its value is written to Out, stamped with this firing, and the path continues. A Debug status names the input taken, on every pass.

  3. Several arrived — Priority is port order: the lowest-numbered input that arrived wins.

  4. None arrived — Out is left alone and the path stops with an Information status. Nothing went wrong; every branch was skipped.


A step that must follow either outcome of a Node — acknowledge the device, release a lock, write the audit row, bump the attempt counter — drawn once.

Connect the Node’s value output to In 1 and the body of its error branch to In 2, and put the step after Out. Whichever branch ran, the step runs once, with one set of settings and one state, so a Node that carries either is not duplicated to drift.


Funnel has nothing of its own to fail at: it reads no setting and inspects no value, so it fails only when the engine cannot read one of its inputs. The Node still carries an On Error verb and an error output like every Node — it is not infallible — and a failure is resolved by that verb:

VerbWhat it does
Stop this branch (default)This Node and its dependents stop; Out keeps its value, and the Node’s last attempt reads as failed.
Continue with the last valueOut keeps its value, not stamped as new; dependents run on it.
Continue with the fallbackOut takes its configured fallback as the value produced by this firing.

A firing on which nothing arrived is a stop, not a failure: no verb is consulted and the error output does not fire.