What.asks.Message.Note: a message's secondary words (who asked and when, what each answer does, the expiry, the ask's Details), which a channel shows apart, smaller or collapsed where it can, and never leaves out. asks.Glance with SummaryLength (300), MostPoints (3) and PointLength (160): the bound of an ask's explanation, a summary on its first line and at most three points. The doc of Ask.Details now says the router shows it in the note.
Why. The operator would not read the Telegram ask for ADR 0343 (issue 639): thirty plain lines, no summary, no formatting. Settings proposals were the same (issue 383). ADR 0345 (proposed, needs the operator) decides the shape.
Compatibility.Note is omitted when empty, so a channel older than it reads every message it read before. Nothing in Ask.Digest changes.
Tested.go/merge-check.sh (gofmt, vet, all tests). New: TestAnExplanationReadsAtAGlance, TestAMessageCarriesItsNoteApart; both fail on main (neither Glance nor Note exists there).
Used by mesh-catalog and mesh-controller pull requests for the same issues, pinned at this head (9588871).
Fixes issue 639 (with issue 383).
**What.** `asks.Message.Note`: a message's secondary words (who asked and when, what each answer does, the expiry, the ask's Details), which a channel shows apart, smaller or collapsed where it can, and never leaves out. `asks.Glance` with `SummaryLength` (300), `MostPoints` (3) and `PointLength` (160): the bound of an ask's explanation, a summary on its first line and at most three points. The doc of `Ask.Details` now says the router shows it in the note.
**Why.** The operator would not read the Telegram ask for ADR 0343 (issue 639): thirty plain lines, no summary, no formatting. Settings proposals were the same (issue 383). ADR 0345 (proposed, needs the operator) decides the shape.
**Compatibility.** `Note` is omitted when empty, so a channel older than it reads every message it read before. Nothing in `Ask.Digest` changes.
**Tested.** `go/merge-check.sh` (gofmt, vet, all tests). New: `TestAnExplanationReadsAtAGlance`, `TestAMessageCarriesItsNoteApart`; both fail on main (neither `Glance` nor `Note` exists there).
Used by mesh-catalog and mesh-controller pull requests for the same issues, pinned at this head (9588871).
Fixes issue 639 (with issue 383).
mesh/merge-gate head 9588871d6629 merged into trunk a0fc82fdcd7c — pass, with a note: builds mesh-sdk (+40 dependent(s)) → ace, g14, novox, shanks; no bus …
mesh/repo-check head 9588871d6629 merged into trunk a0fc82fdcd7c — pass: its merge-check.sh passed, each part in its toolchain: merge-check.sh (typescript)…
The operator will not read a Telegram ask of thirty plain lines. The secondary words (who asked, what each
answer does, the expiry, the fingerprint, how to read it whole) travel as Message.Note, so a channel can
show them small or collapsed; an ask's Details go there. Glance names the bound of an explanation: a
summary of at most 300 characters, then at most three points of at most 160.
g14: receives netcheck, zsh; waits for a person: nftables
novox: receives gitea, mesh-catalog, mesh-vault, netcheck, nextcloud, umami, zsh; waits for a person: mailu, minio, mongodb, mssql, nftables
shanks: receives lab, netcheck, zsh; waits for a person: nftables
baserow keeps data (ADR 0233): what it holds is backed up before it moves
bazarr keeps data (ADR 0233): what it holds is backed up before it moves
bookshelf keeps data (ADR 0233): what it holds is backed up before it moves
gitea provides npm-package-registry, git: its consumers are sent again after it
gitea keeps data (ADR 0233): what it holds is backed up before it moves
grafana keeps data (ADR 0233): what it holds is backed up before it moves
home-assistant keeps data (ADR 0233): what it holds is backed up before it moves
icecast keeps data (ADR 0233): what it holds is backed up before it moves
influxdb provides influxdb-api: its consumers are sent again after it
influxdb keeps data (ADR 0233): what it holds is backed up before it moves
jackett provides jackett-api: its consumers are sent again after it
jackett keeps data (ADR 0233): what it holds is backed up before it moves
kometa keeps data (ADR 0233): what it holds is backed up before it moves
lab keeps data (ADR 0233): what it holds is backed up before it moves
lidarr provides lidarr-api: its consumers are sent again after it
lidarr keeps data (ADR 0233): what it holds is backed up before it moves
mailu waits for a person: its policy records (module)
mailu provides smtp: its consumers are sent again after it
mailu keeps data (ADR 0233): what it holds is backed up before it moves
mesh-vault provides secret: its consumers are sent again after it
mesh-vault keeps data (ADR 0233): what it holds is backed up before it moves
minio waits for a person: its policy records (module)
minio provides s3-bucket: its consumers are sent again after it
minio keeps data (ADR 0233): what it holds is backed up before it moves
mongodb waits for a person: its policy records (module)
mongodb provides mongodb-database: its consumers are sent again after it
mongodb keeps data (ADR 0233): what it holds is backed up before it moves
mosquitto provides mqtt-topic: its consumers are sent again after it
mosquitto keeps data (ADR 0233): what it holds is backed up before it moves
mssql waits for a person: its policy records (module)
mssql provides mssql-database: its consumers are sent again after it
mssql keeps data (ADR 0233): what it holds is backed up before it moves
nextcloud keeps data (ADR 0233): what it holds is backed up before it moves
nftables waits for a person: its policy records (module)
nodered keeps data (ADR 0233): what it holds is backed up before it moves
ombi keeps data (ADR 0233): what it holds is backed up before it moves
radarr provides radarr-api: its consumers are sent again after it
radarr keeps data (ADR 0233): what it holds is backed up before it moves
redis provides redis-cache: its consumers are sent again after it
redis keeps data (ADR 0233): what it holds is backed up before it moves
searxng keeps data (ADR 0233): what it holds is backed up before it moves
sonarr provides sonarr-api: its consumers are sent again after it
sonarr keeps data (ADR 0233): what it holds is backed up before it moves
tautulli keeps data (ADR 0233): what it holds is backed up before it moves
umami provides analytics: its consumers are sent again after it
umami keeps data (ADR 0233): what it holds is backed up before it moves
unifi 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 baserow, bazarr, bookshelf, grafana, home-assistant, icecast, influxdb, jackett, kometa, lab, letta, lidarr, mosquitto, netcheck, nodered, ombi, radarr, redis, searxng, sonarr, tautulli, unifi, zsh is judged on its first machine
Machines
mesh-sdk on every machine running it: sent
mesh-tools on every machine running it: sent
audit-logger on every machine running it: sent
baserow on ace: passed — healthy 1 times over 1m16s
bazarr on ace: passed — judged with baserow: healthy 1 times over 1m16s
bookshelf on ace: passed — judged with baserow: healthy 1 times over 1m16s
confluence on every machine running it: sent
gitlab on every machine running it: sent
grafana on ace: passed — judged with baserow: healthy 1 times over 1m16s
home-assistant on ace: passed — judged with baserow: healthy 1 times over 1m16s
icecast on ace: passed — judged with baserow: healthy 1 times over 1m16s
influxdb on ace: passed — judged with baserow: healthy 1 times over 1m16s
jackett on ace: passed — judged with baserow: healthy 1 times over 1m16s
jira on every machine running it: sent
kometa on ace: passed — judged with baserow: healthy 1 times over 1m16s
letta on ace: passed — judged with baserow: healthy 1 times over 1m16s
lidarr on ace: passed — judged with baserow: healthy 1 times over 1m16s
mosquitto on ace: passed — judged with baserow: healthy 1 times over 1m16s
netcheck on ace: passed — judged with baserow: healthy 1 times over 1m16s
nodered on ace: passed — judged with baserow: healthy 1 times over 1m16s
ombi on ace: passed — judged with baserow: healthy 1 times over 1m16s
openai-consumer on every machine running it: sent
radarr on ace: passed — judged with baserow: healthy 1 times over 1m16s
redis on ace: passed — judged with baserow: healthy 1 times over 1m16s
route-adapter on every machine running it: sent
searxng on ace: passed — judged with baserow: healthy 1 times over 1m16s
sonarr on ace: passed — judged with baserow: healthy 1 times over 1m16s
tautulli on ace: passed — judged with baserow: healthy 1 times over 1m16s
unifi on ace: passed — judged with baserow: healthy 1 times over 1m16s
zsh on ace: passed — judged with baserow: healthy 1 times over 1m16s
gitea on novox: passed — healthy 1 times over 27s
mesh-catalog on novox: passed — judged with gitea: healthy 1 times over 27s
mesh-vault on novox: passed — judged with gitea: healthy 1 times over 27s
nextcloud on novox: passed — judged with gitea: healthy 1 times over 27s
umami on novox: passed — judged with gitea: healthy 1 times over 27s
lab on shanks: passed — healthy 1 times over 50s
baserow on the rest running it: sent
bazarr on the rest running it: sent
bookshelf on the rest running it: sent
gitea on the rest running it: sent
grafana on the rest running it: sent
home-assistant on the rest running it: sent
icecast on the rest running it: sent
influxdb on the rest running it: sent
jackett on the rest running it: sent
kometa on the rest running it: sent
letta on the rest running it: sent
lidarr on the rest running it: sent
mesh-catalog on the rest running it: sent
mesh-vault on the rest running it: sent
mosquitto on the rest running it: sent
netcheck on the rest running it: sent
nextcloud on the rest running it: sent
nodered on the rest running it: sent
ombi on the rest running it: sent
radarr on the rest running it: sent
redis on the rest running it: sent
searxng on the rest running it: sent
sonarr on the rest running it: sent
tautulli on the rest running it: sent
umami on the rest running it: sent
unifi on the rest running it: sent
zsh on the rest running it: sent
lab on the rest running it: sent
Transitions
2026-10-13 18:29 (new) → proposed (announced): novox/mesh-sdk#25's head announced
2026-10-13 18:32 proposed → checked (checked): a verdict names this commit and the trunk's head as its trunk commit
2026-10-13 18:32 checked → ready (accepted): the gate passed or warned, and the repository's own check did not fail
2026-10-13 19:02 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:02 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 19:11 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-sdk@5933eb757d44` — **delivered** since 2026-10-13T19:11:25Z
**Delivery plan** — builds mesh-sdk (+40 dependent(s)) → ace, g14, novox, shanks; no bus step; 9 wait(s) for a person
- tier 0: mesh-sdk
- tier 1: mesh-tools
- tier 2: audit-logger, baserow, bazarr, bookshelf, confluence, gitea, gitlab, grafana, home-assistant, icecast, influxdb, jackett, jira, kometa, lab, letta, lidarr, mailu, mesh-catalog, mesh-vault, minio, mongodb, mosquitto, mssql, netcheck, nextcloud, nftables, nodered, ombi, openai-consumer, radarr, redis, route-adapter, searxng, sonarr, tautulli, umami, unifi, zsh
- ace: receives baserow, bazarr, bookshelf, grafana, home-assistant, icecast, influxdb, jackett, kometa, letta, lidarr, mosquitto, netcheck, nodered, ombi, radarr, redis, searxng, sonarr, tautulli, unifi, zsh; waits for a person: mssql, nftables
- g14: receives netcheck, zsh; waits for a person: nftables
- novox: receives gitea, mesh-catalog, mesh-vault, netcheck, nextcloud, umami, zsh; waits for a person: mailu, minio, mongodb, mssql, nftables
- shanks: receives lab, netcheck, zsh; waits for a person: nftables
- baserow keeps data (ADR 0233): what it holds is backed up before it moves
- bazarr keeps data (ADR 0233): what it holds is backed up before it moves
- bookshelf keeps data (ADR 0233): what it holds is backed up before it moves
- gitea provides npm-package-registry, git: its consumers are sent again after it
- gitea keeps data (ADR 0233): what it holds is backed up before it moves
- grafana keeps data (ADR 0233): what it holds is backed up before it moves
- home-assistant keeps data (ADR 0233): what it holds is backed up before it moves
- icecast keeps data (ADR 0233): what it holds is backed up before it moves
- influxdb provides influxdb-api: its consumers are sent again after it
- influxdb keeps data (ADR 0233): what it holds is backed up before it moves
- jackett provides jackett-api: its consumers are sent again after it
- jackett keeps data (ADR 0233): what it holds is backed up before it moves
- kometa keeps data (ADR 0233): what it holds is backed up before it moves
- lab keeps data (ADR 0233): what it holds is backed up before it moves
- lidarr provides lidarr-api: its consumers are sent again after it
- lidarr keeps data (ADR 0233): what it holds is backed up before it moves
- mailu waits for a person: its policy records (module)
- mailu provides smtp: its consumers are sent again after it
- mailu keeps data (ADR 0233): what it holds is backed up before it moves
- mesh-vault provides secret: its consumers are sent again after it
- mesh-vault keeps data (ADR 0233): what it holds is backed up before it moves
- minio waits for a person: its policy records (module)
- minio provides s3-bucket: its consumers are sent again after it
- minio keeps data (ADR 0233): what it holds is backed up before it moves
- mongodb waits for a person: its policy records (module)
- mongodb provides mongodb-database: its consumers are sent again after it
- mongodb keeps data (ADR 0233): what it holds is backed up before it moves
- mosquitto provides mqtt-topic: its consumers are sent again after it
- mosquitto keeps data (ADR 0233): what it holds is backed up before it moves
- mssql waits for a person: its policy records (module)
- mssql provides mssql-database: its consumers are sent again after it
- mssql keeps data (ADR 0233): what it holds is backed up before it moves
- nextcloud keeps data (ADR 0233): what it holds is backed up before it moves
- nftables waits for a person: its policy records (module)
- nodered keeps data (ADR 0233): what it holds is backed up before it moves
- ombi keeps data (ADR 0233): what it holds is backed up before it moves
- radarr provides radarr-api: its consumers are sent again after it
- radarr keeps data (ADR 0233): what it holds is backed up before it moves
- redis provides redis-cache: its consumers are sent again after it
- redis keeps data (ADR 0233): what it holds is backed up before it moves
- searxng keeps data (ADR 0233): what it holds is backed up before it moves
- sonarr provides sonarr-api: its consumers are sent again after it
- sonarr keeps data (ADR 0233): what it holds is backed up before it moves
- tautulli keeps data (ADR 0233): what it holds is backed up before it moves
- umami provides analytics: its consumers are sent again after it
- umami keeps data (ADR 0233): what it holds is backed up before it moves
- unifi 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 baserow, bazarr, bookshelf, grafana, home-assistant, icecast, influxdb, jackett, kometa, lab, letta, lidarr, mosquitto, netcheck, nodered, ombi, radarr, redis, searxng, sonarr, tautulli, unifi, zsh is judged on its first machine
**Machines**
- mesh-sdk on every machine running it: sent
- mesh-tools on every machine running it: sent
- audit-logger on every machine running it: sent
- baserow on ace: passed — healthy 1 times over 1m16s
- bazarr on ace: passed — judged with baserow: healthy 1 times over 1m16s
- bookshelf on ace: passed — judged with baserow: healthy 1 times over 1m16s
- confluence on every machine running it: sent
- gitlab on every machine running it: sent
- grafana on ace: passed — judged with baserow: healthy 1 times over 1m16s
- home-assistant on ace: passed — judged with baserow: healthy 1 times over 1m16s
- icecast on ace: passed — judged with baserow: healthy 1 times over 1m16s
- influxdb on ace: passed — judged with baserow: healthy 1 times over 1m16s
- jackett on ace: passed — judged with baserow: healthy 1 times over 1m16s
- jira on every machine running it: sent
- kometa on ace: passed — judged with baserow: healthy 1 times over 1m16s
- letta on ace: passed — judged with baserow: healthy 1 times over 1m16s
- lidarr on ace: passed — judged with baserow: healthy 1 times over 1m16s
- mosquitto on ace: passed — judged with baserow: healthy 1 times over 1m16s
- netcheck on ace: passed — judged with baserow: healthy 1 times over 1m16s
- nodered on ace: passed — judged with baserow: healthy 1 times over 1m16s
- ombi on ace: passed — judged with baserow: healthy 1 times over 1m16s
- openai-consumer on every machine running it: sent
- radarr on ace: passed — judged with baserow: healthy 1 times over 1m16s
- redis on ace: passed — judged with baserow: healthy 1 times over 1m16s
- route-adapter on every machine running it: sent
- searxng on ace: passed — judged with baserow: healthy 1 times over 1m16s
- sonarr on ace: passed — judged with baserow: healthy 1 times over 1m16s
- tautulli on ace: passed — judged with baserow: healthy 1 times over 1m16s
- unifi on ace: passed — judged with baserow: healthy 1 times over 1m16s
- zsh on ace: passed — judged with baserow: healthy 1 times over 1m16s
- gitea on novox: passed — healthy 1 times over 27s
- mesh-catalog on novox: passed — judged with gitea: healthy 1 times over 27s
- mesh-vault on novox: passed — judged with gitea: healthy 1 times over 27s
- nextcloud on novox: passed — judged with gitea: healthy 1 times over 27s
- umami on novox: passed — judged with gitea: healthy 1 times over 27s
- lab on shanks: passed — healthy 1 times over 50s
- baserow on the rest running it: sent
- bazarr on the rest running it: sent
- bookshelf on the rest running it: sent
- gitea on the rest running it: sent
- grafana on the rest running it: sent
- home-assistant on the rest running it: sent
- icecast on the rest running it: sent
- influxdb on the rest running it: sent
- jackett on the rest running it: sent
- kometa on the rest running it: sent
- letta on the rest running it: sent
- lidarr on the rest running it: sent
- mesh-catalog on the rest running it: sent
- mesh-vault on the rest running it: sent
- mosquitto on the rest running it: sent
- netcheck on the rest running it: sent
- nextcloud on the rest running it: sent
- nodered on the rest running it: sent
- ombi on the rest running it: sent
- radarr on the rest running it: sent
- redis on the rest running it: sent
- searxng on the rest running it: sent
- sonarr on the rest running it: sent
- tautulli on the rest running it: sent
- umami on the rest running it: sent
- unifi on the rest running it: sent
- zsh on the rest running it: sent
- lab on the rest running it: sent
**Transitions**
- 2026-10-13 18:29 (new) → proposed (announced): novox/mesh-sdk#25's head announced
- 2026-10-13 18:32 proposed → checked (checked): a verdict names this commit and the trunk's head as its trunk commit
- 2026-10-13 18:32 checked → ready (accepted): the gate passed or warned, and the repository's own check did not fail
- 2026-10-13 19:02 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:02 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 19:11 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`.
g14: receives netcheck, zsh; waits for a person: nftables
novox: receives gitea, mesh-catalog, mesh-vault, netcheck, nextcloud, umami, zsh; waits for a person: mailu, minio, mongodb, mssql, nftables
shanks: receives lab, netcheck, zsh; waits for a person: nftables
baserow keeps data (ADR 0233): what it holds is backed up before it moves
bazarr keeps data (ADR 0233): what it holds is backed up before it moves
bookshelf keeps data (ADR 0233): what it holds is backed up before it moves
gitea provides npm-package-registry, git: its consumers are sent again after it
gitea keeps data (ADR 0233): what it holds is backed up before it moves
grafana keeps data (ADR 0233): what it holds is backed up before it moves
home-assistant keeps data (ADR 0233): what it holds is backed up before it moves
icecast keeps data (ADR 0233): what it holds is backed up before it moves
influxdb provides influxdb-api: its consumers are sent again after it
influxdb keeps data (ADR 0233): what it holds is backed up before it moves
jackett provides jackett-api: its consumers are sent again after it
jackett keeps data (ADR 0233): what it holds is backed up before it moves
kometa keeps data (ADR 0233): what it holds is backed up before it moves
lab keeps data (ADR 0233): what it holds is backed up before it moves
lidarr provides lidarr-api: its consumers are sent again after it
lidarr keeps data (ADR 0233): what it holds is backed up before it moves
mailu waits for a person: its policy records (module)
mailu provides smtp: its consumers are sent again after it
mailu keeps data (ADR 0233): what it holds is backed up before it moves
mesh-vault provides secret: its consumers are sent again after it
mesh-vault keeps data (ADR 0233): what it holds is backed up before it moves
minio waits for a person: its policy records (module)
minio provides s3-bucket: its consumers are sent again after it
minio keeps data (ADR 0233): what it holds is backed up before it moves
mongodb waits for a person: its policy records (module)
mongodb provides mongodb-database: its consumers are sent again after it
mongodb keeps data (ADR 0233): what it holds is backed up before it moves
mosquitto provides mqtt-topic: its consumers are sent again after it
mosquitto keeps data (ADR 0233): what it holds is backed up before it moves
mssql waits for a person: its policy records (module)
mssql provides mssql-database: its consumers are sent again after it
mssql keeps data (ADR 0233): what it holds is backed up before it moves
nextcloud keeps data (ADR 0233): what it holds is backed up before it moves
nftables waits for a person: its policy records (module)
nodered keeps data (ADR 0233): what it holds is backed up before it moves
ombi keeps data (ADR 0233): what it holds is backed up before it moves
radarr provides radarr-api: its consumers are sent again after it
radarr keeps data (ADR 0233): what it holds is backed up before it moves
redis provides redis-cache: its consumers are sent again after it
redis keeps data (ADR 0233): what it holds is backed up before it moves
searxng keeps data (ADR 0233): what it holds is backed up before it moves
sonarr provides sonarr-api: its consumers are sent again after it
sonarr keeps data (ADR 0233): what it holds is backed up before it moves
tautulli keeps data (ADR 0233): what it holds is backed up before it moves
umami provides analytics: its consumers are sent again after it
umami keeps data (ADR 0233): what it holds is backed up before it moves
unifi 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 baserow, bazarr, bookshelf, grafana, home-assistant, icecast, influxdb, jackett, kometa, lab, letta, lidarr, mosquitto, netcheck, nodered, ombi, radarr, redis, searxng, sonarr, tautulli, unifi, zsh is judged on its first machine
Run by the build seat on ace as build-1791902226561463094 (builds --log build-1791902226561463094).
# [provisioner:postgres-database] contributions file readable again
# [provisioner:postgres-database] /tmp/prov-TgM0tc/postgres-database.json is for s3-bucket, not postgres-database; nothing applied or removed until it can be read
# [provisioner:postgres-database] contributions file readable again
# [provisioner:postgres-database] /tmp/prov-TgM0tc/postgres-database.json has no given list; nothing applied or removed until it can be read
# [provisioner:postgres-database] contributions file readable again
# [provisioner:postgres-database] RETIREMENT WAITS FOR A PERSON: the mesh no longer asks for 2 of the 2 consumer(s) this provider holds (mesh_anchor_forge, mesh_anchor_mail), more than 3, or more than 50% of the 2 held. Nothing is retired until `retire approve` or `retire reject` (novox/hq ADR 0230)
# [provisioner:postgres-database] could not announce provisioner.retirement waiting: Error: no broker is bound — the tool runtime or provisioner host must call useBroker() before module code reaches the mesh
# [provisioner:postgres-database] retirement of mesh_anchor_forge, mesh_anchor_mail approved by test: both unassigned on purpose
# [provisioner:postgres-database] could not announce provisioner.retirement approved: Error: no broker is bound — the tool runtime or provisioner host must call useBroker() before module code reaches the mesh
# [provisioner:postgres-database] mesh_anchor_forge: no longer in /tmp/prov-TgM0tc/postgres-database.json; RETIRED, MARK ONLY — this provider cannot disable a consumer (its adapter has no retire), so mesh_anchor_forge KEEPS ITS ACCESS and its data until a person deletes it with `cleanup delete`. Nothing was changed in the backend (novox/hq ADR 0230): approved by test: both unassigned on purpose
# [provisioner:postgres-database] mesh_anchor_mail: no longer in /tmp/prov-TgM0tc/postgres-database.json; RETIRED, MARK ONLY — this provider cannot disable a consumer (its adapter has no retire), so mesh_anchor_mail KEEPS ITS ACCESS and its data until a person deletes it with `cleanup delete`. Nothing was changed in the backend (novox/hq ADR 0230): approved by test: both unassigned on purpose
# [provisioner:postgres-database] could not announce provisioner.retirement retired: Error: no broker is bound — the tool runtime or provisioner host must call useBroker() before module code reaches the mesh
# Subtest: provisioner removes nothing while its contributions file cannot be used (novox/hq issue 241)
ok 21 - provisioner removes nothing while its contributions file cannot be used (novox/hq issue 241)
---
duration_ms: 1305.825082
type: 'test'
...
# [provisioner:cache] could not announce provisioner.recovered: Error: no broker is bound — the tool runtime or provisioner host must call useBroker() before module code reaches the mesh
# [provisioner:cache] webapp-anchor: the backend no longer holds it; applying again
# [provisioner:cache] could not announce provisioner.recovered: Error: no broker is bound — the tool runtime or provisioner host must call useBroker() before module code reaches the mesh
# Subtest: provisioner applies again what the backend no longer holds, and trusts memory without holds
ok 22 - provisioner applies again what the backend no longer holds, and trusts memory without holds
---
duration_ms: 212.311268
type: 'test'
...
# [provisioner:cache] could not announce provisioner.recovered: Error: no broker is bound — the tool runtime or provisioner host must call useBroker() before module code reaches the mesh
# [provisioner:cache] webapp-anchor: could not check the backend, will ask again: Error: connection refused
# [provisioner:cache] webapp-anchor: could not check the backend, will ask again: Error: connection refused
# [provisioner:cache] webapp-anchor: could not check the backend, will ask again: Error: connection refused
# Subtest: provisioner keeps a consumer applied when the backend cannot be asked
ok 23 - provisioner keeps a consumer applied when the backend cannot be asked
---
duration_ms: 71.099234
type: 'test'
...
# Subtest: provisioner backs off when create does not satisfy holds, and says so
ok 24 - provisioner backs off when create does not satisfy holds, and says so
---
duration_ms: 401.32725
type: 'test'
...
# Subtest: provisioner treats a failed or hung holds as could-not-ask, and never logs the password
ok 25 - provisioner treats a failed or hung holds as could-not-ask, and never logs the password
---
duration_ms: 401.632382
type: 'test'
...
# Subtest: provisioner stops a verify pass at a timeout, and retries a failed re-apply at the next check
ok 26 - provisioner stops a verify pass at a timeout, and retries a failed re-apply at the next check
---
duration_ms: 301.80248
type: 'test'
...
# Subtest: modules can SERVE: a real async tool, loaded and invoked over the broker
ok 27 - modules can SERVE: a real async tool, loaded and invoked over the broker
---
duration_ms: 30.161063
type: 'test'
...
# Subtest: serving refuses one module exposing two tools of the same name
ok 28 - serving refuses one module exposing two tools of the same name
---
duration_ms: 0.344024
type: 'test'
...
# Subtest: events: a module emits, a listener and the audit sink (\#) both receive it, with metadata
ok 29 - events: a module emits, a listener and the audit sink (\#) both receive it, with metadata
---
duration_ms: 0.444963
type: 'test'
...
# Subtest: each registration is given the environment asked for it, and sees no other's (ADR 0192)
ok 30 - each registration is given the environment asked for it, and sees no other's (ADR 0192)
---
duration_ms: 0.215594
type: 'test'
...
# Subtest: a consumer failed for minutes is announced, naming it, its machine and the class, again while it lasts, and recovered
ok 31 - a consumer failed for minutes is announced, naming it, its machine and the class, again while it lasts, and recovered
---
duration_ms: 590.40164
type: 'test'
...
# Subtest: one success between failures starts the run again
ok 32 - one success between failures starts the run again
---
duration_ms: 186.736537
type: 'test'
...
# Subtest: a check that keeps failing is a failure too
ok 33 - a check that keeps failing is a failure too
---
duration_ms: 193.04565
type: 'test'
...
# Subtest: an unreadable secret is announced as such
ok 34 - an unreadable secret is announced as such
---
duration_ms: 164.78166
type: 'test'
...
# Subtest: a consumer no longer asked for is no longer failing
ok 35 - a consumer no longer asked for is no longer failing
---
duration_ms: 183.583486
type: 'test'
...
# Subtest: a failing consumer the mesh stopped asking for is said recovered when it is retired
ok 36 - a failing consumer the mesh stopped asking for is said recovered when it is retired
---
duration_ms: 234.903351
type: 'test'
...
# Subtest: an error is classed by its words
ok 37 - an error is classed by its words
---
duration_ms: 0.206356
type: 'test'
...
# Subtest: an adapter that classes its own errors is believed
ok 38 - an adapter that classes its own errors is believed
---
duration_ms: 172.31967
type: 'test'
...
# Subtest: the first success since start is announced once
ok 39 - the first success since start is announced once
---
duration_ms: 116.147323
type: 'test'
...
# Subtest: without announce the standing is said through the SDK's emit
ok 40 - without announce the standing is said through the SDK's emit
---
duration_ms: 169.803693
type: 'test'
...
# Subtest: a bundle on stdio lists its tools and answers a call, a seat's verb among them
ok 41 - a bundle on stdio lists its tools and answers a call, a seat's verb among them
---
duration_ms: 126.269071
type: 'test'
...
# Subtest: a bundle served as its module lists the seat's verbs as the seat's, whichever registered first (ADR 0193)
ok 42 - a bundle served as its module lists the seat's verbs as the seat's, whichever registered first (ADR 0193)
---
duration_ms: 82.496755
type: 'test'
...
# Subtest: a launched tool's emit is asked of the runtime, and the call answers once the runtime has published (ADR 0193)
ok 43 - a launched tool's emit is asked of the runtime, and the call answers once the runtime has published (ADR 0193)
---
duration_ms: 82.719373
type: 'test'
...
# Subtest: a launched bundle subscribes as it is imported, handles events the runtime hands it, and asks through it (ADR 0198)
ok 44 - a launched bundle subscribes as it is imported, handles events the runtime hands it, and asks through it (ADR 0198)
---
duration_ms: 3199.753111
type: 'test'
...
# Subtest: a subscribe the runtime refused leaves no handler behind, so one event is handled once (novox/hq issue 276)
ok 45 - a subscribe the runtime refused leaves no handler behind, so one event is handled once (novox/hq issue 276)
---
duration_ms: 82.684292
type: 'test'
...
# Subtest: a launched bundle watches its state as it is imported, has the current values before it goes on, and keeps state through the runtime (ADR 0201)
ok 46 - a launched bundle watches its state as it is imported, has the current values before it goes on, and keeps state through the runtime (ADR 0201)
---
duration_ms: 283.632665
type: 'test'
...
# Subtest: topics match as the runtime's do: * one segment, \# and ** any number
ok 47 - topics match as the runtime's do: * one segment, \# and ** any number
---
duration_ms: 2.650742
type: 'test'
...
1..47
# tests 47
# suites 0
# pass 47
# fail 0
# cancelled 0
# skipped 0
# todo 0
# duration_ms 3943.9342
NOT TESTED HERE: go/ (the Go binding) — the Go toolchain runs it from go/merge-check.sh
NOT TESTED HERE: python/, rust/, c/ — no toolchain of theirs runs a merge check
--- its go/merge-check.sh (go toolchain)
ok git.novox.be/novox/mesh-sdk/go 0.142s
ok git.novox.be/novox/mesh-sdk/go/asker 0.002s
ok git.novox.be/novox/mesh-sdk/go/asks 0.003s
ok git.novox.be/novox/mesh-sdk/go/cli 1.040s
? git.novox.be/novox/mesh-sdk/go/example [no test files]
ok git.novox.be/novox/mesh-sdk/go/health 0.003s
ok git.novox.be/novox/mesh-sdk/go/outward 0.060s
**Merge check** at `9588871d`
Judged: head `9588871d6629` merged into trunk `a0fc82fdcd7c`; read beside it: mesh-catalog `5f491e0c097d`, mesh-controller `6f1a05366c1d`, mesh-controller-main `6f1a05366c1d`, mesh-host `0e92ef3d1b21`, mesh-tools `954e1a53eef9`
- `mesh/merge-gate`: **PASS, WITH A NOTE** — a merge rebuilds 41 module(s) in 3 tier(s) (modules: mesh-sdk; built after them: audit-logger, baserow, bazarr, bookshelf, confluence, gitea, gitlab, grafana, home-assistant, icecast, influxdb, jackett, jira, kometa, lab, letta, lidarr, mailu, mesh-catalog, mesh-tools, mesh-vault, minio, mongodb, mosquitto, mssql, netcheck, nextcloud, nftables, nodered, ombi, openai-consumer, radarr, redis, route-adapter, searxng, sonarr, tautulli, umami, unifi, zsh)
- `mesh/repo-check`: **PASS** — its merge-check.sh passed, each part in its toolchain: merge-check.sh (typescript), go/merge-check.sh (go)
**Delivery plan** — builds mesh-sdk (+40 dependent(s)) → ace, g14, novox, shanks; no bus step; 9 wait(s) for a person
- tier 0: mesh-sdk
- tier 1: mesh-tools
- tier 2: audit-logger, baserow, bazarr, bookshelf, confluence, gitea, gitlab, grafana, home-assistant, icecast, influxdb, jackett, jira, kometa, lab, letta, lidarr, mailu, mesh-catalog, mesh-vault, minio, mongodb, mosquitto, mssql, netcheck, nextcloud, nftables, nodered, ombi, openai-consumer, radarr, redis, route-adapter, searxng, sonarr, tautulli, umami, unifi, zsh
- ace: receives baserow, bazarr, bookshelf, grafana, home-assistant, icecast, influxdb, jackett, kometa, letta, lidarr, mosquitto, netcheck, nodered, ombi, radarr, redis, searxng, sonarr, tautulli, unifi, zsh; waits for a person: mssql, nftables
- g14: receives netcheck, zsh; waits for a person: nftables
- novox: receives gitea, mesh-catalog, mesh-vault, netcheck, nextcloud, umami, zsh; waits for a person: mailu, minio, mongodb, mssql, nftables
- shanks: receives lab, netcheck, zsh; waits for a person: nftables
- baserow keeps data (ADR 0233): what it holds is backed up before it moves
- bazarr keeps data (ADR 0233): what it holds is backed up before it moves
- bookshelf keeps data (ADR 0233): what it holds is backed up before it moves
- gitea provides npm-package-registry, git: its consumers are sent again after it
- gitea keeps data (ADR 0233): what it holds is backed up before it moves
- grafana keeps data (ADR 0233): what it holds is backed up before it moves
- home-assistant keeps data (ADR 0233): what it holds is backed up before it moves
- icecast keeps data (ADR 0233): what it holds is backed up before it moves
- influxdb provides influxdb-api: its consumers are sent again after it
- influxdb keeps data (ADR 0233): what it holds is backed up before it moves
- jackett provides jackett-api: its consumers are sent again after it
- jackett keeps data (ADR 0233): what it holds is backed up before it moves
- kometa keeps data (ADR 0233): what it holds is backed up before it moves
- lab keeps data (ADR 0233): what it holds is backed up before it moves
- lidarr provides lidarr-api: its consumers are sent again after it
- lidarr keeps data (ADR 0233): what it holds is backed up before it moves
- mailu waits for a person: its policy records (module)
- mailu provides smtp: its consumers are sent again after it
- mailu keeps data (ADR 0233): what it holds is backed up before it moves
- mesh-vault provides secret: its consumers are sent again after it
- mesh-vault keeps data (ADR 0233): what it holds is backed up before it moves
- minio waits for a person: its policy records (module)
- minio provides s3-bucket: its consumers are sent again after it
- minio keeps data (ADR 0233): what it holds is backed up before it moves
- mongodb waits for a person: its policy records (module)
- mongodb provides mongodb-database: its consumers are sent again after it
- mongodb keeps data (ADR 0233): what it holds is backed up before it moves
- mosquitto provides mqtt-topic: its consumers are sent again after it
- mosquitto keeps data (ADR 0233): what it holds is backed up before it moves
- mssql waits for a person: its policy records (module)
- mssql provides mssql-database: its consumers are sent again after it
- mssql keeps data (ADR 0233): what it holds is backed up before it moves
- nextcloud keeps data (ADR 0233): what it holds is backed up before it moves
- nftables waits for a person: its policy records (module)
- nodered keeps data (ADR 0233): what it holds is backed up before it moves
- ombi keeps data (ADR 0233): what it holds is backed up before it moves
- radarr provides radarr-api: its consumers are sent again after it
- radarr keeps data (ADR 0233): what it holds is backed up before it moves
- redis provides redis-cache: its consumers are sent again after it
- redis keeps data (ADR 0233): what it holds is backed up before it moves
- searxng keeps data (ADR 0233): what it holds is backed up before it moves
- sonarr provides sonarr-api: its consumers are sent again after it
- sonarr keeps data (ADR 0233): what it holds is backed up before it moves
- tautulli keeps data (ADR 0233): what it holds is backed up before it moves
- umami provides analytics: its consumers are sent again after it
- umami keeps data (ADR 0233): what it holds is backed up before it moves
- unifi 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 baserow, bazarr, bookshelf, grafana, home-assistant, icecast, influxdb, jackett, kometa, lab, letta, lidarr, mosquitto, netcheck, nodered, ombi, radarr, redis, searxng, sonarr, tautulli, unifi, zsh is judged on its first machine
Run by the build seat on ace as `build-1791902226561463094` (`builds --log build-1791902226561463094`).
```
# [provisioner:postgres-database] contributions file readable again
# [provisioner:postgres-database] /tmp/prov-TgM0tc/postgres-database.json is for s3-bucket, not postgres-database; nothing applied or removed until it can be read
# [provisioner:postgres-database] contributions file readable again
# [provisioner:postgres-database] /tmp/prov-TgM0tc/postgres-database.json has no given list; nothing applied or removed until it can be read
# [provisioner:postgres-database] contributions file readable again
# [provisioner:postgres-database] RETIREMENT WAITS FOR A PERSON: the mesh no longer asks for 2 of the 2 consumer(s) this provider holds (mesh_anchor_forge, mesh_anchor_mail), more than 3, or more than 50% of the 2 held. Nothing is retired until `retire approve` or `retire reject` (novox/hq ADR 0230)
# [provisioner:postgres-database] could not announce provisioner.retirement waiting: Error: no broker is bound — the tool runtime or provisioner host must call useBroker() before module code reaches the mesh
# [provisioner:postgres-database] retirement of mesh_anchor_forge, mesh_anchor_mail approved by test: both unassigned on purpose
# [provisioner:postgres-database] could not announce provisioner.retirement approved: Error: no broker is bound — the tool runtime or provisioner host must call useBroker() before module code reaches the mesh
# [provisioner:postgres-database] mesh_anchor_forge: no longer in /tmp/prov-TgM0tc/postgres-database.json; RETIRED, MARK ONLY — this provider cannot disable a consumer (its adapter has no retire), so mesh_anchor_forge KEEPS ITS ACCESS and its data until a person deletes it with `cleanup delete`. Nothing was changed in the backend (novox/hq ADR 0230): approved by test: both unassigned on purpose
# [provisioner:postgres-database] mesh_anchor_mail: no longer in /tmp/prov-TgM0tc/postgres-database.json; RETIRED, MARK ONLY — this provider cannot disable a consumer (its adapter has no retire), so mesh_anchor_mail KEEPS ITS ACCESS and its data until a person deletes it with `cleanup delete`. Nothing was changed in the backend (novox/hq ADR 0230): approved by test: both unassigned on purpose
# [provisioner:postgres-database] could not announce provisioner.retirement retired: Error: no broker is bound — the tool runtime or provisioner host must call useBroker() before module code reaches the mesh
# Subtest: provisioner removes nothing while its contributions file cannot be used (novox/hq issue 241)
ok 21 - provisioner removes nothing while its contributions file cannot be used (novox/hq issue 241)
---
duration_ms: 1305.825082
type: 'test'
...
# [provisioner:cache] could not announce provisioner.recovered: Error: no broker is bound — the tool runtime or provisioner host must call useBroker() before module code reaches the mesh
# [provisioner:cache] webapp-anchor: the backend no longer holds it; applying again
# [provisioner:cache] could not announce provisioner.recovered: Error: no broker is bound — the tool runtime or provisioner host must call useBroker() before module code reaches the mesh
# Subtest: provisioner applies again what the backend no longer holds, and trusts memory without holds
ok 22 - provisioner applies again what the backend no longer holds, and trusts memory without holds
---
duration_ms: 212.311268
type: 'test'
...
# [provisioner:cache] could not announce provisioner.recovered: Error: no broker is bound — the tool runtime or provisioner host must call useBroker() before module code reaches the mesh
# [provisioner:cache] webapp-anchor: could not check the backend, will ask again: Error: connection refused
# [provisioner:cache] webapp-anchor: could not check the backend, will ask again: Error: connection refused
# [provisioner:cache] webapp-anchor: could not check the backend, will ask again: Error: connection refused
# Subtest: provisioner keeps a consumer applied when the backend cannot be asked
ok 23 - provisioner keeps a consumer applied when the backend cannot be asked
---
duration_ms: 71.099234
type: 'test'
...
# Subtest: provisioner backs off when create does not satisfy holds, and says so
ok 24 - provisioner backs off when create does not satisfy holds, and says so
---
duration_ms: 401.32725
type: 'test'
...
# Subtest: provisioner treats a failed or hung holds as could-not-ask, and never logs the password
ok 25 - provisioner treats a failed or hung holds as could-not-ask, and never logs the password
---
duration_ms: 401.632382
type: 'test'
...
# Subtest: provisioner stops a verify pass at a timeout, and retries a failed re-apply at the next check
ok 26 - provisioner stops a verify pass at a timeout, and retries a failed re-apply at the next check
---
duration_ms: 301.80248
type: 'test'
...
# Subtest: modules can SERVE: a real async tool, loaded and invoked over the broker
ok 27 - modules can SERVE: a real async tool, loaded and invoked over the broker
---
duration_ms: 30.161063
type: 'test'
...
# Subtest: serving refuses one module exposing two tools of the same name
ok 28 - serving refuses one module exposing two tools of the same name
---
duration_ms: 0.344024
type: 'test'
...
# Subtest: events: a module emits, a listener and the audit sink (\#) both receive it, with metadata
ok 29 - events: a module emits, a listener and the audit sink (\#) both receive it, with metadata
---
duration_ms: 0.444963
type: 'test'
...
# Subtest: each registration is given the environment asked for it, and sees no other's (ADR 0192)
ok 30 - each registration is given the environment asked for it, and sees no other's (ADR 0192)
---
duration_ms: 0.215594
type: 'test'
...
# Subtest: a consumer failed for minutes is announced, naming it, its machine and the class, again while it lasts, and recovered
ok 31 - a consumer failed for minutes is announced, naming it, its machine and the class, again while it lasts, and recovered
---
duration_ms: 590.40164
type: 'test'
...
# Subtest: one success between failures starts the run again
ok 32 - one success between failures starts the run again
---
duration_ms: 186.736537
type: 'test'
...
# Subtest: a check that keeps failing is a failure too
ok 33 - a check that keeps failing is a failure too
---
duration_ms: 193.04565
type: 'test'
...
# Subtest: an unreadable secret is announced as such
ok 34 - an unreadable secret is announced as such
---
duration_ms: 164.78166
type: 'test'
...
# Subtest: a consumer no longer asked for is no longer failing
ok 35 - a consumer no longer asked for is no longer failing
---
duration_ms: 183.583486
type: 'test'
...
# Subtest: a failing consumer the mesh stopped asking for is said recovered when it is retired
ok 36 - a failing consumer the mesh stopped asking for is said recovered when it is retired
---
duration_ms: 234.903351
type: 'test'
...
# Subtest: an error is classed by its words
ok 37 - an error is classed by its words
---
duration_ms: 0.206356
type: 'test'
...
# Subtest: an adapter that classes its own errors is believed
ok 38 - an adapter that classes its own errors is believed
---
duration_ms: 172.31967
type: 'test'
...
# Subtest: the first success since start is announced once
ok 39 - the first success since start is announced once
---
duration_ms: 116.147323
type: 'test'
...
# Subtest: without announce the standing is said through the SDK's emit
ok 40 - without announce the standing is said through the SDK's emit
---
duration_ms: 169.803693
type: 'test'
...
# Subtest: a bundle on stdio lists its tools and answers a call, a seat's verb among them
ok 41 - a bundle on stdio lists its tools and answers a call, a seat's verb among them
---
duration_ms: 126.269071
type: 'test'
...
# Subtest: a bundle served as its module lists the seat's verbs as the seat's, whichever registered first (ADR 0193)
ok 42 - a bundle served as its module lists the seat's verbs as the seat's, whichever registered first (ADR 0193)
---
duration_ms: 82.496755
type: 'test'
...
# Subtest: a launched tool's emit is asked of the runtime, and the call answers once the runtime has published (ADR 0193)
ok 43 - a launched tool's emit is asked of the runtime, and the call answers once the runtime has published (ADR 0193)
---
duration_ms: 82.719373
type: 'test'
...
# Subtest: a launched bundle subscribes as it is imported, handles events the runtime hands it, and asks through it (ADR 0198)
ok 44 - a launched bundle subscribes as it is imported, handles events the runtime hands it, and asks through it (ADR 0198)
---
duration_ms: 3199.753111
type: 'test'
...
# Subtest: a subscribe the runtime refused leaves no handler behind, so one event is handled once (novox/hq issue 276)
ok 45 - a subscribe the runtime refused leaves no handler behind, so one event is handled once (novox/hq issue 276)
---
duration_ms: 82.684292
type: 'test'
...
# Subtest: a launched bundle watches its state as it is imported, has the current values before it goes on, and keeps state through the runtime (ADR 0201)
ok 46 - a launched bundle watches its state as it is imported, has the current values before it goes on, and keeps state through the runtime (ADR 0201)
---
duration_ms: 283.632665
type: 'test'
...
# Subtest: topics match as the runtime's do: * one segment, \# and ** any number
ok 47 - topics match as the runtime's do: * one segment, \# and ** any number
---
duration_ms: 2.650742
type: 'test'
...
1..47
# tests 47
# suites 0
# pass 47
# fail 0
# cancelled 0
# skipped 0
# todo 0
# duration_ms 3943.9342
NOT TESTED HERE: go/ (the Go binding) — the Go toolchain runs it from go/merge-check.sh
NOT TESTED HERE: python/, rust/, c/ — no toolchain of theirs runs a merge check
--- its go/merge-check.sh (go toolchain)
ok git.novox.be/novox/mesh-sdk/go 0.142s
ok git.novox.be/novox/mesh-sdk/go/asker 0.002s
ok git.novox.be/novox/mesh-sdk/go/asks 0.003s
ok git.novox.be/novox/mesh-sdk/go/cli 1.040s
? git.novox.be/novox/mesh-sdk/go/example [no test files]
ok git.novox.be/novox/mesh-sdk/go/health 0.003s
ok git.novox.be/novox/mesh-sdk/go/outward 0.060s
```
Independent review (issues 383 and 639, ADR 0345).
asks.Glance (go/asks/asks.go:226) holds clause 1's bounds: summary 300 runes, at most 3 points, a point 160 runes, blank lines not counted. Message.Note (asks.go:485) is omitempty, so an empty note leaves the encoding unchanged.
Tests: go test ./... passes niced. Both new tests fail on main (build: Glance and Message.Note undefined there).
Behaviour: the only other change is the Ask.Details comment. Nothing else changes, so the 40 dependents the merge gate names rebuild without a behaviour change of their own.
Note for the group: a channel built before this change drops Note silently, because Go's JSON ignores unknown fields. That is why the messenger and the channels must move together (#278).
Statuses at this head: mesh/merge-gate success ("head 9588871d66 merged into trunk a0fc82fdcd — pass, with a note: builds mesh-sdk (+40 dependent(s)) → ace, g14, novox, shanks; no bus …"), mesh/repo-check success, mesh/delivery success ("ready: it delivers once merged").
Verdict: approve at 9588871d6629e160bb0667f3d97566a0f8f7a4a6
Independent review (issues 383 and 639, ADR 0345).
- `asks.Glance` (go/asks/asks.go:226) holds clause 1's bounds: summary 300 runes, at most 3 points, a point 160 runes, blank lines not counted. `Message.Note` (asks.go:485) is `omitempty`, so an empty note leaves the encoding unchanged.
- Tests: `go test ./...` passes niced. Both new tests fail on main (build: `Glance` and `Message.Note` undefined there).
- Behaviour: the only other change is the `Ask.Details` comment. Nothing else changes, so the 40 dependents the merge gate names rebuild without a behaviour change of their own.
- Note for the group: a channel built before this change drops `Note` silently, because Go's JSON ignores unknown fields. That is why the messenger and the channels must move together (#278).
Statuses at this head: mesh/merge-gate success ("head 9588871d6629 merged into trunk a0fc82fdcd7c — pass, with a note: builds mesh-sdk (+40 dependent(s)) → ace, g14, novox, shanks; no bus …"), mesh/repo-check success, mesh/delivery success ("ready: it delivers once merged").
mesh/merge-gate head f4745447ba6d merged into trunk a0fc82fdcd7c — pass, with a note: builds mesh-sdk (+40 dependent(s)) → ace, g14, novox, shanks; no bus …
mesh/repo-check head f4745447ba6d merged into trunk a0fc82fdcd7c — pass: its merge-check.sh passed, each part in its toolchain: merge-check.sh (typescript)…
The review of mesh-controller #304: a settings proposal with more than three keys showed only the names
of the rest, and its Details could carry no value under the content rule, so Approve bound values the
operator never saw. WholeDetails carries every value whole for the note on a proving channel, held to
the secret rule alone, as Whole is; it is digested only when given.
g14: receives netcheck, zsh; waits for a person: nftables
novox: receives gitea, mesh-catalog, mesh-vault, netcheck, nextcloud, umami, zsh; waits for a person: mailu, minio, mongodb, mssql, nftables
shanks: receives lab, netcheck, zsh; waits for a person: nftables
baserow keeps data (ADR 0233): what it holds is backed up before it moves
bazarr keeps data (ADR 0233): what it holds is backed up before it moves
bookshelf keeps data (ADR 0233): what it holds is backed up before it moves
gitea provides npm-package-registry, git: its consumers are sent again after it
gitea keeps data (ADR 0233): what it holds is backed up before it moves
grafana keeps data (ADR 0233): what it holds is backed up before it moves
home-assistant keeps data (ADR 0233): what it holds is backed up before it moves
icecast keeps data (ADR 0233): what it holds is backed up before it moves
influxdb provides influxdb-api: its consumers are sent again after it
influxdb keeps data (ADR 0233): what it holds is backed up before it moves
jackett provides jackett-api: its consumers are sent again after it
jackett keeps data (ADR 0233): what it holds is backed up before it moves
kometa keeps data (ADR 0233): what it holds is backed up before it moves
lab keeps data (ADR 0233): what it holds is backed up before it moves
lidarr provides lidarr-api: its consumers are sent again after it
lidarr keeps data (ADR 0233): what it holds is backed up before it moves
mailu waits for a person: its policy records (module)
mailu provides smtp: its consumers are sent again after it
mailu keeps data (ADR 0233): what it holds is backed up before it moves
mesh-vault provides secret: its consumers are sent again after it
mesh-vault keeps data (ADR 0233): what it holds is backed up before it moves
minio waits for a person: its policy records (module)
minio provides s3-bucket: its consumers are sent again after it
minio keeps data (ADR 0233): what it holds is backed up before it moves
mongodb waits for a person: its policy records (module)
mongodb provides mongodb-database: its consumers are sent again after it
mongodb keeps data (ADR 0233): what it holds is backed up before it moves
mosquitto provides mqtt-topic: its consumers are sent again after it
mosquitto keeps data (ADR 0233): what it holds is backed up before it moves
mssql waits for a person: its policy records (module)
mssql provides mssql-database: its consumers are sent again after it
mssql keeps data (ADR 0233): what it holds is backed up before it moves
nextcloud keeps data (ADR 0233): what it holds is backed up before it moves
nftables waits for a person: its policy records (module)
nodered keeps data (ADR 0233): what it holds is backed up before it moves
ombi keeps data (ADR 0233): what it holds is backed up before it moves
radarr provides radarr-api: its consumers are sent again after it
radarr keeps data (ADR 0233): what it holds is backed up before it moves
redis provides redis-cache: its consumers are sent again after it
redis keeps data (ADR 0233): what it holds is backed up before it moves
searxng keeps data (ADR 0233): what it holds is backed up before it moves
sonarr provides sonarr-api: its consumers are sent again after it
sonarr keeps data (ADR 0233): what it holds is backed up before it moves
tautulli keeps data (ADR 0233): what it holds is backed up before it moves
umami provides analytics: its consumers are sent again after it
umami keeps data (ADR 0233): what it holds is backed up before it moves
unifi 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 baserow, bazarr, bookshelf, grafana, home-assistant, icecast, influxdb, jackett, kometa, lab, letta, lidarr, mosquitto, netcheck, nodered, ombi, radarr, redis, searxng, sonarr, tautulli, unifi, zsh is judged on its first machine
Run by the build seat on ace as build-1791903405319711731 (builds --log build-1791903405319711731).
# [provisioner:postgres-database] contributions file readable again
# [provisioner:postgres-database] /tmp/prov-ereNu1/postgres-database.json is for s3-bucket, not postgres-database; nothing applied or removed until it can be read
# [provisioner:postgres-database] contributions file readable again
# [provisioner:postgres-database] /tmp/prov-ereNu1/postgres-database.json has no given list; nothing applied or removed until it can be read
# [provisioner:postgres-database] contributions file readable again
# [provisioner:postgres-database] RETIREMENT WAITS FOR A PERSON: the mesh no longer asks for 2 of the 2 consumer(s) this provider holds (mesh_anchor_forge, mesh_anchor_mail), more than 3, or more than 50% of the 2 held. Nothing is retired until `retire approve` or `retire reject` (novox/hq ADR 0230)
# [provisioner:postgres-database] could not announce provisioner.retirement waiting: Error: no broker is bound — the tool runtime or provisioner host must call useBroker() before module code reaches the mesh
# [provisioner:postgres-database] retirement of mesh_anchor_forge, mesh_anchor_mail approved by test: both unassigned on purpose
# [provisioner:postgres-database] could not announce provisioner.retirement approved: Error: no broker is bound — the tool runtime or provisioner host must call useBroker() before module code reaches the mesh
# [provisioner:postgres-database] mesh_anchor_forge: no longer in /tmp/prov-ereNu1/postgres-database.json; RETIRED, MARK ONLY — this provider cannot disable a consumer (its adapter has no retire), so mesh_anchor_forge KEEPS ITS ACCESS and its data until a person deletes it with `cleanup delete`. Nothing was changed in the backend (novox/hq ADR 0230): approved by test: both unassigned on purpose
# [provisioner:postgres-database] mesh_anchor_mail: no longer in /tmp/prov-ereNu1/postgres-database.json; RETIRED, MARK ONLY — this provider cannot disable a consumer (its adapter has no retire), so mesh_anchor_mail KEEPS ITS ACCESS and its data until a person deletes it with `cleanup delete`. Nothing was changed in the backend (novox/hq ADR 0230): approved by test: both unassigned on purpose
# [provisioner:postgres-database] could not announce provisioner.retirement retired: Error: no broker is bound — the tool runtime or provisioner host must call useBroker() before module code reaches the mesh
# Subtest: provisioner removes nothing while its contributions file cannot be used (novox/hq issue 241)
ok 21 - provisioner removes nothing while its contributions file cannot be used (novox/hq issue 241)
---
duration_ms: 1306.98706
type: 'test'
...
# [provisioner:cache] could not announce provisioner.recovered: Error: no broker is bound — the tool runtime or provisioner host must call useBroker() before module code reaches the mesh
# [provisioner:cache] webapp-anchor: the backend no longer holds it; applying again
# [provisioner:cache] could not announce provisioner.recovered: Error: no broker is bound — the tool runtime or provisioner host must call useBroker() before module code reaches the mesh
# Subtest: provisioner applies again what the backend no longer holds, and trusts memory without holds
ok 22 - provisioner applies again what the backend no longer holds, and trusts memory without holds
---
duration_ms: 212.23507
type: 'test'
...
# [provisioner:cache] could not announce provisioner.recovered: Error: no broker is bound — the tool runtime or provisioner host must call useBroker() before module code reaches the mesh
# [provisioner:cache] webapp-anchor: could not check the backend, will ask again: Error: connection refused
# [provisioner:cache] webapp-anchor: could not check the backend, will ask again: Error: connection refused
# [provisioner:cache] webapp-anchor: could not check the backend, will ask again: Error: connection refused
# Subtest: provisioner keeps a consumer applied when the backend cannot be asked
ok 23 - provisioner keeps a consumer applied when the backend cannot be asked
---
duration_ms: 70.722173
type: 'test'
...
# Subtest: provisioner backs off when create does not satisfy holds, and says so
ok 24 - provisioner backs off when create does not satisfy holds, and says so
---
duration_ms: 401.77014
type: 'test'
...
# Subtest: provisioner treats a failed or hung holds as could-not-ask, and never logs the password
ok 25 - provisioner treats a failed or hung holds as could-not-ask, and never logs the password
---
duration_ms: 402.288495
type: 'test'
...
# Subtest: provisioner stops a verify pass at a timeout, and retries a failed re-apply at the next check
ok 26 - provisioner stops a verify pass at a timeout, and retries a failed re-apply at the next check
---
duration_ms: 303.543563
type: 'test'
...
# Subtest: modules can SERVE: a real async tool, loaded and invoked over the broker
ok 27 - modules can SERVE: a real async tool, loaded and invoked over the broker
---
duration_ms: 29.399285
type: 'test'
...
# Subtest: serving refuses one module exposing two tools of the same name
ok 28 - serving refuses one module exposing two tools of the same name
---
duration_ms: 0.591882
type: 'test'
...
# Subtest: events: a module emits, a listener and the audit sink (\#) both receive it, with metadata
ok 29 - events: a module emits, a listener and the audit sink (\#) both receive it, with metadata
---
duration_ms: 0.384733
type: 'test'
...
# Subtest: each registration is given the environment asked for it, and sees no other's (ADR 0192)
ok 30 - each registration is given the environment asked for it, and sees no other's (ADR 0192)
---
duration_ms: 0.238378
type: 'test'
...
# Subtest: a consumer failed for minutes is announced, naming it, its machine and the class, again while it lasts, and recovered
ok 31 - a consumer failed for minutes is announced, naming it, its machine and the class, again while it lasts, and recovered
---
duration_ms: 597.972891
type: 'test'
...
# Subtest: one success between failures starts the run again
ok 32 - one success between failures starts the run again
---
duration_ms: 187.763528
type: 'test'
...
# Subtest: a check that keeps failing is a failure too
ok 33 - a check that keeps failing is a failure too
---
duration_ms: 192.855301
type: 'test'
...
# Subtest: an unreadable secret is announced as such
ok 34 - an unreadable secret is announced as such
---
duration_ms: 169.907092
type: 'test'
...
# Subtest: a consumer no longer asked for is no longer failing
ok 35 - a consumer no longer asked for is no longer failing
---
duration_ms: 182.92888
type: 'test'
...
# Subtest: a failing consumer the mesh stopped asking for is said recovered when it is retired
ok 36 - a failing consumer the mesh stopped asking for is said recovered when it is retired
---
duration_ms: 226.192748
type: 'test'
...
# Subtest: an error is classed by its words
ok 37 - an error is classed by its words
---
duration_ms: 0.215315
type: 'test'
...
# Subtest: an adapter that classes its own errors is believed
ok 38 - an adapter that classes its own errors is believed
---
duration_ms: 169.680126
type: 'test'
...
# Subtest: the first success since start is announced once
ok 39 - the first success since start is announced once
---
duration_ms: 116.057195
type: 'test'
...
# Subtest: without announce the standing is said through the SDK's emit
ok 40 - without announce the standing is said through the SDK's emit
---
duration_ms: 170.389258
type: 'test'
...
# Subtest: a bundle on stdio lists its tools and answers a call, a seat's verb among them
ok 41 - a bundle on stdio lists its tools and answers a call, a seat's verb among them
---
duration_ms: 125.661448
type: 'test'
...
# Subtest: a bundle served as its module lists the seat's verbs as the seat's, whichever registered first (ADR 0193)
ok 42 - a bundle served as its module lists the seat's verbs as the seat's, whichever registered first (ADR 0193)
---
duration_ms: 81.592668
type: 'test'
...
# Subtest: a launched tool's emit is asked of the runtime, and the call answers once the runtime has published (ADR 0193)
ok 43 - a launched tool's emit is asked of the runtime, and the call answers once the runtime has published (ADR 0193)
---
duration_ms: 85.339853
type: 'test'
...
# Subtest: a launched bundle subscribes as it is imported, handles events the runtime hands it, and asks through it (ADR 0198)
ok 44 - a launched bundle subscribes as it is imported, handles events the runtime hands it, and asks through it (ADR 0198)
---
duration_ms: 3198.539059
type: 'test'
...
# Subtest: a subscribe the runtime refused leaves no handler behind, so one event is handled once (novox/hq issue 276)
ok 45 - a subscribe the runtime refused leaves no handler behind, so one event is handled once (novox/hq issue 276)
---
duration_ms: 82.842859
type: 'test'
...
# Subtest: a launched bundle watches its state as it is imported, has the current values before it goes on, and keeps state through the runtime (ADR 0201)
ok 46 - a launched bundle watches its state as it is imported, has the current values before it goes on, and keeps state through the runtime (ADR 0201)
---
duration_ms: 287.334914
type: 'test'
...
# Subtest: topics match as the runtime's do: * one segment, \# and ** any number
ok 47 - topics match as the runtime's do: * one segment, \# and ** any number
---
duration_ms: 2.257975
type: 'test'
...
1..47
# tests 47
# suites 0
# pass 47
# fail 0
# cancelled 0
# skipped 0
# todo 0
# duration_ms 3947.334339
NOT TESTED HERE: go/ (the Go binding) — the Go toolchain runs it from go/merge-check.sh
NOT TESTED HERE: python/, rust/, c/ — no toolchain of theirs runs a merge check
--- its go/merge-check.sh (go toolchain)
ok git.novox.be/novox/mesh-sdk/go 0.142s
ok git.novox.be/novox/mesh-sdk/go/asker 0.002s
ok git.novox.be/novox/mesh-sdk/go/asks 0.003s
ok git.novox.be/novox/mesh-sdk/go/cli 1.036s
? git.novox.be/novox/mesh-sdk/go/example [no test files]
ok git.novox.be/novox/mesh-sdk/go/health 0.003s
ok git.novox.be/novox/mesh-sdk/go/outward 0.051s
**Merge check** at `f4745447`
Judged: head `f4745447ba6d` merged into trunk `a0fc82fdcd7c`; read beside it: mesh-catalog `e209d46faf3d`, mesh-controller `6f1a05366c1d`, mesh-controller-main `6f1a05366c1d`, mesh-host `0e92ef3d1b21`, mesh-tools `954e1a53eef9`
- `mesh/merge-gate`: **PASS, WITH A NOTE** — a merge rebuilds 41 module(s) in 3 tier(s) (modules: mesh-sdk; built after them: audit-logger, baserow, bazarr, bookshelf, confluence, gitea, gitlab, grafana, home-assistant, icecast, influxdb, jackett, jira, kometa, lab, letta, lidarr, mailu, mesh-catalog, mesh-tools, mesh-vault, minio, mongodb, mosquitto, mssql, netcheck, nextcloud, nftables, nodered, ombi, openai-consumer, radarr, redis, route-adapter, searxng, sonarr, tautulli, umami, unifi, zsh)
- `mesh/repo-check`: **PASS** — its merge-check.sh passed, each part in its toolchain: merge-check.sh (typescript), go/merge-check.sh (go)
**Delivery plan** — builds mesh-sdk (+40 dependent(s)) → ace, g14, novox, shanks; no bus step; 9 wait(s) for a person
- tier 0: mesh-sdk
- tier 1: mesh-tools
- tier 2: audit-logger, baserow, bazarr, bookshelf, confluence, gitea, gitlab, grafana, home-assistant, icecast, influxdb, jackett, jira, kometa, lab, letta, lidarr, mailu, mesh-catalog, mesh-vault, minio, mongodb, mosquitto, mssql, netcheck, nextcloud, nftables, nodered, ombi, openai-consumer, radarr, redis, route-adapter, searxng, sonarr, tautulli, umami, unifi, zsh
- ace: receives baserow, bazarr, bookshelf, grafana, home-assistant, icecast, influxdb, jackett, kometa, letta, lidarr, mosquitto, netcheck, nodered, ombi, radarr, redis, searxng, sonarr, tautulli, unifi, zsh; waits for a person: mssql, nftables
- g14: receives netcheck, zsh; waits for a person: nftables
- novox: receives gitea, mesh-catalog, mesh-vault, netcheck, nextcloud, umami, zsh; waits for a person: mailu, minio, mongodb, mssql, nftables
- shanks: receives lab, netcheck, zsh; waits for a person: nftables
- baserow keeps data (ADR 0233): what it holds is backed up before it moves
- bazarr keeps data (ADR 0233): what it holds is backed up before it moves
- bookshelf keeps data (ADR 0233): what it holds is backed up before it moves
- gitea provides npm-package-registry, git: its consumers are sent again after it
- gitea keeps data (ADR 0233): what it holds is backed up before it moves
- grafana keeps data (ADR 0233): what it holds is backed up before it moves
- home-assistant keeps data (ADR 0233): what it holds is backed up before it moves
- icecast keeps data (ADR 0233): what it holds is backed up before it moves
- influxdb provides influxdb-api: its consumers are sent again after it
- influxdb keeps data (ADR 0233): what it holds is backed up before it moves
- jackett provides jackett-api: its consumers are sent again after it
- jackett keeps data (ADR 0233): what it holds is backed up before it moves
- kometa keeps data (ADR 0233): what it holds is backed up before it moves
- lab keeps data (ADR 0233): what it holds is backed up before it moves
- lidarr provides lidarr-api: its consumers are sent again after it
- lidarr keeps data (ADR 0233): what it holds is backed up before it moves
- mailu waits for a person: its policy records (module)
- mailu provides smtp: its consumers are sent again after it
- mailu keeps data (ADR 0233): what it holds is backed up before it moves
- mesh-vault provides secret: its consumers are sent again after it
- mesh-vault keeps data (ADR 0233): what it holds is backed up before it moves
- minio waits for a person: its policy records (module)
- minio provides s3-bucket: its consumers are sent again after it
- minio keeps data (ADR 0233): what it holds is backed up before it moves
- mongodb waits for a person: its policy records (module)
- mongodb provides mongodb-database: its consumers are sent again after it
- mongodb keeps data (ADR 0233): what it holds is backed up before it moves
- mosquitto provides mqtt-topic: its consumers are sent again after it
- mosquitto keeps data (ADR 0233): what it holds is backed up before it moves
- mssql waits for a person: its policy records (module)
- mssql provides mssql-database: its consumers are sent again after it
- mssql keeps data (ADR 0233): what it holds is backed up before it moves
- nextcloud keeps data (ADR 0233): what it holds is backed up before it moves
- nftables waits for a person: its policy records (module)
- nodered keeps data (ADR 0233): what it holds is backed up before it moves
- ombi keeps data (ADR 0233): what it holds is backed up before it moves
- radarr provides radarr-api: its consumers are sent again after it
- radarr keeps data (ADR 0233): what it holds is backed up before it moves
- redis provides redis-cache: its consumers are sent again after it
- redis keeps data (ADR 0233): what it holds is backed up before it moves
- searxng keeps data (ADR 0233): what it holds is backed up before it moves
- sonarr provides sonarr-api: its consumers are sent again after it
- sonarr keeps data (ADR 0233): what it holds is backed up before it moves
- tautulli keeps data (ADR 0233): what it holds is backed up before it moves
- umami provides analytics: its consumers are sent again after it
- umami keeps data (ADR 0233): what it holds is backed up before it moves
- unifi 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 baserow, bazarr, bookshelf, grafana, home-assistant, icecast, influxdb, jackett, kometa, lab, letta, lidarr, mosquitto, netcheck, nodered, ombi, radarr, redis, searxng, sonarr, tautulli, unifi, zsh is judged on its first machine
Run by the build seat on ace as `build-1791903405319711731` (`builds --log build-1791903405319711731`).
```
# [provisioner:postgres-database] contributions file readable again
# [provisioner:postgres-database] /tmp/prov-ereNu1/postgres-database.json is for s3-bucket, not postgres-database; nothing applied or removed until it can be read
# [provisioner:postgres-database] contributions file readable again
# [provisioner:postgres-database] /tmp/prov-ereNu1/postgres-database.json has no given list; nothing applied or removed until it can be read
# [provisioner:postgres-database] contributions file readable again
# [provisioner:postgres-database] RETIREMENT WAITS FOR A PERSON: the mesh no longer asks for 2 of the 2 consumer(s) this provider holds (mesh_anchor_forge, mesh_anchor_mail), more than 3, or more than 50% of the 2 held. Nothing is retired until `retire approve` or `retire reject` (novox/hq ADR 0230)
# [provisioner:postgres-database] could not announce provisioner.retirement waiting: Error: no broker is bound — the tool runtime or provisioner host must call useBroker() before module code reaches the mesh
# [provisioner:postgres-database] retirement of mesh_anchor_forge, mesh_anchor_mail approved by test: both unassigned on purpose
# [provisioner:postgres-database] could not announce provisioner.retirement approved: Error: no broker is bound — the tool runtime or provisioner host must call useBroker() before module code reaches the mesh
# [provisioner:postgres-database] mesh_anchor_forge: no longer in /tmp/prov-ereNu1/postgres-database.json; RETIRED, MARK ONLY — this provider cannot disable a consumer (its adapter has no retire), so mesh_anchor_forge KEEPS ITS ACCESS and its data until a person deletes it with `cleanup delete`. Nothing was changed in the backend (novox/hq ADR 0230): approved by test: both unassigned on purpose
# [provisioner:postgres-database] mesh_anchor_mail: no longer in /tmp/prov-ereNu1/postgres-database.json; RETIRED, MARK ONLY — this provider cannot disable a consumer (its adapter has no retire), so mesh_anchor_mail KEEPS ITS ACCESS and its data until a person deletes it with `cleanup delete`. Nothing was changed in the backend (novox/hq ADR 0230): approved by test: both unassigned on purpose
# [provisioner:postgres-database] could not announce provisioner.retirement retired: Error: no broker is bound — the tool runtime or provisioner host must call useBroker() before module code reaches the mesh
# Subtest: provisioner removes nothing while its contributions file cannot be used (novox/hq issue 241)
ok 21 - provisioner removes nothing while its contributions file cannot be used (novox/hq issue 241)
---
duration_ms: 1306.98706
type: 'test'
...
# [provisioner:cache] could not announce provisioner.recovered: Error: no broker is bound — the tool runtime or provisioner host must call useBroker() before module code reaches the mesh
# [provisioner:cache] webapp-anchor: the backend no longer holds it; applying again
# [provisioner:cache] could not announce provisioner.recovered: Error: no broker is bound — the tool runtime or provisioner host must call useBroker() before module code reaches the mesh
# Subtest: provisioner applies again what the backend no longer holds, and trusts memory without holds
ok 22 - provisioner applies again what the backend no longer holds, and trusts memory without holds
---
duration_ms: 212.23507
type: 'test'
...
# [provisioner:cache] could not announce provisioner.recovered: Error: no broker is bound — the tool runtime or provisioner host must call useBroker() before module code reaches the mesh
# [provisioner:cache] webapp-anchor: could not check the backend, will ask again: Error: connection refused
# [provisioner:cache] webapp-anchor: could not check the backend, will ask again: Error: connection refused
# [provisioner:cache] webapp-anchor: could not check the backend, will ask again: Error: connection refused
# Subtest: provisioner keeps a consumer applied when the backend cannot be asked
ok 23 - provisioner keeps a consumer applied when the backend cannot be asked
---
duration_ms: 70.722173
type: 'test'
...
# Subtest: provisioner backs off when create does not satisfy holds, and says so
ok 24 - provisioner backs off when create does not satisfy holds, and says so
---
duration_ms: 401.77014
type: 'test'
...
# Subtest: provisioner treats a failed or hung holds as could-not-ask, and never logs the password
ok 25 - provisioner treats a failed or hung holds as could-not-ask, and never logs the password
---
duration_ms: 402.288495
type: 'test'
...
# Subtest: provisioner stops a verify pass at a timeout, and retries a failed re-apply at the next check
ok 26 - provisioner stops a verify pass at a timeout, and retries a failed re-apply at the next check
---
duration_ms: 303.543563
type: 'test'
...
# Subtest: modules can SERVE: a real async tool, loaded and invoked over the broker
ok 27 - modules can SERVE: a real async tool, loaded and invoked over the broker
---
duration_ms: 29.399285
type: 'test'
...
# Subtest: serving refuses one module exposing two tools of the same name
ok 28 - serving refuses one module exposing two tools of the same name
---
duration_ms: 0.591882
type: 'test'
...
# Subtest: events: a module emits, a listener and the audit sink (\#) both receive it, with metadata
ok 29 - events: a module emits, a listener and the audit sink (\#) both receive it, with metadata
---
duration_ms: 0.384733
type: 'test'
...
# Subtest: each registration is given the environment asked for it, and sees no other's (ADR 0192)
ok 30 - each registration is given the environment asked for it, and sees no other's (ADR 0192)
---
duration_ms: 0.238378
type: 'test'
...
# Subtest: a consumer failed for minutes is announced, naming it, its machine and the class, again while it lasts, and recovered
ok 31 - a consumer failed for minutes is announced, naming it, its machine and the class, again while it lasts, and recovered
---
duration_ms: 597.972891
type: 'test'
...
# Subtest: one success between failures starts the run again
ok 32 - one success between failures starts the run again
---
duration_ms: 187.763528
type: 'test'
...
# Subtest: a check that keeps failing is a failure too
ok 33 - a check that keeps failing is a failure too
---
duration_ms: 192.855301
type: 'test'
...
# Subtest: an unreadable secret is announced as such
ok 34 - an unreadable secret is announced as such
---
duration_ms: 169.907092
type: 'test'
...
# Subtest: a consumer no longer asked for is no longer failing
ok 35 - a consumer no longer asked for is no longer failing
---
duration_ms: 182.92888
type: 'test'
...
# Subtest: a failing consumer the mesh stopped asking for is said recovered when it is retired
ok 36 - a failing consumer the mesh stopped asking for is said recovered when it is retired
---
duration_ms: 226.192748
type: 'test'
...
# Subtest: an error is classed by its words
ok 37 - an error is classed by its words
---
duration_ms: 0.215315
type: 'test'
...
# Subtest: an adapter that classes its own errors is believed
ok 38 - an adapter that classes its own errors is believed
---
duration_ms: 169.680126
type: 'test'
...
# Subtest: the first success since start is announced once
ok 39 - the first success since start is announced once
---
duration_ms: 116.057195
type: 'test'
...
# Subtest: without announce the standing is said through the SDK's emit
ok 40 - without announce the standing is said through the SDK's emit
---
duration_ms: 170.389258
type: 'test'
...
# Subtest: a bundle on stdio lists its tools and answers a call, a seat's verb among them
ok 41 - a bundle on stdio lists its tools and answers a call, a seat's verb among them
---
duration_ms: 125.661448
type: 'test'
...
# Subtest: a bundle served as its module lists the seat's verbs as the seat's, whichever registered first (ADR 0193)
ok 42 - a bundle served as its module lists the seat's verbs as the seat's, whichever registered first (ADR 0193)
---
duration_ms: 81.592668
type: 'test'
...
# Subtest: a launched tool's emit is asked of the runtime, and the call answers once the runtime has published (ADR 0193)
ok 43 - a launched tool's emit is asked of the runtime, and the call answers once the runtime has published (ADR 0193)
---
duration_ms: 85.339853
type: 'test'
...
# Subtest: a launched bundle subscribes as it is imported, handles events the runtime hands it, and asks through it (ADR 0198)
ok 44 - a launched bundle subscribes as it is imported, handles events the runtime hands it, and asks through it (ADR 0198)
---
duration_ms: 3198.539059
type: 'test'
...
# Subtest: a subscribe the runtime refused leaves no handler behind, so one event is handled once (novox/hq issue 276)
ok 45 - a subscribe the runtime refused leaves no handler behind, so one event is handled once (novox/hq issue 276)
---
duration_ms: 82.842859
type: 'test'
...
# Subtest: a launched bundle watches its state as it is imported, has the current values before it goes on, and keeps state through the runtime (ADR 0201)
ok 46 - a launched bundle watches its state as it is imported, has the current values before it goes on, and keeps state through the runtime (ADR 0201)
---
duration_ms: 287.334914
type: 'test'
...
# Subtest: topics match as the runtime's do: * one segment, \# and ** any number
ok 47 - topics match as the runtime's do: * one segment, \# and ** any number
---
duration_ms: 2.257975
type: 'test'
...
1..47
# tests 47
# suites 0
# pass 47
# fail 0
# cancelled 0
# skipped 0
# todo 0
# duration_ms 3947.334339
NOT TESTED HERE: go/ (the Go binding) — the Go toolchain runs it from go/merge-check.sh
NOT TESTED HERE: python/, rust/, c/ — no toolchain of theirs runs a merge check
--- its go/merge-check.sh (go toolchain)
ok git.novox.be/novox/mesh-sdk/go 0.142s
ok git.novox.be/novox/mesh-sdk/go/asker 0.002s
ok git.novox.be/novox/mesh-sdk/go/asks 0.003s
ok git.novox.be/novox/mesh-sdk/go/cli 1.036s
? git.novox.be/novox/mesh-sdk/go/example [no test files]
ok git.novox.be/novox/mesh-sdk/go/health 0.003s
ok git.novox.be/novox/mesh-sdk/go/outward 0.051s
```
New head f4745447ba: adds Ask.WholeDetails, the Details with every value whole, which the router shows where it shows Whole (the review of mesh-controller #304, ADR 0347). It is digested only when given, so an ask without it digests as before. Test: TestWholeDetailsAreDigestedOnlyWhenGiven, and the field count in TestDigestsAreCanonicalOverNamedFields is now 12.
New head f4745447ba6d: adds `Ask.WholeDetails`, the Details with every value whole, which the router shows where it shows `Whole` (the review of mesh-controller #304, ADR 0347). It is digested only when given, so an ask without it digests as before. Test: `TestWholeDetailsAreDigestedOnlyWhenGiven`, and the field count in `TestDigestsAreCanonicalOverNamedFields` is now 12.
Independent review of the issue 383/639 group under ADR 0345 and ADR 0347.
Blocking: the digest's encoding is no longer unique (go/asks/asks.go:173-182). canonical's own promise (asks.go:142) is that two different sequences of values never encode the same, and Digest is what binds a warrant to the one ask the person was shown. With WholeDetails written as a tag "whole-details" plus its value only when given, and Whole/Details written only when either is given, these two asks digest the same:
A: Whole "", Details "", WholeDetails "+ x: 1"
B: Whole "whole-details", Details "+ x: 1", WholeDetails ""
I confirmed it with a throwaway test at this head (equal=true). They show different words on a proving channel under one digest. Only the asker can build both, so the reach is small, but this is the primitive the tap security rests on. Fix: when WholeDetails is given, always write Whole and Details first (even empty), then WholeDetails, with no tag. An ask without WholeDetails still digests as before, so old asks keep their fingerprint, and a stream of three trailing values can never equal one of two. Add the A/B pair to TestWholeDetailsAreDigestedOnlyWhenGiven.
Checked and fine:
An ask without WholeDetails digests exactly as before. TestWholeDetailsAreDigestedOnlyWhenGiven and the field-count guard (12) cover it.
Glance bounds (300/3/160) and Message.Note with omitempty are fine.
Tests: go test ./asks/ passes at the head (run niced). The new tests fail on main and on 9588871 (build: no WholeDetails).
Not blocking: the Message.Note comment says the note "is never left out". ADR 0347 §5 now lets a channel cut the note last, with the cut said. Reword it when you touch this.
Statuses at this head: mesh/merge-gate success ("head f4745447ba merged into trunk a0fc82fdcd, pass"), mesh/repo-check success, mesh/delivery success ("ready: it delivers once merged"). There is no mesh/delivery-group status on this PR.
Consequence: a new SDK head means mesh-catalog #278 and mesh-controller #304 must re-pin it (go.mod/go.sum, and #304's vendor copy and testdata/beside/CAPTURED), because the router and the controller must digest alike.
Verdict: request changes at f4745447ba6d0c4fd7dc6b1071e26ce012806233
Independent review of the issue 383/639 group under ADR 0345 and ADR 0347.
Blocking: the digest's encoding is no longer unique (go/asks/asks.go:173-182). `canonical`'s own promise (asks.go:142) is that two different sequences of values never encode the same, and Digest is what binds a warrant to the one ask the person was shown. With WholeDetails written as a tag "whole-details" plus its value only when given, and Whole/Details written only when either is given, these two asks digest the same:
- A: Whole "", Details "", WholeDetails "+ x: 1"
- B: Whole "whole-details", Details "+ x: 1", WholeDetails ""
I confirmed it with a throwaway test at this head (equal=true). They show different words on a proving channel under one digest. Only the asker can build both, so the reach is small, but this is the primitive the tap security rests on. Fix: when WholeDetails is given, always write Whole and Details first (even empty), then WholeDetails, with no tag. An ask without WholeDetails still digests as before, so old asks keep their fingerprint, and a stream of three trailing values can never equal one of two. Add the A/B pair to TestWholeDetailsAreDigestedOnlyWhenGiven.
Checked and fine:
- An ask without WholeDetails digests exactly as before. TestWholeDetailsAreDigestedOnlyWhenGiven and the field-count guard (12) cover it.
- Glance bounds (300/3/160) and Message.Note with omitempty are fine.
- Tests: `go test ./asks/` passes at the head (run niced). The new tests fail on main and on 9588871 (build: no WholeDetails).
Not blocking: the Message.Note comment says the note "is never left out". ADR 0347 §5 now lets a channel cut the note last, with the cut said. Reword it when you touch this.
Statuses at this head: mesh/merge-gate success ("head f4745447ba6d merged into trunk a0fc82fdcd7c, pass"), mesh/repo-check success, mesh/delivery success ("ready: it delivers once merged"). There is no mesh/delivery-group status on this PR.
Consequence: a new SDK head means mesh-catalog #278 and mesh-controller #304 must re-pin it (go.mod/go.sum, and #304's vendor copy and testdata/beside/CAPTURED), because the router and the controller must digest alike.
mesh/merge-gate head 5933eb757d44 merged into trunk a0fc82fdcd7c — pass, with a note: builds mesh-sdk (+40 dependent(s)) → ace, g14, novox, shanks; no bus …
mesh/repo-check head 5933eb757d44 merged into trunk a0fc82fdcd7c — pass: its merge-check.sh passed, each part in its toolchain: merge-check.sh (typescript)…
WholeDetails was written after a tag, so an ask with only whole details "+ x: 1" encoded as one whose Whole
was "whole-details" and Details "+ x: 1". Whole and Details are now written whenever whole details are
given, then the whole details, untagged: the number of trailing values tells the three shapes apart, and an
ask without whole details digests as before. The note's comment says what ADR 0347 §5 holds of cuts.
g14: receives netcheck, zsh; waits for a person: nftables
novox: receives gitea, mesh-catalog, mesh-vault, netcheck, nextcloud, umami, zsh; waits for a person: mailu, minio, mongodb, mssql, nftables
shanks: receives lab, netcheck, zsh; waits for a person: nftables
baserow keeps data (ADR 0233): what it holds is backed up before it moves
bazarr keeps data (ADR 0233): what it holds is backed up before it moves
bookshelf keeps data (ADR 0233): what it holds is backed up before it moves
gitea provides npm-package-registry, git: its consumers are sent again after it
gitea keeps data (ADR 0233): what it holds is backed up before it moves
grafana keeps data (ADR 0233): what it holds is backed up before it moves
home-assistant keeps data (ADR 0233): what it holds is backed up before it moves
icecast keeps data (ADR 0233): what it holds is backed up before it moves
influxdb provides influxdb-api: its consumers are sent again after it
influxdb keeps data (ADR 0233): what it holds is backed up before it moves
jackett provides jackett-api: its consumers are sent again after it
jackett keeps data (ADR 0233): what it holds is backed up before it moves
kometa keeps data (ADR 0233): what it holds is backed up before it moves
lab keeps data (ADR 0233): what it holds is backed up before it moves
lidarr provides lidarr-api: its consumers are sent again after it
lidarr keeps data (ADR 0233): what it holds is backed up before it moves
mailu waits for a person: its policy records (module)
mailu provides smtp: its consumers are sent again after it
mailu keeps data (ADR 0233): what it holds is backed up before it moves
mesh-vault provides secret: its consumers are sent again after it
mesh-vault keeps data (ADR 0233): what it holds is backed up before it moves
minio waits for a person: its policy records (module)
minio provides s3-bucket: its consumers are sent again after it
minio keeps data (ADR 0233): what it holds is backed up before it moves
mongodb waits for a person: its policy records (module)
mongodb provides mongodb-database: its consumers are sent again after it
mongodb keeps data (ADR 0233): what it holds is backed up before it moves
mosquitto provides mqtt-topic: its consumers are sent again after it
mosquitto keeps data (ADR 0233): what it holds is backed up before it moves
mssql waits for a person: its policy records (module)
mssql provides mssql-database: its consumers are sent again after it
mssql keeps data (ADR 0233): what it holds is backed up before it moves
nextcloud keeps data (ADR 0233): what it holds is backed up before it moves
nftables waits for a person: its policy records (module)
nodered keeps data (ADR 0233): what it holds is backed up before it moves
ombi keeps data (ADR 0233): what it holds is backed up before it moves
radarr provides radarr-api: its consumers are sent again after it
radarr keeps data (ADR 0233): what it holds is backed up before it moves
redis provides redis-cache: its consumers are sent again after it
redis keeps data (ADR 0233): what it holds is backed up before it moves
searxng keeps data (ADR 0233): what it holds is backed up before it moves
sonarr provides sonarr-api: its consumers are sent again after it
sonarr keeps data (ADR 0233): what it holds is backed up before it moves
tautulli keeps data (ADR 0233): what it holds is backed up before it moves
umami provides analytics: its consumers are sent again after it
umami keeps data (ADR 0233): what it holds is backed up before it moves
unifi 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 baserow, bazarr, bookshelf, grafana, home-assistant, icecast, influxdb, jackett, kometa, lab, letta, lidarr, mosquitto, netcheck, nodered, ombi, radarr, redis, searxng, sonarr, tautulli, unifi, zsh is judged on its first machine
Run by the build seat on shanks as build-1791916193642642959 (builds --log build-1791916193642642959).
# [provisioner:postgres-database] /tmp/prov-7ykKNZ/postgres-database.json is for s3-bucket, not postgres-database; nothing applied or removed until it can be read
# [provisioner:postgres-database] contributions file readable again
# [provisioner:postgres-database] contributions file is not JSON (/tmp/prov-7ykKNZ/postgres-database.json): SyntaxError: Unexpected end of JSON input; nothing applied or removed until it can be read
# [provisioner:postgres-database] /tmp/prov-7ykKNZ/postgres-database.json has no given list; nothing applied or removed until it can be read
# [provisioner:postgres-database] contributions file readable again
# [provisioner:postgres-database] RETIREMENT WAITS FOR A PERSON: the mesh no longer asks for 2 of the 2 consumer(s) this provider holds (mesh_anchor_forge, mesh_anchor_mail), more than 3, or more than 50% of the 2 held. Nothing is retired until `retire approve` or `retire reject` (novox/hq ADR 0230)
# [provisioner:postgres-database] could not announce provisioner.retirement waiting: Error: no broker is bound — the tool runtime or provisioner host must call useBroker() before module code reaches the mesh
# [provisioner:postgres-database] retirement of mesh_anchor_forge, mesh_anchor_mail approved by test: both unassigned on purpose
# [provisioner:postgres-database] could not announce provisioner.retirement approved: Error: no broker is bound — the tool runtime or provisioner host must call useBroker() before module code reaches the mesh
# [provisioner:postgres-database] mesh_anchor_forge: no longer in /tmp/prov-7ykKNZ/postgres-database.json; RETIRED, MARK ONLY — this provider cannot disable a consumer (its adapter has no retire), so mesh_anchor_forge KEEPS ITS ACCESS and its data until a person deletes it with `cleanup delete`. Nothing was changed in the backend (novox/hq ADR 0230): approved by test: both unassigned on purpose
# [provisioner:postgres-database] mesh_anchor_mail: no longer in /tmp/prov-7ykKNZ/postgres-database.json; RETIRED, MARK ONLY — this provider cannot disable a consumer (its adapter has no retire), so mesh_anchor_mail KEEPS ITS ACCESS and its data until a person deletes it with `cleanup delete`. Nothing was changed in the backend (novox/hq ADR 0230): approved by test: both unassigned on purpose
# [provisioner:postgres-database] could not announce provisioner.retirement retired: Error: no broker is bound — the tool runtime or provisioner host must call useBroker() before module code reaches the mesh
# Subtest: provisioner removes nothing while its contributions file cannot be used (novox/hq issue 241)
ok 21 - provisioner removes nothing while its contributions file cannot be used (novox/hq issue 241)
---
duration_ms: 1307.672666
type: 'test'
...
# [provisioner:cache] could not announce provisioner.recovered: Error: no broker is bound — the tool runtime or provisioner host must call useBroker() before module code reaches the mesh
# [provisioner:cache] webapp-anchor: the backend no longer holds it; applying again
# [provisioner:cache] could not announce provisioner.recovered: Error: no broker is bound — the tool runtime or provisioner host must call useBroker() before module code reaches the mesh
# Subtest: provisioner applies again what the backend no longer holds, and trusts memory without holds
ok 22 - provisioner applies again what the backend no longer holds, and trusts memory without holds
---
duration_ms: 212.046453
type: 'test'
...
# [provisioner:cache] could not announce provisioner.recovered: Error: no broker is bound — the tool runtime or provisioner host must call useBroker() before module code reaches the mesh
# [provisioner:cache] webapp-anchor: could not check the backend, will ask again: Error: connection refused
# [provisioner:cache] webapp-anchor: could not check the backend, will ask again: Error: connection refused
# [provisioner:cache] webapp-anchor: could not check the backend, will ask again: Error: connection refused
# Subtest: provisioner keeps a consumer applied when the backend cannot be asked
ok 23 - provisioner keeps a consumer applied when the backend cannot be asked
---
duration_ms: 71.627741
type: 'test'
...
# Subtest: provisioner backs off when create does not satisfy holds, and says so
ok 24 - provisioner backs off when create does not satisfy holds, and says so
---
duration_ms: 402.082972
type: 'test'
...
# Subtest: provisioner treats a failed or hung holds as could-not-ask, and never logs the password
ok 25 - provisioner treats a failed or hung holds as could-not-ask, and never logs the password
---
duration_ms: 401.888109
type: 'test'
...
# Subtest: provisioner stops a verify pass at a timeout, and retries a failed re-apply at the next check
ok 26 - provisioner stops a verify pass at a timeout, and retries a failed re-apply at the next check
---
duration_ms: 302.050984
type: 'test'
...
# Subtest: modules can SERVE: a real async tool, loaded and invoked over the broker
ok 27 - modules can SERVE: a real async tool, loaded and invoked over the broker
---
duration_ms: 29.817868
type: 'test'
...
# Subtest: serving refuses one module exposing two tools of the same name
ok 28 - serving refuses one module exposing two tools of the same name
---
duration_ms: 0.296774
type: 'test'
...
# Subtest: events: a module emits, a listener and the audit sink (\#) both receive it, with metadata
ok 29 - events: a module emits, a listener and the audit sink (\#) both receive it, with metadata
---
duration_ms: 0.427777
type: 'test'
...
# Subtest: each registration is given the environment asked for it, and sees no other's (ADR 0192)
ok 30 - each registration is given the environment asked for it, and sees no other's (ADR 0192)
---
duration_ms: 0.218503
type: 'test'
...
# Subtest: a consumer failed for minutes is announced, naming it, its machine and the class, again while it lasts, and recovered
ok 31 - a consumer failed for minutes is announced, naming it, its machine and the class, again while it lasts, and recovered
---
duration_ms: 597.607883
type: 'test'
...
# Subtest: one success between failures starts the run again
ok 32 - one success between failures starts the run again
---
duration_ms: 189.454231
type: 'test'
...
# Subtest: a check that keeps failing is a failure too
ok 33 - a check that keeps failing is a failure too
---
duration_ms: 194.520906
type: 'test'
...
# Subtest: an unreadable secret is announced as such
ok 34 - an unreadable secret is announced as such
---
duration_ms: 174.288599
type: 'test'
...
# Subtest: a consumer no longer asked for is no longer failing
ok 35 - a consumer no longer asked for is no longer failing
---
duration_ms: 181.554665
type: 'test'
...
# Subtest: a failing consumer the mesh stopped asking for is said recovered when it is retired
ok 36 - a failing consumer the mesh stopped asking for is said recovered when it is retired
---
duration_ms: 229.820334
type: 'test'
...
# Subtest: an error is classed by its words
ok 37 - an error is classed by its words
---
duration_ms: 0.211813
type: 'test'
...
# Subtest: an adapter that classes its own errors is believed
ok 38 - an adapter that classes its own errors is believed
---
duration_ms: 172.320179
type: 'test'
...
# Subtest: the first success since start is announced once
ok 39 - the first success since start is announced once
---
duration_ms: 111.67013
type: 'test'
...
# Subtest: without announce the standing is said through the SDK's emit
ok 40 - without announce the standing is said through the SDK's emit
---
duration_ms: 169.718571
type: 'test'
...
# Subtest: a bundle on stdio lists its tools and answers a call, a seat's verb among them
ok 41 - a bundle on stdio lists its tools and answers a call, a seat's verb among them
---
duration_ms: 127.630634
type: 'test'
...
# Subtest: a bundle served as its module lists the seat's verbs as the seat's, whichever registered first (ADR 0193)
ok 42 - a bundle served as its module lists the seat's verbs as the seat's, whichever registered first (ADR 0193)
---
duration_ms: 82.887496
type: 'test'
...
# Subtest: a launched tool's emit is asked of the runtime, and the call answers once the runtime has published (ADR 0193)
ok 43 - a launched tool's emit is asked of the runtime, and the call answers once the runtime has published (ADR 0193)
---
duration_ms: 82.612844
type: 'test'
...
# Subtest: a launched bundle subscribes as it is imported, handles events the runtime hands it, and asks through it (ADR 0198)
ok 44 - a launched bundle subscribes as it is imported, handles events the runtime hands it, and asks through it (ADR 0198)
---
duration_ms: 3206.436198
type: 'test'
...
# Subtest: a subscribe the runtime refused leaves no handler behind, so one event is handled once (novox/hq issue 276)
ok 45 - a subscribe the runtime refused leaves no handler behind, so one event is handled once (novox/hq issue 276)
---
duration_ms: 83.044349
type: 'test'
...
# Subtest: a launched bundle watches its state as it is imported, has the current values before it goes on, and keeps state through the runtime (ADR 0201)
ok 46 - a launched bundle watches its state as it is imported, has the current values before it goes on, and keeps state through the runtime (ADR 0201)
---
duration_ms: 286.16848
type: 'test'
...
# Subtest: topics match as the runtime's do: * one segment, \# and ** any number
ok 47 - topics match as the runtime's do: * one segment, \# and ** any number
---
duration_ms: 2.172442
type: 'test'
...
1..47
# tests 47
# suites 0
# pass 47
# fail 0
# cancelled 0
# skipped 0
# todo 0
# duration_ms 3977.456146
NOT TESTED HERE: go/ (the Go binding) — the Go toolchain runs it from go/merge-check.sh
NOT TESTED HERE: python/, rust/, c/ — no toolchain of theirs runs a merge check
--- its go/merge-check.sh (go toolchain)
ok git.novox.be/novox/mesh-sdk/go 0.148s
ok git.novox.be/novox/mesh-sdk/go/asker 0.002s
ok git.novox.be/novox/mesh-sdk/go/asks 0.003s
ok git.novox.be/novox/mesh-sdk/go/cli 1.024s
? git.novox.be/novox/mesh-sdk/go/example [no test files]
ok git.novox.be/novox/mesh-sdk/go/health 0.003s
ok git.novox.be/novox/mesh-sdk/go/outward 0.066s
**Merge check** at `5933eb75`
Judged: head `5933eb757d44` merged into trunk `a0fc82fdcd7c`; read beside it: mesh-catalog `9c166398f204`, mesh-controller `9f3aa91e812b`, mesh-controller-main `9f3aa91e812b`, mesh-host `0e92ef3d1b21`, mesh-tools `954e1a53eef9`
- `mesh/merge-gate`: **PASS, WITH A NOTE** — a merge rebuilds 41 module(s) in 3 tier(s) (modules: mesh-sdk; built after them: audit-logger, baserow, bazarr, bookshelf, confluence, gitea, gitlab, grafana, home-assistant, icecast, influxdb, jackett, jira, kometa, lab, letta, lidarr, mailu, mesh-catalog, mesh-tools, mesh-vault, minio, mongodb, mosquitto, mssql, netcheck, nextcloud, nftables, nodered, ombi, openai-consumer, radarr, redis, route-adapter, searxng, sonarr, tautulli, umami, unifi, zsh)
- `mesh/repo-check`: **PASS** — its merge-check.sh passed, each part in its toolchain: merge-check.sh (typescript), go/merge-check.sh (go)
**Delivery plan** — builds mesh-sdk (+40 dependent(s)) → ace, g14, novox, shanks; no bus step; 9 wait(s) for a person
- tier 0: mesh-sdk
- tier 1: mesh-tools
- tier 2: audit-logger, baserow, bazarr, bookshelf, confluence, gitea, gitlab, grafana, home-assistant, icecast, influxdb, jackett, jira, kometa, lab, letta, lidarr, mailu, mesh-catalog, mesh-vault, minio, mongodb, mosquitto, mssql, netcheck, nextcloud, nftables, nodered, ombi, openai-consumer, radarr, redis, route-adapter, searxng, sonarr, tautulli, umami, unifi, zsh
- ace: receives baserow, bazarr, bookshelf, grafana, home-assistant, icecast, influxdb, jackett, kometa, letta, lidarr, mosquitto, netcheck, nodered, ombi, radarr, redis, searxng, sonarr, tautulli, unifi, zsh; waits for a person: mssql, nftables
- g14: receives netcheck, zsh; waits for a person: nftables
- novox: receives gitea, mesh-catalog, mesh-vault, netcheck, nextcloud, umami, zsh; waits for a person: mailu, minio, mongodb, mssql, nftables
- shanks: receives lab, netcheck, zsh; waits for a person: nftables
- baserow keeps data (ADR 0233): what it holds is backed up before it moves
- bazarr keeps data (ADR 0233): what it holds is backed up before it moves
- bookshelf keeps data (ADR 0233): what it holds is backed up before it moves
- gitea provides npm-package-registry, git: its consumers are sent again after it
- gitea keeps data (ADR 0233): what it holds is backed up before it moves
- grafana keeps data (ADR 0233): what it holds is backed up before it moves
- home-assistant keeps data (ADR 0233): what it holds is backed up before it moves
- icecast keeps data (ADR 0233): what it holds is backed up before it moves
- influxdb provides influxdb-api: its consumers are sent again after it
- influxdb keeps data (ADR 0233): what it holds is backed up before it moves
- jackett provides jackett-api: its consumers are sent again after it
- jackett keeps data (ADR 0233): what it holds is backed up before it moves
- kometa keeps data (ADR 0233): what it holds is backed up before it moves
- lab keeps data (ADR 0233): what it holds is backed up before it moves
- lidarr provides lidarr-api: its consumers are sent again after it
- lidarr keeps data (ADR 0233): what it holds is backed up before it moves
- mailu waits for a person: its policy records (module)
- mailu provides smtp: its consumers are sent again after it
- mailu keeps data (ADR 0233): what it holds is backed up before it moves
- mesh-vault provides secret: its consumers are sent again after it
- mesh-vault keeps data (ADR 0233): what it holds is backed up before it moves
- minio waits for a person: its policy records (module)
- minio provides s3-bucket: its consumers are sent again after it
- minio keeps data (ADR 0233): what it holds is backed up before it moves
- mongodb waits for a person: its policy records (module)
- mongodb provides mongodb-database: its consumers are sent again after it
- mongodb keeps data (ADR 0233): what it holds is backed up before it moves
- mosquitto provides mqtt-topic: its consumers are sent again after it
- mosquitto keeps data (ADR 0233): what it holds is backed up before it moves
- mssql waits for a person: its policy records (module)
- mssql provides mssql-database: its consumers are sent again after it
- mssql keeps data (ADR 0233): what it holds is backed up before it moves
- nextcloud keeps data (ADR 0233): what it holds is backed up before it moves
- nftables waits for a person: its policy records (module)
- nodered keeps data (ADR 0233): what it holds is backed up before it moves
- ombi keeps data (ADR 0233): what it holds is backed up before it moves
- radarr provides radarr-api: its consumers are sent again after it
- radarr keeps data (ADR 0233): what it holds is backed up before it moves
- redis provides redis-cache: its consumers are sent again after it
- redis keeps data (ADR 0233): what it holds is backed up before it moves
- searxng keeps data (ADR 0233): what it holds is backed up before it moves
- sonarr provides sonarr-api: its consumers are sent again after it
- sonarr keeps data (ADR 0233): what it holds is backed up before it moves
- tautulli keeps data (ADR 0233): what it holds is backed up before it moves
- umami provides analytics: its consumers are sent again after it
- umami keeps data (ADR 0233): what it holds is backed up before it moves
- unifi 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 baserow, bazarr, bookshelf, grafana, home-assistant, icecast, influxdb, jackett, kometa, lab, letta, lidarr, mosquitto, netcheck, nodered, ombi, radarr, redis, searxng, sonarr, tautulli, unifi, zsh is judged on its first machine
Run by the build seat on shanks as `build-1791916193642642959` (`builds --log build-1791916193642642959`).
```
# [provisioner:postgres-database] /tmp/prov-7ykKNZ/postgres-database.json is for s3-bucket, not postgres-database; nothing applied or removed until it can be read
# [provisioner:postgres-database] contributions file readable again
# [provisioner:postgres-database] contributions file is not JSON (/tmp/prov-7ykKNZ/postgres-database.json): SyntaxError: Unexpected end of JSON input; nothing applied or removed until it can be read
# [provisioner:postgres-database] /tmp/prov-7ykKNZ/postgres-database.json has no given list; nothing applied or removed until it can be read
# [provisioner:postgres-database] contributions file readable again
# [provisioner:postgres-database] RETIREMENT WAITS FOR A PERSON: the mesh no longer asks for 2 of the 2 consumer(s) this provider holds (mesh_anchor_forge, mesh_anchor_mail), more than 3, or more than 50% of the 2 held. Nothing is retired until `retire approve` or `retire reject` (novox/hq ADR 0230)
# [provisioner:postgres-database] could not announce provisioner.retirement waiting: Error: no broker is bound — the tool runtime or provisioner host must call useBroker() before module code reaches the mesh
# [provisioner:postgres-database] retirement of mesh_anchor_forge, mesh_anchor_mail approved by test: both unassigned on purpose
# [provisioner:postgres-database] could not announce provisioner.retirement approved: Error: no broker is bound — the tool runtime or provisioner host must call useBroker() before module code reaches the mesh
# [provisioner:postgres-database] mesh_anchor_forge: no longer in /tmp/prov-7ykKNZ/postgres-database.json; RETIRED, MARK ONLY — this provider cannot disable a consumer (its adapter has no retire), so mesh_anchor_forge KEEPS ITS ACCESS and its data until a person deletes it with `cleanup delete`. Nothing was changed in the backend (novox/hq ADR 0230): approved by test: both unassigned on purpose
# [provisioner:postgres-database] mesh_anchor_mail: no longer in /tmp/prov-7ykKNZ/postgres-database.json; RETIRED, MARK ONLY — this provider cannot disable a consumer (its adapter has no retire), so mesh_anchor_mail KEEPS ITS ACCESS and its data until a person deletes it with `cleanup delete`. Nothing was changed in the backend (novox/hq ADR 0230): approved by test: both unassigned on purpose
# [provisioner:postgres-database] could not announce provisioner.retirement retired: Error: no broker is bound — the tool runtime or provisioner host must call useBroker() before module code reaches the mesh
# Subtest: provisioner removes nothing while its contributions file cannot be used (novox/hq issue 241)
ok 21 - provisioner removes nothing while its contributions file cannot be used (novox/hq issue 241)
---
duration_ms: 1307.672666
type: 'test'
...
# [provisioner:cache] could not announce provisioner.recovered: Error: no broker is bound — the tool runtime or provisioner host must call useBroker() before module code reaches the mesh
# [provisioner:cache] webapp-anchor: the backend no longer holds it; applying again
# [provisioner:cache] could not announce provisioner.recovered: Error: no broker is bound — the tool runtime or provisioner host must call useBroker() before module code reaches the mesh
# Subtest: provisioner applies again what the backend no longer holds, and trusts memory without holds
ok 22 - provisioner applies again what the backend no longer holds, and trusts memory without holds
---
duration_ms: 212.046453
type: 'test'
...
# [provisioner:cache] could not announce provisioner.recovered: Error: no broker is bound — the tool runtime or provisioner host must call useBroker() before module code reaches the mesh
# [provisioner:cache] webapp-anchor: could not check the backend, will ask again: Error: connection refused
# [provisioner:cache] webapp-anchor: could not check the backend, will ask again: Error: connection refused
# [provisioner:cache] webapp-anchor: could not check the backend, will ask again: Error: connection refused
# Subtest: provisioner keeps a consumer applied when the backend cannot be asked
ok 23 - provisioner keeps a consumer applied when the backend cannot be asked
---
duration_ms: 71.627741
type: 'test'
...
# Subtest: provisioner backs off when create does not satisfy holds, and says so
ok 24 - provisioner backs off when create does not satisfy holds, and says so
---
duration_ms: 402.082972
type: 'test'
...
# Subtest: provisioner treats a failed or hung holds as could-not-ask, and never logs the password
ok 25 - provisioner treats a failed or hung holds as could-not-ask, and never logs the password
---
duration_ms: 401.888109
type: 'test'
...
# Subtest: provisioner stops a verify pass at a timeout, and retries a failed re-apply at the next check
ok 26 - provisioner stops a verify pass at a timeout, and retries a failed re-apply at the next check
---
duration_ms: 302.050984
type: 'test'
...
# Subtest: modules can SERVE: a real async tool, loaded and invoked over the broker
ok 27 - modules can SERVE: a real async tool, loaded and invoked over the broker
---
duration_ms: 29.817868
type: 'test'
...
# Subtest: serving refuses one module exposing two tools of the same name
ok 28 - serving refuses one module exposing two tools of the same name
---
duration_ms: 0.296774
type: 'test'
...
# Subtest: events: a module emits, a listener and the audit sink (\#) both receive it, with metadata
ok 29 - events: a module emits, a listener and the audit sink (\#) both receive it, with metadata
---
duration_ms: 0.427777
type: 'test'
...
# Subtest: each registration is given the environment asked for it, and sees no other's (ADR 0192)
ok 30 - each registration is given the environment asked for it, and sees no other's (ADR 0192)
---
duration_ms: 0.218503
type: 'test'
...
# Subtest: a consumer failed for minutes is announced, naming it, its machine and the class, again while it lasts, and recovered
ok 31 - a consumer failed for minutes is announced, naming it, its machine and the class, again while it lasts, and recovered
---
duration_ms: 597.607883
type: 'test'
...
# Subtest: one success between failures starts the run again
ok 32 - one success between failures starts the run again
---
duration_ms: 189.454231
type: 'test'
...
# Subtest: a check that keeps failing is a failure too
ok 33 - a check that keeps failing is a failure too
---
duration_ms: 194.520906
type: 'test'
...
# Subtest: an unreadable secret is announced as such
ok 34 - an unreadable secret is announced as such
---
duration_ms: 174.288599
type: 'test'
...
# Subtest: a consumer no longer asked for is no longer failing
ok 35 - a consumer no longer asked for is no longer failing
---
duration_ms: 181.554665
type: 'test'
...
# Subtest: a failing consumer the mesh stopped asking for is said recovered when it is retired
ok 36 - a failing consumer the mesh stopped asking for is said recovered when it is retired
---
duration_ms: 229.820334
type: 'test'
...
# Subtest: an error is classed by its words
ok 37 - an error is classed by its words
---
duration_ms: 0.211813
type: 'test'
...
# Subtest: an adapter that classes its own errors is believed
ok 38 - an adapter that classes its own errors is believed
---
duration_ms: 172.320179
type: 'test'
...
# Subtest: the first success since start is announced once
ok 39 - the first success since start is announced once
---
duration_ms: 111.67013
type: 'test'
...
# Subtest: without announce the standing is said through the SDK's emit
ok 40 - without announce the standing is said through the SDK's emit
---
duration_ms: 169.718571
type: 'test'
...
# Subtest: a bundle on stdio lists its tools and answers a call, a seat's verb among them
ok 41 - a bundle on stdio lists its tools and answers a call, a seat's verb among them
---
duration_ms: 127.630634
type: 'test'
...
# Subtest: a bundle served as its module lists the seat's verbs as the seat's, whichever registered first (ADR 0193)
ok 42 - a bundle served as its module lists the seat's verbs as the seat's, whichever registered first (ADR 0193)
---
duration_ms: 82.887496
type: 'test'
...
# Subtest: a launched tool's emit is asked of the runtime, and the call answers once the runtime has published (ADR 0193)
ok 43 - a launched tool's emit is asked of the runtime, and the call answers once the runtime has published (ADR 0193)
---
duration_ms: 82.612844
type: 'test'
...
# Subtest: a launched bundle subscribes as it is imported, handles events the runtime hands it, and asks through it (ADR 0198)
ok 44 - a launched bundle subscribes as it is imported, handles events the runtime hands it, and asks through it (ADR 0198)
---
duration_ms: 3206.436198
type: 'test'
...
# Subtest: a subscribe the runtime refused leaves no handler behind, so one event is handled once (novox/hq issue 276)
ok 45 - a subscribe the runtime refused leaves no handler behind, so one event is handled once (novox/hq issue 276)
---
duration_ms: 83.044349
type: 'test'
...
# Subtest: a launched bundle watches its state as it is imported, has the current values before it goes on, and keeps state through the runtime (ADR 0201)
ok 46 - a launched bundle watches its state as it is imported, has the current values before it goes on, and keeps state through the runtime (ADR 0201)
---
duration_ms: 286.16848
type: 'test'
...
# Subtest: topics match as the runtime's do: * one segment, \# and ** any number
ok 47 - topics match as the runtime's do: * one segment, \# and ** any number
---
duration_ms: 2.172442
type: 'test'
...
1..47
# tests 47
# suites 0
# pass 47
# fail 0
# cancelled 0
# skipped 0
# todo 0
# duration_ms 3977.456146
NOT TESTED HERE: go/ (the Go binding) — the Go toolchain runs it from go/merge-check.sh
NOT TESTED HERE: python/, rust/, c/ — no toolchain of theirs runs a merge check
--- its go/merge-check.sh (go toolchain)
ok git.novox.be/novox/mesh-sdk/go 0.148s
ok git.novox.be/novox/mesh-sdk/go/asker 0.002s
ok git.novox.be/novox/mesh-sdk/go/asks 0.003s
ok git.novox.be/novox/mesh-sdk/go/cli 1.024s
? git.novox.be/novox/mesh-sdk/go/example [no test files]
ok git.novox.be/novox/mesh-sdk/go/health 0.003s
ok git.novox.be/novox/mesh-sdk/go/outward 0.066s
```
New head 5933eb757d answers review 223. When whole details are given, Whole and Details are always written first (even when empty), then the whole details, with no tag. So the trailing values come in three fixed shapes (none, two or three), and the count tells them apart. An ask without whole details keeps its old digest. New test: TestWholeDetailsCollideWithNoOtherAsk; on the previous head, {WholeDetails: "+ x: 1"} and {Whole: "whole-details", Details: "+ x: 1"} collided. The Message.Note comment now states the cut rule of ADR 0347 §5.
New head 5933eb757d44 answers review 223. When whole details are given, Whole and Details are always written first (even when empty), then the whole details, with no tag. So the trailing values come in three fixed shapes (none, two or three), and the count tells them apart. An ask without whole details keeps its old digest. New test: `TestWholeDetailsCollideWithNoOtherAsk`; on the previous head, `{WholeDetails: "+ x: 1"}` and `{Whole: "whole-details", Details: "+ x: 1"}` collided. The `Message.Note` comment now states the cut rule of ADR 0347 §5.
Re-review after review 223. Whole and Details are now written whenever any of the three is given, and WholeDetails after them with no tag (go/asks/asks.go:173-184). The fields after the options therefore take one of three shapes, which the count of values tells apart.
I reran my collision probe at this head. Ask A {WholeDetails "+ x: 1"} and ask B {Whole "whole-details", Details "+ x: 1"} now digest differently, and so do A and {Details "+ x: 1"}.
An ask without WholeDetails digests as before, so old asks keep their fingerprint. TestWholeDetailsAreDigestedOnlyWhenGiven covers this.
TestWholeDetailsCollideWithNoOtherAsk fails on f4745447, the previous head ("asks 0 and 1 digest the same"), and passes here. The rest of go test ./asks/ passes (run niced).
The Message.Note comment now follows ADR 0347 §5.
Statuses at this head: mesh/merge-gate success ("head 5933eb757d merged into trunk a0fc82fdcd — pass, with a note: builds mesh-sdk (+40 dependent(s)) → ace, g14, novox, shanks"), mesh/repo-check success ("head 5933eb757d merged into trunk a0fc82fdcd — pass: its merge-check.sh passed"), mesh/delivery success ("ready: it delivers once merged"). This PR has no mesh/delivery-group status.
Verdict: approve at 5933eb757d443293631be2bed27a96288c2348d8
Re-review after review 223. Whole and Details are now written whenever any of the three is given, and WholeDetails after them with no tag (go/asks/asks.go:173-184). The fields after the options therefore take one of three shapes, which the count of values tells apart.
- I reran my collision probe at this head. Ask A {WholeDetails "+ x: 1"} and ask B {Whole "whole-details", Details "+ x: 1"} now digest differently, and so do A and {Details "+ x: 1"}.
- An ask without WholeDetails digests as before, so old asks keep their fingerprint. TestWholeDetailsAreDigestedOnlyWhenGiven covers this.
- TestWholeDetailsCollideWithNoOtherAsk fails on f4745447, the previous head ("asks 0 and 1 digest the same"), and passes here. The rest of `go test ./asks/` passes (run niced).
- The Message.Note comment now follows ADR 0347 §5.
Statuses at this head: mesh/merge-gate success ("head 5933eb757d44 merged into trunk a0fc82fdcd7c — pass, with a note: builds mesh-sdk (+40 dependent(s)) → ace, g14, novox, shanks"), mesh/repo-check success ("head 5933eb757d44 merged into trunk a0fc82fdcd7c — pass: its merge-check.sh passed"), mesh/delivery success ("ready: it delivers once merged"). This PR has no mesh/delivery-group status.
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.
What.
asks.Message.Note: a message's secondary words (who asked and when, what each answer does, the expiry, the ask's Details), which a channel shows apart, smaller or collapsed where it can, and never leaves out.asks.GlancewithSummaryLength(300),MostPoints(3) andPointLength(160): the bound of an ask's explanation, a summary on its first line and at most three points. The doc ofAsk.Detailsnow says the router shows it in the note.Why. The operator would not read the Telegram ask for ADR 0343 (issue 639): thirty plain lines, no summary, no formatting. Settings proposals were the same (issue 383). ADR 0345 (proposed, needs the operator) decides the shape.
Compatibility.
Noteis omitted when empty, so a channel older than it reads every message it read before. Nothing inAsk.Digestchanges.Tested.
go/merge-check.sh(gofmt, vet, all tests). New:TestAnExplanationReadsAtAGlance,TestAMessageCarriesItsNoteApart; both fail on main (neitherGlancenorNoteexists there).Used by mesh-catalog and mesh-controller pull requests for the same issues, pinned at this head (
9588871).Fixes issue 639 (with issue 383).
Delivery
novox/mesh-sdk@5933eb757d44— delivered since 2026-10-13T19:11:25ZDelivery plan — builds mesh-sdk (+40 dependent(s)) → ace, g14, novox, shanks; no bus step; 9 wait(s) for a person
Machines
Transitions
The commit's note under
refs/notes/mesh-plankeeps every transition:git log --notes=mesh-plan.Merge check at
9588871dJudged: head
9588871d6629merged into trunka0fc82fdcd7c; read beside it: mesh-catalog5f491e0c097d, mesh-controller6f1a05366c1d, mesh-controller-main6f1a05366c1d, mesh-host0e92ef3d1b21, mesh-tools954e1a53eef9mesh/merge-gate: PASS, WITH A NOTE — a merge rebuilds 41 module(s) in 3 tier(s) (modules: mesh-sdk; built after them: audit-logger, baserow, bazarr, bookshelf, confluence, gitea, gitlab, grafana, home-assistant, icecast, influxdb, jackett, jira, kometa, lab, letta, lidarr, mailu, mesh-catalog, mesh-tools, mesh-vault, minio, mongodb, mosquitto, mssql, netcheck, nextcloud, nftables, nodered, ombi, openai-consumer, radarr, redis, route-adapter, searxng, sonarr, tautulli, umami, unifi, zsh)mesh/repo-check: PASS — its merge-check.sh passed, each part in its toolchain: merge-check.sh (typescript), go/merge-check.sh (go)Delivery plan — builds mesh-sdk (+40 dependent(s)) → ace, g14, novox, shanks; no bus step; 9 wait(s) for a person
Run by the build seat on ace as
build-1791902226561463094(builds --log build-1791902226561463094).Verdict: approve at
9588871d66Independent review (issues 383 and 639, ADR 0345).
asks.Glance(go/asks/asks.go:226) holds clause 1's bounds: summary 300 runes, at most 3 points, a point 160 runes, blank lines not counted.Message.Note(asks.go:485) isomitempty, so an empty note leaves the encoding unchanged.go test ./...passes niced. Both new tests fail on main (build:GlanceandMessage.Noteundefined there).Ask.Detailscomment. Nothing else changes, so the 40 dependents the merge gate names rebuild without a behaviour change of their own.Notesilently, because Go's JSON ignores unknown fields. That is why the messenger and the channels must move together (#278).Statuses at this head: mesh/merge-gate success ("head
9588871d66merged into trunka0fc82fdcd— pass, with a note: builds mesh-sdk (+40 dependent(s)) → ace, g14, novox, shanks; no bus …"), mesh/repo-check success, mesh/delivery success ("ready: it delivers once merged").Merge check at
f4745447Judged: head
f4745447ba6dmerged into trunka0fc82fdcd7c; read beside it: mesh-cataloge209d46faf3d, mesh-controller6f1a05366c1d, mesh-controller-main6f1a05366c1d, mesh-host0e92ef3d1b21, mesh-tools954e1a53eef9mesh/merge-gate: PASS, WITH A NOTE — a merge rebuilds 41 module(s) in 3 tier(s) (modules: mesh-sdk; built after them: audit-logger, baserow, bazarr, bookshelf, confluence, gitea, gitlab, grafana, home-assistant, icecast, influxdb, jackett, jira, kometa, lab, letta, lidarr, mailu, mesh-catalog, mesh-tools, mesh-vault, minio, mongodb, mosquitto, mssql, netcheck, nextcloud, nftables, nodered, ombi, openai-consumer, radarr, redis, route-adapter, searxng, sonarr, tautulli, umami, unifi, zsh)mesh/repo-check: PASS — its merge-check.sh passed, each part in its toolchain: merge-check.sh (typescript), go/merge-check.sh (go)Delivery plan — builds mesh-sdk (+40 dependent(s)) → ace, g14, novox, shanks; no bus step; 9 wait(s) for a person
Run by the build seat on ace as
build-1791903405319711731(builds --log build-1791903405319711731).New head
f4745447ba: addsAsk.WholeDetails, the Details with every value whole, which the router shows where it showsWhole(the review of mesh-controller #304, ADR 0347). It is digested only when given, so an ask without it digests as before. Test:TestWholeDetailsAreDigestedOnlyWhenGiven, and the field count inTestDigestsAreCanonicalOverNamedFieldsis now 12.Verdict: request changes at
f4745447baIndependent review of the issue 383/639 group under ADR 0345 and ADR 0347.
Blocking: the digest's encoding is no longer unique (go/asks/asks.go:173-182).
canonical's own promise (asks.go:142) is that two different sequences of values never encode the same, and Digest is what binds a warrant to the one ask the person was shown. With WholeDetails written as a tag "whole-details" plus its value only when given, and Whole/Details written only when either is given, these two asks digest the same:I confirmed it with a throwaway test at this head (equal=true). They show different words on a proving channel under one digest. Only the asker can build both, so the reach is small, but this is the primitive the tap security rests on. Fix: when WholeDetails is given, always write Whole and Details first (even empty), then WholeDetails, with no tag. An ask without WholeDetails still digests as before, so old asks keep their fingerprint, and a stream of three trailing values can never equal one of two. Add the A/B pair to TestWholeDetailsAreDigestedOnlyWhenGiven.
Checked and fine:
go test ./asks/passes at the head (run niced). The new tests fail on main and on9588871(build: no WholeDetails).Not blocking: the Message.Note comment says the note "is never left out". ADR 0347 §5 now lets a channel cut the note last, with the cut said. Reword it when you touch this.
Statuses at this head: mesh/merge-gate success ("head
f4745447bamerged into trunka0fc82fdcd, pass"), mesh/repo-check success, mesh/delivery success ("ready: it delivers once merged"). There is no mesh/delivery-group status on this PR.Consequence: a new SDK head means mesh-catalog #278 and mesh-controller #304 must re-pin it (go.mod/go.sum, and #304's vendor copy and testdata/beside/CAPTURED), because the router and the controller must digest alike.
Merge check at
5933eb75Judged: head
5933eb757d44merged into trunka0fc82fdcd7c; read beside it: mesh-catalog9c166398f204, mesh-controller9f3aa91e812b, mesh-controller-main9f3aa91e812b, mesh-host0e92ef3d1b21, mesh-tools954e1a53eef9mesh/merge-gate: PASS, WITH A NOTE — a merge rebuilds 41 module(s) in 3 tier(s) (modules: mesh-sdk; built after them: audit-logger, baserow, bazarr, bookshelf, confluence, gitea, gitlab, grafana, home-assistant, icecast, influxdb, jackett, jira, kometa, lab, letta, lidarr, mailu, mesh-catalog, mesh-tools, mesh-vault, minio, mongodb, mosquitto, mssql, netcheck, nextcloud, nftables, nodered, ombi, openai-consumer, radarr, redis, route-adapter, searxng, sonarr, tautulli, umami, unifi, zsh)mesh/repo-check: PASS — its merge-check.sh passed, each part in its toolchain: merge-check.sh (typescript), go/merge-check.sh (go)Delivery plan — builds mesh-sdk (+40 dependent(s)) → ace, g14, novox, shanks; no bus step; 9 wait(s) for a person
Run by the build seat on shanks as
build-1791916193642642959(builds --log build-1791916193642642959).New head
5933eb757danswers review 223. When whole details are given, Whole and Details are always written first (even when empty), then the whole details, with no tag. So the trailing values come in three fixed shapes (none, two or three), and the count tells them apart. An ask without whole details keeps its old digest. New test:TestWholeDetailsCollideWithNoOtherAsk; on the previous head,{WholeDetails: "+ x: 1"}and{Whole: "whole-details", Details: "+ x: 1"}collided. TheMessage.Notecomment now states the cut rule of ADR 0347 §5.Verdict: approve at
5933eb757dRe-review after review 223. Whole and Details are now written whenever any of the three is given, and WholeDetails after them with no tag (go/asks/asks.go:173-184). The fields after the options therefore take one of three shapes, which the count of values tells apart.
f4745447, the previous head ("asks 0 and 1 digest the same"), and passes here. The rest ofgo test ./asks/passes (run niced).Statuses at this head: mesh/merge-gate success ("head
5933eb757dmerged into trunka0fc82fdcd— pass, with a note: builds mesh-sdk (+40 dependent(s)) → ace, g14, novox, shanks"), mesh/repo-check success ("head5933eb757dmerged into trunka0fc82fdcd— pass: its merge-check.sh passed"), mesh/delivery success ("ready: it delivers once merged"). This PR has no mesh/delivery-group status.