← 補強2+4採用と4セル検証+1週間試験運用 ― symlinkの想定外UNC解決との付き合い方 ssot-recordデータフロー判定アルゴリズム →
第48話

毎回出る確認ダイアログの正体は、使い捨ての道具だった

困ったこと

作業を頼むたびに、画面に「このコマンドを実行してよいか?」という確認ダイアログが出ていました。危ない操作のときの確認は安全のために必要ですが、害のない処理でも毎回止められます。ふと疑問に思いました。「これ、毎回聞かれるのは仕方がないことなのか?」と。調べると、原因は意外なところにありました。ある作業のたびに、AIがその場限りの使い捨て道具(スクリプト)を毎回ゼロから作って使っていたのです。門番から見れば、毎回違う顔の見知らぬ業者が来るので、当然のように止めるしかありません。

どう解決したか

道具を作りっぱなしにするのをやめて、名前の決まった定番の道具を一つだけ用意して、門番の「この道具なら通してよい」リストに登録しました。これだけで毎回の確認が消えます。さらに、過去の作業記録を50セッション分まとめて調べ、「何度も使っているのに、害のない操作」を一覧にして、まとめて登録しました。この調べ方の道具も残したので、半年後に「なぜこれが許可されているのか」と聞かれても、もう一度同じ手順で調べ直して答えられるようにしました。

何が変わったか

便利になっただけでなく、安全面も逆に強くなりました。後日、5つの異なるAIに「この仕組みに弱点はないか」と徹底的に突っ込んでもらったところ、許可リストの裏をかく抜け道(別名を借りて中身だけ差し替える手口)と、説明書の書き間違いが見つかりました。どちらもすぐ塞いで、テストを17本まで増やしました。便利にする改造は、往々にして新たな穴も開ける。だからこそ「自動で楽にした部分ほど、他人の目で点検する」のが大事だ、という教訓が残りました。

<details><summary>▶ 技術的にどう作ったか</summary>

Claude Codeの権限は deny(自動拒否)/ask(確認)/allow(許可済み)の3層で、allowルールはコマンド先頭の文字列で前方一致する。MLR(マルチLLMレビュー)の指摘抽出を毎回 cat > /tmp/extract_<乱数>.py で生成しており、許可ルールと恒久一致しないのがask頻発の根本原因だった。

対策: ①抽出処理を ~/projects/claude-config/scripts/api/extract-mlr-findings.py に固定パス化(fence剥し+文字種ステートマシン内蔵・入力は /tmp/*.txt 実在ファイルに制限・symlink/traversal拒否・exit契約 0/1/2)し、Bash(python3 <固定パス>:*) をallow登録 ②fewer-permission-prompts相当のtranscript 50セッション走査で頻度≥4の読み取り系13ルールを追加(選定根拠は scan-bash-frequency.py として再現可能化)③5機2ラウンドMLR(計55指摘・採用11件即実行)で symlink迂回とdocstring/SKILL.mdのexit契約ドリフトを発見修正・pytest 17本(coverage 96%・残余は防御コード)。

限界の申告: allow 75ルールの効果(ask率低下)は次回MLR実行時の実機観察で判定予定・バックログに再測定タスク起票済み。coverage測定ではpytest-cov干渉とcoverage combineのデータ消費という測定アーティファクトを経験(実例は別話046参照)。

詳細記録: obsidian-ssot の 01_DECISIONS/claude-code/2026-10-10_権限ask削減D案-MLR抽出スクリプト固定化+fewer-permission-prompts.md(非公開vault)

</details>