Hermes Curator: The Weekly Lint Gate for Skills and Memory
Operator playbook for hermes curator as the weekly lint gate: the 13-verb CLI surface, the 4 lint rules (orphan / stale / oversized / duplicate), and the pin-vs-prune decision.

The hermes curator skill is the weekly lint gate for everything the agent has authored into ~/.hermes/skills/. It runs every 7d by default, marks agent-created skills idle past 30d as stale, archives skills idle past 90d, and never touches bundled or hub-installed skills. Auto-deletion never happens; archives are recoverable from .archive/. This guide is the operator playbook for reading a curator report, walking the four lint rules by hand, and applying the pin-vs-prune decision to each candidate.
Companion guides established the storage decision rubric (Storage Decision) and the skill authorship loop (Author and Curate). This one covers the gap between those two: the weekly triage pass that keeps the skill stack from silently rotting.
The curator surface (13 verbs, 4 job families)
Run hermes curator --help for the canonical verb list. Four logical groups map onto the brief’s list / pin / absorb / prune quartet; the live surface uses different names but same semantics:
| Brief verb | Live verb(s) | What it does |
|---|---|---|
list | status, usage, list-archived | Read the skill stack and tally activity |
pin | pin, unpin | Mark a skill exempt from auto-transition |
absorb | archive, run --consolidate | Merge or move a skill into .archive/ (umbrella-build is opt-in) |
prune | prune, backup, rollback | Bulk archive by age; snapshot or restore the stack |
The other three verbs (pause, resume, restore) are operational handles. pause halts the scheduled run, resume re-enables it, restore undoes an archive (moves a skill back from .archive/ to active). Use --dry-run on run and prune to preview what would change before applying.
The 4 lint rules
Every curator pass reduces to one question per agent-created skill: does it pass lint? Four kinds of failure. Each rule produces a single verdict; the pin-vs-prune decision is made rule-by-rule, never in bulk.
Rule 1 — Orphan skill (no consumer)
A skill with use=0 and view=0 over its lifetime was never loaded by anything. Orphans are typically experiments the agent created and forgot, or scaffolding from a session that never shipped. Verdict: candidate to archive unless a pinned note declares it future-use.
Rule 2 — Stale skill (last_activity > 30d)
The curator marks a skill stale when last_activity is older than 30d. The status report shows the threshold inline: stale after: 30d unused. Pinned skills are exempt. The threshold and the archive threshold are different: a stale skill is just a flag; an archived skill has been moved to .archive/ and excluded from the system prompt. Stale is reversible with one command. Archived is reversible with restore.
Rule 3 — Oversized memory (MEMORY.md or USER.md over the per-profile cap)
Memory lint is not a curator job — it lives in memory_audit.sh and the nightly cron (30 0 * * *, job 81c7c004205e). But the curator’s weekly pass is the right place to react to memory pressure: if MEMORY.md is over 2,200 chars or USER.md is over 1,375 chars on this profile, route any candidate details from the skills audit into the next morning’s memory-shrink session instead of into a new skill. The weekly lint is the tripwire; the daily audit is the alarm.
Rule 4 — Duplicate fact (same content in skill + memory + fact_store)
The redundancy test from harness-self-maintenance runs once per flagged memory and once per flagged skill. If the same idea lives in three places, pick one and propose a replace or remove for the others. Two auto-detectors:
- Memory vs skill: run
skill_viewon the flagged skill; if the entry duplicates a memory line verbatim, the skill is the durable home and the memory line is the candidate forreplacewith a bare pointer. - Skill vs skill: the curator
run --consolidateflag (LLM-merge pass, opt-in) flags overlapping scopes. Default config hasconsolidate: off (prune-only)so this only fires when explicitly requested.
The 30-day staleness window
The 30-day window is a use it or lose it signal, not a hard cutoff. A skill last touched 35d ago is stale; a skill last touched 90d ago is auto-archived on the next run. The two thresholds differ on purpose:
30dstale = read-only flag. No state change. The skill keeps loading, but the curator report surfaces it as a candidate.90darchive = reversible move. The skill goes to.archive/, is excluded from the system prompt, and stops counting toward context budget.restore <name>reverses it in one command.
The interval: every 7d cadence and a 30d stale threshold give roughly 4 chances to act before auto-archive. Use the first stale report as the trigger, not the last.
The pin-vs-prune decision
For each flagged skill, run this in order:
- Is it in active use this week? Check
usagelast_activity. If yes — no decision needed; the next report clears it. - Was it pinned by a prior session?
statuslists pins. If yes — no decision needed; the curator leaves it alone. - Does any other skill depend on it?
search_files target=content pattern="<skill-name>" path=/opt/data/skillsfor cross-references. If a peer skill cites it as a reference, pin it (one-off dependency, not ongoing use). - Will this week’s work touch it? If yes —
unpinif already pinned, otherwise let the report resetlast_activity. - If none of the above:
pinonly if the next 30 days have a planned consumer.archiveonly if the skill is a duplicate of a working peer. Otherwise let the natural30d → 90darc take it.
Pinning is asymmetric: pin is cheap to add and a chore to remove. Default to letting flags expire unless the next-30d claim is concrete.
Worked example: a curator pass on this profile
The live status output at draft time (2026-07-14):
agent-created skills: 131 total
active 81
stale 49
archived 1
last summary: auto: 46 marked stale; llm: skipped (consolidation off)
Apply the rules to the five least-recently-active skills in the report:
| Skill | last_activity | Verdict | Action |
|---|---|---|---|
job-board-research | 35d ago | Stale (Rule 2) | Pin only if a research task is queued in the next 7d |
opencode | 29d ago | Active window — clear | No action |
woocommerce-hosted | 29d ago | Active window — clear | No action |
tui-session-lifecycle-not-found | 29d ago | Just under the threshold | No action this week |
obsidian | 29d ago | Active window — clear | No action |
One skill is in the 30d-35d band; the rest are still inside the 30d window. The pass this week is a no-op for skill state. The memory side is a different story: MEMORY.md is at 85% and USER.md is at 98% per the same week’s audit, so the weekly lint triggers a handoff to the next morning’s memory-shrink session (the daily-memory-audit-and-the-4-step-merge-plan playbook).
The 1 already-archived skill is a former peer that hit the 90d mark and was auto-moved. restore <name> would bring it back; the right question is whether any peer skill now overlaps its scope, and the curator’s run --consolidate (opt-in) would surface that answer. Run with --dry-run first.
Verification checklist
| # | Check | Command |
|---|---|---|
| 1 | Curator enabled and on schedule | hermes curator status |
| 2 | Stale threshold matches the rule | confirm stale after: 30d in status output |
| 3 | Auto-archive threshold matches the rule | confirm archive after: 90d in status output |
| 4 | Run cadence is weekly | confirm interval: every 7d in status output |
| 5 | Pin state visible | hermes curator status | grep -i pin |
| 6 | Preview before any bulk action | hermes curator prune --days 90 --dry-run |
| 7 | Archives list clean | hermes curator list-archived |
| 8 | Rollback target available | hermes curator rollback --help |
Last verified: 2026-07-15 against Hermes v0.18.2 (2026.7.7.2). Curator surface and thresholds verified via hermes curator --help and hermes curator status on this profile.



Submit a take
Have a different read on this? Drop a comment below — your email isn't published, and I read every one. Nothing leaves the site until I approve it.