12 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. Предлагаемая статусная модель (итог) — v2 с правками Славы
A. Новые статусы (создать в Plane + замапить в резолвере)
| Статус | Класс | Группа | Кто ставит/жмёт | Смысл |
|---|---|---|---|---|
| Analysis | 🔵 выход | started | орк | идёт анализ/BRD (1-я стадия) — СВОЙ статус вместо In Progress |
| Awaiting Deploy | 🔵 выход | started | орк (Phase A) | staging зелёный, merge готов — жду Confirm Deploy на прод |
| Confirm Deploy | 🟢 вход | started | человек | запустить Phase B прод-деплой (УЖЕ создан в ORCH-59 ✅) |
| Deploying | 🔵 выход | started | орк (Phase B) | прод-деплой идёт (detached), health-check |
| Monitoring | 🔵 выход | started | орк (post-deploy ORCH-21) | деплой встал, идёт пост-деплой окно (~15мин, 30 опросов) — ещё НЕ Done |
(имена Awaiting Deploy / Monitoring — рабочие; финал — по ответам Славы, см. §5)
B. Семантика In Review — РАЗГРУЗИТЬ
- Оставить
In ReviewТОЛЬКО за approve-pending артефактов конвейера (BRD/ревью) — исходный смысл. - Phase A перестаёт ставить
In Review→ ставитAwaiting Deploy.
B2. Вход в analysis — РАЗГРУЗИТЬ (пункт 3 Славы)
- Сейчас: человек жмёт
In Progress(вход-триггер) → но и стадияanalysisмаппится вin_progress(_STAGE_TO_STATE_KEY), иdeployтоже → ТРОЙНАЯ перегрузкаIn Progress. - Проблема: задача в анализе висит как «In Progress», не видно ЧТО именно идёт (анализ).
- Решение: ввести выходной статус
Analysis(по аналогии с Architecture/Development/...).In Progressостаётся ТОЛЬКО входным триггером «начать конвейер» (человек жмёт), а орк сразу переводит вAnalysis. После ввода Awaiting Deploy/Deploying/Monitoring статусIn Progressбольше НЕ используется как индикация стадии — только как кнопка старта. Чисто.
B3. post-deploy monitor → статус Monitoring (пункт 1 Славы)
- Сейчас: после health-OK задача СРАЗУ → Done, а монитор (ORCH-21) тикает «после Done» 15 мин.
Doneозначает «процесс стартовал», а не «доказанно здоров». - Решение: ввести
Monitoringмежду Deploying и Done. Финалайзер при health-OK ставитMonitoring(а не Done) → пост-деплой окно тикает → при чистом закрытии (HEALTHY, 30 опросов) →Done; при деградации (5xx/UNHEALTHY) →Blocked+ Telegram + сигнал к откату. ТогдаDone= «развёрнуто И доказанно стабильно 15 минут».
C. Полный жизненный цикл задачи (целевой v2)
Backlog → Todo → [In Progress*] → Analysis → [In Review → Approved] → Architecture →
Development → Review → Testing → Awaiting Deploy → [Confirm Deploy] → Deploying →
Monitoring → Done
(* In Progress = только кнопка старта, человек; дальше всё ставит орк)
[...] = действие человека (вход-триггер)
Ветки: Rejected (откат), Needs Input (нужен ввод), Blocked (затык/поломка/фейл деплоя), Cancelled.
D. Гигиена — ИСПРАВЛЕНО по факту кода
Blocked— НЕ убирать, он РАБОЧИЙ (проверено grep'ом, был неправ ранее). Код ставитset_issue_blockedв 9+ местах: фейл гейтов, retry-cap, бюджет исчерпан (anti-livelock), БАГ-8 rollback (deploy→development), падение агента (launcher), reconciler Guard 2 пропускает blocked-задачи. Именно его Слава видел при поломках. Несущий статус — ОСТАВИТЬ. Доп.выгода новой модели: фейл деплояDeploying/Monitoring→Blocked(консистентно).- Разгрузка
In Progress: см. B2 — станет чисто входным триггером. 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. Открытые вопросы Славе (v2)
- Имя approve-pending деплоя:
Awaiting DeployилиReady for Deploy? (склоняюсь кAwaiting Deploy— «жду тебя»;Ready for Deploy= «готово к деплою», тоже ясно). - Имя пост-деплой статуса:
Monitoring/Monitoring after Deploy/Post-Deploy Watch/Verifying? (склоняюсь кMonitoring— коротко;Verifyingподчёркивает «проверяю здоровье»). - Фейл деплоя
Deploying/Monitoring→ куда? ПредлагаюBlocked(консистентно с тем, как код уже метит фейлы) + Telegram + сигнал к откату на rollback-снимок. Согласен? Analysisстатус для 1-й стадии — вводим (как просил, п.3)? Да/нет.- Оформить как work item эпика ORCH-54 (напр.
ORCH-XX-status-model)? Сейчас или после ORCH-23?
Сводка новых статусов к созданию в Plane (после согласования имён):
Analysis, Awaiting Deploy, Deploying, Monitoring (+ Confirm Deploy уже есть).
Blocked — остаётся. In Review — разгружается (только артефакты). In Progress — только старт.