8.5 KiB
8.5 KiB
Статусная модель Plane для оркестратора — ревизия и предложение
Дата: 2026-06-07 · Автор: Стрим · Статус: предложение на согласование со Славой
0. Зачем
Сегодня всплыли две семантические перегрузки статусов (оба = риск ошибки оператора):
Approvedзначил И «BRD принят, продолжай» И «ВЫКАТИ В ПРОД» → починили в ORCH-59 (ввелиConfirm Deploy).In Reviewставится И на approve-pending BRD (ранние стадии) И на approve-pending прод-деплоя (Phase A). Оператор видитIn Reviewи не понимает: это «посмотри артефакт» или «жду твоего Confirm Deploy на прод». ← боль, которую заметил Слава.
Плюс: нет отдельного статуса «идёт внедрение» (между Confirm Deploy и Done задача визуально «прыгает» сразу в Done, момент реального деплоя на доске не виден).
1. Как код РЕАЛЬНО работает со статусами (факты из репо)
Статусы, которые ЧИТАЕТ webhook (handle_issue_updated) — это ВХОД от человека:
In Progress→ старт/перезапуск стадииApproved→ advance стадии (BRD-гейт) + РАНЬШЕ триггерил прод (теперь нет)Confirm Deploy→ Phase B прод-деплой (ORCH-59, новый)Rejected→ откат на пред. стадию- Всё остальное (In Review, Needs Input, Blocked, Done, доски-стадии) — код ИГНОРИРУЕТ на входе, это статусы, которые орк ставит САМ (выход).
Статусы, которые орк СТАВИТ сам (это ВЫХОД, индикация прогресса):
- Per-stage доски:
Architecture / Development / Review / Testing(видимость стадии) In Progress(analysis, deploy),In Review(approve-pending),Needs Input,Done
Ключевой инсайт для модели
Статусы делятся на ДВА класса, и их нельзя мешать:
- 🟢 ВХОД (человек → орк, триггеры): In Progress, Approved, Rejected, Confirm Deploy
- 🔵 ВЫХОД (орк → доска, индикация): Architecture/Development/Review/Testing, In Review, Needs Input, Done, (Blocked)
Перегрузка возникала, когда один статус был и входом, и выходом, ИЛИ один вход значил два действия. Цель модели — чтобы каждый триггер = ровно один смысл.
2. Предложение Славы (разбор)
- «approve-pending деплоя пусть будет не
In Review, аReady for Deploy» — ✅ ДА. Сейчас Phase A ставитIn Review(перегруз с BRD-ревью). Нужен отдельный выходной статус. Предлагаю имяAwaiting Deploy(илиReady for Deploy) — «всё зелёно, жду твой Confirm Deploy на прод». Семантика: орк выставил → человек видит «пора жать Confirm Deploy». - «нужен статус "идёт внедрение", после успеха → Done» — ✅ ДА.
Предлагаю
Deploying— орк ставит при старте Phase B (detached прод-деплой идёт), снимает в Done после health-OK финалайзера (или в Rejected/Blocked при фейле).
3. Предлагаемая статусная модель (итог)
A. Новые статусы (создать в Plane + замапить в резолвере)
| Статус | Класс | Группа | Кто ставит/жмёт | Смысл |
|---|---|---|---|---|
| Awaiting Deploy | 🔵 выход | started | орк (Phase A) | staging зелёный, merge готов — жду Confirm Deploy на прод |
| Confirm Deploy | 🟢 вход | started | человек | запустить Phase B прод-деплой (УЖЕ создан в ORCH-59 ✅) |
| Deploying | 🔵 выход | started | орк (Phase B) | прод-деплой идёт (detached), health-check в процессе |
B. Семантика In Review — РАЗГРУЗИТЬ
- Оставить
In ReviewТОЛЬКО за approve-pending артефактов конвейера (BRD/ревью на ранних стадиях) — это его исходный смысл. - Phase A перестаёт ставить
In Review→ ставитAwaiting Deploy.
C. Полный жизненный цикл задачи (целевой)
Backlog → Todo → In Progress(analysis) → [In Review → Approved] → Architecture →
Development → Review → Testing → Awaiting Deploy → [Confirm Deploy] → Deploying → Done
(человек) (орк)
Ветки: Rejected (откат), Needs Input (нужен ввод), Blocked (затык), Cancelled.
D. Что УБРАТЬ / признать лишним (гигиена)
Кандидаты на чистку (проверить, что нигде в коде не читаются как триггер):
Blocked— код его не выставляет и не читает как триггер (есть в маппинге, но не в жизненном цикле). Либо начать использовать осмысленно (затык внешней зависимости), либо убрать.- Дубль индикации:
In Progressиспользуется и для analysis, и для deploy-стадии (STAGE_TO_STATE). После ввода Awaiting Deploy/Deploying стадия deploy получит свои статусы — In Progress останется только за analysis. Чище. - Проверить
TodovsBacklog— оба «не начато»; возможно один лишний (низкий приоритет).
4. Объём изменений (для будущего ТЗ Dev-агенту)
- Plane (инфра, делаю я через API): создать
Awaiting Deploy,Deploying(Confirm Deployуже есть). Удаление лишних — после подтверждения. - Код (Dev-агент):
src/plane_sync.py: добавить ключиawaiting_deploy,deployingв_DEFAULT_STATES/_PLANE_NAME_TO_KEY; новый хелперset_issue_awaiting_deploy,set_issue_deploying.src/stage_engine.pyPhase A:set_issue_in_review→set_issue_awaiting_deploy.src/stage_engine.py/self_deploy.pyPhase B: при старте деплоя ставитьDeploying; финалайзер при health-OK →Done, при фейле →Rejected/Blocked.- webhook:
Awaiting Deploy/Deployingостаются ИГНОРируемыми на входе (они выходные). - Документация: CLAUDE.md (статусная модель), architecture/README, CHANGELOG, ADR.
- Тесты: Phase A ставит Awaiting Deploy (не In Review); Phase B ставит Deploying; fail-closed при отсутствии статусов.
5. Открытые вопросы Славе
- Имя для approve-pending деплоя:
Awaiting DeployилиReady for Deploy? (склоняюсь кAwaiting Deploy— подчёркивает «жду тебя», ноReady for Deployтоже ок). - При фейле прод-деплоя
Deploying→ куда? ПредлагаюRejected(откат на deploy, повторный Confirm Deploy после фикса) — консистентно с текущим rollback. Или отдельныйDeploy Failed? Blocked— начать использовать (внешний затык) или убрать как мёртвый?- Оформить как work item эпика ORCH-54 (например ORCH-60-status-model)? Делать после ORCH-23?