Спринты и бэклог в модуле jira (#108) #109

Merged
aep merged 21 commits from feat/108-sprints-backlog into main 2026-10-25 13:56:42 +03:00
Owner

Closes #108. Агентская часть — aep/jira-agent PR #50 (агент v15), сливать и публиковать после выкатки этого PR.

Что сделано

  • Схема v9: issue.rank, issue.story_points, таблицы jira_board, jira_sprint, issue_sprint; миграция v8 → v9 (копия в backups/).
  • Приём от агента v15 (POST /agent/state): rank, story_points, sprint_ids у задач, boards (колонки, kanban-бэклог, спринты всех состояний) с проверкой формы; тип доски пишется и в jira_project.
  • GET /agile?project=: доска, спринты со своими задачами и суммами SP, бэклог, задачи kanban-доски.
  • Команды: ensure_sprint_meta, ensure_sprint_state, ensure_rank, story_points в ensure_fields; board_id по проекту пакета; хвостовой refresh по JQL проекта для пакетов со спринтом (контракт CommandHooks.tail(conn, cmds, project)); command_retry снимает board_id.
  • MCP sdlc-jira: sprints, sprint, backlog, колонка SP в issues, подсказки новых команд в batch_create.
  • Веб (только просмотр): «Бэклог», «Спринт» (scrum), «Kanban» (kanban); пункты меню по типу доски (NavItem.when); «Доска связей» → «Связи» (/app/jira/links, перенаправления с /app/jira/board и /app/board).
  • README, CLAUDE.md, ARCHITECTURE.md; спеки — openspec/changes/sprints-backlog.

Проверки

  • make check — pytest 1109 passed, lint ok, vitest 66 файлов / 612 passed.
  • cd web && npm run e2e — 52 passed (52 skipped — снимки, только по SCREENS=1).
  • SDD: 12 задач, ревью каждой; финальное ревью (opus) — Critical/Important нет, «Ready with fixes» → правки 26a4878.

Выкатка

  1. Merge этого PR → git pull в sdlc-hub → сразу launchctl kickstart -k gui/$(id -u)/ru.aepif.sdlc-hub (миграция v9; до него MCP/CLI не запускать) → make web → /mcp reconnect.
  2. Merge jira-agent#50 → uv run --project ../sdlc-hub sdlc-hub agent publish src/agent.py (из checkout jira-agent) сразу после kickstart (R-33: агент v14 «выполнит» story_points без записи).
  3. refresh полный → проверить в вебе «Бэклог»/«Спринт», в MCP sprints; если story_points не нашлось — field_ids.story_points.
  4. После agent_status с v15 — поднять min_agent_version до 15.

Rulings I made

  • R-1: kanban-бэклог — раздел страницы «Kanban». Цена ошибки — отдельная страница.
  • R-2: «выполнено» закрытого спринта — по текущему статусу. Цена ошибки — считать по журналу.
  • R-3: только свои задачи проекта. Цена ошибки — флаг соседей.
  • R-4: поле оценки — field_ids.story_points или поиск агентом. Цена ошибки — настройка руками.
  • R-5: имена и параметры новых команд; «выше/ниже» — отношение. Цена ошибки — переименование до выкатки.
  • R-6: данные досок — в каждом refresh. Цена ошибки — лишние запросы к Jira.
  • R-7: один маршрут GET /agile. Цена ошибки — разделить.
  • R-8: kanban — выполненные за 14 дней. Цена ошибки — настройка.
  • R-9: колонка «Без колонки». Цена ошибки — нет.
  • R-10: хвост пакета со спринтами — refresh по JQL проекта; пустой refresh — пачка с boards. Цена ошибки — ~3 лишних search.
  • R-11: kanban без бэклога, поиск спринта по имени, ошибки состояний, принадлежность ensure_rank, форма полей. Цена ошибки — правка проверок.
  • R-12: условные пункты меню, тип доски в jira_project, три состояния данных доски, даты в поясе браузера, история из базовой JQL, переименование. Цена ошибки — правка веба.
  • R-13: CommandHooks.tail(conn, cmds, project) — правка контракта ядра. Цена ошибки — вернуть сигнатуру.
  • R-14: sprints отсутствует/null — спринты доски сохраняются, [] — очищает. Цена ошибки — нет.
  • R-15: проверки постановки (даты, непустые имена, state/move_open_to, ровно одно из before/after, story_points ≥ 0). Цена ошибки — правка проверок.
  • R-16: ensure_fields story_points подтверждается точным совпадением. Цена ошибки — нет.
  • R-17: границы GET /agile (board_type = null, исключение спринтами любой доски, kanban без jira_updated). Цена ошибки — правка выборки.
  • R-18: при kanban-бэклоге первая колонка не рисуется. Цена ошибки — нет.
  • R-19: три состояния данных доски по fetched_at/columns. Цена ошибки — нет.
  • R-20: на экранах — существующая «Обновить из Jira» (читает Jira, не правит). Цена ошибки — убрать кнопку.
  • R-21: «Связи» — меню, вкладка, ссылка; h1 «Доска связей». Цена ошибки — переименовать h1.
  • R-22: смена проекта на «Бэклог/Спринт/Kanban» оставляет адрес. Цена ошибки — нет.
  • R-23: «не найдено» — только безусловные пункты. Цена ошибки — нет.
  • R-24: склонение «N задач». Цена ошибки — нет.
  • R-25: тексты MCP sprints/sprint/backlog. Цена ошибки — правка текстов.
  • R-26: спринты сортируются по UTC; веб приводит ±HHMM. Цена ошибки — нет.
  • R-27: в e2e — второй проект KANBAN_E2E. Цена ошибки — нет.
  • R-28: поле Jira не найдено — ключ не передаётся; спринты не прочитались — доска не в boards. Цена ошибки — нет.
  • R-29: трейлер коммитов контроллера — «Claude Sonnet 5.5». Цена ошибки — имя в трейлере.
  • R-30: доска с неизвестным типом и kanban без колонок в GET /agile. Цена ошибки — правка выборки.
  • R-31: пустые строки в параметрах команд — «не задано». Цена ошибки — ужесточить до 422.
  • R-32: «Прошлые спринты» не рисуются при N = 0. Цена ошибки — рисовать «(0)».
  • R-33: агент v14 «выполнит» story_points как done без записи — окно выкатки описано в README. Цена ошибки — ложный done в окне; исправление — 422 при agent_version < 15.

Находки

Маркер Суть Статус
T2.1, T4.1 огромные целые / OverflowError → 500 fixed 26a4878
T4.2, M-4 пробельные sprint/move_open_to/before/after fixed 26a4878
T7.1, T10.2, T12.1 хрупкие тесты дат fixed 26a4878
T8.1 тест проводки visibleNav fixed b5f5efe
T9.1 (Important) неопределённый токен цвета эпика fixed 9212c19
T9.3, T9.5 открытие карточки при выделении, дубли селектора fixed 9212c19
T10.1 двойной отступ «Спринт» fixed fe1d592
T10.4 тест подписи последней колонки fixed 611ed83
T11.1 лишний фильтр KanbanPage fixed 26a4878
M-1, M-2, M-5 README, ARCHITECTURE, тест bad_boards fixed 26a4878
M-3 агент v14 и story_points R-33, README fixed 26a4878
T1.1, T1.3, T2.2, T3.1–T3.5, T5.1, T6.1, T9.4, T10.3, T12.2–T12.4, M-6, T-F1 тесты границ, косметика, единый формат SP, обрезка params в validate deferred
T1.2, T1.4, T5.2, T6.2, T6.3, T7.2, T8.2, T9.6, T11.2 — rejected (причины в ledger)
O-1…O-5 TDD-порядок исполнителя T3, флейк activity.test.tsx, фоновые make check, смена cwd контроллера наблюдения

Открытый вопрос владельцу: эпики в scrum-бэклоге — сейчас показываются (буква спеки), в Jira с панелью эпиков их в списке нет.

🤖 Generated with Claude Code

Closes #108. Агентская часть — aep/jira-agent PR #50 (агент v15), сливать и публиковать **после** выкатки этого PR. ## Что сделано - **Схема v9:** `issue.rank`, `issue.story_points`, таблицы `jira_board`, `jira_sprint`, `issue_sprint`; миграция v8 → v9 (копия в `backups/`). - **Приём от агента v15** (`POST /agent/state`): `rank`, `story_points`, `sprint_ids` у задач, `boards` (колонки, kanban-бэклог, спринты всех состояний) с проверкой формы; тип доски пишется и в `jira_project`. - **`GET /agile?project=`:** доска, спринты со своими задачами и суммами SP, бэклог, задачи kanban-доски. - **Команды:** `ensure_sprint_meta`, `ensure_sprint_state`, `ensure_rank`, `story_points` в `ensure_fields`; `board_id` по проекту пакета; хвостовой `refresh` по JQL проекта для пакетов со спринтом (контракт `CommandHooks.tail(conn, cmds, project)`); `command_retry` снимает `board_id`. - **MCP `sdlc-jira`:** `sprints`, `sprint`, `backlog`, колонка SP в `issues`, подсказки новых команд в `batch_create`. - **Веб (только просмотр):** «Бэклог», «Спринт» (scrum), «Kanban» (kanban); пункты меню по типу доски (`NavItem.when`); «Доска связей» → «Связи» (`/app/jira/links`, перенаправления с `/app/jira/board` и `/app/board`). - README, CLAUDE.md, ARCHITECTURE.md; спеки — `openspec/changes/sprints-backlog`. ## Проверки - `make check` — pytest 1109 passed, lint ok, vitest 66 файлов / 612 passed. - `cd web && npm run e2e` — 52 passed (52 skipped — снимки, только по `SCREENS=1`). - SDD: 12 задач, ревью каждой; финальное ревью (opus) — Critical/Important нет, «Ready with fixes» → правки 26a4878. ## Выкатка 1. Merge этого PR → `git pull` в `sdlc-hub` → **сразу** `launchctl kickstart -k gui/$(id -u)/ru.aepif.sdlc-hub` (миграция v9; до него MCP/CLI не запускать) → `make web` → `/mcp` reconnect. 2. Merge jira-agent#50 → `uv run --project ../sdlc-hub sdlc-hub agent publish src/agent.py` (из checkout jira-agent) **сразу после kickstart** (R-33: агент v14 «выполнит» `story_points` без записи). 3. `refresh` полный → проверить в вебе «Бэклог»/«Спринт», в MCP `sprints`; если `story_points` не нашлось — `field_ids.story_points`. 4. После `agent_status` с v15 — поднять `min_agent_version` до 15. ## Rulings I made - R-1: kanban-бэклог — раздел страницы «Kanban». Цена ошибки — отдельная страница. - R-2: «выполнено» закрытого спринта — по текущему статусу. Цена ошибки — считать по журналу. - R-3: только свои задачи проекта. Цена ошибки — флаг соседей. - R-4: поле оценки — `field_ids.story_points` или поиск агентом. Цена ошибки — настройка руками. - R-5: имена и параметры новых команд; «выше/ниже» — отношение. Цена ошибки — переименование до выкатки. - R-6: данные досок — в каждом `refresh`. Цена ошибки — лишние запросы к Jira. - R-7: один маршрут `GET /agile`. Цена ошибки — разделить. - R-8: kanban — выполненные за 14 дней. Цена ошибки — настройка. - R-9: колонка «Без колонки». Цена ошибки — нет. - R-10: хвост пакета со спринтами — `refresh` по JQL проекта; пустой `refresh` — пачка с `boards`. Цена ошибки — ~3 лишних `search`. - R-11: kanban без бэклога, поиск спринта по имени, ошибки состояний, принадлежность `ensure_rank`, форма полей. Цена ошибки — правка проверок. - R-12: условные пункты меню, тип доски в `jira_project`, три состояния данных доски, даты в поясе браузера, история из базовой JQL, переименование. Цена ошибки — правка веба. - R-13: `CommandHooks.tail(conn, cmds, project)` — правка контракта ядра. Цена ошибки — вернуть сигнатуру. - R-14: `sprints` отсутствует/`null` — спринты доски сохраняются, `[]` — очищает. Цена ошибки — нет. - R-15: проверки постановки (даты, непустые имена, `state`/`move_open_to`, ровно одно из `before`/`after`, `story_points` ≥ 0). Цена ошибки — правка проверок. - R-16: `ensure_fields story_points` подтверждается точным совпадением. Цена ошибки — нет. - R-17: границы `GET /agile` (`board_type = null`, исключение спринтами любой доски, kanban без `jira_updated`). Цена ошибки — правка выборки. - R-18: при kanban-бэклоге первая колонка не рисуется. Цена ошибки — нет. - R-19: три состояния данных доски по `fetched_at`/`columns`. Цена ошибки — нет. - R-20: на экранах — существующая «Обновить из Jira» (читает Jira, не правит). Цена ошибки — убрать кнопку. - R-21: «Связи» — меню, вкладка, ссылка; `h1` «Доска связей». Цена ошибки — переименовать `h1`. - R-22: смена проекта на «Бэклог/Спринт/Kanban» оставляет адрес. Цена ошибки — нет. - R-23: «не найдено» — только безусловные пункты. Цена ошибки — нет. - R-24: склонение «N задач». Цена ошибки — нет. - R-25: тексты MCP `sprints`/`sprint`/`backlog`. Цена ошибки — правка текстов. - R-26: спринты сортируются по UTC; веб приводит `±HHMM`. Цена ошибки — нет. - R-27: в e2e — второй проект `KANBAN_E2E`. Цена ошибки — нет. - R-28: поле Jira не найдено — ключ не передаётся; спринты не прочитались — доска не в `boards`. Цена ошибки — нет. - R-29: трейлер коммитов контроллера — «Claude Sonnet 5.5». Цена ошибки — имя в трейлере. - R-30: доска с неизвестным типом и kanban без колонок в `GET /agile`. Цена ошибки — правка выборки. - R-31: пустые строки в параметрах команд — «не задано». Цена ошибки — ужесточить до 422. - R-32: «Прошлые спринты» не рисуются при N = 0. Цена ошибки — рисовать «(0)». - R-33: агент v14 «выполнит» `story_points` как `done` без записи — окно выкатки описано в README. Цена ошибки — ложный `done` в окне; исправление — 422 при `agent_version` < 15. ## Находки | Маркер | Суть | Статус | |---|---|---| | T2.1, T4.1 | огромные целые / OverflowError → 500 | fixed 26a4878 | | T4.2, M-4 | пробельные `sprint`/`move_open_to`/`before`/`after` | fixed 26a4878 | | T7.1, T10.2, T12.1 | хрупкие тесты дат | fixed 26a4878 | | T8.1 | тест проводки visibleNav | fixed b5f5efe | | T9.1 (Important) | неопределённый токен цвета эпика | fixed 9212c19 | | T9.3, T9.5 | открытие карточки при выделении, дубли селектора | fixed 9212c19 | | T10.1 | двойной отступ «Спринт» | fixed fe1d592 | | T10.4 | тест подписи последней колонки | fixed 611ed83 | | T11.1 | лишний фильтр KanbanPage | fixed 26a4878 | | M-1, M-2, M-5 | README, ARCHITECTURE, тест bad_boards | fixed 26a4878 | | M-3 | агент v14 и `story_points` | R-33, README fixed 26a4878 | | T1.1, T1.3, T2.2, T3.1–T3.5, T5.1, T6.1, T9.4, T10.3, T12.2–T12.4, M-6, T-F1 | тесты границ, косметика, единый формат SP, обрезка params в validate | deferred | | T1.2, T1.4, T5.2, T6.2, T6.3, T7.2, T8.2, T9.6, T11.2 | — | rejected (причины в ledger) | | O-1…O-5 | TDD-порядок исполнителя T3, флейк `activity.test.tsx`, фоновые `make check`, смена cwd контроллера | наблюдения | Открытый вопрос владельцу: эпики в scrum-бэклоге — сейчас показываются (буква спеки), в Jira с панелью эпиков их в списке нет. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
aep added 21 commits 2026-10-25 13:55:47 +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 Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
aep merged commit b4f637baf2 into main 2026-10-25 13:56:42 +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/sdlc-hub#109
No description provided.