Issue 1966, a recovery fix (instruction recovery-fixes-merge-and-tell). Group fix/1966-requires-state: mesh-sdk, mesh-tools, mesh-delivery (this).
Live case. After the tool runner issued distribution's state, the bus still refused it: novox's nats log at 12:33 UTC, "Publish Violation - User novox.node-tools, Subject $JS.API.STREAM.INFO.KV_distribution_transfers" (also idle, findings), so every publish timed out. This head's grants part runs on novox since 12:45 UTC, placed by hand; a build stored at 12:46:31.
Change. buscompose: Declared.Bindings and boundOf grant a module's bound entries (key-value, object store, stream) to its own account and to the tool runner carrying it, only when the binding names the module's own entry; the object-store writer rule knows bound stores. grants: the bindings are filled in the same pass that writes them into the membership; MembershipFor carries them. No existing grant is removed or narrowed.
Quick or thorough. Thorough: one function for every principal that runs a module's code, with a conformance row ("a requires entry is granted where its old section is") that fails on all 10 owner subjects without the change. Not in this pull request (the rest of the requires-grants work, under review later): the lost-binding fix, grants_bindings and grants_bindings_again, the manifest validator, the integration case. distribution's holds, windows, mirrors and events bindings stay missing until grants_bindings_again.
Check. Expected to fail on the checker's composition-size fault (issue 1966 note 130), not on this change; the merge needs the operator's Approve of that red check.
Reviewed-by: mesh-code-reviewer@shanks at a78c5700fd
Issue 1966, a recovery fix (instruction recovery-fixes-merge-and-tell). Group fix/1966-requires-state: mesh-sdk, mesh-tools, mesh-delivery (this).
**Live case.** After the tool runner issued distribution's state, the bus still refused it: novox's nats log at 12:33 UTC, "Publish Violation - User novox.node-tools, Subject $JS.API.STREAM.INFO.KV_distribution_transfers" (also idle, findings), so every publish timed out. This head's grants part runs on novox since 12:45 UTC, placed by hand; a build stored at 12:46:31.
**Change.** buscompose: `Declared.Bindings` and `boundOf` grant a module's bound entries (key-value, object store, stream) to its own account and to the tool runner carrying it, only when the binding names the module's own entry; the object-store writer rule knows bound stores. grants: the bindings are filled in the same pass that writes them into the membership; `MembershipFor` carries them. No existing grant is removed or narrowed.
**Quick or thorough.** Thorough: one function for every principal that runs a module's code, with a conformance row ("a requires entry is granted where its old section is") that fails on all 10 owner subjects without the change. Not in this pull request (the rest of the requires-grants work, under review later): the lost-binding fix, `grants_bindings` and `grants_bindings_again`, the manifest validator, the integration case. distribution's holds, windows, mirrors and events bindings stay missing until `grants_bindings_again`.
**Check.** Expected to fail on the checker's composition-size fault (issue 1966 note 130), not on this change; the merge needs the operator's Approve of that red check.
Reviewed-by: mesh-code-reviewer@shanks at a78c5700fdf4ff249f26165f9f99ed25941b4ffa
https://claude.ai/code/session_01NcbgfFSnn24M3GcqttoU7i
The grants part wrote a binding into a membership on the bus module's
created, but granted its subjects to no account but the ledger's, so
distribution's program and the tool runner carrying it were refused their
own key-value, object store and stream entries (issue 1966, ADR 0595 §1,
design 25 § 12.2). The kept bindings now reach Declared in the same pass that
writes them into the membership, and one function, boundOf, grants each to
the module's own account and the tool runner, as its old section is granted;
a process's bus.state names a key-value entry as an old state. The composed
membership carries the bindings, so grants_membership's two sides agree.
Claude-Session: https://claude.ai/code/session_01NcbgfFSnn24M3GcqttoU7i
Deliverynovox/mesh-delivery@a78c5700fdf4 — merged since 2026-11-09T12:56:37Z
Source — source.main moved to novox/mesh-delivery@fb69c8dee6. Whether it reached the machines is mesh-delivery-view's, derived from source.main, the wants and the haves.
2026-11-09 12:49 (new) → proposed (announced): novox/mesh-delivery#188's head announced
2026-11-09 12:49 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-09 12:56 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@a78c5700fdf4` — **merged** since 2026-11-09T12:56:37Z
**Source** — source.main moved to novox/mesh-delivery@fb69c8dee691. Whether it reached the machines is `mesh-delivery-view`'s, derived from `source.main`, the wants and the haves.
**Group** `fix/1966-requires-state`: novox/mesh-delivery@a78c5700fdf4, novox/mesh-sdk@17475257d15f, novox/mesh-tools@8052fd14f4fd
**Transitions**
- 2026-11-09 12:49 (new) → proposed (announced): novox/mesh-delivery#188's head announced
- 2026-11-09 12:49 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-09 12:56 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, a recovery fix (instruction recovery-fixes-merge-and-tell). Group fix/1966-requires-state: mesh-sdk, mesh-tools, mesh-delivery (this).
Live case. After the tool runner issued distribution's state, the bus still refused it: novox's nats log at 12:33 UTC, "Publish Violation - User novox.node-tools, Subject $JS.API.STREAM.INFO.KV_distribution_transfers" (also idle, findings), so every publish timed out. This head's grants part runs on novox since 12:45 UTC, placed by hand; a build stored at 12:46:31.
Change. buscompose:
Declared.BindingsandboundOfgrant a module's bound entries (key-value, object store, stream) to its own account and to the tool runner carrying it, only when the binding names the module's own entry; the object-store writer rule knows bound stores. grants: the bindings are filled in the same pass that writes them into the membership;MembershipForcarries them. No existing grant is removed or narrowed.Quick or thorough. Thorough: one function for every principal that runs a module's code, with a conformance row ("a requires entry is granted where its old section is") that fails on all 10 owner subjects without the change. Not in this pull request (the rest of the requires-grants work, under review later): the lost-binding fix,
grants_bindingsandgrants_bindings_again, the manifest validator, the integration case. distribution's holds, windows, mirrors and events bindings stay missing untilgrants_bindings_again.Check. Expected to fail on the checker's composition-size fault (issue 1966 note 130), not on this change; the merge needs the operator's Approve of that red check.
Reviewed-by: mesh-code-reviewer@shanks at
a78c5700fdhttps://claude.ai/code/session_01NcbgfFSnn24M3GcqttoU7i
Delivery
novox/mesh-delivery@a78c5700fdf4— merged since 2026-11-09T12:56:37ZSource — source.main moved to novox/mesh-delivery@fb69c8dee6. Whether it reached the machines is
mesh-delivery-view's, derived fromsource.main, the wants and the haves.Group
fix/1966-requires-state: novox/mesh-delivery@a78c5700fd, novox/mesh-sdk@17475257d1, novox/mesh-tools@8052fd14f4Transitions
The commit's note under
refs/notes/mesh-plankeeps every transition of this change up to its merge:git log --notes=mesh-plan.