AIレビューだけでは足りない理由|仕様・テスト・期待動作をquality gateにする
AI生成コードの受け入れ条件を先に書き、ビルド・要件確認・独立した差分確認・AIによる設計レビューの順に判断する方法を、静的ページのメタデータ例と記録カードで整理します。
公開 2026.06.26 / 更新 2026.10.11
この記事のポイント
- 期待動作、禁止条件、境界値、検証方法を生成コードを見る前に書く
- 修正前の失敗と修正後の成功を、同じ入力と独立した期待値で比べる
- ビルド、要件確認、独立した差分・表示確認、AIによる残る設計レビューを順に行う
- FAIL、BLOCKED、NOT RUNをPASSへまとめず、足りない証拠を明記する
AIレビューだけではなぜ足りないのか
AIが生成したコードをAIにレビューさせると、どちらも同じ曖昧な仕様から推測してしまうことがあります。仕様がなければ、レビューはコードがコード自身に合っているかを見るだけになりがちです。
| 先に置くもの | 役割 | AIレビューに残すもの |
|---|---|---|
| 仕様 | 何を満たすべきか | 曖昧な要件の質問 |
| テスト | 壊れたら検知する | テスト不足の候補 |
| 受け入れ条件 | 完了の基準 | 境界条件の洗い出し |
| 手動確認URL | 実際の表示を見る | 見落としリスクの列挙 |
例:seoTitleが空だと記事タイトルが消える
これは架空のサンプルで受け入れ条件を組み立てる例です。article.titleが「記事A」、seoTitleが空白、descriptionが「説明A」、pathが「/articles/sample/」のとき、空白のseoTitleを採用せずtitleを使い、descriptionとcanonicalも入力どおりに出す要件を先に書きます。canonicalのoriginは例示用の https://example.com とし、URL末尾にはslashを一つ付ける方針にします。
| 入力 | 期待する結果 | 確認方法と境界条件 |
|---|---|---|
| title=記事A、seoTitle=空白、description=説明A、path=/articles/sample/ | 生成HTMLのtitleは記事A、descriptionは説明A、canonicalは https://example.com/articles/sample/ | 修正前後で同じ入力を使ってビルドし、生成HTMLの値を確認 |
| seoTitle=検索用タイトル | titleは検索用タイトル | 有効なSEO titleをfallbackで上書きしない |
| seoTitleが未指定・空文字・空白だけ | titleは記事A | 三つの入力を個別に確認し、空白を除いて扱う |
| path=/articles/sample と末尾slashありのpath | canonicalはどちらも https://example.com/articles/sample/ | 入力URLの末尾slashを正規化し、canonicalはslash一つの絶対URLにする |
| 証拠の時点 | 架空fixtureで捕まえる内容 | 判定 |
|---|---|---|
| 変更前 | seoTitleが空白の入力で、生成HTMLが <title></title> を出す。入力・生成ファイル・失敗した期待値を保存 | FAIL:titleを補う要件を満たさない |
| 変更後 | 同じ入力の生成HTMLで <title>記事A</title>、description、canonicalを確認し、境界入力も確かめる | PASS:書いた要件を満たす証拠がある |
`getMetadata(input)`の結果を同じ関数から作った期待値と比較する、修正後にsnapshotを更新してテストを通す、といった方法では自己充足になり得ます。期待値は「記事A」のように仕様から独立して固定し、生成されたHTMLと実際の表示を別に確認します。変更前の出力を残し、同じ入力で修正前の失敗と修正後の通過を比べてください。
要件を通してから、差分と表示を確認する
- ビルド:既存のビルドを実行し、生成物を更新できたか記録する。
- 要件確認:事前に書いた入力・期待値・境界条件を確認し、それぞれの証拠を残す。
- 独立した差分・表示確認:生成HTML、実際の表示、変更範囲、既存ページへの副作用を人が確認する。AIの説明だけで表示確認を済ませない。
- AIレビュー:最後に、要件確認で判定できない設計、保守性、アクセシビリティ、性能の懸念を尋ね、指摘ごとに根拠を確認する。AIレビューは失敗した要件確認を合格に変えない。
| 結果 | 意味 | 報告と次の動き |
|---|---|---|
| PASS | 必須要件と独立確認の証拠が揃った | 通ったcheck、生成HTML、残る任意のriskを添える |
| FAIL | 再現可能な要件または境界条件が外れた | 失敗した条件とbaselineとの差を示して修正へ戻す |
| BLOCKED | 環境・権限・入力不足で判定できない | 理由と必要な証拠を記し、PASSとは扱わない |
| NOT RUN | 予定したcheckや目視確認を実行していない | 未実行の項目を明示し、全体をPASSと報告しない |
## 受け入れ確認カード
- 変更・issue: [ ]
- 変更前のcommitと確認した挙動: [ ]
- 入力: [ ]
- 期待する結果: [ ]
- 境界条件: [ ]
- 禁止する副作用: [ ]
- ビルドの実行内容と結果: [PASS / FAIL / BLOCKED / NOT RUN + 証拠]
- 要件確認と期待値: [ ]
- 変更前に失敗した証拠: [ファイル / 出力 / 画面記録]
- 同じ入力で変更後に通った証拠: [ ]
- 独立した差分確認と目視結果: [ ]
- 残る設計上の疑問に対するAIレビュー: [ ]
- 全体の状態: [PASS / FAIL / BLOCKED / NOT RUN]
- 未確認の項目と担当者: [ ]よくある質問
この記事はAIコーディングを否定する話ですか?
否定ではありません。生成速度だけでなく、仕様、レビュー、テスト、保守、権限を含めた納品速度で見るための整理です。
CodexやClaude Codeに任せるなら何を先に決めるべきですか?
対象ファイル、触ってよい範囲、禁止操作、build/check、完了報告、差分レビュー、本番反映前の確認方法を先に決めます。
AIレビューは使わない方がよいですか?
使えます。ただし、仕様、テスト、期待動作を置いたうえで、設計上の違和感、未テスト境界、レビュー観点の漏れを探す補助として使うのが現実的です。