--- id: DATA-12 family: RT-DATA level: extended profiles: [runtime] posture: normative-target added: "1.0" changed: "1.0" source: https://flowdrop.io/spec/rules/rt-data/data-12 specification: FlowDrop Workflow Specification 1.0-draft licence: CC BY 4.0 --- # DATA-12 — Tools reach only a node that declares itself a tool consumer *RT-DATA (Part II) · level: extended · profiles: runtime · added in 1.0* ## The rule > **Normative.** This is the rule. > > 1. Tools are handed to a node only where the node type declares that it consumes them. > > 2. Wiring tools to a node type that neither consumes nor forwards them is a validation error; a node type that forwards them is accepted and passes them on. > > 3. Should such a workflow run regardless, the node receives no tools. > > 4. A node re-entered on a later round of a loop receives its tools on every round. ## What it means A node type that only forwards tools is accepted for wiring even though it never consumes any of them itself — it exists purely to fan the same tools out to more than one consumer, and every consumer wired to it sees the whole set, not a private share carved out for it alone. The other clause cuts against treating tool binding as something decided once and then left alone. A node reached again on a later round of a loop is not running on a binding made the first time it was reached: every round re-derives which tools it receives, so a node reached a second, third, or hundredth time still gets everything it is wired to. ## Example Two calculators, wired as `adder` and `multiplier`, both feed a single shared forwarding node; that node feeds two separate tool-consuming nodes. ```json title="Each consumer's tool manifest" verdict="listed" ["adder", "multiplier"] ``` A single tool-consuming node sits inside a loop, re-entered on every round, with one calculator wired to it directly. ```json title="The consumer's tool manifest, every round of the loop" verdict="listed" ["adder"] ``` ## Related rules - Names: DATA-10 - Referenced by: DATA-10 --- Rule identifiers are permanent and are never renumbered. This specification carries no implementation status: each implementation publishes its own standing against these rules. Licensed CC BY 4.0.