-
Notifications
You must be signed in to change notification settings - Fork 2
Description
背景
現在の 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で読み込むPrDatesにreviewRequestedAtを追加computeDatesで timeline items から最初の ReviewRequestedEvent の時刻を導出
2. pickup_time の計算を変更
review_requested_atがある →review_requested_at → first_reviewed_atreview_requested_atがない → 従来通りpull_request_created_at → first_reviewed_at
3. coding_time の計算を拡張
review_requested_atがある →first_committed_at → review_requested_atreview_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 — 定義の更新
- ダッシュボード — 変更不要(値が変わるだけ)