---
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
