Connections
Connections (lines) tell the simulator how items move from block to block. Smooth curves with optional arrows, labels, latency, and split routing weights.
Drawing a line
Section titled “Drawing a line”- Press
Cfor the Connect tool, then click the start block, then the end block. - Or hold Shift and click the start, then the end. Works in any tool.
Editing a line
Section titled “Editing a line”Double-click a line (or right-click → Edit) to open the line settings. From there you set the label, style, direction, latency, weight, and sync/async behavior.
Direction
Section titled “Direction”Each line has a direction:
| Direction | What happens |
|---|---|
| Forward | Items flow from start to end (the default). |
| Backward | Items flow from end to start. |
Flip the direction in the line’s settings. If you want a “send and wait for reply” handshake (like an HTTP RPC where the sender waits), use one forward line with the Sync flag turned on, not two arrows pointing in opposite directions.
Sync vs async
Section titled “Sync vs async”Every line is either Sync or Async. The toggle is in the line editor.
| Mode | What it means | Use for |
|---|---|---|
| Async (default) | The sender fires the item and keeps going immediately. | Event publishes, batched notifications, fire-and-forget logs, queue writes. |
| Sync | The sender waits for the receiver to finish before continuing. | HTTP RPCs, blocking DB queries, cache lookups, function calls. |
Sync hops count toward critical-path latency in the system spec and show up as Dependencies in the architecture document. Async hops only register as Interfaces.
The simulation engine treats Sync/Async as advisory metadata for now — packet flow itself uses direction. Backpressure modeling against blocking hops is reserved for a future engine pass.
Labels
Section titled “Labels”- Add a label by editing the line.
- Show or hide all labels with the toolbar toggle.
- Hidden labels still pop up on hover.
Line styles
Section titled “Line styles”Three styles in the line editor:
- Solid — the default.
- Dashed — short-dash pattern.
- Dotted — small dots.
Use dashed or dotted for visual distinction (e.g. fallback paths, monitoring connections, side-effect logs).
Travel time (latency)
Section titled “Travel time (latency)”Each line can carry a latency (in milliseconds) — how long it takes an item to cross from one block to the next. Set it in the line editor.
- During a sim run, items wait that long on the line before arriving.
- The top stats bar shows an in-transit count (sky-blue clock) for items still traveling.
- Hover a line with travel time and you’ll see a formatted badge (
200ms,5min,2h). - Use it for network calls (5-500ms), trucks moving freight (minutes to hours), or anything that takes real time to move.
- Lines with no latency (the default) deliver items instantly.
Routing weight
Section titled “Routing weight”Lines coming out of a split block can carry a weight (0-100) that decides how traffic divides:
- Set the weight in the line editor (labeled “Routing Weight”), or in the Behavior panel of the source block once it’s set to Split mode.
- Higher weight = more traffic goes that way.
- All weights at 0 (default): round-robin — each line takes turns.
- Any weight above 0: weighted split. Lines with weight 0 are skipped (they get nothing).
- Two lines, weights 70 and 30: roughly 70% / 30% of traffic.
- Two lines, weights 50 and 0: everything goes to the first.
Weights only matter if the source block is in Split mode. Weights on a passthrough are ignored — every line still gets a copy of every item. Set the source to Split first.
Replicate vs split (which mode is right?)
Section titled “Replicate vs split (which mode is right?)”This trips people up regularly:
- Split — each item picks ONE outbound. Use for routing decisions where the item goes to one path or the other (in-stock / out-of-stock, hot / iced, sit / leave, cafe / drive-thru).
- Replicate — every item is copied to every outbound. Use ONLY when at least one outbound is a side-effect target (log, audit, metric, notification, cache, telemetry, webhook).
If all your outbounds are primary consumer paths and each item should pick ONE, you want split. Replicate-to-consumer-paths inflates OUT counts and makes the canvas lie about how many items were actually served.