The runtime-model gap the review surfaced — the thing that unblocks actually running the converted catalogue.
Problem: the catalogue's modules now have tools and events (code), but nothing runs it — only the audit-logger got a runtime, treated as an exception. And a node-wide runtime can't be the answer: it would hold one account with the union of every module's permissions, the exact isolation ADR 0048 draws.
Decision: per-module. A module with tools or events runs one process (a container: the tool runtime carrying its code) holding the one scoped account ADR 0048 gave it. It serves its tools each on its own key (serve.<tool> — a caller names a tool and only its module answers, superseding the shared tools.invoke dispatch); runs its events in the same process under the same account; and its runtime image is the tool runtime + the module's code — the audit-logger's shape, made the rule. A plain service module (plex the server, dnsmasq) runs no such process.
Consequences it names: a process/image per tools-or-events module (the cost of 0048's isolation, paid deliberately); serve.<tool> per key in the sdk; and — the fix for the provisioner-emit bug the review found — a provider's provisioner is a runtime process too, so one that emits must carry a broker credential or not emit.
The runtime-model gap the review surfaced — the thing that unblocks actually running the converted catalogue.
**Problem:** the catalogue's modules now have tools and events (code), but nothing runs it — only the audit-logger got a runtime, treated as an exception. And a node-wide runtime *can't* be the answer: it would hold one account with the union of every module's permissions, the exact isolation ADR 0048 draws.
**Decision:** per-module. A module with tools or events runs **one process** (a container: the tool runtime carrying its code) holding the **one scoped account** ADR 0048 gave it. It serves its tools each on its own key (`serve.<tool>` — a caller names a tool and only its module answers, superseding the shared `tools.invoke` dispatch); runs its events in the same process under the same account; and its runtime image is the tool runtime + the module's code — the audit-logger's shape, made the rule. A plain service module (plex the *server*, dnsmasq) runs no such process.
**Consequences it names:** a process/image per tools-or-events module (the cost of 0048's isolation, paid deliberately); `serve.<tool>` per key in the sdk; and — the fix for the provisioner-emit bug the review found — **a provider's provisioner is a runtime process too**, so one that emits must carry a broker credential or not emit.
Proposed; extends 0048; references 0045, 0047, 0044.
https://claude.ai/code/session_01LrgweAeERJYBg88c5cKDzF
The runtime-model gap the review found. A module with tools or events runs one
container — the tool runtime carrying its code — holding the one scoped account
ADR 0048 gave it. A node-wide runtime can't: it would hold the union of every
module's permissions, the isolation 0048 draws. So per-module: one module, one
process, one account. Tools served per key (serve.<tool>) so a caller names a
tool and only its module answers (superseding a shared tools.invoke); events in
the same process under the same account; the runtime image is the tool runtime
plus the module's code (the audit-logger's shape, made the rule). A plain
service module runs no such process. A provider's provisioner is a runtime too —
which is why a provisioner that emits must carry a broker credential or not emit.
Claude-Session: https://claude.ai/code/session_01LrgweAeERJYBg88c5cKDzF
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.
The runtime-model gap the review surfaced — the thing that unblocks actually running the converted catalogue.
Problem: the catalogue's modules now have tools and events (code), but nothing runs it — only the audit-logger got a runtime, treated as an exception. And a node-wide runtime can't be the answer: it would hold one account with the union of every module's permissions, the exact isolation ADR 0048 draws.
Decision: per-module. A module with tools or events runs one process (a container: the tool runtime carrying its code) holding the one scoped account ADR 0048 gave it. It serves its tools each on its own key (
serve.<tool>— a caller names a tool and only its module answers, superseding the sharedtools.invokedispatch); runs its events in the same process under the same account; and its runtime image is the tool runtime + the module's code — the audit-logger's shape, made the rule. A plain service module (plex the server, dnsmasq) runs no such process.Consequences it names: a process/image per tools-or-events module (the cost of 0048's isolation, paid deliberately);
serve.<tool>per key in the sdk; and — the fix for the provisioner-emit bug the review found — a provider's provisioner is a runtime process too, so one that emits must carry a broker credential or not emit.Proposed; extends 0048; references 0045, 0047, 0044.
https://claude.ai/code/session_01LrgweAeERJYBg88c5cKDzF
Pull request closed