Skip to content

Hive episodes

Steven Enamakel edited this page Sep 1, 2026 · 2 revisions

Hive episodes

A shared desk cannot converge on its own. A message picks one responder off the ladder, that agent replies, and the interaction ends. tinyhivemind-hive is what happens when you want the room to actually decide something.

The shape

step(state, transcript, roster, desks, policy) -> HiveStep

That is the entire interface. It is a pure fold over arguments the caller already holds. There is no trait here for a host to implement, and no storage: EpisodeState is returned, never applied, and the caller commits it after its turn is durably appended.

Every score inside is fixed-point integer, so every payload derives Eq and every fold reproduces exactly.

Outcomes

pub enum HiveStep {
    Speak { turn: Box<HiveTurn> },
    Converged { topic: TopicId, standing: Box<TopicStanding> },
    Deadlocked { topics: Vec<TopicId> },
    Exhausted { spent: u32 },
    Idle,
}

There is deliberately no variant carrying more than one turn. HiveTurn holds one agent_id, one phase, one visibility, one reason it won the floor, and the state to commit afterwards. The one-message-one-turn rule is a type invariant here rather than a convention somebody has to remember.

An episode always terminates, and it always terminates for a reason it can name. Deadlocked and Exhausted are outcomes, not errors: a room that could not decide should say so rather than produce an answer nobody supported.

The four mechanisms

Traces

Agents deposit typed markers in the transcript. Nothing addresses anything. See Trace grammar.

Salience

A weighted sum of an exponentially decaying recency term, a standing importance term, and a caller-supplied relevance term. The shape is a memory-stream retrieval score.

Decay is not optional. Without it the participant who spoke first holds the floor forever, which is the failure mode ant trails avoid only because pheromone evaporates.

Quorum

A topic carries when threshold distinct participants have supported it within the last window sequences. Not when it holds a majority of anything: the count is local, order independent, and idempotent, so a participant catching up late folds to the same standing as one that watched live. Under require_grounded, support citing nothing is ignored entirely and joins neither the supporter set nor the weight.

Cross-inhibition targets the advocate, not the option. An objection naming a message removes that message's author from the supporter set of the topic they were advocating. Subtracting from a score cannot break a tie between two equally supported options. Silencing an advocate can, and that asymmetry is the whole reason the mechanism is shaped this way. It comes from how honeybee swarms settle on a nest site, not from voting theory.

The attention market

Every eligible member computes an urge from the salience field and its own affinity, and floor_holder takes the argmax. A member whose urge does not reach its threshold does not bid at all, which is how Idle happens.

Taking the argmax rather than everyone above threshold is what enforces one message, one turn. The bound is not checked after the fact. There is no way to express two winners.

Two corrections fold into the bid rather than sitting beside it. Dominance share is measured over grounded, surviving contributions rather than raw message count, because raw count is a proxy an agent inflates for free, and equality of turn taking is one of the few robust predictors of a group's collective performance. Repetition scores nothing once a topic has repetition_cap distinct supporters, because the rumour has met enough peers who already know it. Repeated steps are among the most commonly observed multi-agent failures, and that is a protocol bug rather than a model one.

Bids also carry bonuses for a member that was cited or objected to, for a member that has backed neither side of a deadlock, and for the least-heard member when the room is lopsided, plus a penalty for a member over the dominance cap.

Phases

pub enum Phase { Deliberate, Commit }

The transition is one way. Deliberation and commitment are different kinds of turn, and a room that has settled does not reopen because a late trace arrived.

commit_boundary records the sequence standings were folded to when the phase first flipped. A !commit trace only counts toward Converged when its sequence is strictly greater than that boundary, so a trace that happens to share the carried topic and predates the commit turn cannot be misread as evidence that turn recorded a decision.

Visibility, and why there is no fan-out

pub enum Visibility { Blind, Full }

A hive mind is normally built as fan-out: publish a task, wake N agents, gather the replies. This crate does not, and the reasoning is not only about safety.

Sparse communication topologies match or beat fully connected ones in multi-agent debate at much lower cost. Conformity rises with interaction time, so convergence is a warning signal as much as a success signal. Parallel fan-out wins only on genuinely decomposable work, and a room choosing between options is not that.

The one thing fan-out really buys is independence: a first position formed without sight of peers. This crate buys that as Visibility::Blind, a filter on what one turn sees, which costs a projection flag instead of concurrency.

It is worth 24 points of accuracy in the benchmark. Without it, rooms cascade onto whatever was proposed first and land level with a single agent. See Benchmarks and ADR 0002.

What this is not

It is not a claim that group deliberation produces better answers. Almost every positive multi-agent result in the literature is confounded by compute, and self-consistency at a matched token budget is the honest control. This is a protocol for bounded deliberation with an auditable termination reason, and nothing more.

Clone this wiki locally