guide · computers

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.

July 15, 2026 · By Alastair Fraser

A retro robot janitor standing before a tall skill filing cabinet, holding a clipboard that reads WEEKLY LINT; four colored bins beside the cabinet are labeled ORPHAN, STALE, OVERSIZED, DUPLICATE, with small pinned-card exceptions tacked to a separate board.

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 verbLive verb(s)What it does
liststatus, usage, list-archivedRead the skill stack and tally activity
pinpin, unpinMark a skill exempt from auto-transition
absorbarchive, run --consolidateMerge or move a skill into .archive/ (umbrella-build is opt-in)
pruneprune, backup, rollbackBulk 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_view on the flagged skill; if the entry duplicates a memory line verbatim, the skill is the durable home and the memory line is the candidate for replace with a bare pointer.
  • Skill vs skill: the curator run --consolidate flag (LLM-merge pass, opt-in) flags overlapping scopes. Default config has consolidate: 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:

  • 30d stale = read-only flag. No state change. The skill keeps loading, but the curator report surfaces it as a candidate.
  • 90d archive = 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:

  1. Is it in active use this week? Check usage last_activity. If yes — no decision needed; the next report clears it.
  2. Was it pinned by a prior session? status lists pins. If yes — no decision needed; the curator leaves it alone.
  3. Does any other skill depend on it? search_files target=content pattern="<skill-name>" path=/opt/data/skills for cross-references. If a peer skill cites it as a reference, pin it (one-off dependency, not ongoing use).
  4. Will this week’s work touch it? If yes — unpin if already pinned, otherwise let the report reset last_activity.
  5. If none of the above: pin only if the next 30 days have a planned consumer. archive only if the skill is a duplicate of a working peer. Otherwise let the natural 30d → 90d arc 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:

Skilllast_activityVerdictAction
job-board-research35d agoStale (Rule 2)Pin only if a research task is queued in the next 7d
opencode29d agoActive window — clearNo action
woocommerce-hosted29d agoActive window — clearNo action
tui-session-lifecycle-not-found29d agoJust under the thresholdNo action this week
obsidian29d agoActive window — clearNo 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

#CheckCommand
1Curator enabled and on schedulehermes curator status
2Stale threshold matches the ruleconfirm stale after: 30d in status output
3Auto-archive threshold matches the ruleconfirm archive after: 90d in status output
4Run cadence is weeklyconfirm interval: every 7d in status output
5Pin state visiblehermes curator status | grep -i pin
6Preview before any bulk actionhermes curator prune --days 90 --dry-run
7Archives list cleanhermes curator list-archived
8Rollback target availablehermes 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.

Sources

#hermes-agent#curator#lint#skills#memory#weekly-rubric#30-day#90-day

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.

Your email address will not be published. Required fields are marked.