go/asks: a message carries its note apart, and an explanation is held to a glance (issues 383 and 639) #25

Merged
mesh-admin merged 3 commits from fix/639-an-ask-reads-at-a-glance into main 2026-10-13 19:02:17 +00:00
Contributor

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-admin added 1 commit 2026-10-13 14:36:34 +00:00
go/asks: a message carries its note apart, and an explanation is held to a glance (hq issues 639 and 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)…
mesh/delivery superseded: a newer head of the same pull request
9588871d66
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.
Author
Contributor

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.

<!-- 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`.
Author
Contributor

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
**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 ```
mesh-admin left a comment
Author
Contributor

Verdict: approve at 9588871d66

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").
jschoubben added 1 commit 2026-10-13 14:56:24 +00:00
go/asks: an ask may carry its Details whole, for a channel that proves who answers (hq issue 383)
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)…
mesh/delivery superseded: a newer head of the same pull request
f4745447ba
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.
Author
Contributor

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
**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 ```
Author
Contributor

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.
mesh-admin left a comment
Author
Contributor

Verdict: request changes at f4745447ba

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.
jschoubben added 1 commit 2026-10-13 18:29:27 +00:00
go/asks: whole details never digest as another ask's Whole and Details (the review of #25)
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)…
mesh/delivery delivered
5933eb757d
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.
Author
Contributor

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
**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 ```
Author
Contributor

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.
mesh-admin left a comment
Author
Contributor

Verdict: approve at 5933eb757d

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.
mesh-admin merged commit a2d2af00dc into main 2026-10-13 19:02:17 +00:00
mesh-admin deleted branch fix/639-an-ask-reads-at-a-glance 2026-10-13 19:02:17 +00:00
Sign in to join this conversation.
No Reviewers
2 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: novox/mesh-sdk#25