A hidden output's value never reaches anything downstream
Stripping is the first thing that happens to a result, which is what makes the invariant hold rather than nearly hold. A value removed before anything else looks at it cannot leak through a checkpoint, a job record, or a tool result.
The rule
- Exposure stripping (EXPO-11) runs before any other handling of a node's result: before the unified
outputport is composed, before the result is checked for serializability, before it is wrapped for delivery, and before it is written to run records, checkpoints, real-time updates, or returned as a tool result. - A hidden output's value therefore never reaches any of them, and a value on a hidden port that could not be serialized never fails the node.
What it means
Stripping is not one check among several that a node's result passes through; it is the first thing that happens to it. Everything else that looks at a node's output — the unified port that bundles values into one object, delivery to run records, checkpoints, real-time updates, a tool result — reads the already-filtered result, never the raw one. That ordering is what makes "a hidden output never reaches anything downstream" a fact about every one of those destinations at once, rather than something each would have to enforce for itself.
The unified port is the case worth naming, because composing it looks like a separate step that could plausibly run first: it is built from whatever the result holds by the time composition runs, so if stripping ran after composition a hidden value would still be sitting inside it even though its own port was empty.
Example
A node produces a value on a port the node type hides, and the workflow
exposes the unified output port that bundles every visible output into one
object.
{"result": "ok", "ssn": "123-45-6789"}{"output": {"result": "ok"}}The hidden ssn value never appears inside output either — composition
worked from the result stripping had already produced.