17 issues quiet for two weeks or more
6 In Progress and 11 To Do with no update in 14 days. Mateo holds 5 of them; 4 have no owner.
Every Monday: To Do and In Progress issues with no update for 14 days or more, oldest first, with their owners and a suggested next move for each.
What lands on your board
6 In Progress and 11 To Do with no update in 14 days. Mateo holds 5 of them; 4 have no owner.
A backlog collects issues that say In Progress and have not moved since the last planning session. They make the board look busy and every other report less true, and nobody wants to be the one who asks about each of them.
Once a week the agent lists every open issue that has gone 14 days without a change, oldest first, and proposes one move for each: nudge the owner, send it back to the backlog, or close it. It only reads Jira, so the decisions stay with you.
GET /rest/api/3/search/jql with jql=project = ACME AND statusCategory in ("To Do", "In Progress") AND updated <= -14d ORDER BY updated ASC and fields=summary,status,assignee,updated,created,priority,labels.
Fourteen quiet days In Progress says more than fourteen in To Do, so list In Progress first. Skip anything carrying a label your team uses for parked work, such as parked or icebox.
For the top 20, read the newest comment and the assignee. Flag issues with no assignee, or one whose account is deactivated (assignee.active is false), for reassignment.
Chase the owner when it is In Progress with an active assignee, send it back to the backlog when it is To Do inside a sprint, and propose closing when it is older than 90 days with no comments. Nothing is changed in Jira.
Counts by status and by assignee, then the issues oldest first with days quiet and the suggested move.
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-stale-issues/install | shAsk Claude Code:
promptRun the jira-stale-issues skillOr paste the prompt instead of installing:
promptIn Jira Cloud, run this JQL through GET /rest/api/3/search/jql: project = ACME AND statusCategory in ("To Do", "In Progress") AND updated <= -14d ORDER BY updated ASC. For each issue give key, summary, status, assignee and days since the last update, In Progress first. Count them by assignee. Flag issues with no assignee or an inactive one. Suggest one move for each: chase the owner, move it back to the backlog, or close it (older than 90 days with no comments). Do not change anything in Jira; just give me the list.Mondays at 10:00, from cron on any machine where Claude Code is signed in:
crontab0 10 * * 1 claude -p "Run the jira-stale-issues 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 report card. How setup works
SKILL.md---
name: jira-stale-issues
description: "Every Monday: To Do and In Progress issues with no update for 14 days or more, oldest first, with their owners and a suggested next move for each. Use when the user asks for this, or when it runs on a schedule."
---
# Jira stale issues report
Every Monday: To Do and In Progress issues with no update for 14 days or more, oldest first, with their owners and a suggested next move for each.
A backlog collects issues that say In Progress and have not moved since the last planning session. They make the board look busy and every other report less true, and nobody wants to be the one who asks about each of them.
Once a week the agent lists every open issue that has gone 14 days without a change, oldest first, and proposes one move for each: nudge the owner, send it back to the backlog, or close it. It only reads Jira, so the decisions stay with 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
- Read-only Browse permission on the projects to check; the skill never edits an issue.
- Any route the agent has into Jira Cloud: a Jira MCP server or connector, or `JIRA_EMAIL` plus `JIRA_API_TOKEN` against `JIRA_BASE_URL`.
If something is missing, say what and stop; do not invent numbers.
### Steps
1. **Query quiet issues** (Jira): `GET /rest/api/3/search/jql` with `jql=project = ACME AND statusCategory in ("To Do", "In Progress") AND updated <= -14d ORDER BY updated ASC` and `fields=summary,status,assignee,updated,created,priority,labels`.
2. **Weigh by status**: Fourteen quiet days In Progress says more than fourteen in To Do, so list In Progress first. Skip anything carrying a label your team uses for parked work, such as `parked` or `icebox`.
3. **Check the owner and last comment** (Jira): For the top 20, read the newest comment and the assignee. Flag issues with no assignee, or one whose account is deactivated (`assignee.active` is false), for reassignment.
4. **Suggest one move each**: Chase the owner when it is In Progress with an active assignee, send it back to the backlog when it is To Do inside a sprint, and propose closing when it is older than 90 days with no comments. Nothing is changed in Jira.
5. **Write the list**: Counts by status and by assignee, then the issues oldest first with days quiet and the suggested move.
## Route B: the browser
### What you need
- Signed in to Jira with Browse permission on the projects you check; no edit rights are needed.
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. **Run the stale query**: From Atlassian Home open Jira, choose **Filters** > **View all work items**, switch to **JQL** and run `project = ACME AND statusCategory in ("To Do", "In Progress") AND updated <= -14d ORDER BY updated ASC`. Under **Columns** show Status, Assignee, Updated, Created, Priority and Labels.
2. **Weigh by status**: Read the In Progress rows first; fourteen quiet days there say more than fourteen in To Do. Skip rows carrying a parking label such as `parked` or `icebox`, or add `AND labels not in (parked, icebox)` to the query.
3. **Check the owner and the last comment**: For the top 20, open each item and read the newest entry under **Activity** > **Comments**. Note rows with no assignee or an assignee shown as deactivated; those go to the reassignment list. Count the rest by the Assignee column.
4. **Suggest one move each**: Chase the owner when it is In Progress with an active assignee, send it back to the backlog when it is To Do inside a sprint, and propose closing when Created is more than 90 days ago with no comments. Change nothing in Jira.
5. **Write the list**: Counts by status and by assignee, then the items oldest first with days quiet and the suggested move.
Note: The search pages at 50 rows; for more than a hundred stale items use **Export work items** and read the CSV. `updated` moves on any edit, including automation rules, so a bot that touches items weekly keeps them off this list.
## The report
- **Count** of stale issues, split into In Progress and To Do.
- **By owner**: how many each assignee holds, so the chasing goes to the right people.
- **Oldest first**: key, summary, status, days since the last update and the suggested move.
- **Unowned**: issues with no assignee or a deactivated one.
## 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-stale-issues/<date of this run, e.g. 2026-10-16>",
"item_key": "jira-stale-issues",
"project": "Acme",
"source": "Jira stale issues report skill",
"kind": "update",
"title": "17 issues quiet for two weeks or more",
"summary": "**6 In Progress** and 11 To Do with no update in 14 days. Mateo holds 5 of them; 4 have no owner.",
"widget": [
{
"type": "Table",
"props": {
"columns": [
"Issue",
"Status",
"Quiet",
"Suggested"
],
"align": [
"left",
"left",
"right",
"left"
],
"rows": [
[
"ACME-118 Remove the old importer",
"To Do",
"132d",
"Close: no comments since June"
],
[
"ACME-219 Retry logic for webhook fan-out",
"In Progress",
"61d",
"Ask Mateo if it is still active"
],
[
"ACME-301 Dark mode for reports",
"To Do",
"48d",
"Back to the backlog"
],
[
"ACME-344 Rate limit headers on the v2 API",
"In Progress",
"27d",
"Ask Lena"
],
[
"ACME-356 Flaky invoice PDF test",
"In Progress",
"19d",
"Reassign: no owner"
]
]
}
},
{
"type": "Bars",
"props": {
"items": [
{
"label": "Mateo",
"value": 5
},
{
"label": "Unassigned",
"value": 4
},
{
"label": "Lena",
"value": 3
},
{
"label": "Sam",
"value": 3
},
{
"label": "Ade",
"value": 2
}
]
}
}
]
}
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: Mondays at 10:00 (`0 10 * * 1`). From cron, with the agent signed in on that machine:
```bash
0 10 * * 1 claude -p "Run the jira-stale-issues 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-stale-issues#schedule
Source: https://briefkin.dev/skills/jira-stale-issues
Read-only Browse permission on the projects to check; the skill never edits an issue.
Any route the agent has into Jira Cloud: a Jira MCP server or connector, or JIRA_EMAIL plus JIRA_API_TOKEN against 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.
Yes. updated changes on any edit, including automation and integrations, so an issue a bot touches weekly never looks stale. If that happens, filter on status changes instead with AND NOT status CHANGED AFTER -14d, or name the bot user in the prompt so its edits are ignored.
It is one two-week sprint, or two one-week sprints, so anything that sat through a whole sprint unchanged shows up. Teams on longer cycles often use updated <= -30d; change the number in the JQL and the card title together.
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 report card, 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.