Member Junction
    Preparing search index...
    • Which skip seeds are real — the ones nothing still reaches.

      The invariant. A task may be marked Skipped only when EVERY route into it has been cut. The dispatcher already enforces that for ordinary dropped edges (its stillReachable set), and ComputeSkipCascade's own contract promises it for joins: "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." Exclusive losers bypassed both and were written Skipped directly.

      The shape that breaks: A →(cond)→ Review → Publish and A →(else)→ Publish. With the condition true, the losing edge A→Publish seeded Publish as Skipped while Review was still running. Review then completed, Publish was already terminal, Skipped satisfies dependents — and the graph settled Complete with the publish step never executed. No error and no stall, which is why it needed a test rather than a bug report.

      Why the cascade cannot do this job. ComputeSkipCascade decides over node STATUS — "every gating predecessor is Skipped". A genuine XOR loser's origin is Complete, not Skipped, so the cascade would refuse every legitimate loser. Seed confirmation is a question about EDGES: is any gating edge into this task still live? The two rules are complementary, and this is the one the cascade is missing.

      Parameters

      • seedTaskIDs: readonly string[]

        candidate skips (exclusive losers) this cycle

      • liveEdges: readonly TaskGraphEdge[]

        edges that survived resolution — losers and definitely-false edges removed

      Returns string[]

      the seeds with no live gating route remaining