ADR 0190: a seat's work is shared by its holders, and building is the first such role; design 18 says where a build runs #306

Merged
mesh-admin merged 2 commits from decision/0190-a-seats-work-is-shared-by-its-holders into main 2026-10-03 00:44:27 +00:00
Contributor

The operator's direction of 2026-10-02 on seeing a 35-image rebuild run serially on one machine while three others idled: this is our first occurrence of a mesh advantage — a build-agent module every node can run, holding a node-scoped seat, with the controller using whichever agents are online; and make sure the setup is done generically so another module needing mesh functionality reuses the pattern.

ADR 0190 (extends 0121), the generic pattern first:

  1. Work asked of a seat is taken by whichever of its holders is idle; the asker addresses the role, never a machine; the outcome says which machine did it.
  2. A holder pulls one ask at a time when idle — a pull consumer, which removes the push-prefetch race of issue 175 by shape rather than by a one-in-flight limit (the limit is what made the shared queue serial).
  3. Work bound to one machine is a node seat's verb (design 33 §4), not a work queue.
  4. One pattern for any node seat with accepts; the controller derives queue and worker, the module's manifest says what a holding machine needs.
  5. Building is the first use: seat node-build-agent (node scope, same build ask and events), held by the build-agent module on every machine with a container runtime; mesh-build-machine and builder retire once replaced.

Design 25 §1/§5 already drew this ("a seat's accept subjects on a queue group of holders is what a build queue shared by several machines is"). Rejected: a concurrency setting or second holder by hand; a build-specific dispatcher in the controller.

Also: notes in ADR 0121 (mechanism changed) and ADR 0162 (progressive insight: "the only build machine there could be"); design 18 gains "Where a build runs" and its code list names modules/build-agent. Checks pass.

Code: mesh-controller branch feat/a-seats-work-is-shared-by-its-holders (in progress), mesh-catalog #231 (build-agent module). Live switch happens after WP3's live step, since the current queue is what builds node-tools.

The operator's direction of 2026-10-02 on seeing a 35-image rebuild run serially on one machine while three others idled: *this is our first occurrence of a mesh advantage* — a build-agent module every node can run, holding a node-scoped seat, with the controller using whichever agents are online; and *make sure the setup is done generically* so another module needing mesh functionality reuses the pattern. **ADR 0190** (extends 0121), the generic pattern first: 1. Work asked of a seat is taken by whichever of its holders is idle; the asker addresses the role, never a machine; the outcome says which machine did it. 2. A holder pulls one ask at a time when idle — a pull consumer, which removes the push-prefetch race of issue 175 by shape rather than by a one-in-flight limit (the limit is what made the shared queue serial). 3. Work bound to one machine is a node seat's verb (design 33 §4), not a work queue. 4. One pattern for any node seat with `accepts`; the controller derives queue and worker, the module's manifest says what a holding machine needs. 5. Building is the first use: seat `node-build-agent` (node scope, same `build` ask and events), held by the `build-agent` module on every machine with a container runtime; `mesh-build-machine` and `builder` retire once replaced. Design 25 §1/§5 already drew this ("a seat's accept subjects on a queue group of holders is what a build queue shared by several machines is"). Rejected: a concurrency setting or second holder by hand; a build-specific dispatcher in the controller. **Also:** notes in ADR 0121 (mechanism changed) and ADR 0162 (progressive insight: "the only build machine there could be"); design 18 gains "Where a build runs" and its code list names `modules/build-agent`. Checks pass. Code: mesh-controller branch `feat/a-seats-work-is-shared-by-its-holders` (in progress), mesh-catalog #231 (build-agent module). Live switch happens after WP3's live step, since the current queue is what builds node-tools.
mesh-admin added 1 commit 2026-10-02 20:29:38 +00:00
The build role was a mesh seat with one holder and its worker a push consumer with one delivery in
flight, so thirty-five images rebuilt serially on one machine while three others idled. The bus was
drawn for the alternative — a seat's accept subjects on a queue group of holders (design 25) — and
0190 uses it as one pattern for every role: a node seat with accepts, every holder pulling one ask
when idle, the asker addressing the role. Building is the first use: node-build-agent, held by the
build-agent module on every machine with a container runtime. Notes in 0121 and 0162 where their
facts went stale.
jschoubben added 1 commit 2026-10-02 20:29:56 +00:00
mesh-admin merged commit d8a58dadcf into main 2026-10-03 00:44:27 +00:00
mesh-admin deleted branch decision/0190-a-seats-work-is-shared-by-its-holders 2026-10-03 00:44:27 +00:00
Sign in to join this conversation.
No Reviewers
No labels
2 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: novox/hq#306