---
name: PR Blocker Summarizer
slug: pr-blocker-summarizer
category: Automation
description: PR Blocker Summarizer turns a JSON export of open pull requests into a blockers-first digest. Use it to spot failing checks, requested changes, stale PRs, and ready-to-merge items for standup or review triage.
github: "https://github.com/FrancyJGLisboa/agent-skills-platform/tree/main/references/examples/pr-blocker-summarizer"
language: Python
stars: 2372
forks: 260
install: "npx degit https://github.com/FrancyJGLisboa/agent-skills-platform/tree/main/references/examples/pr-blocker-summarizer ~/.claude/skills/pr-blocker-summarizer"
installs_to: ~/.claude/skills/pr-blocker-summarizer
source_path: references/examples/pr-blocker-summarizer/SKILL.md
collection_size: 7
category_size: 1754
collection_url: "https://dirskills.com/collections/FrancyJGLisboa/agent-skills-platform"
added: 2026-09-03T06:03:13.950Z
last_synced: 2026-09-03T06:03:13.950Z
canonical_url: "https://dirskills.com/skills/pr-blocker-summarizer"
---

# PR Blocker Summarizer

PR Blocker Summarizer turns a JSON export of open pull requests into a blockers-first digest. Use it to spot failing checks, requested changes, stale PRs, and ready-to-merge items for standup or review triage.

**Install:**

```bash
npx degit https://github.com/FrancyJGLisboa/agent-skills-platform/tree/main/references/examples/pr-blocker-summarizer ~/.claude/skills/pr-blocker-summarizer
```

## README

# PR Blocker Summarizer

Turn a JSON export of open pull requests into a blockers-first digest: which PRs
are blocked (failing checks, requested changes, or stale), which are ready to
merge, and a one-line count an agent can post to standup.

A bundled **example** skill — small but real, used to demonstrate the creator's
validation, pipeline, and eval-rollout machinery.

## Activation

Activates on "summarize open PRs", "what's blocking my PRs", "PR standup",
"review backlog". Do **not** activate on general git/GitHub questions unrelated to
triaging a set of PRs.

## Input

A JSON array of PRs, each with `title`, `state` (`open`), `checks`
(`passing`/`failing`), `review` (`approved`/`changes_requested`/`pending`), and
`age_days`. Missing fields are treated conservatively (counted as not-blocked only
when clearly ready).

## Run

```bash
python3 scripts/run_pipeline.py --input prs.json --output digest.json
```

Output JSON shape:

```json
{
  "total": 7,
  "blocked": [{"title": "...", "reasons": ["failing checks"]}],
  "ready": ["..."],
  "summary": "7 open · 3 blocked · 2 ready to merge"
}
```

## Gotchas

- **`blocked` + `ready` does not equal `total`.** A PR is `ready` only when
  `checks` is explicitly `passing` *and* `review` is explicitly `approved`. A PR
  with no blockers but a missing `checks` field lands in neither list and vanishes
  from both counts. Never narrate the summary line as if the two numbers account
  for every PR — say "N blocked, M ready" and leave the remainder unclaimed.
- **`state` is read from the input but never filtered on.** A closed or merged PR
  left in the export is counted in `total` and classified like any open one. Filter
  the export before running if it may contain non-open PRs.
- **`review: pending` counts as blocked** ("awaiting review"). A PR opened five
  minutes ago is reported as a blocker. This is intentional for standup triage, but
  it inflates the blocked count on teams that open PRs early.
- **A non-numeric `age_days` silently skips the stale check** rather than erroring.
  An export with `"age_days": "unknown"` will never flag anything stale, and the
  digest gives no sign that the check did not run.

## Anti-goals

- Does not call the GitHub API; it works on an exported PR list.
- Does not merge or comment on PRs; it only summarizes.
