Symptom

The LogicGate chip (row face in lists / ProjectScreen, and the read-only summary at the top of the editor) still showed the old sources → gate → target flow, including a “🎯 No target” placeholder — even after inputs moved to LogicGateMetaData.inputs. It displayed legacy sources, not the inputs the user actually configures.

Root cause

LogicGateConfigDisplayContent predated the executionSource migration and read meta.sources / meta.targets. The shared composable was also reused as a read-only summary at the top of the editor, so it duplicated the new interactive Inputs section added in the prior work item.

Fix

Rewrote LogicGateConfigDisplayContent to render inputs → gate icon from meta.inputs (via a new pure, unit-tested Pair<NodeIdentity?, NodeIdentity?>.setInputs() helper that returns the non-empty inputs in slot order). Removed the target column, the “No target” treatment, and the configure hint; reworded the two-input warning to “requires two inputs”. Removed the redundant read-only summary from the top of the editor (the interactive Inputs section covers it). Extracted a shared LogicGateInputRef composable (icon + Node.name(), or a “Missing” chip) used by both the chip and the editor’s DigitalInputSlot, so they render inputs consistently. Deleted dead source/target helpers (sourceCount, hasAnySources, List<NodeIdentity>.second) and the never-called LogicGateActionRow.

Prevention

When a node type migrates models (here: sources/targets → inputs/executionSource), audit every composable that reads the old fields — chips and read-only summaries are easy to miss because they share a composable with the editor. Keep the “which values are set” logic in a pure helper (setInputs) with a test so the display can’t silently read the wrong field. The legacy sources/targets are now unreferenced in the LogicGate UI; the server still evaluates from sources until a later work item moves evaluation to inputs.