work_item: ORCH-058
description: >
  Провенанс staging-образа перед BUILD-ONCE retag в прод. Тесты покрывают инвариант
  INV-FRESH: соответствие промоутируемого образа провалидированному коммиту, fail-fast
  и fail-closed при рассинхроне, условность self-hosting, never-raise, неизменность
  контрактов. Часть кейсов помечена strategy-зависимыми (A=пересборка, B=fail-fast по
  провенансу) — финальный набор подтверждает архитектор в ADR; пишутся тесты для
  выбранной стратегии.
tests:
  - id: TC-01
    type: unit
    description: >
      Pure provenance-verdict: SHA образа == ожидаемый SHA -> свежий (PASS).
      Совпадающие revision дают вердикт "соответствует".
    module: tests/test_image_freshness.py
    expected: PASS

  - id: TC-02
    type: unit
    description: >
      Pure provenance-verdict: SHA образа != ожидаемый SHA -> НЕ свежий ->
      вердикт несоответствия (вход для fail-fast).
    module: tests/test_image_freshness.py
    expected: PASS

  - id: TC-03
    type: unit
    description: >
      Fail-closed: пустой/отсутствующий лейбл образа ИЛИ пустой ожидаемый SHA ->
      трактуется как несоответствие (никогда не "свежий по умолчанию").
    module: tests/test_image_freshness.py
    expected: PASS

  - id: TC-04
    type: unit
    description: >
      never-raise: provenance-helper при docker/ssh/inspect ошибке или отсутствующем
      worktree возвращает безопасный вердикт (несоответствие), не пробрасывает исключение.
    module: tests/test_image_freshness.py
    expected: PASS

  - id: TC-05
    type: unit
    description: >
      Условность: для не-self репозитория проверка свежести = no-op (True/"N/A");
      для orchestrator (или репо из image_freshness_repos) — реальна.
    module: tests/test_image_freshness.py
    expected: PASS

  - id: TC-06
    type: unit
    description: >
      [Стратегия B] build_deploy_command пробрасывает EXPECTED_REVISION=<sha>
      в remote-команду хука рядом с SOURCE_IMAGE; формат env корректен (shlex-quote).
    module: tests/test_deploy_build_once.py
    expected: PASS

  - id: TC-07
    type: unit
    description: >
      [Стратегия B] Хук содержит ветку fail-fast: при заданном EXPECTED_REVISION и
      несовпадении revision лейбла SOURCE_IMAGE -> exit 1 ПЕРЕД docker tag; при пустом
      EXPECTED_REVISION -> обратносовместимое поведение (без проверки). Статическая
      проверка текста scripts/orchestrator-deploy-hook.sh (паттерн test_deploy_build_once).
    module: tests/test_deploy_hook_provenance.py
    expected: PASS

  - id: TC-08
    type: unit
    description: >
      [Стратегия B] Dockerfile объявляет ARG GIT_SHA и LABEL
      org.opencontainers.image.revision=$GIT_SHA (статическая проверка текста Dockerfile).
    module: tests/test_deploy_hook_provenance.py
    expected: PASS

  - id: TC-09
    type: unit
    description: >
      Маппинг контракта: exit 1 хука (fail-fast по провенансу) ->
      map_exit_code_to_status == "FAILED" (контракт ORCH-36 не изменён).
    module: tests/test_deploy_hook_mapping.py
    expected: PASS

  - id: TC-10
    type: integration
    description: >
      Stale-образ -> fail-fast end-to-end: на ребре deploy-staging->deploy при
      несоответствии образа Phase B/хук дают FAILED -> advance_stage откатывает на
      development (БАГ-8), прод не "зелёный". Прод-рестарт замокан.
    module: tests/test_stage_engine.py
    expected: PASS

  - id: TC-11
    type: integration
    description: >
      Свежий образ -> happy path: соответствие revision -> деплой доходит до SUCCESS и
      deploy->done; механизм свежести не блокирует валидный деплой (anti-deadlock, AC-6).
      Host-процесс/хук замокан.
    module: tests/test_stage_engine.py
    expected: PASS

  - id: TC-12
    type: unit
    description: >
      [Если выбран gate-side] check_staging_image_fresh зарегистрирован в QG_CHECKS;
      snapshot-тест реестра обновлён и зелёный.
    module: tests/test_qg_registry_snapshot.py
    expected: PASS

  - id: TC-13
    type: unit
    description: >
      Конфигурация: новые настройки (image_freshness_enabled / image_freshness_repos)
      читаются с префиксом ORCH_ и имеют дефолты; kill-switch off -> прежнее поведение.
    module: tests/test_config.py
    expected: PASS

  - id: TC-14
    type: unit
    description: >
      Регрессия контрактов: STAGE_TRANSITIONS (набор стадий) и exit-code-контракт хука
      (0/1/2) не изменены существующими правками.
    module: tests/test_stages.py
    expected: PASS
