Issue 1966 (notes 147-149): after a restart, a node-engine whose first read of the seat list met "no responders" composed on its bootstrapped list for good. On ace that held about 60 modules from 22:49 to 23:21 UTC on 2026-11-09 under a misleading "no artifact store", raised no condition, and its recovery verb answered no session. Met twice (2026-11-08, 2026-11-09), so the thorough fix.
Group fix/1966-seat-list-unread, one check, members pushed together: mesh-sdk (merge first; a build edge for the others), mesh-host, mesh-catalog, mesh-delivery.
S1 mesh-host: the node-engine's ask keeps the bus's "no responders" in its error.
S2 mesh-sdk: the seat list's reader asks again (busretry) while its ask reached no one (ADR 0636 §1, §4).
S3 mesh-host: seat-list and seat-list-again answer any person, node-tools (every console call is proved as node-tools, issue 627) and mesh-healers, as the node-engine seat's definition says.
S4 mesh-host: while the list is unread, a module whose seats are not all bootstrapped is held before its build is read, with a reason naming the bootstrapped seats; a pass refused whole begins with that line.
S5 mesh-host: the integration test of the node's first read is extended: a holder that answers "no responders" then serves is read by the same reader, with no event or hand act.
S6 mesh-catalog: the condition keeper reads the node-engine's findings, so ADR 0636 §1's condition is raised.
S7 mesh-catalog (claude-code), mesh-delivery (assigner, grants): node-tools on each seat-list-again caller list.
Quick fix: restart the node-engine once (done 2026-11-09 23:21 UTC on the operator's yes, hand act act-1794266688172849851-1). Thorough fix: this change, chosen because the kind was met twice, hid its cause behind another part's name and stopped every delivery to the machine.
Tests: every change is a row or subtest of an existing test and fails without its change; no repository's test count rises (mesh-host and mesh-delivery stay over their budgets, unchanged).
Manifest validator: the verdict on mesh-catalog modules/mesh-conditions/module.json (new read mesh-host.findings) is unproved until this pull request's check runs. A local re-creation against mesh-sdk's test copy of the seats accepted it in both the change and trunk cases, with no verdict differing; that is not the validator's live verdict.
Prepare and rulings: hq .work/1966-engine-seat-list/prepare.md.
Issue 1966 (notes 147-149): after a restart, a node-engine whose first read of the seat list met "no responders" composed on its bootstrapped list for good. On ace that held about 60 modules from 22:49 to 23:21 UTC on 2026-11-09 under a misleading "no artifact store", raised no condition, and its recovery verb answered no session. Met twice (2026-11-08, 2026-11-09), so the thorough fix.
Group fix/1966-seat-list-unread, one check, members pushed together: mesh-sdk (merge first; a build edge for the others), mesh-host, mesh-catalog, mesh-delivery.
- S1 mesh-host: the node-engine's ask keeps the bus's "no responders" in its error.
- S2 mesh-sdk: the seat list's reader asks again (busretry) while its ask reached no one (ADR 0636 §1, §4).
- S3 mesh-host: seat-list and seat-list-again answer any person, node-tools (every console call is proved as node-tools, issue 627) and mesh-healers, as the node-engine seat's definition says.
- S4 mesh-host: while the list is unread, a module whose seats are not all bootstrapped is held before its build is read, with a reason naming the bootstrapped seats; a pass refused whole begins with that line.
- S5 mesh-host: the integration test of the node's first read is extended: a holder that answers "no responders" then serves is read by the same reader, with no event or hand act.
- S6 mesh-catalog: the condition keeper reads the node-engine's findings, so ADR 0636 §1's condition is raised.
- S7 mesh-catalog (claude-code), mesh-delivery (assigner, grants): node-tools on each seat-list-again caller list.
Quick fix: restart the node-engine once (done 2026-11-09 23:21 UTC on the operator's yes, hand act act-1794266688172849851-1). Thorough fix: this change, chosen because the kind was met twice, hid its cause behind another part's name and stopped every delivery to the machine.
Tests: every change is a row or subtest of an existing test and fails without its change; no repository's test count rises (mesh-host and mesh-delivery stay over their budgets, unchanged).
Manifest validator: the verdict on mesh-catalog modules/mesh-conditions/module.json (new read mesh-host.findings) is unproved until this pull request's check runs. A local re-creation against mesh-sdk's test copy of the seats accepted it in both the change and trunk cases, with no verdict differing; that is not the validator's live verdict.
Prepare and rulings: hq .work/1966-engine-seat-list/prepare.md.
Reviewed-by: mesh-code-reviewer@shanks (2 rounds) at mesh-sdk 2f156e7f30508e9aaf06322b305036645c3ed266, mesh-host 5c353cfc7bf08d1503d5bd6ce28b6d704df51bab, mesh-catalog c39503e3227c0d6ac653d7d48b7103fd7c5fcad0, mesh-delivery b1343147e80f846b889467143f4ae145e4b682f7
Pushed-by: lead-47@shanks
https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
A request that reached no one is asked again by mesh-sdk's busretry only when
it can see the bus's own error; the node-engine's ask dropped it, so the seat
list's first read, which fell into its holder's re-serve, was never asked
again (issue 1966).
Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
seat-list-again answered person.<name> and the healers, but every call through
the mesh MCP server is proved as its machine's tool runner (issue 627), so no
operator's session could make a node read its seat list again. node-tools now
stands for that session; the read seat-list is open to every proved caller, as
ADR 0636 §7 limits only the read again. The verb names come from the contract.
Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
On ace, a node-engine left on its bootstrapped seat list could not find the
artifact store's seat, refused avahi's archive reference and with it the whole
pass, so the seat-list hold never ran and every module said "reaches no
artifact store". While the list is unread, a placed module whose seats are not
all bootstrapped is now held as it runs before anything of its build is read
(frombus.Scope.Held), its reason names the bootstrapped seats the node holds,
and a pass refused whole says the unread list first (issue 1966).
Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
The live case of ace, in process against a real bus: the stand-in of the seat
mesh-catalog answers as nothing serves it (no responders) while the node's
reader first asks, then serves; the same reader reads the list within the
bus's retry bound, with no event of the seat and no hand act (issue 1966,
ADR 0636 §8). The test of an unread list now reads the reason that names the
bootstrapped seats.
Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
The node-engine seat's definition names "the operator and the healers" for
both seat-list verbs, and design 47 G keeps it; the read was opened to every
proved caller on a ruling the review withdrew. node-tools stays on both: every
console call is proved as its machine's tool runner (issue 627, issue 1966).
Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
Deliverynovox/mesh-host@5c353cfc7bf0 — merged since 2026-11-10T00:44:46Z
Source — source.main moved to novox/mesh-host@f50442ac7a. Whether it reached the machines is mesh-delivery-view's, derived from source.main, the wants and the haves.
2026-11-10 00:21 (new) → proposed (announced): novox/mesh-host#221's head announced
2026-11-10 00:21 proposed → ready (accepted): a verdict names this commit and the trunk's head as its trunk commit, the gate passed or warned, and the repository's own check did not fail; or the check gates no merge (check-gates-merge false)
2026-11-10 00:44 ready → merged (merged): on the trunk its modules follow: merged there
The commit's note under refs/notes/mesh-plan keeps every transition of this change up to its merge: git log --notes=mesh-plan.
<!-- mesh-delivery:view -->
**Delivery** `novox/mesh-host@5c353cfc7bf0` — **merged** since 2026-11-10T00:44:46Z
**Source** — source.main moved to novox/mesh-host@f50442ac7a2d. Whether it reached the machines is `mesh-delivery-view`'s, derived from `source.main`, the wants and the haves.
**Group** `fix/1966-seat-list-unread`: novox/mesh-catalog@c39503e3227c, novox/mesh-delivery@b1343147e80f, novox/mesh-host@5c353cfc7bf0, novox/mesh-sdk@2f156e7f3050
**Transitions**
- 2026-11-10 00:21 (new) → proposed (announced): novox/mesh-host#221's head announced
- 2026-11-10 00:21 proposed → ready (accepted): a verdict names this commit and the trunk's head as its trunk commit, the gate passed or warned, and the repository's own check did not fail; or the check gates no merge (check-gates-merge false)
- 2026-11-10 00:44 ready → merged (merged): on the trunk its modules follow: merged there
The commit's note under `refs/notes/mesh-plan` keeps every transition of this change up to its merge: `git log --notes=mesh-plan`.
mesh-delivery: the operator's Approve of this pull request's merge into main is ended: a head it covers moved on: the heads it covers are no longer the group's heads. Nothing is merged on it. The operator is asked again once the checks pass at the new head.
mesh-delivery: the operator's Approve of this pull request's merge into main is ended: a head it covers moved on: the heads it covers are no longer the group's heads. Nothing is merged on it. The operator is asked again once the checks pass at the new head.
mesh-delivery: the operator's Approve of this pull request's merge into main is ended: a head it covers moved on: the heads it covers are no longer the group's heads. Nothing is merged on it. The operator is asked again once the checks pass at the new head.
mesh-delivery: the operator's Approve of this pull request's merge into main is ended: a head it covers moved on: the heads it covers are no longer the group's heads. Nothing is merged on it. The operator is asked again once the checks pass at the new head.
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.
Issue 1966 (notes 147-149): after a restart, a node-engine whose first read of the seat list met "no responders" composed on its bootstrapped list for good. On ace that held about 60 modules from 22:49 to 23:21 UTC on 2026-11-09 under a misleading "no artifact store", raised no condition, and its recovery verb answered no session. Met twice (2026-11-08, 2026-11-09), so the thorough fix.
Group fix/1966-seat-list-unread, one check, members pushed together: mesh-sdk (merge first; a build edge for the others), mesh-host, mesh-catalog, mesh-delivery.
Quick fix: restart the node-engine once (done 2026-11-09 23:21 UTC on the operator's yes, hand act act-1794266688172849851-1). Thorough fix: this change, chosen because the kind was met twice, hid its cause behind another part's name and stopped every delivery to the machine.
Tests: every change is a row or subtest of an existing test and fails without its change; no repository's test count rises (mesh-host and mesh-delivery stay over their budgets, unchanged).
Manifest validator: the verdict on mesh-catalog modules/mesh-conditions/module.json (new read mesh-host.findings) is unproved until this pull request's check runs. A local re-creation against mesh-sdk's test copy of the seats accepted it in both the change and trunk cases, with no verdict differing; that is not the validator's live verdict.
Prepare and rulings: hq .work/1966-engine-seat-list/prepare.md.
Reviewed-by: mesh-code-reviewer@shanks (2 rounds) at mesh-sdk 2f156e7f30508e9aaf06322b305036645c3ed266, mesh-host
5c353cfc7b, mesh-catalog c39503e3227c0d6ac653d7d48b7103fd7c5fcad0, mesh-delivery b1343147e80f846b889467143f4ae145e4b682f7Pushed-by: lead-47@shanks
https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
Delivery
novox/mesh-host@5c353cfc7bf0— merged since 2026-11-10T00:44:46ZSource — source.main moved to novox/mesh-host@f50442ac7a. Whether it reached the machines is
mesh-delivery-view's, derived fromsource.main, the wants and the haves.Group
fix/1966-seat-list-unread: novox/mesh-catalog@c39503e322, novox/mesh-delivery@b1343147e8, novox/mesh-host@5c353cfc7b, novox/mesh-sdk@2f156e7f30Transitions
The commit's note under
refs/notes/mesh-plankeeps every transition of this change up to its merge:git log --notes=mesh-plan.mesh-delivery: the operator's Approve of this pull request's merge into main is ended: a head it covers moved on: the heads it covers are no longer the group's heads. Nothing is merged on it. The operator is asked again once the checks pass at the new head.
mesh-delivery: the operator's Approve of this pull request's merge into main is ended: a head it covers moved on: the heads it covers are no longer the group's heads. Nothing is merged on it. The operator is asked again once the checks pass at the new head.