--- 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` — присутствует. Документация полная и точная; расхождений с кодом не выявлено.