diff --git a/04-ISSUES/159-an-artifacts-system-is-checked-and-then-ignored/00-report.md b/04-ISSUES/159-an-artifacts-system-is-checked-and-then-ignored/00-report.md index d20a5dc..9744b97 100644 --- a/04-ISSUES/159-an-artifacts-system-is-checked-and-then-ignored/00-report.md +++ b/04-ISSUES/159-an-artifacts-system-is-checked-and-then-ignored/00-report.md @@ -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 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 The compile invocation is assembled in `mesh-controller internal/builder`, and for Go it would need diff --git a/04-ISSUES/160-a-machine-says-little-about-itself-and-only-when-asked/00-report.md b/04-ISSUES/160-a-machine-says-little-about-itself-and-only-when-asked/00-report.md new file mode 100644 index 0000000..0db7b01 --- /dev/null +++ b/04-ISSUES/160-a-machine-says-little-about-itself-and-only-when-asked/00-report.md @@ -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.