Connector
A connector is the arrow between two shapes. It carries entities, decides which path they take, and can add travel time.
What it is
A connector links a generator or activity to the next activity. When a shape has more than one outgoing connector, a routing rule picks which one each entity takes.
The question it helps answer
Where does the work go, and what share goes each way? Connectors let you model rework loops, yield splits and overflow to a second line, and test what happens when those shares change.
How it behaves
The routing rule belongs to the source shape, not to one connector. The source's Connect Type sets the rule for all its outgoing connectors, and each connector then holds its own value for that rule. The choice is made when an entity is ready to leave, after that activity's actions have run.
| Connect Type | How it chooses | Lowest view |
|---|---|---|
| Probability | At random, by relative Weight. Weights don't need to add up to anything: a Weight of 2 is twice as likely as a Weight of 1. Each entity draws on its own, so a short run won't hit the split exactly. | Basic |
| State Condition | Tests each connector that has a condition, and takes one that is true for this entity. | Intermediate |
| Entity Template | Takes the connector set to this entity's type. | Intermediate |
| First Available | Takes the first destination with room, trying lower Priority first. Room in a destination's inbound queue counts, so with the default unlimited queue the first destination takes all the work. To send work to the next free destination, set Inbound Queue Capacity to 0 on each one. If none has room, the entity waits and moves the moment one does. | Intermediate |
Under State Condition or Entity Template, two connectors can both fit. The entity doesn't split between them. It takes the one with the lowest Priority, and on a tie it takes the same one every time. Set Priority on the card.
A State Condition can test an entity state or a model state. The route is chosen once, when the entity finishes its steps. If the entity then waits, blocked because its destination is full, it stays on the connector it chose, even if a model state changes meanwhile. A model state used as a switch is the simplest way to compare routing policies: vary its starting value per scenario. See Conditions on a model state for the tests behind this.
Leaving an activity, an entity needs room at the destination before it moves. It holds its place at the source until then, and that's how blocking spreads upstream. See Activity. The place is claimed before any move time starts, so it's taken for the whole trip. Travel time doesn't count as queue or processing time at the destination.
Leaving a generator is different. The entity moves first, then queues at the destination. Only First Available claims a place first.
The connector is chosen before On departure runs, so a change made there can't affect this choice. It can affect the next one.
Properties
Select a connector to open its editor, headed with its source and destination, such as Inspect → Ship. Its Routing and Levers tabs show in every complexity view. Anything inside them that depends on a view says so below.
You can edit routing from the connector, or from the Routing tab of the source activity or generator, which shows the same cards. Connect Type belongs to the source. Everything else belongs to one connector. Levers are the exception: you can only reach them by selecting the connector.
A view only changes what you can edit, never what runs. If a connector uses something your view hides, a line names it, such as This uses changes on departure or arrival, hidden in Basic, with a link to switch views.
If a connector has lost its source, you'll see This connector isn't attached to a source Activity or Generator. instead of the tabs. Reconnect it on the diagram.
Routing tab
The tab shows Connect Type, then one card per connector under Outgoing Connectors. Selecting a connector highlights its card and opens it. One card is open at a time. The routing field shows on every card, so you can edit sibling connectors side by side. Movement shows only in the open card.
| Property | Where to find it | What it does |
|---|---|---|
| Connect Type | Top of the tab. Belongs to the source, so it's the same from any of its connectors. | The routing rule for every connector leaving the source. Default Probability, the only choice in the Basic view. State Condition, Entity Template and First Available arrive at Intermediate. In a lower view, a rule already set keeps running. It shows disabled in the list, and its field stays editable on each card. Connect Type is disabled only with no outgoing connector. It still applies with one, as the line under it says. |
| Card heading | Top of each card. Click to open or close it. | Shows the connector's name, its destination, and a summary of its rule: a share such as 90%, a rank such as #2, a condition, or an entity type. The name can't be edited here, and shows as (unnamed) if there is none. Validation warns about a missing name. |
| Weight | Each card. Probability only. | Relative share of entities, with the resulting percentage beside it. Default 1, from 0 up. Clearing the box sets 0. A Weight of 0 is never taken. If the Weights add up to zero, or one is negative, validation stops the model. Ignored under other rules. |
| Priority | Each card. First Available, State Condition and Entity Template. | Order of preference, lower goes first. Whole numbers from 1, default 1. A blank or anything lower becomes 1, and decimals are dropped. Under First Available it sets the order destinations are tried: the number beside it, and # in the heading, show the rank, and cards sort by rank when you leave the box. Under State Condition and Entity Template it decides which connector wins when more than one fits. Ties have a fixed order, by destination id. Not used under Probability. |
| State Condition | Each card. State Condition only. | The test for this connector. See State Condition fields. |
| Applies to | Each card. State Condition only. | Limits the connector to one entity type. Default (all entity types). Other types skip it, even when the condition is true. It shares a value with Entity Template, so a type chosen there carries over when you switch. |
| Entity Template | Each card. Entity Template only. | The entity type this connector carries. Default (none). If every connector is (none), validation stops the model. An entity type that has been deleted shows as (missing entity: …), and validation stops the model. On a Rate or Pattern generator, a notice warns that every entity takes the same connector. |
| Movement | Inside an open card. | Travel time, and state changes on the way. See Movement fields. |
Validation also checks each connector. These stop the model: a source or destination that no longer exists, a destination that isn't an activity, a connector that loops back to its own source when that's the only way out, a loop on an activity with no queue on either side, and a Join on a connector, because entities wait for a Join inside an activity. A loop with another way out and somewhere to wait gets a warning. So does a Probability source with more than 20 outgoing connectors.
State Condition fields
Press Add state condition to start. It fills in the first entity state in the model's list, or the first model state if there is no entity state, with the comparison equal and that state's default value, so check all three fields. With no states in the model, the card says Define states first — switch to the States tab. With states but none on entities or the model, it says Define a State first. Both link there.
| Property | Where to find it | What it does |
|---|---|---|
| State | Card, once a condition exists. | The state to test, listed with its scope and data type. Entity states are listed first, then model states. A condition reads an entity state or a model state, when the entity finishes its steps and leaves the source. A condition saved on an activity or resource state stays listed but disabled, with a warning, and validation stops the model until you choose an entity or model state. See Conditions on a model state. Changing it resets Value. It also resets Comparison to equal if the new state's type doesn't offer the current one. A state that has been deleted shows as (missing state: …), with Comparison and Value locked. |
| Comparison | Card. | Every data type has equal and not_equal. Number states add greater_than, greater_equal, less_than and less_equal. |
| Value | Card. | What to compare against. A box for a number or text state, true or false for a boolean, or a list for a category, starting on its first value. A category with no values shows (no values). A condition saved with no value shows (choose a value). |
| Clear condition | Card. | Removes the condition. The heading then reads no condition. If no connector leaving the source has a condition, validation stops the model. |
Movement fields
Move time is in every view. On departure and On arrival need the Intermediate view. Without a move time, a connector takes no time at all.
| Property | Where to find it | What it does |
|---|---|---|
| Add move time | Open card, Basic view. | Adds a move time of a constant 1 minute. |
| Move time Type | Open card, Basic view, once added. | The distribution for travel time, with its values below. Drawn fresh for each trip. A negative constant stops the model. |
| Time Unit | Open card, Basic view, once added. | Seconds, Minutes, Hours or Days. |
| Remove move time | Open card, Basic view, once added. | Takes the move time away. |
| On departure | Open card, Intermediate view. | State changes when the entity leaves the source, before any move time. Add modification opens a form with a State, an Operation and a value. See State. The button is disabled with no states in the model. |
| On arrival | Open card, Intermediate view. Needs a move time. | State changes after the move time, as the entity arrives. Without a move time the two would happen at the same moment, so the card says Add a move time to apply changes on arrival separately from departure. Removing a move time moves any On arrival changes into On departure. |
A ride still going when the run ends counts up to the end in Total travel time and in the entities in transit figures. It counts as a Traversal, because it started. Average and Longest travel time count only rides that finished, so a part-done ride can't pull the average down. With a warm-up, a finished ride counts whole, and a ride still going counts only from the end of the warm-up.
A destination slot reserved for an entity that's still on its way counts the same way: the time held runs up to the end of the run. That reservation is a capture at the destination, but the entity isn't in its contents yet, so captures minus releases can differ from what's there by the reservations still in transit.
An entity disposed on a connector gives up any slot reserved for it. The destination shows that as a capture and a release with no time in the step, no processing and no contents. The time held counts as capacity held for arrivals. An entity split on a connector gives up its slot the same way, and its new entities go straight to the Split's destination.
Use entity or model states here. A resource or activity state stops the run, because a connector can't say which resource or activity to change.
A connector with steps the card can't show reads This connector has custom actions authored outside this editor. Edit them in the model JSON. and these fields don't appear.
Levers tab
Select the connector itself to reach this tab. It's in every complexity view, and a number on the tab counts its active levers. Tick a setting to mark it as a lever. It then shows as a one-click card in New what-if.
| Property | Where to find it | What it does |
|---|---|---|
| Weight | Under Flow. | Marks Weight to vary, to test different splits. It's the only connector lever. It shows only when the source routes by Probability, because Weight has no effect otherwise. A Weight lever already set stays listed, greyed, with the reason, so you can untick it. |
| Label | Under a ticked lever. | The lever's name. Starts as the connector's name and Weight. |
| Sweep | Under a ticked lever. | Set to, the default, or Multiply by. |
| min, max, step | Under a ticked lever. | The values to try. Set to starts at 0, 4 and 1. Multiply by starts at 0.5, 2 and 0.5. |
Example
At a final inspection, 90% of parts pass and 10% go back for rework. Draw connectors from Inspect to Ship and to Rework. Keep Connect Type as Probability, and set the Weights to 90 and 10. Then add a Weight lever to test what a better first-pass yield does to throughput.
If rework takes 15 minutes to reach, open that connector's card, use Add move time, and change the 1 to 15.
Common mistakes
- Looking for a share as a percentage. Weights are relative. 9 and 1 give the same split as 90 and 10.
- Leaving a gap in your conditions. One entity that matches nothing stops the run.
- Expecting a waiting entity to change its route. A model state that flips while an entity waits blocked doesn't divert it. It keeps the connector it chose.
- Writing overlapping conditions. If two are true, only one is taken, and the entity never splits between them. Write conditions that can't overlap, or set Priority on each card.
- Looping an activity back to itself with no queue. An entity holds its slot until its next place is secured, so with no queue the next place would be the slot it's already in. Validation refuses this, even with spare capacity. Give the activity an inbound or outbound queue, or send the rework through another activity.
- Switching from Entity Template to State Condition with entity types still set. Each connector keeps its type under Applies to, so it only carries that type. Set Applies to back to (all entity types) if you don't want that.
- Leaving destinations with unlimited inbound queues under First Available. Room in a destination's inbound queue counts as open capacity, and by default that queue is unlimited. So the first destination always has room and takes everything. In a test with two equal destinations, the first got all 48 entities and the second got none. With Inbound Queue Capacity set to 0 on both, they got 40 each.
- Keeping a Weight lever after changing Connect Type. Weight only works under Probability, so that lever gives identical scenarios. It shows greyed on the Levers tab.
- Setting a lever from the source's Routing tab. Select the connector to reach its Levers tab.