Skip to content

[#1893] resync-merge-conflicts - #1895

Open
nrslib wants to merge 1 commit into
mainfrom
takt/1893/resync-merge-conflicts
Open

nrslib wants to merge 1 commit into
mainfrom
takt/1893/resync-merge-conflicts

Conversation

@nrslib

@nrslib nrslib commented Oct 24, 2026 •

Copy link
Copy Markdown
Owner

Summary

takt merge の並列実行で後から競合した PR を取り込み直してマージまで進める

背景

takt merge を並列で動かしていると、片方の PR が先にマージされたことで、もう片方の PR が土台ブランチと競合する。現状のマージ用 workflow は、最初の同期(土台を PR に取り込み、競合があれば AI で解消して push)でしか土台との競合を見ておらず、レビュー・修正・Caccia・CI 待ちの後に GitHub の mergeable が CONFLICTING になっていると、「mergeability is CONFLICTING」とコメントして COMPLETE(マージしない)で止まる。再同期も再試行もせず、利用者が takt merge <番号> を打ち直す必要がある。

目的

並列実行中に別の PR が先にマージされて対象 PR が土台と競合しても、止まらずに土台を取り込み直し、マージまで進められるようにする。回数には上限を設け、上限を超えたら今と同じくコメントして止める。

作業範囲

優先度 高: 競合時の取り込み直しをマージ用 workflow に入れる

対象は、takt merge が実行するマージまで進む builtin のマージ用 workflow(ja / en)。

  • CI 待ちの後に GitHub の mergeable が CONFLICTING なら、コメントして止める代わりに、土台の取り込み直しへ戻る。取り込み直しは既存の同期(土台を PR に取り込んで push)と競合解消(競合を AI で解消して push)をそのまま使う
  • 取り込み直しの後は review をやり直さない。push 後の Caccia → CI 待ち → マージ可否の確認 → マージへ進む。競合解消の差分は Caccia(CodeRabbit)と CI で確認する
  • 取り込み直しに入るのは CONFLICTING のときだけ。競合は無く土台が進んだだけ(BEHIND)の場合は今までどおりそのままマージを試みる
  • 取り込み直しの回数には上限を設ける。上限は「その実行の並列数 − 1、ただし最低 2」。並列数は merge.concurrency と CLI の --concurrency で決まった実行時の値で、設定が動的でも上限がそれに追従する
  • 上限を超えたら、今と同じく PR にコメントして COMPLETE(マージしない)
  • 競合しない PR の流れは今と変えない。最初の同期と競合解消の動き、Caccia、CI 失敗の回復処理、並列数の既定値(2)は変えない

優先度 中: ドキュメント

利用者から見える挙動が変わるので、takt merge とマージ用 workflow を説明している docs(日英)に、競合時の取り込み直しと上限の規則を書き、CHANGELOG に記載する。

優先度 中: テストとゲート

  • 後述の Gherkin の振る舞いをテストで確認できるようにする。既存のマージ用 workflow の実行テストに揃える
  • 追加・変更したテストを tsconfig.tests.json と scripts/test-classification.mjs に正しく登録する
  • npm run build、npm run lint、対象テストを通す

参考となる現状の証拠(必須の変更対象や方式ではない)

実行ワークフローが現状を調査し、変更対象と方式を決める。

  • 既定のマージ用 workflow は merge-review-fix-simple。merge-review-fix もマージまで進む。merge-review はコメントだけでマージしない
  • 現状の流れは、同期 → 競合解消 → レビュー・修正 → push → Caccia → CI 待ち → マージ可否の確認 → マージ。CONFLICTING なら unmergeable に進んでコメントして COMPLETE
  • workflow の when(...) 条件は設定を直接読めず、system step が返した値だけを読める。一方で system step は設定を読める(Caccia 効果が caccia.enabled を読んでいるのと同じ形)
  • エンジンは各 step の実行回数を持っており、CI 失敗の回復処理の「修正は最大 2 周」は fix_push step の実行回数を fixRounds として読んでいる。取り直しの回数も同じ取り方ができる
  • CLI の --concurrency で上書きされた並列数を再開(Requeue / Retry)でも同じ値で使うには、takt merge がタスクを作るときにタスクのデータへ記録する方法がある。脅威検査の上限 merge_threat_check_max_diff_bytes が同じ方法で記録されている
  • 会話で挙がった実現方法の候補は、同期の step が「これまでの取り直し回数」と「この実行の上限」の 2 つの数を返し、YAML が when(回数 < 上限) で戻るか止まるかを分岐する形。採用するかはワークフローの判断でよい
  • 合意した起点は CI 待ち後の mergeable の判定。判定からマージ実行までの間に別の PR がマージされて実際のマージが失敗する場合の扱いは、現状の merge_failed の経路を調べたうえでワークフローが決める

期待する振る舞い

Feature: takt merge で競合した PR の取り込み直し

  Background:
    Given マージまで進む builtin のマージ用 workflow で takt merge を実行している

  Rule: CI 待ちの後に競合していれば取り込み直してマージまで進む

    Scenario: 並列実行中に片方が先にマージされて競合する
      Given 並列数 2 で同じファイルを触る 2 本の PR を takt merge にかけている
      And 片方の PR が先にマージされ、もう片方の PR が CI 待ちの後に CONFLICTING になった
      When マージ可否を確認する
      Then 土台を取り込み直し、競合を解消して push する
      And review はやり直さず、Caccia と CI 待ちを経て CI が通る
      And その PR はマージされる

    Scenario: BEHIND だけの PR はそのままマージする
      Given CI 待ちの後に PR の mergeable が BEHIND で、競合は無い
      When マージ可否を確認する
      Then 取り込み直しには入らず、そのままマージを試みる

    Scenario: 競合しない PR の流れは変わらない
      Given CI 待ちの後に PR の mergeable が CONFLICTING ではない
      When マージ可否を確認する
      Then 現在と同じ手順でマージまで進む

  Rule: 取り込み直しの回数は実行時の並列数で決まる上限を超えない

    Scenario Outline: 上限は並列数 − 1、ただし最低 2
      Given この実行の並列数が <concurrency> である
      When 取り込み直しの上限を決める
      Then 上限は <limit> 回である

      Examples:
        | concurrency | limit |
        | 2           | 2     |
        | 3           | 2     |
        | 4           | 3     |

    Scenario: 上限に達したら止める
      Given 取り込み直しを上限の回数まで行った
      And CI 待ちの後にまた CONFLICTING になった
      When マージ可否を確認する
      Then 取り込み直しには入らず、PR にコメントして COMPLETE になる
      And その PR はマージされない

形式仕様(Quint)

module mergeResync {
  // 1 本の PR がマージ用 workflow のどの段階にいるかを表す。
  //   "synced"   : 土台ブランチを PR に取り込んで push した直後(最初の同期の後、または取り込み直しの後)。
  //                この後にレビュー・修正・Caccia・CI 待ちが続く。
  //   "ciPassed" : CI 待ちが終わり、GitHub の mergeable を確認してマージ可否を判定する段階。
  //   "merged"   : PR がマージされた最終状態。ここから他の状態には遷移しない。
  //   "stopped"  : 取り込み直しの上限に達したうえで競合していたため、PR にコメントして
  //                マージせずに COMPLETE した最終状態。ここから他の状態には遷移しない。
  var mode: str

  // CI 待ちの後に GitHub から得た PR の mergeable の状態。
  //   "clean"       : 土台と競合せず、土台にも遅れていない。そのままマージできる。
  //   "behind"      : 競合は無いが土台が進んでいる。取り込み直しはせず、そのままマージを試みる。
  //   "conflicting" : 別の PR が先にマージされたなどで土台と競合している。
  //                   取り込み直しの対象になるのはこの値のときだけ。
  var mergeable: str

  // この takt merge 実行の並列数。merge.concurrency と CLI の --concurrency で決まり、
  // 実行の途中では変わらない。モデルでは 2、3、4 のいずれかに有界化する。
  var concurrency: int

  // これまでに土台の取り込み直しを行った回数。最初の同期は数えない。0 から始まり、
  // 取り込み直しのたびに 1 増え、上限を超えることはない。
  var resyncs: int

  // 取り込み直しの上限の規則。「並列数 − 1、ただし最低 2」。
  // 並列数 2 なら 2 回、並列数 3 なら 2 回、並列数 4 なら 3 回まで取り込み直せる。
  def limitOf(c: int): int = if (c - 1 > 2) c - 1 else 2

  // この実行の取り込み直しの上限。並列数から規則どおりに決まる。
  val limit = limitOf(concurrency)

  // 開始状態。最初の同期が終わって push した直後で、取り込み直しの回数は 0。
  // 並列数は 2、3、4 のどれかで、この実行の間は固定される。
  action init =
    nondet c = Set(2, 3, 4).oneOf()
    all {
      mode' = "synced",
      mergeable' = "clean",
      concurrency' = c,
      resyncs' = 0,
    }

  // レビュー・修正・Caccia・CI 待ちを経て CI が通り、マージ可否の判定に進む。
  // この間に別の PR がマージされることがあるので、mergeable は clean、behind、conflicting の
  // どれにもなりうる。取り込み直しのたびにこの判定をやり直すので、競合は毎回起こりうる。
  action passCi =
    nondet m = Set("clean", "behind", "conflicting").oneOf()
    all {
      mode == "synced",
      mode' = "ciPassed",
      mergeable' = m,
      concurrency' = concurrency,
      resyncs' = resyncs,
    }

  // マージ可否の判定で競合していなければ(clean または behind)、取り込み直しをせずに
  // そのままマージする。behind だけの PR も取り込み直さずにマージすることを保証する。
  action mergeNow = all {
    mode == "ciPassed",
    mergeable != "conflicting",
    mode' = "merged",
    mergeable' = mergeable,
    concurrency' = concurrency,
    resyncs' = resyncs,
  }

  // マージ可否の判定で競合していて、取り込み直しの回数がまだ上限未満なら、
  // コメントして止める代わりに土台を取り込み直す。競合を解消して push するので
  // 取り込み直し直後は競合が無い状態に戻り、回数が 1 増える。レビューはやり直さず、
  // この後は再び Caccia・CI 待ち・マージ可否の判定に進む。
  action resync = all {
    mode == "ciPassed",
    mergeable == "conflicting",
    resyncs < limit,
    mode' = "synced",
    mergeable' = "clean",
    concurrency' = concurrency,
    resyncs' = resyncs + 1,
  }

  // マージ可否の判定で競合していて、取り込み直しの回数が既に上限に達していれば、
  // 取り込み直しには入らず、PR にコメントしてマージせずに COMPLETE する。
  action stop = all {
    mode == "ciPassed",
    mergeable == "conflicting",
    resyncs >= limit,
    mode' = "stopped",
    mergeable' = mergeable,
    concurrency' = concurrency,
    resyncs' = resyncs,
  }

  // マージ済み、または止まった後は何も起きない。最終状態が維持されることを表す。
  action stay = all {
    mode == "merged" or mode == "stopped",
    mode' = mode,
    mergeable' = mergeable,
    concurrency' = concurrency,
    resyncs' = resyncs,
  }

  // 1 本の PR に起こりうる遷移は上の 5 つだけ。
  action step = any { passCi, mergeNow, resync, stop, stay }

  // 取り込み直しの回数は、この実行の上限(並列数 − 1、最低 2)を決して超えない。
  val invResyncWithinLimit = resyncs <= limit

  // 上限が並列数に追従すること。並列数 2 なら 2、並列数 3 なら 2、並列数 4 なら 3。
  val invLimitFollowsConcurrency = and {
    concurrency == 2 implies limit == 2,
    concurrency == 3 implies limit == 2,
    concurrency == 4 implies limit == 3,
  }

  // 並列数は実行の間ずっと 2、3、4 のいずれかで、途中で変わらない。
  val invConcurrencyBounded = Set(2, 3, 4).contains(concurrency)

  // 競合したままマージされることはない。マージ済みの PR は、最後の判定で
  // clean か behind だった。
  val invMergedNotConflicting = mode == "merged" implies mergeable != "conflicting"

  // マージせずに止まるのは、取り込み直しを上限の回数までやりきったうえで、
  // それでもなお競合していたときだけ。上限未満で止まることはない。
  val invStoppedOnlyAtLimit =
    mode == "stopped" implies (mergeable == "conflicting" and resyncs == limit)

  // 一度マージされた PR は、その後もずっとマージ済みのまま。取り込み直しや停止に戻らない。
  temporal propMergedIsFinal = always(mode == "merged" implies always(mode == "merged"))

  // 一度コメントして止まった PR は、その後もずっと止まったまま。勝手に取り込み直しや
  // マージに進まない。
  temporal propStoppedIsFinal = always(mode == "stopped" implies always(mode == "stopped"))
}

形式仕様(Alloy)

open util/integer

// 1 本の PR がマージ用 workflow のどの段階にいるか。
//   Synced   : 土台ブランチを PR に取り込んで push した直後(最初の同期の後、または取り込み直しの後)。
//   CiPassed : CI 待ちが終わり、GitHub の mergeable を確認してマージ可否を判定する段階。
//   Merged   : PR がマージされた最終状態。
//   Stopped  : 取り込み直しの上限に達したうえで競合していたため、コメントしてマージせずに止まった最終状態。
abstract sig Mode {}
one sig Synced, CiPassed, Merged, Stopped extends Mode {}

// CI 待ちの後に GitHub から得た PR の mergeable の状態。
//   Clean       : 競合せず、土台にも遅れていない。そのままマージできる。
//   Behind      : 競合は無いが土台が進んでいる。取り込み直しはせず、そのままマージを試みる。
//   Conflicting : 別の PR が先にマージされたなどで土台と競合している。取り込み直しの対象になるのはこの値のときだけ。
abstract sig Mergeable {}
one sig Clean, Behind, Conflicting extends Mergeable {}

// takt merge で処理している 1 本の PR。
//   mode        : 現在の段階(時間とともに変わる)。
//   mergeable   : 最後に確認した mergeable の状態(時間とともに変わる)。
//   resyncs     : これまでの取り込み直しの回数。最初の同期は数えない(時間とともに増える)。
//   concurrency : この実行の並列数。merge.concurrency と CLI の --concurrency で決まり、実行の途中では変わらない。
one sig Pr {
  var mode: one Mode,
  var mergeable: one Mergeable,
  var resyncs: one Int,
  concurrency: one Int
}

// 取り込み直しの上限の規則。「並列数 − 1、ただし最低 2」。
// 並列数 2 なら 2 回、並列数 3 なら 2 回、並列数 4 なら 3 回まで取り込み直せる。
fun limit: Int {
  let c = minus[Pr.concurrency, 1] | (c > 2) => c else 2
}

// 開始状態。最初の同期が終わって push した直後で、取り込み直しの回数は 0。
// 並列数は 2、3、4 のいずれかに有界化し、実行の間は固定される。
fact initial {
  Pr.mode = Synced
  Pr.mergeable = Clean
  Pr.resyncs = 0
  Pr.concurrency in 2 + 3 + 4
}

// レビュー・修正・Caccia・CI 待ちを経て CI が通り、マージ可否の判定に進む。
// この間に別の PR がマージされることがあるので、mergeable は Clean、Behind、Conflicting のどれにもなりうる。
// 取り込み直しのたびにこの判定をやり直すので、競合は毎回起こりうる。
pred passCi {
  Pr.mode = Synced
  Pr.mode' = CiPassed
  Pr.mergeable' in Clean + Behind + Conflicting
  Pr.resyncs' = Pr.resyncs
}

// 判定で競合していなければ(Clean または Behind)、取り込み直しをせずにそのままマージする。
// Behind だけの PR も取り込み直さずにマージすることをこの遷移が保証する。
pred mergeNow {
  Pr.mode = CiPassed
  Pr.mergeable != Conflicting
  Pr.mode' = Merged
  Pr.mergeable' = Pr.mergeable
  Pr.resyncs' = Pr.resyncs
}

// 判定で競合していて、取り込み直しの回数がまだ上限未満なら、コメントして止める代わりに土台を取り込み直す。
// 競合を解消して push するので直後は競合が無い状態に戻り、回数が 1 増える。
// レビューはやり直さず、この後は再び Caccia・CI 待ち・マージ可否の判定に進む。
pred resync {
  Pr.mode = CiPassed
  Pr.mergeable = Conflicting
  Pr.resyncs < limit
  Pr.mode' = Synced
  Pr.mergeable' = Clean
  Pr.resyncs' = plus[Pr.resyncs, 1]
}

// 判定で競合していて、取り込み直しの回数が既に上限に達していれば、取り込み直しには入らず、
// PR にコメントしてマージせずに止まる。
pred stop {
  Pr.mode = CiPassed
  Pr.mergeable = Conflicting
  Pr.resyncs >= limit
  Pr.mode' = Stopped
  Pr.mergeable' = Pr.mergeable
  Pr.resyncs' = Pr.resyncs
}

// マージ済み、または止まった後は何も起きない。最終状態が維持されることを表す。
pred stay {
  Pr.mode in Merged + Stopped
  Pr.mode' = Pr.mode
  Pr.mergeable' = Pr.mergeable
  Pr.resyncs' = Pr.resyncs
}

// 1 本の PR に起こりうる遷移は上の 5 つだけ。どの状態でも必ずどれかの遷移が可能で、
// 最終状態では stay が繰り返される。
fact traces {
  always (passCi or mergeNow or resync or stop or stay)
}

// モデルの制約が矛盾していないことの整合性確認。
run {} for 3 but 4 Int, 10 steps

// 到達可能性: 競合して取り込み直した後に、CI が通ってマージされる経路が存在する。
run reachMergeAfterResync {
  eventually (Pr.mode = Merged and Pr.resyncs > 0)
} for 3 but 4 Int, 10 steps

// 到達可能性: 並列数 4 のとき、上限の 3 回まで取り込み直したうえでなお競合し、コメントして止まる経路が存在する。
run reachStopAtLimit {
  Pr.concurrency = 4
  eventually (Pr.mode = Stopped and Pr.resyncs = 3)
} for 3 but 4 Int, 10 steps

// 到達可能性: Behind だけの PR が取り込み直さずにそのままマージされる経路が存在する。
run behindMergesDirectly {
  eventually (Pr.mode = CiPassed and Pr.mergeable = Behind and after Pr.mode = Merged)
} for 3 but 4 Int, 10 steps

// 取り込み直しの回数は、この実行の上限(並列数 − 1、最低 2)を決して超えない。
check resyncWithinLimit {
  always (Pr.resyncs <= limit)
} for 3 but 4 Int, 10 steps

// 上限が並列数に追従する。並列数 2 なら 2、並列数 3 なら 2、並列数 4 なら 3。
check limitFollowsConcurrency {
  (Pr.concurrency = 2 implies limit = 2) and
  (Pr.concurrency = 3 implies limit = 2) and
  (Pr.concurrency = 4 implies limit = 3)
} for 3 but 4 Int, 10 steps

// 競合したままマージされることはない。マージ済みの PR は最後の判定で Clean か Behind だった。
check mergedNotConflicting {
  always (Pr.mode = Merged implies Pr.mergeable != Conflicting)
} for 3 but 4 Int, 10 steps

// マージせずに止まるのは、取り込み直しを上限の回数までやりきったうえで、それでもなお競合していたときだけ。
check stoppedOnlyAtLimit {
  always (Pr.mode = Stopped implies (Pr.mergeable = Conflicting and Pr.resyncs = limit))
} for 3 but 4 Int, 10 steps

// 一度マージされた PR はその後もマージ済みのまま、一度止まった PR はその後も止まったまま。
check terminalStable {
  always ((Pr.mode = Merged implies always Pr.mode = Merged) and
          (Pr.mode = Stopped implies always Pr.mode = Stopped))
} for 3 but 4 Int, 10 steps

受け入れ条件

  • 「期待する振る舞い」の Gherkin に記した振る舞いがテストで確認できる
  • 競合しない PR の流れ、最初の同期と競合解消、Caccia、CI 失敗の回復処理、並列数の既定値が今と変わらない
  • docs(日英)と CHANGELOG に競合時の取り込み直しと上限の規則が書かれている
  • npm run build、npm run lint、対象テストが通り、追加・変更したテストが tsconfig.tests.json と scripts/test-classification.mjs に登録されている

Execution Report

Workflow default completed successfully.

Closes #1893

Summary by CodeRabbit

  • 機能改善
    • CI完了後にPRが競合状態の場合、ベースブランチとの再同期と競合解消を行い、更新したHEADでCIを再確認するようになりました。初回レビューは繰り返しません。
    • 再同期の上限は実行時の並列数に応じて設定され、再実行や再キュー後も維持されます。上限後も競合が続く場合は理由をコメントし、マージせず処理を完了します。
    • ベースブランチより遅れているだけのPRは、再同期せず従来のマージ判定へ進みます。CI修正・再実行の使用回数も再同期後に引き継がれます。
  • ドキュメント
    • 上記の動作と再同期上限を、CLIおよびワークフローの説明に追加しました。

@coderabbitai

coderabbitai Bot commented Oct 24, 2026 •

Copy link
Copy Markdown

Review in Change Stack →

No actionable comments were generated in the recent review.

Recent review info
Run configuration
Commits

Reviewing files that changed from the base of the PR and between 43d5582 and 4fb752f.

Files selected for processing: 22
  • CHANGELOG.md
  • builtins/en/workflows/merge-review-fix-simple.yaml
  • builtins/en/workflows/merge-review-fix.yaml
  • builtins/ja/workflows/merge-review-fix-simple.yaml
  • builtins/ja/workflows/merge-review-fix.yaml
  • docs/cli-reference.ja.md
  • docs/cli-reference.md
  • docs/workflows.ja.md
  • docs/workflows.md
  • src/__tests__/it-merge-workflow-execution.test.ts
  • src/__tests__/merge-clone.integration.test.ts
  • src/__tests__/merge.test.ts
  • src/__tests__/system-pr-status.test.ts
  • src/core/workflow/system/pr-execution-context.ts
  • src/features/merge/index.ts
  • src/features/tasks/execute/taskWorkflowExecution.ts
  • src/infra/task/mapper.ts
  • src/infra/task/runner.ts
  • src/infra/task/taskExecutionSchemas.ts
  • src/infra/task/taskLifecycleService.ts
  • src/infra/workflow/system/DefaultSystemStepServices.ts
  • src/infra/workflow/system/system-pr-ci.ts

Included review availability: This review used your included allowance. Your plan provides up to 4 included reviews per hour; 2 remain after this review.

Walkthrough

merge-review-fix と merge-review-fix-simple に、CI後の競合を上限付きで再同期する処理を追加しました。実行時並列数をタスクに保存し、Requeue・Retry後も引き継ぎます。新しいHEADでは、保存済みのCI再実行情報を引き継がないようにしました。

Changes: PRマージ時の競合再同期

Layer / File(s) Summary
実行時並列数の保存と再同期予算
src/core/workflow/system/pr-execution-context.ts, src/infra/task/*, src/features/merge/index.ts, src/features/tasks/execute/taskWorkflowExecution.ts, src/__tests__/merge.test.ts, src/__tests__/merge-clone.integration.test.ts
PRマージタスクに実行時並列数を保存し、Requeue・Retryでは保存値を優先します。組み込み修正ワークフローのステップ予算に、並列数から算出した再同期分を加えます。
CI後の競合再同期とマージ判定
src/infra/workflow/system/DefaultSystemStepServices.ts, src/infra/workflow/system/system-pr-ci.ts, builtins/*/workflows/merge-review-fix*.yaml, src/__tests__/it-merge-workflow-execution.test.ts, src/__tests__/system-pr-status.test.ts, CHANGELOG.md, docs/cli-reference*.md, docs/workflows*.md
同期結果に再同期回数と上限を追加します。CI後に CONFLICTING で上限未満なら再同期し、同期後はレビューを繰り返さず push へ進みます。BEHIND は再同期対象から除外します。新しいHEADのCI状態取得では、異なるHEAD SHAの再実行情報を使いません。テストと日英のドキュメントも更新します。

Priority: Normal

Estimated code review effort: 3 (Moderate) | ~25 minutes

Change: Feature

Sequence Diagram(s)

sequenceDiagram
  participant Workflow as merge-review-fix
  participant Sync as sync_with_root
  participant Push
  participant Caccia
  participant CI as CI status
  Workflow->>Sync: 同期と競合解消
  Sync-->>Workflow: 同期結果と再同期回数・上限
  Workflow->>Push: 同期後の変更をpush
  Push-->>Workflow: 更新後のHEAD
  Workflow->>Caccia: 更新後のHEADで実行
  Caccia-->>Workflow: 実行結果とHEAD SHA
  Workflow->>CI: 更新後のHEADのCIを待機
  CI-->>Workflow: CI結果とmergeable状態
  loop CONFLICTINGかつ上限未満
    Workflow->>Sync: 再同期
  end
Loading

Possibly related PRs

  • nrslib/takt#1889: 再同期後の組み込みmerge workflowがCacciaを実行する経路と、自動Cacciaの重複抑止を扱っています。
  • nrslib/takt#1874: 同じmerge workflowのCI復旧を扱い、このPRでは再同期後もCI修正・再実行の使用回数を維持します。
Merge Risk: Minimal · up to 4fb75

No issue identified that needs resolution before merging; normal checks remain appropriate.

Pre-merge checks: Passed 3 · Inconclusive 1

Failed Failed checks: 1 inconclusive

Check name Status Explanation Resolution
Linked Issues check Inconclusive #1893 の主要要件は差分で確認できます。日英の merge-review-fix と merge-review-fix-simple は、CI 後の CONFLICTING に対して上限内で再同期し、再レビューを省略して push へ進みます。BEHIND は unmergeable へ進まず、従来のマージ判定へ進みます。実行時並列数の保存、`max(2, concur… 変更テストの両登録ファイルで対象テストの包含または登録を確認し、npm run build、npm run lint、対象テストの成功結果を提示してください。
Passed Passed checks: 3 passed
Check name Status Explanation
Description Check Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check Passed タイトルは、競合したマージの再同期というプルリクエストの主要な変更を明確に示しています。
Out of Scope Changes check Passed 変更は #1893 の実装、実行時並列数の保持、再同期後の CI・Caccia 経路、回復予算の維持、関連テスト、日英ドキュメント、CHANGELOG に限定されています。system-pr-ci の変更も、再同期後に新しい HEAD へ古い CI 再実行情報を適用しないための関連変更です。無関係な変更は確認できません。
Full details: Linked Issues check

Explanation

#1893 の主要要件は差分で確認できます。日英の merge-review-fix と merge-review-fix-simple は、CI 後の CONFLICTING に対して上限内で再同期し、再レビューを省略して push へ進みます。BEHIND は unmergeable へ進まず、従来のマージ判定へ進みます。実行時並列数の保存、max(2, concurrency - 1) の上限、上限到達時の停止、関連テスト、日英ドキュメント、CHANGELOG の変更も要約にあります。ただし、変更テストが tsconfig.tests.json と scripts/test-classification.mjs に登録済みであること、および build・lint・対象テストの成功を、確認可能な差分または実行結果から確定できません。

Resolution

変更テストの両登録ファイルで対象テストの包含または登録を確認し、npm run build、npm run lint、対象テストの成功結果を提示してください。

Finishing Touches
📝 Generate docstrings
  • Commit to this branch
  • Create a new PR
🧪 Generate unit tests (beta)
  • Commit to this branch
  • Create a new PR
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

takt merge の並列実行で後から競合した PR を取り込み直してマージまで進める

1 participant