A journey is the composition tier of the flow lens: a persona's end-to-end arc, assembled from whole business processes. Where a business process is one goal-directed flow, a journey is the sequence of them one actor walks — from first contact to the far side of the goal. It holds no steps of its own; each stage delegates to a business process by name.
journey ShopperPurchaseArc {
title "The shopper's purchase arc"
actor platform.v1.Customer
goal "A customer discovers a product, buys it, and closes the loop after delivery."
labels { arc: "customer" domain: "ordering" }
stage browse "Browse the catalog" process catalog.v1.BrowseCatalog
stage purchase "Place and pay for the order" process PlaceAndPayOrder
stage post_purchase "Review, and maybe return" process ReviewAndMaybeReturn
}Three stages, three whole processes. A stage's process reference is by name — a bare name for a process in the same sub-domain, an FQN when it lives in another (catalog.v1.BrowseCatalog is a catalog flow composed into an ordering journey). The stage does not re-declare the flow's steps; it points at the process that owns them, so the leaf flow stays the single source of truth. Rename a step inside PlaceAndPayOrder and the journey is untouched.
flowchart LR A["actor · Customer"] --- J["journey · ShopperPurchaseArc"] J --> B["BrowseCatalog"] J --> P["PlaceAndPayOrder"] J --> R["ReviewAndMaybeReturn"]
Why two tiers
The two composition primitives operate at different altitudes:
- A
callstep composes one process inside another — a sub-flow invoked mid-flow (FulfilOrdercallsReserveStock). - A
journeycomposes at the higher, cross-flow tier — stitching independent, separately-triggered flows into one persona experience.
ShopperPurchaseArc doesn't itself run: its three processes are triggered independently (a browse, a checkout, a post-delivery review). The journey is the narrative that connects them for one actor — the zoom-out from individual flows to the whole experience. A more operational arc reads the same way:
journey OrderFulfilmentArc {
title "The order fulfilment arc"
actor platform.v1.System
goal "A paid order is reserved, packed, and shipped."
labels { arc: "operations" domain: "ordering" }
stage fulfil "Fulfil the paid order" process FulfilOrder
}Arcs you design ahead of the build
A stage may reference a process that does not exist yet. That is not an error — it is a forward-looking composition item: the arc is designed before every flow it names is built, and the unresolved stages are counted and marked as planned in the rendered view. Designing the whole arc first, then filling in the flows, is the intended way to work — which is the subject of Reconciliation and the backlog.