Measured with go test -race -json ./... against a throwaway PostgreSQL 18 on a 24-core machine (fsync on). The before and after are the same machine and the same load.
package
before
after
cmd/mesh-controller
172.8 s
106.4 s
internal/inventory
59.3 s
18.9 s
internal/link
58.1 s
49.2 s
internal/builder
31.6 s
32.3 s (unchanged)
whole go test ./...
175 s
108 s
sh merge-check.sh with the store
191 s
116 s
sh merge-check.sh without a store
51 s
50 s
Where the time went, and what changed
Every store test migrated a fresh database (~90 migrations, about 110 ms each, more under load; 278 store tests in cmd/mesh-controller and 223 in internal/inventory). store.CreateMigratedForTest now migrates a template once for each set of migrations, through Migrate itself, and copies each test's database from it. The template is named after a digest of the migrations, built under an advisory lock so packages tested at once share it, and marked a template only once it is whole. Each ForTest (inventory, licences, identity) still runs Migrate on its copy, which finds nothing pending only if the copy's record matches every migration. ForTest went from ~110 ms to ~35 ms.
bcrypt at the default cost under the race detector took ~0.7 s for each bus password. inventory.ForTest sets the cost to bcrypt.MinCost, which is still a real bcrypt hash checked by the same comparison. A new test holds the production cost at bcrypt.DefaultCost.
link.ReadBuildEvents waited out its 2 s fetch on every read when fewer than 500 events were there, so every queue, cancel, clear and kill took 2 s or more. This is a production change: it now reads the number of events the consumer holds and stops once they are read. TestCancelRefusesAnAskInFlight proves that events are still read.
A race-built binary sleeps 1 s before it exits (GORACE atexit_sleep_ms), and many cmd tests run the test binary as a verb's command line. TestMain sets atexit_sleep_ms=0 for the children when GORACE is unset. The children still run under the race detector and still fail on a race they find.
TestTwoControllersOneActs waited out the production lease intervals. The actor now takes renewEvery/poll (zero means the lease's defaults), and the test uses 1 s and 100 ms. The test went from 8.2 s to 2.1 s.
TestAPlanFollowedFromTheStoreAnswersWhenItMoves waited out a 1 s re-read and a 2 s bound. planWaitEvery is now a variable and the test sets it to 50 ms. It keeps the 1.5 s before the plan moves, and its bound is now 300 ms. Parsing a bound given as a bare number of seconds is still covered by TestAWaitIsRefusedWhatItCannotDo's planWaitAsked("tier", "12").
Self-review
No test was removed or skipped, and no test was made parallel: ForTest uses t.Setenv, and the cmd tests share globals.
The lease test checks the order of events (B waits while A holds it, takes it on handover at a higher epoch, and is told at once when it loses it), and that order does not depend on the interval. B still looks 15 times while A holds the lease.
Template copies carry whatever the migrations seeded with now() at the time the template was built, not the time of the test. No test depends on that: the whole suite passed 3 times in a row under -race -count=3 ./... with every package running at once.
No test is order-dependent. The template is per process and per digest, and the lease and plan-wait overrides are restored by t.Cleanup. The bcrypt cost is set by every inventory.ForTest call, so it does not depend on which test ran first. Only the new cost test reads it unset, and that test restores it.
Seen but not changed
TestNatsWorkSlowerThanTheWindowIsNotHandedOverAgain (9 s) passes with go stillWorking removed, so it does not prove its fault. I think the controller re-ensures its CONTROL consumer at 30 s over the test's 2 s window. Left as it is.
internal/conditionsTestBorrowedWordsAreLogged fails between 23:30 and 23:39 local time, because the log's timestamp contains 23:3. This is unrelated to this change.
Issue 560: the bcrypt change cuts the work before the 2 s token is used (the test went from 4.4 s to 2.3 s), so it fails less often, but the test still runs on the real clock and is not fixed by this change.
Fixes novox/hq issue 591 (the controller's repository check takes 6-8 minutes).
Measured with `go test -race -json ./...` against a throwaway PostgreSQL 18 on a 24-core machine (fsync on). The before and after are the same machine and the same load.
| package | before | after |
|---|---|---|
| cmd/mesh-controller | 172.8 s | 106.4 s |
| internal/inventory | 59.3 s | 18.9 s |
| internal/link | 58.1 s | 49.2 s |
| internal/builder | 31.6 s | 32.3 s (unchanged) |
| whole `go test ./...` | 175 s | 108 s |
| `sh merge-check.sh` with the store | 191 s | 116 s |
| `sh merge-check.sh` without a store | 51 s | 50 s |
## Where the time went, and what changed
1. **Every store test migrated a fresh database** (~90 migrations, about 110 ms each, more under load; 278 store tests in cmd/mesh-controller and 223 in internal/inventory). `store.CreateMigratedForTest` now migrates a template once for each set of migrations, through `Migrate` itself, and copies each test's database from it. The template is named after a digest of the migrations, built under an advisory lock so packages tested at once share it, and marked a template only once it is whole. Each `ForTest` (inventory, licences, identity) still runs `Migrate` on its copy, which finds nothing pending only if the copy's record matches every migration. ForTest went from ~110 ms to ~35 ms.
2. **bcrypt at the default cost under the race detector** took ~0.7 s for each bus password. `inventory.ForTest` sets the cost to `bcrypt.MinCost`, which is still a real bcrypt hash checked by the same comparison. A new test holds the production cost at `bcrypt.DefaultCost`.
3. **`link.ReadBuildEvents` waited out its 2 s fetch on every read** when fewer than 500 events were there, so every `queue`, `cancel`, `clear` and `kill` took 2 s or more. This is a production change: it now reads the number of events the consumer holds and stops once they are read. `TestCancelRefusesAnAskInFlight` proves that events are still read.
4. **A race-built binary sleeps 1 s before it exits** (GORACE `atexit_sleep_ms`), and many cmd tests run the test binary as a verb's command line. TestMain sets `atexit_sleep_ms=0` for the children when GORACE is unset. The children still run under the race detector and still fail on a race they find.
5. **TestTwoControllersOneActs** waited out the production lease intervals. The actor now takes `renewEvery`/`poll` (zero means the lease's defaults), and the test uses 1 s and 100 ms. The test went from 8.2 s to 2.1 s.
6. **TestAPlanFollowedFromTheStoreAnswersWhenItMoves** waited out a 1 s re-read and a 2 s bound. `planWaitEvery` is now a variable and the test sets it to 50 ms. It keeps the 1.5 s before the plan moves, and its bound is now 300 ms. Parsing a bound given as a bare number of seconds is still covered by `TestAWaitIsRefusedWhatItCannotDo`'s `planWaitAsked("tier", "12")`.
## Self-review
- No test was removed or skipped, and no test was made parallel: `ForTest` uses `t.Setenv`, and the cmd tests share globals.
- The lease test checks the order of events (B waits while A holds it, takes it on handover at a higher epoch, and is told at once when it loses it), and that order does not depend on the interval. B still looks 15 times while A holds the lease.
- Template copies carry whatever the migrations seeded with `now()` at the time the template was built, not the time of the test. No test depends on that: the whole suite passed 3 times in a row under `-race -count=3 ./...` with every package running at once.
- No test is order-dependent. The template is per process and per digest, and the lease and plan-wait overrides are restored by `t.Cleanup`. The bcrypt cost is set by every `inventory.ForTest` call, so it does not depend on which test ran first. Only the new cost test reads it unset, and that test restores it.
## Seen but not changed
- `TestNatsWorkSlowerThanTheWindowIsNotHandedOverAgain` (9 s) passes with `go stillWorking` removed, so it does not prove its fault. I think the controller re-ensures its CONTROL consumer at 30 s over the test's 2 s window. Left as it is.
- `internal/conditions` `TestBorrowedWordsAreLogged` fails between 23:30 and 23:39 local time, because the log's timestamp contains `23:3`. This is unrelated to this change.
- Issue 560: the bcrypt change cuts the work before the 2 s token is used (the test went from 4.4 s to 2.3 s), so it fails less often, but the test still runs on the real clock and is not fixed by this change.
Running ~90 migrations into a fresh database per store test, and bcrypt at
the default cost under the race detector, were most of the controller's
check (novox/hq issue 591).
Reading the build events waited two seconds on every queue read, the race
detector's exit sleep cost a second per command line a test runs, and the
lease and plan-wait tests waited out production intervals (novox/hq issue 591).
build-agent keeps data (ADR 0233): what it holds is backed up before it moves
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
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, route-proxy is judged on its first machine
Machines
mesh-controller on novox: passed — healthy 3 times over 4m10s
mesh-controller on the rest running it: sent
build-agent on ace: passed — healthy 1 times over 23s
build-agent on the rest running it: sent
route-proxy on ace: passed — healthy 1 times over 25s
route-proxy on the rest running it: sent
Transitions
2026-10-12 22:09 (new) → proposed (announced): novox/mesh-controller#279's head announced
2026-10-12 22:21 proposed → checked (checked): a verdict names this commit and the trunk's head as its trunk commit
2026-10-12 22:21 checked → ready (accepted): the gate passed or warned, and the repository's own check did not fail
2026-10-12 22:22 ready → published (merged): on the trunk its modules follow: merged there, and its walk opened — or nothing for a walk to move
2026-10-12 22:22 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-12 22:33 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@7f3ff3236149` — **delivered** since 2026-10-12T22:33:11Z
**Delivery plan** — builds build-agent, mesh-controller, route-proxy → ace, g14, novox, shanks; no bus step
- tier 0: mesh-controller
- tier 1: build-agent
- tier 2: route-proxy
- ace: receives build-agent, route-proxy
- g14: receives build-agent
- novox: receives mesh-controller, build-agent, route-proxy
- shanks: receives build-agent
- build-agent keeps data (ADR 0233): what it holds is backed up before it moves
- 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
- 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, route-proxy is judged on its first machine
**Machines**
- mesh-controller on novox: passed — healthy 3 times over 4m10s
- mesh-controller on the rest running it: sent
- build-agent on ace: passed — healthy 1 times over 23s
- build-agent on the rest running it: sent
- route-proxy on ace: passed — healthy 1 times over 25s
- route-proxy on the rest running it: sent
**Transitions**
- 2026-10-12 22:09 (new) → proposed (announced): novox/mesh-controller#279's head announced
- 2026-10-12 22:21 proposed → checked (checked): a verdict names this commit and the trunk's head as its trunk commit
- 2026-10-12 22:21 checked → ready (accepted): the gate passed or warned, and the repository's own check did not fail
- 2026-10-12 22:22 ready → published (merged): on the trunk its modules follow: merged there, and its walk opened — or nothing for a walk to move
- 2026-10-12 22:22 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-12 22:33 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 2819915e
Judged: head 2819915e8e19 merged into trunk e63af0df17f5; read beside it: mesh-catalog 43a9155d5afe, mesh-controller-main e63af0df17f5, mesh-host 8e95c1d9ed2d, 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/lease_test.go, cmd/mesh-controller/plans_follow_test.go, cmd/mesh-controller/sayable_test.go, internal/inventory/bususers_test.go
Run by the build seat on shanks as build-1791842021912650621 (builds --log build-1791842021912650621).
--- 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-12T21:48:00Z 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-12T21:48:00Z
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/lease_test.go, cmd/mesh-controller/plans_follow_test.go, cmd/mesh-controller/sayable_test.go and internal/inventory/bususers_test.go read by no module's build, and rebuild nothing (issue 280)
--- its merge-check.sh (go toolchain)
ok github.com/novox/mesh-controller/cmd/mesh-builder 1.038s
ok github.com/novox/mesh-controller/cmd/mesh-controller 184.152s
ok github.com/novox/mesh-controller/examples/objectstore-provisioner 1.023s
ok github.com/novox/mesh-controller/examples/postgres-provisioner 1.055s
ok github.com/novox/mesh-controller/examples/redis-provisioner 1.034s
ok github.com/novox/mesh-controller/examples/route-proxy 1.212s
ok github.com/novox/mesh-controller/internal/artifacts 1.097s
? github.com/novox/mesh-controller/internal/beside [no test files]
ok github.com/novox/mesh-controller/internal/broker 4.589s
ok github.com/novox/mesh-controller/internal/builder 55.059s
ok github.com/novox/mesh-controller/internal/catalogue 8.657s
ok github.com/novox/mesh-controller/internal/conditions 2.664s
ok github.com/novox/mesh-controller/internal/envfile 1.065s
ok github.com/novox/mesh-controller/internal/facts 1.068s
ok github.com/novox/mesh-controller/internal/identity 5.186s
ok github.com/novox/mesh-controller/internal/inventory 38.840s
ok github.com/novox/mesh-controller/internal/lease 17.724s
ok github.com/novox/mesh-controller/internal/licences 4.343s
ok github.com/novox/mesh-controller/internal/licences/adapters 1.056s
ok github.com/novox/mesh-controller/internal/link 61.805s
ok github.com/novox/mesh-controller/internal/lint 2.471s
ok github.com/novox/mesh-controller/internal/outward 1.095s
ok github.com/novox/mesh-controller/internal/overlay 1.086s
ok github.com/novox/mesh-controller/internal/secrets 1.533s
ok github.com/novox/mesh-controller/internal/store 3.505s
ok github.com/novox/mesh-controller/internal/testbus 1.267s
ok github.com/novox/mesh-controller/internal/token 1.016s
store tests, each run against the store:
./cmd/mesh-controller --- PASS: TestAStopWithoutAMergeWalksTheOthersAgain (0.22s)
./cmd/mesh-controller --- PASS: TestAStopWithoutAMergeEndsTheMergesThatContainIt (0.23s)
./cmd/mesh-controller --- PASS: TestAStopWalksTheOthersAgainInTheOpenBatch (0.22s)
./cmd/mesh-controller --- PASS: TestAStopNamesWhatStaysOnTheMachinesAndWhatStillCarriesIt (0.21s)
./cmd/mesh-controller --- PASS: TestAStopWithoutAMergeLeavesItOutOfABatch (0.20s)
./cmd/mesh-controller --- PASS: TestSavingPlansAndMovingMergesIsOneAct (0.18s)
./cmd/mesh-controller --- PASS: TestAPlanFollowedFromTheStoreAnswersWhenItMoves (1.97s)
./cmd/mesh-controller --- PASS: TestNodeShowAndStatusReadTheLastSendFromTheStore (0.23s)
./cmd/mesh-controller --- PASS: TestTheConditionsVerbReadsTheLooksTheBucketNoLongerHolds (0.13s)
./cmd/mesh-controller --- PASS: TestAWalkLetGoAndStoppedByVerbsIsSaidStartedAndEnded (0.25s)
./cmd/mesh-controller --- PASS: TestAWalkStoppedOrClosedByAPersonIsSaidEndedStopped (0.25s)
./cmd/mesh-controller --- PASS: TestAWalkRetriedByAPersonIsSaidStartedAgain (0.21s)
./cmd/mesh-controller --- PASS: TestABacklogReleasedByAPersonIsSaidStarted (0.21s)
./cmd/mesh-controller --- PASS: TestAWalkEndedByCancelOrClearIsSaidEnded (0.27s)
./cmd/mesh-controller --- PASS: TestAWalkRestartedByARebuildIsSaidStarted (0.21s)
./cmd/mesh-controller --- PASS: TestAWalkStoppedByHandAndRetriedEndsFailedWhenItFailsAgain (0.25s)
./cmd/mesh-controller --- PASS: TestReplay237 (0.21s)
./cmd/mesh-controller --- PASS: TestAnUnassignThatLeavesItsNodeUnresolvedSaysSoOnceInItsAnswer (0.20s)
./cmd/mesh-controller --- PASS: TestAnUnassignThatLeavesItsNodeResolvedSaysNothingOfIt (0.20s)
./cmd/mesh-controller --- PASS: TestAnAssignThatLeavesItsNodeUnresolvedSaysOnlyThePlansRefusal (0.20s)
./cmd/mesh-controller --- PASS: TestADirectoryOwnersKeyIsRefusedThroughAVerb (0.23s)
./cmd/mesh-controller --- PASS: TestTheSendMakesNoValueForAnOutsideSecretNobodyGave (0.28s)
./cmd/mesh-controller --- PASS: TestAQuestionComposesWithoutAnOutsideSecretNobodyGave (0.29s)
./cmd/mesh-controller --- PASS: TestReplay201 (0.16s)
./cmd/mesh-controller --- PASS: TestARollbackWhoseSendWasRefusedIsCompletedByTheNextSend (0.16s)
./cmd/mesh-controller --- PASS: TestAGateJudgesTheOtherMovesBesideAKeptCore (0.16s)
./cmd/mesh-controller --- PASS: TestReplay401 (0.29s)
./cmd/mesh-controller --- PASS: TestReplay201ThePlansSend (0.23s)
./internal/inventory --- PASS: TestTheLastSendSaysWhatTheMachineAnswered (0.08s)
./internal/inventory --- PASS: TestAReportIsTheLastSendsAnswerOnlyWhenItIsAboutThatSend (0.09s)
./internal/inventory --- PASS: TestAnIssuedValueIsSealedToEveryHolderOnceAndNotAgain (0.10s)
./internal/inventory --- PASS: TestAnIssuedValueIsSealedAgainAfterAKeyChangeOrAnAcceptance (0.08s)
./internal/inventory --- PASS: TestAConditionsLooksAreKeptBesideTheBucket (0.07s)
./internal/inventory --- PASS: TestAPlanIdHoldingAQuoteIsReadAsAPlainId (0.07s)
./internal/inventory --- PASS: TestAWalksStartIsKeptAndARefusedSaveLeavesItUnsaid (0.07s)
./internal/inventory --- PASS: TestAWalksRestIsReadFromEachMachinesOwnSend (0.07s)
**Merge check** at `2819915e`
Judged: head `2819915e8e19` merged into trunk `e63af0df17f5`; read beside it: mesh-catalog `43a9155d5afe`, mesh-controller-main `e63af0df17f5`, mesh-host `8e95c1d9ed2d`, 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/lease_test.go, cmd/mesh-controller/plans_follow_test.go, cmd/mesh-controller/sayable_test.go, internal/inventory/bususers_test.go
Run by the build seat on shanks as `build-1791842021912650621` (`builds --log build-1791842021912650621`).
```
--- 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-12T21:48:00Z 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-12T21:48:00Z
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/lease_test.go, cmd/mesh-controller/plans_follow_test.go, cmd/mesh-controller/sayable_test.go and internal/inventory/bususers_test.go read by no module's build, and rebuild nothing (issue 280)
--- its merge-check.sh (go toolchain)
ok github.com/novox/mesh-controller/cmd/mesh-builder 1.038s
ok github.com/novox/mesh-controller/cmd/mesh-controller 184.152s
ok github.com/novox/mesh-controller/examples/objectstore-provisioner 1.023s
ok github.com/novox/mesh-controller/examples/postgres-provisioner 1.055s
ok github.com/novox/mesh-controller/examples/redis-provisioner 1.034s
ok github.com/novox/mesh-controller/examples/route-proxy 1.212s
ok github.com/novox/mesh-controller/internal/artifacts 1.097s
? github.com/novox/mesh-controller/internal/beside [no test files]
ok github.com/novox/mesh-controller/internal/broker 4.589s
ok github.com/novox/mesh-controller/internal/builder 55.059s
ok github.com/novox/mesh-controller/internal/catalogue 8.657s
ok github.com/novox/mesh-controller/internal/conditions 2.664s
ok github.com/novox/mesh-controller/internal/envfile 1.065s
ok github.com/novox/mesh-controller/internal/facts 1.068s
ok github.com/novox/mesh-controller/internal/identity 5.186s
ok github.com/novox/mesh-controller/internal/inventory 38.840s
ok github.com/novox/mesh-controller/internal/lease 17.724s
ok github.com/novox/mesh-controller/internal/licences 4.343s
ok github.com/novox/mesh-controller/internal/licences/adapters 1.056s
ok github.com/novox/mesh-controller/internal/link 61.805s
ok github.com/novox/mesh-controller/internal/lint 2.471s
ok github.com/novox/mesh-controller/internal/outward 1.095s
ok github.com/novox/mesh-controller/internal/overlay 1.086s
ok github.com/novox/mesh-controller/internal/secrets 1.533s
ok github.com/novox/mesh-controller/internal/store 3.505s
ok github.com/novox/mesh-controller/internal/testbus 1.267s
ok github.com/novox/mesh-controller/internal/token 1.016s
store tests, each run against the store:
./cmd/mesh-controller --- PASS: TestAStopWithoutAMergeWalksTheOthersAgain (0.22s)
./cmd/mesh-controller --- PASS: TestAStopWithoutAMergeEndsTheMergesThatContainIt (0.23s)
./cmd/mesh-controller --- PASS: TestAStopWalksTheOthersAgainInTheOpenBatch (0.22s)
./cmd/mesh-controller --- PASS: TestAStopNamesWhatStaysOnTheMachinesAndWhatStillCarriesIt (0.21s)
./cmd/mesh-controller --- PASS: TestAStopWithoutAMergeLeavesItOutOfABatch (0.20s)
./cmd/mesh-controller --- PASS: TestSavingPlansAndMovingMergesIsOneAct (0.18s)
./cmd/mesh-controller --- PASS: TestAPlanFollowedFromTheStoreAnswersWhenItMoves (1.97s)
./cmd/mesh-controller --- PASS: TestNodeShowAndStatusReadTheLastSendFromTheStore (0.23s)
./cmd/mesh-controller --- PASS: TestTheConditionsVerbReadsTheLooksTheBucketNoLongerHolds (0.13s)
./cmd/mesh-controller --- PASS: TestAWalkLetGoAndStoppedByVerbsIsSaidStartedAndEnded (0.25s)
./cmd/mesh-controller --- PASS: TestAWalkStoppedOrClosedByAPersonIsSaidEndedStopped (0.25s)
./cmd/mesh-controller --- PASS: TestAWalkRetriedByAPersonIsSaidStartedAgain (0.21s)
./cmd/mesh-controller --- PASS: TestABacklogReleasedByAPersonIsSaidStarted (0.21s)
./cmd/mesh-controller --- PASS: TestAWalkEndedByCancelOrClearIsSaidEnded (0.27s)
./cmd/mesh-controller --- PASS: TestAWalkRestartedByARebuildIsSaidStarted (0.21s)
./cmd/mesh-controller --- PASS: TestAWalkStoppedByHandAndRetriedEndsFailedWhenItFailsAgain (0.25s)
./cmd/mesh-controller --- PASS: TestReplay237 (0.21s)
./cmd/mesh-controller --- PASS: TestAnUnassignThatLeavesItsNodeUnresolvedSaysSoOnceInItsAnswer (0.20s)
./cmd/mesh-controller --- PASS: TestAnUnassignThatLeavesItsNodeResolvedSaysNothingOfIt (0.20s)
./cmd/mesh-controller --- PASS: TestAnAssignThatLeavesItsNodeUnresolvedSaysOnlyThePlansRefusal (0.20s)
./cmd/mesh-controller --- PASS: TestADirectoryOwnersKeyIsRefusedThroughAVerb (0.23s)
./cmd/mesh-controller --- PASS: TestTheSendMakesNoValueForAnOutsideSecretNobodyGave (0.28s)
./cmd/mesh-controller --- PASS: TestAQuestionComposesWithoutAnOutsideSecretNobodyGave (0.29s)
./cmd/mesh-controller --- PASS: TestReplay201 (0.16s)
./cmd/mesh-controller --- PASS: TestARollbackWhoseSendWasRefusedIsCompletedByTheNextSend (0.16s)
./cmd/mesh-controller --- PASS: TestAGateJudgesTheOtherMovesBesideAKeptCore (0.16s)
./cmd/mesh-controller --- PASS: TestReplay401 (0.29s)
./cmd/mesh-controller --- PASS: TestReplay201ThePlansSend (0.23s)
./internal/inventory --- PASS: TestTheLastSendSaysWhatTheMachineAnswered (0.08s)
./internal/inventory --- PASS: TestAReportIsTheLastSendsAnswerOnlyWhenItIsAboutThatSend (0.09s)
./internal/inventory --- PASS: TestAnIssuedValueIsSealedToEveryHolderOnceAndNotAgain (0.10s)
./internal/inventory --- PASS: TestAnIssuedValueIsSealedAgainAfterAKeyChangeOrAnAcceptance (0.08s)
./internal/inventory --- PASS: TestAConditionsLooksAreKeptBesideTheBucket (0.07s)
./internal/inventory --- PASS: TestAPlanIdHoldingAQuoteIsReadAsAPlainId (0.07s)
./internal/inventory --- PASS: TestAWalksStartIsKeptAndARefusedSaveLeavesItUnsaid (0.07s)
./internal/inventory --- PASS: TestAWalksRestIsReadFromEachMachinesOwnSend (0.07s)
```
A renewal timed out at the renew interval, so the lease test's 1 s renewals
could lose the lease on a slow build machine (novox/hq issue 591, review of #279).
build-agent keeps data (ADR 0233): what it holds is backed up before it moves
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
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, route-proxy is judged on its first machine
Run by the build seat on shanks as build-1791842942356542802 (builds --log build-1791842942356542802).
--- the gate: build-agent, mesh-controller, route-proxy
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-12T22:09:48Z 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-12T22:09:48Z
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 3 module(s) in 3 tier(s): build-agent, mesh-controller, route-proxy
--- its merge-check.sh (go toolchain)
ok github.com/novox/mesh-controller/cmd/mesh-builder 1.042s
ok github.com/novox/mesh-controller/cmd/mesh-controller 188.773s
ok github.com/novox/mesh-controller/examples/objectstore-provisioner 1.049s
ok github.com/novox/mesh-controller/examples/postgres-provisioner 1.072s
ok github.com/novox/mesh-controller/examples/redis-provisioner 1.045s
ok github.com/novox/mesh-controller/examples/route-proxy 1.210s
ok github.com/novox/mesh-controller/internal/artifacts 1.098s
? github.com/novox/mesh-controller/internal/beside [no test files]
ok github.com/novox/mesh-controller/internal/broker 4.379s
ok github.com/novox/mesh-controller/internal/builder 55.206s
ok github.com/novox/mesh-controller/internal/catalogue 8.308s
ok github.com/novox/mesh-controller/internal/conditions 2.680s
ok github.com/novox/mesh-controller/internal/envfile 1.069s
ok github.com/novox/mesh-controller/internal/facts 1.067s
ok github.com/novox/mesh-controller/internal/identity 5.160s
ok github.com/novox/mesh-controller/internal/inventory 40.185s
ok github.com/novox/mesh-controller/internal/lease 17.788s
ok github.com/novox/mesh-controller/internal/licences 4.284s
ok github.com/novox/mesh-controller/internal/licences/adapters 1.055s
ok github.com/novox/mesh-controller/internal/link 59.635s
ok github.com/novox/mesh-controller/internal/lint 2.523s
ok github.com/novox/mesh-controller/internal/outward 1.098s
ok github.com/novox/mesh-controller/internal/overlay 1.070s
ok github.com/novox/mesh-controller/internal/secrets 1.561s
ok github.com/novox/mesh-controller/internal/store 3.572s
ok github.com/novox/mesh-controller/internal/testbus 1.198s
ok github.com/novox/mesh-controller/internal/token 1.016s
store tests, each run against the store:
./cmd/mesh-controller --- PASS: TestAStopWithoutAMergeWalksTheOthersAgain (0.22s)
./cmd/mesh-controller --- PASS: TestAStopWithoutAMergeEndsTheMergesThatContainIt (0.24s)
./cmd/mesh-controller --- PASS: TestAStopWalksTheOthersAgainInTheOpenBatch (0.23s)
./cmd/mesh-controller --- PASS: TestAStopNamesWhatStaysOnTheMachinesAndWhatStillCarriesIt (0.22s)
./cmd/mesh-controller --- PASS: TestAStopWithoutAMergeLeavesItOutOfABatch (0.21s)
./cmd/mesh-controller --- PASS: TestSavingPlansAndMovingMergesIsOneAct (0.19s)
./cmd/mesh-controller --- PASS: TestAPlanFollowedFromTheStoreAnswersWhenItMoves (1.98s)
./cmd/mesh-controller --- PASS: TestNodeShowAndStatusReadTheLastSendFromTheStore (0.25s)
./cmd/mesh-controller --- PASS: TestTheConditionsVerbReadsTheLooksTheBucketNoLongerHolds (0.14s)
./cmd/mesh-controller --- PASS: TestAWalkLetGoAndStoppedByVerbsIsSaidStartedAndEnded (0.26s)
./cmd/mesh-controller --- PASS: TestAWalkStoppedOrClosedByAPersonIsSaidEndedStopped (0.25s)
./cmd/mesh-controller --- PASS: TestAWalkRetriedByAPersonIsSaidStartedAgain (0.22s)
./cmd/mesh-controller --- PASS: TestABacklogReleasedByAPersonIsSaidStarted (0.22s)
./cmd/mesh-controller --- PASS: TestAWalkEndedByCancelOrClearIsSaidEnded (0.27s)
./cmd/mesh-controller --- PASS: TestAWalkRestartedByARebuildIsSaidStarted (0.21s)
./cmd/mesh-controller --- PASS: TestAWalkStoppedByHandAndRetriedEndsFailedWhenItFailsAgain (0.26s)
./cmd/mesh-controller --- PASS: TestReplay237 (0.21s)
./cmd/mesh-controller --- PASS: TestAnUnassignThatLeavesItsNodeUnresolvedSaysSoOnceInItsAnswer (0.20s)
./cmd/mesh-controller --- PASS: TestAnUnassignThatLeavesItsNodeResolvedSaysNothingOfIt (0.20s)
./cmd/mesh-controller --- PASS: TestAnAssignThatLeavesItsNodeUnresolvedSaysOnlyThePlansRefusal (0.20s)
./cmd/mesh-controller --- PASS: TestADirectoryOwnersKeyIsRefusedThroughAVerb (0.24s)
./cmd/mesh-controller --- PASS: TestTheSendMakesNoValueForAnOutsideSecretNobodyGave (0.30s)
./cmd/mesh-controller --- PASS: TestAQuestionComposesWithoutAnOutsideSecretNobodyGave (0.29s)
./cmd/mesh-controller --- PASS: TestReplay201 (0.17s)
./cmd/mesh-controller --- PASS: TestARollbackWhoseSendWasRefusedIsCompletedByTheNextSend (0.16s)
./cmd/mesh-controller --- PASS: TestAGateJudgesTheOtherMovesBesideAKeptCore (0.16s)
./cmd/mesh-controller --- PASS: TestReplay401 (0.29s)
./cmd/mesh-controller --- PASS: TestReplay201ThePlansSend (0.23s)
./internal/inventory --- PASS: TestTheLastSendSaysWhatTheMachineAnswered (0.09s)
./internal/inventory --- PASS: TestAReportIsTheLastSendsAnswerOnlyWhenItIsAboutThatSend (0.09s)
./internal/inventory --- PASS: TestAnIssuedValueIsSealedToEveryHolderOnceAndNotAgain (0.10s)
./internal/inventory --- PASS: TestAnIssuedValueIsSealedAgainAfterAKeyChangeOrAnAcceptance (0.09s)
./internal/inventory --- PASS: TestAConditionsLooksAreKeptBesideTheBucket (0.07s)
./internal/inventory --- PASS: TestAPlanIdHoldingAQuoteIsReadAsAPlainId (0.08s)
./internal/inventory --- PASS: TestAWalksStartIsKeptAndARefusedSaveLeavesItUnsaid (0.07s)
./internal/inventory --- PASS: TestAWalksRestIsReadFromEachMachinesOwnSend (0.08s)
**Merge check** at `7f3ff323`
Judged: head `7f3ff3236149` merged into trunk `21ac8fd8586d`; read beside it: mesh-catalog `43a9155d5afe`, mesh-controller-main `21ac8fd8586d`, mesh-host `8e95c1d9ed2d`, 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, route-proxy)
- `mesh/repo-check`: **PASS** — its merge-check.sh passed
**Delivery plan** — builds build-agent, mesh-controller, route-proxy → ace, g14, novox, shanks; no bus step
- tier 0: mesh-controller
- tier 1: build-agent
- tier 2: route-proxy
- ace: receives build-agent, route-proxy
- g14: receives build-agent
- novox: receives mesh-controller, build-agent, route-proxy
- shanks: receives build-agent
- build-agent keeps data (ADR 0233): what it holds is backed up before it moves
- 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
- 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, route-proxy is judged on its first machine
Run by the build seat on shanks as `build-1791842942356542802` (`builds --log build-1791842942356542802`).
```
--- the gate: build-agent, mesh-controller, route-proxy
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-12T22:09:48Z 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-12T22:09:48Z
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 3 module(s) in 3 tier(s): build-agent, mesh-controller, route-proxy
--- its merge-check.sh (go toolchain)
ok github.com/novox/mesh-controller/cmd/mesh-builder 1.042s
ok github.com/novox/mesh-controller/cmd/mesh-controller 188.773s
ok github.com/novox/mesh-controller/examples/objectstore-provisioner 1.049s
ok github.com/novox/mesh-controller/examples/postgres-provisioner 1.072s
ok github.com/novox/mesh-controller/examples/redis-provisioner 1.045s
ok github.com/novox/mesh-controller/examples/route-proxy 1.210s
ok github.com/novox/mesh-controller/internal/artifacts 1.098s
? github.com/novox/mesh-controller/internal/beside [no test files]
ok github.com/novox/mesh-controller/internal/broker 4.379s
ok github.com/novox/mesh-controller/internal/builder 55.206s
ok github.com/novox/mesh-controller/internal/catalogue 8.308s
ok github.com/novox/mesh-controller/internal/conditions 2.680s
ok github.com/novox/mesh-controller/internal/envfile 1.069s
ok github.com/novox/mesh-controller/internal/facts 1.067s
ok github.com/novox/mesh-controller/internal/identity 5.160s
ok github.com/novox/mesh-controller/internal/inventory 40.185s
ok github.com/novox/mesh-controller/internal/lease 17.788s
ok github.com/novox/mesh-controller/internal/licences 4.284s
ok github.com/novox/mesh-controller/internal/licences/adapters 1.055s
ok github.com/novox/mesh-controller/internal/link 59.635s
ok github.com/novox/mesh-controller/internal/lint 2.523s
ok github.com/novox/mesh-controller/internal/outward 1.098s
ok github.com/novox/mesh-controller/internal/overlay 1.070s
ok github.com/novox/mesh-controller/internal/secrets 1.561s
ok github.com/novox/mesh-controller/internal/store 3.572s
ok github.com/novox/mesh-controller/internal/testbus 1.198s
ok github.com/novox/mesh-controller/internal/token 1.016s
store tests, each run against the store:
./cmd/mesh-controller --- PASS: TestAStopWithoutAMergeWalksTheOthersAgain (0.22s)
./cmd/mesh-controller --- PASS: TestAStopWithoutAMergeEndsTheMergesThatContainIt (0.24s)
./cmd/mesh-controller --- PASS: TestAStopWalksTheOthersAgainInTheOpenBatch (0.23s)
./cmd/mesh-controller --- PASS: TestAStopNamesWhatStaysOnTheMachinesAndWhatStillCarriesIt (0.22s)
./cmd/mesh-controller --- PASS: TestAStopWithoutAMergeLeavesItOutOfABatch (0.21s)
./cmd/mesh-controller --- PASS: TestSavingPlansAndMovingMergesIsOneAct (0.19s)
./cmd/mesh-controller --- PASS: TestAPlanFollowedFromTheStoreAnswersWhenItMoves (1.98s)
./cmd/mesh-controller --- PASS: TestNodeShowAndStatusReadTheLastSendFromTheStore (0.25s)
./cmd/mesh-controller --- PASS: TestTheConditionsVerbReadsTheLooksTheBucketNoLongerHolds (0.14s)
./cmd/mesh-controller --- PASS: TestAWalkLetGoAndStoppedByVerbsIsSaidStartedAndEnded (0.26s)
./cmd/mesh-controller --- PASS: TestAWalkStoppedOrClosedByAPersonIsSaidEndedStopped (0.25s)
./cmd/mesh-controller --- PASS: TestAWalkRetriedByAPersonIsSaidStartedAgain (0.22s)
./cmd/mesh-controller --- PASS: TestABacklogReleasedByAPersonIsSaidStarted (0.22s)
./cmd/mesh-controller --- PASS: TestAWalkEndedByCancelOrClearIsSaidEnded (0.27s)
./cmd/mesh-controller --- PASS: TestAWalkRestartedByARebuildIsSaidStarted (0.21s)
./cmd/mesh-controller --- PASS: TestAWalkStoppedByHandAndRetriedEndsFailedWhenItFailsAgain (0.26s)
./cmd/mesh-controller --- PASS: TestReplay237 (0.21s)
./cmd/mesh-controller --- PASS: TestAnUnassignThatLeavesItsNodeUnresolvedSaysSoOnceInItsAnswer (0.20s)
./cmd/mesh-controller --- PASS: TestAnUnassignThatLeavesItsNodeResolvedSaysNothingOfIt (0.20s)
./cmd/mesh-controller --- PASS: TestAnAssignThatLeavesItsNodeUnresolvedSaysOnlyThePlansRefusal (0.20s)
./cmd/mesh-controller --- PASS: TestADirectoryOwnersKeyIsRefusedThroughAVerb (0.24s)
./cmd/mesh-controller --- PASS: TestTheSendMakesNoValueForAnOutsideSecretNobodyGave (0.30s)
./cmd/mesh-controller --- PASS: TestAQuestionComposesWithoutAnOutsideSecretNobodyGave (0.29s)
./cmd/mesh-controller --- PASS: TestReplay201 (0.17s)
./cmd/mesh-controller --- PASS: TestARollbackWhoseSendWasRefusedIsCompletedByTheNextSend (0.16s)
./cmd/mesh-controller --- PASS: TestAGateJudgesTheOtherMovesBesideAKeptCore (0.16s)
./cmd/mesh-controller --- PASS: TestReplay401 (0.29s)
./cmd/mesh-controller --- PASS: TestReplay201ThePlansSend (0.23s)
./internal/inventory --- PASS: TestTheLastSendSaysWhatTheMachineAnswered (0.09s)
./internal/inventory --- PASS: TestAReportIsTheLastSendsAnswerOnlyWhenItIsAboutThatSend (0.09s)
./internal/inventory --- PASS: TestAnIssuedValueIsSealedToEveryHolderOnceAndNotAgain (0.10s)
./internal/inventory --- PASS: TestAnIssuedValueIsSealedAgainAfterAKeyChangeOrAnAcceptance (0.09s)
./internal/inventory --- PASS: TestAConditionsLooksAreKeptBesideTheBucket (0.07s)
./internal/inventory --- PASS: TestAPlanIdHoldingAQuoteIsReadAsAPlainId (0.08s)
./internal/inventory --- PASS: TestAWalksStartIsKeptAndARefusedSaveLeavesItUnsaid (0.07s)
./internal/inventory --- PASS: TestAWalksRestIsReadFromEachMachinesOwnSend (0.08s)
```
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 novox/hq issue 591 (the controller's repository check takes 6-8 minutes).
Measured with
go test -race -json ./...against a throwaway PostgreSQL 18 on a 24-core machine (fsync on). The before and after are the same machine and the same load.go test ./...sh merge-check.shwith the storesh merge-check.shwithout a storeWhere the time went, and what changed
store.CreateMigratedForTestnow migrates a template once for each set of migrations, throughMigrateitself, and copies each test's database from it. The template is named after a digest of the migrations, built under an advisory lock so packages tested at once share it, and marked a template only once it is whole. EachForTest(inventory, licences, identity) still runsMigrateon its copy, which finds nothing pending only if the copy's record matches every migration. ForTest went from ~110 ms to ~35 ms.inventory.ForTestsets the cost tobcrypt.MinCost, which is still a real bcrypt hash checked by the same comparison. A new test holds the production cost atbcrypt.DefaultCost.link.ReadBuildEventswaited out its 2 s fetch on every read when fewer than 500 events were there, so everyqueue,cancel,clearandkilltook 2 s or more. This is a production change: it now reads the number of events the consumer holds and stops once they are read.TestCancelRefusesAnAskInFlightproves that events are still read.atexit_sleep_ms), and many cmd tests run the test binary as a verb's command line. TestMain setsatexit_sleep_ms=0for the children when GORACE is unset. The children still run under the race detector and still fail on a race they find.renewEvery/poll(zero means the lease's defaults), and the test uses 1 s and 100 ms. The test went from 8.2 s to 2.1 s.planWaitEveryis now a variable and the test sets it to 50 ms. It keeps the 1.5 s before the plan moves, and its bound is now 300 ms. Parsing a bound given as a bare number of seconds is still covered byTestAWaitIsRefusedWhatItCannotDo'splanWaitAsked("tier", "12").Self-review
ForTestusest.Setenv, and the cmd tests share globals.now()at the time the template was built, not the time of the test. No test depends on that: the whole suite passed 3 times in a row under-race -count=3 ./...with every package running at once.t.Cleanup. The bcrypt cost is set by everyinventory.ForTestcall, so it does not depend on which test ran first. Only the new cost test reads it unset, and that test restores it.Seen but not changed
TestNatsWorkSlowerThanTheWindowIsNotHandedOverAgain(9 s) passes withgo stillWorkingremoved, so it does not prove its fault. I think the controller re-ensures its CONTROL consumer at 30 s over the test's 2 s window. Left as it is.internal/conditionsTestBorrowedWordsAreLoggedfails between 23:30 and 23:39 local time, because the log's timestamp contains23:3. This is unrelated to this change.Delivery
novox/mesh-controller@7f3ff3236149— delivered since 2026-10-12T22:33:11ZDelivery plan — builds build-agent, mesh-controller, route-proxy → 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
2819915eJudged: head
2819915e8e19merged into trunke63af0df17f5; read beside it: mesh-catalog43a9155d5afe, mesh-controller-maine63af0df17f5, mesh-host8e95c1d9ed2d, mesh-tools954e1a53eef9mesh/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 shanks as
build-1791842021912650621(builds --log build-1791842021912650621).Merge check at
7f3ff323Judged: head
7f3ff3236149merged into trunk21ac8fd8586d; read beside it: mesh-catalog43a9155d5afe, mesh-controller-main21ac8fd8586d, mesh-host8e95c1d9ed2d, mesh-tools954e1a53eef9mesh/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: PASS — its merge-check.sh passedDelivery plan — builds build-agent, mesh-controller, route-proxy → ace, g14, novox, shanks; no bus step
Run by the build seat on shanks as
build-1791842942356542802(builds --log build-1791842942356542802).