A new module, sensors (novox/hq ADR 0256, hq PR #206). Read-only, in Go, assignable to every machine; a sensor class the machine lacks is said as not present.
Tools (all (r)): sensors_summary, sensors_temperatures, sensors_fans, sensors_drives, sensors_faults, sensors_health. Flags are measured against the hardware's own thresholds only (hwmon max/crit/emergency, a zone's hot/passive/critical trips); a threshold of 65261.85 °C or 0 is no threshold.
Resources: smartmontools (declared, not installed by hand); /etc/smartd.conf (every drive, never woken from standby, no mail); a smartd drop-in (runs on a VM too, stays up with no drive: -q never); smartd running, health unit; watch (sensors watch, a root process of the bundle: SMART every 10 min with smartctl --json -a -n standby, fans every 30 s, one file /run/mesh-sensors/readings.json), health tool = sensors_health every 60 s, 2 looks, 60 s grace. The tools need no root and no sudo.
Health (unhealthy): a temperature at or above its own critical value; a drive whose SMART verdict failed, an attribute failing now, or an NVMe critical warning bit; a fan that ran since boot reading 0 while a temperature is at or above its own maximum; an uncorrectable memory error. why is one plain sentence per finding. Raised as module.sensors.<machine>.unhealthy (the cost is recorded in the ADR).
Checked locally: merge-check.sh with MESH_GATE set to a controller built from main: words clean, module check ok (ready: smartd by unit every 30s; watch by its tool sensors_health every 1m0s), long-running resources without health 70 as kept, go vet, gofmt, go test -race pass. The tools were run on the laptop against the real /sys (read-only).
Not assigned anywhere. Suggested first machine: the laptop.
A new module, `sensors` (novox/hq ADR 0256, hq PR #206). Read-only, in Go, assignable to every machine; a sensor class the machine lacks is said as not present.
**Tools** (all `(r)`): `sensors_summary`, `sensors_temperatures`, `sensors_fans`, `sensors_drives`, `sensors_faults`, `sensors_health`. Flags are measured against the hardware's own thresholds only (hwmon max/crit/emergency, a zone's hot/passive/critical trips); a threshold of 65261.85 °C or 0 is no threshold.
**Resources**: `smartmontools` (declared, not installed by hand); `/etc/smartd.conf` (every drive, never woken from standby, no mail); a smartd drop-in (runs on a VM too, stays up with no drive: `-q never`); `smartd` running, health `unit`; `watch` (`sensors watch`, a root process of the bundle: SMART every 10 min with `smartctl --json -a -n standby`, fans every 30 s, one file `/run/mesh-sensors/readings.json`), health `tool` = `sensors_health` every 60 s, 2 looks, 60 s grace. The tools need no root and no sudo.
**Health** (unhealthy): a temperature at or above its own critical value; a drive whose SMART verdict failed, an attribute failing now, or an NVMe critical warning bit; a fan that ran since boot reading 0 while a temperature is at or above its own maximum; an uncorrectable memory error. `why` is one plain sentence per finding. Raised as `module.sensors.<machine>.unhealthy` (the cost is recorded in the ADR).
**Checked locally**: `merge-check.sh` with MESH_GATE set to a controller built from main: words clean, `module check` ok (`ready: smartd by unit every 30s; watch by its tool sensors_health every 1m0s`), long-running resources without health 70 as kept, `go vet`, gofmt, `go test -race` pass. The tools were run on the laptop against the real /sys (read-only).
Not assigned anywhere. Suggested first machine: the laptop.
mesh/merge-gate pass: builds new: modules/sensors, sent nowhere; no bus step; every machine composes with the change as it did without (4 of 4 compose)
Temperatures against the hardware's own thresholds, fans, each drive's health and the kernel's error
counts, read-only. A root watch reads SMART so the tools need no root and never wake a sleeping drive;
smartd and the watch carry the health that raises a condition when the hardware says it is failing.
Deliverynovox/mesh-catalog@7aba612c6c89 — delivered since 2026-10-09T07:31:48Z
Delivery plan — builds new: modules/sensors, sent nowhere; no bus step
Machines
build-agent on ace: passed — carried by plan-1791465671440352223
route-proxy on ace: passed — carried by plan-1791467181641924612
route-proxy on novox: passed — carried by plan-1791466341237426521
Transitions
2026-10-08 13:04 (new) → proposed (announced): novox/mesh-catalog#129's head announced
2026-10-08 13:06 proposed → checked (checked): the verdict names this commit
2026-10-08 13:06 checked → ready (accepted): the gate passed or warned, and the repository's own check did not fail
2026-10-08 13:31 ready → held (hold): something holds it for a person: its group's composed check did not pass for the heads that merged, or it merged and no walk was opened for it
2026-10-09 07:31 held → delivered (done): merged, and nothing for a walk to move: builds new: modules/sensors, sent nowhere; no bus step
The commit's note under refs/notes/mesh-plan keeps every transition: git log --notes=mesh-plan.
<!-- mesh-delivery:view -->
**Delivery** `novox/mesh-catalog@7aba612c6c89` — **delivered** since 2026-10-09T07:31:48Z
**Delivery plan** — builds new: modules/sensors, sent nowhere; no bus step
**Machines**
- build-agent on ace: passed — carried by plan-1791465671440352223
- route-proxy on ace: passed — carried by plan-1791467181641924612
- route-proxy on novox: passed — carried by plan-1791466341237426521
**Transitions**
- 2026-10-08 13:04 (new) → proposed (announced): novox/mesh-catalog#129's head announced
- 2026-10-08 13:06 proposed → checked (checked): the verdict names this commit
- 2026-10-08 13:06 checked → ready (accepted): the gate passed or warned, and the repository's own check did not fail
- 2026-10-08 13:31 ready → held (hold): something holds it for a person: its group's composed check did not pass for the heads that merged, or it merged and no walk was opened for it
- 2026-10-09 07:31 held → delivered (done): merged, and nothing for a walk to move: builds new: modules/sensors, sent nowhere; no bus step
The commit's note under `refs/notes/mesh-plan` keeps every transition: `git log --notes=mesh-plan`.
mesh/merge-gate: PASS — every machine composes with the change as it did without (4 of 4 compose) (modules: new:modules/sensors)
mesh/repo-check: PASS — its merge-check.sh passed
Delivery plan — builds new: modules/sensors, sent nowhere; no bus step
Run by the build seat on g14 as build-1791460167701449597 (builds --log build-1791460167701449597).
--- the gate: new:modules/sensors
sensors: ok, 6 tool(s), ready: smartd by unit every 30s; watch by its tool sensors_health every 1m0s
long-running resources without health: 0
1 manifest(s) checked. Judged against the seats this binary carries; a claim on one of the mesh's own seats is judged fully at registration, and a seat declared by a module not given here reads as unknown. Identities judged on a 6-character machine name, against the bounds of the providers given here
judging 1 module(s) changed against 4 machine(s), as the snapshot of 2026-10-08T11:31:31Z says they run
composing every machine as the mesh is
the bus's user list leaves out 5 user(s) the mesh has minted no credential for: controller, node.f35, node.idt, node.ygcyr, node.yvbpsm. Each is a user that cannot connect until one is issued
the bus's user list leaves out 5 user(s) the mesh has minted no credential for: controller, node.f35, node.idt, node.ygcyr, node.yvbpsm. Each is a user that cannot connect until one is issued
composing every machine with the change
the bus's user list leaves out 5 user(s) the mesh has minted no credential for: controller, node.f35, node.idt, node.ygcyr, node.yvbpsm. Each is a user that cannot connect until one is issued
the bus's user list leaves out 5 user(s) the mesh has minted no credential for: controller, node.f35, node.idt, node.ygcyr, node.yvbpsm. Each is a user that cannot connect until one is issued
merge gate: PASS — every machine composes with the change as it did without (4 of 4 compose)
judged by controller development build against the facts of 2026-10-08T11:31:31Z
modules the change moves:
- sensors (added)
machines:
- a machine (f35): composes
- holds mesh-dns-resolver (idt): composes
- holds git, holds mesh-artifact-store, holds mesh-broker, holds mesh-catalog, holds mesh-delivery, holds mesh-dns-resolver, holds mesh-store, holds mesh-vault, holds npm-package-registry, the control node, the hub (ygcyr): composes
- a machine (yvbpsm): composes
a merge would rebuild 0 module(s) in 0 tier(s)
--- its merge-check.sh (go toolchain)
ok git.novox.be/novox/mesh-catalog/checks/words 0.002s
words: 12 retired words, none in the 30173 strings of 555 files
long-running resources without health: 70, as kept
testing modules/sensors
ok sensors/cmd/sensors 1.106s
**Merge check** at `73610f8e`
- `mesh/merge-gate`: **PASS** — every machine composes with the change as it did without (4 of 4 compose) (modules: new:modules/sensors)
- `mesh/repo-check`: **PASS** — its merge-check.sh passed
**Delivery plan** — builds new: modules/sensors, sent nowhere; no bus step
Run by the build seat on g14 as `build-1791460167701449597` (`builds --log build-1791460167701449597`).
```
--- the gate: new:modules/sensors
sensors: ok, 6 tool(s), ready: smartd by unit every 30s; watch by its tool sensors_health every 1m0s
long-running resources without health: 0
1 manifest(s) checked. Judged against the seats this binary carries; a claim on one of the mesh's own seats is judged fully at registration, and a seat declared by a module not given here reads as unknown. Identities judged on a 6-character machine name, against the bounds of the providers given here
judging 1 module(s) changed against 4 machine(s), as the snapshot of 2026-10-08T11:31:31Z says they run
composing every machine as the mesh is
the bus's user list leaves out 5 user(s) the mesh has minted no credential for: controller, node.f35, node.idt, node.ygcyr, node.yvbpsm. Each is a user that cannot connect until one is issued
the bus's user list leaves out 5 user(s) the mesh has minted no credential for: controller, node.f35, node.idt, node.ygcyr, node.yvbpsm. Each is a user that cannot connect until one is issued
composing every machine with the change
the bus's user list leaves out 5 user(s) the mesh has minted no credential for: controller, node.f35, node.idt, node.ygcyr, node.yvbpsm. Each is a user that cannot connect until one is issued
the bus's user list leaves out 5 user(s) the mesh has minted no credential for: controller, node.f35, node.idt, node.ygcyr, node.yvbpsm. Each is a user that cannot connect until one is issued
merge gate: PASS — every machine composes with the change as it did without (4 of 4 compose)
judged by controller development build against the facts of 2026-10-08T11:31:31Z
modules the change moves:
- sensors (added)
machines:
- a machine (f35): composes
- holds mesh-dns-resolver (idt): composes
- holds git, holds mesh-artifact-store, holds mesh-broker, holds mesh-catalog, holds mesh-delivery, holds mesh-dns-resolver, holds mesh-store, holds mesh-vault, holds npm-package-registry, the control node, the hub (ygcyr): composes
- a machine (yvbpsm): composes
a merge would rebuild 0 module(s) in 0 tier(s)
--- its merge-check.sh (go toolchain)
ok git.novox.be/novox/mesh-catalog/checks/words 0.002s
words: 12 retired words, none in the 30173 strings of 555 files
long-running resources without health: 70, as kept
testing modules/sensors
ok sensors/cmd/sensors 1.106s
```
mesh/merge-gate pass: builds new: modules/sensors, sent nowhere; no bus step; every machine composes with the change as it did without (4 of 4 compose)
The review of #129 found false alarms and a silent failure: the NVMe temperature bit, old-age
attributes, a fan's minimum or latched alarm, an unrelated hot sensor and a board chip's limits could
raise a condition, while a hung smartctl stopped the fans' looks and an old readings file passed as
healthy. Read spinning drives hourly (smartd too) so a read never keeps one from spinning down, and skip
a drive that cannot say whether it sleeps.
mesh/merge-gate: PASS — every machine composes with the change as it did without (4 of 4 compose) (modules: new:modules/sensors)
mesh/repo-check: PASS — its merge-check.sh passed
Delivery plan — builds new: modules/sensors, sent nowhere; no bus step
Run by the build seat on ace as build-1791462947066614400 (builds --log build-1791462947066614400).
--- the gate: new:modules/sensors
sensors: ok, 6 tool(s), ready: smartd by unit every 30s; watch by its tool sensors_health every 1m0s
long-running resources without health: 0
1 manifest(s) checked. Judged against the seats this binary carries; a claim on one of the mesh's own seats is judged fully at registration, and a seat declared by a module not given here reads as unknown. Identities judged on a 6-character machine name, against the bounds of the providers given here
judging 1 module(s) changed against 4 machine(s), as the snapshot of 2026-10-08T12:31:31Z says they run
composing every machine as the mesh is
the bus's user list leaves out 5 user(s) the mesh has minted no credential for: controller, node.f35, node.idt, node.ygcyr, node.yvbpsm. Each is a user that cannot connect until one is issued
the bus's user list leaves out 5 user(s) the mesh has minted no credential for: controller, node.f35, node.idt, node.ygcyr, node.yvbpsm. Each is a user that cannot connect until one is issued
composing every machine with the change
the bus's user list leaves out 5 user(s) the mesh has minted no credential for: controller, node.f35, node.idt, node.ygcyr, node.yvbpsm. Each is a user that cannot connect until one is issued
the bus's user list leaves out 5 user(s) the mesh has minted no credential for: controller, node.f35, node.idt, node.ygcyr, node.yvbpsm. Each is a user that cannot connect until one is issued
merge gate: PASS — every machine composes with the change as it did without (4 of 4 compose)
judged by controller development build against the facts of 2026-10-08T12:31:31Z
modules the change moves:
- sensors (added)
machines:
- a machine (f35): composes
- holds mesh-dns-resolver (idt): composes
- holds git, holds mesh-artifact-store, holds mesh-broker, holds mesh-catalog, holds mesh-delivery, holds mesh-dns-resolver, holds mesh-store, holds mesh-vault, holds npm-package-registry, the control node, the hub (ygcyr): composes
- a machine (yvbpsm): composes
a merge would rebuild 0 module(s) in 0 tier(s)
--- its merge-check.sh (go toolchain)
ok git.novox.be/novox/mesh-catalog/checks/words 0.002s
words: 12 retired words, none in the 30195 strings of 555 files
long-running resources without health: 70, as kept
testing modules/sensors
ok sensors/cmd/sensors 3.617s
**Merge check** at `66a32b19`
- `mesh/merge-gate`: **PASS** — every machine composes with the change as it did without (4 of 4 compose) (modules: new:modules/sensors)
- `mesh/repo-check`: **PASS** — its merge-check.sh passed
**Delivery plan** — builds new: modules/sensors, sent nowhere; no bus step
Run by the build seat on ace as `build-1791462947066614400` (`builds --log build-1791462947066614400`).
```
--- the gate: new:modules/sensors
sensors: ok, 6 tool(s), ready: smartd by unit every 30s; watch by its tool sensors_health every 1m0s
long-running resources without health: 0
1 manifest(s) checked. Judged against the seats this binary carries; a claim on one of the mesh's own seats is judged fully at registration, and a seat declared by a module not given here reads as unknown. Identities judged on a 6-character machine name, against the bounds of the providers given here
judging 1 module(s) changed against 4 machine(s), as the snapshot of 2026-10-08T12:31:31Z says they run
composing every machine as the mesh is
the bus's user list leaves out 5 user(s) the mesh has minted no credential for: controller, node.f35, node.idt, node.ygcyr, node.yvbpsm. Each is a user that cannot connect until one is issued
the bus's user list leaves out 5 user(s) the mesh has minted no credential for: controller, node.f35, node.idt, node.ygcyr, node.yvbpsm. Each is a user that cannot connect until one is issued
composing every machine with the change
the bus's user list leaves out 5 user(s) the mesh has minted no credential for: controller, node.f35, node.idt, node.ygcyr, node.yvbpsm. Each is a user that cannot connect until one is issued
the bus's user list leaves out 5 user(s) the mesh has minted no credential for: controller, node.f35, node.idt, node.ygcyr, node.yvbpsm. Each is a user that cannot connect until one is issued
merge gate: PASS — every machine composes with the change as it did without (4 of 4 compose)
judged by controller development build against the facts of 2026-10-08T12:31:31Z
modules the change moves:
- sensors (added)
machines:
- a machine (f35): composes
- holds mesh-dns-resolver (idt): composes
- holds git, holds mesh-artifact-store, holds mesh-broker, holds mesh-catalog, holds mesh-delivery, holds mesh-dns-resolver, holds mesh-store, holds mesh-vault, holds npm-package-registry, the control node, the hub (ygcyr): composes
- a machine (yvbpsm): composes
a merge would rebuild 0 module(s) in 0 tier(s)
--- its merge-check.sh (go toolchain)
ok git.novox.be/novox/mesh-catalog/checks/words 0.002s
words: 12 retired words, none in the 30195 strings of 555 files
long-running resources without health: 70, as kept
testing modules/sensors
ok sensors/cmd/sensors 3.617s
```
mesh/merge-gate pass: builds new: modules/sensors, sent nowhere; no bus step; every machine composes with the change as it did without (4 of 4 compose)
The second review of #129 found a read stuck in the kernel kept the file fresh and the module healthy,
smartd as a second reader could wake or keep awake the drives the watch spares, and a board chip's
maximum could stop a fan. Read each drive in its own goroutine from a root reader of the module's own,
mark each read in flight, and say a read past its bound or a drive not looked at for twice its cadence;
drop smartd; tell smartctl each drive's kind; take a SAS drive's standby; say a drive asleep since when.
mesh/merge-gate: PASS — every machine composes with the change as it did without (4 of 4 compose) (modules: new:modules/sensors)
mesh/repo-check: PASS — its merge-check.sh passed
Delivery plan — builds new: modules/sensors, sent nowhere; no bus step
Run by the build seat on ace as build-1791464361480265304 (builds --log build-1791464361480265304).
--- the gate: new:modules/sensors
sensors: ok, 6 tool(s), ready: drives by unit every 30s; watch by its tool sensors_health every 1m0s
long-running resources without health: 0
1 manifest(s) checked. Judged against the seats this binary carries; a claim on one of the mesh's own seats is judged fully at registration, and a seat declared by a module not given here reads as unknown. Identities judged on a 6-character machine name, against the bounds of the providers given here
judging 1 module(s) changed against 4 machine(s), as the snapshot of 2026-10-08T12:55:24Z says they run
composing every machine as the mesh is
the bus's user list leaves out 5 user(s) the mesh has minted no credential for: controller, node.f35, node.idt, node.ygcyr, node.yvbpsm. Each is a user that cannot connect until one is issued
the bus's user list leaves out 5 user(s) the mesh has minted no credential for: controller, node.f35, node.idt, node.ygcyr, node.yvbpsm. Each is a user that cannot connect until one is issued
composing every machine with the change
the bus's user list leaves out 5 user(s) the mesh has minted no credential for: controller, node.f35, node.idt, node.ygcyr, node.yvbpsm. Each is a user that cannot connect until one is issued
the bus's user list leaves out 5 user(s) the mesh has minted no credential for: controller, node.f35, node.idt, node.ygcyr, node.yvbpsm. Each is a user that cannot connect until one is issued
merge gate: PASS — every machine composes with the change as it did without (4 of 4 compose)
judged by controller development build against the facts of 2026-10-08T12:55:24Z
modules the change moves:
- sensors (added)
machines:
- a machine (f35): composes
- holds mesh-dns-resolver (idt): composes
- holds git, holds mesh-artifact-store, holds mesh-broker, holds mesh-catalog, holds mesh-delivery, holds mesh-dns-resolver, holds mesh-store, holds mesh-vault, holds npm-package-registry, the control node, the hub (ygcyr): composes
- a machine (yvbpsm): composes
a merge would rebuild 0 module(s) in 0 tier(s)
--- its merge-check.sh (go toolchain)
ok git.novox.be/novox/mesh-catalog/checks/words 0.002s
words: 12 retired words, none in the 30223 strings of 555 files
long-running resources without health: 70, as kept
testing modules/sensors
ok sensors/cmd/sensors 3.607s
**Merge check** at `66a816c3`
- `mesh/merge-gate`: **PASS** — every machine composes with the change as it did without (4 of 4 compose) (modules: new:modules/sensors)
- `mesh/repo-check`: **PASS** — its merge-check.sh passed
**Delivery plan** — builds new: modules/sensors, sent nowhere; no bus step
Run by the build seat on ace as `build-1791464361480265304` (`builds --log build-1791464361480265304`).
```
--- the gate: new:modules/sensors
sensors: ok, 6 tool(s), ready: drives by unit every 30s; watch by its tool sensors_health every 1m0s
long-running resources without health: 0
1 manifest(s) checked. Judged against the seats this binary carries; a claim on one of the mesh's own seats is judged fully at registration, and a seat declared by a module not given here reads as unknown. Identities judged on a 6-character machine name, against the bounds of the providers given here
judging 1 module(s) changed against 4 machine(s), as the snapshot of 2026-10-08T12:55:24Z says they run
composing every machine as the mesh is
the bus's user list leaves out 5 user(s) the mesh has minted no credential for: controller, node.f35, node.idt, node.ygcyr, node.yvbpsm. Each is a user that cannot connect until one is issued
the bus's user list leaves out 5 user(s) the mesh has minted no credential for: controller, node.f35, node.idt, node.ygcyr, node.yvbpsm. Each is a user that cannot connect until one is issued
composing every machine with the change
the bus's user list leaves out 5 user(s) the mesh has minted no credential for: controller, node.f35, node.idt, node.ygcyr, node.yvbpsm. Each is a user that cannot connect until one is issued
the bus's user list leaves out 5 user(s) the mesh has minted no credential for: controller, node.f35, node.idt, node.ygcyr, node.yvbpsm. Each is a user that cannot connect until one is issued
merge gate: PASS — every machine composes with the change as it did without (4 of 4 compose)
judged by controller development build against the facts of 2026-10-08T12:55:24Z
modules the change moves:
- sensors (added)
machines:
- a machine (f35): composes
- holds mesh-dns-resolver (idt): composes
- holds git, holds mesh-artifact-store, holds mesh-broker, holds mesh-catalog, holds mesh-delivery, holds mesh-dns-resolver, holds mesh-store, holds mesh-vault, holds npm-package-registry, the control node, the hub (ygcyr): composes
- a machine (yvbpsm): composes
a merge would rebuild 0 module(s) in 0 tier(s)
--- its merge-check.sh (go toolchain)
ok git.novox.be/novox/mesh-catalog/checks/words 0.002s
words: 12 retired words, none in the 30223 strings of 555 files
long-running resources without health: 70, as kept
testing modules/sensors
ok sensors/cmd/sensors 3.607s
```
mesh/merge-gate pass: builds new: modules/sensors, sent nowhere; no bus step; every machine composes with the change as it did without (4 of 4 compose)
The third review found the asleep match took only one-word modes, so a SAS drive in STANDBY BY TIMER or
LOW POWER was read as a failed answer and lost its reading.
mesh/merge-gate: PASS — every machine composes with the change as it did without (4 of 4 compose) (modules: new:modules/sensors)
mesh/repo-check: PASS — its merge-check.sh passed
Delivery plan — builds new: modules/sensors, sent nowhere; no bus step
Run by the build seat on novox as build-1791464667889242743 (builds --log build-1791464667889242743).
--- the gate: new:modules/sensors
sensors: ok, 6 tool(s), ready: drives by unit every 30s; watch by its tool sensors_health every 1m0s
long-running resources without health: 0
1 manifest(s) checked. Judged against the seats this binary carries; a claim on one of the mesh's own seats is judged fully at registration, and a seat declared by a module not given here reads as unknown. Identities judged on a 6-character machine name, against the bounds of the providers given here
judging 1 module(s) changed against 4 machine(s), as the snapshot of 2026-10-08T12:55:24Z says they run
composing every machine as the mesh is
the bus's user list leaves out 5 user(s) the mesh has minted no credential for: controller, node.f35, node.idt, node.ygcyr, node.yvbpsm. Each is a user that cannot connect until one is issued
the bus's user list leaves out 5 user(s) the mesh has minted no credential for: controller, node.f35, node.idt, node.ygcyr, node.yvbpsm. Each is a user that cannot connect until one is issued
composing every machine with the change
the bus's user list leaves out 5 user(s) the mesh has minted no credential for: controller, node.f35, node.idt, node.ygcyr, node.yvbpsm. Each is a user that cannot connect until one is issued
the bus's user list leaves out 5 user(s) the mesh has minted no credential for: controller, node.f35, node.idt, node.ygcyr, node.yvbpsm. Each is a user that cannot connect until one is issued
merge gate: PASS — every machine composes with the change as it did without (4 of 4 compose)
judged by controller development build against the facts of 2026-10-08T12:55:24Z
modules the change moves:
- sensors (added)
machines:
- a machine (f35): composes
- holds mesh-dns-resolver (idt): composes
- holds git, holds mesh-artifact-store, holds mesh-broker, holds mesh-catalog, holds mesh-delivery, holds mesh-dns-resolver, holds mesh-store, holds mesh-vault, holds npm-package-registry, the control node, the hub (ygcyr): composes
- a machine (yvbpsm): composes
a merge would rebuild 0 module(s) in 0 tier(s)
--- its merge-check.sh (go toolchain)
ok git.novox.be/novox/mesh-catalog/checks/words 0.002s
words: 12 retired words, none in the 30223 strings of 555 files
long-running resources without health: 70, as kept
testing modules/sensors
ok sensors/cmd/sensors 3.896s
**Merge check** at `7aba612c`
- `mesh/merge-gate`: **PASS** — every machine composes with the change as it did without (4 of 4 compose) (modules: new:modules/sensors)
- `mesh/repo-check`: **PASS** — its merge-check.sh passed
**Delivery plan** — builds new: modules/sensors, sent nowhere; no bus step
Run by the build seat on novox as `build-1791464667889242743` (`builds --log build-1791464667889242743`).
```
--- the gate: new:modules/sensors
sensors: ok, 6 tool(s), ready: drives by unit every 30s; watch by its tool sensors_health every 1m0s
long-running resources without health: 0
1 manifest(s) checked. Judged against the seats this binary carries; a claim on one of the mesh's own seats is judged fully at registration, and a seat declared by a module not given here reads as unknown. Identities judged on a 6-character machine name, against the bounds of the providers given here
judging 1 module(s) changed against 4 machine(s), as the snapshot of 2026-10-08T12:55:24Z says they run
composing every machine as the mesh is
the bus's user list leaves out 5 user(s) the mesh has minted no credential for: controller, node.f35, node.idt, node.ygcyr, node.yvbpsm. Each is a user that cannot connect until one is issued
the bus's user list leaves out 5 user(s) the mesh has minted no credential for: controller, node.f35, node.idt, node.ygcyr, node.yvbpsm. Each is a user that cannot connect until one is issued
composing every machine with the change
the bus's user list leaves out 5 user(s) the mesh has minted no credential for: controller, node.f35, node.idt, node.ygcyr, node.yvbpsm. Each is a user that cannot connect until one is issued
the bus's user list leaves out 5 user(s) the mesh has minted no credential for: controller, node.f35, node.idt, node.ygcyr, node.yvbpsm. Each is a user that cannot connect until one is issued
merge gate: PASS — every machine composes with the change as it did without (4 of 4 compose)
judged by controller development build against the facts of 2026-10-08T12:55:24Z
modules the change moves:
- sensors (added)
machines:
- a machine (f35): composes
- holds mesh-dns-resolver (idt): composes
- holds git, holds mesh-artifact-store, holds mesh-broker, holds mesh-catalog, holds mesh-delivery, holds mesh-dns-resolver, holds mesh-store, holds mesh-vault, holds npm-package-registry, the control node, the hub (ygcyr): composes
- a machine (yvbpsm): composes
a merge would rebuild 0 module(s) in 0 tier(s)
--- its merge-check.sh (go toolchain)
ok git.novox.be/novox/mesh-catalog/checks/words 0.002s
words: 12 retired words, none in the 30223 strings of 555 files
long-running resources without health: 70, as kept
testing modules/sensors
ok sensors/cmd/sensors 3.896s
```
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
A new module,
sensors(novox/hq ADR 0256, hq PR #206). Read-only, in Go, assignable to every machine; a sensor class the machine lacks is said as not present.Tools (all
(r)):sensors_summary,sensors_temperatures,sensors_fans,sensors_drives,sensors_faults,sensors_health. Flags are measured against the hardware's own thresholds only (hwmon max/crit/emergency, a zone's hot/passive/critical trips); a threshold of 65261.85 °C or 0 is no threshold.Resources:
smartmontools(declared, not installed by hand);/etc/smartd.conf(every drive, never woken from standby, no mail); a smartd drop-in (runs on a VM too, stays up with no drive:-q never);smartdrunning, healthunit;watch(sensors watch, a root process of the bundle: SMART every 10 min withsmartctl --json -a -n standby, fans every 30 s, one file/run/mesh-sensors/readings.json), healthtool=sensors_healthevery 60 s, 2 looks, 60 s grace. The tools need no root and no sudo.Health (unhealthy): a temperature at or above its own critical value; a drive whose SMART verdict failed, an attribute failing now, or an NVMe critical warning bit; a fan that ran since boot reading 0 while a temperature is at or above its own maximum; an uncorrectable memory error.
whyis one plain sentence per finding. Raised asmodule.sensors.<machine>.unhealthy(the cost is recorded in the ADR).Checked locally:
merge-check.shwith MESH_GATE set to a controller built from main: words clean,module checkok (ready: smartd by unit every 30s; watch by its tool sensors_health every 1m0s), long-running resources without health 70 as kept,go vet, gofmt,go test -racepass. The tools were run on the laptop against the real /sys (read-only).Not assigned anywhere. Suggested first machine: the laptop.
Delivery
novox/mesh-catalog@7aba612c6c89— delivered since 2026-10-09T07:31:48ZDelivery plan — builds new: modules/sensors, sent nowhere; no bus step
Machines
Transitions
The commit's note under
refs/notes/mesh-plankeeps every transition:git log --notes=mesh-plan.Merge check at
73610f8emesh/merge-gate: PASS — every machine composes with the change as it did without (4 of 4 compose) (modules: new:modules/sensors)mesh/repo-check: PASS — its merge-check.sh passedDelivery plan — builds new: modules/sensors, sent nowhere; no bus step
Run by the build seat on g14 as
build-1791460167701449597(builds --log build-1791460167701449597).Merge check at
66a32b19mesh/merge-gate: PASS — every machine composes with the change as it did without (4 of 4 compose) (modules: new:modules/sensors)mesh/repo-check: PASS — its merge-check.sh passedDelivery plan — builds new: modules/sensors, sent nowhere; no bus step
Run by the build seat on ace as
build-1791462947066614400(builds --log build-1791462947066614400).Merge check at
66a816c3mesh/merge-gate: PASS — every machine composes with the change as it did without (4 of 4 compose) (modules: new:modules/sensors)mesh/repo-check: PASS — its merge-check.sh passedDelivery plan — builds new: modules/sensors, sent nowhere; no bus step
Run by the build seat on ace as
build-1791464361480265304(builds --log build-1791464361480265304).Merge check at
7aba612cmesh/merge-gate: PASS — every machine composes with the change as it did without (4 of 4 compose) (modules: new:modules/sensors)mesh/repo-check: PASS — its merge-check.sh passedDelivery plan — builds new: modules/sensors, sent nowhere; no bus step
Run by the build seat on novox as
build-1791464667889242743(builds --log build-1791464667889242743).