Design 47 milestone 4 (issue 980, ADR 0404), one delivery group with mesh-catalog's feat/backup-before-send.
Issue 1065. Once a plan has started and before its first tier is asked, the controller asks node-backup.now on every machine running each moved module that has an item protected by a backup, and reads backed-up's last night. The holders of node-backup are derived as seats derives them (every machine's claim), and a failed read is tried again, never read as no holder. Nothing is asked of a builder or sent until every backup is done. A machine with no backup holder is said in the plan. A plan moving no backed-up item is unchanged. The plan record gains backups {state, asked:[{machine, module, state, asked_at, tried_at, words}], no_holder}, kept in the store by migration 0103 (release_plan.backups jsonb).
Issue 1066. A backup that fails, does not answer, or cannot be asked within ten minutes holds the plan (not failed, not retried), names the machine, the module and the backup's words, and raises one condition (backup-held). The new verb delivery-backups-again {plan, why} asks the failed backups again; mesh-delivery's release calls it.
Integration test backups_before_send_integration_test.go proves acceptance test 3 on the controller side; it runs here in the merge check. Its earlier checks found: the fixture's machine data path (ADR 0112); holders read from a table keeping one node-seat holder (08e000bb); and the plan's backups record never kept by the store, so a plan would have asked forever and never sent (91a7c1ea, migration 0103).
Design 47 milestone 4 (issue 980, ADR 0404), one delivery group with mesh-catalog's `feat/backup-before-send`.
- **Issue 1065.** Once a plan has started and before its first tier is asked, the controller asks `node-backup.now` on every machine running each moved module that has an item protected by a backup, and reads `backed-up`'s last night. The holders of `node-backup` are derived as `seats` derives them (every machine's claim), and a failed read is tried again, never read as no holder. Nothing is asked of a builder or sent until every backup is done. A machine with no backup holder is said in the plan. A plan moving no backed-up item is unchanged. The plan record gains `backups` {state, asked:[{machine, module, state, asked_at, tried_at, words}], no_holder}, kept in the store by migration 0103 (`release_plan.backups jsonb`).
- **Issue 1066.** A backup that fails, does not answer, or cannot be asked within ten minutes holds the plan (not failed, not retried), names the machine, the module and the backup's words, and raises one condition (`backup-held`). The new verb `delivery-backups-again` {plan, why} asks the failed backups again; mesh-delivery's `release` calls it.
- Integration test `backups_before_send_integration_test.go` proves acceptance test 3 on the controller side; it runs here in the merge check. Its earlier checks found: the fixture's machine data path (ADR 0112); holders read from a table keeping one node-seat holder (08e000bb); and the plan's backups record never kept by the store, so a plan would have asked forever and never sent (91a7c1ea, migration 0103).
Reviewed-by: review@shanks at 91a7c1eaffd2281d87cd0a04e5a3f1345f527043
mesh/repo-check head a39d6ce78d19 merged into trunk 7c9c187ca6e2 — fail: its merge-check.sh failed: --- FAIL: TestADeliveryThatMovesABackedUpModuleWaitsFor…
route-proxy provides route: its consumers are sent again after it
route-proxy keeps data (ADR 0233): what it holds is backed up before it moves
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 route-proxy, build-agent is judged on its first machine
composed together: pass — every machine composes with the change as it did without (4 of 4 compose)
Transitions
2026-10-17 21:26 (new) → proposed (announced): novox/mesh-controller#375's head announced
2026-10-17 21:30 proposed → checked (checked): a verdict names this commit and the trunk's head as its trunk commit
2026-10-17 21:30 checked → rejected (refused): the gate failed or could not run, or the repository's own check failed
2026-10-17 21:31 rejected → proposed (recheck): Exception (ADR 0421 §12): the check failed only on internal/lease TestAnotherHolderSeenAfterAStallIsALossAtOnce, a timing flake in a package this change does not touch (issue 1080); the new acceptance test and all 8 controller shards passed. The head is unchanged, so nothing else asks again. Operator said fix and push (2026-10-17 23:24).
2026-10-17 21:36 proposed → checked (checked): a verdict names this commit and the trunk's head as its trunk commit
2026-10-17 21:36 checked → ready (accepted): the gate passed or warned, and the repository's own check did not fail
2026-10-17 22:08 ready → stopped (stop): Operator's word (2026-10-18 00:09): split the group. After mesh-catalog #353 merged on the group's Approve (23:48:51), #375's merge was refused every minute ('its verdict names no trunk commit it was judged against'), its merge gate stays pending on a composed check the closed group never asks again (holder.go planGroup), 18 tries and 7 builds. Stopped so the catalogue half is delivered alone; #375 goes through again as a lone pull request.
The commit's note under refs/notes/mesh-plan keeps every transition: git log --notes=mesh-plan.
<!-- mesh-delivery:view -->
**Delivery** `novox/mesh-controller@91a7c1eaffd2` — **stopped** since 2026-10-17T22:08:04Z
**Delivery plan** — builds build-agent, mesh-controller, route-proxy → ace, g14, novox, shanks; no bus step
- tier 0: mesh-controller, route-proxy
- tier 1: build-agent
- ace: receives route-proxy, build-agent
- g14: receives build-agent
- novox: receives mesh-controller, route-proxy, build-agent
- shanks: receives build-agent
- route-proxy provides route: its consumers are sent again after it
- route-proxy keeps data (ADR 0233): what it holds is backed up before it moves
- 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 route-proxy, build-agent is judged on its first machine
**Group** `feat/backup-before-send`: novox/mesh-catalog@4d03755c6598, novox/mesh-controller@91a7c1eaffd2
- composed together: pass — every machine composes with the change as it did without (4 of 4 compose)
**Transitions**
- 2026-10-17 21:26 (new) → proposed (announced): novox/mesh-controller#375's head announced
- 2026-10-17 21:30 proposed → checked (checked): a verdict names this commit and the trunk's head as its trunk commit
- 2026-10-17 21:30 checked → rejected (refused): the gate failed or could not run, or the repository's own check failed
- 2026-10-17 21:31 rejected → proposed (recheck): Exception (ADR 0421 §12): the check failed only on internal/lease TestAnotherHolderSeenAfterAStallIsALossAtOnce, a timing flake in a package this change does not touch (issue 1080); the new acceptance test and all 8 controller shards passed. The head is unchanged, so nothing else asks again. Operator said fix and push (2026-10-17 23:24).
- 2026-10-17 21:36 proposed → checked (checked): a verdict names this commit and the trunk's head as its trunk commit
- 2026-10-17 21:36 checked → ready (accepted): the gate passed or warned, and the repository's own check did not fail
- 2026-10-17 22:08 ready → stopped (stop): Operator's word (2026-10-18 00:09): split the group. After mesh-catalog #353 merged on the group's Approve (23:48:51), #375's merge was refused every minute ('its verdict names no trunk commit it was judged against'), its merge gate stays pending on a composed check the closed group never asks again (holder.go planGroup), 18 tries and 7 builds. Stopped so the catalogue half is delivered alone; #375 goes through again as a lone pull request.
The commit's note under `refs/notes/mesh-plan` keeps every transition: `git log --notes=mesh-plan`.
route-proxy provides route: its consumers are sent again after it
route-proxy keeps data (ADR 0233): what it holds is backed up before it moves
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 route-proxy, build-agent is judged on its first machine
read by no module's build: cmd/mesh-controller/backups_before_send_integration_test.go, cmd/mesh-controller/plan_backups_hold_test.go, cmd/mesh-controller/plan_backups_test.go, internal/inventory/plan_backups_test.go
Run by the build seat on ace as build-1792270511747331245 (builds --log build-1792270511747331245).
✓ docker run (1ms)
$ (.) docker port build-1792270763727558405-bus 4222/tcp
✓ docker port (1ms)
$ (mesh-con) git rev-parse --verify --quiet HEAD^{tree}
✓ git rev-parse (2ms)
$ (mesh-hos) git rev-parse --verify --quiet HEAD^{tree}
✓ git rev-parse (2ms)
$ (mesh-con) git rev-parse --verify --quiet HEAD^{commit}
✓ git rev-parse (2ms)
$ (check) git clone --quiet --no-local --no-checkout /tmp/TestReplay8673628387563/006/check/mesh-controller /tmp/TestReplay8673628387563/006/check/judge-src
✓ git clone (53ms)
$ (judge-sr) git checkout --quiet --detach bec072dbd2daa94f32b698bf929de008e0dd656e
✓ git checkout (4ms)
$ (check) docker run --label mesh.build=build-1792270763727558405 --volume /tmp/TestReplay8673628387563/001/homes/build-1792270763727558405:/tmp/TestReplay8673628387563/001/homes/build-1792270763727558405 --volume /tmp/TestReplay8673628387563/001/go-cache:/tmp/TestReplay8673628387563/001/go-cache --rm --network host --volume /tmp/TestReplay8673628387563/006:/tmp/TestReplay8673628387563/006 --workdir /tmp/TestReplay8673628387563/006/check/judge-src --user 0:0 --env HOME=/tmp/TestReplay8673628387563/001/homes/build-1792270763727558405 --env GIT_CONFIG_COUNT=1 --env GIT_CONFIG_KEY_0=safe.directory --env GIT_CONFIG_VALUE_0=* --env XDG_CONFIG_HOME=/tmp/TestReplay8673628387563/001/homes/build-1792270763727558405/.config --env GIT_CONFIG_GLOBAL=/dev/null --env GIT_CONFIG_NOSYSTEM=1 --env GOENV=off --env GOCACHE=/tmp/TestReplay8673628387563/001/go-cache --env GOPATH=/tmp/TestReplay8673628387563/001/homes/build-1792270763727558405/go --env CGO_ENABLED=0 --env GOFLAGS=-mod=vendor -buildvcs=false --env GOPROXY=off golang go build -o /tmp/TestReplay8673628387563/006/check/bin/judge-of-the-group ./cmd/mesh-controller
✓ docker run (225ms)
$ (.) docker ps -aq --filter label=mesh.build=build-1792270763727558405
✓ docker ps (1ms)
release-1792270765233155749: 2 build(s) wait for a gate on anchor, laptop; one machine first, then the rest at once, each judged
release-1792270765233155749: anchor was already sent the 1 build(s) kept for it, at 20:59:25: judged from that send, nothing sent again
build-1792267166730381147: app 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-1792267166730381147: the build seat did not say whether c1aaaaaa is on its repository's trunk (it predates ADR 0238); registered as before
build-1792267226730381147: 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-1792267166730381147 was: registered with its artifacts, no move
build-1792267286730381147: the build seat did not say whether c3cccccc is on its repository's trunk (it predates ADR 0238); registered as before
build-1792267346730381147: the build seat did not say whether c4dddddd is on its repository's trunk (it predates ADR 0238); registered as before
the setting push-wait=later is no duration; a push waits for nothing
notes on laptop:
+ x
run `plan laptop --diff` to see what it changes, `push laptop` to send it
settings-1792270769064874505: the settings of notes on the whole mesh — approved (ask s9): sent to laptop, one machine at a time, each judged
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, by a leaf module's rule, judged as the core: 3 readings, or healthy throughout 1h0m0s after the send); 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)
2026/10/17 20:59:32 secret-given: dunst's token on anchor could not be told through the operator channel (nothing serves it: nothing answers operator-channel.tell — its holder is not running, or is older than the verb); the secret-given condition is raised as it was before novox/hq ADR 0380 (its clause 9)
dunst on anchor now holds "token", given at the desk on laptop and kept in the vault as own/anchor/dunst/token (generation 1); the vault asked the desk itself and opened it alone, and anchor takes it from there
this act could NOT be recorded in the hand-act log, and is done anyway: the hand-act log mesh-controller_hand-acts is not on the bus — the controller asserts it at its start, so one older than this has not: nats: bucket not found
2026/10/17 20:59:32 secret-given: dunst's token on anchor could not be told through the operator channel (nothing serves it: nothing answers operator-channel.tell — its holder is not running, or is older than the verb); the secret-given condition is raised as it was before novox/hq ADR 0380 (its clause 9)
dunst on anchor now holds "token", given at the desk on laptop and kept in the vault as own/anchor/dunst/token (generation 1); the vault asked the desk itself and opened it alone, and anchor takes it from there
this act could NOT be recorded in the hand-act log, and is done anyway: the hand-act log mesh-controller_hand-acts is not on the bus — the controller asserts it at its start, so one older than this has not: nats: bucket not found
tier 0: plan-308-retry retried at tier 0 of 2: asked a as build-1792270773175041891; the plan goes on from there as any plan does
FAIL
FAIL github.com/novox/mesh-controller/cmd/mesh-controller 49s (shard 8 of 8: 138 tests)
ok github.com/novox/mesh-controller/internal/inventory 24s (shard 1 of 4: 78 tests)
ok github.com/novox/mesh-controller/internal/inventory 24s (shard 2 of 4: 78 tests)
ok github.com/novox/mesh-controller/internal/inventory 23s (shard 3 of 4: 78 tests)
ok github.com/novox/mesh-controller/internal/inventory 23s (shard 4 of 4: 77 tests)
ok github.com/novox/mesh-controller/internal/builder 25s (shard 1 of 4: 54 tests)
ok github.com/novox/mesh-controller/internal/builder 25s (shard 2 of 4: 53 tests)
ok github.com/novox/mesh-controller/internal/builder 31s (shard 3 of 4: 53 tests)
ok github.com/novox/mesh-controller/internal/builder 26s (shard 4 of 4: 53 tests)
ok github.com/novox/mesh-controller/internal/link 23s (shard 1 of 4: 50 tests)
ok github.com/novox/mesh-controller/internal/link 18s (shard 2 of 4: 49 tests)
ok github.com/novox/mesh-controller/internal/link 20s (shard 3 of 4: 49 tests)
ok github.com/novox/mesh-controller/internal/link 27s (shard 4 of 4: 49 tests)
integration level (the whole suite, tag integration): 3326 tests (6 skipped outside the shards), 205 s
nested module modules/build-agent:
ok build-agent 1.013s
nested module modules/route-proxy:
ok route-proxy/cmd/route-provider 1.011s
nested modules: 3 s
store tests, each run against the store:
./cmd/mesh-controller --- PASS: TestAStopWithoutAMergeWalksTheOthersAgain (0.60s)
./cmd/mesh-controller --- PASS: TestAStopWithoutAMergeEndsTheMergesThatContainIt (0.45s)
./cmd/mesh-controller --- PASS: TestAStopWalksTheOthersAgainInTheOpenBatch (0.40s)
./cmd/mesh-controller --- PASS: TestAStopNamesWhatStaysOnTheMachinesAndWhatStillCarriesIt (0.45s)
./cmd/mesh-controller --- PASS: TestAStopWithoutAMergeLeavesItOutOfABatch (0.38s)
./cmd/mesh-controller --- PASS: TestSavingPlansAndMovingMergesIsOneAct (0.30s)
./cmd/mesh-controller --- PASS: TestAPlanFollowedFromTheStoreAnswersWhenItMoves (2.19s)
./cmd/mesh-controller --- PASS: TestIssue969TheGateRaisesEachMachineAsItsEngineStatedItself (0.99s)
./cmd/mesh-controller --- PASS: TestNodeShowAndStatusReadTheLastSendFromTheStore (0.42s)
./cmd/mesh-controller --- PASS: TestTheConditionsVerbReadsTheLooksTheBucketNoLongerHolds (0.19s)
./cmd/mesh-controller --- PASS: TestAWalkLetGoAndStoppedByVerbsIsSaidStartedAndEnded (0.30s)
./cmd/mesh-controller --- PASS: TestAWalkStoppedOrClosedByAPersonIsSaidEndedStopped (0.31s)
./cmd/mesh-controller --- PASS: TestAWalkRetriedByAPersonIsSaidStartedAgain (0.25s)
./cmd/mesh-controller --- PASS: TestABacklogReleasedByAPersonIsSaidStarted (0.25s)
./cmd/mesh-controller --- PASS: TestAWalkEndedByCancelOrClearIsSaidEnded (0.31s)
./cmd/mesh-controller --- PASS: TestAWalkRestartedByARebuildIsSaidStarted (0.27s)
./cmd/mesh-controller --- PASS: TestAWalkStoppedByHandAndRetriedEndsFailedWhenItFailsAgain (0.31s)
./cmd/mesh-controller --- PASS: TestReplay237 (0.30s)
./cmd/mesh-controller --- PASS: TestAnUnassignThatLeavesItsNodeUnresolvedSaysSoOnceInItsAnswer (0.30s)
./cmd/mesh-controller --- PASS: TestAnUnassignThatLeavesItsNodeResolvedSaysNothingOfIt (0.35s)
./cmd/mesh-controller --- PASS: TestAnAssignThatLeavesItsNodeUnresolvedSaysOnlyThePlansRefusal (0.32s)
./cmd/mesh-controller --- PASS: TestADirectoryOwnersKeyIsRefusedThroughAVerb (0.38s)
./cmd/mesh-controller --- PASS: TestTheSendMakesNoValueForAnOutsideSecretNobodyGave (0.60s)
./cmd/mesh-controller --- PASS: TestAQuestionComposesWithoutAnOutsideSecretNobodyGave (0.69s)
./cmd/mesh-controller --- PASS: TestReplay201 (0.36s)
./cmd/mesh-controller --- PASS: TestARollbackWhoseSendWasRefusedIsCompletedByTheNextSend (0.76s)
./cmd/mesh-controller --- PASS: TestAGateJudgesTheOtherMovesBesideAKeptCore (0.49s)
./cmd/mesh-controller --- PASS: TestReplay401 (0.40s)
./cmd/mesh-controller --- PASS: TestReplay201ThePlansSend (0.29s)
./cmd/mesh-controller --- PASS: TestPlanAndNodeListAnOptionalRequirementLeftUnbound (0.43s)
./cmd/mesh-controller --- PASS: TestReplay340 (0.30s)
./cmd/mesh-controller --- PASS: TestOnlyATrustedFilesNamedKeyIsRefusedThroughAVerb (0.30s)
./cmd/mesh-controller --- PASS: TestReplay349 (0.30s)
./cmd/mesh-controller --- PASS: TestReplay348AFaultFromBeforeTheSendFailsNoGate (0.20s)
./cmd/mesh-controller --- PASS: TestReplay239AModuleNameIsNotTakenOverByAnotherRepository (0.21s)
./cmd/mesh-controller --- PASS: TestAWalkThatMovedNothingSaysWhichModulesMatchedWhatRuns (0.34s)
./cmd/mesh-controller --- PASS: TestAWalkWhoseEveryBuildCameOutTheSameIsDone (0.30s)
./cmd/mesh-controller --- PASS: TestReplay614ANewSDKPlansTheToolchainAndThenItsBundles (0.10s)
./cmd/mesh-controller --- PASS: TestOneAcceptForAProviderIsPlacedForEveryConsumer (0.85s)
./cmd/mesh-controller --- PASS: TestReplay164 (0.36s)
./cmd/mesh-controller --- PASS: TestAnApprovedLayerOpensTheWalkThatSendsIt (0.28s)
./cmd/mesh-controller --- PASS: TestASettingsWalkSendsOneMachineAtATimeEachJudged (0.29s)
./cmd/mesh-controller --- PASS: TestAFailedSettingsWalkStopsAndHoldsNothingBack (0.27s)
./cmd/mesh-controller --- PASS: TestASettingsWalkSendsTheLayerAloneEveryBuildKept (0.36s)
./cmd/mesh-controller --- PASS: TestASettingsWalkStopsBeforeADataMoveAndPassesOverAMachineAway (0.86s)
./cmd/mesh-controller --- PASS: TestACrossingSendSupersedesASettingsGate (0.31s)
./cmd/mesh-controller --- PASS: TestASettingsWalkFailsOnARefusalThatCannotClear (0.23s)
./cmd/mesh-controller --- PASS: TestAProviderElsewhereServesItsOwnComposedName (0.35s)
./cmd/mesh-controller --- PASS: TestAReusedCheckBuildIsRegisteredByItsDigestAndGatedAsABuiltOne (0.69s)
./cmd/mesh-controller --- PASS: TestTheMergeGateJudgesEachManifestAgainstTheListOfTheTree (6.00s)
./cmd/mesh-controller --- PASS: TestRegistrationPublishesTheNewestTrunkListAndJudgesEveryModuleAgainstIt (0.22s)
./cmd/mesh-controller --- PASS: TestADeclarationIsTheSameAfterPlacementMoves (0.71s)
./cmd/mesh-controller --- PASS: TestAReleaseSendsTheRestAtOnceAfterTheFirstPasses (0.36s)
./cmd/mesh-controller --- PASS: TestARestMachineThatFailsIsPutBackAloneAndTheOthersAreJudgedOn (0.30s)
./cmd/mesh-controller --- PASS: TestAWalkTakesOverTheReadingsOfAGateJudgingTheSameBuildThere (0.25s)
./cmd/mesh-controller --- PASS: TestAFirstSendMadeAndNotKeptIsNotSentAgain (0.32s)
./cmd/mesh-controller --- PASS: TestAReleaseSendKeptAndMadeIsNotMadeAgain (0.33s)
./cmd/mesh-controller --- PASS: TestAFirstMachineThatFailsStillStopsTheWalk (0.26s)
./cmd/mesh-controller --- PASS: TestTheControlNodeIsSentLastInAStep (0.31s)
./cmd/mesh-controller --- PASS: TestARestMachineSilentPastItsBoundIsLeftAndSaid (0.29s)
./cmd/mesh-controller --- PASS: TestANoMoveTierWaitsForNoNewReport (0.37s)
./cmd/mesh-controller --- PASS: TestOneProviderDownAndThreeConsumersFailingAreOneCondition (0.22s)
./cmd/mesh-controller --- PASS: TestAConsumerFailingBesideAHealthyProviderIsItsOwn (0.18s)
./cmd/mesh-controller --- PASS: TestTheProvisionerClientsAccountIsIssuedForItsServiceAndNeverInvented (0.27s)
./cmd/mesh-controller --- PASS: TestAcceptOfAnOwnSecretTakesThePathOfItsModulesForm (0.38s)
./cmd/mesh-controller --- PASS: TestAcceptForAProviderTakesThePathOfTheProvidersModule (0.35s)
./cmd/mesh-controller --- PASS: TestAcceptForAMovedTrustedModuleAnnouncesBeforeTheVaultIsAsked (0.36s)
./cmd/mesh-controller --- PASS: TestAcceptForAMovedModuleRecordsAHandActAndNeverTheValue (0.27s)
./cmd/mesh-controller --- PASS: TestAcceptOfAnOutsideOfferTakesThePathOfTheProvidersModule (0.39s)
./cmd/mesh-controller --- PASS: TestAnAskAtTheDeskTakesThePathOfItsModulesForm (0.34s)
./cmd/mesh-controller --- PASS: TestAnIssuedValueTakesThePathOfItsProvidersModule (0.39s)
./cmd/mesh-controller --- PASS: TestARotationTakesThePathOfItsModulesForm (0.32s)
./cmd/mesh-controller --- PASS: TestADeclarationIsTheSameWhileTheWordsAreStillInTheLayers (2.85s)
./cmd/mesh-controller --- PASS: TestADeclarationIsTheSameAfterTheMoveOfPlacement (4.53s)
./cmd/mesh-controller --- PASS: TestTheSendSealsNoSecretOfAModuleHandedThere (0.41s)
./cmd/mesh-controller --- PASS: TestAModulesSecretsAreTheVaultsOnceItIsMarkedMoved (0.35s)
./cmd/mesh-controller --- PASS: TestEveryMachineIsToldTheSameAfterTheMoveOfConfig (30.19s)
./cmd/mesh-controller --- PASS: TestTheMoveOfConfigRefusesWhatWouldChangeAMachine (9.96s)
./cmd/mesh-controller --- PASS: TestTheSettingsVerbForwardsToConfigOnceTheValuesMoved (11.58s)
./cmd/mesh-controller --- PASS: TestTheSendCarriesTheVaultsBoxForACoreCredentialAndKeepsIt (0.53s)
./cmd/mesh-controller --- PASS: TestASilentVaultHoldsTheKeptBoxAndSaysSo (0.52s)
./cmd/mesh-controller --- PASS: TestACoreModuleFirstPlacedWhileTheVaultIsSilentIsSealedByTheController (0.79s)
./cmd/mesh-controller --- PASS: TestAnEngineBelowTheContractIsSentTheControllersSealAsBefore (0.84s)
./cmd/mesh-controller --- PASS: TestModuleIssueHandsACoveredAccountToTheVaultAndOnlyThat (0.36s)
./cmd/mesh-controller --- PASS: TestModuleIssueFailsWhenTheVaultDoesNotTakeACoveredAccount (0.34s)
./cmd/mesh-controller --- PASS: TestModuleIssueBeforeTheVaultIsInstalledKeepsTheValueAndHandsNothing (0.34s)
./cmd/mesh-controller --- PASS: TestARecordedModulesBundleOnlyMoveRollsOutInItsWalk (0.41s)
./cmd/mesh-controller --- PASS: TestARecordedModulesMoveThatRecreatesAContainerWaits (0.81s)
./cmd/mesh-controller --- PASS: TestARecordedModulesMoveThatTouchesDataOrAProviderWaits (0.83s)
./cmd/mesh-controller --- PASS: TestAPersonsRecordAndTheBusHoldEveryMove (0.56s)
./cmd/mesh-controller --- PASS: TestARecordedMoveThatCannotBeJudgedWaits (0.42s)
./cmd/mesh-controller --- PASS: TestReplay867 (4.65s)
./cmd/mesh-controller --- PASS: TestReplay867Recheck (5.34s)
./cmd/mesh-controller --- PASS: TestTheRecheckVerbAsksMeshDeliveryOnABusOfItsOwn (0.44s)
./cmd/mesh-controller --- PASS: TestAssigningTheClientIssuesItsAccount (0.23s)
./cmd/mesh-controller --- PASS: TestAnUnrelatedBatchWalksBesideAnOpenWalk (0.32s)
./cmd/mesh-controller --- PASS: TestARelatedBatchWaitsBehindTheOpenWalk (0.23s)
./cmd/mesh-controller --- PASS: TestAnOwnPathBatchNeverWalksBeside (0.23s)
./cmd/mesh-controller --- PASS: TestMergesHeardWhileAnotherHolderHasThePlansAreRecordedAndCarried (7.46s)
./cmd/mesh-controller --- PASS: TestABatchWindowClosesByTheExpiryOfItsKey (1.72s)
./cmd/mesh-controller --- PASS: TestEveryMoveAMergeAndTheCutMakeOfAPlanIsSaid (0.35s)
./cmd/mesh-controller --- PASS: TestARolloutAdvancesOnEventsAndAReplacedControllerResumesIt (3.77s)
./cmd/mesh-controller --- PASS: TestAWalkLetGoByTheDeliverVerbIsAskedWithNoOtherEvent (1.01s)
./cmd/mesh-controller --- PASS: TestTwoMergesWithinAMinuteLeaveEachOpenPullRequestOneQueuedCheck (1.22s)
./cmd/mesh-controller --- PASS: TestADeliveryGroupMovingAModuleMachinesRunPassesTheGate (7.35s)
./cmd/mesh-controller --- PASS: TestAModuleMovesOnTheOperatorsApproveOfTheMergeThatMovedIt (1.30s)
./cmd/mesh-controller --- PASS: TestAModuleBuiltFromANewRepositoryIsRegisteredOnlyOnTheOperatorsApproveOnTheBus (0.82s)
./internal/inventory --- PASS: TestTheLastSendSaysWhatTheMachineAnswered (0.08s)
./internal/inventory --- PASS: TestAReportIsTheLastSendsAnswerOnlyWhenItIsAboutThatSend (0.14s)
./internal/inventory --- PASS: TestAnIssuedValueIsSealedToEveryHolderOnceAndNotAgain (0.10s)
./internal/inventory --- PASS: TestAnIssuedValueIsSealedAgainAfterAKeyChangeOrAnAcceptance (0.09s)
./internal/inventory --- PASS: TestAConditionsLooksAreKeptBesideTheBucket (0.07s)
./internal/inventory --- PASS: TestAPlanIdHoldingAQuoteIsReadAsAPlainId (0.07s)
./internal/inventory --- PASS: TestAWalksStartIsKeptAndARefusedSaveLeavesItUnsaid (0.15s)
./internal/inventory --- PASS: TestAWalksRestIsReadFromEachMachinesOwnSend (0.13s)
./internal/inventory --- PASS: TestAStoredBuildWithASilentMergeableFileIsStillReadAndComposed (0.13s)
./internal/inventory --- PASS: TestACredentialIssuedOutsideIsNeverMade (0.08s)
./internal/inventory --- PASS: TestOneAcceptForAProviderIsSealedToEveryConsumer (0.09s)
./internal/inventory --- PASS: TestASharedOwnSecretIssuedOutsideIsNeverMade (0.08s)
./internal/inventory --- PASS: TestAModuleInTheConfigFormIsMirroredWithItsWholeDeclaration (0.10s)
./internal/inventory --- PASS: TestAReportOfABusyContainerIsKeptAndReadBack (0.08s)
./internal/inventory --- PASS: TestANewerBuildsListReplacesTheKeptOneAndAnOlderOneHeardLaterDoesNot (0.08s)
./internal/inventory --- PASS: TestPlacementMovesOutOfTheSettingsLayers (0.38s)
./internal/inventory --- PASS: TestASettingRoutesPlacementBesideTheLayer (0.10s)
./internal/inventory --- PASS: TestTheProvisionerClientsMachineHasAnAccountOfItsOwn (0.11s)
./internal/inventory --- PASS: TestTheFourWordsAreKeptBesideTheLayer (0.11s)
./internal/inventory --- PASS: TestALayerStillHoldingTheWordsReadsThemAsPlacement (0.09s)
./internal/inventory --- PASS: TestTheMoveOfPlacementMovesWhatTheLayersStillHold (0.09s)
./internal/inventory --- PASS: TestTheMoveReadsEveryRowSealedToAMachineAsItIs (0.09s)
./internal/inventory --- PASS: TestASendKeepsThePlansItHandedAndTheMirrorCarriesThem (0.14s)
./internal/inventory --- PASS: TestTheLayersAreReadUntilTheMoveOfConfigHasRun (0.10s)
./internal/inventory --- PASS: TestAModuleReadsMeshConfigOnlyWhereItsValuesAre (0.10s)
./internal/inventory --- PASS: TestTheEndOfTheMoveRefusesALayerChangedSinceItWasRead (0.09s)
./internal/inventory --- PASS: TestACoreCredentialsVaultBoxIsKeptPerMachineAndReplaced (0.07s)
./internal/inventory --- PASS: TestWhatRunsIsTheRegisteredBuildNotANewerOnePutBack (0.09s)
./internal/recordmirror --- PASS: TestNatsAnAssignmentAndARegistrationEachChangeOneKeyAndRaiseOneEvent (3.59s)
./internal/recordmirror --- PASS: TestNatsTheListOfPredefinedKeysKeptChangesTheMirrorsOneKey (1.51s)
the suite failed: each package or shard that failed is said above with its output
--- what failed, picked from the whole of its output (the whole is in the build's log)
--- FAIL: TestADeliveryThatMovesABackedUpModuleWaitsForItsBackupAndAFailedOneHoldsItAndIsSaid (0.36s)
backups_before_send_integration_test.go:103: this manifest cannot be used:
- notes's data: files's path "/srv/notes" is not one of the module's directories or accesses: ${dir:<id>} or ${access:<id>}, or a path beneath one (a definition names no machine path, novox/hq ADR 0112)
FAIL github.com/novox/mesh-controller/cmd/mesh-controller 49s (shard 8 of 8: 138 tests)
**Merge check** at `a39d6ce7`
Judged: head `a39d6ce78d19` merged into trunk `7c9c187ca6e2`; read beside it: mesh-catalog `f076cadecedc`, mesh-controller-main `7c9c187ca6e2`, mesh-host `6469e8238443`, mesh-tools `7412c5b6c9c5`
- `mesh/merge-gate`: **PASS** — every machine composes with the change as it did without (4 of 4 compose) (modules: build-agent, mesh-controller, route-proxy)
- `mesh/repo-check`: **FAIL** — its merge-check.sh failed: --- FAIL: TestADeliveryThatMovesABackedUpModuleWaitsForItsBackupAndAFailedOneHoldsItAndIsSaid (0.36s)
**Delivery plan** — builds build-agent, mesh-controller, route-proxy → ace, g14, novox, shanks; no bus step
- tier 0: mesh-controller, route-proxy
- tier 1: build-agent
- ace: receives route-proxy, build-agent
- g14: receives build-agent
- novox: receives mesh-controller, route-proxy, build-agent
- shanks: receives build-agent
- route-proxy provides route: its consumers are sent again after it
- route-proxy keeps data (ADR 0233): what it holds is backed up before it moves
- 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 route-proxy, build-agent is judged on its first machine
- read by no module's build: cmd/mesh-controller/backups_before_send_integration_test.go, cmd/mesh-controller/plan_backups_hold_test.go, cmd/mesh-controller/plan_backups_test.go, internal/inventory/plan_backups_test.go
Run by the build seat on ace as `build-1792270511747331245` (`builds --log build-1792270511747331245`).
```
✓ docker run (1ms)
$ (.) docker port build-1792270763727558405-bus 4222/tcp
✓ docker port (1ms)
$ (mesh-con) git rev-parse --verify --quiet HEAD^{tree}
✓ git rev-parse (2ms)
$ (mesh-hos) git rev-parse --verify --quiet HEAD^{tree}
✓ git rev-parse (2ms)
$ (mesh-con) git rev-parse --verify --quiet HEAD^{commit}
✓ git rev-parse (2ms)
$ (check) git clone --quiet --no-local --no-checkout /tmp/TestReplay8673628387563/006/check/mesh-controller /tmp/TestReplay8673628387563/006/check/judge-src
✓ git clone (53ms)
$ (judge-sr) git checkout --quiet --detach bec072dbd2daa94f32b698bf929de008e0dd656e
✓ git checkout (4ms)
$ (check) docker run --label mesh.build=build-1792270763727558405 --volume /tmp/TestReplay8673628387563/001/homes/build-1792270763727558405:/tmp/TestReplay8673628387563/001/homes/build-1792270763727558405 --volume /tmp/TestReplay8673628387563/001/go-cache:/tmp/TestReplay8673628387563/001/go-cache --rm --network host --volume /tmp/TestReplay8673628387563/006:/tmp/TestReplay8673628387563/006 --workdir /tmp/TestReplay8673628387563/006/check/judge-src --user 0:0 --env HOME=/tmp/TestReplay8673628387563/001/homes/build-1792270763727558405 --env GIT_CONFIG_COUNT=1 --env GIT_CONFIG_KEY_0=safe.directory --env GIT_CONFIG_VALUE_0=* --env XDG_CONFIG_HOME=/tmp/TestReplay8673628387563/001/homes/build-1792270763727558405/.config --env GIT_CONFIG_GLOBAL=/dev/null --env GIT_CONFIG_NOSYSTEM=1 --env GOENV=off --env GOCACHE=/tmp/TestReplay8673628387563/001/go-cache --env GOPATH=/tmp/TestReplay8673628387563/001/homes/build-1792270763727558405/go --env CGO_ENABLED=0 --env GOFLAGS=-mod=vendor -buildvcs=false --env GOPROXY=off golang go build -o /tmp/TestReplay8673628387563/006/check/bin/judge-of-the-group ./cmd/mesh-controller
✓ docker run (225ms)
$ (.) docker ps -aq --filter label=mesh.build=build-1792270763727558405
✓ docker ps (1ms)
release-1792270765233155749: 2 build(s) wait for a gate on anchor, laptop; one machine first, then the rest at once, each judged
release-1792270765233155749: anchor was already sent the 1 build(s) kept for it, at 20:59:25: judged from that send, nothing sent again
build-1792267166730381147: app 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-1792267166730381147: the build seat did not say whether c1aaaaaa is on its repository's trunk (it predates ADR 0238); registered as before
build-1792267226730381147: 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-1792267166730381147 was: registered with its artifacts, no move
build-1792267286730381147: the build seat did not say whether c3cccccc is on its repository's trunk (it predates ADR 0238); registered as before
build-1792267346730381147: the build seat did not say whether c4dddddd is on its repository's trunk (it predates ADR 0238); registered as before
the setting push-wait=later is no duration; a push waits for nothing
notes on laptop:
+ x
run `plan laptop --diff` to see what it changes, `push laptop` to send it
settings-1792270769064874505: the settings of notes on the whole mesh — approved (ask s9): sent to laptop, one machine at a time, each judged
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, by a leaf module's rule, judged as the core: 3 readings, or healthy throughout 1h0m0s after the send); 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)
2026/10/17 20:59:32 secret-given: dunst's token on anchor could not be told through the operator channel (nothing serves it: nothing answers operator-channel.tell — its holder is not running, or is older than the verb); the secret-given condition is raised as it was before novox/hq ADR 0380 (its clause 9)
dunst on anchor now holds "token", given at the desk on laptop and kept in the vault as own/anchor/dunst/token (generation 1); the vault asked the desk itself and opened it alone, and anchor takes it from there
this act could NOT be recorded in the hand-act log, and is done anyway: the hand-act log mesh-controller_hand-acts is not on the bus — the controller asserts it at its start, so one older than this has not: nats: bucket not found
2026/10/17 20:59:32 secret-given: dunst's token on anchor could not be told through the operator channel (nothing serves it: nothing answers operator-channel.tell — its holder is not running, or is older than the verb); the secret-given condition is raised as it was before novox/hq ADR 0380 (its clause 9)
dunst on anchor now holds "token", given at the desk on laptop and kept in the vault as own/anchor/dunst/token (generation 1); the vault asked the desk itself and opened it alone, and anchor takes it from there
this act could NOT be recorded in the hand-act log, and is done anyway: the hand-act log mesh-controller_hand-acts is not on the bus — the controller asserts it at its start, so one older than this has not: nats: bucket not found
tier 0: plan-308-retry retried at tier 0 of 2: asked a as build-1792270773175041891; the plan goes on from there as any plan does
FAIL
FAIL github.com/novox/mesh-controller/cmd/mesh-controller 49s (shard 8 of 8: 138 tests)
ok github.com/novox/mesh-controller/internal/inventory 24s (shard 1 of 4: 78 tests)
ok github.com/novox/mesh-controller/internal/inventory 24s (shard 2 of 4: 78 tests)
ok github.com/novox/mesh-controller/internal/inventory 23s (shard 3 of 4: 78 tests)
ok github.com/novox/mesh-controller/internal/inventory 23s (shard 4 of 4: 77 tests)
ok github.com/novox/mesh-controller/internal/builder 25s (shard 1 of 4: 54 tests)
ok github.com/novox/mesh-controller/internal/builder 25s (shard 2 of 4: 53 tests)
ok github.com/novox/mesh-controller/internal/builder 31s (shard 3 of 4: 53 tests)
ok github.com/novox/mesh-controller/internal/builder 26s (shard 4 of 4: 53 tests)
ok github.com/novox/mesh-controller/internal/link 23s (shard 1 of 4: 50 tests)
ok github.com/novox/mesh-controller/internal/link 18s (shard 2 of 4: 49 tests)
ok github.com/novox/mesh-controller/internal/link 20s (shard 3 of 4: 49 tests)
ok github.com/novox/mesh-controller/internal/link 27s (shard 4 of 4: 49 tests)
integration level (the whole suite, tag integration): 3326 tests (6 skipped outside the shards), 205 s
nested module modules/build-agent:
ok build-agent 1.013s
nested module modules/route-proxy:
ok route-proxy/cmd/route-provider 1.011s
nested modules: 3 s
store tests, each run against the store:
./cmd/mesh-controller --- PASS: TestAStopWithoutAMergeWalksTheOthersAgain (0.60s)
./cmd/mesh-controller --- PASS: TestAStopWithoutAMergeEndsTheMergesThatContainIt (0.45s)
./cmd/mesh-controller --- PASS: TestAStopWalksTheOthersAgainInTheOpenBatch (0.40s)
./cmd/mesh-controller --- PASS: TestAStopNamesWhatStaysOnTheMachinesAndWhatStillCarriesIt (0.45s)
./cmd/mesh-controller --- PASS: TestAStopWithoutAMergeLeavesItOutOfABatch (0.38s)
./cmd/mesh-controller --- PASS: TestSavingPlansAndMovingMergesIsOneAct (0.30s)
./cmd/mesh-controller --- PASS: TestAPlanFollowedFromTheStoreAnswersWhenItMoves (2.19s)
./cmd/mesh-controller --- PASS: TestIssue969TheGateRaisesEachMachineAsItsEngineStatedItself (0.99s)
./cmd/mesh-controller --- PASS: TestNodeShowAndStatusReadTheLastSendFromTheStore (0.42s)
./cmd/mesh-controller --- PASS: TestTheConditionsVerbReadsTheLooksTheBucketNoLongerHolds (0.19s)
./cmd/mesh-controller --- PASS: TestAWalkLetGoAndStoppedByVerbsIsSaidStartedAndEnded (0.30s)
./cmd/mesh-controller --- PASS: TestAWalkStoppedOrClosedByAPersonIsSaidEndedStopped (0.31s)
./cmd/mesh-controller --- PASS: TestAWalkRetriedByAPersonIsSaidStartedAgain (0.25s)
./cmd/mesh-controller --- PASS: TestABacklogReleasedByAPersonIsSaidStarted (0.25s)
./cmd/mesh-controller --- PASS: TestAWalkEndedByCancelOrClearIsSaidEnded (0.31s)
./cmd/mesh-controller --- PASS: TestAWalkRestartedByARebuildIsSaidStarted (0.27s)
./cmd/mesh-controller --- PASS: TestAWalkStoppedByHandAndRetriedEndsFailedWhenItFailsAgain (0.31s)
./cmd/mesh-controller --- PASS: TestReplay237 (0.30s)
./cmd/mesh-controller --- PASS: TestAnUnassignThatLeavesItsNodeUnresolvedSaysSoOnceInItsAnswer (0.30s)
./cmd/mesh-controller --- PASS: TestAnUnassignThatLeavesItsNodeResolvedSaysNothingOfIt (0.35s)
./cmd/mesh-controller --- PASS: TestAnAssignThatLeavesItsNodeUnresolvedSaysOnlyThePlansRefusal (0.32s)
./cmd/mesh-controller --- PASS: TestADirectoryOwnersKeyIsRefusedThroughAVerb (0.38s)
./cmd/mesh-controller --- PASS: TestTheSendMakesNoValueForAnOutsideSecretNobodyGave (0.60s)
./cmd/mesh-controller --- PASS: TestAQuestionComposesWithoutAnOutsideSecretNobodyGave (0.69s)
./cmd/mesh-controller --- PASS: TestReplay201 (0.36s)
./cmd/mesh-controller --- PASS: TestARollbackWhoseSendWasRefusedIsCompletedByTheNextSend (0.76s)
./cmd/mesh-controller --- PASS: TestAGateJudgesTheOtherMovesBesideAKeptCore (0.49s)
./cmd/mesh-controller --- PASS: TestReplay401 (0.40s)
./cmd/mesh-controller --- PASS: TestReplay201ThePlansSend (0.29s)
./cmd/mesh-controller --- PASS: TestPlanAndNodeListAnOptionalRequirementLeftUnbound (0.43s)
./cmd/mesh-controller --- PASS: TestReplay340 (0.30s)
./cmd/mesh-controller --- PASS: TestOnlyATrustedFilesNamedKeyIsRefusedThroughAVerb (0.30s)
./cmd/mesh-controller --- PASS: TestReplay349 (0.30s)
./cmd/mesh-controller --- PASS: TestReplay348AFaultFromBeforeTheSendFailsNoGate (0.20s)
./cmd/mesh-controller --- PASS: TestReplay239AModuleNameIsNotTakenOverByAnotherRepository (0.21s)
./cmd/mesh-controller --- PASS: TestAWalkThatMovedNothingSaysWhichModulesMatchedWhatRuns (0.34s)
./cmd/mesh-controller --- PASS: TestAWalkWhoseEveryBuildCameOutTheSameIsDone (0.30s)
./cmd/mesh-controller --- PASS: TestReplay614ANewSDKPlansTheToolchainAndThenItsBundles (0.10s)
./cmd/mesh-controller --- PASS: TestOneAcceptForAProviderIsPlacedForEveryConsumer (0.85s)
./cmd/mesh-controller --- PASS: TestReplay164 (0.36s)
./cmd/mesh-controller --- PASS: TestAnApprovedLayerOpensTheWalkThatSendsIt (0.28s)
./cmd/mesh-controller --- PASS: TestASettingsWalkSendsOneMachineAtATimeEachJudged (0.29s)
./cmd/mesh-controller --- PASS: TestAFailedSettingsWalkStopsAndHoldsNothingBack (0.27s)
./cmd/mesh-controller --- PASS: TestASettingsWalkSendsTheLayerAloneEveryBuildKept (0.36s)
./cmd/mesh-controller --- PASS: TestASettingsWalkStopsBeforeADataMoveAndPassesOverAMachineAway (0.86s)
./cmd/mesh-controller --- PASS: TestACrossingSendSupersedesASettingsGate (0.31s)
./cmd/mesh-controller --- PASS: TestASettingsWalkFailsOnARefusalThatCannotClear (0.23s)
./cmd/mesh-controller --- PASS: TestAProviderElsewhereServesItsOwnComposedName (0.35s)
./cmd/mesh-controller --- PASS: TestAReusedCheckBuildIsRegisteredByItsDigestAndGatedAsABuiltOne (0.69s)
./cmd/mesh-controller --- PASS: TestTheMergeGateJudgesEachManifestAgainstTheListOfTheTree (6.00s)
./cmd/mesh-controller --- PASS: TestRegistrationPublishesTheNewestTrunkListAndJudgesEveryModuleAgainstIt (0.22s)
./cmd/mesh-controller --- PASS: TestADeclarationIsTheSameAfterPlacementMoves (0.71s)
./cmd/mesh-controller --- PASS: TestAReleaseSendsTheRestAtOnceAfterTheFirstPasses (0.36s)
./cmd/mesh-controller --- PASS: TestARestMachineThatFailsIsPutBackAloneAndTheOthersAreJudgedOn (0.30s)
./cmd/mesh-controller --- PASS: TestAWalkTakesOverTheReadingsOfAGateJudgingTheSameBuildThere (0.25s)
./cmd/mesh-controller --- PASS: TestAFirstSendMadeAndNotKeptIsNotSentAgain (0.32s)
./cmd/mesh-controller --- PASS: TestAReleaseSendKeptAndMadeIsNotMadeAgain (0.33s)
./cmd/mesh-controller --- PASS: TestAFirstMachineThatFailsStillStopsTheWalk (0.26s)
./cmd/mesh-controller --- PASS: TestTheControlNodeIsSentLastInAStep (0.31s)
./cmd/mesh-controller --- PASS: TestARestMachineSilentPastItsBoundIsLeftAndSaid (0.29s)
./cmd/mesh-controller --- PASS: TestANoMoveTierWaitsForNoNewReport (0.37s)
./cmd/mesh-controller --- PASS: TestOneProviderDownAndThreeConsumersFailingAreOneCondition (0.22s)
./cmd/mesh-controller --- PASS: TestAConsumerFailingBesideAHealthyProviderIsItsOwn (0.18s)
./cmd/mesh-controller --- PASS: TestTheProvisionerClientsAccountIsIssuedForItsServiceAndNeverInvented (0.27s)
./cmd/mesh-controller --- PASS: TestAcceptOfAnOwnSecretTakesThePathOfItsModulesForm (0.38s)
./cmd/mesh-controller --- PASS: TestAcceptForAProviderTakesThePathOfTheProvidersModule (0.35s)
./cmd/mesh-controller --- PASS: TestAcceptForAMovedTrustedModuleAnnouncesBeforeTheVaultIsAsked (0.36s)
./cmd/mesh-controller --- PASS: TestAcceptForAMovedModuleRecordsAHandActAndNeverTheValue (0.27s)
./cmd/mesh-controller --- PASS: TestAcceptOfAnOutsideOfferTakesThePathOfTheProvidersModule (0.39s)
./cmd/mesh-controller --- PASS: TestAnAskAtTheDeskTakesThePathOfItsModulesForm (0.34s)
./cmd/mesh-controller --- PASS: TestAnIssuedValueTakesThePathOfItsProvidersModule (0.39s)
./cmd/mesh-controller --- PASS: TestARotationTakesThePathOfItsModulesForm (0.32s)
./cmd/mesh-controller --- PASS: TestADeclarationIsTheSameWhileTheWordsAreStillInTheLayers (2.85s)
./cmd/mesh-controller --- PASS: TestADeclarationIsTheSameAfterTheMoveOfPlacement (4.53s)
./cmd/mesh-controller --- PASS: TestTheSendSealsNoSecretOfAModuleHandedThere (0.41s)
./cmd/mesh-controller --- PASS: TestAModulesSecretsAreTheVaultsOnceItIsMarkedMoved (0.35s)
./cmd/mesh-controller --- PASS: TestEveryMachineIsToldTheSameAfterTheMoveOfConfig (30.19s)
./cmd/mesh-controller --- PASS: TestTheMoveOfConfigRefusesWhatWouldChangeAMachine (9.96s)
./cmd/mesh-controller --- PASS: TestTheSettingsVerbForwardsToConfigOnceTheValuesMoved (11.58s)
./cmd/mesh-controller --- PASS: TestTheSendCarriesTheVaultsBoxForACoreCredentialAndKeepsIt (0.53s)
./cmd/mesh-controller --- PASS: TestASilentVaultHoldsTheKeptBoxAndSaysSo (0.52s)
./cmd/mesh-controller --- PASS: TestACoreModuleFirstPlacedWhileTheVaultIsSilentIsSealedByTheController (0.79s)
./cmd/mesh-controller --- PASS: TestAnEngineBelowTheContractIsSentTheControllersSealAsBefore (0.84s)
./cmd/mesh-controller --- PASS: TestModuleIssueHandsACoveredAccountToTheVaultAndOnlyThat (0.36s)
./cmd/mesh-controller --- PASS: TestModuleIssueFailsWhenTheVaultDoesNotTakeACoveredAccount (0.34s)
./cmd/mesh-controller --- PASS: TestModuleIssueBeforeTheVaultIsInstalledKeepsTheValueAndHandsNothing (0.34s)
./cmd/mesh-controller --- PASS: TestARecordedModulesBundleOnlyMoveRollsOutInItsWalk (0.41s)
./cmd/mesh-controller --- PASS: TestARecordedModulesMoveThatRecreatesAContainerWaits (0.81s)
./cmd/mesh-controller --- PASS: TestARecordedModulesMoveThatTouchesDataOrAProviderWaits (0.83s)
./cmd/mesh-controller --- PASS: TestAPersonsRecordAndTheBusHoldEveryMove (0.56s)
./cmd/mesh-controller --- PASS: TestARecordedMoveThatCannotBeJudgedWaits (0.42s)
./cmd/mesh-controller --- PASS: TestReplay867 (4.65s)
./cmd/mesh-controller --- PASS: TestReplay867Recheck (5.34s)
./cmd/mesh-controller --- PASS: TestTheRecheckVerbAsksMeshDeliveryOnABusOfItsOwn (0.44s)
./cmd/mesh-controller --- PASS: TestAssigningTheClientIssuesItsAccount (0.23s)
./cmd/mesh-controller --- PASS: TestAnUnrelatedBatchWalksBesideAnOpenWalk (0.32s)
./cmd/mesh-controller --- PASS: TestARelatedBatchWaitsBehindTheOpenWalk (0.23s)
./cmd/mesh-controller --- PASS: TestAnOwnPathBatchNeverWalksBeside (0.23s)
./cmd/mesh-controller --- PASS: TestMergesHeardWhileAnotherHolderHasThePlansAreRecordedAndCarried (7.46s)
./cmd/mesh-controller --- PASS: TestABatchWindowClosesByTheExpiryOfItsKey (1.72s)
./cmd/mesh-controller --- PASS: TestEveryMoveAMergeAndTheCutMakeOfAPlanIsSaid (0.35s)
./cmd/mesh-controller --- PASS: TestARolloutAdvancesOnEventsAndAReplacedControllerResumesIt (3.77s)
./cmd/mesh-controller --- PASS: TestAWalkLetGoByTheDeliverVerbIsAskedWithNoOtherEvent (1.01s)
./cmd/mesh-controller --- PASS: TestTwoMergesWithinAMinuteLeaveEachOpenPullRequestOneQueuedCheck (1.22s)
./cmd/mesh-controller --- PASS: TestADeliveryGroupMovingAModuleMachinesRunPassesTheGate (7.35s)
./cmd/mesh-controller --- PASS: TestAModuleMovesOnTheOperatorsApproveOfTheMergeThatMovedIt (1.30s)
./cmd/mesh-controller --- PASS: TestAModuleBuiltFromANewRepositoryIsRegisteredOnlyOnTheOperatorsApproveOnTheBus (0.82s)
./internal/inventory --- PASS: TestTheLastSendSaysWhatTheMachineAnswered (0.08s)
./internal/inventory --- PASS: TestAReportIsTheLastSendsAnswerOnlyWhenItIsAboutThatSend (0.14s)
./internal/inventory --- PASS: TestAnIssuedValueIsSealedToEveryHolderOnceAndNotAgain (0.10s)
./internal/inventory --- PASS: TestAnIssuedValueIsSealedAgainAfterAKeyChangeOrAnAcceptance (0.09s)
./internal/inventory --- PASS: TestAConditionsLooksAreKeptBesideTheBucket (0.07s)
./internal/inventory --- PASS: TestAPlanIdHoldingAQuoteIsReadAsAPlainId (0.07s)
./internal/inventory --- PASS: TestAWalksStartIsKeptAndARefusedSaveLeavesItUnsaid (0.15s)
./internal/inventory --- PASS: TestAWalksRestIsReadFromEachMachinesOwnSend (0.13s)
./internal/inventory --- PASS: TestAStoredBuildWithASilentMergeableFileIsStillReadAndComposed (0.13s)
./internal/inventory --- PASS: TestACredentialIssuedOutsideIsNeverMade (0.08s)
./internal/inventory --- PASS: TestOneAcceptForAProviderIsSealedToEveryConsumer (0.09s)
./internal/inventory --- PASS: TestASharedOwnSecretIssuedOutsideIsNeverMade (0.08s)
./internal/inventory --- PASS: TestAModuleInTheConfigFormIsMirroredWithItsWholeDeclaration (0.10s)
./internal/inventory --- PASS: TestAReportOfABusyContainerIsKeptAndReadBack (0.08s)
./internal/inventory --- PASS: TestANewerBuildsListReplacesTheKeptOneAndAnOlderOneHeardLaterDoesNot (0.08s)
./internal/inventory --- PASS: TestPlacementMovesOutOfTheSettingsLayers (0.38s)
./internal/inventory --- PASS: TestASettingRoutesPlacementBesideTheLayer (0.10s)
./internal/inventory --- PASS: TestTheProvisionerClientsMachineHasAnAccountOfItsOwn (0.11s)
./internal/inventory --- PASS: TestTheFourWordsAreKeptBesideTheLayer (0.11s)
./internal/inventory --- PASS: TestALayerStillHoldingTheWordsReadsThemAsPlacement (0.09s)
./internal/inventory --- PASS: TestTheMoveOfPlacementMovesWhatTheLayersStillHold (0.09s)
./internal/inventory --- PASS: TestTheMoveReadsEveryRowSealedToAMachineAsItIs (0.09s)
./internal/inventory --- PASS: TestASendKeepsThePlansItHandedAndTheMirrorCarriesThem (0.14s)
./internal/inventory --- PASS: TestTheLayersAreReadUntilTheMoveOfConfigHasRun (0.10s)
./internal/inventory --- PASS: TestAModuleReadsMeshConfigOnlyWhereItsValuesAre (0.10s)
./internal/inventory --- PASS: TestTheEndOfTheMoveRefusesALayerChangedSinceItWasRead (0.09s)
./internal/inventory --- PASS: TestACoreCredentialsVaultBoxIsKeptPerMachineAndReplaced (0.07s)
./internal/inventory --- PASS: TestWhatRunsIsTheRegisteredBuildNotANewerOnePutBack (0.09s)
./internal/recordmirror --- PASS: TestNatsAnAssignmentAndARegistrationEachChangeOneKeyAndRaiseOneEvent (3.59s)
./internal/recordmirror --- PASS: TestNatsTheListOfPredefinedKeysKeptChangesTheMirrorsOneKey (1.51s)
the suite failed: each package or shard that failed is said above with its output
--- what failed, picked from the whole of its output (the whole is in the build's log)
--- FAIL: TestADeliveryThatMovesABackedUpModuleWaitsForItsBackupAndAFailedOneHoldsItAndIsSaid (0.36s)
backups_before_send_integration_test.go:103: this manifest cannot be used:
- notes's data: files's path "/srv/notes" is not one of the module's directories or accesses: ${dir:<id>} or ${access:<id>}, or a path beneath one (a definition names no machine path, novox/hq ADR 0112)
FAIL github.com/novox/mesh-controller/cmd/mesh-controller 49s (shard 8 of 8: 138 tests)
```
mesh/delivery stopped: Operator's word (2026-10-18 00:09): split the group. After mesh-catalog #353 merged on the group's Approve (23:48:51), #375's merg…
mesh-delivery: the operator's Approve of this pull request's merge into main is ended: its head 91a7c1eaff is no longer the pull request's head, or the pull request closed. Nothing is merged on it. The operator is asked again once the checks pass at the new head.
mesh-delivery: the operator's Approve of this pull request's merge into main is ended: its head 91a7c1eaffd2 is no longer the pull request's head, or the pull request closed. Nothing is merged on it. The operator is asked again once the checks pass at the new head.
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.
Design 47 milestone 4 (issue 980, ADR 0404), one delivery group with mesh-catalog's
feat/backup-before-send.node-backup.nowon every machine running each moved module that has an item protected by a backup, and readsbacked-up's last night. The holders ofnode-backupare derived asseatsderives them (every machine's claim), and a failed read is tried again, never read as no holder. Nothing is asked of a builder or sent until every backup is done. A machine with no backup holder is said in the plan. A plan moving no backed-up item is unchanged. The plan record gainsbackups{state, asked:[{machine, module, state, asked_at, tried_at, words}], no_holder}, kept in the store by migration 0103 (release_plan.backups jsonb).backup-held). The new verbdelivery-backups-again{plan, why} asks the failed backups again; mesh-delivery'sreleasecalls it.backups_before_send_integration_test.goproves acceptance test 3 on the controller side; it runs here in the merge check. Its earlier checks found: the fixture's machine data path (ADR 0112); holders read from a table keeping one node-seat holder (08e000bb); and the plan's backups record never kept by the store, so a plan would have asked forever and never sent (91a7c1ea, migration 0103).Reviewed-by: review@shanks at
91a7c1eaffDelivery
novox/mesh-controller@91a7c1eaffd2— stopped since 2026-10-17T22:08:04ZDelivery plan — builds build-agent, mesh-controller, route-proxy → ace, g14, novox, shanks; no bus step
Group
feat/backup-before-send: novox/mesh-catalog@4d03755c65, novox/mesh-controller@91a7c1eaffTransitions
The commit's note under
refs/notes/mesh-plankeeps every transition:git log --notes=mesh-plan.Merge check at
a39d6ce7Judged: head
a39d6ce78d19merged into trunk7c9c187ca6e2; read beside it: mesh-catalogf076cadecedc, mesh-controller-main7c9c187ca6e2, mesh-host6469e8238443, mesh-tools7412c5b6c9c5mesh/merge-gate: PASS — every machine composes with the change as it did without (4 of 4 compose) (modules: build-agent, mesh-controller, route-proxy)mesh/repo-check: FAIL — its merge-check.sh failed: --- FAIL: TestADeliveryThatMovesABackedUpModuleWaitsForItsBackupAndAFailedOneHoldsItAndIsSaid (0.36s)Delivery plan — builds build-agent, mesh-controller, route-proxy → ace, g14, novox, shanks; no bus step
Run by the build seat on ace as
build-1792270511747331245(builds --log build-1792270511747331245).mesh-delivery: the operator's Approve of this pull request's merge into main is ended: its head
91a7c1eaffis no longer the pull request's head, or the pull request closed. Nothing is merged on it. The operator is asked again once the checks pass at the new head.Pull request closed