Symptom

In the Connect Nodes wizard, step 1 shows a HighThreshold node as “High Threshold” (title-cased, human-readable), but step 2’s NodeBadge shows the same node as “HighThreshold” (PascalCase, raw type name). The same node appeared differently within consecutive screens of the same wizard.

Root cause

ConnectNodesWizard.kt had a private displayName() extension that called Node.name() with an ifBlank fallback to type.title():

1
private fun Node.displayName(): String = name().ifBlank { type.title() }

Node.name() (in NodeFunctions.kt) falls back to this.type.toString() when meta.displayName() is empty. For TriggerMetaData, which does not override displayName(), meta.displayName() returns "", so Node.name() returns the Kotlin class name "HighThreshold". That string is non-blank, so the ifBlank { type.title() } branch in the wizard never fired. Step 2 rendered "HighThreshold" instead of "High Threshold".

Step 1 used NodeSummaryAndEditor(node, ViewMode.ROW) → the type selector row uses krillApp.title() directly, so it correctly displayed “High Threshold”.

Fix

Changed the wizard’s displayName() to bypass Node.name() and check meta.displayName() directly, falling back to type.title():

1
internal fun Node.displayName(): String = meta.displayName().ifEmpty { type.title() }

meta.displayName() returns "" for TriggerMetaData (no override), so the fallback fires and returns type.title() = "High Threshold". For node types that do set a user name (e.g. DataPointMetaData.displayName() = name), the existing name is preserved.

Prevention