fuseAdjacent
Returns a Draft where adjacent same-kind CoordinationKind.Free nodes in a linear chain are collapsed into a single DraftStage.FusedMap or DraftStage.FusedFilter.
Graph-local criterion: two nodes A and B can be fused when:
B's sole predecessor is A (
B.predecessors == {A.id}).A has only one successor in the graph (so we are in a linear chain, not a branch point).
A and B are the same kind (both map-kind or both filter-kind).
DraftStage.Source and DraftStage.Embroider are never fused.
Branch-preserving: the algorithm rebuilds DraftNodes directly, tracking predecessor remapping through fusion collapses. The graph structure — including independent branches from Draft.combine — is fully preserved. List.toPathNodes is never called on the combined result, avoiding the linearisation that would otherwise destroy multi-branch structure.
Why it's safe: monotone stages commute (CALM). Fusing them preserves the combined function: the E-5 runtime applies fused stages in their original order, just in one pass rather than N passes. The opId multiset is unchanged.