Symptom

A node edit that changes only the top-level Node.parent field (re-homing a node under a new parent in the swarm tree) persisted correctly via ClientNodeManager.submit(...), but the Server-view canvas did not re-draw the parent/child orbit — the node stayed visually under its old parent until an unrelated change or a full reload forced a relayout.

Root cause

The canvas layout is recomputed by ClientScreen’s LaunchedEffect(structure, wiringRevision, viewMode), where:

A parent change keeps the same id set (no node added/removed), so structure doesn’t re-emit. And submit() — unlike updateMetaData(), which bumps _wiringRevision — does not bump the revision. So neither trigger fires and computeNodePositions never re-runs. The per-node MutableStateFlow<Node> does update (the chip repaints), which is why the change looked “saved” while the tree geometry stayed stale.

Fix

Prevention