Merge pull request 'A machine says little about itself, and only when the mesh asks it something' (#209) from issue/160-what-a-machine-says-about-itself into main

This commit was merged in pull request #209.
This commit is contained in:
2026-09-30 08:36:48 +00:00
2 changed files with 110 additions and 0 deletions
@@ -62,6 +62,24 @@ you it works.
today and nothing will be until a machine differs — which is exactly how long a field like this stays today and nothing will be until a machine differs — which is exactly how long a field like this stays
invisible. invisible.
## The machine already says what it is
Found while filing [issue 160](../160-a-machine-says-little-about-itself-and-only-when-asked/00-report.md):
every machine reports its architecture and kernel in the same profile that carries its capabilities, and
the mesh keeps them.
```
ace | amd64 | linux
g14 | amd64 | linux
novox | amd64 | linux
shanks | amd64 | linux
```
Nothing in the control plane reads either, and `node show` prints the capabilities beside them without
printing them. **So a fix does not need a new fact from the machine** — matching an artifact's declared
system against what a machine reported is possible today, and the missing piece is only the comparison
and a compiler told what to target.
## Where to look ## Where to look
The compile invocation is assembled in `mesh-controller internal/builder`, and for Go it would need The compile invocation is assembled in `mesh-controller internal/builder`, and for Go it would need
@@ -0,0 +1,92 @@
---
status: open
opened: 2026-09-30
located-in:
- mesh-host internal/profile (what a machine collects about itself)
- mesh-controller internal/inventory (what the mesh keeps of it)
- mesh-controller cmd/mesh-controller (node show, which displays a part of it)
fixed-by:
amended-design:
---
# 160 — A machine says little about itself, and only when the mesh asks it something
*Filed as a to-do rather than a fault: nothing is broken by it today. `open` is the status this
repository has for "written down, nobody has started" — there is no `todo`.*
## What is wanted
**When a machine joins, the mesh should collect as much as it reasonably can about it**, and refresh
that daily or thereabouts. It already asks what the machine *can do*; what it is made of is the same
question one level down, and the mesh has no habit of asking it.
## What is already collected, which is more than it looks
A machine reports, and the mesh keeps:
| | |
|---|---|
| eight capabilities | container-runtime, firewall, graphical-session, overlay, package-manager, privileged, seat, service-manager — each with a version or a reason it is absent |
| **its architecture and kernel** | in the same profile, beside the capabilities |
| which links face outside it | read from its own routing table on every apply |
| the version of the host running on it | added 2026-09-30 |
| what it found and is holding | on an adopted machine |
| what is reachable on it | every listening socket and published port, on an adopted machine |
| the firewall it was found with, and the tunnel it carried | on an adopted machine |
**The architecture and the kernel are already there and nothing reads them.** Measured on the mesh:
```
ace | amd64 | linux
g14 | amd64 | linux
novox | amd64 | linux
shanks | amd64 | linux
```
`node show` prints the capabilities and not these two. No code in the control plane reads either.
## What is missing
**The facts.** Nothing is collected about memory, disk, the processor beyond its architecture, the
distribution and its version, whether the machine is virtual or physical, its uptime, its timezone, how
many cores it has. Several of those are what somebody actually wants when deciding where a module
should go, and the comment on module placement already imagines them: *"`seat: card1-DP-1`, an
architecture, an amount of memory"*.
**The refresh.** A machine publishes what it knows about itself **after an apply**, and the five-minute
reconcile publishes nothing. So the mesh's picture of a machine is as old as the last time it sent that
machine something — found the same day while checking host versions, where three machines read as
having said nothing until each was pushed
([issue 087](../087-the-controller-cannot-tell-a-host-is-too-old/01-resolution.md)). A daily refresh is
the same missing mechanism: a machine saying something on its own schedule rather than only when spoken
to.
**Somewhere to read it.** Whatever is collected has to be visible, or it joins the architecture in
being true and unread.
## The pattern this is the third instance of
Three times in one day the mesh was found to be collecting something and reading it nowhere:
- what an adopted machine holds — reported since the adoption work, and no surface counted it until
[issue 125](../125-a-hold-is-not-a-line-in-the-apply-report/01-resolution.md);
- the host version — reported for a week, and the control plane's own copy of the report did not have
the field ([issue 087](../087-the-controller-cannot-tell-a-host-is-too-old/00-report.md));
- the architecture and kernel — collected, stored, read by nothing, found today by being asked whether
the host is built for more than one processor
([issue 159](../159-an-artifacts-system-is-checked-and-then-ignored/00-report.md)).
**Collecting is the easy half and it is the half that gets done.** Whatever this issue adds should say,
in the same breath, which surface shows it — or it will be the fourth.
## Why it is not urgent
Every machine in this mesh is `amd64` and every one reports so. One architecture is enough for now, and
that is a decision rather than an oversight: a second processor is a second build of every component,
and nothing needs one.
## How a fix is checked
A machine's own account of itself is visible in one place; it names at least what is listed as missing
above; the newest of it is no older than a day on a machine nobody has pushed to; and a machine that
cannot determine one of them says so rather than reporting a zero.