私は、ObsidianのVaultを複数のAI(Claude Code、Codex、ChatGPT、Gemini、Hermes、Ollama)が共有する共通の記憶として運用しています。
先日、Claude Codeとの会話の途中で入力した私からの命令が、Wikiに記録されていないことに気づきました。
毎朝のスクリプトは、会話IDがWiki内に存在するかどうかを基準に「未登録の会話一覧」を作成します。今回の会話は、前に別の内容を記録した時点で既に会話IDがWikiに存在していたため、一覧に載りませんでした。その結果、夜間にCodexが一覧からWikiへ書き足す処理の対象外となり、命令が記録されなかったのです。
この記事は、会話IDがWikiにあることは全発言が反映された証拠にならないという気づきと、その記録です。
環境
- 共通の記憶:ObsidianのVault。中身はMarkdownです。AIごとの記憶や会話履歴は、正本にしません。
- 会話の原本:Claude CodeとCodexの会話ログ(JSONL)。消さずに残します。
- 毎朝の自動処理:cronで、まだWikiに入っていない会話の一覧を作ります。LLMは使いません。
- 夜の統合:Codexが、その一覧の上から数件を原本で読み、Wikiの既存ページへ足します。
知識の流れは、次のとおりです。
AIとの会話(原本を残す)
↓ 毎朝、スクリプトが一覧を作る
まだWikiに入っていない会話の一覧
↓ 夜に、Codexが上から数件を原本で読む
Wiki(Obsidian)=次の会話・別のAIが読む共通の記憶
起きたこと
ある日、ある意見を、Claude Codeの会話に1回だけ伝えました。
あとで「その意見はWikiに入っているか」と探すと、入っていませんでした。探した結果は次のとおりです。
- Wiki全体を、意見の本文の言葉で検索:0件
- Codexの会話原本を、同じ言葉で検索:0件
- アプリの開発記録のフォルダ:2か所
意見は、貼ったClaude Codeの会話と、開発記録にだけありました。Wikiにも、Codexにも、渡っていませんでした。
原因
「まだWikiに入っていない会話」を決める処理は、次の形でした。内容は省いて書いています。
def wiki_ids():
ids = set()
for root, dirs, files in os.walk(WIKI):
for f in files:
if f.endswith(".md"):
ids.update(ID.findall(open(os.path.join(root, f)).read()))
return ids
known = wiki_ids()
for p in glob.glob("~/.claude/projects/*/*.jsonl"):
sid = os.path.basename(p)[:-6] # 会話のファイル名=会話ID
rows.append((sid in known, ...)) # Wikiのどこかに書いてあれば「入っている」
会話IDがWikiのどこかの.mdに1回でも書いてあれば、その会話は「入っている」と数えます。IDを書くのは、その会話から何かをWikiへ写したときです。長く続く会話ほど、IDが何度も書かれます。
原因は2つありました。
1. 判定の単位が「会話」だった
いまの仕組みでは、会話IDがWikiに書かれているかどうかで、取り込み済みかを判定しています。
そのため、会話IDがすでにWikiに書かれている会話では、そのあとに新しい発言が追加されても、取り込み待ちの一覧には出ません。
今回の意見は、会話IDがすでにWikiに書かれていた会話の途中で貼ったものでした。そのため、会話IDだけを見る今の判定では、新しい発言として検出できませんでした。
2. 処理が1日1回だった
毎朝1回、スクリプトが未登録の会話を調べ、夜にCodexが一覧の上から数件を原本で読んでWikiへ追加しています。
この仕組みでは、新しい情報がWikiに入るのは早くても翌日です。
その間、Wikiを読むほかのAIは、その新しい情報を知りません。既存のページと内容が食い違っていても、Wikiへ取り込まれるまでは確認できません。
直したこと
意見を、出典つきでWikiへ入れました。元の文をそのままコピーしてsourcesに置き、出どころとSHA-256を書いた一覧を付けました。要点はanalysisのページに書きました。
見直す方針(案・今後)
1. 新しい情報が出た時点で、取り込み待ちの一覧に追加する
会話全体をあとから探すのではなく、新しい情報が出た時点で取り込み待ちにします。
Claude Codeには、発言を送ったときに動くUserPromptSubmitと、返答が終わったときに動くStopのフックがあります。
2. 会話の区切りで、関連するWikiのページへ統合する
取り込み待ちになった内容は、会話の区切りで関連するページへ統合します。
そのとき、既存の記述と矛盾していないかも確認します。
KarpathyのLLM Wikiでは、新しい資料を取り込む時点で、既存のページと内容を比べる方式が使われています。
3. 全発言をWikiへ写さない
会話の原本はそのまま残します。
Wikiへ統合するのは、判断や行動を変える内容だけにします。
4. 毎朝の照合は残す
毎朝の照合は、取りこぼしがないかを確認するための点検として残します。
まだ確認できていないのは、次の2点です。
- どの発言を「取り込み待ち」にするかの基準
- 新しい情報が出るたびに処理を動かした場合の費用
分かったこと
- 会話IDがWikiにあるだけでは、その会話のすべての発言がWikiに入っている証拠にはなりません。
- 情報が入っているかどうかを確かめるときは、会話IDではなく、発言本文に含まれる言葉でWikiと各AIの原本を検索します。
- 1つのAIとの会話にだけ貼った情報は、ほかのAIには届きません。共通の記憶に入れるまでは、ほかのAIにとってその情報は存在しません。
- 1日1回のまとめ処理では、Wikiは新しい情報より遅れます。共通の記憶として使うなら、新しい情報が出た時点で取り込む設計にする必要があります。
出典
無料でできないことのうち、おもなものは3つです。ステレオ録音は1回5分・2件まで。モニターチェックの結果は3件まで。耳を鍛えるクイズは1日2セットまで。買い切り1,200円のフル版にすると、5分を超える本番も1本で録れます。結果は何件でも残せます。クイズも1日何セットでもできます。