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
The router chooses exactly one branch. After convergence, only data guaranteed on every path can be treated as always available.
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
| Node | Usage | Behavior |
|---|---|---|
check_if | Structured conditions on a typed object | Two fixed routes: True / False. Conditions use the same editor as collection filters. |
route_value | Route a typed value | Routes correspond to values configured on the node. |
route_expression | Route the scalar result of an expression | For a computed decision that should remain explicit in the graph. |
evaluate_decision | Evaluate a versioned business policy | Inputs, 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.
| Element | Role | Example |
|---|---|---|
| Route | Selects the outbound edge that becomes active. | approved, rejected, true. |
| Output | Produces typed data reusable by subsequent nodes. | Score, calculated ceiling, structured reason. |
| Upstream data | Remains available according to normal binding and ancestor rules. | The invoice or company that was tested. |

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.
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.