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.
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.
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.
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.