Reconcile: adopt initialization's consolidated HQ as canonical, re-home this session's new work #24
@@ -215,15 +215,26 @@ before the mesh has configured it, so it can resolve no mesh name.
|
|||||||
**Both are the same shape: a node needs a fact about the mesh before it has any trustworthy way
|
**Both are the same shape: a node needs a fact about the mesh before it has any trustworthy way
|
||||||
to obtain one.** So that fact arrives by a path other than the mesh.
|
to obtain one.** So that fact arrives by a path other than the mesh.
|
||||||
|
|
||||||
**The token carries four things**, and it is the only thing a joining node needs:
|
**The token carries five things**, and it is the only thing a joining node needs:
|
||||||
|
|
||||||
| | |
|
| | |
|
||||||
|---|---|
|
|---|---|
|
||||||
|
| **who it is** | the name the mesh calls this machine |
|
||||||
| **where** | the broker's **address**, not a name — there is no resolution yet, and this is why none is needed |
|
| **where** | the broker's **address**, not a name — there is no resolution yet, and this is why none is needed |
|
||||||
| **what it is connecting to** | the fingerprint of the broker's certificate |
|
| **what it is connecting to** | the fingerprint of the broker's certificate |
|
||||||
| **who it will believe** | the control plane's signing identity |
|
| **who it will believe** | the control plane's signing identity |
|
||||||
| **the right to join** | a one-time secret, useless once used and useless after it expires |
|
| **the right to join** | a one-time secret, useless once used and useless after it expires |
|
||||||
|
|
||||||
|
*The first row was added 2026-08-30, from raising a mesh end to end for the first time.* It reads
|
||||||
|
like an oversight and is not: **the node cannot work its own name out.** The name is the mesh's,
|
||||||
|
chosen when the record was created, and the broker account the node authenticates as is named
|
||||||
|
after it — so it must be known *before* the mesh can tell the node anything. It is not a secret,
|
||||||
|
and whoever issues the token already has it.
|
||||||
|
|
||||||
|
Without it, enrolment fails at the broker with an empty username and a message about credentials,
|
||||||
|
which points at everything except the cause. **A missing fact that surfaces as an authentication
|
||||||
|
error is worse than one that surfaces as a missing fact.**
|
||||||
|
|
||||||
**Carried out of band**, by the person adopting the machine. That is what breaks both circles:
|
**Carried out of band**, by the person adopting the machine. That is what breaks both circles:
|
||||||
its authenticity comes from the channel it travelled, not from anything the node can check
|
its authenticity comes from the channel it travelled, not from anything the node can check
|
||||||
afterwards. **Trust on first use, with the first use moved out of band** — the difference between
|
afterwards. **Trust on first use, with the first use moved out of band** — the difference between
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
layer: to-be
|
layer: to-be
|
||||||
status: designed
|
status: designed
|
||||||
code: []
|
code: []
|
||||||
updated: 2026-08-27
|
updated: 2026-08-30
|
||||||
decisions:
|
decisions:
|
||||||
- 02-DECISIONS/0004-a-node-and-how-it-joins.md
|
- 02-DECISIONS/0004-a-node-and-how-it-joins.md
|
||||||
- 02-DECISIONS/0005-the-node-host.md
|
- 02-DECISIONS/0005-the-node-host.md
|
||||||
@@ -200,3 +200,32 @@ host's vocabulary grows by one shape rather than by one resource type per substr
|
|||||||
[the node host](05-the-node-host.md), never proved. If it is false, the tier boundary moves.
|
[the node host](05-the-node-host.md), never proved. If it is false, the tier boundary moves.
|
||||||
- **How the substrate is updated once a mesh exists.** Pinned by hand at bootstrap; afterwards
|
- **How the substrate is updated once a mesh exists.** Pinned by hand at bootstrap; afterwards
|
||||||
the control plane could deliver it like anything else, and nothing says whether it does.
|
the control plane could deliver it like anything else, and nothing says whether it does.
|
||||||
|
|
||||||
|
## Raised, and observed
|
||||||
|
|
||||||
|
*Written 2026-08-30, the first time a bare machine became a running mesh and something joined it.*
|
||||||
|
|
||||||
|
**It works, and what that means precisely:** a machine with a container runtime and nothing else
|
||||||
|
applied the bundle its host carries and ended with a store, a database per context, those
|
||||||
|
contexts' schemas, a broker holding a certificate it generated itself, and the control plane
|
||||||
|
serving on top of them. Eleven resources, one command, no mesh to ask anything of.
|
||||||
|
|
||||||
|
**Then it joined itself.** The same machine took a token, checked the broker against the
|
||||||
|
fingerprint pinned in it, generated three keypairs, and enrolled — which is
|
||||||
|
[ADR 0004](../../02-DECISIONS/0004-a-node-and-how-it-joins.md)'s *the first node is a node whose
|
||||||
|
mesh is not up yet*, observed rather than argued. Its specialness lasted one command.
|
||||||
|
|
||||||
|
**And a credential crossed.** With a second node recorded, the machine was declared the provider
|
||||||
|
of a database and pushed to over the broker. What arrived and what did not is the whole of the
|
||||||
|
[secrets argument](../../02-DECISIONS/0009-modules-and-the-graph.md), measured on a real machine:
|
||||||
|
|
||||||
|
| | |
|
||||||
|
|---|---|
|
||||||
|
| the password, in plain text | **on the machine only**, one file, mode 0600 |
|
||||||
|
| in the declaration that crossed the broker | absent |
|
||||||
|
| in the control plane's database | absent |
|
||||||
|
| in what the node reported back | absent |
|
||||||
|
|
||||||
|
**One fault, and it was in the joining.** The token did not say what the mesh calls the machine,
|
||||||
|
so enrolment needed a flag its own help said it did not — and failed at the broker with an empty
|
||||||
|
username. Recorded in ADR 0004 as the fifth thing a token carries.
|
||||||
Reference in New Issue
Block a user