You are partly correct, if each step is another generator function you can retry the steps until success or fail, and even create a small framework around it.
You can do that manually by defining a bunch of explicit steps, their outputs and inputs, and how to transform the data around. And you could use generators to create a little DSL around that. But I think the idea here is to transform arbitrary functions into durable pipelines.
Personally, I'd prefer the more explicit DSL-based approach, but I can see why alternatives like this would appeal to some people.
These alternatives just hide the implementation and make debugging and debugging expanding/configuring unavailable