--- id: DATA-9 family: RT-DATA level: extended profiles: [runtime] posture: normative-target added: "1.0" changed: "1.0" source: https://flowdrop.io/spec/rules/rt-data/data-9 specification: FlowDrop Workflow Specification 1.0-draft licence: CC BY 4.0 --- # DATA-9 — The unified output port carries exposed outputs only *RT-DATA (Part II) · level: extended · profiles: runtime · added in 1.0* ## The rule > **Normative.** This is the rule. > > 1. The unified `output` port composes a node's exposed outputs and nothing else. > > 2. Keys prefixed with `_` and the reserved `trigger` key are excluded from it. > > 3. An output key the node type does not configure counts as exposed and is kept. ## What it means The exclusion of `_`-prefixed keys and the reserved `trigger` key does not depend on how the node type configures them. Marking a key like `_debug` exposed on the node type has no effect: the leading underscore itself marks the value as plumbing rather than published data, and `trigger` is excluded the same way whatever its own exposure setting says, because it carries no data to begin with. The other clause runs the opposite way from what a stricter reading would suggest. An output key the node type's own configuration never mentions still counts as exposed and is composed into `output`. That is what stops a node whose behaviour produces more than its declared output schema from silently losing the extra value: nobody has to configure a key for it to be kept. ## Example A node's result carries an ordinary output alongside an internal key that the node type happens to mark exposed anyway. ```json title="What the node produced" verdict="produced" {"result": "ok", "_debug": "trace"} ``` ```json title="What the unified output port composes" verdict="composed" {"result": "ok"} ``` The same node type declares only `result`, but the node also produces `extra`, a key its configuration never mentions. ```json title="What the node produced, one undeclared key" verdict="produced" {"result": "ok", "extra": "bonus"} ``` ```json title="What the unified output port composes with nothing declared" verdict="composed" {"result": "ok", "extra": "bonus"} ``` ## Related rules - Names: DATA-8 - Referenced by: 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.