A transition is a declared rule for moving tokens between places. It consumes tokens from input places and produces tokens to output places, atomically — all inputs removed and all outputs created in one step.
This is how state changes. It's also the only way state changes.
If you didn't declare a transition, that state change doesn't exist — not blocked, not forbidden, just never a possibility. You build up the set of possible state changes from zero, one transition at a time. There's no default behavior to carve exceptions out of.
This makes transitions constitutive: the declaration doesn't just specify which state changes are valid, it's the mechanism through which state changes happen at all. Remove a transition and there's nothing to check or enforce, because the state change it enabled ceases to exist. Like Bazel build targets, the declaration is simultaneously the functional mechanism and the correctness guarantee. (See Structural Correctness for more on constitutive vs. regulative verification tools.)
A traffic light net has three transitions: go_yellow consumes a Light from green and a Command, and produces a Light in yellow. Same pattern for go_red and go_green. These three transitions are the complete behavior of the system. There's no way for the light to jump from green to red — not because a check prevents it, but because no such transition was declared.
Transitions can consume from multiple places simultaneously. A transition that requires both an available proxy and a prioritized target atomically claims both in one step — no race condition, no locking needed. Multi-output transitions produce to multiple places: a "reject" transition might return an item to the available pool and record the rejection, atomically.
In practice
A transition is simultaneously an API endpoint, a state machine edge, and a database transaction. You declare one thing and get all three. Because the declaration is the mechanism — constitutive, not regulative — you don't bolt correctness onto your state layer. Correctness follows from having declared how state moves.
See also
- Places & Tokens — where state lives
- Bindings — how transitions select specific tokens
- Guards — conditions on whether a transition fires