Recovery fix (mesh instruction recovery-fixes-merge-and-tell), merged by lead-47@shanks without the Approve; the operator is told at the terminal.
Cause. While grants composes part of the mesh (the assignments view did not answer), #171 kept a published membership whole when the composed one narrowed anything. The new assigner d325caf4 on ace composes a membership that drops its old mesh-placement seats and adds its state view-marks: kept whole, its tools process never got view-marks, so mesh-delivery-assigner.assignments fails ("keeps and reads no state called view-marks"), so the assignments view never answers, so grants never leaves its partial pass. A deadlock; the third bootstrap loop of the kind tonight (#170, #171).
Evidence.mesh-grants.grants_user_list last pass 2026-11-07 23:23 UTC: not_published ace.mesh-delivery-assigner: kept as published: the assignments view did not answer ... composes it without seats mesh-placement .... Issue 1966 notes 69-71.
Kind and fix. Quick: special-case the assigner. Thorough (chosen, the kind met three times): while a pass composes part of the mesh it publishes the union of the membership last published and the one composed, so it only grows; the next full pass narrows as before. The user list's KeepLoaded already unions and holds only losses.
Tests. Rows of TestGrants (no new test function): narrows+adds publishes the union with the addition; adds only; narrows only; full pass publishes as composed. Failed first with part.go at trunk. go vet (both tags) and go test ./... in modules/mesh-grants pass.
Undo. Revert this merge commit.
Reviewed-by: mesh-code-reviewer@shanks at f3f0a5e695
Recovery fix (mesh instruction recovery-fixes-merge-and-tell), merged by lead-47@shanks without the Approve; the operator is told at the terminal.
**Cause.** While grants composes part of the mesh (the assignments view did not answer), #171 kept a published membership whole when the composed one narrowed anything. The new assigner d325caf4 on ace composes a membership that drops its old mesh-placement seats and adds its state `view-marks`: kept whole, its tools process never got `view-marks`, so `mesh-delivery-assigner.assignments` fails ("keeps and reads no state called view-marks"), so the assignments view never answers, so grants never leaves its partial pass. A deadlock; the third bootstrap loop of the kind tonight (#170, #171).
**Evidence.** `mesh-grants.grants_user_list` last pass 2026-11-07 23:23 UTC: not_published `ace.mesh-delivery-assigner: kept as published: the assignments view did not answer ... composes it without seats mesh-placement ...`. Issue 1966 notes 69-71.
**Kind and fix.** Quick: special-case the assigner. Thorough (chosen, the kind met three times): while a pass composes part of the mesh it publishes the union of the membership last published and the one composed, so it only grows; the next full pass narrows as before. The user list's KeepLoaded already unions and holds only losses.
**Tests.** Rows of TestGrants (no new test function): narrows+adds publishes the union with the addition; adds only; narrows only; full pass publishes as composed. Failed first with part.go at trunk. go vet (both tags) and go test ./... in modules/mesh-grants pass.
**Undo.** Revert this merge commit.
Reviewed-by: mesh-code-reviewer@shanks at f3f0a5e6950351b96ef61f000d841075ccedeb17
https://claude.ai/code/session_01NcbgfFfQ4Z9UE5jK32PmE5
Fault: the new assigner composes a membership that drops the placement seats and adds its state view-marks. The partial pass
kept the published one whole, so the assigner's tools never got view-marks, its assignments view never answered, and the
pass never left its partial state (third bootstrap loop of the kind after #170 and #171).
Kind: the bootstrap hold freezes whole entries, so a grant needed to end the hold is never given.
Quick fix: special-case the assigner (or let additions through for it). Rejected: the next module that gains a state meets the same loop.
Thorough fix: while a pass keeps what the bus loaded, publish the union of the membership last published and the one composed
(every list, deduplicated, published entries first; the private network, contributions and bindings the pass's), published
when it differs; the pass says what it kept beyond the composed one. The user list already unions (KeepLoaded), additions pass there.
Claude-Session: https://claude.ai/code/session_01NcbgfFfQ4Z9UE5jK32PmE5
Deliverynovox/mesh-delivery@f3f0a5e69503 — merged since 2026-11-07T23:39:32Z
Source — source.main moved to novox/mesh-delivery@838dbd59ed. Whether it reached the machines is mesh-delivery-view's, derived from source.main, the wants and the haves.
Transitions
2026-11-07 23:39 (new) → proposed (announced): novox/mesh-delivery#172's head announced
2026-11-07 23:39 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 23:39 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@f3f0a5e69503` — **merged** since 2026-11-07T23:39:32Z
**Source** — source.main moved to novox/mesh-delivery@838dbd59ed5d. Whether it reached the machines is `mesh-delivery-view`'s, derived from `source.main`, the wants and the haves.
**Transitions**
- 2026-11-07 23:39 (new) → proposed (announced): novox/mesh-delivery#172's head announced
- 2026-11-07 23:39 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 23:39 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 (mesh instruction recovery-fixes-merge-and-tell), merged by lead-47@shanks without the Approve; the operator is told at the terminal.
Cause. While grants composes part of the mesh (the assignments view did not answer), #171 kept a published membership whole when the composed one narrowed anything. The new assigner d325caf4 on ace composes a membership that drops its old mesh-placement seats and adds its state
view-marks: kept whole, its tools process never gotview-marks, somesh-delivery-assigner.assignmentsfails ("keeps and reads no state called view-marks"), so the assignments view never answers, so grants never leaves its partial pass. A deadlock; the third bootstrap loop of the kind tonight (#170, #171).Evidence.
mesh-grants.grants_user_listlast pass 2026-11-07 23:23 UTC: not_publishedace.mesh-delivery-assigner: kept as published: the assignments view did not answer ... composes it without seats mesh-placement .... Issue 1966 notes 69-71.Kind and fix. Quick: special-case the assigner. Thorough (chosen, the kind met three times): while a pass composes part of the mesh it publishes the union of the membership last published and the one composed, so it only grows; the next full pass narrows as before. The user list's KeepLoaded already unions and holds only losses.
Tests. Rows of TestGrants (no new test function): narrows+adds publishes the union with the addition; adds only; narrows only; full pass publishes as composed. Failed first with part.go at trunk. go vet (both tags) and go test ./... in modules/mesh-grants pass.
Undo. Revert this merge commit.
Reviewed-by: mesh-code-reviewer@shanks at
f3f0a5e695https://claude.ai/code/session_01NcbgfFfQ4Z9UE5jK32PmE5
Delivery
novox/mesh-delivery@f3f0a5e69503— merged since 2026-11-07T23:39:32ZSource — source.main moved to novox/mesh-delivery@838dbd59ed. 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.