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.