Issue 1966 (note 199). The node-engine's seat-list waiter remembered only in memory that it had written its seat-list-unread finding. After a node-engine restart the new process's first full read deleted nothing, so the condition stood for ever: ace since 2026-11-09 22:53 UTC and g14 since 2026-11-10 12:34 UTC, while both engines answer seat-list with the whole list (60 seats, revision 136).
Builds design 26's line (ADR 0636 §1): "each node writes one finding when its readers have waited five minutes ... clears it at the first full read". NATS-native, at the operator's word: the bus state is the one truth; the waiter reads its own finding key in the node's findings state (its owner, ADR 0596 §2) and keeps no copy in memory.
6304332a: seatwait.Waiter asks the state (Has, Session.HasFinding) at start, on each change and at expiry; a full read deletes a standing finding; the bound is not started for one already standing.
e64c8ad0: the hand-kept golden grant internal/nodegrant/testdata/node.json refreshed to what mesh-grants composes on main (EngineFindingsGrants, readGrants): the read of the node's own findings keys. The live grant already holds it (nats.nats_users for node.ace).
Quick vs thorough: this is the quick fix for the node-engine; the kind (a finding cleared only from a process's memory) is answered for every observer in design 47 milestone G's findings-as-events lines (each observer states its findings at its start).
Tests: one row added to TestTheSeatListWait (fails on the old code); TestNatsANodeThatCannotReadTheSeatListActsOnNothingNew and TestNatsTheFirstReadOfTheSeatListEndsTheNodesWait pass (the first failed before the golden refresh). go vet (both tags) and go test ./... clean.
Live case after delivery: mesh-conditions.conditions no longer holds machine.ace.seat-list-unread and machine.g14.seat-list-unread once each engine has run the new build.
Reviewed-by: mesh-code-reviewer for lead-47@shanks at e64c8ad0ca
Issue 1966 (note 199). The node-engine's seat-list waiter remembered only in memory that it had written its `seat-list-unread` finding. After a node-engine restart the new process's first full read deleted nothing, so the condition stood for ever: ace since 2026-11-09 22:53 UTC and g14 since 2026-11-10 12:34 UTC, while both engines answer `seat-list` with the whole list (60 seats, revision 136).
Builds design 26's line (ADR 0636 §1): "each node writes one finding when its readers have waited five minutes ... clears it at the first full read". NATS-native, at the operator's word: the bus state is the one truth; the waiter reads its own finding key in the node's `findings` state (its owner, ADR 0596 §2) and keeps no copy in memory.
- 6304332a: `seatwait.Waiter` asks the state (`Has`, `Session.HasFinding`) at start, on each change and at expiry; a full read deletes a standing finding; the bound is not started for one already standing.
- e64c8ad0: the hand-kept golden grant `internal/nodegrant/testdata/node.json` refreshed to what mesh-grants composes on main (`EngineFindingsGrants`, `readGrants`): the read of the node's own findings keys. The live grant already holds it (`nats.nats_users` for node.ace).
Quick vs thorough: this is the quick fix for the node-engine; the kind (a finding cleared only from a process's memory) is answered for every observer in design 47 milestone G's findings-as-events lines (each observer states its findings at its start).
Tests: one row added to `TestTheSeatListWait` (fails on the old code); `TestNatsANodeThatCannotReadTheSeatListActsOnNothingNew` and `TestNatsTheFirstReadOfTheSeatListEndsTheNodesWait` pass (the first failed before the golden refresh). go vet (both tags) and go test ./... clean.
Live case after delivery: `mesh-conditions.conditions` no longer holds `machine.ace.seat-list-unread` and `machine.g14.seat-list-unread` once each engine has run the new build.
Reviewed-by: mesh-code-reviewer for lead-47@shanks at e64c8ad0ca624f0308539a7de8995e2cf52dc79b
https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
A new node-engine process cleared nothing at its first full read of the seat list, because the Waiter remembered in memory whether
it had written the finding; ace and g14 kept the condition for ever. The Waiter now asks the node's state findings whether the
finding stands, clears it at the first full read and writes it at the bound only when it does not stand.
Builds: design 47 H-7, ADR 0636 §1 (the finding is cleared at the first full read), issue 1966
Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
mesh-grants gives the engine the owner's read of its state findings for its own node's keys (EngineFindingsGrants); the golden
grant held only the write, so the engine could not read the finding it clears at the first full read.
Builds: design 47 H-7, ADR 0636 §1 (the finding is cleared at the first full read), ADR 0596 §2 (the owner reads its state), issue 1966
Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
Deliverynovox/mesh-host@e64c8ad0ca62 — merged since 2026-11-11T01:34:14Z
Source — source.main moved to novox/mesh-host@14c22b4a45. Whether it reached the machines is mesh-delivery-view's, derived from source.main, the wants and the haves.
Transitions
2026-11-11 01:28 (new) → proposed (announced): novox/mesh-host#223's head announced
2026-11-11 01:28 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-11 01:34 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@e64c8ad0ca62` — **merged** since 2026-11-11T01:34:14Z
**Source** — source.main moved to novox/mesh-host@14c22b4a4586. Whether it reached the machines is `mesh-delivery-view`'s, derived from `source.main`, the wants and the haves.
**Transitions**
- 2026-11-11 01:28 (new) → proposed (announced): novox/mesh-host#223's head announced
- 2026-11-11 01:28 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-11 01:34 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`.
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 (note 199). The node-engine's seat-list waiter remembered only in memory that it had written its
seat-list-unreadfinding. After a node-engine restart the new process's first full read deleted nothing, so the condition stood for ever: ace since 2026-11-09 22:53 UTC and g14 since 2026-11-10 12:34 UTC, while both engines answerseat-listwith the whole list (60 seats, revision 136).Builds design 26's line (ADR 0636 §1): "each node writes one finding when its readers have waited five minutes ... clears it at the first full read". NATS-native, at the operator's word: the bus state is the one truth; the waiter reads its own finding key in the node's
findingsstate (its owner, ADR 0596 §2) and keeps no copy in memory.6304332a:seatwait.Waiterasks the state (Has,Session.HasFinding) at start, on each change and at expiry; a full read deletes a standing finding; the bound is not started for one already standing.e64c8ad0: the hand-kept golden grantinternal/nodegrant/testdata/node.jsonrefreshed to what mesh-grants composes on main (EngineFindingsGrants,readGrants): the read of the node's own findings keys. The live grant already holds it (nats.nats_usersfor node.ace).Quick vs thorough: this is the quick fix for the node-engine; the kind (a finding cleared only from a process's memory) is answered for every observer in design 47 milestone G's findings-as-events lines (each observer states its findings at its start).
Tests: one row added to
TestTheSeatListWait(fails on the old code);TestNatsANodeThatCannotReadTheSeatListActsOnNothingNewandTestNatsTheFirstReadOfTheSeatListEndsTheNodesWaitpass (the first failed before the golden refresh). go vet (both tags) and go test ./... clean.Live case after delivery:
mesh-conditions.conditionsno longer holdsmachine.ace.seat-list-unreadandmachine.g14.seat-list-unreadonce each engine has run the new build.Reviewed-by: mesh-code-reviewer for lead-47@shanks at
e64c8ad0cahttps://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
Delivery
novox/mesh-host@e64c8ad0ca62— merged since 2026-11-11T01:34:14ZSource — source.main moved to novox/mesh-host@14c22b4a45. Whether it reached the machines is
mesh-delivery-view's, derived fromsource.main, the wants and the haves.Transitions
The commit's note under
refs/notes/mesh-plankeeps every transition of this change up to its merge:git log --notes=mesh-plan.