Compare commits
1
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
506d00cf74 |
+10
-8
@@ -305,17 +305,13 @@ and the operator act. **Recorded by** the controller's `identity` and `licences`
|
|||||||
**Purpose.** To take one commit from its pull request to every node that should run it, and to put it
|
**Purpose.** To take one commit from its pull request to every node that should run it, and to put it
|
||||||
back when it fails. **Recorded by** the `mesh-delivery` module (deliveries) and the controller (the
|
back when it fails. **Recorded by** the `mesh-delivery` module (deliveries) and the controller (the
|
||||||
planner, the walk). **Downstream of** Module, Core, Health and repair and Data.
|
planner, the walk). **Downstream of** Module, Core, Health and repair and Data.
|
||||||
**Decided by** ADR 0162, 0218, 0236, 0237, 0238, 0239, 0250, 0267, 0270, 0276, 0323.
|
**Decided by** ADR 0162, 0218, 0236, 0237, 0238, 0239, 0250, 0267, 0270, 0276.
|
||||||
**Uses:** module, node, declaration and send (Placement), health (Health and repair), person.
|
**Uses:** module, node, declaration and send (Placement), health (Health and repair), person.
|
||||||
|
|
||||||
- **merge check** — the two statuses a pull request carries before it may merge: the **merge gate**
|
- **merge check** — the two statuses a pull request carries before it may merge: the **merge gate**
|
||||||
(`mesh/merge-gate`, the build seat's composed check of the modules the change touches) and the
|
(`mesh/merge-gate`, the build seat's composed check of the modules the change touches) and the
|
||||||
**repository check** (`mesh/repo-check`, the repository's own `merge-check.sh`)
|
**repository check** (`mesh/repo-check`, the repository's own `merge-check.sh`)
|
||||||
(ADR 0238). Both judge the merge of the pull request's head into a named **trunk commit**, made in the
|
(ADR 0238).
|
||||||
build seat's own clone and never pushed (ADR 0323).
|
|
||||||
- **trunk commit** — the commit of the trunk a merge check's verdict was judged against: the trunk's head when
|
|
||||||
the build seat cloned it. The verdict holds for that commit only, and goes out of date when the trunk moves
|
|
||||||
(ADR 0323).
|
|
||||||
- **build seat** — the seat whose holder builds modules, `node-build-agent`; its holder on a node is the
|
- **build seat** — the seat whose holder builds modules, `node-build-agent`; its holder on a node is the
|
||||||
**builder**. Any node may hold the seat, so there is no build node by nature
|
**builder**. Any node may hold the seat, so there is no build node by nature
|
||||||
(ADR 0237).
|
(ADR 0237).
|
||||||
@@ -391,8 +387,14 @@ planner, the walk). **Downstream of** Module, Core, Health and repair and Data.
|
|||||||
Not a *core component* (ADR 0236's controller, node-engine, tool runner and bus, each with a health probe):
|
Not a *core component* (ADR 0236's controller, node-engine, tool runner and bus, each with a health probe):
|
||||||
the core modules add mesh-delivery and the resolver.
|
the core modules add mesh-delivery and the resolver.
|
||||||
- **delivery time** — from a delivery's merge to every node of its deploy plan that is heard from running its
|
- **delivery time** — from a delivery's merge to every node of its deploy plan that is heard from running its
|
||||||
modules' builds and reporting them healthy. Its **delivery budget** is what it is held to: five minutes for
|
modules' builds and reporting them healthy. Its **delivery budget** is what it is held to: three minutes for
|
||||||
a leaf module, ten for a core module (ADR 0282). Not the walk's time, which ends at the send.
|
a leaf module (ADR 0304), ten for a core module (ADR 0282). Not the walk's time, which ends at the send. A
|
||||||
|
measure inside the fix budget, not the operator's target (ADR 0313).
|
||||||
|
- **fix time** — from an issue's first move to `fixing` to the moment the last of its fixes is delivered: the
|
||||||
|
operator's measure of a fix, the agent's work, the review and the checks included, the delivery time its last
|
||||||
|
part. Its **fix budget** is what it is held to: five minutes for a leaf module, ten for a core module, counted
|
||||||
|
from the move to `fixing`; an issue whose fixes move no module has none (ADR 0313). Not the delivery time,
|
||||||
|
which starts at the merge.
|
||||||
- **release** — a person's word that a held delivery goes on; the verb `mesh-delivery.release`. Used in
|
- **release** — a person's word that a held delivery goes on; the verb `mesh-delivery.release`. Used in
|
||||||
this sense only.
|
this sense only.
|
||||||
- **rollback** — putting a node back on the build it ran before, by something other than the build being
|
- **rollback** — putting a node back on the build it ran before, by something other than the build being
|
||||||
|
|||||||
@@ -4,7 +4,6 @@ status: in-progress
|
|||||||
code: [mesh-controller, mesh-host, mesh-tools, mesh-catalog, mesh-sdk, mesh-lab]
|
code: [mesh-controller, mesh-host, mesh-tools, mesh-catalog, mesh-sdk, mesh-lab]
|
||||||
updated: 2026-10-12
|
updated: 2026-10-12
|
||||||
decisions:
|
decisions:
|
||||||
- "ADR 0323"
|
|
||||||
- "ADR 0314"
|
- "ADR 0314"
|
||||||
- "ADR 0293"
|
- "ADR 0293"
|
||||||
- "ADR 0289"
|
- "ADR 0289"
|
||||||
@@ -678,19 +677,6 @@ what is not an ordinary send, and the verdict — posted on the pull request. Th
|
|||||||
a state machine, kept, followed by the release and written to the commit as a note; which parts are built
|
a state machine, kept, followed by the release and written to the commit as a note; which parts are built
|
||||||
is Phase 5's.
|
is Phase 5's.
|
||||||
|
|
||||||
Revision, ADR 0323 (2026-10-12). **The gate judges what merging makes, not the head.** The build seat takes
|
|
||||||
the trunk the pull request merges into, its head at that moment as the check's **trunk commit**, and makes in
|
|
||||||
its own clone the merge of the head into it, as the forge's default merge would; both layers judge that
|
|
||||||
merge, and a head that does not merge cleanly fails, naming the files in conflict. The merge is only checked:
|
|
||||||
never pushed, never registered. The verdict names the head and the trunk commit in both statuses' words
|
|
||||||
("head … merged into trunk …"), in mesh-delivery's `checks` and `show` and in the kept delivery plan, and
|
|
||||||
names the commits of the other repositories the check read; their move is issue 568's question. When the
|
|
||||||
trunk moves, the forge's holder puts both statuses of every open pull request into it back to pending with
|
|
||||||
the reason and runs nothing; the merge tool refuses a verdict whose trunk commit is not the trunk's head,
|
|
||||||
asks that head's check once, says how long the last check of the repository took, and never merges by
|
|
||||||
itself (checked by the builder's `TestReplay341`, replayed as R341, and the forge module's `trunk` and
|
|
||||||
`guard` tests).
|
|
||||||
|
|
||||||
**The replays.** mesh-lab carries a scripted scenario for each core incident, asserting the rule's
|
**The replays.** mesh-lab carries a scripted scenario for each core incident, asserting the rule's
|
||||||
outcome, run on every merge to mesh-controller, `mesh-host` and mesh-tools:
|
outcome, run on every merge to mesh-controller, `mesh-host` and mesh-tools:
|
||||||
|
|
||||||
|
|||||||
@@ -4,7 +4,6 @@ status: in-progress
|
|||||||
code: [mesh-controller, mesh-catalog modules/mesh-delivery]
|
code: [mesh-controller, mesh-catalog modules/mesh-delivery]
|
||||||
updated: 2026-10-12
|
updated: 2026-10-12
|
||||||
decisions:
|
decisions:
|
||||||
- "ADR 0323"
|
|
||||||
- "ADR 0313"
|
- "ADR 0313"
|
||||||
- "ADR 0306"
|
- "ADR 0306"
|
||||||
- "ADR 0299"
|
- "ADR 0299"
|
||||||
@@ -82,7 +81,7 @@ allows.
|
|||||||
|
|
||||||
| State | Means | Bound | H2 after the bound |
|
| State | Means | Bound | H2 after the bound |
|
||||||
|---|---|---|---|
|
|---|---|---|---|
|
||||||
| proposed | a head was announced and is being checked | 1 hour from when its check is asked; none while its verdict is out of date and no check is asked | nothing: the check's own watchdog (S6) speaks |
|
| proposed | a head was announced and is being checked | 1 hour | nothing: the check's own watchdog (S6) speaks |
|
||||||
| checked | a verdict arrived | 1 minute | nothing: it is decided at once |
|
| checked | a verdict arrived | 1 minute | nothing: it is decided at once |
|
||||||
| ready | it passed; it waits to be merged | none | — |
|
| ready | it passed; it waits to be merged | none | — |
|
||||||
| rejected | it failed its check | none | — |
|
| rejected | it failed its check | none | — |
|
||||||
@@ -91,32 +90,7 @@ allows.
|
|||||||
| delivering | its walk runs; its builds are asked and registered tier by tier | 2 hours | `delivered`, `failed` or `superseded`, as the walk's record says |
|
| delivering | its walk runs; its builds are asked and registered tier by tier | 2 hours | `delivered`, `failed` or `superseded`, as the walk's record says |
|
||||||
| delivered, failed, superseded, stopped, retired, covered | final | — | — |
|
| delivered, failed, superseded, stopped, retired, covered | final | — | — |
|
||||||
|
|
||||||
**A verdict holds for one trunk commit** (ADR 0323). The check judges the head merged into the trunk's head
|
The transitions are those of ADR 0239 decision 2 and ADR 0270. A delivery that is
|
||||||
at the moment the build seat clones it, the **trunk commit**, and the verdict names both. When another merge
|
|
||||||
moves the trunk, a `ready` delivery goes back to `proposed` on the observed event `trunk moved`, with both
|
|
||||||
commits in the transition's reason; a `rejected` one stays `rejected`, its statuses saying the verdict is out
|
|
||||||
of date. Nothing is asked for it: a recheck, a new head or the merge tool asks the check again. The row from
|
|
||||||
`proposed` to `checked` takes only a verdict that names the trunk's head as its trunk commit, so a verdict for
|
|
||||||
an older trunk is kept and shown and does not count, and the rows reach a fixed point. Checked by
|
|
||||||
mesh-delivery's `TestATrunkMoveSendsAReadyDeliveryBackToProposed` and the table's own walk.
|
|
||||||
|
|
||||||
What this leaves as it is, said so nobody reads more into it:
|
|
||||||
|
|
||||||
- **mesh-delivery's trunk head is the last merge it heard** into that trunk while the delivery was open. A push
|
|
||||||
to the trunk that is not a merge it hears does not move it; the forge's holder, which reads the branch, and
|
|
||||||
the merge tool, which compares commits when asked, still catch it.
|
|
||||||
- **A verdict that names no trunk commit**, from a build seat older than ADR 0323, counts in mesh-delivery as it
|
|
||||||
did: such a delivery stays `ready`. The forge reads the same verdict out of date once its trunk moves, and the
|
|
||||||
merge tool refuses it and asks the check. The two agree once the head is judged again.
|
|
||||||
- **A verdict no build judges** (a change that touches no module, in a repository with no `merge-check.sh` or
|
|
||||||
not the mesh's) names the base branch's head the forge announced with the head as its trunk commit.
|
|
||||||
- **In a busy repository the merge tool can refuse, ask, and refuse again**: another merge may move the trunk
|
|
||||||
while the asked check runs, and the new verdict is then out of date too. Each refusal asks once more; the
|
|
||||||
merge goes through once a check finishes before the next merge.
|
|
||||||
- **A check that was asked and never answers** is listed by `stalled` an hour after the ask, and is asked again
|
|
||||||
with `mesh-delivery.recheck`, which the merge tool's refusal names.
|
|
||||||
|
|
||||||
The transitions are those of ADR 0239 decision 2, ADR 0270 and ADR 0323. A delivery that is
|
|
||||||
merged while not `ready` goes to `held`. Its check did not pass, and only a person decides that it goes on. A
|
merged while not `ready` goes to `held`. Its check did not pass, and only a person decides that it goes on. A
|
||||||
delivery merged with no walk answering it within ten minutes is held too, with the true reason, and listed by
|
delivery merged with no walk answering it within ten minutes is held too, with the true reason, and listed by
|
||||||
`stalled` at once. Nothing waits silently.
|
`stalled` at once. Nothing waits silently.
|
||||||
@@ -334,15 +308,9 @@ only once it is built.
|
|||||||
first, then *built by* and *version skew*, then *engine before controller*. The pair shows the rule that
|
first, then *built by* and *version skew*, then *engine before controller*. The pair shows the rule that
|
||||||
won and the rules it won over. Rules of one rank both ways are a contradiction. The group is `rejected`,
|
won and the rules it won over. Rules of one rank both ways are a contradiction. The group is `rejected`,
|
||||||
and the reason names both members, both rules and the `after:` line that would settle it.
|
and the reason names both members, both rules and the `after:` line that would settle it.
|
||||||
- **Check**: the members' heads composed together, one gate over every machine with all their definitions,
|
- **Check**: the members' heads composed together, one gate over every machine with all their definitions. It
|
||||||
each head merged into its own trunk's head first and named with that trunk commit (ADR 0323). It is asked
|
is asked by mesh-delivery through `delivery-check` when the group forms or a member's head moves, and
|
||||||
by mesh-delivery through `delivery-check` when the group forms or a member's head moves, and posted on
|
posted on every member's head as `mesh/delivery-group`.
|
||||||
every member's head as `mesh/delivery-group`. A member rebased or pushed is a new head with its own check:
|
|
||||||
it takes its old head's place in the group, even once the group is delivering, and the composed check runs
|
|
||||||
again for the new heads instead of holding the group. A merge into a member's trunk that is not one of the
|
|
||||||
group's members puts the composed check out of date: the group reads `checking` with the reason, and the
|
|
||||||
composed check runs again once a member is judged again. Checked by mesh-delivery's
|
|
||||||
`TestAGroupsComposedCheckGoesOutOfDateOnAMergeThatIsNotItsMember` and `TestARebasedMemberIsComposedAgainNotHeld`.
|
|
||||||
- **Delivering**: in order. A member waits in `published` until the one before is `delivered` or `covered`.
|
- **Delivering**: in order. A member waits in `published` until the one before is `delivered` or `covered`.
|
||||||
A member published while its group's composed check is asked and not answered waits there for the answer;
|
A member published while its group's composed check is asked and not answered waits there for the answer;
|
||||||
one held because that check had not passed is *lifted* back to `published` once it passes or warns for the
|
one held because that check had not passed is *lifted* back to `published` once it passes or warns for the
|
||||||
|
|||||||
Reference in New Issue
Block a user