Add ElkLayoutClearance (thread-static scoped holder) so all 15+
ResolveMinLineClearance call sites in scoring/post-processing use the
same NodeSpacing-aware clearance as the iterative optimizer.
Formula: max(avgNodeSize/2, nodeSpacing * 1.2)
At NodeSpacing=40: max(52.7, 48) = 52.7 (unchanged)
At NodeSpacing=60: max(52.7, 72) = 72 (wider corridors)
The infrastructure is in place. Wider spacing (50+) still needs
routing-level tuning for the different edge convergence patterns
that arise from different node arrangements.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
The Y-axis counterpart to ExpandVerticalCorridorGutters: after edges
are routed, detects horizontal segments with under-node or alongside
violations, then inserts horizontal gutters by shifting all nodes
below the violation point downward. Re-routes with expanded corridors.
This is the architectural fix for the placement-routing disconnect:
instead of patching edge paths after routing (corridor reroute,
push-down, spread), the gutter expansion creates adequate routing
corridors in the node placement so edges route cleanly.
Runs after X-gutters and before compact passes, up to 2 iterations.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>