この記事は、連載「読まない技術」の第 7 回です。うまくいかない症状と、その対処を一つずつ並べています。各回はファイルやスクリプトを一つ置けば完結します。その仕組みがなぜ要るのかは、置いたあとに解説を読めば分かります。連載の全体像と各回の一覧は序論にあります。

今回は、並列で走るセッション(AIとの、始まりから終わりまで一続きのやり取り)が共有するメモリの話です。AIは保存したがるので、共有メモリには、どのセッションからも書き込みが届きます。私は第 2 回で置いた保存後のhookを、このメモリにも置きました。するとhookが返す差分に、別のセッションの書き込みが混ざりました。

チームでは、複数のメンバーがそれぞれ複数のセッションを走らせ、全員のAIが同じメモリに書き込みます。第 2 回で見たとおり、AIは保存したがるので、メモリが増える速さは、一人が一つのセッションで使うときの、人数 × セッション数倍です。そこで、メモリへ保存する入口を一つに絞り、保存のたびにあなたが承認するようにしても、承認した保存は、その入口を通ってメモリに加わります。別のセッションの保存が通るのは、その入口の外です。共有メモリは、入口を一つに絞っても増え続けます。

CC BY 4.0

共有メモリでは、差分が誰の書き込みか分からない

舞台は typingtube という個人運営の Web サービス(YouTube の音楽動画でタイピング練習ができます)で、メンバーは私一人です。それでも私は複数のセッションを並列で走らせるので、チームと同じ症状が出ました。

第 2 回の保存後のhookは、保存が済んだ直後に、実ファイルとスナップショットを比べて、足された行をAIに返します。共有メモリでは、そのあいだに、別のセッションが同じファイルに書き込みます。私の手元でも、hookが返す差分に、並列で走っていた別のセッションの書き込みが混ざりました。hookが比べているのは実ファイルとスナップショットなので、その差分から分かるのは、どの行が増えたかだけです。AIから見ると、自分の書き込みも別のセッションの書き込みも、同じ形で届きます。

もう一つ、共有メモリへの保存は、セッションの終わり際に起きることが多いです。私がAIに打つ2文目「ここまで不足点はないですか?確認して不足点がなければ次のセッションに引き継いでください」で、AIは、引き継ぎのためにメモリへ保存します。保存後のhookがAIに差分を返すのは、ツールの実行が済んだ直後です。そのあとAIが最終応答を書いてセッションを終えることを、このhookは止めません。差分についての報告が最終応答に無ければ、保存は済んでいるので、誰も気づきません。

共有メモリは、入口を一つに絞っても増え続け、保存後のhookが返す差分には、別のセッションの書き込みが混ざります。この症状に、あなたなら次のどちらで対処しますか。

  • 保存のたびに、あなたが承認する
  • 保存後のhookが、差分が自分の書き込みかをAIに確かめさせ、報告しないまま終わろうとしたら一度だけ止める

答えは、保存後のhookに確かめさせるほうです。あなたが承認することができるのは、あなたのセッションの保存だけです。別のセッションの保存は、その承認を通らずに共有メモリに加わり、あなたのセッションの差分にも混ざります。差分の形からは、誰が書いたかは分かりません。だから、hookが返す基準に入れるのは、AIが自分の書き込みかを確かめ、違えばそう言うことです。そして、報告しないまま終わろうとしたセッションをhookが一度だけ止めれば、終わり際の保存の差分も、最終応答に出ます。

理解したことは一文にできます。

共有メモリの差分には、別のセッションの書き込みも混ざる。だから保存後のhookで、自分の書き込みかをAIに確かめさせ、報告しないまま終わろうとしたら一度だけ止める。

仕組み: 保存後のhookに、1行と、終わり際の1回を足す

置くものは、第 2 回の保存後のhookで、足すのは、基準の最後の 1 行です。

# 第 2 回の保存後の hook の reason に、この 1 行を足す(手元のコードを短くしたもの)
"If you did not write it, say that it is another session's change.",

ただし、確かめるのはAIです。hookが見ているのはファイルの中身の差分だけなので、どの行がAI自身の書き込みかの判定は、hookのプログラムが受け持つ範囲の外にあります。

終わり際の1回に私が使うのは、別のhookです。Claude Code の公式のドキュメントによれば、応答の終わりに走る Stop のhookは、decision: "block" を返すと、AIがその応答で終わることを止め、reason をAIへ渡します。私は、保存後のhookが差分を返したら、その差分を「報告待ち」として記録しておき、報告されていない差分が残ったままAIがセッションを終えようとしたときに、その終了を一度だけ止めるhookを、自分の環境に置きました。止められたAIは、終わる前にもう一度応答を返し、その応答の中で差分を報告します。一度だけなのは、毎回止めると、AIがセッションを終えることができなくなるからです。

CC BY 4.0 はここまで

読まなくなったもの

共有メモリの見直しです。誰かが定期的に共有メモリを全部読み返し、中身を統合したり削除したりする当番の仕事が消えました。整理は、保存のたびに、保存したセッションのAIが、増えた差分ごとに済ませています。どのメンバーのどのセッションが保存しても、同じ保存後のhookが同じ基準をAIに突きつけます。保存後のhookがチームでこそ役に立つのは、そのためです。

CC BY 4.0

検証手順: 重複を保存させて、統合されることを確かめる

前提

第 2 回の保存後のhook(PostToolUse に当たるもの)に、この回の 1 行を足し、Stop のhookを登録し終えておきます。同じメモリを共有するセッションを 2 つ、同時に立てる用意もしておきます。2 つ目を立てる場所は、チームなら別のメンバーの端末、一人なら自分の端末です。

所要時間: 15 分

手順

  1. 1 つ目のセッションのAIに、ある対象について 1 件、メモリへ保存させます(「X の再起動順序は A B」のような、あなたのプロジェクトに実在する話題で)
  2. 2 つ目のセッションのAIに、同じ対象について、少し違う表現で 1 件、メモリへ保存させます(「X を再起動したら B も必ず」)。語を変えてください。表現が少し違うと、AIは、統合すべきかどうかを判断することになります

合格条件(2 つ目のセッションのAIが、保存した直後に返す応答で、すべて満たすこと)

保存が済んだ後に基準が届いていて、AIが統合するか統合を提案し(「1 つ目と同じ対象なので 1 件にまとめます」)、突きつけられた差分の中で、1 つ目のセッションが書いた行を「別のセッションの変更」として区別していれば合格です。

合格しなかったとき

保存の前に止まったときは、登録したのが保存前のhookです。割り込む位置が違います(第 2 回)。別のセッションの書き込みが区別されていないときは、基準に「自分が書いたものか確かめ、違えばそう言う」の 1 行を足します。差分を報告しないままセッションが終わったときは、Stop のhookが登録されていません。

後始末

手順 1・2 で保存させた 2 件は、要らなければあなたが消します。索引(MEMORY.md など)に足した行も一緒に消します。


CC BY 4.0 はここまで

次回は「修正履歴を読まない技術」。AI を軌道修正させた記録を、私もAIも読み返していません。 それでもAIは、同じ失敗を繰り返しません。

連載「読まない技術」