reviewer(ET): auto-commit from reviewer run_id=515
This commit is contained in:
89
docs/work-items/ORCH-093/12-review.md
Normal file
89
docs/work-items/ORCH-093/12-review.md
Normal file
@@ -0,0 +1,89 @@
|
||||
---
|
||||
verdict: APPROVED
|
||||
work_item: ORCH-093
|
||||
stage: review
|
||||
author_agent: reviewer
|
||||
status: approved
|
||||
created_at: 2026-06-09
|
||||
model_used: claude-opus-4-8
|
||||
type: review
|
||||
work_item_id: ORCH-093
|
||||
version: 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`. Рекомендую попутно схлопнуть дубль перед мержем.
|
||||
Reference in New Issue
Block a user