A shape refines another declaration of its lane; four ids are reserved
The rule
- Where two sources declare the same lane id, the site's own declaration wins over a code-declared shape, and both win over the shipped entry.
- The winner replaces the entry whole rather than key by key, because a partial shape is a deliberate redefinition.
- A collision with a shipped id is therefore not a break: the lane stays in the vocabulary, stays self-compatible, and keeps its derived rules.
- Precedence is resolved in one place, so which declaration wins never depends on load order.
- The ids
trigger,tool,mixedandanyare reserved (every generated compatibility rule in the payload is built from them), and a shape naming one is ignored rather than fatal, since paths that reach around a form exist and one bad shape must not unwire every canvas.
What it means
Where a site and a component both declare the same lane id, precedence resolves in one place rather than by load order: the site's own declaration wins over one declared in code, and either wins over an entry the implementation ships built in. The win is total, not merged field by field — a site that names a lane a component already declared replaces its schema and its compatibility rules in one move, carrying nothing forward from the earlier declaration, because a partial redefinition would leave a reader unable to tell which fields survived. Four lane ids are excluded from this entirely: naming one of them is not an error, it is simply ignored, because every generated compatibility rule already depends on those four staying exactly what they are.
Example
A component already declares the lane order_probe with two required fields
and a rule widening it into another lane; the site then declares its own
shape for the same id.
{
"id": "order_probe",
"label": "Purchase Order",
"description": "The site knows better what an order is.",
"color": "rebeccapurple",
"category": "complex",
"enabled": true,
"schema": { "type": "object", "properties": { "po_number": { "type": "string" } } },
"compatibility": []
}["po_number"][]Neither the earlier declaration's two fields nor its widening rule survive: the site's shape did not restate them, and a whole replacement does not carry forward what it left unsaid.