54 lines
5.7 KiB
Markdown
54 lines
5.7 KiB
Markdown
## 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` «у доски <id> оценка — поле <fieldId>, а не 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`
|