Most routing engines evaluate rules in sequence and take the first match. Pipe17's order routing documentation states it plainly: rules are evaluated from top to bottom, and the first rule that matches routes the order (Pipe17 help center). Shopify's order routing describes a similar layered approach where merchants combine rules in a chosen order, with a prioritized location list used to break ties when several locations fit (Shopify Engineering).
That design is easy to explain and easy to break. The order of a list is invisible behavior. Someone reorders rules in a drag-and-drop editor, a config merge changes array order between environments, or a new catch-all rule gets appended above an exception. Nothing in the diff looks like a routing change, but traffic moves.
The security literature is blunt about the failure mode. When rules overlap, a broad condition can shadow a more precise one, so the precise rule never executes, and the symptom shows up only after an incident is triaged from the wrong dataset (NHI Mgmt Group). Cloudflare makes the same point about network routing: put two identical paths in a routing table and it becomes non-deterministic which one is taken (Cloudflare blog).
So the first decision rule is this: if your engine is first-match-wins, treat list position as an implementation detail, not a policy. Policy should live in a field you can read, diff and test.



