6.4 KiB
verdict, work_item, stage, author_agent, status, created_at, model_used, type, work_item_id, version
| verdict | work_item | stage | author_agent | status | created_at | model_used | type | work_item_id | version |
|---|---|---|---|---|---|---|---|---|---|
| APPROVED | ORCH-093 | review | reviewer | approved | 2026-06-09 | claude-opus-4-8 | review | ORCH-093 | 1 |
Review ORCH-093
Summary
Две точечные доработки детерминированного merge-актора (src/merge_gate.py), чинящие инцидент
ORCH-063 (ложный HOLD на транзиентном HTTP 405 от Gitea + мусорный пустой PR на уже влитой
ветке): (1) retry-loop вокруг мутирующего POST …/merge с классификатором транзиент/терминал;
(2) гард already-in-main в ensure_open_pr + врезка в _handle_merge_verify.
Реализация полностью соответствует ТЗ (FR-1…FR-5), критериям приёмки (AC-1…AC-7) и ADR-001
(D1…D5). Контракты сохранены: never-raise, INV-4 (мерж только через Gitea PR-merge API, никогда
push/force-push в main), STAGE_TRANSITIONS/QG_CHECKS/схема БД — байт-в-байт не тронуты
(проверено git diff: затронуты только src/merge_gate.py, src/config.py и точечно
src/stage_engine.py). Защита ORCH-071/073/081 («deploy succeeded but not merged») сохранена 1:1:
терминал/исчерпание ретраев → (False, …) → прежний HOLD+alert.
Тесты содержательные и зелёные: tests/test_merge_gate.py (TC-01…TC-12), tests/test_config.py
(TC-13), tests/test_merge_verify.py (TC-14…TC-16), обновлён tests/test_orch082_ensure_pr.py.
Локальный прогон затронутых сьютов — 72 passed. Каждый AC покрыт буквально (405×2→200=3 POST;
5xx→200; network→200; реальный конфликт/403 терминал без ретрая; ambiguous-409+mergeable=True ретрай;
исчерпание; kill-switch one-shot; already-in-main без POST; fail-OPEN на git-ошибке гарда;
never-raise).
Трассировка (TRACEABILITY.md): правки в блоках с маркерами ORCH-071/073/082 сверены с их
инвариантами — SHA-in-main остаётся единственным авторитетным доказательством мержа (ADR-0014),
idempotency-guard pr_already_merged, фильтр base==main для code-PR, never-raise — сохранены.
В append-only MAIN_REGRESSION_MARKERS корректно добавлена строка
("ORCH-093", "_classify_merge_response", "src/merge_gate.py") — без слома существующих маркеров.
Документация обновлена (CHANGELOG, .env.example, CLAUDE.md, локальный ADR-001 + сквозной
adr-0027, docs/architecture/README.md). Один P2 по гигиене документации (дубль секции в README) —
не блокирует приёмку.
Findings
P0 — Blocker
- Нет.
P1 — Must fix
- Нет.
P2 — Should fix
- Дубль секции ORCH-093 в
docs/architecture/README.md. Один и тот же заголовок#### Ретрай транзиентных merge-ошибок Gitea + гард already-in-main (ORCH-093 — фикс ложного HOLD на 405/5xx)встречается дважды — строки 480–516 и 518–550 — с почти идентичным, перекрывающимся содержимым и совпадающим markdown-anchor'ом. Подтвержденоgit diff(наorigin/main— 0 вхождений, на ветке — 2), т.е. обе секции добавлены этим PR (вероятно случайная вставка/дубль блока при правке golden-source). README — обзорная витрина архитектуры; дублирующий блок с коллизией заголовков следует схлопнуть в одну секцию (оставить вариант 480–516 или 518–550, не оба). Правило:CLAUDE.md§2 «документация = golden source», стандарт обзорных доков (ORCH-079).
P3 — Nice to have
tests/test_merge_gate.py::_PostSeqобращается кself._items_lastдо его первой инициализации, если конструктору передать пустой список (атрибут ставится только после первогоpop). Сейчас не срабатывает (все вызовы передают непустую последовательность), но защититься дефолтомself._items_last = Noneв__init__дешевле, чем потенциальныйAttributeErrorпри будущем редактировании теста.
Документация
Проверка обязательна (изменён src/). Статус — обновлена (golden source синхронизирован с кодом):
| Артефакт | Статус |
|---|---|
CHANGELOG.md |
✅ запись ORCH-093 ([Unreleased]) с детализацией retry/guard/конфиг/тесты |
.env.example |
✅ дескрипторы ORCH_MERGE_RETRY_* (4 поля) + пояснительный блок |
CLAUDE.md |
✅ абзац ORCH-093 в секции «Очередь задач» |
docs/architecture/README.md |
⚠️ обновлена, но секция продублирована (P2 — схлопнуть) |
docs/work-items/ORCH-093/06-adr/ADR-001-…md |
✅ локальный ADR (proposed) |
docs/architecture/adr/adr-0027-…md |
✅ сквозной ADR (amends 0013/0014/0016) |
API / STAGE_TRANSITIONS / QG / схема БД не менялись → доп. обновлений не требуется. Пункт
README.md «Известные ограничения» данным PR не закрывается (ORCH-079 не применим).
Вывод: P0/P1 нет; единственный P2 — косметический дубль секции README (не блокирует). Verdict —
APPROVED. Рекомендую попутно схлопнуть дубль перед мержем.