Package flow is the parsed graph: pure data, no behavior. The engine decodes
each node's Raw config via the registry and schedules the nodes; flow itself
imports neither node nor engine, so the dependency graph stays acyclic.
CurrentSchemaVersion is the flow-definition schema this runner speaks. It is
stamped on flows so a breaking wire-format change can be versioned: bump this
on such a change, migrate older stored flows up to it, and the runner rejects
any flow declaring a newer version than it understands. Version 1 is the flat
node format (fields at the node top level, *_ms unit-suffixed durations); the
pre-versioning "data"-envelope format is unversioned legacy and must be
migrated before this runner will accept it.
Validate checks structural invariants before execution: every edge references
a declared node. Node-shape validation (route targets, referenced child flows)
is done by the engine via node capabilities, so flow stays free of node-type
knowledge.
Node is a raw node definition: its id, kind, run-phase, and undecoded config.
The engine turns Raw into a node.Bound via the registry. RunWhen is lifted here
at parse time so the scheduler needn't re-unmarshal it per node.