Make an Execution[T] type, which is a monad, which makes composing Jobs easy.

That's what I wasn't sure about. I mean once they do .write(), how can they continue computation?

If you have (tpipe:TypedPipeFactory).stuff.writeExecution(sink), now you're stuff. If you do

val tp = (tpipe:TypedPipeFactory).stuff
tp.writeExecution(sink)
tp.writeExecution(sink2)

What is going on, right? We have to call run on each I guess, and the composition is a bit weird. likely I'm misunderstanding something