FlowDrop Workflow Specification 1.0-draft

A shape refines another declaration of its lane; four ids are reserved

The rule

Normative: this is the rule
  1. 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.
  2. The winner replaces the entry whole rather than key by key, because a partial shape is a deliberate redefinition.
  3. 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.
  4. Precedence is resolved in one place, so which declaration wins never depends on load order.
  5. The ids trigger, tool, mixed and any are 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.

The site's declaration for the order_probe lanestored
{
  "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": []
}
The properties order_probe declares afterwardsreplaced
["po_number"]
The compatibility rules order_probe declares afterwardsreplaced
[]

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.

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 · SCH-44 · changed in spec 1.0