Grants before code (249): the bus's machine is sent first when its composed user list moved (digest kept in node.sent_bus_users), then buckets are raised and memberships issued, then the rest is sent. A membership that fails holds back only its own machine; a failure that names none holds back all but the bus's machine (already sent). Grant failures are retried (ErrTryAgain in following.Upgraded).
One machine first (249): unless the module's policy is together, a plan sends the first machine (by name, among those heard from lately) and the rest only after its applied and current report; a first machine that fails, or is silent past the plan bound, stops the module's rollout with a note naming it.
A newer plan takes over (254): open plans of the same repository and branch are superseded, their unbuilt and built-but-unsent modules folded in; plans close <id>; an ended plan's note says what it built and never sent.
Merge-touched set (252): a changed path in a sibling of known module directories is that module's own when its module.json is among the changed paths.
The catalogue's upgraded announcement defers to an open plan still sending the module.
Migration 0058 (release_plan.branch, node.sent_bus_users). Note: the open hq ADR 0217 branch carries a 0057; it must be renumbered to land after this.
Independently reviewed; every must/should-fix addressed. Full suite with fresh postgres + NATS: all packages pass.
Implements ADR 0218.
- **Grants before code** (249): the bus's machine is sent first when its composed user list moved (digest kept in `node.sent_bus_users`), then buckets are raised and memberships issued, then the rest is sent. A membership that fails holds back only its own machine; a failure that names none holds back all but the bus's machine (already sent). Grant failures are retried (`ErrTryAgain` in `following.Upgraded`).
- **One machine first** (249): unless the module's policy is `together`, a plan sends the first machine (by name, among those heard from lately) and the rest only after its applied and current report; a first machine that fails, or is silent past the plan bound, stops the module's rollout with a note naming it.
- **A newer plan takes over** (254): open plans of the same repository and branch are superseded, their unbuilt and built-but-unsent modules folded in; `plans close <id>`; an ended plan's note says what it built and never sent.
- **Merge-touched set** (252): a changed path in a sibling of known module directories is that module's own when its `module.json` is among the changed paths.
- The catalogue's `upgraded` announcement defers to an open plan still sending the module.
- Migration **0058** (`release_plan.branch`, `node.sent_bus_users`). Note: the open hq ADR 0217 branch carries a 0057; it must be renumbered to land after this.
Independently reviewed; every must/should-fix addressed. Full suite with fresh postgres + NATS: all packages pass.
A merge adding a module the mesh has not registered rebuilt every module
built from the repository. A path under a directory known to hold modules
belongs to that module when its module.json is among the changed files.
A module's new state reached every machine before the permissions to use
it, which came only with a later push. Memberships and buckets now go
before declarations, the machine holding mesh-broker goes first when its
user list must change, and a grant that fails sends nothing and is an
error so the rollout is retried.
A plan sent every machine running a module at once, ignoring the module's
upgrade policy. Unless the policy says together, the first machine by name
is sent, recorded in the plan, and the rest follow only once its report
after the send says it applied; a failed first machine stops the plan.
A merge planned without looking at open plans, so two plans worked the
same modules and a stuck plan stayed open for ever. The newer plan folds
in what older plans of the same repository and branch had not built or
sent, and closes them as superseded. A person can close a stuck plan by
id with `plans close <id>`.
The catalogue's upgrade announcement sent every machine one after another
without waiting for any to apply, beside the plan that now sends one
machine first. A module an open plan has not finished sending is the
plan's to roll out.
Grants first could hold back the very declaration that lets the controller
issue them. The holder now goes first, then buckets and memberships, then
the rest; a membership that fails holds back only its own machine, and an
announcement whose send stopped at its grants is asked again. Whether the
holder must go first is read from a digest of the user list it was last
sent, not its whole declaration. Migration renumbered to 0058.
A first machine that does not report within the bound now stops the
module's rollout, naming it. The first machine is the first by name heard
from lately; reports are judged by what the store says was last sent. A
plan that ends says what it built and never sent, and a failed send's
error is kept in the plan's note.
build-agent keeps data (ADR 0233): what it holds is backed up before it moves
route-proxy provides route: its consumers are sent again after it
route-proxy keeps data (ADR 0233): what it holds is backed up before it moves
Transitions
2026-10-06 23:05 (new) → proposed (announced): novox/mesh-controller#54 merged; its head was not heard by this owner, so it is made from the forge's word
2026-10-06 23:05 proposed → held (merged-unchecked): merged without a passing check — a verdict known with it is taken first: only a person decides that it goes on
The commit's note under refs/notes/mesh-plan keeps every transition: git log --notes=mesh-plan.
<!-- mesh-delivery:view -->
**Delivery** `novox/mesh-controller@bdfbd0254fa5` — **held** since 2026-10-06T23:05:28Z
Held for a person: merged without a passing check: only a person decides that it goes on — `mesh-delivery.release` with why lets it go on.
**Delivery plan** — builds build-agent, mesh-controller, route-proxy → ace, g14, novox, shanks; no bus step
- tier 0: mesh-controller
- tier 1: build-agent
- tier 2: route-proxy
- ace: receives build-agent, route-proxy
- g14: receives build-agent
- novox: receives mesh-controller, build-agent, route-proxy
- shanks: receives build-agent
- build-agent keeps data (ADR 0233): what it holds is backed up before it moves
- route-proxy provides route: its consumers are sent again after it
- route-proxy keeps data (ADR 0233): what it holds is backed up before it moves
**Transitions**
- 2026-10-06 23:05 (new) → proposed (announced): novox/mesh-controller#54 merged; its head was not heard by this owner, so it is made from the forge's word
- 2026-10-06 23:05 proposed → held (merged-unchecked): merged without a passing check — a verdict known with it is taken first: only a person decides that it goes on
The commit's note under `refs/notes/mesh-plan` keeps every transition: `git log --notes=mesh-plan`.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Implements ADR 0218.
node.sent_bus_users), then buckets are raised and memberships issued, then the rest is sent. A membership that fails holds back only its own machine; a failure that names none holds back all but the bus's machine (already sent). Grant failures are retried (ErrTryAgaininfollowing.Upgraded).together, a plan sends the first machine (by name, among those heard from lately) and the rest only after its applied and current report; a first machine that fails, or is silent past the plan bound, stops the module's rollout with a note naming it.plans close <id>; an ended plan's note says what it built and never sent.module.jsonis among the changed paths.upgradedannouncement defers to an open plan still sending the module.release_plan.branch,node.sent_bus_users). Note: the open hq ADR 0217 branch carries a 0057; it must be renumbered to land after this.Independently reviewed; every must/should-fix addressed. Full suite with fresh postgres + NATS: all packages pass.
Delivery
novox/mesh-controller@bdfbd0254fa5— held since 2026-10-06T23:05:28ZHeld for a person: merged without a passing check: only a person decides that it goes on —
mesh-delivery.releasewith why lets it go on.Delivery plan — builds build-agent, mesh-controller, route-proxy → ace, g14, novox, shanks; no bus step
Transitions
The commit's note under
refs/notes/mesh-plankeeps every transition:git log --notes=mesh-plan.