From 047ffd264e7bf0f043833bf6ff71c227c2681e01 Mon Sep 17 00:00:00 2001 From: Sebastian Mendel Date: Thu, 16 Jul 2026 21:36:16 +0200 Subject: [PATCH 1/2] docs: verify a dropped queue entry via the issue timeline before re-arming MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit gh pr view state and the queue listing lag for minutes after a queue merge — the stale read looks identical to a silent drop. The issue timeline (removed_from_merge_queue followed by merged) is authoritative. Also notes that queue membership is GraphQL-only, not a gh pr view --json field. Signed-off-by: Sebastian Mendel --- .../references/pull-request-workflow.md | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/skills/git-workflow/references/pull-request-workflow.md b/skills/git-workflow/references/pull-request-workflow.md index 5d02145..4a525cc 100644 --- a/skills/git-workflow/references/pull-request-workflow.md +++ b/skills/git-workflow/references/pull-request-workflow.md @@ -907,6 +907,24 @@ gh api graphql -F id="$PRID" \ # Branch is pushable again; fix threads, then re-arm through this gate. ``` +**Verify a "dropped" queue entry via the issue timeline before re-arming.** +Right after a queue merge, `gh pr view --json state` can report `OPEN` and the +queue listing can show the entry gone for several minutes — the exact signature +of a silent drop, except the PR already merged. Re-arming (or re-diagnosing) on +that stale read wastes a round-trip. The issue **timeline** is authoritative: + +```bash +gh api repos/{owner}/{repo}/issues/NUMBER/timeline --paginate \ + --jq '[.[] | select(.event=="added_to_merge_queue" or .event=="removed_from_merge_queue" + or .event=="merged" or .event=="closed") | "\(.created_at) \(.event)"][]' +# removed_from_merge_queue immediately followed by merged -> it landed; do nothing. +# removed_from_merge_queue with NO merged event -> real silent drop; re-arm. +``` + +Also note: queue membership is GraphQL-only — `isInMergeQueue` / +`mergeQueueEntry` are **not** `gh pr view --json` fields (the call errors); +query `pullRequest { mergeQueueEntry { state position } }` via `gh api graphql`. + ### Signing Readiness (Preflight — Before Committing) A signing failure surfaces only at the *merge gate* (BLOCKED on DCO / "verified signatures") — i.e. **after** all the work is staged, forcing a full re-sign cycle. Catch it up front: before a commit-heavy run (e.g. `/pr-finish`), confirm a signing key is actually available and that `git commit -S` will sign, rather than assuming it. From 605be5cd4dd490b09dec13e3a216ae995803431e Mon Sep 17 00:00:00 2001 From: Sebastian Mendel Date: Thu, 16 Jul 2026 22:00:46 +0200 Subject: [PATCH 2/2] docs: simplify the timeline jq recipe (IN(), optional iteration) Signed-off-by: Sebastian Mendel --- skills/git-workflow/references/pull-request-workflow.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/skills/git-workflow/references/pull-request-workflow.md b/skills/git-workflow/references/pull-request-workflow.md index 4a525cc..cbbcb47 100644 --- a/skills/git-workflow/references/pull-request-workflow.md +++ b/skills/git-workflow/references/pull-request-workflow.md @@ -915,8 +915,8 @@ that stale read wastes a round-trip. The issue **timeline** is authoritative: ```bash gh api repos/{owner}/{repo}/issues/NUMBER/timeline --paginate \ - --jq '[.[] | select(.event=="added_to_merge_queue" or .event=="removed_from_merge_queue" - or .event=="merged" or .event=="closed") | "\(.created_at) \(.event)"][]' + --jq '.[]? | select(.event | IN("added_to_merge_queue", "removed_from_merge_queue", + "merged", "closed")) | "\(.created_at) \(.event)"' # removed_from_merge_queue immediately followed by merged -> it landed; do nothing. # removed_from_merge_queue with NO merged event -> real silent drop; re-arm. ```