When a subflow’s interface changes, every parent that uses it is potentially broken. Most engines ignore this. We surface it.
The versioning problem
When you publish a new version of a subflow with a renamed port, every parent workflow that binds to the old port name silently breaks at runtime. We saw this happen enough in beta that we knew we had to design a solution at the interface level, not just document it.
Typed ports as a contract
Subflow ports are now typed schemas — not just names. A port has a direction (in/out), a data type (string, number, JSON, file-ref), and an optional default. The version number includes a compatibility signal: MINOR means backward-compatible additions; MAJOR means a breaking change.
How the UI communicates breakage
When a parent workflow references a subflow version with incompatible ports, the affected binding highlights in red with a tooltip explaining the mismatch. The designer can either update the subflow to a compatible version or remap the binding manually.
What we cut
We originally designed an auto-migration that would attempt to remap bindings by type-matching. We cut it because the failure modes were worse than the problem — a type match is not a semantic match. Explicit is better than implicit.