yes, very much the same. I have multiple use cases. One is to execute SQL DDL (create table/type/view/package/procedure) where dependencies form a DAG (view_a uses function_b which uses view_c and table_d) and the other is for computed fields in a tabular report (where fiedls can depend on other fields). Just glanced over your nice writeup and it seems you recompute the "which nodes of the graph have no unfinished predecessors" every time after a node finishes. Did I get this right? I was thinking to convert every node into a lazy coroutine jobs and translates dependencies into the dependent function "await" on the predecessors.