v1.82.0

EvoMap/evolverv1.82.0May 16, 2026by autogame-17

AI Summary

Adds deduplication logic to the daemon to prevent it from re-implementing work already present in open GitHub PRs, closing a class of failure where the daemon independently re-wrote in-flight changes.

Key Highlights

  • Daemon avoids re-inventing work from open PRs via new `openPRRegistry.js` module.
  • File-level rollback guard triggers when changes overlap open PRs by 70%.
  • Token-level prompt hints warn the LLM about potential overlaps during gene selection.
  • Configurable environment variables for overlap thresholds and deduplication.
  • Memory graph events track skipped cycles due to overlap.

New Features

  • Open PR deduplication for the daemon.
  • File overlap detection and rollback.
  • Prompt hints for gene selection.

Full Release Notes

## [1.82.0] - 2026-05-16

### Added — daemon avoids re-inventing work from open PRs (#50)

The `evolver --loop` daemon now sees the current repo's open-PR list and
automatically rolls back any cycle whose changed files substantially
overlap with one. This closes a class of failure observed during the
v1.81.0 development window where the daemon independently re-implemented
work that was already in flight on PRs #38 and #43, dirtying the working
tree and tripping the rollback risk documented in the daemon-rollback
feedback. New module `src/gep/openPRRegistry.js` wraps `gh pr list` with
in-process caching and graceful degradation (missing `gh`, unauthenticated,
API errors all yield `[]` with a single warn line — never blocks a cycle
on its own infrastructure failures).

Two layers of defense, configurable independently:

- **File-level rollback (the hard guard).** At solidify time, after the
  LLM has finished editing, the daemon checks whether
  `blast.changed_files` overlap any open PR's files at >= 70% of the
  daemon's own changes. On match, `open_pr_overlap:#N:RATIO` is pushed
  onto `protocolViolations`, which feeds the existing `success` formula
  and triggers the established `rollbackTracked` +
  `rollbackNewUntrackedFiles` path. The cycle's edits are reverted before
  the working tree gets dirty. `EvolutionEvent.outcome.skip_reason =
  'open_pr_overlap'` plus a `pr_overlap` sub-object are written to the
  memory graph and (via the existing `outcome` allowlist) mirrored to
  the Hub recall stream, so subsequent cycles in the same selector
  context can dedupe without re-walking `gh`.
- **Token-level prompt hint (the early warning).** At gene-selection
  time, the daemon checks whether the selected gene's `signals_match`
  token-overlaps any open PR's title or branch above 50%. On match, a
  new "Open PR Hint" block is injected into the LLM prompt warning that
  if the planned changes touch overlapping files the cycle will be
  rolled back. Advisory only — the LLM may still proceed, but a thinking
  model can pick a different gene before wasting compute.

Why solidify and not select for the file-level check: `mutation.target`
is `gene:gene_xyz` or `behavior:protocol`, not file paths. The selector
does not predict changed files. Only solidify (after LLM execution) has
the actual diff. Putting the abort there is "undo cycles that turn out
to overlap" rather than "block cycles that might overlap" — same
outcome, lower false-positive rate, and reuses the established rollback
infrastructure (which already handles baseline-untracked-aware deletion
and tracked-file restore).

### Configuration

Three new environment variables, all default-on with conservative thresholds:

| Env var | Default | Purpose |
|---|---|---|
| `EVOLVE_OPEN_PR_DEDUP` | `1` | Master switch; `0` fully disables both layers |
| `EVOLVE_OPEN_PR_TTL_MS` | `60000` | Open-PR list cache TTL (per process) |
| `EVOLVE_OPEN_PR_OVERLAP_ABORT` | `0.7` | File overlap ratio above which solidify rolls back |

### Notes for operators

- Cycles aborted by overlap leave **no working-tree residue** — the
  established solidify rollback path handles cleanup. If you saw "daemon
  silently dirtied my tree mid-edit" before, this should fix it.
- Memory graph events with `outcome.skip_reason='open_pr_overlap'` are
  intentionally short-lived signals; they're not displayed in any UI by
  default but are observable via `gep_recall` from the MCP server.
- If you operate without GitHub auth (e.g. air-gapped), set
  `EVOLVE_OPEN_PR_DEDUP=0` to short-circuit the entire feature. Without
  this, the daemon will still cycle normally but emit one
  `[OpenPR] gh CLI not available` warning at startup.