# Reports

Nine reports turn your issues and logged time into numbers and charts. Every report is also
available to an AI agent through the [MCP tools](https://nothingleft.dev/docs/mcp.md): `run_report` answers with the same
table the chart is drawn from, so an agent and a chart never disagree.

## Opening a report

- **Reports** in the sidebar lists all nine; press `g r` from anywhere. Inside a project, `g r`
  and the project's own **Reports** entry open the same list scoped to that project.
- **Timesheets** in the sidebar opens your own time for this week.
- The address holds every choice you make on a report, so copying it shares exactly what you
  see.

Across the top of a report:

- The **search bar** narrows it with a query, exactly as on the issue list.
- **Saved view** picks one of your saved views, and **Projects** picks one or several projects.
- Then come the report's own choices: the field, the sprint, the period, the people.
- **Export CSV** downloads the numbers on screen.

Beside the title, *Updated 8:48pm* says when the figures were worked out; the refresh button
next to it picks up anything that has changed since. A report does not refresh by itself.

A bar chart lists each name once, with its bar, figure and share on the same row; a pie or
line chart has a table with the same numbers under or beside it. Hover a slice or point to
read its figure; click a name, a figure or a slice to open the issues it counts. People appear
with their pictures, and projects in their own colours.

Durations can be read three ways - **1w 1d** (`1w 2d 3h`), **Days** or **Hours**. Days and
weeks are your organisation's working ones, and the report says how long they are.

## Choosing what a report covers

Every issue report is scoped the way you search:

- **A query** in the [search language](https://nothingleft.dev/docs/search.md) - `type: Bug #Unresolved`,
  `sprint: {September 2026}`, `assignee: me`. Anything the search bar understands works here.
- **A saved view**, by name - *My open bugs*. A query and a view together narrow each other.
- **Projects** - one or several. Without them, a report covers every project you can open.

A report **never counts an issue you could not open yourself**: issues in projects you are not a
member of, deleted issues, and - for an agent - projects outside its access token are left out
before anything is counted.

Every bar, slice and cell leads to the issue list with exactly the issues it counts. A cell of
*Open × High* opens the list for `status: Open severity: High` within the same scope.

When a report finds nothing, it says which filter did it - *No issues match priority: Critical,
in ACME* - and offers to drop each filter in turn. A period is widened to *This month* or *This
year* rather than dropped.

## The nine

### Issues per assignee

How issues spread over the people they are assigned to. Three figures lead: the issues, the
people assigned, and how many issues have nobody - click that one for the list. People are
listed with the most issues first; **A-Z** sorts them by name instead.

An issue assigned to both Alex Lee and Casey Kim counts once for each, so the report states
both numbers: *12 issues; 3 have more than one assignee, so the counts add up to 15 assignee
entries*. Unassigned issues are their own row, which you can leave out. The pie shows the eight
largest groups and puts the rest together as *Other*; the table beside it still lists everyone.

It counts issues, not effort: a one-line fix and a month of work count the same.

### Issues per project

How issues spread over the organisation's projects.

### Issues per field

How issues spread over any field: status, priority, type, assignee, tag, sprint, due date
(Overdue, Today, This week, Later, No due date), or a custom field - a select, multi-select,
person, people or checkbox field. Issues without a value are counted under the field's empty
label (*No Severity*), and a custom field counts only on the issue types it applies to.

When the projects in a report name their statuses differently, **group by category** adds them
up by the five status categories - Backlog, Unstarted, Started, Done, Cancelled - so *Fixed* in
one project and *Closed* in another both count as Done.

### Matrix

Two fields at once: status × assignee, priority × type, or any two custom fields. Each cell is
the number of issues with both values and leads to them. At most 50 values per side; the rest
are added up as *Other*. Pick **Rows** and **Columns**, or swap them with the arrows between.
**Shade** greys each cell by its size; **Length** puts a short bar under each count instead;
**Stacked** draws one bar per row value.

### Burndown

Remaining work across a sprint, day by day, against a straight ideal line that reaches zero on
the sprint's end date and falls only on working days. Measure it in story points, issue count
or remaining estimate.

A sentence at the top answers the question a burndown is opened for - *Behind plan by 12 points
today: 30 left where the ideal line is at 18* - then come what is remaining, what is completed
and how much the scope has changed since the start, with what was committed at the start and
the days left underneath.

The figures are recorded every night and when the sprint starts and finishes, so the chart
shows how the sprint really went even after issues are edited later; today's point is read
live and labelled with its figure. **Scope added after the start is its own line**, so *we
finished nothing* and *they added 30 points on Tuesday* look different. Days still to come are
shaded. A sprint that has not started yet has no figures. Choose the project and the sprint at
the top; **Daily figures** under the chart lists every day's numbers, with scope change and
completed work counted from the start of the sprint to that day.

### Average issue age

How long issues have been open, per field value - from creation to resolution, or to now while
they are still open - in days. It looks at unresolved issues unless you include resolved ones,
and names the oldest issue in each group.

### Time report

Time logged over a period on the issues in scope, by work type, person, issue, project or one
of the project's work item attributes (*Billable*). It adds up the time entries themselves, so a
subtask's time is never counted twice through its parent.

Grouped by issue or project, each row also shows the estimate - the project's Estimation field
if it has chosen one - the difference (negative means over the estimate) and its share of the
total; an issue nobody estimated says *No estimate*. An estimate belongs to a whole issue, so a
report by person or work type has no estimate columns.

The period is two dates, or words the search language knows: *Last week*, *This month*,
*2026-09*, *2026-09-01 .. 2026-09-14*. It is this week unless you say otherwise, and covers at
most 366 days. To report on a sprint, add `sprint: {September 2026}` to the query.

### Gantt chart

A project's issues on a timeline, from start date to due date, with an arrow for every
*depends on* link between two of them. Group the bars by epic (the issue's nearest Epic above
it), by assignee, or not at all.

An issue without both a start date and a due date is **listed underneath, not dropped** - a
timeline that quietly leaves out half the work is worse than none.

Each bar is grey with its status on the left edge - amber once started, green when done - and
a red end when it is past its due date and still open. An arrow turns red when an issue starts
before the one it depends on ends. Click a bar to open the issue over the chart; **Days** and
**Weeks** change the scale.

### Timesheet

People as rows, days as columns, totals both ways - this week for you unless you choose other
people or dates, up to 62 days. Non-working days are marked. Open a cell to see the time entries
behind it - or a person's total, for the whole period. **People** adds colleagues or shows
*Everyone*. You see time logged on any issue you can open, whoever logged it.

## Colours

Each chart uses up to eight colours, given to the eight largest groups in the field's own order,
so a person or a priority keeps its colour however the numbers move. Anything smaller is added
up as *Other*. A chart by status uses the statuses' own colours.

A chart by project uses **each project's own colour**, the one picked in its settings. When two
projects in the same chart share a colour, the one created later is drawn in a colour no other
project there uses - striped, once a chart has used every colour - and a line under the chart
says which; its settings are not changed, and it gets its own colour back in any chart where the
two do not meet.

A bar chart of people or work types is drawn in grey: the names say who, and colour is kept for
what it means, such as a status or a project.

## Exporting

Every report exports to CSV with the same numbers as the chart: durations read `1w 1d 1h 1m`
with your organisation's working day and week, and totals close the file. Anyone who can see a
report can export it.

## Asking an agent

`run_report` takes the report's name and the same choices by name - never an internal number:

- *"How are ACME's open bugs spread over people?"* - `issues-per-assignee` with the query
  `project: ACME type: Bug #Unresolved`.
- *"Show the September 2026 burndown in story points."* - `burndown` with `project: ACME`,
  `sprint: September 2026`.
- *"How much of last week went on testing?"* - `time` with `period: Last week`,
  `group_by: work_type`.
- *"What did Casey log on Tuesday?"* - `timesheet` with `user: Casey Kim` and that day.

The agent reads the same table and series the chart is drawn from, and when a report is empty it
is told which filter to drop.