Files
claude-bot 3ab2690a68
All checks were successful
CI / test (push) Successful in 16s
analyst(ET): auto-commit from analyst run_id=296
2026-06-07 12:10:46 +00:00

12 KiB
Raw Permalink Blame History

02 — ТЗ: устранение петли deploy-staging → development при self-deploy

Work Item: ORCH-061 · Тип: BUG · Приоритет: P0 · Репо: orchestrator

Это ТЗ фиксирует требования и контракты, которые должна удовлетворить реализация. Конкретный архитектурный механизм (направление (а), (б) или оба; где именно разместить логику) выбирает архитектор в ADR (06-adr/). ТЗ намеренно не предписывает дизайн, но задаёт инварианты и границы изменений.


1. Затронутые модули src/ и артефакты

Прямо относящиеся к дефекту (для контекста; точечный набор правок — за архитектором):

Файл Роль в дефекте
scripts/staging_check.py e2e-suite; C9a (branch) / C9b (analyst job) дают ложный FAIL в sandbox; exit-code управляет вердиктом deployer.
src/qg/checks.pycheck_staging_status, _parse_staging_status гейт ребра deploy-staging→deploy; читает staging_status: из 15-staging-log.md.
src/stage_engine.pyadvance_stage, _handle_qg_failure_rollbacks откат deploy-staging→development при FAILED (ветка agent=="deployer" and qg=="check_staging_status").
src/agents/launcher.py_handle_completion/_try_advance_stage пост-ран git-commit; лог «no changes to commit»; обработка deployer-стадий.
src/self_deploy.py Phase A/B/C исполняемого self-deploy (контекст продвижения deploy).
src/config.py место для kill-switch/настроек нового поведения (если потребуется).
.openclaw/agents/deployer.md инструкция deployer о написании вердикта; обновить при смене контракта.
docs/operations/STAGING_CHECK.md, docs/architecture/README.md, CHANGELOG.md golden-source документация (обновить в том же PR).

2. Функциональные требования

FR-1 — Нет петли на корректном self-deploy

Для self-hosting orchestrator, при корректном состоянии (реальный pipeline в порядке, staging-стенд здоров), задача проходит deploy-staging → deploy → done без отката deploy-staging → development и без ручного вмешательства.

FR-2 — Ложный (инфраструктурный) FAIL не вызывает откат

Ложное падение staging_check в sandbox, вызванное исключительно отсутствием sandbox-настроек (например, C9a/C9b при ненастроенных bot-токенах SANDBOX), не приводит к staging_status: FAILED → откату. Должно быть реализовано одним из способов (выбор — ADR):

  • (а) sandbox-инфраструктура приведена в состояние, при котором C9a/C9b проходят честно (10/10); и/или
  • (б) вердикт staging-гейта перестаёт зависеть от заведомо инфраструктурных (не пайплайновых) проверок — например, осознанный allowlist/threshold «известных sandbox-инфра» проверок, отделённый от реальных pipeline-проверок.

Любой механизм по FR-2 обязан сохранить FR-4 (реальный провал ловится).

FR-3 — «no changes» на action-стадии не есть недовыполнение

На стадиях деплоя (deploy-staging, deploy) для self-deploy отсутствие git-изменений (no changes to commit) не трактуется как недовыполнение и не приводит к откату/блокировке. Критерий успеха action-стадии = успешный exit агента/хука + доказанный health/staging-вердикт, а не наличие нового коммита.

FR-4 — Реальный регресс по-прежнему откатывается (страховка цела)

  • Настоящий провал реальных pipeline-проверок staging → staging_status: FAILED → откат deploy-staging → development (как сейчас).
  • Настоящий провал прод-деплоя (deploy_status: FAILED, БАГ-8) → откат deploy → development (как сейчас).
  • Ослабления страховки быть не должно: «зелёный по умолчанию» при недоступности проверок запрещён (fail-closed для реальных проверок сохраняется).

FR-5 — Условность self-hosting сохранена

Изменения активны только для self-hosting пути (is_self_hosting_repo / self_deploy_applies). Для прочих репозиториев поведение check_staging_status (no-op N/A) и стадии деплоя — без изменений.

FR-6 — Управляемость (kill-switch)

Любое новое поведение (толерантность к инфра-FAIL и/или отвязка от git-changes) закрыто отдельным флагом конфигурации (по образцу merge_gate_enabled, image_freshness_enabled, self_deploy_enabled), с безопасным дефолтом и возможностью мгновенно вернуть прежнее поведение без передеплоя кода-логики.

FR-7 — Наблюдаемость

Срабатывание нового поведения (например, «staging_check: проигнорирован инфра-FAIL C9a/C9b» или «action-стадия: no-changes ожидаемо») логируется явной строкой и при необходимости отражается в Plane-комментарии/Telegram, чтобы оператор отличал «реальный зелёный» от «зелёного с допущением».

3. Изменения API

API эндпоинты (/health, /status, /queue, /webhook/*) — без изменений. Допускается расширение снапшота GET /queue диагностическим полем (опционально, по решению архитектора) — без удаления/переименования существующих ключей.

4. Изменения схемы БД

Нет. Схема (events, tasks, agent_runs, jobs) не меняется. Любое restart-safe состояние (если потребуется) — через существующие паттерны (sentinel-файлы / поля jobs.task_content), без миграций.

5. Контракты, которые НЕЛЬЗЯ менять

  • STAGE_TRANSITIONS (порядок и состав стадий) и get_previous_stage.
  • Состав/семантика QG_CHECKS как реестра; frontmatter-контракты staging_status: (15-staging-log.md) и deploy_status: (14-deploy-log.md) — читаются ТОЛЬКО из YAML-frontmatter, значения SUCCESS|FAILED.
  • Откатные контракты БАГ-8 (deploy→development) и ORCH-35 (deploy-staging→development) для реальных провалов.
  • Контракт exit-code хука деплоя (0/1/2) и map_exit_code_to_status.
  • Поведение для не-self-hosting репозиториев.

6. Требования к новым/изменённым QG checks

  • Если выбран механизм толерантности (FR-2 вариант б), он реализуется внутри существующего пути check_staging_status / staging-вердикта (не новая стадия), по образцу условности ORCH-35; контракт «never-raise» сохраняется.
  • Любая новая проверка/под-чек регистрируется в QG_CHECKS и покрывается снапшот-тестом реестра (tests/test_qg_registry_snapshot.py).

7. Требования к staging_check.py (если затрагивается)

  • Если выбран механизм классификации проверок (FR-2 вариант б через suite), e2e-проверки, заведомо зависящие от sandbox-инфраструктуры (C9a/C9b и связанные), должны быть отличимы (по метке/категории) от реальных pipeline-проверок, чтобы вердикт и/или exit-code мог их учитывать осознанно. Прежний дефолтный режим (stub/full-real) и существующие проверки A/B сохраняются.
  • Никакого «всегда 0»: реальный провал реальных проверок обязан давать ненулевой exit-code / FAIL-категорию.

8. Требования к pipeline-артефактам

  • Стадия деплоя по-прежнему производит машинный вердикт-артефакт (15-staging-log.md / 14-deploy-log.md) с корректным frontmatter.
  • Артефакты, обновляемые по pipeline в этом PR: docs/architecture/README.md (раздел про staging-гейт/self-deploy — отметить ORCH-061), docs/operations/STAGING_CHECK.md (поведение C9a/C9b и/или sandbox-настройка), CHANGELOG.md, при изменении контракта — .openclaw/agents/deployer.md.
  • ADR: docs/work-items/ORCH-061/06-adr/ADR-001-*.md (решение по направлению/механизму).

9. Нефункциональные требования

  • Безопасность self-hosting: реализация НЕ перезапускает/не роняет прод 8500 в рамках задачи; сборки/recreate — только staging (8501).
  • Идемпотентность / restart-safe: новое поведение переживает рестарт инстанса.
  • never-raise: дефект-исправляющая логика не должна пробрасывать исключения в advance_stage (по образцу merge-gate / image-freshness).
  • Обратная совместимость: при выключенном флаге (FR-6) — прежнее поведение 1:1.
  • Тестируемость: «чистая» вердикт-логика выделяется так, чтобы покрываться unit-тестами без live staging/docker.

10. Зависимости и связанные задачи

  • ORCH-35 (условный staging-гейт, ADR-0003), ORCH-36 (исполняемый self-deploy, ADR-0007), ORCH-58 (провенанс staging-образа), ORCH-60 (skip escalated/Blocked).
  • Блокирует: ORCH-54 (автономное внедрение).