lefthookで既存マイグレーションファイルの変更をブロックする
AIエージェントにDB機能の実装を任せたら、既存のマイグレーションファイルを直接書き換えてしまった。CREATE TEMP TABLE → CREATE TABLE のような「テストを通すための修正」をマイグレーションに入れてしまうパターン。マイグレーションファイルは一度適用したら変更禁止が鉄則なので、ハーネス(ガードレール)として仕組み化した。
仕組み:
- lefthookのpre-commitフックで、既存マイグレーションファイルがstagingされていたらエラーにする
- CLAUDE.mdにルールを明記して、AIがそもそも編集しないよう指示する
- 新規マイグレーションの追加は許可、既存ファイルの変更のみブロック
# hook-migration-guard.sh の要点
MIGRATION_DIR="migrations"
CHANGED=$(git diff --cached --name-only -- "$MIGRATION_DIR/" | while read f; do
git show "HEAD:$f" 2>/dev/null && echo "$f" # HEADに存在する = 既存ファイル
done)
if [ -n "$CHANGED" ]; then
echo "ERROR: 既存マイグレーションファイルの変更は禁止です"
exit 1
fi
やってみてどうだったか:
- lefthookフックは人間・AI両方に効くので、CLAUDE.mdだけに頼るより確実
- 「テストを通すためにマイグレーションを変える」というAIの判断は合理的に見えるので、ルール明記だけだと突破されがち。仕組みでブロックするのが大事
- 次はCI側にも同様のチェックを入れたい