---
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`.
