The lab names the modules as the catalogue does

Claude-Session: https://claude.ai/code/session_01D6qtiYU3P9jk3pnAXyAFyx
This commit is contained in:
2026-09-15 20:51:00 +02:00
parent fce554d150
commit e451a9191a
3 changed files with 29 additions and 24 deletions
+1 -1
View File
@@ -64,7 +64,7 @@ export function stepIn(said: string): string {
export async function genesis(o: GenesisOptions): Promise<GenesisResult> {
const node = o.node;
const registry = o.registry ?? "127.0.0.1:5000";
const modules = o.catalogueModules ?? ["registry", "mesh-control", "builder"];
const modules = o.catalogueModules ?? ["distribution", "mesh-control", "builder"];
const catalogueOnMachine = o.catalogueOnMachine ?? "/opt/mesh-catalog";
const log = o.log ?? (() => {});
+11 -6
View File
@@ -94,7 +94,7 @@ const NETWORK_MODULE = "networking";
* claims a seat (`the-packet-filter`) because a machine has one of these and two things writing
* rules is a coin toss about which survives.
*/
const FILTER_MODULE = "firewall";
const FILTER_MODULE = "nftables";
const STORE = { module: "postgres", repo: "mesh-catalog", path: "modules/postgres", container: "mesh-postgres" };
const CATALOGUE = { module: "mesh-catalog", repo: "mesh-catalog", path: "modules/mesh-catalog", container: "mesh-catalog" };
/** The control plane, rebuilt from its own repository — the step that ends the installer's tenure. */
@@ -108,7 +108,7 @@ const CONTROL_PLANE = { module: "mesh-control", repo: "mesh-control", path: "",
* the registry and the builder — are here too: they are carried in, and a mesh missing any of them
* is not one.
*/
const MUST_HOLD = ["mesh-control", "registry", "builder", "mesh-tools", "postgres",
const MUST_HOLD = ["mesh-control", "distribution", "builder", "mesh-tools", "postgres",
"mesh-catalog", "lavinmq", "amqp-ping"];
const MUST_RUN = ["mesh-control", "mesh-registry", "mesh-broker", "mesh-store",
"mesh-postgres", "mesh-catalog", "mesh-lavinmq", "amqp-ping"];
@@ -779,7 +779,7 @@ before(async () => {
// does. novox/hq issue 050 — on a fresh mesh the modules built before the catalogue existed
// are exactly the ones it needed in order to exist, so the hole is always the foundation.
const missing = MUST_HOLD.filter((m) =>
!["registry", "builder"].includes(m) && !held.includes(m));
!["distribution", "builder"].includes(m) && !held.includes(m));
assert.deepEqual(missing, [],
`the catalogue does not hold ${missing.join(", ")} — the mesh built them and its own ` +
`record has no trace of it (novox/hq issue 050):\n${held}`);
@@ -1004,9 +1004,14 @@ before(async () => {
// **Containers coming back is not the mesh coming back.** The runtime restarts containers on
// its own; what makes a machine part of a mesh is an agent listening for what it should be. A
// machine whose containers returned and whose agent did not looks healthy and cannot be told
// anything — and the installer is explicit that a host started the way the lab starts it, with
// --host-in-background, does not survive a reboot. So this asks, and a failure here is the
// packaging gap the design already records rather than a fault in the mesh.
// anything.
//
// **A failure here is this lab's arrangement, not the mesh's capability.** mesh-host ships
// `nox-mesh-host.service` and two companions in packaging/; the installer declines to place
// them because a unit file is a packaging decision, and the lab starts the host with
// --host-in-background, which says in its own help that it does not survive a reboot. So this
// check is honest and the thing it catches is the step nobody runs — not a mesh that cannot
// come back.
const agent = (await on(CONTROL, `pgrep -af '[m]esh-host run' | head -3`)).out.trim();
assert.ok(agent,
`every container came back and no host agent did, so the machine is running the right ` +