An agent’s position
An agent’s position is the time-decayed, salience-weighted centroid of its recent work. As the agent stores and receives knowledge, the centre of that recent activity shifts, and the agent’s node drifts through the mesh to follow it (the HyphaeDB whitepaper, Equation 2). An agent that has been working on storage internals sits near storage topics; if it pivots to networking, its position gradually migrates toward networking. Drift is gradual and lazy on purpose. Each recent cell contributes to the centroid with a weight that combines its salience and an exponential time decay, so newer, more important work pulls the position harder than old, minor work. The position is only re-embedded — an actual write into the mesh — when the drift distance from the current position crossesdrift_threshold. Below that threshold, nothing is rewritten, which keeps the agent from thrashing the graph on every small update.
Beacons: a listening post at a topic
Position follows your recent work, which means an agent receives what it happens to be near right now. But often you need the opposite: to reliably receive everything about a topic, indefinitely, even when your day-to-day work has moved somewhere else entirely. That is what a beacon is for. The mental model that keeps you out of trouble: a beacon is a listening post you plant at a topic. You callplace_beacon(interest); the server embeds the interest text and inserts a beacon node into the mesh at that topic’s position — not at your agent’s position. The beacon then sits in the topic’s neighbourhood and catches knowledge that propagates near it, and each delivery is streamed to you, the owner, wherever your own agent node happens to be.
Two properties make the listening post reliable:
activation_threshold = 0.7— the beacon only surfaces a diff whose relevance clears this bar (more on this below). It is a stricter gate than ordinary forwarding.- It never drifts and is never evicted. A beacon’s position is fixed for its life — it is excluded from the position update that makes agents drift — and the eviction primitive never removes it. What you place stays exactly where you put it for as long as it exists.
You and your beacon sit in different places
This is the part that is easy to get wrong, and the reason a beacon is more than “a subscription.” Your agent node has a position (its recent-work centroid). Your beacon has a different position — the embedding of the interest you named. These are decoupled. Your agent can be working deep in frontend code while your beacon stands over in auth-configuration space. When a diff about auth-config propagates and reaches the beacon, the delivery is streamed to you — even though your agent node is nowhere near auth-config, and you never issued a query or moved there.This owner⇎position decoupling is how a topic reaches an agent that isn’t positioned near it. It is not the forwarding score doing something clever — it is the beacon being planted at the topic and forwarding to its owner. A beacon is a fixed address for a topic; you are the moving reader it reports to.
What has to be true for a beacon to catch a diff
A beacon is a receiver, not a magnet. Two independent things have to hold for a stored memory to land in your inbox through a beacon:- The diff has to physically reach the beacon’s neighbourhood. Propagation still walks the HNSW mesh hop by hop under an energy budget. If the diff runs out of energy first, or the topic region is disconnected from where the diff originated, it never arrives — no beacon can pull it across the graph. A beacon is planted at the topic so that topic-knowledge reaches it by ordinary reach; it does not teleport diffs to you.
- The diff has to be relevant enough to activate the beacon. Reaching the neighbourhood is necessary but not sufficient: the beacon only fires when relevance is
>= activation_threshold(default0.7) — a higher bar than thesigma_min(default0.3) an ordinary forward needs. A weakly-related diff can pass through the region without ever activating your beacon.
declared_interest term in the σ score), so a beacon accepts diffs at the ragged semantic edge of the topic that an ordinary cell at the same spot would drop. That widening is real and load-bearing — but it is widening at the topic’s boundary, not routing across the graph.
Position versus beacon — and why a beacon is now the only way to declare interest
An agent has two ways to end up receiving a diff, and they are cleanly separated:
The last two rows are the important part. The forwarding score has a
declared_interest term, and a beacon is the only thing that contributes to it — a bare agent’s position no longer does. Concretely, a plain agent is reached on semantic proximity and salience alone; to declare a standing interest (“route this topic to me, wherever I am”), you must place a beacon. If you were relying on an agent’s position to attract a topic it doesn’t actively work in, that no longer happens — place a beacon.
A worked example
Your agent spends the day writing frontend code, so its position drifts into UI-component space. But there is one backend fact you care about whenever it changes: how long production auth tokens live.activation_threshold, and the delivery streams to your inbox — even though your agent node is sitting in frontend space and you never queried:
Gotchas
- A beacon hears what reaches it — nothing more. It catches topic-knowledge by ordinary energy-bounded reach. A low-salience diff that stops early, or a topic in a disconnected part of the graph, won’t arrive. Salience still governs reach; a beacon makes you a good destination, not an unmissable one.
activation_threshold(0.7) is a real filter. It is stricter than thesigma_min(0.3) forwarding gate, so a beacon deliberately ignores diffs that are merely adjacent to its topic. That keeps the inbox focused, but it means a borderline-relevant memory may not activate a beacon even when it passes nearby.- A beacon persists once placed — there is no client call to remove it today. The only beacon operations exposed to clients are
place_beaconandlist_beacons; a beacon does not drift, is not evicted, and cannot be deactivated or deleted through the client API. Place beacons deliberately, and prefer one durable beacon per standing interest. - No dedup across beacons. Placing two overlapping beacons creates two separate listening posts, each with its own deliveries — overlapping interests mean duplicate inbox traffic. Keep one beacon per genuinely distinct interest. (There is no server-side uniqueness check; each
place_beaconis a new node.)
How this connects to the rest of the system
A beacon shapes thedeclared_interest term that gossip propagation uses when scoring whether to forward a diff to a node. A well-placed beacon widens its own delivery catchment at its planted position — and because it forwards to its owner, it is how a topic reaches an agent that is not itself positioned near that topic.
To create a beacon in practice, see the place-beacon MCP tool and the route-with-beacons recipe.
Source
This page is a teaching restatement of the HyphaeDB specifications and whitepaper. It does not define new behaviour.- mesh-layer spec §6.1–6.2 — agent positioning, drift, beacon placement,
activation_threshold, and the no-drift / eviction-exempt invariants. - interest-routing-calibration spec §7.4 — why a beacon declares interest by placement (Mechanism A) and the σ interest term only widens the boundary (Mechanism B).
- The HyphaeDB whitepaper, Equation 2 — the agent position / drift formulation.