Move the self-check out of the controller into mesh-self-check, so its runs and findings no longer need the controller's lease (issue 1952)

The probes whose facts are on the bus run with their assertions unchanged (D6, D7, D15, DW, H-bus); the rest answer deferred, naming what they lack, never a pass. Findings go to its own bucket for the condition keeper; each run is kept a week and said as checked. The finding layout is a copy of mesh-sdk's S3 until that lands.
This commit is contained in:
2026-10-29 21:43:55 +01:00
parent 16378e0850
commit d7247eae19
15 changed files with 2245 additions and 0 deletions
+33
View File
@@ -0,0 +1,33 @@
# mesh-self-check
Holds the seat `mesh-self-check` (novox/hq ADR 0564 §6): the mesh's self-check, moved out of the controller. Go, one
binary (`cmd/mesh-self-check`), served by a runtime of its own on its own bus account (`runs-as`), so that its account
alone writes its buckets.
## What it does
Every five minutes (the first run a minute after it starts) it runs its registry of probes, each within thirty
seconds. A probe is one live invariant of a design, with its assertion as the controller had it, reading its facts on
the bus (the bus module's tools for the bus's own state). A probe whose facts have no home on the bus yet answers
`deferred`, naming them: never a pass. A probe that cannot run is said in the verdict at once, and written as a finding
of its own (`probe.<id>.failed`) when the next run cannot run it either.
What a probe finds is written as a finding, one key `<scope>.<id>.<kind>` per fault, only when what it says changes, and
deleted when a run no longer sees it. The condition keeper (`mesh-conditions`) raises and clears conditions from them.
A finding one look can be wrong about (a consumer behind after a burst) is written when two runs in a row see it.
Every run ends with the event `checked`, the body of the controller's `doctor-heartbeat`, which the watchman (S10) and
mesh-watcher on another machine hear: a self-check that stops checking is said through a path that does not pass
through it.
## What it keeps
- `mesh-self-check_findings`: what it finds wrong now.
- `mesh-self-check_verdict`: the key `last`, the last run whole.
- `mesh-self-check_verdicts`: every run (each probe's findings at most twenty), kept a week by the bucket's age.
## Its verbs and tools
- `mesh-self-check.doctor`: the last verdict; `run=true` runs now; `probe=<id>` one probe whole.
- `mesh-self-check.probes`: the registry, with what each deferred probe lacks.
- `self_check_findings`, `self_check_verdicts`: the reads of its buckets.