work_item: ORCH-048
title: staging B6 check reads registry from host worktree, not staging container
stage: analysis
notes: >
  B6 в staging_check.py должен оценивать реестр окружения работающего staging-инстанса.
  Для тестируемости логика вердикта B6 выделяется в чистую функцию (напр.
  _evaluate_b6(known: set[str]) -> tuple[bool, str]); тесты бьют именно её и не
  поднимают живой staging-инстанс/docker. Идентификаторы — те же константы из скрипта:
  SANDBOX_PROJECT_ID=8c5a3025-4f9d-4190-b79f-fa06276bb27e,
  PROD_ET_PROJECT_ID=7a79f0a9-5278-49cd-9007-9a338f238f9c,
  PROD_ORCH_PROJECT_ID=8da6aa25-a60e-44d6-a1e2-d8ae59aa7d6a.

tests:
  - id: TC-01
    type: unit
    description: >
      B6-вердикт PASS при чистом staging-реестре: known={SANDBOX} ->
      passed=True, detail содержит sandbox=YES, prod-ET=NO, prod-ORCH=NO. (AC-1, AC-2)
    module: tests/test_staging_check_b6.py
    expected: PASS

  - id: TC-02
    type: unit
    description: >
      B6-вердикт FAIL при попадании прод-ET в реестр: known={SANDBOX, PROD_ET} ->
      passed=False, detail помечает prod-ET как нарушение. (AC-2)
    module: tests/test_staging_check_b6.py
    expected: PASS

  - id: TC-03
    type: unit
    description: >
      B6-вердикт FAIL при попадании прод-ORCH в реестр: known={SANDBOX, PROD_ORCH} ->
      passed=False, detail помечает prod-ORCH как нарушение. (AC-2)
    module: tests/test_staging_check_b6.py
    expected: PASS

  - id: TC-04
    type: unit
    description: >
      B6-вердикт FAIL при отсутствии sandbox в реестре: known=set() (пусто) ->
      passed=False (sandbox absent), детерминированно, без исключения. (AC-2, TR-4)
    module: tests/test_staging_check_b6.py
    expected: PASS

  - id: TC-05
    type: unit
    description: >
      B6-вердикт FAIL при загрязнении и ET, и ORCH одновременно:
      known={SANDBOX, PROD_ET, PROD_ORCH} -> passed=False. (AC-2)
    module: tests/test_staging_check_b6.py
    expected: PASS

  - id: TC-06
    type: unit
    description: >
      Источник реестра в B6 больше не зависит от host-path хака
      sys.path.insert(0,"/repos/orchestrator"): проверить (статически/через структуру
      кода или мок источника), что построение known не делается локальным импортом
      src.projects из произвольного process-env. (AC-1, TR-6)
    module: tests/test_staging_check_b6.py
    expected: PASS

  - id: TC-07
    type: unit
    description: >
      Деградация источника реестра (HTTP-ошибка / недоступный контейнер / битый ответ)
      -> B6 даёт детерминированный FAIL с понятным detail, а не ложный PASS и не
      необработанное исключение. (TR-4)
    module: tests/test_staging_check_b6.py
    expected: PASS

  - id: TC-08
    type: unit
    description: >
      Регрессия реестра: существующие тесты src/projects.py остаются зелёными,
      подтверждая, что src/projects.py не изменён. (AC-3, AC-4)
    module: tests/test_projects.py
    expected: PASS

  - id: TC-09
    type: integration
    description: >
      Полный прогон pytest без падений после правок:
      `python -m pytest tests/ -q` -> exit 0. (AC-4)
    module: tests/
    expected: PASS

  - id: TC-10
    type: integration
    description: >
      Живой staging-прогон (ручной, вне CI): запустить scripts/staging_check.py
      выбранным архитектором способом против orchestrator-staging (8501) ->
      B6 == PASS (sandbox=YES, prod-ET=NO, prod-ORCH=NO); блоки A/B4/B5/C не сломаны.
      (AC-1, AC-3) Выполняется деплоером на стадии deploy-staging.
    module: scripts/staging_check.py
    expected: PASS
