| Name | Modified | Size | Downloads / Week |
|---|---|---|---|
| Parent folder | |||
| evolver-windows-x64.exe.sha256 | 2026-06-03 | 90 Bytes | |
| SHA256SUMS.txt | 2026-06-03 | 432 Bytes | |
| evolver-windows-x64.exe | 2026-06-03 | 107.2 MB | |
| evolver-linux-arm64.sha256 | 2026-06-03 | 86 Bytes | |
| evolver-linux-arm64 | 2026-06-03 | 102.4 MB | |
| evolver-linux-x64.sha256 | 2026-06-03 | 84 Bytes | |
| evolver-darwin-arm64 | 2026-06-03 | 72.2 MB | |
| evolver-darwin-arm64.sha256 | 2026-06-03 | 87 Bytes | |
| evolver-darwin-x64 | 2026-06-03 | 77.9 MB | |
| evolver-darwin-x64.sha256 | 2026-06-03 | 85 Bytes | |
| evolver-linux-x64 | 2026-06-03 | 103.3 MB | |
| README.md | 2026-06-03 | 4.4 kB | |
| v1.88.0 source code.tar.gz | 2026-06-03 | 2.4 MB | |
| v1.88.0 source code.zip | 2026-06-03 | 2.5 MB | |
| Totals: 14 Items | 467.9 MB | 0 | |
[1.88.0] - 2026-06-03
Added
-
Three-platform daemon autostart templates (#163). The repo now ships install helpers so the evolver daemon auto-starts on login with restart-on-failure on every supported OS, matching the existing Linux
scripts/evolver.service: a macOS launchd agent (scripts/com.evomap.evolver.plist,KeepAlive.SuccessfulExit=false+ThrottleInterval=5mirroringRestart=on-failure/RestartSec=5) and a Windows Task Scheduler installer (scripts/install-evolver-windows.ps1,-Install/-Uninstall). The Windows shape launches via a generated%LOCALAPPDATA%\EvoMap\evolver-task-launcher.vbswith the node/index paths baked into VBScript literals and a single quoted task argument —wscriptis a Windows-subsystem host so no console window appears on logon, andWScript.Quit rcpropagates the exit code so restart-on-failure still observes failures. All three platforms verified live through a real reboot. -
Explicit signal injection channel (#172). A new fifth injection point in the signal-extraction stage reads user-declared signals from
<gep-assets-dir>/pending_signals.json(default.evolver/gep) and merges them into a cycle's signal set, bypassing the closed 20-entryOPPORTUNITY_SIGNALSvocabulary. This lets a human-verified, deterministic capability whose intent no extractor can name still surface as a first-class signal (previously it collapsed to a genericcapability_gapand the dedicated gene could never win selection). File-locked read-once semantics (consumePendingSignals()empties the file after consuming), entries trimmed and length-capped (≤200), non-fatal on error.
Fixed
- Heartbeat / daemon-survival resilience overhaul (#163). A nine-round hardening pass on the keep-alive path, addressing failure modes that left the daemon silently dead after sleep/wake, idle windows, or concurrent startup:
- Singleton-lock takeover is now atomic —
linkSync+EEXISTguard (with arenameSyncfallback for link-less filesystems), replacing a non-atomicunlinkSync-before-write that could let two daemons both "own" the lock and rotatenode_secretagainst each other into mutual 401 backoff. Lock carries alease: truemarker + mtime refreshed everyLOCK_REFRESH_MS(60s Win / 120s POSIX); takeover honors both dead-PID (kill -0ESRCH) and lease-expiry (mtime older thanSTALE_LOCK_TTL_MS, 3min Win / 5min POSIX). - sd_notify watchdog actually fires under systemd — shells out to
systemd-notify(1)(withNotifyAccess=all) instead of the brokendgramunix_dgramsocket, which threw synchronously on node ≥22 and swallowedREADY=1/WATCHDOG=1. - Sleep/wake recovery — a wall-clock drift detector (samples
Date.now()every 30s, treats a >90s jump as a wake;cpuUsage-vs-wall-clock delta distinguishes CPU throttling from true sleep), a stuck-tick watchdog, and a wake ritual that drains dead undici connections + restarts SSE. - Event-loop anchor + process survival — a ref'd 10-min keepalive tick
keeps the loop alive and leaves a disk heartbeat for
checkHealth; EPIPE is swallowed without killing the process while non-EPIPE stream errors are still surfaced;unhandledRejectionconsults live heartbeat stats rather than killing a process mid-recovery. - Hostile-hub clamps — 429 backoff capped at 30min so a malicious/buggy
retry_after_ms: 86_400_000can't silence the heartbeat for a day;unknown_nodeanti-cache-poisoning backoff with an absolute deadline. -
Removed a dead wake hook in
evolver-signal-detect.jswhose relativerequirewasMODULE_NOT_FOUNDin the deployed.claude/hooks/layout (no in-proc consumer exists, so it was a no-op that cost a 3000-linerequireon every IDE edit). -
Standalone-binary obfuscation retries (#171). Default
OBF_MAX_ATTEMPTSraised 4 → 12 inscripts/build_binaries.js. The obfuscation step occasionally manglesnew.targetinto an illegal#targettoken, non-deterministically across node processes; the seed-perturbation retry is the right mechanism but 4 attempts wasn't enough (the v1.87.4 deploy hit 4/4 and aborted before npm publish + binary upload). No behavior change on first-attempt success; env override unchanged.