---
name: spt-team-stats
description: >-
  Собирает статистику работы команды с инцидентами/багами SPT (проект SPT в
  Avito Jira) за период и публикует готовый отчёт на Confluence с графиками.
  Считает: заведено/закрыто/открыто баг-SPT, недельную динамику открытого
  бэклога, время жизни багов, приоритеты, кто закрывал (перевод в Resolved),
  баги переданные в другие команды и скорость их передачи. Используй этот скил
  ВСЕГДА, когда команда просит «отчёт по SPT», «статистику по багам/инцидентам
  за квартал/период», «сколько SPT закрыли/передали», «работа с инцидентами
  команды», «SPT за Q1/Q2», «дашборд по багам команды», «выгрузи статистику SPT
  на Confluence» — даже если слово «скил» не прозвучало. Подходит для любой
  команды Avito.People, не только для исходной: всё параметризовано (теги
  команды, юнит, каналы нотификаций, период, родительская страница Confluence).
---

# SPT Team Stats — отчёт по работе команды с багами SPT

Этот скил воспроизводит полный пайплайн: собрать данные из Jira (проект SPT) и
Mattermost через MCP, посчитать метрики бандл-скриптами и опубликовать
оформленный отчёт с графиками на Confluence.

Архитектура: **агент собирает данные через MCP** в один нормализованный JSON,
**скрипты считают и рисуют** (детерминированно, без обращений к сети). Так
результат воспроизводим, а агент не тратит контекст на ручные вычисления.

## Что нужно от пользователя (параметры)

Спроси/подтверди перед стартом (используй AskUserQuestion):

- **team_name** — короткое имя команды для заголовков (напр. «Snowdrops»).
- **team_tags** — значения поля «Avito.People Unit Teams» (cf[22019]),
  включая ИСТОРИЧЕСКИЕ имена команды (напр. `Snowdrops`, `Profiles SNOW`,
  `Passport Flippers`). Поле текстовое — в JQL ищется через `~`.
- **unit** — юнит, поле cf[12113] (напр. `AvitoID`). Нужен только как страховка
  для понимания структуры; основной фильтр — теги команды и каналы нотификаций.
- **notify_channels** — каналы, в которые бот пишет «Нотификация отправлена: …»,
  когда баг приходит на команду (напр. `profiles`, `#profiles-support`). Это
  ключ к поиску переданных багов — см. `references/methodology.md`.
- **period_start / period_end** — даты периода (ISO, напр. `2026-01-01` …
  `2026-06-04`; конец = сегодня, если открытый период).
- **confluence_parent_id** — ID родительской страницы и **report_title**.

Если чего-то не знаешь — подскажи, как найти: открой пример SPT команды
(`jira_get_issue`) и посмотри `customfield_22019` (тег), `customfield_12113`
(юнит); канал нотификации виден в комментариях бота `JSD Bot`.

## Поля Jira и JQL

Все ID полей и готовые JQL-шаблоны — в `references/jira_fields.md`. Главное:

- Команда (тег): `customfield_22019` (текст, оператор `~`).
- Юнит: `customfield_12113` (`= AvitoID`).
- Приоритет бага: `customfield_12170` (P0…P4).
- Тип: фильтруй **`issuetype = Bug`** — фичи и Performance degradation идут
  отдельной таблицей, в основную статистику не входят.
- Дата закрытия: `resolutiondate` (есть → закрыт/решён в периоде).

JQL-инструмент: `mcp__mcp-hub__call_tool` server=`mcp-jira`
tool=`jira_get_filter_result` (поля задавай через `fields`, `pageSize`≤50).
Большие ответы сохраняются в файл — тогда работай через Grep.

## Пошаговый процесс

### 1. Собрать «наши» баги (issuetype=Bug)

Тегов команды может быть несколько → объединяй через OR `~`.

- **Заведённые в периоде**: `created >= start AND created <= end`.
- **Бэклог** (открыт на старте): `created < start AND (resolutiondate >= start OR
  resolution is EMPTY)`.

Поля: `key, created, resolutiondate, customfield_12170, customfield_22019,
summary`.

### 2. Собрать не-Bug отдельно

Те же теги, `issuetype != Bug`, в том же скоупе. Поля + `issuetype`, `status`.
Это Feature / Performance degradation — выносятся в приложение, в метрики не идут.

### 3. Найти переданные в другие команды

НЕ по текущему тегу команды (это даёт ложные срабатывания). Правильный сигнал —
бот-комментарий о поступлении бага на наш канал. Полностью описано в
`references/methodology.md`. Кратко:

`project = SPT AND issuetype = Bug AND comment ~ "Нотификация отправлена
<channel>" AND created >= start` → это все баги, пришедшие на команду. Из них
**переданные = те, чей текущий тег команды НЕ входит в team_tags**.

Проверяй точность: открой пару комментариев (`jira_get_comments`) — должен быть
точный `Нотификация отправлена: <channel>` (а не просто совпадение подстроки).

### 4. Кто закрыл (перевод в Resolved)

«Закрывший» = автор перехода статуса в **Resolved** (не текущий assignee!).
Для каждого закрытого в периоде бага возьми `jira_get_issue` с
`expandChangelog:true`, найди в `changelog.histories` запись с
`items[].field=="status"` и `toString=="Resolved"` (первую по времени; если
Resolved не было — первый переход в Closed/Fixed/Done) и возьми её
`author.displayName`. Это много задач → **делегируй сбор субагенту**
(general-purpose), чтобы не раздувать контекст; пусть вернёт компактный маппинг
`key → displayName`. Детали и причина — в `references/methodology.md`.

### 5. Скорость передачи (опционально, но ценно)

Для каждого переданного бага из комментариев (`jira_get_comments`) возьми время
прихода (`Нотификация отправлена: <наш канал>`) и время передачи (следующий
`Нотификация отправлена: <другой канал>`). Разница в днях, сгруппированная по
месяцу прихода, показывает, насколько быстро команда отдаёт чужие баги.

### 6. Собрать нормализованный JSON и посчитать

Сложи всё в `issues.json` по схеме из `references/data_schema.md`, затем:

```bash
python3 scripts/analyze.py issues.json spt_data.json
python3 scripts/make_charts.py spt_data.json <output_dir>
python3 scripts/build_report.py spt_data.json report_body.xhtml
```

`analyze.py` считает все метрики, `make_charts.py` рисует 6 PNG
(`chart_burndown/lifetime/priority/people/transferred/handoff.png`),
`build_report.py` собирает Confluence storage-XHTML.
(Нужен matplotlib: `pip install matplotlib --break-system-packages`.)

### 7. Опубликовать на Confluence

1. `paas_confluence_save_page` (без page_id) — создать страницу под
   `confluence_parent_id` с заголовком; в body можно временно `<p>…</p>`.
2. `paas_confluence_upload_attachment` — загрузить каждый PNG (Confluence НЕ
   перезаписывает вложения с тем же именем; при повторной публикации давай новые
   имена).
3. `paas_confluence_upload_page` (file=report_body.xhtml, page_id) — залить
   контент. Имена картинок в XHTML должны совпадать с именами вложений.
4. Прочитай страницу обратно (`paas_confluence_get_page`) и сверь ключевые числа.

## Проверка (обязательно)

Скрипты печатают сводку и сверяют суммы (закрыто + открыто = scope; сумма по
людям = число закрытых; приоритеты сходятся). Перед публикацией убедись, что
суммы бьются. Один-два пограничных кейса (тег «None», деактивированный автор,
ложное срабатывание comment-поиска) обсуди с пользователем.

## Частые ошибки (узнано на практике)

- Забыть `issuetype = Bug` → в скоуп попадают фичи/перф-задачи, «открытых»
  оказывается больше, чем команда видит в своём фильтре. Всегда фильтруй Bug.
- Историческое имя команды (переименование) не учтено → недосчёт. Спроси про
  старые теги.
- «Переданные» по текущему тегу → ложные срабатывания и пропуски. Только метод
  с комментом нотификации.
- «Закрывший» = assignee → неверно. Только автор перехода в Resolved.
