Skip to main content

すべてのPRで移行チェックリストを徹底する

Devinが破壊的な操作を検出し、ロールバックの安全性を確認し、PRでデータベースマイグレーションに変更があったときにスキーマ変更を検証するリポジトリスキルを構築します。
AuthorCognition
CategoryCore Devin
FeaturesSkills
1

マイグレーションチェックリストスキルを作成する

リポジトリスキルとは、任意のリポジトリ内の .agents/skills/<your-skill>/ にコミットする Markdown ファイルのことです。Devin は、接続されているすべてのリポジトリに存在するすべてのスキルを把握しており、手動でトリガーすることも、関連する状況を検知したときに自動的にトリガーさせることもできます。このスキルは、PR を作成または更新する前にデータベースマイグレーションをどのようにレビューすべきかを Devin に正確に指示し、通常のコードレビューでは見逃されがちなミスも検知できるようにします。.agents/skills/migration-checklist/migration-checklist.md をあなたのリポジトリにコミットしてください。
# マイグレーション安全チェックリスト

## 説明
現在のPRに含まれるすべてのデータベースマイグレーションについて、プルリクエストを作成または更新する前に安全上の問題を確認する。

## 使用タイミング
PRの差分に `db/migrate/`(Rails)、`migrations/`(Django)、または `prisma/migrations/`(Prisma)内の新規ファイルや変更ファイルが含まれる場合に、このスキルを呼び出す。

## チェックリスト

### 1. 破壊的操作の検出
各マイグレーションファイルで以下を確認する:
- `DROP TABLE` または `drop_table`
- `DROP COLUMN``remove_column`、またはカラムの削除
- `TRUNCATE`
- 精度が失われるデータ型の変更(例:`text``varchar(50)`

該当する操作が見つかった場合は、その操作を指摘するPRコメントを追加し、マイグレーション内にデータバックアップ手順が存在するかどうかを確認する。

### 2. 外部キーインデックスの確認
`add_reference``add_foreign_key`、または `_id` で終わる新しいカラムごとに、対応するインデックスが存在することを確認する。存在しない場合は、コミット前にマイグレーションへ追加する。

### 3. ロールバック安全性の確認
- テストデータベースに対して `bin/rails db:migrate:rollback STEP=<n>`(n = 新規マイグレーション数)を実行する。
- ロールバックが失敗した場合は、`down` メソッドまたは reversible ブロックを追加して再試行する。
- 元に戻せないマイグレーションがある場合は、PRの説明に記載する。

### 4. スキーマファイルの最新状態の確認
マイグレーション実行後、`db/schema.rb`(または `structure.sql`)をPR内のバージョンと差分比較する。差異がある場合は、スキーマファイルを再生成してコミットに含める。

### 5. モデルテストの実行
`bin/rails test test/models/` を実行し、スキーマ変更によって壊れたバリデーションやアソシエーションを検出する。PRを作成する前に、すべてのテストがパスしていなければならない。
このファイルをコミットすると、Devin はそれを利用可能なスキルとして認識します。このリポジトリ内のマイグレーションファイルをセッションが扱うたびに、Devin が自動的にそのチェックリストを起動できますし、必要なときに任意のタイミングで手動実行することもできます。
2

実際のマイグレーションでスキルトリガーを確認する

Devin がマイグレーションファイルを追加・変更するタスクに取り組むときは、diff を読み取り、マイグレーションチェックリストスキルに該当すると判断し、PR を開く前にチェックリストに従います。実際の流れは次のとおりです。
  1. diff をスキャンする — Devin は db/migrate/ に新しいファイルがあることに気づき、マイグレーションチェックリストスキルを有効化します
  2. 破壊的な操作を検知する — マイグレーションで legacy_email カラムを削除しています。Devin は PR コメントを追加します:
    remove_column :users, :legacy_email は破壊的な操作です。 確認結果: マイグレーションには、削除前に値を user_archives にコピーするデータバックアップ手順が含まれています。
  3. 不足しているインデックスを追加する — マイグレーションは invoices テーブルに account_id を追加しますが、インデックスがありません。Devin はマイグレーションファイルに add_index :invoices, :account_id を追記します
  4. ロールバックを実行する — Devin はテストデータベースに対して bin/rails db:migrate:rollback STEP=1 を実行します。問題なく完了します
  5. スキーマを再生成する — Devin は bin/rails db:schema:dump を実行し、db/schema.rb に diff があることを検出して、更新されたファイルをコミットに含めます
  6. モデルテストを実行する — すべてのモデルテストが成功します。Devin は各チェックの要約付きで PR を作成します
PR の説明文には、どのチェックが通り、Devin が何を修正したかを示すチェックリストが含まれるため、レビュアーはマイグレーション作業の手順ではなくビジネスロジックに集中できます。
3

スキルを自分のORMやスタック向けにカスタマイズする

上のチェックリストは Rails を対象にしていますが、同じ構成は任意の ORM で利用できます。Devin に、あなたのスタック向けにこのスキルを書き換えるよう指示してください:
4

チェックリストを継続的に拡張する

移行インシデントが起きるたびに、チェックリストではカバーしきれていない抜けが明らかになります。そのたびにルールを1つ追加しましょう — skill ファイルに1行コミットするだけです。以下は、実際のインシデント後にチームがよく追加しているルールの例です。
### 6. Enforce migration naming conventions
Reject migrations that don't follow the pattern
`YYYYMMDDHHMMSS_verb_noun.rb` (e.g. `add_index_to_invoices`).
Rename the file if needed.

### 7. Check for long-running locks
Flag any `add_column` on tables with >1M rows that doesn't use
`disable_ddl_transaction!` (Postgres) or `ALGORITHM=INPLACE`
(MySQL). Large tables need non-blocking migrations.

### 8. Require a migration test
Ensure a corresponding test file exists at
`test/migrations/YYYYMMDDHHMMSS_migration_name_test.rb`.
If missing, generate a skeleton test that runs the migration
up and down.
スキルファイルはリポジトリ内にあるため、これらのルールはコードレビューの対象となり、何をチェックするかをチーム全体で合意でき、常に移行ツールと同期した状態を保てます。