Replaces the four-router curved-routing stack (WebCola routeEdge over inflated
bounds, direct-line bypass, perpendicular reroute, curveBasis+tangent-guides)
with one obstacle-avoiding router, exposed as a "Taut" option in the Routing
dropdown (Default / Taut / Grid). Default behavior unchanged; grid mode untouched.
- One obstacle model (visible rects + clearance), one port pass (reused), one
corner-visibility shortest-path router (Dijkstra), one interpolating fillet
smoother. Self-loops, group edges, parallel edges keep their branches.
- optimizeCrossings skipped in taut mode (its resolvers reshape routes without
re-running the obstacle-aware router and could push edges through nodes).
- Per-pass obstacle cache: O(E·N) -> O(N) bounds work (3.4-6.5x faster build);
taut routeEdges measured faster end-to-end than legacy.
- Post-review fixes (Codex P1/P2): visibility tested against all obstacles
intersecting the vertex bbox (not just the src/tgt AABB), and parallel-edge
fanning validated against obstacles with fallback to the base route.
- 18 unit tests incl. reviewers' repros; full suite green. Version 2.6.4 -> 2.6.5.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>