The canvas resolves a connection by looking its fOutputId / fInputId up among all registered
ports — a flat, graph-wide namespace. Giving every node ports literally called in and out made
every node's ports collide with every other node's, so a connection could not name which node's
port it meant. The result was a workflow that drew its boxes correctly and no edges at all:
nothing errored, because an unresolvable port is simply a connection with nowhere to attach.
The Flow Agent editor — the other consumer of this canvas, whose edges have always drawn — scopes
its ports the same way (${stepId}-input / ${stepId}-output). This is that convention, named,
so a future producer cannot reintroduce the collision by writing the obvious literal.
Port ids are scoped to their NODE, and must be.
The canvas resolves a connection by looking its
fOutputId/fInputIdup among all registered ports — a flat, graph-wide namespace. Giving every node ports literally calledinandoutmade every node's ports collide with every other node's, so a connection could not name which node's port it meant. The result was a workflow that drew its boxes correctly and no edges at all: nothing errored, because an unresolvable port is simply a connection with nowhere to attach.The Flow Agent editor — the other consumer of this canvas, whose edges have always drawn — scopes its ports the same way (
${stepId}-input/${stepId}-output). This is that convention, named, so a future producer cannot reintroduce the collision by writing the obvious literal.