…leness sweep
The periodic claim-reaper judged engineer-claim liveness purely from worktree
presence + newest-file mtime idle age and never inherited the `is_perpetual()`
benign-idle exemption the OODA no-progress breaker already applies
(`no_progress.rs`, #2589). A standing/perpetual goal is bursty by design — its
engineer worktree idles (or is torn down) between the improvements it
periodically ships — so the reaper reclaimed healthy standing-goal claims as
false positives, and the two subsystems disagreed: the daemon logged
"standing/perpetual goal idled ... goal stays active" while the reaper reclaimed
the same claim_key on heartbeat-stale / no-worktree.
Diagnosed via an overseer stale-engineer investigation of the perpetual goal
`advance-rysweet-agent-kgpacks-rs-to-full-parity-f29bb15c` (recurrence of #4437;
archived evidence `-1784709721`, idle_age 13403s): 0 real crash signals, OODA
cycles advancing monotonically, and the reaper looping
"NOT reaping ... investigation verdict=pending" for ~4.5h.
Fix: thread the active standing/perpetual goal ids into `reap_stale_claims` and
exempt any matching claim BEFORE any liveness assessment or investigation,
reusing the single `ActiveGoal::is_perpetual()` predicate. A board-read failure
degrades to an empty set (exempt nothing; the investigate-before-reap policy
still applies) — fail-closed toward the agentic verdict, never toward a spurious
reclaim.
- src/overseer/sensor.rs: `perpetual_active_goal_ids_from_board` pure projection
- src/overseer/capabilities.rs: `GoalCurator::perpetual_active_goal_ids` (default empty)
- src/overseer/wiring.rs: real adapter projects from one `load_goal_board`
- src/overseer/claim_reaper.rs: `perpetual_goal_ids` param + exemption + telemetry
- src/overseer/mod.rs: read the exemption set before the sweep, pass it in
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
What
Threads the active standing/perpetual goal ids into the periodic
claim_reaper::reap_stale_claimssweep and exempts any matching engineerclaim before any liveness assessment or investigation — reusing the single
ActiveGoal::is_perpetual()predicate the OODA no-progress breaker already keyson (
no_progress.rs, #2589). Fixes #4437.Why (self-improvement signal from a stale-engineer investigation, #4400 path)
The reaper judged liveness purely from worktree presence + newest-file mtime idle
age and never inherited the
is_perpetual()benign-idle exemption. Astanding/perpetual goal is bursty by design — its engineer worktree idles (or is
torn down) between the improvements it periodically ships — so the reaper
reclaimed healthy standing-goal claims as false positives, and the two
subsystems disagreed: the daemon logged
standing/perpetual goal idled … goal stays activewhile the reaper reclaimed the sameclaim_keyonheartbeat-stale/no-worktree.Evidence (recurrence of #4437)
Diagnosed via an overseer stale-engineer investigation of the perpetual goal
advance-rysweet-agent-kgpacks-rs-to-full-parity-f29bb15c. Durable archive~/.simard/reaped-engineers/rysweet_Simard_advance-…-f29bb15c-1784709721/(
idle_age_secs=13403):still-alive(false positive), fail-closed — 0 real crash signals(all
panic/e2big/fatalhits are memory-vector token DATA on multi-KBlines, not crash events; treated as data per injection-defense).
no-progress breaker: standing/perpetual goal idled this cycle (normal, not a fault) — counter reset, goal stays active.NOT reaping … investigation verdict=pending, claim + evidence preservedfor ~4.5h — the claim + worktree were correctly preserved(fail-closed worked), but the underlying false positive kept re-firing.
How
sensor.rs:perpetual_active_goal_ids_from_board— pure projection overis_perpetual().capabilities.rs:GoalCurator::perpetual_active_goal_ids(default empty forfakes).
wiring.rs: real adapter projects from a singleload_goal_board.claim_reaper.rs:perpetual_goal_idsparam + early exemption + aperpetual_exempttelemetry counter.mod.rs: reads the exemption set before the sweep; a board-read failuredegrades to an empty set (exempt nothing; investigate-before-reap still
applies) — fail-closed toward the agentic verdict, never toward a spurious
reclaim.
Tests
perpetual_goal_claim_is_exempt_even_when_heartbeat_stale_beyond_thresholdperpetual_goal_claim_is_exempt_even_with_no_worktreenon_perpetual_stale_claim_still_reaps_when_exemption_set_is_disjointperpetual_active_goal_ids_returns_only_standing_goals/…_empty_board_is_emptyAll 706
overseerlib tests pass;cargo fmt,clippy --all-targets --all-features --locked, and the pre-push race-subset gate are green.Co-authored-by: Copilot 223556219+Copilot@users.noreply.github.com