Broker: the grants part may create a placed module's declared buckets, logs and streams, creation only (issue 1790; the operator's one-grant exception)
#469
Merged
mesh-toolsmerged 1 commits from fix/1790-grants-create-buckets into main2026-10-26 08:17:20 +00:00
Issue 1790 (notes 8-10). The controller is frozen (ADR 0547 clause 1); the operator allowed this one grant on Telegram, 2026-10-26 08:54, as the memberships grant of 2026-10-25 22:31.
Research 072 ('The controller, NATS-native') piece moved: the grants piece, the creation of a module's declared bus objects. After this, the grants part creates a new manifest's buckets, logs and streams on the event, so no new module state waits for a controller start.
The same hunks as mesh-sdk's composer copy (nats.go, users.go, writers.go): the grants principal may publish $JS.API.STREAM.CREATE.<name> and $JS.API.STREAM.INFO.<name> for exactly the declared names, one subject each, no wildcard; never update, delete or purge. Nothing else in the controller changes; the mesh-sdk pin is unchanged. The test file is byte-equal to mesh-sdk's but for its package line.
Delivering this restarts the controller once; that start also raises the vault's waiting bucket mesh-vault_bus-accounts (issue 1945 note 70).
Tests: TestTheGrantsPartCreatesOnlyDeclaredStreams; go test -race ./internal/broker/..., go test -race ./... and go vet -tags integration ./... pass. Rules bent: no mesh-controller.try, as the operator directed on 2026-10-25.
Issue: 1790
Reviewed-by: review-create-buckets@shanks at 6927b02d4d
Issue 1790 (notes 8-10). The controller is frozen (ADR 0547 clause 1); the operator allowed this one grant on Telegram, 2026-10-26 08:54, as the memberships grant of 2026-10-25 22:31.
Research 072 ('The controller, NATS-native') piece moved: the grants piece, the creation of a module's declared bus objects. After this, the grants part creates a new manifest's buckets, logs and streams on the event, so no new module state waits for a controller start.
The same hunks as mesh-sdk's composer copy (nats.go, users.go, writers.go): the grants principal may publish `$JS.API.STREAM.CREATE.<name>` and `$JS.API.STREAM.INFO.<name>` for exactly the declared names, one subject each, no wildcard; never update, delete or purge. Nothing else in the controller changes; the mesh-sdk pin is unchanged. The test file is byte-equal to mesh-sdk's but for its package line.
Delivering this restarts the controller once; that start also raises the vault's waiting bucket mesh-vault_bus-accounts (issue 1945 note 70).
Tests: TestTheGrantsPartCreatesOnlyDeclaredStreams; `go test -race ./internal/broker/...`, `go test -race ./...` and `go vet -tags integration ./...` pass. Rules bent: no mesh-controller.try, as the operator directed on 2026-10-25.
Issue: 1790
Reviewed-by: review-create-buckets@shanks at 6927b02d4d5806eb3b2253b40c430c7d2f698db8
The operator's one more grant in the frozen controller's composer (2026-10-26 08:54), beside the
memberships grant of 22:31 (ADR 0547 clause 1 and 5): mesh-grants' principal may publish
$JS.API.STREAM.CREATE.<stream> and $JS.API.STREAM.INFO.<stream> for each bucket
(KV_<module>_<state>), log (LOG_<module>_<log>) and module stream a placed module's manifest
declares, each by its own name, and nothing wider. The writers table lets it create, never update
or delete. Byte-equal with mesh-sdk's buscompose (fix/1790-grants-create-buckets), whose expected
lists this code wrote; the same test file holds both copies. Nothing else changes, and the mesh-sdk
pin stays.
Research 072: moves the grants piece (the grants part split out of the controller) one step, the
creation of a module's declared bus objects; the controller's raise at start stays until it loses
its lease.
Issue: 1790
Deliverynovox/mesh-controller@6927b02d4d58 — merged since 2026-10-26T08:17:20Z
Source — source.main moved to novox/mesh-controller@47e64f0284. Whether it reached the machines is mesh-delivery-view's, derived from source.main, the wants and the haves.
2026-10-26 08:16 (new) → proposed (announced): novox/mesh-controller#469's head announced
2026-10-26 08:16 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-10-26 08:17 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-controller@6927b02d4d58` — **merged** since 2026-10-26T08:17:20Z
**Source** — source.main moved to novox/mesh-controller@47e64f0284a9. Whether it reached the machines is `mesh-delivery-view`'s, derived from `source.main`, the wants and the haves.
**Group** `fix/1790-grants-create-buckets`: novox/mesh-controller@6927b02d4d58, novox/mesh-delivery@12f16bbebd40, novox/mesh-sdk@136fa8b2a896
**Transitions**
- 2026-10-26 08:16 (new) → proposed (announced): novox/mesh-controller#469's head announced
- 2026-10-26 08:16 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-10-26 08:17 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: the operator's Approve of this pull request's merge into main is ended: a head it covers moved on: the heads it covers are no longer the group's heads. Nothing is merged on it. The operator is asked again once the checks pass at the new head.
mesh-delivery: the operator's Approve of this pull request's merge into main is ended: a head it covers moved on: the heads it covers are no longer the group's heads. Nothing is merged on it. The operator is asked again once the checks pass at the new head.
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 1790 (notes 8-10). The controller is frozen (ADR 0547 clause 1); the operator allowed this one grant on Telegram, 2026-10-26 08:54, as the memberships grant of 2026-10-25 22:31.
Research 072 ('The controller, NATS-native') piece moved: the grants piece, the creation of a module's declared bus objects. After this, the grants part creates a new manifest's buckets, logs and streams on the event, so no new module state waits for a controller start.
The same hunks as mesh-sdk's composer copy (nats.go, users.go, writers.go): the grants principal may publish
$JS.API.STREAM.CREATE.<name>and$JS.API.STREAM.INFO.<name>for exactly the declared names, one subject each, no wildcard; never update, delete or purge. Nothing else in the controller changes; the mesh-sdk pin is unchanged. The test file is byte-equal to mesh-sdk's but for its package line.Delivering this restarts the controller once; that start also raises the vault's waiting bucket mesh-vault_bus-accounts (issue 1945 note 70).
Tests: TestTheGrantsPartCreatesOnlyDeclaredStreams;
go test -race ./internal/broker/...,go test -race ./...andgo vet -tags integration ./...pass. Rules bent: no mesh-controller.try, as the operator directed on 2026-10-25.Issue: 1790
Reviewed-by: review-create-buckets@shanks at
6927b02d4dDelivery
novox/mesh-controller@6927b02d4d58— merged since 2026-10-26T08:17:20ZSource — source.main moved to novox/mesh-controller@47e64f0284. Whether it reached the machines is
mesh-delivery-view's, derived fromsource.main, the wants and the haves.Group
fix/1790-grants-create-buckets: novox/mesh-controller@6927b02d4d, novox/mesh-delivery@12f16bbebd, novox/mesh-sdk@136fa8b2a8Transitions
The commit's note under
refs/notes/mesh-plankeeps every transition of this change up to its merge:git log --notes=mesh-plan.mesh-delivery: the operator's Approve of this pull request's merge into main is ended: a head it covers moved on: the heads it covers are no longer the group's heads. Nothing is merged on it. The operator is asked again once the checks pass at the new head.