Dragging (yourself or a peer, for local-only listening position) never clamped the node's actual on-screen position — only the *derived* room coordinate got clamped to [0,100]. Cytoscape let the dot follow the pointer arbitrarily far past the edge while the stored position stayed pinned at the wall, so it visually flew off, then snapped back the instant you released. Now every drag frame writes the clamped position back onto the node itself, so it can't separate from its real, bounded position. Given refDistance=4/rolloffFactor=1.4, staying inside the room already keeps everyone's audio gain above ~18%, so this is the actual "never drag out of hearing range" bound. Also replaced the ':grabbed' re-query in the 100ms sync loop (which decided whether to skip re-snapping the actively-dragged node) with an explicitly tracked node id — strictly more correct regardless of whether it contributed to the glitch above. Dragging a peer is local-only (repositions how loud/where only you hear them, never sent to anyone else) but had no feedback saying so; added a one-time toast when you grab a peer's dot. Also shrink the initial spawn-scatter radius from 20 to 6 room units — at radius 20, two people could spawn diametrically opposite (40 units apart), which was already down to ~7% audio gain before anyone said a word. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>