概要
ndf:issue-plan-strategy(multi-PR ワークフロー)の実運用で、個別 PR の cross-review(codex+gemini 収束ループ)がスキップされ、軽量レビューのまま release ブランチへ merge されてしまう 問題が再現しました。結果として、本来 individual PR 段階で潰せたはずの重大バグが release 統合後まで残り、release PR でまとめて検出される(=アンチパターン「release PR で個別 PR 範囲の指摘を解決」に該当)状態になりました。
実際に起きたこと(再現ケース)
ある PLAN(6個の個別 PR + release PR)の実装フェーズで、メインエージェントが:
個別 PR (ndf/cross-review: gemini が result.json を TMP_DIR に書けず monitor.py が NO_RESULT を返す #7 〜Fix: fix skill の「コードコメント」→「インラインコメント」修正 #12 ) を ndf:code-reviewer エージェント(単一視点)でだけレビュー して release へ squash merge した。/ndf:cross-review は回さなかった。
全部 merge し終えてから、ユーザー指摘で release PR にだけ /ndf:cross-review を実行 したところ、8 ラウンドかけて以下のような重大バグが続々と検出 された:
BigQuery view の結合ミス(会員の最新 lead を使い、別申込の特徴量が混入=train/serve parity を直接破壊)
特徴量「年齢」が CURRENT_DATE() 基準で point-in-time leakage / feature drift (ML 致命)
採点対象の期間判定が会員作成日基準で、既存会員の新規申込(全体の約14%)を丸ごと取りこぼし
外部 API 配信の再送不能・重複再送など信頼性欠陥の連鎖
作業生成物(*.diff / pr_*.json 等)の誤コミット
これらは ndf:code-reviewer の単発レビューでは出ず、codex+gemini の cross-review で初めて検出 された。つまり個別 PR 段階で cross-review していれば各 PR 内で潰せたはずのものが、統合後にまとめて出た。
根本原因(推測)
Step 6 が cross-review を必須化していない 。issue-plan-strategy の Step 6 は「PR 作成前 self review = /ndf:review-branch / GitHub 上単体 = /ndf:review / 収束ループ = /ndf:cross-review」と選択肢として並列 に提示しており、「個別 PR は cross-review 必須」と読めない。実装を急ぐと最も軽い経路に流れる。
ndf:code-reviewer(単一エージェント)で代替してしまえる 余地がある。code-reviewer は単一視点で、codex+gemini の独立 2 エンジン収束より検出力が低い(今回まさにそれが顕在化)。
メインエージェント側の判断で「個別は軽く、release で厚く」に最適化しがちで、Step 7(release は結合観点のみ)の前提(=個別は既に cross-review 済み)が崩れる。
影響
個別 PR が既に close/merge 済みのため、release 段階で見つかったバグの修正コミットが「どの個別 PR の意図か」を辿りにくい(skill 自身がアンチパターンとして挙げている状態)。
重大バグ(parity 破壊・leakage・取りこぼし)が統合後まで生存する。
release PR の cross-review が無ければ完全に見逃していた可能性が高い。
提案
issue-plan-strategy および関連ドキュメントを以下のように強化してほしい:
Step 6 を「個別 PR は原則 /ndf:cross-review 必須」と明記 する。/ndf:review-branch は「PR 作成前の self review」に限定し、GitHub 上の収束は cross-review を既定とする。ndf:code-reviewer 単発での代替 merge を非推奨 として明示。
release PR の前提条件をチェックリスト化 : 「全個別 PR が cross-review approved 済みであること」を release PR Ready の前提に入れる(Step 7「release は結合観点のみ」と整合させる)。
個別 cross-review を省略した場合のフォールバックを公式化 : どうしても省略する運用なら「release PR で /ndf:cross-review を必須実行」と明記(今回の救済パターンの制度化)。ただし手戻りが増える旨も併記。
アンチパターン表に追記 : 「個別 PR を cross-review せず、code-reviewer / 単発レビューだけで release へ merge する」を追加。
可能なら、ワークフロー実行時に「個別 PR が cross-review 未実施のまま merge されようとしている」ことを検知・警告する仕組み(state やチェック)も検討。
環境
plugin: ndf 4.16.1
関連 skill: ndf:issue-plan-strategy, ndf:cross-review, ndf:code-reviewer
概要
ndf:issue-plan-strategy(multi-PR ワークフロー)の実運用で、個別 PR の cross-review(codex+gemini 収束ループ)がスキップされ、軽量レビューのまま release ブランチへ merge されてしまう問題が再現しました。結果として、本来 individual PR 段階で潰せたはずの重大バグが release 統合後まで残り、release PR でまとめて検出される(=アンチパターン「release PR で個別 PR 範囲の指摘を解決」に該当)状態になりました。実際に起きたこと(再現ケース)
ある PLAN(6個の個別 PR + release PR)の実装フェーズで、メインエージェントが:
ndf:code-reviewerエージェント(単一視点)でだけレビューして release へ squash merge した。/ndf:cross-reviewは回さなかった。/ndf:cross-reviewを実行したところ、8 ラウンドかけて以下のような重大バグが続々と検出された:CURRENT_DATE()基準で point-in-time leakage / feature drift(ML 致命)*.diff/pr_*.json等)の誤コミットこれらは
ndf:code-reviewerの単発レビューでは出ず、codex+gemini の cross-review で初めて検出された。つまり個別 PR 段階で cross-review していれば各 PR 内で潰せたはずのものが、統合後にまとめて出た。根本原因(推測)
issue-plan-strategyの Step 6 は「PR 作成前 self review =/ndf:review-branch/ GitHub 上単体 =/ndf:review/ 収束ループ =/ndf:cross-review」と選択肢として並列に提示しており、「個別 PR は cross-review 必須」と読めない。実装を急ぐと最も軽い経路に流れる。ndf:code-reviewer(単一エージェント)で代替してしまえる余地がある。code-reviewer は単一視点で、codex+gemini の独立 2 エンジン収束より検出力が低い(今回まさにそれが顕在化)。影響
提案
issue-plan-strategyおよび関連ドキュメントを以下のように強化してほしい:/ndf:cross-review必須」と明記する。/ndf:review-branchは「PR 作成前の self review」に限定し、GitHub 上の収束は cross-review を既定とする。ndf:code-reviewer単発での代替 merge を非推奨として明示。/ndf:cross-reviewを必須実行」と明記(今回の救済パターンの制度化)。ただし手戻りが増える旨も併記。環境
ndf:issue-plan-strategy,ndf:cross-review,ndf:code-reviewer