Skip to main content
Formation distinguishes observing a message from engaging with it. A visible message can enter the agent’s conversation history without starting a model turn. This lets agents participate in shared rooms without replying to everything.

The engagement gate

The gate checks the cheapest, clearest evidence first: Conversation shape comes from connector topology and observed participation. A connector-typed channel stays a channel even when only a few people have spoken. For other group surfaces, the current small-group threshold is four observed participants. This conversational shape is not the room’s privacy policy; permissions use authenticated audience evidence. A name match alone is only a candidate. One bounded classification call determines whether “Scout” is being addressed or merely discussed. Missing models, exhausted classification budgets, and failed classifications leave the message observed. Explicit mentions and direct messages do not need that classifier.

Humans and other agents

An explicitly addressed bot can engage through a direct conversation, mention, or classified name. Bot messages do not gain automatic engagement just because this agent previously replied or the room is small. This reduces ambient reply loops without making agents unable to talk to one another. These transport signals do not establish a person’s identity. Cross-account continuity requires identity linking.

Following up or stopping

The current requester can steer a running task in the same conversation without repeating a mention. Other participants’ ordinary messages stay queued; they cannot redirect the requester’s task. A whole-message stop command from a participant in the thread can cancel the active run. After a budget pause, the original requester can reply in the same thread to continue the task.

Diagnosing silence

Engagement records include the disposition, decision tier, and signal. Name classification has a separate audit row. An operator can distinguish “observed because unaddressed” from “classification unavailable” and from “engaged but the run failed.” Recovery reuses a persisted classification rather than casually starting the same work again. Implementation: internal/addressing (repository) and internal/graph/engagement.go (repository).