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.
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.
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.
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:
NodeEditorTabsTest now pins the contract: the tab list contains no
“Overview”, Settings is the landing tab, no “Connect Nodes” button exists in
the editor, and the info icon opens and closes the explainer dialog. A
re-introduced Overview tab fails on the first assertion.