Issues 060 resolved, 064 opened; 057/058 on this branch too

060: 44 of 70 modules now mesh-buildable (was 8) — the mechanical
majority, proven by direct builds and the bed. The structural
remainders: external-dependency fetch (new issue 064) and route-proxy's
cross-repo build context. 064 records the build environment's isolation
from public npm and Docker Hub.
This commit is contained in:
2026-09-18 02:52:36 +02:00
parent 0d5693cc2c
commit 98e9e62fce
3 changed files with 88 additions and 3 deletions
@@ -1,8 +1,10 @@
--- ---
status: open status: resolved
opened: 2026-09-17 opened: 2026-09-17
located-in: [] located-in:
fixed-by: - mesh-catalog
- mesh-controller
fixed-by: mesh-catalog feat/the-mesh-builds-its-catalogue (965c58f); proven by the built-store-cross-node bed and direct builds
amended-design: amended-design:
--- ---
@@ -0,0 +1,32 @@
# Diagnosis — 2026-09-18
The gap was mechanical for most of the catalogue and structural for a few.
**The mechanical part (fixed).** 44 of 70 modules now carry a `build` section and a Dockerfile
mirroring the eight that already had one: two named bases (build and runtime), the module's own
source compiled against the sdk in the base, and every serve-time entrypoint named in the runtime
image so tools serve, events flow, and a provider's provisioner reconciles in the same process
(the convention hq issue 061 settled — postgres, gitea and lavinmq were retrofitted to it from
running their provisioner as a separate `args` command). Proven end to end: redis, keycloak,
mongodb, mosquitto and openai-consumer build through the mesh's own builder from their own
directory; the built-store-cross-node bed builds and runs the retrofitted lavinmq and postgres.
**The structural part (deferred, each with an owner).**
- Three modules need an artifact the mesh build environment cannot fetch — an npm package
(model-usage: `pg`; anthropic-manager: `tweetnacl`) or a binary from a public image (minio:
`mc`). The build's npm and container runtime reach the mesh's own registry, not the public one;
apt works, npm and image pulls do not. This is its own question — [issue 064](../064-a-mesh-build-cannot-fetch-a-modules-external-dependencies/00-report.md).
- route-proxy's build context is the mesh-controller repository, not its own module directory (it
ships the packaging of a proxy whose canonical source lives with the contract). The build
section names a Dockerfile relative to the module; a cross-repository context is a shape it
cannot yet express. Deferred pending a design decision on cross-repo build inputs.
The remaining modules are exempt rather than unbuilt: the foundation trio (builder,
mesh-controller, distribution — built by the foundation's own path, and distribution cannot build
through the store it provides, ADR 0072/issue 029), and the upstream-image-only modules that run
a stock image and carry no code of their own.
**Located in:** mesh-catalog (the manifests and Dockerfiles), with the convention enforced by
mesh-controller's builder. Resolved for the mechanical majority; the two structural remainders are
tracked as issue 064 and the route-proxy cross-repo deferral.
@@ -0,0 +1,51 @@
---
status: located
opened: 2026-09-18
located-in:
- mesh-catalog
- mesh-controller
fixed-by:
amended-design:
---
# 064 — A mesh build cannot fetch a module's external dependencies
## Symptom
Three modules cannot be built by the mesh's own builder, each because the build needs an artifact
from a public registry the build environment does not reach:
- A module whose runtime installs an npm package its code imports (`npm install` in the
Dockerfile) fails with a 404 — the build's npm is pointed at the mesh's own registry, which does
not carry the public package.
- A module whose runtime copies a binary out of a public image (`COPY --from=vendor/tool:latest`)
fails with `pull access denied` — the build's container runtime reaches the mesh's registry, not
the public one.
apt-based installs in the same Dockerfiles succeed, so the build has ordinary internet: it is npm
and image pulls specifically that are redirected to the mesh's registry. Observed while giving the
catalogue its build sections (hq issue 060): 44 of 70 modules build from their own source with no
external fetch; these three need one and stop.
## Why it matters beyond the instance
The delivery design says a module is built by the mesh from a repository and a path (ADR 0069),
compiled against the sdk and tool runtime the base images already carry. That holds for a module
whose only dependencies are the base's — but a module with a third-party runtime dependency, or a
tool binary from a vendor image, has no sanctioned way to bring it into a mesh build. The
workstation build script got away with it by running on a host with public npm and Docker Hub;
retiring that shortcut (the no-fake principle) exposes that the mesh has no answer.
Left unanswered, "the mesh builds its own catalogue" is true only for modules that happen to have
no external dependency, and which those are is invisible until each is built.
## Open questions
- Should a module's third-party npm dependencies be published to the mesh's own registry as part
of building it (a dependency is an artifact like any other), or should the build environment
proxy the public registry read-only?
- Is a vendor binary (`mc`, and others like it) the same question as an npm dependency, or does it
want a distinct answer — a module declaring an external image as a build input the mesh
pre-fetches and pins, the way it pins its bases?
- Should a manifest that declares a build whose Dockerfile fetches from a public registry be
refused at `module add`, so the gap is caught at registration rather than at build?