For each task, the tasks certain to have RUN — started, and not skipped — whenever it runs,
itself included.
This is what "has this step answered by the time that one finishes?" means on a graph, and it is
stricter than ancestry. A task runs only once every gating predecessor is terminal, and at least
one of them ran (a task whose every route in was cut is skipped). So:
a predecessor that can never be skipped certainly ran, and so did everything certain for it;
of the rest, only what is certain for EVERY predecessor is certain, because any one of them may
be the branch that ran.
A task can be skipped only when every gating route into it can be cut: its edge is conditional or
exclusive, or its origin can itself be skipped. An entry task is never skipped by the engine.
Operator verbs (skip, override) and a declared early finish are deliberate interventions and are
not modelled.
Only Prerequisite edges count, matching ComputeEligibleTasks: an edge that does not gate
a task starting cannot make anything certain before it.
For each task, the tasks certain to have RUN — started, and not skipped — whenever it runs, itself included.
This is what "has this step answered by the time that one finishes?" means on a graph, and it is stricter than ancestry. A task runs only once every gating predecessor is terminal, and at least one of them ran (a task whose every route in was cut is skipped). So:
A task can be skipped only when every gating route into it can be cut: its edge is conditional or exclusive, or its origin can itself be skipped. An entry task is never skipped by the engine. Operator verbs (skip, override) and a declared early finish are deliberate interventions and are not modelled.
Only
Prerequisiteedges count, matching ComputeEligibleTasks: an edge that does not gate a task starting cannot make anything certain before it.