--- id: ORC-15 family: RT-ORC level: extended profiles: [runtime] posture: normative-target added: "1.0" changed: "1.0" source: https://flowdrop.io/spec/rules/rt-orc/orc-15 specification: FlowDrop Workflow Specification 1.0-draft licence: CC BY 4.0 --- # ORC-15 — A cancelled run is announced like any other terminal outcome *RT-ORC (Part II) · level: extended · profiles: runtime · added in 1.0* Cancellation leaves the run through its own path, so it is easy to forget to announce. Anything watching for a run to finish must see a cancelled run finish. ## The rule > **Normative.** This is the rule. > > 1. Every path that cancels a run announces the run's completion carrying the status cancelled, exactly once per cancellation, with the run's identity and its duration. > > 2. Consumers of that announcement must treat cancelled as its own outcome and not as a completed run. > > 3. A cancelled sub-workflow resolves to its caller with status cancelled and empty outputs. ## What it means Anything watching for a run to finish must not mistake a cancelled run for one still in progress: cancellation ends the run through its own path, and that path is easy to forget to announce, so this rule pins the announcement as mandatory rather than incidental. A listener that only checks for completion, and treats silence as "still running," is exactly the bug this closes. A cancelled sub-workflow resolving to its caller is the same rule seen from the other side. Whatever the resolved response looked like — no response at all, a bare status, or an outputs field that is not itself a set of values — none of it is treated as partial results. The caller sees an empty result, never a fabricated one assembled from whatever happened to be present. ## Example A sub-workflow's resolved response, in shapes a cancellation or an outputless resume can leave behind: ```json title="A resolved response with no outputs field at all" verdict="cancelled" { "status": "cancelled" } ``` ```json title="What the caller receives from it" verdict="empty" {} ``` ## Related rules - Names: ORC-11 - Referenced by: ORC-11, INT-11, INT-5, INT-18 --- 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.