An edge condition never decides routing
The rule
Normative: this is the rule
- A condition stored on an edge never gates dispatch: not on any edge, and not on a loopback edge, the one place dispatch genuinely decides.
- The edge is stored, the edge is followed, and a warning is reported for it once per edge each time its source's outgoing edges are resolved.
What it means
A condition stored on an edge looks like it should gate whether that edge is followed, and it does not — not on an ordinary edge, and not on a loopback edge either, which is the one place dispatch actually does decide whether to re-enter. The edge is stored unchanged and always followed; the condition is reduced to a warning, so a workflow carrying one keeps its shape and keeps working, but the author is told the expression is not consulted.
The warning is emitted each time the source's outgoing edges are resolved, not once per edge overall. A source visited more than once — a loop body — warns again on every pass.
Example
An edge storing a condition that would, if it still gated, suppress it:
{ "id": "e_conditioned", "source": "src", "target": "sink", "data": { "condition": "false" } }{ "message": "payload" }Rule identifiers are permanent and are never renumbered. Each implementation publishes its own standing against these rules; this specification does not.spec 1.0-draft · SG-9 · changed in spec 1.0