Stop treating gh API failures as negative answers#53
Draft
Phlogistique wants to merge 2 commits into
Draft
Conversation
Two helpers swallowed gh errors with `|| echo ""` and returned the negative answer instead (verified against the previous script version with the new test scenarios): - has_sibling_conflicts: a failed `gh pr list` read as "no siblings", so the resume deleted the kept parent branch while another conflicted PR may still need it for its resolution. - pr_has_conflict_label: a failed `gh pr view` read as "no label", ending the run green without resuming anything. Both now die on command failure, so the branch and label survive and the next push retries. read_state_marker gets the same explicit handling; there the gh failure already aborted the run (pipefail propagated it to an errexit-active caller), but silently, with the error message hidden by 2>/dev/null. Also reorders main() to push the updated heads before retargeting their PRs, matching the conflict-resolved path: if the run fails between the two steps, a retargeted PR with a stale head sits conflicting with its new base, GitHub suppresses its CI, and no label exists to resume it. https://claude.ai/code/session_01STkeSJ7cLrmrNn4aTDYkwH
Phlogistique
added a commit
that referenced
this pull request
Jun 11, 2026
#55) If `origin/<old base>` was deleted while a child PR sat in conflict (auto-delete head branches left enabled despite the README, or manual deletion), the resume merge failed with "not something we can merge" and `git merge --abort` failed too ("There is no merge to abort"). The run then exited nonzero after re-posting the misleading conflict comment and the label, repeating on every push. (Not a mid-function `set -e` kill: `update_direct_target` is called in an `if` condition, which suppresses errexit; observed via the new test scenario.) Check `origin/<old base>` up front like the existing target-branch check, and only run `git merge --abort` when `MERGE_HEAD` exists. Base of the stack continued in #52 and #53. https://claude.ai/code/session_01STkeSJ7cLrmrNn4aTDYkwH --- _Generated by [Claude Code](https://claude.ai/code/session_01STkeSJ7cLrmrNn4aTDYkwH)_ Co-authored-by: Claude <noreply@anthropic.com>
Trunk meanwhile absorbed most of this PR (#42 reordered main(), #50 hardened the label and comment reads), so what remains is the has_sibling_conflicts fix plus a new one of the same kind: list_child_prs failures were swallowed by the process substitutions consuming it, so a failed listing read as 'no children' and let main() delete the merged branch under the children it never saw. Callers now capture the output and die on failure. https://claude.ai/code/session_01STkeSJ7cLrmrNn4aTDYkwH
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Two spots swallowed a failed
gh pr listand acted on the empty answer (each verified destructive against the pre-fix script with the new test scenarios):has_sibling_conflicts: a failure read as "no siblings", so the resume deleted the kept parent branch while another conflicted PR may still need it for its resolution.list_child_prscallers inmain(): the process substitutions consuming it drop its exit status, so a failure read as "no children" and the run deleted the merged branch under the children it never saw, without updating them.has_sibling_conflictsnow dies on the failed listing; thelist_child_prscallers capture its output and die on failure.Stacked on #52.
https://claude.ai/code/session_01STkeSJ7cLrmrNn4aTDYkwH
Generated by Claude Code