ADR 0188: a module's own code is bundles in any language, and a tools bundle speaks MCP to the runtime; design 38 gains WP1b #300
+1
-1
@@ -108,7 +108,7 @@ term retired here may still appear there, and the mapping above is how to read i
|
|||||||
memberships issue; its serving mode on loopback is what was called **the console**
|
memberships issue; its serving mode on loopback is what was called **the console**
|
||||||
([ADR 0175](../02-DECISIONS/0175-one-tool-runtime-per-node-serves-every-modules-tools-on-the-host-side.md)).
|
([ADR 0175](../02-DECISIONS/0175-one-tool-runtime-per-node-serves-every-modules-tools-on-the-host-side.md)).
|
||||||
Replaces **"console"** as the module's name; *console* remains the word for the person's end of it.
|
Replaces **"console"** as the module's name; *console* remains the word for the person's end of it.
|
||||||
- **bundle** — the artifact a module's own code is built into — its tools, a seat's implementation, a daemon — in any language the mesh has a toolchain for, interpreted or compiled; never an image. One module may declare several ([ADR 0187](../02-DECISIONS/0187-a-modules-own-code-is-bundles-in-any-language-and-a-tools-bundle-speaks-mcp-to-the-runtime.md)).
|
- **bundle** — the artifact a module's own code is built into — its tools, a seat's implementation, a daemon — in any language the mesh has a toolchain for, interpreted or compiled; never an image. One module may declare several ([ADR 0188](../02-DECISIONS/0188-a-modules-own-code-is-bundles-in-any-language-and-a-tools-bundle-speaks-mcp-to-the-runtime.md)).
|
||||||
- **kept region** — a marked block in a managed file the mesh writes *into*, where the operator's own
|
- **kept region** — a marked block in a managed file the mesh writes *into*, where the operator's own
|
||||||
lines survive every push and are given back when the module goes
|
lines survive every push and are given back when the module goes
|
||||||
([ADR 0174](../02-DECISIONS/0174-a-node-varies-a-module-through-settings-and-kept-regions-never-an-edit.md)).
|
([ADR 0174](../02-DECISIONS/0174-a-node-varies-a-module-through-settings-and-kept-regions-never-an-edit.md)).
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ reconstructed: false
|
|||||||
|
|
||||||
# 39. What the SDK holds, and what it refuses
|
# 39. What the SDK holds, and what it refuses
|
||||||
|
|
||||||
> **The mechanism changed — 2026-10-02, by [ADR 0187](0187-a-modules-own-code-is-bundles-in-any-language-and-a-tools-bundle-speaks-mcp-to-the-runtime.md).** The test of this record — frequent *and* cascading does not belong — stands and now applies to one SDK per language. Where *what it holds* names the broker client and the event consumer, read: the local protocol a tools bundle speaks to the node's runtime; the transport lives in the runtime and in no SDK, which is what keeps a bus change from rebuilding any module in any language.
|
> **The mechanism changed — 2026-10-02, by [ADR 0188](0188-a-modules-own-code-is-bundles-in-any-language-and-a-tools-bundle-speaks-mcp-to-the-runtime.md).** The test of this record — frequent *and* cascading does not belong — stands and now applies to one SDK per language. Where *what it holds* names the broker client and the event consumer, read: the local protocol a tools bundle speaks to the node's runtime; the transport lives in the runtime and in no SDK, which is what keeps a bus change from rebuilding any module in any language.
|
||||||
|
|
||||||
_Reconciliation note (2026-09-05): supersedes the earlier "repository structure" decision, which the consolidation folded; no standalone record remains to point at, so body references to it now point at the nearest surviving record, [ADR 0015](0015-applications-live-in-their-own-repository.md)._
|
_Reconciliation note (2026-09-05): supersedes the earlier "repository structure" decision, which the consolidation folded; no standalone record remains to point at, so body references to it now point at the nearest surviving record, [ADR 0015](0015-applications-live-in-their-own-repository.md)._
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -9,7 +9,7 @@ extends: 02-DECISIONS/0047-a-module-runs-its-code-as-its-own-process-with-its-ow
|
|||||||
|
|
||||||
# 150. A module's own code runs as supervised processes under the module's one account
|
# 150. A module's own code runs as supervised processes under the module's one account
|
||||||
|
|
||||||
> **Widened — 2026-10-02, by [ADR 0187](0187-a-modules-own-code-is-bundles-in-any-language-and-a-tools-bundle-speaks-mcp-to-the-runtime.md).** A module's long-lived process is a bundle in any language the mesh has a toolchain for, run as a unit the host writes; this record never said one language and never meant one, and 0187 says so as the rule.
|
> **Widened — 2026-10-02, by [ADR 0188](0188-a-modules-own-code-is-bundles-in-any-language-and-a-tools-bundle-speaks-mcp-to-the-runtime.md).** A module's long-lived process is a bundle in any language the mesh has a toolchain for, run as a unit the host writes; this record never said one language and never meant one, and 0188 says so as the rule.
|
||||||
|
|
||||||
> **The mechanism changed — 2026-10-02, by [ADR 0175](0175-one-tool-runtime-per-node-serves-every-modules-tools-on-the-host-side.md).** For a module's *tools*, read that record: one runtime per node, the node's one account, bundles loaded from the memberships. This record still governs a module's long-lived processes — a daemon, a provisioner, a scheduled ingest — and the account invariant for them.
|
> **The mechanism changed — 2026-10-02, by [ADR 0175](0175-one-tool-runtime-per-node-serves-every-modules-tools-on-the-host-side.md).** For a module's *tools*, read that record: one runtime per node, the node's one account, bundles loaded from the memberships. This record still governs a module's long-lived processes — a daemon, a provisioner, a scheduled ingest — and the account invariant for them.
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -9,7 +9,7 @@ extends: 02-DECISIONS/0150-a-modules-own-code-runs-as-supervised-processes-under
|
|||||||
|
|
||||||
# 175. One tool runtime per node serves every module's tools, on the host side
|
# 175. One tool runtime per node serves every module's tools, on the host side
|
||||||
|
|
||||||
> **The mechanism changed — 2026-10-02, by [ADR 0187](0187-a-modules-own-code-is-bundles-in-any-language-and-a-tools-bundle-speaks-mcp-to-the-runtime.md).** Everything decided here stands: one runtime per node, host-side, every module's tools and every held seat's verbs on the memberships' subjects, root the module's concern, any node calls any tool, the console its serving mode. What moved is how the runtime brings a bundle to life. Decision 3 and the consequence *the node tools runtime needs an interpreter on the machine* read as though a bundle were always interpreted code the runtime imports; a tools bundle is now a process in any language that speaks MCP over stdio to the runtime, and importing a TypeScript bundle is the shortcut, not the contract.
|
> **The mechanism changed — 2026-10-02, by [ADR 0188](0188-a-modules-own-code-is-bundles-in-any-language-and-a-tools-bundle-speaks-mcp-to-the-runtime.md).** Everything decided here stands: one runtime per node, host-side, every module's tools and every held seat's verbs on the memberships' subjects, root the module's concern, any node calls any tool, the console its serving mode. What moved is how the runtime brings a bundle to life. Decision 3 and the consequence *the node tools runtime needs an interpreter on the machine* read as though a bundle were always interpreted code the runtime imports; a tools bundle is now a process in any language that speaks MCP over stdio to the runtime, and importing a TypeScript bundle is the shortcut, not the contract.
|
||||||
|
|
||||||
## Context
|
## Context
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -7,7 +7,7 @@ reconstructed: false
|
|||||||
extends: 02-DECISIONS/0175-one-tool-runtime-per-node-serves-every-modules-tools-on-the-host-side.md
|
extends: 02-DECISIONS/0175-one-tool-runtime-per-node-serves-every-modules-tools-on-the-host-side.md
|
||||||
---
|
---
|
||||||
|
|
||||||
# 187. A module's own code is bundles in any language, and a tools bundle speaks MCP to the runtime
|
# 188. A module's own code is bundles in any language, and a tools bundle speaks MCP to the runtime
|
||||||
|
|
||||||
## Context
|
## Context
|
||||||
|
|
||||||
@@ -285,7 +285,7 @@ python3 00-META/checks/index.py fail if stale
|
|||||||
- **0181** — [The operator account is a node fact, and a home is a placement root](0181-the-operator-account-is-a-node-fact-and-a-home-is-a-placement-root.md)
|
- **0181** — [The operator account is a node fact, and a home is a placement root](0181-the-operator-account-is-a-node-fact-and-a-home-is-a-placement-root.md)
|
||||||
- **0182** — [Inside a home, the mesh owns the directory and the files it places, writes into the tool's own files, and holds everything else as found](0182-inside-a-home-the-mesh-owns-what-it-places-and-holds-the-rest-as-found.md)
|
- **0182** — [Inside a home, the mesh owns the directory and the files it places, writes into the tool's own files, and holds everything else as found](0182-inside-a-home-the-mesh-owns-what-it-places-and-holds-the-rest-as-found.md)
|
||||||
- **0183** — [The Anthropic licence manager is a module holding a seat; it hands each node's agent its token over the bus, sealed; the controller and the host have no part](0183-the-anthropic-licence-manager-is-a-module-and-hands-tokens-to-the-agent-over-the-bus.md)
|
- **0183** — [The Anthropic licence manager is a module holding a seat; it hands each node's agent its token over the bus, sealed; the controller and the host have no part](0183-the-anthropic-licence-manager-is-a-module-and-hands-tokens-to-the-agent-over-the-bus.md)
|
||||||
- **0187** — [A module's own code is bundles in any language, and a tools bundle speaks MCP to the runtime](0187-a-modules-own-code-is-bundles-in-any-language-and-a-tools-bundle-speaks-mcp-to-the-runtime.md)
|
- **0188** — [A module's own code is bundles in any language, and a tools bundle speaks MCP to the runtime](0188-a-modules-own-code-is-bundles-in-any-language-and-a-tools-bundle-speaks-mcp-to-the-runtime.md)
|
||||||
|
|
||||||
### How it is built
|
### How it is built
|
||||||
|
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ decisions:
|
|||||||
- 02-DECISIONS/0177-a-unit-may-be-user-scoped-and-the-service-manager-is-a-node-seat.md
|
- 02-DECISIONS/0177-a-unit-may-be-user-scoped-and-the-service-manager-is-a-node-seat.md
|
||||||
- 02-DECISIONS/0160-the-mesh-issues-an-assignments-subjects-and-a-runtime-serves-what-it-is-issued.md
|
- 02-DECISIONS/0160-the-mesh-issues-an-assignments-subjects-and-a-runtime-serves-what-it-is-issued.md
|
||||||
- 02-DECISIONS/0149-the-live-mesh-is-the-test-bed.md
|
- 02-DECISIONS/0149-the-live-mesh-is-the-test-bed.md
|
||||||
- 02-DECISIONS/0187-a-modules-own-code-is-bundles-in-any-language-and-a-tools-bundle-speaks-mcp-to-the-runtime.md
|
- 02-DECISIONS/0188-a-modules-own-code-is-bundles-in-any-language-and-a-tools-bundle-speaks-mcp-to-the-runtime.md
|
||||||
---
|
---
|
||||||
|
|
||||||
# 38. Building the operator's machine
|
# 38. Building the operator's machine
|
||||||
@@ -100,7 +100,7 @@ membership republished mid-run re-subscribes without a restart.
|
|||||||
|
|
||||||
*Built and proven 2026-10-02* (mesh-tools, branch `feat/the-operators-machine`, commit `6390d1d`).
|
*Built and proven 2026-10-02* (mesh-tools, branch `feat/the-operators-machine`, commit `6390d1d`).
|
||||||
|
|
||||||
**WP1b — the launcher beside the loader** ([ADR 0187](../../02-DECISIONS/0187-a-modules-own-code-is-bundles-in-any-language-and-a-tools-bundle-speaks-mcp-to-the-runtime.md)).
|
**WP1b — the launcher beside the loader** ([ADR 0188](../../02-DECISIONS/0188-a-modules-own-code-is-bundles-in-any-language-and-a-tools-bundle-speaks-mcp-to-the-runtime.md)).
|
||||||
*mesh-tools, mesh-sdk. A day for the skeleton.* A bundle whose entry is not JavaScript is launched
|
*mesh-tools, mesh-sdk. A day for the skeleton.* A bundle whose entry is not JavaScript is launched
|
||||||
as a child process with the runtime's environment and spoken to over MCP on stdio: `tools/list`
|
as a child process with the runtime's environment and spoken to over MCP on stdio: `tools/list`
|
||||||
once, `tools/call` per call; a tool named `<seat>.<verb>` is the seat's implementation. A child
|
once, `tools/call` per call; a tool named `<seat>.<verb>` is the seat's implementation. A child
|
||||||
@@ -132,7 +132,7 @@ with the shortcut off answers the same.
|
|||||||
changes one restarts it. A node with no account composes the runtime without the two words.
|
changes one restarts it. A node with no account composes the runtime without the two words.
|
||||||
4. **The gate.** A manifest declaring `tools` and a container built on the runtime's base image is
|
4. **The gate.** A manifest declaring `tools` and a container built on the runtime's base image is
|
||||||
refused at registration once the runtime module is registered, naming this record. It is the
|
refused at registration once the runtime module is registered, naming this record. It is the
|
||||||
mechanism that keeps the old pattern from returning by habit. ADR 0187 widens it, after WP4:
|
mechanism that keeps the old pattern from returning by habit. ADR 0188 widens it, after WP4:
|
||||||
a module whose own code is an image artifact is refused, whatever image it is built on.
|
a module whose own code is an image artifact is refused, whatever image it is built on.
|
||||||
|
|
||||||
**Proof.** Composition tests: a node with three assigned modules, one holding a seat, yields one
|
**Proof.** Composition tests: a node with three assigned modules, one holding a seat, yields one
|
||||||
|
|||||||
Reference in New Issue
Block a user