From fe0e6768d4092ac8baaaf83e4eefa89ddd895d06 Mon Sep 17 00:00:00 2001 From: donpetry-bot <281750570+donpetry-bot@users.noreply.github.com> Date: Mon, 3 Aug 2026 02:17:31 +0000 Subject: [PATCH 1/4] =?UTF-8?q?feat:=20implement=20issue=20#928=20?= =?UTF-8?q?=E2=80=94=20auto-rebase:=20verify=20DIRTY=20PRs=20now=20reach?= =?UTF-8?q?=20the=20conflict-sentinel=20path;=20retire=20the=20redundant?= =?UTF-8?q?=20stuck-comment=20escalation?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../auto-rebase/conflict-sentinel.bats | 50 +++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 test/workflows/auto-rebase/conflict-sentinel.bats diff --git a/test/workflows/auto-rebase/conflict-sentinel.bats b/test/workflows/auto-rebase/conflict-sentinel.bats new file mode 100644 index 00000000..8bb51049 --- /dev/null +++ b/test/workflows/auto-rebase/conflict-sentinel.bats @@ -0,0 +1,50 @@ +#!/usr/bin/env bats +# Confirms AC4 of issue #926 (tracked by #928): a DIRTY (merge-conflict), +# non-draft PR is now actually ATTEMPTED by update-branch — it is no longer +# skipped for lacking an approval — and therefore reaches the existing +# sentinel → dev-lead agentic-rebase path. +# +# Since #927 the eligibility default is `all` and the approval / review-ready +# plumbing is gone (see eligibility.bats). These grep-based regression guards +# pin the reusable workflow so the DIRTY → conflict-sentinel path cannot +# silently regress by reintroducing an approval precondition before +# update-branch. They mirror the file-scanning style of merge-method.bats. + +load 'helpers/setup' + +REUSABLE="${TT_REPO_ROOT}/.github/workflows/auto-rebase-reusable.yml" + +@test "conflict-sentinel: reusable workflow file exists" { + [ -f "$REUSABLE" ] +} + +@test "conflict-sentinel: every eligible behind PR is attempted via update-branch" { + # The DIRTY PR must actually be attempted — the update-branch call is present. + run grep -F 'pulls/$PR_NUMBER/update-branch' "$REUSABLE" + [ "$status" -eq 0 ] +} + +@test "conflict-sentinel: update-branch is not gated on an approval / review decision" { + # A DIRTY PR must not be skipped for lacking an approval (#927 removed this). + # Guard against reintroducing any review-decision precondition in the reusable. + run grep -Ei 'reviewDecision|has_current_approval|has_ready_label|/reviews' "$REUSABLE" + [ "$status" -eq 1 ] +} + +@test "conflict-sentinel: a merge-conflict update failure branches to the conflict path" { + run grep -i 'merge conflict' "$REUSABLE" + [ "$status" -eq 0 ] +} + +@test "conflict-sentinel: the merge-conflict path posts the dev-lead sentinel" { + run grep -F ' escalation is absent (retired)" { + # AC4 retires the redundant stuck-comment escalation as dead code. The primary + # retirement lives in petry-projects/.github-private#711; this guard ensures the + # weaker sentinel is never (re)introduced into this repo's auto-rebase reusable. + run grep -F 'auto-rebase-stuck' "$REUSABLE" + [ "$status" -eq 1 ] +} From 1102d5a8c1036748c1ae7610c13fe09bd69b41da Mon Sep 17 00:00:00 2001 From: donpetry-bot <281750570+donpetry-bot@users.noreply.github.com> Date: Mon, 3 Aug 2026 02:25:42 +0000 Subject: [PATCH 2/4] fix(reviews): address review comments [skip ci-relay] --- test/workflows/auto-rebase/conflict-sentinel.bats | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/workflows/auto-rebase/conflict-sentinel.bats b/test/workflows/auto-rebase/conflict-sentinel.bats index 8bb51049..353bf6fb 100644 --- a/test/workflows/auto-rebase/conflict-sentinel.bats +++ b/test/workflows/auto-rebase/conflict-sentinel.bats @@ -20,7 +20,7 @@ REUSABLE="${TT_REPO_ROOT}/.github/workflows/auto-rebase-reusable.yml" @test "conflict-sentinel: every eligible behind PR is attempted via update-branch" { # The DIRTY PR must actually be attempted — the update-branch call is present. - run grep -F 'pulls/$PR_NUMBER/update-branch' "$REUSABLE" + run grep -E 'pulls/\$\{?PR_NUMBER\}?/update-branch' "$REUSABLE" [ "$status" -eq 0 ] } From 9191925cf06f9e32f203a5ea13b4c2ebbc8ab732 Mon Sep 17 00:00:00 2001 From: donpetry-bot <281750570+donpetry-bot@users.noreply.github.com> Date: Mon, 3 Aug 2026 02:29:54 +0000 Subject: [PATCH 3/4] chore: dev-lead update (review-changes) [skip ci-relay] --- test/workflows/auto-rebase/conflict-sentinel.bats | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/test/workflows/auto-rebase/conflict-sentinel.bats b/test/workflows/auto-rebase/conflict-sentinel.bats index 353bf6fb..31833ad2 100644 --- a/test/workflows/auto-rebase/conflict-sentinel.bats +++ b/test/workflows/auto-rebase/conflict-sentinel.bats @@ -27,7 +27,10 @@ REUSABLE="${TT_REPO_ROOT}/.github/workflows/auto-rebase-reusable.yml" @test "conflict-sentinel: update-branch is not gated on an approval / review decision" { # A DIRTY PR must not be skipped for lacking an approval (#927 removed this). # Guard against reintroducing any review-decision precondition in the reusable. - run grep -Ei 'reviewDecision|has_current_approval|has_ready_label|/reviews' "$REUSABLE" + # Patterns are scoped to the specific identifiers removed in #927 — broad tokens + # like /reviews are omitted because they can appear in unrelated comments or API + # calls and would cause false positives on legitimate refactors. + run grep -Ei 'reviewDecision|has_current_approval|has_ready_label' "$REUSABLE" [ "$status" -eq 1 ] } From bbe106063513deb184266a76e25bb4228534defd Mon Sep 17 00:00:00 2001 From: donpetry-bot <281750570+donpetry-bot@users.noreply.github.com> Date: Mon, 3 Aug 2026 02:35:06 +0000 Subject: [PATCH 4/4] chore: dev-lead update (review-changes) [skip ci-relay] --- node_modules/.package-lock.json | 2 +- package-lock.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/node_modules/.package-lock.json b/node_modules/.package-lock.json index a80f4c2f..a3eb0973 100644 --- a/node_modules/.package-lock.json +++ b/node_modules/.package-lock.json @@ -1,5 +1,5 @@ { - "name": "pr-893", + "name": "pr-932", "lockfileVersion": 3, "requires": true, "packages": { diff --git a/package-lock.json b/package-lock.json index 405cfe58..69bf577c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,5 +1,5 @@ { - "name": "pr-893", + "name": "pr-932", "lockfileVersion": 3, "requires": true, "packages": {