3 blocked issues in the sprint
Who should take ACME-702? It holds up the Apple Pay release.
ACME-702 has waited on the payments team for 4 days. ACME-715 is still linked to a blocker that closed yesterday.
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.
What lands on your board
Who should take ACME-702? It holds up the Apple Pay release.
ACME-702 has waited on the payments team for 4 days. ACME-715 is still linked to a blocker that closed yesterday.
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.
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).
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.
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.
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.
With BRIEFKIN_TOKEN set, the agent sends the result as one card that updates in place every run. Without it, you get the report in the chat.
Pick your agent, where the data comes from and how to schedule it; the commands below follow.
One command. It puts the SKILL.md in ~/.claude/skills and in ~/.agents/skills, which Codex, Cursor, Gemini CLI, Copilot CLI and OpenCode read too.
shellcurl -fsSL https://briefkin.dev/skills/jira-blocked-issues-alert/install | shAsk Claude Code:
promptRun the jira-blocked-issues-alert skillOr paste the prompt instead of installing:
promptIn Jira Cloud, search GET /rest/api/3/search/jql with: sprint in openSprints() AND statusCategory != Done AND (Flagged is not EMPTY OR status = Blocked OR issueLinkType = "is blocked by"). For each issue, tell me what it waits on: the blocking issue and its status from issuelinks, or the reason in the newest comment if it is flagged. Use the changelog to say since when it has been blocked. Put the longest-blocked first and call out links whose blocker is already Done. End by asking me who should take the oldest one. If nothing is blocked, just say the sprint is clear.Weekdays at 9:00 and 14:00, from cron on any machine where Claude Code is signed in:
crontab0 9,14 * * 1-5 claude -p "Run the jira-blocked-issues-alert skill"Add it with crontab -e. A laptop asleep at that time runs it when it wakes if you use launchd or Task Scheduler instead; GitHub Actions works for the API route.
Connect Briefkin once with curl -fsSL https://briefkin.dev/install | sh and every run lands on your board as a question for you. How setup works
SKILL.md---
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
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.
https://mcp.atlassian.com/v2/mcp. In Claude, add the Atlassian connector from the directory; in Claude Code, run claude mcp add --transport http atlassian https://mcp.atlassian.com/v2/mcp and authenticate with /mcp. It signs in with OAuth 2.1 or an API token and respects your Jira permissions (getting started).acli jira auth login, acli jira workitem search --jql "sprint in openSprints()" --json returns the same issues from a terminal.JIRA_EMAIL, JIRA_API_TOKEN and JIRA_BASE_URL (https://acme.atlassian.net) and uses basic auth. A scoped token limited to read:jira-work and read:jira-user is narrower; scoped tokens call https://api.atlassian.com/ex/jira/{cloudId} instead of your site URL.A classic token can do anything your account can, so prefer a scoped token with read scopes only, or an account that just has Browse permission on the projects in the report.
It can if you allow writes: clearing the flag is an edit to the Flagged field through PUT /rest/api/3/issue/{key}. By default the skill only reports stale links and leaves the change to you, since a closed blocker sometimes reopens.
openSprints() matches every active sprint the query can see, so yes. Add a filter that separates the teams, such as AND component = Checkout or a team label, and give each team its own item_key.
No. The skill runs with your own agent and gives you the report in the chat. With a Briefkin token set, each run also posts it to your board as a asks you, so you can glance at it instead of asking again.
Claude Code, Codex, Cursor, Gemini CLI, GitHub Copilot CLI, OpenCode, Windsurf and Amp all read SKILL.md files. The install command puts it in ~/.claude/skills and ~/.agents/skills, where they look. ChatGPT, the Claude app and Grok take the prompt instead. Pick your agent under "Install and run it" and the commands change to match.
Yes. Switch the data source to "Your browser" and the steps change to the Jira pages themselves: the agent opens home.atlassian.com in a browser you are signed in to and reads the numbers off the page. Claude Code, Codex, Cursor, Claude app and ChatGPT can drive a browser out of the box; Gemini CLI, Copilot CLI and OpenCode need a Playwright or Chrome DevTools MCP server first. It is slower than the API and needs you signed in, so it suits a report you run by hand or from a scheduler on your own computer.
Skills are free to use with any agent. Briefkin is where their results land: one board for every report, number and question your agents send, with a ping when something needs you.
Free during the open beta. No card.