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 Memory | MEMORY.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 |
