[papyrus] Source canvas position from silverwood, not a client cache master
A workstream's canvas coordinate is meant to live only in silverwood (papyrus is stateless). But the client treated its in-memory node positions as authoritative: the 1s reconcile loop never re-pulled position for an on-screen node, and saveAllPositions wrote *every* node's position back in bulk on drag-end and beforeunload. So a move in one instance stayed invisible to another even after a refresh, and any instance could clobber another's update with its stale view. Fix: silverwood is now the source of truth for position. Save only the node(s) actually moved, via onNodeDragStop -> PATCH /sessions/:id {position}; the reconcile adopts silverwood's position for existing nodes, shielding a just-dragged node with an echo-clear guard (resolveReconciledPosition, unit-tested) until our own save round-trips. Drop the bulk POST /state/positions, saveAllPositions, and the beforeunload save. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GBWyw3DyRvvNmgJpFZBsC5