Event Notification Is Atomic With State Change, Not Polled or Queued

The eOS runtime platform fires event notifications synchronously inside the atomic operation that caused the state change. Registered listeners observe the same atomic envelope as the change itself; the event and the post-event state are inseparable atomic outcomes. Agents react to state without polling, and without race conditions, because the runtime guarantees there is no observable moment in which the state has changed but the event has not fired, or in which the event has fired but the state has not changed.

Why It Is Held

Event-notification patterns built outside the runtime fragment. Each team picks a polling interval, a queue technology, a delivery-semantic (at-least-once, at-most-once, exactly-once) and reasons through edge cases (what happens when the listener is mid-process when the queue redelivers). Each implementation has bugs the team rebuilds when discovered, and each requires reasoning about race conditions that the runtime primitive removes by construction. Treating event notification as atomic with state change collapses the entire reasoning surface: there are no edge cases because there is no time gap between state change and event observation -- both are committed in the same atomic envelope or both roll back together.

The "asynchronous" framing names the agent-side experience, not the runtime-side mechanism. From the agent's perspective, the agent did not have to poll, did not have to write queue-consumer code, did not have to manage a separate dispatch loop -- it registered a listener, and the listener fired when state changed. From the runtime's perspective, the listener fired synchronously inside the atomic operation that caused the change. The asymmetry is what makes the primitive load-bearing: agents get the cleanliness of asynchronous reaction without the race-condition surface that cross-operation asynchrony usually produces.

The platform-as-event-coordinator stance composes tightly with the atomic primitive ([[Agent Operations Commit Wholly or Roll Back Wholly]]). Event firing is part of the atomic envelope: if the operation rolls back, the event "did not fire" in the same sense that the state change "did not occur" -- both are absent from the post-rollback state, both are absent from any listener's observation, and the runtime carries the bookkeeping that makes this guarantee invisible to agent code. Without atomicity, event notification would have to coordinate with rollback explicitly (was the event delivered? does the listener need a compensating event?), recreating the per-team reasoning surface the primitive removes.

The platform-as-event-coordinator stance also composes with coherent multi-agent semantics ([[Multiple Agents See Coherent State Without User-Land Coordination]]). Events are how agents react to other agents' state changes; in a coherent-state runtime, an agent registering a listener sees the same atomic events that every other agent sees, in the same order, without any of them having to coordinate on a shared event log. The primitives reinforce each other at the multi-agent boundary: coherent state needs an in-runtime event mechanism; events need coherent state to make listener registrations meaningful across agents.

The eOS-kernellib foundation provides asynchronous building blocks at the runtime layer: delayed callbacks, async I/O for external triggers, and datagram and connection-oriented ports for cross-process events. The kernel layer's connection daemon mediates connection-event creation. What the foundation does not yet coordinate as a single event-dispatch loop is the agent-facing surface -- an event-dispatch wrapper (queue, coroutines, or continuations) is needed to expose the platform's primitive cleanly to agent code.

The Conviction is held because the no-race-condition agent-coding experience is what platform adoption purchases for the multi-agent reactive scenario. When listener-fires-with-state-change is the runtime's promise, agent code reasons locally about state transitions rather than globally about event ordering. Trading the primitive for an external event broker (Kafka, RabbitMQ, application-layer queue) would reintroduce exactly the cross-system delivery semantics and race-condition reasoning the primitive removes, while losing atomic-rollback coordination across the system boundary.

What It Asks

Honoring this Conviction asks the project to keep event notification inside the atomic envelope, not to delegate it to external brokers or to polling.

Drift Recognition

The Conviction has weakened when the project's outputs treat event notification as a cross-operation pattern requiring user-code coordination, rather than as an atomic-envelope guarantee.

Relations