Andrey Epifancev 30d904e1a8 docs(openspec): архив bridge-hygiene (#13)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 13:22:53 +04:00

92 lines
10 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; пакеты A (`bridge-reliability`, #9) и B (проверки на живой Jira) закрыты. Осталось
три follow-up issue в каждом репозитории (hub#4, #8, #12; agent#4, #8, #12). Пакет D (разбор хвоста hub#4/agent#4,
14.10.2026) разделил их на «в C», «отклонить», «на потом». Этот change — пакет C: мелкие исправления, приведение спек
к коду и гигиена, одним change на оба репозитория. Новых возможностей нет.
Что чинится по существу:
- **M-7 (hub#4)** — каталог данных хаба `0755`, база `0644`, а в базе токены: читаемы любым локальным пользователем.
- **M-3 (hub#4, PR #2)** — `rename_note` при переносе `new:N` → ключ удаляет заметку, уже стоящую под настоящим ключом.
- **T2.3 (agent#4)** — `prune` перезаписывает журнал без блокировки: запись `finished`, добавленная работающим агентом,
теряется (потерянный отчёт).
- **M-4 (hub#12)** — поздний `done` с ключом по `ensure_issue`, ставшей `failed` по пределу выдач, отбрасывается: заметка
`new:N` не переезжает; у `refresh`, ставшего `failed` по пределу, `sync_run.finished_at` пуст.
- **M-5 (hub#12)** — повторное выполнение `refresh` после довыдачи удваивает счётчики `sync_run`.
- **M-12 (hub#4)** — полный прогон, вернувший 0 задач, помечает всё зеркало соседями.
- **T5.6 (hub#4)** — отменённый пакет с частью выполненных команд показывается «завершён».
- **M-3, M-4 (hub#8)** — реле: `HTTPException` от своего HTTP не превращается в 502; `work/` чистится при каждой
повторной подготовке, а не только при старте.
- **M-2 (hub#12)** — параллельные `connect` к базе старой версии делают по копии на соединение.
- **M-3 (hub#12)** — нестроковый `summary` в `ensure_issue` даёт 500 вместо 422.
- **M-2 (agent#8)** — ответ папки с неверными типами `status`/`body` роняет агента.
- **M-6 (agent#12)** — время последней записи журнала в будущем отключает паузу темпа.
- **M-7 (agent#12)** — после перезапуска в `claim` уходит время записи журнала как «последний вызов Jira».
- **T3.9 (agent#4)** — Jira хранит текст, правленный в UI, с `\r\n`; агент сравнивает с `\n` из команды и делает лишний
`PUT` описания/комментария (проверено на живой Jira 13.10.2026: 71 из 180 задач).
Решения владельца 14.10.2026 (разбор D и brainstorming):
- состав пакета C — по таблице разбора D (комментарии hub#4 #3323, agent#4 #3326), плюс M-12 и подсказка про `labels`;
- T-n без сохранившегося текста ревью — отклонены пачкой;
- живая проверка потери отчёта, довыдачи и force-cancel — отдельно, не в этом change;
- M-4 (hub#12): поздний отчёт по `failed` по пределу выдач — как по отменённой (ключ в результат, заметка переезжает,
статус остаётся `failed`); `refresh`, ставший `failed` по пределу, получает `sync_run.finished_at`;
- M-7 (agent#12): в `claim` уходит только время настоящего вызова Jira; оценка из журнала — только для паузы;
- CRLF: агент сравнивает описание и тело комментария после замены `\r\n` на `\n`, отправляет как есть; хаб не меняется.
## What Changes
- **jira-hub**:
- права `0700` на каталог данных и `backups/` (при создании и при старте);
- `rename_note` сливает заметки: поле под настоящим ключом сохраняется, если у временной заметки оно пустое;
- статус пакета `cancelled`, если пакет отменён и все его команды в терминальных статусах;
- `report_result` обрезает `error` до 1500 символов;
- поздний отчёт `done` с ключом по `ensure_issue` в `failed` без результата — как по `cancelled`; при переводе `refresh`
в `failed` по пределу выдач — `sync_run.finished_at`;
- довыдача `refresh` обнуляет `issues_count`/`links_count` его `sync_run`;
- полный прогон с `issues_count = 0` не помечает задачи соседями;
- `commands.validate`: строковые параметры проверяются на тип (422);
- миграция: копия перед миграцией и сама миграция — под одной блокировкой записи, копия одна;
- реле: `http.client.HTTPException` → 502; `work/` чистится только при старте реле; строка лога при повторной
подготовке не говорит «перезапуск»;
- ответ `POST /batches/{id}/cancel` и MCP `batch_cancel` сообщают о команде пакета, уже взятой агентом;
- MCP `batch_create`: в описании инструмента — передавать базовые метки (`labels`) в `ensure_issue`;
- тесты: `serve --host <IP>` для реле, переименование `test_fresh_definer_still_blocks_queue`, сквозной тест
«база v1 → миграция → довыдача 1 → 2»;
- `.wt/` в `.gitignore`; `ARCHITECTURE.md` — реле и `relay_dir`.
- **jira-agent** (версия 4):
- сравнение описания и тела комментария без различия `\r\n`/`\n`;
- время журнала в будущем — принимается за «сейчас» (полная пауза);
- в `claim` — только время настоящего вызова Jira в этом процессе;
- ответ папки с неверными типами `status`/`body` — `ConnectionError` (как нечитаемый JSON);
- `prune` берёт блокировку журнала и отказывает при работающем агенте; README;
- лог «хаб: хаб не ответил…» без повтора слова.
- Спеки: `hub-api`, `data-model`, `commands`, `agent`, `mcp`, `migration` — MODIFIED. Кроме исправлений, спеки
приводятся к коду (разбор D): нет настройки `sprint_names`; коды ответов 413/500/502 и 501 на прочие методы;
`page`/`last_page` информационные; `GET /issues` — поля зеркала; автообновление — от последнего `sync_run`;
MCP `refresh` — id пакета; `new:<строка>` — только для `new_tasks.csv`. Раздел `## Purpose` всех шести спек
заполняется (сейчас — заглушка `TBD`, из-за неё падает `openspec validate --specs --strict`).
## Non-goals
- Живые проверки потери отчёта, довыдачи, force-cancel и `ensure_link` (agent#12 O-1) — отдельно, на тестовой задаче.
- «На потом» из разбора D: ResourceWarning в тестах хаба (M-9/O-4), пробелы тестов (M-10 хаба), точность фейков агента
(M-10 агента).
- Отклонённые в разборе D пункты (M-4, M-8/T6.12, T5.4, T5.11, T6.5, T6.6, T9.1, T1.1, M-6, M-11 хаба; FM-1…FM-3, O-2,
T1.9, N-3, T2.7, T3.2, T3.3, T4.7, T4.11, T5.2, T7.6, «Task 2 minor» агента; T-n без текста).
- Автодобавление базовых меток хабом или агентом (T3.7): только подсказка в описании инструмента.
- MCP-инструмент отмены отдельной команды: `batch_cancel` лишь подсказывает про `force`.
- Подъём `min_agent_version` до 4.
## Impact
- `jira-hub`: `paths.py`, `db.py` (миграция под блокировкой, права), `mirror.py` (`rename_note`), `queue.py` (`_status_of`,
`report_result`, `_redeliver`, `claim`, `cancel_batch`), `commands.py` (`validate`), `relay.py`, `api.py` (ответ отмены
пакета), `mcp_server.py` (`batch_cancel`, `batch_create`), тесты, `.gitignore`, `ARCHITECTURE.md`.
- `jira-agent`: `src/agent.py` (`do_ensure_fields`, `do_ensure_comment`, `restore_pace`, `JiraClient.last_call_iso`,
`FolderTransport`, `cmd prune`, лог), `README.md`, тесты, `.gitignore`; версия 4.
- Контракт хаб ↔ агент: тела запросов не меняются; ответ отмены пакета получает поле `still_claimed`.
- Выкатка: хаб — `git pull` + перезапуск launchd (схема не меняется), проверить права каталога; агент v4 — через
общую папку, как v3.
- Issues: aep/jira-hub#13, aep/jira-agent#15; закрывают hub#8, hub#12, agent#8, agent#12, а hub#4/agent#4 — кроме «на потом».