Cause. A seat verb answered only when its command finished. A push takes about 27 s (median), and the console waits 30 s, so slower pushes were reported as "did not answer in time" even though they had pushed. Worse, a push sends the bus holder its changed user list first. The broker reloads, which re-registers every user and empties the server's table of replies it may send, so the push's eventual answer is refused (Permissions Violation for Publish to "_INBOX.…"). Every one of the 30 journal lines came 35 to 50 s after a timed-out push, right after a broker reload.
Change.
internal/link/calls.go: each call is answered once, in full when it finishes within AnswerWithin (10 s), otherwise as {running, call: <id>}. The command runs on and its answer is kept (last 100 calls, settings and secrets never kept, large in-time answers not kept). Acknowledge(ctx) answers at once. The connection's error handler is chained, so a refused answer is recorded on its call and logged with the call's id.
seatverbs.go: push (and command push …) acknowledges before running. The new in-process verb calls lists the recent calls, or returns one whole by id.
catalogue/verbs.go: adds calls, and push's description says it answers at once with an id.
broker/nats.go: ResponseTTL is named, and the rendered config is unchanged (golden passes).
Tests.internal/link/calls_test.go covers answering in time, answering as running with the answer kept, acknowledgement, refusal recorded, no secrets kept, and the ring. cmd/mesh-controller/calls_verb_test.go covers push answering first, calls being served and its refusals, and AnswerWithin staying under both the console wait and ResponseTTL. gofmt, go vet ./..., go test ./... are clean (race -count=3 on the link tests).
Merge with or before mesh-tools fix/a-timeout-is-not-a-failure. The order between the two does not matter for correctness.
novox/hq issue 265.
**Cause.** A seat verb answered only when its command finished. A push takes about 27 s (median), and the console waits 30 s, so slower pushes were reported as "did not answer in time" even though they had pushed. Worse, a push sends the bus holder its changed user list first. The broker reloads, which re-registers every user and empties the server's table of replies it may send, so the push's eventual answer is refused (`Permissions Violation for Publish to "_INBOX.…"`). Every one of the 30 journal lines came 35 to 50 s after a timed-out push, right after a broker reload.
**Change.**
- `internal/link/calls.go`: each call is answered once, in full when it finishes within `AnswerWithin` (10 s), otherwise as `{running, call: <id>}`. The command runs on and its answer is kept (last 100 calls, settings and secrets never kept, large in-time answers not kept). `Acknowledge(ctx)` answers at once. The connection's error handler is chained, so a refused answer is recorded on its call and logged with the call's id.
- `seatverbs.go`: `push` (and `command push …`) acknowledges before running. The new in-process verb `calls` lists the recent calls, or returns one whole by id.
- `catalogue/verbs.go`: adds `calls`, and push's description says it answers at once with an id.
- `broker/nats.go`: `ResponseTTL` is named, and the rendered config is unchanged (golden passes).
**Tests.** `internal/link/calls_test.go` covers answering in time, answering as running with the answer kept, acknowledgement, refusal recorded, no secrets kept, and the ring. `cmd/mesh-controller/calls_verb_test.go` covers push answering first, `calls` being served and its refusals, and AnswerWithin staying under both the console wait and ResponseTTL. gofmt, go vet ./..., go test ./... are clean (race -count=3 on the link tests).
Merge with or before mesh-tools `fix/a-timeout-is-not-a-failure`. The order between the two does not matter for correctness.
A push outlasted the console's 30s wait and, when it sent the bus its
changed user list, the broker's reload forgot the reply it may send:
the push happened and its caller was told it did not answer. Calls now
answer in full or as running with an id, a push answers before it
sends, refused answers are recorded on their call, and 'calls' reads
them back.
build-agent keeps data (ADR 0233): what it holds is backed up before it moves
route-proxy provides route: its consumers are sent again after it
route-proxy keeps data (ADR 0233): what it holds is backed up before it moves
Transitions
2026-10-06 23:05 (new) → proposed (announced): novox/mesh-controller#72 merged; its head was not heard by this owner, so it is made from the forge's word
2026-10-06 23:05 proposed → held (merged-unchecked): merged without a passing check — a verdict known with it is taken first: only a person decides that it goes on
The commit's note under refs/notes/mesh-plan keeps every transition: git log --notes=mesh-plan.
<!-- mesh-delivery:view -->
**Delivery** `novox/mesh-controller@eda457f41566` — **held** since 2026-10-06T23:05:28Z
Held for a person: merged without a passing check: only a person decides that it goes on — `mesh-delivery.release` with why lets it go on.
**Delivery plan** — builds build-agent, mesh-controller, route-proxy → ace, g14, novox, shanks; no bus step
- tier 0: mesh-controller
- tier 1: build-agent
- tier 2: route-proxy
- ace: receives build-agent, route-proxy
- g14: receives build-agent
- novox: receives mesh-controller, build-agent, route-proxy
- shanks: receives build-agent
- build-agent keeps data (ADR 0233): what it holds is backed up before it moves
- route-proxy provides route: its consumers are sent again after it
- route-proxy keeps data (ADR 0233): what it holds is backed up before it moves
**Transitions**
- 2026-10-06 23:05 (new) → proposed (announced): novox/mesh-controller#72 merged; its head was not heard by this owner, so it is made from the forge's word
- 2026-10-06 23:05 proposed → held (merged-unchecked): merged without a passing check — a verdict known with it is taken first: only a person decides that it goes on
The commit's note under `refs/notes/mesh-plan` keeps every transition: `git log --notes=mesh-plan`.
This repo is archived. You cannot comment on pull requests.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
novox/hq issue 265.
Cause. A seat verb answered only when its command finished. A push takes about 27 s (median), and the console waits 30 s, so slower pushes were reported as "did not answer in time" even though they had pushed. Worse, a push sends the bus holder its changed user list first. The broker reloads, which re-registers every user and empties the server's table of replies it may send, so the push's eventual answer is refused (
Permissions Violation for Publish to "_INBOX.…"). Every one of the 30 journal lines came 35 to 50 s after a timed-out push, right after a broker reload.Change.
internal/link/calls.go: each call is answered once, in full when it finishes withinAnswerWithin(10 s), otherwise as{running, call: <id>}. The command runs on and its answer is kept (last 100 calls, settings and secrets never kept, large in-time answers not kept).Acknowledge(ctx)answers at once. The connection's error handler is chained, so a refused answer is recorded on its call and logged with the call's id.seatverbs.go:push(andcommand push …) acknowledges before running. The new in-process verbcallslists the recent calls, or returns one whole by id.catalogue/verbs.go: addscalls, and push's description says it answers at once with an id.broker/nats.go:ResponseTTLis named, and the rendered config is unchanged (golden passes).Tests.
internal/link/calls_test.gocovers answering in time, answering as running with the answer kept, acknowledgement, refusal recorded, no secrets kept, and the ring.cmd/mesh-controller/calls_verb_test.gocovers push answering first,callsbeing served and its refusals, and AnswerWithin staying under both the console wait and ResponseTTL. gofmt, go vet ./..., go test ./... are clean (race -count=3 on the link tests).Merge with or before mesh-tools
fix/a-timeout-is-not-a-failure. The order between the two does not matter for correctness.Delivery
novox/mesh-controller@eda457f41566— held since 2026-10-06T23:05:28ZHeld for a person: merged without a passing check: only a person decides that it goes on —
mesh-delivery.releasewith why lets it go on.Delivery plan — builds build-agent, mesh-controller, route-proxy → ace, g14, novox, shanks; no bus step
Transitions
The commit's note under
refs/notes/mesh-plankeeps every transition:git log --notes=mesh-plan.