Reconcile: adopt initialization's consolidated HQ as canonical, re-home this session's new work #24
@@ -119,15 +119,16 @@ the consumer's side did not refuse, it just gave two of the three no credential.
|
|||||||
written to date had one consumer per node, which is the natural shape of a small test and not the
|
written to date had one consumer per node, which is the natural shape of a small test and not the
|
||||||
shape of a machine.
|
shape of a machine.
|
||||||
|
|
||||||
**A consumer still cannot build a connection string**
|
**A consumer could not build a connection string**
|
||||||
([`023`](../../04-ISSUES/023-a-consumer-cannot-build-a-connection-string/00-report.md), open). It
|
([`023`](../../04-ISSUES/023-a-consumer-cannot-build-a-connection-string/00-report.md), fixed). It
|
||||||
is given its own password in whatever shape its configuration needs, and the host, port and user
|
had its password in the right shape and the host, port and user name were out of reach: the user
|
||||||
name are still out of reach: the user name is invented by the provisioner and recorded nowhere,
|
name was invented by the provisioner and recorded nowhere, and the bound values sat in a JSON
|
||||||
and the bound values sit in a JSON document that an application reading `KEY=value` cannot use.
|
document that an application reading `KEY=value` cannot use.
|
||||||
|
|
||||||
The asymmetry is worth stating, because it is backwards. **The secret is the hard case** — the
|
The asymmetry was backwards, which is what made it worth stating. **The secret is the hard case** —
|
||||||
mesh must not be able to read it — and the secret is the part that now arrives. The host and port
|
the mesh must not be able to read it — and the secret was the part that already arrived. The host
|
||||||
are ordinary facts held in the clear, and they are the ones stuck.
|
and port are ordinary facts held in the clear, and they were the ones stuck. Both halves came from
|
||||||
|
the same thing: the mesh knew something and did not say it.
|
||||||
|
|
||||||
## What the survey found that is not about coverage
|
## What the survey found that is not about coverage
|
||||||
|
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
---
|
---
|
||||||
status: located
|
status: fixed
|
||||||
opened: 2026-09-01
|
opened: 2026-09-01
|
||||||
located-in: [mesh-control]
|
located-in: [mesh-control]
|
||||||
fixed-by:
|
fixed-by: mesh-control 122680b
|
||||||
amended-design:
|
amended-design:
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -77,3 +77,35 @@ was fixed.
|
|||||||
|
|
||||||
Keycloak, Gitea, Mailu and MinIO all have manifests that parse and resolve, and none of them can
|
Keycloak, Gitea, Mailu and MinIO all have manifests that parse and resolve, and none of them can
|
||||||
start. This is what stands between the module set and a running one.
|
start. This is what stands between the module set and a running one.
|
||||||
|
|
||||||
|
## Fixed
|
||||||
|
|
||||||
|
Both halves had the same cause: **the mesh knew something and did not say it.**
|
||||||
|
|
||||||
|
**Who a consumer is, said once.** `ConsumerIdentity(node, module)` is one derivation, sent to the
|
||||||
|
provider in its grant and to the consumer in its binding — so the two agree by construction rather
|
||||||
|
than by two conventions that happened to match on the day they were written. The provisioners now
|
||||||
|
use the name they are given and **refuse to invent one** if the mesh says nothing: falling back to
|
||||||
|
a name of their own would create a login the consumer could never guess, and everything would
|
||||||
|
report success. They also refuse a name that does not carry the mesh's prefix, because that prefix
|
||||||
|
is how withdrawal finds what it made.
|
||||||
|
|
||||||
|
**Bound values reach the file that needs them.** `${bound:provision:key}` is the symmetric twin of
|
||||||
|
the sealed placeholder and simpler: these values are not secret, so the control plane fills them
|
||||||
|
in before sending, and the host gains no field and learns no format. `at`, `as` and `from` are
|
||||||
|
true of any provision; every other key comes from what the provider said it *serves*, so the
|
||||||
|
control plane still learns nothing about what a `postgres-database` is.
|
||||||
|
|
||||||
|
Keycloak and Gitea now produce complete connection strings — asserted from the manifests on disk,
|
||||||
|
checking that every part is filled, that no placeholder survives as a value, and that the password
|
||||||
|
is still a hole only the host can close.
|
||||||
|
|
||||||
|
### Also found, and separate
|
||||||
|
|
||||||
|
The lab run that was meant to prove this failed in a way that looked like the fix being wrong: a
|
||||||
|
rotation test could not authenticate against a real database. The cause was that the suite
|
||||||
|
rebuilt the control plane's image and not the provisioner's, so a run with an image built that
|
||||||
|
minute used a provisioner built the day before. Fixed in `mesh-lab`; it is
|
||||||
|
[`005`](../005-pipeline-test-harness-unbuildable/00-report.md)'s family — a rebuild covering
|
||||||
|
most of what a run uses is worse than one covering none, because the run that follows it is
|
||||||
|
believed.
|
||||||
|
|||||||
Reference in New Issue
Block a user