Skip to content
mchristegh edited this page Jul 15, 2026 · 1 revision

This page owns the event taxonomy: every value msg.consensusEvent can take, where it routes, and when it carries ignored: true. For the envelope properties themselves, see Output Messages.

The two rules that organize everything

ignored is a modifier, not an event category. The event name tells you what was attempted; ignored tells you whether it took effect. A rejected payload is still a reading (ignored: true); a Trigger suppressed while disabled is still triggered (ignored: true). There is no separate "rejected" event to watch for.

One message, one reading-class event. A single incoming reading emits exactly one of sourceadded / sourcerecovered / reading — the most specific that applies — each carrying the full recomputed aggregate. Transitions that reading causes (quorum, trigger/release, minority) fire as separate events afterward, in causal order.

Taxonomy

Event Output(s) Can be ignored: true? source
triggered 1 + 4 On 4 only — transition suppressed while disabled external, internal
released 2 + 4 On 4 only — suppressed while disabled external, internal
reading 4 Yes — uncoercible payload or missing topic (rejectedValue) external
sourceadded 4 No external
sourcerecovered 4 No external
sourcestale 4 No internal (clock/restore); external via setstale
sourceremoved 4 Yes — unknown topic external
quorumlost 4 No external, internal
quorumregained 4 No external, internal
minorityreport 4 No — a deliberate notification external, internal
disabled / enabled 4 Yes — redundant command external
reset 4 No external
triggerset / releaseset / staleset 4 Yes — invalid or wrong-side value (attempt attached) external
query 3 No external (query command), internal (heartbeat)

Event notes

  • released carries msg.releaseReason: "threshold" or "quorumlost" — see Trigger and Release and Sources Freshness and Quorum.
  • minorityreport (Boolean mode) fires when the set of disagreeing fresh sources changes — including one final report with an empty set when a disagreement resolves. A stuck sensor produces one report, not a stream.
  • sourcestale is normally the node's own clock speaking (source: "internal"); the one external path is a setstale shrink expiring sources on the spot — the live command is what caused it.
  • Filtering: the Events output is intentionally complete. Wire a switch node on msg.consensusEvent (and msg.ignored) downstream to pick out what you care about — per-output event filtering was deliberately left out of the node.

Clone this wiki locally