
OpenClaw
のワークスペースには SOUL.md、USER.md、MEMORY.md、AGENTS.md、TOOLS.md など複数の設定ファイルがあります。それぞれ何を書くべきか、どう使い分けるかを整理します。
「Memory as Documentation」という考え方
OpenClawの設定ファイル群は「Memory as Documentation」という設計思想に基づいています。AIエージェントのメモリを「隠れたシステム状態」ではなく、人間が読めて編集できるMarkdownファイルとして扱うアプローチです。
面白いのは、Claude Code や、Meta が買収した Manus を含め、別々のプロジェクトが独立して「ファイル中心」に収束していることです。
「ベクトルDB(ベクトルデータベース: 意味の近さで検索できるDB)を用意してRAG(Retrieval-Augmented Generation: 検索で文脈を補って生成する手法)を組む」より、まずはファイルで運用しやすくする。この割り切りが現場では強い、という話だと思っています。
| プロジェクト | メモリ設計 |
|---|---|
| Manus | task_plan.md + notes.md + 成果物ファイル |
| OpenClaw | MEMORY.md + memory/YYYY-MM-DD.md + SOUL.md |
| Claude Code | CLAUDE.md 階層 + .claude/MEMORY.md + Skills |
生物学でいう「収斂進化」——環境が違う生物が同じ形質を獲得する現象——に似ています。それぞれ独立して開発されたのに、だいたい同じ答えに辿り着いている。これは偶然ではなく、ファイル中心の設計が実用上の問題を解決しているからだと思います。
ベクトルDBと比べると、ファイルベースのメモリには明確なトレードオフがあります。
| 観点 | ファイルベース | ベクトルDB |
|---|---|---|
| デバッグ | ファイルを開いて読む | DB検査ツールが必要 |
| 編集 | テキストエディタで直接修正 | スクリプト/API経由 |
| バージョン管理 | Gitでそのまま管理 | 外部DBとの同期が困難 |
| コスト | ローカルディスク(ほぼ無料) | マネージドDB(高額になりがち) |
| スケール | 〜5MB程度まで実用的 | 数百万レコードも可能 |
個人利用や小規模なエージェント運用なら、ファイルベースで十分なケースが多いです。
ポイントは「ファイルに書く」こと自体ではなく、どの情報を、どのファイルに、どれくらいの粒度で置くかです。
ここをミスると、結局「巨大な1枚の設定ファイル」になって、毎回コンテキストがブレたり、トークン(LLMの入力文字数換算)の消費が増えたりします。
ワークスペースの全体像
OpenClawのワークスペースは、エージェントの「ホーム」です。デフォルトでは ~/.openclaw/workspace に配置されます。
~/.openclaw/
├── openclaw.json # 設定ファイル(ワークスペース外)
├── credentials/ # OAuth/APIキー(ワークスペース外)
├── agents/<id>/sessions/ # セッション履歴(ワークスペース外)
└── workspace/ # ← ここがワークスペース
├── AGENTS.md # 動作指示
├── SOUL.md # 人格・価値観
├── USER.md # ユーザー情報
├── IDENTITY.md # エージェントの名前・雰囲気
├── TOOLS.md # ツール利用ガイダンス
├── MEMORY.md # 長期記憶(オプション)
├── HEARTBEAT.md # 定期実行チェックリスト(オプション)
├── BOOT.md # 起動時チェックリスト(オプション)
├── BOOTSTRAP.md # 初回セットアップ用(完了後削除)
├── memory/ # 日次ログ
│ ├── 2026-02-18.md
│ └── 2026-02-19.md
├── skills/ # ワークスペース固有スキル(オプション)
└── canvas/ # Canvas UI用(オプション)
重要なのは、ワークスペースと設定ファイルは別の場所にあることです。~/.openclaw/openclaw.json(設定)や ~/.openclaw/credentials/(認証情報)はワークスペースの外にあり、Gitで管理するワークスペースには含めません。
公式ドキュメントによると、ワークスペースはデフォルトの作業ディレクトリ(cwd)であり、ハードなサンドボックスではありません。相対パスはワークスペースを基準に解決されますが、絶対パスは他の場所にもアクセスできます。隔離が必要な場合は agents.defaults.sandbox を有効にします。
ファイル一覧と役割
公式ドキュメント に基づいて、各ファイルの役割を整理します。
自動生成 vs カスタマイズ
初回起動時(ブートストラップ)で、OpenClawは対話形式でいくつかのファイルを自動生成します。
| ファイル | 生成方法 | カスタマイズ |
|---|---|---|
AGENTS.md | テンプレートから自動生成 | 運用ルールを追記・編集 |
IDENTITY.md | Q&A形式で対話的に生成 | 基本的にそのまま |
USER.md | Q&A形式で対話的に生成 | 好みを追記・編集 |
SOUL.md | Q&A形式で対話的に生成 | 行動原則を追記・編集 |
TOOLS.md | 空または最小テンプレート | 環境に合わせて自分で書く |
BOOTSTRAP.md | 自動生成(完了後削除) | 触らない |
MEMORY.md | 自動生成されない | 自分で作成・運用 |
memory/*.md | エージェントが自動作成 | 必要に応じて編集 |
ポイント:
IDENTITY.md: ブートストラップのQ&Aで「名前は?」「雰囲気は?」と聞かれて生成される。基本的に変更不要SOUL.md: 同じくQ&Aで生成されるが、運用しながら行動原則を追記していくTOOLS.md: 自動生成されないか最小限。自分の環境に合わせて書く必要があるMEMORY.md: 自動生成されない。長期記憶が必要になったら自分で作成する
ブートストラップを飛ばして自分でファイルを管理したい場合は、設定で agent.skipBootstrap: true を指定します。
毎セッション読み込まれるファイル
| ファイル | 役割 | 書くべき内容 |
|---|---|---|
AGENTS.md | 動作指示 | 優先順位、ワークフロー、品質基準、メモリの使い方 |
SOUL.md | 行動原則 | 価値観、境界線、判断基準(「どう振る舞うか」) |
USER.md | ユーザー情報 | 呼び方、好み、前提知識 |
IDENTITY.md | 自己紹介 | 名前、種族、雰囲気、絵文字、アバター(「誰か」) |
TOOLS.md | ツールガイダンス | ローカル環境の特性、危険なコマンドの注意 |
メモリ関連
| ファイル | 役割 | 書くべき内容 |
|---|---|---|
MEMORY.md | 長期記憶 | 重要な決定、永続的な事実、学んだ教訓 |
memory/YYYY-MM-DD.md | 日次ログ | その日の作業記録、一時的なメモ |
MEMORY.md はプライベートセッションでのみ読み込まれ、グループコンテキストでは読み込まれません。これはセキュリティ上の配慮です。
オプション
| ファイル | 役割 | 書くべき内容 |
|---|---|---|
HEARTBEAT.md | 定期実行用 | 短いチェックリスト(トークン節約のため簡潔に) |
BOOT.md | 起動時実行 | Gateway再起動時のチェックリスト(内部フックが有効な場合のみ) |
skills/ | ワークスペース固有スキル | bundled/managedスキルを上書き |
canvas/ | Canvas UI | canvas/index.html など |
ブートストラップファイルが大きすぎると自動的に切り詰められます(デフォルト: 1ファイル20,000文字、合計150,000文字)。HEARTBEAT.md や BOOT.md は特に短く保つことが推奨されています。
2層構造の設計
OpenClaw の設定ファイルは、きれいに整理すると大きく2層に分かれます。
flowchart TB
subgraph P[個人化層(Personalization Layer)]
SOUL[SOUL.md\n価値観・制約・判断基準]
USER[USER.md\nユーザーの好み・前提]
IDENTITY[IDENTITY.md\n名前・雰囲気・絵文字]
TOOLS[TOOLS.md\nツール利用の作法]
end
subgraph R[記憶層(Remembrance Layer)]
AGENTS[AGENTS.md\n優先順位・ワークフロー]
MEMORY[MEMORY.md\n圧縮した長期記憶]
DAILY[memory/YYYY-MM-DD.md\n日次ログ]
end
P --> R
記憶層(Remembrance Layer)
エージェントが「何を知っているか」を管理する層。
MEMORY.md — 長期記憶。セッションをまたいで保持したい重要な情報を書きます。重要な決定とその理由、繰り返し参照する前提、ハマりポイントの再発防止など。
ここは生ログではなく「圧縮・整理された知識」として維持するのがポイントです。後述しますが、これをやらないと memory/ の日次ログが肥大化して、検索も読み戻しも辛くなります。
memory/YYYY-MM-DD.md — 日次ログ。その日の作業記録、会話の要点、気づきなどを書きます。「雑に書いても良い場所」です。OpenClawは今日と昨日のログを自動的に読み込み、古いログは必要に応じて検索します。
AGENTS.md — 動作指示。優先順位、ワークフロー、品質基準など「どう動くか」の契約書です。ここに書くのは「毎回守ってほしい運用ルール」です。一時タスクや今日だけの事情は、ここではなく日次ログに逃がします。
個人化層(Personalization Layer)
エージェントが「どんな存在か」を定義する層。
IDENTITY.md — 「誰か」を定義するメタデータ。名前、種族(AI? ロボット? 使い魔?)、雰囲気(シャープ? 温かい?)、絵文字、アバター画像のパスなど。初回セットアップ時に決めて、基本的には変えません。
SOUL.md — 「どう振る舞うか」を定義する行動原則。公式テンプレートには「意見を持て」「信頼は能力で勝ち取れ」「プライベートは守れ」といった指針が書かれています。運用しながら進化させるファイルです。
IDENTITY.md が「名刺」なら、SOUL.md は「行動規範」です。
USER.md — ユーザープロファイル。コミュニケーションのトーン、出力フォーマットの好み、既知の制約などを書きます。エージェントの振る舞いをユーザーに合わせるためのパーソナライズ設定です。
TOOLS.md — ツール利用のガイダンス。ホスト環境の特性、パス規約、エイリアス、危険なコマンドの注意事項などを書きます。ツールの定義ではなく、「どう使ってほしいか」の指示書です。どのツールが使えるかはシステム側が決めます。
ここまでを一言でまとめると、
SOUL.md、USER.md、IDENTITY.mdは「人格(identity)」MEMORY.mdとmemory/は「記憶(memory)」AGENTS.mdは「運用(operations)」TOOLS.mdは「環境(environment)」
です。
よくある混同パターン
設計を理解してから振り返ると、自分が最初にやっていたミスがいくつかあります。
SOUL.md に一時タスクを書く
「今週中に〇〇を調べる」みたいな内容を SOUL.md に書くと、エージェントの挙動が不安定になりがちです。SOUL.md は「変わらない性質」を定義する場所なので、タスクは日次ログか別の作業メモに置く方が安全です。
MEMORY.md を会話ログ代わりに使う
MEMORY.md に生の会話ログを貼り付けると、すぐに肥大化してコンテキストを圧迫します。ここに書くのは「圧縮された知識」であって、ログではありません。ログは memory/YYYY-MM-DD.md の役割です。
AGENTS.md に個人の好みを書く
「返答は短めにして」「日本語で答えて」のような個人の好みは USER.md に書きます。AGENTS.md はプロジェクト全体のルールを書く場所で、個人設定と混在させると管理が難しくなります。
TOOLS.md でツールを定義しようとする
TOOLS.md はツールの定義ファイルではありません。どのツールが使えるかはシステム側が決めます。TOOLS.md に書くのは「このコマンドは危険なので確認してから実行して」のような利用ガイダンスです。
最小構成(これだけでまず破綻しない)
いきなり完璧なテンプレを作ろうとすると、たぶん挫折します。自分の場合、まずは「空にしない」だけでだいぶ改善しました。
SOUL.md: 価値観と「やらないこと」だけ書くUSER.md: 出力フォーマットの好みだけ書くAGENTS.md: 破壊的操作の扱いと、作業の進め方(調査→提案→実行)だけ書くMEMORY.md: 「プロジェクトで繰り返し参照する前提」だけ書くmemory/YYYY-MM-DD.md: 雑に書く(今日の作業ログ)
これで「毎回読み込むべき薄い層」と「日々増える層」が分離できます。
実際の設定例
ここからはコピペして使える形で載せます(Markdownなので、そのまま置けます)。
IDENTITY.md
「誰か」を定義するメタデータです。初回セットアップ時に決めます。
| |
SOUL.md
「どう振る舞うか」を定義する行動原則です。運用しながら更新します。
| |
USER.md
| |
AGENTS.md
| |
TOOLS.md
| |
MEMORY.md
| |
memory/*.md の運用と自動フラッシュ
日次ログは放置すると30日分のログが蓄積されて、コンテキストを圧迫します。ファイルベースの設計でも、ここをサボると普通に破綻します。
自動メモリフラッシュ(pre-compaction ping)
OpenClawには「セッションがコンテキスト圧縮に近づいたとき、自動的にメモリを書き出す」機能があります。
仕組みはこうです:
- セッションのトークン数が閾値に近づく
- OpenClawが「サイレントなエージェントターン」を発火
- モデルに「永続的なメモリを今書き出せ」とリマインド
- モデルが
memory/YYYY-MM-DD.mdに書き込む(またはNO_REPLYで何もしない) - その後、通常のコンテキスト圧縮が実行される
この動作は agents.defaults.compaction.memoryFlush で制御できます。
| |
注意点:
- サンドボックスモードで
workspaceAccess: "ro"または"none"の場合、フラッシュはスキップされます - 1回のコンパクションサイクルにつき1回だけフラッシュが実行されます
追加のメモリパス
ワークスペース外のMarkdownファイルもインデックスに含めたい場合は、extraPaths を設定します。
| |
自分は Obsidian のノートディレクトリを追加しています。パスは絶対パスまたはワークスペース相対パスで指定でき、ディレクトリを指定すると再帰的に .md ファイルがインデックスされます。
ベクトル検索とハイブリッド検索
OpenClawは MEMORY.md と memory/*.md に対してベクトルインデックスを構築し、セマンティック検索を可能にします。
デフォルト動作
- ベクトル検索はデフォルトで有効
- ファイル変更を監視(デバウンス付き)
- リモート埋め込み(OpenAI、Gemini、Voyage)またはローカル埋め込み(node-llama-cpp)を使用
- sqlite-vec が利用可能な場合、SQLite内でベクトル検索を高速化
プロバイダの自動選択順序:
local—memorySearch.local.modelPathが設定されていてファイルが存在する場合openai— OpenAI APIキーが解決できる場合gemini— Gemini APIキーが解決できる場合voyage— Voyage APIキーが解決できる場合- それ以外 — 設定されるまで無効
ハイブリッド検索(BM25 + ベクトル)
OpenClawはベクトル検索とBM25(キーワード検索)を組み合わせた「ハイブリッド検索」をサポートしています。
なぜハイブリッドか?
ベクトル検索は「意味が近いもの」を見つけるのが得意:
- 「Mac Studio gateway host」と「ゲートウェイを動かしているマシン」
でも、正確なトークンには弱い:
- ID(
a828e60) - コードシンボル(
memorySearch.query.hybrid) - エラー文字列
BM25は逆で、正確なトークンに強く、言い換えに弱い。ハイブリッド検索は両方の信号を使います。
| |
MMR(多様性)と時間減衰(新しさ優先)
検索結果の後処理として、2つのオプション機能があります。
MMR(Maximal Marginal Relevance): 類似した結果を減らし、多様性を確保
日次ログで同じトピックを繰り返し書いていると、検索結果が似たような内容ばかりになりがちです。MMRを有効にすると、関連性と多様性のバランスを取ります。
| |
lambda は 0(最大多様性)から 1(最大関連性)の間で設定します。
時間減衰: 古いメモリのスコアを下げ、新しいメモリを優先
| |
半減期30日の場合:
- 今日のノート: 100%
- 7日前: 約84%
- 30日前: 50%
- 90日前: 12.5%
MEMORY.md や日付のないファイル(memory/projects.md など)は「エバーグリーン」として減衰しません。
Gitでワークスペースをバックアップする
公式ドキュメントでは、ワークスペースをプライベートGitリポジトリでバックアップすることを推奨しています。
初期化
| |
リモート追加(GitHub CLI)
| |
継続的な更新
| |
コミットしてはいけないもの
プライベートリポジトリでも、以下は含めないでください:
- APIキー、OAuthトークン、パスワード
~/.openclaw/配下のファイル(設定、認証情報、セッション)- 生のチャットダンプや機密添付ファイル
推奨 .gitignore:
.DS_Store
.env
**/*.key
**/*.pem
**/secrets*
「エージェントの記憶」をレビューする
ファイルベースの良さは、git diff でメモリの変化をレビューできることです。
| |
「記憶を編集できる」だけでなく、「記憶の変更をレビューできる」のが、Memory as Documentation の地味に強いところだと思います。
別マシンへの移行
ワークスペースを別のマシンに移行する手順:
- Gitリポジトリをクローン(デフォルト:
~/.openclaw/workspace) ~/.openclaw/openclaw.jsonでagents.defaults.workspaceを設定openclaw setup --workspace <path>で不足ファイルを補完- セッション履歴が必要なら、
~/.openclaw/agents/<id>/sessions/を別途コピー
実用的な小ネタ: 「残す情報」を自分で昇格させる
エージェントに任せるだけだと、たまに「残すべき情報が MEMORY.md に入らない」ことが起きます。
個人的には、日次ログに KEEP: を付けておいて、あとで自分で MEMORY.md に昇格させる運用が一番安定します。
日次ログへの書き方(例):
| |
この KEEP: 行だけをまとめて MEMORY.md に追記するミニスクリプトを置いておくと便利です。
目的: memory/ から「長期記憶」を手で引っこ抜く
前提: Python 3.10+
確認: MEMORY.md の末尾に KEEP: が追記される
| |
まとめ
ファイルの役割を整理すると、設計の意図が見えてきます。
| ファイル | 役割 | 読み込みタイミング |
|---|---|---|
IDENTITY.md | 「誰か」(名前・種族・雰囲気・絵文字) | 毎セッション |
SOUL.md | 「どう振る舞うか」(価値観・境界線・判断基準) | 毎セッション |
USER.md | ユーザーへの適応(好み・スタイル) | 毎セッション |
AGENTS.md | 動作のルール(優先順位・ワークフロー) | 毎セッション |
TOOLS.md | ツール利用のガイダンス(環境・注意事項) | 毎セッション |
MEMORY.md | 圧縮された長期記憶(重要な決定・教訓) | プライベートセッションのみ |
memory/YYYY-MM-DD.md | 日次の作業ログ | 今日+昨日を自動読み込み |
「全部 AGENTS.md に書けばいいじゃん」と思っていた自分には、この分離が最初は冗長に見えました。でも実際に使い続けると、責務が分かれていることで「どこを直せばいいか」が明確になります。挙動がブレたら SOUL.md を見る、個人設定を変えたければ USER.md を編集する、という具合に。
Manus・Claude Code・OpenClaw が独立して似た設計に辿り着いたのは、この「透明で編集可能なメモリ」という考え方が、実用上の問題を解決しているからだと思います。ベクトルDBが不要というわけではなく、「まずはファイルで十分」という判断が多くのケースで正しい、ということなんでしょう。
次のアクションとしては、
SOUL.mdを「変わらない制約」だけに削ってみる- 日次ログに
KEEP:を付けて、MEMORY.mdに昇格させる運用を始める git diffでメモリの変更をレビューする- ハイブリッド検索や時間減衰を試してみる
あたりが手を動かしやすいと思います。