Milestone R2c of design 47 (ADR 0433 §3, ADR 0429 §7; split from 1158 by its order, hq #428). The node-engine's alive message was the only thing that kept a node's last_seen fresh, and nodes, node, status, the board and the watchdogs read it; this moves every reader to the watchman's presence before the node-engine stops sending (issue 1158, milestone R2d).
One function, lastHeard (cmd/mesh-controller/last_heard.go): online by presence is heard now; offline is the presence entry's time; the last report only where presence has no key. nodes, node, status (and board, readable), apply_failing, the probes, the watchdogs and signals take it. With the bus unreachable at the terminal the readers fall back to report times and say so on stderr (issue 1184 asks for 'not known' there).
The controller no longer subscribes to the alive subject: the KindHeartbeat case, its handler, HostBeats, AliveSubjects, the Alive type, RecordHeartbeatGap and the heartbeat-gap duration are deleted; the silent bound is a fixed 3 × 60 s. The tool runner's tools-alive and ToolsBeats stay. A node-engine still sending alive is harmless: the CONTROL stream keeps only report and enrol.
Tests: 1183/AC1-AC5 (AC5 integration: a node online by presence, never sending alive, reads 'here' after 4 minutes; a still-sent alive message records nothing). Try build-1792369011311791069 passed in 5 m 6 s at 19e3eac7 (unit level 2322 tests, 2.86 s of 5 s).
Code lines (acceptance test 20; non-test Go, no blank or comment lines): 113,705 on this branch, 113,685 on main (+20).
Delivery: the controller to novox. What nodes, node and status say for a machine online is unchanged.
Milestone R2c of design 47 (ADR 0433 §3, ADR 0429 §7; split from 1158 by its order, hq #428). The node-engine's alive message was the only thing that kept a node's last_seen fresh, and `nodes`, `node`, `status`, the board and the watchdogs read it; this moves every reader to the watchman's presence before the node-engine stops sending (issue 1158, milestone R2d).
- One function, lastHeard (cmd/mesh-controller/last_heard.go): online by presence is heard now; offline is the presence entry's time; the last report only where presence has no key. nodes, node, status (and board, readable), apply_failing, the probes, the watchdogs and signals take it. With the bus unreachable at the terminal the readers fall back to report times and say so on stderr (issue 1184 asks for 'not known' there).
- The controller no longer subscribes to the alive subject: the KindHeartbeat case, its handler, HostBeats, AliveSubjects, the Alive type, RecordHeartbeatGap and the heartbeat-gap duration are deleted; the silent bound is a fixed 3 × 60 s. The tool runner's tools-alive and ToolsBeats stay. A node-engine still sending alive is harmless: the CONTROL stream keeps only report and enrol.
Tests: 1183/AC1-AC5 (AC5 integration: a node online by presence, never sending alive, reads 'here' after 4 minutes; a still-sent alive message records nothing). Try build-1792369011311791069 passed in 5 m 6 s at 19e3eac7 (unit level 2322 tests, 2.86 s of 5 s).
Code lines (acceptance test 20; non-test Go, no blank or comment lines): 113,705 on this branch, 113,685 on main (+20).
Delivery: the controller to novox. What nodes, node and status say for a machine online is unchanged.
Reviewed-by: reviewer-r12@shanks at 19e3eac74658e40c6db4e6311a9bc786c05d8d77
mesh/merge-gate head 19e3eac74658 merged into trunk 89cfa9431d8f — pass: builds build-agent, mesh-controller → ace, g14, novox, shanks; no bus step; every …
Deliverynovox/mesh-controller@19e3eac74658 — delivered since 2026-10-19T02:08:43Z
Delivery plan — builds build-agent, mesh-controller → ace, g14, novox, shanks; no bus step
tier 0: mesh-controller
tier 1: build-agent
ace: receives build-agent
g14: receives build-agent
novox: receives mesh-controller, build-agent
shanks: receives build-agent
build-agent keeps data (ADR 0233): what it holds is backed up before it moves
grants step: if this changes what the bus's user list says (a new tool, subject or user), novox is sent that list alone, every build there kept, before build-agent is judged on its first machine
Machines
mesh-controller on every machine running it: sent
build-agent on every machine running it: sent
Transitions
2026-10-19 00:24 (new) → proposed (announced): novox/mesh-controller#389's head announced
2026-10-19 00:31 proposed → checked (checked): a verdict names this commit and the trunk's head as its trunk commit
2026-10-19 00:31 checked → ready (accepted): the gate passed or warned, and the repository's own check did not fail
2026-10-19 02:01 ready → published (merged): on the trunk its modules follow: merged there, and its walk opened — or nothing for a walk to move
2026-10-19 02:01 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 — not a failed walk that carried a later commit for it, after which it waits for a walk of its own commit
2026-10-19 02:08 delivering → delivered (done): its walk is done, carrying its own commit: 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-controller@19e3eac74658` — **delivered** since 2026-10-19T02:08:43Z
**Delivery plan** — builds build-agent, mesh-controller → ace, g14, novox, shanks; no bus step
- tier 0: mesh-controller
- tier 1: build-agent
- ace: receives build-agent
- g14: receives build-agent
- novox: receives mesh-controller, build-agent
- shanks: receives build-agent
- build-agent keeps data (ADR 0233): what it holds is backed up before it moves
- grants step: if this changes what the bus's user list says (a new tool, subject or user), novox is sent that list alone, every build there kept, before build-agent is judged on its first machine
**Machines**
- mesh-controller on every machine running it: sent
- build-agent on every machine running it: sent
**Transitions**
- 2026-10-19 00:24 (new) → proposed (announced): novox/mesh-controller#389's head announced
- 2026-10-19 00:31 proposed → checked (checked): a verdict names this commit and the trunk's head as its trunk commit
- 2026-10-19 00:31 checked → ready (accepted): the gate passed or warned, and the repository's own check did not fail
- 2026-10-19 02:01 ready → published (merged): on the trunk its modules follow: merged there, and its walk opened — or nothing for a walk to move
- 2026-10-19 02:01 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 — not a failed walk that carried a later commit for it, after which it waits for a walk of its own commit
- 2026-10-19 02:08 delivering → delivered (done): its walk is done, carrying its own commit: 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`.
Merge check at 19e3eac7
Judged: head 19e3eac74658 merged into trunk 89cfa9431d8f; read beside it: mesh-catalog b4527d9091e9, mesh-controller-main 89cfa9431d8f, mesh-host 89025ad004d4, mesh-tools 7412c5b6c9c5
mesh/merge-gate: PASS — every machine composes with the change as it did without (4 of 4 compose) (modules: build-agent, mesh-controller)
mesh/repo-check: PASS — its merge-check.sh passed
Delivery plan — builds build-agent, mesh-controller → ace, g14, novox, shanks; no bus step
tier 0: mesh-controller
tier 1: build-agent
ace: receives build-agent
g14: receives build-agent
novox: receives mesh-controller, build-agent
shanks: receives build-agent
build-agent keeps data (ADR 0233): what it holds is backed up before it moves
grants step: if this changes what the bus's user list says (a new tool, subject or user), novox is sent that list alone, every build there kept, before build-agent is judged on its first machine
read by no module's build: cmd/mesh-controller/handacts_test.go, cmd/mesh-controller/last_heard_integration_test.go, cmd/mesh-controller/last_heard_test.go, cmd/mesh-controller/signals_test.go, cmd/mesh-controller/stuck_probe_integration_test.go, cmd/mesh-controller/stuck_probe_test.go, internal/inventory/durations_test.go, internal/inventory/heartbeat_gap_gone_test.go, internal/link/contracts_test.go, internal/link/receive_nats_integration_test.go, internal/link/receive_nats_test.go, internal/link/stale_report_test.go
Run by the build seat on ace as build-1792369454107251715 (builds --log build-1792369454107251715).
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.
Milestone R2c of design 47 (ADR 0433 §3, ADR 0429 §7; split from 1158 by its order, hq #428). The node-engine's alive message was the only thing that kept a node's last_seen fresh, and
nodes,node,status, the board and the watchdogs read it; this moves every reader to the watchman's presence before the node-engine stops sending (issue 1158, milestone R2d).Tests: 1183/AC1-AC5 (AC5 integration: a node online by presence, never sending alive, reads 'here' after 4 minutes; a still-sent alive message records nothing). Try build-1792369011311791069 passed in 5 m 6 s at
19e3eac7(unit level 2322 tests, 2.86 s of 5 s).Code lines (acceptance test 20; non-test Go, no blank or comment lines): 113,705 on this branch, 113,685 on main (+20).
Delivery: the controller to novox. What nodes, node and status say for a machine online is unchanged.
Reviewed-by: reviewer-r12@shanks at
19e3eac746Delivery
novox/mesh-controller@19e3eac74658— delivered since 2026-10-19T02:08:43ZDelivery plan — builds build-agent, mesh-controller → ace, g14, novox, shanks; no bus step
Machines
Transitions
The commit's note under
refs/notes/mesh-plankeeps every transition:git log --notes=mesh-plan.Merge check at
19e3eac7Judged: head
19e3eac74658merged into trunk89cfa9431d8f; read beside it: mesh-catalogb4527d9091e9, mesh-controller-main89cfa9431d8f, mesh-host89025ad004d4, mesh-tools7412c5b6c9c5mesh/merge-gate: PASS — every machine composes with the change as it did without (4 of 4 compose) (modules: build-agent, mesh-controller)mesh/repo-check: PASS — its merge-check.sh passedDelivery plan — builds build-agent, mesh-controller → ace, g14, novox, shanks; no bus step
Run by the build seat on ace as
build-1792369454107251715(builds --log build-1792369454107251715).