Replaces #202 (issue 383), rebased on main and reshaped for issue 639. Answers the review (reviews 212-215) at head 52bcef159d.
Acceptance. A settings proposal on Telegram reads: bold "Set mounts on shanks?", one summary line ("Changes 3 setting(s) of mounts on shanks; approved, the layer is set at once and shanks takes it at its next push."), at most three key points (more keys: the first two and "and N more, each whole in the note: "; a long point ends "… (cut: whole in the note)"), the buttons, and a collapsed note that lists every key with its whole value (masked on the desk), then who proposed it, the fingerprint and how to read it at the terminal.
What.settingsProposal.ask: explanation = summary() + at most three points from change(). The Details list every key uncut, masked under the content rule; WholeDetails (mesh-sdk #25) holds them whole for a channel that proves who answers. Whole carries the glance whole, as in #202. A value shaped like a secret is withheld in every form. The how-to line names no dotted verb, which the router's content rule would withhold. The controller keeps the ask it sent, so an open proposal is decided as asked.
Vendors mesh-sdk at f474544 (mesh-sdk #25: Message.Note, asks.Glance, Ask.WholeDetails) and captures its conformance events there (testdata/beside/CAPTURED).
Merge order: mesh-sdk #25, then mesh-catalog #278 (the router must know Whole and WholeDetails before the controller sends them, or the digests differ and the warrant is refused), then this. The after: line above declares it to the delivery group.
Tested.merge-check.sh: all green. Tests fail on main: TestAProposalAsksAtTheLevelApproveWithTheExactChange, TestAProposalShowsItsValuesWholeOnlyWhereTheSenderIsProvenAndNeverASecret, TestAMeshWideLayerIsProposed, TestAClearIsProposedAndShowsWhatItRemoves, and TestEveryKeyAndItsWholeValueReachTheOperator (5 keys, one value 300 characters: every key and full value in what a proving channel shows, every key in the masked Details, the cut said).
Fixes issue 383 (with mesh-catalog and hq); part of issue 639. Decisions: ADR 0345 (accepted), ADR 0347 (proposed, needs the operator).
after: novox/mesh-catalog
Replaces #202 (issue 383), rebased on main and reshaped for issue 639. Answers the review (reviews 212-215) at head 52bcef159d95.
**Acceptance.** A settings proposal on Telegram reads: bold "Set mounts on shanks?", one summary line ("Changes 3 setting(s) of mounts on shanks; approved, the layer is set at once and shanks takes it at its next push."), at most three key points (more keys: the first two and "and N more, each whole in the note: <keys>"; a long point ends "… (cut: whole in the note)"), the buttons, and a collapsed note that lists every key with its whole value (masked on the desk), then who proposed it, the fingerprint and how to read it at the terminal.
**What.** `settingsProposal.ask`: explanation = `summary()` + at most three points from `change()`. The Details list every key uncut, masked under the content rule; `WholeDetails` (mesh-sdk #25) holds them whole for a channel that proves who answers. `Whole` carries the glance whole, as in #202. A value shaped like a secret is withheld in every form. The how-to line names no dotted verb, which the router's content rule would withhold. The controller keeps the ask it sent, so an open proposal is decided as asked.
Vendors mesh-sdk at f474544 (mesh-sdk #25: `Message.Note`, `asks.Glance`, `Ask.WholeDetails`) and captures its conformance events there (testdata/beside/CAPTURED).
**Merge order**: mesh-sdk #25, then mesh-catalog #278 (the router must know `Whole` and `WholeDetails` before the controller sends them, or the digests differ and the warrant is refused), then this. The `after:` line above declares it to the delivery group.
**Tested.** `merge-check.sh`: all green. Tests fail on main: `TestAProposalAsksAtTheLevelApproveWithTheExactChange`, `TestAProposalShowsItsValuesWholeOnlyWhereTheSenderIsProvenAndNeverASecret`, `TestAMeshWideLayerIsProposed`, `TestAClearIsProposedAndShowsWhatItRemoves`, and `TestEveryKeyAndItsWholeValueReachTheOperator` (5 keys, one value 300 characters: every key and full value in what a proving channel shows, every key in the masked Details, the cut said).
Fixes issue 383 (with mesh-catalog and hq); part of issue 639. Decisions: ADR 0345 (accepted), ADR 0347 (proposed, needs the operator).
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
composed together: pass — every machine composes with the change as it did without (4 of 4 compose)
Machines
mesh-controller on novox: passed — healthy 3 times over 3m40s
mesh-controller on the rest running it: sent
route-proxy on ace: passed — healthy 1 times over 41s
route-proxy on the rest running it: sent
Transitions
2026-10-13 18:45 (new) → proposed (announced): novox/mesh-controller#304's head announced
2026-10-13 18:52 proposed → checked (checked): a verdict names this commit and the trunk's head as its trunk commit
2026-10-13 18:52 checked → ready (accepted): the gate passed or warned, and the repository's own check did not fail
2026-10-13 19:11 ready → proposed (trunk moved): out of date: judged against trunk 332fbaa9b1, the trunk is now cef22a25264b; judged again on a recheck or when it is merged
2026-10-13 19:18 proposed → checked (checked): a verdict names this commit and the trunk's head as its trunk commit
2026-10-13 19:18 checked → ready (accepted): the gate passed or warned, and the repository's own check did not fail
2026-10-13 19:24 ready → published (merged): on the trunk its modules follow: merged there, and its walk opened — or nothing for a walk to move
2026-10-13 19:24 published → delivering (go): its walk started: let go by this owner in its group's order, by a person, or on the controller's own path — not a failed walk that carried a later commit for it, after which it waits for a walk of its own commit
2026-10-13 20:07 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@deef9421a276` — **delivered** since 2026-10-13T20:07:01Z
**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
**Group** `fix/383-an-ask-reads-at-a-glance`, in order: novox/mesh-catalog@f09daabec3a8 → novox/mesh-controller@deef9421a276
- novox/mesh-catalog@f09daabec3a8 before novox/mesh-controller@deef9421a276: declared, over built by, version skew
- composed together: pass — every machine composes with the change as it did without (4 of 4 compose)
**Machines**
- mesh-controller on novox: passed — healthy 3 times over 3m40s
- mesh-controller on the rest running it: sent
- route-proxy on ace: passed — healthy 1 times over 41s
- route-proxy on the rest running it: sent
**Transitions**
- 2026-10-13 18:45 (new) → proposed (announced): novox/mesh-controller#304's head announced
- 2026-10-13 18:52 proposed → checked (checked): a verdict names this commit and the trunk's head as its trunk commit
- 2026-10-13 18:52 checked → ready (accepted): the gate passed or warned, and the repository's own check did not fail
- 2026-10-13 19:11 ready → proposed (trunk moved): out of date: judged against trunk 332fbaa9b175, the trunk is now cef22a25264b; judged again on a recheck or when it is merged
- 2026-10-13 19:18 proposed → checked (checked): a verdict names this commit and the trunk's head as its trunk commit
- 2026-10-13 19:18 checked → ready (accepted): the gate passed or warned, and the repository's own check did not fail
- 2026-10-13 19:24 ready → published (merged): on the trunk its modules follow: merged there, and its walk opened — or nothing for a walk to move
- 2026-10-13 19:24 published → delivering (go): its walk started: let go by this owner in its group's order, by a person, or on the controller's own path — not a failed walk that carried a later commit for it, after which it waits for a walk of its own commit
- 2026-10-13 20:07 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`.
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
read by no module's build: cmd/mesh-controller/proposals_test.go, internal/outward/outward_test.go, testdata/beside/CAPTURED
Run by the build seat on shanks as build-1791902225449633841 (builds --log build-1791902225449633841).
--- 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-13T14:32:41Z 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-13T14:32:41Z
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
notes:
- cmd/mesh-controller/proposals_test.go, internal/outward/outward_test.go and testdata/beside/CAPTURED 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.044s
ok github.com/novox/mesh-controller/cmd/mesh-controller 181.400s
ok github.com/novox/mesh-controller/examples/objectstore-provisioner 1.049s
ok github.com/novox/mesh-controller/examples/postgres-provisioner 1.056s
ok github.com/novox/mesh-controller/examples/redis-provisioner 1.051s
ok github.com/novox/mesh-controller/examples/route-proxy 1.259s
ok github.com/novox/mesh-controller/internal/artifacts 1.090s
? github.com/novox/mesh-controller/internal/beside [no test files]
ok github.com/novox/mesh-controller/internal/broker 4.489s
ok github.com/novox/mesh-controller/internal/builder 47.318s
ok github.com/novox/mesh-controller/internal/catalogue 8.568s
ok github.com/novox/mesh-controller/internal/conditions 2.726s
ok github.com/novox/mesh-controller/internal/envfile 1.064s
ok github.com/novox/mesh-controller/internal/facts 1.073s
ok github.com/novox/mesh-controller/internal/identity 5.278s
ok github.com/novox/mesh-controller/internal/inventory 36.425s
ok github.com/novox/mesh-controller/internal/lease 17.742s
ok github.com/novox/mesh-controller/internal/licences 4.151s
ok github.com/novox/mesh-controller/internal/licences/adapters 1.038s
ok github.com/novox/mesh-controller/internal/link 64.479s
ok github.com/novox/mesh-controller/internal/lint 2.577s
ok github.com/novox/mesh-controller/internal/outward 1.107s
ok github.com/novox/mesh-controller/internal/overlay 1.076s
ok github.com/novox/mesh-controller/internal/secrets 1.540s
ok github.com/novox/mesh-controller/internal/store 3.511s
ok github.com/novox/mesh-controller/internal/testbus 1.262s
ok github.com/novox/mesh-controller/internal/token 1.018s
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.22s)
./cmd/mesh-controller --- PASS: TestAStopNamesWhatStaysOnTheMachinesAndWhatStillCarriesIt (0.23s)
./cmd/mesh-controller --- PASS: TestAStopWithoutAMergeLeavesItOutOfABatch (0.20s)
./cmd/mesh-controller --- PASS: TestSavingPlansAndMovingMergesIsOneAct (0.18s)
./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.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.22s)
./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.23s)
./cmd/mesh-controller --- PASS: TestTheSendMakesNoValueForAnOutsideSecretNobodyGave (0.30s)
./cmd/mesh-controller --- PASS: TestAQuestionComposesWithoutAnOutsideSecretNobodyGave (0.28s)
./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.30s)
./cmd/mesh-controller --- PASS: TestReplay201ThePlansSend (0.24s)
./cmd/mesh-controller --- PASS: TestPlanAndNodeListAnOptionalRequirementLeftUnbound (0.29s)
./cmd/mesh-controller --- PASS: TestReplay340 (0.25s)
./cmd/mesh-controller --- PASS: TestOnlyATrustedFilesNamedKeyIsRefusedThroughAVerb (0.20s)
./cmd/mesh-controller --- PASS: TestReplay349 (0.21s)
./cmd/mesh-controller --- PASS: TestReplay348AFaultFromBeforeTheSendFailsNoGate (0.18s)
./cmd/mesh-controller --- PASS: TestReplay239AModuleNameIsNotTakenOverByAnotherRepository (0.16s)
./cmd/mesh-controller --- PASS: TestAWalkThatMovedNothingSaysWhichModulesMatchedWhatRuns (0.19s)
./cmd/mesh-controller --- PASS: TestReplay614ANewSDKPlansTheToolchainAndThenItsBundles (0.08s)
./cmd/mesh-controller --- PASS: TestOneAcceptForAProviderIsPlacedForEveryConsumer (0.46s)
./cmd/mesh-controller --- PASS: TestReplay164 (0.29s)
./internal/inventory --- PASS: TestTheLastSendSaysWhatTheMachineAnswered (0.08s)
./internal/inventory --- PASS: TestAReportIsTheLastSendsAnswerOnlyWhenItIsAboutThatSend (0.08s)
./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.07s)
./internal/inventory --- PASS: TestAStoredBuildWithASilentMergeableFileIsStillReadAndComposed (0.07s)
./internal/inventory --- PASS: TestACredentialIssuedOutsideIsNeverMade (0.09s)
./internal/inventory --- PASS: TestOneAcceptForAProviderIsSealedToEveryConsumer (0.09s)
./internal/inventory --- PASS: TestASharedOwnSecretIssuedOutsideIsNeverMade (0.08s)
**Merge check** at `35232c85`
Judged: head `35232c853483` merged into trunk `6f1a05366c1d`; read beside it: mesh-catalog `5f491e0c097d`, mesh-controller-main `6f1a05366c1d`, mesh-host `0e92ef3d1b21`, 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
- read by no module's build: cmd/mesh-controller/proposals_test.go, internal/outward/outward_test.go, testdata/beside/CAPTURED
Run by the build seat on shanks as `build-1791902225449633841` (`builds --log build-1791902225449633841`).
```
--- 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-13T14:32:41Z 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-13T14:32:41Z
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
notes:
- cmd/mesh-controller/proposals_test.go, internal/outward/outward_test.go and testdata/beside/CAPTURED 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.044s
ok github.com/novox/mesh-controller/cmd/mesh-controller 181.400s
ok github.com/novox/mesh-controller/examples/objectstore-provisioner 1.049s
ok github.com/novox/mesh-controller/examples/postgres-provisioner 1.056s
ok github.com/novox/mesh-controller/examples/redis-provisioner 1.051s
ok github.com/novox/mesh-controller/examples/route-proxy 1.259s
ok github.com/novox/mesh-controller/internal/artifacts 1.090s
? github.com/novox/mesh-controller/internal/beside [no test files]
ok github.com/novox/mesh-controller/internal/broker 4.489s
ok github.com/novox/mesh-controller/internal/builder 47.318s
ok github.com/novox/mesh-controller/internal/catalogue 8.568s
ok github.com/novox/mesh-controller/internal/conditions 2.726s
ok github.com/novox/mesh-controller/internal/envfile 1.064s
ok github.com/novox/mesh-controller/internal/facts 1.073s
ok github.com/novox/mesh-controller/internal/identity 5.278s
ok github.com/novox/mesh-controller/internal/inventory 36.425s
ok github.com/novox/mesh-controller/internal/lease 17.742s
ok github.com/novox/mesh-controller/internal/licences 4.151s
ok github.com/novox/mesh-controller/internal/licences/adapters 1.038s
ok github.com/novox/mesh-controller/internal/link 64.479s
ok github.com/novox/mesh-controller/internal/lint 2.577s
ok github.com/novox/mesh-controller/internal/outward 1.107s
ok github.com/novox/mesh-controller/internal/overlay 1.076s
ok github.com/novox/mesh-controller/internal/secrets 1.540s
ok github.com/novox/mesh-controller/internal/store 3.511s
ok github.com/novox/mesh-controller/internal/testbus 1.262s
ok github.com/novox/mesh-controller/internal/token 1.018s
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.22s)
./cmd/mesh-controller --- PASS: TestAStopNamesWhatStaysOnTheMachinesAndWhatStillCarriesIt (0.23s)
./cmd/mesh-controller --- PASS: TestAStopWithoutAMergeLeavesItOutOfABatch (0.20s)
./cmd/mesh-controller --- PASS: TestSavingPlansAndMovingMergesIsOneAct (0.18s)
./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.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.22s)
./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.23s)
./cmd/mesh-controller --- PASS: TestTheSendMakesNoValueForAnOutsideSecretNobodyGave (0.30s)
./cmd/mesh-controller --- PASS: TestAQuestionComposesWithoutAnOutsideSecretNobodyGave (0.28s)
./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.30s)
./cmd/mesh-controller --- PASS: TestReplay201ThePlansSend (0.24s)
./cmd/mesh-controller --- PASS: TestPlanAndNodeListAnOptionalRequirementLeftUnbound (0.29s)
./cmd/mesh-controller --- PASS: TestReplay340 (0.25s)
./cmd/mesh-controller --- PASS: TestOnlyATrustedFilesNamedKeyIsRefusedThroughAVerb (0.20s)
./cmd/mesh-controller --- PASS: TestReplay349 (0.21s)
./cmd/mesh-controller --- PASS: TestReplay348AFaultFromBeforeTheSendFailsNoGate (0.18s)
./cmd/mesh-controller --- PASS: TestReplay239AModuleNameIsNotTakenOverByAnotherRepository (0.16s)
./cmd/mesh-controller --- PASS: TestAWalkThatMovedNothingSaysWhichModulesMatchedWhatRuns (0.19s)
./cmd/mesh-controller --- PASS: TestReplay614ANewSDKPlansTheToolchainAndThenItsBundles (0.08s)
./cmd/mesh-controller --- PASS: TestOneAcceptForAProviderIsPlacedForEveryConsumer (0.46s)
./cmd/mesh-controller --- PASS: TestReplay164 (0.29s)
./internal/inventory --- PASS: TestTheLastSendSaysWhatTheMachineAnswered (0.08s)
./internal/inventory --- PASS: TestAReportIsTheLastSendsAnswerOnlyWhenItIsAboutThatSend (0.08s)
./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.07s)
./internal/inventory --- PASS: TestAStoredBuildWithASilentMergeableFileIsStillReadAndComposed (0.07s)
./internal/inventory --- PASS: TestACredentialIssuedOutsideIsNeverMade (0.09s)
./internal/inventory --- PASS: TestOneAcceptForAProviderIsSealedToEveryConsumer (0.09s)
./internal/inventory --- PASS: TestASharedOwnSecretIssuedOutsideIsNeverMade (0.08s)
```
Independent review (issues 383 and 639, ADR 0345 clause 6).
BLOCKING: with more than 3 keys, the operator approves values that are never shown on the phone, not even in the collapsible part.
cmd/mesh-controller/proposals.go:276: change() replaces every key from the third on with "and N more: c, d, e" (key names only). It does this in both forms, the masked and the exact one, because line 168 calls the same change(machines, true). So Ask.Whole, which is shown only on a channel that proves who answers, also carries no value for those keys.
proposals.go:183: the Details give the fingerprint and how to read it at the terminal, but no key line. Even if they did, the router holds Details to the full content rule (messenger holder.go:893), so a path or an address there is masked.
Result: on Telegram, Approve binds the whole layer (the act digest), while the operator has read the values of only two keys. That breaks what ADR 0274's proving channel exists for, and issue 383's point that "the mount point is the thing being approved". Before this change, every key was shown up to 1400 bytes, and the cut was said.
proposals.go:284: a point longer than 160 characters is cut with "…" in the Whole as well. A long value, such as an smb source with options, is approved truncated. Only the Details' generic "read it whole" line says so; nothing marks which line was cut.
Test proposals_test.go (five keys) asserts the cut explanation but never what the proving channel shows for c, d and e.
What would satisfy it: on a channel that proves who answers, the operator can read every key and its exact value (secret shapes withheld) before Approve, at least in the collapsed note, and a cut value is marked as cut. Clause 6 of ADR 0345 says "the first two, then the names of the rest" for the explanation. Carrying the remaining keys whole in the note needs either a progressive insight or a new clause, and likely router support for whole words in the note (mesh-catalog #278). That is the owner's call, but the merge should wait for it.
Correct as far as it goes:
wholeValue withholds a secret's shape whole. outward.Secret refuses before asking (proposals.go:488 onward). The Secret vs Check split mirrors the messenger's CheckSecret one for one.
The kept proposal carries no form. The controller keeps the ask itself (clause 8), so open asks at deploy keep their warrant.
Tests: go test -mod=vendor ./... passes niced. New or changed tests fail on main: I checked out main's non-test code with the PR's tests, and the build fails (outward.Secret, Ask.Whole, Details and Glance are undefined).
Pre-existing, not from this PR: a key named token or password renders as "+ token: ‹withheld›", which the "value given to a secret's name" pattern refuses, so such a proposal is refused at once.
Statuses at this head: mesh/merge-gate success ("head 35232c8534 merged into trunk 6f1a05366c — pass: builds build-agent, mesh-controller, route-proxy → ace, g14, novox, shanks; no bus…"), mesh/repo-check success ("… pass: its merge-check.sh passed"), mesh/delivery success ("ready: it delivers once merged"), mesh/delivery-group PENDING ("group fix/383-an-ask-reads-at-a-glance checking: composed check out of date: novox/mesh-catalog@ea1dfdce5b was judged against trunk 5f491…").
Verdict: request changes at 35232c85348393f1fcd6e5951290382d1f41eb9f
Independent review (issues 383 and 639, ADR 0345 clause 6).
BLOCKING: with more than 3 keys, the operator approves values that are never shown on the phone, not even in the collapsible part.
- cmd/mesh-controller/proposals.go:276: `change()` replaces every key from the third on with "and N more: c, d, e" (key names only). It does this in both forms, the masked and the exact one, because line 168 calls the same `change(machines, true)`. So `Ask.Whole`, which is shown only on a channel that proves who answers, also carries no value for those keys.
- proposals.go:183: the Details give the fingerprint and how to read it at the terminal, but no key line. Even if they did, the router holds Details to the full content rule (messenger holder.go:893), so a path or an address there is masked.
- Result: on Telegram, Approve binds the whole layer (the act digest), while the operator has read the values of only two keys. That breaks what ADR 0274's proving channel exists for, and issue 383's point that "the mount point is the thing being approved". Before this change, every key was shown up to 1400 bytes, and the cut was said.
- proposals.go:284: a point longer than 160 characters is cut with "…" in the Whole as well. A long value, such as an smb source with options, is approved truncated. Only the Details' generic "read it whole" line says so; nothing marks which line was cut.
- Test proposals_test.go (five keys) asserts the cut explanation but never what the proving channel shows for c, d and e.
What would satisfy it: on a channel that proves who answers, the operator can read every key and its exact value (secret shapes withheld) before Approve, at least in the collapsed note, and a cut value is marked as cut. Clause 6 of ADR 0345 says "the first two, then the names of the rest" for the explanation. Carrying the remaining keys whole in the note needs either a progressive insight or a new clause, and likely router support for whole words in the note (mesh-catalog #278). That is the owner's call, but the merge should wait for it.
Correct as far as it goes:
- `wholeValue` withholds a secret's shape whole. `outward.Secret` refuses before asking (proposals.go:488 onward). The `Secret` vs `Check` split mirrors the messenger's `CheckSecret` one for one.
- The kept proposal carries no form. The controller keeps the ask itself (clause 8), so open asks at deploy keep their warrant.
- Tests: `go test -mod=vendor ./...` passes niced. New or changed tests fail on main: I checked out main's non-test code with the PR's tests, and the build fails (`outward.Secret`, `Ask.Whole`, `Details` and `Glance` are undefined).
- Pre-existing, not from this PR: a key named token or password renders as "+ token: ‹withheld›", which the "value given to a secret's name" pattern refuses, so such a proposal is refused at once.
Statuses at this head: mesh/merge-gate success ("head 35232c853483 merged into trunk 6f1a05366c1d — pass: builds build-agent, mesh-controller, route-proxy → ace, g14, novox, shanks; no bus…"), mesh/repo-check success ("… pass: its merge-check.sh passed"), mesh/delivery success ("ready: it delivers once merged"), mesh/delivery-group PENDING ("group fix/383-an-ask-reads-at-a-glance checking: composed check out of date: novox/mesh-catalog@ea1dfdce5bc7 was judged against trunk 5f491…").
New head 52bcef159d answers the review (reviews 212-215). The Details now list every key with its value, one line each and uncut. The values are masked in Details and whole in WholeDetails (mesh-sdk f474544), which the router shows in the note on a proving channel. The glance keeps its shape and says what it leaves out: "and N more, each whole in the note: ...", and a long point ends "... (cut: whole in the note)". New test: TestEveryKeyAndItsWholeValueReachTheOperator. A 5-key proposal with a 300-character value: every key and full value is in Whole+WholeDetails, every key is masked in Details, the cut is said. It fails on the earlier head. Decision: ADR 0347 (changes ADR 0345 §6; proposed, needs the operator). Local merge-check.sh passed.
New head 52bcef159d95 answers the review (reviews 212-215). The Details now list every key with its value, one line each and uncut. The values are masked in `Details` and whole in `WholeDetails` (mesh-sdk f474544), which the router shows in the note on a proving channel. The glance keeps its shape and says what it leaves out: "and N more, each whole in the note: ...", and a long point ends "... (cut: whole in the note)". New test: `TestEveryKeyAndItsWholeValueReachTheOperator`. A 5-key proposal with a 300-character value: every key and full value is in Whole+WholeDetails, every key is masked in Details, the cut is said. It fails on the earlier head. Decision: ADR 0347 (changes ADR 0345 §6; proposed, needs the operator). Local merge-check.sh passed.
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
read by no module's build: cmd/mesh-controller/proposals_test.go, internal/outward/outward_test.go, testdata/beside/CAPTURED
Run by the build seat on shanks as build-1791903915795552180 (builds --log build-1791903915795552180).
--- 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-13T14:52:41Z 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-13T14:52:41Z
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
notes:
- cmd/mesh-controller/proposals_test.go, internal/outward/outward_test.go and testdata/beside/CAPTURED 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.054s
ok github.com/novox/mesh-controller/cmd/mesh-controller 173.570s
ok github.com/novox/mesh-controller/examples/objectstore-provisioner 1.053s
ok github.com/novox/mesh-controller/examples/postgres-provisioner 1.054s
ok github.com/novox/mesh-controller/examples/redis-provisioner 1.025s
ok github.com/novox/mesh-controller/examples/route-proxy 1.214s
ok github.com/novox/mesh-controller/internal/artifacts 1.101s
? github.com/novox/mesh-controller/internal/beside [no test files]
ok github.com/novox/mesh-controller/internal/broker 4.634s
ok github.com/novox/mesh-controller/internal/builder 41.329s
ok github.com/novox/mesh-controller/internal/catalogue 8.477s
ok github.com/novox/mesh-controller/internal/conditions 2.674s
ok github.com/novox/mesh-controller/internal/envfile 1.072s
ok github.com/novox/mesh-controller/internal/facts 1.074s
ok github.com/novox/mesh-controller/internal/identity 5.110s
ok github.com/novox/mesh-controller/internal/inventory 35.779s
ok github.com/novox/mesh-controller/internal/lease 17.720s
ok github.com/novox/mesh-controller/internal/licences 4.299s
ok github.com/novox/mesh-controller/internal/licences/adapters 1.063s
ok github.com/novox/mesh-controller/internal/link 59.257s
ok github.com/novox/mesh-controller/internal/lint 2.524s
ok github.com/novox/mesh-controller/internal/outward 1.100s
ok github.com/novox/mesh-controller/internal/overlay 1.086s
ok github.com/novox/mesh-controller/internal/secrets 1.548s
ok github.com/novox/mesh-controller/internal/store 3.519s
ok github.com/novox/mesh-controller/internal/testbus 1.268s
ok github.com/novox/mesh-controller/internal/token 1.015s
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.22s)
./cmd/mesh-controller --- PASS: TestAStopWithoutAMergeLeavesItOutOfABatch (0.20s)
./cmd/mesh-controller --- PASS: TestSavingPlansAndMovingMergesIsOneAct (0.17s)
./cmd/mesh-controller --- PASS: TestAPlanFollowedFromTheStoreAnswersWhenItMoves (1.97s)
./cmd/mesh-controller --- PASS: TestNodeShowAndStatusReadTheLastSendFromTheStore (0.25s)
./cmd/mesh-controller --- PASS: TestTheConditionsVerbReadsTheLooksTheBucketNoLongerHolds (0.13s)
./cmd/mesh-controller --- PASS: TestAWalkLetGoAndStoppedByVerbsIsSaidStartedAndEnded (0.26s)
./cmd/mesh-controller --- PASS: TestAWalkStoppedOrClosedByAPersonIsSaidEndedStopped (0.24s)
./cmd/mesh-controller --- PASS: TestAWalkRetriedByAPersonIsSaidStartedAgain (0.20s)
./cmd/mesh-controller --- PASS: TestABacklogReleasedByAPersonIsSaidStarted (0.20s)
./cmd/mesh-controller --- PASS: TestAWalkEndedByCancelOrClearIsSaidEnded (0.26s)
./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.24s)
./cmd/mesh-controller --- PASS: TestTheSendMakesNoValueForAnOutsideSecretNobodyGave (0.30s)
./cmd/mesh-controller --- PASS: TestAQuestionComposesWithoutAnOutsideSecretNobodyGave (0.26s)
./cmd/mesh-controller --- PASS: TestReplay201 (0.16s)
./cmd/mesh-controller --- PASS: TestARollbackWhoseSendWasRefusedIsCompletedByTheNextSend (0.15s)
./cmd/mesh-controller --- PASS: TestAGateJudgesTheOtherMovesBesideAKeptCore (0.16s)
./cmd/mesh-controller --- PASS: TestReplay401 (0.30s)
./cmd/mesh-controller --- PASS: TestReplay201ThePlansSend (0.24s)
./cmd/mesh-controller --- PASS: TestPlanAndNodeListAnOptionalRequirementLeftUnbound (0.29s)
./cmd/mesh-controller --- PASS: TestReplay340 (0.25s)
./cmd/mesh-controller --- PASS: TestOnlyATrustedFilesNamedKeyIsRefusedThroughAVerb (0.20s)
./cmd/mesh-controller --- PASS: TestReplay349 (0.21s)
./cmd/mesh-controller --- PASS: TestReplay348AFaultFromBeforeTheSendFailsNoGate (0.18s)
./cmd/mesh-controller --- PASS: TestReplay239AModuleNameIsNotTakenOverByAnotherRepository (0.16s)
./cmd/mesh-controller --- PASS: TestAWalkThatMovedNothingSaysWhichModulesMatchedWhatRuns (0.19s)
./cmd/mesh-controller --- PASS: TestReplay614ANewSDKPlansTheToolchainAndThenItsBundles (0.08s)
./cmd/mesh-controller --- PASS: TestOneAcceptForAProviderIsPlacedForEveryConsumer (0.47s)
./cmd/mesh-controller --- PASS: TestReplay164 (0.28s)
./internal/inventory --- PASS: TestTheLastSendSaysWhatTheMachineAnswered (0.08s)
./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.07s)
./internal/inventory --- PASS: TestAWalksStartIsKeptAndARefusedSaveLeavesItUnsaid (0.07s)
./internal/inventory --- PASS: TestAWalksRestIsReadFromEachMachinesOwnSend (0.07s)
./internal/inventory --- PASS: TestAStoredBuildWithASilentMergeableFileIsStillReadAndComposed (0.07s)
./internal/inventory --- PASS: TestACredentialIssuedOutsideIsNeverMade (0.08s)
./internal/inventory --- PASS: TestOneAcceptForAProviderIsSealedToEveryConsumer (0.08s)
./internal/inventory --- PASS: TestASharedOwnSecretIssuedOutsideIsNeverMade (0.08s)
**Merge check** at `52bcef15`
Judged: head `52bcef159d95` merged into trunk `6f1a05366c1d`; read beside it: mesh-catalog `e209d46faf3d`, mesh-controller-main `6f1a05366c1d`, mesh-host `0e92ef3d1b21`, 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
- read by no module's build: cmd/mesh-controller/proposals_test.go, internal/outward/outward_test.go, testdata/beside/CAPTURED
Run by the build seat on shanks as `build-1791903915795552180` (`builds --log build-1791903915795552180`).
```
--- 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-13T14:52:41Z 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-13T14:52:41Z
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
notes:
- cmd/mesh-controller/proposals_test.go, internal/outward/outward_test.go and testdata/beside/CAPTURED 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.054s
ok github.com/novox/mesh-controller/cmd/mesh-controller 173.570s
ok github.com/novox/mesh-controller/examples/objectstore-provisioner 1.053s
ok github.com/novox/mesh-controller/examples/postgres-provisioner 1.054s
ok github.com/novox/mesh-controller/examples/redis-provisioner 1.025s
ok github.com/novox/mesh-controller/examples/route-proxy 1.214s
ok github.com/novox/mesh-controller/internal/artifacts 1.101s
? github.com/novox/mesh-controller/internal/beside [no test files]
ok github.com/novox/mesh-controller/internal/broker 4.634s
ok github.com/novox/mesh-controller/internal/builder 41.329s
ok github.com/novox/mesh-controller/internal/catalogue 8.477s
ok github.com/novox/mesh-controller/internal/conditions 2.674s
ok github.com/novox/mesh-controller/internal/envfile 1.072s
ok github.com/novox/mesh-controller/internal/facts 1.074s
ok github.com/novox/mesh-controller/internal/identity 5.110s
ok github.com/novox/mesh-controller/internal/inventory 35.779s
ok github.com/novox/mesh-controller/internal/lease 17.720s
ok github.com/novox/mesh-controller/internal/licences 4.299s
ok github.com/novox/mesh-controller/internal/licences/adapters 1.063s
ok github.com/novox/mesh-controller/internal/link 59.257s
ok github.com/novox/mesh-controller/internal/lint 2.524s
ok github.com/novox/mesh-controller/internal/outward 1.100s
ok github.com/novox/mesh-controller/internal/overlay 1.086s
ok github.com/novox/mesh-controller/internal/secrets 1.548s
ok github.com/novox/mesh-controller/internal/store 3.519s
ok github.com/novox/mesh-controller/internal/testbus 1.268s
ok github.com/novox/mesh-controller/internal/token 1.015s
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.22s)
./cmd/mesh-controller --- PASS: TestAStopWithoutAMergeLeavesItOutOfABatch (0.20s)
./cmd/mesh-controller --- PASS: TestSavingPlansAndMovingMergesIsOneAct (0.17s)
./cmd/mesh-controller --- PASS: TestAPlanFollowedFromTheStoreAnswersWhenItMoves (1.97s)
./cmd/mesh-controller --- PASS: TestNodeShowAndStatusReadTheLastSendFromTheStore (0.25s)
./cmd/mesh-controller --- PASS: TestTheConditionsVerbReadsTheLooksTheBucketNoLongerHolds (0.13s)
./cmd/mesh-controller --- PASS: TestAWalkLetGoAndStoppedByVerbsIsSaidStartedAndEnded (0.26s)
./cmd/mesh-controller --- PASS: TestAWalkStoppedOrClosedByAPersonIsSaidEndedStopped (0.24s)
./cmd/mesh-controller --- PASS: TestAWalkRetriedByAPersonIsSaidStartedAgain (0.20s)
./cmd/mesh-controller --- PASS: TestABacklogReleasedByAPersonIsSaidStarted (0.20s)
./cmd/mesh-controller --- PASS: TestAWalkEndedByCancelOrClearIsSaidEnded (0.26s)
./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.24s)
./cmd/mesh-controller --- PASS: TestTheSendMakesNoValueForAnOutsideSecretNobodyGave (0.30s)
./cmd/mesh-controller --- PASS: TestAQuestionComposesWithoutAnOutsideSecretNobodyGave (0.26s)
./cmd/mesh-controller --- PASS: TestReplay201 (0.16s)
./cmd/mesh-controller --- PASS: TestARollbackWhoseSendWasRefusedIsCompletedByTheNextSend (0.15s)
./cmd/mesh-controller --- PASS: TestAGateJudgesTheOtherMovesBesideAKeptCore (0.16s)
./cmd/mesh-controller --- PASS: TestReplay401 (0.30s)
./cmd/mesh-controller --- PASS: TestReplay201ThePlansSend (0.24s)
./cmd/mesh-controller --- PASS: TestPlanAndNodeListAnOptionalRequirementLeftUnbound (0.29s)
./cmd/mesh-controller --- PASS: TestReplay340 (0.25s)
./cmd/mesh-controller --- PASS: TestOnlyATrustedFilesNamedKeyIsRefusedThroughAVerb (0.20s)
./cmd/mesh-controller --- PASS: TestReplay349 (0.21s)
./cmd/mesh-controller --- PASS: TestReplay348AFaultFromBeforeTheSendFailsNoGate (0.18s)
./cmd/mesh-controller --- PASS: TestReplay239AModuleNameIsNotTakenOverByAnotherRepository (0.16s)
./cmd/mesh-controller --- PASS: TestAWalkThatMovedNothingSaysWhichModulesMatchedWhatRuns (0.19s)
./cmd/mesh-controller --- PASS: TestReplay614ANewSDKPlansTheToolchainAndThenItsBundles (0.08s)
./cmd/mesh-controller --- PASS: TestOneAcceptForAProviderIsPlacedForEveryConsumer (0.47s)
./cmd/mesh-controller --- PASS: TestReplay164 (0.28s)
./internal/inventory --- PASS: TestTheLastSendSaysWhatTheMachineAnswered (0.08s)
./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.07s)
./internal/inventory --- PASS: TestAWalksStartIsKeptAndARefusedSaveLeavesItUnsaid (0.07s)
./internal/inventory --- PASS: TestAWalksRestIsReadFromEachMachinesOwnSend (0.07s)
./internal/inventory --- PASS: TestAStoredBuildWithASilentMergeableFileIsStillReadAndComposed (0.07s)
./internal/inventory --- PASS: TestACredentialIssuedOutsideIsNeverMade (0.08s)
./internal/inventory --- PASS: TestOneAcceptForAProviderIsSealedToEveryConsumer (0.08s)
./internal/inventory --- PASS: TestASharedOwnSecretIssuedOutsideIsNeverMade (0.08s)
```
Merge check at 5b014e75
Judged: head 5b014e75b7d5 merged into trunk 8ddf8b700558; read beside it: mesh-catalog 9c166398f204, mesh-controller-main 8ddf8b700558, mesh-host 0e92ef3d1b21, mesh-tools 954e1a53eef9
mesh/merge-gate: PASS — every machine composes with the change as it did without (4 of 4 compose) (run 3) (modules: build-agent, mesh-controller, route-proxy)
mesh/repo-check: PASS — its merge-check.sh passed (run 3)
Delivery plan — builds build-agent, mesh-controller, route-proxy → ace, g14, novox, shanks; no bus step
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-1791912326769990180 (builds --log build-1791912326769990180).
restarted: handed out 3 times; an earlier hand-out did not finish here, so this run started from the beginning
--- 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-13T17:25:03Z 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-13T17:25:03Z
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 180.812s
ok github.com/novox/mesh-controller/examples/objectstore-provisioner 1.045s
ok github.com/novox/mesh-controller/examples/postgres-provisioner 1.067s
ok github.com/novox/mesh-controller/examples/redis-provisioner 1.037s
ok github.com/novox/mesh-controller/examples/route-proxy 1.204s
ok github.com/novox/mesh-controller/internal/artifacts 1.088s
? github.com/novox/mesh-controller/internal/beside [no test files]
ok github.com/novox/mesh-controller/internal/broker 4.483s
ok github.com/novox/mesh-controller/internal/builder 46.191s
ok github.com/novox/mesh-controller/internal/catalogue 8.594s
ok github.com/novox/mesh-controller/internal/conditions 2.680s
ok github.com/novox/mesh-controller/internal/envfile 1.052s
ok github.com/novox/mesh-controller/internal/facts 1.057s
ok github.com/novox/mesh-controller/internal/identity 5.168s
ok github.com/novox/mesh-controller/internal/inventory 41.787s
ok github.com/novox/mesh-controller/internal/lease 17.724s
ok github.com/novox/mesh-controller/internal/licences 4.129s
ok github.com/novox/mesh-controller/internal/licences/adapters 1.038s
ok github.com/novox/mesh-controller/internal/link 62.125s
ok github.com/novox/mesh-controller/internal/lint 2.488s
ok github.com/novox/mesh-controller/internal/outward 1.086s
ok github.com/novox/mesh-controller/internal/overlay 1.070s
ok github.com/novox/mesh-controller/internal/secrets 1.547s
ok github.com/novox/mesh-controller/internal/store 3.460s
ok github.com/novox/mesh-controller/internal/testbus 1.252s
ok github.com/novox/mesh-controller/internal/token 1.016s
store tests, each run against the store:
./cmd/mesh-controller --- PASS: TestAStopWithoutAMergeWalksTheOthersAgain (0.21s)
./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.24s)
./cmd/mesh-controller --- PASS: TestTheConditionsVerbReadsTheLooksTheBucketNoLongerHolds (0.13s)
./cmd/mesh-controller --- PASS: TestAWalkLetGoAndStoppedByVerbsIsSaidStartedAndEnded (0.26s)
./cmd/mesh-controller --- PASS: TestAWalkStoppedOrClosedByAPersonIsSaidEndedStopped (0.25s)
./cmd/mesh-controller --- PASS: TestAWalkRetriedByAPersonIsSaidStartedAgain (0.20s)
./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.20s)
./cmd/mesh-controller --- PASS: TestAnUnassignThatLeavesItsNodeUnresolvedSaysSoOnceInItsAnswer (0.20s)
./cmd/mesh-controller --- PASS: TestAnUnassignThatLeavesItsNodeResolvedSaysNothingOfIt (0.20s)
./cmd/mesh-controller --- PASS: TestAnAssignThatLeavesItsNodeUnresolvedSaysOnlyThePlansRefusal (0.21s)
./cmd/mesh-controller --- PASS: TestADirectoryOwnersKeyIsRefusedThroughAVerb (0.24s)
./cmd/mesh-controller --- PASS: TestTheSendMakesNoValueForAnOutsideSecretNobodyGave (0.29s)
./cmd/mesh-controller --- PASS: TestAQuestionComposesWithoutAnOutsideSecretNobodyGave (0.27s)
./cmd/mesh-controller --- PASS: TestReplay201 (0.16s)
./cmd/mesh-controller --- PASS: TestARollbackWhoseSendWasRefusedIsCompletedByTheNextSend (0.15s)
./cmd/mesh-controller --- PASS: TestAGateJudgesTheOtherMovesBesideAKeptCore (0.16s)
./cmd/mesh-controller --- PASS: TestReplay401 (0.28s)
./cmd/mesh-controller --- PASS: TestReplay201ThePlansSend (0.23s)
./cmd/mesh-controller --- PASS: TestPlanAndNodeListAnOptionalRequirementLeftUnbound (0.29s)
./cmd/mesh-controller --- PASS: TestReplay340 (0.25s)
./cmd/mesh-controller --- PASS: TestOnlyATrustedFilesNamedKeyIsRefusedThroughAVerb (0.21s)
./cmd/mesh-controller --- PASS: TestReplay349 (0.21s)
./cmd/mesh-controller --- PASS: TestReplay348AFaultFromBeforeTheSendFailsNoGate (0.18s)
./cmd/mesh-controller --- PASS: TestReplay239AModuleNameIsNotTakenOverByAnotherRepository (0.16s)
./cmd/mesh-controller --- PASS: TestAWalkThatMovedNothingSaysWhichModulesMatchedWhatRuns (0.19s)
./cmd/mesh-controller --- PASS: TestReplay614ANewSDKPlansTheToolchainAndThenItsBundles (0.08s)
./cmd/mesh-controller --- PASS: TestOneAcceptForAProviderIsPlacedForEveryConsumer (0.46s)
./cmd/mesh-controller --- PASS: TestReplay164 (0.28s)
./internal/inventory --- PASS: TestTheLastSendSaysWhatTheMachineAnswered (0.08s)
./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.07s)
./internal/inventory --- PASS: TestAWalksStartIsKeptAndARefusedSaveLeavesItUnsaid (0.07s)
./internal/inventory --- PASS: TestAWalksRestIsReadFromEachMachinesOwnSend (0.07s)
./internal/inventory --- PASS: TestAStoredBuildWithASilentMergeableFileIsStillReadAndComposed (0.07s)
./internal/inventory --- PASS: TestACredentialIssuedOutsideIsNeverMade (0.09s)
./internal/inventory --- PASS: TestOneAcceptForAProviderIsSealedToEveryConsumer (0.09s)
./internal/inventory --- PASS: TestASharedOwnSecretIssuedOutsideIsNeverMade (0.08s)
Out of date when it landed: out of date: judged against trunk 8ddf8b7005, the trunk is now 9f3aa91e812b; judged again on a recheck or when it is merged
**Merge check** at `5b014e75`
Judged: head `5b014e75b7d5` merged into trunk `8ddf8b700558`; read beside it: mesh-catalog `9c166398f204`, mesh-controller-main `8ddf8b700558`, mesh-host `0e92ef3d1b21`, mesh-tools `954e1a53eef9`
- `mesh/merge-gate`: **PASS** — every machine composes with the change as it did without (4 of 4 compose) (run 3) (modules: build-agent, mesh-controller, route-proxy)
- `mesh/repo-check`: **PASS** — its merge-check.sh passed (run 3)
**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-1791912326769990180` (`builds --log build-1791912326769990180`).
```
restarted: handed out 3 times; an earlier hand-out did not finish here, so this run started from the beginning
--- 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-13T17:25:03Z 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-13T17:25:03Z
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 180.812s
ok github.com/novox/mesh-controller/examples/objectstore-provisioner 1.045s
ok github.com/novox/mesh-controller/examples/postgres-provisioner 1.067s
ok github.com/novox/mesh-controller/examples/redis-provisioner 1.037s
ok github.com/novox/mesh-controller/examples/route-proxy 1.204s
ok github.com/novox/mesh-controller/internal/artifacts 1.088s
? github.com/novox/mesh-controller/internal/beside [no test files]
ok github.com/novox/mesh-controller/internal/broker 4.483s
ok github.com/novox/mesh-controller/internal/builder 46.191s
ok github.com/novox/mesh-controller/internal/catalogue 8.594s
ok github.com/novox/mesh-controller/internal/conditions 2.680s
ok github.com/novox/mesh-controller/internal/envfile 1.052s
ok github.com/novox/mesh-controller/internal/facts 1.057s
ok github.com/novox/mesh-controller/internal/identity 5.168s
ok github.com/novox/mesh-controller/internal/inventory 41.787s
ok github.com/novox/mesh-controller/internal/lease 17.724s
ok github.com/novox/mesh-controller/internal/licences 4.129s
ok github.com/novox/mesh-controller/internal/licences/adapters 1.038s
ok github.com/novox/mesh-controller/internal/link 62.125s
ok github.com/novox/mesh-controller/internal/lint 2.488s
ok github.com/novox/mesh-controller/internal/outward 1.086s
ok github.com/novox/mesh-controller/internal/overlay 1.070s
ok github.com/novox/mesh-controller/internal/secrets 1.547s
ok github.com/novox/mesh-controller/internal/store 3.460s
ok github.com/novox/mesh-controller/internal/testbus 1.252s
ok github.com/novox/mesh-controller/internal/token 1.016s
store tests, each run against the store:
./cmd/mesh-controller --- PASS: TestAStopWithoutAMergeWalksTheOthersAgain (0.21s)
./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.24s)
./cmd/mesh-controller --- PASS: TestTheConditionsVerbReadsTheLooksTheBucketNoLongerHolds (0.13s)
./cmd/mesh-controller --- PASS: TestAWalkLetGoAndStoppedByVerbsIsSaidStartedAndEnded (0.26s)
./cmd/mesh-controller --- PASS: TestAWalkStoppedOrClosedByAPersonIsSaidEndedStopped (0.25s)
./cmd/mesh-controller --- PASS: TestAWalkRetriedByAPersonIsSaidStartedAgain (0.20s)
./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.20s)
./cmd/mesh-controller --- PASS: TestAnUnassignThatLeavesItsNodeUnresolvedSaysSoOnceInItsAnswer (0.20s)
./cmd/mesh-controller --- PASS: TestAnUnassignThatLeavesItsNodeResolvedSaysNothingOfIt (0.20s)
./cmd/mesh-controller --- PASS: TestAnAssignThatLeavesItsNodeUnresolvedSaysOnlyThePlansRefusal (0.21s)
./cmd/mesh-controller --- PASS: TestADirectoryOwnersKeyIsRefusedThroughAVerb (0.24s)
./cmd/mesh-controller --- PASS: TestTheSendMakesNoValueForAnOutsideSecretNobodyGave (0.29s)
./cmd/mesh-controller --- PASS: TestAQuestionComposesWithoutAnOutsideSecretNobodyGave (0.27s)
./cmd/mesh-controller --- PASS: TestReplay201 (0.16s)
./cmd/mesh-controller --- PASS: TestARollbackWhoseSendWasRefusedIsCompletedByTheNextSend (0.15s)
./cmd/mesh-controller --- PASS: TestAGateJudgesTheOtherMovesBesideAKeptCore (0.16s)
./cmd/mesh-controller --- PASS: TestReplay401 (0.28s)
./cmd/mesh-controller --- PASS: TestReplay201ThePlansSend (0.23s)
./cmd/mesh-controller --- PASS: TestPlanAndNodeListAnOptionalRequirementLeftUnbound (0.29s)
./cmd/mesh-controller --- PASS: TestReplay340 (0.25s)
./cmd/mesh-controller --- PASS: TestOnlyATrustedFilesNamedKeyIsRefusedThroughAVerb (0.21s)
./cmd/mesh-controller --- PASS: TestReplay349 (0.21s)
./cmd/mesh-controller --- PASS: TestReplay348AFaultFromBeforeTheSendFailsNoGate (0.18s)
./cmd/mesh-controller --- PASS: TestReplay239AModuleNameIsNotTakenOverByAnotherRepository (0.16s)
./cmd/mesh-controller --- PASS: TestAWalkThatMovedNothingSaysWhichModulesMatchedWhatRuns (0.19s)
./cmd/mesh-controller --- PASS: TestReplay614ANewSDKPlansTheToolchainAndThenItsBundles (0.08s)
./cmd/mesh-controller --- PASS: TestOneAcceptForAProviderIsPlacedForEveryConsumer (0.46s)
./cmd/mesh-controller --- PASS: TestReplay164 (0.28s)
./internal/inventory --- PASS: TestTheLastSendSaysWhatTheMachineAnswered (0.08s)
./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.07s)
./internal/inventory --- PASS: TestAWalksStartIsKeptAndARefusedSaveLeavesItUnsaid (0.07s)
./internal/inventory --- PASS: TestAWalksRestIsReadFromEachMachinesOwnSend (0.07s)
./internal/inventory --- PASS: TestAStoredBuildWithASilentMergeableFileIsStillReadAndComposed (0.07s)
./internal/inventory --- PASS: TestACredentialIssuedOutsideIsNeverMade (0.09s)
./internal/inventory --- PASS: TestOneAcceptForAProviderIsSealedToEveryConsumer (0.09s)
./internal/inventory --- PASS: TestASharedOwnSecretIssuedOutsideIsNeverMade (0.08s)
```
**Out of date when it landed**: out of date: judged against trunk 8ddf8b700558, the trunk is now 9f3aa91e812b; judged again on a recheck or when it is merged
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
read by no module's build: cmd/mesh-controller/proposals_test.go, cmd/mesh-controller/settings_walk_test.go, internal/outward/outward_test.go, testdata/beside/CAPTURED
Run by the build seat on novox as build-1791913248258955138 (builds --log build-1791913248258955138).
--- 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-13T17:37:27Z 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-13T17:37:27Z
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
notes:
- cmd/mesh-controller/proposals_test.go, cmd/mesh-controller/settings_walk_test.go, internal/outward/outward_test.go and testdata/beside/CAPTURED 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.081s
ok github.com/novox/mesh-controller/cmd/mesh-controller 211.740s
ok github.com/novox/mesh-controller/examples/objectstore-provisioner 1.020s
ok github.com/novox/mesh-controller/examples/postgres-provisioner 1.036s
ok github.com/novox/mesh-controller/examples/redis-provisioner 1.023s
ok github.com/novox/mesh-controller/examples/route-proxy 1.239s
ok github.com/novox/mesh-controller/internal/artifacts 1.067s
? github.com/novox/mesh-controller/internal/beside [no test files]
ok github.com/novox/mesh-controller/internal/broker 6.556s
ok github.com/novox/mesh-controller/internal/builder 51.382s
ok github.com/novox/mesh-controller/internal/catalogue 9.689s
ok github.com/novox/mesh-controller/internal/conditions 4.649s
ok github.com/novox/mesh-controller/internal/envfile 1.122s
ok github.com/novox/mesh-controller/internal/facts 1.032s
ok github.com/novox/mesh-controller/internal/identity 7.462s
ok github.com/novox/mesh-controller/internal/inventory 45.348s
ok github.com/novox/mesh-controller/internal/lease 17.636s
ok github.com/novox/mesh-controller/internal/licences 6.228s
ok github.com/novox/mesh-controller/internal/licences/adapters 1.026s
ok github.com/novox/mesh-controller/internal/link 62.943s
ok github.com/novox/mesh-controller/internal/lint 2.684s
ok github.com/novox/mesh-controller/internal/outward 1.051s
ok github.com/novox/mesh-controller/internal/overlay 1.028s
ok github.com/novox/mesh-controller/internal/secrets 1.523s
ok github.com/novox/mesh-controller/internal/store 3.843s
ok github.com/novox/mesh-controller/internal/testbus 1.255s
ok github.com/novox/mesh-controller/internal/token 1.018s
store tests, each run against the store:
./cmd/mesh-controller --- PASS: TestAStopWithoutAMergeWalksTheOthersAgain (0.51s)
./cmd/mesh-controller --- PASS: TestAStopWithoutAMergeEndsTheMergesThatContainIt (0.35s)
./cmd/mesh-controller --- PASS: TestAStopWalksTheOthersAgainInTheOpenBatch (0.34s)
./cmd/mesh-controller --- PASS: TestAStopNamesWhatStaysOnTheMachinesAndWhatStillCarriesIt (0.23s)
./cmd/mesh-controller --- PASS: TestAStopWithoutAMergeLeavesItOutOfABatch (0.22s)
./cmd/mesh-controller --- PASS: TestSavingPlansAndMovingMergesIsOneAct (0.22s)
./cmd/mesh-controller --- PASS: TestAPlanFollowedFromTheStoreAnswersWhenItMoves (2.10s)
./cmd/mesh-controller --- PASS: TestNodeShowAndStatusReadTheLastSendFromTheStore (0.27s)
./cmd/mesh-controller --- PASS: TestTheConditionsVerbReadsTheLooksTheBucketNoLongerHolds (0.21s)
./cmd/mesh-controller --- PASS: TestAWalkLetGoAndStoppedByVerbsIsSaidStartedAndEnded (0.29s)
./cmd/mesh-controller --- PASS: TestAWalkStoppedOrClosedByAPersonIsSaidEndedStopped (0.28s)
./cmd/mesh-controller --- PASS: TestAWalkRetriedByAPersonIsSaidStartedAgain (0.22s)
./cmd/mesh-controller --- PASS: TestABacklogReleasedByAPersonIsSaidStarted (0.35s)
./cmd/mesh-controller --- PASS: TestAWalkEndedByCancelOrClearIsSaidEnded (0.32s)
./cmd/mesh-controller --- PASS: TestAWalkRestartedByARebuildIsSaidStarted (0.25s)
./cmd/mesh-controller --- PASS: TestAWalkStoppedByHandAndRetriedEndsFailedWhenItFailsAgain (0.38s)
./cmd/mesh-controller --- PASS: TestReplay237 (0.23s)
./cmd/mesh-controller --- PASS: TestAnUnassignThatLeavesItsNodeUnresolvedSaysSoOnceInItsAnswer (0.23s)
./cmd/mesh-controller --- PASS: TestAnUnassignThatLeavesItsNodeResolvedSaysNothingOfIt (0.25s)
./cmd/mesh-controller --- PASS: TestAnAssignThatLeavesItsNodeUnresolvedSaysOnlyThePlansRefusal (0.23s)
./cmd/mesh-controller --- PASS: TestADirectoryOwnersKeyIsRefusedThroughAVerb (0.27s)
./cmd/mesh-controller --- PASS: TestTheSendMakesNoValueForAnOutsideSecretNobodyGave (0.33s)
./cmd/mesh-controller --- PASS: TestAQuestionComposesWithoutAnOutsideSecretNobodyGave (0.32s)
./cmd/mesh-controller --- PASS: TestReplay201 (0.18s)
./cmd/mesh-controller --- PASS: TestARollbackWhoseSendWasRefusedIsCompletedByTheNextSend (0.23s)
./cmd/mesh-controller --- PASS: TestAGateJudgesTheOtherMovesBesideAKeptCore (0.71s)
./cmd/mesh-controller --- PASS: TestReplay401 (0.33s)
./cmd/mesh-controller --- PASS: TestReplay201ThePlansSend (0.28s)
./cmd/mesh-controller --- PASS: TestPlanAndNodeListAnOptionalRequirementLeftUnbound (0.33s)
./cmd/mesh-controller --- PASS: TestReplay340 (0.27s)
./cmd/mesh-controller --- PASS: TestOnlyATrustedFilesNamedKeyIsRefusedThroughAVerb (0.31s)
./cmd/mesh-controller --- PASS: TestReplay349 (0.23s)
./cmd/mesh-controller --- PASS: TestReplay348AFaultFromBeforeTheSendFailsNoGate (0.19s)
./cmd/mesh-controller --- PASS: TestReplay239AModuleNameIsNotTakenOverByAnotherRepository (0.17s)
./cmd/mesh-controller --- PASS: TestAWalkThatMovedNothingSaysWhichModulesMatchedWhatRuns (0.27s)
./cmd/mesh-controller --- PASS: TestReplay614ANewSDKPlansTheToolchainAndThenItsBundles (0.08s)
./cmd/mesh-controller --- PASS: TestOneAcceptForAProviderIsPlacedForEveryConsumer (0.57s)
./cmd/mesh-controller --- PASS: TestReplay164 (0.44s)
./cmd/mesh-controller --- PASS: TestAnApprovedLayerOpensTheWalkThatSendsIt (0.22s)
./cmd/mesh-controller --- PASS: TestASettingsWalkSendsOneMachineAtATimeEachJudged (0.22s)
./cmd/mesh-controller --- PASS: TestAFailedSettingsWalkStopsAndHoldsNothingBack (0.21s)
./cmd/mesh-controller --- PASS: TestASettingsWalkSendsTheLayerAloneEveryBuildKept (0.21s)
./cmd/mesh-controller --- PASS: TestASettingsWalkStopsBeforeADataMoveAndPassesOverAMachineAway (0.60s)
./cmd/mesh-controller --- PASS: TestACrossingSendSupersedesASettingsGate (0.20s)
./cmd/mesh-controller --- PASS: TestASettingsWalkFailsOnARefusalThatCannotClear (0.19s)
./internal/inventory --- PASS: TestTheLastSendSaysWhatTheMachineAnswered (0.10s)
./internal/inventory --- PASS: TestAReportIsTheLastSendsAnswerOnlyWhenItIsAboutThatSend (0.11s)
./internal/inventory --- PASS: TestAnIssuedValueIsSealedToEveryHolderOnceAndNotAgain (0.11s)
./internal/inventory --- PASS: TestAnIssuedValueIsSealedAgainAfterAKeyChangeOrAnAcceptance (0.14s)
./internal/inventory --- PASS: TestAConditionsLooksAreKeptBesideTheBucket (0.09s)
./internal/inventory --- PASS: TestAPlanIdHoldingAQuoteIsReadAsAPlainId (0.09s)
./internal/inventory --- PASS: TestAWalksStartIsKeptAndARefusedSaveLeavesItUnsaid (0.15s)
./internal/inventory --- PASS: TestAWalksRestIsReadFromEachMachinesOwnSend (0.09s)
./internal/inventory --- PASS: TestAStoredBuildWithASilentMergeableFileIsStillReadAndComposed (0.09s)
./internal/inventory --- PASS: TestACredentialIssuedOutsideIsNeverMade (0.09s)
./internal/inventory --- PASS: TestOneAcceptForAProviderIsSealedToEveryConsumer (0.09s)
./internal/inventory --- PASS: TestASharedOwnSecretIssuedOutsideIsNeverMade (0.09s)
**Merge check** at `5b014e75`
Judged: head `5b014e75b7d5` merged into trunk `9f3aa91e812b`; read beside it: mesh-catalog `9c166398f204`, mesh-controller-main `9f3aa91e812b`, mesh-host `0e92ef3d1b21`, 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
- read by no module's build: cmd/mesh-controller/proposals_test.go, cmd/mesh-controller/settings_walk_test.go, internal/outward/outward_test.go, testdata/beside/CAPTURED
Run by the build seat on novox as `build-1791913248258955138` (`builds --log build-1791913248258955138`).
```
--- 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-13T17:37:27Z 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-13T17:37:27Z
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
notes:
- cmd/mesh-controller/proposals_test.go, cmd/mesh-controller/settings_walk_test.go, internal/outward/outward_test.go and testdata/beside/CAPTURED 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.081s
ok github.com/novox/mesh-controller/cmd/mesh-controller 211.740s
ok github.com/novox/mesh-controller/examples/objectstore-provisioner 1.020s
ok github.com/novox/mesh-controller/examples/postgres-provisioner 1.036s
ok github.com/novox/mesh-controller/examples/redis-provisioner 1.023s
ok github.com/novox/mesh-controller/examples/route-proxy 1.239s
ok github.com/novox/mesh-controller/internal/artifacts 1.067s
? github.com/novox/mesh-controller/internal/beside [no test files]
ok github.com/novox/mesh-controller/internal/broker 6.556s
ok github.com/novox/mesh-controller/internal/builder 51.382s
ok github.com/novox/mesh-controller/internal/catalogue 9.689s
ok github.com/novox/mesh-controller/internal/conditions 4.649s
ok github.com/novox/mesh-controller/internal/envfile 1.122s
ok github.com/novox/mesh-controller/internal/facts 1.032s
ok github.com/novox/mesh-controller/internal/identity 7.462s
ok github.com/novox/mesh-controller/internal/inventory 45.348s
ok github.com/novox/mesh-controller/internal/lease 17.636s
ok github.com/novox/mesh-controller/internal/licences 6.228s
ok github.com/novox/mesh-controller/internal/licences/adapters 1.026s
ok github.com/novox/mesh-controller/internal/link 62.943s
ok github.com/novox/mesh-controller/internal/lint 2.684s
ok github.com/novox/mesh-controller/internal/outward 1.051s
ok github.com/novox/mesh-controller/internal/overlay 1.028s
ok github.com/novox/mesh-controller/internal/secrets 1.523s
ok github.com/novox/mesh-controller/internal/store 3.843s
ok github.com/novox/mesh-controller/internal/testbus 1.255s
ok github.com/novox/mesh-controller/internal/token 1.018s
store tests, each run against the store:
./cmd/mesh-controller --- PASS: TestAStopWithoutAMergeWalksTheOthersAgain (0.51s)
./cmd/mesh-controller --- PASS: TestAStopWithoutAMergeEndsTheMergesThatContainIt (0.35s)
./cmd/mesh-controller --- PASS: TestAStopWalksTheOthersAgainInTheOpenBatch (0.34s)
./cmd/mesh-controller --- PASS: TestAStopNamesWhatStaysOnTheMachinesAndWhatStillCarriesIt (0.23s)
./cmd/mesh-controller --- PASS: TestAStopWithoutAMergeLeavesItOutOfABatch (0.22s)
./cmd/mesh-controller --- PASS: TestSavingPlansAndMovingMergesIsOneAct (0.22s)
./cmd/mesh-controller --- PASS: TestAPlanFollowedFromTheStoreAnswersWhenItMoves (2.10s)
./cmd/mesh-controller --- PASS: TestNodeShowAndStatusReadTheLastSendFromTheStore (0.27s)
./cmd/mesh-controller --- PASS: TestTheConditionsVerbReadsTheLooksTheBucketNoLongerHolds (0.21s)
./cmd/mesh-controller --- PASS: TestAWalkLetGoAndStoppedByVerbsIsSaidStartedAndEnded (0.29s)
./cmd/mesh-controller --- PASS: TestAWalkStoppedOrClosedByAPersonIsSaidEndedStopped (0.28s)
./cmd/mesh-controller --- PASS: TestAWalkRetriedByAPersonIsSaidStartedAgain (0.22s)
./cmd/mesh-controller --- PASS: TestABacklogReleasedByAPersonIsSaidStarted (0.35s)
./cmd/mesh-controller --- PASS: TestAWalkEndedByCancelOrClearIsSaidEnded (0.32s)
./cmd/mesh-controller --- PASS: TestAWalkRestartedByARebuildIsSaidStarted (0.25s)
./cmd/mesh-controller --- PASS: TestAWalkStoppedByHandAndRetriedEndsFailedWhenItFailsAgain (0.38s)
./cmd/mesh-controller --- PASS: TestReplay237 (0.23s)
./cmd/mesh-controller --- PASS: TestAnUnassignThatLeavesItsNodeUnresolvedSaysSoOnceInItsAnswer (0.23s)
./cmd/mesh-controller --- PASS: TestAnUnassignThatLeavesItsNodeResolvedSaysNothingOfIt (0.25s)
./cmd/mesh-controller --- PASS: TestAnAssignThatLeavesItsNodeUnresolvedSaysOnlyThePlansRefusal (0.23s)
./cmd/mesh-controller --- PASS: TestADirectoryOwnersKeyIsRefusedThroughAVerb (0.27s)
./cmd/mesh-controller --- PASS: TestTheSendMakesNoValueForAnOutsideSecretNobodyGave (0.33s)
./cmd/mesh-controller --- PASS: TestAQuestionComposesWithoutAnOutsideSecretNobodyGave (0.32s)
./cmd/mesh-controller --- PASS: TestReplay201 (0.18s)
./cmd/mesh-controller --- PASS: TestARollbackWhoseSendWasRefusedIsCompletedByTheNextSend (0.23s)
./cmd/mesh-controller --- PASS: TestAGateJudgesTheOtherMovesBesideAKeptCore (0.71s)
./cmd/mesh-controller --- PASS: TestReplay401 (0.33s)
./cmd/mesh-controller --- PASS: TestReplay201ThePlansSend (0.28s)
./cmd/mesh-controller --- PASS: TestPlanAndNodeListAnOptionalRequirementLeftUnbound (0.33s)
./cmd/mesh-controller --- PASS: TestReplay340 (0.27s)
./cmd/mesh-controller --- PASS: TestOnlyATrustedFilesNamedKeyIsRefusedThroughAVerb (0.31s)
./cmd/mesh-controller --- PASS: TestReplay349 (0.23s)
./cmd/mesh-controller --- PASS: TestReplay348AFaultFromBeforeTheSendFailsNoGate (0.19s)
./cmd/mesh-controller --- PASS: TestReplay239AModuleNameIsNotTakenOverByAnotherRepository (0.17s)
./cmd/mesh-controller --- PASS: TestAWalkThatMovedNothingSaysWhichModulesMatchedWhatRuns (0.27s)
./cmd/mesh-controller --- PASS: TestReplay614ANewSDKPlansTheToolchainAndThenItsBundles (0.08s)
./cmd/mesh-controller --- PASS: TestOneAcceptForAProviderIsPlacedForEveryConsumer (0.57s)
./cmd/mesh-controller --- PASS: TestReplay164 (0.44s)
./cmd/mesh-controller --- PASS: TestAnApprovedLayerOpensTheWalkThatSendsIt (0.22s)
./cmd/mesh-controller --- PASS: TestASettingsWalkSendsOneMachineAtATimeEachJudged (0.22s)
./cmd/mesh-controller --- PASS: TestAFailedSettingsWalkStopsAndHoldsNothingBack (0.21s)
./cmd/mesh-controller --- PASS: TestASettingsWalkSendsTheLayerAloneEveryBuildKept (0.21s)
./cmd/mesh-controller --- PASS: TestASettingsWalkStopsBeforeADataMoveAndPassesOverAMachineAway (0.60s)
./cmd/mesh-controller --- PASS: TestACrossingSendSupersedesASettingsGate (0.20s)
./cmd/mesh-controller --- PASS: TestASettingsWalkFailsOnARefusalThatCannotClear (0.19s)
./internal/inventory --- PASS: TestTheLastSendSaysWhatTheMachineAnswered (0.10s)
./internal/inventory --- PASS: TestAReportIsTheLastSendsAnswerOnlyWhenItIsAboutThatSend (0.11s)
./internal/inventory --- PASS: TestAnIssuedValueIsSealedToEveryHolderOnceAndNotAgain (0.11s)
./internal/inventory --- PASS: TestAnIssuedValueIsSealedAgainAfterAKeyChangeOrAnAcceptance (0.14s)
./internal/inventory --- PASS: TestAConditionsLooksAreKeptBesideTheBucket (0.09s)
./internal/inventory --- PASS: TestAPlanIdHoldingAQuoteIsReadAsAPlainId (0.09s)
./internal/inventory --- PASS: TestAWalksStartIsKeptAndARefusedSaveLeavesItUnsaid (0.15s)
./internal/inventory --- PASS: TestAWalksRestIsReadFromEachMachinesOwnSend (0.09s)
./internal/inventory --- PASS: TestAStoredBuildWithASilentMergeableFileIsStillReadAndComposed (0.09s)
./internal/inventory --- PASS: TestACredentialIssuedOutsideIsNeverMade (0.09s)
./internal/inventory --- PASS: TestOneAcceptForAProviderIsSealedToEveryConsumer (0.09s)
./internal/inventory --- PASS: TestASharedOwnSecretIssuedOutsideIsNeverMade (0.09s)
```
Independent review of the issue 383/639 group under ADR 0345 and ADR 0347.
Blocking: a key past the second is never checked at propose, so its value can be unreadable before Approve. propose holds only Headline, Explanation, OnExpiry and the options to outward.Check (cmd/mesh-controller/proposals.go:502-510), and only q.Whole to outward.Secret (:512). The key lines past the second are only in Details and WholeDetails (:177-198), which are checked by nothing here. Before this change, those lines were in the explanation, and a line such as "+ password: hunter2" was refused at once, in words. That still happens when the key is the first or second. I probed it at this head with a throwaway test:
Values {a:1, b:2, c:3, password:hunter2}: propose succeeds. Details hold "+ password: hunter2", which fails the content rule (reAssigned, "a value given to a secret's name"), and WholeDetails is empty because no value is masked. The router (messenger holder.go:899) then replaces that line with "(a line carrying secret is withheld here)" on every channel, Telegram included. The operator never reads that key's value, and the note does not even name the key, while the glance says "and 2 more, each in the note: c, password". This breaks ADR 0347 §1 and §3 (every key named, the value masked or withheld under its key) and §4 (the marker promises no more than the note holds). Approve still sets hunter2.
Values {a:1, b:/mnt/x, c:3, password:hunter2}: propose succeeds, WholeDetails carries "+ password: hunter2", and the router's TakeAsk (messenger asks.go:494) refuses the whole ask on CheckSecret. That fails closed, but at the router rather than at propose's own check.
The value "hunter2" passes sayableValue and wholeValue because the secret's shape is the key and value together, not the value alone. Fix: hold every line of q.Details to outward.Check and every line of q.WholeDetails to outward.Secret at propose, and refuse in words as for the explanation. Better still, mask per line, so a secret-named key shows "+ password: ‹withheld›" in both, and name it in the Details line as ADR 0347 §2 says. Add a case with a secret-named key past the second to TestEveryKeyAndItsWholeValueReachTheOperator.
Checked and fine:
(1) Five keys, one 300-character value: every key and its whole value are in Whole+WholeDetails, and every key is masked in Details. The cut point is exactly 160 characters with its marker inside. "whole in the note" appears only in the whole glance and "in the note" in the masked one, as ADR 0347 §4 says.
(4) No "next push" wording is left in the ask. The only push left is the ADR 0344 error path when a walk cannot be opened (proposals.go:891), which belongs to #305 and is not a promise in the ask.
The vendored asks.go is identical to mesh-sdk f4745447.
Tests: go test ./cmd/mesh-controller/ ./internal/outward/ pass at the head (run niced). The new tests fail on main (build: asks.Glance, outward.Secret) and on fffafac, the earlier-review head (build: no WholeDetails).
Statuses at this head: mesh/merge-gate success ("head 5b014e75b7 merged into trunk 9f3aa91e81, pass"), mesh/repo-check success, mesh/delivery success ("ready: it delivers once merged"), mesh/delivery-group success ("group fix/383-an-ask-reads-at-a-glance ready: every member ready, and composed together they pass").
Note: mesh-sdk #25 is asked to change its digest encoding. This PR will need to re-vendor that head and update testdata/beside/CAPTURED.
Verdict: request changes at 5b014e75b7d5a228c23a1c769fe7124d1a1a7bc2
Independent review of the issue 383/639 group under ADR 0345 and ADR 0347.
Blocking: a key past the second is never checked at propose, so its value can be unreadable before Approve. propose holds only Headline, Explanation, OnExpiry and the options to outward.Check (cmd/mesh-controller/proposals.go:502-510), and only q.Whole to outward.Secret (:512). The key lines past the second are only in Details and WholeDetails (:177-198), which are checked by nothing here. Before this change, those lines were in the explanation, and a line such as "+ password: hunter2" was refused at once, in words. That still happens when the key is the first or second. I probed it at this head with a throwaway test:
- Values {a:1, b:2, c:3, password:hunter2}: propose succeeds. Details hold "+ password: hunter2", which fails the content rule (reAssigned, "a value given to a secret's name"), and WholeDetails is empty because no value is masked. The router (messenger holder.go:899) then replaces that line with "(a line carrying secret is withheld here)" on every channel, Telegram included. The operator never reads that key's value, and the note does not even name the key, while the glance says "and 2 more, each in the note: c, password". This breaks ADR 0347 §1 and §3 (every key named, the value masked or withheld under its key) and §4 (the marker promises no more than the note holds). Approve still sets hunter2.
- Values {a:1, b:/mnt/x, c:3, password:hunter2}: propose succeeds, WholeDetails carries "+ password: hunter2", and the router's TakeAsk (messenger asks.go:494) refuses the whole ask on CheckSecret. That fails closed, but at the router rather than at propose's own check.
The value "hunter2" passes sayableValue and wholeValue because the secret's shape is the key and value together, not the value alone. Fix: hold every line of q.Details to outward.Check and every line of q.WholeDetails to outward.Secret at propose, and refuse in words as for the explanation. Better still, mask per line, so a secret-named key shows "+ password: ‹withheld›" in both, and name it in the Details line as ADR 0347 §2 says. Add a case with a secret-named key past the second to TestEveryKeyAndItsWholeValueReachTheOperator.
Checked and fine:
- (1) Five keys, one 300-character value: every key and its whole value are in Whole+WholeDetails, and every key is masked in Details. The cut point is exactly 160 characters with its marker inside. "whole in the note" appears only in the whole glance and "in the note" in the masked one, as ADR 0347 §4 says.
- (4) No "next push" wording is left in the ask. The only `push` left is the ADR 0344 error path when a walk cannot be opened (proposals.go:891), which belongs to #305 and is not a promise in the ask.
- The vendored asks.go is identical to mesh-sdk f4745447.
- Tests: `go test ./cmd/mesh-controller/ ./internal/outward/` pass at the head (run niced). The new tests fail on main (build: asks.Glance, outward.Secret) and on fffafac, the earlier-review head (build: no WholeDetails).
Statuses at this head: mesh/merge-gate success ("head 5b014e75b7d5 merged into trunk 9f3aa91e812b, pass"), mesh/repo-check success, mesh/delivery success ("ready: it delivers once merged"), mesh/delivery-group success ("group fix/383-an-ask-reads-at-a-glance ready: every member ready, and composed together they pass").
Note: mesh-sdk #25 is asked to change its digest encoding. This PR will need to re-vendor that head and update testdata/beside/CAPTURED.
New head dd89b6e800 answers review 225, rebased on main 9f3aa91. Each change line is now judged the way the router judges it: masked lines under the content rule, whole lines under the secret rule. A refused line becomes + <key> (value withheld), so the key is still named. A line the router would still refuse is refused at propose, in the controller's own words (judgeLines over Details and WholeDetails); a key shaped like a secret is never echoed. New tests: TestASecretNamedKeyIsNamedAndItsValueWithheld ({a:1, b:2, c:3, password:hunter2}: hunter2 appears nowhere, + password (value withheld) is in both details forms, nothing the router would withhold or refuse is left; a key shaped like a secret is refused at propose) and TestARefusalNamesTheKeyAndNeverASecret. Re-pinned to mesh-sdk 5933eb7: go.mod, vendor and testdata/beside/CAPTURED. Local merge-check.sh passed.
New head dd89b6e800ea answers review 225, rebased on main 9f3aa91. Each change line is now judged the way the router judges it: masked lines under the content rule, whole lines under the secret rule. A refused line becomes `+ <key> (value withheld)`, so the key is still named. A line the router would still refuse is refused at propose, in the controller's own words (`judgeLines` over Details and WholeDetails); a key shaped like a secret is never echoed. New tests: `TestASecretNamedKeyIsNamedAndItsValueWithheld` ({a:1, b:2, c:3, password:hunter2}: hunter2 appears nowhere, `+ password (value withheld)` is in both details forms, nothing the router would withhold or refuse is left; a key shaped like a secret is refused at propose) and `TestARefusalNamesTheKeyAndNeverASecret`. Re-pinned to mesh-sdk 5933eb7: go.mod, vendor and testdata/beside/CAPTURED. Local merge-check.sh passed.
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
read by no module's build: cmd/mesh-controller/proposals_test.go, cmd/mesh-controller/settings_walk_test.go, internal/outward/outward_test.go, testdata/beside/CAPTURED
Run by the build seat on shanks as build-1791916377675647477 (builds --log build-1791916377675647477).
--- 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-13T17:37:27Z 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-13T17:37:27Z
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
notes:
- cmd/mesh-controller/proposals_test.go, cmd/mesh-controller/settings_walk_test.go, internal/outward/outward_test.go and testdata/beside/CAPTURED 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.052s
ok github.com/novox/mesh-controller/cmd/mesh-controller 179.460s
ok github.com/novox/mesh-controller/examples/objectstore-provisioner 1.030s
ok github.com/novox/mesh-controller/examples/postgres-provisioner 1.054s
ok github.com/novox/mesh-controller/examples/redis-provisioner 1.034s
ok github.com/novox/mesh-controller/examples/route-proxy 1.198s
ok github.com/novox/mesh-controller/internal/artifacts 1.093s
? github.com/novox/mesh-controller/internal/beside [no test files]
ok github.com/novox/mesh-controller/internal/broker 4.503s
ok github.com/novox/mesh-controller/internal/builder 41.651s
ok github.com/novox/mesh-controller/internal/catalogue 8.466s
ok github.com/novox/mesh-controller/internal/conditions 2.686s
ok github.com/novox/mesh-controller/internal/envfile 1.062s
ok github.com/novox/mesh-controller/internal/facts 1.065s
ok github.com/novox/mesh-controller/internal/identity 5.095s
ok github.com/novox/mesh-controller/internal/inventory 36.372s
ok github.com/novox/mesh-controller/internal/lease 17.732s
ok github.com/novox/mesh-controller/internal/licences 4.139s
ok github.com/novox/mesh-controller/internal/licences/adapters 1.059s
ok github.com/novox/mesh-controller/internal/link 59.311s
ok github.com/novox/mesh-controller/internal/lint 2.517s
ok github.com/novox/mesh-controller/internal/outward 1.098s
ok github.com/novox/mesh-controller/internal/overlay 1.082s
ok github.com/novox/mesh-controller/internal/secrets 1.553s
ok github.com/novox/mesh-controller/internal/store 3.472s
ok github.com/novox/mesh-controller/internal/testbus 1.254s
ok github.com/novox/mesh-controller/internal/token 1.017s
store tests, each run against the store:
./cmd/mesh-controller --- PASS: TestAStopWithoutAMergeWalksTheOthersAgain (0.23s)
./cmd/mesh-controller --- PASS: TestAStopWithoutAMergeEndsTheMergesThatContainIt (0.25s)
./cmd/mesh-controller --- PASS: TestAStopWalksTheOthersAgainInTheOpenBatch (0.24s)
./cmd/mesh-controller --- PASS: TestAStopNamesWhatStaysOnTheMachinesAndWhatStillCarriesIt (0.24s)
./cmd/mesh-controller --- PASS: TestAStopWithoutAMergeLeavesItOutOfABatch (0.22s)
./cmd/mesh-controller --- PASS: TestSavingPlansAndMovingMergesIsOneAct (0.18s)
./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.27s)
./cmd/mesh-controller --- PASS: TestAWalkStoppedOrClosedByAPersonIsSaidEndedStopped (0.26s)
./cmd/mesh-controller --- PASS: TestAWalkRetriedByAPersonIsSaidStartedAgain (0.22s)
./cmd/mesh-controller --- PASS: TestABacklogReleasedByAPersonIsSaidStarted (0.22s)
./cmd/mesh-controller --- PASS: TestAWalkEndedByCancelOrClearIsSaidEnded (0.28s)
./cmd/mesh-controller --- PASS: TestAWalkRestartedByARebuildIsSaidStarted (0.22s)
./cmd/mesh-controller --- PASS: TestAWalkStoppedByHandAndRetriedEndsFailedWhenItFailsAgain (0.26s)
./cmd/mesh-controller --- PASS: TestReplay237 (0.21s)
./cmd/mesh-controller --- PASS: TestAnUnassignThatLeavesItsNodeUnresolvedSaysSoOnceInItsAnswer (0.21s)
./cmd/mesh-controller --- PASS: TestAnUnassignThatLeavesItsNodeResolvedSaysNothingOfIt (0.22s)
./cmd/mesh-controller --- PASS: TestAnAssignThatLeavesItsNodeUnresolvedSaysOnlyThePlansRefusal (0.22s)
./cmd/mesh-controller --- PASS: TestADirectoryOwnersKeyIsRefusedThroughAVerb (0.24s)
./cmd/mesh-controller --- PASS: TestTheSendMakesNoValueForAnOutsideSecretNobodyGave (0.30s)
./cmd/mesh-controller --- PASS: TestAQuestionComposesWithoutAnOutsideSecretNobodyGave (0.28s)
./cmd/mesh-controller --- PASS: TestReplay201 (0.17s)
./cmd/mesh-controller --- PASS: TestARollbackWhoseSendWasRefusedIsCompletedByTheNextSend (0.16s)
./cmd/mesh-controller --- PASS: TestAGateJudgesTheOtherMovesBesideAKeptCore (0.17s)
./cmd/mesh-controller --- PASS: TestReplay401 (0.30s)
./cmd/mesh-controller --- PASS: TestReplay201ThePlansSend (0.26s)
./cmd/mesh-controller --- PASS: TestPlanAndNodeListAnOptionalRequirementLeftUnbound (0.30s)
./cmd/mesh-controller --- PASS: TestReplay340 (0.26s)
./cmd/mesh-controller --- PASS: TestOnlyATrustedFilesNamedKeyIsRefusedThroughAVerb (0.22s)
./cmd/mesh-controller --- PASS: TestReplay349 (0.22s)
./cmd/mesh-controller --- PASS: TestReplay348AFaultFromBeforeTheSendFailsNoGate (0.19s)
./cmd/mesh-controller --- PASS: TestReplay239AModuleNameIsNotTakenOverByAnotherRepository (0.16s)
./cmd/mesh-controller --- PASS: TestAWalkThatMovedNothingSaysWhichModulesMatchedWhatRuns (0.20s)
./cmd/mesh-controller --- PASS: TestReplay614ANewSDKPlansTheToolchainAndThenItsBundles (0.08s)
./cmd/mesh-controller --- PASS: TestOneAcceptForAProviderIsPlacedForEveryConsumer (0.50s)
./cmd/mesh-controller --- PASS: TestReplay164 (0.30s)
./cmd/mesh-controller --- PASS: TestAnApprovedLayerOpensTheWalkThatSendsIt (0.21s)
./cmd/mesh-controller --- PASS: TestASettingsWalkSendsOneMachineAtATimeEachJudged (0.22s)
./cmd/mesh-controller --- PASS: TestAFailedSettingsWalkStopsAndHoldsNothingBack (0.20s)
./cmd/mesh-controller --- PASS: TestASettingsWalkSendsTheLayerAloneEveryBuildKept (0.20s)
./cmd/mesh-controller --- PASS: TestASettingsWalkStopsBeforeADataMoveAndPassesOverAMachineAway (0.59s)
./cmd/mesh-controller --- PASS: TestACrossingSendSupersedesASettingsGate (0.19s)
./cmd/mesh-controller --- PASS: TestASettingsWalkFailsOnARefusalThatCannotClear (0.18s)
./internal/inventory --- PASS: TestTheLastSendSaysWhatTheMachineAnswered (0.08s)
./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.07s)
./internal/inventory --- PASS: TestAWalksStartIsKeptAndARefusedSaveLeavesItUnsaid (0.07s)
./internal/inventory --- PASS: TestAWalksRestIsReadFromEachMachinesOwnSend (0.08s)
./internal/inventory --- PASS: TestAStoredBuildWithASilentMergeableFileIsStillReadAndComposed (0.07s)
./internal/inventory --- PASS: TestACredentialIssuedOutsideIsNeverMade (0.09s)
./internal/inventory --- PASS: TestOneAcceptForAProviderIsSealedToEveryConsumer (0.09s)
./internal/inventory --- PASS: TestASharedOwnSecretIssuedOutsideIsNeverMade (0.08s)
Out of date when it landed: out of date: judged against trunk 9f3aa91e81, the trunk is now 332fbaa9b175; judged again on a recheck or when it is merged
**Merge check** at `dd89b6e8`
Judged: head `dd89b6e800ea` merged into trunk `9f3aa91e812b`; read beside it: mesh-catalog `9c166398f204`, mesh-controller-main `9f3aa91e812b`, mesh-host `0e92ef3d1b21`, 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
- read by no module's build: cmd/mesh-controller/proposals_test.go, cmd/mesh-controller/settings_walk_test.go, internal/outward/outward_test.go, testdata/beside/CAPTURED
Run by the build seat on shanks as `build-1791916377675647477` (`builds --log build-1791916377675647477`).
```
--- 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-13T17:37:27Z 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-13T17:37:27Z
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
notes:
- cmd/mesh-controller/proposals_test.go, cmd/mesh-controller/settings_walk_test.go, internal/outward/outward_test.go and testdata/beside/CAPTURED 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.052s
ok github.com/novox/mesh-controller/cmd/mesh-controller 179.460s
ok github.com/novox/mesh-controller/examples/objectstore-provisioner 1.030s
ok github.com/novox/mesh-controller/examples/postgres-provisioner 1.054s
ok github.com/novox/mesh-controller/examples/redis-provisioner 1.034s
ok github.com/novox/mesh-controller/examples/route-proxy 1.198s
ok github.com/novox/mesh-controller/internal/artifacts 1.093s
? github.com/novox/mesh-controller/internal/beside [no test files]
ok github.com/novox/mesh-controller/internal/broker 4.503s
ok github.com/novox/mesh-controller/internal/builder 41.651s
ok github.com/novox/mesh-controller/internal/catalogue 8.466s
ok github.com/novox/mesh-controller/internal/conditions 2.686s
ok github.com/novox/mesh-controller/internal/envfile 1.062s
ok github.com/novox/mesh-controller/internal/facts 1.065s
ok github.com/novox/mesh-controller/internal/identity 5.095s
ok github.com/novox/mesh-controller/internal/inventory 36.372s
ok github.com/novox/mesh-controller/internal/lease 17.732s
ok github.com/novox/mesh-controller/internal/licences 4.139s
ok github.com/novox/mesh-controller/internal/licences/adapters 1.059s
ok github.com/novox/mesh-controller/internal/link 59.311s
ok github.com/novox/mesh-controller/internal/lint 2.517s
ok github.com/novox/mesh-controller/internal/outward 1.098s
ok github.com/novox/mesh-controller/internal/overlay 1.082s
ok github.com/novox/mesh-controller/internal/secrets 1.553s
ok github.com/novox/mesh-controller/internal/store 3.472s
ok github.com/novox/mesh-controller/internal/testbus 1.254s
ok github.com/novox/mesh-controller/internal/token 1.017s
store tests, each run against the store:
./cmd/mesh-controller --- PASS: TestAStopWithoutAMergeWalksTheOthersAgain (0.23s)
./cmd/mesh-controller --- PASS: TestAStopWithoutAMergeEndsTheMergesThatContainIt (0.25s)
./cmd/mesh-controller --- PASS: TestAStopWalksTheOthersAgainInTheOpenBatch (0.24s)
./cmd/mesh-controller --- PASS: TestAStopNamesWhatStaysOnTheMachinesAndWhatStillCarriesIt (0.24s)
./cmd/mesh-controller --- PASS: TestAStopWithoutAMergeLeavesItOutOfABatch (0.22s)
./cmd/mesh-controller --- PASS: TestSavingPlansAndMovingMergesIsOneAct (0.18s)
./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.27s)
./cmd/mesh-controller --- PASS: TestAWalkStoppedOrClosedByAPersonIsSaidEndedStopped (0.26s)
./cmd/mesh-controller --- PASS: TestAWalkRetriedByAPersonIsSaidStartedAgain (0.22s)
./cmd/mesh-controller --- PASS: TestABacklogReleasedByAPersonIsSaidStarted (0.22s)
./cmd/mesh-controller --- PASS: TestAWalkEndedByCancelOrClearIsSaidEnded (0.28s)
./cmd/mesh-controller --- PASS: TestAWalkRestartedByARebuildIsSaidStarted (0.22s)
./cmd/mesh-controller --- PASS: TestAWalkStoppedByHandAndRetriedEndsFailedWhenItFailsAgain (0.26s)
./cmd/mesh-controller --- PASS: TestReplay237 (0.21s)
./cmd/mesh-controller --- PASS: TestAnUnassignThatLeavesItsNodeUnresolvedSaysSoOnceInItsAnswer (0.21s)
./cmd/mesh-controller --- PASS: TestAnUnassignThatLeavesItsNodeResolvedSaysNothingOfIt (0.22s)
./cmd/mesh-controller --- PASS: TestAnAssignThatLeavesItsNodeUnresolvedSaysOnlyThePlansRefusal (0.22s)
./cmd/mesh-controller --- PASS: TestADirectoryOwnersKeyIsRefusedThroughAVerb (0.24s)
./cmd/mesh-controller --- PASS: TestTheSendMakesNoValueForAnOutsideSecretNobodyGave (0.30s)
./cmd/mesh-controller --- PASS: TestAQuestionComposesWithoutAnOutsideSecretNobodyGave (0.28s)
./cmd/mesh-controller --- PASS: TestReplay201 (0.17s)
./cmd/mesh-controller --- PASS: TestARollbackWhoseSendWasRefusedIsCompletedByTheNextSend (0.16s)
./cmd/mesh-controller --- PASS: TestAGateJudgesTheOtherMovesBesideAKeptCore (0.17s)
./cmd/mesh-controller --- PASS: TestReplay401 (0.30s)
./cmd/mesh-controller --- PASS: TestReplay201ThePlansSend (0.26s)
./cmd/mesh-controller --- PASS: TestPlanAndNodeListAnOptionalRequirementLeftUnbound (0.30s)
./cmd/mesh-controller --- PASS: TestReplay340 (0.26s)
./cmd/mesh-controller --- PASS: TestOnlyATrustedFilesNamedKeyIsRefusedThroughAVerb (0.22s)
./cmd/mesh-controller --- PASS: TestReplay349 (0.22s)
./cmd/mesh-controller --- PASS: TestReplay348AFaultFromBeforeTheSendFailsNoGate (0.19s)
./cmd/mesh-controller --- PASS: TestReplay239AModuleNameIsNotTakenOverByAnotherRepository (0.16s)
./cmd/mesh-controller --- PASS: TestAWalkThatMovedNothingSaysWhichModulesMatchedWhatRuns (0.20s)
./cmd/mesh-controller --- PASS: TestReplay614ANewSDKPlansTheToolchainAndThenItsBundles (0.08s)
./cmd/mesh-controller --- PASS: TestOneAcceptForAProviderIsPlacedForEveryConsumer (0.50s)
./cmd/mesh-controller --- PASS: TestReplay164 (0.30s)
./cmd/mesh-controller --- PASS: TestAnApprovedLayerOpensTheWalkThatSendsIt (0.21s)
./cmd/mesh-controller --- PASS: TestASettingsWalkSendsOneMachineAtATimeEachJudged (0.22s)
./cmd/mesh-controller --- PASS: TestAFailedSettingsWalkStopsAndHoldsNothingBack (0.20s)
./cmd/mesh-controller --- PASS: TestASettingsWalkSendsTheLayerAloneEveryBuildKept (0.20s)
./cmd/mesh-controller --- PASS: TestASettingsWalkStopsBeforeADataMoveAndPassesOverAMachineAway (0.59s)
./cmd/mesh-controller --- PASS: TestACrossingSendSupersedesASettingsGate (0.19s)
./cmd/mesh-controller --- PASS: TestASettingsWalkFailsOnARefusalThatCannotClear (0.18s)
./internal/inventory --- PASS: TestTheLastSendSaysWhatTheMachineAnswered (0.08s)
./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.07s)
./internal/inventory --- PASS: TestAWalksStartIsKeptAndARefusedSaveLeavesItUnsaid (0.07s)
./internal/inventory --- PASS: TestAWalksRestIsReadFromEachMachinesOwnSend (0.08s)
./internal/inventory --- PASS: TestAStoredBuildWithASilentMergeableFileIsStillReadAndComposed (0.07s)
./internal/inventory --- PASS: TestACredentialIssuedOutsideIsNeverMade (0.09s)
./internal/inventory --- PASS: TestOneAcceptForAProviderIsSealedToEveryConsumer (0.09s)
./internal/inventory --- PASS: TestASharedOwnSecretIssuedOutsideIsNeverMade (0.08s)
```
**Out of date when it landed**: out of date: judged against trunk 9f3aa91e812b, the trunk is now 332fbaa9b175; judged again on a recheck or when it is merged
The operator could not read the settings proposals on the phone: the change, the fingerprint and a how-to
paragraph in one wall of plain text, and the values masked as ‹path› and ‹address›, so the approval was
blind.
The ask is now a summary of what changes where ("Changes 3 setting(s) of mounts on shanks; approved, the
layer is set at once and shanks takes it at its next push."), then at most three points, one key each (more
keys: the first two and the names of the rest). Who proposed it, the fingerprint and how to read it whole
are its Details, which the router notes after the answers. The change is carried twice: under the content
rule, and whole (asks.Ask.Whole), shown only on a channel that proves who answers, a value shaped like a
secret withheld in both (from the earlier work on issue 383, #202).
Vendors mesh-sdk at 9588871 (fix/639-an-ask-reads-at-a-glance: Message.Note, asks.Glance), and captures its
conformance events at that commit.
The review of #304: with more than three keys the ask showed only the names of the rest, a long value was
cut without a word, and the Details held no key, so Approve bound values the operator never saw. The
Details now list every key uncut — masked, and whole in WholeDetails for a channel that proves who
answers — before who proposed it and the fingerprint; the glance says what it cut. Vendors mesh-sdk at
f474544 and captures its conformance events there.
Rebased on #305: Approve now sends the layer by a walk, so the summary's "takes it at its next push" was
false. The summary says it is set and sent at once by a walk to where it reaches, one machine at a time,
each judged; the rest of what Approve does (onApprove) leads the Details, beside every key whole.
{a:1, b:2, c:3, password:hunter2} was proposed with "+ password: hunter2" in its Details: the router
withheld the line unnamed and Approve set a value the operator never saw (ADR 0347 §1, §3, §4). Each line is
now judged as the router judges it, masked under the content rule and whole under the secret rule; a line
refused is said "+ password (value withheld)", and any line the router would still refuse is refused at
propose in the controller's words, never echoing a secret-shaped key. SDK at mesh-sdk 5933eb7 (no two asks
digest the same).
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
read by no module's build: cmd/mesh-controller/proposals_test.go, cmd/mesh-controller/settings_walk_test.go, internal/outward/outward_test.go, testdata/beside/CAPTURED
Run by the build seat on novox as build-1791917151437726334 (builds --log build-1791917151437726334).
--- 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-13T18:39:16Z 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-13T18:39:16Z
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.056s
ok github.com/novox/mesh-controller/cmd/mesh-controller 216.499s
ok github.com/novox/mesh-controller/examples/objectstore-provisioner 1.015s
ok github.com/novox/mesh-controller/examples/postgres-provisioner 1.032s
ok github.com/novox/mesh-controller/examples/redis-provisioner 1.024s
ok github.com/novox/mesh-controller/examples/route-proxy 1.150s
ok github.com/novox/mesh-controller/internal/artifacts 1.066s
? github.com/novox/mesh-controller/internal/beside [no test files]
ok github.com/novox/mesh-controller/internal/broker 5.087s
ok github.com/novox/mesh-controller/internal/builder 52.965s
ok github.com/novox/mesh-controller/internal/catalogue 10.219s
ok github.com/novox/mesh-controller/internal/conditions 2.671s
ok github.com/novox/mesh-controller/internal/envfile 1.039s
ok github.com/novox/mesh-controller/internal/facts 1.043s
ok github.com/novox/mesh-controller/internal/identity 5.836s
ok github.com/novox/mesh-controller/internal/inventory 45.470s
ok github.com/novox/mesh-controller/internal/lease 17.638s
ok github.com/novox/mesh-controller/internal/licences 4.777s
ok github.com/novox/mesh-controller/internal/licences/adapters 1.016s
ok github.com/novox/mesh-controller/internal/link 66.739s
ok github.com/novox/mesh-controller/internal/lint 2.725s
ok github.com/novox/mesh-controller/internal/outward 1.050s
ok github.com/novox/mesh-controller/internal/overlay 1.029s
ok github.com/novox/mesh-controller/internal/secrets 1.575s
ok github.com/novox/mesh-controller/internal/store 3.479s
ok github.com/novox/mesh-controller/internal/testbus 1.231s
ok github.com/novox/mesh-controller/internal/token 1.017s
store tests, each run against the store:
./cmd/mesh-controller --- PASS: TestAStopWithoutAMergeWalksTheOthersAgain (0.33s)
./cmd/mesh-controller --- PASS: TestAStopWithoutAMergeEndsTheMergesThatContainIt (0.28s)
./cmd/mesh-controller --- PASS: TestAStopWalksTheOthersAgainInTheOpenBatch (0.38s)
./cmd/mesh-controller --- PASS: TestAStopNamesWhatStaysOnTheMachinesAndWhatStillCarriesIt (0.59s)
./cmd/mesh-controller --- PASS: TestAStopWithoutAMergeLeavesItOutOfABatch (0.26s)
./cmd/mesh-controller --- PASS: TestSavingPlansAndMovingMergesIsOneAct (0.19s)
./cmd/mesh-controller --- PASS: TestAPlanFollowedFromTheStoreAnswersWhenItMoves (2.04s)
./cmd/mesh-controller --- PASS: TestNodeShowAndStatusReadTheLastSendFromTheStore (0.26s)
./cmd/mesh-controller --- PASS: TestTheConditionsVerbReadsTheLooksTheBucketNoLongerHolds (0.16s)
./cmd/mesh-controller --- PASS: TestAWalkLetGoAndStoppedByVerbsIsSaidStartedAndEnded (0.25s)
./cmd/mesh-controller --- PASS: TestAWalkStoppedOrClosedByAPersonIsSaidEndedStopped (0.27s)
./cmd/mesh-controller --- PASS: TestAWalkRetriedByAPersonIsSaidStartedAgain (0.21s)
./cmd/mesh-controller --- PASS: TestABacklogReleasedByAPersonIsSaidStarted (0.23s)
./cmd/mesh-controller --- PASS: TestAWalkEndedByCancelOrClearIsSaidEnded (0.29s)
./cmd/mesh-controller --- PASS: TestAWalkRestartedByARebuildIsSaidStarted (0.23s)
./cmd/mesh-controller --- PASS: TestAWalkStoppedByHandAndRetriedEndsFailedWhenItFailsAgain (0.30s)
./cmd/mesh-controller --- PASS: TestReplay237 (0.25s)
./cmd/mesh-controller --- PASS: TestAnUnassignThatLeavesItsNodeUnresolvedSaysSoOnceInItsAnswer (0.22s)
./cmd/mesh-controller --- PASS: TestAnUnassignThatLeavesItsNodeResolvedSaysNothingOfIt (0.22s)
./cmd/mesh-controller --- PASS: TestAnAssignThatLeavesItsNodeUnresolvedSaysOnlyThePlansRefusal (0.22s)
./cmd/mesh-controller --- PASS: TestADirectoryOwnersKeyIsRefusedThroughAVerb (0.27s)
./cmd/mesh-controller --- PASS: TestTheSendMakesNoValueForAnOutsideSecretNobodyGave (0.40s)
./cmd/mesh-controller --- PASS: TestAQuestionComposesWithoutAnOutsideSecretNobodyGave (0.31s)
./cmd/mesh-controller --- PASS: TestReplay201 (0.27s)
./cmd/mesh-controller --- PASS: TestARollbackWhoseSendWasRefusedIsCompletedByTheNextSend (0.16s)
./cmd/mesh-controller --- PASS: TestAGateJudgesTheOtherMovesBesideAKeptCore (0.19s)
./cmd/mesh-controller --- PASS: TestReplay401 (0.35s)
./cmd/mesh-controller --- PASS: TestReplay201ThePlansSend (0.28s)
./cmd/mesh-controller --- PASS: TestPlanAndNodeListAnOptionalRequirementLeftUnbound (0.34s)
./cmd/mesh-controller --- PASS: TestReplay340 (0.28s)
./cmd/mesh-controller --- PASS: TestOnlyATrustedFilesNamedKeyIsRefusedThroughAVerb (0.24s)
./cmd/mesh-controller --- PASS: TestReplay349 (0.23s)
./cmd/mesh-controller --- PASS: TestReplay348AFaultFromBeforeTheSendFailsNoGate (0.20s)
./cmd/mesh-controller --- PASS: TestReplay239AModuleNameIsNotTakenOverByAnotherRepository (0.17s)
./cmd/mesh-controller --- PASS: TestAWalkThatMovedNothingSaysWhichModulesMatchedWhatRuns (0.21s)
./cmd/mesh-controller --- PASS: TestReplay614ANewSDKPlansTheToolchainAndThenItsBundles (0.08s)
./cmd/mesh-controller --- PASS: TestOneAcceptForAProviderIsPlacedForEveryConsumer (0.62s)
./cmd/mesh-controller --- PASS: TestReplay164 (0.43s)
./cmd/mesh-controller --- PASS: TestAnApprovedLayerOpensTheWalkThatSendsIt (0.30s)
./cmd/mesh-controller --- PASS: TestASettingsWalkSendsOneMachineAtATimeEachJudged (0.22s)
./cmd/mesh-controller --- PASS: TestAFailedSettingsWalkStopsAndHoldsNothingBack (0.22s)
./cmd/mesh-controller --- PASS: TestASettingsWalkSendsTheLayerAloneEveryBuildKept (0.22s)
./cmd/mesh-controller --- PASS: TestASettingsWalkStopsBeforeADataMoveAndPassesOverAMachineAway (0.73s)
./cmd/mesh-controller --- PASS: TestACrossingSendSupersedesASettingsGate (0.20s)
./cmd/mesh-controller --- PASS: TestASettingsWalkFailsOnARefusalThatCannotClear (0.19s)
./internal/inventory --- PASS: TestTheLastSendSaysWhatTheMachineAnswered (0.11s)
./internal/inventory --- PASS: TestAReportIsTheLastSendsAnswerOnlyWhenItIsAboutThatSend (0.11s)
./internal/inventory --- PASS: TestAnIssuedValueIsSealedToEveryHolderOnceAndNotAgain (0.13s)
./internal/inventory --- PASS: TestAnIssuedValueIsSealedAgainAfterAKeyChangeOrAnAcceptance (0.09s)
./internal/inventory --- PASS: TestAConditionsLooksAreKeptBesideTheBucket (0.08s)
./internal/inventory --- PASS: TestAPlanIdHoldingAQuoteIsReadAsAPlainId (0.09s)
./internal/inventory --- PASS: TestAWalksStartIsKeptAndARefusedSaveLeavesItUnsaid (0.09s)
./internal/inventory --- PASS: TestAWalksRestIsReadFromEachMachinesOwnSend (0.09s)
./internal/inventory --- PASS: TestAStoredBuildWithASilentMergeableFileIsStillReadAndComposed (0.08s)
./internal/inventory --- PASS: TestACredentialIssuedOutsideIsNeverMade (0.09s)
./internal/inventory --- PASS: TestOneAcceptForAProviderIsSealedToEveryConsumer (0.10s)
./internal/inventory --- PASS: TestASharedOwnSecretIssuedOutsideIsNeverMade (0.09s)
**Merge check** at `deef9421`
Judged: head `deef9421a276` merged into trunk `332fbaa9b175`; read beside it: mesh-catalog `9c166398f204`, mesh-controller-main `332fbaa9b175`, mesh-host `0e92ef3d1b21`, 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
- read by no module's build: cmd/mesh-controller/proposals_test.go, cmd/mesh-controller/settings_walk_test.go, internal/outward/outward_test.go, testdata/beside/CAPTURED
Run by the build seat on novox as `build-1791917151437726334` (`builds --log build-1791917151437726334`).
```
--- 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-13T18:39:16Z 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-13T18:39:16Z
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.056s
ok github.com/novox/mesh-controller/cmd/mesh-controller 216.499s
ok github.com/novox/mesh-controller/examples/objectstore-provisioner 1.015s
ok github.com/novox/mesh-controller/examples/postgres-provisioner 1.032s
ok github.com/novox/mesh-controller/examples/redis-provisioner 1.024s
ok github.com/novox/mesh-controller/examples/route-proxy 1.150s
ok github.com/novox/mesh-controller/internal/artifacts 1.066s
? github.com/novox/mesh-controller/internal/beside [no test files]
ok github.com/novox/mesh-controller/internal/broker 5.087s
ok github.com/novox/mesh-controller/internal/builder 52.965s
ok github.com/novox/mesh-controller/internal/catalogue 10.219s
ok github.com/novox/mesh-controller/internal/conditions 2.671s
ok github.com/novox/mesh-controller/internal/envfile 1.039s
ok github.com/novox/mesh-controller/internal/facts 1.043s
ok github.com/novox/mesh-controller/internal/identity 5.836s
ok github.com/novox/mesh-controller/internal/inventory 45.470s
ok github.com/novox/mesh-controller/internal/lease 17.638s
ok github.com/novox/mesh-controller/internal/licences 4.777s
ok github.com/novox/mesh-controller/internal/licences/adapters 1.016s
ok github.com/novox/mesh-controller/internal/link 66.739s
ok github.com/novox/mesh-controller/internal/lint 2.725s
ok github.com/novox/mesh-controller/internal/outward 1.050s
ok github.com/novox/mesh-controller/internal/overlay 1.029s
ok github.com/novox/mesh-controller/internal/secrets 1.575s
ok github.com/novox/mesh-controller/internal/store 3.479s
ok github.com/novox/mesh-controller/internal/testbus 1.231s
ok github.com/novox/mesh-controller/internal/token 1.017s
store tests, each run against the store:
./cmd/mesh-controller --- PASS: TestAStopWithoutAMergeWalksTheOthersAgain (0.33s)
./cmd/mesh-controller --- PASS: TestAStopWithoutAMergeEndsTheMergesThatContainIt (0.28s)
./cmd/mesh-controller --- PASS: TestAStopWalksTheOthersAgainInTheOpenBatch (0.38s)
./cmd/mesh-controller --- PASS: TestAStopNamesWhatStaysOnTheMachinesAndWhatStillCarriesIt (0.59s)
./cmd/mesh-controller --- PASS: TestAStopWithoutAMergeLeavesItOutOfABatch (0.26s)
./cmd/mesh-controller --- PASS: TestSavingPlansAndMovingMergesIsOneAct (0.19s)
./cmd/mesh-controller --- PASS: TestAPlanFollowedFromTheStoreAnswersWhenItMoves (2.04s)
./cmd/mesh-controller --- PASS: TestNodeShowAndStatusReadTheLastSendFromTheStore (0.26s)
./cmd/mesh-controller --- PASS: TestTheConditionsVerbReadsTheLooksTheBucketNoLongerHolds (0.16s)
./cmd/mesh-controller --- PASS: TestAWalkLetGoAndStoppedByVerbsIsSaidStartedAndEnded (0.25s)
./cmd/mesh-controller --- PASS: TestAWalkStoppedOrClosedByAPersonIsSaidEndedStopped (0.27s)
./cmd/mesh-controller --- PASS: TestAWalkRetriedByAPersonIsSaidStartedAgain (0.21s)
./cmd/mesh-controller --- PASS: TestABacklogReleasedByAPersonIsSaidStarted (0.23s)
./cmd/mesh-controller --- PASS: TestAWalkEndedByCancelOrClearIsSaidEnded (0.29s)
./cmd/mesh-controller --- PASS: TestAWalkRestartedByARebuildIsSaidStarted (0.23s)
./cmd/mesh-controller --- PASS: TestAWalkStoppedByHandAndRetriedEndsFailedWhenItFailsAgain (0.30s)
./cmd/mesh-controller --- PASS: TestReplay237 (0.25s)
./cmd/mesh-controller --- PASS: TestAnUnassignThatLeavesItsNodeUnresolvedSaysSoOnceInItsAnswer (0.22s)
./cmd/mesh-controller --- PASS: TestAnUnassignThatLeavesItsNodeResolvedSaysNothingOfIt (0.22s)
./cmd/mesh-controller --- PASS: TestAnAssignThatLeavesItsNodeUnresolvedSaysOnlyThePlansRefusal (0.22s)
./cmd/mesh-controller --- PASS: TestADirectoryOwnersKeyIsRefusedThroughAVerb (0.27s)
./cmd/mesh-controller --- PASS: TestTheSendMakesNoValueForAnOutsideSecretNobodyGave (0.40s)
./cmd/mesh-controller --- PASS: TestAQuestionComposesWithoutAnOutsideSecretNobodyGave (0.31s)
./cmd/mesh-controller --- PASS: TestReplay201 (0.27s)
./cmd/mesh-controller --- PASS: TestARollbackWhoseSendWasRefusedIsCompletedByTheNextSend (0.16s)
./cmd/mesh-controller --- PASS: TestAGateJudgesTheOtherMovesBesideAKeptCore (0.19s)
./cmd/mesh-controller --- PASS: TestReplay401 (0.35s)
./cmd/mesh-controller --- PASS: TestReplay201ThePlansSend (0.28s)
./cmd/mesh-controller --- PASS: TestPlanAndNodeListAnOptionalRequirementLeftUnbound (0.34s)
./cmd/mesh-controller --- PASS: TestReplay340 (0.28s)
./cmd/mesh-controller --- PASS: TestOnlyATrustedFilesNamedKeyIsRefusedThroughAVerb (0.24s)
./cmd/mesh-controller --- PASS: TestReplay349 (0.23s)
./cmd/mesh-controller --- PASS: TestReplay348AFaultFromBeforeTheSendFailsNoGate (0.20s)
./cmd/mesh-controller --- PASS: TestReplay239AModuleNameIsNotTakenOverByAnotherRepository (0.17s)
./cmd/mesh-controller --- PASS: TestAWalkThatMovedNothingSaysWhichModulesMatchedWhatRuns (0.21s)
./cmd/mesh-controller --- PASS: TestReplay614ANewSDKPlansTheToolchainAndThenItsBundles (0.08s)
./cmd/mesh-controller --- PASS: TestOneAcceptForAProviderIsPlacedForEveryConsumer (0.62s)
./cmd/mesh-controller --- PASS: TestReplay164 (0.43s)
./cmd/mesh-controller --- PASS: TestAnApprovedLayerOpensTheWalkThatSendsIt (0.30s)
./cmd/mesh-controller --- PASS: TestASettingsWalkSendsOneMachineAtATimeEachJudged (0.22s)
./cmd/mesh-controller --- PASS: TestAFailedSettingsWalkStopsAndHoldsNothingBack (0.22s)
./cmd/mesh-controller --- PASS: TestASettingsWalkSendsTheLayerAloneEveryBuildKept (0.22s)
./cmd/mesh-controller --- PASS: TestASettingsWalkStopsBeforeADataMoveAndPassesOverAMachineAway (0.73s)
./cmd/mesh-controller --- PASS: TestACrossingSendSupersedesASettingsGate (0.20s)
./cmd/mesh-controller --- PASS: TestASettingsWalkFailsOnARefusalThatCannotClear (0.19s)
./internal/inventory --- PASS: TestTheLastSendSaysWhatTheMachineAnswered (0.11s)
./internal/inventory --- PASS: TestAReportIsTheLastSendsAnswerOnlyWhenItIsAboutThatSend (0.11s)
./internal/inventory --- PASS: TestAnIssuedValueIsSealedToEveryHolderOnceAndNotAgain (0.13s)
./internal/inventory --- PASS: TestAnIssuedValueIsSealedAgainAfterAKeyChangeOrAnAcceptance (0.09s)
./internal/inventory --- PASS: TestAConditionsLooksAreKeptBesideTheBucket (0.08s)
./internal/inventory --- PASS: TestAPlanIdHoldingAQuoteIsReadAsAPlainId (0.09s)
./internal/inventory --- PASS: TestAWalksStartIsKeptAndARefusedSaveLeavesItUnsaid (0.09s)
./internal/inventory --- PASS: TestAWalksRestIsReadFromEachMachinesOwnSend (0.09s)
./internal/inventory --- PASS: TestAStoredBuildWithASilentMergeableFileIsStillReadAndComposed (0.08s)
./internal/inventory --- PASS: TestACredentialIssuedOutsideIsNeverMade (0.09s)
./internal/inventory --- PASS: TestOneAcceptForAProviderIsSealedToEveryConsumer (0.10s)
./internal/inventory --- PASS: TestASharedOwnSecretIssuedOutsideIsNeverMade (0.09s)
```
Re-review after review 225. This head is rebased onto main 332fbaa.
change() now judges each line as the router will (cmd/mesh-controller/proposals.go:280-290): under the content rule for the masked form and the secret rule for the whole form. A refused line becomes "+ key (value withheld)".
propose then holds every line of the Details to the content rule and every line of the WholeDetails to the secret rule (judgeLines, :558-568). It refuses in its own words, and keyOfLine never echoes a key shaped like a secret.
I reran the probe at this head:
{a:1, b:2, c:3, password:hunter2}: the Details say "+ password (value withheld)", and the Details pass the content rule.
{a:1, b:/mnt/x, c:3, password:hunter2}: the WholeDetails say "+ b: /mnt/x" and "+ password (value withheld)", and Whole plus WholeDetails pass the secret rule, so the router no longer refuses the ask.
{password:hunter2, b:/mnt/x}: this is now proposed with the key named, where before it was refused.
A key shaped like a token is refused at propose and the key is not echoed.
Every key is named and the note holds what the glance says, as ADR 0347 §1, §3 and §4 require.
Other checks:
The vendored asks.go is identical to mesh-sdk 5933eb7. go.mod and testdata/beside/CAPTURED pin 5933eb757d44.
No "push" promise is in the ask. The only push left is the ADR 0344 error path.
Tests: go test ./cmd/mesh-controller/ ./internal/outward/ pass (run niced). The new tests (TestASecretNamedKeyIsNamedAndItsValueWithheld, TestARefusalNamesTheKeyAndNeverASecret) do not build on 5b014e75, the previous head.
Statuses at this head: mesh/merge-gate success ("head deef9421a2 merged into trunk 332fbaa9b1 — pass: builds build-agent, mesh-controller, route-proxy → ace, g14, novox, shanks"), mesh/repo-check success ("… pass: its merge-check.sh passed"), mesh/delivery success ("ready: it delivers once merged"), mesh/delivery-group success ("group fix/383-an-ask-reads-at-a-glance ready: every member ready, and composed together they pass").
Verdict: approve at deef9421a276348f6543b0bdbc089bbe11e3c2a9
Re-review after review 225. This head is rebased onto main 332fbaa.
- change() now judges each line as the router will (cmd/mesh-controller/proposals.go:280-290): under the content rule for the masked form and the secret rule for the whole form. A refused line becomes "+ key (value withheld)".
- propose then holds every line of the Details to the content rule and every line of the WholeDetails to the secret rule (judgeLines, :558-568). It refuses in its own words, and keyOfLine never echoes a key shaped like a secret.
I reran the probe at this head:
- {a:1, b:2, c:3, password:hunter2}: the Details say "+ password (value withheld)", and the Details pass the content rule.
- {a:1, b:/mnt/x, c:3, password:hunter2}: the WholeDetails say "+ b: /mnt/x" and "+ password (value withheld)", and Whole plus WholeDetails pass the secret rule, so the router no longer refuses the ask.
- {password:hunter2, b:/mnt/x}: this is now proposed with the key named, where before it was refused.
- A key shaped like a token is refused at propose and the key is not echoed.
Every key is named and the note holds what the glance says, as ADR 0347 §1, §3 and §4 require.
Other checks:
- The vendored asks.go is identical to mesh-sdk 5933eb7. go.mod and testdata/beside/CAPTURED pin 5933eb757d44.
- No "push" promise is in the ask. The only push left is the ADR 0344 error path.
- Tests: `go test ./cmd/mesh-controller/ ./internal/outward/` pass (run niced). The new tests (TestASecretNamedKeyIsNamedAndItsValueWithheld, TestARefusalNamesTheKeyAndNeverASecret) do not build on 5b014e75, the previous head.
Statuses at this head: mesh/merge-gate success ("head deef9421a276 merged into trunk 332fbaa9b175 — pass: builds build-agent, mesh-controller, route-proxy → ace, g14, novox, shanks"), mesh/repo-check success ("… pass: its merge-check.sh passed"), mesh/delivery success ("ready: it delivers once merged"), mesh/delivery-group success ("group fix/383-an-ask-reads-at-a-glance ready: every member ready, and composed together they pass").
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
read by no module's build: cmd/mesh-controller/proposals_test.go, cmd/mesh-controller/settings_walk_test.go, internal/outward/outward_test.go, testdata/beside/CAPTURED
Run by the build seat on novox as build-1791918683588956052 (builds --log build-1791918683588956052).
--- 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-13T19:08:16Z 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-13T19:08:16Z
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
notes:
- cmd/mesh-controller/proposals_test.go, cmd/mesh-controller/settings_walk_test.go, internal/outward/outward_test.go and testdata/beside/CAPTURED 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.111s
ok github.com/novox/mesh-controller/cmd/mesh-controller 226.245s
ok github.com/novox/mesh-controller/examples/objectstore-provisioner 1.020s
ok github.com/novox/mesh-controller/examples/postgres-provisioner 1.032s
ok github.com/novox/mesh-controller/examples/redis-provisioner 1.021s
ok github.com/novox/mesh-controller/examples/route-proxy 1.137s
ok github.com/novox/mesh-controller/internal/artifacts 1.058s
? github.com/novox/mesh-controller/internal/beside [no test files]
ok github.com/novox/mesh-controller/internal/broker 5.076s
ok github.com/novox/mesh-controller/internal/builder 51.217s
ok github.com/novox/mesh-controller/internal/catalogue 11.074s
ok github.com/novox/mesh-controller/internal/conditions 2.895s
ok github.com/novox/mesh-controller/internal/envfile 1.029s
ok github.com/novox/mesh-controller/internal/facts 1.025s
ok github.com/novox/mesh-controller/internal/identity 6.302s
ok github.com/novox/mesh-controller/internal/inventory 47.826s
ok github.com/novox/mesh-controller/internal/lease 17.646s
ok github.com/novox/mesh-controller/internal/licences 5.037s
ok github.com/novox/mesh-controller/internal/licences/adapters 1.015s
ok github.com/novox/mesh-controller/internal/link 62.142s
ok github.com/novox/mesh-controller/internal/lint 2.678s
ok github.com/novox/mesh-controller/internal/outward 1.047s
ok github.com/novox/mesh-controller/internal/overlay 1.037s
ok github.com/novox/mesh-controller/internal/secrets 1.577s
ok github.com/novox/mesh-controller/internal/store 3.683s
ok github.com/novox/mesh-controller/internal/testbus 1.226s
ok github.com/novox/mesh-controller/internal/token 1.027s
store tests, each run against the store:
./cmd/mesh-controller --- PASS: TestAStopWithoutAMergeWalksTheOthersAgain (0.29s)
./cmd/mesh-controller --- PASS: TestAStopWithoutAMergeEndsTheMergesThatContainIt (0.32s)
./cmd/mesh-controller --- PASS: TestAStopWalksTheOthersAgainInTheOpenBatch (0.35s)
./cmd/mesh-controller --- PASS: TestAStopNamesWhatStaysOnTheMachinesAndWhatStillCarriesIt (0.26s)
./cmd/mesh-controller --- PASS: TestAStopWithoutAMergeLeavesItOutOfABatch (0.24s)
./cmd/mesh-controller --- PASS: TestSavingPlansAndMovingMergesIsOneAct (0.19s)
./cmd/mesh-controller --- PASS: TestAPlanFollowedFromTheStoreAnswersWhenItMoves (1.99s)
./cmd/mesh-controller --- PASS: TestNodeShowAndStatusReadTheLastSendFromTheStore (0.37s)
./cmd/mesh-controller --- PASS: TestTheConditionsVerbReadsTheLooksTheBucketNoLongerHolds (0.15s)
./cmd/mesh-controller --- PASS: TestAWalkLetGoAndStoppedByVerbsIsSaidStartedAndEnded (0.29s)
./cmd/mesh-controller --- PASS: TestAWalkStoppedOrClosedByAPersonIsSaidEndedStopped (0.27s)
./cmd/mesh-controller --- PASS: TestAWalkRetriedByAPersonIsSaidStartedAgain (0.22s)
./cmd/mesh-controller --- PASS: TestABacklogReleasedByAPersonIsSaidStarted (0.23s)
./cmd/mesh-controller --- PASS: TestAWalkEndedByCancelOrClearIsSaidEnded (0.29s)
./cmd/mesh-controller --- PASS: TestAWalkRestartedByARebuildIsSaidStarted (0.26s)
./cmd/mesh-controller --- PASS: TestAWalkStoppedByHandAndRetriedEndsFailedWhenItFailsAgain (0.27s)
./cmd/mesh-controller --- PASS: TestReplay237 (0.43s)
./cmd/mesh-controller --- PASS: TestAnUnassignThatLeavesItsNodeUnresolvedSaysSoOnceInItsAnswer (0.33s)
./cmd/mesh-controller --- PASS: TestAnUnassignThatLeavesItsNodeResolvedSaysNothingOfIt (0.65s)
./cmd/mesh-controller --- PASS: TestAnAssignThatLeavesItsNodeUnresolvedSaysOnlyThePlansRefusal (0.38s)
./cmd/mesh-controller --- PASS: TestADirectoryOwnersKeyIsRefusedThroughAVerb (0.30s)
./cmd/mesh-controller --- PASS: TestTheSendMakesNoValueForAnOutsideSecretNobodyGave (0.48s)
./cmd/mesh-controller --- PASS: TestAQuestionComposesWithoutAnOutsideSecretNobodyGave (0.33s)
./cmd/mesh-controller --- PASS: TestReplay201 (0.22s)
./cmd/mesh-controller --- PASS: TestARollbackWhoseSendWasRefusedIsCompletedByTheNextSend (0.24s)
./cmd/mesh-controller --- PASS: TestAGateJudgesTheOtherMovesBesideAKeptCore (0.22s)
./cmd/mesh-controller --- PASS: TestReplay401 (0.46s)
./cmd/mesh-controller --- PASS: TestReplay201ThePlansSend (0.32s)
./cmd/mesh-controller --- PASS: TestPlanAndNodeListAnOptionalRequirementLeftUnbound (0.40s)
./cmd/mesh-controller --- PASS: TestReplay340 (0.42s)
./cmd/mesh-controller --- PASS: TestOnlyATrustedFilesNamedKeyIsRefusedThroughAVerb (0.22s)
./cmd/mesh-controller --- PASS: TestReplay349 (0.23s)
./cmd/mesh-controller --- PASS: TestReplay348AFaultFromBeforeTheSendFailsNoGate (0.27s)
./cmd/mesh-controller --- PASS: TestReplay239AModuleNameIsNotTakenOverByAnotherRepository (0.23s)
./cmd/mesh-controller --- PASS: TestAWalkThatMovedNothingSaysWhichModulesMatchedWhatRuns (0.38s)
./cmd/mesh-controller --- PASS: TestReplay614ANewSDKPlansTheToolchainAndThenItsBundles (0.09s)
./cmd/mesh-controller --- PASS: TestOneAcceptForAProviderIsPlacedForEveryConsumer (0.87s)
./cmd/mesh-controller --- PASS: TestReplay164 (0.40s)
./cmd/mesh-controller --- PASS: TestAnApprovedLayerOpensTheWalkThatSendsIt (0.23s)
./cmd/mesh-controller --- PASS: TestASettingsWalkSendsOneMachineAtATimeEachJudged (0.22s)
./cmd/mesh-controller --- PASS: TestAFailedSettingsWalkStopsAndHoldsNothingBack (0.21s)
./cmd/mesh-controller --- PASS: TestASettingsWalkSendsTheLayerAloneEveryBuildKept (0.22s)
./cmd/mesh-controller --- PASS: TestASettingsWalkStopsBeforeADataMoveAndPassesOverAMachineAway (0.61s)
./cmd/mesh-controller --- PASS: TestACrossingSendSupersedesASettingsGate (0.21s)
./cmd/mesh-controller --- PASS: TestASettingsWalkFailsOnARefusalThatCannotClear (0.19s)
./cmd/mesh-controller --- PASS: TestAProviderElsewhereServesItsOwnComposedName (0.29s)
./internal/inventory --- PASS: TestTheLastSendSaysWhatTheMachineAnswered (0.09s)
./internal/inventory --- PASS: TestAReportIsTheLastSendsAnswerOnlyWhenItIsAboutThatSend (0.09s)
./internal/inventory --- PASS: TestAnIssuedValueIsSealedToEveryHolderOnceAndNotAgain (0.20s)
./internal/inventory --- PASS: TestAnIssuedValueIsSealedAgainAfterAKeyChangeOrAnAcceptance (0.25s)
./internal/inventory --- PASS: TestAConditionsLooksAreKeptBesideTheBucket (0.19s)
./internal/inventory --- PASS: TestAPlanIdHoldingAQuoteIsReadAsAPlainId (0.09s)
./internal/inventory --- PASS: TestAWalksStartIsKeptAndARefusedSaveLeavesItUnsaid (0.08s)
./internal/inventory --- PASS: TestAWalksRestIsReadFromEachMachinesOwnSend (0.08s)
./internal/inventory --- PASS: TestAStoredBuildWithASilentMergeableFileIsStillReadAndComposed (0.08s)
./internal/inventory --- PASS: TestACredentialIssuedOutsideIsNeverMade (0.22s)
./internal/inventory --- PASS: TestOneAcceptForAProviderIsSealedToEveryConsumer (0.26s)
./internal/inventory --- PASS: TestASharedOwnSecretIssuedOutsideIsNeverMade (0.13s)
**Merge check** at `deef9421`
Judged: head `deef9421a276` merged into trunk `cef22a25264b`; read beside it: mesh-catalog `faebc3569acf`, mesh-controller-main `cef22a25264b`, mesh-host `0e92ef3d1b21`, 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
- read by no module's build: cmd/mesh-controller/proposals_test.go, cmd/mesh-controller/settings_walk_test.go, internal/outward/outward_test.go, testdata/beside/CAPTURED
Run by the build seat on novox as `build-1791918683588956052` (`builds --log build-1791918683588956052`).
```
--- 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-13T19:08:16Z 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-13T19:08:16Z
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
notes:
- cmd/mesh-controller/proposals_test.go, cmd/mesh-controller/settings_walk_test.go, internal/outward/outward_test.go and testdata/beside/CAPTURED 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.111s
ok github.com/novox/mesh-controller/cmd/mesh-controller 226.245s
ok github.com/novox/mesh-controller/examples/objectstore-provisioner 1.020s
ok github.com/novox/mesh-controller/examples/postgres-provisioner 1.032s
ok github.com/novox/mesh-controller/examples/redis-provisioner 1.021s
ok github.com/novox/mesh-controller/examples/route-proxy 1.137s
ok github.com/novox/mesh-controller/internal/artifacts 1.058s
? github.com/novox/mesh-controller/internal/beside [no test files]
ok github.com/novox/mesh-controller/internal/broker 5.076s
ok github.com/novox/mesh-controller/internal/builder 51.217s
ok github.com/novox/mesh-controller/internal/catalogue 11.074s
ok github.com/novox/mesh-controller/internal/conditions 2.895s
ok github.com/novox/mesh-controller/internal/envfile 1.029s
ok github.com/novox/mesh-controller/internal/facts 1.025s
ok github.com/novox/mesh-controller/internal/identity 6.302s
ok github.com/novox/mesh-controller/internal/inventory 47.826s
ok github.com/novox/mesh-controller/internal/lease 17.646s
ok github.com/novox/mesh-controller/internal/licences 5.037s
ok github.com/novox/mesh-controller/internal/licences/adapters 1.015s
ok github.com/novox/mesh-controller/internal/link 62.142s
ok github.com/novox/mesh-controller/internal/lint 2.678s
ok github.com/novox/mesh-controller/internal/outward 1.047s
ok github.com/novox/mesh-controller/internal/overlay 1.037s
ok github.com/novox/mesh-controller/internal/secrets 1.577s
ok github.com/novox/mesh-controller/internal/store 3.683s
ok github.com/novox/mesh-controller/internal/testbus 1.226s
ok github.com/novox/mesh-controller/internal/token 1.027s
store tests, each run against the store:
./cmd/mesh-controller --- PASS: TestAStopWithoutAMergeWalksTheOthersAgain (0.29s)
./cmd/mesh-controller --- PASS: TestAStopWithoutAMergeEndsTheMergesThatContainIt (0.32s)
./cmd/mesh-controller --- PASS: TestAStopWalksTheOthersAgainInTheOpenBatch (0.35s)
./cmd/mesh-controller --- PASS: TestAStopNamesWhatStaysOnTheMachinesAndWhatStillCarriesIt (0.26s)
./cmd/mesh-controller --- PASS: TestAStopWithoutAMergeLeavesItOutOfABatch (0.24s)
./cmd/mesh-controller --- PASS: TestSavingPlansAndMovingMergesIsOneAct (0.19s)
./cmd/mesh-controller --- PASS: TestAPlanFollowedFromTheStoreAnswersWhenItMoves (1.99s)
./cmd/mesh-controller --- PASS: TestNodeShowAndStatusReadTheLastSendFromTheStore (0.37s)
./cmd/mesh-controller --- PASS: TestTheConditionsVerbReadsTheLooksTheBucketNoLongerHolds (0.15s)
./cmd/mesh-controller --- PASS: TestAWalkLetGoAndStoppedByVerbsIsSaidStartedAndEnded (0.29s)
./cmd/mesh-controller --- PASS: TestAWalkStoppedOrClosedByAPersonIsSaidEndedStopped (0.27s)
./cmd/mesh-controller --- PASS: TestAWalkRetriedByAPersonIsSaidStartedAgain (0.22s)
./cmd/mesh-controller --- PASS: TestABacklogReleasedByAPersonIsSaidStarted (0.23s)
./cmd/mesh-controller --- PASS: TestAWalkEndedByCancelOrClearIsSaidEnded (0.29s)
./cmd/mesh-controller --- PASS: TestAWalkRestartedByARebuildIsSaidStarted (0.26s)
./cmd/mesh-controller --- PASS: TestAWalkStoppedByHandAndRetriedEndsFailedWhenItFailsAgain (0.27s)
./cmd/mesh-controller --- PASS: TestReplay237 (0.43s)
./cmd/mesh-controller --- PASS: TestAnUnassignThatLeavesItsNodeUnresolvedSaysSoOnceInItsAnswer (0.33s)
./cmd/mesh-controller --- PASS: TestAnUnassignThatLeavesItsNodeResolvedSaysNothingOfIt (0.65s)
./cmd/mesh-controller --- PASS: TestAnAssignThatLeavesItsNodeUnresolvedSaysOnlyThePlansRefusal (0.38s)
./cmd/mesh-controller --- PASS: TestADirectoryOwnersKeyIsRefusedThroughAVerb (0.30s)
./cmd/mesh-controller --- PASS: TestTheSendMakesNoValueForAnOutsideSecretNobodyGave (0.48s)
./cmd/mesh-controller --- PASS: TestAQuestionComposesWithoutAnOutsideSecretNobodyGave (0.33s)
./cmd/mesh-controller --- PASS: TestReplay201 (0.22s)
./cmd/mesh-controller --- PASS: TestARollbackWhoseSendWasRefusedIsCompletedByTheNextSend (0.24s)
./cmd/mesh-controller --- PASS: TestAGateJudgesTheOtherMovesBesideAKeptCore (0.22s)
./cmd/mesh-controller --- PASS: TestReplay401 (0.46s)
./cmd/mesh-controller --- PASS: TestReplay201ThePlansSend (0.32s)
./cmd/mesh-controller --- PASS: TestPlanAndNodeListAnOptionalRequirementLeftUnbound (0.40s)
./cmd/mesh-controller --- PASS: TestReplay340 (0.42s)
./cmd/mesh-controller --- PASS: TestOnlyATrustedFilesNamedKeyIsRefusedThroughAVerb (0.22s)
./cmd/mesh-controller --- PASS: TestReplay349 (0.23s)
./cmd/mesh-controller --- PASS: TestReplay348AFaultFromBeforeTheSendFailsNoGate (0.27s)
./cmd/mesh-controller --- PASS: TestReplay239AModuleNameIsNotTakenOverByAnotherRepository (0.23s)
./cmd/mesh-controller --- PASS: TestAWalkThatMovedNothingSaysWhichModulesMatchedWhatRuns (0.38s)
./cmd/mesh-controller --- PASS: TestReplay614ANewSDKPlansTheToolchainAndThenItsBundles (0.09s)
./cmd/mesh-controller --- PASS: TestOneAcceptForAProviderIsPlacedForEveryConsumer (0.87s)
./cmd/mesh-controller --- PASS: TestReplay164 (0.40s)
./cmd/mesh-controller --- PASS: TestAnApprovedLayerOpensTheWalkThatSendsIt (0.23s)
./cmd/mesh-controller --- PASS: TestASettingsWalkSendsOneMachineAtATimeEachJudged (0.22s)
./cmd/mesh-controller --- PASS: TestAFailedSettingsWalkStopsAndHoldsNothingBack (0.21s)
./cmd/mesh-controller --- PASS: TestASettingsWalkSendsTheLayerAloneEveryBuildKept (0.22s)
./cmd/mesh-controller --- PASS: TestASettingsWalkStopsBeforeADataMoveAndPassesOverAMachineAway (0.61s)
./cmd/mesh-controller --- PASS: TestACrossingSendSupersedesASettingsGate (0.21s)
./cmd/mesh-controller --- PASS: TestASettingsWalkFailsOnARefusalThatCannotClear (0.19s)
./cmd/mesh-controller --- PASS: TestAProviderElsewhereServesItsOwnComposedName (0.29s)
./internal/inventory --- PASS: TestTheLastSendSaysWhatTheMachineAnswered (0.09s)
./internal/inventory --- PASS: TestAReportIsTheLastSendsAnswerOnlyWhenItIsAboutThatSend (0.09s)
./internal/inventory --- PASS: TestAnIssuedValueIsSealedToEveryHolderOnceAndNotAgain (0.20s)
./internal/inventory --- PASS: TestAnIssuedValueIsSealedAgainAfterAKeyChangeOrAnAcceptance (0.25s)
./internal/inventory --- PASS: TestAConditionsLooksAreKeptBesideTheBucket (0.19s)
./internal/inventory --- PASS: TestAPlanIdHoldingAQuoteIsReadAsAPlainId (0.09s)
./internal/inventory --- PASS: TestAWalksStartIsKeptAndARefusedSaveLeavesItUnsaid (0.08s)
./internal/inventory --- PASS: TestAWalksRestIsReadFromEachMachinesOwnSend (0.08s)
./internal/inventory --- PASS: TestAStoredBuildWithASilentMergeableFileIsStillReadAndComposed (0.08s)
./internal/inventory --- PASS: TestACredentialIssuedOutsideIsNeverMade (0.22s)
./internal/inventory --- PASS: TestOneAcceptForAProviderIsSealedToEveryConsumer (0.26s)
./internal/inventory --- PASS: TestASharedOwnSecretIssuedOutsideIsNeverMade (0.13s)
```
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.
after: novox/mesh-catalog
Replaces #202 (issue 383), rebased on main and reshaped for issue 639. Answers the review (reviews 212-215) at head
52bcef159d.Acceptance. A settings proposal on Telegram reads: bold "Set mounts on shanks?", one summary line ("Changes 3 setting(s) of mounts on shanks; approved, the layer is set at once and shanks takes it at its next push."), at most three key points (more keys: the first two and "and N more, each whole in the note: "; a long point ends "… (cut: whole in the note)"), the buttons, and a collapsed note that lists every key with its whole value (masked on the desk), then who proposed it, the fingerprint and how to read it at the terminal.
What.
settingsProposal.ask: explanation =summary()+ at most three points fromchange(). The Details list every key uncut, masked under the content rule;WholeDetails(mesh-sdk #25) holds them whole for a channel that proves who answers.Wholecarries the glance whole, as in #202. A value shaped like a secret is withheld in every form. The how-to line names no dotted verb, which the router's content rule would withhold. The controller keeps the ask it sent, so an open proposal is decided as asked.Vendors mesh-sdk at f474544 (mesh-sdk #25:
Message.Note,asks.Glance,Ask.WholeDetails) and captures its conformance events there (testdata/beside/CAPTURED).Merge order: mesh-sdk #25, then mesh-catalog #278 (the router must know
WholeandWholeDetailsbefore the controller sends them, or the digests differ and the warrant is refused), then this. Theafter:line above declares it to the delivery group.Tested.
merge-check.sh: all green. Tests fail on main:TestAProposalAsksAtTheLevelApproveWithTheExactChange,TestAProposalShowsItsValuesWholeOnlyWhereTheSenderIsProvenAndNeverASecret,TestAMeshWideLayerIsProposed,TestAClearIsProposedAndShowsWhatItRemoves, andTestEveryKeyAndItsWholeValueReachTheOperator(5 keys, one value 300 characters: every key and full value in what a proving channel shows, every key in the masked Details, the cut said).Fixes issue 383 (with mesh-catalog and hq); part of issue 639. Decisions: ADR 0345 (accepted), ADR 0347 (proposed, needs the operator).
Delivery
novox/mesh-controller@deef9421a276— delivered since 2026-10-13T20:07:01ZDelivery plan — builds build-agent, mesh-controller, route-proxy → ace, g14, novox, shanks; no bus step
Group
fix/383-an-ask-reads-at-a-glance, in order: novox/mesh-catalog@f09daabec3 → novox/mesh-controller@deef9421a2Machines
Transitions
332fbaa9b1, the trunk is now cef22a25264b; judged again on a recheck or when it is mergedThe commit's note under
refs/notes/mesh-plankeeps every transition:git log --notes=mesh-plan.Merge check at
35232c85Judged: head
35232c853483merged into trunk6f1a05366c1d; read beside it: mesh-catalog5f491e0c097d, mesh-controller-main6f1a05366c1d, mesh-host0e92ef3d1b21, 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-1791902225449633841(builds --log build-1791902225449633841).Verdict: request changes at
35232c8534Independent review (issues 383 and 639, ADR 0345 clause 6).
BLOCKING: with more than 3 keys, the operator approves values that are never shown on the phone, not even in the collapsible part.
change()replaces every key from the third on with "and N more: c, d, e" (key names only). It does this in both forms, the masked and the exact one, because line 168 calls the samechange(machines, true). SoAsk.Whole, which is shown only on a channel that proves who answers, also carries no value for those keys.What would satisfy it: on a channel that proves who answers, the operator can read every key and its exact value (secret shapes withheld) before Approve, at least in the collapsed note, and a cut value is marked as cut. Clause 6 of ADR 0345 says "the first two, then the names of the rest" for the explanation. Carrying the remaining keys whole in the note needs either a progressive insight or a new clause, and likely router support for whole words in the note (mesh-catalog #278). That is the owner's call, but the merge should wait for it.
Correct as far as it goes:
wholeValuewithholds a secret's shape whole.outward.Secretrefuses before asking (proposals.go:488 onward). TheSecretvsChecksplit mirrors the messenger'sCheckSecretone for one.go test -mod=vendor ./...passes niced. New or changed tests fail on main: I checked out main's non-test code with the PR's tests, and the build fails (outward.Secret,Ask.Whole,DetailsandGlanceare undefined).Statuses at this head: mesh/merge-gate success ("head
35232c8534merged into trunk6f1a05366c— pass: builds build-agent, mesh-controller, route-proxy → ace, g14, novox, shanks; no bus…"), mesh/repo-check success ("… pass: its merge-check.sh passed"), mesh/delivery success ("ready: it delivers once merged"), mesh/delivery-group PENDING ("group fix/383-an-ask-reads-at-a-glance checking: composed check out of date: novox/mesh-catalog@ea1dfdce5b was judged against trunk 5f491…").New head
52bcef159danswers the review (reviews 212-215). The Details now list every key with its value, one line each and uncut. The values are masked inDetailsand whole inWholeDetails(mesh-sdk f474544), which the router shows in the note on a proving channel. The glance keeps its shape and says what it leaves out: "and N more, each whole in the note: ...", and a long point ends "... (cut: whole in the note)". New test:TestEveryKeyAndItsWholeValueReachTheOperator. A 5-key proposal with a 300-character value: every key and full value is in Whole+WholeDetails, every key is masked in Details, the cut is said. It fails on the earlier head. Decision: ADR 0347 (changes ADR 0345 §6; proposed, needs the operator). Local merge-check.sh passed.Merge check at
52bcef15Judged: head
52bcef159d95merged into trunk6f1a05366c1d; read beside it: mesh-cataloge209d46faf3d, mesh-controller-main6f1a05366c1d, mesh-host0e92ef3d1b21, 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-1791903915795552180(builds --log build-1791903915795552180).52bcef159dto5b014e75b7Merge check at
5b014e75Judged: head
5b014e75b7d5merged into trunk8ddf8b700558; read beside it: mesh-catalog9c166398f204, mesh-controller-main8ddf8b700558, mesh-host0e92ef3d1b21, mesh-tools954e1a53eef9mesh/merge-gate: PASS — every machine composes with the change as it did without (4 of 4 compose) (run 3) (modules: build-agent, mesh-controller, route-proxy)mesh/repo-check: PASS — its merge-check.sh passed (run 3)Delivery plan — builds build-agent, mesh-controller, route-proxy → ace, g14, novox, shanks; no bus step
Run by the build seat on shanks as
build-1791912326769990180(builds --log build-1791912326769990180).Out of date when it landed: out of date: judged against trunk
8ddf8b7005, the trunk is now 9f3aa91e812b; judged again on a recheck or when it is mergedMerge check at
5b014e75Judged: head
5b014e75b7d5merged into trunk9f3aa91e812b; read beside it: mesh-catalog9c166398f204, mesh-controller-main9f3aa91e812b, mesh-host0e92ef3d1b21, 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 novox as
build-1791913248258955138(builds --log build-1791913248258955138).Verdict: request changes at
5b014e75b7Independent review of the issue 383/639 group under ADR 0345 and ADR 0347.
Blocking: a key past the second is never checked at propose, so its value can be unreadable before Approve. propose holds only Headline, Explanation, OnExpiry and the options to outward.Check (cmd/mesh-controller/proposals.go:502-510), and only q.Whole to outward.Secret (:512). The key lines past the second are only in Details and WholeDetails (:177-198), which are checked by nothing here. Before this change, those lines were in the explanation, and a line such as "+ password: hunter2" was refused at once, in words. That still happens when the key is the first or second. I probed it at this head with a throwaway test:
The value "hunter2" passes sayableValue and wholeValue because the secret's shape is the key and value together, not the value alone. Fix: hold every line of q.Details to outward.Check and every line of q.WholeDetails to outward.Secret at propose, and refuse in words as for the explanation. Better still, mask per line, so a secret-named key shows "+ password: ‹withheld›" in both, and name it in the Details line as ADR 0347 §2 says. Add a case with a secret-named key past the second to TestEveryKeyAndItsWholeValueReachTheOperator.
Checked and fine:
pushleft is the ADR 0344 error path when a walk cannot be opened (proposals.go:891), which belongs to #305 and is not a promise in the ask.go test ./cmd/mesh-controller/ ./internal/outward/pass at the head (run niced). The new tests fail on main (build: asks.Glance, outward.Secret) and onfffafac, the earlier-review head (build: no WholeDetails).Statuses at this head: mesh/merge-gate success ("head
5b014e75b7merged into trunk9f3aa91e81, pass"), mesh/repo-check success, mesh/delivery success ("ready: it delivers once merged"), mesh/delivery-group success ("group fix/383-an-ask-reads-at-a-glance ready: every member ready, and composed together they pass").Note: mesh-sdk #25 is asked to change its digest encoding. This PR will need to re-vendor that head and update testdata/beside/CAPTURED.
5b014e75b7todd89b6e800New head
dd89b6e800answers review 225, rebased on main9f3aa91. Each change line is now judged the way the router judges it: masked lines under the content rule, whole lines under the secret rule. A refused line becomes+ <key> (value withheld), so the key is still named. A line the router would still refuse is refused at propose, in the controller's own words (judgeLinesover Details and WholeDetails); a key shaped like a secret is never echoed. New tests:TestASecretNamedKeyIsNamedAndItsValueWithheld({a:1, b:2, c:3, password:hunter2}: hunter2 appears nowhere,+ password (value withheld)is in both details forms, nothing the router would withhold or refuse is left; a key shaped like a secret is refused at propose) andTestARefusalNamesTheKeyAndNeverASecret. Re-pinned to mesh-sdk 5933eb7: go.mod, vendor and testdata/beside/CAPTURED. Local merge-check.sh passed.Merge check at
dd89b6e8Judged: head
dd89b6e800eamerged into trunk9f3aa91e812b; read beside it: mesh-catalog9c166398f204, mesh-controller-main9f3aa91e812b, mesh-host0e92ef3d1b21, 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-1791916377675647477(builds --log build-1791916377675647477).Out of date when it landed: out of date: judged against trunk
9f3aa91e81, the trunk is now 332fbaa9b175; judged again on a recheck or when it is mergedThe operator could not read the settings proposals on the phone: the change, the fingerprint and a how-to paragraph in one wall of plain text, and the values masked as ‹path› and ‹address›, so the approval was blind. The ask is now a summary of what changes where ("Changes 3 setting(s) of mounts on shanks; approved, the layer is set at once and shanks takes it at its next push."), then at most three points, one key each (more keys: the first two and the names of the rest). Who proposed it, the fingerprint and how to read it whole are its Details, which the router notes after the answers. The change is carried twice: under the content rule, and whole (asks.Ask.Whole), shown only on a channel that proves who answers, a value shaped like a secret withheld in both (from the earlier work on issue 383, #202). Vendors mesh-sdk at 9588871 (fix/639-an-ask-reads-at-a-glance: Message.Note, asks.Glance), and captures its conformance events at that commit.{a:1, b:2, c:3, password:hunter2} was proposed with "+ password: hunter2" in its Details: the router withheld the line unnamed and Approve set a value the operator never saw (ADR 0347 §1, §3, §4). Each line is now judged as the router judges it, masked under the content rule and whole under the secret rule; a line refused is said "+ password (value withheld)", and any line the router would still refuse is refused at propose in the controller's words, never echoing a secret-shaped key. SDK at mesh-sdk 5933eb7 (no two asks digest the same).dd89b6e800todeef9421a2Merge check at
deef9421Judged: head
deef9421a276merged into trunk332fbaa9b175; read beside it: mesh-catalog9c166398f204, mesh-controller-main332fbaa9b175, mesh-host0e92ef3d1b21, 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 novox as
build-1791917151437726334(builds --log build-1791917151437726334).Verdict: approve at
deef9421a2Re-review after review 225. This head is rebased onto main
332fbaa.I reran the probe at this head:
Every key is named and the note holds what the glance says, as ADR 0347 §1, §3 and §4 require.
Other checks:
go test ./cmd/mesh-controller/ ./internal/outward/pass (run niced). The new tests (TestASecretNamedKeyIsNamedAndItsValueWithheld, TestARefusalNamesTheKeyAndNeverASecret) do not build on5b014e75, the previous head.Statuses at this head: mesh/merge-gate success ("head
deef9421a2merged into trunk332fbaa9b1— pass: builds build-agent, mesh-controller, route-proxy → ace, g14, novox, shanks"), mesh/repo-check success ("… pass: its merge-check.sh passed"), mesh/delivery success ("ready: it delivers once merged"), mesh/delivery-group success ("group fix/383-an-ask-reads-at-a-glance ready: every member ready, and composed together they pass").Merge check at
deef9421Judged: head
deef9421a276merged into trunkcef22a25264b; read beside it: mesh-catalogfaebc3569acf, mesh-controller-maincef22a25264b, mesh-host0e92ef3d1b21, 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 novox as
build-1791918683588956052(builds --log build-1791918683588956052).