Say which modules a walk left unchanged, so a merge that moved nothing is not read as stranded (hq issue 611) #295

Merged
mesh-admin merged 1 commits from fix/611-an-unchanged-build-is-delivered into main 2026-10-13 08:25:46 +00:00
Contributor

What: a walk's record gains delivery.unchanged, mapping each module whose recorded build source (ADR 0267) holds none of the changed files to why. These are modules built from the merged repository whose directory holds a changed file, and modules that package the repository. A module the walk builds anyway (another merge's, or a dependent) is left out, so modules keeps meaning what the walk builds. A walk with nothing to walk names them in its note too. The field was decided on issue 611 under the operator's standing rule on small design limits.

Why: mesh-controller #293's delivery plan, made while another walk built build-agent and route-proxy (issue 606), read them whole and named them. The walk then found none of #293's files in their build sources, moved nothing, and named no module. mesh-delivery read that as "never built", stopped the delivery and asked the operator about a change already on every machine.

Tests: TestAMergeSaysTheModulesWhoseBuildSourceItLeftUnchanged (#293's shape, plus touched, unrecorded and truncated cases), TestAWalkSaysUnchangedOnlyWhatItDoesNotBuild, and the store test TestAWalkThatMovedNothingSaysWhichModulesMatchedWhatRuns (added to testdata/store-tests). They fail on main: the functions and field do not exist there. sh merge-check.sh passed against a throwaway store.

Fixes issue 611 (with mesh-catalog's mesh-delivery reading, which goes after this).

What: a walk's record gains `delivery.unchanged`, mapping each module whose recorded build source (ADR 0267) holds none of the changed files to why. These are modules built from the merged repository whose directory holds a changed file, and modules that package the repository. A module the walk builds anyway (another merge's, or a dependent) is left out, so `modules` keeps meaning what the walk builds. A walk with nothing to walk names them in its note too. The field was decided on issue 611 under the operator's standing rule on small design limits. Why: mesh-controller #293's delivery plan, made while another walk built build-agent and route-proxy (issue 606), read them whole and named them. The walk then found none of #293's files in their build sources, moved nothing, and named no module. mesh-delivery read that as "never built", stopped the delivery and asked the operator about a change already on every machine. Tests: `TestAMergeSaysTheModulesWhoseBuildSourceItLeftUnchanged` (#293's shape, plus touched, unrecorded and truncated cases), `TestAWalkSaysUnchangedOnlyWhatItDoesNotBuild`, and the store test `TestAWalkThatMovedNothingSaysWhichModulesMatchedWhatRuns` (added to testdata/store-tests). They fail on main: the functions and field do not exist there. `sh merge-check.sh` passed against a throwaway store. Fixes issue 611 (with mesh-catalog's mesh-delivery reading, which goes after this).
mesh-admin added 1 commit 2026-10-13 06:21:16 +00:00
Say which modules a walk left unchanged, so a merge that moved nothing is not read as stranded (hq issue 611)
mesh/merge-gate head 05576db018a4 merged into trunk a688dcff394b — pass: builds build-agent, mesh-controller → ace, g14, novox, shanks; no bus step; every …
mesh/repo-check head 05576db018a4 merged into trunk a688dcff394b — pass: its merge-check.sh passed
mesh/delivery delivered
mesh/delivery-group group fix/611-an-unchanged-build-is-delivered delivered: every member is delivered
05576db018
A delivery plan made while another walk built a module reads it whole and names it; the walk, cut later,
finds none of the changed files in the build source that build recorded and moves nothing. Its record named
no module, so mesh-delivery read 'matched what runs' as 'never built', stopped the delivery and asked the
operator about a change already on every machine. The walk now says each such module in delivery.unchanged,
with why; its modules keep meaning what it builds.
Author
Contributor

Delivery novox/mesh-controller@05576db018a4 — delivered since 2026-10-13T08:40:14Z

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

Group fix/611-an-unchanged-build-is-delivered, in order: novox/hq@18a5b2ac1a → novox/mesh-controller@05576db018 → novox/mesh-catalog@2f5e97030a

Machines

  • mesh-controller on novox: passed — healthy 3 times over 4m7s
  • mesh-controller on the rest running it: sent
  • build-agent on g14: passed — healthy 1 times over 43s
  • build-agent on the rest running it: sent
  • mesh-delivery on novox: passed — healthy 3 times over 2m15s
  • mesh-delivery on the rest running it: sent

Transitions

  • 2026-10-13 06:21 (new) → proposed (announced): novox/mesh-controller#295's head announced
  • 2026-10-13 06:28 proposed → checked (checked): a verdict names this commit and the trunk's head as its trunk commit
  • 2026-10-13 06:28 checked → ready (accepted): the gate passed or warned, and the repository's own check did not fail
  • 2026-10-13 08:27 ready → published (merged): on the trunk its modules follow: merged there, and its walk opened — or nothing for a walk to move
  • 2026-10-13 08:27 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-13 08:40 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@05576db018a4` — **delivered** since 2026-10-13T08:40:14Z **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 **Group** `fix/611-an-unchanged-build-is-delivered`, in order: novox/hq@18a5b2ac1a48 → novox/mesh-controller@05576db018a4 → novox/mesh-catalog@2f5e97030a5c - novox/mesh-controller@05576db018a4 before novox/mesh-catalog@2f5e97030a5c: built by - composed together: pass — every machine composes with the change as it did without (4 of 4 compose) **Machines** - mesh-controller on novox: passed — healthy 3 times over 4m7s - mesh-controller on the rest running it: sent - build-agent on g14: passed — healthy 1 times over 43s - build-agent on the rest running it: sent - mesh-delivery on novox: passed — healthy 3 times over 2m15s - mesh-delivery on the rest running it: sent **Transitions** - 2026-10-13 06:21 (new) → proposed (announced): novox/mesh-controller#295's head announced - 2026-10-13 06:28 proposed → checked (checked): a verdict names this commit and the trunk's head as its trunk commit - 2026-10-13 06:28 checked → ready (accepted): the gate passed or warned, and the repository's own check did not fail - 2026-10-13 08:27 ready → published (merged): on the trunk its modules follow: merged there, and its walk opened — or nothing for a walk to move - 2026-10-13 08:27 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-13 08:40 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`.
Author
Contributor

Merge check at 05576db0
Judged: head 05576db018a4 merged into trunk a688dcff394b; read beside it: mesh-catalog bc3b59227f46, mesh-controller-main a688dcff394b, mesh-host 7a41e120635b, mesh-tools 954e1a53eef9

  • 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/issue611_test.go, testdata/store-tests

Run by the build seat on novox as build-1791872505776464613 (builds --log build-1791872505776464613).

--- the gate: build-agent, mesh-controller
mesh-controller: ok, 58 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-13T06:00:44Z 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-13T06:00:44Z

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
  - a machine (yvbpsm): composes

a merge would rebuild 2 module(s) in 2 tier(s): build-agent, mesh-controller

notes:
  - cmd/mesh-controller/issue611_test.go and testdata/store-tests 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	206.369s
ok  	github.com/novox/mesh-controller/examples/objectstore-provisioner	1.018s
ok  	github.com/novox/mesh-controller/examples/postgres-provisioner	1.030s
ok  	github.com/novox/mesh-controller/examples/redis-provisioner	1.020s
ok  	github.com/novox/mesh-controller/examples/route-proxy	1.134s
ok  	github.com/novox/mesh-controller/internal/artifacts	1.062s
?   	github.com/novox/mesh-controller/internal/beside	[no test files]
ok  	github.com/novox/mesh-controller/internal/broker	4.777s
ok  	github.com/novox/mesh-controller/internal/builder	46.876s
ok  	github.com/novox/mesh-controller/internal/catalogue	9.801s
ok  	github.com/novox/mesh-controller/internal/conditions	2.658s
ok  	github.com/novox/mesh-controller/internal/envfile	1.028s
ok  	github.com/novox/mesh-controller/internal/facts	1.034s
ok  	github.com/novox/mesh-controller/internal/identity	5.777s
ok  	github.com/novox/mesh-controller/internal/inventory	43.514s
ok  	github.com/novox/mesh-controller/internal/lease	17.608s
ok  	github.com/novox/mesh-controller/internal/licences	4.612s
ok  	github.com/novox/mesh-controller/internal/licences/adapters	1.011s
ok  	github.com/novox/mesh-controller/internal/link	63.418s
ok  	github.com/novox/mesh-controller/internal/lint	2.469s
ok  	github.com/novox/mesh-controller/internal/outward	1.046s
ok  	github.com/novox/mesh-controller/internal/overlay	1.027s
ok  	github.com/novox/mesh-controller/internal/secrets	1.708s
ok  	github.com/novox/mesh-controller/internal/store	3.589s
ok  	github.com/novox/mesh-controller/internal/testbus	1.221s
ok  	github.com/novox/mesh-controller/internal/token	1.018s
store tests, each run against the store:
  ./cmd/mesh-controller --- PASS: TestAStopWithoutAMergeWalksTheOthersAgain (0.23s)
  ./cmd/mesh-controller --- PASS: TestAStopWithoutAMergeEndsTheMergesThatContainIt (0.27s)
  ./cmd/mesh-controller --- PASS: TestAStopWalksTheOthersAgainInTheOpenBatch (0.23s)
  ./cmd/mesh-controller --- PASS: TestAStopNamesWhatStaysOnTheMachinesAndWhatStillCarriesIt (0.22s)
  ./cmd/mesh-controller --- PASS: TestAStopWithoutAMergeLeavesItOutOfABatch (0.27s)
  ./cmd/mesh-controller --- PASS: TestSavingPlansAndMovingMergesIsOneAct (0.19s)
  ./cmd/mesh-controller --- PASS: TestAPlanFollowedFromTheStoreAnswersWhenItMoves (1.99s)
  ./cmd/mesh-controller --- PASS: TestNodeShowAndStatusReadTheLastSendFromTheStore (0.29s)
  ./cmd/mesh-controller --- PASS: TestTheConditionsVerbReadsTheLooksTheBucketNoLongerHolds (0.55s)
  ./cmd/mesh-controller --- PASS: TestAWalkLetGoAndStoppedByVerbsIsSaidStartedAndEnded (0.30s)
  ./cmd/mesh-controller --- PASS: TestAWalkStoppedOrClosedByAPersonIsSaidEndedStopped (0.43s)
  ./cmd/mesh-controller --- PASS: TestAWalkRetriedByAPersonIsSaidStartedAgain (0.49s)
  ./cmd/mesh-controller --- PASS: TestABacklogReleasedByAPersonIsSaidStarted (0.32s)
  ./cmd/mesh-controller --- PASS: TestAWalkEndedByCancelOrClearIsSaidEnded (0.39s)
  ./cmd/mesh-controller --- PASS: TestAWalkRestartedByARebuildIsSaidStarted (0.37s)
  ./cmd/mesh-controller --- PASS: TestAWalkStoppedByHandAndRetriedEndsFailedWhenItFailsAgain (0.42s)
  ./cmd/mesh-controller --- PASS: TestReplay237 (0.23s)
  ./cmd/mesh-controller --- PASS: TestAnUnassignThatLeavesItsNodeUnresolvedSaysSoOnceInItsAnswer (0.22s)
  ./cmd/mesh-controller --- PASS: TestAnUnassignThatLeavesItsNodeResolvedSaysNothingOfIt (0.22s)
  ./cmd/mesh-controller --- PASS: TestAnAssignThatLeavesItsNodeUnresolvedSaysOnlyThePlansRefusal (0.22s)
  ./cmd/mesh-controller --- PASS: TestADirectoryOwnersKeyIsRefusedThroughAVerb (0.31s)
  ./cmd/mesh-controller --- PASS: TestTheSendMakesNoValueForAnOutsideSecretNobodyGave (0.33s)
  ./cmd/mesh-controller --- PASS: TestAQuestionComposesWithoutAnOutsideSecretNobodyGave (0.32s)
  ./cmd/mesh-controller --- PASS: TestReplay201 (0.25s)
  ./cmd/mesh-controller --- PASS: TestARollbackWhoseSendWasRefusedIsCompletedByTheNextSend (0.17s)
  ./cmd/mesh-controller --- PASS: TestAGateJudgesTheOtherMovesBesideAKeptCore (0.20s)
  ./cmd/mesh-controller --- PASS: TestReplay401 (0.34s)
  ./cmd/mesh-controller --- PASS: TestReplay201ThePlansSend (0.27s)
  ./cmd/mesh-controller --- PASS: TestPlanAndNodeListAnOptionalRequirementLeftUnbound (0.91s)
  ./cmd/mesh-controller --- PASS: TestReplay340 (0.28s)
  ./cmd/mesh-controller --- PASS: TestOnlyATrustedFilesNamedKeyIsRefusedThroughAVerb (0.33s)
  ./cmd/mesh-controller --- PASS: TestReplay349 (0.22s)
  ./cmd/mesh-controller --- PASS: TestReplay348AFaultFromBeforeTheSendFailsNoGate (0.20s)
  ./cmd/mesh-controller --- PASS: TestReplay239AModuleNameIsNotTakenOverByAnotherRepository (0.18s)
  ./cmd/mesh-controller --- PASS: TestAWalkThatMovedNothingSaysWhichModulesMatchedWhatRuns (0.43s)
  ./internal/inventory --- PASS: TestTheLastSendSaysWhatTheMachineAnswered (0.08s)
  ./internal/inventory --- PASS: TestAReportIsTheLastSendsAnswerOnlyWhenItIsAboutThatSend (0.09s)
  ./internal/inventory --- PASS: TestAnIssuedValueIsSealedToEveryHolderOnceAndNotAgain (0.11s)
  ./internal/inventory --- PASS: TestAnIssuedValueIsSealedAgainAfterAKeyChangeOrAnAcceptance (0.09s)
  ./internal/inventory --- PASS: TestAConditionsLooksAreKeptBesideTheBucket (0.07s)
  ./internal/inventory --- PASS: TestAPlanIdHoldingAQuoteIsReadAsAPlainId (0.07s)
  ./internal/inventory --- PASS: TestAWalksStartIsKeptAndARefusedSaveLeavesItUnsaid (0.08s)
  ./internal/inventory --- PASS: TestAWalksRestIsReadFromEachMachinesOwnSend (0.08s)
  ./internal/inventory --- PASS: TestAStoredBuildWithASilentMergeableFileIsStillReadAndComposed (0.07s)
**Merge check** at `05576db0` Judged: head `05576db018a4` merged into trunk `a688dcff394b`; read beside it: mesh-catalog `bc3b59227f46`, mesh-controller-main `a688dcff394b`, mesh-host `7a41e120635b`, mesh-tools `954e1a53eef9` - `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/issue611_test.go, testdata/store-tests Run by the build seat on novox as `build-1791872505776464613` (`builds --log build-1791872505776464613`). ``` --- the gate: build-agent, mesh-controller mesh-controller: ok, 58 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-13T06:00:44Z 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-13T06:00:44Z 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 - a machine (yvbpsm): composes a merge would rebuild 2 module(s) in 2 tier(s): build-agent, mesh-controller notes: - cmd/mesh-controller/issue611_test.go and testdata/store-tests 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 206.369s ok github.com/novox/mesh-controller/examples/objectstore-provisioner 1.018s ok github.com/novox/mesh-controller/examples/postgres-provisioner 1.030s ok github.com/novox/mesh-controller/examples/redis-provisioner 1.020s ok github.com/novox/mesh-controller/examples/route-proxy 1.134s ok github.com/novox/mesh-controller/internal/artifacts 1.062s ? github.com/novox/mesh-controller/internal/beside [no test files] ok github.com/novox/mesh-controller/internal/broker 4.777s ok github.com/novox/mesh-controller/internal/builder 46.876s ok github.com/novox/mesh-controller/internal/catalogue 9.801s ok github.com/novox/mesh-controller/internal/conditions 2.658s ok github.com/novox/mesh-controller/internal/envfile 1.028s ok github.com/novox/mesh-controller/internal/facts 1.034s ok github.com/novox/mesh-controller/internal/identity 5.777s ok github.com/novox/mesh-controller/internal/inventory 43.514s ok github.com/novox/mesh-controller/internal/lease 17.608s ok github.com/novox/mesh-controller/internal/licences 4.612s ok github.com/novox/mesh-controller/internal/licences/adapters 1.011s ok github.com/novox/mesh-controller/internal/link 63.418s ok github.com/novox/mesh-controller/internal/lint 2.469s ok github.com/novox/mesh-controller/internal/outward 1.046s ok github.com/novox/mesh-controller/internal/overlay 1.027s ok github.com/novox/mesh-controller/internal/secrets 1.708s ok github.com/novox/mesh-controller/internal/store 3.589s ok github.com/novox/mesh-controller/internal/testbus 1.221s ok github.com/novox/mesh-controller/internal/token 1.018s store tests, each run against the store: ./cmd/mesh-controller --- PASS: TestAStopWithoutAMergeWalksTheOthersAgain (0.23s) ./cmd/mesh-controller --- PASS: TestAStopWithoutAMergeEndsTheMergesThatContainIt (0.27s) ./cmd/mesh-controller --- PASS: TestAStopWalksTheOthersAgainInTheOpenBatch (0.23s) ./cmd/mesh-controller --- PASS: TestAStopNamesWhatStaysOnTheMachinesAndWhatStillCarriesIt (0.22s) ./cmd/mesh-controller --- PASS: TestAStopWithoutAMergeLeavesItOutOfABatch (0.27s) ./cmd/mesh-controller --- PASS: TestSavingPlansAndMovingMergesIsOneAct (0.19s) ./cmd/mesh-controller --- PASS: TestAPlanFollowedFromTheStoreAnswersWhenItMoves (1.99s) ./cmd/mesh-controller --- PASS: TestNodeShowAndStatusReadTheLastSendFromTheStore (0.29s) ./cmd/mesh-controller --- PASS: TestTheConditionsVerbReadsTheLooksTheBucketNoLongerHolds (0.55s) ./cmd/mesh-controller --- PASS: TestAWalkLetGoAndStoppedByVerbsIsSaidStartedAndEnded (0.30s) ./cmd/mesh-controller --- PASS: TestAWalkStoppedOrClosedByAPersonIsSaidEndedStopped (0.43s) ./cmd/mesh-controller --- PASS: TestAWalkRetriedByAPersonIsSaidStartedAgain (0.49s) ./cmd/mesh-controller --- PASS: TestABacklogReleasedByAPersonIsSaidStarted (0.32s) ./cmd/mesh-controller --- PASS: TestAWalkEndedByCancelOrClearIsSaidEnded (0.39s) ./cmd/mesh-controller --- PASS: TestAWalkRestartedByARebuildIsSaidStarted (0.37s) ./cmd/mesh-controller --- PASS: TestAWalkStoppedByHandAndRetriedEndsFailedWhenItFailsAgain (0.42s) ./cmd/mesh-controller --- PASS: TestReplay237 (0.23s) ./cmd/mesh-controller --- PASS: TestAnUnassignThatLeavesItsNodeUnresolvedSaysSoOnceInItsAnswer (0.22s) ./cmd/mesh-controller --- PASS: TestAnUnassignThatLeavesItsNodeResolvedSaysNothingOfIt (0.22s) ./cmd/mesh-controller --- PASS: TestAnAssignThatLeavesItsNodeUnresolvedSaysOnlyThePlansRefusal (0.22s) ./cmd/mesh-controller --- PASS: TestADirectoryOwnersKeyIsRefusedThroughAVerb (0.31s) ./cmd/mesh-controller --- PASS: TestTheSendMakesNoValueForAnOutsideSecretNobodyGave (0.33s) ./cmd/mesh-controller --- PASS: TestAQuestionComposesWithoutAnOutsideSecretNobodyGave (0.32s) ./cmd/mesh-controller --- PASS: TestReplay201 (0.25s) ./cmd/mesh-controller --- PASS: TestARollbackWhoseSendWasRefusedIsCompletedByTheNextSend (0.17s) ./cmd/mesh-controller --- PASS: TestAGateJudgesTheOtherMovesBesideAKeptCore (0.20s) ./cmd/mesh-controller --- PASS: TestReplay401 (0.34s) ./cmd/mesh-controller --- PASS: TestReplay201ThePlansSend (0.27s) ./cmd/mesh-controller --- PASS: TestPlanAndNodeListAnOptionalRequirementLeftUnbound (0.91s) ./cmd/mesh-controller --- PASS: TestReplay340 (0.28s) ./cmd/mesh-controller --- PASS: TestOnlyATrustedFilesNamedKeyIsRefusedThroughAVerb (0.33s) ./cmd/mesh-controller --- PASS: TestReplay349 (0.22s) ./cmd/mesh-controller --- PASS: TestReplay348AFaultFromBeforeTheSendFailsNoGate (0.20s) ./cmd/mesh-controller --- PASS: TestReplay239AModuleNameIsNotTakenOverByAnotherRepository (0.18s) ./cmd/mesh-controller --- PASS: TestAWalkThatMovedNothingSaysWhichModulesMatchedWhatRuns (0.43s) ./internal/inventory --- PASS: TestTheLastSendSaysWhatTheMachineAnswered (0.08s) ./internal/inventory --- PASS: TestAReportIsTheLastSendsAnswerOnlyWhenItIsAboutThatSend (0.09s) ./internal/inventory --- PASS: TestAnIssuedValueIsSealedToEveryHolderOnceAndNotAgain (0.11s) ./internal/inventory --- PASS: TestAnIssuedValueIsSealedAgainAfterAKeyChangeOrAnAcceptance (0.09s) ./internal/inventory --- PASS: TestAConditionsLooksAreKeptBesideTheBucket (0.07s) ./internal/inventory --- PASS: TestAPlanIdHoldingAQuoteIsReadAsAPlainId (0.07s) ./internal/inventory --- PASS: TestAWalksStartIsKeptAndARefusedSaveLeavesItUnsaid (0.08s) ./internal/inventory --- PASS: TestAWalksRestIsReadFromEachMachinesOwnSend (0.08s) ./internal/inventory --- PASS: TestAStoredBuildWithASilentMergeableFileIsStillReadAndComposed (0.07s) ```
mesh-admin left a comment
Author
Contributor

Verdict: approve at 05576db018

No blocking findings.

The modules map is still only what the walk builds. Unchanged is a separate field on PlanDelivery. planBatch fills it through unchangedLeft against plan.Modules after planOfMoves and withhold, so a module the walk builds (another merge's, a dependent, or a carried one) is never named in both. TestAWalkSaysUnchangedOnlyWhatItDoesNotBuild pins that. Nothing writes an unbuilt row into modules, so staleIn and the other readers of modules see what they saw on main, which keeps clear of issue 606.

A stored walk without the field is safe. Unchanged is omitempty, inventory decodes the delivery column with plain json.Unmarshal (no DisallowUnknownFields), and a nil map is read as no module unchanged. A rollback to main is safe too. Main's PlanDelivery has no Unchanged, its json.Unmarshal ignores the unknown key, and a walk re-saved by main drops it, so mesh-delivery reads that walk as it does today. A walk with nothing to walk is done at its cut, so nothing re-saves it in practice. Deploy order does not matter either way, because mesh-catalog #265 behaves as main when the field is absent.

Tests: TestAMergeSaysTheModulesWhoseBuildSourceItLeftUnchanged, TestAWalkSaysUnchangedOnlyWhatItDoesNotBuild and the store test TestAWalkThatMovedNothingSaysWhichModulesMatchedWhatRuns pass at the head under -race. On main they fail to build: undefined unchangedLeft, and "PlanDelivery has no field or method Unchanged". That is the expected failure for a new field. At the head, go vet on ./cmd/mesh-controller and ./internal/inventory is clean. sh merge-check.sh exits 0 against a throwaway store (MESH_TEST_POSTGRES set), with every package passing under the race detector and every listed store test, the new one included, saying PASS.

Non-blocking: unchangedOfMerge's second loop names every module that packages the merged repository and recorded an untouched build source, whether or not any delivery plan named it. On every controller merge that leaves them alone, build-agent and route-proxy are listed, and so is the root-built controller through the first loop. mesh-delivery reads the field only for its plan's moved modules, so this is harmless, but it makes walk records and the nothing-to-walk note longer than they need to be.

Non-blocking: a module withheld under ADR 0299 is removed from plan.Modules before unchangedLeft runs, so a merge of this batch that leaves it unchanged lists it in Unchanged as well as in Withheld. For this walk's own merges the why is true. Its wording, "the build the mesh holds is its build", says nothing of the stopped merge's change that the module is withheld for. Consider leaving withheld modules out of Unchanged.

Non-blocking: for a module built from the repository's root, the why says "in its directory", which for that module is the whole repository.

Statuses at the head: mesh/merge-gate success ("head 05576db018 merged into trunk a688dcff39 — pass: builds build-agent, mesh-controller → ace, g14, novox, shanks; no bus step; every …"), mesh/repo-check success ("pass: its merge-check.sh passed"), mesh/delivery success ("ready: it delivers once merged"), and mesh/delivery-group pending ("group fix/611-an-unchanged-build-is-delivered checking: 0 of 3 member(s) ready"). Merge the group only once its composed check passes for every head.

Verdict: approve at 05576db018a42cbeb9c29ce8165c1333f60e1aea No blocking findings. The modules map is still only what the walk builds. Unchanged is a separate field on PlanDelivery. planBatch fills it through unchangedLeft against plan.Modules after planOfMoves and withhold, so a module the walk builds (another merge's, a dependent, or a carried one) is never named in both. TestAWalkSaysUnchangedOnlyWhatItDoesNotBuild pins that. Nothing writes an unbuilt row into modules, so staleIn and the other readers of modules see what they saw on main, which keeps clear of issue 606. A stored walk without the field is safe. Unchanged is omitempty, inventory decodes the delivery column with plain json.Unmarshal (no DisallowUnknownFields), and a nil map is read as no module unchanged. A rollback to main is safe too. Main's PlanDelivery has no Unchanged, its json.Unmarshal ignores the unknown key, and a walk re-saved by main drops it, so mesh-delivery reads that walk as it does today. A walk with nothing to walk is done at its cut, so nothing re-saves it in practice. Deploy order does not matter either way, because mesh-catalog #265 behaves as main when the field is absent. Tests: TestAMergeSaysTheModulesWhoseBuildSourceItLeftUnchanged, TestAWalkSaysUnchangedOnlyWhatItDoesNotBuild and the store test TestAWalkThatMovedNothingSaysWhichModulesMatchedWhatRuns pass at the head under -race. On main they fail to build: undefined unchangedLeft, and "PlanDelivery has no field or method Unchanged". That is the expected failure for a new field. At the head, go vet on ./cmd/mesh-controller and ./internal/inventory is clean. sh merge-check.sh exits 0 against a throwaway store (MESH_TEST_POSTGRES set), with every package passing under the race detector and every listed store test, the new one included, saying PASS. Non-blocking: unchangedOfMerge's second loop names every module that packages the merged repository and recorded an untouched build source, whether or not any delivery plan named it. On every controller merge that leaves them alone, build-agent and route-proxy are listed, and so is the root-built controller through the first loop. mesh-delivery reads the field only for its plan's moved modules, so this is harmless, but it makes walk records and the nothing-to-walk note longer than they need to be. Non-blocking: a module withheld under ADR 0299 is removed from plan.Modules before unchangedLeft runs, so a merge of this batch that leaves it unchanged lists it in Unchanged as well as in Withheld. For this walk's own merges the why is true. Its wording, "the build the mesh holds is its build", says nothing of the stopped merge's change that the module is withheld for. Consider leaving withheld modules out of Unchanged. Non-blocking: for a module built from the repository's root, the why says "in its directory", which for that module is the whole repository. Statuses at the head: mesh/merge-gate success ("head 05576db018a4 merged into trunk a688dcff394b — pass: builds build-agent, mesh-controller → ace, g14, novox, shanks; no bus step; every …"), mesh/repo-check success ("pass: its merge-check.sh passed"), mesh/delivery success ("ready: it delivers once merged"), and mesh/delivery-group pending ("group fix/611-an-unchanged-build-is-delivered checking: 0 of 3 member(s) ready"). Merge the group only once its composed check passes for every head.
mesh-admin merged commit 1826b68a22 into main 2026-10-13 08:25:46 +00:00
mesh-admin deleted branch fix/611-an-unchanged-build-is-delivered 2026-10-13 08:25:46 +00:00
Sign in to join this conversation.
No Reviewers
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: novox/mesh-controller#295