深夜、いくつものアプリ用リポジトリに溜まったビルドキャッシュを一掃したくて、その片付けを Claude Code に任せていました。
DerivedData、CocoaPods の Pods、React Native 側の node_modules、.build。個人開発で複数のアプリを並行して抱えていると、こうした中間生成物がディスクを静かに侵食していきます。
一つずつ手で消すのは退屈な作業です。だからこそエージェントに向いている——そう思っていました。
途中、ターミナルの表示が一瞬止まりました。実行されようとしていたのは、こういう形のコマンドでした。
rm -rf "${CACHE_ROOT}"/*CACHE_ROOT が、空でした。展開すれば rm -rf /* に化けるコマンドです。手が、少し冷たくなりました。
変数が空になっていた理由
原因はありふれたものでした。
掃除のスクリプトは、リポジトリごとにキャッシュの場所を環境変数へ入れてから回す設計にしていました。ところが対象の一つは、少し前にディレクトリ構成を変えたばかりのアプリでした。
想定していたパスが存在せず、CACHE_ROOT を組み立てる段階で値が入らなかったのです。シェルは未定義の変数を黙って空文字列として扱います。エラーも警告も出ません。
rm -rf "${CACHE_ROOT}"/* は、意図としては「このアプリのキャッシュだけを消す」でした。けれど空文字列に化けた瞬間、意味はまるで違うものになります。
個人開発では、テストもレビューも自分一人です。こういう取り違えを止めてくれる第二の目が、普段はいません。
auto モードが「文脈から解決できない変数」を見ていた
止めてくれたのは、Claude Code の auto モードでした。
2026年7月のアップデートで、auto モードはいくつかの安全側の挙動を既定に加えています。その一つが、文脈から値を解決できない変数を含む rm -rf は、実行前に確認を挟むというものです。
エージェントは CACHE_ROOT に確かな値を結び付けられませんでした。だから黙って走らせず、私に判断を返してきたのです。
ここで大切なのは、単純な「破壊的コマンドは全部止める」ではない点だと感じています。それでは確認が多すぎて、結局は読まずに承認する癖がつきます。
見ているのは「文脈から解決できるか」でした。値の裏付けが取れない削除だけを拾い上げる。この線引きは、任せる側の集中力を消耗させない配慮のように思えました。
あわせて、auto モードはセッション記録そのものの改ざんもブロックするようになっています。何を実行したかの痕跡が後から書き換えられない——放置気味に回す作業ほど、この一線は効いてきます。
Opus 4.8 に長い片付けを任せた手触り
同じ日、Claude Opus 4.8 が一般提供になりました。コーディングやエージェント的な作業、そして長い手順の一貫性が底上げされたモデルです。
今回の掃除は、リポジトリ数だけ手順が繰り返される、地味に長い仕事でした。各リポジトリでキャッシュ場所を確認し、消してよいものを見極め、消す。この往復を最後まで文脈を保ったまま進めてくれたのは、素直に助かりました。
一方で、任せきりにはしていません。
削除対象の一覧を、実行の前に必ずテキストで出してもらう。これは私が指示に加えた手順です。モデルが賢くなるほど、私の側の「確認の型」を明文化しておくことが効いてくると感じています。
削除に入る前の対象確認を、擬似コードで表すとこうなります。
# 消す前に、対象を必ず可視化してから承認する
for repo in "${REPOS[@]}"; do
cache="${repo}/build-cache"
# 値の裏付けが取れないパスは、そもそも削除ループに渡さない
if [ -z "${cache}" ] || [ ! -d "${cache}" ]; then
echo "skip: ${repo}(キャッシュ未確認)"
continue
fi
echo "delete candidate: ${cache}"
done[ -z "${cache}" ] の一行が、あの夜の空変数を弾く砦です。auto モードの事前確認と、自分のスクリプト側の防御。二重にしておくと、夜間に任せていても落ち着いていられます。
自分の運用に落とし込んだ確認ルール
今回の一件のあと、片付け系の作業をエージェントに任せるときの約束事を、いくつか言葉にしました。
| 場面 | 決めたこと |
|---|---|
| 削除の直前 | 対象の絶対パス一覧を必ずテキスト出力し、目で確認してから承認する |
| 変数の扱い | パスを組む変数は空チェックを必須にし、空ならその対象をスキップする |
| 権限 | rm -rf を含む手順は auto モードの事前確認を無効化しない |
| 記録 | 実行ログは改ざん不可の前提で残し、翌朝に何を消したか追える状態にする |
特別なことは何もありません。けれど個人開発の現場では、この当たり前を仕組みとして持っておけるかどうかが、安心して手を離せるかの分かれ目になります。
AdMob の設定や App Store 向けのビルドと違って、キャッシュ掃除は成果が見えにくい地味な作業です。だからこそ雑になりやすく、事故もそこで起きます。
これから取り組むこと
次は、掃除スクリプト自体に「ドライラン」を標準で組み込もうと考えています。まず消す予定の一覧だけを出し、私が了承したらもう一度同じ手順を実行に移す。auto モードの事前確認を、自分のツール側でも二重化しておきたいのです。
賢いエージェントに任せられる範囲は、確かに広がりました。同時に、任せる側が「どこで立ち止まってほしいか」を先に決めておく責任も、静かに増している気がします。
あの夜、冷たくなった手のことは、しばらく忘れないと思います。削除の前に一呼吸置いてくれた事前確認に、素直に感謝しています。同じように夜間へ作業を委ねている方の、小さな備えの参考になれば幸いです。お読みいただき、ありがとうございました。