Give ADR 0346 a home in design 27: a provider may serve its own composed names (issue 624)
mesh/merge-gate head a54b1eaab9fc merged into trunk 0f5aab10b4e0 — pass: the change touches no module of the mesh's graph
mesh/repo-check head a54b1eaab9fc merged into trunk 0f5aab10b4e0 — pass: its merge-check.sh passed
mesh/delivery delivered

This commit is contained in:
jochen
2026-10-13 16:40:09 +02:00
parent 471f99344b
commit a54b1eaab9
@@ -2,8 +2,9 @@
layer: to-be
status: in-progress
code: [mesh-controller internal/catalogue]
updated: 2026-10-12
updated: 2026-10-13
decisions:
- "ADR 0346"
- "ADR 0312"
- "ADR 0319"
- "ADR 0309"
@@ -278,6 +279,20 @@ rather than recomputing it. A consumer that writes the derived value into its ow
of asking for it is refused, naming the placeholder to use. *How it is checked:* the unit tests in
ADR 0202's "how this is checked", each run against the unchanged controller first.
*A provider may serve its own composed names (2026-10-13, ADR 0346, issue 624):* a served value may
also name what the mesh composed for the **provider** through a requirement it contributes to, in the
same words its own files use: `${bound:<requirement>:name}`, `internal-name`, and `name-<local>` or
`internal-name-<local>` for a contribution under a local name. The forge serves the package registry's
public root as `https://${bound:route:name-web}/api/packages/novox/npm/`, so a consumer learns the
registry's public name from its binding rather than from a second copy kept by hand. The mesh fills it
from the provider machine's own composition on both paths, a provider on another machine and one on
the consumer's own, so the binding and the proxy name one host. Where the provider's machine composes
no such name (it has no public domain, or the endpoint is not reached publicly), the key is left out of
what the consumer is told, and `plan` says so on the provider's machine and under the consumer's need.
*How it is checked:* the module check refuses a served value naming a requirement the module does not
contribute to or a fact other than those names; the controller's unit tests for both paths and for the
left-out key, each run against the unchanged controller first.
## How a definition reads what was resolved
**One form, naming a requirement and a field of its contract.** A definition that needs the database's