TEXT and JSON DataPoint values were invisible on the swarm canvas. A COLOR DataPoint rendered a color swatch, a DIGITAL DataPoint switched between toggle-on/toggle-off icons, and a DOUBLE DataPoint showed its first 4 characters centered on the icon — but a TEXT or JSON DataPoint showed only the generic {} icon with no value indication. LLM answers, incoming-webhook bodies, and text sensor readings could not be monitored at a glance; the editor had to be opened to see any content.
IconManager.NodeCompoundImage had explicit value overlays for DataType.DOUBLE (short numeric text at center) and DataType.COLOR (filled circle) but nothing for DataType.TEXT or DataType.JSON. The type-specific when arm for KrillApp.DataPoint simply did not handle those two DataTypes, so they fell through with no visible value representation.
Added a truncated NamePill below the icon circle for TEXT/JSON DataPoints whose snapshot is non-empty. The pill is positioned with Modifier.offset(y = iconEnclosureSize / 2 + CHIP_VERTICAL_PADDING) — just below the 62dp circle boundary — and shows the first NODE_LABEL_MAX_LENGTH (12) characters of the snapshot value, with a … suffix when truncated. Empty snapshots render nothing, consistent with how DOUBLE behaves on a blank value. Changed files: composeApp/src/commonMain/kotlin/krill/zone/app/IconManager.kt. New test: composeApp/src/desktopTest/kotlin/krill/zone/app/krillapp/datapoint/DataPointTextCanvasPreviewTest.kt.
DataType enum value is added, audit NodeCompoundImage’s is KrillApp.DataPoint block to confirm the new type gets a meaningful canvas representation (not just a static icon).DataTypeChipLabelTest already guards that all DataType entries have chip labels; extend that discipline to the canvas overlay: if a DataType produces a visible value (not just a state icon), NodeCompoundImage should reflect that value.IconManager.NodeCompoundImage directly with each DataType and asserts the expected overlay would have caught this at introduction time.