fleetd #562: surface loop health #579

Closed
agent wants to merge 0 commits from worker/562-surface-loop-health-7df5cc-4 into main
Member

Implements fleetd #562. fleet_list now has loopHealth with statusPoller and sessionReaper, each reporting RUNNING, STALLED, or STOPPED. /healthz adds the same body object but keeps 200 for healthy herdr and 503 for unreachable herdr. healthCoverage remains unchanged.

Tests: mvn -o clean install passed in the default profile: Tests run: 1771, Failures: 0, Errors: 0, Skipped: 0; the independent Surefire report sum is 1771. McpContractDocTest ran as part of that build. Mutation checks made each new assertion fail, then restored source hashes byte-for-byte.

Features entry for wiki/11-Features.md:

  • Loop health in fleet_list — fleet_list reports loopHealth.statusPoller and loopHealth.sessionReaper as RUNNING, STALLED, or STOPPED. It needs no config knob. It exists so operators can read watchdog state that was previously only in memory. Gotcha: STOPPED means a loop is intentionally stopped or disabled; it is not an alarm. /healthz includes the same body data while keeping its existing 200/503 status contract.

The worker worktree has no initialized wiki submodule, so I could not run the CLAUDE.md/wiki sync check or edit the Features page.

Implements fleetd #562. `fleet_list` now has `loopHealth` with `statusPoller` and `sessionReaper`, each reporting `RUNNING`, `STALLED`, or `STOPPED`. `/healthz` adds the same body object but keeps 200 for healthy herdr and 503 for unreachable herdr. `healthCoverage` remains unchanged. Tests: `mvn -o clean install` passed in the default profile: `Tests run: 1771, Failures: 0, Errors: 0, Skipped: 0`; the independent Surefire report sum is 1771. `McpContractDocTest` ran as part of that build. Mutation checks made each new assertion fail, then restored source hashes byte-for-byte. Features entry for wiki/11-Features.md: - **Loop health in fleet_list** — `fleet_list` reports `loopHealth.statusPoller` and `loopHealth.sessionReaper` as `RUNNING`, `STALLED`, or `STOPPED`. It needs no config knob. It exists so operators can read watchdog state that was previously only in memory. Gotcha: `STOPPED` means a loop is intentionally stopped or disabled; it is not an alarm. `/healthz` includes the same body data while keeping its existing 200/503 status contract. The worker worktree has no initialized wiki submodule, so I could not run the CLAUDE.md/wiki sync check or edit the Features page.
agent added 1 commit 2026-09-12 14:27:03 +02:00
fleetd #562: surface loop health
CI / shell-tests (pull_request) Successful in 12s
CI / contract (pull_request) Successful in 1m31s
CI / build (pull_request) Successful in 2m11s
275ac0d251
Owner

Already in main — closing as merged.

Head 275ac0d25 is an ancestor of origin/main. It came in through 634d33b50
("Merge worker/562-loop-health-wiring-test-99611c-5") — the merge of #584, which was built on top
of this branch, so merging #584 brought this with it.

$ git merge-base --is-ancestor 275ac0d25 origin/main && echo merged
merged
$ git rev-list --ancestry-path --reverse 275ac0d25..origin/main --merges | head -1
634d33b50

So "#584 supersedes #579" is accurate about the review, but both commits are in main; this was
one landing, not two.

Already in `main` — closing as merged. Head `275ac0d25` is an ancestor of `origin/main`. It came in through `634d33b50` ("Merge worker/562-loop-health-wiring-test-99611c-5") — the merge of #584, which was built on top of this branch, so merging #584 brought this with it. ``` $ git merge-base --is-ancestor 275ac0d25 origin/main && echo merged merged $ git rev-list --ancestry-path --reverse 275ac0d25..origin/main --merges | head -1 634d33b50 ``` So "#584 supersedes #579" is accurate about the review, but both commits are in `main`; this was one landing, not two.
ltms closed this pull request 2026-09-12 16:42:53 +02:00
Some checks are pending
CI / shell-tests (pull_request) Successful in 12s
CI / contract (pull_request) Successful in 1m31s
CI / build (pull_request) Successful in 2m11s

Pull request closed

Sign in to join this conversation.