feat: надёжность моста — довыдача команды без отчёта, миграция v2, отчёты (#9) #10

Merged
aep merged 9 commits from feat/9-bridge-reliability into main 2026-10-13 22:16:50 +03:00
Owner

Closes #9. Пакет A follow-ups (#4, #8): надёжность моста в ежедневной работе. Агентская часть — aep/jira-agent PR (ветка feat/9-bridge-reliability).

Спека: openspec/changes/bridge-reliability/ (proposal, design — решения 1–13, дельты hub-api, data-model, commands, agent, mcp, migration). План: docs/superpowers/plans/2026-10-13-bridge-reliability-hub.md.

Что сделано

  • Довыдача. Команда в claimed без отчёта выдаётся снова при следующем claim (самая старая первой), счётчик command.deliveries; после 3 выдач — failed «агент не отчитался после 3 выдач». Убраны «свежая claimed» (10 минут простоя) и обход пакета с зависшим определителем (R-13). agent_status.redelivered вместо stuck, MCP показывает довыданные команды.
  • Миграция схемы v1 → v2 (command.deliveries) — первая миграция живой базы; копия backups/*-schema-v1.sqlite перед ней, ротации не подлежит.
  • Отчёты и пакеты: отчёт по queued — 409 not_claimed; поздний done с ключом по отменённой ensure_issue записывается, заметка new:N переезжает на ключ, статус остаётся cancelled; пакет с двумя ensure_issue одной темы — 422.
  • R-11 закрыт довыдачей: ensure_issue по состоянию зеркала не подтверждается, настройка reporter удалена. O-3: отчёт импорта — reversed_links (связи, стоящие в Jira в обратную сторону) отдельно от missing_links.
  • Принцип «хаб не повторяет команды» уточнён в CLAUDE.md, ARCHITECTURE.md, README: новых команд хаб не создаёт, довыдача — доставка той же выдачи.

Тесты: uv run pytest -q → 169 passed. Финальное ревью (opus, оба репозитория): Critical 0, Important 1 (исправлено), Minor 11.

Выкатка (design.md, Migration Plan)

  1. До перезапуска хаба: на виртуалке один процесс агента; посмотреть claimed в agent_status — после старта они будут довыданы; ненужные отменить с force.
  2. merge → git pull в основном checkout → launchctl kickstart -k gui/$(id -u)/ru.aepif.jira-hub → в backups/ копия *-schema-v1.sqlite.
  3. Агент v3: остановить v2, затем запустить v3.
  4. jira-hub import admin/jira-sync — три связи в reversed_links, missing_links: 0.

Находки и статусы

Маркер Откуда Суть Статус
R-11 / O-9 #4 ensure_issue не подтверждается по состоянию fixed 817c761 (закрыт довыдачей)
O-3 #4 симметричная связь в обратную сторону — ложный конфликт / missing fixed 817c761 (reversed_links)
M-11 (агент) #4 отчёт по queued; дубль темы в пакете fixed bf73299
M-2 #4 claim при мёртвом соединении оставляет claimed fixed 958dbe9 (довыдача)
M-5 #4 поздний отчёт по отменённой ensure_issue теряет ключ fixed bf73299
— #4 agent_status: online vs offline в спеке fixed 8b32179 (спека приведена к коду)
I-1 финальное ревью второй процесс агента выполнял бы довыданную команду одновременно fixed 1fc2705 (design, спека) + aep/jira-agent 058a78b
M-1 (→ Important) финальное ревью ротация удаляла копию schema-v1 fixed 1fc2705
M-2 финальное ревью параллельные connect к базе v1 — копия на каждое соединение deferred
M-3 финальное ревью нестроковый summary в ensure_issue — 500 вместо 422 deferred
M-4 финальное ревью поздний отчёт ensure_issue после failed по пределу теряет ключ; sync_run refresh без finished_at deferred
M-5 финальное ревью повторный refresh после довыдачи удваивает счётчики sync_run deferred
M-6 финальное ревью время журнала из будущего отключает паузу (агент) deferred
M-7 финальное ревью last_jira_call_at после перезапуска — время записи журнала (агент) deferred
M-8 финальное ревью формулировка «предел выдач защищает от падения агента» fixed 1fc2705
M-9 финальное ревью рулинги не внесены в design.md fixed 1fc2705, aep/jira-agent 8dd566f
M-10 финальное ревью имя test_fresh_definer_still_blocks_queue; нет сквозного теста миграция → довыдача deferred
M-11 финальное ревью отмена пакета не сообщает, что взятая команда ещё выполнится deferred

Rulings I made

  • R-1 — шаг плана «автообновление при claimed без отчёта» вынесен в отдельный тест (в исходном тесте auto_refresh_minutes = 0) — цена: нет.
  • R-2 — CLAUDE.md/ARCHITECTURE.md: db вызывает backup, указан текущий change — цена: нет.
  • R-3 — копии *-schema-v* вне ротации — цена: копятся по одной на миграцию.
  • R-4 — один процесс агента на журнал (решение 13) — цена: нет.
  • R-5 — дубль ensure_issue при довыдаче после 7+ дней простоя оставлен (контракт commands) — цена: возможный дубль после недели простоя.
  • R-6 — time.monotonic во сне виртуалки — поведение до change, темп консервативнее — цена: лишнее ожидание.
  • R-7 — неверное утверждение о reload_settings_before убрано из design.md — цена: нет.
  • R-8 — чередование двух claimed при довыдаче оставлено (по спеке) — цена: нет.
  • R-9 — reversed_links не ищется без задачи-источника в зеркале (она в missing_keys) — цена: нет.
  • R-10 — основные спеки обновятся при openspec archive — цена: нет.
  • R-11 — шаг 0 выкатки: проверить claimed в живой базе до перезапуска хаба — цена: нет.
  • Агент: R-51 (версия в тесте через AGENT_VERSION), R-52 (fcntl в белом списке stdlib) — см. PR агента.
  • Решения брейнсторма без обсуждения — таблица в design.md (online, предел 3, миграция с копией, дубль темы после strip, оценка темпа по ��урналу, поздний отчёт, 409, reversed_links, без копии при довыдаче).

Deferred (в follow-up при закрытии)

M-2, M-3, M-4, M-5, M-6, M-7, M-10, M-11 финального ревью (см. таблицу).

🤖 Generated with Claude Code

Closes #9. Пакет A follow-ups (#4, #8): надёжность моста в ежедневной работе. Агентская часть — aep/jira-agent PR (ветка `feat/9-bridge-reliability`). Спека: `openspec/changes/bridge-reliability/` (proposal, design — решения 1–13, дельты hub-api, data-model, commands, agent, mcp, migration). План: `docs/superpowers/plans/2026-10-13-bridge-reliability-hub.md`. ## Что сделано - **Довыдача.** Команда в `claimed` без отчёта выдаётся снова при следующем `claim` (самая старая первой), счётчик `command.deliveries`; после 3 выдач — `failed` «агент не отчитался после 3 выдач». Убраны «свежая claimed» (10 минут простоя) и обход пакета с зависшим определителем (R-13). `agent_status.redelivered` вместо `stuck`, MCP показывает довыданные команды. - **Миграция схемы v1 → v2** (`command.deliveries`) — первая миграция живой базы; копия `backups/*-schema-v1.sqlite` перед ней, ротации не подлежит. - **Отчёты и пакеты:** отчёт по `queued` — 409 `not_claimed`; поздний `done` с ключом по отменённой `ensure_issue` записывается, заметка `new:N` переезжает на ключ, статус остаётся `cancelled`; пакет с двумя `ensure_issue` одной темы — 422. - **R-11** закрыт довыдачей: `ensure_issue` по состоянию зеркала не подтверждается, настройка `reporter` удалена. **O-3:** отчёт импорта — `reversed_links` (связи, стоящие в Jira в обратную сторону) отдельно от `missing_links`. - Принцип «хаб не повторяет команды» уточнён в `CLAUDE.md`, `ARCHITECTURE.md`, README: новых команд хаб не создаёт, довыдача — доставка той же выдачи. Тесты: `uv run pytest -q` → 169 passed. Финальное ревью (opus, оба репозитория): Critical 0, Important 1 (исправлено), Minor 11. ## Выкатка (design.md, Migration Plan) 0. До перезапуска хаба: на виртуалке один процесс агента; посмотреть `claimed` в `agent_status` — после старта они будут довыданы; ненужные отменить с `force`. 1. merge → `git pull` в основном checkout → `launchctl kickstart -k gui/$(id -u)/ru.aepif.jira-hub` → в `backups/` копия `*-schema-v1.sqlite`. 2. Агент v3: остановить v2, затем запустить v3. 3. `jira-hub import admin/jira-sync` — три связи в `reversed_links`, `missing_links: 0`. ## Находки и статусы | Маркер | Откуда | Суть | Статус | |---|---|---|---| | R-11 / O-9 | #4 | `ensure_issue` не подтверждается по состоянию | fixed 817c761 (закрыт довыдачей) | | O-3 | #4 | симметричная связь в обратную сторону — ложный конфликт / missing | fixed 817c761 (`reversed_links`) | | M-11 (агент) | #4 | отчёт по `queued`; дубль темы в пакете | fixed bf73299 | | M-2 | #4 | claim при мёртвом соединении оставляет `claimed` | fixed 958dbe9 (довыдача) | | M-5 | #4 | поздний отчёт по отменённой `ensure_issue` теряет ключ | fixed bf73299 | | — | #4 | `agent_status`: `online` vs `offline` в спеке | fixed 8b32179 (спека приведена к коду) | | I-1 | финальное ревью | второй процесс агента выполнял бы довыданную команду одновременно | fixed 1fc2705 (design, спека) + aep/jira-agent 058a78b | | M-1 (→ Important) | финальное ревью | ротация удаляла копию `schema-v1` | fixed 1fc2705 | | M-2 | финальное ревью | параллельные `connect` к базе v1 — копия на каждое соединение | deferred | | M-3 | финальное ревью | нестроковый `summary` в `ensure_issue` — 500 вместо 422 | deferred | | M-4 | финальное ревью | поздний отчёт `ensure_issue` после `failed` по пределу теряет ключ; `sync_run` refresh без `finished_at` | deferred | | M-5 | финальное ревью | повторный `refresh` после довыдачи удваивает счётчики `sync_run` | deferred | | M-6 | финальное ревью | время журнала из будущего отключает паузу (агент) | deferred | | M-7 | финальное ревью | `last_jira_call_at` после перезапуска — время записи журнала (агент) | deferred | | M-8 | финальное ревью | формулировка «предел выдач защищает от падения агента» | fixed 1fc2705 | | M-9 | финальное ревью | рулинги не внесены в design.md | fixed 1fc2705, aep/jira-agent 8dd566f | | M-10 | финальное ревью | имя `test_fresh_definer_still_blocks_queue`; нет сквозного теста миграция → довыдача | deferred | | M-11 | финальное ревью | отмена пакета не сообщает, что взятая команда ещё выполнится | deferred | ## Rulings I made - R-1 — шаг плана «автообновление при claimed без отчёта» вынесен в отдельный тест (в исходном тесте `auto_refresh_minutes = 0`) — цена: нет. - R-2 — `CLAUDE.md`/`ARCHITECTURE.md`: `db` вызывает `backup`, указан текущий change — цена: нет. - R-3 — копии `*-schema-v*` вне ротации — цена: копятся по одной на миграцию. - R-4 — один процесс агента на журнал (решение 13) — цена: нет. - R-5 — дубль `ensure_issue` при довыдаче после 7+ дней простоя оставлен (контракт commands) — цена: возможный дубль после недели простоя. - R-6 — `time.monotonic` во сне виртуалки — поведение до change, темп консервативнее — цена: лишнее ожидание. - R-7 — неверное утверждение о `reload_settings_before` убрано из design.md — цена: нет. - R-8 — чередование двух `claimed` при довыдаче оставлено (по спеке) — цена: нет. - R-9 — `reversed_links` не ищется без задачи-источника в зеркале (она в `missing_keys`) — цена: нет. - R-10 — основные спеки обновятся при `openspec archive` — цена: нет. - R-11 — шаг 0 выкатки: проверить `claimed` в живой базе до перезапуска хаба — цена: нет. - Агент: R-51 (версия в тесте через `AGENT_VERSION`), R-52 (`fcntl` в белом списке stdlib) — см. PR агента. - Решения брейнсторма без обсуждения — таблица в design.md (online, предел 3, миграция с копией, дубль темы после `strip`, оценка темпа по ��урналу, поздний отчёт, 409, `reversed_links`, без копии при довыдаче). ## Deferred (в follow-up при закрытии) M-2, M-3, M-4, M-5, M-6, M-7, M-10, M-11 финального ревью (см. таблицу). 🤖 Generated with [Claude Code](https://claude.com/claude-code)
aep added 9 commits 2026-10-13 22:15:04 +03:00
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
aep merged commit fa26faf5b4 into main 2026-10-13 22:16:50 +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/sdlc-hub#10
No description provided.