Record what a machine says about itself and what the mesh keeps

The yes gates an assignment and the detail carries a value; they are one fact
read two ways, and only one read was being kept.
This commit is contained in:
2026-08-31 04:54:07 +02:00
parent 7f314eb399
commit 7c0be6968e
+30
View File
@@ -237,6 +237,36 @@ Each decision above owes a test:
| 0036 — disconnection is a situation | a node cut off and returned reconciles without being re-adopted | | 0036 — disconnection is a situation | a node cut off and returned reconciles without being re-adopted |
| 0008 — a failed step fails the apply | an apply with a failing step reports failure | | 0008 — a failed step fails the apply | an apply with a failing step reports failure |
## What a machine says about itself, and what the mesh keeps of it
*2026-08-31, from finding that half of it was being discarded.*
**A capability is detected and never assumed** ([ADR 0009](../../02-DECISIONS/0009-modules-and-the-graph.md)),
so the only account of what a machine can do is the one the machine gave. That account has two
halves and the mesh was keeping one:
| | |
|---|---|
| **the yes or no** | gates an assignment — *this machine has no seat, and nothing can be installed to fix that* |
| **the detail** | carries a value — `seat: card1-DP-1`, an architecture, an amount of memory |
They are **one fact read two ways**: *can this run here* and *what should it be configured as*. A
module that must not be assigned without an OLED panel and one that dims itself differently on one
are reading the same line. Keeping only the first read makes the second unanswerable, and there is
nowhere else to get it — the detector is the only thing that looked.
**The reason an absent capability is absent goes the same way, and it is the half a person needs
most.** *This machine has no container runtime* is the answer; *docker is not installed* is why.
The first is the mesh's to say and the second is only the machine's.
**Never reported and reported nothing stay different.** One machine has not run the host yet; the
other ran it and can do nothing. Both refuse everything that requires a capability, and the
remedies are not remotely alike.
*Checked by recording a profile with a present capability carrying a value and an absent one
carrying its reason, and requiring both to survive — and by requiring a machine that never
reported to be distinguishable from one that reported an empty list.*
## Open ## Open
- **Whether one host can raise the substrate alone.** Move 1 assumes it. Stage 2 tests it, and - **Whether one host can raise the substrate alone.** Move 1 assumes it. Stage 2 tests it, and