|
|
|
@@ -100,10 +100,14 @@ record it follows from, and replaces the builder's own choice where one was made
|
|
|
|
|
`pipeline-started` 32 MiB, `pipeline-ended` 192 MiB, `group-ended` 64 MiB, `run-started` 16 MiB, `step-started`
|
|
|
|
|
and `step-ended` 128 MiB each, `wait-held` and `wait-ended` 32 MiB each; the seat `git`'s `branch-moved` 64 MiB; each
|
|
|
|
|
build seat's `step-ended` 128 MiB; `mesh-wants`'s `step-ended` 32 MiB; `mesh-builds`' `package-published` and
|
|
|
|
|
`mesh-catalog`'s `registration-changed` 16 MiB each; all 90 days. Why: about 300 pipelines a day of about 6 steps
|
|
|
|
|
`mesh-catalog`'s `registration-changed` 16 MiB each; `package-published` 128 MiB; `version-released` 128 MiB,
|
|
|
|
|
`version-delivered` 64 MiB, `toolchain-agreed` 16 MiB, and `versions-filled` 1 MiB with no age limit; all others
|
|
|
|
|
90 days. At about 300 releases a day (a mesh-sdk publish rebuilding about 120 modules), `package-published` of about
|
|
|
|
|
two artifacts each and `version-released` each say about 0.6 MiB a day, about 54 MiB in 90 days, and
|
|
|
|
|
`version-delivered` about 27 MiB. Why: about 300 pipelines a day of about 6 steps
|
|
|
|
|
(*The runner's kept data*) say about 1,800 step events a day of about 0.5 KiB, about 80 MiB in 90 days, and about 300
|
|
|
|
|
pipeline ends of about 4 KiB, about 105 MiB, 55 % of its cap; a build seat runs about 1,200 steps a day, about 54
|
|
|
|
|
MiB; publications and registration changes are a few a day; estimates, read from the fill tools once G runs. A kept
|
|
|
|
|
MiB; registration changes are a few a day; estimates, read from the fill tools once G runs. A kept
|
|
|
|
|
seat stream at its cap drops its oldest message, as a stream with a cap does; the grants part, which makes the
|
|
|
|
|
streams, says `filling` on its seat `mesh-grants` past 80 % and `room` below 70 %, which the watchman's
|
|
|
|
|
`store-filling` raises and clears as for every store (*A store filling is said before it is full*). How it is
|
|
|
|
@@ -124,7 +128,9 @@ record it follows from, and replaces the builder's own choice where one was made
|
|
|
|
|
its build was made from. The runner reads the dependents from that revision's catalog graph, the artifacts with a
|
|
|
|
|
kind-1 edge to the package, and starts each one's pipeline keyed by that branch, that source revision and the
|
|
|
|
|
dependent module, the version in the pipeline's state; a `take-in.taken` of the same revision and module is the
|
|
|
|
|
same pipeline (*A second start writes nothing*). Why: a pipeline's key is branch, source revision and module (above),
|
|
|
|
|
same pipeline (*A second start writes nothing*). A pipeline the runner starts from `outdated` (its start, §375, or
|
|
|
|
|
`runner_catch_up`) is keyed by the dependency's watched branch, the dependency's source revision `outdated` names, and
|
|
|
|
|
the dependent module, so it is the same pipeline the event would have started. Why: a pipeline's key is branch, source revision and module (above),
|
|
|
|
|
and the publication is made from a revision of a watched branch (ADR 0666 §15). How it is checked: whole (builder,
|
|
|
|
|
runner), a publish starts one pipeline per dependent, keyed by the publishing revision.
|
|
|
|
|
- §335 **What the teller says of a widening.** Each entry of `widens` names what widens (`acting-rule`, `grant`,
|
|
|
|
@@ -208,15 +214,19 @@ record it follows from, and replaces the builder's own choice where one was made
|
|
|
|
|
state. With no holder of a build seat, a build ends `could not run`, naming the seat, and is asked again on the seat
|
|
|
|
|
list's change. Why: ADR 0596 §2. How it is checked: the builder's account holds no grant to the indexer's state.
|
|
|
|
|
- §349 **The catalog holds released versions only, and says each.** The indexer keeps, for the seat `mesh-catalog`,
|
|
|
|
|
each module's released versions in its old `state` section `versions`, one key per module and `MAJOR.MINOR` holding
|
|
|
|
|
its released patches with each artifact's digest and the source revision built (issue 1961's catalog of versions).
|
|
|
|
|
It hears every artifact's `package-published` (packages, images, bundles and archives alike) and records a version
|
|
|
|
|
as released once every artifact the module's catalog entry names is published at it, then says `version-released`
|
|
|
|
|
(the module, the version, its artifacts, the source revision) on `mesh.seat.mesh-catalog.event.version-released`,
|
|
|
|
|
kept 90 days at 16 MiB; the verb `versions` answers a module's released versions, its callers the builder and any
|
|
|
|
|
person or session. A reserved version is not in it. The builder's `version.numbered` is no longer said or heard.
|
|
|
|
|
Why: the operator, 2026-11-10 about 21:40 CET (gaps items 23 and 43). How it is checked: whole (indexer), a version
|
|
|
|
|
with one of two artifacts published is not released, and with both is, said once.
|
|
|
|
|
each module's released versions in its old `state` section `versions`, one key per module and version holding each
|
|
|
|
|
artifact's digest, the source revision built and its edge entries (§374) (issue 1961's catalog of versions). It hears
|
|
|
|
|
every artifact's `package-published` (packages, images, bundles and archives alike) and records a version as
|
|
|
|
|
released once every artifact the module's catalog entry names is published at it, then says `version-released` (the
|
|
|
|
|
module, the version, each artifact's digest, the source revision) on
|
|
|
|
|
`mesh.seat.mesh-catalog.event.version-released`. A version lower than the highest it holds released for that module
|
|
|
|
|
is recorded, marked `released late`, and not said: no `version-released` is lower than the module's highest, and
|
|
|
|
|
nothing follows one (§382). Each module keeps its newest 100 versions: at each release the indexer deletes that
|
|
|
|
|
module's oldest beyond them, never its highest of any `MAJOR.MINOR`. The verb `versions` answers a module's released
|
|
|
|
|
versions, its callers the builder, the holders of the registry seats and any person or session. A reserved version
|
|
|
|
|
is not in it. The builder's `version.numbered` is no longer said or heard. Why: the operator, 2026-11-10 about 21:40 to 23:00 CET (gaps items 23 and 43); the
|
|
|
|
|
key per version, the 100 kept and the late release are the design's choice, round 2 of the review by architectural domain, 2026-11-10. How it is checked: whole (indexer), a version with
|
|
|
|
|
one of two artifacts published is not released, and with both is, said once; a late older version is not said.
|
|
|
|
|
- §350 **A superseded build's drop is a kept call.** The runner ends a superseded build's step `superseded` at once, and
|
|
|
|
|
asks the build seat's `drop` as a kept call (ADR 0668 §1, §2), so it is asked again through every transport fault
|
|
|
|
|
and said `call-unanswered` after five minutes in the runner's findings. How it is checked: whole (runner), a drop
|
|
|
|
@@ -305,42 +315,66 @@ record it follows from, and replaces the builder's own choice where one was made
|
|
|
|
|
- §368 **A manifest says its `MAJOR.MINOR`.** Each module's manifest names `version`, two numbers `MAJOR.MINOR`; the
|
|
|
|
|
manifest validator refuses any other form, a pre-release or custom suffix (`beta`, `alpha`) among them: no custom
|
|
|
|
|
version exists for now. A manifest without it is refused once G's reader runs (ADR 0667 §4: the reader is delivered
|
|
|
|
|
first). Why: the operator, 2026-11-10 about 21:40 CET. How it is checked: unit (manifest validator), `1.4` accepted,
|
|
|
|
|
`1.4-beta` and `1.4.2` refused.
|
|
|
|
|
first). G's change writes `version` into every existing manifest, the `MAJOR.MINOR` of the version §372 fills for that
|
|
|
|
|
module, `0.1` for a module with none published, in the same group as the reader. Why: the operator, 2026-11-10 about
|
|
|
|
|
21:40 CET; the values are the design's choice. How it is checked: unit (manifest validator), `1.4` accepted,
|
|
|
|
|
`1.4-beta` and `1.4.2` refused; the catalog's validation finds no manifest without `version` at G's heads.
|
|
|
|
|
- §369 **The reservation is one key per module and `MAJOR.MINOR`.** The builder, a foundation part, keeps in its old
|
|
|
|
|
`state` section `reserved` one key per module and `MAJOR.MINOR`, the version its build reserved, written by
|
|
|
|
|
compare-and-set at the build's start; a newer build of the module takes the next after the higher of the highest
|
|
|
|
|
released and the one reserved, so two builds never share a version, and a superseded build's version is never
|
|
|
|
|
released, leaving a gap in the patches. The builder deletes the key when the catalog says `version-released` for it;
|
|
|
|
|
`builder_reserved` reads the keys. This is no list of released versions: numbering reads those only from the
|
|
|
|
|
catalog. Why: the operator, 2026-11-10 (a version reserved when the build starts); the key and the gap are the
|
|
|
|
|
design's choice. How it is checked: whole (builder), two builds close together reserve two versions, and the key
|
|
|
|
|
goes on `version-released`.
|
|
|
|
|
`state` section `reserved` one key per module and `MAJOR.MINOR`, the version its build reserved and each artifact's
|
|
|
|
|
digest once built, written by compare-and-set at the build's start; a newer build of the module takes the next after
|
|
|
|
|
the higher of the highest released and the one reserved, so two builds never share a version, and a superseded
|
|
|
|
|
build's version is never released, leaving a gap in the patches. The builder deletes the key when the catalog says
|
|
|
|
|
`version-released` for it, or when a version of another `MAJOR.MINOR` of the module is released (the manifest moved
|
|
|
|
|
on); `builder_reserved` reads the keys and `builder_reserved_drop` drops one on a person's word, written in the
|
|
|
|
|
hand-act log. A reserved version whose build ended with an artifact unpublished past the publish's 10-minute bound
|
|
|
|
|
is the builder's finding `version-unreleased`, naming the module, the version and the missing artifacts, cleared by
|
|
|
|
|
its `version-released`. `builder_publish_again` names the reserved version it publishes under. The builder reserves
|
|
|
|
|
nothing until the catalog says `versions-filled` (§372); a build waiting for it says `wait-held` naming the fill. The
|
|
|
|
|
seat `mesh-builds`' verb `reserved` answers a module's reserved version with each artifact's digest, its callers the
|
|
|
|
|
holders of the registry seats (design 51, *Publishing*). This is no list of released versions: numbering reads those
|
|
|
|
|
only from the catalog. Why: the operator, 2026-11-10 (a version reserved when the build starts); the key, the gap,
|
|
|
|
|
the finding and the verb are the design's choices. How it is checked: whole (builder), two builds close together
|
|
|
|
|
reserve two versions, the key goes on `version-released`, an unpublished artifact raises `version-unreleased`, and a
|
|
|
|
|
builder started before the fill reserves nothing until `versions-filled`.
|
|
|
|
|
- §370 **The version reaches every artifact's build.** The build seat's ask carries the version, and the build module
|
|
|
|
|
passes it to the artifact's build as the build argument `MESH_VERSION`: a Go package is tagged `vMAJOR.MINOR.PATCH`,
|
|
|
|
|
an npm package's version is it, an image carries it as its tag and label, and a program reads it as its own version.
|
|
|
|
|
A Go package's version is its tag: this departs from ADR 0573 §2, which has a Go package's version be its trunk
|
|
|
|
|
commit, by the operator's choice of 2026-11-10, and a later research brings that record in line. How it is checked:
|
|
|
|
|
whole (Go and TypeScript build modules), a built package and program carry the reserved version.
|
|
|
|
|
commit, by the operator's choice of 2026-11-10, and a later research brings that record in line. The git tag
|
|
|
|
|
(`go/vMAJOR.MINOR.PATCH`, design 51) is written by the builder only on the catalog's `version-released`, through the
|
|
|
|
|
seat `git`'s verb `tag`, whose callers are the builder alone, so a superseded build's reserved version is never
|
|
|
|
|
tagged. How it is checked: whole (Go and TypeScript build modules), a built package and program carry the reserved
|
|
|
|
|
version; whole (builder), the tag is written on `version-released` and never for a superseded build.
|
|
|
|
|
- §371 **Only the first watched branch releases.** Only a build of the registration's first watched branch reserves and
|
|
|
|
|
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`.
|
|
|
|
|
once, as released, for each module from the highest `published` version over every artifact of the module that the
|
|
|
|
|
builder's state `versions` held (for mesh-sdk the higher of Go's `v0.1.14` and npm's `0.1.18`, so `0.1.18`), read by
|
|
|
|
|
`builder_versions` as a kept call (ADR 0668 §1, §2), an unanswered call raising `call-unanswered` after five minutes;
|
|
|
|
|
it is not filled again. Then the indexer says `versions-filled` on its seat, once, kept on its stream with no age
|
|
|
|
|
limit, and the builder reserves nothing before it (§369). The builder keeps serving `builder_versions` until then: the
|
|
|
|
|
running builder serves it already, and the new one serves it too, so no ordering edge is needed. The builder's state
|
|
|
|
|
`versions`, the floor and its tool `builder_floor_again`, the event `numbered`, `builder_versions`, and `tag-asks` are
|
|
|
|
|
removed in the first change after the first pipeline after G's delivery has delivered a change end to end, the state
|
|
|
|
|
through `drop` on a person's word (ADR 0595 §4). 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, round 2 of the review by architectural domain, 2026-11-10).
|
|
|
|
|
How it is checked: whole (indexer, builder), with Go `v0.1.14` and npm `0.1.18` published before G, the first G build
|
|
|
|
|
of `0.1` is `0.1.19`, and a builder started before the indexer reserves nothing until `versions-filled`.
|
|
|
|
|
- §373 **A group's run on request publishes no version.** A run on request of a group builds each member that
|
|
|
|
|
depends on a package member against that member's build by its digest: the build module fetches the package
|
|
|
|
|
member's build from the store by the digest its build's done key names and lays it in the build's workspace as the
|
|
|
|
|
module that package names (a Go workspace's replacement, a TypeScript local package), so nothing is fetched by a
|
|
|
|
|
version, and no version is reserved, numbered or published for the run. The tagged versions, `tag-wanted` (the
|
|
|
|
|
checker's, and none of the runner's) and the builder's `tag-asks` with its tools `builder_tag`, `builder_tag_asks`
|
|
|
|
|
and `builder_untag` go at G's delivery (design 51, *Tagged versions*). Why: the operator, 2026-11-10 about 21:40 CET,
|
|
|
|
|
no custom versions for now, a tagged version being one; a run delivers nothing (ADR 0666 §18), so it needs no
|
|
|
|
|
version. How it is checked: test 103.
|
|
|
|
|
depends on a package member against that member's build by its digest. The builder's build ask for such a member
|
|
|
|
|
carries each package member's build digest, which the builder takes from its own `build.ended` of that member's
|
|
|
|
|
build, its own fact (ADR 0596 §2); the build module fetches that build from the store by the digest, checks the
|
|
|
|
|
fetched bytes against it, and lays it in the build's workspace as the module that package names (a Go workspace's
|
|
|
|
|
replacement, a TypeScript local package), so nothing is fetched by a version, and no version is reserved, numbered
|
|
|
|
|
or published for the run. A dependent whose package member's build is not done waits, said as the builder's
|
|
|
|
|
`wait-held` naming the member, within building's 60-minute bound; a member's build that failed or is missing past
|
|
|
|
|
that bound fails the dependent's step, naming the member. The tagged versions, `tag-wanted` (the checker's, and none
|
|
|
|
|
of the runner's) and the builder's `tag-asks` with its tools `builder_tag`, `builder_tag_asks` and `builder_untag` go
|
|
|
|
|
at G's delivery (design 51, *Tagged versions*). Why: the operator, 2026-11-10 about 21:40 CET, no custom versions for
|
|
|
|
|
now, a tagged version being one; a run delivers nothing (ADR 0666 §18), so it needs no version; the digest's source
|
|
|
|
|
and the wait are the design's choice, round 2 of the review by architectural domain, 2026-11-10. How it is checked: test 103.
|
|
|
|
|
- §374 **A release records, per edge, the part it was built against or delivered after.** One version per module
|
|
|
|
|
stays (§52), and an edge is judged by the digest of the part it points to. The catalog records on each released
|
|
|
|
|
version (§349), in its key of `versions`, one entry per catalog-graph edge of the module's artifacts (the six kinds
|
|
|
|
@@ -352,52 +386,66 @@ record it follows from, and replaces the builder's own choice where one was made
|
|
|
|
|
and the builder carries them in each artifact's `package-published`, so the indexer reads no other part's state
|
|
|
|
|
(ADR 0596). Kind 3 points at the toolchain part the agreed toolchain names (ADR 0584 §1), never at the build
|
|
|
|
|
module's own program.
|
|
|
|
|
- kinds 2 and 4 (delivered after): the dependency's version and part digest the catalog last said
|
|
|
|
|
`version-delivered` for when the release is delivered (§376), one entry for the mesh.
|
|
|
|
|
- kinds 2 and 4 (delivered after): the dependency's version and part digest of its newest `version-delivered`
|
|
|
|
|
when this release is itself first delivered (its own `version-delivered`, §376), one entry for the mesh.
|
|
|
|
|
- kind 5 (has acted for): a fact, not a version: the acting part, its step, the build that acted and that the act
|
|
|
|
|
was done (or released by hand), from the holder's `wait-ended` (*Each step's wait is its own part's*).
|
|
|
|
|
- kind 6 (runs a version that serves): a fact: the verb or manifest word used and the dependency's delivered
|
|
|
|
|
version that serves it.
|
|
|
|
|
version that serves it, written at the same first delivery.
|
|
|
|
|
|
|
|
|
|
The entries of kinds 2, 4 and 6 read `not yet delivered` until that first delivery, are written once then, and none
|
|
|
|
|
is changed after; kinds 1, 3 and 5 are written at the release.
|
|
|
|
|
|
|
|
|
|
A build of a watched branch other than the registration's first releases no version (§371): its entries are kept in
|
|
|
|
|
the indexer's old `state` section `build-edges`, one key per module and watched branch holding the newest build's
|
|
|
|
|
entries, keyed by its fingerprint, replaced by the next build and deleted when `registration-changed` says the
|
|
|
|
|
branch is no longer watched, and they compare by the part's digest alike. The declared edge stays in the catalog
|
|
|
|
|
graph; an entry is the release's or the build's fact, never changed after. Why: the operator, 2026-11-10 about 22:30 to 23:00 CET and 22:10 CET (issue 1961), and
|
|
|
|
|
graph; an entry is the release's or the build's fact, written once. Why: the operator, 2026-11-10 about 22:30 to 23:00 CET and 22:10 CET (issue 1961), and
|
|
|
|
|
the lead's review of these lines. Each entry is about 0.1 KiB, about ten a version, so `versions` stays within its
|
|
|
|
|
64 MiB (an estimate). How it is checked: test 104.
|
|
|
|
|
- §375 **One query finds every edge behind, by the part's digest.** The seat `mesh-catalog`'s verb `outdated`, with
|
|
|
|
|
the indexer's tool `indexer_outdated`, answers every entry that is behind: for kind 1, the recorded digest differs
|
|
|
|
|
from the part's digest in the dependency's newest released version (for a build of another branch, its newest
|
|
|
|
|
build on that branch); for kind 3, it differs from the toolchain part the agreed toolchain names now; for kinds 2 and
|
|
|
|
|
4, it differs from the dependency's newest delivered version; for kind 5, the newest version of the acting part has
|
|
|
|
|
not acted for the dependent's current build; for kind 6, the delivered version no longer serves the verb or word. A
|
|
|
|
|
dependency's newer version that left the part's digest as it was makes nothing behind, so nothing is done twice for
|
|
|
|
|
the same inputs. Only a stale edge (§378) that is behind has an act that catches it up, a rebuild; an ordering edge
|
|
|
|
|
behind is shown and starts nothing. Each answer names the module and its version or build, the kind, the
|
|
|
|
|
dependency, what was recorded and what is newest, and the act. Its callers are any person, an agent session, the
|
|
|
|
|
healers, the runner and the assigner; `indexer_outdated_again`, a hand act written in the hand-act log, says the
|
|
|
|
|
event that starts a stale entry's rebuild again. At its start, the runner asks `outdated` once and starts the
|
|
|
|
|
rebuilds it names, so a restart or a missed event leaves nothing behind. Why: the operator, 2026-11-10 (issue
|
|
|
|
|
1961's "outdated"). How it is checked: test 105.
|
|
|
|
|
- §376 **A stale edge rebuilds on its event; a delivery is waited for mesh-wide.** On a dependency's `version-released`,
|
|
|
|
|
the dependents by kind 1 whose entry is behind are rebuilt against it and their pipelines started, as on
|
|
|
|
|
`package-published` (§53); when the agreed toolchain names a new toolchain part, the dependents by kind 3 whose entry
|
|
|
|
|
is behind are rebuilt. No other edge rebuilds or delivers anything again. A dependent's new version that a change
|
|
|
|
|
orders after its dependency's new version by kind 2, 4 or 6 is wanted only once that dependency's version is
|
|
|
|
|
delivered to every machine that places it and is present: the catalog says `version-delivered` (the module, the
|
|
|
|
|
version and its parts' digests) once every present machine placing it runs it healthy, from the node-engine seat's
|
|
|
|
|
`running`, on `mesh.seat.mesh-catalog.event.version-delivered`, kept 90 days at 16 MiB, and the assigner writes the
|
|
|
|
|
dependent's wants on it. A machine away is named and catches up when it is back (ADR 0603 §7); meanwhile the
|
|
|
|
|
dependent's status, in `assigner_why_not` and the status view, reads "waiting for delivery of <module>", naming
|
|
|
|
|
the machines it waits for. When every machine that places the dependency is away, it is not delivered: its status
|
|
|
|
|
reads "waiting for <machine> to be back" and its dependents wait; nothing is raised for a machine simply away.
|
|
|
|
|
Kind 5 is held by the acting parts' waits (*Within a revision the new version acts first*). Why: the operator, 2026-11-10 about 22:30 to 23:00 CET. How it is
|
|
|
|
|
checked: tests 104 and 106.
|
|
|
|
|
from the part's digest in the dependency's newest released version (for a build of another branch, its newest build
|
|
|
|
|
on that branch); for kind 3, it differs from the toolchain part of the builder's newest `toolchain-agreed`; for kinds
|
|
|
|
|
2 and 4, it differs from the dependency's newest `version-delivered`; for kind 5, the newest version of the acting
|
|
|
|
|
part has not acted for the dependent's current build; for kind 6, the delivered version no longer serves the verb or
|
|
|
|
|
word. A dependency's newer version that left the part's digest as it was makes nothing behind, so nothing is done
|
|
|
|
|
twice for the same inputs. Only a stale edge (§378) that is behind has an act, a rebuild; an ordering edge behind is
|
|
|
|
|
shown and starts nothing. Each answer names the module and its version or build, the kind, the dependency with its
|
|
|
|
|
watched branch and source revision, what was recorded and what is newest, and the act. It may be asked for one
|
|
|
|
|
dependency. Its callers are any person, an agent session, the healers and the runner. At its start the runner asks
|
|
|
|
|
`outdated` once, a kept call raising `call-unanswered` after five minutes, and starts the rebuilds it names; the
|
|
|
|
|
runner's tool `runner_catch_up`, for the operator and the healers and written in the hand-act log, does the same by
|
|
|
|
|
hand, for one dependency or all. A restart or a missed event so leaves nothing behind. Why: the operator, 2026-11-10
|
|
|
|
|
(issue 1961's "outdated"); `runner_catch_up` replaces the indexer's hand tool, which would have had to say another
|
|
|
|
|
part's event (the design's choice, round 2 of the review by architectural domain, 2026-11-10). How it is checked: test 105.
|
|
|
|
|
- §376 **A stale edge rebuilds on its event; a delivery is waited for mesh-wide.** The rebuilds start on two events
|
|
|
|
|
the runner consumes: kind 1 on `package-published` (§53), and kind 3 on `toolchain-agreed`, which the builder says
|
|
|
|
|
on its seat `mesh-builds` when the agreed toolchain of a language changes (ADR 0584 §1), naming the language, the
|
|
|
|
|
version and the toolchain part's digest; for each, the runner asks `outdated` for that dependency and starts a
|
|
|
|
|
pipeline for each dependent behind. `version-released` starts no rebuild. No other edge rebuilds or delivers anything
|
|
|
|
|
again. A dependent's new version that a change orders after its dependency's new version by kind 2, 4 or 6 is wanted
|
|
|
|
|
only once that dependency's version is delivered to every machine that places it and is present. The assigner judges
|
|
|
|
|
it, since placement is its own state: from its placements, the node-engine seat's `running` events and the
|
|
|
|
|
watchman's presence of each node, judged again on each of them and on each placement change, and says
|
|
|
|
|
`version-delivered` (the module, the version, its parts' digests and the machines away) on its seat `mesh-wants`
|
|
|
|
|
(`mesh.seat.mesh-wants.event.version-delivered`) once every present machine placing it runs it healthy; the catalog
|
|
|
|
|
hears it for its entries (§374), and the assigner writes the dependent's wants on it. The dependent's wait is the
|
|
|
|
|
assigner's, said `wait-held` with a 60-minute bound from the dependency's `version-released` (*Each step's wait is its
|
|
|
|
|
own part's*): past it, the watchman's finding `delivery-waits` names the dependency, the version and the machines not
|
|
|
|
|
running it, with each one's node-engine version, so a node-engine from before G that never runs it is named. A
|
|
|
|
|
machine away is named and catches up when it is back (ADR 0603 §7); meanwhile the dependent's status, in
|
|
|
|
|
`assigner_why_not` and the status view, reads "waiting for delivery of <module>", naming the machines it waits for.
|
|
|
|
|
When every machine that places the dependency is away, it is not delivered: its status reads "waiting for <machine>
|
|
|
|
|
to be back", its dependents wait, and nothing is raised for a machine simply away, the bound counting only while a
|
|
|
|
|
placing machine is present. `assigner_delivered_again`, for the operator and the healers and written in the
|
|
|
|
|
hand-act log, says `version-delivered` again for one version when it holds. Kind 5 is held by the acting parts' waits
|
|
|
|
|
(*Within a revision the new version acts first*). Why: the operator, 2026-11-10 about 22:30 to 23:00 CET; who judges it, the event's seat, the bound and the tools are
|
|
|
|
|
the design's choice, round 2 of the review by architectural domain, 2026-11-10. How it is checked: tests 104 and 106.
|
|
|
|
|
- §377 **The first fill.** At the indexer's first start under G, after `versions` is filled (§372), each module's
|
|
|
|
|
newest version gets its entries once: kinds 1 and 3 from the dependency version published latest before that
|
|
|
|
|
version's build was claimed, read with the times of `builder_versions`, and its part's digest; kinds 2, 4 and 6 from
|
|
|
|
|
the versions every present machine runs, read from the last `running` of each module on each node, which the
|
|
|
|
|
the versions every machine placing it runs, present or away, read from the last `running` of each module on each node, which the
|
|
|
|
|
node-engine seat's stream keeps last per subject with no age limit; kind 5 as done for every acting part's running
|
|
|
|
|
build. Each filled entry is marked `filled`, so a person sees it was derived, not recorded. It is not filled again.
|
|
|
|
|
Why: so the first `outdated` does not find the whole mesh behind (the lead, 2026-11-10). How it is checked: whole
|
|
|
|
@@ -410,11 +458,26 @@ record it follows from, and replaces the builder's own choice where one was made
|
|
|
|
|
- §379 **A want names the released version and each part's digest.** From G's delivery a want `want.<node>.<module>`
|
|
|
|
|
names, beside its fingerprint and source revision, the module's released version, for people (none for a build of
|
|
|
|
|
another watched branch), and the digest of each of its parts; the node-engine fetches and checks each part by its
|
|
|
|
|
digest, never by the version. The node-engine of G reads the two fields, its reader edge of kind 4 delivered before
|
|
|
|
|
any want writes them (ADR 0667 §4, §9). Why: the operator, 2026-11-10 about 22:30 to 23:00 CET. How it is checked: whole (assigner, node-engine), a want names
|
|
|
|
|
the version and the parts' digests, and a fetched part whose digest differs is not applied.
|
|
|
|
|
digest, never by the version. The assigner takes the digests from `version-released` for a released version, and from
|
|
|
|
|
the builder's `build.ended`, which carries each artifact's digest and, for a kept build, its keeping node, for a build
|
|
|
|
|
of another watched branch and for a kept build (§271); never from the builder's done key (ADR 0596 §2). It writes the
|
|
|
|
|
two fields into a node's want only once that node runs G's node-engine, as it holds a node's other wants for its new
|
|
|
|
|
node-engine (*Composing waits per node*), so the reader edge holds per node and a node away on an older node-engine
|
|
|
|
|
gets its node-engine's want first. Why: the operator, 2026-11-10 about 22:30 to 23:00 CET; the sources and the edge per node are the design's choice, round 2 of the review by architectural domain, 2026-11-10. How it is checked:
|
|
|
|
|
whole (assigner, node-engine), a want names the version and the parts' digests taken from those events, a node on an
|
|
|
|
|
older node-engine gets no new field, and a fetched part whose digest differs is not applied.
|
|
|
|
|
- §380 **`indexer_edges` answers both directions.** For any module or part, per watched branch, `indexer_edges`
|
|
|
|
|
answers what it depends on and what depends on it; per edge its kind, stale or order (§378), the manifest word it
|
|
|
|
|
came from, the part it points to, and what its newest release recorded (version and digest, or the fact for kinds 5
|
|
|
|
|
and 6), and whether it is behind now (§375). Why: the operator, 2026-11-10 about 22:30 to 23:00 CET. How it is checked: whole (indexer), a fixture module's
|
|
|
|
|
and 6), and whether it is behind now (§375). Its callers are any person, an agent session and the healers. Why: the operator, 2026-11-10 about 22:30 to 23:00 CET. How it is checked: whole (indexer), a fixture module's
|
|
|
|
|
edges are answered from both ends with their newest release's record.
|
|
|
|
|
- §381 **A registry holder checks a publish against the reservation.** From G's delivery the holder of a registry
|
|
|
|
|
seat asks the seat `mesh-builds`' verb `reserved` (§369), in place of `builder_versions`, whether the module, the
|
|
|
|
|
version and the artifact's digest are reserved, and refuses loudly otherwise (ADR 0605 §4); a version the catalog
|
|
|
|
|
already holds released for that digest is answered as held and stores nothing. Why: ADR 0605 §4 has the holder
|
|
|
|
|
refuse a version the builder did not give, and the builder's list goes (§372); the design's choice, round 2 of the review by architectural domain, 2026-11-10. How it is checked: whole
|
|
|
|
|
(registry holder, builder), a publish of an unreserved version is refused, naming it.
|
|
|
|
|
- §382 **An older version released after a newer starts nothing.** When every artifact of a version lower than the
|
|
|
|
|
module's highest released is published late (a retry of an older reservation), the catalog records it `released
|
|
|
|
|
late`, says no `version-released` for it, and the runner starts no rebuild on its `package-published` (§53). Why:
|
|
|
|
|
a rebuild against an older part would move a dependent back; the design's choice, round 2 of the review by architectural domain, 2026-11-10. How it is checked: test 102.
|
|
|
|
|