Symptom

Tapping a node in a list opened its editor on an Overview tab that showed the node’s row face — the exact chip the user had just tapped — followed by static, per-type explanatory prose. Every edit therefore cost an extra tap: land on Overview, read a duplicate of the row you came from, switch to Settings. The genuinely useful content on that tab (what this node type is for, how sources and verbs work) is reference material a user reads once, not something to page past on every visit.

Root cause

Not a defect — an information-architecture choice that stopped paying for itself once the row chip became the standard list affordance. Overview was index 0 of NodeEditorContainer’s three-tab layout, so it was the landing tab for every one of the ~25 node types. It also hosted the only entry point into the editor-side “Connect Nodes” wizard, and the only rendering of a targeting node’s live snapshot value — two unrelated things parked on the tab because it was the one place guaranteed to be visible.

Fix

NodeEditorContainer now renders two tabs (NODE_EDITOR_TAB_TITLES = Settings, Sources) with Settings at index 0. The explainer moved into NodeInfoDialog, opened by an info icon rendered inside the Settings tab’s label — the icon carries its own clickable, so tapping the icon opens the dialog while a tap anywhere else on the tab still selects the tab. The snapshot readout moved to NodeSnapshotSection, rendered above the type’s form in the Settings body, because it is live state rather than explainer prose and does not belong behind an “About …” dialog. The editor-hosted ConnectNodesWizard and its step-1 explainer copy were deleted; the wizard’s second step (RelationshipStep) survives — it is also the canvas edit-mode avatar bubble’s content — and moved to a file named after what it now is.

Files: composeApp/.../ui/DialogComponents.kt, composeApp/.../ui/SourcesTab.kt, composeApp/.../NodeSummaryAndEditor.kt, composeApp/.../krillapp/connect/RelationshipStep.kt (was ConnectNodesWizard.kt), new drawable circle_info_duotone_regular_full.xml.

Prevention

Deleting a UI surface is a dead-code question, and grep-by-symbol answers it better than grep-by-file. The first pass here deleted ConnectNodesWizard.kt and trimmed the helpers it used, on the assumption that a symbol reachable only from the removed tab was dead everywhere. It wasn’t: RelationshipStep had a second, unrelated caller (EditModeBubble in ClientScreen.kt) that a file-level scan of the connect package hid, because that package also holds disconnect/ConnectionKind, which the canvas uses. The compiler caught it, but only after a round of over-deletion.

Rules: