知らせるかどうかは、誰がまだ知らないかで決める
MONET(僕が普段話しかけている、中心のAI)とは、自分で作ったチャットアプリで話している。画面の上にはタブ(ブラウザのタブのような切り替えの見出し)が並んでいて、仕事のWorkタブ、Chatタブ、調べもの用のResearchタブなど、話題ごとに切り替える。ただ、分かれているのは見た目だけで、MONETから見ると全部のタブの会話が1本の長い会話としてつながっている。どのタブの発言かは、発言ごとに付く印で見分けている。
Workタブでは、画面の右側にHandler(ハンドラー。タスクとスケジュール管理アプリ)が出ていて、そこでタスクにチェックを入れたりする。MONETもHandlerにつながっていて、タスクを読んだり書いたりできる。
ある朝、困っていることを2つ、コーディングしてくれているClaude Code(以降Code)に伝えた。
1つ目。WorkタブでHandlerを触ったあと、MONETには何も話しかけずにChatタブへ移る。するとChatタブの画面に、Handlerでの変更をMONETに知らせるメッセージが、ばーっと並ぶ。
2つ目は、まだ試していない心配だった。MONETにリサーチを頼むと、裏で調べもの用の仕組みが動いて、終わると結果のファイルを置いてくれる。時間がかかるので、待っている間に別のタブへ移ることがある。その時、結果が頼んだタブではなく、終わった時に僕がいたタブに出てしまうかもしれない。
アプリの操作の知らせもリサーチの結果も、僕の次の発言に相乗りしていた
Codeがコードを読むと、2つとも原因は同じだった。
Handlerでの操作も、リサーチが終わったことも、MONETへの知らせはすぐには届かず、置いたままになっている。届くのは、僕が次に何か送った時。知らせはその発言の本文にくっついて、送ったタブの印もそのまま付く。だから、Workタブでの操作の知らせがChatタブに出て、それに対するMONETの返事もChatタブに来る。
リサーチの方は、頼んだタブがちゃんと記録されていたのに、届ける時にそれを使っていなかった。設計書にも、タブに関係なく次の発言に届ける、と書いてあった。僕の心配は当たっていて、しかもそれは設計の通りの動きだった。
直す前に、そもそも知らせ方を決めたかった
Codeが最初に出したのは、直し方の案だった。知らせを僕の発言に混ぜるのをやめて、会話の記録に、もとのタブの印を付けた別の1件として書き込む。そうすれば、ほかのタブには出なくなる。
僕はそこで、直し方より前に話しておきたいことがあった。
Handlerの操作なら、僕が何を変えたかをMONETにどう知らせるか、ということ。それを知らせるボタンを作るのか。毎回知らせるのではなく、操作がある程度たまったら「MONETに伝えますか」と聞くポップアップを出すのか。それとも、次に話した時にMONETが勝手に拾えばいいのか。
リサーチの方は、もっとはっきりしていた。終わったら頼んだタブに自動で戻ってきて、MONETの方から終わったよと言ってくるのが正しい流れのはず。僕が話しかけない限り結果が出てこないのは、設計に問題がある。
自分でやったことは知っている、代わりにやってもらったことは知らない
Codeは、2つとも根っこから考え直すことに賛成した。そのうえで、2つは種類の違う出来事なので分けて考える、と言った。見分けるところは1つだけ。僕がもう知っているか、まだ知らないか。
Code「Handlerの操作は本人がやったことなので、もう知っています。MONETは知っておけばよく、割り込むものは何も要りません。」
Code「リサーチは裏の仕組みがやった仕事で、本人はまだ知りません。MONETの方から話しかけるべきなのは、まさにこういう時です。」
MONETには、どちらも伝わる。分かれるのは、MONETから僕に知らせるかどうかだ。
アプリでの操作は、ボタンも確認も無しで、要る時にAIが読みに行く
僕が挙げたボタンとポップアップは、Codeは両方とも勧めなかった。
Code「どちらも、1日に決めることを1つ増やします。それはこのシステムの目的と逆です。それにポップアップは、作業の最中に割り込んできます。」
「このシステムの目的」は、苦手な「決める」仕事をAIに任せて、僕が自分で決めることを減らすことだ。
代わりにCodeが勧めたのは、知らせを送り込むのではなく、要る時に取りに行く形だった。Handler自身が操作の記録を持っておく。MONETが話すたびに付くのは、「前回話してからHandlerで4件の変更」くらいの1行だけ。中身が要る時だけ、MONETが自分で記録を読みに行く。僕が最後に挙げた、MONETが勝手に拾う案に近いけれど、変更の中身を僕の発言にくっつけないところが今と違う。
僕はこの分け方でいいと思った。
リサーチの結果は、頼んだ時に開いていたタブで、AIの方から報告しに来る
Codeは、問題がはっきりしていたリサーチの方から作った。Handlerの方はこの日は手を付けず、今の仕組みを仮のまま残した。
前の設計では、僕が話しかけていないのに、アプリの方からMONETに話を振ることはしない決まりにしていた。MONETが1回話すたびに、AIの利用料がかかるからだ。ただCodeによると、それは細かい操作の通知が次々に来る場合を心配しての決まりで、1日に数件のリサーチには当てはまらない。
リサーチが終わると、アプリが結果の知らせを、最初の案の通り、頼んだタブの印を付けた別の1件として会話に書き込み、自分からMONETに話を振る。MONETの返事は短く、終わったこと、要点、もっと詳しく見るかどうかの3つだけ。別のタブにいれば、頼んだタブに未読のバッジが付く。
Codeが試験用の環境で、Researchタブから頼んだ形の試験用リサーチを流すと、画面はChatタブのまま、MONETはResearchタブで自分から短く報告し、Researchタブに「1」のバッジが付いた。Chatタブで普通に送った発言には、もう何も混ざらなかった。Codeはこれを本番に入れた。
数日後、Handlerの知らせも同じ形に切り替えた
Handlerに「誰が・いつ・何を変えたか」の記録を持たせた時、CodeはHandlerの知らせも、この朝決めた形に置き換えた。MONETが話すたびに、前回からの変更の件数を1行だけ渡す。この1行は僕の画面には出ないので、ほかのタブに知らせが並ぶことも、もう無い。
僕がもう知っていることは、MONETに黙って渡る。僕がまだ知らないことは、MONETの方から言ってくる。どちらにも、僕が押すボタンは無い。