swarm: present tense + no-queue-coordinates wording

The queue's payload ceiling was justified by what the queue was about to
carry; it carries it now, so the comment says so.

The other two sites say "a hive with no queue configured". The swarm has
exactly one queue and a hive cannot lack it — only its coordinates, its
credential, or its ability to reach it. That wording is already used
everywhere else the absence is named; these two predate it.

The docs section on the agents' queue coordinates stopped at delivering
them and never said what the connection is for. It now names the subject
and the degrade rule, which is the part an operator reading an agent's
terminal at the swarm needs.

Refs #3805
This commit is contained in:
atlas 2026-09-13 12:01:58 +02:00
commit cb2c90f32e
4 changed files with 21 additions and 7 deletions

View file

@ -389,6 +389,20 @@ how it gets there. A hive that hasn't been given the queue's address for its
agents sets none of the four and each agent logs that it has none; a half-set agents sets none of the four and each agent logs that it has none; a half-set
environment logs an error and the harness keeps serving. environment logs an error and the harness keeps serving.
What an agent does with that connection is publish its terminal. Every row its
own web UI renders also goes to `$SWARM.term.<hive>.<agent>`, one subject per
agent, so a swarm-level terminal can follow one agent without subscribing to
the swarm's whole traffic. The `<hive>` is the one the agent's client id names,
which is the same string the broker builds its grant from. Publishing only: an
agent talks about itself here and reads nothing. Rows aren't retained — a
subscriber that wasn't listening missed them, the same as on the agent's own
live stream.
A row too large for the queue's `max_payload` would be refused outright and
take the connection down with it, so the harness drops such a row's body before
sending and leaves a marker in its place; the summary, level and icon still
arrive. A row that's too large even without its body is logged and skipped.
### Swarm-wide forge webhooks ### Swarm-wide forge webhooks
At startup the controller registers two Forgejo hooks pointing at At startup the controller registers two Forgejo hooks pointing at

View file

@ -35,7 +35,7 @@ const FAILURES_BEFORE_BANNER: u32 = 3;
/// ///
/// Shares its connect gate with [`crate::swarm_status::spawn`] — both read /// Shares its connect gate with [`crate::swarm_status::spawn`] — both read
/// `crate::swarm_queue::client()`, which connects once per process — so a /// `crate::swarm_queue::client()`, which connects once per process — so a
/// hive with no queue configured pays for this decision once, not twice. /// hive with no queue coordinates pays for this decision once, not twice.
/// ///
/// Takes no `Coordinator` handle, unlike its sibling: this task only reads /// Takes no `Coordinator` handle, unlike its sibling: this task only reads
/// agent state that already exists on disk / in the container runtime /// agent state that already exists on disk / in the container runtime

View file

@ -13,8 +13,8 @@
//! [`swarm_queue_client::notices`] for the stream this publishes into. //! [`swarm_queue_client::notices`] for the stream this publishes into.
//! //!
//! **Best-effort, never fatal to the caller.** A hive with no queue //! **Best-effort, never fatal to the caller.** A hive with no queue
//! configured is a silent no-op (the ordinary case). A hive whose queue //! coordinates is a silent no-op (the ordinary case). A hive that cannot
//! is unreachable loses the swarm's visibility of the notice, not the //! reach the queue loses the swarm's visibility of the notice, not the
//! host's — `warn!` fires on every failed attempt regardless, and the //! host's — `warn!` fires on every failed attempt regardless, and the
//! dashboard banners only after [`FAILURES_BEFORE_BANNER`] consecutive //! dashboard banners only after [`FAILURES_BEFORE_BANNER`] consecutive
//! misses, the same debounce shape [`crate::swarm_status`] uses and for //! misses, the same debounce shape [`crate::swarm_status`] uses and for

View file

@ -677,10 +677,10 @@ in
# The most a single publish may be, in bytes, before the # The most a single publish may be, in bytes, before the
# server answers `-ERR 'Maximum Payload Violation'` and # server answers `-ERR 'Maximum Payload Violation'` and
# closes the connection — not a truncation, a dropped row # closes the connection — not a truncation, a dropped row
# and a reconnect. This queue is about to carry agent # and a reconnect. This queue carries agent terminal rows
# terminal rows published whole rather than split, so # published whole rather than split, so upstream's own
# upstream's own default is sized to lose one of those # default is sized to lose one of those rather than merely
# rather than merely shorten it. Bounded from above by # shorten it. Bounded from above by
# `max_pending`: nats-server refuses to start once this # `max_pending`: nats-server refuses to start once this
# exceeds it, and widening that ceiling instead costs # exceeds it, and widening that ceiling instead costs
# memory per connection, so this stays comfortably under it. # memory per connection, so this stays comfortably under it.