6.0 KiB
6.0 KiB
agent-v12-project-boards — решения агента
Спека и дизайн изменения — в jira-hub/openspec/changes/projects/ (issue aep/jira-hub#61, aep/jira-agent#35).
Агентская часть — решения 7, 14, 15 дизайна хаба и требования agent «Доски проектов» (ADDED) и «Состав и настройки
агента» (MODIFIED); контракт команд — commands (ensure_sprint.board_id, refresh.boards, результат boards).
Decisions made without discussion
Решения 1–21 записаны в jira-hub/openspec/changes/projects/design.md (раздел «Decisions made without discussion»;
для агента — № 6, 7, 14); здесь — только решения агентской части.
| Маркер | Дата | Решение | Обоснование | Цена ошибки |
|---|---|---|---|---|
| R-30 | 2026-10-19 | Типы досок определяются первым шагом refresh — до поиска и в том числе при пустых keys |
Спека: «для каждой доски с type = null агент SHALL запросить» — без условий; хвост пакета refresh {keys: []} не должен оставлять тип неизвестным |
Лишний GET /board/{id} на доску неизвестного типа, если поиск затем упадёт; результат с типом при этом теряется до следующего refresh |
| R-31 | 2026-10-19 | Любой HttpError на GET /board/{id} (в том числе 5xx) — тип null и строка в логе, refresh продолжается; ConnectionError не ловится — весь refresh failed с повтором, как при обрыве связи с Jira |
Спека: «ошибка запроса — в лог, refresh продолжается»; null тип в хабе не меняет, следующий refresh спросит снова; обрыв связи — не свойство доски |
Временный 5xx откладывает определение типа до следующего refresh (автообновление) |
| R-32 | 2026-10-19 | Ошибка чтения спринтов scrum-доски (известной или только что определённой) в refresh не глотается: refresh failed с текстом Jira, как v11 |
Пропуск доски записал бы в зеркало sprint = null всем её задачам; спека о такой ошибке молчит |
Одна сломанная доска (удалена, стала канбаном) останавливает обновление зеркала всех проектов, пока владелец не поправит доску в базе хаба |
| R-33 | 2026-10-19 | Запасной settings.board_id — только когда ключа boards нет (refresh) или board_id нет / null (ensure_sprint); boards: [] — ни одной доски, спринты не читаются |
Новый хаб оставляет board_id в настройках (решение 14 хаба) и шлёт boards всегда; [] от него значит «у проектов нет досок», а не «старый хаб» |
Если старый хаб когда-нибудь пришлёт boards: [], спринты пропадут из зеркала; такого хаба нет |
| R-34 | 2026-10-19 | Ключ boards в результате refresh — только если агент запросил тип хотя бы одной доски; иначе ключа нет |
Спека: результат «для досок, чей тип агент запрашивал»; сценарий «Старый хаб» — «результат без boards» |
Хаб SHALL принимать результат без boards; если он ждёт {}, — ошибка разбора результата в хабе |
| R-35 | 2026-10-19 | Доски сравниваются и выводятся по str(id); повторы в boards отбрасываются (запрос типа — один); элемент без id пропускается; тип принимается только точным "scrum"/"kanban", иное ("simple" и т. п.) — null со строкой в логе; спринты читаются в порядке boards, последнее найденное имя побеждает |
Ключи результата в спеке — строки; хаб шлёт без повторов, но повтор не должен стоить второго запроса; сценарий спеки — «один раз» | Доска "4216" строкой и 4216 числом считаются одной; другой регистр типа от Jira ("Scrum") дал бы null |
| R-36 | 2026-10-19 | По находке I-1 финального ревью: если scrum-доска не отдала спринты в refresh, агент перепроверяет её тип; стала kanban — доска пропускается, в результате boards: {"<id>": "kanban"}, refresh done; иначе failed с текстом «доска : …» (код и retryable прежние) |
Смена доски на канбан лечится без правки базы; при прочих ошибках владелец видит, какую доску править (R-32 расширил зону поражения на все проекты) | Лишний GET /board/{id} при ошибке спринтов; типы досок, определённые в упавшем прогоне, не доходят до хаба — следующий refresh спросит снова |