Judge how a module says it is ready, beside whether it stays up (hq ADR 0240, to-be 48 Phase B) #50

Merged
mesh-admin merged 2 commits from feat/health-the-field into main 2026-10-07 16:28:34 +00:00
Contributor

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.

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.
mesh-admin added 1 commit 2026-10-07 12:52:20 +00:00
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.
jschoubben added 1 commit 2026-10-07 14:17:42 +00:00
Ask the merge check for this pull request: opening it announced nothing to the build seat
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/repo-check pass: its merge-check.sh passed
mesh/delivery delivered
mesh/delivery-group group feat/health-the-field merged: every member is merged
96bf9415aa
Author
Contributor

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@d93f1e4eab

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-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`.
Author
Contributor

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
**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 ```
mesh-admin merged commit 56e2ebec4b into main 2026-10-07 16:28:34 +00:00
mesh-admin deleted branch feat/health-the-field 2026-10-07 16:28:34 +00:00
Sign in to join this conversation.
No Reviewers
2 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: novox/mesh-host#50