Components transform, ports deliver
A pipeline component exists to shape and publish messages. The moment it makes the delivering call — the insert, the POST, the file write that completes the integration — it has stepped into the send port’s job and undone the bus.
This is normalize onto the bus stated as a boundary on the component itself. A component runs inside the receive context, so a delivering call inside it holds the inbound transaction open while it waits on a slow endpoint, blocks throughput, and can let a downstream failure poison the receive. It also welds the feed to one destination and hides the work from tracking.
The component’s contract is narrow on purpose: parse, validate, enrich, normalize, publish. Stop there. Whatever needs to happen to the outside world is expressed as a published canonical message and a send port that subscribes — which is also what makes the flow observable, resilient and replayable.