From the full descriptor list + the committed terminal-outcome map, partition
the not-yet-terminal stages into the ones to launch now (runnable) and the
ones to mark skipped now (skippable). An already-terminal stage appears in
neither. Skip-eligibility takes precedence over runnability (the two sets are
disjoint). Generic over the descriptor subtype so a caller carrying extra
serializable fields gets them back on the partitioned stages.
From the full descriptor list + the committed terminal-outcome map, partition the not-yet-terminal stages into the ones to launch now (
runnable) and the ones to mark skipped now (skippable). An already-terminal stage appears in neither. Skip-eligibility takes precedence over runnability (the two sets are disjoint). Generic over the descriptor subtype so a caller carrying extra serializable fields gets them back on the partitioned stages.