diff --git a/docs/work-items/ORCH-061/12-review.md b/docs/work-items/ORCH-061/12-review.md new file mode 100644 index 0000000..9c12378 --- /dev/null +++ b/docs/work-items/ORCH-061/12-review.md @@ -0,0 +1,88 @@ +--- +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` — присутствует. + +Документация полная и точная; расхождений с кодом не выявлено.