Symptom

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.

Root cause

Pre-migration design. A LogicGate “pushed” its result to a target, instead of being a deterministic function that “fires” so downstream observers can react.

Fix

Prevention

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.

Follow-up (not in this change)

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.