Symptom

A Calculation node invoked by a Cron computed its result but never showed the activity colour pulse on pi-krill. Investigation revealed ~10 node types silently never ran when invoked through source wiring: Compute, LogicGate, Lambda, SMTP, MQTT-publish, WebHookOut, SerialDevice, Backup, Camera, LLM, and Calculation, which was the first instance found and fixed separately (commit 274931f2a).

Root cause

The universal-source-wiring refactor made executeSources → wakeFromSource → NodeProcessor.onSourceTrigger the sole source-invocation path, but onSourceTrigger’s default implementation was a deliberate no-op. Processors that perform their work inside post() with NodeState.EXECUTED (Compute, LogicGate, Lambda, SMTP, MQTT-publish, WebHookOut, SerialDevice, Backup, Camera, LLM, and originally Calculation) were therefore never run when source-wired. Separately, executeSources emitted no transient state, so the activity pulse was an accidental side-effect of each processor’s own updateMetaDataNONE broadcast; nodes that finalised differently (e.g. Calculation going straight to NONE) never pulsed at all.

Fix

Prevention

A dispatch entry point’s default must encode the common-correct behaviour, not a silent no-op that strands un-migrated types. When a refactor changes how units are invoked, give the new entry point a working default and test it once generically — don’t rely on every processor re-implementing it. Three regression tests now guard this: NodeProcessorDefaultTest (default re-enters post()), UniformSourcePulseTest (every woken subscriber gets a PROCESSING pulse via SSE), and SourceDeleteSemanticsTest (sources removed from wiredSources stop receiving pulses). Relates to the dispatch-entry-point lesson from the calculation-formula-builder work.