Skip to content

pickup_time の定義をレビュー依頼起点に修正する #252

@coji

Description

@coji

背景

現在の pickup_time は「PR作成(pull_request_created_at) → 最初のレビュー(first_reviewed_at)」で計算されている。

実際の運用では、PR作成とレビュー依頼のタイミングが異なるケースがある:

  • DO NOT MERGE で先にPRを出して議論し、後からレビュー依頼する
  • WIP的にPRを作成し、作業完了後にレビュー依頼する
  • PR作成後しばらく自分で修正を重ねてからレビュー依頼する

こうしたケースでは pickup_time に「作者の依頼遅延」と「レビュアーの着手遅延」が混在してしまい、ボトルネック分析の精度が下がる。

実データでの検証

あるチーム(20名規模、月400+ PR)のデータで検証したところ:

  • 79%のPRはPR作成と同時〜2時間以内にレビュー依頼しており、現行 pickup_time で問題なし
  • 残り21%ではPR作成→レビュー依頼に数時間〜数週間の差がある
  • 全体の p50 では 1.0日→0.8日で大差ないが、p75 では 4.54日→2.89日で1.6日の差
  • 特定メンバーの pickup_time が極端に長く見えていたが、実際にはレビュアーの着手遅延ではなく本人の依頼遅延が主因だった

「レビュアーが遅い」と「作者がレビュー依頼していない」を混同して、誤った施策を打つリスクがある。

現状の構造的問題

調査の結果、単に計算式を差し替えるだけでは対応できない構造的な問題が3つある。

問題 1: computeDates に timeline データが流れていない

loadPrArtifacts は commits, reviews, discussions しか読み込まず、timeline items はパイプラインに含まれていない。timeline items はレビュアー情報の構築(L273-276)でしか使われておらず、サイクルタイム計算に合流していない。

問題 2: buildRequestedAtMap のセマンティクスが合わない

buildRequestedAtMap はレビュアーごとの最新の依頼時刻を返す(re-request 対応)。PR 単位の「最初にレビュー依頼が出た時刻」を出すには、全 ReviewRequestedEvent の最小値が必要で、意味が違う。

問題 3: PrDates にイベント由来のマイルストーンが含まれていない

PrDates は PR メタデータ + レビュー/ディスカッションから導出した4つの時刻しか持たない。timeline イベント由来の時刻を含める設計になっていない。

方針

pickup_time の定義自体を修正する。新カラムを追加して並行運用するのではなく、定義を正しくする。

上記の構造的問題に対しては、timeline items を PrArtifacts に含めて computeDates でイベント列からマイルストーン時刻を導出する設計にする。詳細は docs/design-pickup-time-reform.md を参照。

サイクルタイムモデルの変更

現状:

|-- coding_time --|-- pickup_time --|-- review_time --|-- deploy_time --|
first_committed_at  pr_created_at    first_reviewed_at  merged_at        released_at

変更後:

|-------- coding_time ---------|-- pickup_time --|-- review_time --|-- deploy_time --|
first_committed_at    review_requested_at    first_reviewed_at  merged_at        released_at

pickup_time を「レビュー依頼→初回レビュー」に変えることで、純粋にレビュアーの着手遅延だけを測る指標にする。作者がレビュー依頼を遅らせた時間は coding_time に含まれる。

やること

1. パイプラインの修正

  • PrArtifacts に timeline items を追加し、loadPrArtifacts で読み込む
  • PrDatesreviewRequestedAt を追加
  • computeDates で timeline items から最初の ReviewRequestedEvent の時刻を導出

2. pickup_time の計算を変更

  • review_requested_at がある → review_requested_at → first_reviewed_at
  • review_requested_at がない → 従来通り pull_request_created_at → first_reviewed_at

3. coding_time の計算を拡張

  • review_requested_at がある → first_committed_at → review_requested_at
  • review_requested_at がない → 従来通り first_committed_at → pull_request_created_at

4. 既存データの再計算

デプロイ後に recalculate を実行して全PRを新定義で再計算する。スキーマ変更は不要。

影響範囲

  • batch/bizlogic/cycletime.ts — pickupTime(), codingTime(), totalTime() の計算ロジック変更
  • batch/github/pullrequest.ts — PrArtifacts, PrDates, computeDates, loadPrArtifacts の修正 + レビュアー構築での timeline 再利用
  • テストファイル — テストケース追加・修正
  • DATA_DICTIONARY.md — 定義の更新
  • ダッシュボード — 変更不要(値が変わるだけ)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions