diff --git a/03-DESIGN/01-to-be/47-delivery-from-commit-to-delivered.md b/03-DESIGN/01-to-be/47-delivery-from-commit-to-delivered.md index 1a9b694a..cd0c6325 100644 --- a/03-DESIGN/01-to-be/47-delivery-from-commit-to-delivered.md +++ b/03-DESIGN/01-to-be/47-delivery-from-commit-to-delivered.md @@ -4,6 +4,7 @@ status: in-progress code: [mesh-controller, mesh-catalog modules/mesh-delivery] updated: 2026-10-11 decisions: + - "ADR 0299" - "ADR 0298" - "ADR 0282" - "ADR 0276" @@ -143,7 +144,8 @@ controller's `plan-moved` event, never inferred from time. - **The ends.** A walk done ends every delivery it answers: `delivered` for its own commits, `covered` for an earlier merge of a repository it carried later, naming that merge. A walk that failed fails its own commits' deliveries and marks none delivered; each earlier merge it answered is then walked on its own - commit, the newest first, one walk each, until one is delivered. A walk stopped stops them all. + commit, the newest first, one walk each, until one is delivered. A walk stopped stops every delivery whose + merge it walks again nowhere (below). - **A group inside a walk.** The pairs of a delivery group's order (ADR 0249) are edges of the walk's tiers beside the module graph. mesh-delivery gives a walk its word only when every delivery it carries is at its turn. @@ -160,6 +162,32 @@ controller's `plan-moved` event, never inferred from time. answers within ten minutes is held with the true reason (the open walks of its repository and that none names its merge, or that the controller holds none) and listed by `stalled` at once. + +## A stop on a shared walk + +*2026-10-11, by ADR 0299 (issue 459).* + +One walk carries every merge of its batch, so ending a walk for one delivery ends it for every other +delivery on it. A stop therefore ends only the change it is for: + +- **A group's stop.** When a member after a failed one is stopped and its walk is open, mesh-delivery asks + `delivery-stop` for that walk with the stopped members' merges to leave out, every member the same pass + stops on that walk in one ask. The controller ends the walk, said as stopped, and puts every other merge it + answered into a fresh batch, its window already closed, which is cut by the usual rules. +- **A merge that contains a stopped merge.** A later merge of the stopped merge's repository and branch + contains it, and cannot be walked without delivering it: it is left out too, and its delivery ends + `stopped`, naming the stopped merge it contains. An earlier merge of that repository is walked again at its + own commit. +- **The walk's record.** The stopped walk names the batch that walks its merges again and every merge it left + out. A delivery whose merge is walked again goes from `delivering` back to `published` (the row `rewalk`), or + stays `published`, and follows the fresh walk once it is cut. A delivery whose merge was left out, and every + delivery on a walk stopped whole, ends `stopped`, naming the walk and the stop. +- **A person's stop.** `stop` of a delivery whose open walk carries other deliveries does nothing at first: it + answers with each of them, which of them contain this merge and end either way, and two ways given with + `way`: `again` (the walk ended and the others walked again without this merge) or `walk` (the whole walk + stopped, every delivery on it with it). A delivery alone on its walk is stopped at once. +- **What it does not do.** A merge of the same repository heard after the stop contains the stopped merge and + delivers it when walked: holding a merged change back for good is a revert's job. ## The delivery budget *Decided 2026-10-10 by ADR 0282. @@ -231,7 +259,8 @@ only once it is built. 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 heads that merged and its own walk is still open (ADR 0270). -- **A failed member**: the members after it are `stopped`, naming it. The members before it stay delivered. +- **A failed member**: the members after it are `stopped`, naming it, and each one's merge is left out of its + walk while the walk's other merges are walked again (ADR 0299). The members before it stay delivered. Its own builds were put back at its gate. A group's state is derived from its members and its composed check, and is shown, never stored apart from @@ -270,12 +299,13 @@ In this order, each by its owner: | `stalled` | every delivery held past its bound, with the transition H2 may take, and every waiting walk no live delivery holds | | `recheck` | a rejected or ready delivery back to proposed, with why | | `release` | a held delivery to delivering, with why: a person's word | -| `stop` | any delivery not final to stopped, with why; its walk is ended through the controller | +| `stop` | any delivery not final to stopped, with why; its walk is ended through the controller. On a walk that carries other deliveries it first answers what ending the walk would take down, and acts on `way`: `again` or `walk` (ADR 0299) | | `close` | H2's only verb: the transition the table names for a stalled delivery, refused otherwise | | `retire-history` | held history to retired, with why: one by id, refused when the rule does not take it, or every held one, answering how many and naming those it left; `dry` changes nothing | **The controller's verbs for it** (on the mesh-controller seat): `delivery-plan`, `delivery-order`, -`delivery-check` (a group's heads composed, or one head checked again), `deliver`, `delivery-stop`, +`delivery-check` (a group's heads composed, or one head checked again), `deliver`, `delivery-stop` (which +takes the merges to leave out and walks the walk's other merges again without them, ADR 0299), `delivery-walks`. A person has `plans go --why`, which does what `deliver` does under their name and is recorded as a hand act. The controller says every walk it keeps as `plan-moved`, from a verb's command too.