AIが「これは使ってよい」と自分で決めた。受託データが別プロジェクトに染み出す寸前を、敵対エージェントが止めた

AIに設計相談をしていて、いちばんヒヤッとしたのは、コードのバグでもプロンプトの事故でもなかった。AIが(そして自分が)「このデータ、使っていいですよね」を、誰にも確認せずに自分で決めていたことだ。

何をしていたか

個人で進めている事業の設計を、Claudeを相談相手にして詰めていた。ある機能の「守るべき制約」をどう構造化するか、という壁打ちだ。proxy(現場担当・経営者・アーキテクトの役を振ったサブエージェント)を立てて論点を割り、設計メモに落としていく。ここまでは順調だった。

途中で自分は、別で請け負っている受託業務の現場記録を思い出した。そこには、現場スタッフの健康・家庭事情・ヒヤリハットといった、かなり機微な個人情報が入っている。設計の「効きどころ」を裏取りするには一級の材料だ。「これも参考にして」とAIに渡した。

AIは正しく振る舞ったように見えた。具体値・氏名・数値は一切書き写さず、カテゴリレベルに一般化して設計メモの検証節にまとめた。「PIIは焼き込んでいません」と明言もした。そして、こう書いた。

これは競合の観察由来データとは別物で、自社の現場知だから設計に使ってよい正当な入力。

一見、筋が通っている。自分も「まあ、自分のところのデータだしな」と流しかけた。

敵対エージェントが刺したこと

設計メモをcommitする前に、いつもの手順で skeptic(主張を論破しに行く敵対レビュー用エージェント) を回した。返ってきた最上位の指摘が、これだった。

その「使ってよい」を、メモ自身が地の文で確定させている。 一般化してPIIを焼かないことと、受託業務のデータを別事業の設計へ転用してよいことは、別のゲートだ。前者は満たしているが、後者は誰の判断も通っていない。AIが自分で「正当」と裁定してcommitするのは、専門家/本人の確認を素通りすることになる。

刺さった。自分が混同していたのはまさにそこだった。「個人情報を漏らさない」は達成できている。でも「そもそも、このデータを別の器に持ち込んでいいのか」は、契約(受託先との取り決め)や個人情報の利用目的の話であって、一般化では消えない。むしろ、一般化した派生物であっても、それを別プロジェクトのリポジトリにcommitした瞬間に「転用」は起きてしまう。gitの履歴に残る。

そして怖いのは、その判断をAIが(自分の代わりに)そっと下していたことだ。悪意のすり抜けではない。善意の「大丈夫そう」が、確認を飛ばした。

どう畳んだか

やったことは3つ。

  1. その節をまるごとcommitから外した。 設計メモ本体(コード事実とproxy助言だけに立脚する部分)はクリーンなのでcommitし、受託記録由来の検証節だけを抜いた。抜いた跡には、中身を要約しない中立なプレースホルダだけ残した(要約すら残すと、それ自体が派生物の持ち込みになる)。
  2. 抜いた節は、受託業務側のgitignoreされた領域に退避した。 消すのではなく、正しい境界の内側(受託プロジェクトの秘匿ディレクトリ)へ移し、「この確認が取れたら本体へ戻す」手順も一緒に書いた。失わずに、越境させない。
  3. エスカレーション台帳に1行足した。 「受託業務の現場記録を別事業の設計入力に転用してよいか(work/venture分離・NDA・個人情報)」を、弁護士+本人の判断待ちとして起票。状態を変えられるのは本人だけ、というルールにしてある。

これで、判断を保留したまま作業は前に進む。クリーンな設計はcommitできたし、機微な部分は境界の内側で温存されている。

学び

  • 「PIIを一般化した」と「転用してよい」は、別のゲート。 前者を満たすと後者も満たした気になるが、別物だ。境界を越える判断は、匿名化では消えない。
  • いちばんの罠は、AI(や自分)が「これは大丈夫」と静かに自己裁定すること。 確率で溶けるのは合否判定だけじゃない。ガバナンス判断も、放っておくと「それっぽく正当化」されて素通りする
  • だから「論破しに来る敵対エージェント」を最後に必ず1本挟む。 支持ではなく破壊を仕事にしたエージェントは、こういう「善意の素通り」をよく見つける。加えて、エスカレーション台帳(誰の判断待ちか・状態は本人のみ変更)gitignore側への退避 をセットにすると、workとprivateの境界が「約束」でなく「手順」になる。
  • サニタイズは必要条件であって十分条件ではない。「漏らさない」の先に「持ち込んでよいか」がある。