私は、iPhoneアプリ「チェックワンツー - ハウリングチェック&アナライザー」を開発しています。App Storeのサブタイトルは「バンド練習の録音とサウンドチェック」です。
私は、ObsidianのVault(Obsidianで開くMarkdownファイルのフォルダ)を、複数のAI(Claude Code、Codex、ChatGPT、Gemini、Hermes、Ollama)が共有する共通の記憶(以下、Wiki)として運用しています。
先日、私がClaude Codeとの会話の途中で入力した命令が、Wikiに記録されていないことに気づきました。
毎朝のスクリプトは、会話ID(会話の記録ファイルの名前)がWiki内に存在するかどうかを基準に「未登録の会話一覧」を作成します。今回の会話は、前に別の内容を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へ入れました。意見の元の文をそのままコピーしてWikiのsourcesに置き、出どころとSHA-256(ファイルの内容から作る照合用の値)を書いた一覧を付けました。意見の要点は、Wikiのanalysisのページに書きました。
見直す方針(案・今後)
1. 新しい情報が出た時点で、取り込み待ちの一覧に追加する
私は、会話全体をあとから探すのではなく、新しい情報が出た時点で取り込み待ちにする方針です。
Claude Codeには、発言を送ったときに動くUserPromptSubmitと、返答が終わったときに動くStopのフックがあります。
2. 会話の区切りで、関連するWikiのページへ統合する
取り込み待ちになった内容は、会話の区切りで関連するページへ統合します。
そのとき、既存の記述と矛盾していないかも確認します。
出典に挙げたAndrej KarpathyのLLM Wikiでは、新しい資料を取り込む時点で、既存のページと内容を比べる方式が使われています。
3. 全発言をWikiへ写さない
会話の原本はそのまま残します。
Wikiへ統合する対象は、判断や行動を変える内容だけにします。
4. 毎朝の照合は残す
毎朝の照合は、取りこぼしがないかを確認するための点検として残します。
まだ確認できていないのは、次の2点です。
- どの発言を「取り込み待ち」にするかの基準
- 新しい情報が出るたびに処理を動かした場合の費用
分かったこと
- 会話IDがWikiにあるだけでは、その会話のすべての発言がWikiに入っている証拠にはなりません。
- 情報が入っているかどうかを確かめるときは、会話IDではなく、発言本文に含まれる言葉でWikiと各AIの原本を検索します。
- 1つのAIとの会話にだけ貼った情報は、ほかのAIには届きません。共通の記憶に入れるまでは、ほかのAIにとってその情報は存在しません。
- 1日1回のまとめ処理では、Wikiは新しい情報より遅れます。共通の記憶として使うなら、新しい情報が出た時点で取り込む設計にする必要があります。
出典
チェックワンツーを試す
この記事で紹介した複数AIでWikiを共有する仕組みで作っているアプリ「チェックワンツー」は、ご自身の現場でもすぐ試せます。
インストールは無料、会員登録も不要で、iPhoneの内蔵マイクだけで使えます。
フル版(買い切り1,200円・7日間無料体験あり)なら、5分を超える本番も1本で録れて何件でも残せるので、まずはApp Storeから試してみてください。
公式サイト(使い方とマニュアル)