--- id: RT-TOOL-2 family: RT-TOOL level: extended profiles: [runtime] posture: normative-target added: "1.0" changed: "1.0" source: https://flowdrop.io/spec/rules/rt-tool/rt-tool-2 specification: FlowDrop Workflow Specification 1.0-draft licence: CC BY 4.0 --- # RT-TOOL-2 — A tool node emits artifacts on a reserved key that never reaches the model *RT-TOOL (Part II) · level: extended · profiles: runtime · added in 1.0* ## The rule > **Normative.** This is the rule. > > 1. A tool node's output may carry the reserved `artifacts` key, a list of `{type, payload}` maps. > > 2. It is a system channel, exempt from output-port exposure, and so survives whether or not the author exposed the port. > > 3. On a successful call those entries are lifted off the node's output and attached to the tool result: an entry with a string `type` and a map `payload` is kept, and any other entry is dropped without failing the call. > > 4. The reserved key is always removed from the result's `data`, so it never reaches the prose a tool-consuming node feeds the model. > > 5. A call that failed or was declined carries no artifacts. ## What it means The reserved key is not a strict channel: an author can put anything on it, and a malformed entry does not fail the call — it is silently dropped, and the well-formed entries beside it still get through. Only an entry with both a string `type` and a map `payload` survives; a bare string, an entry missing `type`, or a `payload` that is not a map is discarded on its own, without touching its neighbours. Whatever happens to the entries, the reserved key itself is always stripped from the node's output before that output becomes the result's `data` — even a node that emitted nothing valid on it still loses the key from `data`. ## Example A node's output carries four entries on the reserved key: a bare string, one missing its type, one whose payload is not a map, and one well-formed. ```json title="What the node's output carries on the reserved key" verdict="mixed" [ "not-an-array", { "type": "", "payload": { "a": 1 } }, { "type": "link", "payload": "not-an-array" }, { "type": "link", "payload": { "url": "https://ok.example.com" } } ] ``` ```json title="What the tool result's artifacts hold" verdict="lifted" [{ "type": "link", "payload": { "url": "https://ok.example.com" } }] ``` ## Related rules - Names: RT-TOOL-1, RT-TOOL-3 - Referenced by: RT-TOOL-1, RT-TOOL-3, RT-TOOL-6 --- 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.