--- type: review work_item_id: ORCH-022 verdict: APPROVED version: 1 --- # Review ORCH-022 ## Summary Security-гейт (secret-scanning `gitleaks` + dependency audit `pip-audit`) реализован как детерминированный под-гейт ребра `deploy-staging → deploy`, исполняемый ПЕРВЫМ среди edge-под-гейтов — в точности по ADR-001 (Вариант M) и эталонному паттерну соседей (merge-gate ORCH-043 / image-freshness ORCH-058): leaf-модуль `src/security_gate.py` (never-raise) + тонкая обёртка `check_security_gate` в `QG_CHECKS` (lazy-import, нет цикла) + врезка `_handle_security_gate` ПЕРВОЙ в блоке `current_stage == "deploy-staging"`. `STAGE_TRANSITIONS` и схема БД не тронуты. Все 772 теста зелёные (25 из них — security-специфичные: `test_security_gate.py`, `test_qg_security.py`, `test_stage_engine_security_gate.py`). Документация обновлена полностью и в этом же PR. ### Соответствие ТЗ (02-trz) - FR-1 secret-scan offline `origin/main..HEAD`, любой секрет вне аллоулиста → FAIL ✓ - FR-2 dep-audit по severity (`HIGH` дефолт), MEDIUM/LOW/UNKNOWN → warning ✓ - FR-3 машинный вердикт ТОЛЬКО из frontmatter `17-security-report.md`, negative-токен авторитетен, write→read-back (единый источник истины) ✓ - FR-4 FAIL → откат на `development` + developer-retry (cap 3) + `task_desc` с дословными находками (ORCH-046) ✓ - FR-5 условность `security_gate_enabled` / `security_gate_repos` (пусто → self-hosting) ✓ - FR-6 never-raise + таймаут `security_scan_timeout_s` ✓ - FR-7 наблюдаемость (Telegram при degraded/FAIL, лог при PASS) ✓ - §6 без миграций БД, §7 инварианты соблюдены (STAGE_TRANSITIONS/QG_CHECKS консистентны, gate не деплоит/не рестартит прод) ✓ ### Соответствие ADR (06-adr/ADR-001 + global adr-0012) Р-1 (размещение ПЕРВЫМ, до merge-gate, до захвата merge-lease → lease не освобождается), Р-2 (gitleaks pinned Go-бинарь в Dockerfile, pip-audit в requirements), Р-3 (fail-open degrade + флаг `security_dep_audit_fail_closed`), Р-4 (пороги, UNKNOWN→warning), Р-5 (артефакт + read-back), Р-6 (откат/cap/эскалация), Р-7 (lazy-import, double-guard never-raise), Р-8 (self-hosting safety) — все реализованы как описано. ### Критерии приёмки (03) AC-1..AC-21 покрыты тестами TC-01..TC-21 (incl. rollback TC-16, verbatim task_desc TC-17, cap+blocked TC-18, PASS-advance TC-19, no-deploy-on-FAIL TC-21). AC-20 (документация) — подтверждён ниже. ## Findings ### P0 — Blocker - нет ### P1 — Must fix - нет ### P2 — Should fix - нет ### P3 — Nice-to-have - Глобальный `docs/architecture/adr/adr-0012-security-gate.md` помечен `Статус: proposed`, тогда как per-WI `06-adr/ADR-001` — `Accepted`. Косметическая рассинхронизация статуса, на функциональность/гейты не влияет. ## Документация Обновлена в том же PR (AC-20, CLAUDE.md §6 соблюдён): - `CLAUDE.md` — раздел «Артефакты задачи» (добавлен `17-security-report.md`) + строка о машинных вердиктах (`security_status:`). - `docs/architecture/README.md` — реестр `QG_CHECKS` (`check_security_gate (ORCH-022)`), новый раздел «Security-гейт …», статусная сноска внизу. - `docs/architecture/adr/adr-0012-security-gate.md` — новый global ADR (+ per-WI ADR-001). - `CHANGELOG.md` — подробная запись в `[Unreleased] / Added`. - `.env.example` — все шесть `ORCH_SECURITY_*` с комментариями. - `Dockerfile` (pinned gitleaks), `requirements.txt` (pip-audit), `.gitleaks.toml` (корень, правила + аллоулист) — инфраструктура версионирована. Статус: документация = golden source — синхронна с кодом. Замечаний нет.