Symptom

The RESET verb (NodeAction.RESET) was only interpreted by three processors (Timer stop, TaskList complete-tasks, LLM clear-reply); every other snapshot-bearing node type either ignored RESET or had a no-op guard. There was no general “a source firing RESET clears the observing node’s stored value” behavior — so the canonical loop (a Calculation counting a DataPoint up to a threshold, an Alert firing RESET at the threshold, the DataPoint observing the Alert and clearing back to 0 to restart the count) could not be built.

Root cause

Every node’s metadata carries a Snapshot (via SourceMetaData.snapshot), but the SDK exposes only val snapshot (read-only) plus withError(...) — there is no withSnapshot(...), and each concrete *MetaData is its own data class with its own copy(). So there was no generic way to clear a node’s snapshot, and RESET semantics had to be hand-written per processor.

Two further traps, both discovered by reading the code before implementing:

Fix

A single interception seam, not per-processor edits:

Prevention