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).
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
updateMetaData→NONE broadcast; nodes that finalised differently (e.g. Calculation
going straight to NONE) never pulsed at all.
NodeProcessor.onSourceTrigger default now re-enters post() with EXECUTED on an
EXECUTE verb (no-op on RESET — no silent fallback), making the common-correct
behaviour available to every processor that defers to super (shared module).ServerNodeManager.executeSources emits a transient PROCESSING node to the SSE
flow (_nodeUpdates) for every woken subscriber — SSE-only (no persist, no
node.type.emit/Koin) so it neither double-dispatches nor breaks the Koin-free
server-test contract (server module).onSourceTrigger overrides; an override fully replaces the default so there is
no double-run.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.