60 lines
6.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

## 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.