Watch
1
0
Fork
You've already forked souveraine
0
souveraine/saf/nervous/01-eventbus.md
Fimeg 21ef10e883 saf: join authority, belief, and the panel
Session and device authority now have living owners; belief and felt state match the Rust that actually runs.\n\nThe Panel audit keeps three real commands, names the image seam, and refuses to call inherited ii stubs parity.
2026-08-17 12:26:09 -04:00

2.6 KiB

The nervous system

One channel. One kind of message. Anything that happens, a schedule coming due, a file changing, a peer reaching in, becomes a SensorEvent and goes onto the bus. Everyone listening hears all of it. No one waits on anyone else.

The code is src/core/nervous/mod.rs.

The bus

EventBus is a broadcast channel, cloneable, so anything holding the server can subscribe and get its own stream. Two moves: send and subscribe.

Send is fire-and-forget. If no one is listening, or a listener has fallen behind, the event is simply gone. The bus is a nerve, not a ledger. Anything that must be kept subscribes and writes it down; the event log does exactly that.

The ring holds 256. A listener that falls further behind is told it lagged and skips ahead. Nothing is replayed.

That makes the bus unsuitable as belief or audit storage. Evidence that must survive is accumulated by belief; state transitions and notable somatic events that must be reconstructed enter the device forensic trail.

It is a broadcast and not a queue because many things want every event at once: the log, the heartbeat, the firehose, the federation bridge. A new listener, a desktop face, a health monitor, attaches without the sender ever knowing it is there.

The message

Every event is a SensorEvent:

  • sensor_name: who fired (cron, energy, federation)
  • event_type: what it is (schedule_due, sensorium:input, turn:segment)
  • timestamp: when
  • target: a conversation, a schedule, a room; depends on the type
  • urgency: 0 to 1, how loudly it asks to be seen
  • payload: whatever the type needs
  • seed_id: empty for a local event, a peer's key when it came from elsewhere
  • reply_to: where a directed reply goes; empty for a broadcast

One type, not an enum per event, so a listener filters on event_type and ignores the rest, and the log can write everything down without knowing the taxonomy.

seed_id rides on every event though federation isn't here yet. When it lands, a sensor becomes federated without the envelope changing. See federation/01-node-enrollment.

What pushes

A SensorConfig says how a sensor takes part: which domain (Cron, Filesystem, FilesystemWatch, GitDiff, Memory, Process, Federation), whether it pushes on its own or waits to be asked, when it fires (once, on change, or on an interval), and how eagerly.

A sensor marked as a nerve ending fires onto the bus uncalled. Right now the schedule is the only one that does. The other domains are named and waiting; nothing drives them yet. Tracked in docs/tasks/firehose-subconscious-subscription.md.