ワンクリックで
database-consistency-enable
.database_consistency.yml のチェッカーを1回の実行で1つずつ段階的に有効化するスキル。違反は自明なものは修正し、アプリ仕様上やむを得ないものは理由コメント付きでテーブル/カラム単位の個別無効化を行う。
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
メニュー
.database_consistency.yml のチェッカーを1回の実行で1つずつ段階的に有効化するスキル。違反は自明なものは修正し、アプリ仕様上やむを得ないものは理由コメント付きでテーブル/カラム単位の個別無効化を行う。
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
SOC 職業分類に基づく
| name | database-consistency-enable |
| description | .database_consistency.yml のチェッカーを1回の実行で1つずつ段階的に有効化するスキル。違反は自明なものは修正し、アプリ仕様上やむを得ないものは理由コメント付きでテーブル/カラム単位の個別無効化を行う。 |
| license | MIT |
| disable-model-invocation | true |
既存プロジェクトに database_consistency の全チェッカーを一度に有効化すると、大量の
指摘が一気に噴き出してレビュー不能になる。そこで 違反が出るまでは確認なしで1チェッカーずつ
有効化していき、違反が出た最初のチェッカーで止まってそれを潰しきる、という段階導入を支援する。
具体的には、ステップ2〜4(チェッカーを1つ選ぶ → 有効化 → 実行)を 違反が検出されるまで ユーザー確認を挟まず自動で繰り返す。違反ゼロのチェッカーは有効化したまま次のチェッカーへ すぐ進む。最初に違反が出たチェッカーで繰り返しを止め、ステップ5以降(違反への対応)に入る。
1サイクル=最初に違反が出たチェッカーを潰すところまで をこのスキルの実行単位とする。 1サイクルを完了したら 自動で次のチェッカーへは進まず、そこで停止してユーザーに制御を返す。 ユーザーが差分を確認し、問題なければコミットする運用を想定しているため。次のチェッカーへ 進めたい場合は、ユーザーが改めてこのスキルを起動する。
このスキルは特定プロジェクトに依存しない。DB の起動方法・コーディング規約・コメント記法・
テスト/lint コマンドなどは そのプロジェクトの流儀に従う(このスキルでは決め打ちしない)。
gem 一般の知見(チェッカー一覧・推奨有効化順・設定構文・All の落とし穴)は
references/checkers.md にまとめてある。設定を書くときは必ず参照すること。
段階導入を始める前に、4つの前提(gem・DB 接続・設定ファイル・CI)が揃っているか確認する。 各サブステップは「まず現状を確認し、既に満たされていればスキップ、未充足なら整える」 という形で進める。既に database_consistency を導入済みのプロジェクトでは大半が素通りになり、 未導入のプロジェクトではここで導入の起点まで一気に整えられる、というのが狙い。
Gemfile / Gemfile.lock に database_consistency があるか確認する。gem 'database_consistency', require: false を
追加し、そのプロジェクトの方法で bundle install する。記法・置き場所の詳細は
references/checkers.md の「gem の導入」を参照。
require: false。.database_consistency.yml を用意する.database_consistency.yml の現状を確認する。ファイルが無ければ
references/checkers.md の「設定ファイルのひな型」を使って、
全チェッカーを個別に enabled: false で列挙した状態で新規作成する。
All: enabled: false での一括無効化は 使わない(理由は references 参照)。bundle exec database_consistency が自動実行される仕組みがあるか確認する。
無ければ用意する。 具体的な workflow の組み方は
references/ci-setup.md を参照(DB サービス・スキーマのロード・
発火条件など、プロジェクトの CI 流儀に合わせて組む)。
CheckerName: とその下の enabled: false の ブロックごと削除 する。enabled: true への 書き換えではなく、削除 する点に注意。
bundle exec database_consistency を実行する。dependent: 等が単に抜けているだけのもの自明な対応漏れ は修正を作成・適用する。例:
MissingIndexChecker / MissingUniqueIndexChecker → migration で index を追加。
add_index には if_not_exists: true を付けて冪等に書く(schema.rb 未記録でも実 DB に
既存だと PG::DuplicateTable で落ちうるため。詳細は
references/checkers.md の「対応漏れ index の追加は if_not_exists: true
で冪等にする」)MissingDependentDestroyChecker → 親モデルに dependent: 付きの has_many / has_one を追加NullConstraintChecker → バリデーションと NULL 制約を整合させる
presence: true を追加する前に、対象カラムがいつ値をセットされるかを確認する。
has_secure_token(デフォルトの on: :initialize なら after_initialize)や
attribute :x, default: -> {...} は new した時点で値が入るため安全だが、
before_save / before_create などの before_ 系コールバックでセットされる値は
save 実行後にしか保証されない。後者に presence: true を追加すると、
valid? を単体で呼ぶ既存コード・テスト(save 前にバリデーションだけ確認するパターン)を
壊す。追加後は必ず対象モデルの関連 spec を実行して確認する(詳細は
references/checkers.md の「違反対応の落とし穴」を参照)。修正の具体的な書き方(migration の流儀、バリデーションの置き方など)は そのプロジェクトの コーディング規約に従う。
migration が発生する対応は、適用前に必ずユーザーに確認を取る。 index 追加・NULL 制約 変更など新規 migration を伴う修正は、勝手に作成・適用せず、内容を提示して承認を得てから進める。
on_delete 変更・index の貼り直しなど drop→再 add)を伴う場合は、
rollback できる書き方にする。 change の自動反転に頼らず reversible の up/down を
両方明示する。混在させると rollback が壊れる(詳細と Before/After 例は
references/checkers.md の「違反対応の落とし穴」を参照)。検証は
ステップ6の往復確認で行う。本番データの状態次第で失敗する migration は、承認の前に確認スクリプトで既存データを洗い出す。 対象は unique index の追加・NOT NULL 化・外部キーの追加(該当チェッカーは references/checkers.md の「本番データ依存チェッカー」を参照)。 これらは重複行・NULL 行・孤児行があると migration 自体が失敗するため、有効化を確定する前に データ側を確かめる。データ状態に依存しない migration(uniqueness を伴わない素の index 追加など) ではこの手順は不要。
tmp/)に作成する。同一チェッカーの違反群でも、参照(テーブル/カラム)ごとに「修正」と「個別無効化」を混在させて
よい。 とくに ForeignKeyChecker では、確認スクリプトで 孤児ゼロを確認できた参照だけ FK を
追加し、孤児が残る参照は理由コメント付きで個別無効化する、という分け方が現実的になる。後者の
理由コメントには「孤児クリーンアップ後に将来 FK を張る前提の暫定無効化であり、対応漏れではない」
ことを残す。チェッカー全体を無効に戻すのではなく、参照単位で混在させる。
制約を強化する対応(FK 追加・NOT NULL 化)は、既存の削除/更新経路を実行時に壊さないか
必ず検証する。 これは上記の「本番データ確認(孤児・NULL・重複)」とは別軸の確認で、migration
を伴う FK 追加・NOT NULL 化では 両方 踏む。対象は ForeignKeyChecker(FK 追加)と、
ColumnPresenceChecker / NullConstraintChecker で NOT NULL を強化する対応。
dependent: / before_destroy / after_destroy /
delete_all / destroy_all / 自前の一括削除メソッド / controller・Mutation の destroy
アクションを grep で辿る。PG::ForeignKeyViolation 等)で落ちること
(RED)を先に確認してから、削除/更新経路を直して通す(GREEN)。壊れ方の類型と直し方の一般論は
references/checkers.md の「FK 追加・NOT NULL 化は既存の削除/更新経路を
実行時に壊しうる」を参照。bundle exec database_consistency の exit 0 はスキーマとモデル定義の整合しか見ず、
ランタイムの制約違反は検出しない。既存テストも特定状態(公開済み等)を作らなければ素通りする。
ここを有効化確定の前に自分で潰さないと、レビュー(人手)で初めて気づいて後追い修正を重ねる
ことになる。before_destroy への
移動など)が仕様判断を伴って割れる場合や、本番データの破壊を伴いうる場合は、勝手に決めず
ユーザーに相談する。アプリ仕様上やむを得ない ものは、references/checkers.md の 「個別無効化の構文」に従い、テーブル/カラム単位 で無効化する。このとき:
belongs_to :contract
(外部キーカラムは contract_id)を無効化したい場合、キーは contract ではなく contract_id
にする。カラム単位のチェッカー(NullConstraintChecker 等)は内部でカラム名を見ているため、
association 名で書くと エラーにはならずに無効化が黙って効かない(違反が消えない)。
設定を書いたら必ず bundle exec database_consistency を再実行し、対象の違反が実際に
消えたことを確認する。belongs_to ... optional: true などの既存コメントを鵜呑みにせず、実際にそのカラムが
nil になる経路をコードで確認してから無効化する。 「連携先外部サービスのデータとの不整合を許容」
「退会済みユーザのケースを許容」といった意図を示すコメントがあっても、それは「設計者が
そう書いた事実」でしかなく「今のコードで実際に nil になる経路があるか」は別問題。
参照先モデルの has_many の dependent: オプション(:destroy / :restrict_with_error
ならレコードごと消えるか削除自体が禁止され、nil 化はされない)と、退会・解約処理のコードを
辿り、具体的な nil 化経路(メソッド名・行番号)を特定してから無効化する。経路が見当たらない
場合は「無効化ではなく presence バリデーションを追加できないか」を先に検討する。bundle exec database_consistency を実行し、違反ゼロ(exit 0) で終わることを確認する。
schema.rb が旧状態へ、再 migrate 後に新状態へ正しく戻ること
を目視する。FK の on_delete 変更・unique index の貼り直しなどが該当する。
change メソッドの自動反転と reversible ブロックの混在で rollback が壊れ
(二重削除・旧制約の復元漏れ)、デプロイの切り戻し時に初めて落ちる事故が起きうる。
database_consistency の exit 0 は最終状態しか見ないため、この欠陥は検出できない。
書き方と壊れ方の詳細は references/checkers.md の
「違反対応の落とし穴 / 既存制約を差し替える migration では change の自動反転に頼らない」を参照。違反ゼロのチェッカーはステップ2〜4の自動繰り返しの中で確認なしに連続有効化される。
最初に違反が出たチェッカーを1サイクルとして潰す:そのチェッカーについて、(a) 有効化
(設定からの削除)が済み、(b) 全違反が「修正」または「理由コメント付きの個別無効化」で解消され、
(c) bundle exec database_consistency が exit 0、になっていれば1サイクル完了。
本番データ依存の migration(unique index 追加・NOT NULL 化・FK 追加)を伴った場合は、(b) の前提
として確認スクリプトでの事前確認(開発で実行・報告し、本番はユーザーに委ねた)が済んでいること。
さらに FK 追加・NOT NULL 化を伴った場合は、(c) に加えて (d) 既存の削除/更新経路を実行時に
壊さないことを確かめるリグレッションテスト(特定状態を作って destroy/更新する)が通っていること。
exit 0 はランタイムの制約違反を検出しないため、(c) だけでは完了とみなさない。
1サイクルが完了したら、自動で次のチェッカーへは進まずここで停止し、ユーザーに制御を返す。 ユーザーが差分を確認 → 問題なければコミット、というレビュー単位での運用を想定しているため。 次のチェッカーへ進めたい場合は、ユーザーが改めてこのスキルを起動する。
GitHub PRのレビューコメントのうち、Hide・解決済みでないものだけを抽出して対応する。
Commit, push, and create or update a PR
GitHub Actions の CI 失敗を、失敗ジョブの特定 → ログからの原因抽出 → 原因分類 → ローカル再現 → 修正 → 検証まで体系的に進めるスキル。特に、失敗ログのノイズに埋もれて原因が見えないとき、環境依存でフレーキーに落ちているときに役立つ。修正に人の判断が必要な場合は、対話モードでは確認して中断し、--non-interactive 指定時はPRにコメントを投稿して中断する。
`bundle exec erblint app` の既存違反をファイル単位で無効化する todo ファイル群 (`.erb_lint_todo.yml` / `.erb-lint-rubocop-todo.yml`)を生成・初期化する手順。手動起動専用 (`/erblint-todo-init`)。todo を作り直したいときなど、一回性のセットアップ作業でのみ使う。 rubocop 単体・haml-lint・herb-lint の運用には使わない。
プランモードで作成したプランファイル(Markdown)の内容に沿って実装を行う。実装フェーズを軽量なsonnetモデルで実行し、コスト・速度を最適化する。引数でプランファイルのパスを指定できる。省略時は直近のセッションログから対象プランを自動特定してユーザーに確認する。コミット・push・PR作成は、プランに明記されている場合のみ実施する。
APM パッケージ由来ルール(.claude/rules/*.md)と重複するプロジェクト固有ローカルルール (.apm/instructions/*.local.instructions.md)を検出し、ローカル側を削除・縮小する。未管理ルールの 新規移行は行わない(それは migrate-rules-to-apm の役割)。手動実行専用(自動トリガーしない)。