Skip to content

[issue-plan-strategy] 個別PRの cross-review がスキップされ、重大バグが release 統合後まで残る #35

Description

@takemi-ohama

概要

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)の実装フェーズで、メインエージェントが:

  1. 個別 PR (ndf/cross-review: gemini が result.json を TMP_DIR に書けず monitor.py が NO_RESULT を返す #7Fix: fix skill の「コードコメント」→「インラインコメント」修正 #12) を ndf:code-reviewer エージェント(単一視点)でだけレビューして release へ squash merge した。/ndf:cross-review は回さなかった。
  2. 全部 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 内で潰せたはずのものが、統合後にまとめて出た。

根本原因(推測)

  1. Step 6 が cross-review を必須化していないissue-plan-strategy の Step 6 は「PR 作成前 self review = /ndf:review-branch / GitHub 上単体 = /ndf:review / 収束ループ = /ndf:cross-review」と選択肢として並列に提示しており、「個別 PR は cross-review 必須」と読めない。実装を急ぐと最も軽い経路に流れる。
  2. ndf:code-reviewer(単一エージェント)で代替してしまえる余地がある。code-reviewer は単一視点で、codex+gemini の独立 2 エンジン収束より検出力が低い(今回まさにそれが顕在化)。
  3. メインエージェント側の判断で「個別は軽く、release で厚く」に最適化しがちで、Step 7(release は結合観点のみ)の前提(=個別は既に cross-review 済み)が崩れる。

影響

  • 個別 PR が既に close/merge 済みのため、release 段階で見つかったバグの修正コミットが「どの個別 PR の意図か」を辿りにくい(skill 自身がアンチパターンとして挙げている状態)。
  • 重大バグ(parity 破壊・leakage・取りこぼし)が統合後まで生存する。
  • release PR の cross-review が無ければ完全に見逃していた可能性が高い。

提案

issue-plan-strategy および関連ドキュメントを以下のように強化してほしい:

  1. Step 6 を「個別 PR は原則 /ndf:cross-review 必須」と明記する。/ndf:review-branch は「PR 作成前の self review」に限定し、GitHub 上の収束は cross-review を既定とする。ndf:code-reviewer 単発での代替 merge を非推奨として明示。
  2. release PR の前提条件をチェックリスト化: 「全個別 PR が cross-review approved 済みであること」を release PR Ready の前提に入れる(Step 7「release は結合観点のみ」と整合させる)。
  3. 個別 cross-review を省略した場合のフォールバックを公式化: どうしても省略する運用なら「release PR で /ndf:cross-review を必須実行」と明記(今回の救済パターンの制度化)。ただし手戻りが増える旨も併記。
  4. アンチパターン表に追記: 「個別 PR を cross-review せず、code-reviewer / 単発レビューだけで release へ merge する」を追加。
  5. 可能なら、ワークフロー実行時に「個別 PR が cross-review 未実施のまま merge されようとしている」ことを検知・警告する仕組み(state やチェック)も検討。

環境

  • plugin: ndf 4.16.1
  • 関連 skill: ndf:issue-plan-strategy, ndf:cross-review, ndf:code-reviewer

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions