Have design 51 reserve a module's version at its build's start, as design 47's milestone G does

Design 51 still numbered a package at its publication and said `version.numbered`, which the operator's choice
of 2026-11-10 replaces: the catalog's released versions are the one list, and a packed file carries its version.
The catalog's first versions are filled from what is published, so numbering continues above today's.

Claude-Session: https://claude.ai/code/session_01JG73KK8HD1gufnqyFxMFdW
This commit is contained in:
2026-11-11 02:06:46 +01:00
parent e27fd02269
commit c46669a17e
2 changed files with 31 additions and 19 deletions
@@ -507,3 +507,9 @@ record it follows from, and replaces the builder's own choice where one was made
releases a version; a build of another watched branch reserves none, publishes no version and is delivered by its
build, its fingerprint, as every want names one. Why: the operator, 2026-11-10. How it is checked: whole (builder),
a `beta` build reserves nothing and is delivered.
- §372 **The catalog's versions start from what is published.** At the new indexer's first start, `versions` is filled
once, as released, from each name's highest `published` version the builder's state `versions` held, read by
`builder_versions`; it is not filled again. Why: numbering reads only the catalog's released versions (§348), and
without this every first version under G would start below today's and Go's `@latest` would never move (the
design's choice, 2026-11-10). How it is checked: whole (indexer, builder), with `0.1.14` published before G, the
first G build of `0.1` is `0.1.15`.
@@ -6,7 +6,7 @@ code:
- mesh-catalog modules/artifact-store-tools (the store's tools), modules/distribution (its program, holding the two image seats)
- mesh-catalog modules/gitea (package retention; the two package seats' verbs in its Go bundle)
- mesh-catalog modules/mesh-build-go, modules/mesh-build-node, modules/mesh-build-image (publishing through the seats)
- mesh-delivery modules/mesh-delivery-builder (versions, tag asks; from milestone G a package numbered at its publication, the seat `mesh-builds`), the forge bridge, the indexer, the checker, the assigner, modules/mesh-delivery-pipeline (`tag-wanted` from milestone G)
- mesh-delivery modules/mesh-delivery-builder (versions, tag asks; from milestone G a module's version reserved at its build's start and released by the catalog, the seat `mesh-builds`), the forge bridge, the indexer, the checker, the assigner, modules/mesh-delivery-pipeline (`tag-wanted` from milestone G)
- mesh-sdk (the bus helper for sending in parts)
- mesh-catalog modules/docker (image pruning)
- mesh-host internal/apply (every new image of a module pulled before any of its containers is replaced; a failed pull applied again on the status view's `settled` for the store's holder, and at the node-engine's start), internal/compose (each routed image reference written with its seat and that seat's holder)
@@ -266,24 +266,30 @@ the verb.
### The versions
- **From the delivery of design 47's milestone G, a package is numbered when it is published** (ADR 0666 §15). The
builder numbers a package's version at its publication, never only when its build is claimed: a package's trunk
build is claimed with no number and built by its digest, and once its build is done the builder gives it the next
count of its series, under compare-and-set, and says `numbered`, on which the build module calls `publish` with
the version and the held digest, as below for a floor not yet known. A build of an older source revision of the
same watched branch than one already numbered for that name is not numbered and publishes nothing, so a version never
names older content than the one below it. When the holder says `published`, the builder says the publication as the
event `package-published` of its seat `mesh-builds` (the name, the version, the fingerprint, the commit, the watched
branch). On it every artifact with a "published before it builds" edge to the package is rebuilt against the new
version, and the pipeline runner, which consumes the event, starts its pipeline (ADR 0666 §15; design 47, *A publish
rebuilds*);
nothing else is rebuilt, and a change to a package's tests alone publishes nothing. This removes the claim's wait
for earlier merges' numbers below, which held a group on 2026-11-09 (research 086, Findings). Why at publication: a
number given at the claim must wait for every earlier merge's number, and a build that never publishes keeps a
number nothing holds. An image, bundle or archive keeps the rule below. How it is checked: in the builder's
whole-module test a package's trunk build is numbered only once built, an older revision's build after a newer one
publishes nothing, `package-published` is said once per publication, and only the importing artifacts rebuild
(design 47, test 80).
- **From the delivery of design 47's milestone G, a module's version is reserved at its build's start and released
when every artifact is published** (the operator, 2026-11-10 about 21:40 CET; design 47 G §52, §348, §349, §368 to
§371). A module's manifest says its `version`, `MAJOR.MINOR`, and no custom version (`beta`, `alpha`) exists for now
(G §368). The patch is the next after the highest version the catalog holds released for that `MAJOR.MINOR`, 0 for
one it holds none of; the builder reserves it when the module's build starts, in its key `reserved` for the module
and `MAJOR.MINOR` (G §369), and passes it to the build of every artifact as a build argument, so code and packed
files carry it (G §370): a Go package is tagged `vMAJOR.MINOR.PATCH`, in git under its module directory's prefix
(`go/vMAJOR.MINOR.PATCH`), which departs from ADR 0573 §2 (a Go package's version is its trunk commit) by the
operator's choice, a later research bringing the record in line. Each artifact published is said as
`package-published` of the seat `mesh-builds` (ADR 0666 §15), on which every artifact with a "published before it
builds" edge to it is rebuilt against the new version and its pipeline started (design 47, *A publish rebuilds*);
nothing else is rebuilt, and a change to a package's tests alone publishes nothing. The version is released only
once every artifact of the module is published at it: the catalog, the seat `mesh-catalog`, then holds it and says
`version-released`, and its `versions` is the one list of released versions, which numbering alone reads (G §348,
§349). A failed publish leaves the version reserved, and `builder_publish_again` publishes the missing artifacts
under the same version. Only a build of the registration's first watched branch reserves and releases a version; a
build of another watched branch is delivered by its build, with none (G §371). The builder no longer numbers a
build at its claim or at its publication, says no `numbered` or `version.numbered` for a module's versions, and
keeps no list of them of its own: the bullets below on the claim's numbering, the numbering per source revision, the
builder's state `versions`, the floor and the event `numbered` hold until that delivery only. Numbering continues above what is published today, the catalog filled once from it (G §372). Why reserved before the build: a Go module zip and a TypeScript package carry their
version inside the file, so a number given at publication could not be valid for a digest built before it; this
departs from ADR 0666 §15's numbering at publication by the operator's choice. How it is checked: design 47's test
102, and in the builder's whole-module test a version is reserved at the build's start, released once both of a
module's artifacts are published, and published again under the same version after a failed publish.
- **A build that cannot read the published packages refuses**, naming the unread state, never building against a guess
(ADR 0666 §15; design 47, test 70).
- **Until that delivery, the builder numbers every trunk build** of a package, image, bundle or archive at its claim: the package series