join
Barrier with N incoming edges — collect predecessor outputs by node id
Waits for every live predecessor, then emits an object of their outputs keyed by node id. Use this for diamond fan-in and reconvergence after if / switch / try.
All other nodes allow at most one incoming edge. Prefer merge when you need deep-merge of named sources rather than a barrier.
Data
| Field | Type | Description |
|---|---|---|
label | string | Optional UI label |
Input / output
| Value | |
|---|---|
| Execute input | Built by the engine as { [predId]: output } for completed predecessors |
| Output | Same collect-map object |
Exclusive-branch arms that were not taken are not waited on (XOR orphan awareness). Diamond fan-out waits for both arms (AND).
Examples
Diamond
start → a → b ↘
join → …
→ a → c ↗
{
"id": "j",
"type": "join",
"data": { "label": "Both arms" }
}
Example output after b/c templates:
{ "b": "from-b", "c": "from-c" }