broker: a generic module account + module issue (ADR 0048) #3
Closed
jschoubben
wants to merge 4 commits from
events/module-broker-account into claude/manifest-events
pull from: events/module-broker-account
merge into: :claude/manifest-events
:main
:fix/sweep-2026-10-30
:fix/checker-full-failure
:feat/1945-user-list-switch
:fix/1945-mesh-grants-publishes-memberships
:fix/issued-states-follow-the-module
:fix/1945-credential-on-assignment
:fix/r6-mirror-on-change
:fix/store-forge-address
:fix/r6-look-again-after-unlock
:fix/r6-key-waits-said
:fix/1931-reconnects-verb
:fix/forge-requires-no-status
:fix/906-lease-renewal
:feat/r4e-controller
:fix/1106-sdk-member-merges
:fix/1399-person-word-test
:fix/1652-checks-wait
:feat/files-through-the-store-files-verbs
:fix/1649-held-ask-handed-out-twice
:fix/1658-sdk-items
:fix/1334-a-bus-reload-fails-a-tier
:feat/chain-on-the-bus
:fix/701-a-name-nothing-answers-is-not-used
:fix/270-a-dead-bus-watch-is-heard
:fix/630-config-values-from-four-sources
:fix/613-node-smb-server
:feat/328-libraries-and-module-users
:feat/325-identities-and-kept-folders
:feat/bus-view-principal
:test/plan-diff-left-out-line
:fix/the-registry-trust-test-reads-the-runtimes-module
:fix/the-runtime-file-is-the-runtimes
:feat/build-edges-are-recorded
:fix/several-contributions-collide-in-grants-v2
No Reviewers
No labels
Milestone
No items
No Milestone
Assignees
agent-ace
agent-g14
agent-novox
agent-shanks
jschoubben
mesh-tools
miel.truyen
nox-agent
Clear assignees
No Assignees
No due date set.
Dependencies
No dependencies set.
Reference: novox/mesh-controller#3
Reference in New Issue
Block a user
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.
Implements ADR 0048's control-plane half — a module's broker account, scoped by its manifest.
CreateModuleAccount— permissions are the manifest: readmesh.events+ its own<node>.<module>.eventsqueue if it consumes; writemesh.eventsonly if it emits; nothing else.EnsureEventExchanges— the substrate's exchanges (mesh.events/mesh.rpc/mesh.events.dead+ retention queue), idempotent.EnsureModuleQueue— the substrate pre-declares a consumer's dead-lettered queue, because LavinMQ refuses a non-administrator declaring one; the runtime then passively checks it.module issue <module> --node <m>— looks up emits/consumes, ensures the bus, creates the account, and seals an amqps{url,fingerprint,node,module}as the module's broker own-secret.Scope tested as patterns; every management call verified against a real LavinMQ; the whole flow proven in the lab (mesh-lab: the assigned audit-logger passes 1/1).
Honest limit, recorded in the code: LavinMQ has no topic permissions, so ADR 0047's emit-origin reservation (
module.<self>.*) is stamped by the sdk, not broker-enforced.Stacked on
claude/manifest-events(the emits/consumes fields, PR #2).https://claude.ai/code/session_01LrgweAeERJYBg88c5cKDzF
'module issue <module> --node <m>' looks up the module's emits/consumes from the catalogue, ensures the bus exchanges exist, creates its scoped account (CreateModuleAccount), and seals an amqps {url,fingerprint} to the node as the module's broker own-secret — the same delivery as 'builder issue', now generic. Claude-Session: https://claude.ai/code/session_01LrgweAeERJYBg88c5cKDzF