Symptom

Chip subtitles across the node catalog mixed three distinct registers with no visual differentiation: live configured values (“Deadband ±0”, “1s”), fallback resource descriptions, and action-prompt hint lines (“Build your formula”, “Enter URL…”, “Configure SMTP…”). A user scanning the chip list had no visual cue distinguishing “this node is unconfigured and needs setup” from “this is the node’s current state.”

Root cause

Each chip composable rendered its hint/prompt text as a plain Text or EmojiText with color = onSurfaceVariant, identical in typography to configured-state subtitles. No shared composable enforced a consistent “prompt” look, so new node types varied freely. Chips that were fully unconfigured also still passed configured = true (default) to NodeChipScaffold, keeping the secondaryContainer background even when they had no meaningful content to show.

Fix

Added PromptSubtitle(text, modifier) to NodeChip.kt: italic bodySmall in onSurfaceVariant, backed by EmojiText for cross-platform emoji support. Applied it to every chip’s hint/prompt line: CalculationChip, ComputeChip, LambdaChip, LogicGateChip, SMTPChip, OutgoingWebHookChip, MqttChip. For fully-unconfigured chips — those whose entire content reduces to the prompt — also wired the correct configured expression into NodeChipScaffold so the chip surface switches from secondaryContainer to surfaceVariant.

Prevention

Use PromptSubtitle(…) for every “needs setup” hint line in a new chip composable. If the chip has no meaningful configured content (formula is empty, no inputs wired, no script selected), also pass configured = false to NodeChipScaffold. A reviewer who sees a raw Text(…, color = onSurfaceVariant) in a chip body should ask whether it belongs in PromptSubtitle instead.