From d67b79d3adbf5625a97ccde873cdc52f2dcaa5c7 Mon Sep 17 00:00:00 2001 From: openhands Date: Sun, 22 Mar 2026 12:24:58 +0000 Subject: [PATCH] =?UTF-8?q?fix:=20fix:=20dev-agent=20escalates=20when=20de?= =?UTF-8?q?v-poll=20races=20it=20to=20merge=20=E2=80=94=20should=20detect?= =?UTF-8?q?=20already-merged=20PR=20(#548)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 4.6 (1M context) --- dev/phase-handler.sh | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/dev/phase-handler.sh b/dev/phase-handler.sh index 3923d1a..4365f5b 100644 --- a/dev/phase-handler.sh +++ b/dev/phase-handler.sh @@ -195,8 +195,16 @@ do_merge() { return 0 fi - # HTTP 405 — merge requirements not met (approvals, branch protection); structural, not transient + # HTTP 405 — could be "merge requirements not met" OR "already merged" (race with dev-poll). + # Before escalating, check whether the PR was already merged by another agent. if [ "$merge_http_code" = "405" ]; then + local pr_state + pr_state=$(curl -sf -H "Authorization: token ${CODEBERG_TOKEN}" \ + "${API}/pulls/${pr_num}" | jq -r '.merged // false') || pr_state="false" + if [ "$pr_state" = "true" ]; then + log "do_merge: PR #${pr_num} already merged (detected after HTTP 405) — treating as success" + return 0 + fi log "do_merge: PR #${pr_num} blocked — merge requirements not met (HTTP 405): ${merge_body:0:200}" printf 'PHASE:escalate\nReason: %s\n' \ "PR #${pr_num} merge blocked — merge requirements not met (HTTP 405): ${merge_body:0:200}" \