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

# Review ORCH-048

## Summary

PR чинит ложный FAIL чека **B6** в `scripts/staging_check.py`: реестр проектов теперь
читается из окружения работающего staging-инстанса (вариант «в», выбранный Владельцем и
зафиксированный в ADR-001), host-path хак `sys.path.insert(0, "/repos/orchestrator")` +
`importlib.reload` удалён. Реализация соответствует ТЗ, ADR-001 и всем критериям приёмки.
Документация обновлена синхронно. `pytest tests/ -q` — **470 passed**.

Соответствие осям проверки:

- **ТЗ (02-trz):** TR-1…TR-6 выполнены. TR-1/TR-6 — реестр строится из process-env
  инстанса, host-path хак удалён. TR-2 — инвариант `passed ⟺ SANDBOX ∈ known ∧ PROD_ET ∉
  known ∧ PROD_ORCH ∉ known` в `_evaluate_b6`. TR-3 — формат detail сохранён. TR-4 —
  детерминированный FAIL при недоступности источника (`_run_b6` ловит `Exception`, нет
  ложного PASS, нет необработанного исключения). TR-5 — stdlib. §9 — логика вердикта
  вынесена в чистую `_evaluate_b6` для unit-теста.
- **ADR-001:** реализация дословно следует пунктам 1–5 решения и scope-guards.
  HTTP-эндпоинт не добавлен, прод-`src/main.py` не тронут.
- **AC-1…AC-5:** AC-1 — механика читает реестр инстанса; AC-2 — оба исхода покрыты
  (TC-01 clean→PASS, TC-02/03/05 polluted→FAIL); AC-3 — `git diff` не содержит
  `src/projects.py`/`.env*`, блоки A1–A3/B4/B5/C не тронуты; AC-4 — 470 passed; AC-5 —
  STAGING_CHECK.md, deployer.md, CHANGELOG, ADR-001 обновлены в этом же PR.
- **Качество кода:** чистые функции, докстринги на всех новых функциях, defensive-обработка,
  `sys` остаётся используемым (`sys.exit`), без мёртвых импортов. Тесты содержательные
  (7 TC + happy-path wiring + статическая проверка отсутствия хака).

## Findings

### P0 — Blocker
- нет

### P1 — Must fix
- нет

### P2 — Should fix
- нет

### P3 — Nice-to-have
- [ ] `test_tc06_no_host_path_hack_in_source` и `test_tc06_registry_loader_uses_src_projects`
  носят одинаковый префикс `tc06` — формально это два разных кейса; имена можно было бы
  развести для читаемости отчёта pytest. Косметика, на приёмку не влияет.

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

Полностью обновлена в том же PR (golden source соблюдён):

- `docs/operations/STAGING_CHECK.md` — канонический способ запуска (способ 1 через
  `docker exec`), способ «с хоста» помечен как невалидный/воспроизводящий баг, добавлена
  секция «Механика чека B6».
- `.openclaw/agents/deployer.md` — команда стадии `deploy-staging` переведена на
  `docker exec orchestrator-staging python3 /repos/orchestrator/scripts/staging_check.py …`
  с пояснением, почему host-запуск ломает B6.
- `CHANGELOG.md` — запись в разделе Fixed с полным описанием root cause и решения.
- ADR `docs/work-items/ORCH-048/06-adr/ADR-001-b6-registry-via-in-container-run.md` —
  обоснование варианта (в), отклонённые (а)/(б), scope-guards.

`docs/architecture/README.md` обновлять не требовалось: API, реестр стадий и `QG_CHECKS`
не менялись (изменение касается только достоверности одного чека внутри suite).

**Вердикт: APPROVED** — P0/P1 отсутствуют.
