Routing and decisions

Routing nodes make a branch explicit in the graph: they choose a continuation, while the data and decisions justifying that choice remain available as separate contracts.

A decision chooses a route

A route represents one possible continuation of the graph. When a router executes, exactly one selected route becomes active for that node execution. Other branches are not considered executed.

Routing by itself does not modify the business model. A check_if may decide that an amount exceeds a threshold, but the node executed in the selected branch then produces the business effect — request approval, reject an operation, create an object, or call an extension.

Read a branch in the graph

Upstream data
Router / Decision
Route A
Route B
Suite commune

The router chooses exactly one branch. After convergence, only data guaranteed on every path can be treated as always available.

A route is not copied data

The router exposes the selected branch, but tested objects remain available through their original bindings. Do not copy an object into every route merely to make it available downstream.

Available nodes

NodeUsageBehavior
check_ifStructured conditions on a typed objectTwo fixed routes: True / False. Conditions use the same editor as collection filters.
route_valueRoute a typed valueRoutes correspond to values configured on the node.
route_expressionRoute the scalar result of an expressionFor a computed decision that should remain explicit in the graph.
evaluate_decisionEvaluate a versioned business policyInputs, outputs, and routes derive from the selected Decision contract.

The Core node catalog provides the detailed contract for every primitive.

Routes and outputs are two different contracts

check_if mainly produces a route true or false. Conversely, evaluate_decision may expose typed outputs in addition to the selected route because those values belong to the versioned Decision contract.

ElementRoleExample
RouteSelects the outbound edge that becomes active.approved, rejected, true.
OutputProduces typed data reusable by subsequent nodes.Score, calculated ceiling, structured reason.
Upstream dataRemains available according to normal binding and ancestor rules.The invoice or company that was tested.
Found and Not found routes connect the successive billing-contact lookups here.
Found and Not found routes connect the successive billing-contact lookups here. Enlarge

Convergence: do not assume one branch executed

After two branches converge, the output of a node present only on route A is not a guaranteed ancestor of the shared downstream node. The editor and binding model use graph structure to prevent a value existing only on some paths from being treated as certain.

Avoid implicit conditional outputs

When common continuation needs the same data regardless of branch, produce it before the router or ensure each branch materializes it through a shared explicit contract. Do not depend on a node executing on only one path.

Choose the right node

  • check_if — one or more readable conditions on a known object.
  • route_value — an already-available value directly matches the desired branches.
  • route_expression — the routing value must be calculated but does not justify a standalone Decision artifact.
  • evaluate_decision — the policy deserves its own contract, revisions, tests, and evaluation trace.

An expression is useful for calculating a value; it should not hide a business policy that would benefit from being named, versioned, and tested as a Decision.