v1.79.0

EvoMap/evolverv1.79.0May 6, 2026by autogame-17

AI Summary

Adds cycle hard-timeout watchdog and progress tracking to prevent indefinite hangs in the daemon.

Key Highlights

  • Added `EVOLVER_CYCLE_TIMEOUT_MS` (default 45 minutes) to prevent hung cycles from freezing the daemon.
  • Introduced `cycle_progress.json` heartbeat file for external watchdogs to detect true freezes.
  • Force-spawns a replacement process on timeout to allow host wrappers to observe and restart.

New Features

  • Added cycle hard-timeout watchdog
  • Introduced `cycle_progress.json` heartbeat file

Full Release Notes

## What's new

### Cycle hard-timeout watchdog (Issue #19)

The daemon main loop in `index.js` previously called `await evolve.run()` with no upper bound, so a single hung cycle (unclosed socket, stalled LLM call, etc.) could freeze the process indefinitely. One reporter observed cycle #5372 stuck for 22 days at 0% CPU.

`evolve.run()` is now wrapped in `Promise.race(evolvePromise, cycleTimeoutPromise)`. When the timeout fires, the daemon emits a diagnostic, force-spawns a replacement process, and exits with code 1 so a host wrapper observes the dead pid and respawns.

Default behavior is opt-out:

- `EVOLVER_CYCLE_TIMEOUT_ENABLED` (default `true`)
- `EVOLVER_CYCLE_TIMEOUT_MS` (default `2700000`, 45 minutes)
- `EVOLVER_PROGRESS_UPDATE_MS` (default `60000`)

Set `EVOLVER_CYCLE_TIMEOUT_ENABLED=false` to keep the v1.78.x behavior.

### `cycle_progress.json` heartbeat

The daemon now atomically writes `memory/evolution/cycle_progress.json` at cycle start, every 60s while `evolve.run()` is in flight, and again at sleep entry. External watchdogs (such as `feishu-evolver-wrapper` v1.10.0+) poll `updated_at` to detect a true freeze; normal long LLM cycles still refresh it via the 60-second ticker, so legitimate slow cycles will not be flagged as stuck.

Schema:

```json
{ "pid": 12345, "outer_cycle": 5372, "inner_cycle": 17,
  "started_at": 1746543112000, "phase": "evolve.run",
  "updated_at": 1746543210000 }
```

## Install

### Option 1: npm (recommended for Node users)

```bash
npm install -g @evomap/evolver@1.79.0
```

### Option 2: standalone binary (no Node required)

Download the binary for your platform below. Each `.sha256` is the matching checksum; `SHA256SUMS.txt` contains all five in one file.

| Platform | Asset |
|---|---|
| macOS (Apple Silicon) | `evolver-darwin-arm64` |
| macOS (Intel)         | `evolver-darwin-x64` |
| Linux (x86_64)        | `evolver-linux-x64` |
| Linux (ARM64)         | `evolver-linux-arm64` |
| Windows (x86_64)      | `evolver-windows-x64.exe` |

Verify integrity (Linux/macOS):

```bash
sha256sum -c SHA256SUMS.txt --ignore-missing
chmod +x evolver-linux-x64
./evolver-linux-x64 --help
```

## Tests

- `test/cycleHardTimeout.test.js` (11 cases)
- `test/cycleProgressFile.test.js` (4 cases)
- Full suite: 1168 / 1168 passing.

Closes EvoMap/evolver-private-dev#19.