shwldshwld20 days ago

lefthookで既存マイグレーションファイルの変更をブロックする

AIエージェントにDB機能の実装を任せたら、既存のマイグレーションファイルを直接書き換えてしまった。CREATE TEMP TABLECREATE 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側にも同様のチェックを入れたい