|
| 1 | +--- |
| 2 | +sidebar_position: 3 |
| 3 | +title: "Curator" |
| 4 | +description: "Background maintenance for agent-created skills — usage tracking, staleness, archival, and LLM-driven review" |
| 5 | +--- |
| 6 | + |
| 7 | +# Curator |
| 8 | + |
| 9 | +The curator is a background maintenance pass for **agent-created skills**. It tracks how often each skill is viewed, used, and patched, moves long-unused skills through `active → stale → archived` states, and periodically spawns a short auxiliary-model review that proposes consolidations or patches drift. |
| 10 | + |
| 11 | +It exists so that skills created via the [self-improvement loop](/docs/user-guide/features/skills#agent-managed-skills-skill_manage-tool) don't pile up forever. Every time the agent solves a novel problem and saves a skill, that skill lands in `~/.hermes/skills/`. Without maintenance, you end up with dozens of narrow near-duplicates that pollute the catalog and waste tokens. |
| 12 | + |
| 13 | +The curator **never touches** bundled skills (shipped with the repo) or hub-installed skills (from [agentskills.io](https://agentskills.io)). It only reviews skills the agent itself authored. It also **never auto-deletes** — the worst outcome is archival into `~/.hermes/skills/.archive/`, which is recoverable. |
| 14 | + |
| 15 | +Tracks [issue #7816](https://github.com/NousResearch/hermes-agent/issues/7816). |
| 16 | + |
| 17 | +## How it runs |
| 18 | + |
| 19 | +The curator is triggered by an inactivity check, not a cron daemon. On CLI session start, and on a recurring tick inside the gateway's cron-ticker thread, Hermes checks whether: |
| 20 | + |
| 21 | +1. Enough time has passed since the last curator run (`interval_hours`, default **7 days**), and |
| 22 | +2. The agent has been idle long enough (`min_idle_hours`, default **2 hours**). |
| 23 | + |
| 24 | +If both are true, it spawns a background fork of `AIAgent` — the same pattern used by the memory/skill self-improvement nudges. The fork runs in its own prompt cache and never touches the active conversation. |
| 25 | + |
| 26 | +A run has two phases: |
| 27 | + |
| 28 | +1. **Automatic transitions** (deterministic, no LLM). Skills unused for `stale_after_days` (30) become `stale`; skills unused for `archive_after_days` (90) are moved to `~/.hermes/skills/.archive/`. |
| 29 | +2. **LLM review** (single aux-model pass, `max_iterations=8`). The forked agent surveys the agent-created skills, can read any of them with `skill_view`, and decides per-skill whether to keep, patch (via `skill_manage`), consolidate overlapping ones, or archive via the terminal tool. |
| 30 | + |
| 31 | +Pinned skills bypass all auto-transitions and the LLM is instructed not to touch them. |
| 32 | + |
| 33 | +## Configuration |
| 34 | + |
| 35 | +All settings live in `config.yaml` under `curator:` (not `.env` — this isn't a secret). Defaults: |
| 36 | + |
| 37 | +```yaml |
| 38 | +curator: |
| 39 | + enabled: true |
| 40 | + interval_hours: 168 # 7 days |
| 41 | + min_idle_hours: 2 |
| 42 | + stale_after_days: 30 |
| 43 | + archive_after_days: 90 |
| 44 | + auxiliary: |
| 45 | + provider: null # null = use main auxiliary client resolution |
| 46 | + model: null |
| 47 | +``` |
| 48 | +
|
| 49 | +To disable entirely, set `curator.enabled: false`. |
| 50 | + |
| 51 | +To use a cheaper aux model for the LLM review pass instead of your main model, set `curator.auxiliary.provider` and `curator.auxiliary.model` to something specific (e.g. `openrouter` + `google/gemini-3-flash-preview`). |
| 52 | + |
| 53 | +## CLI |
| 54 | + |
| 55 | +```bash |
| 56 | +hermes curator status # last run, counts, pinned list, LRU top 5 |
| 57 | +hermes curator run # trigger a review now (background by default) |
| 58 | +hermes curator run --sync # same, but block until the LLM pass finishes |
| 59 | +hermes curator pause # stop runs until resumed |
| 60 | +hermes curator resume |
| 61 | +hermes curator pin <skill> # never auto-transition this skill |
| 62 | +hermes curator unpin <skill> |
| 63 | +hermes curator restore <skill> # move an archived skill back to active |
| 64 | +``` |
| 65 | + |
| 66 | +`hermes curator status` also lists the five least-recently-used skills — a quick way to see what's likely to become stale next. |
| 67 | + |
| 68 | +The same subcommands are available as the `/curator` slash command inside a running session (CLI or gateway platforms). |
| 69 | + |
| 70 | +## What "agent-created" means |
| 71 | + |
| 72 | +A skill is considered agent-created if its name is **not** in: |
| 73 | + |
| 74 | +- `~/.hermes/skills/.bundled_manifest` (skills copied from the repo on install), and |
| 75 | +- `~/.hermes/skills/.hub/lock.json` (skills installed via `hermes skills install`). |
| 76 | + |
| 77 | +Everything else in `~/.hermes/skills/` is fair game for the curator. This includes: |
| 78 | + |
| 79 | +- Skills the agent saved via `skill_manage(action="create")` during a conversation. |
| 80 | +- Skills you created manually with a hand-written `SKILL.md`. |
| 81 | +- Skills added via external skill directories you've pointed Hermes at. |
| 82 | + |
| 83 | +If you want to protect a specific skill from ever being touched — for example a hand-authored skill you rely on — use `hermes curator pin <name>`. The pin is a hard guarantee enforced at the shared mutation helper; no code path that would archive, consolidate, or state-transition a skill can bypass it. |
| 84 | + |
| 85 | +## Usage telemetry |
| 86 | + |
| 87 | +The curator maintains a sidecar at `~/.hermes/skills/.usage.json` with one entry per skill: |
| 88 | + |
| 89 | +```json |
| 90 | +{ |
| 91 | + "my-skill": { |
| 92 | + "use_count": 12, |
| 93 | + "view_count": 34, |
| 94 | + "last_used_at": "2026-04-24T18:12:03Z", |
| 95 | + "last_viewed_at": "2026-04-23T09:44:17Z", |
| 96 | + "patch_count": 3, |
| 97 | + "last_patched_at": "2026-04-20T22:01:55Z", |
| 98 | + "created_at": "2026-03-01T14:20:00Z", |
| 99 | + "state": "active", |
| 100 | + "pinned": false, |
| 101 | + "archived_at": null |
| 102 | + } |
| 103 | +} |
| 104 | +``` |
| 105 | + |
| 106 | +Counters increment when: |
| 107 | + |
| 108 | +- `view_count`: the agent calls `skill_view` on the skill. |
| 109 | +- `use_count`: the skill is loaded into a conversation's prompt. |
| 110 | +- `patch_count`: `skill_manage patch/edit/write_file/remove_file` runs on the skill. |
| 111 | + |
| 112 | +Bundled and hub-installed skills are explicitly excluded from telemetry writes. |
| 113 | + |
| 114 | +## Per-run reports |
| 115 | + |
| 116 | +Every curator run writes a timestamped directory under `~/.hermes/logs/curator/`: |
| 117 | + |
| 118 | +``` |
| 119 | +~/.hermes/logs/curator/ |
| 120 | +└── 20260429-111512/ |
| 121 | + ├── run.json # machine-readable: full fidelity, stats, LLM output |
| 122 | + └── REPORT.md # human-readable summary |
| 123 | +``` |
| 124 | + |
| 125 | +`REPORT.md` is a quick way to see what a given run did — which skills transitioned, what the LLM reviewer said, which skills it patched. Good for auditing without having to grep `agent.log`. |
| 126 | + |
| 127 | +## Restoring an archived skill |
| 128 | + |
| 129 | +If the curator archived something you still want: |
| 130 | + |
| 131 | +```bash |
| 132 | +hermes curator restore <skill-name> |
| 133 | +``` |
| 134 | + |
| 135 | +This moves the skill back from `~/.hermes/skills/.archive/` to the active tree and resets its state to `active`. The restore refuses if a bundled or hub-installed skill has since been installed under the same name (would shadow upstream). |
| 136 | + |
| 137 | +## Disabling per environment |
| 138 | + |
| 139 | +The curator is on by default. To turn it off: |
| 140 | + |
| 141 | +- **For one profile only:** edit `~/.hermes/config.yaml` (or the active profile's config) and set `curator.enabled: false`. |
| 142 | +- **For just one run:** `hermes curator pause` — the pause persists across sessions; use `resume` to re-enable. |
| 143 | + |
| 144 | +The curator also refuses to run if `min_idle_hours` hasn't elapsed, so on an active dev machine it naturally only runs during quiet stretches. |
| 145 | + |
| 146 | +## See also |
| 147 | + |
| 148 | +- [Skills System](/docs/user-guide/features/skills) — how skills work in general and the self-improvement loop that creates them |
| 149 | +- [Memory](/docs/user-guide/features/memory) — a parallel background review that maintains long-term memory |
| 150 | +- [Bundled Skills Catalog](/docs/reference/skills-catalog) |
| 151 | +- [Issue #7816](https://github.com/NousResearch/hermes-agent/issues/7816) — original proposal and design discussion |
0 commit comments