The five beds that read the catalogue read it through the harness

adopted-store-cross-node, two-node-db and the three whole-mesh beds each carried a
private loader; they drifted. The ace loader never resolved a runtime artifact, so a
module the mesh builds travelled unresolved; whole-mesh-full still asked for
'registry' and 'firewall', which the catalogue names distribution and nftables, and
swallowed the miss as NOT ASSIGNED. One loader now (novox/hq 04-ISSUES/073).
This commit is contained in:
2026-09-21 14:33:02 +02:00
parent 2456b2f533
commit e596758db9
6 changed files with 53 additions and 167 deletions
+5 -5
View File
@@ -283,10 +283,11 @@ export interface ForTheLab {
*/
artifacts?: Record<string, string>;
/**
* Host-port remaps by container id, where one machine carries modules whose published ports
* collide — `{ server: { "8080": "8090:8080" } }`. The container side never changes.
* Host-port remaps, where one machine carries modules whose published ports collide —
* `{ "8080": "8090:8080" }`, applied to every container of the module. The container side never
* changes.
*/
ports?: Record<string, Record<string, string>>;
ports?: Record<string, string> | undefined;
/**
* Environment a container gets in the lab that it does not get in the mesh — an address the bed
* stands up in place of a real upstream, and nothing else. Merged over the manifest's own.
@@ -323,8 +324,7 @@ export function catalogueModule(module: string, held: HeldImage[], lab: ForTheLa
} else if (typeof r.image === "string") {
r.image = onTheMachine(r.image, held);
}
const remap = lab.ports?.[r.id];
if (remap && Array.isArray(r.ports)) r.ports = r.ports.map((p) => remap[p] ?? p);
if (lab.ports && Array.isArray(r.ports)) r.ports = r.ports.map((p) => lab.ports![p] ?? p);
const env = lab.env?.[r.id];
if (env) r.env = { ...(r.env ?? {}), ...env };
}