@raito If you want an analogy with pipes, program A invoking popen("B",...) would be a very primitive form of the sort of coupling I'm talking about, but largely unobjectionable if B is just processing data and not controlling some persistent state.
The user invoking A|B is not a form this type of coupling.
But none of this is an argument about doing things with pipes. It's about whether programs are aware of each other & addressing each other with IPC/RPC.