Remove End-targeting exception from forward highway detection

DetectHighwayGroups had a special case for End nodes that included
forward End-targeting edges in highway grouping even when they didn't
share a corridor. This caused edges at different Y levels to be
truncated to a shared collector, destroying their individual paths.

End-targeting edges are already handled by DetectEndSinkGroups (which
now correctly skips groups with no horizontal overlap). Forward
highway detection should only apply to backward (repeat) edges.

All 5 End-targeting edges now render independently with full paths.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
master
2026-04-02 14:06:45 +03:00
parent 5a8c6635fc
commit 8a8dbee9ce

View File

@@ -1253,9 +1253,7 @@ public sealed class WorkflowRenderSvgRenderer
IsBackward = edge.Sections.First().EndPoint.X < edge.Sections.First().StartPoint.X, IsBackward = edge.Sections.First().EndPoint.X < edge.Sections.First().StartPoint.X,
Span = ComputePrimarySpan(edge), Span = ComputePrimarySpan(edge),
}) })
.Where(entry => .Where(entry => entry.Span >= 96d)
entry.Span >= 96d
|| string.Equals(entry.TargetNode.Kind, "End", StringComparison.OrdinalIgnoreCase))
.GroupBy( .GroupBy(
entry => $"{entry.Edge.TargetNodeId}|{entry.FamilyKey}|{(entry.IsBackward ? "back" : "forward")}", entry => $"{entry.Edge.TargetNodeId}|{entry.FamilyKey}|{(entry.IsBackward ? "back" : "forward")}",
StringComparer.Ordinal) StringComparer.Ordinal)
@@ -1279,8 +1277,7 @@ public sealed class WorkflowRenderSvgRenderer
group.First().FamilyKey, group.First().FamilyKey,
isBackward); isBackward);
}) })
.Where(candidate => candidate.IsBackward .Where(candidate => candidate.IsBackward)
|| string.Equals(candidate.TargetNode.Kind, "End", StringComparison.OrdinalIgnoreCase))
.Where(candidate => .Where(candidate =>
candidate.EdgeIds.Count >= (candidate.IsBackward ? 3 : 2)) candidate.EdgeIds.Count >= (candidate.IsBackward ? 3 : 2))
.ToArray(); .ToArray();