8.4 KiB
01 — BRD: BUG — deploy-staging петля (откат deploy-staging → development) для self-deploy
Work Item: ORCH-061
Тип: BUG
Приоритет: P0
Репозиторий: orchestrator (self-hosting)
Эпик-контекст: блокер ORCH-54 (автономное внедрение self-hosting)
1. Резюме (Executive summary)
На стадии deploy-staging для self-hosting репозитория orchestrator задача
зацикливается: гейт ребра deploy-staging → deploy даёт FAILED, stage_engine
откатывает задачу deploy-staging → development, developer-агент перезапускается,
проходит конвейер заново, снова упирается в deploy-staging, снова откат — и так
по кругу (с расходом developer-ретраев и кредитов LLM), либо до исчерпания лимита
ретраев и блокировки.
Следствие: прод-деплой self-hosting репо невозможен автономно. Последние
ORCH-задачи (ORCH-58, ORCH-60) доводились до прода вручную (ручной merge PR +
ручной build-once retag + ручной --deploy). Это прямой блокер автономного
внедрения (эпик ORCH-54).
2. Бизнес-контекст и проблема
Оркестратор дорабатывает сам себя (self-hosting). Стадия deploy-staging
(порт 8501) — обязательная страховка перед прод-деплоем орка (ORCH-35, ADR-0003).
На этой стадии deployer гоняет scripts/staging_check.py против живого
staging-стенда и пишет машинный вердикт staging_status: SUCCESS|FAILED в
15-staging-log.md. Гейт check_staging_status читает этот вердикт; FAILED
→ откат на development (ORCH-35, _handle_qg_failure_rollbacks).
Подтверждены две независимые причины зацикливания.
Причина №1 — ложный FAILED check_staging_status (контекст ORCH-58)
staging_check.py в sandbox-прогоне даёт 8/10 PASS, 2 ложных FAIL на e2e-блоке
Block C:
- C9a — ветка не появляется в
orchestrator-sandbox(branch not found); - C9b — analyst-job не появляется в staging-очереди (
/queue → recent).
Сопутствующая пометка suite: «Plane comment check skipped: bot-tokens not added to
SANDBOX project» — bot-аккаунты агентов (ORCH_PLANE_BOT_*) не добавлены членами
SANDBOX-проекта Plane (проект создан после провижининга ботов). Это отсутствие
sandbox-настроек инфраструктуры, а не регресс кода. Тем не менее staging_check.py
возвращает ненулевой exit-code → deployer пишет staging_status: FAILED → гейт
FAILED → откат deploy-staging → development.
Причина №2 — «no changes to commit» на action-стадии (контекст ORCH-60)
Стадии деплоя по своей природе действие, а не правка кода (рестарт/retag), и
закономерно не порождают git-изменений в src//tests/. Сигнал «no changes»
для action-стадии не должен трактоваться как недовыполнение работы; критерий успеха
action-стадии — успешное выполнение действия (exit0 + доказанный health/staging),
а не наличие нового коммита. Сейчас отсутствие изменений на стадии деплоя приводит
к недопродвижению задачи и откату.
Совокупный эффект
Любая из причин по отдельности достаточна, чтобы зациклить self-deploy. Обе проявились на реальных задачах ORCH-58 и ORCH-60, которые пришлось доводить вручную.
3. Цели (Goals)
- G1. ORCH-задача для self-hosting
orchestratorпроходитdeploy-staging → deploy → doneбез ручного вмешательства и без петли. - G2. Ложный (инфраструктурный) FAIL
staging_checkв sandbox не вызывает откатdeploy-staging → development. - G3. Отсутствие git-изменений на стадиях деплоя (
deploy-staging/deploy) не трактуется как недовыполнение и не приводит к откату. - G4. Реальный регресс (настоящий провал staging-проверки или прод-деплоя)
по-прежнему приводит к откату
→ development(страховка не ослабляется).
4. Вне области (Non-goals)
- Полная автоматизация ручного approve прод-деплоя (это ORCH-54).
- Изменение конвейера стадий (
STAGE_TRANSITIONS), реестра гейтов как структуры, контрактовcheck_deploy_status/check_staging_statusfrontmatter-вердиктов. - Изменение поведения для не-self-hosting репозиториев (enduro-trails и пр.): для них staging-гейт и self-deploy остаются no-op / прежними.
- Изменение схемы БД.
5. Заинтересованные стороны
| Роль | Интерес |
|---|---|
| Owner / оператор оркестратора | Автономный self-deploy без ручных шагов и без ночных петель. |
| Другие проекты (enduro-trails) | Их конвейер не должен быть затронут (общий инстанс, общая очередь). |
| Агенты (deployer) | Чёткий, не ложно-срабатывающий контракт стадии деплоя. |
6. Кандидатные направления решения (из бизнес-запроса)
Бизнес-запрос называет два направления (одно или оба); выбор и механизм — за архитектором (ADR), BRD требует лишь достижения G1–G4:
- (а) Сделать sandbox-прогон
staging_checkчестным (например, настроить bot-токены SANDBOX Plane-проекта / починить sandbox e2e), чтобы C9a/C9b проходили честно (10/10) иcheck_staging_statusне падал ложно. - (б) Отвязать продвижение стадий деплоя от git-changes для self-deploy: успех action-стадии = exit0 + health/staging PASS, а не наличие коммита.
7. Бизнес-эффект / риски бездействия
- Эффект: разблокировка автономного внедрения self-hosting (ORCH-54); устранение ручного труда (merge + retag + deploy) и риска ошибки при ручных шагах.
- Риск бездействия: каждая ORCH-задача требует ручного дотягивания до прода; петли жгут кредиты LLM и developer-ретраи, задачи блокируются.
8. Допущения
- Прод-контейнер
orchestrator(8500) обслуживает все проекты из общего инстанса — его нельзя ронять/перезапускать в рамках задачи (см. CLAUDE.md, INFRA.md). - Изменения касаются self-hosting пути (
is_self_hosting_repo/self_deploy_applies); для прочих репо поведение не меняется. - Документация — golden source: затронутые
docs/architecture/README.md,docs/operations/STAGING_CHECK.md,CHANGELOG.mdобновляются в том же PR.