--- id: EXPO-12 family: GR-EXPO level: core profiles: [storage-api, runtime] posture: normative-target added: "1.0" changed: "1.0" source: https://flowdrop.io/spec/rules/gr-expo/expo-12 specification: FlowDrop Workflow Specification 1.0-draft licence: CC BY 4.0 --- # EXPO-12 — Control outputs are never stripped *GR-EXPO (Part I) · level: core · profiles: storage-api, runtime · added in 1.0* ## The rule > **Normative.** This is the rule. > > 1. The reserved control outputs `active_branches` and `state_update` are never removed from a node's result by exposure stripping. > > 2. They are the engine's own channel, not ports an author shows or hides, and branching and state merging depend on them arriving intact. ## What it means Control outputs are exempt from every lever that strips an ordinary port — the node type's own default, an instance override, all of it. They are not something an author shows or hides at all; they are the engine's own channel, and branching and state merging depend on them arriving whole every time, whatever exposure a workflow otherwise records for that node. ## Example A node's type marks every one of its outputs — `active_branches`, `state_update`, and an ordinary port — hidden, and the workflow's own instance override hides `state_update` again on top of that: the least favourable exposure available for all three. ```json title="What the node produced" verdict="produced" {"state_update": {"iterator": {"index": 1}}, "active_branches": "true", "debug": "internal trace"} ``` ```json title="What the result delivers" verdict="kept" {"state_update": {"iterator": {"index": 1}}, "active_branches": "true"} ``` `debug`, an ordinary output hidden the same way, is the one key stripping removes. ## Related rules - Names: EXPO-11 - Referenced by: EXPO-11, EXPO-14, DATA-8 --- 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.