The seat-list finding is read from the node's own state, so a restart clears it (issue 1966) #223

Merged
mesh-tools merged 2 commits from fix/1966-seat-list-finding-from-the-bus into main 2026-11-11 01:34:12 +00:00
Member

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

https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ

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
mesh-tools added 2 commits 2026-11-11 01:28:18 +00:00
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
The node's golden grant reads its own findings, as the grants part composes it (issue 1966)
mesh/delivery merged: source.main moved to novox/mesh-host@14c22b4a4586
mesh/check checking e64c8ad0ca62 on 14c22b4a4586
e64c8ad0ca
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
Author
Member

Delivery novox/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`.
mesh-tools merged commit 14c22b4a45 into main 2026-11-11 01:34:12 +00:00
mesh-tools deleted branch fix/1966-seat-list-finding-from-the-bus 2026-11-11 01:34:12 +00:00
Sign in to join this conversation.
No Reviewers
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: novox/mesh-host#223