P Eduba
All posts Product

Designing the subflow interface — type-safe ports across versions

By Sarah · May 14, 2026 · 11 min read

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.