私は非開発者として病院の内部ツールを構築しています。つまりAIがコードのほとんどを書いています。そこで当然責任ある行動として、AIにもレビューさせました。

いい加減なやり方ではなく、別々の役割を設定しました — あるエージェントが実装し、別のエージェントがテストを実行し、もう一つのエージェントがセキュリティ問題のためにコードを読み取ります。異なる指示、異なる焦点、同じ作業への異なるパス。それはレビュープロセスのように感じられました。数ヶ月間、セキュリティレビュー担当はほとんど何も指摘しませんでした。

それを良い知らせだと受け取っていました。

それから、このサイトで3日間にわたり、見知らぬ人々が同じシステムで8つの実際の欠陥を見つけました。そのうちの1つも私のレビュー担当からは出てきませんでした。

私を立ち止まらせた数字

その期間の正直な集計はこちらです。特定のものを検出すべきだったのに、何かが検出されたと主張するチェック。パターンがフォルダを認識できることを検証するが、出荷実行が実際にそれを除外したことを検証しない除外ガード — これは6つのクリーンファイルを何週間も静かに誤ってスコアリングしていました。逆方向の盲点で、同じパターンを広げると実際のコードを飲み込んで、完全に緑色の「ゼロの問題」を生み出しました。レポートに印刷され、パス/フェイルから完全に除外された例外リスト。数ヶ月前に手作業で一度実行したドリルで、その結果は静かに期限切れになっていました。毎日これらすべてを実行するはずだったスケジュールされたジョブは、まったく登録されていませんでした。

数え方によってだいたい8つ。それらはすべて私のセットアップ外の誰かによって、通常はコメントで、通常は私が誇らしげに書いたばかりのものに向けられて見つかりました。

私のレビュー担当エージェントは同じコードを数ヶ月間読んでいました。そのどれも言及したことはありませんでした。

私が逆にとらえていた部分

私の最初の本能は、レビュー担当により良い指示が必要だということでした。それはプロンプトで修正可能なので、心地よい結論です。

それから、実際にそれを説明したことをスレッドの誰かが言いました:2つのモデルが合意するのは、しばしば2つの署名を持つ1つの失敗モードです。

私は役割の分離を独立性として扱っていました。そうではありません。私の実装担当とレビュー担当は、根本的に同じモデルで、異なる仕事を与えられています。異なる帽子、一つの事前知識。実装担当が構造的に気づけなかったことは、レビュー担当も全く同じ理由で気づけなかった — それが不注意だったからではなく、盲点の形を共有しているからです。その作業をチェックするよう求めることは、同じ心に自分の仮定を再考するよう求めることであり、それは心が最も苦手とするものです。

2番目に悪い層があります。私のエージェントは私のシステムについての会話の外にいません。彼らが会話そのものです。彼らは私が与えたコンテキスト、私が選んだフレーム、私が自分のツールに使う語彙を保持しています。私の投稿を読んでいる見知らぬ人はそのようなものを持っていません。彼らはより賢いわけではありません — ただ私が立てない場所に立っているだけで、私が説明したどんなものも立てないのです。

人間に相当するのは、長年一緒に働いてきた2人の同僚です:まだ2人の人間、まだ2つの署名ですが、彼らの不一致はすでに共有の見方に解決されています。同じ罠です。AIは構築上、初日から瞬時にそこに到達します。

私が誤読した沈黙

これが痛いところです。なぜなら私はこの正確な間違いについて、異なる装いで既に2つの投稿を書いていたからです。

何も見つけないレビュー担当と、本当に見ていないレビュー担当は同一の出力を生み出します:何も。I know this. I've built dead-man switches on this principle — checks that alarm on the absence of a fresh signal, precisely because silence and health look the same from outside. And I still read months of quiet from my reviewer as evidence the code was clean.

一度もシードしたことがありませんでした。既知の欠陥を植え付けたファイルを渡して、それがまだ見えることを確認したことがありませんでした。私の自動スキャナーに対してはまさにそれを行いました — 10の既知の悪いパターンを植え付け、それが7つを捉えたことを発見しました — しかしレビュー担当に対して同じことをするとは思いもしませんでした。なぜならレビュー担当は同僚のように感じられ、機器のように感じられなかったからです。それが一文で全ての誤りです。それは機器です。私はただそれにマッチをかけたことがなかったのです。

その代わりに私が建てた塔

振り返ってみると、今月私が構築したものはすべて、前の層の沈黙を信頼しないことの記念碑です。

私は自分の判断をコードについて信頼しなくなったので、AIにレビューさせました。レビューを信頼しなくなったので、明示的なルールを持つ機械的なスキャナーを構築しました。スキャナーの緑のライトを信頼しなくなったので、それがまだ見えることを証明するために既知の悪い装置を植え付けました。それらの装置がまだ何かを意味するかどうかを信頼しなくなったので、各ガードを意図的に壊して、それが自分の理由で赤くなることを確認するドリルを構築しました。そしてドリルを信頼しなくなりました。なぜならドリル自体がまだ実行されているかどうかをチェックしているものが何もなかったことが判明したからです — そこで別々の機械が、別々のスケジュールで、その生存証明を監視するようになりました。

5つの層。それぞれが、下の層が私に知らせることなく静かになる可能性があるために存在します。

そして私が構築して抜け出せないこと:それらの層のすべては私によって設計され、同じAIによって書かれたものです。それらは異なる方法で失敗します。これは本当に助けになります — ルールの回帰、デッドゲート、停止したスケジューラは同じ日に同じ理由で起こりません。しかし失敗モードの多様性は起源の独立性ではありません。塔全体が著者を共有しています。

実際に外に立つもの

このセットアップ全体で、確実に外に立ったことがある唯一のものは他の人々です。

彼らが私のエージェントより優れたエンジニアだからではありません — 最も鋭い修正のいくつかは、私のコードの1行も見たことのない人からの3文でした。彼らが働いたのは、仮定がなされた時に部屋にいなかったからです。彼らは私が満足していたものを読み、そして満足していることがテスト不足の信頼できるマーカーであることが判明しました。

そこで私が到達した実践を率直に述べます:

部屋の中での合意は証拠ではありません。2番目の意見が同じモデル、同じセッション、または私が提供した同じフレームから来る場合、それは2つの署名を持つ1つの意見です。ミスを捉えるには有用です。仮定を捉えるには無価値です。

沈黙を保つことしかできないものはチェックではありません。レビュー担当を含む。それをシードするか、その静けさをそれが主張したことのない何かの証明として読んでいることを認めてください。

真に外部のチェックは、得るために何かを犠牲にしなければなりません。見知らぬ人の注意、公開された間違い、あなたの最善の仕事に狙いを定めるよう人々を招待する投稿。それはスケールせず、毎晩実行せず、そして私が持つ唯一の層で、それは自分の仮定の下流にありません。

それはAIで構築している誰かにとって不快な結論です。私はそれがきれいに解決するふりをしません。しかし5層の自動チェックがあり、ライブバグを見つけたのは、5分間の余裕があり、私が正しいことに利害関係のない見知らぬ人でした。

それを私が返す柵として考えてください。AIで構築し、AIに作業をチェックさせている場合:あなたのレビュー担当が最後にあなたが聞きたくないことを言ったのはいつですか?そして答えが「あまり見つからない」なら — それが私が数ヶ月間良い知らせとして読んでいたのと同じ沈黙です。


これはStolen from the Feedの一部です — 非開発者がdev.toから持ち帰り、実際に構築するもの。From Zero to Shipの姉妹シリーズ。