When an exclusive fan-out picks a winner, the losing targets are seeded here and their exclusive
descendants follow. The rule is deliberately conservative: a task is skipped only when it has at
least one gating predecessor and every gating predecessor is skipped. A join that is also
reachable from the winning branch therefore survives — which is the entire point, since a fork
that reconverges must still run its join.
Optional and Corequisite edges are ignored, matching ComputeEligibleTasks: an edge that does
not gate a task starting cannot decide that it never starts.
Fixpoint rather than a single forward walk, because a join's fate is only decidable once every one
of its gating predecessors is known — a walk in edge order could visit it too early and let a
doomed branch through.
Ordering invariant (load-bearing): the cascade is computed and persisted BEFORE eligibility in
every cycle. A task whose gating predecessors are all Skipped is simultaneously eligible
(Skipped satisfies, §5.2) and to-be-skipped; running eligibility first would dispatch the loser
branch before anything marked it. Cascade first, always.
Propagates "not taken" down a losing branch.
When an exclusive fan-out picks a winner, the losing targets are seeded here and their exclusive descendants follow. The rule is deliberately conservative: a task is skipped only when it has at least one gating predecessor and every gating predecessor is skipped. A join that is also reachable from the winning branch therefore survives — which is the entire point, since a fork that reconverges must still run its join.
OptionalandCorequisiteedges are ignored, matchingComputeEligibleTasks: an edge that does not gate a task starting cannot decide that it never starts.Fixpoint rather than a single forward walk, because a join's fate is only decidable once every one of its gating predecessors is known — a walk in edge order could visit it too early and let a doomed branch through.
Ordering invariant (load-bearing): the cascade is computed and persisted BEFORE eligibility in every cycle. A task whose gating predecessors are all Skipped is simultaneously eligible (Skipped satisfies, §5.2) and to-be-skipped; running eligibility first would dispatch the loser branch before anything marked it. Cascade first, always.