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

今回は、AI が作業の途中で少しズレたことを言ったときの話です。話は聞きます。聞かなくなったのは、その場で私が説明して直すことです。前提を取り違えている、要らない機能を足そうとしている、直したはずの話を蒸し返している。そういう場面で、私は説明もしませんし、放ってもおきません。訂正は仕組みの仕事にしてあるからです。

前作「読まない技術」の第 11 回で、作業の途中に口を挟むのをやめました。今回は、口を挟まずに済ませた先の話です。前作を読んでいる方には復習に、読んでいない方には、ここが入口になります。

まず一つだけ、思い出してみてください。

直近のセッションで、AI が少しズレたことを言った場面です。

そこで、説明しましたか。

それとも、黙って進ませましたか。

CC BY 4.0

口を挟むと作業が壊れ、黙っていると 173 万トークン消えた

私が説明したときの失敗です。作業の途中で「そこ違う」と挟むと、その一言が最優先のタスクになります。しかも、その一言が正しいほど、AI の対応が主役になって、進行中の計画ごと壊れます。

私が説明しなかったときの失敗は、もっと高くつきました。私の手元の本番プロジェクト——typingtube という、YouTube の音楽動画でタイピング練習ができる Web サービスです——で、十数言語の翻訳をサブエージェントに任せた日があります。サブエージェントというのは、メインの会話を引き継がず、別に立ち上がって働く AI のことです。私が 13 体を並列で起動して、約 173 万トークン。各エージェントが自分用のツールを書き直し、同じ作業を別々のやり方で進めていました。

私が気づいたのは、使用量の上限に当たったときです。

そこで私が説明して、AI は行動ルール——AI の動き方について私がメモに書き溜めた決めごと——の本文を開きました。あとで記録を数えると、その本文にしか出てこない語が最初に現れるのは 1042 行目で、13 体の起動は 631 行目から 990 行目のあいだに終わっていました。

放っておけば AI が自分で気づく、は成り立ちませんでした。

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

ズレは、黙っていれば進み、会話で言えば作業の順位ごと壊れる。だから訂正は、人ではなく仕組みの仕事にする。

なぜ、会話で言うと作業の順位が壊れ、黙っていると誰も気づかないのか

私が会話に打った一言は、走っているツールを止めません。Claude Code のドキュメントは、作業の途中で訂正を送ると、AI はいまの操作が終わり次第それを読み、次の一手を決める前に向きを変えると書いています。指示ファイル(CLAUDE.md や AGENTS.md)に書いた方針も、会話の始めに読み込まれる文脈であって、強制される設定ではないとドキュメントが書いているとおり、材料として並んでいるだけです。その列のいちばん後ろに、私のいまの一言が来ます。

そして、その一言は残ります。Claude Code のドキュメントは、会話が上限に近づいたとき、先に消えるのは古いツールの出力のほうで、人が打った要求と主要なコードは残ると書いています。進行中だった計画は、ツールの出力の側にあります。

私が黙っていたときは、AI の側に材料が届きませんでした。同じページは、ツールが無ければ AI に返せるのは文章だけで、ツールを使うたびに返ってくる情報がループへ戻り、次の判断の材料になると書いています。13 体が同じ作業を別々のやり方で進めていることは、どのツールも返しません。同じページは、サブエージェントは自分の会話を持っていて、まっさらな状態から始まるとも書いています。13 体は、お互いの手元も見ていません。

私の側にも、材料はありませんでした。同じページは、サブエージェントのツール呼び出しは起動した側の会話に入らず、終わったときに要約が返ると書いています。13 体が何をどう書いているかは、走っているあいだ、私の画面にも中央の会話にも出てきません。出てくるのは、終わったという報告と、消費量の数字です。だから私が気づけるのは、その数字が上限に届いたときです。

仕組みが返す 1 行は、私が打つ一言でもなく、何も届かないままでもありません。その 1 行を出しているのは hook です。コマンドの前後に割り込んで走るスクリプトで、そのドキュメントには「LLM がそれを実行すると選ぶことに頼るのではなく、その動作が必ず起きる」とあります。そして hook が止めたときには、なぜ止めたのかの説明が AI に返り、AI はやり方を変えられる、とあります。届く先は会話ではなく、AI がいま打った一手の結果です。だから、その 1 行は材料の列に割り込まず、会話にも残りません。

仕組み: 新しく置くものはありません

前作で置いてきた仕組みが、そのまま訂正の代役になります。

共通していたパターンは 5 つです。私はこの連載でも、全部使い直しています。

一つ、ルールは読まれたときだけ効く。足すほど薄まる。 指示ファイルに 1 行足すことは、他の全部を少し弱くすることです。だから「〜しないこと」を書き足す方向には答えがありません。この連載が却下を書き足す話ではなく、一箇所に集めて構造を与える話だったのは、これが理由です(第 1 回)。

二つ、AI は止められると探す。 決められた入口を通っていないコマンドを hook が止めて案内を出すと、AI はその場で読み替えて進み直します。人間が会話に割り込むのと違って、案内は作業の流れの中に届くので、優先順位を壊しません。今作では、サブエージェントの起動を止めるカタログがこの形です(第 4 回)。

三つ、読んだかは測れない。書いたか・在るかだけを見る。 AI がドキュメントを読んだかどうかは、プログラムには判定できません。「読まなければ作れないファイル」が存在するかなら、プログラムが判定できます。今作では、起動前に、中央(サブエージェントを指揮する側の AI)に用意させるツール群(第 4 回)と、書いてあるかどうかで見る「機械検証」の見出し(第 5 回)が同じパターンです。

四つ、方針は、差し込む瞬間で効き方が決まる。 同じ文章でも、問題が起きる前に AI へ読ませると他人事の一般論になり、起きた瞬間に届くと読まれます。今作の禁止事項(開発のときに許さないと決めたルールの一覧)に「解除の条件」を添えてあるのは、提案が来たその瞬間に判定材料が届くようにするためです(第 3 回)。

五つ、自己申告は完了に寄る。報告は止まったことしか教えない。 報告は書いた AI の要約なので、都合の悪いものから落ちます。食い違いは、AI の文を通らない行が隣にあるときだけ見えます。今作では、動作確認の合否を AI の報告ではなく、ブラウザで操作を最後まで通すスモークテストが、残ったデータを見て返す 2 つの数で決めています(第 6 回)。

ズレたことを言われたとき、私は説明しません。そのまま進ませて、止まるべき場所で仕組みが AI を止めます。止まった AI は目の前の案内を読んで、自分で向きを変えます。

代役が AI を止めるのは、AI がファイルを書き換えるときと、コマンドを走らせるときです。AI が何も書き換えず、何も走らせないまま終わるズレ——取り違えたままの前提や、出しただけの提案——では、どの仕組みも止めに入りません。

CC BY 4.0 はここまで

指摘しなくなったもの

作業の途中で気づいたズレです。「前提が違う」「それは前に決めた」を、AI が動いている間に私は言わなくなりました。言いたいことが消えたのではなく、言う役目が仕組みへ移っただけです。私は気づいたことを、AI には渡さない自分用のメモに積んでおいて、その作業が終わってから、自動テストへ、禁止事項へ、カタログへと仕分けます。行き先を決めるのが私で、書くのは AI です。

説明せずに済むかどうかは、私がこの連載の第 1 回で測りました。会話を引き継がない別の作業者 2 体に、却下済みの提案を投げた実験です。私は一言も説明していません。それでも 2 体とも、自分で禁止事項の一覧を見つけて、断りました。1 体は依頼していない項目まで読んで、代替案の途中で自分から道を塞いでいます。

CC BY 4.0

注意: 代役が無い場所で黙るのは、ただの放置です

前作には、全 12 回で唯一「読んでください」と書いた回があります。第 5 回です。サブエージェントのログを、一度だけ読め、という回です。理由は、起動した人がガードレールを置かず、ログも見ていないなら、それは技術ではなく、ただの放置だからです。

173 万トークンが無駄に消えたのは、その状態でした。あの日、サブエージェントの起動を止める仕組みは一つもありませんでした。私が用途のカタログを置いたのは、事故の当日です。代役が無い場所で私が黙っていたので、13 体は誰にも止められないまま走り切りました。説明をやめてよいのは、代役を置いた場所だけです。順番を逆にしないでください——先に置いて、それから黙る。

検証手順: 説明したくなったら、代役があるか探す

前提

  • 置くものはありません。次に AI がズレたことを言う場面が 1 回あれば足ります(その日のうちに来ます)

所要時間: 5 分(その場で 1 回。仕分けは後日)

手順

  1. あなたが、AI がズレたことを言って説明したくなった場面を 1 つ捕まえます。前提の取り違え、要らない機能の追加、決着済みの話の蒸し返し
  2. あなたが、口を挟む前に手を止めて探します。そのズレが実害になる手前に、止める仕組みが既にあるかを見ます——自動テスト、pre-commit、起動を止める hook、禁止事項の一覧。探すのは「ズレを指摘する仕組み」ではなく、「ズレたまま進んだ結果が形になったときに落ちるもの」です

見るところ(合否ではなく、探した結果で分かれます)

  • 見つかった —— あなたは黙って進ませます。その仕組みが実際に AI を止めるかどうかを、この機会に見届けてください。止まらなかったなら、それは代役ではありません
  • 見つからない —— それがあなたの次に置く仕組みです。あなたはその場では AI に渡さず、メモに 1 行書きます

後始末

  • いまの作業が終わってから、あなたがメモを仕分けます。プログラムが真偽を決められるものは自動テストへ、判断は禁止事項の一覧へ、サブエージェントに渡すものはカタログへ。あなたが決めるのは行き先だけで、書くのは AI です
  • あなたが仕分けを後回しにすると、メモだけが増えます。仕分けは、セッションの区切りごとにやってください

CC BY 4.0 はここまで

次回は「ルールを整理しない技術」。私は、AI に渡しているルールを、一度も整理していません。それでも、ルールは増え続けていません。

連載「AIの意見を聞かない技術」