Glossary, the mesh-controller/foundation vocabulary, ADR 0076, Phase 3 closed #43
@@ -0,0 +1,66 @@
|
||||
---
|
||||
status: open
|
||||
opened: 2026-09-14
|
||||
located-in: []
|
||||
fixed-by:
|
||||
amended-design:
|
||||
---
|
||||
|
||||
# 050 — The catalogue knows nothing that was built before it
|
||||
|
||||
## Symptom
|
||||
|
||||
A mesh raised from bare metal built six modules in order: the shared base, a store, the catalogue,
|
||||
the control plane, a module, and a broker. Asked afterwards what it holds, the catalogue answered
|
||||
with three — exactly the three built *after* it started running:
|
||||
|
||||
```
|
||||
amqp-ping built from <the catalogue repository>
|
||||
lavinmq built from <the catalogue repository>
|
||||
mesh-control built from <the control plane repository>
|
||||
```
|
||||
|
||||
Missing: the shared base, the store, and the catalogue itself.
|
||||
|
||||
The catalogue learns what exists by consuming the builder's announcement over the broker. Anything
|
||||
built before it was running was announced to nobody, and nothing goes back for it.
|
||||
|
||||
## Why this matters
|
||||
|
||||
**The modules it cannot see are the ones a mesh is made of.** On a fresh mesh the things built
|
||||
before the catalogue are, necessarily, the things the catalogue needed in order to exist: the base
|
||||
it was compiled against and the store it keeps its records in. So the hole is not random — it is
|
||||
always the foundation, on every mesh, at exactly the moment the graph is first populated.
|
||||
|
||||
**It breaks the question the catalogue exists to answer.** Build edges are derived facts between
|
||||
versions, and the base is the node nearly every other module hangs off. A catalogue with no record
|
||||
of the base cannot know that moving it makes everything standing on it stale, so `catalog_stale`
|
||||
answers confidently and wrongly — the worst shape for a question about what to rebuild.
|
||||
|
||||
**Nothing reports the gap.** The catalogue does not know what it was not told, so it does not say
|
||||
"three of six" — it says three, and a reader with no independent count believes it. This was found
|
||||
by asking it a question and comparing the answer against what the mesh had just been watched doing.
|
||||
|
||||
**The record is not lost, only the catalogue's copy.** The control plane holds every build it
|
||||
ordered, with commit, repository, path and resolved artifacts. So this is a gap between two stores
|
||||
that should agree, rather than information nobody has.
|
||||
|
||||
## Open questions
|
||||
|
||||
- **Should the catalogue backfill on start** — ask the control plane for the builds it already
|
||||
recorded and take them in? That fixes the fresh-mesh case and every case where the catalogue was
|
||||
down while something was built, which is the same fault with a different cause.
|
||||
- **Or should announcements be durable**, so a build announced while nothing was listening is
|
||||
delivered when something is? That treats the catalogue as one consumer among several, which it
|
||||
already is.
|
||||
- **Or should the control plane be the record and the catalogue a projection of it?** Two stores
|
||||
that must agree, kept in step by events, is the arrangement that produced this.
|
||||
- **How would anyone notice next time?** The catalogue cannot compare itself to a source of truth
|
||||
it does not have. Whatever is chosen, something has to be able to say "these disagree".
|
||||
|
||||
## How this would be checked
|
||||
|
||||
| Rule | Checked by |
|
||||
|---|---|
|
||||
| The catalogue holds every module the mesh built | A mesh is raised from bare metal and the catalogue is asked; its list is compared against the control plane's build records, and a module in one and not the other is a failure. |
|
||||
| A change to the base makes what stands on it stale | The base is rebuilt on a fresh mesh and the catalogue names the modules that must follow — which requires it to know the base exists. |
|
||||
Reference in New Issue
Block a user