Hermes Agentの手順はスキルへ残す|Memoryに作業手順を置かない

Hermes Agentの手順はスキルへ残す|Memoryに作業手順を置かない

MEMORY.md の上限は 2,200 文字です。デプロイのやり直し手順をここに置くと、天気の話でもその手順が毎回の入力へ乗ります。手順はスキルへ残します。開始時に乗るのは短い索引だけです。

2026 年 9 月 20 日、Hermes Agent v0.21.0 の一時環境で確認しました。スキル本文は 424 バイトでも、索引は 111 文字でした。同じ手順を MEMORY.md へ置くと、prompt-size 上は 361 文字になりました。本番の home は使っていません。

前回の会話検索から、手順の置き場へ進む

前回の「Hermes Agentの過去会話をFTS5で探す」では、毎回使う事実と、過去の発言を分けました。今回は、作業で固まった手順を Memory へ書かない方法を実測します。

時点確認できる範囲
前回完了時事実は Memory、発言は session_search へ分けられます
今回開始時手順を Memory に置くと、関係ない会話まで重くなる点が未確認です
今回完了後60文字の説明、索引の実測、手書きスキルの adopt と pin を区別できます

役割の分担だけ知りたい場合は「なぜ手順を Memory に置かないのか」まで読めば足ります。コマンドだけ必要なら「一時環境を用意する」から進めます。curator の対象だけ知りたい場合は「手書きスキルは自動では手入れされない」へ進みます。

なぜ手順を Memory に置かないのか

MEMORY.md と USER.md は、セッション開始時に system prompt へ入ります。公式の上限は Memory が 2,200 文字、User Profile が 1,375 文字です。どちらも毎回の固定費です。

スキルは違います。会話開始時に乗るのは名前と説明の索引です。本文は、仕事が該当したときだけskill_viewで読みます。公式はこれを progressive disclosure と呼んでいます。agentskills.io の Skill 形式とも同じ向きです。

私は次の分岐で扱います。

毎回使う事実          → Memory(開始時に読む)
口調と姿勢            → SOUL.md
作業の手順            → Skill(索引だけ常時、本文は必要時)
過去の発言            → session_search
プロジェクト固有の規則 → AGENTS.md など

手順を Memory に置くと、容量を食うだけではありません。関係ない相談でも、その手順が入力に残ります。人格の話でデプロイ手順が混ざるのは、私には失敗です。

新しいスキルの説明は 60 文字以内です。索引は 57 文字で切り、末尾に...を付けます。長い説明だと、いつ使うかが途中で切れます。詳細は本文へ移します。

用語を揃える

用語この回での意味
Skill必要な仕事のときだけ読む手順です。SKILL.mdが本体です
索引開始時に乗る名前と説明です。本文はまだ読みません
skill_manageエージェントがスキルを作る、直す、消す tool です
skill_viewスキル本文や references を必要時に読む tool です
curatorエージェントが作ったスキルを、放置しないための手入れです
adopt手書きや会話で作ったスキルを、curator の対象へ渡す操作です
pin自動の stale や archive から、そのスキルを外す印です
.no-bundled-skills同梱スキルを流し込まない印です。検査用の空の home で使います
MEMORY.md毎回必要な少数の事実です。手順の置き場ではありません

開始時に乗るものと、後から読むもの

セッション開始

    ├─ SOUL.md(人格)
    ├─ Skills の索引(名前と 60 文字以内の説明)
    ├─ AGENTS.md など(その作業場所の規則)
    └─ MEMORY.md / USER.md(事実と好み)


      モデルへ渡す入力

            ├─ 仕事がスキルに当たる → skill_view で本文を読む
            └─ 当たらない         → 本文は読まない

本文が 424 バイトでも、当たるまで入力には乗りません。Memory に同じ手順を置くと、当たらない仕事でも乗ります。

一時環境を用意する

本番の Hermes home は使いません。同名の directory がある場合は上書きせず止めます。

LAB=/tmp/hibanas-skill-after-task-lab-20260920
[ ! -e "$LAB" ] || {
  printf 'already exists: %s\n' "$LAB"
  exit 1
}
mkdir -p "$LAB"
export HERMES_HOME="$LAB"
touch "$LAB/.no-bundled-skills"

今回の実機はHermes Agent v0.21.0 (2026.8.31)でした。version を先に読みます。

hermes --version

先頭は次のとおりでした。

Hermes Agent v0.21.0 (2026.8.31) · upstream baf7ceea · local 1068df60 (+1 carried commit)

.no-bundled-skillsが無いと、空の home でも同梱スキルが流れ込みます。検査では 1 件だけを見るため、印を先に置きます。

長い説明は新規作成で止まる

Install directory はhermes --versionの該当行を使います。ユーザー名付きの絶対パスはコマンドへ埋めません。

install_dir=$(hermes --version | awk -F': ' '/^Install directory:/{print $2}')
PYTHONPATH="$install_dir" python3 - <<'PY'
import os
from tools.skill_manager_tool import _validate_frontmatter
from agent.skill_utils import SKILL_PROMPT_DESC_LIMIT

print("SKILL_PROMPT_DESC_LIMIT", SKILL_PROMPT_DESC_LIMIT)

long_desc = (
    "Use when restarting staging after a failed deploy, "
    "including health checks, rollback, and log collection for the on-call."
)
print("long_desc_len", len(long_desc))
long_skill = f"""---
name: lab-staging-restart
description: {long_desc}
---

# Staging restart

Restart staging after a failed deploy.
"""
print("NEW_LONG", _validate_frontmatter(long_skill, new_skill=True))
print("EDIT_LONG", _validate_frontmatter(long_skill, new_skill=False))
PY

実測は次のとおりでした。

SKILL_PROMPT_DESC_LIMIT 60
long_desc_len 121
NEW_LONG Description is 121 chars — new skills must fit the 60-char system-prompt budget (one sentence, trigger first, ends with a period). The skill index truncates longer descriptions to 57 chars + '...', destroying the routing signal. Move detail into the skill body.
EDIT_LONG None

新規作成だけが 60 文字を強制します。既存スキルの修正は、長い説明のまま直せます。直すときは説明を短くする機会です。私は新規の時点で切ります。

短い説明のスキルを置く

検査用のスキルは、staging の再起動だけを扱います。本番手順ではありません。

install_dir=$(hermes --version | awk -F': ' '/^Install directory:/{print $2}')
PYTHONPATH="$install_dir" python3 - <<'PY'
from pathlib import Path
import os
from tools.skill_manager_tool import _validate_frontmatter

good_desc = "Restart staging after a failed deploy."
print("good_desc_len", len(good_desc))
good_skill = f"""---
name: lab-staging-restart
description: {good_desc}
---

# Staging restart

## When to Use
Use after a staging deploy fails a health check.

## Procedure
1. Read the last deploy log.
2. Restart the staging process.
3. Confirm the health endpoint returns 200.

## Pitfalls
- Do not restart production.
- Do not copy this procedure into MEMORY.md.

## Verification
Health check returns HTTP 200.
"""
print("NEW_GOOD", _validate_frontmatter(good_skill, new_skill=True))
lab = Path(os.environ["HERMES_HOME"])
skill_dir = lab / "skills" / "ops" / "lab-staging-restart"
skill_dir.mkdir(parents=True, exist_ok=True)
(skill_dir / "SKILL.md").write_text(good_skill, encoding="utf-8")
print("skill_chars", len(good_skill))
PY
good_desc_len 38
NEW_GOOD None
skill_chars 424

説明は 38 文字です。60 文字に収まっています。本文は 424 バイトです。ここへ手順、落とし穴、確認方法を置きます。

会話の中で残すときはskill_manageの create を使います。今回は検査のため、同じ形式のファイルを直接書きました。どちらもSKILL.mdです。出典は会話でも、手書きでも、索引の形は同じです。

索引に 1 件だけ載るか確認する

hermes skills list --source local
                      Installed Skills
Name                 Category  Source  Trust  Status
lab-staging-restart  ops       local   local  enabled
0 hub-installed, 0 builtin, 1 local — 1 enabled, 0 disabled

local が 1 件です。同梱スキルは 0 件です。印が効いています。

開始時の固定費を測ります。API は呼びません。

hermes prompt-size --json

関係する値だけ抜き出すと、次のとおりでした。

skills_index.chars          111
memory.chars                  0
lab-staging-restart
  index_line_bytes           65
  skill_md_bytes            424

本文 424 バイトに対し、索引の 1 行は 65 バイトです。スキル全体の索引は 111 文字です。Memory はまだ空です。

同じ手順を MEMORY.md へ置くと、固定費の付き方が変わります。

python3 - <<'PY'
from pathlib import Path
import os
lab = Path(os.environ["HERMES_HOME"])
text = (
    "Staging restart: after a failed deploy, read the last deploy log, "
    "restart the staging process, confirm the health endpoint returns HTTP 200. "
    "Do not restart production. Keep this procedure out of MEMORY.md next time."
)
(lab / "memories").mkdir(exist_ok=True)
(lab / "memories" / "MEMORY.md").write_text(text, encoding="utf-8")
print("memory_file_chars", len(text))
PY
hermes prompt-size --json
memory_file_chars  215
memory.chars       361
skills_index.chars 111

ファイルは 215 文字でも、prompt-size 上の Memory は 361 文字でした。見出しや区切りが乗ります。スキルの索引は 111 文字のままです。手順を Memory へ移しても、索引は減りません。減るのは、手順をスキル側へ置いたときだけです。

検査のあと、この MEMORY.md は消して構いません。本番の記憶へは書きません。

手書きスキルは自動では手入れされない

curator は、放置されたスキルを stale から archive へ移します。デフォルトでは 7 日ごとに、30 日未使用で stale、90 日未使用で archive です。LLM でまとめる consolidate はオフです。消す処理はありません。archive は戻せます。

ただし対象は、エージェントが作ったと印の付いたスキルです。手書きのSKILL.mdは対象外です。会話でskill_manageの create を使ったスキルも、利用者の指示として扱われ、自動では触れません。

hermes curator status
hermes curator list-unmanaged

スキルを置いた直後は、次のとおりでした。

curator: ENABLED
  runs:           0
  last run:       never
  interval:       every 7d
  stale after:    30d unused
  archive after:  90d unused
  consolidate:    off (prune-only; LLM merge pass opt-in)

no curator-managed skills

unmanaged (no provenance marker): 1 total
  pre-dates marker    1
  foreground-created  0
unmanaged skills (1):
  lab-staging-restart                          activity=   0  last_activity=never           (no marker)

手書きなのでpre-dates markerです。会話で作った場合はforeground-createdになります。どちらも、渡すまで curator は触れません。

定期処理から使うスキルや、残したい手順は、対象へ渡してから pin します。

hermes curator adopt lab-staging-restart
hermes curator pin lab-staging-restart
hermes curator status
curator: adopted 'lab-staging-restart' into curator management
curator: pinned 'lab-staging-restart' (will bypass auto-transitions)
curator-managed skills: 1 total  (agent-created=1  bundled=0)
  active     1
  stale      0
  archived   0

pinned (1): lab-staging-restart

adopt は印を付けるだけです。未使用日数はリセットしません。長く触っていない手順を渡すと、次の回で stale や archive へ進むことがあります。残すつもりなら pin を先にします。

私は、毎回使う事実だけを Memory へ残します。手順はスキルへ残し、残したいものだけ pin します。狭い手順が増えたら、公式の curator に任せます。まとめの LLM 処理は、費用が見えてからにします。

一時環境を片付ける

marker 代わりに、今回作ったパスだけを消します。別のパスなら止めます。

case "$LAB" in
  /tmp/hibanas-skill-after-task-lab-20260920)
    test -f "$LAB/skills/ops/lab-staging-restart/SKILL.md"
    ;;
  *)
    printf 'unexpected LAB path\n' >&2
    exit 1
    ;;
esac

rm -rf -- "$LAB"
unset HERMES_HOME
test ! -e "$LAB" && printf 'cleanup: OK\n'

この cleanup は記事用の一時 home 向けです。本番 home では実行しません。

よくあるエラー

症状原因対応
新規作成が 60 文字超で止まる索引が 57 文字で切れるためですいつ使うかを先に書き、詳細は本文へ移します
既存スキルの長い説明は直せる新規だけが 60 文字を強制します直すときに説明を短くします
空の home に同梱スキルが増える.no-bundled-skillsが無いためです検査では印を先に置きます
curator の件数が 0 件です手書きや会話作成は対象外ですlist-unmanagedを見て、残すものだけ adopt します
渡した直後に stale になるadopt は未使用日数をリセットしません残すスキルは pin します
関係ない会話が重い手順を MEMORY.md へ書いたためです手順はスキルへ移し、Memory には事実だけ残します
本番のスキルが変わるHERMES_HOME を向けていません検査は一時 directory で行い、本番 home は使いません

出典

資料確認した内容
Hermes Agent Skills System索引と本文の読み分け、説明の 60 文字、skill_manage
Hermes Agent Curator対象の印、adopt、pin、stale と archive、consolidate はオフ
Hermes Agent Persistent MemoryMEMORY.md 2,200 文字、USER.md 1,375 文字、開始時の固定読み込み
Which File Does What?SOUL.md、Memory、プロジェクト規則の分担
Agent Skills 仕様SKILL.md の公開形式
一時directoryの実測説明 38 文字、本文 424 バイト、索引 111 文字、Memory 361 文字、adopt と pin
この記事をシェア