Recovery fix under the instruction recovery-fixes-merge-and-tell: merged by the session, the operator told on Telegram. The operator asked it delivered (2026-11-07 ~23:2x CET).
Cause. mesh-grants c97d021f (#170) sealed at 23:09 CET a user list composed from the 10 bootstrapped seats only (the seat list unread): it dropped ledger.novox.mesh-knowledge and about 40 users' permissions (every tool runner's node seats, the node-engines' vault reads, the build modules' seat queues). holdsBack checked lost users only, and a held module's ledger user was not kept (held.go). The list did not load (the bus still runs the 20:38Z list); 682fabee was put back. Evidence: issue 1966 note 67.
Change. While the seat list is unread or a pass is placed by the haves: every user of the loaded list and of the list in force is sealed with the union of what the pass composes and what those lists give it, every deny any list says kept; a list that still takes a permission or a deny from a loaded user is held (user-list-held, naming each); a published membership is never narrowed; a held module keeps its ledger user. Once the seat list is read and the assignments view answers, none of this applies.
Quick vs thorough. Quick: this keep. Thorough: the bootstrap order derived by the module graph (the assigner's views and the seat list before the grants part composes), noted on issue 1966.
Tests. Table rows in grants_test.go (seat list unread, placed by haves, a whole pass, a loaded user with no hash, deny kept, membership kept); each fails under its mutation. go vet ./..., go vet -tags integration ./..., go test ./... pass in modules/mesh-grants. Reviewed in two rounds (mesh-code-reviewer), approved at ab2bbe9ff6.
Before the put. The list its build seals is compared with the loaded list, permission by permission, before it is put on novox.
Recovery fix under the instruction recovery-fixes-merge-and-tell: merged by the session, the operator told on Telegram. The operator asked it delivered (2026-11-07 ~23:2x CET).
**Cause.** mesh-grants c97d021f (#170) sealed at 23:09 CET a user list composed from the 10 bootstrapped seats only (the seat list unread): it dropped ledger.novox.mesh-knowledge and about 40 users' permissions (every tool runner's node seats, the node-engines' vault reads, the build modules' seat queues). holdsBack checked lost users only, and a held module's ledger user was not kept (held.go). The list did not load (the bus still runs the 20:38Z list); 682fabee was put back. Evidence: issue 1966 note 67.
**Change.** While the seat list is unread or a pass is placed by the haves: every user of the loaded list and of the list in force is sealed with the union of what the pass composes and what those lists give it, every deny any list says kept; a list that still takes a permission or a deny from a loaded user is held (user-list-held, naming each); a published membership is never narrowed; a held module keeps its ledger user. Once the seat list is read and the assignments view answers, none of this applies.
**Quick vs thorough.** Quick: this keep. Thorough: the bootstrap order derived by the module graph (the assigner's views and the seat list before the grants part composes), noted on issue 1966.
**Tests.** Table rows in grants_test.go (seat list unread, placed by haves, a whole pass, a loaded user with no hash, deny kept, membership kept); each fails under its mutation. go vet ./..., go vet -tags integration ./..., go test ./... pass in modules/mesh-grants. Reviewed in two rounds (mesh-code-reviewer), approved at ab2bbe9ff64d1a4fcabec8be2d0d7660d16ec31c.
**Before the put.** The list its build seals is compared with the loaded list, permission by permission, before it is put on novox.
**Undo.** Revert the merge commit.
https://claude.ai/code/session_01NcbgfFfQ4Z9UE5jK32PmE5
Issue 1966: the list sealed 2026-11-07 23:09, composed while the seat list was unread
(only the bootstrapped seats compose), took the node seats from the tool runners, the
vault's reads from the node-engines and the seat queues from the build modules, and left
out ledger.novox.mesh-knowledge.
- While the seat list is unread (the gate's MayAct with no seat) or a pass is placed by
the haves, each user of the loaded list and of the list in force is sealed with the
union of what the pass composes and what those lists give it (publish, subscribe,
responses; a deny only where every list saying one denies it), kept the way a refused
principal is; the users so kept are the pass's kept_loaded.
- In such a pass a list that still takes a permission from, or leaves out, a loaded user
is held (user-list-held), naming each user and how many permissions it loses.
- A held module keeps its ledger account, ledger.<node>.<module>, with its other users:
heldModuleUsers matched <node>.<module>[.<process>] only, which dropped the ledger user.
Claude-Session: https://claude.ai/code/session_01NcbgfFfQ4Z9UE5jK32PmE5
Review round 1 of issue 1966's keep-what-is-loaded fix.
- KeepLoaded intersected the denies, and the composer gives every composed user an empty
deny, so a user in force with a wide publish and a deny was sealed with no deny. The
union of every deny any list says is kept now, and Losses counts a deny dropped.
- A pass composing part of the mesh (the seat list unread, or placed by the haves) no
longer narrows a published membership: one whose published value serves, hears or gives
more than the pass composes is kept as published and said so (not_published), so a tool
runner or a seat holder goes on serving what it serves while keeping its login.
Claude-Session: https://claude.ai/code/session_01NcbgfFfQ4Z9UE5jK32PmE5
Deliverynovox/mesh-delivery@ab2bbe9ff64d — merged since 2026-11-07T22:35:25Z
Source — source.main moved to novox/mesh-delivery@cd7f85c74a. Whether it reached the machines is mesh-delivery-view's, derived from source.main, the wants and the haves.
Transitions
2026-11-07 22:35 (new) → proposed (announced): novox/mesh-delivery#171's head announced
2026-11-07 22:35 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-07 22:35 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-delivery@ab2bbe9ff64d` — **merged** since 2026-11-07T22:35:25Z
**Source** — source.main moved to novox/mesh-delivery@cd7f85c74a75. Whether it reached the machines is `mesh-delivery-view`'s, derived from `source.main`, the wants and the haves.
**Transitions**
- 2026-11-07 22:35 (new) → proposed (announced): novox/mesh-delivery#171's head announced
- 2026-11-07 22:35 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-07 22:35 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.
Recovery fix under the instruction recovery-fixes-merge-and-tell: merged by the session, the operator told on Telegram. The operator asked it delivered (2026-11-07 ~23:2x CET).
Cause. mesh-grants c97d021f (#170) sealed at 23:09 CET a user list composed from the 10 bootstrapped seats only (the seat list unread): it dropped ledger.novox.mesh-knowledge and about 40 users' permissions (every tool runner's node seats, the node-engines' vault reads, the build modules' seat queues). holdsBack checked lost users only, and a held module's ledger user was not kept (held.go). The list did not load (the bus still runs the 20:38Z list); 682fabee was put back. Evidence: issue 1966 note 67.
Change. While the seat list is unread or a pass is placed by the haves: every user of the loaded list and of the list in force is sealed with the union of what the pass composes and what those lists give it, every deny any list says kept; a list that still takes a permission or a deny from a loaded user is held (user-list-held, naming each); a published membership is never narrowed; a held module keeps its ledger user. Once the seat list is read and the assignments view answers, none of this applies.
Quick vs thorough. Quick: this keep. Thorough: the bootstrap order derived by the module graph (the assigner's views and the seat list before the grants part composes), noted on issue 1966.
Tests. Table rows in grants_test.go (seat list unread, placed by haves, a whole pass, a loaded user with no hash, deny kept, membership kept); each fails under its mutation. go vet ./..., go vet -tags integration ./..., go test ./... pass in modules/mesh-grants. Reviewed in two rounds (mesh-code-reviewer), approved at
ab2bbe9ff6.Before the put. The list its build seals is compared with the loaded list, permission by permission, before it is put on novox.
Undo. Revert the merge commit.
https://claude.ai/code/session_01NcbgfFfQ4Z9UE5jK32PmE5
Delivery
novox/mesh-delivery@ab2bbe9ff64d— merged since 2026-11-07T22:35:25ZSource — source.main moved to novox/mesh-delivery@cd7f85c74a. 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.