DAG scheduling
How requires edges and concurrency classes drive step dispatch; requires is ordering, not a success demand.
In a parallel play the DAG scheduler dispatches steps as their dependencies complete, subject to each resource's concurrency class. Ordering comes from each step's requires (a list of sibling step names).
- requires is ordering, not a success demand: a *skipped* dependency does not block a dependent; an *errored* or *not-run* dependency blocks dependents (they report not run) in apply mode. - Steps left undispatched when a run halts report not run. - A global-class step runs completely alone: the scheduler drains in-flight steps, runs it solo, then resumes.