A shape is a named JSON Schema, and the shape id is the lane id
Shapes let a lane say what it carries (an order, an entity, a remote contract) without adding a second vocabulary an editor would have to reconcile with lanes.
The rule
- A port shape is a named JSON Schema whose id is a lane id: one id space, no second vocabulary axis.
- A shape is declared in one of two places, and the difference is whose it is.
- A shape that belongs to code ships and updates with the ports that wear it, needs nothing installed alongside it, and may compute its schema, so one declaration can yield a family of lanes; a derived member's id is
base:derivative. - A shape that belongs to the site is declared in the site's own configuration, added without writing code, and travels and diffs with that configuration.
- Every shipped lane that is not a primitive has a shape.
- A shape names a value; it does not check one.
- Nothing validates a value against a shape.
What it means
A shape is a schema with one job: giving a lane a name. It shares the lane's own id space rather than adding a second vocabulary a reader would have to line up against lanes by hand, and it never checks a value — nothing in the system validates a value against a shape's schema; a shape only labels the port that carries one. It is declared in one of two places, and the difference is ownership: a shape belonging to a component ships and updates with the ports that wear it, needs nothing installed alongside it, and may compute its own schema, so one declaration can mint a whole family of lanes; a shape belonging to the site is declared in the site's own configuration and travels with it instead.
Example
["message", "code", "node_id", "retryable"]["role"]Both are declared in code, on the two lanes the implementation ships with an internal structure of their own; a lane that is already a bare JSON type carries no shape at all.