|
|
|
@@ -0,0 +1,355 @@
|
|
|
|
|
---
|
|
|
|
|
layer: to-be
|
|
|
|
|
status: in-progress
|
|
|
|
|
design: 47
|
|
|
|
|
milestone: G
|
|
|
|
|
updated: 2026-11-12
|
|
|
|
|
decisions:
|
|
|
|
|
- "ADR 0667"
|
|
|
|
|
---
|
|
|
|
|
# 47, milestone G — the lead's answers to develop's questions, continued
|
|
|
|
|
|
|
|
|
|
The answers of [G-20](G-20-lead-answers.md) go on here, since that part reached its size bound: each one line, naming
|
|
|
|
|
the principle that settles it, cited as "design 47 G A-n".
|
|
|
|
|
|
|
|
|
|
- **A-182** (§31, §350, §119; principles 2 and 7) A superseded step's ask is dropped where it stands: a taken step
|
|
|
|
|
keeps the node `ask-taken` named, and the drop is asked of that node's holder of the build seat; an untaken ask's drop
|
|
|
|
|
is asked of any holder, which records it in the seat's shared drop key, so no holder takes it. Steps on `mesh-builds`
|
|
|
|
|
and `mesh-wants`, whose seats serve no `drop`, are only ended superseded.
|
|
|
|
|
- **A-183** (design 46 approval mark §4, §23; principles 3 and 7) A manifest that marks a verb nothing enforces is
|
|
|
|
|
refused by the validator wherever it runs, as every rule's problem is; the indexer's "set aside to wait" is only its
|
|
|
|
|
reading of a field it does not yet know (the reader edge of §23), so no new waiting verdict is added.
|
|
|
|
|
- **A-184** (clarifies A-170; §543; principle 3) Until main's subject goes, it also takes the checker's `check` and
|
|
|
|
|
`recheck` asks, so no ask that runs today is refused by G; a queue is only `delivery`, `check` or `recheck`, and
|
|
|
|
|
steprun's `AskKinds` lists no `step` queue.
|
|
|
|
|
- **A-185** (A-180; principle 7) The catalog client (`meshcatalogclient`'s catalog follower), which already hears every
|
|
|
|
|
`catalog-revision`, hands a candidate's revision it does not keep to a hook its caller sets; the runner sets it to
|
|
|
|
|
place a run's pipelines. mesh-sdk's event hub keeps its one handler per pattern.
|
|
|
|
|
- **A-186** (A-179; principles 3 and 7) `conn.AnswerSeat` takes the seat's definition from its caller, which reads it
|
|
|
|
|
from the seat list it already follows; a verb the definition does not hold, or a definition not yet read, is
|
|
|
|
|
refused for every caller and said so, so a holder answers only once its seat list is read.
|
|
|
|
|
- **A-187** (A-176, §76; principle 3) The consumer ledger keeps a message's first delivery time: a message delivered
|
|
|
|
|
again (asked again, or after a restart) keeps the time it was first delivered, so a message that never settles
|
|
|
|
|
grows old and §76's check fires for it.
|
|
|
|
|
- **A-188** (A-172, §170, §151; principles 3 and 7) A take-in writes its entries (each with its module) into the
|
|
|
|
|
gate's record, so `recovery-merged`'s `module` is filled from the record; no forge-made open path is built, since
|
|
|
|
|
G ends the mark (§151). A record of the old milestone form, made before G, says no branch.
|
|
|
|
|
- **A-189** (§376, §374, A-181; principles 1, 2 and 7) At its start the assigner reads whole, as A-181 reads
|
|
|
|
|
`build.ended`, the streams of its own `version-delivered` and of the catalog seat's `version-released`, so it says
|
|
|
|
|
each version delivered once and knows the released ones. A dependent whose want changes fingerprint waits, by an
|
|
|
|
|
edge of kind 2, 4 or 6, for its dependency's newest released version on the dependent's branch not yet said
|
|
|
|
|
delivered; on a branch where no version is released there is no wait.
|
|
|
|
|
- **A-190** (ADR 0668 §1, §2; principles 3 and 7) A kept call is kept only while what it serves still stands; for the
|
|
|
|
|
indexer's four: `messageVia` while the commit's take-in is still pending, `stepsVia` while the candidate is held,
|
|
|
|
|
`sourceVia` while the branch is watched, `versionsVia` while the module is in that branch's newest view. Once
|
|
|
|
|
that ends, the call stops and is not said unanswered. `pin-missing` takes scope `module`, id
|
|
|
|
|
`mesh-delivery-indexer.pin.<key>`.
|
|
|
|
|
- **A-191** (§33, §540; principle 3) A `pipeline-failed` finding whose commit no pull request merged, or whose `pull`
|
|
|
|
|
read fails, is written with no `owner` (so it reaches the operator at once) and says why in its explanation; a
|
|
|
|
|
failed read is said and the owner is written at the next step end of that commit.
|
|
|
|
|
- **A-192** (ADR 0596, ADR 0603 §8, §499, §541, §520; principles 1 and 7) The builder says `wait-held` and `wait-ended`
|
|
|
|
|
for a key queued behind a package, in the one wait form with its `part`, and the watchman times it from those; its
|
|
|
|
|
reads of the builder's `builds`, the node-engine's `have` and `mesh-host.health` go, replaced by the node-engine's
|
|
|
|
|
`running` (with `healthy`) and its wait events.
|
|
|
|
|
- **A-193** (§64, §73, §373, §420, A-180, A-185; principles 2, 3 and 7) For a run: `run` writes each member's
|
|
|
|
|
pipeline at once (key `<member branch>.<id>.<module>`, running, no steps, `Run` its id), and the candidate's
|
|
|
|
|
revision places its steps by compare-and-set; `pipeline-started` is said when the steps are placed, with the
|
|
|
|
|
fingerprint and the candidate's revision; `run-started`'s subject names one member's module, branch and commit, or
|
|
|
|
|
for several the first member's module and branch and `run-<id>`; a member naming no branch is refused. The hook is
|
|
|
|
|
called once per candidate revision at the catalog follower's one subscription, whatever branches are followed, so
|
|
|
|
|
a runner following none still hears it. As §373 says, a run builds each member and its dependents: the dependents'
|
|
|
|
|
pipelines come from the candidate's entries whose fingerprints the members change.
|
|
|
|
|
- **A-194** (principle 4; §64) The indexer's state `runs` and its run candidates get tools as every kept thing does:
|
|
|
|
|
`indexer_runs` reads them and `indexer_run_drop` drops one by hand (its hand act written first); a run id is
|
|
|
|
|
`run-` and the runner's random 12-hex id, which the indexer's wider pattern accepts.
|
|
|
|
|
- **A-195** (§65, §266, §276, §534, §19, A-77, A-149; principles 2, 3 and 7) The runner's `pipeline` wait is a field on
|
|
|
|
|
each held pipeline's record (`held`: since, and the fingerprint awaited), no new state. A take-in changes the runner
|
|
|
|
|
when its own module's entry (its own name, A-149) gets a new fingerprint; every pipeline started after that take-in
|
|
|
|
|
is held. The pipelines' records are on the bus, so whichever runner holds the seat when the wait ends starts them:
|
|
|
|
|
the wait ends on the node-engine seat's `running` for the runner's module at the awaited fingerprint with `healthy`
|
|
|
|
|
true, on any node; its 30 minutes are a bound key, whose expiry starts the held pipelines and writes a finding.
|
|
|
|
|
- **A-196** (§553 with A-91; principle 7; the operator, 2026-11-09: merges need no approval) An empty status makes a
|
|
|
|
|
step `optional`, as §553 says, except the approval step: a policy that names no approval status asks the operator
|
|
|
|
|
nothing, as A-91 says; only a policy that names approval asks for it.
|
|
|
|
|
- **A-197** (ADR 0596, A-192, A-149; principles 1, 3 and 7) What only the node-engine knows of itself it raises as its
|
|
|
|
|
own findings through its finding writer: a have's failed or removed phase and its detail, its kept-data findings,
|
|
|
|
|
an unreachable tunnel, and every part of its health report (machine network, rewritten network, machine units,
|
|
|
|
|
relogin needed, directory used as found, node account fallback). The watchman stops reading `node-engine.have` and
|
|
|
|
|
`mesh-host.health` and raising those; it keeps only what it sees across parts.
|
|
|
|
|
- **A-198** (§677; principle 7; shared code is in mesh-sdk) The act's form, `ActDigest` and the ask's form move from
|
|
|
|
|
`operatorchannelclient` into mesh-sdk's `go/operatorask`, which the client re-exports, so the seat server in
|
|
|
|
|
`go/process` holds the gate with no import of mesh-contracts and no cycle between the two.
|
|
|
|
|
- **A-199** (A-185, A-193; principle 7) mesh-sdk's `ProcessReader` gains `AdoptEvent(seat, event, hear)`, a seat event
|
|
|
|
|
heard on the one subscription with no picture, made at once if no follower made it; meshcatalogclient's
|
|
|
|
|
`WireCandidatesProcess` adopts `catalog-revision` through it and hands each candidate revision to the hook.
|
|
|
|
|
- **A-200** (§502, A-188; principles 7 and 8) A taken-in delivery record's `milestone` is `<branch>.<source revision>`,
|
|
|
|
|
so the watchman ties a `record-opened` to the `take-in.taken` of that branch and source revision by its milestone;
|
|
|
|
|
`record-opened` gains nothing, and a record is covered only by what is late for its own revision's entries.
|
|
|
|
|
- **A-201** (§189, §190, A-160, A-174; principle 7) The assigner keeps a candidate's assignment graph per run (key
|
|
|
|
|
`run-<id>`), made when the candidate's revision is heard and dropped on that run's last `pipeline-ended`, as the
|
|
|
|
|
indexer keeps the candidate; the gate's `heads-replaced` drops nothing in the assigner.
|
|
|
|
|
- **A-202** (§31; principles 2 and 7) A pipeline's record and `pipeline-started` say their cause: an optional
|
|
|
|
|
`published` {artifact, version} set when a package's publish started it; a newer publish of the same artifact on
|
|
|
|
|
the same branch supersedes the running pipelines whose `published` names that artifact at an older version.
|
|
|
|
|
- **A-203** (design 46 approval mark §6, G §195, §424; principles 1, 7 and 8) The withheld path's forms: the tool
|
|
|
|
|
runner's announcement carries `fingerprint` (its own `MESH_FINGERPRINT`) beside `capabilities`; the node's record
|
|
|
|
|
gains `runner-capabilities` and `runner-fingerprint`, its merge into `capabilities` staying for placement; the
|
|
|
|
|
assignment half's per-node item gains `readings` and `fingerprint`, its digest over all of it, read from the node
|
|
|
|
|
record the assigner holds; the grants part follows the assignment half by `mesh-wants`' `revision` and its
|
|
|
|
|
`assignment-revision` event; its user list carries `withheld: [{module, subject, why}]`, and the seat `mesh-grants`'
|
|
|
|
|
verb `withheld` takes `{node}` and answers `{node, modules: [{module, subjects: [{subject, why}]}]}`.
|
|
|
|
|
- **A-204** (§498; principle 2) The assigner keeps which put waits it said in its own state on the bus, so a put
|
|
|
|
|
that ends while the assigner is stopped gets its `wait-ended` at the next start.
|
|
|
|
|
- **A-205** (§441, §195; principle 7) `grants-for` reads its candidate's catalog half through the catalog seat's
|
|
|
|
|
`revision`: for a run, with `group` `run-<id>` (the candidate's newest); for a source revision, with `branch` and a
|
|
|
|
|
new optional argument `source`, answering the branch's revision taken in from that source revision. It answers the
|
|
|
|
|
permissions the composed memberships gain and lose with the candidate's entries in place of the branch's newest.
|
|
|
|
|
- **A-206** (A-195, §65, §534, A-181; principles 3, 4 and 8) The runner's held pipelines are released by hand through
|
|
|
|
|
a seat verb `release` of `mesh-pipeline-runner` (class act, its hand act written first), beside `start` and
|
|
|
|
|
`ask-again`, its tool `runner_release`; the bound's expiry writes the finding `pipeline-waits` (scope `module`, id
|
|
|
|
|
`<branch>.<id>.<module>`); the wait's `on` gains the value `runner version`; its `clock-from` is the `build.ended`
|
|
|
|
|
of the awaited fingerprint, heard as A-181 says.
|
|
|
|
|
- **A-207** (§86, §81, §415, §71, §275, §335, §441; principles 1, 2 and 7) The runner keeps a state `recoveries`
|
|
|
|
|
(commit to why) written when it hears the mesh-delivery seat's `recovery-merged`, read at a pipeline's start and
|
|
|
|
|
resume; a recovery heard after its pipeline started asks nothing again. `widens` is computed from two reads: the
|
|
|
|
|
catalog seat's `revision` of the candidate against the branch's newest (the serving parts' entries and fingerprints,
|
|
|
|
|
found by holder from the seat list; the acting rules `step`, `on` and `bound` and the credentials the entries
|
|
|
|
|
declare), and the grants part's `grants-for` (the permissions); no other verb.
|
|
|
|
|
- **A-208** (ADR 0656, §558, §605, §16, §293, §600, §18, §104, §44-§46, A-93, A-190; principle 7) The indexer writes a
|
|
|
|
|
catalog entry's edges of kinds 1 to 6, as the catalog graph is its own; the long form of `invokes` is read by the
|
|
|
|
|
second reader release's `InvokeFields`, which G merges. Every watched branch's take-in uses the trunk's machinery,
|
|
|
|
|
per branch: its own pending revision (holding only that branch) and its own groups. `stepsVia` is open while the
|
|
|
|
|
entry's fingerprint is still in the branch's newest revision; `messageVia` while a pending entry names the merge or
|
|
|
|
|
a take-in of that commit runs.
|
|
|
|
|
- **A-209** (design 46 approval mark §13, §677, §73; principles 3 and 7) A digest in a key is escaped with mesh-sdk's
|
|
|
|
|
`keys.EscapeName`, the one escape form for every name in a key, in both gates: `<node>.act.<escaped digest>`. The
|
|
|
|
|
kind (a test's in-memory state accepting a key the bus refuses) is fixed where it lives: mesh-sdk's in-memory state
|
|
|
|
|
for tests refuses every key the bus would.
|
|
|
|
|
- **A-210** (§7, §428, A-126, A-131, ADR 0596; principles 3 and 7) A module that calls another module's tool or hears
|
|
|
|
|
its module events finds that module as the holder of the seat it holds, with `seatlist.HolderOf`, when it calls,
|
|
|
|
|
asking again after a failure and never stopping its start for it; a read of another module's bucket goes (each by
|
|
|
|
|
its own row). A tool's callers list names no module: it takes the holders of the seats `node-tool-runner` and
|
|
|
|
|
`mesh-healers` from the seat list when a call is checked, beside `operator`.
|
|
|
|
|
- **A-211** (A-204; principles 2 and 7) The assigner's said put waits live in a state of their own, `put-waits`
|
|
|
|
|
(history 1, key `<node>.<module>`, value the wait's id and the put), so no form is shared with §706's waits and the
|
|
|
|
|
record outlives a supersede.
|
|
|
|
|
- **A-212** (§47, §432, A-208; principle 8) An edge of kind 2 comes from a `needs` reference to another module's
|
|
|
|
|
artifact: that is what an artifact "fetches by reference at its start", so the referenced artifact is published
|
|
|
|
|
before the referring one delivers. Kind 5 goes to a design line (which acting steps give it, and between what).
|
|
|
|
|
- **A-213** (corrects A-86; §16, §354, §206) The indexer does ask node-build-go's `run` for its validation of a
|
|
|
|
|
revision before its take-in, as §16 says; A-86 holds only for `KeepInput`, which the indexer's `input` verb calls
|
|
|
|
|
for a run on request's asker. The run's input and job, what holds the pending revision meanwhile, and how a non-trunk
|
|
|
|
|
branch's pending revision and groups are made go to design lines.
|
|
|
|
|
- **A-214** (§366, §623; principle 7) `show` and `kept` read each store's fill through the bundle's state call
|
|
|
|
|
`mesh/state.info` (§623), as the forge module's read tool does; the runner's process writes nothing for it.
|
|
|
|
|
`pipeline-failed` takes scope `merge`, id the commit.
|
|
|
|
|
- **A-215** (§71, §275, §335, A-207; principles 3 and 7) For `widens`, the pipeline's own revision (the candidate) is
|
|
|
|
|
compared with the branch's newest revision: an acting rule widens when an entry's `Acts` gains a rule, or a rule's
|
|
|
|
|
`on` now names more, or its `bound` is longer; a credential widens when an entry's manifest names an own secret or
|
|
|
|
|
provision of a credential it did not name before; permissions come from `grants-for`.
|
|
|
|
|
- **A-216** (amends A-181; principles 2 and 7) The builder's `build.ended` stream, kept last per subject, has no age
|
|
|
|
|
bound, only a cap in bytes: one end per fingerprint is the record of what was built, so a module unchanged for any
|
|
|
|
|
time is still known built after a restart.
|
|
|
|
|
- **A-217** (§298, §300, A-167, A-132; principles 2 and 7) A want reverts when its fingerprint is one the module had
|
|
|
|
|
in an earlier assignment graph revision than the one it now runs from, by the revisions' own numbers; the running
|
|
|
|
|
manifest is the catalog entry of the fingerprint the node-engine seat's `running` names, read through the catalog
|
|
|
|
|
seat's `entry`, and `FormChanges` compares it with the want's entry.
|
|
|
|
|
- **A-218** (A-206, §696; principle 3) `pipeline-waits` is cleared when the node-engine seat's `running` says the
|
|
|
|
|
awaited runner fingerprint healthy; A-206's `runner version` holds over §696's wording.
|
|
|
|
|
- **A-219** (refines A-198; §677; principle 7, one form for each thing) Only `Act` and `ActDigest` move into mesh-sdk's
|
|
|
|
|
`go/operatorask`; the ask's types stay the generated seat contract's. The gate in `go/process` takes the operator
|
|
|
|
|
channel's calls (ask, read the warrant, record) as an interface its caller passes, which `operatorchannelclient`
|
|
|
|
|
implements over the generated types, so no form is copied and no import cycle arises. The seat client's
|
|
|
|
|
`wait: held` lives with `process.Conn`'s call, as there is no `go/seats`.
|
|
|
|
|
- **A-220** (§71, §441, A-167, A-207, A-215; principle 7) The serving parts `widens` compares are the holders of the
|
|
|
|
|
seats `mesh-pipeline-runner` (the runner), `mesh-catalog` (step detection), each step's own seat (the build seats
|
|
|
|
|
that run lint and tests) and `node-engine` (the composer, A-167), found by `seatlist.HolderOf`.
|
|
|
|
|
- **A-221** (§509, A-208; principle 8, one word per thing) On every forge message `branch` names the watched branch
|
|
|
|
|
the move changed, on `merged` as on `pushed`; a merged pull request's own branch is kept as `head` (a group is
|
|
|
|
|
known by its head branch); `pushed`'s head before is `before`.
|
|
|
|
|
- **A-222** (A-193, A-199, §350, A-77; principles 2 and 3) An adopted event whose handler fails is asked again by
|
|
|
|
|
the bus, not acknowledged; at its start the runner reads, for each run pipeline with no steps yet, its candidate's
|
|
|
|
|
revision through `revision`, so a placing lost while it was down is taken up. A run's rerun asks with the
|
|
|
|
|
candidate's catalog half. An unanswered drop is said `call-unanswered` on a five-minute bound key's expiry.
|
|
|
|
|
- **A-223** (corrects A-221; principle 8) A merged pull request's own branch is `head-branch`; `head` stays the head
|
|
|
|
|
commit, as everywhere in the forge messages.
|
|
|
|
|
- **A-224** (§677, A-219; principle 7; code shared between modules is in mesh-sdk) The approval gate is one package,
|
|
|
|
|
mesh-sdk `go/approval`: the tool runner's gate (`node-tools` `internal/approval`) moves there and both the tool
|
|
|
|
|
runner and `go/process`'s seat server use it, each passing the operator channel as an interface (A-219); no second
|
|
|
|
|
gate is written.
|
|
|
|
|
- **A-225** (A-173, §532; principles 2 and 7) The view keeps each repository's reach in its own state on the bus, so a
|
|
|
|
|
restart does not lose it; its history is the source revisions heard since its start, re-asked through `source` on
|
|
|
|
|
each `source-moved`, laid over the reach it kept.
|
|
|
|
|
- **A-226** (A-167, §354, §64, §63, A-174; principles 2 and 7) The composition step asks each node's
|
|
|
|
|
`compose-candidate` with the key the step's pipeline names: a run's candidate `run-<id>`, or for a branch pipeline
|
|
|
|
|
the branch's revision `<branch>.<revision>`, which the node-engine reads as it reads a candidate. It runs
|
|
|
|
|
`mesh-compose` once per node-engine fingerprint among the machines (the change's build where the change alters the
|
|
|
|
|
node-engine, §63), the program read from that fingerprint's catalog entry through `entry`, each run's request
|
|
|
|
|
joining the inputs of the machines on that fingerprint.
|
|
|
|
|
- **A-227** (withdraws A-221 and A-223; §714, §715) As design line §714 says, a merged message gains `base`, the
|
|
|
|
|
watched branch it landed on; `branch` stays the pull request's branch and `head` its head commit, as today;
|
|
|
|
|
`pushed` keeps `branch` for the branch pushed and gains `before`.
|
|
|
|
|
- **A-228** (A-219, A-224; principle 7) Everything the gate reads beyond itself crosses into mesh-sdk `go/approval` as
|
|
|
|
|
an interface in the gate's own terms, its caller translating from the generated contracts: the catalog's entries
|
|
|
|
|
(module, fingerprint, serves, manifest), a finding writer (raise and clear by kind and id), the seat holders (a
|
|
|
|
|
holder function), and the operator channel (ask, record, and claim with the warrant and the act). The gate's own
|
|
|
|
|
kept form `Kept` moves into `go/approval`, which `operatorchannelclient` re-exports.
|
|
|
|
|
- **A-229** (§708, §709; principle 7) As §709 says, a catalog entry's `requires` names every requirement as
|
|
|
|
|
`catalogue.Manifest.Wants` lists them, optional ones included; a reader that means "required, not optionally" (the
|
|
|
|
|
module graph's `Requirers`, the assigner's halves) tells the optional ones apart by the entry's manifest
|
|
|
|
|
(`IsOptional`).
|
|
|
|
|
- **A-230** (§554, §565, A-124; principle 7) A restore point's `Point` gains `names`, the bus names it took, one per
|
|
|
|
|
bus object as `Aside`'s; the recovery module fills it when it takes a point, and the grants part reads
|
|
|
|
|
`points[].names` and `asides[].names` from `kept-points`.
|
|
|
|
|
- **A-231** (§544, §601, A-163, A-170; principles 3 and 7) An asker names the queue it asks in its manifest's `invokes`
|
|
|
|
|
as `seat:<seat>.accept.<queue>`, read by one mesh-sdk `catalogue` helper that the validator, the indexer's kind-6
|
|
|
|
|
edge and the grants part share; every asker of a build seat gains that entry in G, so the named workers stand from
|
|
|
|
|
G's delivery and the purge finds nothing to remove.
|
|
|
|
|
- **A-232** (§712 with §600, A-163, A-170; principle 7) The validation run rides `accept.check.<asker>` with its kind
|
|
|
|
|
`run` in the body and the asker the indexer's seat name `mesh-catalog`, as every ask does; its id is the usual
|
|
|
|
|
form (`NewID`), and the revision's sequence and try number are kept in the pending value's `validation`. §712's
|
|
|
|
|
subject and id are read so.
|
|
|
|
|
- **A-233** (A-181, A-189; principle 7) mesh-sdk's `HearStream` gains a form that reads an age-kept stream whole from
|
|
|
|
|
its first message by an ordered consumer at every start, then follows the durable; the grants part grants that
|
|
|
|
|
ordered consumer on every heard seat kept stream, as it grants `STREAM.INFO`, with no manifest word.
|
|
|
|
|
- **A-234** (§711, ADR 0656 §6; principle 2) The indexer fills each catalog revision's `definitions` (the seat
|
|
|
|
|
definitions it was taken in with, by digest) when it keeps the revision, and the `acts` fill reads from them; until
|
|
|
|
|
then reading the trunk's from its `seat-definitions` state stands.
|
|
|
|
|
- **A-235** (A-201, A-174, §190, RN9; principles 1 and 7) The runner says `group-ended` with group `run-<id>` once every
|
|
|
|
|
pipeline it placed for the run has ended, as it says a group's end; the assigner drops its candidate graph on it, and
|
|
|
|
|
the indexer drops the run's candidate on it in place of counting members itself. The kept object's key stays the
|
|
|
|
|
seat's form `candidate.<group>.<heads>` with group `run-<id>`.
|
|
|
|
|
- **A-236** (§509, §714, §715, §11, A-227; principles 2 and 7) A `pushed` message's new head is `head`; the bridge
|
|
|
|
|
keeps each watched branch's last head written in its own state `heads` (key `branch.<owner>.<name>.<escaped
|
|
|
|
|
branch>`), `before` read from it and its start read comparing with it; `pushed` carries the same take-in inputs as
|
|
|
|
|
`merged`. For §715 the mesh-delivery seat's `groups` member gains `base` in the contract, which the gate fills and
|
|
|
|
|
the bridge reads.
|
|
|
|
|
- **A-237** (§712, §354, ADR 0666 §16, A-139; principle 7) A run's input is any size: the indexer keeps it in its state
|
|
|
|
|
`inputs` with the state's `-objects` store holding a large value (mesh-sdk's `stateobjects`), and serves it through
|
|
|
|
|
its `input` verb answered in chunks (`buscalls.SeatChunks`, a verb marked `chunks`); `RunInputBound` goes, and the
|
|
|
|
|
holder takes the input by that verb.
|
|
|
|
|
- **A-238** (§712; principle 7) A run ask may name no head: `RunJob.check` takes an empty `Heads` when the program
|
|
|
|
|
is named, and the holder lays an empty `MESH_RUN_HEADS`; the validation's program is built from the indexer's
|
|
|
|
|
entry alone.
|
|
|
|
|
- **A-239** (design 46 approval mark §6, H-21; principles 3 and 7) The node-engine's `composition` answer gains
|
|
|
|
|
`withheld` [{subject, why}] (the module's entry of the grants part's `withheld` for this node) and
|
|
|
|
|
`withheld-unknown`, the words "withheld unknown: the grants part does not answer" when the verb fails; its
|
|
|
|
|
manifest's `uses` gains `mesh-grants` beside the `invokes` of `seat:mesh-grants.withheld` H-21 added.
|
|
|
|
|
- **A-240** (§354, ADR 0596; principle 1) The assigner waits on its composition run's answer by hearing the build
|
|
|
|
|
seat's `step-ended` for that ask, never by reading the seat's step state.
|
|
|
|
|
- **A-241** (§712, A-234; principle 3) The validation's `seats` are the branch's revision's seat definitions (A-234)
|
|
|
|
|
with the merges' changed definitions laid over them, so a revision that touches no definition is still judged
|
|
|
|
|
against the whole seat list.
|
|
|
|
|
- **A-242** (§512, §186, §376, §378; principles 1, 2 and 7) The assigner's `difference` fills `Tiers` and each
|
|
|
|
|
change's `after` (the kind of edge that orders it), computed in its compare; the view orders nothing itself. A
|
|
|
|
|
`view_tiers` call for a source revision compares the kept assignment revision whose catalog for that branch is that
|
|
|
|
|
source revision with the revision kept before it. The view keeps a state `waits` (key owner, step, node, module)
|
|
|
|
|
written by its process from every part's `wait-held` and `wait-ended` it consumes, read by its own read tool.
|
|
|
|
|
- **A-243** (corrects A-226's joining; A-237, A-238; principle 7) The composition step runs one request per machine,
|
|
|
|
|
each carrying that machine's input; no inputs are joined. A-237 holds for every run's input (the assigner's and
|
|
|
|
|
`mesh-wants`' `input` too): any size, kept with an `-objects` store, answered in chunks. The composition run names
|
|
|
|
|
no head (A-238); its program is the node-engine fingerprint's entry (repository, commit, directory) with the
|
|
|
|
|
composer's package.
|
|
|
|
|
- **A-244** (§677, A-186, A-219; principles 7 and 8) `wait: held` travels as a bus header on the request, never as an
|
|
|
|
|
argument, so no verb's input and no act's digest changes; the holder's held answer is a reply field `held`
|
|
|
|
|
{asked, call} beside result, error and node. `process.Conn`'s seat call sends the header on every seat call and
|
|
|
|
|
waits for `gated-ended` only when the reply says `held`. A process holder applies the seat definition's
|
|
|
|
|
`needs-approval` alone (the definition `AnswerSeat` is given); it reads no catalog entry.
|
|
|
|
|
- **A-245** (§298, §368; principle 7) §298's order edges are held under the assigner's rule 7, as its acting waits
|
|
|
|
|
are; a change of the assigner's state forms bumps its manifest's version once, in the commit that changes them.
|
|
|
|
|
- **A-246** (§376, §498, A-211; principles 2 and 4) A dependent's delivery wait is kept in a state of its own,
|
|
|
|
|
`delivery-waits` (key the module, value the `wait-held` said), read by `assigner_waits` beside the others;
|
|
|
|
|
`assigner_release` {module, step: delivery} writes the hand-act log first and ends the wait `released`.
|
|
|
|
|
- **A-247** (§713, A-232; principles 1, 2 and 7) The pending value's `validation` gains `accepted` (the seq it was
|
|
|
|
|
accepted at), so a revision held for another indexer is never asked again; `validation` sits on the newest pending
|
|
|
|
|
value of the revision alone. The answer is read from the `step-ended` event's own output and output object, never
|
|
|
|
|
through the build seat's `steps`; the ask is put through the delivery SDK's `buildrun.Asker`.
|
|
|
|
|
- **A-248** (A-163, A-232; principle 8) `buildrun.Asker` gains the asker its subject names (the caller's seat name,
|
|
|
|
|
A-163), empty meaning the builder until the asker rename at the join; the ask's own `Asker` field is left as it is.
|
|
|
|
|
- **A-249** (A-237; principles 7 and 8) A bundle takes a chunked seat answer through its ordinary seat call: the tool
|
|
|
|
|
runner receives the chunks with `buscalls.SeatChunks` and hands the bundle the whole answer, so no bundle receives
|
|
|
|
|
chunks itself. mesh-build-go's `inputOf` calls the mesh-catalog seat's `input` that way and decodes that verb's
|
|
|
|
|
own answer form.
|
|
|
|
|
- **A-250** (§376; principles 1, 2 and 4) `assigner_delivered_again` writes the hand-act log, then an ask in the
|
|
|
|
|
assigner's own state `delivered-again` (key the module, value {version, by, why}) and answers "asked". The
|
|
|
|
|
assigner's process hears that write on its own state at once, says `version-delivered` again when every present
|
|
|
|
|
placing machine runs the version healthy and deletes the ask, else keeps it with its reason, read by
|
|
|
|
|
`assigner_waits`.
|
|
|
|
|
- **A-251** (§17, §383, §437; principle 8) The finding `branch-unprotected` has scope `merge`, id the owner,
|
|
|
|
|
repository and branch escaped as one key name (`<owner>~<repository>~<branch>`), severity warning, and that scope
|
|
|
|
|
and id as its subject.
|
|
|
|
|
- **A-252** (§354, A-167, A-174, A-226, A-243; principles 1, 2 and 7) The composition step's machines are the nodes
|
|
|
|
|
whose placement of the module names the step's branch in the seat's assignments (no branch read as the trunk); a
|
|
|
|
|
run on request on an unwatched branch takes the nodes placing the module on the trunk. Each request's cases and seats
|
|
|
|
|
come from the step's catalog revision through mesh-catalog's `revision` (each entry's manifest digest and verdict,
|
|
|
|
|
its `definitions`), depth compose, the one machine, one case `change`. A machine's node-engine build is what the
|
|
|
|
|
assigner keeps from the node-engine seat's own events, never read from the node-engine's bucket; where the step's
|
|
|
|
|
revision's node-engine entry differs from the trunk's, that build serves every machine. One run ask per machine.
|
|
|
|
|
- **A-253** (A-249; principle 8) The tool runner hands a bundle a chunked answer as the verb's own answer with the
|
|
|
|
|
whole file added as the member `file` (base64).
|
|
|
|
|
- **A-254** (§712, §354, A-240, A-247, ADR 0596; principles 1, 2 and 7) A build seat's `step-ended` of a run carries
|
|
|
|
|
the run's answer (its standard output's last line): inline as `output` up to the event bound, else as
|
|
|
|
|
`output-object`, the name of an object the build seat keeps, read through the seat's verb `output` answered in
|
|
|
|
|
chunks. Every build seat (`node-build-go`, `node-build-image`, `node-build-node`) says it the same way, from the
|
|
|
|
|
shared step runner; no asker reads the seat's step state.
|
|
|
|
|
- **A-255** (§677, A-77, A-244; principles 1, 7 and 8) The header is `x-wait: held`. A process holder's
|
|
|
|
|
`gate-unanswered` is a bound key with its time to live in the `approvals` state, as the tool runner's `bound` is,
|
|
|
|
|
never a clock wait. A process holder's act names no node, so two instances of the holder raise one ask.
|
|
|
|
|
- **A-256** (corrects A-251's separator; principle 8) The finding's id is the owner, repository and branch joined by
|
|
|
|
|
`/` and escaped as one key name (`keys.EscapeName`); a key holds no `~`.
|
|
|
|
|
- **A-257** (A-249, A-253, A-254; principles 7 and 8) The tool runner sends a bundle's answer of a verb marked
|
|
|
|
|
`chunks` in chunks, from the whole file the bundle answers in its member `file`, the mirror of A-249: no bundle
|
|
|
|
|
sends chunks itself.
|
|
|
|
|
- **A-258** (§298, A-210; principles 1 and 8) §298's "bus module" is the holder of the seat `mesh-broker`, and its
|
|
|
|
|
"`node-backup` holder" the holder of the seat `node-backup`, each read from the seat list as every holder is: the
|
|
|
|
|
assigner names no module.
|
|
|
|
|
- **A-259** (§298, A-245, §266, §268; principle 7) §298's three order edges are acting waits of the assigner, kept
|
|
|
|
|
in its state `waits` under `order.<node>.<module>.<part>` beside `acting.`, said as `wait-held` when the want is
|
|
|
|
|
held and `wait-ended` (ran, released, replaced) when it moves, with the step `placing`; `assigner_waits` reads
|
|
|
|
|
them and `assigner_release` releases them as it does the acting waits. No new mechanism.
|
|
|
|
|
- **A-260** (§298, ADR 0633 §1, A-181; principles 1 and 7) For §298's third edge the trunk's head is the highest
|
|
|
|
|
source revision (`Src`) among the trunk branch's module values the assigner holds; the wait ends when a
|
|
|
|
|
`take-in.taken` of the trunk branch with `source` at or above it is heard. The assigner consumes
|
|
|
|
|
`mesh-delivery-indexer.take-in.taken` (a `consumes` entry), heard as it hears `build.ended`; a wait still held
|
|
|
|
|
after a restart is said again as `wait-held` and ends at the next such take-in.
|
|
|
|
|
- **A-261** (A-252, A-234; principles 2 and 3) A composition request's `Seats` carry, for each (seat, digest) of the
|
|
|
|
|
step's catalog revision, the definition whose digest it is: from the revision's `definitions` once A-234 fills
|
|
|
|
|
them, until then from mesh-catalog's `seat-definitions` where the trunk's digest matches; a digest neither holds
|
|
|
|
|
ends the step `could not run`, naming the seat and the digest.
|
|
|
|
|
- **A-262** (§496; principles 1 and 7) The assigner says a running composition step's progress once a minute with a
|
|
|
|
|
ticker inside the running step, stopped at its end, as mesh-delivery-sdk's `steprun` says its own beat (pull.go);
|
|
|
|
|
no bound key and no new key form.
|
|
|
|
|
- **A-263** (§712, §676; principles 7 and 8) §676 writes `package` (the Go module its `go.mod` names) for every Go
|
|
|
|
|
artifact, a `bundle` too, since a bundle is built from that Go module; §712 reads it there.
|
|
|
|
|
- **A-264** (§677, §697, A-186; principle 7) The event `gated-ended`, the verb `approvals` and the by-caller form of
|
|
|
|
|
a marked verb are added in mesh-sdk's `seatdef.Resolve`, which the seat generator and every reader of a definition
|
|
|
|
|
(the seat list, the grants part, the validator, `AnswerSeat`) go through: one place, one definition for all; the
|
|
|
|
|
seat files stay as written.
|
|
|
|
|
- **A-265** (A-264, design 46 approval mark §20; principles 4 and 7) A-264 holds for every marked definition. Where a
|
|
|
|
|
tool bundle holds the seat (the login shell's `execute`), the tool runner, which already holds that bundle's gate,
|
|
|
|
|
answers the marked verb by caller and serves `approvals` for the seats its bundles hold, as `AnswerSeat` does for a
|
|
|
|
|
process; no holder changes and no mark moves.
|
|
|
|
|
- **A-266** (A-264, A-265, ADR 0132; principle 7) `approvals` is the gate's verb, served wherever a marked verb is:
|
|
|
|
|
`CanHold` and the validator's same rule ask no holder to name it in its claim's `serves` or its tools.
|
|
|
|
|
- **A-267** (§496, §481, §22, A-170; principle 7) The composition step's `step-progress` carries `asker` `runner`, the
|
|
|
|
|
one asker that sends the accepted kind `step` on `mesh-wants`; the asker rename after join 11 (A-163, A-170) reads
|
|
|
|
|
it from the accept subject's asker token instead.
|
|
|
|
|
- **A-268** (corrects A-263; §712, §676, §491; principle 7) §676's `package` stays for package artifacts only, since a
|
|
|
|
|
bundle's Go module named as a package collides under §491's package names when two modules share one `go.mod`.
|
|
|
|
|
§712's job names the indexer entry's repository, `path` and the revision's head, and the program's directory;
|
|
|
|
|
`mesh-build-go` reads the Go module from the `go.mod` it builds there, as it does for every build.
|
|
|
|
|
- **A-269** (§509, §714; principles 7 and 8) A `pushed` message's `head` stands where a `merged` message's `merge`
|
|
|
|
|
stands: pending refs, the newest load and the revision's head key on it alike.
|
|
|
|
|
- **A-270** (A-255, §677; principles 3 and 7) A holder's approvals state is declared with `key-ttl` beside §677's
|
|
|
|
|
48 hours and 64 MiB, since its bound keys `unanswered.<call>` need it; the validator refuses a holder of a marked
|
|
|
|
|
verb whose approvals state lacks it.
|
|
|
|
|
- **A-271** (A-265, §677; principle 7) The tool runner's `approvals` answer has the form of `AnswerSeat`'s, read from
|
|
|
|
|
the runner's own record of the calls its gate holds; it keeps no `call.` keys of its own for it.
|
|
|
|
|
- **A-272** (§677, ADR 0596; principle 1) The `GateChannel` over `process.Conn` asks and reads an ask only through
|
|
|
|
|
mesh-sdk's `operatorchannelclient` on the seat `operator-channel`, never through the router's bucket.
|
|
|
|
|
- **A-273** (corrects A-272; §700, A-74, A-89; principles 1 and 7) The `GateChannel` over `process.Conn` is §700's:
|
|
|
|
|
`operatorchannelclient.Client` given, as its `Record`, a get of the key under `<module>.` in the seat
|
|
|
|
|
`operator-channel`'s state `asks` (the bucket formed from the seat's holder on the seat list and `StateAsks`, A-74)
|
|
|
|
|
on the process's own connection; the verb `asks` stays as it answers. The ask is published by a new `go/process`
|
|
|
|
|
method that publishes on a seat's accept subject (`mesh.seat.<seat>.accept.<queue>.<caller>`), on the a3g line,
|
|
|
|
|
as `Emit` publishes an event.
|