Hold a first merge whose new module the running build-agent refuses for an unknown manifest word, name it, and ask it again when build-agent is delivered (issue 1173)
#438
Merged
mesh-toolsmerged 4 commits from fix/1173-held-first-build into main2026-10-22 15:28:11 +00:00
Fixes issue 1173: a first build refused because the running build-agent does not yet read a manifest word the merge introduces was recorded as a failed build and never asked again. ADR 0482 §5: hold, name, never fail. A prerequisite of design 47's R4e (ADR 0503 §7).
What changes (cmd/mesh-controller, internal/inventory)
A first-build request (For merge) answered by the waiting-merges record whose failure is encoding/json's unknown field "X" is not taken in as a failed build: the merge is put back to waiting with a list of held modules {module, path, word, time} in its kept announcement (inventory HoldMerge). A further refusal in the same merge is added to the list.
Condition first-build-held names the merge and every held module with its word, raised at once.
When a delivery plan that built build-agent ends done, each held merge is asked again for its held modules' own directories, under the merge's warrant; a refusal that comes again holds it anew.
Any other failure is recorded as today.
Acceptance
1173/AC1-AC4: unit tests in cmd/mesh-controller/first_builds_held_test.go, integration tests in first_builds_held_integration_test.go, including two modules in one first merge (one refused beside a sibling that registers; both refused).
Checks
Unit suite and go vet -tags integration ./... green; try build-1792680614176181037 passed (trunk b8f77577).
Hardening left as notes on issue 1173 (notes 10 and 11): re-ask after a controller restart, the actingOnMerges lock around the hold.
Fixes issue 1173: a first build refused because the running build-agent does not yet read a manifest word the merge introduces was recorded as a failed build and never asked again. ADR 0482 §5: hold, name, never fail. A prerequisite of design 47's R4e (ADR 0503 §7).
## What changes (cmd/mesh-controller, internal/inventory)
- A first-build request (For merge) answered by the waiting-merges record whose failure is encoding/json's `unknown field "X"` is not taken in as a failed build: the merge is put back to waiting with a list of held modules {module, path, word, time} in its kept announcement (inventory HoldMerge). A further refusal in the same merge is added to the list.
- Condition `first-build-held` names the merge and every held module with its word, raised at once.
- When a delivery plan that built build-agent ends done, each held merge is asked again for its held modules' own directories, under the merge's warrant; a refusal that comes again holds it anew.
- Any other failure is recorded as today.
## Acceptance
1173/AC1-AC4: unit tests in `cmd/mesh-controller/first_builds_held_test.go`, integration tests in `first_builds_held_integration_test.go`, including two modules in one first merge (one refused beside a sibling that registers; both refused).
## Checks
Unit suite and `go vet -tags integration ./...` green; try build-1792680614176181037 passed (trunk b8f77577).
Hardening left as notes on issue 1173 (notes 10 and 11): re-ask after a controller restart, the actingOnMerges lock around the hold.
Reviewed-by: reviewer-1173@shanks at 1e9b87e03acd30700b5284c3d01153cdc176c8ca
mesh/merge-gate head 1e9b87e03acd merged into trunk b8f77577fed2 — pass: builds build-agent, mesh-controller → ace, g14, novox, shanks; no bus step; every …
A held merge was asked again by the rule of a first merge, which finds nothing once a sibling module of the
same merge registered, so it stayed held forever; and a second refusal in a merge already held fell through to
a failed build. The hold now keeps a list of module, path and word, a refusal in a held waiting merge joins it,
and the delivery of build-agent asks each held path again on the merge's Approve warrant.
Deliverynovox/mesh-controller@1e9b87e03acd — delivered since 2026-10-22T15:35:58Z
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
grants step: if this changes what the bus's user list says (a new tool, subject or user), novox is sent that list alone, every build there kept, before build-agent is judged on its first machine
Machines
mesh-controller on every machine running it: sent
build-agent on every machine running it: sent
Transitions
2026-10-22 15:04 (new) → proposed (announced): novox/mesh-controller#438's head announced
2026-10-22 15:15 proposed → checked (checked): a verdict names this commit and the trunk's head as its trunk commit
2026-10-22 15:15 checked → ready (accepted): the gate passed or warned, and the repository's own check did not fail
2026-10-22 15:29 ready → published (merged): on the trunk its modules follow: merged there, and its walk opened — or nothing for a walk to move
2026-10-22 15:29 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-22 15: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@1e9b87e03acd` — **delivered** since 2026-10-22T15:35:58Z
**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
- grants step: if this changes what the bus's user list says (a new tool, subject or user), novox is sent that list alone, every build there kept, before build-agent is judged on its first machine
**Machines**
- mesh-controller on every machine running it: sent
- build-agent on every machine running it: sent
**Transitions**
- 2026-10-22 15:04 (new) → proposed (announced): novox/mesh-controller#438's head announced
- 2026-10-22 15:15 proposed → checked (checked): a verdict names this commit and the trunk's head as its trunk commit
- 2026-10-22 15:15 checked → ready (accepted): the gate passed or warned, and the repository's own check did not fail
- 2026-10-22 15:29 ready → published (merged): on the trunk its modules follow: merged there, and its walk opened — or nothing for a walk to move
- 2026-10-22 15:29 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-22 15: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`.
Merge check at 1e9b87e0
Judged: head 1e9b87e03acd merged into trunk b8f77577fed2; read beside it: mesh-catalog c3d3194bc8d4, mesh-controller-main b8f77577fed2, mesh-host 4065b45ae84f, mesh-tools e0fadc43d9dd
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
grants step: if this changes what the bus's user list says (a new tool, subject or user), novox is sent that list alone, every build there kept, before build-agent is judged on its first machine
read by no module's build: cmd/mesh-controller/first_builds_held_integration_test.go, cmd/mesh-controller/first_builds_held_test.go
Run by the build seat on ace as build-1792681453581417937 (builds --log build-1792681453581417937).
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.
Fixes issue 1173: a first build refused because the running build-agent does not yet read a manifest word the merge introduces was recorded as a failed build and never asked again. ADR 0482 §5: hold, name, never fail. A prerequisite of design 47's R4e (ADR 0503 §7).
What changes (cmd/mesh-controller, internal/inventory)
unknown field "X"is not taken in as a failed build: the merge is put back to waiting with a list of held modules {module, path, word, time} in its kept announcement (inventory HoldMerge). A further refusal in the same merge is added to the list.first-build-heldnames the merge and every held module with its word, raised at once.Acceptance
1173/AC1-AC4: unit tests in
cmd/mesh-controller/first_builds_held_test.go, integration tests infirst_builds_held_integration_test.go, including two modules in one first merge (one refused beside a sibling that registers; both refused).Checks
Unit suite and
go vet -tags integration ./...green; try build-1792680614176181037 passed (trunkb8f77577).Hardening left as notes on issue 1173 (notes 10 and 11): re-ask after a controller restart, the actingOnMerges lock around the hold.
Reviewed-by: reviewer-1173@shanks at
1e9b87e03aDelivery
novox/mesh-controller@1e9b87e03acd— delivered since 2026-10-22T15:35:58ZDelivery 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.Merge check at
1e9b87e0Judged: head
1e9b87e03acdmerged into trunkb8f77577fed2; read beside it: mesh-catalogc3d3194bc8d4, mesh-controller-mainb8f77577fed2, mesh-host4065b45ae84f, mesh-toolse0fadc43d9ddmesh/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-1792681453581417937(builds --log build-1792681453581417937).