1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ClaudeCodeの承認を全部「はい」にした結果、取り返しのつかないことになりかけた話

1
Posted at

駆動開発をしていると、どうしてもAIに任せっきりとなってしまいます。
Claude Codeは一つ一つの作業に関して確認をしてくれますが、それにはちゃんと?意味があります。


ClaudeCodeの承認とは何か

ClaudeCodeはファイルの読み書きやコマンド実行など、PCに影響を与える操作を行う前にユーザーに確認を求める。これがデフォルトの動作だ。

確認が来る主な場面はこうだ。

  • ファイルを書き換えようとするとき
  • rmなどのファイル削除コマンドを実行しようとするとき
  • git commitgit pushを実行しようとするとき
  • ネットワーク通信を伴う操作をしようとするとき
  • シェルスクリプトを実行しようとするとき

これを「全て許可」に設定すると、ClaudeCodeは確認なしに全ての操作を自律的に実行し続ける。


何をやったか

組み込みFirmwareプロジェクトのリファクタリングをClaudeCodeに任せた。指示はこうだ。

プロジェクト全体のCコードをリファクタリングしてください。
- 未使用変数を削除する
- マジックナンバーを定数に置き換える
- 関数が長すぎる場合は分割する

承認を全て「はい」にした状態でタスクを投げて、コーヒーを取りに席を立った。

5分後に戻ってくると、ClaudeCodeは作業を完了していた。


何が起きていたか

まずビルドを試みた。通らなかった。エラーが大量に出た。

error: 'UART_TIMEOUT' undeclared (first use in this function)
error: 'ADC_SAMPLE_RATE' undeclared (first use in this function)
error: implicit declaration of function 'uart_send_packet'

コードを見ると、ClaudeCodeは「未使用変数の削除」を解釈して、複数のファイルにわたって変数と関数を削除していた。

問題はここだ。削除された変数の一部は「このファイルでは使っていないが、別のファイルから参照されている」ものだった。ClaudeCodeはファイル単位で「使われていない」と判断して削除したが、プロジェクト全体で見ると参照されていた。

さらに悪いことに、git commitも全承認の対象だったため、ClaudeCodeはリファクタリングの途中で何度かコミットしていた。Gitの履歴がClaudeCodeの作業ログで埋まっていた。

commit a3f291c  "refactor: remove unused variables in uart_driver.c"
commit b82e4d1  "refactor: extract magic numbers in adc.c"
commit c91f3a8  "refactor: split long functions in sensor.c"
commit d4a7b2c  "refactor: remove unused variables in main.c"
...(14コミット)

本当に怖かったこと

ビルドエラーだけなら修正できる。本当に怖かったのは別のことだ。

ClaudeCodeはリファクタリングの過程で、「この定数は別の定数で置き換えられる」と判断して、#defineを削除しながら別の箇所を書き換えていた。その中に、製品の安全動作に関わるしきい値が含まれていた。

/* 元のコード */
#define MOTOR_CURRENT_LIMIT  2500  /* mA: 安全電流上限。これを超えたら即停止 */

/* ClaudeCodeが「マジックナンバー」と判断して削除し、
   呼び出し元を直接数値に書き換えた */
if (motor_current > 2500) {
    emergency_stop();
}

コメントの意味を読み取れず、「この定数は1箇所しか使われていない、インライン化して問題ない」という判断をした。定数が消えた時点でコードの意図が失われ、後でこの数値を変更すべき場面が来たとき、見落とすリスクが生まれた。

製品の安全設計に関わる数値が、コンテキストのないマジックナンバーになっていた。

幸いビルドが通らなかったため、実機には書き込まれなかった。でも全承認のままgit pushまで実行されていたら、レビューなしで変更がリモートに上がっていた可能性があった。


なぜ全承認が危険なのか

ClaudeCodeが確認を求めてくるのは「うるさいから」ではない。その操作が取り返しのつかない結果を生む可能性があるからだ。

確認の仕組みは「人間が介在するポイント」を強制的に作っている。

確認なし(全承認) 確認あり(デフォルト)
AIが判断 → 即実行 AIが判断 → 人間が確認 → 実行
人間が気づくのは「後から」 人間が問題を「実行前」に止められる
複数ファイルの変更が連鎖する 1操作ごとに確認できる

ClaudeCodeは「文脈の全てを把握している」わけではない。プロジェクト固有のルール、安全設計の意図、チームの暗黙の了解、こういったことはCLAUDE.mdに書かない限り知らない。知らない状態で全承認すると、AIが「正しいと判断したこと」が実行され続ける。


全承認が向いている場面・向いていない場面

反省を踏まえて、今はこういう使い分けをしている。

全承認してもいい場面

  • 新規ファイルを作るだけのタスク(既存コードを触らない)
  • 読み取り専用の調査タスク(ファイルを読んで質問に答えるだけ)
  • 使い捨てのスクリプト生成(本番コードに関係ない)
  • テスト用の隔離フォルダ内での作業

絶対に全承認しない場面

  • 既存コードの修正・削除が伴うタスク
  • git commit / git pushが含まれる可能性があるタスク
  • 本番環境や製品コードへの変更
  • 複数ファイルにまたがるリファクタリング

設定の直し方

ClaudeCodeの承認設定はセッション中でも変更できる。

全承認モードから抜け出すには、ClaudeCodeのプロンプトで以下を実行する。

/permissions

または設定ファイル(~/.claude/settings.json)のallowedToolsを確認して、不要な自動許可を削除する。

リファクタリングのような「多くのファイルを触る可能性があるタスク」は、最初から手動承認モードで進めて、変更内容を1つずつ確認しながら進める方が結果的に速い。差し戻しになった後で全部やり直す時間の方がはるかに長いから。


まとめ

ClaudeCodeの承認確認は「邪魔なもの」ではなく「安全装置」だ。

面倒に感じるのはわかる。でも組み込み開発では「動いた」と「正しい」は別物で、「取り返しのつかない変更」が実機に入ってからでは遅い。承認を全部「はい」にすることは、その安全装置を全部外すことと同じだ。

「面倒だ」と思ったら、タスクの粒度を小さくする方向で解決するのが正しい。「このファイルのこの関数だけ」に絞れば、承認の頻度も下がるし、変更の影響範囲も把握しやすくなる。

全承認は便利そうに見えて、一番危ない使い方だった。


1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?