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= в 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