Root cause found: RouteGraph.getNodes() is a FLAT list that includes handler compound children (log8, setBody1, etc.) as top-level entries alongside the main flow nodes. The handler separation only identified the compound PARENTS (ON_EXCEPTION) but not their children, so 7 handler children leaked into rootNode as main flow nodes, causing ELK to place the real main flow at wrong Y positions. Fix: two-pass separation — first identify handler compounds and collect ALL descendant IDs, then build mainNodes excluding both handler compounds AND their descendants. Debug logging left in temporarily for verification. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>