The lifecycle.js health check restarts the evolver daemon if evolver_loop.log hasn't been written to for over 30 minutes (stagnation).
However, the loop remains completely silent during normal operation when it is not actively processing tasks, because sendHeartbeat() in src/gep/a2aProtocol.js does not log anything on a routine successful heartbeat.
If no tasks are processed for 30 minutes, the log file's mtime does not update, and the lifecycle manager incorrectly flags the service as "stagnant" and kills/restarts it.
Suggested fix:
Either update sendHeartbeat() to print a periodic message (e.g., heartbeat succeeded), touch the log file on success, or update lifecycle.js to rely on an alternative health metric.