mesh/merge-gate pass: builds desk-channel, messenger → novox; no bus step; every machine composes with the change as it did without (4 of 4 compose)
mesh/repo-check pass: its merge-check.sh passed, each part in its toolchain: merge-check.sh (go), merge-check-typescript.sh (typescript)
mesh/delivery delivered
dunst.started says the notifier's bundle started again: the notifications stay on screen and only the answers they waited for are lost. Forgetting their ids made the router's message a second popup beside a dead one. The desk now keeps the ids and says answers-lost-at; the router's message replaces each notification in place. Whether a message is said again is now its own (last said before the answers were lost), so a router that started after the loss still says it and a repeated standing says nothing. It is sent to the desk directly, not through the outbox, whose failure path moves a warning to Telegram; a failed send is tried again at the next standing.