Releases: EvoMap/evolver
v1.32.2
v1.32.2
Fixes
- Hub node secret cache TTL: Added TTL-based expiration to the hub node secret cache, preventing stale 403 errors when secrets rotate (#258)
- completeDistillation state variable: Fixed unnecessary variable rename (
state2->state) incompleteDistillation
Improvements
- Error logging in silent catches: Added
console.warnto previously silentcatch {}blocks ina2aProtocol.js(transport/heartbeat paths) andassetStore.js(file I/O operations), improving debuggability without changing behavior - var -> const/let migration: Migrated all
vardeclarations toconst/letinskillDistiller.jsfor modern JavaScript standards
Files changed
src/gep/a2aProtocol.js-- error logging in 4 catch blockssrc/gep/assetStore.js-- error logging in 8 catch blockssrc/gep/skillDistiller.js-- full var -> const/let migrationsrc/gep/learningSignals.js-- minor fix
v1.32.0
What's New in v1.32.0
Improvements
- feat: structured learning signals -- expand raw signals into categorized tags (problem:X, area:X, action:X, risk:X) for better gene selection and evolution feedback
- feat: adaptive strategy policy -- detect repair/failure streaks and auto-adjust blast radius and innovation pressure
- feat: gene learning history -- track success/failure outcomes per gene with anti-pattern recording for smarter selection
- feat: failure-driven candidate extraction -- group recurring failed capsules into improvement candidates
- feat: auto-distillation -- synthesize new genes from successful patterns without requiring LLM interaction
- feat: soft/hard failure classification in solidify -- distinguish retryable validation failures from destructive constraint breaches
Bug Fixes
- fix: tool frequency threshold raised from 2 to 3 to reduce noise in candidate extraction
Other
- chore: comprehensive test coverage for all new learning closure features (6 new test files)
Contributors
- @firstdraft-work (PR #260) -- Strengthened the evolver learning closure with structured signals, adaptive policy, and auto-distillation
v1.31.0
What's New
Skill Store Fetch Command
- New
evolver fetch --skill <id>CLI command to download skills from the Skill Store - Supports
-s <id>,--skill=<id>,--skill <id>, and positional argument - Auto-registers with Hub if no node_secret exists
- Downloads SKILL.md + bundled files to
./skills/<skill_id>/(customizable via--out=<dir>) - The
npx @evomap/evolver fetch --skill <id>command shown on skill detail pages now works
Bug Fixes
- writeStateForSolidify: ensure the correct directory (evolutionDir) exists before writing state file, preventing ENOENT on scoped or first runs
- rejectPendingRun: use atomic tmp+rename write to prevent state file corruption on crash
- EVOLVE_BRIDGE: respect pre-set environment variable in loop mode instead of unconditionally overwriting to
false - selectedBy: remove duplicate declaration in solidify try-block
- .env loading: use
getRepoRoot()in index.js to match evolve.js path resolution - WORKSPACE_ROOT: use
getWorkspaceRoot()from paths.js for consistent path resolution
Internal
- Export
getHubUrlfrom a2aProtocol.js - Remove stale
.envrewrite rule from public.manifest.json - Sanitize skill_id in output path to prevent path traversal
v1.30.2
What's New in v1.30.2
Bug Fixes
- fix: remove destructive git rollback from loop auto-reject (#257 by @firstdraft-work)
rejectPendingRunno longer runsgit checkout -- .andgit clean -fd, which could delete untracked work files during loop-mode auto-reject- State-only rejection is now used, preserving all working directory contents
Other
- test: add loop-mode auto-reject test (
test/loopMode.test.js) - refactor: export
main,readJsonSafe,rejectPendingRun,isPendingSolidifyfrom index.js for testability
v1.29.9
What's New in v1.29.9
Skill Distillation Quality Overhaul
Distilled skills now meet marketplace-quality standards. Previously, distilled skills often contained timestamps in IDs, signals, and summaries, had minimal strategy steps, and generated bare-bones SKILL.md content.
Distiller prompt:
- Complete rewrite of the LLM prompt with explicit rules for signals_match (no timestamps/tool names), summary (marketplace-quality), strategy (5-10 concrete steps), and preconditions
- Each rule section includes Good/Bad examples
- Added QUALITY BAR section that frames output as a marketplace listing
Signal sanitization:
- New
sanitizeSignalsMatch()strips trailing timestamps, rejects pure-numeric signals, tool-name-only signals (cursor, vscode, bypass, distill, etc.), and signals with 8+ digit sequences - Signals are now sanitized BEFORE ID derivation (fixes bug where
deriveDescriptiveIdused dirty data)
Gene validation:
- Strip ALL embedded timestamps from gene IDs (not just trailing)
- Require minimum 3 strategy steps
- Auto-set
schema_version: "1.6.0" - Summary timestamps stripped before ID derivation
SKILL.md generation:
- Title Case display names
- Added "When to Use" and "Metadata" sections
- Strategy steps render with bold leading verb
- Constraints rendered with inline code formatting
- No more duplicate sections
- Gene object is shallow-copied to avoid caller mutation
Bug Fixes
- fix:
deriveDescriptiveIdno longer reads dirty signals_match - fix: duplicate Preconditions / When to Use sections removed
- fix:
extractStepVerbhandles backtick-prefixed steps gracefully - fix:
publishSkillToHubno longer mutates caller's gene object
v1.29.8
What's New in v1.29.8
Bug Fixes
- fix:
getHubNodeSecret()now readsA2A_NODE_SECRETenvironment variable (resolves #245). Deployments that inject the secret solely via env var no longer fail Hub Search with 401. Priority order:A2A_NODE_SECRET> in-memory cache > persisted file >A2A_HUB_TOKEN(compat fallback) - fix: sanitize newlines in gene name/description before YAML output
Improvements
- feat: enforce descriptive naming rules for distilled skills
- refactor: add warn logging to empty catch blocks in solidify.js (#237)
- docs(security): declare env vars, network endpoints, shell commands and file access in SKILL.md metadata
- chore: add workspace/ and runtime-generated GEP state files to gitignore
v1.29.4
What's New in v1.29.4
Heartbeat Environment Fingerprint
- Evolver now sends
env_fingerprintin the first heartbeat after startup, so the Hub can detect evolver version without requiring a fresh hello - Only marks fingerprint as sent when capture succeeds and includes
evolver_version, retries on subsequent heartbeats if the first attempt fails
Bug Fixes
- fix: prevent false "no evolver detected" warning for agents that upgraded evolver but had not re-sent hello
- fix: add logging to critical-path empty catch blocks in evolve.js
- feat: add ESL-1.0 license notice to generated SKILL.md footer
- fix: prevent data loss from parent .git and OOM on large candidates files
v1.29.3
Bug Fixes
-
[Critical] Fix parent .git data loss (#198):
getRepoRoot()now checks evolver's own directory first. Parent.gitrepositories are ignored by default -- setEVOLVER_USE_PARENT_GIT=trueto opt in. This preventsgit reset --hardfrom running in the wrong scope. -
Fix OOM on large candidates.jsonl (#210):
readRecentCandidates()andreadRecentExternalCandidates()now use a tail-read strategy for files >1MB instead of loading the entire file into memory.
v1.29.2
What's New in v1.29.2
Skill Store Integration
- Distilled Genes are automatically published to the EvoMap Hub Skill Store as SKILL.md files (Claude/Anthropic Agent Skill format)
- Gene-to-SKILL.md conversion maps signals_match, strategy, constraints, validation to structured markdown
- Auto-update on re-distillation, set SKILL_AUTO_PUBLISH=0 to disable
Other Changes (since v1.27.5)
- feat: add npm publishing as @evomap/evolver
- feat: add commitment tracking for task deadlines
- feat: merge community PRs #217, #218, #226, #232
- fix: recompute asset_id after adding model_name
- fix: resolve evolver_version detection for npm deployments
- fix: commitment deadline edge case and heartbeat meta regression
v1.28.2
fix: recompute asset_id after adding model_name in buildPublishBundle
When EVOLVER_MODEL_NAME was set, model_name was added to gene/capsule objects after asset_id had already been computed. Hub-side verifyAssetId would recompute the hash including model_name, causing gene_asset_id_verification_failed.
Update: git pull && npm install