From 76cd91413ed90b37efe46a1bad92f66b1ff76d1a Mon Sep 17 00:00:00 2001 From: jochen Date: Mon, 21 Sep 2026 19:30:35 +0200 Subject: [PATCH] ADR 0093: a fixture that runs a module's runtime carries its name; 074 diagnosed, two beds converted; 075 resolved --- ...runs-a-modules-runtime-carries-its-name.md | 53 +++++++++++++++++++ 02-DECISIONS/README.md | 1 + 03-DESIGN/01-to-be/01-end-to-end-testing.md | 14 ++++- .../01-diagnosis.md | 22 ++++++++ .../00-report.md | 8 +-- .../01-diagnosis.md | 13 +++++ 6 files changed, 105 insertions(+), 6 deletions(-) create mode 100644 02-DECISIONS/0093-a-fixture-that-runs-a-modules-runtime-carries-its-name.md create mode 100644 04-ISSUES/074-a-mesh-test-wears-a-catalogue-modules-name/01-diagnosis.md create mode 100644 04-ISSUES/075-a-stocked-runtime-image-is-never-rebuilt-by-the-run/01-diagnosis.md diff --git a/02-DECISIONS/0093-a-fixture-that-runs-a-modules-runtime-carries-its-name.md b/02-DECISIONS/0093-a-fixture-that-runs-a-modules-runtime-carries-its-name.md new file mode 100644 index 0000000..dcc8f93 --- /dev/null +++ b/02-DECISIONS/0093-a-fixture-that-runs-a-modules-runtime-carries-its-name.md @@ -0,0 +1,53 @@ +--- +topic: checking it +status: accepted +date: 2026-09-21 +deciders: jochen +reconstructed: false +extends: 02-DECISIONS/0089-a-bed-reads-the-catalogue-it-proves.md +--- + +# 93. A fixture that runs a module's runtime carries the module's name + +## Context + +[ADR 0089](0089-a-bed-reads-the-catalogue-it-proves.md) said a bed that needs less than a module +declares is a mesh test, and carries a name of its own. Twelve beds were to be renamed on that +basis ([issue 074](../04-ISSUES/074-a-mesh-test-wears-a-catalogue-modules-name/00-report.md)). +Reading how a module's tools are reached showed why they cannot be: the account the mesh issues +a module is scoped to `serve..*` from the manifest's name, and the runtime binds its tool +queues under the name baked into its image. A fixture named otherwise but running the real +runtime would be refused its own queues. The name is not a label; it is the tool namespace and +the broker scope. + +## Considered Options + +1. **Rename anyway, and rebuild each runtime under the fixture's name.** Rejected: a runtime built + under a false name proves nothing about the module and costs a build per bed. +2. **A fixture that runs a module's runtime carries the module's name, and therefore reads the + catalogue.** Adopted. + +## Decision + +A bed that runs a module's runtime installs the catalogue's manifest for that module and what it +requires — the vault for a `secret`, the route module for a route — and proves the mechanism +against the real module. A name of its own is for a fixture that runs no real runtime: a +declaration-only stub, a bare upstream image. + +## Consequences + +The mechanism beds become module beds with a mechanism inside them, which is more than they +were. What got harder: a bed that wanted a cut-down redis now raises the vault beside it; one that +wanted a sidecar without its server raises the server. Each conversion is a lab run, and the beds +still carrying a copy are declared with this reason until converted. + +## How it is checked + +The lab's inline-copy check refuses undeclared copies as before; the declared list's reason for +these beds names this record. Two beds converted with the vault beside them ran green. + +## References + +- [issue 074](../04-ISSUES/074-a-mesh-test-wears-a-catalogue-modules-name/00-report.md) +- [ADR 0089](0089-a-bed-reads-the-catalogue-it-proves.md), [ADR 0047](0047-a-module-runs-its-code-as-its-own-process-with-its-own-account.md) +- [`03-DESIGN/01-to-be/01-end-to-end-testing.md`](../03-DESIGN/01-to-be/01-end-to-end-testing.md) diff --git a/02-DECISIONS/README.md b/02-DECISIONS/README.md index 0bd271d..89583b4 100644 --- a/02-DECISIONS/README.md +++ b/02-DECISIONS/README.md @@ -165,6 +165,7 @@ python3 00-META/checks/index.py fail if stale - **0017** — [A test defends a decision](0017-a-test-defends-a-decision.md) - **0018** — [A picture of a system is read from the system, never from what asked for it](0018-a-picture-is-read-from-what-runs.md) - **0089** — [A bed reads the catalogue it proves](0089-a-bed-reads-the-catalogue-it-proves.md) +- **0093** — [A fixture that runs a module's runtime carries the module's name](0093-a-fixture-that-runs-a-modules-runtime-carries-its-name.md) ### How we work diff --git a/03-DESIGN/01-to-be/01-end-to-end-testing.md b/03-DESIGN/01-to-be/01-end-to-end-testing.md index 733172a..23e1381 100644 --- a/03-DESIGN/01-to-be/01-end-to-end-testing.md +++ b/03-DESIGN/01-to-be/01-end-to-end-testing.md @@ -4,6 +4,7 @@ status: in-progress code: [mesh-lab] updated: 2026-09-21 decisions: + - 02-DECISIONS/0093-a-fixture-that-runs-a-modules-runtime-carries-its-name.md - 02-DECISIONS/0016-the-lab.md - 02-DECISIONS/0019-how-this-repository-works.md - 02-DECISIONS/0089-a-bed-reads-the-catalogue-it-proves.md @@ -418,7 +419,12 @@ receipt written before it recorded a given fact, which claims nothing rather tha **The run rebuilds what it tests.** The suite consumes artifacts from other repositories, and an artifact rebuilt from memory is one rebuilt sometimes. A stale binary reporting success against -rules that have since changed is the same fault wearing different clothes. +rules that have since changed is the same fault wearing different clothes. This covers the module +runtimes a bed's scenario stocks as well as the host and the control plane +([issue 075](../../04-ISSUES/075-a-stocked-runtime-image-is-never-rebuilt-by-the-run/00-report.md)): +each is compared against the module's source and what it is built on, and rebuilt where older, +missing or uncommitted. *How it is checked:* unit tests on what a bed stocks and when it is stale; +a run with an image removed rebuilds it before the bed passes. **The general rule, which outlives this suite:** *silence and success must never look alike.* It is the same rule the host follows about a service that does not exist @@ -442,7 +448,11 @@ an address may point at a stand-in the bed raises — and nothing else. **A bed that needs less than the module declares is not testing that module.** No upstream server, a secret in the environment, a requirement edge cut so no second provider is needed: -that is a mesh test, and it carries a fixture with a name of its own, never a catalogue module's. +that is a mesh test. It does not get a name of its own if it runs the module's runtime — a +module's name is its tool namespace and its broker scope +([ADR 0093](../../02-DECISIONS/0093-a-fixture-that-runs-a-modules-runtime-carries-its-name.md)) — +so it reads the catalogue and installs what the module requires; a name of its own is for a +fixture that runs no real runtime. **The receipt names the catalogue's commit** with the others', so a run taken before a manifest changed says so — the same rule as for the binaries, for the same reason. diff --git a/04-ISSUES/074-a-mesh-test-wears-a-catalogue-modules-name/01-diagnosis.md b/04-ISSUES/074-a-mesh-test-wears-a-catalogue-modules-name/01-diagnosis.md new file mode 100644 index 0000000..495138a --- /dev/null +++ b/04-ISSUES/074-a-mesh-test-wears-a-catalogue-modules-name/01-diagnosis.md @@ -0,0 +1,22 @@ +# Diagnosis — 2026-09-21 + +1. The renames the report asked for were sized: each bed uses its borrowed name twenty to sixty + times, most of them container names and paths that could stay; the name itself appears in the + manifest, in the `assign` and `module issue` commands, and in the broker account the bed + asserts on, `-`. +2. Then the account was read. The mesh scopes a module's broker account to `serve..*` + from the manifest's name, and the tool runtime binds its queues under the module name baked + into its image. A fixture named `redis-fixture` running the real redis runtime would be + refused the queues it serves on. The name is not a label. **A fixture that runs a module's + runtime carries the module's name**, and therefore reads the catalogue + ([ADR 0093](../../02-DECISIONS/0093-a-fixture-that-runs-a-modules-runtime-carries-its-name.md)). +3. Of the twelve, the two whose only cut was the vault's secret — the grant bed and the + backend-network bed, both redis — read the catalogue's redis now and install the vault beside + it, as the vault bed does. The rest are declared with this reason: four sidecar beds need the + module's server raised (and, for grafana and sonarr, the route module); the minio and postgres + grant beds raise a second store beside the foundation's; the route-forwarding bed needs the + certificate authority; the largest mesh test carries a declaration-only postgres, a builder + that builds itself and an umami of another shape. + +**Located in:** mesh-lab, the ten declared beds, one conversion each with a lab run. Not renamed, +by decision; converted two at a time as the modules they need are raised beside them. diff --git a/04-ISSUES/075-a-stocked-runtime-image-is-never-rebuilt-by-the-run/00-report.md b/04-ISSUES/075-a-stocked-runtime-image-is-never-rebuilt-by-the-run/00-report.md index 11b23e5..e97ebb3 100644 --- a/04-ISSUES/075-a-stocked-runtime-image-is-never-rebuilt-by-the-run/00-report.md +++ b/04-ISSUES/075-a-stocked-runtime-image-is-never-rebuilt-by-the-run/00-report.md @@ -1,9 +1,9 @@ --- -status: open +status: resolved opened: 2026-09-21 -located-in: [] -fixed-by: -amended-design: +located-in: [mesh-lab src/rebuild.ts, mesh-lab src/runtimes.ts] +fixed-by: mesh-lab feat/mesh-tests-and-runtimes (the suite compares each stocked runtime against its source and rebuilds it where older, missing or uncommitted); proven by removing an image and watching the run rebuild it +amended-design: 03-DESIGN/01-to-be/01-end-to-end-testing.md --- # A stocked runtime image is never rebuilt by the run diff --git a/04-ISSUES/075-a-stocked-runtime-image-is-never-rebuilt-by-the-run/01-diagnosis.md b/04-ISSUES/075-a-stocked-runtime-image-is-never-rebuilt-by-the-run/01-diagnosis.md new file mode 100644 index 0000000..bbe8927 --- /dev/null +++ b/04-ISSUES/075-a-stocked-runtime-image-is-never-rebuilt-by-the-run/01-diagnosis.md @@ -0,0 +1,13 @@ +# Diagnosis — 2026-09-21 + +1. The suite rebuilt the host, the control plane's images and the installer before a run, and + nothing else; a bed's scenario stocked `mesh-runtime-:development` from whatever the + image store held, built by hand by a script the suite never called. +2. The rule that covers the rest — *the run rebuilds what it tests* — was extended to these. For + the beds named, every runtime their scenarios stock is compared against the module's source in + the catalogue and the tool runtime and SDK it is built on; the image is rebuilt where it is + older, missing, or the source has uncommitted changes, and a build that fails stops the suite. + Proven by removing a runtime image and watching the run rebuild it before the bed passed. + +**Located in:** the lab's rebuild step. The design's rule now says it covers module runtimes, and +says how it is checked. -- 2.54.0