# 01 — BRD: Approve прод-деплоя через выделенный статус «Confirm Deploy»

Work Item: **ORCH-059**
Repo: `orchestrator`
Stage: analysis
Тип: enhancement / risk-reduction (self-hosting)

## 1. Контекст и проблема

В ORCH-036 («исполняемый самодеплой стадии `deploy`») прод-деплой self-hosting
инстанса (контейнер `orchestrator`, порт 8500) запускается **Фазой B**: человек
переводит issue в Plane-статус **`Approved`**, webhook
`work_item.updated` → `handle_issue_updated` → `handle_verdict(approved=True)`
→ `_try_advance_stage` → `advance_stage(finished_agent=None)`, и в
`stage_engine.advance_stage` срабатывает блок
`current_stage == "deploy" and finished_agent is None` →
`_handle_self_deploy_phase_b` → detached host-деплой прода.

**Перегрузка статуса.** Тот же самый Plane-статус `Approved` (UUID
`a519a341-…`) используется как **человеческий гейт одобрения BRD** на ранней
стадии `analysis` (`check_analysis_approved`: analysis → architecture) и в общем
verdict-роутинге `handle_verdict`. Один и тот же визуальный «Approved» на доске
означает две принципиально разные вещи:

- на `analysis` — «BRD/ТЗ/AC приняты, продолжай конвейер» (дёшево, обратимо);
- на `deploy` — «**ВЫКАТИ В ПРОД** инструмент, который прямо сейчас обслуживает
  все проекты из одного инстанса с общей БД» (дорого, групповой риск, см.
  раздел Self-hosting в `CLAUDE.md`).

### Последствия (Pain)
- **Двусмысленность семантики.** Один статус — два смысла; оператор не видит из
  названия, что клик на `deploy` запускает реальный прод-рестарт.
- **Риск случайного клика.** Привычный жест «Approved» (которым оператор
  штатно одобряет BRD десятки раз) на стадии `deploy` молча триггерит
  прод-деплой. Цена ошибки — незапланированный рестарт прод-инстанса,
  встающий конвейер всех проектов.
- **Несоответствие ожиданиям ORCH-036.** В scope ORCH-36 заявлялась Telegram
  inline-кнопка подтверждения; в коде её **нет** — developer реализовал approve
  исключительно через Plane-статус. Отдельного «осознанного» жеста подтверждения
  деплоя в системе сейчас не существует.

## 2. Решение Owner

Ввести **отдельный Plane-статус `Confirm Deploy`** в проекте ORCH, который
триггерит **ТОЛЬКО** Фазу B self-deploy на стадии `deploy`. Статус `Approved`
перестаёт запускать прод-деплой и сохраняет единственный смысл — человеческое
одобрение на гейтах конвейера (прежде всего BRD на `analysis`).

Минимальная правка: `handle_verdict` в `src/webhooks/plane.py` + регистрация
нового состояния в проекте ORCH (Plane + резолвер состояний).

## 3. Бизнес-цели
- **BG-1.** Убрать двусмысленность: жест «запустить прод-деплой» отделён от жеста
  «одобрить артефакт».
- **BG-2.** Снизить риск случайного прод-деплоя: запуск прода требует явного,
  редко используемого статуса `Confirm Deploy`, а не привычного `Approved`.
- **BG-3.** Не сломать работающий self-hosting конвейер при доработке самого
  инструмента (нулевая регрессия `analysis`-гейта и не-self репозиториев).

## 4. Объём (Scope)

### В объёме
- Новый логический статус `confirm_deploy` («Confirm Deploy») в резолвере
  состояний Plane (`src/plane_sync.py`).
- Маршрутизация нового статуса в `src/webhooks/plane.py`
  (`handle_issue_updated` / `handle_verdict`) на путь Фазы B прод-деплоя.
- Прекращение триггера Фазы B по статусу `Approved` на стадии `deploy`.
- Обновление текста CTA Фазы A (Plane-комментарий + Telegram в
  `stage_engine._handle_self_deploy_phase_a`): инструктировать оператора
  переводить задачу в `Confirm Deploy`, а не в `Approved`.
- Конфигурация Plane: создание статуса «Confirm Deploy» в проекте ORCH
  (предусловие эксплуатации — фиксируется в TRZ/AC как требование среды).
- Обновление документации (`CLAUDE.md`, `docs/architecture/README.md` секция
  ORCH-036, `CHANGELOG.md`) и ADR per-work-item.

### Вне объёма
- Telegram inline-кнопки подтверждения деплоя (отдельная задача; здесь не
  реализуем — управление по-прежнему статусом Plane).
- Полностью автоматический approve деплоя (ORCH-54).
- Изменение Фаз A/C, exit-кодов хука, merge-gate, `check_deploy_status`,
  схемы БД, реестров `STAGE_TRANSITIONS` / `QG_CHECKS`.
- Поведение прод-деплоя для не-self репозиториев (остаётся прежним).
- Post-deploy наблюдение (ORCH-021) — не затрагивается.

## 5. Заинтересованные стороны
- **Owner/оператор** — переводит задачи по статусам; главный выгодоприобретатель
  снижения риска.
- **Self-hosting конвейер** — все проекты на общем инстансе; косвенно зависят от
  безопасности прод-деплоя орка.

## 6. Допущения
- A-1. Plane позволяет добавить кастомный статус «Confirm Deploy» в проект ORCH;
  его UUID резолвится через `get_project_states` (API `/states/`).
- A-2. Статус `Confirm Deploy` нужен только проекту ORCH (self-hosting). Прочие
  проекты прод-деплой через Plane-approve не используют
  (`self_deploy_applies` → только `orchestrator`).
- A-3. Оператор переводит задачу в `Confirm Deploy` только когда она реально
  находится на стадии `deploy` (approval-pending после Фазы A).

## 7. Риски (детально — 10-tech-risks.md, ведёт архитектор)
- R-1. Новый логический ключ `confirm_deploy` отсутствует в fallback
  `_DEFAULT_STATES` и в проектах без этого статуса → обращение к ключу должно
  быть безопасным (fail-closed: нет статуса → нет деплоя, не падение).
- R-2. Регрессия: `Approved` на `deploy` после правки не должен НИ
  запускать деплой, НИ вызывать ложный откат/advance.
- R-3. Самоправка прода: правка не должна потребовать ручного рестарта прод-
  контейнера вне штатной стадии deploy-staging → deploy.

## 8. Definition of Done (бизнес-уровень)
- Перевод задачи стадии `deploy` в `Confirm Deploy` запускает прод-деплой
  (Фаза B) ровно так же, как раньше делал `Approved`.
- Перевод задачи стадии `deploy` в `Approved` прод-деплой НЕ запускает.
- `Approved` на `analysis` (и прочих человеческих гейтах) работает без изменений.
- CTA Фазы A просит `Confirm Deploy`.
- Документация и ADR обновлены в том же PR.
