Infers the output schema of every node and checks every node, depth first from the inputs, after every edit:

  • a node with an empty input port is incomplete (ERR_INCOMPLETE);
  • a node fed by an invalid node is invalid too (ERR_SCHEMAS), so an error is reported once, where it is, and not repeated down the chain;
  • otherwise the node checks itself against its input schemas, given in port order, and when valid computes its output schema. An invalid node has no schema.

The query rules run first; their errors are added to the nodes they name, and make those nodes invalid.