Агент v15: спринты, ранг, оценки (#49) #50

Merged
aep merged 19 commits from feat/49-v15-sprints into main 2026-10-25 13:56:49 +03:00
Owner

Closes #49. Агентская часть sdlc-hub#108 (спринты и бэклог). Контракт — sdlc-hub/openspec/changes/sprints-backlog/, решения агента — openspec/changes/agent-v15-sprints/design.md.

Сливать и публиковать — только после выкатки хаба #108 (агент v15 шлёт boards и новые поля, которые понимает хаб со схемой v9).

Что сделано (агент v15)

  • Поиск полей Jira: ранг (gh-lexo-rank), спринт (gh-sprint), оценка («Story Points»); кэш на исполнитель, перекрытие field_ids.rank/sprint/story_points.
  • refresh: у задач rank, story_points, sprint_ids (все спринты задачи, разбор объекта и строкового вида Jira Server); данные досок boards (колонки по configuration и id статусов, kanban-бэклог, все спринты scrum-доски) в первой пачке; пустая пачка с boards при пустой выборке.
  • Команды: ensure_sprint_meta (создать/править спринт), ensure_sprint_state (запуск; закрытие с переносом невыполненных в move_open_to), ensure_rank (выше/ниже), story_points в ensure_fields.
  • AGENT_VERSION = 15, README, ARCHITECTURE.md, CLAUDE.md.

Проверки

  • /usr/bin/python3 -W error::ResourceWarning -m unittest discover -s tests -t . — 381 tests OK.
  • SDD: 8 задач, ревью каждой — clean; финальное ревью (opus) — C-1 и M-1…M-3 исправлены, re-review fix-волны — APPROVE.

Живая проверка после публикации (Jira банка)

Имена/схемы полей ранга, спринта и Story Points; GET /board/{id}/backlog на kanban (200/400); формат startDate; перенос подзадач при закрытии (M-5); закрытие спринта-песочницы. После agent_status с v15 — поднять min_agent_version.

Rulings I made

  • R-64…R-75 — рулинги плана (поле не найдено → ключ не передаётся; ошибка спринтов → доска не в boards; пустая пачка; кэш полей; смещение дат datetime.now().astimezone(); повтор rename_to; board_id только из команды; проверки ensure_sprint_state до записи; спринт с неизвестным состоянием отбрасывается; 207 в ранге — failed; порядок полей (len(id), id); кэш на Executor) — таблица в design.md.
  • R-76: трейлер коммитов «Claude Opus 5.5». Цена ошибки — имя модели в трейлере.
  • R-77: оценка — только по имени «Story Points», ранг/спринт — по schema.custom; частичное перекрытие при сбое GET /field. Цена ошибки — задать field_ids.story_points.
  • R-78: пустая пачка с boards в раннем return; спринты в кэше — только active/future. Цена ошибки — нет.
  • R-79: настроенный field_ids.story_points без GET /field; проверка значения до GET /issue. Цена ошибки — нет.
  • R-80: goal не передан — цель не трогается (очистка — ""); «имя занято» — среди не закрытых. Цена ошибки — цель не очистится через null.
  • R-81: задача без статуса — незавершённая; зазор перед закрытием после переносов. Цена ошибки — готовая задача без статуса уедет в следующий спринт.
  • R-82: entries с неуспешным статусом без errors — «статус ». Цена ошибки — нет.
  • R-83 (C-1): «готово» при закрытии — по id статусов последней колонки; пустой набор — failed без записи. Цена ошибки — лишний GET /status.

Находки

Маркер Суть Статус
C-1 перенос готовых задач по именам статусов fixed 9d3958e
M-1 kanban_backlog при columns: null fixed d71c2f5
M-2 rename_to на закрытое имя fixed d71c2f5
M-3 фильтр спринтов/колонок слабее валидации хаба fixed d71c2f5
M-4 неудачный GET /status повторяется на каждой доске deferred
M-5 подзадачи при переносе в закрытии спринта deferred (проверить вживую)
T1.1, T2.1, T5.1, T5.3, T6.1 см. ledger fixed
T1.2, T1.4, T2.2, T3.2, T4.1, T4.3, T5.2, T6.2, T7.1, T7.2, T7.3, T8.1 мелкие (повтор GET /field, тесты, inf, повтор closed, ключ в выдаче search, README) deferred
T1.3, T3.1, T3.3, T4.2, T5.4, T6.3 — rejected (причины в ledger)
RR-1…RR-3 minor re-review: лишний /status для статуса без id, нет isinstance для statuses, повтор после переименования+закрытия deferred
O-1…O-6 наблюдения: фоновые сабагенты, флейк test_runner, трейлер Haiku (amend), запись src через Bash, тесты версии 14, haiku не доводил коммит —

🤖 Generated with Claude Code

Closes #49. Агентская часть sdlc-hub#108 (спринты и бэклог). Контракт — `sdlc-hub/openspec/changes/sprints-backlog/`, решения агента — `openspec/changes/agent-v15-sprints/design.md`. **Сливать и публиковать — только после выкатки хаба #108** (агент v15 шлёт `boards` и новые поля, которые понимает хаб со схемой v9). ## Что сделано (агент v15) - Поиск полей Jira: ранг (`gh-lexo-rank`), спринт (`gh-sprint`), оценка («Story Points»); кэш на исполнитель, перекрытие `field_ids.rank/sprint/story_points`. - `refresh`: у задач `rank`, `story_points`, `sprint_ids` (все спринты задачи, разбор объекта и строкового вида Jira Server); данные досок `boards` (колонки по `configuration` и id статусов, kanban-бэклог, все спринты scrum-доски) в первой пачке; пустая пачка с `boards` при пустой выборке. - Команды: `ensure_sprint_meta` (создать/править спринт), `ensure_sprint_state` (запуск; закрытие с переносом невыполненных в `move_open_to`), `ensure_rank` (выше/ниже), `story_points` в `ensure_fields`. - `AGENT_VERSION = 15`, README, ARCHITECTURE.md, CLAUDE.md. ## Проверки - `/usr/bin/python3 -W error::ResourceWarning -m unittest discover -s tests -t .` — 381 tests OK. - SDD: 8 задач, ревью каждой — clean; финальное ревью (opus) — C-1 и M-1…M-3 исправлены, re-review fix-волны — APPROVE. ## Живая проверка после публикации (Jira банка) Имена/схемы полей ранга, спринта и Story Points; `GET /board/{id}/backlog` на kanban (200/400); формат `startDate`; перенос подзадач при закрытии (M-5); закрытие спринта-песочницы. После `agent_status` с v15 — поднять `min_agent_version`. ## Rulings I made - R-64…R-75 — рулинги плана (поле не найдено → ключ не передаётся; ошибка спринтов → доска не в `boards`; пустая пачка; кэш полей; смещение дат `datetime.now().astimezone()`; повтор `rename_to`; `board_id` только из команды; проверки `ensure_sprint_state` до записи; спринт с неизвестным состоянием отбрасывается; 207 в ранге — `failed`; порядок полей `(len(id), id)`; кэш на `Executor`) — таблица в design.md. - R-76: трейлер коммитов «Claude Opus 5.5». Цена ошибки — имя модели в трейлере. - R-77: оценка — только по имени «Story Points», ранг/спринт — по `schema.custom`; частичное перекрытие при сбое `GET /field`. Цена ошибки — задать `field_ids.story_points`. - R-78: пустая пачка с `boards` в раннем return; спринты в кэше — только active/future. Цена ошибки — нет. - R-79: настроенный `field_ids.story_points` без `GET /field`; проверка значения до `GET /issue`. Цена ошибки — нет. - R-80: `goal` не передан — цель не трогается (очистка — `""`); «имя занято» — среди не закрытых. Цена ошибки — цель не очистится через `null`. - R-81: задача без статуса — незавершённая; зазор перед закрытием после переносов. Цена ошибки — готовая задача без статуса уедет в следующий спринт. - R-82: `entries` с неуспешным статусом без `errors` — «статус <N>». Цена ошибки — нет. - R-83 (C-1): «готово» при закрытии — по id статусов последней колонки; пустой набор — `failed` без записи. Цена ошибки — лишний `GET /status`. ## Находки | Маркер | Суть | Статус | |---|---|---| | C-1 | перенос готовых задач по именам статусов | fixed 9d3958e | | M-1 | `kanban_backlog` при `columns: null` | fixed d71c2f5 | | M-2 | `rename_to` на закрытое имя | fixed d71c2f5 | | M-3 | фильтр спринтов/колонок слабее валидации хаба | fixed d71c2f5 | | M-4 | неудачный `GET /status` повторяется на каждой доске | deferred | | M-5 | подзадачи при переносе в закрытии спринта | deferred (проверить вживую) | | T1.1, T2.1, T5.1, T5.3, T6.1 | см. ledger | fixed | | T1.2, T1.4, T2.2, T3.2, T4.1, T4.3, T5.2, T6.2, T7.1, T7.2, T7.3, T8.1 | мелкие (повтор GET /field, тесты, `inf`, повтор closed, ключ в выдаче search, README) | deferred | | T1.3, T3.1, T3.3, T4.2, T5.4, T6.3 | — | rejected (причины в ledger) | | RR-1…RR-3 | minor re-review: лишний `/status` для статуса без id, нет `isinstance` для `statuses`, повтор после переименования+закрытия | deferred | | O-1…O-6 | наблюдения: фоновые сабагенты, флейк test_runner, трейлер Haiku (amend), запись src через Bash, тесты версии 14, haiku не доводил коммит | — | 🤖 Generated with [Claude Code](https://claude.com/claude-code)
aep added 19 commits 2026-10-24 18:56:10 +03:00
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Команда ищет спринт доски по имени, создаёт его или записывает только
отличающиеся имя, даты (по дню), цель. Повтор после переименования
находит спринт по новому имени; оба имени заняты — ошибка без записи.
Даты проверяются первыми, доска берётся только из команды.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Версия 15: команды ensure_sprint_meta, ensure_sprint_state, ensure_rank,
story_points в ensure_fields, расширение refresh (rank, story_points,
sprint_ids, boards). Документация: README, ARCHITECTURE, CLAUDE.md;
решения R-64…R-75 перенесены в design.md; исправлен способ получения
смещения дат спринта (R-68). Версии 14 в тестах test_folder и test_history
подняты до 15.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
C-1 финального ревью: ensure_sprint_state closed определял готовые задачи по именам
через молча неполный кэш /status и мог необратимо перенести выполненные задачи.
Теперь id статусов последней колонки берутся из configuration, у задач — status.id;
пустой набор id — failed без записи, задача без status.id считается незавершённой.
В board_columns неизвестный id один раз за команду перечитывает /status, затем пишет
в лог; колонка без строкового имени пропускается с логом. Решение R-83.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
M-1: при ошибке чтения настроек kanban-доски kanban_backlog = null и запрос бэклога не делается.
M-2: ensure_sprint_meta с rename_to, имя которого занято только закрытым спринтом, — failed «имя занято».
M-3: sprint_state принимает только целый id > 0 и непустое строковое name, нестроковые
даты и goal дают null (как check_boards хаба).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
aep merged commit 9095efe921 into main 2026-10-25 13:56:49 +03:00
Sign in to join this conversation.
No Reviewers
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: aep/jira-agent#50
No description provided.