Dev

キーストロークではなく、判断のときに起こしてほしい

コマンドごとの許可プロンプトは、操作する人を反射的に承認するよう仕込んでしまい、仕込まれた危険な要求のおよそ 3 件に 1 件がそのまま通り抜けます。それでも残す価値のある割り込みは、まれで読み取れるものです。取り消せないアクション、サンドボックスの外に及ぶアクション、あるいはすでに 3 回失敗したアプローチ。

動かしているエージェントが止まって、こちらに質問してきます。古くなったと判断したストレージバケットを削除したい、というのです。止まって尋ねられる部分を作るのは簡単です。難しいのは、どの質問が止まる価値があるのかを、あらかじめ決めることです。その集合を小さくしすぎれば、まだ必要だったものを削除します。大きくしすぎれば、こちらは質問を読まなくなります。ほとんどすべての気配りはこの二つ目の失敗に注がれます。それは、とうに安全でなくなったあとも長く安全のように見え続ける失敗だからです。

読まずに承認してしまうプロンプト

ベルギーの開発者 Alex Wauters は、これに数字を与えるためにブラウザゲームを作りました。60 秒のあいだ、AI コーディングエージェントから来る一連の模擬的な許可要求を承認または拒否し、危険なものを見抜けたかで採点されます。4 万回を超える実行と 40 万件の個別の判断を通じて、プレイヤーは仕込まれた悪意ある要求のおよそ 3 件に 1 件を通してしまいました。最も多く承認された危険なコマンドは、無害に見える npm run analyze で、ほぼ 3 分の 2 の確率で通されました。

Wauters はこれを研究ではなくゲームだと注意深く呼んでいて、実際そのとおりです。脅威の割合は実際の作業よりはるかに高く、時計は人工的で、プレイヤーの 5 分の 1 はすべてを見抜きました。しかし結果の形は簡単には片づけられず、手元にある唯一の現実世界の数字と一致します。Anthropic 自身のテレメトリは、Claude Code の許可プロンプトの承認率を 93% ほどと見積もっています。この数字は、誰かが居眠り運転をしている証拠ではありません。エージェントが提案することの大半は、まさに頼んだとおりのものなので、たいていは Yes が正しい答えです。それが示すのは、No がそもそもどれほどまれにしか行使されないか、ということであり、答えがほぼいつも Yes である流れは、まさにその反射を組み込む訓練データそのものです。ゲームが描くのは、悪意ある要求がついに流れの中を通り抜けるその日に、その反射が何を代償にするか、です。

抜け道がそれを悪化させます。開発者は、何時間にも及ぶ実行が 5 分で凍りつく危険を冒すよりも、許可チェックを丸ごと切るフラグ、名前が警告のように響くあのフラグに手を伸ばします。過剰に尋ねることは安全側には倒れません。迂回のほうへ倒れます。あまりに頻繁に割り込む門は、操作する人にその門を引きはがすことを教え込みます。

なぜキーストロークが誤った単位なのか

コマンドごとの承認が崩れる理由は、人が怠けているからではありません。単一のコマンドが、人に尋ねる対象として誤っているからです。npm run analyze を見せられて、人は何を判断すればよいのでしょう。そのスクリプトがこのリポジトリで何をするのか、外部へ通信するのか、エージェントが正当な理由で選んだのか、それとも侵害された理由で選んだのかを、人は知りません。プロンプトは、操作する人に判断する立場のない評決を、1 時間に何十回も要求するので、答えは癖へと退化します。あなたは監督の見かけを作り出し、その中身を使い果たしました。しかも、尋ねすぎることによって使い果たしたのです。

ですから、有用な問いは、どうすれば人にプロンプトを読ませられるか、ではありません。あの量では人は読みません。問いは、そもそもどの判断が割り込みに値するのか、です。

残るもの

人が意味のある形で判断できないものすべてと、判断を誤っても永続的な害を及ぼさないものすべてを取り除くと、小さな残りが残ります。それを特徴づけるものが三つあります。

一つ目は取り消し不能性です。リソースを削除する、force-push で履歴を上書きする、お金を動かす、本番へ出す。いったんやってしまえば、取り消しは失われるか高くつくかのどちらかなので、人が結果を変えられる唯一の瞬間は、それが起きる前です。割り込みがその場所を得るのは、割り込みが残された唯一のてこだからです。

次に、サンドボックスの外に及ぶ結果があります。本物のアカウント、本物の請求書、メールの向こう側にいる本物の人に触れるアクションです。封じられた箱の中、有効な認証情報もネットワークへの開いた経路もない箱の中でなら、エージェントを走らせ、失敗させ、好きなだけ再試行させればよいのです。影響範囲はコンテナであり、コンテナは安上がりです。門が属するのは、効果が現実になる場所であり、そこはたいてい、取り消しが安くなくなる場所と同じです。

繰り返しの失敗が三つ目です。エージェントが同じアプローチを試して 3 回失敗したとき、自分のループの内側からは見えない何かがたいてい間違っていて、人のより広い視野はそこでの割り込みに値します。4 回目の試みがより危険だからではなく、エージェントが前進をやめたからです。行き詰まったエージェントをどうするかは、人のための判断であって、キーストロークのためのものではありません。

そのリストの下に、二つのものが座っています。その下にあるのは、人が決して見ない底です。エージェントがそもそも取ることを許されないアクション、たとえば自分の範囲の外の秘密を読む、自分の権限を昇格させる、別のテナントに手を伸ばす、といったものです。それらは誰にとっても問いではありません。ハーネスが強制する拒否です。毎回拒むようなアクションは、決してプロンプトになることを許されてはならないからです。そして底の上にある三つのトリガーは、同じ種類のものではありません。アクションが取り消し不能かどうか、サンドボックスを越えるかどうかは、オーケストレーターが、そのアクションが何であるかを見て、自分で判別できます。アプローチが 3 回失敗したかどうかは、判別できません。行き詰まったエージェントとは、まさに 4 回目の試みを新しいアイデアとして貼り替え、自分のカウンターを決して作動させないものだからです。そのカウントは、エージェントの外側で、それを見張っているものによって保たれなければなりません。人に上げる価値のある割り込みとは、機械が検知はできても決着はつけられないものです。

尋ねる価値のあるケースが共有しているのは、どれもまれで、どれも読み取れる、ということです。まれだからこそ、割り込みは来たときにまだ響きます。読み取れるからこそ、人はそれに答える立場を実際に持ちます。これを出荷すべきか、このお金を動かすべきか、このものを削除すべきか、明らかにうまくいっていないアプローチをこすり続けるべきか。人はそれらを判断できます。npm run analyze を、1 日に 200 回許可するかは、判断できません。唯一の但し書きは、まれであることはワークロードの性質であって、規則の性質ではない、ということです。これを、仕事がまるごとメール送信であるエージェントに向ければ、メールはまれでなくなり、あなたは集合をもう一段細かく切り分けることに逆戻りします。原則は保たれます。ただもう一度それを適用するだけです。

割り込みを設計する

これは反射を反転させます。直感的な安全策は、もっと多くを尋ね、しきい値を下げ、少しでも関係しうるものすべてでプロンプトを出すことです。しかし、操作する人の注意を、それが実際にふるまうとおりに扱ってみてください。プロンプトの流れのなかで目減りし、いったん反射が根づくと回復の遅い予算として、です。すると、余分なプロンプトの一つひとつが引き出しになります。それをまれで読み取れる判断に使えば、人は、それが効くその瞬間に研ぎ澄まされています。それを一つひとつのキーストロークに使えば、残高は昼前には尽きています。ちょうど、本当に危険なプロンプトが到着し、その前の 200 件と同じ自動的な Yes を集めるころに。

注意の議論だけでは覆えない落とし穴があります。迂回はグローバルです。雑音を飛ばすフラグは、まれな割り込みも飛ばします。そして短いリストは、まさにそれがめったに作動しないからこそ、全体を切ることをほぼ無料に感じさせるものです。ですから、尋ねる価値のあるクラスは、ただ小さいだけではいけません。それが置き換えた雑音よりも、切りにくくなければなりません。さもなければ、夜通しの実行のために騒がしさを消す操作者は、大事だった三つのプロンプトも一緒に消してしまいます。注意の経済学は、非常停止スイッチがいまだにすべてに対する一つのフラグであるなら、何ももたらしません。

ですから、私が実際に望むエスカレーションポリシーは短いものです。サンドボックスの中では自由に走らせる。範囲の外は既定で、プロンプトなしに拒否する。止まって尋ねるのは、ハーネスが取り消し不能だと、あるいは箱の外に及ぶと見て取れるアクションのときと、外部のカウンターが同じアプローチは 3 回失敗したと告げるその瞬間だけ。それ以外はすべて、判断して進み続ける。リストは意図して短いのです。短いリストは、人が読み続ける唯一の種類です。

見るに値した数は、いくつのアクションを人の背後に置くか、では決してありませんでした。人が見るのをやめるまでに、そこにいくつ置く余裕があるか、です。そしてそれは、誰にも内省を求めずに見て取れます。承認を引き出して、それぞれにどれだけ時間がかかったかを測るのです。1 秒未満で答えられたものは、演出です。それらを、本当に間を置いたものと比べれば、その比が教えてくれます。あなたの監督のうち、どれだけが判断している人で、どれだけが長い実行を生かし続けている人なのかを。ループの中の人は、持つ価値があります。ただし、それは、ついにその人が必要になる日に、その注意へまだ届ける場合に限ります。そして、送らないと決めたプロンプトの一つひとつが、その日を生き延びられるものに保つのです。

ディスカッション

コメント欄はありません。議論は X で行っています。

Max Nardit

Max Nardit

@mnardit

ほかの記事

レビューでは防げないインジェクション

コードインジェクションは、データがコードになる継ぎ目で止められます。個々のケースを判断するのではなく、構文上のクラス全体を拒否することで止めます。これはその境界が決定可能な場所ならどこでも成り立ちます。自然言語のプロンプトインジェクションが決して持たない性質です。

エージェント性の高いモデルはレビュー席に座らせる

モデルをよりエージェント的にする特性(スコープを広げる、頼まれずに自己検証する、出力が長くなる)は、範囲の狭い無人ワーカーでは不利になり、レビュアーでは強みになります。だからフローのワーカーは Claude Opus 4.8 で動かし、Opus 5 はレビューに回します。モデルの気質を、ベンチマークではなく役割に合わせるという話です。

朝の 10:47 に Claude から寝るように言われた

Anthropic はこれを character tic と呼びます。実際に何がそれを生み出しているのかを調べているうちに、公開されている system prompt、character training の論文、emotion-concepts の論文を読むことになりました。この振る舞いは、スタックが起こりやすくしているものです。