Files
hq/03-DESIGN
jschoubben 7b4916e9ec Modules declare their own seats; the mesh reserves mesh-*
The architecture 0117 opened needs a module to offer a service as a role on
the bus — one holder, addressed by what it does. A closed table in the
controller cannot express that: a capability a module contributes would
require changing the mesh itself.

But 0110 closed the set for a good reason — nothing could say what seats a
mesh had, and the hand count came out at eleven of thirteen. That argues for
enumerable, not hardcoded, and 0110 weighed free-form against a fixed table
without considering a third option: closed at any moment and derived from
the catalogue. A derived list cannot drift, which is how the count broke.

So: the mesh's seats stay the mesh's, reserved by the mesh- prefix so the
prefix is the rule and there is no list to maintain; ten seats are renamed
to restore 0079's convention; everything 0110 decided about what a seat IS
survives untouched.

Design 29 carries the declaration model: three namespaces, subjects derived
from local names so a manifest survives the wire changing, queues never
declared, five relationships (the job and state shapes 0041 had no room
for), and the build-publish-deploy lifecycle with hard, soft and build-time
dependencies distinguished.

0041 gets a progressive insight: "no per-consumer setup, only a
subscription" was a fact about a topic exchange, and a JetStream durable
consumer is a real object someone creates.

WBS 1.3/1.4 were wrong and say so: streams come at registration and
consumers at assignment, so only the foundation set belongs at genesis.
2026-09-26 20:34:32 +02:00
..

03-DESIGN

The authoritative specification. Implementation is built against what is written here.

Two layers

Folder What it is
00-as-is/ The mesh that exists today. Shipped behaviour, described as it is — including behaviour nobody would choose again.
01-to-be/ The mesh being built toward. Every statement traceable to a record in 02-DECISIONS/.

They are never mixed. A statement about the future does not belong in an as-is document, and an as-is document is never edited to describe an intention.

When a to-be design ships, it does not move. Its as-is counterpart is written or updated, the to-be document's status becomes implemented, and both stand — one describing what runs, the other recording what was intended. Deleting the intention loses the reasoning, which is the expensive half.

Frontmatter

Every design document (not the READMEs) carries:

---
layer: as-is | to-be
status: designed | in-progress | implemented | abandoned
code: []                 # owning code repo(s), from 00-META/repos.md
updated: YYYY-MM-DD      # date of the last status change, not of text edits
decisions: []            # 02-DECISIONS/ records this document rests on
---

For an as-is document, status: implemented is the normal state — it describes something that runs — and code: names where that implementation lives.

Status changes when implementation state changes, never because design text was edited. An implemented claim must be defensible from the owning repository's main branch, not from intent. If it cannot be checked, it is in-progress.

Cross-cutting views are generated from this frontmatter by the hq-status skill and never written to disk.

What belongs here

Functional analysis, architectural description, and specification — prose and diagrams only, no code. A manifest field may be named; a manifest may not be pasted. A document enters the to-be layer only after the decision behind it is recorded in 02-DECISIONS/ and the research that produced it is closed.

Subfolders are encouraged where a layer grows enough to need them.