---
name: jira-blocked-issues-alert
description: "Twice a day: every flagged or blocked issue in the active sprint, what it waits on and since when, with an ask about who clears it today. Use when the user asks for this, or when it runs on a schedule."
---

# Jira blocked issues alert

Twice a day: every flagged or blocked issue in the active sprint, what it waits on and since when, with an ask about who clears it today.

You hear about a blocked issue at standup, two days after someone flagged it. A flag in Jira is a quiet thing: a colored stripe on a card that nobody looks at until the sprint review.

This skill looks twice a day. It finds flags, a Blocked status and open "is blocked by" links in the current sprint, reads the latest comment to see what each issue is actually waiting on, and asks you who takes it. On a clear day it posts a plain update instead, so the card drops out of Needs you.

## Two ways to get the data

Use the API or MCP route when you have an MCP server, a CLI or an API token for the app. Otherwise, if you can drive a browser the user is signed in to (Claude in Chrome, a Playwright or Chrome DevTools MCP server), use the browser route. Say which one you used.

## Route A: API or MCP server

### What you need

- Browse permission on the sprint's project and on any project that holds blocking issues, or those links come back without a status.
- A Jira MCP server or connector, or an Atlassian API token in `JIRA_API_TOKEN` alongside `JIRA_EMAIL` and `JIRA_BASE_URL`.

If something is missing, say what and stop; do not invent numbers.

### Steps

1. **Find blocked work** (Jira): `GET /rest/api/3/search/jql` with `jql=sprint in openSprints() AND statusCategory != Done AND (Flagged is not EMPTY OR status = Blocked OR issueLinkType = "is blocked by")` and `fields=summary,status,assignee,issuelinks,priority`, plus the Flagged field (often `customfield_10021`; check `GET /rest/api/3/field`).
2. **Work out what each waits on** (Jira): For a link, read the blocking issue and its status from `issuelinks`; if the blocker is already Done, the link is stale. For a flag, read the newest comment (`GET /rest/api/3/issue/{key}/comment?orderBy=-created&maxResults=1`), where Jira puts the reason when someone flags with a comment.
3. **Measure how long** (Jira): Use the changelog (`expand=changelog`) to find when the flag was set or the status turned Blocked. Anything blocked for more than 2 working days goes to the top.
4. **Ask for an owner**: Post the blocked issues, longest blocked first, and ask who should take the oldest: the assignee, the blocking team, or you. When nothing is blocked, post a plain update instead of an ask.

## Route B: the browser

### What you need

- Signed in to Jira with Browse permission on the sprint's project and on any project that holds the blocking items.

If something is missing, say what and stop; do not invent numbers.

### Steps

Start at https://home.atlassian.com/. The user is signed in already; never type passwords or codes, and ask if a sign-in page appears.

1. **Search the open sprints for blocked work**: From Atlassian Home open Jira, choose **Filters** > **View all work items**, switch to **JQL** and run `sprint in openSprints() AND statusCategory != Done AND (Flagged is not EMPTY OR status = Blocked OR issueLinkType = "is blocked by")`. Show the Status, Assignee, Priority and Flagged columns.
2. **Work out what each waits on**: Open each item. Under **Linked work items**, read the "is blocked by" entries and their status; a blocker already Done means the link is stale. For a flagged item, read the newest comment under **Activity**, which is where the reason lands when someone chooses **Add flag and comment**.
3. **Measure how long**: Switch the item's **Activity** panel to **History** and find when Flagged was set or the status changed to Blocked. Anything blocked more than 2 working days goes to the top.
4. **Ask for an owner**: List the blocked items longest blocked first and ask who takes the oldest: the assignee, the blocking team, or you. If the search returns nothing, say the sprint is clear.

Note: Flagged cards also show a flag and a yellow tint on the board, which is enough for a quick look at one team, but the search is what covers every active sprint you can see. `openSprints()` matches every active sprint in the projects you can browse; add `AND project = ACME` to keep it to one.

## The report

- **Blocked issues** in the open sprint, longest blocked first.
- For each: what it waits on (a person, another issue, an outside party), since when, and the assignee.
- **Stale links**: issues still marked as blocked by something already done.
- The ask: who takes the oldest blocker today.

## Post it to Briefkin

When `BRIEFKIN_TOKEN` is set, or `~/.config/briefkin/env` exists (the installer from https://briefkin.dev/docs writes it), also send the result to the user's Briefkin board as one card. Keep the `item_key` the same on every run so the card updates in place, use a new `event_id` per run, and put today's real numbers in place of the example ones. If the request fails, say so once and carry on.

```bash
[ -n "${BRIEFKIN_TOKEN:-}" ] || . ~/.config/briefkin/env
curl -sS -X POST "${BRIEFKIN_URL:-https://briefkin.dev}/v1/events" \
  -H "authorization: Bearer $BRIEFKIN_TOKEN" \
  -H "content-type: application/json" \
  -d @- <<'JSON'
{
  "v": 1,
  "event_id": "jira-blocked-issues-alert/<date of this run, e.g. 2026-10-16>",
  "item_key": "jira-blocked-issues-alert",
  "project": "Acme",
  "source": "Jira blocked issues alert skill",
  "kind": "action",
  "title": "3 blocked issues in the sprint",
  "summary": "ACME-702 has waited on the payments team for **4 days**. ACME-715 is still linked to a blocker that closed yesterday.",
  "action": {
    "request": "Who should take ACME-702? It holds up the Apple Pay release.",
    "options": [
      "I will chase it",
      "Ask the assignee",
      "Escalate to payments",
      "Leave it for now"
    ]
  },
  "widget": [
    {
      "type": "Table",
      "props": {
        "columns": [
          "Issue",
          "Waiting on",
          "Since",
          "Owner"
        ],
        "rows": [
          [
            "ACME-702 Apple Pay button on checkout",
            "Payments team: merchant ID",
            "Oct 12",
            "Ines"
          ],
          [
            "ACME-709 Order export to S3",
            "ACME-688, in review",
            "Oct 14",
            "Rui"
          ],
          [
            "ACME-715 Saved carts for guests",
            "ACME-690, done: stale link",
            "Oct 13",
            "Kofi"
          ]
        ]
      }
    }
  ]
}
JSON
```

Widgets come from the Briefkin catalog (https://briefkin.dev/v1/catalog). Without a token, just give the user the report.

## Run it on a schedule

Suggested: Weekdays at 9:00 and 14:00 (`0 9,14 * * 1-5`). From cron, with the agent signed in on that machine:

```bash
0 9,14 * * 1-5 claude -p "Run the jira-blocked-issues-alert skill"
# Codex: codex exec, Gemini CLI: gemini -p, Copilot CLI: copilot -p, OpenCode: opencode run
```

Or use the agent's own scheduler (Claude Code routines, Codex automations, Claude or ChatGPT scheduled tasks): https://briefkin.dev/skills/jira-blocked-issues-alert#schedule

Source: https://briefkin.dev/skills/jira-blocked-issues-alert
