How the Skill Store in Evolver Enables Sharing of Reusable Evolution Assets

Evolver converts evolved Gene objects into portable Skill packages that can be published to, updated on, and fetched from the central EvoMap Hub, creating a distributed marketplace for reusable evolution assets.

The Evolver project (EvoMap/evolver) implements a skill store feature that transforms ephemeral evolution results into persistent, shareable assets. By converting Gene objects generated during GEP-guided evolution cycles into standardized Skill packages, the system enables nodes to contribute reusable solutions to a central Hub and allows other participants to discover and apply these assets without re-running expensive evolution cycles. This architecture establishes a collaborative ecosystem where evolution assets become version-controlled building blocks for distributed agents.

Converting Gene Objects to SKILL.md Documents

At the core of the skill store is the conversion of raw genetic programming output into a consumable format. The geneToSkillMd function in src/gep/skillPublisher.js (lines 60-66) transforms a Gene object into a markdown document following the Hub's skill-store schema.

This generated SKILL.md includes:

  • Human-readable name and description extracted from the gene metadata
  • Usage signals defining when the skill applies
  • Constraints and validation commands for runtime verification
  • Structured metadata for categorization and discovery

The function normalizes raw gene IDs into a consistent format, ensuring that any node in the EvoMap network can interpret the skill's purpose and requirements without access to the original evolution context.

// Convert a gene to markdown format internally
const { geneToSkillMd } = require('./src/gep/skillPublisher');
const markdown = geneToSkillMd(gene);
console.log(markdown);   // Shows SKILL.md content ready for publishing

Publishing Skills to the EvoMap Hub

Once packaged, skills enter the distributed marketplace through the publishSkillToHub function in src/gep/skillPublisher.js (lines 192-199 and 238-250). This process:

  1. Sanitizes signals using src/gep/skillDistiller.js to prepare clean tag lists derived from the gene's signals
  2. Derives a deterministic skill_id using the pattern skill_ plus a sanitized version of the gene name
  3. Packages the SKILL.md with complete metadata
  4. POSTs to the Hub endpoint /a2a/skill/store/publish

The src/a2a/a2aProtocol.js file supplies the necessary Hub URL, authentication headers, and node identity required for these transactions, reading from the A2A_HUB_URL environment variable typically defined in a .env file.


# Publish a gene from the evolution cycle

node -e "
const { publishSkillToHub } = require('./src/gep/skillPublisher');
const gene = require('./assets/gep/genes.json')[0];
publishSkillToHub(gene, { category: 'repair' })
  .then(r => console.log('Published:', r));
"

Updating Existing Skills

When the Hub reports a conflict indicating the skill already exists, Evolver automatically initiates an update rather than a duplicate creation. The updateSkillOnHub helper (lines 250-260 in src/gep/skillPublisher.js) sends a PUT request to /a2a/skill/store/update, allowing iterative improvements to skills while preserving their public identifier and existing consumer dependencies.

Fetching and Consuming Skills Locally

The skill store enables bidirectional sharing through a simple CLI interface. Participants can fetch any published skill using:

node index.js fetch --skill skill_retry-with-backoff --out ./my-skills/

This command contacts the EvoMap Hub, retrieves the SKILL.md document, and writes it to the specified local directory (defaulting to ./my-skills/). The process requires only that A2A_HUB_URL is configured in the environment, as documented in the README.md Skill Store section (lines 112-123).

Once fetched, these skills integrate directly into local evolution cycles, allowing agents to reuse vetted solutions discovered by other nodes. The src/ops/skills_monitor.js component further enhances this by monitoring Hub hints during the heartbeat loop, proactively alerting nodes to newly available or updated skills that match their current operational context.

Summary

  • Gene-to-Skill conversion: The geneToSkillMd function in src/gep/skillPublisher.js normalizes evolution outputs into standardized SKILL.md documents containing signals, constraints, and validation rules.
  • Hub publishing: publishSkillToHub sanitizes gene data via src/gep/skillDistiller.js, generates deterministic IDs, and POSTs to /a2a/skill/store/publish, while updateSkillOnHub handles version updates via PUT requests to /a2a/skill/store/update.
  • Distributed consumption: The CLI fetch command and src/ops/skills_monitor.js enable any node to discover and download skills from the Hub, storing them locally in ./my-skills/ for immediate reuse.
  • Offline capability: While the core evolution loop runs independently, online nodes automatically advertise capabilities through src/a2a/a2aProtocol.js and receive skill hints, creating a feedback loop of continuous improvement.

Frequently Asked Questions

What file format does Evolver use to package skills for the Hub?

Evolver packages skills as SKILL.md files, which are markdown documents generated by the geneToSkillMd function containing structured metadata, usage signals, constraints, and validation commands. This format ensures consistent interpretation across the distributed EvoMap network.

How does Evolver handle version conflicts when publishing skills?

When a skill already exists on the Hub, the updateSkillOnHub function automatically sends a PUT request to /a2a/skill/store/update instead of creating a duplicate. This allows iterative improvements while maintaining the deterministic skill_id and preserving existing consumer dependencies.

Can the skill store operate without an internet connection?

Yes, the skill store functionality is optional and the core GEP-guided evolution loop runs fully offline. However, when A2A_HUB_URL is configured, nodes can publish their assets, fetch others' solutions, and receive proactive hints via the heartbeat mechanism implemented in src/ops/skills_monitor.js.

What determines the unique identifier for a published skill?

Each skill receives a deterministic skill_id generated from the pattern skill_ concatenated with a sanitized version of the gene name. This ID remains consistent across updates, enabling reliable referencing and dependency management throughout the EvoMap ecosystem.

Have a question about this repo?

These articles cover the highlights, but your codebase questions are specific. Give your agent direct access to the source. Share this with your agent to get started:

Share the following with your agent to get started:
curl -s "https://instagit.com/install.md"

Works with
Claude Codex Cursor VS Code OpenClaw Any MCP Client

Maintain an open-source project? Get it listed too →