hq ADR 0276 (merges are assembled in a rolling window, and each batch is delivered by one walk), issue 362 (two merges seconds apart left their delivery waiting for a person). The controller's side; mesh-delivery's side is novox/mesh-catalog#171, whose wire this follows.
What changes
The merge window. A merge into a branch a module follows joins the open batch instead of opening a walk. Each merge restarts the window; it closes when no merge came for merge-window (90 s) or at merge-window-at-most (10 min) after the batch's first merge. The settings are the controller's (module.json declares both, written to ${dir:mesh-state}/merge-window.json, read at every look, so a change needs no restart).
Kept in the store. Migration 0089 adds batched_merge (every merge heard, its times, the forge's announcement, the batch or walk answering it; keyed by repository and commit, so a merge is never doubled) and release_plan.commits. The batch itself is a plan record in the state assembling or queued; cut, it keeps its id and is building. A restarted controller resumes the window where it stood. The controller has no consolidated schema file: a fresh install runs the numbered migrations, so the migration is both.
One walk per batch. Per repository the latest merge of its branch, planned with every file the batch's merges of it changed; one plan across repositories, Commits naming each repository's commit, built at the branch, which holds them. ADR 0267's build sources work per repository unchanged (movesOfMerge is the old merge handler's body).
One walk at a time. A batch is cut only when no started walk is open; merges during a walk join the next batch (queued, batch.behind). A started walk is never superseded. A walk still waiting for mesh-delivery's word is folded into the next batch's walk (superseded, delivery.taken_over_by), its unbuilt modules planned there. ADR 0218 decision 3's supersession and the issue 349 rule are gone (supersededBy, laterOnTheBranch).
The controller's own path (decided during the build, 2026-10-10): a merge touching a module whose walk waits for nobody's word never shares a batch with one that waits for mesh-delivery's. It gets a batch of its own (batch.own) with its own window; the catalogue batch cuts by the normal rules and queues behind the own-path walk. An own-path walk being cut folds no waiting catalogue walk: its merges are batched again behind the own-path walk (rebatchWaiting), the waiting walk naming that batch in taken_over_by. No catalogue delivery skips its turn.
A late merge (heard after a later merge of its branch was put in a walk) is answered by that walk when it builds everything the merge moves: the batch of its kind, the open walk, or a done walk, which then names it at once. Otherwise it joins the next batch (a narrowing of decision 4: a done walk that never built a module the late merge moved does not cover it).
A failed walk marks nothing delivered; each merge it carried in a later commit is walked alone on its own commit (delivery.alone), newest first, one walk each; the first done answers the older ones (covered). A stopped walk, or one stopped or closed by hand, starts no search.
A delivery group inside a walk. Merges of two repositories or more from one head branch name are a group; orderOf (ADR 0249, unchanged) gives the pairs, read with the after: lines from the merge's body (link.SourceMoved gains number and body); each pair becomes group-order edges, which order tiers and gate as built-by does.
Shown.plans lists the batches first: assembling: 13 s left (at the latest 00:31:09); grouped: novox/mesh-catalog@48bda475 (answers 553b7191), novox/mesh-controller@a6bc0931; plan not yet calculated, or queued behind plan-…; an own-path batch says (on the controller's own path). Every save is plan-moved; delivery-walks answers the batches too.
Bounds. S18: a batch still assembling a minute past its maximum with no walk open. S19: a batch queued behind an open walk past that walk's bound (its repository's tier bound times its tiers), naming the walk. S16 now names every merge a waiting walk answers, not the commit a supersession may have ended. The catch-up of missed merges skips a merge already kept in a batch.
Wire (with mesh-catalog#171)
Inside the walk record's delivery object:
merges: [{"repository","commit","carried"?}], every merge the walk or batch answers; carried is the later commit of its repository that carries it, omitted for the walk's own commit.
taken_over_by: on a walk folded before it started; its note also begins superseded at tier N by plan-X (, as the PR's fallback reads. It can name a batch (state queued/assembling), which keeps its id when cut.
batch: {"closes_at","at_most","behind"?,"own"?} while the record is a batch (stateassembling or queued).
alone: on a walk of one merge on its own commit after a failed walk.
Top level: commits[{"repository","branch","commit","merged"}]; repository/commit keep the newest merge's.
A mesh-delivery that predates this reads the top-level repository/commit as before and ignores the rest: an earlier merge of a repository is not linked and is held after ten minutes, and it would read a record in assembling as a walk of unknown state. Roll out mesh-delivery (#171) first. It is merged as d2af46b and is the build of mesh-delivery the mesh holds on novox.
Tests
batches_test.go: two merges 18 s apart → one walk at the later commit naming both, built at the branch; three repositories in one window → one walk; a merge at second 80 restarts the window; the maximum closes a busy one; plans and plan-moved show the assembling batch; a merge during a walk joins the next batch and the started walk is never superseded; a waiting walk is folded, and not let go beside a started one; a late merge answered by the later walk, or the next batch when that walk never built what it moves, in a one-module repository too; the catch-up keeps what a cut made history; a failed walk walks its earlier merges alone at their own commits, stops at the first delivered, refuses a retry, and a stopped one starts no search; a group's order becomes tiers (none without a group); the batch survives a restart and a redelivered merge is not doubled; the window settings; a removed file is the last merge's word; a controller merge and catalogue merges in one window are two batches, the catalogue's walk waits for its word and is batched again behind the controller's walk, and no catalogue module is asked without the word; S16 names the merges. S18 and S19 are in the signals table, raised past their bounds and not before.
Mutation pass (each part removed, a named test fails): no path union, every merge a new batch, the window from the first merge, no maximum, no one-at-a-time, no fold, no search, no covering, no group edges, batch not listed, stopped walk searched, done walk answers nothing, answered despite unbuilt modules, S16 naming one commit, latest by arrival, folded walk left open, no stored batch, late merge read as history, cut reading history, letGo beside a started walk, retry after the search, removed by any merge, nothing owed, catch-up ignoring the record, a walk alone at the branch, a batch walk pinned, own path never, own batch folding the waiting walk, one batch for both kinds — all killed. Returning false for the late merge's batch case is equivalent (the open batch is the one it joins anyway).
After review
An independent review found two blockers, now fixed:
A late merge was dropped. A merge heard after a later merge of its branch was cut read as history: the cut marks its modules seen. hearMerge and the catch-up now judge it by the record. A merge that touches a held module, on a branch the controller keeps merges of, made since its first kept merge on that branch (less mergeGrace), is kept (owedLate, owedToTheRecord).
What gets built. A batch's walk builds at the branch, which holds every commit it carries. Only a walk alone is built on its own commit, as decision 3 says. A walk alone therefore records no build source, because the builder records one only at the trunk head.
Also fixed after review: deliver refuses while another started walk is open; plans retry refuses while any walk is open and once a failed walk's merges were moved to the search; Plan.CommitOn matches repository and branch; a batch queues behind a walk waiting for its word while the search runs; removal is decided by the last merge that changed the file; every merge of a batch is planned as news. The mixed-batch gap the review raised is closed by the own-path rule above.
Left as is:
Readers that use one repository. Tier bounds and some log lines read Plan.Repository, the newest merge's repository.
One-time window after rollout. Merges of a branch made in the ten minutes before its first kept merge may be acted on once more by the catch-up, and reported as missed (S5).
hq ADR 0276 (merges are assembled in a rolling window, and each batch is delivered by one walk), issue 362 (two merges seconds apart left their delivery waiting for a person). The controller's side; mesh-delivery's side is novox/mesh-catalog#171, whose wire this follows.
## What changes
- **The merge window.** A merge into a branch a module follows joins the open **batch** instead of opening a walk. Each merge restarts the window; it closes when no merge came for `merge-window` (90 s) or at `merge-window-at-most` (10 min) after the batch's first merge. The settings are the controller's (module.json declares both, written to `${dir:mesh-state}/merge-window.json`, read at every look, so a change needs no restart).
- **Kept in the store.** Migration 0089 adds `batched_merge` (every merge heard, its times, the forge's announcement, the batch or walk answering it; keyed by repository and commit, so a merge is never doubled) and `release_plan.commits`. The batch itself is a plan record in the state `assembling` or `queued`; cut, it keeps its id and is `building`. A restarted controller resumes the window where it stood. The controller has no consolidated schema file: a fresh install runs the numbered migrations, so the migration is both.
- **One walk per batch.** Per repository the latest merge of its branch, planned with every file the batch's merges of it changed; one plan across repositories, `Commits` naming each repository's commit, built at the branch, which holds them. ADR 0267's build sources work per repository unchanged (`movesOfMerge` is the old merge handler's body).
- **One walk at a time.** A batch is cut only when no started walk is open; merges during a walk join the next batch (`queued`, `batch.behind`). A started walk is never superseded. A walk still waiting for mesh-delivery's word is folded into the next batch's walk (`superseded`, `delivery.taken_over_by`), its unbuilt modules planned there. ADR 0218 decision 3's supersession and the issue 349 rule are gone (`supersededBy`, `laterOnTheBranch`).
- **The controller's own path** (decided during the build, 2026-10-10): a merge touching a module whose walk waits for nobody's word never shares a batch with one that waits for mesh-delivery's. It gets a batch of its own (`batch.own`) with its own window; the catalogue batch cuts by the normal rules and queues behind the own-path walk. An own-path walk being cut folds no waiting catalogue walk: its merges are batched again behind the own-path walk (`rebatchWaiting`), the waiting walk naming that batch in `taken_over_by`. No catalogue delivery skips its turn.
- **A late merge** (heard after a later merge of its branch was put in a walk) is answered by that walk when it builds everything the merge moves: the batch of its kind, the open walk, or a done walk, which then names it at once. Otherwise it joins the next batch (a narrowing of decision 4: a done walk that never built a module the late merge moved does not cover it).
- **A failed walk** marks nothing delivered; each merge it carried in a later commit is walked alone on its own commit (`delivery.alone`), newest first, one walk each; the first done answers the older ones (`covered`). A stopped walk, or one stopped or closed by hand, starts no search.
- **A delivery group inside a walk.** Merges of two repositories or more from one head branch name are a group; `orderOf` (ADR 0249, unchanged) gives the pairs, read with the `after:` lines from the merge's body (`link.SourceMoved` gains `number` and `body`); each pair becomes `group-order` edges, which order tiers and gate as built-by does.
- **Shown.** `plans` lists the batches first: `assembling: 13 s left (at the latest 00:31:09); grouped: novox/mesh-catalog@48bda475 (answers 553b7191), novox/mesh-controller@a6bc0931; plan not yet calculated`, or `queued behind plan-…`; an own-path batch says `(on the controller's own path)`. Every save is `plan-moved`; `delivery-walks` answers the batches too.
- **Bounds.** S18: a batch still assembling a minute past its maximum with no walk open. S19: a batch queued behind an open walk past that walk's bound (its repository's tier bound times its tiers), naming the walk. S16 now names every merge a waiting walk answers, not the commit a supersession may have ended. The catch-up of missed merges skips a merge already kept in a batch.
## Wire (with mesh-catalog#171)
Inside the walk record's `delivery` object:
- `merges`: `[{"repository","commit","carried"?}]`, every merge the walk or batch answers; `carried` is the later commit of its repository that carries it, omitted for the walk's own commit.
- `taken_over_by`: on a walk folded before it started; its note also begins `superseded at tier N by plan-X (`, as the PR's fallback reads. It can name a batch (state `queued`/`assembling`), which keeps its id when cut.
- `batch`: `{"closes_at","at_most","behind"?,"own"?}` while the record is a batch (`state` `assembling` or `queued`).
- `alone`: on a walk of one merge on its own commit after a failed walk.
- Top level: `commits` `[{"repository","branch","commit","merged"}]`; `repository`/`commit` keep the newest merge's.
**A mesh-delivery that predates this** reads the top-level `repository`/`commit` as before and ignores the rest: an earlier merge of a repository is not linked and is held after ten minutes, and it would read a record in `assembling` as a walk of unknown state. **Roll out mesh-delivery (#171) first.** It is merged as d2af46b and is the build of mesh-delivery the mesh holds on novox.
## Tests
`batches_test.go`: two merges 18 s apart → one walk at the later commit naming both, built at the branch; three repositories in one window → one walk; a merge at second 80 restarts the window; the maximum closes a busy one; `plans` and `plan-moved` show the assembling batch; a merge during a walk joins the next batch and the started walk is never superseded; a waiting walk is folded, and not let go beside a started one; a late merge answered by the later walk, or the next batch when that walk never built what it moves, in a one-module repository too; the catch-up keeps what a cut made history; a failed walk walks its earlier merges alone at their own commits, stops at the first delivered, refuses a retry, and a stopped one starts no search; a group's order becomes tiers (none without a group); the batch survives a restart and a redelivered merge is not doubled; the window settings; a removed file is the last merge's word; a controller merge and catalogue merges in one window are two batches, the catalogue's walk waits for its word and is batched again behind the controller's walk, and no catalogue module is asked without the word; S16 names the merges. S18 and S19 are in the signals table, raised past their bounds and not before.
Mutation pass (each part removed, a named test fails): no path union, every merge a new batch, the window from the first merge, no maximum, no one-at-a-time, no fold, no search, no covering, no group edges, batch not listed, stopped walk searched, done walk answers nothing, answered despite unbuilt modules, S16 naming one commit, latest by arrival, folded walk left open, no stored batch, late merge read as history, cut reading history, letGo beside a started walk, retry after the search, removed by any merge, nothing owed, catch-up ignoring the record, a walk alone at the branch, a batch walk pinned, own path never, own batch folding the waiting walk, one batch for both kinds — all killed. Returning `false` for the late merge's batch case is equivalent (the open batch is the one it joins anyway).
## After review
An independent review found two blockers, now fixed:
- **A late merge was dropped.** A merge heard after a later merge of its branch was cut read as history: the cut marks its modules seen. hearMerge and the catch-up now judge it by the record. A merge that touches a held module, on a branch the controller keeps merges of, made since its first kept merge on that branch (less mergeGrace), is kept (`owedLate`, `owedToTheRecord`).
- **What gets built.** A batch's walk builds at the branch, which holds every commit it carries. Only a walk alone is built on its own commit, as decision 3 says. A walk alone therefore records no build source, because the builder records one only at the trunk head.
Also fixed after review: `deliver` refuses while another started walk is open; `plans retry` refuses while any walk is open and once a failed walk's merges were moved to the search; `Plan.CommitOn` matches repository and branch; a batch queues behind a walk waiting for its word while the search runs; removal is decided by the last merge that changed the file; every merge of a batch is planned as news. The mixed-batch gap the review raised is closed by the own-path rule above.
Left as is:
- **Readers that use one repository.** Tier bounds and some log lines read `Plan.Repository`, the newest merge's repository.
- **One-time window after rollout.** Merges of a branch made in the ten minutes before its first kept merge may be acted on once more by the catch-up, and reported as missed (S5).
## Not here
- mesh-delivery's side: novox/mesh-catalog#171 (merged).
- hq: ADR 0276's own-path note and progressive insight, to-be 45's S18/S19, issue 362 resolved: novox/hq, branch issues/362-resolved.
- The lab's replay R362 (mesh-lab#75, merged).
Deliverynovox/mesh-controller@3ced96fc6f8a — delivered since 2026-10-10T12:35:44Z
Delivery plan — builds build-agent, mesh-controller → ace, g14, novox, shanks; no bus step
tier 0: mesh-controller
tier 1: build-agent
ace: receives build-agent
g14: receives build-agent
novox: receives mesh-controller, build-agent
shanks: receives build-agent
build-agent keeps data (ADR 0233): what it holds is backed up before it moves
Machines
mesh-controller on novox: passed — healthy 3 times over 3m38s
mesh-controller on the rest running it: sent
build-agent on ace: passed — healthy 3 times over 3m32s
build-agent on the rest running it: sent
Transitions
2026-10-10 12:14 (new) → proposed (announced): novox/mesh-controller#197's head announced
2026-10-10 12:22 proposed → checked (checked): the verdict names this commit
2026-10-10 12:22 checked → ready (accepted): the gate passed or warned, and the repository's own check did not fail
2026-10-10 12:26 ready → published (merged): on the trunk its modules follow: merged there, and its walk opened — or nothing for a walk to move
2026-10-10 12:26 published → delivering (go): its walk started: let go by this owner in its group's order, by a person, or on the controller's own path — not a failed walk that carried a later commit for it, after which it waits for a walk of its own commit
2026-10-10 12:35 delivering → delivered (done): its walk is done, carrying its own commit: every machine of its deploy plan passed, or was left as its policy says
The commit's note under refs/notes/mesh-plan keeps every transition: git log --notes=mesh-plan.
<!-- mesh-delivery:view -->
**Delivery** `novox/mesh-controller@3ced96fc6f8a` — **delivered** since 2026-10-10T12:35:44Z
**Delivery plan** — builds build-agent, mesh-controller → ace, g14, novox, shanks; no bus step
- tier 0: mesh-controller
- tier 1: build-agent
- ace: receives build-agent
- g14: receives build-agent
- novox: receives mesh-controller, build-agent
- shanks: receives build-agent
- build-agent keeps data (ADR 0233): what it holds is backed up before it moves
**Machines**
- mesh-controller on novox: passed — healthy 3 times over 3m38s
- mesh-controller on the rest running it: sent
- build-agent on ace: passed — healthy 3 times over 3m32s
- build-agent on the rest running it: sent
**Transitions**
- 2026-10-10 12:14 (new) → proposed (announced): novox/mesh-controller#197's head announced
- 2026-10-10 12:22 proposed → checked (checked): the verdict names this commit
- 2026-10-10 12:22 checked → ready (accepted): the gate passed or warned, and the repository's own check did not fail
- 2026-10-10 12:26 ready → published (merged): on the trunk its modules follow: merged there, and its walk opened — or nothing for a walk to move
- 2026-10-10 12:26 published → delivering (go): its walk started: let go by this owner in its group's order, by a person, or on the controller's own path — not a failed walk that carried a later commit for it, after which it waits for a walk of its own commit
- 2026-10-10 12:35 delivering → delivered (done): its walk is done, carrying its own commit: every machine of its deploy plan passed, or was left as its policy says
The commit's note under `refs/notes/mesh-plan` keeps every transition: `git log --notes=mesh-plan`.
mesh/merge-gate pass: builds build-agent, mesh-controller → ace, g14, novox, shanks; no bus step; every machine composes with the change as it did without …
Every merge opened a walk and the next merge of the branch superseded it: two
catalogue merges 18 s apart left a walk no delivery held, and the operator
started it by hand 58 minutes later. A merge now joins the open batch, kept in
the store (migration 0089), which is cut into one walk when no merge came for
merge-window (90 s) or at merge-window-at-most (10 min): one commit per
repository, the latest of its branch, with every file the batch's merges
changed. One walk at a time; a started walk is never superseded, a waiting one
is folded into the next. The walk names every merge it answers on the wire
(delivery.merges, taken_over_by, batch). A failed walk walks its earlier merges
alone, newest first, until one is delivered. A delivery group's order becomes
tier edges inside the walk. plans shows the batch assembling; S18 and S19
bound its waits; S16 names the merges a waiting walk answers.
mesh/merge-gate: PASS — every machine composes with the change as it did without (4 of 4 compose) (modules: build-agent, mesh-controller)
mesh/repo-check: PASS — its merge-check.sh passed
Delivery plan — builds build-agent, mesh-controller → ace, g14, novox, shanks; no bus step
tier 0: mesh-controller
tier 1: build-agent
ace: receives build-agent
g14: receives build-agent
novox: receives mesh-controller, build-agent
shanks: receives build-agent
build-agent keeps data (ADR 0233): what it holds is backed up before it moves
read by no module's build: cmd/mesh-controller/batches_test.go, cmd/mesh-controller/build_source_test.go, cmd/mesh-controller/delivery_test.go, cmd/mesh-controller/issue349_test.go, cmd/mesh-controller/queue_test.go, cmd/mesh-controller/signals_test.go, cmd/mesh-controller/supersede_test.go
Run by the build seat on g14 as build-1791631189368305284 (builds --log build-1791631189368305284).
--- the gate: build-agent, mesh-controller
mesh-controller: ok, 55 tool(s); WARNING: merge-window ask(s) for a setting and do(es) not say whether it is trusted, so it counts as trusted: set at the terminal alone; say "trusted" false where nothing trusts it (novox/hq issue 339); WARNING: controller stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8)
long-running resources without health: 1
files asking for a setting without saying whether it is trusted: 1
1 manifest(s) checked. Judged against the seats this binary carries; a claim on one of the mesh's own seats is judged fully at registration, and a seat declared by a module not given here reads as unknown. Identities judged on a 6-character machine name, against the bounds of the providers given here
judging 1 module(s) changed against 4 machine(s), as the snapshot of 2026-10-10T11:15:18Z says they run
composing every machine as the mesh is
the bus's user list leaves out 5 user(s) the mesh has minted no credential for: controller, node.f35, node.idt, node.ygcyr, node.yvbpsm. Each is a user that cannot connect until one is issued
the bus's user list leaves out 5 user(s) the mesh has minted no credential for: controller, node.f35, node.idt, node.ygcyr, node.yvbpsm. Each is a user that cannot connect until one is issued
composing every machine with the change
the bus's user list leaves out 5 user(s) the mesh has minted no credential for: controller, node.f35, node.idt, node.ygcyr, node.yvbpsm. Each is a user that cannot connect until one is issued
the bus's user list leaves out 5 user(s) the mesh has minted no credential for: controller, node.f35, node.idt, node.ygcyr, node.yvbpsm. Each is a user that cannot connect until one is issued
merge gate: PASS — every machine composes with the change as it did without (4 of 4 compose)
judged by controller development build against the facts of 2026-10-10T11:15:18Z
modules the change moves:
- mesh-controller (changed)
machines:
- a machine (f35): composes
- holds mesh-dns-resolver (idt): composes
- holds git, holds mesh-artifact-store, holds mesh-broker, holds mesh-catalog, holds mesh-delivery, holds mesh-dns-resolver, holds mesh-store, holds mesh-vault, holds npm-package-registry, the control node, the hub (ygcyr): composes; the change adds 1 resource(s) and removes 0 (+file:mesh-controller.merge-window)
- a machine (yvbpsm): composes
a merge would rebuild 2 module(s) in 2 tier(s): build-agent, mesh-controller
notes:
- cmd/mesh-controller/batches_test.go, cmd/mesh-controller/build_source_test.go, cmd/mesh-controller/delivery_test.go, cmd/mesh-controller/issue349_test.go, cmd/mesh-controller/queue_test.go, cmd/mesh-controller/signals_test.go and cmd/mesh-controller/supersede_test.go read by no module's build, and rebuild nothing (issue 280)
--- its merge-check.sh (go toolchain)
ok github.com/novox/mesh-controller/cmd/mesh-builder 1.034s
ok github.com/novox/mesh-controller/cmd/mesh-controller 216.609s
ok github.com/novox/mesh-controller/examples/objectstore-provisioner 1.014s
ok github.com/novox/mesh-controller/examples/postgres-provisioner 1.041s
ok github.com/novox/mesh-controller/examples/redis-provisioner 1.015s
ok github.com/novox/mesh-controller/examples/route-proxy 1.215s
ok github.com/novox/mesh-controller/internal/artifacts 1.059s
ok github.com/novox/mesh-controller/internal/broker 2.739s
ok github.com/novox/mesh-controller/internal/builder 2.665s
ok github.com/novox/mesh-controller/internal/catalogue 4.676s
ok github.com/novox/mesh-controller/internal/conditions 2.462s
ok github.com/novox/mesh-controller/internal/envfile 1.036s
ok github.com/novox/mesh-controller/internal/facts 1.036s
ok github.com/novox/mesh-controller/internal/identity 4.380s
ok github.com/novox/mesh-controller/internal/inventory 76.689s
ok github.com/novox/mesh-controller/internal/lease 17.699s
ok github.com/novox/mesh-controller/internal/licences 4.001s
ok github.com/novox/mesh-controller/internal/licences/adapters 1.012s
ok github.com/novox/mesh-controller/internal/link 51.393s
ok github.com/novox/mesh-controller/internal/lint 2.117s
ok github.com/novox/mesh-controller/internal/outward 1.042s
ok github.com/novox/mesh-controller/internal/overlay 1.028s
ok github.com/novox/mesh-controller/internal/secrets 1.474s
ok github.com/novox/mesh-controller/internal/store 3.344s
ok github.com/novox/mesh-controller/internal/testbus 1.174s
ok github.com/novox/mesh-controller/internal/token 1.017s
**Merge check** at `066b1e85`
- `mesh/merge-gate`: **PASS** — every machine composes with the change as it did without (4 of 4 compose) (modules: build-agent, mesh-controller)
- `mesh/repo-check`: **PASS** — its merge-check.sh passed
**Delivery plan** — builds build-agent, mesh-controller → ace, g14, novox, shanks; no bus step
- tier 0: mesh-controller
- tier 1: build-agent
- ace: receives build-agent
- g14: receives build-agent
- novox: receives mesh-controller, build-agent
- shanks: receives build-agent
- build-agent keeps data (ADR 0233): what it holds is backed up before it moves
- read by no module's build: cmd/mesh-controller/batches_test.go, cmd/mesh-controller/build_source_test.go, cmd/mesh-controller/delivery_test.go, cmd/mesh-controller/issue349_test.go, cmd/mesh-controller/queue_test.go, cmd/mesh-controller/signals_test.go, cmd/mesh-controller/supersede_test.go
Run by the build seat on g14 as `build-1791631189368305284` (`builds --log build-1791631189368305284`).
```
--- the gate: build-agent, mesh-controller
mesh-controller: ok, 55 tool(s); WARNING: merge-window ask(s) for a setting and do(es) not say whether it is trusted, so it counts as trusted: set at the terminal alone; say "trusted" false where nothing trusts it (novox/hq issue 339); WARNING: controller stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8)
long-running resources without health: 1
files asking for a setting without saying whether it is trusted: 1
1 manifest(s) checked. Judged against the seats this binary carries; a claim on one of the mesh's own seats is judged fully at registration, and a seat declared by a module not given here reads as unknown. Identities judged on a 6-character machine name, against the bounds of the providers given here
judging 1 module(s) changed against 4 machine(s), as the snapshot of 2026-10-10T11:15:18Z says they run
composing every machine as the mesh is
the bus's user list leaves out 5 user(s) the mesh has minted no credential for: controller, node.f35, node.idt, node.ygcyr, node.yvbpsm. Each is a user that cannot connect until one is issued
the bus's user list leaves out 5 user(s) the mesh has minted no credential for: controller, node.f35, node.idt, node.ygcyr, node.yvbpsm. Each is a user that cannot connect until one is issued
composing every machine with the change
the bus's user list leaves out 5 user(s) the mesh has minted no credential for: controller, node.f35, node.idt, node.ygcyr, node.yvbpsm. Each is a user that cannot connect until one is issued
the bus's user list leaves out 5 user(s) the mesh has minted no credential for: controller, node.f35, node.idt, node.ygcyr, node.yvbpsm. Each is a user that cannot connect until one is issued
merge gate: PASS — every machine composes with the change as it did without (4 of 4 compose)
judged by controller development build against the facts of 2026-10-10T11:15:18Z
modules the change moves:
- mesh-controller (changed)
machines:
- a machine (f35): composes
- holds mesh-dns-resolver (idt): composes
- holds git, holds mesh-artifact-store, holds mesh-broker, holds mesh-catalog, holds mesh-delivery, holds mesh-dns-resolver, holds mesh-store, holds mesh-vault, holds npm-package-registry, the control node, the hub (ygcyr): composes; the change adds 1 resource(s) and removes 0 (+file:mesh-controller.merge-window)
- a machine (yvbpsm): composes
a merge would rebuild 2 module(s) in 2 tier(s): build-agent, mesh-controller
notes:
- cmd/mesh-controller/batches_test.go, cmd/mesh-controller/build_source_test.go, cmd/mesh-controller/delivery_test.go, cmd/mesh-controller/issue349_test.go, cmd/mesh-controller/queue_test.go, cmd/mesh-controller/signals_test.go and cmd/mesh-controller/supersede_test.go read by no module's build, and rebuild nothing (issue 280)
--- its merge-check.sh (go toolchain)
ok github.com/novox/mesh-controller/cmd/mesh-builder 1.034s
ok github.com/novox/mesh-controller/cmd/mesh-controller 216.609s
ok github.com/novox/mesh-controller/examples/objectstore-provisioner 1.014s
ok github.com/novox/mesh-controller/examples/postgres-provisioner 1.041s
ok github.com/novox/mesh-controller/examples/redis-provisioner 1.015s
ok github.com/novox/mesh-controller/examples/route-proxy 1.215s
ok github.com/novox/mesh-controller/internal/artifacts 1.059s
ok github.com/novox/mesh-controller/internal/broker 2.739s
ok github.com/novox/mesh-controller/internal/builder 2.665s
ok github.com/novox/mesh-controller/internal/catalogue 4.676s
ok github.com/novox/mesh-controller/internal/conditions 2.462s
ok github.com/novox/mesh-controller/internal/envfile 1.036s
ok github.com/novox/mesh-controller/internal/facts 1.036s
ok github.com/novox/mesh-controller/internal/identity 4.380s
ok github.com/novox/mesh-controller/internal/inventory 76.689s
ok github.com/novox/mesh-controller/internal/lease 17.699s
ok github.com/novox/mesh-controller/internal/licences 4.001s
ok github.com/novox/mesh-controller/internal/licences/adapters 1.012s
ok github.com/novox/mesh-controller/internal/link 51.393s
ok github.com/novox/mesh-controller/internal/lint 2.117s
ok github.com/novox/mesh-controller/internal/outward 1.042s
ok github.com/novox/mesh-controller/internal/overlay 1.028s
ok github.com/novox/mesh-controller/internal/secrets 1.474s
ok github.com/novox/mesh-controller/internal/store 3.344s
ok github.com/novox/mesh-controller/internal/testbus 1.174s
ok github.com/novox/mesh-controller/internal/token 1.017s
```
mesh/merge-gate: PASS — every machine composes with the change as it did without (4 of 4 compose) (modules: build-agent, mesh-controller)
mesh/repo-check: PASS — its merge-check.sh passed
Delivery plan — builds build-agent, mesh-controller → ace, g14, novox, shanks; no bus step
tier 0: mesh-controller
tier 1: build-agent
ace: receives build-agent
g14: receives build-agent
novox: receives mesh-controller, build-agent
shanks: receives build-agent
build-agent keeps data (ADR 0233): what it holds is backed up before it moves
read by no module's build: cmd/mesh-controller/batches_test.go, cmd/mesh-controller/delivery_test.go, cmd/mesh-controller/issue349_test.go, cmd/mesh-controller/queue_test.go, cmd/mesh-controller/signals_test.go, cmd/mesh-controller/supersede_test.go
Run by the build seat on novox as build-1791631310746926892 (builds --log build-1791631310746926892).
--- the gate: build-agent, mesh-controller
mesh-controller: ok, 55 tool(s); WARNING: merge-window ask(s) for a setting and do(es) not say whether it is trusted, so it counts as trusted: set at the terminal alone; say "trusted" false where nothing trusts it (novox/hq issue 339); WARNING: controller stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8)
long-running resources without health: 1
files asking for a setting without saying whether it is trusted: 1
1 manifest(s) checked. Judged against the seats this binary carries; a claim on one of the mesh's own seats is judged fully at registration, and a seat declared by a module not given here reads as unknown. Identities judged on a 6-character machine name, against the bounds of the providers given here
judging 1 module(s) changed against 4 machine(s), as the snapshot of 2026-10-10T11:15:18Z says they run
composing every machine as the mesh is
the bus's user list leaves out 5 user(s) the mesh has minted no credential for: controller, node.f35, node.idt, node.ygcyr, node.yvbpsm. Each is a user that cannot connect until one is issued
the bus's user list leaves out 5 user(s) the mesh has minted no credential for: controller, node.f35, node.idt, node.ygcyr, node.yvbpsm. Each is a user that cannot connect until one is issued
composing every machine with the change
the bus's user list leaves out 5 user(s) the mesh has minted no credential for: controller, node.f35, node.idt, node.ygcyr, node.yvbpsm. Each is a user that cannot connect until one is issued
the bus's user list leaves out 5 user(s) the mesh has minted no credential for: controller, node.f35, node.idt, node.ygcyr, node.yvbpsm. Each is a user that cannot connect until one is issued
merge gate: PASS — every machine composes with the change as it did without (4 of 4 compose)
judged by controller development build against the facts of 2026-10-10T11:15:18Z
modules the change moves:
- mesh-controller (changed)
machines:
- a machine (f35): composes
- holds mesh-dns-resolver (idt): composes
- holds git, holds mesh-artifact-store, holds mesh-broker, holds mesh-catalog, holds mesh-delivery, holds mesh-dns-resolver, holds mesh-store, holds mesh-vault, holds npm-package-registry, the control node, the hub (ygcyr): composes; the change adds 1 resource(s) and removes 0 (+file:mesh-controller.merge-window)
- a machine (yvbpsm): composes
a merge would rebuild 2 module(s) in 2 tier(s): build-agent, mesh-controller
notes:
- cmd/mesh-controller/batches_test.go, cmd/mesh-controller/delivery_test.go, cmd/mesh-controller/issue349_test.go, cmd/mesh-controller/queue_test.go, cmd/mesh-controller/signals_test.go and cmd/mesh-controller/supersede_test.go read by no module's build, and rebuild nothing (issue 280)
--- its merge-check.sh (go toolchain)
ok github.com/novox/mesh-controller/cmd/mesh-builder 1.050s
ok github.com/novox/mesh-controller/cmd/mesh-controller 256.617s
ok github.com/novox/mesh-controller/examples/objectstore-provisioner 1.019s
ok github.com/novox/mesh-controller/examples/postgres-provisioner 1.028s
ok github.com/novox/mesh-controller/examples/redis-provisioner 1.020s
ok github.com/novox/mesh-controller/examples/route-proxy 1.129s
ok github.com/novox/mesh-controller/internal/artifacts 1.059s
ok github.com/novox/mesh-controller/internal/broker 3.437s
ok github.com/novox/mesh-controller/internal/builder 7.320s
ok github.com/novox/mesh-controller/internal/catalogue 5.106s
ok github.com/novox/mesh-controller/internal/conditions 2.596s
ok github.com/novox/mesh-controller/internal/envfile 1.036s
ok github.com/novox/mesh-controller/internal/facts 1.036s
ok github.com/novox/mesh-controller/internal/identity 7.246s
ok github.com/novox/mesh-controller/internal/inventory 100.116s
ok github.com/novox/mesh-controller/internal/lease 17.744s
ok github.com/novox/mesh-controller/internal/licences 6.925s
ok github.com/novox/mesh-controller/internal/licences/adapters 1.014s
ok github.com/novox/mesh-controller/internal/link 55.753s
ok github.com/novox/mesh-controller/internal/lint 2.192s
ok github.com/novox/mesh-controller/internal/outward 1.033s
ok github.com/novox/mesh-controller/internal/overlay 1.022s
ok github.com/novox/mesh-controller/internal/secrets 1.433s
ok github.com/novox/mesh-controller/internal/store 4.574s
ok github.com/novox/mesh-controller/internal/testbus 1.197s
ok github.com/novox/mesh-controller/internal/token 1.017s
**Merge check** at `96fc4209`
- `mesh/merge-gate`: **PASS** — every machine composes with the change as it did without (4 of 4 compose) (modules: build-agent, mesh-controller)
- `mesh/repo-check`: **PASS** — its merge-check.sh passed
**Delivery plan** — builds build-agent, mesh-controller → ace, g14, novox, shanks; no bus step
- tier 0: mesh-controller
- tier 1: build-agent
- ace: receives build-agent
- g14: receives build-agent
- novox: receives mesh-controller, build-agent
- shanks: receives build-agent
- build-agent keeps data (ADR 0233): what it holds is backed up before it moves
- read by no module's build: cmd/mesh-controller/batches_test.go, cmd/mesh-controller/delivery_test.go, cmd/mesh-controller/issue349_test.go, cmd/mesh-controller/queue_test.go, cmd/mesh-controller/signals_test.go, cmd/mesh-controller/supersede_test.go
Run by the build seat on novox as `build-1791631310746926892` (`builds --log build-1791631310746926892`).
```
--- the gate: build-agent, mesh-controller
mesh-controller: ok, 55 tool(s); WARNING: merge-window ask(s) for a setting and do(es) not say whether it is trusted, so it counts as trusted: set at the terminal alone; say "trusted" false where nothing trusts it (novox/hq issue 339); WARNING: controller stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8)
long-running resources without health: 1
files asking for a setting without saying whether it is trusted: 1
1 manifest(s) checked. Judged against the seats this binary carries; a claim on one of the mesh's own seats is judged fully at registration, and a seat declared by a module not given here reads as unknown. Identities judged on a 6-character machine name, against the bounds of the providers given here
judging 1 module(s) changed against 4 machine(s), as the snapshot of 2026-10-10T11:15:18Z says they run
composing every machine as the mesh is
the bus's user list leaves out 5 user(s) the mesh has minted no credential for: controller, node.f35, node.idt, node.ygcyr, node.yvbpsm. Each is a user that cannot connect until one is issued
the bus's user list leaves out 5 user(s) the mesh has minted no credential for: controller, node.f35, node.idt, node.ygcyr, node.yvbpsm. Each is a user that cannot connect until one is issued
composing every machine with the change
the bus's user list leaves out 5 user(s) the mesh has minted no credential for: controller, node.f35, node.idt, node.ygcyr, node.yvbpsm. Each is a user that cannot connect until one is issued
the bus's user list leaves out 5 user(s) the mesh has minted no credential for: controller, node.f35, node.idt, node.ygcyr, node.yvbpsm. Each is a user that cannot connect until one is issued
merge gate: PASS — every machine composes with the change as it did without (4 of 4 compose)
judged by controller development build against the facts of 2026-10-10T11:15:18Z
modules the change moves:
- mesh-controller (changed)
machines:
- a machine (f35): composes
- holds mesh-dns-resolver (idt): composes
- holds git, holds mesh-artifact-store, holds mesh-broker, holds mesh-catalog, holds mesh-delivery, holds mesh-dns-resolver, holds mesh-store, holds mesh-vault, holds npm-package-registry, the control node, the hub (ygcyr): composes; the change adds 1 resource(s) and removes 0 (+file:mesh-controller.merge-window)
- a machine (yvbpsm): composes
a merge would rebuild 2 module(s) in 2 tier(s): build-agent, mesh-controller
notes:
- cmd/mesh-controller/batches_test.go, cmd/mesh-controller/delivery_test.go, cmd/mesh-controller/issue349_test.go, cmd/mesh-controller/queue_test.go, cmd/mesh-controller/signals_test.go and cmd/mesh-controller/supersede_test.go read by no module's build, and rebuild nothing (issue 280)
--- its merge-check.sh (go toolchain)
ok github.com/novox/mesh-controller/cmd/mesh-builder 1.050s
ok github.com/novox/mesh-controller/cmd/mesh-controller 256.617s
ok github.com/novox/mesh-controller/examples/objectstore-provisioner 1.019s
ok github.com/novox/mesh-controller/examples/postgres-provisioner 1.028s
ok github.com/novox/mesh-controller/examples/redis-provisioner 1.020s
ok github.com/novox/mesh-controller/examples/route-proxy 1.129s
ok github.com/novox/mesh-controller/internal/artifacts 1.059s
ok github.com/novox/mesh-controller/internal/broker 3.437s
ok github.com/novox/mesh-controller/internal/builder 7.320s
ok github.com/novox/mesh-controller/internal/catalogue 5.106s
ok github.com/novox/mesh-controller/internal/conditions 2.596s
ok github.com/novox/mesh-controller/internal/envfile 1.036s
ok github.com/novox/mesh-controller/internal/facts 1.036s
ok github.com/novox/mesh-controller/internal/identity 7.246s
ok github.com/novox/mesh-controller/internal/inventory 100.116s
ok github.com/novox/mesh-controller/internal/lease 17.744s
ok github.com/novox/mesh-controller/internal/licences 6.925s
ok github.com/novox/mesh-controller/internal/licences/adapters 1.014s
ok github.com/novox/mesh-controller/internal/link 55.753s
ok github.com/novox/mesh-controller/internal/lint 2.192s
ok github.com/novox/mesh-controller/internal/outward 1.033s
ok github.com/novox/mesh-controller/internal/overlay 1.022s
ok github.com/novox/mesh-controller/internal/secrets 1.433s
ok github.com/novox/mesh-controller/internal/store 4.574s
ok github.com/novox/mesh-controller/internal/testbus 1.197s
ok github.com/novox/mesh-controller/internal/token 1.017s
```
mesh/merge-gate pass: builds build-agent, mesh-controller → ace, g14, novox, shanks; no bus step; every machine composes with the change as it did without …
mesh/merge-gate: PASS — every machine composes with the change as it did without (4 of 4 compose) (modules: build-agent, mesh-controller)
mesh/repo-check: FAIL — its merge-check.sh failed: FAIL github.com/novox/mesh-controller/cmd/mesh-controller 256.824s
Delivery plan — builds build-agent, mesh-controller → ace, g14, novox, shanks; no bus step
tier 0: mesh-controller
tier 1: build-agent
ace: receives build-agent
g14: receives build-agent
novox: receives mesh-controller, build-agent
shanks: receives build-agent
build-agent keeps data (ADR 0233): what it holds is backed up before it moves
read by no module's build: cmd/mesh-controller/batches_test.go, cmd/mesh-controller/delivery_test.go, cmd/mesh-controller/issue349_test.go, cmd/mesh-controller/queue_test.go, cmd/mesh-controller/signals_test.go, cmd/mesh-controller/supersede_test.go
Run by the build seat on novox as build-1791632522039225859 (builds --log build-1791632522039225859).
build-1791629305883334560: the build seat did not say whether c1aaaaaa is on its repository's trunk (it predates ADR 0238); registered as before
build-1791629365883334560: the build seat did not say whether c2bbbbbb is on its repository's trunk (it predates ADR 0238); registered as before
app at c2bbbbbb was made from the source build-1791629305883334560 was: registered with its artifacts, no move
build-1791629425883334560: the build seat did not say whether c3cccccc is on its repository's trunk (it predates ADR 0238); registered as before
build-1791629485883334560: the build seat did not say whether c4dddddd is on its repository's trunk (it predates ADR 0238); registered as before
build-1791629306419237761: nats is new to the catalogue, and novox/mesh-catalog on the git seat is no repository the catalogue builds a module from — registered, as asked at the controller's terminal
build-1791629306419237761: the build seat did not say whether n1111111 is on its repository's trunk (it predates ADR 0238); registered as before
build-1791629366419237761: the build seat did not say whether n2222222 is on its repository's trunk (it predates ADR 0238); registered as before
nats at n2222222 was made from the source build-1791629306419237761 was: registered with its artifacts, no move
every machine running nats runs the build the mesh holds (n2222222): nothing to upgrade
build-1791629426419237761: the build seat did not say whether n3333333 is on its repository's trunk (it predates ADR 0238); registered as before
plan-gate: app built from the source every machine running it runs: no move, nothing sent
plan-gate: done — novox/mesh-catalog at c2, 1 tier(s)
plan-gate: tier 0 built; sent 1 module(s) to anchor first in one send (app), the rest once its gate passes
status could not be composed (after 0s): the store did not answer — `status` answers the last summary, with its age
anchor is not counted as on the network: it does not resolve: these assignments cannot be applied:
- rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is not counted as on the network: it does not resolve: these assignments cannot be applied:
- rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is not counted as on the network: it does not resolve: these assignments cannot be applied:
- rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is left out of the rest of the mesh: it does not resolve: these assignments cannot be applied:
- rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is not counted as on the network: it does not resolve: these assignments cannot be applied:
- rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is not counted as on the network: it does not resolve: these assignments cannot be applied:
- rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is not counted as on the network: it does not resolve: these assignments cannot be applied:
- rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is not counted as on the network: it does not resolve: these assignments cannot be applied:
- rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is left out of the rest of the mesh: it does not resolve: these assignments cannot be applied:
- rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is not counted as on the network: it does not resolve: these assignments cannot be applied:
- rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is not counted as on the network: it does not resolve: these assignments cannot be applied:
- rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is not counted as on the network: it does not resolve: these assignments cannot be applied:
- rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is not counted as on the network: it does not resolve: these assignments cannot be applied:
- rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is left out of the rest of the mesh: it does not resolve: these assignments cannot be applied:
- rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is not counted as on the network: it does not resolve: these assignments cannot be applied:
- rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is not counted as on the network: it does not resolve: these assignments cannot be applied:
- rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is not counted as on the network: it does not resolve: these assignments cannot be applied:
- rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is not counted as on the network: it does not resolve: these assignments cannot be applied:
- rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is left out of the rest of the mesh: it does not resolve: these assignments cannot be applied:
- rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is not counted as on the network: it does not resolve: these assignments cannot be applied:
- rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is not counted as on the network: it does not resolve: these assignments cannot be applied:
- rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is not counted as on the network: it does not resolve: these assignments cannot be applied:
- rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is not counted as on the network: it does not resolve: these assignments cannot be applied:
- rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is left out of the rest of the mesh: it does not resolve: these assignments cannot be applied:
- rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is not counted as on the network: it does not resolve: these assignments cannot be applied:
- rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is not counted as on the network: it does not resolve: these assignments cannot be applied:
- rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is not counted as on the network: it does not resolve: these assignments cannot be applied:
- rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is not counted as on the network: it does not resolve: these assignments cannot be applied:
- rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is left out of the rest of the mesh: it does not resolve: these assignments cannot be applied:
- rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is not counted as on the network: it does not resolve: these assignments cannot be applied:
- rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is not counted as on the network: it does not resolve: these assignments cannot be applied:
- rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is not counted as on the network: it does not resolve: these assignments cannot be applied:
- rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is not counted as on the network: it does not resolve: these assignments cannot be applied:
- rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is left out of the rest of the mesh: it does not resolve: these assignments cannot be applied:
- rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is not counted as on the network: it does not resolve: these assignments cannot be applied:
- rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is not counted as on the network: it does not resolve: these assignments cannot be applied:
- rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is not counted as on the network: it does not resolve: these assignments cannot be applied:
- rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is not counted as on the network: it does not resolve: these assignments cannot be applied:
- rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is left out of the rest of the mesh: it does not resolve: these assignments cannot be applied:
- rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is not counted as on the network: it does not resolve: these assignments cannot be applied:
- rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
notes on laptop:
+ places.data.owner
+ places.data.path
+ x
run `plan laptop --diff` to see what it changes, `push laptop` to send it
notes on laptop:
~ x
the layer it replaced is kept: settings show notes --node laptop --history
run `plan laptop --diff` to see what it changes, `push laptop` to send it
{
"places": {
"data": {
"owner": "1001:1001",
"path": "/srv/notes"
}
},
"x": 1
}
keycloak on anchor:
+ issuer
+ x
run `plan anchor --diff` to see what it changes, `push anchor` to send it
power on anchor:
+ lid
+ x
run `plan anchor --diff` to see what it changes, `push anchor` to send it
keycloak on anchor:
~ x
the layer it replaced is kept: settings show keycloak --node anchor --history
run `plan anchor --diff` to see what it changes, `push anchor` to send it
claude-code on laptop:
+ managed_settings.permissions.allow
run `plan laptop --diff` to see what it changes, `push laptop` to send it
claude-code on the whole mesh:
+ mcp_servers.listener.type
+ mcp_servers.listener.url
run `push --behind` to send it to the machines running it
{
"managed_settings": {
"permissions": {
"allow": [
"Bash"
]
}
}
}
keycloak on anchor:
+ url
run `plan anchor --diff` to see what it changes, `push anchor` to send it
{
"url": "https://id.example"
}
notifier on anchor:
+ font
run `plan anchor --diff` to see what it changes, `push anchor` to send it
plan-tier: tier 0 built; sent 12 module(s) to anchor first in one send (m01, m02, m03, m04, m05, m06, m07, m08, m09, m10, m11, m12), the rest once its gate passes
plan-tier: m01 passed its gate on anchor (healthy 3 times over 0s); the rest are sent
plan-tier: tier 0 built; sent m01, m02, m03, m04, m05, m06, m07, m08, m09, m10, m11, m12 to laptop, one send each
plan-tier: done — novox/mesh-catalog at c2, 1 tier(s)
plan-tier: tier 0 built; sent 3 module(s) to anchor first in one send (app1, app2, node-tools), the rest once its gate passes
node-tools's build c2 failed its gate on anchor and was put back to c1: not healthy within -1s of its apply: raised since it was sent: machine.anchor.core-behind — anchor runs the node tools it was last sent, not yet reported applied, and no plan is rolling them out (its settle window runs to the gate's bound)
plan-tier: the send to anchor in tier 0 failed its gate: not healthy within -1s of its apply: raised since it was sent: machine.anchor.core-behind — anchor runs the node tools it was last sent, not yet reported applied, and no plan is rolling them out (its settle window runs to the gate's bound); app1 passed on its own and is kept; passed on their own and kept: app2; node-tools failed its gate on anchor in tier 0: not healthy within -1s of its apply: raised since it was sent: machine.anchor.core-behind — anchor runs the node tools it was last sent, not yet reported applied, and no plan is rolling them out (its settle window runs to the gate's bound); put back node-tools to c1 on anchor, in one send; none reported left as it was
plan-tier: tier 0 built; sent 3 module(s) to anchor first in one send (app1, app2, app3), the rest once its gate passes
app1's build c2 failed its gate on anchor and was put back to c1: not healthy within -1s of its apply: anchor as a whole: raised since it was sent: machine.anchor.disk-full — anchor's root file system is full
app2's build c2 failed its gate on anchor and was put back to c1: not healthy within -1s of its apply: anchor as a whole: raised since it was sent: machine.anchor.disk-full — anchor's root file system is full
app3's build c2 failed its gate on anchor and was put back to c1: not healthy within -1s of its apply: anchor as a whole: raised since it was sent: machine.anchor.disk-full — anchor's root file system is full
plan-tier: app1 failed its gate on anchor in tier 0: not healthy within -1s of its apply: anchor as a whole: raised since it was sent: machine.anchor.disk-full — anchor's root file system is full; app2 failed its gate on anchor in tier 0: not healthy within -1s of its apply: anchor as a whole: raised since it was sent: machine.anchor.disk-full — anchor's root file system is full; app3 failed its gate on anchor in tier 0: not healthy within -1s of its apply: anchor as a whole: raised since it was sent: machine.anchor.disk-full — anchor's root file system is full; put back app1 to c1, app2 to c1, app3 to c1 on anchor, in one send; none reported left as it was
plan-gate: tier 0 built; sent 1 module(s) to anchor first in one send (app), the rest once its gate passes
plan-gate: the send to anchor in tier 0 failed its gate: not healthy within -1s of its apply: anchor has not reported on what it was sent; app was left as it was — anchor already ran app c2, or a build identical to it, before the send, so nothing of it moved and nothing is put back
plan-gate: the send to anchor in tier 0 failed its gate: not healthy within -1s of its apply: anchor has not reported on what it was sent; app was left as it was — anchor already ran app c2, or a build identical to it, before the send, so nothing of it moved and nothing is put back; none reported left as it was
tier 0: plan-tier: tier 0 built; sent 2 module(s) to anchor first in one send (node-tools, app1), the rest once its gate passes
node-tools's build c2 failed its gate on anchor and was put back to c1: the witness on anchor judged the node-tools c2 and rolled-back: the node tools did not answer
plan-tier: put back at once: node-tools (the witness on anchor judged the node-tools c2 and rolled-back: the node tools did not answer); the rest of the send judged to their own verdicts
plan-tier: the send to anchor in tier 0 failed its gate: the witness on anchor judged the node-tools c2 and rolled-back: the node tools did not answer; node-tools was put back when it broke; passed on their own and kept: app1; none reported left as it was
plan-tier: tier 0 built; sent 2 module(s) to anchor first in one send (app1, node-tools), the rest once its gate passes
node-tools's build c2 failed its gate on anchor and was put back to c1: the witness on anchor judged the node-tools c2 and rolled-back: the node tools did not answer
plan-tier: put back at once: node-tools (the witness on anchor judged the node-tools c2 and rolled-back: the node tools did not answer); the rest of the send judged to their own verdicts
plan-tier: the send to anchor in tier 0 failed its gate: the witness on anchor judged the node-tools c2 and rolled-back: the node tools did not answer; app1 passed on its own and is kept; none reported left as it was
FAIL
FAIL github.com/novox/mesh-controller/cmd/mesh-controller 256.824s
ok github.com/novox/mesh-controller/examples/objectstore-provisioner 1.021s
ok github.com/novox/mesh-controller/examples/postgres-provisioner 1.027s
ok github.com/novox/mesh-controller/examples/redis-provisioner 1.015s
ok github.com/novox/mesh-controller/examples/route-proxy 1.137s
ok github.com/novox/mesh-controller/internal/artifacts 1.064s
ok github.com/novox/mesh-controller/internal/broker 2.931s
ok github.com/novox/mesh-controller/internal/builder 3.619s
ok github.com/novox/mesh-controller/internal/catalogue 5.498s
ok github.com/novox/mesh-controller/internal/conditions 2.555s
ok github.com/novox/mesh-controller/internal/envfile 1.032s
ok github.com/novox/mesh-controller/internal/facts 1.031s
ok github.com/novox/mesh-controller/internal/identity 5.625s
ok github.com/novox/mesh-controller/internal/inventory 100.252s
ok github.com/novox/mesh-controller/internal/lease 17.687s
ok github.com/novox/mesh-controller/internal/licences 5.232s
ok github.com/novox/mesh-controller/internal/licences/adapters 1.009s
ok github.com/novox/mesh-controller/internal/link 56.479s
ok github.com/novox/mesh-controller/internal/lint 2.341s
ok github.com/novox/mesh-controller/internal/outward 1.043s
ok github.com/novox/mesh-controller/internal/overlay 1.022s
ok github.com/novox/mesh-controller/internal/secrets 1.490s
ok github.com/novox/mesh-controller/internal/store 3.479s
ok github.com/novox/mesh-controller/internal/testbus 1.189s
ok github.com/novox/mesh-controller/internal/token 1.017s
FAIL
**Merge check** at `28876914`
- `mesh/merge-gate`: **PASS** — every machine composes with the change as it did without (4 of 4 compose) (modules: build-agent, mesh-controller)
- `mesh/repo-check`: **FAIL** — its merge-check.sh failed: FAIL github.com/novox/mesh-controller/cmd/mesh-controller 256.824s
**Delivery plan** — builds build-agent, mesh-controller → ace, g14, novox, shanks; no bus step
- tier 0: mesh-controller
- tier 1: build-agent
- ace: receives build-agent
- g14: receives build-agent
- novox: receives mesh-controller, build-agent
- shanks: receives build-agent
- build-agent keeps data (ADR 0233): what it holds is backed up before it moves
- read by no module's build: cmd/mesh-controller/batches_test.go, cmd/mesh-controller/delivery_test.go, cmd/mesh-controller/issue349_test.go, cmd/mesh-controller/queue_test.go, cmd/mesh-controller/signals_test.go, cmd/mesh-controller/supersede_test.go
Run by the build seat on novox as `build-1791632522039225859` (`builds --log build-1791632522039225859`).
```
build-1791629305883334560: the build seat did not say whether c1aaaaaa is on its repository's trunk (it predates ADR 0238); registered as before
build-1791629365883334560: the build seat did not say whether c2bbbbbb is on its repository's trunk (it predates ADR 0238); registered as before
app at c2bbbbbb was made from the source build-1791629305883334560 was: registered with its artifacts, no move
build-1791629425883334560: the build seat did not say whether c3cccccc is on its repository's trunk (it predates ADR 0238); registered as before
build-1791629485883334560: the build seat did not say whether c4dddddd is on its repository's trunk (it predates ADR 0238); registered as before
build-1791629306419237761: nats is new to the catalogue, and novox/mesh-catalog on the git seat is no repository the catalogue builds a module from — registered, as asked at the controller's terminal
build-1791629306419237761: the build seat did not say whether n1111111 is on its repository's trunk (it predates ADR 0238); registered as before
build-1791629366419237761: the build seat did not say whether n2222222 is on its repository's trunk (it predates ADR 0238); registered as before
nats at n2222222 was made from the source build-1791629306419237761 was: registered with its artifacts, no move
every machine running nats runs the build the mesh holds (n2222222): nothing to upgrade
build-1791629426419237761: the build seat did not say whether n3333333 is on its repository's trunk (it predates ADR 0238); registered as before
plan-gate: app built from the source every machine running it runs: no move, nothing sent
plan-gate: done — novox/mesh-catalog at c2, 1 tier(s)
plan-gate: tier 0 built; sent 1 module(s) to anchor first in one send (app), the rest once its gate passes
status could not be composed (after 0s): the store did not answer — `status` answers the last summary, with its age
anchor is not counted as on the network: it does not resolve: these assignments cannot be applied:
- rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is not counted as on the network: it does not resolve: these assignments cannot be applied:
- rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is not counted as on the network: it does not resolve: these assignments cannot be applied:
- rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is left out of the rest of the mesh: it does not resolve: these assignments cannot be applied:
- rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is not counted as on the network: it does not resolve: these assignments cannot be applied:
- rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is not counted as on the network: it does not resolve: these assignments cannot be applied:
- rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is not counted as on the network: it does not resolve: these assignments cannot be applied:
- rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is not counted as on the network: it does not resolve: these assignments cannot be applied:
- rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is left out of the rest of the mesh: it does not resolve: these assignments cannot be applied:
- rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is not counted as on the network: it does not resolve: these assignments cannot be applied:
- rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is not counted as on the network: it does not resolve: these assignments cannot be applied:
- rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is not counted as on the network: it does not resolve: these assignments cannot be applied:
- rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is not counted as on the network: it does not resolve: these assignments cannot be applied:
- rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is left out of the rest of the mesh: it does not resolve: these assignments cannot be applied:
- rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is not counted as on the network: it does not resolve: these assignments cannot be applied:
- rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is not counted as on the network: it does not resolve: these assignments cannot be applied:
- rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is not counted as on the network: it does not resolve: these assignments cannot be applied:
- rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is not counted as on the network: it does not resolve: these assignments cannot be applied:
- rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is left out of the rest of the mesh: it does not resolve: these assignments cannot be applied:
- rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is not counted as on the network: it does not resolve: these assignments cannot be applied:
- rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is not counted as on the network: it does not resolve: these assignments cannot be applied:
- rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is not counted as on the network: it does not resolve: these assignments cannot be applied:
- rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is not counted as on the network: it does not resolve: these assignments cannot be applied:
- rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is left out of the rest of the mesh: it does not resolve: these assignments cannot be applied:
- rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is not counted as on the network: it does not resolve: these assignments cannot be applied:
- rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is not counted as on the network: it does not resolve: these assignments cannot be applied:
- rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is not counted as on the network: it does not resolve: these assignments cannot be applied:
- rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is not counted as on the network: it does not resolve: these assignments cannot be applied:
- rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is left out of the rest of the mesh: it does not resolve: these assignments cannot be applied:
- rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is not counted as on the network: it does not resolve: these assignments cannot be applied:
- rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is not counted as on the network: it does not resolve: these assignments cannot be applied:
- rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is not counted as on the network: it does not resolve: these assignments cannot be applied:
- rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is not counted as on the network: it does not resolve: these assignments cannot be applied:
- rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is left out of the rest of the mesh: it does not resolve: these assignments cannot be applied:
- rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is not counted as on the network: it does not resolve: these assignments cannot be applied:
- rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is not counted as on the network: it does not resolve: these assignments cannot be applied:
- rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is not counted as on the network: it does not resolve: these assignments cannot be applied:
- rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is not counted as on the network: it does not resolve: these assignments cannot be applied:
- rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is left out of the rest of the mesh: it does not resolve: these assignments cannot be applied:
- rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is not counted as on the network: it does not resolve: these assignments cannot be applied:
- rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
notes on laptop:
+ places.data.owner
+ places.data.path
+ x
run `plan laptop --diff` to see what it changes, `push laptop` to send it
notes on laptop:
~ x
the layer it replaced is kept: settings show notes --node laptop --history
run `plan laptop --diff` to see what it changes, `push laptop` to send it
{
"places": {
"data": {
"owner": "1001:1001",
"path": "/srv/notes"
}
},
"x": 1
}
keycloak on anchor:
+ issuer
+ x
run `plan anchor --diff` to see what it changes, `push anchor` to send it
power on anchor:
+ lid
+ x
run `plan anchor --diff` to see what it changes, `push anchor` to send it
keycloak on anchor:
~ x
the layer it replaced is kept: settings show keycloak --node anchor --history
run `plan anchor --diff` to see what it changes, `push anchor` to send it
claude-code on laptop:
+ managed_settings.permissions.allow
run `plan laptop --diff` to see what it changes, `push laptop` to send it
claude-code on the whole mesh:
+ mcp_servers.listener.type
+ mcp_servers.listener.url
run `push --behind` to send it to the machines running it
{
"managed_settings": {
"permissions": {
"allow": [
"Bash"
]
}
}
}
keycloak on anchor:
+ url
run `plan anchor --diff` to see what it changes, `push anchor` to send it
{
"url": "https://id.example"
}
notifier on anchor:
+ font
run `plan anchor --diff` to see what it changes, `push anchor` to send it
plan-tier: tier 0 built; sent 12 module(s) to anchor first in one send (m01, m02, m03, m04, m05, m06, m07, m08, m09, m10, m11, m12), the rest once its gate passes
plan-tier: m01 passed its gate on anchor (healthy 3 times over 0s); the rest are sent
plan-tier: tier 0 built; sent m01, m02, m03, m04, m05, m06, m07, m08, m09, m10, m11, m12 to laptop, one send each
plan-tier: done — novox/mesh-catalog at c2, 1 tier(s)
plan-tier: tier 0 built; sent 3 module(s) to anchor first in one send (app1, app2, node-tools), the rest once its gate passes
node-tools's build c2 failed its gate on anchor and was put back to c1: not healthy within -1s of its apply: raised since it was sent: machine.anchor.core-behind — anchor runs the node tools it was last sent, not yet reported applied, and no plan is rolling them out (its settle window runs to the gate's bound)
plan-tier: the send to anchor in tier 0 failed its gate: not healthy within -1s of its apply: raised since it was sent: machine.anchor.core-behind — anchor runs the node tools it was last sent, not yet reported applied, and no plan is rolling them out (its settle window runs to the gate's bound); app1 passed on its own and is kept; passed on their own and kept: app2; node-tools failed its gate on anchor in tier 0: not healthy within -1s of its apply: raised since it was sent: machine.anchor.core-behind — anchor runs the node tools it was last sent, not yet reported applied, and no plan is rolling them out (its settle window runs to the gate's bound); put back node-tools to c1 on anchor, in one send; none reported left as it was
plan-tier: tier 0 built; sent 3 module(s) to anchor first in one send (app1, app2, app3), the rest once its gate passes
app1's build c2 failed its gate on anchor and was put back to c1: not healthy within -1s of its apply: anchor as a whole: raised since it was sent: machine.anchor.disk-full — anchor's root file system is full
app2's build c2 failed its gate on anchor and was put back to c1: not healthy within -1s of its apply: anchor as a whole: raised since it was sent: machine.anchor.disk-full — anchor's root file system is full
app3's build c2 failed its gate on anchor and was put back to c1: not healthy within -1s of its apply: anchor as a whole: raised since it was sent: machine.anchor.disk-full — anchor's root file system is full
plan-tier: app1 failed its gate on anchor in tier 0: not healthy within -1s of its apply: anchor as a whole: raised since it was sent: machine.anchor.disk-full — anchor's root file system is full; app2 failed its gate on anchor in tier 0: not healthy within -1s of its apply: anchor as a whole: raised since it was sent: machine.anchor.disk-full — anchor's root file system is full; app3 failed its gate on anchor in tier 0: not healthy within -1s of its apply: anchor as a whole: raised since it was sent: machine.anchor.disk-full — anchor's root file system is full; put back app1 to c1, app2 to c1, app3 to c1 on anchor, in one send; none reported left as it was
plan-gate: tier 0 built; sent 1 module(s) to anchor first in one send (app), the rest once its gate passes
plan-gate: the send to anchor in tier 0 failed its gate: not healthy within -1s of its apply: anchor has not reported on what it was sent; app was left as it was — anchor already ran app c2, or a build identical to it, before the send, so nothing of it moved and nothing is put back
plan-gate: the send to anchor in tier 0 failed its gate: not healthy within -1s of its apply: anchor has not reported on what it was sent; app was left as it was — anchor already ran app c2, or a build identical to it, before the send, so nothing of it moved and nothing is put back; none reported left as it was
tier 0: plan-tier: tier 0 built; sent 2 module(s) to anchor first in one send (node-tools, app1), the rest once its gate passes
node-tools's build c2 failed its gate on anchor and was put back to c1: the witness on anchor judged the node-tools c2 and rolled-back: the node tools did not answer
plan-tier: put back at once: node-tools (the witness on anchor judged the node-tools c2 and rolled-back: the node tools did not answer); the rest of the send judged to their own verdicts
plan-tier: the send to anchor in tier 0 failed its gate: the witness on anchor judged the node-tools c2 and rolled-back: the node tools did not answer; node-tools was put back when it broke; passed on their own and kept: app1; none reported left as it was
plan-tier: tier 0 built; sent 2 module(s) to anchor first in one send (app1, node-tools), the rest once its gate passes
node-tools's build c2 failed its gate on anchor and was put back to c1: the witness on anchor judged the node-tools c2 and rolled-back: the node tools did not answer
plan-tier: put back at once: node-tools (the witness on anchor judged the node-tools c2 and rolled-back: the node tools did not answer); the rest of the send judged to their own verdicts
plan-tier: the send to anchor in tier 0 failed its gate: the witness on anchor judged the node-tools c2 and rolled-back: the node tools did not answer; app1 passed on its own and is kept; none reported left as it was
FAIL
FAIL github.com/novox/mesh-controller/cmd/mesh-controller 256.824s
ok github.com/novox/mesh-controller/examples/objectstore-provisioner 1.021s
ok github.com/novox/mesh-controller/examples/postgres-provisioner 1.027s
ok github.com/novox/mesh-controller/examples/redis-provisioner 1.015s
ok github.com/novox/mesh-controller/examples/route-proxy 1.137s
ok github.com/novox/mesh-controller/internal/artifacts 1.064s
ok github.com/novox/mesh-controller/internal/broker 2.931s
ok github.com/novox/mesh-controller/internal/builder 3.619s
ok github.com/novox/mesh-controller/internal/catalogue 5.498s
ok github.com/novox/mesh-controller/internal/conditions 2.555s
ok github.com/novox/mesh-controller/internal/envfile 1.032s
ok github.com/novox/mesh-controller/internal/facts 1.031s
ok github.com/novox/mesh-controller/internal/identity 5.625s
ok github.com/novox/mesh-controller/internal/inventory 100.252s
ok github.com/novox/mesh-controller/internal/lease 17.687s
ok github.com/novox/mesh-controller/internal/licences 5.232s
ok github.com/novox/mesh-controller/internal/licences/adapters 1.009s
ok github.com/novox/mesh-controller/internal/link 56.479s
ok github.com/novox/mesh-controller/internal/lint 2.341s
ok github.com/novox/mesh-controller/internal/outward 1.043s
ok github.com/novox/mesh-controller/internal/overlay 1.022s
ok github.com/novox/mesh-controller/internal/secrets 1.490s
ok github.com/novox/mesh-controller/internal/store 3.479s
ok github.com/novox/mesh-controller/internal/testbus 1.189s
ok github.com/novox/mesh-controller/internal/token 1.017s
FAIL
```
mesh/merge-gate pass: builds build-agent, mesh-controller → ace, g14, novox, shanks; no bus step; every machine composes with the change as it did without …
mesh/merge-gate pass: builds build-agent, mesh-controller → ace, g14, novox, shanks; no bus step; every machine composes with the change as it did without …
mesh/merge-gate: PASS — every machine composes with the change as it did without (4 of 4 compose) (modules: build-agent, mesh-controller)
mesh/repo-check: PASS — its merge-check.sh passed
Delivery plan — builds build-agent, mesh-controller → ace, g14, novox, shanks; no bus step
tier 0: mesh-controller
tier 1: build-agent
ace: receives build-agent
g14: receives build-agent
novox: receives mesh-controller, build-agent
shanks: receives build-agent
build-agent keeps data (ADR 0233): what it holds is backed up before it moves
read by no module's build: cmd/mesh-controller/batches_test.go, cmd/mesh-controller/delivery_test.go, cmd/mesh-controller/issue349_test.go, cmd/mesh-controller/queue_test.go, cmd/mesh-controller/signals_test.go, cmd/mesh-controller/supersede_test.go
Run by the build seat on g14 as build-1791633042015855120 (builds --log build-1791633042015855120).
--- the gate: build-agent, mesh-controller
mesh-controller: ok, 55 tool(s); WARNING: merge-window ask(s) for a setting and do(es) not say whether it is trusted, so it counts as trusted: set at the terminal alone; say "trusted" false where nothing trusts it (novox/hq issue 339); WARNING: controller stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8)
long-running resources without health: 1
files asking for a setting without saying whether it is trusted: 1
1 manifest(s) checked. Judged against the seats this binary carries; a claim on one of the mesh's own seats is judged fully at registration, and a seat declared by a module not given here reads as unknown. Identities judged on a 6-character machine name, against the bounds of the providers given here
judging 1 module(s) changed against 4 machine(s), as the snapshot of 2026-10-10T11:45:18Z says they run
composing every machine as the mesh is
the bus's user list leaves out 5 user(s) the mesh has minted no credential for: controller, node.f35, node.idt, node.ygcyr, node.yvbpsm. Each is a user that cannot connect until one is issued
the bus's user list leaves out 5 user(s) the mesh has minted no credential for: controller, node.f35, node.idt, node.ygcyr, node.yvbpsm. Each is a user that cannot connect until one is issued
composing every machine with the change
the bus's user list leaves out 5 user(s) the mesh has minted no credential for: controller, node.f35, node.idt, node.ygcyr, node.yvbpsm. Each is a user that cannot connect until one is issued
the bus's user list leaves out 5 user(s) the mesh has minted no credential for: controller, node.f35, node.idt, node.ygcyr, node.yvbpsm. Each is a user that cannot connect until one is issued
merge gate: PASS — every machine composes with the change as it did without (4 of 4 compose)
judged by controller development build against the facts of 2026-10-10T11:45:18Z
modules the change moves:
- mesh-controller (changed)
machines:
- a machine (f35): composes
- holds mesh-dns-resolver (idt): composes
- holds git, holds mesh-artifact-store, holds mesh-broker, holds mesh-catalog, holds mesh-delivery, holds mesh-dns-resolver, holds mesh-store, holds mesh-vault, holds npm-package-registry, the control node, the hub (ygcyr): composes; the change adds 1 resource(s) and removes 0 (+file:mesh-controller.merge-window)
- a machine (yvbpsm): composes
a merge would rebuild 2 module(s) in 2 tier(s): build-agent, mesh-controller
notes:
- cmd/mesh-controller/batches_test.go, cmd/mesh-controller/delivery_test.go, cmd/mesh-controller/issue349_test.go, cmd/mesh-controller/queue_test.go, cmd/mesh-controller/signals_test.go and cmd/mesh-controller/supersede_test.go read by no module's build, and rebuild nothing (issue 280)
--- its merge-check.sh (go toolchain)
ok github.com/novox/mesh-controller/cmd/mesh-builder 1.033s
ok github.com/novox/mesh-controller/cmd/mesh-controller 221.276s
ok github.com/novox/mesh-controller/examples/objectstore-provisioner 1.020s
ok github.com/novox/mesh-controller/examples/postgres-provisioner 1.025s
ok github.com/novox/mesh-controller/examples/redis-provisioner 1.017s
ok github.com/novox/mesh-controller/examples/route-proxy 1.196s
ok github.com/novox/mesh-controller/internal/artifacts 1.045s
ok github.com/novox/mesh-controller/internal/broker 2.709s
ok github.com/novox/mesh-controller/internal/builder 2.643s
ok github.com/novox/mesh-controller/internal/catalogue 4.670s
ok github.com/novox/mesh-controller/internal/conditions 2.398s
ok github.com/novox/mesh-controller/internal/envfile 1.023s
ok github.com/novox/mesh-controller/internal/facts 1.027s
ok github.com/novox/mesh-controller/internal/identity 4.317s
ok github.com/novox/mesh-controller/internal/inventory 78.932s
ok github.com/novox/mesh-controller/internal/lease 17.675s
ok github.com/novox/mesh-controller/internal/licences 3.913s
ok github.com/novox/mesh-controller/internal/licences/adapters 1.011s
ok github.com/novox/mesh-controller/internal/link 52.005s
ok github.com/novox/mesh-controller/internal/lint 2.044s
ok github.com/novox/mesh-controller/internal/outward 1.041s
ok github.com/novox/mesh-controller/internal/overlay 1.028s
ok github.com/novox/mesh-controller/internal/secrets 1.463s
ok github.com/novox/mesh-controller/internal/store 3.201s
ok github.com/novox/mesh-controller/internal/testbus 1.176s
ok github.com/novox/mesh-controller/internal/token 1.017s
**Merge check** at `0e0e1430`
- `mesh/merge-gate`: **PASS** — every machine composes with the change as it did without (4 of 4 compose) (modules: build-agent, mesh-controller)
- `mesh/repo-check`: **PASS** — its merge-check.sh passed
**Delivery plan** — builds build-agent, mesh-controller → ace, g14, novox, shanks; no bus step
- tier 0: mesh-controller
- tier 1: build-agent
- ace: receives build-agent
- g14: receives build-agent
- novox: receives mesh-controller, build-agent
- shanks: receives build-agent
- build-agent keeps data (ADR 0233): what it holds is backed up before it moves
- read by no module's build: cmd/mesh-controller/batches_test.go, cmd/mesh-controller/delivery_test.go, cmd/mesh-controller/issue349_test.go, cmd/mesh-controller/queue_test.go, cmd/mesh-controller/signals_test.go, cmd/mesh-controller/supersede_test.go
Run by the build seat on g14 as `build-1791633042015855120` (`builds --log build-1791633042015855120`).
```
--- the gate: build-agent, mesh-controller
mesh-controller: ok, 55 tool(s); WARNING: merge-window ask(s) for a setting and do(es) not say whether it is trusted, so it counts as trusted: set at the terminal alone; say "trusted" false where nothing trusts it (novox/hq issue 339); WARNING: controller stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8)
long-running resources without health: 1
files asking for a setting without saying whether it is trusted: 1
1 manifest(s) checked. Judged against the seats this binary carries; a claim on one of the mesh's own seats is judged fully at registration, and a seat declared by a module not given here reads as unknown. Identities judged on a 6-character machine name, against the bounds of the providers given here
judging 1 module(s) changed against 4 machine(s), as the snapshot of 2026-10-10T11:45:18Z says they run
composing every machine as the mesh is
the bus's user list leaves out 5 user(s) the mesh has minted no credential for: controller, node.f35, node.idt, node.ygcyr, node.yvbpsm. Each is a user that cannot connect until one is issued
the bus's user list leaves out 5 user(s) the mesh has minted no credential for: controller, node.f35, node.idt, node.ygcyr, node.yvbpsm. Each is a user that cannot connect until one is issued
composing every machine with the change
the bus's user list leaves out 5 user(s) the mesh has minted no credential for: controller, node.f35, node.idt, node.ygcyr, node.yvbpsm. Each is a user that cannot connect until one is issued
the bus's user list leaves out 5 user(s) the mesh has minted no credential for: controller, node.f35, node.idt, node.ygcyr, node.yvbpsm. Each is a user that cannot connect until one is issued
merge gate: PASS — every machine composes with the change as it did without (4 of 4 compose)
judged by controller development build against the facts of 2026-10-10T11:45:18Z
modules the change moves:
- mesh-controller (changed)
machines:
- a machine (f35): composes
- holds mesh-dns-resolver (idt): composes
- holds git, holds mesh-artifact-store, holds mesh-broker, holds mesh-catalog, holds mesh-delivery, holds mesh-dns-resolver, holds mesh-store, holds mesh-vault, holds npm-package-registry, the control node, the hub (ygcyr): composes; the change adds 1 resource(s) and removes 0 (+file:mesh-controller.merge-window)
- a machine (yvbpsm): composes
a merge would rebuild 2 module(s) in 2 tier(s): build-agent, mesh-controller
notes:
- cmd/mesh-controller/batches_test.go, cmd/mesh-controller/delivery_test.go, cmd/mesh-controller/issue349_test.go, cmd/mesh-controller/queue_test.go, cmd/mesh-controller/signals_test.go and cmd/mesh-controller/supersede_test.go read by no module's build, and rebuild nothing (issue 280)
--- its merge-check.sh (go toolchain)
ok github.com/novox/mesh-controller/cmd/mesh-builder 1.033s
ok github.com/novox/mesh-controller/cmd/mesh-controller 221.276s
ok github.com/novox/mesh-controller/examples/objectstore-provisioner 1.020s
ok github.com/novox/mesh-controller/examples/postgres-provisioner 1.025s
ok github.com/novox/mesh-controller/examples/redis-provisioner 1.017s
ok github.com/novox/mesh-controller/examples/route-proxy 1.196s
ok github.com/novox/mesh-controller/internal/artifacts 1.045s
ok github.com/novox/mesh-controller/internal/broker 2.709s
ok github.com/novox/mesh-controller/internal/builder 2.643s
ok github.com/novox/mesh-controller/internal/catalogue 4.670s
ok github.com/novox/mesh-controller/internal/conditions 2.398s
ok github.com/novox/mesh-controller/internal/envfile 1.023s
ok github.com/novox/mesh-controller/internal/facts 1.027s
ok github.com/novox/mesh-controller/internal/identity 4.317s
ok github.com/novox/mesh-controller/internal/inventory 78.932s
ok github.com/novox/mesh-controller/internal/lease 17.675s
ok github.com/novox/mesh-controller/internal/licences 3.913s
ok github.com/novox/mesh-controller/internal/licences/adapters 1.011s
ok github.com/novox/mesh-controller/internal/link 52.005s
ok github.com/novox/mesh-controller/internal/lint 2.044s
ok github.com/novox/mesh-controller/internal/outward 1.041s
ok github.com/novox/mesh-controller/internal/overlay 1.028s
ok github.com/novox/mesh-controller/internal/secrets 1.463s
ok github.com/novox/mesh-controller/internal/store 3.201s
ok github.com/novox/mesh-controller/internal/testbus 1.176s
ok github.com/novox/mesh-controller/internal/token 1.017s
```
mesh/merge-gate: PASS — every machine composes with the change as it did without (4 of 4 compose) (modules: build-agent, mesh-controller)
mesh/repo-check: PASS — its merge-check.sh passed
Delivery plan — builds build-agent, mesh-controller → ace, g14, novox, shanks; no bus step
tier 0: mesh-controller
tier 1: build-agent
ace: receives build-agent
g14: receives build-agent
novox: receives mesh-controller, build-agent
shanks: receives build-agent
build-agent keeps data (ADR 0233): what it holds is backed up before it moves
read by no module's build: cmd/mesh-controller/batches_test.go, cmd/mesh-controller/delivery_test.go, cmd/mesh-controller/issue349_test.go, cmd/mesh-controller/queue_test.go, cmd/mesh-controller/signals_test.go, cmd/mesh-controller/supersede_test.go
Run by the build seat on ace as build-1791633286314485292 (builds --log build-1791633286314485292).
--- the gate: build-agent, mesh-controller
mesh-controller: ok, 55 tool(s); WARNING: merge-window ask(s) for a setting and do(es) not say whether it is trusted, so it counts as trusted: set at the terminal alone; say "trusted" false where nothing trusts it (novox/hq issue 339); WARNING: controller stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8)
long-running resources without health: 1
files asking for a setting without saying whether it is trusted: 1
1 manifest(s) checked. Judged against the seats this binary carries; a claim on one of the mesh's own seats is judged fully at registration, and a seat declared by a module not given here reads as unknown. Identities judged on a 6-character machine name, against the bounds of the providers given here
judging 1 module(s) changed against 4 machine(s), as the snapshot of 2026-10-10T11:45:18Z says they run
composing every machine as the mesh is
the bus's user list leaves out 5 user(s) the mesh has minted no credential for: controller, node.f35, node.idt, node.ygcyr, node.yvbpsm. Each is a user that cannot connect until one is issued
the bus's user list leaves out 5 user(s) the mesh has minted no credential for: controller, node.f35, node.idt, node.ygcyr, node.yvbpsm. Each is a user that cannot connect until one is issued
composing every machine with the change
the bus's user list leaves out 5 user(s) the mesh has minted no credential for: controller, node.f35, node.idt, node.ygcyr, node.yvbpsm. Each is a user that cannot connect until one is issued
the bus's user list leaves out 5 user(s) the mesh has minted no credential for: controller, node.f35, node.idt, node.ygcyr, node.yvbpsm. Each is a user that cannot connect until one is issued
merge gate: PASS — every machine composes with the change as it did without (4 of 4 compose)
judged by controller development build against the facts of 2026-10-10T11:45:18Z
modules the change moves:
- mesh-controller (changed)
machines:
- a machine (f35): composes
- holds mesh-dns-resolver (idt): composes
- holds git, holds mesh-artifact-store, holds mesh-broker, holds mesh-catalog, holds mesh-delivery, holds mesh-dns-resolver, holds mesh-store, holds mesh-vault, holds npm-package-registry, the control node, the hub (ygcyr): composes; the change adds 1 resource(s) and removes 0 (+file:mesh-controller.merge-window)
- a machine (yvbpsm): composes
a merge would rebuild 2 module(s) in 2 tier(s): build-agent, mesh-controller
notes:
- cmd/mesh-controller/batches_test.go, cmd/mesh-controller/delivery_test.go, cmd/mesh-controller/issue349_test.go, cmd/mesh-controller/queue_test.go, cmd/mesh-controller/signals_test.go and cmd/mesh-controller/supersede_test.go read by no module's build, and rebuild nothing (issue 280)
--- its merge-check.sh (go toolchain)
ok github.com/novox/mesh-controller/cmd/mesh-builder 1.033s
ok github.com/novox/mesh-controller/cmd/mesh-controller 197.299s
ok github.com/novox/mesh-controller/examples/objectstore-provisioner 1.025s
ok github.com/novox/mesh-controller/examples/postgres-provisioner 1.038s
ok github.com/novox/mesh-controller/examples/redis-provisioner 1.023s
ok github.com/novox/mesh-controller/examples/route-proxy 1.129s
ok github.com/novox/mesh-controller/internal/artifacts 1.073s
ok github.com/novox/mesh-controller/internal/broker 2.605s
ok github.com/novox/mesh-controller/internal/builder 2.457s
ok github.com/novox/mesh-controller/internal/catalogue 4.458s
ok github.com/novox/mesh-controller/internal/conditions 2.451s
ok github.com/novox/mesh-controller/internal/envfile 1.033s
ok github.com/novox/mesh-controller/internal/facts 1.036s
ok github.com/novox/mesh-controller/internal/identity 4.068s
ok github.com/novox/mesh-controller/internal/inventory 74.245s
ok github.com/novox/mesh-controller/internal/lease 17.678s
ok github.com/novox/mesh-controller/internal/licences 3.711s
ok github.com/novox/mesh-controller/internal/licences/adapters 1.024s
ok github.com/novox/mesh-controller/internal/link 51.248s
ok github.com/novox/mesh-controller/internal/lint 2.053s
ok github.com/novox/mesh-controller/internal/outward 1.084s
ok github.com/novox/mesh-controller/internal/overlay 1.071s
ok github.com/novox/mesh-controller/internal/secrets 1.423s
ok github.com/novox/mesh-controller/internal/store 3.244s
ok github.com/novox/mesh-controller/internal/testbus 1.231s
ok github.com/novox/mesh-controller/internal/token 1.016s
**Merge check** at `065cfa0d`
- `mesh/merge-gate`: **PASS** — every machine composes with the change as it did without (4 of 4 compose) (modules: build-agent, mesh-controller)
- `mesh/repo-check`: **PASS** — its merge-check.sh passed
**Delivery plan** — builds build-agent, mesh-controller → ace, g14, novox, shanks; no bus step
- tier 0: mesh-controller
- tier 1: build-agent
- ace: receives build-agent
- g14: receives build-agent
- novox: receives mesh-controller, build-agent
- shanks: receives build-agent
- build-agent keeps data (ADR 0233): what it holds is backed up before it moves
- read by no module's build: cmd/mesh-controller/batches_test.go, cmd/mesh-controller/delivery_test.go, cmd/mesh-controller/issue349_test.go, cmd/mesh-controller/queue_test.go, cmd/mesh-controller/signals_test.go, cmd/mesh-controller/supersede_test.go
Run by the build seat on ace as `build-1791633286314485292` (`builds --log build-1791633286314485292`).
```
--- the gate: build-agent, mesh-controller
mesh-controller: ok, 55 tool(s); WARNING: merge-window ask(s) for a setting and do(es) not say whether it is trusted, so it counts as trusted: set at the terminal alone; say "trusted" false where nothing trusts it (novox/hq issue 339); WARNING: controller stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8)
long-running resources without health: 1
files asking for a setting without saying whether it is trusted: 1
1 manifest(s) checked. Judged against the seats this binary carries; a claim on one of the mesh's own seats is judged fully at registration, and a seat declared by a module not given here reads as unknown. Identities judged on a 6-character machine name, against the bounds of the providers given here
judging 1 module(s) changed against 4 machine(s), as the snapshot of 2026-10-10T11:45:18Z says they run
composing every machine as the mesh is
the bus's user list leaves out 5 user(s) the mesh has minted no credential for: controller, node.f35, node.idt, node.ygcyr, node.yvbpsm. Each is a user that cannot connect until one is issued
the bus's user list leaves out 5 user(s) the mesh has minted no credential for: controller, node.f35, node.idt, node.ygcyr, node.yvbpsm. Each is a user that cannot connect until one is issued
composing every machine with the change
the bus's user list leaves out 5 user(s) the mesh has minted no credential for: controller, node.f35, node.idt, node.ygcyr, node.yvbpsm. Each is a user that cannot connect until one is issued
the bus's user list leaves out 5 user(s) the mesh has minted no credential for: controller, node.f35, node.idt, node.ygcyr, node.yvbpsm. Each is a user that cannot connect until one is issued
merge gate: PASS — every machine composes with the change as it did without (4 of 4 compose)
judged by controller development build against the facts of 2026-10-10T11:45:18Z
modules the change moves:
- mesh-controller (changed)
machines:
- a machine (f35): composes
- holds mesh-dns-resolver (idt): composes
- holds git, holds mesh-artifact-store, holds mesh-broker, holds mesh-catalog, holds mesh-delivery, holds mesh-dns-resolver, holds mesh-store, holds mesh-vault, holds npm-package-registry, the control node, the hub (ygcyr): composes; the change adds 1 resource(s) and removes 0 (+file:mesh-controller.merge-window)
- a machine (yvbpsm): composes
a merge would rebuild 2 module(s) in 2 tier(s): build-agent, mesh-controller
notes:
- cmd/mesh-controller/batches_test.go, cmd/mesh-controller/delivery_test.go, cmd/mesh-controller/issue349_test.go, cmd/mesh-controller/queue_test.go, cmd/mesh-controller/signals_test.go and cmd/mesh-controller/supersede_test.go read by no module's build, and rebuild nothing (issue 280)
--- its merge-check.sh (go toolchain)
ok github.com/novox/mesh-controller/cmd/mesh-builder 1.033s
ok github.com/novox/mesh-controller/cmd/mesh-controller 197.299s
ok github.com/novox/mesh-controller/examples/objectstore-provisioner 1.025s
ok github.com/novox/mesh-controller/examples/postgres-provisioner 1.038s
ok github.com/novox/mesh-controller/examples/redis-provisioner 1.023s
ok github.com/novox/mesh-controller/examples/route-proxy 1.129s
ok github.com/novox/mesh-controller/internal/artifacts 1.073s
ok github.com/novox/mesh-controller/internal/broker 2.605s
ok github.com/novox/mesh-controller/internal/builder 2.457s
ok github.com/novox/mesh-controller/internal/catalogue 4.458s
ok github.com/novox/mesh-controller/internal/conditions 2.451s
ok github.com/novox/mesh-controller/internal/envfile 1.033s
ok github.com/novox/mesh-controller/internal/facts 1.036s
ok github.com/novox/mesh-controller/internal/identity 4.068s
ok github.com/novox/mesh-controller/internal/inventory 74.245s
ok github.com/novox/mesh-controller/internal/lease 17.678s
ok github.com/novox/mesh-controller/internal/licences 3.711s
ok github.com/novox/mesh-controller/internal/licences/adapters 1.024s
ok github.com/novox/mesh-controller/internal/link 51.248s
ok github.com/novox/mesh-controller/internal/lint 2.053s
ok github.com/novox/mesh-controller/internal/outward 1.084s
ok github.com/novox/mesh-controller/internal/overlay 1.071s
ok github.com/novox/mesh-controller/internal/secrets 1.423s
ok github.com/novox/mesh-controller/internal/store 3.244s
ok github.com/novox/mesh-controller/internal/testbus 1.231s
ok github.com/novox/mesh-controller/internal/token 1.016s
```
mesh/merge-gate pass: builds build-agent, mesh-controller → ace, g14, novox, shanks; no bus step; every machine composes with the change as it did without …
mesh/merge-gate: PASS — every machine composes with the change as it did without (4 of 4 compose) (modules: build-agent, mesh-controller)
mesh/repo-check: FAIL — its merge-check.sh failed: FAIL github.com/novox/mesh-controller/cmd/mesh-controller 226.280s
Delivery plan — builds build-agent, mesh-controller → ace, g14, novox, shanks; no bus step
tier 0: mesh-controller
tier 1: build-agent
ace: receives build-agent
g14: receives build-agent
novox: receives mesh-controller, build-agent
shanks: receives build-agent
build-agent keeps data (ADR 0233): what it holds is backed up before it moves
read by no module's build: cmd/mesh-controller/batches_test.go, cmd/mesh-controller/delivery_test.go, cmd/mesh-controller/issue349_test.go, cmd/mesh-controller/queue_test.go, cmd/mesh-controller/signals_test.go, cmd/mesh-controller/supersede_test.go
Run by the build seat on shanks as build-1791634260735600549 (builds --log build-1791634260735600549).
build-1791630991979045383: the build seat did not say whether c1aaaaaa is on its repository's trunk (it predates ADR 0238); registered as before
build-1791631051979045383: the build seat did not say whether c2bbbbbb is on its repository's trunk (it predates ADR 0238); registered as before
app at c2bbbbbb was made from the source build-1791630991979045383 was: registered with its artifacts, no move
build-1791631111979045383: the build seat did not say whether c3cccccc is on its repository's trunk (it predates ADR 0238); registered as before
build-1791631171979045383: the build seat did not say whether c4dddddd is on its repository's trunk (it predates ADR 0238); registered as before
build-1791630992463233009: nats is new to the catalogue, and novox/mesh-catalog on the git seat is no repository the catalogue builds a module from — registered, as asked at the controller's terminal
build-1791630992463233009: the build seat did not say whether n1111111 is on its repository's trunk (it predates ADR 0238); registered as before
build-1791631052463233009: the build seat did not say whether n2222222 is on its repository's trunk (it predates ADR 0238); registered as before
nats at n2222222 was made from the source build-1791630992463233009 was: registered with its artifacts, no move
every machine running nats runs the build the mesh holds (n2222222): nothing to upgrade
build-1791631112463233009: the build seat did not say whether n3333333 is on its repository's trunk (it predates ADR 0238); registered as before
plan-gate: app built from the source every machine running it runs: no move, nothing sent
plan-gate: done — novox/mesh-catalog at c2, 1 tier(s)
plan-gate: tier 0 built; sent 1 module(s) to anchor first in one send (app), the rest once its gate passes
status could not be composed (after 0s): the store did not answer — `status` answers the last summary, with its age
anchor is not counted as on the network: it does not resolve: these assignments cannot be applied:
- rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is not counted as on the network: it does not resolve: these assignments cannot be applied:
- rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is not counted as on the network: it does not resolve: these assignments cannot be applied:
- rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is left out of the rest of the mesh: it does not resolve: these assignments cannot be applied:
- rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is not counted as on the network: it does not resolve: these assignments cannot be applied:
- rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is not counted as on the network: it does not resolve: these assignments cannot be applied:
- rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is not counted as on the network: it does not resolve: these assignments cannot be applied:
- rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is not counted as on the network: it does not resolve: these assignments cannot be applied:
- rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is left out of the rest of the mesh: it does not resolve: these assignments cannot be applied:
- rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is not counted as on the network: it does not resolve: these assignments cannot be applied:
- rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is not counted as on the network: it does not resolve: these assignments cannot be applied:
- rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is not counted as on the network: it does not resolve: these assignments cannot be applied:
- rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is not counted as on the network: it does not resolve: these assignments cannot be applied:
- rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is left out of the rest of the mesh: it does not resolve: these assignments cannot be applied:
- rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is not counted as on the network: it does not resolve: these assignments cannot be applied:
- rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is not counted as on the network: it does not resolve: these assignments cannot be applied:
- rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is not counted as on the network: it does not resolve: these assignments cannot be applied:
- rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is not counted as on the network: it does not resolve: these assignments cannot be applied:
- rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is left out of the rest of the mesh: it does not resolve: these assignments cannot be applied:
- rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is not counted as on the network: it does not resolve: these assignments cannot be applied:
- rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is not counted as on the network: it does not resolve: these assignments cannot be applied:
- rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is not counted as on the network: it does not resolve: these assignments cannot be applied:
- rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is not counted as on the network: it does not resolve: these assignments cannot be applied:
- rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is left out of the rest of the mesh: it does not resolve: these assignments cannot be applied:
- rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is not counted as on the network: it does not resolve: these assignments cannot be applied:
- rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is not counted as on the network: it does not resolve: these assignments cannot be applied:
- rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is not counted as on the network: it does not resolve: these assignments cannot be applied:
- rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is not counted as on the network: it does not resolve: these assignments cannot be applied:
- rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is left out of the rest of the mesh: it does not resolve: these assignments cannot be applied:
- rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is not counted as on the network: it does not resolve: these assignments cannot be applied:
- rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is not counted as on the network: it does not resolve: these assignments cannot be applied:
- rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is not counted as on the network: it does not resolve: these assignments cannot be applied:
- rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is not counted as on the network: it does not resolve: these assignments cannot be applied:
- rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is left out of the rest of the mesh: it does not resolve: these assignments cannot be applied:
- rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is not counted as on the network: it does not resolve: these assignments cannot be applied:
- rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is not counted as on the network: it does not resolve: these assignments cannot be applied:
- rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is not counted as on the network: it does not resolve: these assignments cannot be applied:
- rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is not counted as on the network: it does not resolve: these assignments cannot be applied:
- rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is left out of the rest of the mesh: it does not resolve: these assignments cannot be applied:
- rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is not counted as on the network: it does not resolve: these assignments cannot be applied:
- rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
notes on laptop:
+ places.data.owner
+ places.data.path
+ x
run `plan laptop --diff` to see what it changes, `push laptop` to send it
notes on laptop:
~ x
the layer it replaced is kept: settings show notes --node laptop --history
run `plan laptop --diff` to see what it changes, `push laptop` to send it
{
"places": {
"data": {
"owner": "1001:1001",
"path": "/srv/notes"
}
},
"x": 1
}
keycloak on anchor:
+ issuer
+ x
run `plan anchor --diff` to see what it changes, `push anchor` to send it
power on anchor:
+ lid
+ x
run `plan anchor --diff` to see what it changes, `push anchor` to send it
keycloak on anchor:
~ x
the layer it replaced is kept: settings show keycloak --node anchor --history
run `plan anchor --diff` to see what it changes, `push anchor` to send it
claude-code on laptop:
+ managed_settings.permissions.allow
run `plan laptop --diff` to see what it changes, `push laptop` to send it
claude-code on the whole mesh:
+ mcp_servers.listener.type
+ mcp_servers.listener.url
run `push --behind` to send it to the machines running it
{
"managed_settings": {
"permissions": {
"allow": [
"Bash"
]
}
}
}
keycloak on anchor:
+ url
run `plan anchor --diff` to see what it changes, `push anchor` to send it
{
"url": "https://id.example"
}
notifier on anchor:
+ font
run `plan anchor --diff` to see what it changes, `push anchor` to send it
plan-tier: tier 0 built; sent 12 module(s) to anchor first in one send (m01, m02, m03, m04, m05, m06, m07, m08, m09, m10, m11, m12), the rest once its gate passes
plan-tier: m01 passed its gate on anchor (healthy 3 times over 0s); the rest are sent
plan-tier: tier 0 built; sent m01, m02, m03, m04, m05, m06, m07, m08, m09, m10, m11, m12 to laptop, one send each
plan-tier: done — novox/mesh-catalog at c2, 1 tier(s)
plan-tier: tier 0 built; sent 3 module(s) to anchor first in one send (app1, app2, node-tools), the rest once its gate passes
node-tools's build c2 failed its gate on anchor and was put back to c1: not healthy within -1s of its apply: raised since it was sent: machine.anchor.core-behind — anchor runs the node tools it was last sent, not yet reported applied, and no plan is rolling them out (its settle window runs to the gate's bound)
plan-tier: the send to anchor in tier 0 failed its gate: not healthy within -1s of its apply: raised since it was sent: machine.anchor.core-behind — anchor runs the node tools it was last sent, not yet reported applied, and no plan is rolling them out (its settle window runs to the gate's bound); app1 passed on its own and is kept; passed on their own and kept: app2; node-tools failed its gate on anchor in tier 0: not healthy within -1s of its apply: raised since it was sent: machine.anchor.core-behind — anchor runs the node tools it was last sent, not yet reported applied, and no plan is rolling them out (its settle window runs to the gate's bound); put back node-tools to c1 on anchor, in one send; none reported left as it was
plan-tier: tier 0 built; sent 3 module(s) to anchor first in one send (app1, app2, app3), the rest once its gate passes
app1's build c2 failed its gate on anchor and was put back to c1: not healthy within -1s of its apply: anchor as a whole: raised since it was sent: machine.anchor.disk-full — anchor's root file system is full
app2's build c2 failed its gate on anchor and was put back to c1: not healthy within -1s of its apply: anchor as a whole: raised since it was sent: machine.anchor.disk-full — anchor's root file system is full
app3's build c2 failed its gate on anchor and was put back to c1: not healthy within -1s of its apply: anchor as a whole: raised since it was sent: machine.anchor.disk-full — anchor's root file system is full
plan-tier: app1 failed its gate on anchor in tier 0: not healthy within -1s of its apply: anchor as a whole: raised since it was sent: machine.anchor.disk-full — anchor's root file system is full; app2 failed its gate on anchor in tier 0: not healthy within -1s of its apply: anchor as a whole: raised since it was sent: machine.anchor.disk-full — anchor's root file system is full; app3 failed its gate on anchor in tier 0: not healthy within -1s of its apply: anchor as a whole: raised since it was sent: machine.anchor.disk-full — anchor's root file system is full; put back app1 to c1, app2 to c1, app3 to c1 on anchor, in one send; none reported left as it was
plan-gate: tier 0 built; sent 1 module(s) to anchor first in one send (app), the rest once its gate passes
plan-gate: the send to anchor in tier 0 failed its gate: not healthy within -1s of its apply: anchor has not reported on what it was sent; app was left as it was — anchor already ran app c2, or a build identical to it, before the send, so nothing of it moved and nothing is put back
plan-gate: the send to anchor in tier 0 failed its gate: not healthy within -1s of its apply: anchor has not reported on what it was sent; app was left as it was — anchor already ran app c2, or a build identical to it, before the send, so nothing of it moved and nothing is put back; none reported left as it was
tier 0: plan-tier: tier 0 built; sent 2 module(s) to anchor first in one send (node-tools, app1), the rest once its gate passes
node-tools's build c2 failed its gate on anchor and was put back to c1: the witness on anchor judged the node-tools c2 and rolled-back: the node tools did not answer
plan-tier: put back at once: node-tools (the witness on anchor judged the node-tools c2 and rolled-back: the node tools did not answer); the rest of the send judged to their own verdicts
plan-tier: the send to anchor in tier 0 failed its gate: the witness on anchor judged the node-tools c2 and rolled-back: the node tools did not answer; node-tools was put back when it broke; passed on their own and kept: app1; none reported left as it was
plan-tier: tier 0 built; sent 2 module(s) to anchor first in one send (app1, node-tools), the rest once its gate passes
node-tools's build c2 failed its gate on anchor and was put back to c1: the witness on anchor judged the node-tools c2 and rolled-back: the node tools did not answer
plan-tier: put back at once: node-tools (the witness on anchor judged the node-tools c2 and rolled-back: the node tools did not answer); the rest of the send judged to their own verdicts
plan-tier: the send to anchor in tier 0 failed its gate: the witness on anchor judged the node-tools c2 and rolled-back: the node tools did not answer; app1 passed on its own and is kept; none reported left as it was
FAIL
FAIL github.com/novox/mesh-controller/cmd/mesh-controller 226.280s
ok github.com/novox/mesh-controller/examples/objectstore-provisioner 1.010s
ok github.com/novox/mesh-controller/examples/postgres-provisioner 1.035s
ok github.com/novox/mesh-controller/examples/redis-provisioner 1.039s
ok github.com/novox/mesh-controller/examples/route-proxy 1.239s
ok github.com/novox/mesh-controller/internal/artifacts 1.082s
ok github.com/novox/mesh-controller/internal/broker 2.833s
ok github.com/novox/mesh-controller/internal/builder 2.746s
ok github.com/novox/mesh-controller/internal/catalogue 5.148s
ok github.com/novox/mesh-controller/internal/conditions 2.588s
ok github.com/novox/mesh-controller/internal/envfile 1.046s
ok github.com/novox/mesh-controller/internal/facts 1.056s
ok github.com/novox/mesh-controller/internal/identity 4.763s
ok github.com/novox/mesh-controller/internal/inventory 88.370s
ok github.com/novox/mesh-controller/internal/lease 17.696s
ok github.com/novox/mesh-controller/internal/licences 4.332s
ok github.com/novox/mesh-controller/internal/licences/adapters 1.037s
ok github.com/novox/mesh-controller/internal/link 54.074s
ok github.com/novox/mesh-controller/internal/lint 2.296s
ok github.com/novox/mesh-controller/internal/outward 1.083s
ok github.com/novox/mesh-controller/internal/overlay 1.073s
ok github.com/novox/mesh-controller/internal/secrets 1.529s
ok github.com/novox/mesh-controller/internal/store 3.485s
ok github.com/novox/mesh-controller/internal/testbus 1.242s
ok github.com/novox/mesh-controller/internal/token 1.015s
FAIL
**Merge check** at `d0c9b9b4`
- `mesh/merge-gate`: **PASS** — every machine composes with the change as it did without (4 of 4 compose) (modules: build-agent, mesh-controller)
- `mesh/repo-check`: **FAIL** — its merge-check.sh failed: FAIL github.com/novox/mesh-controller/cmd/mesh-controller 226.280s
**Delivery plan** — builds build-agent, mesh-controller → ace, g14, novox, shanks; no bus step
- tier 0: mesh-controller
- tier 1: build-agent
- ace: receives build-agent
- g14: receives build-agent
- novox: receives mesh-controller, build-agent
- shanks: receives build-agent
- build-agent keeps data (ADR 0233): what it holds is backed up before it moves
- read by no module's build: cmd/mesh-controller/batches_test.go, cmd/mesh-controller/delivery_test.go, cmd/mesh-controller/issue349_test.go, cmd/mesh-controller/queue_test.go, cmd/mesh-controller/signals_test.go, cmd/mesh-controller/supersede_test.go
Run by the build seat on shanks as `build-1791634260735600549` (`builds --log build-1791634260735600549`).
```
build-1791630991979045383: the build seat did not say whether c1aaaaaa is on its repository's trunk (it predates ADR 0238); registered as before
build-1791631051979045383: the build seat did not say whether c2bbbbbb is on its repository's trunk (it predates ADR 0238); registered as before
app at c2bbbbbb was made from the source build-1791630991979045383 was: registered with its artifacts, no move
build-1791631111979045383: the build seat did not say whether c3cccccc is on its repository's trunk (it predates ADR 0238); registered as before
build-1791631171979045383: the build seat did not say whether c4dddddd is on its repository's trunk (it predates ADR 0238); registered as before
build-1791630992463233009: nats is new to the catalogue, and novox/mesh-catalog on the git seat is no repository the catalogue builds a module from — registered, as asked at the controller's terminal
build-1791630992463233009: the build seat did not say whether n1111111 is on its repository's trunk (it predates ADR 0238); registered as before
build-1791631052463233009: the build seat did not say whether n2222222 is on its repository's trunk (it predates ADR 0238); registered as before
nats at n2222222 was made from the source build-1791630992463233009 was: registered with its artifacts, no move
every machine running nats runs the build the mesh holds (n2222222): nothing to upgrade
build-1791631112463233009: the build seat did not say whether n3333333 is on its repository's trunk (it predates ADR 0238); registered as before
plan-gate: app built from the source every machine running it runs: no move, nothing sent
plan-gate: done — novox/mesh-catalog at c2, 1 tier(s)
plan-gate: tier 0 built; sent 1 module(s) to anchor first in one send (app), the rest once its gate passes
status could not be composed (after 0s): the store did not answer — `status` answers the last summary, with its age
anchor is not counted as on the network: it does not resolve: these assignments cannot be applied:
- rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is not counted as on the network: it does not resolve: these assignments cannot be applied:
- rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is not counted as on the network: it does not resolve: these assignments cannot be applied:
- rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is left out of the rest of the mesh: it does not resolve: these assignments cannot be applied:
- rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is not counted as on the network: it does not resolve: these assignments cannot be applied:
- rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is not counted as on the network: it does not resolve: these assignments cannot be applied:
- rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is not counted as on the network: it does not resolve: these assignments cannot be applied:
- rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is not counted as on the network: it does not resolve: these assignments cannot be applied:
- rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is left out of the rest of the mesh: it does not resolve: these assignments cannot be applied:
- rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is not counted as on the network: it does not resolve: these assignments cannot be applied:
- rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is not counted as on the network: it does not resolve: these assignments cannot be applied:
- rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is not counted as on the network: it does not resolve: these assignments cannot be applied:
- rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is not counted as on the network: it does not resolve: these assignments cannot be applied:
- rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is left out of the rest of the mesh: it does not resolve: these assignments cannot be applied:
- rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is not counted as on the network: it does not resolve: these assignments cannot be applied:
- rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is not counted as on the network: it does not resolve: these assignments cannot be applied:
- rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is not counted as on the network: it does not resolve: these assignments cannot be applied:
- rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is not counted as on the network: it does not resolve: these assignments cannot be applied:
- rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is left out of the rest of the mesh: it does not resolve: these assignments cannot be applied:
- rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is not counted as on the network: it does not resolve: these assignments cannot be applied:
- rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is not counted as on the network: it does not resolve: these assignments cannot be applied:
- rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is not counted as on the network: it does not resolve: these assignments cannot be applied:
- rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is not counted as on the network: it does not resolve: these assignments cannot be applied:
- rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is left out of the rest of the mesh: it does not resolve: these assignments cannot be applied:
- rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is not counted as on the network: it does not resolve: these assignments cannot be applied:
- rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is not counted as on the network: it does not resolve: these assignments cannot be applied:
- rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is not counted as on the network: it does not resolve: these assignments cannot be applied:
- rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is not counted as on the network: it does not resolve: these assignments cannot be applied:
- rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is left out of the rest of the mesh: it does not resolve: these assignments cannot be applied:
- rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is not counted as on the network: it does not resolve: these assignments cannot be applied:
- rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is not counted as on the network: it does not resolve: these assignments cannot be applied:
- rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is not counted as on the network: it does not resolve: these assignments cannot be applied:
- rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is not counted as on the network: it does not resolve: these assignments cannot be applied:
- rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is left out of the rest of the mesh: it does not resolve: these assignments cannot be applied:
- rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is not counted as on the network: it does not resolve: these assignments cannot be applied:
- rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is not counted as on the network: it does not resolve: these assignments cannot be applied:
- rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is not counted as on the network: it does not resolve: these assignments cannot be applied:
- rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is not counted as on the network: it does not resolve: these assignments cannot be applied:
- rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is left out of the rest of the mesh: it does not resolve: these assignments cannot be applied:
- rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is not counted as on the network: it does not resolve: these assignments cannot be applied:
- rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
notes on laptop:
+ places.data.owner
+ places.data.path
+ x
run `plan laptop --diff` to see what it changes, `push laptop` to send it
notes on laptop:
~ x
the layer it replaced is kept: settings show notes --node laptop --history
run `plan laptop --diff` to see what it changes, `push laptop` to send it
{
"places": {
"data": {
"owner": "1001:1001",
"path": "/srv/notes"
}
},
"x": 1
}
keycloak on anchor:
+ issuer
+ x
run `plan anchor --diff` to see what it changes, `push anchor` to send it
power on anchor:
+ lid
+ x
run `plan anchor --diff` to see what it changes, `push anchor` to send it
keycloak on anchor:
~ x
the layer it replaced is kept: settings show keycloak --node anchor --history
run `plan anchor --diff` to see what it changes, `push anchor` to send it
claude-code on laptop:
+ managed_settings.permissions.allow
run `plan laptop --diff` to see what it changes, `push laptop` to send it
claude-code on the whole mesh:
+ mcp_servers.listener.type
+ mcp_servers.listener.url
run `push --behind` to send it to the machines running it
{
"managed_settings": {
"permissions": {
"allow": [
"Bash"
]
}
}
}
keycloak on anchor:
+ url
run `plan anchor --diff` to see what it changes, `push anchor` to send it
{
"url": "https://id.example"
}
notifier on anchor:
+ font
run `plan anchor --diff` to see what it changes, `push anchor` to send it
plan-tier: tier 0 built; sent 12 module(s) to anchor first in one send (m01, m02, m03, m04, m05, m06, m07, m08, m09, m10, m11, m12), the rest once its gate passes
plan-tier: m01 passed its gate on anchor (healthy 3 times over 0s); the rest are sent
plan-tier: tier 0 built; sent m01, m02, m03, m04, m05, m06, m07, m08, m09, m10, m11, m12 to laptop, one send each
plan-tier: done — novox/mesh-catalog at c2, 1 tier(s)
plan-tier: tier 0 built; sent 3 module(s) to anchor first in one send (app1, app2, node-tools), the rest once its gate passes
node-tools's build c2 failed its gate on anchor and was put back to c1: not healthy within -1s of its apply: raised since it was sent: machine.anchor.core-behind — anchor runs the node tools it was last sent, not yet reported applied, and no plan is rolling them out (its settle window runs to the gate's bound)
plan-tier: the send to anchor in tier 0 failed its gate: not healthy within -1s of its apply: raised since it was sent: machine.anchor.core-behind — anchor runs the node tools it was last sent, not yet reported applied, and no plan is rolling them out (its settle window runs to the gate's bound); app1 passed on its own and is kept; passed on their own and kept: app2; node-tools failed its gate on anchor in tier 0: not healthy within -1s of its apply: raised since it was sent: machine.anchor.core-behind — anchor runs the node tools it was last sent, not yet reported applied, and no plan is rolling them out (its settle window runs to the gate's bound); put back node-tools to c1 on anchor, in one send; none reported left as it was
plan-tier: tier 0 built; sent 3 module(s) to anchor first in one send (app1, app2, app3), the rest once its gate passes
app1's build c2 failed its gate on anchor and was put back to c1: not healthy within -1s of its apply: anchor as a whole: raised since it was sent: machine.anchor.disk-full — anchor's root file system is full
app2's build c2 failed its gate on anchor and was put back to c1: not healthy within -1s of its apply: anchor as a whole: raised since it was sent: machine.anchor.disk-full — anchor's root file system is full
app3's build c2 failed its gate on anchor and was put back to c1: not healthy within -1s of its apply: anchor as a whole: raised since it was sent: machine.anchor.disk-full — anchor's root file system is full
plan-tier: app1 failed its gate on anchor in tier 0: not healthy within -1s of its apply: anchor as a whole: raised since it was sent: machine.anchor.disk-full — anchor's root file system is full; app2 failed its gate on anchor in tier 0: not healthy within -1s of its apply: anchor as a whole: raised since it was sent: machine.anchor.disk-full — anchor's root file system is full; app3 failed its gate on anchor in tier 0: not healthy within -1s of its apply: anchor as a whole: raised since it was sent: machine.anchor.disk-full — anchor's root file system is full; put back app1 to c1, app2 to c1, app3 to c1 on anchor, in one send; none reported left as it was
plan-gate: tier 0 built; sent 1 module(s) to anchor first in one send (app), the rest once its gate passes
plan-gate: the send to anchor in tier 0 failed its gate: not healthy within -1s of its apply: anchor has not reported on what it was sent; app was left as it was — anchor already ran app c2, or a build identical to it, before the send, so nothing of it moved and nothing is put back
plan-gate: the send to anchor in tier 0 failed its gate: not healthy within -1s of its apply: anchor has not reported on what it was sent; app was left as it was — anchor already ran app c2, or a build identical to it, before the send, so nothing of it moved and nothing is put back; none reported left as it was
tier 0: plan-tier: tier 0 built; sent 2 module(s) to anchor first in one send (node-tools, app1), the rest once its gate passes
node-tools's build c2 failed its gate on anchor and was put back to c1: the witness on anchor judged the node-tools c2 and rolled-back: the node tools did not answer
plan-tier: put back at once: node-tools (the witness on anchor judged the node-tools c2 and rolled-back: the node tools did not answer); the rest of the send judged to their own verdicts
plan-tier: the send to anchor in tier 0 failed its gate: the witness on anchor judged the node-tools c2 and rolled-back: the node tools did not answer; node-tools was put back when it broke; passed on their own and kept: app1; none reported left as it was
plan-tier: tier 0 built; sent 2 module(s) to anchor first in one send (app1, node-tools), the rest once its gate passes
node-tools's build c2 failed its gate on anchor and was put back to c1: the witness on anchor judged the node-tools c2 and rolled-back: the node tools did not answer
plan-tier: put back at once: node-tools (the witness on anchor judged the node-tools c2 and rolled-back: the node tools did not answer); the rest of the send judged to their own verdicts
plan-tier: the send to anchor in tier 0 failed its gate: the witness on anchor judged the node-tools c2 and rolled-back: the node tools did not answer; app1 passed on its own and is kept; none reported left as it was
FAIL
FAIL github.com/novox/mesh-controller/cmd/mesh-controller 226.280s
ok github.com/novox/mesh-controller/examples/objectstore-provisioner 1.010s
ok github.com/novox/mesh-controller/examples/postgres-provisioner 1.035s
ok github.com/novox/mesh-controller/examples/redis-provisioner 1.039s
ok github.com/novox/mesh-controller/examples/route-proxy 1.239s
ok github.com/novox/mesh-controller/internal/artifacts 1.082s
ok github.com/novox/mesh-controller/internal/broker 2.833s
ok github.com/novox/mesh-controller/internal/builder 2.746s
ok github.com/novox/mesh-controller/internal/catalogue 5.148s
ok github.com/novox/mesh-controller/internal/conditions 2.588s
ok github.com/novox/mesh-controller/internal/envfile 1.046s
ok github.com/novox/mesh-controller/internal/facts 1.056s
ok github.com/novox/mesh-controller/internal/identity 4.763s
ok github.com/novox/mesh-controller/internal/inventory 88.370s
ok github.com/novox/mesh-controller/internal/lease 17.696s
ok github.com/novox/mesh-controller/internal/licences 4.332s
ok github.com/novox/mesh-controller/internal/licences/adapters 1.037s
ok github.com/novox/mesh-controller/internal/link 54.074s
ok github.com/novox/mesh-controller/internal/lint 2.296s
ok github.com/novox/mesh-controller/internal/outward 1.083s
ok github.com/novox/mesh-controller/internal/overlay 1.073s
ok github.com/novox/mesh-controller/internal/secrets 1.529s
ok github.com/novox/mesh-controller/internal/store 3.485s
ok github.com/novox/mesh-controller/internal/testbus 1.242s
ok github.com/novox/mesh-controller/internal/token 1.015s
FAIL
```
mesh/merge-gate: PASS — every machine composes with the change as it did without (4 of 4 compose) (modules: build-agent, mesh-controller)
mesh/repo-check: PASS — its merge-check.sh passed
Delivery plan — builds build-agent, mesh-controller → ace, g14, novox, shanks; no bus step
tier 0: mesh-controller
tier 1: build-agent
ace: receives build-agent
g14: receives build-agent
novox: receives mesh-controller, build-agent
shanks: receives build-agent
build-agent keeps data (ADR 0233): what it holds is backed up before it moves
read by no module's build: cmd/mesh-controller/batches_test.go, cmd/mesh-controller/delivery_test.go, cmd/mesh-controller/issue349_test.go, cmd/mesh-controller/queue_test.go, cmd/mesh-controller/signals_test.go, cmd/mesh-controller/supersede_test.go
Run by the build seat on novox as build-1791634476100154670 (builds --log build-1791634476100154670).
--- the gate: build-agent, mesh-controller
mesh-controller: ok, 55 tool(s); WARNING: merge-window ask(s) for a setting and do(es) not say whether it is trusted, so it counts as trusted: set at the terminal alone; say "trusted" false where nothing trusts it (novox/hq issue 339); WARNING: controller stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8)
long-running resources without health: 1
files asking for a setting without saying whether it is trusted: 1
1 manifest(s) checked. Judged against the seats this binary carries; a claim on one of the mesh's own seats is judged fully at registration, and a seat declared by a module not given here reads as unknown. Identities judged on a 6-character machine name, against the bounds of the providers given here
judging 1 module(s) changed against 4 machine(s), as the snapshot of 2026-10-10T11:55:18Z says they run
composing every machine as the mesh is
the bus's user list leaves out 5 user(s) the mesh has minted no credential for: controller, node.f35, node.idt, node.ygcyr, node.yvbpsm. Each is a user that cannot connect until one is issued
the bus's user list leaves out 5 user(s) the mesh has minted no credential for: controller, node.f35, node.idt, node.ygcyr, node.yvbpsm. Each is a user that cannot connect until one is issued
composing every machine with the change
the bus's user list leaves out 5 user(s) the mesh has minted no credential for: controller, node.f35, node.idt, node.ygcyr, node.yvbpsm. Each is a user that cannot connect until one is issued
the bus's user list leaves out 5 user(s) the mesh has minted no credential for: controller, node.f35, node.idt, node.ygcyr, node.yvbpsm. Each is a user that cannot connect until one is issued
merge gate: PASS — every machine composes with the change as it did without (4 of 4 compose)
judged by controller development build against the facts of 2026-10-10T11:55:18Z
modules the change moves:
- mesh-controller (changed)
machines:
- a machine (f35): composes
- holds mesh-dns-resolver (idt): composes
- holds git, holds mesh-artifact-store, holds mesh-broker, holds mesh-catalog, holds mesh-delivery, holds mesh-dns-resolver, holds mesh-store, holds mesh-vault, holds npm-package-registry, the control node, the hub (ygcyr): composes; the change adds 1 resource(s) and removes 0 (+file:mesh-controller.merge-window)
- a machine (yvbpsm): composes
a merge would rebuild 2 module(s) in 2 tier(s): build-agent, mesh-controller
notes:
- cmd/mesh-controller/batches_test.go, cmd/mesh-controller/delivery_test.go, cmd/mesh-controller/issue349_test.go, cmd/mesh-controller/queue_test.go, cmd/mesh-controller/signals_test.go and cmd/mesh-controller/supersede_test.go read by no module's build, and rebuild nothing (issue 280)
--- its merge-check.sh (go toolchain)
ok github.com/novox/mesh-controller/cmd/mesh-builder 1.037s
ok github.com/novox/mesh-controller/cmd/mesh-controller 261.569s
ok github.com/novox/mesh-controller/examples/objectstore-provisioner 1.557s
ok github.com/novox/mesh-controller/examples/postgres-provisioner 1.916s
ok github.com/novox/mesh-controller/examples/redis-provisioner 1.558s
ok github.com/novox/mesh-controller/examples/route-proxy 2.011s
ok github.com/novox/mesh-controller/internal/artifacts 1.590s
ok github.com/novox/mesh-controller/internal/broker 7.023s
ok github.com/novox/mesh-controller/internal/builder 9.908s
ok github.com/novox/mesh-controller/internal/catalogue 6.006s
ok github.com/novox/mesh-controller/internal/conditions 4.207s
ok github.com/novox/mesh-controller/internal/envfile 1.018s
ok github.com/novox/mesh-controller/internal/facts 1.564s
ok github.com/novox/mesh-controller/internal/identity 8.811s
ok github.com/novox/mesh-controller/internal/inventory 100.951s
ok github.com/novox/mesh-controller/internal/lease 17.618s
ok github.com/novox/mesh-controller/internal/licences 8.098s
ok github.com/novox/mesh-controller/internal/licences/adapters 1.009s
ok github.com/novox/mesh-controller/internal/link 57.400s
ok github.com/novox/mesh-controller/internal/lint 2.220s
ok github.com/novox/mesh-controller/internal/outward 1.042s
ok github.com/novox/mesh-controller/internal/overlay 1.023s
ok github.com/novox/mesh-controller/internal/secrets 1.418s
ok github.com/novox/mesh-controller/internal/store 4.609s
ok github.com/novox/mesh-controller/internal/testbus 1.180s
ok github.com/novox/mesh-controller/internal/token 1.016s
**Merge check** at `3ced96fc`
- `mesh/merge-gate`: **PASS** — every machine composes with the change as it did without (4 of 4 compose) (modules: build-agent, mesh-controller)
- `mesh/repo-check`: **PASS** — its merge-check.sh passed
**Delivery plan** — builds build-agent, mesh-controller → ace, g14, novox, shanks; no bus step
- tier 0: mesh-controller
- tier 1: build-agent
- ace: receives build-agent
- g14: receives build-agent
- novox: receives mesh-controller, build-agent
- shanks: receives build-agent
- build-agent keeps data (ADR 0233): what it holds is backed up before it moves
- read by no module's build: cmd/mesh-controller/batches_test.go, cmd/mesh-controller/delivery_test.go, cmd/mesh-controller/issue349_test.go, cmd/mesh-controller/queue_test.go, cmd/mesh-controller/signals_test.go, cmd/mesh-controller/supersede_test.go
Run by the build seat on novox as `build-1791634476100154670` (`builds --log build-1791634476100154670`).
```
--- the gate: build-agent, mesh-controller
mesh-controller: ok, 55 tool(s); WARNING: merge-window ask(s) for a setting and do(es) not say whether it is trusted, so it counts as trusted: set at the terminal alone; say "trusted" false where nothing trusts it (novox/hq issue 339); WARNING: controller stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8)
long-running resources without health: 1
files asking for a setting without saying whether it is trusted: 1
1 manifest(s) checked. Judged against the seats this binary carries; a claim on one of the mesh's own seats is judged fully at registration, and a seat declared by a module not given here reads as unknown. Identities judged on a 6-character machine name, against the bounds of the providers given here
judging 1 module(s) changed against 4 machine(s), as the snapshot of 2026-10-10T11:55:18Z says they run
composing every machine as the mesh is
the bus's user list leaves out 5 user(s) the mesh has minted no credential for: controller, node.f35, node.idt, node.ygcyr, node.yvbpsm. Each is a user that cannot connect until one is issued
the bus's user list leaves out 5 user(s) the mesh has minted no credential for: controller, node.f35, node.idt, node.ygcyr, node.yvbpsm. Each is a user that cannot connect until one is issued
composing every machine with the change
the bus's user list leaves out 5 user(s) the mesh has minted no credential for: controller, node.f35, node.idt, node.ygcyr, node.yvbpsm. Each is a user that cannot connect until one is issued
the bus's user list leaves out 5 user(s) the mesh has minted no credential for: controller, node.f35, node.idt, node.ygcyr, node.yvbpsm. Each is a user that cannot connect until one is issued
merge gate: PASS — every machine composes with the change as it did without (4 of 4 compose)
judged by controller development build against the facts of 2026-10-10T11:55:18Z
modules the change moves:
- mesh-controller (changed)
machines:
- a machine (f35): composes
- holds mesh-dns-resolver (idt): composes
- holds git, holds mesh-artifact-store, holds mesh-broker, holds mesh-catalog, holds mesh-delivery, holds mesh-dns-resolver, holds mesh-store, holds mesh-vault, holds npm-package-registry, the control node, the hub (ygcyr): composes; the change adds 1 resource(s) and removes 0 (+file:mesh-controller.merge-window)
- a machine (yvbpsm): composes
a merge would rebuild 2 module(s) in 2 tier(s): build-agent, mesh-controller
notes:
- cmd/mesh-controller/batches_test.go, cmd/mesh-controller/delivery_test.go, cmd/mesh-controller/issue349_test.go, cmd/mesh-controller/queue_test.go, cmd/mesh-controller/signals_test.go and cmd/mesh-controller/supersede_test.go read by no module's build, and rebuild nothing (issue 280)
--- its merge-check.sh (go toolchain)
ok github.com/novox/mesh-controller/cmd/mesh-builder 1.037s
ok github.com/novox/mesh-controller/cmd/mesh-controller 261.569s
ok github.com/novox/mesh-controller/examples/objectstore-provisioner 1.557s
ok github.com/novox/mesh-controller/examples/postgres-provisioner 1.916s
ok github.com/novox/mesh-controller/examples/redis-provisioner 1.558s
ok github.com/novox/mesh-controller/examples/route-proxy 2.011s
ok github.com/novox/mesh-controller/internal/artifacts 1.590s
ok github.com/novox/mesh-controller/internal/broker 7.023s
ok github.com/novox/mesh-controller/internal/builder 9.908s
ok github.com/novox/mesh-controller/internal/catalogue 6.006s
ok github.com/novox/mesh-controller/internal/conditions 4.207s
ok github.com/novox/mesh-controller/internal/envfile 1.018s
ok github.com/novox/mesh-controller/internal/facts 1.564s
ok github.com/novox/mesh-controller/internal/identity 8.811s
ok github.com/novox/mesh-controller/internal/inventory 100.951s
ok github.com/novox/mesh-controller/internal/lease 17.618s
ok github.com/novox/mesh-controller/internal/licences 8.098s
ok github.com/novox/mesh-controller/internal/licences/adapters 1.009s
ok github.com/novox/mesh-controller/internal/link 57.400s
ok github.com/novox/mesh-controller/internal/lint 2.220s
ok github.com/novox/mesh-controller/internal/outward 1.042s
ok github.com/novox/mesh-controller/internal/overlay 1.023s
ok github.com/novox/mesh-controller/internal/secrets 1.418s
ok github.com/novox/mesh-controller/internal/store 4.609s
ok github.com/novox/mesh-controller/internal/testbus 1.180s
ok github.com/novox/mesh-controller/internal/token 1.016s
```
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.
hq ADR 0276 (merges are assembled in a rolling window, and each batch is delivered by one walk), issue 362 (two merges seconds apart left their delivery waiting for a person). The controller's side; mesh-delivery's side is novox/mesh-catalog#171, whose wire this follows.
What changes
merge-window(90 s) or atmerge-window-at-most(10 min) after the batch's first merge. The settings are the controller's (module.json declares both, written to${dir:mesh-state}/merge-window.json, read at every look, so a change needs no restart).batched_merge(every merge heard, its times, the forge's announcement, the batch or walk answering it; keyed by repository and commit, so a merge is never doubled) andrelease_plan.commits. The batch itself is a plan record in the stateassemblingorqueued; cut, it keeps its id and isbuilding. A restarted controller resumes the window where it stood. The controller has no consolidated schema file: a fresh install runs the numbered migrations, so the migration is both.Commitsnaming each repository's commit, built at the branch, which holds them. ADR 0267's build sources work per repository unchanged (movesOfMergeis the old merge handler's body).queued,batch.behind). A started walk is never superseded. A walk still waiting for mesh-delivery's word is folded into the next batch's walk (superseded,delivery.taken_over_by), its unbuilt modules planned there. ADR 0218 decision 3's supersession and the issue 349 rule are gone (supersededBy,laterOnTheBranch).batch.own) with its own window; the catalogue batch cuts by the normal rules and queues behind the own-path walk. An own-path walk being cut folds no waiting catalogue walk: its merges are batched again behind the own-path walk (rebatchWaiting), the waiting walk naming that batch intaken_over_by. No catalogue delivery skips its turn.delivery.alone), newest first, one walk each; the first done answers the older ones (covered). A stopped walk, or one stopped or closed by hand, starts no search.orderOf(ADR 0249, unchanged) gives the pairs, read with theafter:lines from the merge's body (link.SourceMovedgainsnumberandbody); each pair becomesgroup-orderedges, which order tiers and gate as built-by does.planslists the batches first:assembling: 13 s left (at the latest 00:31:09); grouped: novox/mesh-catalog@48bda475 (answers 553b7191), novox/mesh-controller@a6bc0931; plan not yet calculated, orqueued behind plan-…; an own-path batch says(on the controller's own path). Every save isplan-moved;delivery-walksanswers the batches too.Wire (with mesh-catalog#171)
Inside the walk record's
deliveryobject:merges:[{"repository","commit","carried"?}], every merge the walk or batch answers;carriedis the later commit of its repository that carries it, omitted for the walk's own commit.taken_over_by: on a walk folded before it started; its note also beginssuperseded at tier N by plan-X (, as the PR's fallback reads. It can name a batch (statequeued/assembling), which keeps its id when cut.batch:{"closes_at","at_most","behind"?,"own"?}while the record is a batch (stateassemblingorqueued).alone: on a walk of one merge on its own commit after a failed walk.commits[{"repository","branch","commit","merged"}];repository/commitkeep the newest merge's.A mesh-delivery that predates this reads the top-level
repository/commitas before and ignores the rest: an earlier merge of a repository is not linked and is held after ten minutes, and it would read a record inassemblingas a walk of unknown state. Roll out mesh-delivery (#171) first. It is merged as d2af46b and is the build of mesh-delivery the mesh holds on novox.Tests
batches_test.go: two merges 18 s apart → one walk at the later commit naming both, built at the branch; three repositories in one window → one walk; a merge at second 80 restarts the window; the maximum closes a busy one;plansandplan-movedshow the assembling batch; a merge during a walk joins the next batch and the started walk is never superseded; a waiting walk is folded, and not let go beside a started one; a late merge answered by the later walk, or the next batch when that walk never built what it moves, in a one-module repository too; the catch-up keeps what a cut made history; a failed walk walks its earlier merges alone at their own commits, stops at the first delivered, refuses a retry, and a stopped one starts no search; a group's order becomes tiers (none without a group); the batch survives a restart and a redelivered merge is not doubled; the window settings; a removed file is the last merge's word; a controller merge and catalogue merges in one window are two batches, the catalogue's walk waits for its word and is batched again behind the controller's walk, and no catalogue module is asked without the word; S16 names the merges. S18 and S19 are in the signals table, raised past their bounds and not before.Mutation pass (each part removed, a named test fails): no path union, every merge a new batch, the window from the first merge, no maximum, no one-at-a-time, no fold, no search, no covering, no group edges, batch not listed, stopped walk searched, done walk answers nothing, answered despite unbuilt modules, S16 naming one commit, latest by arrival, folded walk left open, no stored batch, late merge read as history, cut reading history, letGo beside a started walk, retry after the search, removed by any merge, nothing owed, catch-up ignoring the record, a walk alone at the branch, a batch walk pinned, own path never, own batch folding the waiting walk, one batch for both kinds — all killed. Returning
falsefor the late merge's batch case is equivalent (the open batch is the one it joins anyway).After review
An independent review found two blockers, now fixed:
owedLate,owedToTheRecord).Also fixed after review:
deliverrefuses while another started walk is open;plans retryrefuses while any walk is open and once a failed walk's merges were moved to the search;Plan.CommitOnmatches repository and branch; a batch queues behind a walk waiting for its word while the search runs; removal is decided by the last merge that changed the file; every merge of a batch is planned as news. The mixed-batch gap the review raised is closed by the own-path rule above.Left as is:
Plan.Repository, the newest merge's repository.Not here
Delivery
novox/mesh-controller@3ced96fc6f8a— delivered since 2026-10-10T12:35:44ZDelivery plan — builds build-agent, mesh-controller → ace, g14, novox, shanks; no bus step
Machines
Transitions
The commit's note under
refs/notes/mesh-plankeeps every transition:git log --notes=mesh-plan.066b1e8559to96fc4209d3Merge check at
066b1e85mesh/merge-gate: PASS — every machine composes with the change as it did without (4 of 4 compose) (modules: build-agent, mesh-controller)mesh/repo-check: PASS — its merge-check.sh passedDelivery plan — builds build-agent, mesh-controller → ace, g14, novox, shanks; no bus step
Run by the build seat on g14 as
build-1791631189368305284(builds --log build-1791631189368305284).Merge check at
96fc4209mesh/merge-gate: PASS — every machine composes with the change as it did without (4 of 4 compose) (modules: build-agent, mesh-controller)mesh/repo-check: PASS — its merge-check.sh passedDelivery plan — builds build-agent, mesh-controller → ace, g14, novox, shanks; no bus step
Run by the build seat on novox as
build-1791631310746926892(builds --log build-1791631310746926892).Merge check at
28876914mesh/merge-gate: PASS — every machine composes with the change as it did without (4 of 4 compose) (modules: build-agent, mesh-controller)mesh/repo-check: FAIL — its merge-check.sh failed: FAIL github.com/novox/mesh-controller/cmd/mesh-controller 256.824sDelivery plan — builds build-agent, mesh-controller → ace, g14, novox, shanks; no bus step
Run by the build seat on novox as
build-1791632522039225859(builds --log build-1791632522039225859).Merge check at
0e0e1430mesh/merge-gate: PASS — every machine composes with the change as it did without (4 of 4 compose) (modules: build-agent, mesh-controller)mesh/repo-check: PASS — its merge-check.sh passedDelivery plan — builds build-agent, mesh-controller → ace, g14, novox, shanks; no bus step
Run by the build seat on g14 as
build-1791633042015855120(builds --log build-1791633042015855120).Merge check at
065cfa0dmesh/merge-gate: PASS — every machine composes with the change as it did without (4 of 4 compose) (modules: build-agent, mesh-controller)mesh/repo-check: PASS — its merge-check.sh passedDelivery plan — builds build-agent, mesh-controller → ace, g14, novox, shanks; no bus step
Run by the build seat on ace as
build-1791633286314485292(builds --log build-1791633286314485292).d0c9b9b4bcto3ced96fc6fMerge check at
d0c9b9b4mesh/merge-gate: PASS — every machine composes with the change as it did without (4 of 4 compose) (modules: build-agent, mesh-controller)mesh/repo-check: FAIL — its merge-check.sh failed: FAIL github.com/novox/mesh-controller/cmd/mesh-controller 226.280sDelivery plan — builds build-agent, mesh-controller → ace, g14, novox, shanks; no bus step
Run by the build seat on shanks as
build-1791634260735600549(builds --log build-1791634260735600549).Merge check at
3ced96fcmesh/merge-gate: PASS — every machine composes with the change as it did without (4 of 4 compose) (modules: build-agent, mesh-controller)mesh/repo-check: PASS — its merge-check.sh passedDelivery plan — builds build-agent, mesh-controller → ace, g14, novox, shanks; no bus step
Run by the build seat on novox as
build-1791634476100154670(builds --log build-1791634476100154670).