From aabaaf2bb4af48fbc2373ab60bc8fcb193eb622f Mon Sep 17 00:00:00 2001 From: jochen Date: Sun, 13 Sep 2026 03:22:05 +0200 Subject: [PATCH] Rewrite 0073: the registry does not move, and the argument fails MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Written an hour ago claiming a produced image must be published before anything can fetch it, so the registry had to precede the control plane. The premise is false: the machine that builds the image is the machine that runs it, and the temporary control plane names a built image exactly as it names a carried one — by the digest of its own configuration, which requires nothing to have served it. Building changes where the bytes came from, not where they are. Rewritten rather than superseded because nothing has been built on it and nobody has read it: a record that contradicts itself is a draft, not a decision. The argument is kept, because it was asked for and a negative answer is the result. --- .../0073-the-installer-carries-a-builder.md | 44 ++++++++++--------- 02-DECISIONS/README.md | 2 +- 2 files changed, 24 insertions(+), 22 deletions(-) diff --git a/02-DECISIONS/0073-the-installer-carries-a-builder.md b/02-DECISIONS/0073-the-installer-carries-a-builder.md index c61b369..47fbc8a 100644 --- a/02-DECISIONS/0073-the-installer-carries-a-builder.md +++ b/02-DECISIONS/0073-the-installer-carries-a-builder.md @@ -7,7 +7,7 @@ reconstructed: false extends: 0070-the-catalogue-owns-the-module-graph.md --- -# 73. The installer carries a builder, and the registry precedes the control plane +# 73. The installer carries a builder, and the registry stays where it is ## Context @@ -17,11 +17,8 @@ questions were left open, and the design record names them as the one gap that s from being able to produce anything at all: **how the builder arrives**, and **what it publishes into**. -They cannot be answered apart. A builder that arrives with nowhere to publish has produced a file -on a disk, and a place to publish with nothing to produce is an empty shelf. - Today the installer carries the control plane's image inside itself. That works, and it is why -genesis needs no registry: nothing is ever pulled, because the one image that matters is already +genesis needs no registry: nothing is ever fetched, because the one image that matters is already present. The cost is that the mesh which results holds an artifact it did not make, cannot rebuild, and knows nothing about — no version, no source, no edges. That is the same shape as the fault [issue 044](../04-ISSUES/044-the-runtime-every-module-builds-on-cannot-be-built-by-the-mesh/00-report.md) @@ -36,31 +33,36 @@ and produces the control plane from the same repository and path that any later use. What raises the mesh is therefore the same thing that will maintain it, and there is no second mechanism kept in step with the first. -**The registry joins the substrate, and precedes the control plane.** Not because it became more -fundamental, but because the answer to a stated question changed: +**The registry does not move, and the argument for moving it does not survive being made.** + +It was put this way: a produced image has to be put somewhere before anything can fetch it, so the +registry must now precede the control plane, and +[ADR 0033](0033-the-substrate-is-a-store-and-a-broker.md)'s answer to that question has to flip. + +It does not, because the premise is false. **The thing that builds the image and the machine that +runs it are the same machine.** A built image is already in that machine's container runtime, and +the temporary control plane names it exactly as it names a carried one — by the digest of its own +configuration, a local identity that requires nothing to have served it. Building changes where the +bytes came from. It does not change where they are. | | is it substrate? | must it precede the control plane? | |---|---|---| | the store | yes | yes — there is nowhere else to put the control plane's state | | the broker | yes | yes — the control plane reaches a machine only over it | -| the image registry | yes — it cannot grant itself a repository | **yes, now** — the control plane's image is produced here, and a produced image has to be put somewhere before anything can fetch it | +| the image registry | yes — it cannot grant itself a repository | **still no** — the first machine neither fetches the control plane nor needs to, whether the image was carried in or made here | -[ADR 0033](0033-the-substrate-is-a-store-and-a-broker.md) answered that last cell *no*, and was -right at the time, for the reason it gave: the first machine fetched the control plane from -upstream, so nothing needed a registry until there was already a control plane to install one. That -premise is what this decision removes. The registry's role never changed; what changed is whether -anything needs it before the control plane exists. - -**The substrate bundle therefore carries three services and no control plane**, where it carried -two services and a control plane. It does not grow: an image comes out as one goes in. +So the registry stays where [ADR 0033](0033-the-substrate-is-a-store-and-a-broker.md) put it: +substrate by role, ordinary by delivery, installed by the temporary control plane as its first act. +The bundle carries two services and a control plane, as it did. **What publishes into the registry +is unchanged too** — the existing step that pushes the control plane's image into it, which is the +moment that image first receives a digest assigned by something other than itself. It now pushes +something this mesh built rather than something it was handed. ## Consequences -**Genesis gains a step and loses one.** The registry is raised with the substrate rather than -installed as the first act of a temporary control plane, and a build step appears before the -control plane is raised at all. The pivot described in -[ADR 0067](0067-genesis-is-a-pivot.md) survives unchanged in shape — a temporary control plane is -still what installs the permanent one — but what it installs is now something this mesh built. +**Genesis gains one step and changes no others.** A build happens before the image is loaded. The +pivot described in [ADR 0067](0067-genesis-is-a-pivot.md) survives exactly as written, because the +step it pivots on never cared where the image came from. **A fresh mesh can produce from the moment it exists.** The builder is present before the control plane is, so the core modules, the catalogue and the builder's own module can be built in the diff --git a/02-DECISIONS/README.md b/02-DECISIONS/README.md index b9b864a..31bc462 100644 --- a/02-DECISIONS/README.md +++ b/02-DECISIONS/README.md @@ -105,7 +105,7 @@ python3 00-META/checks/index.py fail if stale - **0070** — [The catalogue owns the module graph, and genesis builds rather than carries](0070-the-catalogue-owns-the-module-graph.md) - **0071** — [Genesis clones from a mesh, and checks what it got](0071-where-genesis-gets-its-source.md) - **0072** — [Two graphs, and a build chain that orders itself](0072-two-graphs-and-the-build-chain.md) -- **0073** — [The installer carries a builder, and the registry precedes the control plane](0073-the-installer-carries-a-builder.md) +- **0073** — [The installer carries a builder, and the registry stays where it is](0073-the-installer-carries-a-builder.md) ### What runs on them, and how it gets there