Product · October 8, 2026
Every hop carries a contract
Route and Fanout are the two shapes. A hop that does not match the contract does not leave the decision plane.
A single hop is Route<In, Out>. A question becomes an answer. A change request becomes a diff. A prompt becomes media. The names are the contract the caller can store, log, and test.
A split is Fanout<Request, Part[]>. The parts are themselves routes. There is no third, untyped shape. If Separator cannot give the input a type, it returns a pending decision and does not call a model.
This is the systems-integration point. The surrounding application can switch on the type. A patch can open a review. A transcript can land in a record. An image can go to storage. The model does not decide that plumbing. The type does.
Contracts are also how an allow-list stays honest. vision-1 cannot satisfy Route<ChangeRequest, Diff>. The router will not ask it to.