health on a container, service and process (declaration): kind runtime | http | tcp | exec | unit | tool, port (the controller composes the endpoint into it), path/status/body/scheme, command, tool, interval/timeout/looks/grace, needs. Strictly decoded and held to the record's bounds (interval ≥ 10 s, timeout < interval, looks ≥ 2, grace + looks×interval ≤ 5 min).
exec / runtime become the container's own check (--health-cmd for exec; the image's own command for runtime) with the declared timing — retries = looks, start period = grace. Part of the container spec only for these two kinds; an http/tcp/unit/tool check recreates nothing.
http / tcp made by the engine from the machine to the published port; unit read from the show liveness already makes; runtime/exec state read from the inspect liveness already makes ({{json .State}} — naming .State.Health makes the runtime refuse the whole read for a container with no check; caught by the replay); tool asked on mesh.mod.<m>.tool.<t>.<node> (granted by mesh-controller's PR).
Readiness folded into the state: starting until the check passed, healthy once it has, unhealthy once its looks after the grace fail the declared number of times, with the check's words as the reason. Every start judged afresh; a changed check (e.g. a port moved) looks again at once.
Budget: never more than 90 looks a minute together (research 032 §7); over it, the engine's own looks are spaced out and that is said.
Statement contract 2 (ReadinessContract), with check and needs per resource: this is what tells the controller the engine may be sent health.
Nothing restarted on health (rule 6 unchanged).
Tests: rule 3 (a declared command becomes the container's check and nothing else sets one; an http check dials the endpoint's current port after a port change), readiness over a fake runtime, the runtime's check read, a unit, the budget, the tool answer, the probe loop under -race. Replay TestReplaySilentWebAppIsSaidUnhealthy (issue 145): a busybox httpd whose CGI never answers is said unhealthy by its http check in 2 looks (~13 s at a 10 s interval) while a tcp check connects.
Pairs with mesh-controller and mesh-lab feat/health-the-field. Roll out the engine before the controller: the controller sends health only to engines stating contract 2.
check-here: merge-gate PASS (4 of 4 compose), repo-check PASS.
Phase B of to-be 48, the node-engine's half.
- `health` on a container, service and process (declaration): kind runtime | http | tcp | exec | unit | tool, port (the controller composes the endpoint into it), path/status/body/scheme, command, tool, interval/timeout/looks/grace, needs. Strictly decoded and held to the record's bounds (interval ≥ 10 s, timeout < interval, looks ≥ 2, grace + looks×interval ≤ 5 min).
- **exec / runtime** become the container's own check (`--health-cmd` for exec; the image's own command for runtime) with the declared timing — retries = looks, start period = grace. Part of the container spec only for these two kinds; an http/tcp/unit/tool check recreates nothing.
- **http / tcp** made by the engine from the machine to the published port; **unit** read from the show liveness already makes; **runtime/exec** state read from the inspect liveness already makes (`{{json .State}}` — naming `.State.Health` makes the runtime refuse the whole read for a container with no check; caught by the replay); **tool** asked on `mesh.mod.<m>.tool.<t>.<node>` (granted by mesh-controller's PR).
- Readiness folded into the state: starting until the check passed, healthy once it has, unhealthy once its looks after the grace fail the declared number of times, with the check's words as the reason. Every start judged afresh; a changed check (e.g. a port moved) looks again at once.
- Budget: never more than 90 looks a minute together (research 032 §7); over it, the engine's own looks are spaced out and that is said.
- Statement contract 2 (`ReadinessContract`), with `check` and `needs` per resource: this is what tells the controller the engine may be sent `health`.
- Nothing restarted on health (rule 6 unchanged).
Tests: rule 3 (a declared command becomes the container's check and nothing else sets one; an http check dials the endpoint's current port after a port change), readiness over a fake runtime, the runtime's check read, a unit, the budget, the tool answer, the probe loop under -race. Replay `TestReplaySilentWebAppIsSaidUnhealthy` (issue 145): a busybox httpd whose CGI never answers is said unhealthy by its http check in 2 looks (~13 s at a 10 s interval) while a tcp check connects.
Pairs with mesh-controller and mesh-lab `feat/health-the-field`. Roll out the engine **before** the controller: the controller sends `health` only to engines stating contract 2.
check-here: merge-gate PASS (4 of 4 compose), repo-check PASS.
Liveness alone could not see a web application whose port was open and whose
program ran while every request hung for eleven hours (issue 145). A resource
now carries the `health` its module declared: the engine makes http and tcp
looks itself from the machine to the endpoint's published port, reads a unit's
readiness from the show it already makes, hands an exec command or the image's
own check to the runtime as the container's check with the declared timing and
reads its state from the inspect it already makes, and asks a module's tool on
its own node tools. Starting until the check passed, unhealthy once its looks
after the grace fail the declared number of times; never more looks than the
measured budget; nothing restarted. The statement says contract 2, which tells
the controller this engine may be sent the field.
mesh/merge-gate pass: builds mesh-host → ace, g14, novox, shanks; no bus step; every machine composes with the change as it did without (4 of 4 compose)
mesh-host on ace: passed — healthy 3 times over 2m31s
mesh-host on the rest running it: sent
Transitions
2026-10-07 14:17 (new) → proposed (announced): novox/mesh-host#50's head announced
2026-10-07 14:19 proposed → checked (checked): the verdict names this commit
2026-10-07 14:19 checked → ready (accepted): the gate passed or warned, and the repository's own check did not fail
2026-10-07 16:28 ready → published (merged): on the trunk its modules follow: merged there, and its walk opened — or nothing for a walk to move
2026-10-07 16:28 published → delivering (go): its walk started: let go by this owner in its group's order, by a person, or on the controller's own path
2026-10-07 16:32 delivering → delivered (done): its walk is done: every machine of its deploy plan passed, or was left as its policy says
The commit's note under refs/notes/mesh-plan keeps every transition: git log --notes=mesh-plan.
<!-- mesh-delivery:view -->
**Delivery** `novox/mesh-host@96bf9415aae4` — **delivered** since 2026-10-07T16:32:09Z
**Delivery plan** — builds mesh-host → ace, g14, novox, shanks; no bus step
- tier 0: mesh-host
- ace: receives mesh-host
- g14: receives mesh-host
- novox: receives mesh-host
- shanks: receives mesh-host
**Group** `feat/health-the-field`, in order: novox/mesh-lab@d93f1e4eab73
- novox/mesh-controller@b98fd0f396c8 before novox/mesh-host@96bf9415aae4: built by
- novox/mesh-host@96bf9415aae4 before novox/mesh-controller@b98fd0f396c8: engine before controller
**Machines**
- mesh-host on ace: passed — healthy 3 times over 2m31s
- mesh-host on the rest running it: sent
**Transitions**
- 2026-10-07 14:17 (new) → proposed (announced): novox/mesh-host#50's head announced
- 2026-10-07 14:19 proposed → checked (checked): the verdict names this commit
- 2026-10-07 14:19 checked → ready (accepted): the gate passed or warned, and the repository's own check did not fail
- 2026-10-07 16:28 ready → published (merged): on the trunk its modules follow: merged there, and its walk opened — or nothing for a walk to move
- 2026-10-07 16:28 published → delivering (go): its walk started: let go by this owner in its group's order, by a person, or on the controller's own path
- 2026-10-07 16:32 delivering → delivered (done): its walk is done: every machine of its deploy plan passed, or was left as its policy says
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: mesh-host)
mesh/repo-check: PASS — its merge-check.sh passed
Change plan — builds mesh-host → ace, g14, novox, shanks; no bus step
tier 0: mesh-host
ace: receives mesh-host
g14: receives mesh-host
novox: receives mesh-host
shanks: receives mesh-host
Run by the build seat on ace as build-1791382664028203253 (builds --log build-1791382664028203253).
--- the gate: mesh-host
mesh-host: ok
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 0 module(s) changed against 4 machine(s), as the snapshot of 2026-10-07T13:56:37Z 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-07T13:56:37Z
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-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 1 module(s) in 1 tier(s): mesh-host
--- its merge-check.sh (go toolchain)
ok github.com/novox/mesh-host/cmd/mesh-bootstrap 1.013s
ok github.com/novox/mesh-host/cmd/mesh-host 1.314s
ok github.com/novox/mesh-host/examples 1.017s
ok github.com/novox/mesh-host/internal/apply 4.360s
ok github.com/novox/mesh-host/internal/bootstrap 1.510s
ok github.com/novox/mesh-host/internal/bundle 1.013s
ok github.com/novox/mesh-host/internal/declaration 1.040s
ok github.com/novox/mesh-host/internal/firewall 1.654s
ok github.com/novox/mesh-host/internal/identity 1.083s
ok github.com/novox/mesh-host/internal/image 1.013s
ok github.com/novox/mesh-host/internal/inventory 1.066s
ok github.com/novox/mesh-host/internal/link 10.414s
ok github.com/novox/mesh-host/internal/liveness 2.098s
ok github.com/novox/mesh-host/internal/outward 1.067s
ok github.com/novox/mesh-host/internal/profile 1.519s
ok github.com/novox/mesh-host/internal/reachable 1.062s
ok github.com/novox/mesh-host/internal/store 1.251s
ok github.com/novox/mesh-host/internal/system 1.065s
ok github.com/novox/mesh-host/internal/tunnel 1.028s
ok github.com/novox/mesh-host/internal/upgrade 1.127s
ok github.com/novox/mesh-host/internal/witness 4.555s
ok github.com/novox/mesh-host/packaging 1.020s
ok github.com/novox/mesh-host/validate 1.020s
**Merge check** at `96bf9415`
- `mesh/merge-gate`: **PASS** — every machine composes with the change as it did without (4 of 4 compose) (modules: mesh-host)
- `mesh/repo-check`: **PASS** — its merge-check.sh passed
**Change plan** — builds mesh-host → ace, g14, novox, shanks; no bus step
- tier 0: mesh-host
- ace: receives mesh-host
- g14: receives mesh-host
- novox: receives mesh-host
- shanks: receives mesh-host
Run by the build seat on ace as `build-1791382664028203253` (`builds --log build-1791382664028203253`).
```
--- the gate: mesh-host
mesh-host: ok
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 0 module(s) changed against 4 machine(s), as the snapshot of 2026-10-07T13:56:37Z 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-07T13:56:37Z
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-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 1 module(s) in 1 tier(s): mesh-host
--- its merge-check.sh (go toolchain)
ok github.com/novox/mesh-host/cmd/mesh-bootstrap 1.013s
ok github.com/novox/mesh-host/cmd/mesh-host 1.314s
ok github.com/novox/mesh-host/examples 1.017s
ok github.com/novox/mesh-host/internal/apply 4.360s
ok github.com/novox/mesh-host/internal/bootstrap 1.510s
ok github.com/novox/mesh-host/internal/bundle 1.013s
ok github.com/novox/mesh-host/internal/declaration 1.040s
ok github.com/novox/mesh-host/internal/firewall 1.654s
ok github.com/novox/mesh-host/internal/identity 1.083s
ok github.com/novox/mesh-host/internal/image 1.013s
ok github.com/novox/mesh-host/internal/inventory 1.066s
ok github.com/novox/mesh-host/internal/link 10.414s
ok github.com/novox/mesh-host/internal/liveness 2.098s
ok github.com/novox/mesh-host/internal/outward 1.067s
ok github.com/novox/mesh-host/internal/profile 1.519s
ok github.com/novox/mesh-host/internal/reachable 1.062s
ok github.com/novox/mesh-host/internal/store 1.251s
ok github.com/novox/mesh-host/internal/system 1.065s
ok github.com/novox/mesh-host/internal/tunnel 1.028s
ok github.com/novox/mesh-host/internal/upgrade 1.127s
ok github.com/novox/mesh-host/internal/witness 4.555s
ok github.com/novox/mesh-host/packaging 1.020s
ok github.com/novox/mesh-host/validate 1.020s
```
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.
Phase B of to-be 48, the node-engine's half.
healthon a container, service and process (declaration): kind runtime | http | tcp | exec | unit | tool, port (the controller composes the endpoint into it), path/status/body/scheme, command, tool, interval/timeout/looks/grace, needs. Strictly decoded and held to the record's bounds (interval ≥ 10 s, timeout < interval, looks ≥ 2, grace + looks×interval ≤ 5 min).--health-cmdfor exec; the image's own command for runtime) with the declared timing — retries = looks, start period = grace. Part of the container spec only for these two kinds; an http/tcp/unit/tool check recreates nothing.{{json .State}}— naming.State.Healthmakes the runtime refuse the whole read for a container with no check; caught by the replay); tool asked onmesh.mod.<m>.tool.<t>.<node>(granted by mesh-controller's PR).ReadinessContract), withcheckandneedsper resource: this is what tells the controller the engine may be senthealth.Tests: rule 3 (a declared command becomes the container's check and nothing else sets one; an http check dials the endpoint's current port after a port change), readiness over a fake runtime, the runtime's check read, a unit, the budget, the tool answer, the probe loop under -race. Replay
TestReplaySilentWebAppIsSaidUnhealthy(issue 145): a busybox httpd whose CGI never answers is said unhealthy by its http check in 2 looks (~13 s at a 10 s interval) while a tcp check connects.Pairs with mesh-controller and mesh-lab
feat/health-the-field. Roll out the engine before the controller: the controller sendshealthonly to engines stating contract 2.check-here: merge-gate PASS (4 of 4 compose), repo-check PASS.
Delivery
novox/mesh-host@96bf9415aae4— delivered since 2026-10-07T16:32:09ZDelivery plan — builds mesh-host → ace, g14, novox, shanks; no bus step
Group
feat/health-the-field, in order: novox/mesh-lab@d93f1e4eabMachines
Transitions
The commit's note under
refs/notes/mesh-plankeeps every transition:git log --notes=mesh-plan.Merge check at
96bf9415mesh/merge-gate: PASS — every machine composes with the change as it did without (4 of 4 compose) (modules: mesh-host)mesh/repo-check: PASS — its merge-check.sh passedChange plan — builds mesh-host → ace, g14, novox, shanks; no bus step
Run by the build seat on ace as
build-1791382664028203253(builds --log build-1791382664028203253).