The LogicGate server processor still used the deprecated node-executes-node
model: LogicGateCompute read inputs from meta.sources, and
ServerLogicGateProcessor wrote its boolean result to a configured target node
(writeBooleanToTarget — mutating a Pin, a DataPoint snapshot, or executing a
downstream gate). This conflicts with the executionSource/observer model the
node graph is migrating to.
Pre-migration design. A LogicGate “pushed” its result to a target, instead of being a deterministic function that “fires” so downstream observers can react.
LogicGateCompute.computeValue reads the gate’s digital inputs from
LogicGateMetaData.inputs (the Pair<NodeIdentity?, NodeIdentity?>), treating
null / empty-nodeId slots as unset. Truth-table evaluation is unchanged
(Pin persisted state, DataPoint snapshot, LogicGate recomputed).ServerLogicGateProcessor.process is now the observer-pattern action: compute
the result; if true, inform downstream subscribers via
nodeManager.executeSources(node); if false, do nothing. It always returns
true so post resets the gate to NONE. Re-entrancy is still guarded by the
existing processing set.writeBooleanToTarget entirely; the processor no longer reads
meta.targets or mutates any target.LogicGateComputeTest (truth table from inputs),
ServerLogicGateProcessorTest (executeSources only on a true result; never
writes a target).Observer-model nodes “fire” via executeSources and never write to a target —
when migrating a processor off the push model, delete the target-write path
rather than leaving it as a fallback, and lock the contract with a test that
asserts the target-mutating methods are never called. Keep the deterministic
compute in its own unit (LogicGateCompute) so the truth table is tested
without the dispatch machinery.
The gate is woken only when a node it lists in meta.sources fires, but inputs
now live in meta.inputs (and the inputs UI leaves sources empty) — so input
changes do not yet invoke the gate. Wiring the input→gate wake (so an input
change invokes the gate) is the next work item; until then the processor is
correct when invoked but inert end-to-end.