---
type: review
work_item_id: ORCH-061
verdict: APPROVED
version: 1
---

# Review ORCH-061

## Summary

Исправление петли `deploy-staging → development` при self-hosting self-deploy.
Реализовано Direction (б) из ADR-001: классификация staging-проверок на `REAL`
(fail-closed) и `SANDBOX_INFRA` (узкий allowlist `{C9a, C9b}`, waivable) +
толерантный-но-fail-closed вердикт.

Реализация **полностью соответствует ТЗ (02-trz.md), критериям приёмки
(03-acceptance-criteria.md) и ADR-001**. Все контракты сохранены, документация
обновлена в том же PR, тесты зелёные.

Проверено по осям:

- **Соответствие ТЗ:** FR-1…FR-7 закрыты. Новый leaf-модуль
  `src/staging_verdict.py` (stdlib-only, never-raise), флаг
  `staging_infra_tolerance_enabled` (kill-switch, default True), observability
  через `INFRA-WAIVED:`/`VERDICT:` и `action_stage_no_changes_note`.
- **Соответствие ADR-001:** механизм, allowlist `{C9a, C9b}`, fail-closed для
  REAL, waiver только когда все REAL (вкл. C7/C8) зелёные, `--strict`,
  `_resolve_tolerance` (fail-safe → strict при нечитаемом конфиге) — реализовано
  ровно как в «Решении» ADR. Затронутые файлы совпадают с таблицей ADR.
- **Контракты (AC-8):** `src/qg/checks.py` (`check_staging_status`/
  `_parse_staging_status`), `src/stages.py` (`STAGE_TRANSITIONS`, `QG_CHECKS`)
  — **не изменены** (подтверждено `git diff`). Толерантность живёт в suite ДО
  записи артефакта; новый QG-чек не вводится; реестр-снапшот цел.
- **Схема БД (AC-9):** миграций нет, флаг — только конфиг.
- **never-raise (AC-10):** `compute_staging_verdict`/`classify_check`/
  `_coerce_item`/`action_stage_no_changes_note` ловят всё и деградируют в
  консервативный FAILED/None. Покрыто TC-12.
- **Условность self-hosting / страховка (AC-3/AC-5/AC-6):** rollback на реальном
  FAIL сохранён (`tests/test_stage_engine.py` TestStaging*), поведение не-self
  репо неизменно.
- **Тесты (AC-14):** `pytest tests/ -q` → **670 passed**. ORCH-061 покрытие:
  TC-04 (infra waived → SUCCESS), TC-05 (REAL fail → FAILED), TC-09 (strict),
  TC-12 (garbage never-raise), TC-06/TC-07 (action-stage no-changes note),
  non-self репо.
- **Безопасность self-hosting (AC-12):** код задачи не трогает прод 8500;
  сборки/recreate — вне пути этой логики.

Примечание по диффу: при просмотре `git diff main...HEAD` появлялись файлы
ORCH-060 (reconciler, plane_sync, config reconcile-флаги). Это артефакт
**устаревшего локального ref `main`** — `origin/main` уже содержит ORCH-060
(merge `d4c6cc0`, PR #60). Истинный `git diff origin/main...HEAD` — чистый
ORCH-061. Бандлинга чужого work-item нет.

## Findings

### P0 — Blocker
- нет

### P1 — Must fix
- нет

### P2 — Should fix
- [ ] **Стрэй-файлы агентного скрэтча закоммичены в репо:** `.task.md`,
  `.task-arch.md`, `.task-dev.md` (хэндофф-файлы стадий analysis/architecture/
  development) попали в коммит и не покрыты `.gitignore`. Это засоряет репо и
  будет повторяться каждый прогон. Рекомендация: удалить из индекса и добавить
  `.task*.md` в `.gitignore`. Не функциональный дефект — на корректность
  ORCH-061 не влияет.

## Документация

Обновлена в том же PR (golden source, AC-13) — соответствует требованию CLAUDE.md:

- `docs/architecture/README.md` — раздел staging-гейта помечен ORCH-061 +
  статус в футере.
- `docs/architecture/adr/adr-0009-staging-infra-tolerance.md` — сквозной ADR
  заведён; `adr/README.md` обновлён.
- `docs/operations/STAGING_CHECK.md` — поведение C9a/C9b, флаг, INFRA-WAIVED,
  `--strict`.
- `.openclaw/agents/deployer.md` — уточнён контракт exit0/INFRA-WAIVED (контракт
  `staging_status: SUCCESS|FAILED` неизменён).
- `.env.example` — `ORCH_STAGING_INFRA_TOLERANCE_ENABLED` (канон, секреты не
  коммитятся).
- `CHANGELOG.md` — запись ORCH-061.
- ADR per-work-item `docs/work-items/ORCH-061/06-adr/ADR-001-*.md` — присутствует.

Документация полная и точная; расхождений с кодом не выявлено.
