diff --git a/docs/work-items/ORCH-043/12-review.md b/docs/work-items/ORCH-043/12-review.md new file mode 100644 index 0000000..9e26423 --- /dev/null +++ b/docs/work-items/ORCH-043/12-review.md @@ -0,0 +1,59 @@ +--- +type: review +work_item_id: ORCH-043 +verdict: APPROVED +version: 1 +--- + +# Review ORCH-043 — merge-gate + auto-rebase + re-test + +## Summary +Реализован детерминированный (без LLM) merge-gate `check_branch_mergeable` на ребре +`deploy-staging → deploy`: догон ветки до актуального `origin/main` (`rebase` + +`push --force-with-lease` ТОЛЬКО ветки задачи), повторный прогон тестов в worktree +догнанной ветки и файловый merge-lease для сериализации слияний. Интеграция в +`stage_engine` (defer при busy-lock, rollback при конфликте/красном re-test с капом +`MAX_DEVELOPER_RETRIES`), release lease на `deploy→done` / rollback / PR-merged вебхуке. + +Соответствие ТЗ (`02-trz.md`) и AC-1..AC-15 — полное. Реализация соответствует +`ADR-001-merge-gate.md` и глобальному `adr-0006`. Контракт never-raise соблюдён +во всех новых функциях, все git-операции изолированы в worktree (AC-8), `main` +никогда не пушится/форс-пушится (AC-7). Документация обновлена в этом же PR. + +`pytest tests/ -q` — **535 passed** (AC-15). Snapshot-реестр обновлён осознанно +(`_EXPECTED_QGS += check_branch_mergeable`, `_EXPECTED_TRANSITIONS` не тронут — AC-10). +Прод-инфра (`docker-compose*`, `.env`, `.gitea/`, `Dockerfile`) не затронута (AC-14). + +## Findings + +### P0 — Blocker +- (нет) + +### P1 — Must fix +- (нет) + +### P2 — Should fix +- [ ] **Двойное назначение `merge_lock_timeout_s` (300s).** Один и тот же тайм-аут + служит и порогом «лиз протух → реклейм» (crash-backstop), и фактическим окном + удержания лиза от гейта до мержа. Если deploy-деплоер по какой-то причине мержит + PR дольше 300s, ожидающая задача реклеймит лиз как stale и может пойти на слияние + параллельно — узкое окно, теоретически воспроизводящее гонку, которую закрывает + AC-5. На практике deployer мержит в начале запуска, окно мало; тайм-аут + конфигурируем. Рекомендация (не блокер): развести «возраст реклейма краша» и + «ожидаемое время удержания», либо добавить наблюдаемость (лог/алерт при + stale-реклейме непустого холдера). +- [ ] **Двойной `git fetch origin main`** — в `branch_is_behind_main` и затем в + `auto_rebase_onto_main` на пути «ветка отстаёт». Незначительная неэффективность, + не баг; можно переиспользовать результат первого fetch. + +## Документация +Обновлено полностью, документация = golden source соблюдена (AC-13): +- `docs/architecture/README.md` — добавлен раздел «Merge-gate…», ветка откатов, + реестр QG (`check_branch_mergeable`), `STAGE_TRANSITIONS` корректно НЕ изменён. +- `CHANGELOG.md` — подробная запись ORCH-043. +- `.env.example` — все 7 новых `ORCH_MERGE_*` настроек с комментариями. +- ADR per-work-item `docs/work-items/ORCH-043/06-adr/ADR-001-merge-gate.md` (Proposed) + и глобальный `docs/architecture/adr/adr-0006-merge-gate.md` + строка в `adr/README.md`. +- Тесты: `test_merge_gate.py`, `test_qg_merge_gate.py`, `test_merge_gate_race.py`, + `test_stage_engine.py::TestMergeGate`, `test_config.py`, обновлён + `test_qg_registry_snapshot.py`.