--- id: RT-GATE-1 family: RT-GATE level: core profiles: [runtime] posture: normative-target added: "1.0" changed: "1.0" source: https://flowdrop.io/spec/rules/rt-gate/rt-gate-1 specification: FlowDrop Workflow Specification 1.0-draft licence: CC BY 4.0 --- # RT-GATE-1 — A gated node never executes without consent for that exact call *RT-GATE (Part II) · level: core · profiles: runtime · added in 1.0* The gate sits at the single point every node execution passes through, so it covers a node scheduled in the graph and the same node invoked as a tool by an agent loop. The operator approves the resolved arguments, not the intention. ## The rule > **Normative.** This is the rule. > > 1. A node whose effective confirmation requirement is true must not execute without a consumed, hash-matching, confirmed consent (RT-GATE-2, RT-GATE-3). > > 2. The gate is evaluated after parameters are resolved and before the node executes, so the operator approves the arguments the call will actually use, and it applies only to a first execution: resuming a node continues a side effect that already passed the gate. > > 3. The pause is an ordinary interrupt carrying a boolean confirmation prompt, and the prompt shows only the arguments a model may fill, so values supplied by configuration (credentials, endpoints) never reach an operator's inbox. > > 4. A gate interrupt is a distinct flavour of interrupt and must never be consumed as a node's own resume answer, so a node that is both resumable and side-effecting does not mistake an operator's consent for the reply it was waiting for. > > 5. Every gate interrupt carries a bounded expiry, and expiry is fail-closed on both paths: an interrupt swept as overdue on a persisted run ends that run, cancelled and announced (INT-18); an interrupt found already expired on re-entry is consumed as a decline with the reason `expired`. ## What it means A run can arrive at an expired question in two different ways, and they do not resolve the same way. A question swept up as overdue while the run is still sitting there ends the run outright — cancelled, and announced (INT-18). A question that is instead found already past its expiry the moment execution re-enters it does not end anything: it is simply consumed as a decline, and the run continues down whatever path a decline takes. Nothing about either path leaves the question answerable a second time. ## Example A gate question nobody answered before its expiry, found only when the run re-enters it: ```json title="A gate question found already past its expiry on re-entry" verdict="declined" { "reason": "expired" } ``` ## Related rules - Names: INT-18, RT-GATE-2, RT-GATE-3, RT-GATE-4, RT-GATE-7 - Referenced by: INT-18, RT-GATE-2, RT-GATE-3, RT-GATE-4, RT-GATE-7, RT-GATE-11, RT-GATE-12, RT-GATE-13, RT-GATE-15 --- 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.