…ing (#4437)
The claim-reaper's investigate-before-reap sweep lacked the `is_perpetual()`
exemption that `no_progress.rs::classify_standing_idle` already applies. A
healthy standing/perpetual-goal engineer idles benignly between OODA cycles
("standing/perpetual goal idled this cycle — normal, not a fault"), but the
reaper treated any newest-file idle age past the stale threshold as death and
drove an expensive investigate-before-reap sweep on it — a false positive that
archived evidence and risked reaping a live engineer purely for idling.
Fix (reuses the SAME durable `is_perpetual()` marker):
- Add a defaulted `ClaimLivenessProbe::is_perpetual_goal` seam method
(default `false`, so every existing probe impl is unchanged).
- In `reap_stale_claims`, exempt a `HeartbeatStale` (idle-age) staleness on a
perpetual goal BEFORE any investigation: keep claim + worktree + evidence,
no investigation, fail-visible log. Scoped to the idle path only — a
`NoWorktree` claim (worktree physically gone) is provably dead and is still
reclaimed even for a perpetual goal.
- Wire the production `WorktreeClaimLivenessProbe` to resolve perpetual status
from the goal board at the shared `state_root`.
Tests: perpetual idle is exempt AND never investigated; a perpetual goal with
no worktree is still reclaimed. All 38 claim_reaper + 703 overseer +
112 no_progress tests pass; clippy clean.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Summary
Give standing goals more time when their worker heartbeat stops, without keeping abandoned workers forever.
Change from the old proposal
The old branch kept standing claims forever. This version removes that permanent exception. Standing claims receive more time, but old claims are still investigated and removed when the evidence says the worker is dead.
Resolves #4437.
Validation
Co-authored-by: Copilot 223556219+Copilot@users.noreply.github.com