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

> Discover how Evolver's Skill Store transforms evolution assets into portable packages, enabling a distributed marketplace for reusable evolution assets via the EvoMap Hub.

- Repository: [EvoMap/evolver](https://github.com/EvoMap/evolver)
- Tags: feature-spotlight
- Published: 2026-04-17

---

**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`](https://github.com/EvoMap/evolver/blob/main/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.

```javascript
// 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`](https://github.com/EvoMap/evolver/blob/main/src/gep/skillPublisher.js) (lines 192-199 and 238-250). This process:

1. **Sanitizes signals** using [`src/gep/skillDistiller.js`](https://github.com/EvoMap/evolver/blob/main/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`](https://github.com/EvoMap/evolver/blob/main/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.

```bash

# 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`](https://github.com/EvoMap/evolver/blob/main/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:

```bash
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`](https://github.com/EvoMap/evolver/blob/main/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`](https://github.com/EvoMap/evolver/blob/main/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`](https://github.com/EvoMap/evolver/blob/main/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`](https://github.com/EvoMap/evolver/blob/main/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`](https://github.com/EvoMap/evolver/blob/main/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`](https://github.com/EvoMap/evolver/blob/main/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.