Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014Typ5sXWNMFirr2va2uL8o
3.1 KiB
3.1 KiB
bridge-core (агент) — решения
Спека изменения лежит в репозитории jira-hub: jira-hub/openspec/changes/bridge-core/ (specs/agent, specs/commands, specs/hub-api, design.md). Здесь — только решения, принятые при реализации агента без обсуждения с человеком.
Decisions made without discussion
| # | Дата | Решение | Обоснование | Цена ошибки |
|---|---|---|---|---|
| 1 | 2026-10-11 | tests/__init__.py добавляет каталог tests/ в sys.path (R-1) |
Тесты из плана импортируют _common/fake_jira по простому имени, при discover -s tests -t . иначе ImportError |
Мелкая: переписать импорты в тестах на относительные |
| 2 | 2026-10-11 | Потолок на Retry-After не вводим (R-2) |
Спека: «ждать Retry-After»; потолок тихо нарушает требование сервера |
Агент может уснуть надолго при аномальном заголовке; лечится потолком позже |
| 3 | 2026-10-11 | Журнал: не лечим права существующего файла и не блокируем prune/append flock'ом; запрет prune при работающем агенте — в README (R-3) |
Журнал создаётся этим же кодом (0600); prune — ручная команда раз в месяц |
Редкая потеря записи журнала при гонке prune/run; лечится flock |
| 4 | 2026-10-11 | Minor-замечания ревью Task 3 (T3.1, T3.3–T3.6, T3.8: пагинация поиска дубля, флаги existed/created, режим epic_link, префикс маркера, общий except в run, тесты) чиним одной финальной волной, а не по месту (R-4) | Не блокируют Task 4–5; одна волна дешевле | Task 4–5 унаследуют общий run; ошибки будут чиниться после |
| 5 | 2026-10-11 | Неизвестный link_type берётся как сырое имя типа Jira (fallback), без failed (R-5) |
Так же делает хаб в check_confirmed; допускает ручной ввод имён Jira |
Опечатка в типе даст HTTP-ошибку Jira вместо понятной ошибки агента |
| 6 | 2026-10-11 | Спринт в refresh берётся из Agile API по активным/будущим спринтам доски, а не из поля search; закрытые спринты дают sprint = null (R-6) |
В настройках хаба нет id поля спринта (field_ids его не содержит); план Task 5 выбрал Agile |
Исторические имена спринтов затрутся при полном refresh; лечится полем спринта в настройках |