From 9516d31a6295eaf66d0db9f42278ead8c3a2cb07 Mon Sep 17 00:00:00 2001 From: jochen Date: Sat, 26 Sep 2026 18:52:59 +0200 Subject: [PATCH] =?UTF-8?q?0115:=20one=20assignment=20of=20a=20module=20pe?= =?UTF-8?q?r=20node=20=E2=80=94=20the=20requirement=20is=20dropped,=20the?= =?UTF-8?q?=20module's=20name=20is=20the=20identity?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...115-one-assignment-of-a-module-per-node.md | 49 +++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 02-DECISIONS/0115-one-assignment-of-a-module-per-node.md diff --git a/02-DECISIONS/0115-one-assignment-of-a-module-per-node.md b/02-DECISIONS/0115-one-assignment-of-a-module-per-node.md new file mode 100644 index 0000000..69ee205 --- /dev/null +++ b/02-DECISIONS/0115-one-assignment-of-a-module-per-node.md @@ -0,0 +1,49 @@ +--- +topic: what runs on it +status: accepted +date: 2026-09-26 +deciders: jochen +extends: 0112-a-module-definition-names-no-node-mesh-or-path.md +--- + +# 115. One assignment of a module per node: the module's name is the assignment's identity + +## Context + +Everything an assignment owns is named after its module: the database user +(`mesh__`), the broker account (`-`), the containers, the sealed +secrets, and — since ADR 0112 — the placed directory (`/`). A second assignment +of the same module on the same node would collide on every one of those names at once, which +is why the mesh has never allowed it. + +[Issue 119](../04-ISSUES/119-a-module-definition-decides-where-its-files-live/00-report.md) +recorded this as a kept limitation, and 0112 deliberately did not fix it — giving assignments +identities of their own would have touched every naming recipe in one already-large change. +The question stayed open: is multi-assignment a requirement deferred, or a requirement at all? + +The original motivation was real — one module serving two tenants on one machine, a second +photo site, a second mail domain. The operator held that requirement once and has now weighed +it against what it costs. + +## Decision + +**Dropped.** One assignment of a module per node is the rule, not a limitation. The module's +name IS the assignment's identity on a node, permanently, and every naming recipe may rely on +it. + +Wanting the same software twice on one node has a spelling the mesh already supports: **two +modules.** A module definition is cheap — two photo sites are two modules sharing artifacts +(the build's images are content-addressed; nothing is built twice), each with its own name, +its own directory, its own grants and its own routes. The tenant boundary lands where every +other boundary already is: the module name. + +## Consequences + +- The naming recipes stay as simple as they are. No instance suffixes, no assignment ids + threaded through six systems, no migration of every existing name. +- `/` is the assignment's directory with nothing left open (0112's placement + language stands unchanged). +- The controller may refuse a second assignment *plainly* — "novox already runs mailu, and one + node runs one of each (ADR 0115)" — instead of failing on whichever name collides first. +- Multi-tenant asks are answered in the catalogue (a second module definition), not in the + control plane.