Агент v12: доски проектов из параметров команд (#35) #36

Merged
aep merged 5 commits from feat/35-projects into main 2026-10-19 19:43:29 +03:00
Owner

Closes #35. Часть фичи aep/jira-hub#61 (несколько проектов-меток в мосте). Контракт — jira-hub/openspec/changes/projects (specs agent, commands); решения агента — openspec/changes/agent-v12-project-boards/design.md.

Что сделано

  • ensure_sprint берёт доску из board_id команды; без него — settings.board_id, как v11. Кэш спринтов — по доскам.
  • refresh с boards: [{id, type}]: тип досок с type = null — GET /rest/agile/1.0/board/{id}, результат boards: {"<id>": scrum|kanban|null}; спринты — со всех scrum-досок (последнее найденное имя побеждает); без boards — как v11.
  • Доска, которую хаб считает scrum, но которая стала канбаном, пропускается и уходит хабу с типом kanban (R-36); иная ошибка спринтов — failed с «доска : …».
  • AGENT_VERSION = 12, README, ARCHITECTURE, CLAUDE.md.

Проверка

/usr/bin/python3 -W error::ResourceWarning -m unittest discover -s tests -t . → Ran 281 tests, OK. Финальное ревью ветки (opus): 0 critical, 1 important (исправлена), 5 minor (4 исправлены, 1 отложена).

Rulings I made

  • R-30 — типы досок определяются первым шагом refresh, в том числе при пустых keys. Цена: лишний GET, если поиск затем упадёт.
  • R-31 — любой HttpError на GET /board/{id} → тип null + лог, refresh продолжается; ConnectionError — повтор всего refresh. Цена: временный 5xx откладывает тип до следующего refresh.
  • R-32 — ошибка чтения спринтов scrum-доски не глотается (failed), чтобы не обнулить спринты в зеркале. Цена: одна сломанная доска останавливает обновление всех проектов (смягчено R-36).
  • R-33 — settings.board_id — запасной только без ключа boards/board_id; boards: [] — досок нет. Цена: гипотетический старый хаб с [] потерял бы спринты.
  • R-34 — ключ boards в результате только если тип хотя бы одной доски запрашивался. Цена: хаб обязан принимать результат без boards (учтено в плане хаба).
  • R-35 — доски по str(id), повторы и элементы без id/не-словари пропускаются, тип — только точные scrum/kanban. Цена: "Scrum" от Jira дал бы null.
  • R-36 — по I-1: доска, ставшая канбаном, пропускается с типом в результате; иначе failed с номером доски. Цена: лишний GET при ошибке спринтов.

Находки

Маркер Суть Статус
I-1 refresh failed без номера доски; доска, ставшая канбаном, валит refresh fixed ced48cf (R-36)
M-1 ensure_sprint: текущий спринт сравнивается по имени без учёта доски (одноимённые спринты разных досок) deferred
M-2 элемент boards не-словарь → внутренняя ошибка агента fixed ced48cf
M-3 design-only change без skip_specs не проходит openspec validate fixed ced48cf
M-4 тест 5xx ��е проверял отправку состояния в хаб fixed ced48cf
M-5 лишняя пустая строка в tests/test_refresh.py fixed ced48cf

Deferred

  • M-1 — ensure_sprint сравнивает текущий спринт задачи только по имени.

Выкатка

Сливается и публикуется до хаба с проектами (design хаба, решение 14): merge → agent publish → agent_status показывает v12 → затем хаб.

🤖 Generated with Claude Code

Closes #35. Часть фичи aep/jira-hub#61 (несколько проектов-меток в мосте). Контракт — `jira-hub/openspec/changes/projects` (specs `agent`, `commands`); решения агента — `openspec/changes/agent-v12-project-boards/design.md`. ## Что сделано - `ensure_sprint` берёт доску из `board_id` команды; без него — `settings.board_id`, как v11. Кэш спринтов — по доскам. - `refresh` с `boards: [{id, type}]`: тип досок с `type = null` — `GET /rest/agile/1.0/board/{id}`, результат `boards: {"<id>": scrum|kanban|null}`; спринты — со всех scrum-досок (последнее найденное имя побеждает); без `boards` — как v11. - Доска, которую хаб считает scrum, но которая стала канбаном, пропускается и уходит хабу с типом `kanban` (R-36); иная ошибка спринтов — `failed` с «доска <id>: …». - `AGENT_VERSION = 12`, README, ARCHITECTURE, CLAUDE.md. ## Проверка `/usr/bin/python3 -W error::ResourceWarning -m unittest discover -s tests -t .` → Ran 281 tests, OK. Финальное ревью ветки (opus): 0 critical, 1 important (исправлена), 5 minor (4 исправлены, 1 отложена). ## Rulings I made - R-30 — типы досок определяются первым шагом `refresh`, в том числе при пустых `keys`. Цена: лишний GET, если поиск затем упадёт. - R-31 — любой `HttpError` на `GET /board/{id}` → тип `null` + лог, `refresh` продолжается; `ConnectionError` — повтор всего `refresh`. Цена: временный 5xx откладывает тип до следующего `refresh`. - R-32 — ошибка чтения спринтов scrum-доски не глотается (`failed`), чтобы не обнулить спринты в зеркале. Цена: одна сломанная доска останавливает обновление всех проектов (смягчено R-36). - R-33 — `settings.board_id` — запасной только без ключа `boards`/`board_id`; `boards: []` — досок нет. Цена: гипотетический старый хаб с `[]` потерял бы спринты. - R-34 — ключ `boards` в результате только если тип хотя бы одной доски запрашивался. Цена: хаб обязан принимать результат без `boards` (учтено в плане хаба). - R-35 — доски по `str(id)`, повторы и элементы без `id`/не-словари пропускаются, тип — только точные `scrum`/`kanban`. Цена: `"Scrum"` от Jira дал бы `null`. - R-36 — по I-1: доска, ставшая канбаном, пропускается с типом в результате; иначе `failed` с номером доски. Цена: лишний GET при ошибке спринтов. ## Находки | Маркер | Суть | Статус | |---|---|---| | I-1 | refresh failed без номера доски; доска, ставшая канбаном, валит refresh | fixed ced48cf (R-36) | | M-1 | `ensure_sprint`: текущий спринт сравнивается по имени без учёта доски (одноимённые спринты разных досок) | deferred | | M-2 | элемент `boards` не-словарь → внутренняя ошибка агента | fixed ced48cf | | M-3 | design-only change без `skip_specs` не проходит `openspec validate` | fixed ced48cf | | M-4 | тест 5xx ��е проверял отправку состояния в хаб | fixed ced48cf | | M-5 | лишняя пустая строка в `tests/test_refresh.py` | fixed ced48cf | ## Deferred - M-1 — `ensure_sprint` сравнивает текущий спринт задачи только по имени. ## Выкатка Сливается и публикуется **до** хаба с проектами (design хаба, решение 14): merge → `agent publish` → `agent_status` показывает v12 → затем хаб. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
aep added 5 commits 2026-10-19 19:32:30 +03:00
aep merged commit 3fe6370cd6 into main 2026-10-19 19:43:29 +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#36
No description provided.