--- id: RT-TOOL-10 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-10 specification: FlowDrop Workflow Specification 1.0-draft licence: CC BY 4.0 --- # RT-TOOL-10 — A tool-calling pass reports whether it did any work *RT-TOOL (Part II) · level: extended · profiles: runtime · added in 1.0* An all-repeat pass returns a full list of tool messages and a successful outcome while having invoked nothing, so an agent loop gated on "messages non-empty" re-enters forever. This is the port that answers the question directly. ## The rule > **Normative.** This is the rule. > > 1. A node that invokes tools reports `executed_any`, a boolean, and `executed`, the call identifiers behind it, the complement of the `skipped` list. > > 2. `executed_any` is true when at least one call was handled for the first time in this run, which includes a call naming a tool that is not wired: nothing was invoked, but the recoverable "not an available tool" result is new and the model must re-plan against it. > > 3. An empty batch reports false. > > 4. The two lists partition only the calls that reach the guard: a call with no identifier always runs and appears in neither while setting `executed_any`, and a malformed call (one that is not a map, or whose name is blank or not a scalar) is dropped before the guard, appears in neither, and leaves `executed_any` false. > > 5. `executed_any` is exposed by default; `executed` is not. ## Related rules - Names: RT-TOOL-9 - Referenced by: RT-TOOL-9 --- 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.