Files
orchestrator/docs/work-items/ORCH-059/02-trz.md

104 lines
8.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 02 — ТЗ: выделенный статус «Confirm Deploy» как триггер прод-деплоя
Work Item: **ORCH-059** · Repo: `orchestrator` · Stage: analysis
> ТЗ описывает **что** должно измениться и **поведенческий контракт**. Конкретный
> дизайн (сигнатуры, способ проброса признака «confirm-deploy» из webhook в
> `stage_engine`, sentinel-обработка) — за архитектором (ADR per-work-item).
> Точки касания ниже заданы бизнес-запросом Owner и текущей реализацией ORCH-036.
## 1. Задействованные модули `src/`
| Модуль | Роль в задаче |
|--------|---------------|
| `src/plane_sync.py` | Резолвер состояний Plane. Добавить логический ключ `confirm_deploy` ↔ имя статуса «Confirm Deploy»; обеспечить безопасный доступ при отсутствии статуса (fallback/неполный конфиг). |
| `src/webhooks/plane.py` | `handle_issue_updated` — маршрутизация нового статуса; `handle_verdict` — отделить «подтверждение деплоя» от обычного approve; снять триггер Фазы B со статуса `Approved` на `deploy`. |
| `src/stage_engine.py` | Блок Фазы B (`current_stage == "deploy" and finished_agent is None`) должен срабатывать ТОЛЬКО по сигналу confirm-deploy, не по обычному Approved. Обновить CTA-текст Фазы A (`_handle_self_deploy_phase_a`). |
| `src/config.py` | (опционально, на усмотрение архитектора) флаг/имя статуса, если потребуется конфигурируемость. По умолчанию — не требуется. |
## 2. Поведенческий контракт (требования)
### TRZ-1. Регистрация статуса «Confirm Deploy»
Резолвер состояний (`get_project_states`) обязан возвращать UUID статуса
«Confirm Deploy» под логическим ключом `confirm_deploy` для проекта ORCH.
Маппинг имени `"Confirm Deploy" → "confirm_deploy"` добавляется в
`_PLANE_NAME_TO_KEY`. Для проектов/сред, где статус отсутствует (enduro,
fallback `_DEFAULT_STATES`, недоступный API), ключ может отсутствовать —
обращение к нему должно быть **fail-closed**: «нет статуса → ветка confirm-deploy
не активируется», без `KeyError`/исключения.
### TRZ-2. Триггер прод-деплоя по «Confirm Deploy»
Когда задача находится на стадии `deploy` и issue переводится в статус
`Confirm Deploy`, система обязана инициировать **Фазу B** прод-деплоя
(эквивалент текущего `_handle_self_deploy_phase_b`: idempotency-guard `initiated`,
`self_deploy.initiate_deploy`, постановка `deploy-finalizer`, комментарии/Telegram).
Поведение, идемпотентность и Фаза C — **без изменений** относительно ORCH-036;
меняется только **что именно является триггером**.
### TRZ-3. `Approved` больше не запускает прод-деплой
Перевод задачи стадии `deploy` в статус `Approved` **не должен** инициировать
Фазу B. Он не должен также вызывать ложный откат (БАГ-8) или ложный advance
по `check_deploy_status` (вердикта ещё нет). Допустимое поведение — **no-op с
логированием** (issue остаётся на `deploy`/approval-pending). Конкретный способ
(игнор на уровне webhook-роутинга или на уровне `stage_engine`) — за архитектором.
### TRZ-4. Сохранность гейта `Approved` на остальных стадиях
Статус `Approved` обязан продолжать работать как человеческий гейт:
- `analysis``architecture` (`check_analysis_approved`, approved-via-status);
- любой иной человеческий approve-advance, существующий сегодня.
Регрессия `handle_verdict(approved=True)` для НЕ-`deploy` стадий недопустима.
### TRZ-5. CTA Фазы A
Текст запроса approve в `_handle_self_deploy_phase_a` (Plane-комментарий + Telegram)
обязан инструктировать оператора переводить задачу в статус **`Confirm Deploy`**
(а не `Approved`) для запуска прод-деплоя.
### TRZ-6. Условность (как ORCH-35/36)
Ветка confirm-deploy реальна только для self-hosting
(`self_deploy.self_deploy_applies(repo)``orchestrator`). Для прочих репо —
прежнее поведение (синхронный деплой агентом), статус `Confirm Deploy` не
требуется и не влияет.
## 3. Изменения API
Изменений HTTP-эндпоинтов **нет**. Канал — существующий `POST /webhook/plane`
(событие `work_item.updated`). Внешнее изменение: в проекте ORCH появляется
дополнительный статус доски «Confirm Deploy» (Plane-конфигурация, не код-API).
## 4. Изменения схемы БД
**Нет.** `STAGE_TRANSITIONS`, реестр `QG_CHECKS`, таблицы `tasks`/`jobs`/
`agent_runs`/`events` — без изменений. Статусы — на стороне Plane; restart-safe
состояние деплоя — существующие sentinel-файлы ORCH-036 (без миграций).
## 5. Требования к новым QG checks
**Нет.** Новый Quality Gate не вводится. `check_deploy_status` /
`_parse_deploy_status` и контракт exit-кодов хука (0/1/2) — без изменений.
## 6. Конфигурация среды (предусловие эксплуатации)
- В проекте ORCH в Plane создаётся статус доски **«Confirm Deploy»** (точное имя,
чувствительно к регистру — должно совпасть с ключом `_PLANE_NAME_TO_KEY`).
- Размещение статуса на доске — рядом со стадией deploy/approval-pending
(рекомендация эксплуатации, не код).
- Кэш состояний (`get_project_states` / `reload_project_states`): после создания
статуса может потребоваться сброс кэша или рестарт по штатной стадии deploy.
## 7. Артефакты, создаваемые/обновляемые по pipeline
- `docs/work-items/ORCH-059/06-adr/ADR-001-confirm-deploy-status.md` — решение
(как отличается триггер; где разрезается перегрузка `Approved`; fail-closed
при отсутствии статуса) — **ведёт архитектор**.
- `CLAUDE.md` — упоминание выделенного статуса approve прод-деплоя (раздел
self-hosting / артефакты).
- `docs/architecture/README.md` — секция ORCH-036: уточнить, что Фаза B
триггерится статусом `Confirm Deploy`, а не `Approved`.
- `CHANGELOG.md` — запись ORCH-059.
- `12-review.md`, `13-test-report.md`, `14-deploy-log.md`, `15-staging-log.md`
штатно по стадиям конвейера.
## 8. Совместимость и инварианты
- Не меняются: `STAGE_TRANSITIONS`, `QG_CHECKS`, `check_deploy_status`,
БАГ-8 (FAILED → откат на development), merge-gate, exit-коды хука, Фазы A/C,
схема БД, post-deploy (ORCH-021).
- Self-hosting safety: правка НЕ требует внепланового рестарта прод-контейнера;
выкат — через штатный deploy-staging (8501) → deploy.
- Never-crash: отсутствие статуса `Confirm Deploy` в резолвере не приводит к
исключению в webhook-пути.