Repository navigation
5.5.2.1.8. Fork Node
A Fork Node duplicates the offered control and object tokens onto multiple outgoing flows, enabling parallel paths in a UML Activity. Unlike a Decision Node, a Fork does not choose one guarded alternative.
flowchart LR
create(Create shipment) --> fork[ ]:::bar
fork -->|Shipment| label(Print label)
fork -->|Shipment| notify(Notify customer)
classDef bar fill:#000,stroke:#000
Mermaid approximation: this diagram shows the model's routing, not a complete UML Activity notation. Rounded boxes represent actions; edge labels identify token types or guards. The black rectangle approximates a UML fork/join bar; its exact proportions depend on Mermaid rendering.
.AddAction(
"CreateShipment",
async c => c.Output(new Shipment("SHP-42")),
node => node.AddFlow<Shipment, ForkNode>())
.AddFork(fork => fork
.AddFlow<Shipment>("PrintLabel")
.AddFlow<Shipment>("NotifyCustomer"))
.AddAction("PrintLabel", async c =>
await labels.PrintAsync(c.GetTokensOfType<Shipment>().Single(), c.CancellationToken))
.AddAction("NotifyCustomer", async c =>
await notifications.SendAsync(c.GetTokensOfType<Shipment>().Single(), c.CancellationToken))Both outgoing branches receive the forked token. A Fork Node has no joining behavior; use a Join Node to synchronize flows later. Actions also have implicit-fork behavior by default; an explicit Fork makes the branching point clear in the model. See Implicit Fork and Join.
Home page Support Code licensed under an MIT-style License. Documentation licensed under CC BY 4.0. © by Mikołaj Milewski, 2026