---
name: jira-sprint-progress
description: "Each weekday morning: the share of committed story points done in the open sprint, the days left, and whether the pace so far gets you to the end. Use when the user asks for this, or when it runs on a schedule."
---

# Jira sprint progress

Each weekday morning: the share of committed story points done in the open sprint, the days left, and whether the pace so far gets you to the end.

The burndown chart answers "will we make it", but only for people who open it and know how to read a jagged line against a diagonal. On a phone it is unreadable, and it says nothing about the issue that has sat in To Do all sprint.

The agent reads the open sprint, counts what was committed at the start against what is done now, and turns the slope into one percentage and a forecast. Scope added after planning is counted apart from the commitment, so a growing sprint does not hide behind a flat line.

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

- The ID of the team's Scrum board (from its URL) and read access to the project behind it.
- An MCP server or connector for Jira, or an Atlassian API token in `JIRA_API_TOKEN` with your login email (`JIRA_EMAIL`) and site URL (`JIRA_BASE_URL`) for the Agile and REST APIs.

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

### Steps

1. **Find the open sprint** (Jira): `GET /rest/agile/1.0/board/{boardId}/sprint?state=active` returns its `id`, `name`, `goal`, `startDate` and `endDate`. Count the working days between today and `endDate`.
2. **Read its issues with history** (Jira): Search `sprint = <id>` through `GET /rest/api/3/search/jql` with `fields=status,issuetype,summary,assignee,customfield_10016` and `expand=changelog`. The story points field differs per site (`customfield_10016` is common); look it up once in `GET /rest/api/3/field`.
3. **Separate commitment from added scope**: An issue is committed if it was in the sprint at `startDate`. One whose changelog shows the `Sprint` field gaining this sprint later is added scope. Leave sub-tasks out so each story counts once.
4. **Compute progress and a forecast**: Progress is done points over committed points, or done issues over committed issues if the team does not estimate. Compare it with the share of working days elapsed, and forecast the finish from the average points closed per day so far.
5. **Report**: The percent done, points done of committed, days left, added scope, and the three largest committed issues still in To Do.

## Route B: the browser

### What you need

- Signed in to Jira with Browse permission on the project behind the board; the board must be a Scrum board with an active sprint.

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. **Open the Scrum board**: From Atlassian Home open Jira, then **Projects**, the project and **Board**. The header shows the active sprint's name, goal and how many days remain; click the sprint name for the exact start and end dates.
2. **Open the Sprint report**: In the project sidebar choose **Reports**, then **Sprint report**, and pick the active sprint. The **Completed work items** and **Work items not completed** tables show each item's estimate and status, and rows marked with an asterisk were added after the sprint started.
3. **Separate commitment from added scope**: Committed points are the estimates of every row without an asterisk across both tables; added scope is the asterisked rows. Sub-tasks do not appear in the tables, so each story counts once. If the team does not estimate, count rows instead.
4. **Compute progress and a forecast**: Progress is committed points done over committed points. Compare it with the share of working days elapsed, and forecast the finish from the points completed per day so far; the burndown chart on the same page shows the slope.
5. **Report**: Percent done, points done of committed, days left, added scope, and the three largest committed items whose status is still To Do, read from the Not completed table.

Note: Reports > Sprint report is a company-managed project feature. Team-managed projects offer **Sprint burndown** instead, which gives the same totals but does not star added items; the board's **Insights** panel shows sprint progress there. Whichever field is set under Board settings > Estimation is the one both reports use.

## The report

- **Done**: percent of committed points, and points done out of committed.
- **Days left** in the sprint, and where an even pace would put you today.
- **Added scope** since the sprint started, in points and issues.
- **Forecast**: on track, at risk or behind, from the pace so far.
- The largest issues not started yet, as the place to look first.

## 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-sprint-progress/<date of this run, e.g. 2026-10-16>",
  "item_key": "jira-sprint-progress",
  "project": "Acme",
  "source": "Jira sprint progress skill",
  "kind": "metric",
  "title": "Sprint 31 is 62% done with 4 days left",
  "metric": {
    "label": "Committed points done",
    "value": 62,
    "unit": "%",
    "better": "higher",
    "period_start": "<start of the period, ISO 8601>",
    "period_end": "<end of the period, ISO 8601>"
  },
  "glance": [
    {
      "type": "Grid",
      "props": {
        "columns": 3
      },
      "children": [
        {
          "type": "Stat",
          "props": {
            "label": "Points done",
            "value": "26 of 42"
          }
        },
        {
          "type": "Stat",
          "props": {
            "label": "Days left",
            "value": 4
          }
        },
        {
          "type": "Stat",
          "props": {
            "label": "Added",
            "value": 5,
            "unit": "pts",
            "tone": "warn"
          }
        }
      ]
    },
    {
      "type": "Progress",
      "props": {
        "label": "Sprint elapsed",
        "value": 60,
        "text": "Day 6 of 10"
      }
    }
  ],
  "widget": [
    {
      "type": "Table",
      "props": {
        "columns": [
          "Not started yet",
          "Points",
          "Assignee"
        ],
        "align": [
          "left",
          "right",
          "left"
        ],
        "rows": [
          [
            "ACME-731 Bulk invite members from a CSV",
            8,
            "Priya"
          ],
          [
            "ACME-728 Error states on the billing page",
            5,
            "Tom"
          ],
          [
            "ACME-735 Seat count on the plan summary",
            3,
            "Unassigned"
          ]
        ]
      }
    },
    {
      "type": "Callout",
      "props": {
        "text": "At 4.3 points a day the 16 committed points left close by day 10. The 5 added points do not fit.",
        "tone": "warn"
      }
    }
  ],
  "size": "md"
}
JSON
```

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

Set `period_start` and `period_end` to the window the number covers: the tile names it from them ("Last 7 days", "Today", "This month"). For a count right now (open items, a balance), send `"period_label": ""` so no period shows; for another name, send it as `period_label` (at most 24 characters).

## Run it on a schedule

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

```bash
0 9 * * 1-5 claude -p "Run the jira-sprint-progress 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-sprint-progress#schedule

Source: https://briefkin.dev/skills/jira-sprint-progress
