Symptom

Feature work (not a bug): ClientScreen only showed the orbital, server-rooted parent/child layout, so a swarm’s actual data-flow wiring (sources/inputs) was invisible as a primary structure and cross-server flow couldn’t be seen at all. Implemented via openspec change add-node-flow-view.

Root cause

N/A — net-new capability. Added a second ClientScreen layout (Flow view) that hides structural containers and lays the combined swarm out by its data-flow edges, toggled from a top-right icon mirroring the avatar.

Fix

ScreenCore gained a viewMode: StateFlow<CanvasViewMode> (Server/Flow) + a toggleViewMode() — a sticky preference deliberately not cleared by reset(). NodeLayout.kt gained computeFlowPositions(swarm, nodeManager) delegating to a pure, manager-free computeFlowLayout(nodes): it excludes Server/Project/Client, builds the sources ∪ inputs edge set (resolving peer-qualified host:nodeId ids, dropping edges to absent/hidden endpoints), groups nodes into connected components, force-lays each component reusing the existing sim primitives (applyNodeRepulsion/applyEdgeCrossingForces/ applyForcesWithDampening) with sources sprung harder than inputs, shelf-packs the clusters, and returns graph positions + drawn edges + an orphan list. ClientScreen branches the layout call and draw passes on viewMode (skips parent-line and peer-error passes in Flow view), the avatar hosts the orphan gutter (tap → editor), and nodes that newly gain a flow position play the existing entrance animation so a wired-up orphan pops into its cluster.

Prevention