Files
orchestrator/docs/work-items/ORCH-093/12-review.md

6.4 KiB
Raw Permalink Blame History

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) встречается дважды — строки 480516 и 518550с почти идентичным, перекрывающимся содержимым и совпадающим markdown-anchor'ом. Подтверждено git diff (на origin/main — 0 вхождений, на ветке — 2), т.е. обе секции добавлены этим PR (вероятно случайная вставка/дубль блока при правке golden-source). README — обзорная витрина архитектуры; дублирующий блок с коллизией заголовков следует схлопнуть в одну секцию (оставить вариант 480516 или 518550, не оба). Правило: 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. Рекомендую попутно схлопнуть дубль перед мержем.