5.7 KiB
MODIFIED Requirements
Requirement: Спринты, ранг и оценки
Агент v15 SHALL в каждом refresh (по JQL и по ключам) для каждой доски из boards команды с типом scrum или
kanban (известным или только что определённым) прочитать настройки доски (GET /rest/agile/1.0/board/{id}/configuration:
колонки и их статусы — по именам статусов; признак kanban-бэклога, если Jira его отдаёт, иначе null) и, у scrum,
все спринты доски любого состояния (GET /rest/agile/1.0/board/{id}/sprint постранично) и приложить к первой пачке
состояния boards (см. hub-api, «Приём досок и спринтов»). Ошибка чтения настроек доски — доска с columns: null,
kanban_backlog: null; ошибка чтения списка спринтов scrum-доски — доска в boards не входит (хаб сохраняет прежние
данные), имена спринтов задач — по правилам v12; причина в лог; refresh продолжается.
Каждая задача в состоянии (с v15) SHALL нести rank — значение поля ранга Jira (поле типа LexoRank), story_points —
значение поля оценки (field_ids.story_points, если задано, иначе поле Jira с именем «Story Points»), и sprint_ids —
id всех спринтов задачи из поля спринта Jira (любого состояния). Поле не найдено — ключ у задач не передаётся (хаб
сохраняет прежнее значение) и запись в лог один раз за refresh.
Агент v15 SHALL выполнять ensure_sprint_meta, ensure_sprint_state, ensure_rank и story_points в
ensure_fields по контракту commands; сравнение — до записи, повтор без изменений — done без записи.
Агент v16 SHALL ставить story_points из ensure_fields с board_id через оценку доски, а не через PUT /issue: поле
оценки может не быть на экране редактирования, и Jira отвечает «Field cannot be set. It is not on the appropriate screen,
or unknown» (Jira банка, 25.10.2026), а бэклог Scrum ставит оценку и без экрана. Текущее значение —
GET /rest/agile/1.0/issue/{key}/estimation?boardId=<board_id> ({fieldId, value}); отличается — PUT туда же с
{"value": …} (null — очистить); сравнение — как у v15 (3 равно 3.0, null — только null). field_ids.story_points
для записи с доской не нужен. GET /issue и PUT /issue агент делает только для остальных полей команды; в changed —
story_points, если оценка записана. Если в той же команде записан и PUT /issue, перед записью оценки — зазор типа
ensure_fields (политика темпа). Если field_ids.story_points задан и fieldId оценки доски с ним не совпадает —
failed «у доски оценка — поле , а не story points (<field_ids.story_points>)», без записи. Команда без
board_id — оценка через PUT /issue, как v15. Ошибка Jira на
estimation — failed с текстом Jira; остальные поля к этому моменту уже записаны (повтор их не меняет).
Scenario: Доска с закрытыми спринтами
- WHEN
refresh {jql: …, boards: [{id: 4216, type: "scrum"}]}, у доски закрытые спринты 1–2, активный 3, будущий 4 - THEN первая пачка состояния несёт
boardsс доской 4216, четырьмя спринтами и колонками; у задачи спринта 2, перенесённой в 3, —sprint_ids: [2, 3]
Scenario: Нет поля оценки
- WHEN в Jira нет поля «Story Points»,
field_ids.story_pointsне задан - THEN у задач нет ключа
story_points;ensure_fields {key: X, story_points: 3}—failed«поле оценки не найдено в Jira: задайте field_ids.story_points»
Scenario: Оценка не на экране редактирования
- WHEN агент v16,
ensure_fields {key: AURORA-1704, story_points: 2, board_id: 4216}, оценка в Jira —1.0 - THEN
GET /rest/agile/1.0/issue/AURORA-1704/estimation?boardId=4216, затемPUTтуда же{"value": 2};PUT /issueнет; отчётdoneсchanged: ["story_points"],jira_calls = 2
Scenario: Доска оценивает другим полем
- WHEN
field_ids.story_points = customfield_15852,GET …/estimation?boardId=5120отдаётfieldId: timeoriginalestimate - THEN
failed«у доски 5120 оценка — поле timeoriginalestimate, а не story points (customfield_15852)»,PUTнет
Scenario: Оценка уже стоит
- WHEN та же команда, оценка в Jira —
2.0 - THEN только
GET …/estimation; отчётdoneсchanged: [],jira_calls = 1