Files
hq/02-DECISIONS/0130-the-predecessor-is-ending-and-its-broker-goes-with-it.md
T
jschoubben 784b487bf9 ADR 0131: everything on the mesh speaks to the broker seat, and AMQP is not a provision
Taken during the outage of 2026-09-27, when the protocol leaked into the seat's
contract: to hold mesh-broker a module had to provide amqp, so the module that
will carry the bus could not hold the seat that names the bus, while the module
being retired could. Supersedes 0127. Modules depend on the seat and reach the
bus through the sdk; no manifest provides or requires amqp; the old broker's
module and the two modules that required it leave the catalogue; the AMQP
transport is deleted once every node reports on the new bus.

Design 28 step 5 rewritten under it: the seat handover becomes its own task and
is built first, because the seat the control plane dereferences cannot be empty
in between — that emptiness was the outage. The cost note now carries what was
measured rather than what was assumed.

0128 and 0130 extended 0127; each now rests on 0131 with a dated note and
changes nothing it decided. Every other citation of 0127 names its replacement.
records.py still fails on 0120/0112, which predates this branch.
2026-09-27 23:03:05 +02:00

72 lines
4.2 KiB
Markdown

---
topic: the mesh
status: accepted
date: 2026-09-27
deciders: jochen
reconstructed: false
extends: 02-DECISIONS/0131-everything-on-the-mesh-speaks-to-the-broker-seat.md
---
# 130. The predecessor is ending, and its broker goes with it
> **Pointer repointed, 2026-09-27.** This record was written extending
> [ADR 0127](0127-amqp-is-a-provision-not-the-bus.md) (superseded by [ADR 0131](0131-everything-on-the-mesh-speaks-to-the-broker-seat.md)), which
> [ADR 0131](0131-everything-on-the-mesh-speaks-to-the-broker-seat.md) has since superseded — AMQP is
> not a provision at all. Nothing decided here changes; the frontmatter now rests on the live record,
> and the citations below are read with that in mind.
## Context
[ADR 0127](0127-amqp-is-a-provision-not-the-bus.md) (superseded by [ADR 0131](0131-everything-on-the-mesh-speaks-to-the-broker-seat.md)) settled that the old broker is an ordinary
provider of the `amqp` provision rather than a compatibility module with an end date. It rejected
giving it a retirement condition, and said why: *"its clients are not only the predecessor's, so the
retirement condition describes a day that will not come."*
**The operator has said that day is coming.** The predecessor is deprecated. Some of it is still
running, and it is not being migrated — it is being left to stop. Its broker may be shut down.
That is a fact about this installation, not a change of mind about what a broker is. It is recorded
because three documents reason from the premise it overturns:
[design 25](../03-DESIGN/01-to-be/25-the-bus-on-nats.md) §5 and §9, and
[design 28](../03-DESIGN/01-to-be/28-building-the-bus.md)'s closing note that the predecessor's world
"does not need to move: its broker is the compatibility module until its last client is gone."
## Decision
**The predecessor's broker retires when nothing requires `amqp`, by being unassigned like any other
provider.** No retirement condition, no end-date machinery, no special case — which is ADR 0127 being
paid off rather than revised. Because that record made the broker an ordinary provider, ending it
needs nothing that does not already exist: a provision with no consumers has its provider unassigned,
and the module system has done that since it existed.
**So step 5.3 has an ending.** "The mesh's own accounts removed from the deprecated broker" was
written as the last thing that could be said, because the broker itself was going to outlive the
question. It now finishes: once the mesh's own traffic has moved and the predecessor's remnants have
stopped, the module is unassigned and the port is free.
**And the transitional doubling has a date.** The build outcome is announced under both the module's
name and the role's on the old bus, so that a catalogue deployed before the rename and one deployed
after both hear it. That exists only while the old bus does, and goes with it.
## Consequences
**The remote access path goes with it, and that is the one practical consequence worth planning
around.** The predecessor's own mesh communicates over that broker — so shutting it down ends the
tooling that reaches this installation's machines remotely. Work on the node after that point is done
from the node. **This matters most for the rollout**, which is the step that would otherwise be driven
from a workstation: it has to be driven locally, or driven before the broker stops.
**What is still running on it stops when it stops.** Some of the predecessor's services are live and
are not being moved. That is the operator's decision and it is recorded here so that nobody later reads
a broker with clients as an accident.
**Nothing in a served request's path is affected.** Modules serve from their own containers; the mesh's
bus carries the mesh's own traffic — declarations, reports, events, tool calls. This was checked rather
than assumed when the question came up, and it is why the operator's position (*"as long as my services
keep running"*) is a bounded risk rather than a gamble.
**One reason to keep the broker survives**: `amqp` remains a provision a module may require, and a
module that genuinely needs an AMQP broker can be given one. What retires is *this* broker's role as
the predecessor's, not the mesh's ability to provide the thing.