---
name: unmergeable-pr-blocks-ci
description: An unmergeable PR creates ZERO pull_request CI runs — looks like a dropped webhook but is a mergeability block; fix by merging main into the branch
metadata: 
  node_type: memory
  type: feedback
  originSessionId: 5b0a69e3-d6a3-47f7-8152-ee14e5b4ff5c
---

If a push to a PR branch produces NO ci run (`gh run list` shows nothing for the
new head, PR `statusCheckRollup` = 0 checks) while runners are online+idle, the
cause is usually that the PR is UNMERGEABLE: GitHub can't compute the merge ref
(`refs/pull/N/merge`) so it creates ZERO `pull_request` workflow runs. It looks
IDENTICAL to a dropped synchronize webhook — don't assume webhook drop.

**Diagnose, in order:**
- `gh pr view <N> --json mergeable,mergeStateStatus` → `UNKNOWN`/`UNSTABLE` + 0 checks is the tell.
- `git fetch origin main; git rev-list --count HEAD..origin/main` → branch behind-count. A feature branch that fell behind during release churn (version bumps, CHANGELOG, traceable, CONTEXT all moved on main) conflicts.
- `git merge-tree $(git merge-base HEAD origin/main) HEAD origin/main | grep -i conflict` → confirms real conflicts.

**Fix:** `git merge origin/main --no-edit`, resolve (append-only docs like FLAKE-LEDGER/traceable/CONTEXT = UNION; Cargo.lock + docs-site/src/cli/reference.md are DERIVED → rebuild + `cargo run -p xtask -- gen`, never hand-merge), full pre-flight, push. Merge → `mergeable=MERGEABLE` → CI fires immediately.

**Why:** burned ~1h on M11-W4 treating it as a webhook drop (empty-commit nudge + close/reopen PR both failed because the PR was still unmergeable). The empty-commit-to-force-synchronize trick (v0.7.1 transient-rerun class) is the right fix for a REAL webhook drop, but it can't fix an unmergeable PR. Check mergeability FIRST.

**How to apply:** when a push yields no CI run, run the 3 diagnose steps before any nudge. Related: [[m11-w4-progress]], [[v071-published]] (transient-rerun handling).
