60 lines
6.4 KiB
Markdown
60 lines
6.4 KiB
Markdown
## Why
|
||
|
||
Мост работает в ежедневном режиме с 13.10.2026 (агент на виртуалке за VPN «Континент», обмен через общую папку UTM).
|
||
Отложенные находки `bridge-core` (#1) и `folder-transport` (#5) содержат несколько мест, где живая работа может привести
|
||
к дублю задачи в Jira, к команде, зависшей в `claimed` без пути восстановления, или к лишним запросам к Jira банка:
|
||
|
||
- **R-11 / O-9** — хаб не знает логин Jira агента, поэтому `ensure_issue` никогда не подтверждается по состоянию; каждый
|
||
потерянный отчёт о создании задачи требует ручного действия.
|
||
- **O-3** — связь симметричного типа («Связанные»), стоящая в Jira в обратную сторону, считается конфликтом в
|
||
`check_confirmed` и «отсутствующей» в отчёте импорта (13.10.2026 импорт показал 3 такие ложные `missing_links`).
|
||
- **M-2** — ответ на `claim` потерян (сбой папки, перезапуск агента во время долгого запроса): команда навсегда `claimed`,
|
||
в журнале агента её нет; очередь стоит 10 минут, затем команда требует force-cancel или повтора.
|
||
- **M-5** — поздний отчёт по force-отменённой `ensure_issue` теряет ключ созданной задачи.
|
||
- **M-11** — отчёт по команде в `queued` принимается; две `ensure_issue` с одной темой в пакете дают одну задачу на два
|
||
временных ключа.
|
||
- **M-9 / O-2** — после перезапуска агент забывает время последнего вызова Jira и сразу выполняет команду без паузы темпа;
|
||
при восстановлении по журналу пауза обнуляется явно.
|
||
- **FM-4** — восстановление по журналу повторно пишет `claimed`.
|
||
- Расхождение со спекой: `agent_status` отдаёт признак `online`, спека говорит `offline`.
|
||
|
||
Решения владельца 13.10.2026 (сессия brainstorming): пакет A follow-ups — первым; вариант A для M-2 — хаб довыдаёт
|
||
команду, выданную агенту и оставшуюся без отчёта (принцип «хаб не повторяет команды» уточняется: довыдача
|
||
неподтверждённой выдачи — не повтор); дизайн частей 1–3 (повторная выдача и отчёты; факты агента о Jira в claim; темп
|
||
после перезапуска, `online`, тесты и выкладка) одобрен.
|
||
|
||
## What Changes
|
||
|
||
- **jira-hub**:
|
||
- повторная выдача: `claim` при наличии команды в `claimed` выдаёт её снова (самую старую), счётчик `deliveries`;
|
||
после 3 выдач без отчёта — `failed` «агент не отчитался после 3 выдач»; логика «свежей claimed» (10 минут простоя) и
|
||
обход пакета с зависшим определителем (R-13) удаляются;
|
||
- отчёт по `queued` — 409; пакет с двумя `ensure_issue` одной темы — 422;
|
||
- поздний отчёт по отменённой `ensure_issue` с ключом сохраняет результат и переносит заметку `new:N` → ключ, статус
|
||
остаётся `cancelled`;
|
||
- `agent_status` хранит `jira_user` и `symmetric_link_types` из claim; `check_confirmed` подтверждает `ensure_issue`
|
||
задачей от `jira_user` и не считает обратную связь симметричного типа конфликтом; отчёт импорта так же;
|
||
- заготовка настройки `reporter` удаляется; MCP `agent_status` показывает логин агента и довыданные команды.
|
||
- **jira-agent** (версия 3):
|
||
- при старте `GET /myself` и `GET /issueLinkType`; `jira_user` и `symmetric_link_types` в каждом claim;
|
||
- время последнего вызова Jira восстанавливается при старте из журнала; при восстановлении пауза команды не обнуляется;
|
||
- при восстановлении `claimed` повторно не пишется.
|
||
- Спеки: `hub-api`, `data-model`, `commands`, `agent`, `mcp` — MODIFIED; признак `online` закрепляется в спеке вместо
|
||
`offline`.
|
||
|
||
## Non-goals
|
||
|
||
- Остальные находки follow-ups (`T-n`, `M-n` вне перечня, расхождения второго порядка) — пакеты C и D.
|
||
- Проверки поведения на реальной Jira банка (CRLF, Epic Link, постраничность комментариев, поле спринта) — пакет B.
|
||
- Подъём `min_agent_version` до 3: агент v2 продолжает работать, новые поля claim необязательны.
|
||
- Дубли `ensure_issue` между разными пакетами: поиск дубля по теме за 7 дней уже сводит их к одной задаче.
|
||
|
||
## Impact
|
||
|
||
- `jira-hub`: `queue.py` (claim, report_result, agent_view), `commands.py` (validate, check_confirmed), `importer.py`,
|
||
`db.py` (миграция: `command.deliveries`, `agent_status.jira_user`, `agent_status.symmetric_link_types`), `api.py`
|
||
(409 на отчёт по queued), `settings.py`, `mcp_server.py`; `CLAUDE.md` и `ARCHITECTURE.md` — уточнённый принцип повторов.
|
||
- `jira-agent`: `src/agent.py` (Runner, Journal, HubClient.claim), `README.md`, версия 3.
|
||
- Контракт: тело `POST /agent/claim` получает два необязательных поля; ответы не меняются.
|
||
- Issues: aep/jira-hub#9, aep/jira-agent#9.
|