7.5 KiB
DEV TASK: Analyst в Orchestrator (полноценная стадия Analysis)
Статус: ✅ Done (31.05.2026)
Связанная задача: DEV_TASK_ANALYST_PLANE_SYNC.md (расширение — Plane sync)
Проект: multi-agent
Приоритет: High
Зависит от: DEV_TASK_ORCHESTRATOR_MVP, DEV_TASK_ORCHESTRATOR_FIXES, DEV_TASK_PLANE_SYNC
Контекст
Analyst agent уже существует как самостоятельный агент OpenClaw (/home/node/.openclaw/agents/analyst/, модель vibecode/claude-sonnet-4.6, отдельный Telegram binding).
Однако в текущем Orchestrator пайплайне (Plane → webhook → stage machine → Claude CLI) Analyst не участвует. Стадия analysis отсутствует.
Первый прогон ET-002 начался сразу со стадии architecture, потому что BRD/ТЗ были подготовлены вручную Стримом.
Цель: Сделать Analyst полноценной первой стадией конвейера:
- При создании тикета в Plane (или переводе в Analysis) → Orchestrator автоматически запускает Analyst
- Analyst получает
00-business-request.md(или формирует его из описания тикета) - Analyst пишет BRD, ТЗ, AC, Test Plan в
docs/work-items/<id>/ - Analyst задаёт вопросы через Plane comments, ждёт
:approved: - После approve → stage автоматически переходит в
architecture, запускается Architect
Задачи
1. Добавить стадию analysis в stage machine
Файл: src/stages.py
Что сделать:
- Добавить
analysisкак первую послеcreated - Обновить маппинг
STAGESиSTAGE_TRANSITIONS - Добавить Quality Gate
qg_analysis_approved(проверка наличия BRD + AC +:approved:от стейкхолдера)
Ожидаемый переход:
created → analysis (launch Analyst) → architecture (после :approved:)
2. Роутинг webhook'ов из Plane на Analyst
Файл: src/webhooks/plane.py
Что сделать:
- В
handle_issue_created/handle_issue_updated:- Если issue создан или переведён в статус/свойство, соответствующее Analysis → вызвать
launcher.launch("analyst", repo, task_desc, task_id=task_id) - Сохранить
plane_issue_idв таблицуtasks
- Если issue создан или переведён в статус/свойство, соответствующее Analysis → вызвать
Пример логики:
if stage == "analysis" and not has_brd(task_id):
run_id = launcher.launch("analyst", repo, task_desc, task_id=task_id)
plane_sync.post_comment(plane_issue_id, "Analyst запущен. BRD в работе.")
3. Quality Gate для Analysis
Файл: src/qg/checks.py
Что сделать:
- Добавить функцию
check_analysis_approved(repo: str, branch: str) -> tuple[bool, str] - Проверка:
- Наличие
docs/work-items/<id>/01-brd.md - Наличие
docs/work-items/<id>/02-trz.md - Наличие
docs/work-items/<id>/03-acceptance-criteria.md - Комментарий стейкхолдера с
:approved:(или reaction)
- Наличие
Вызывать в handle_push / handle_status (аналогично check_ci_green).
4. Автоматическое продвижение после approve от стейкхолдера
Файл: src/webhooks/plane.py (или gitea.py для комментариев)
Что сделать:
- При получении комментария с
:approved:на Work Item:- Если текущая стадия
analysisи QGcheck_analysis_approvedпроходит →advance_stage(task_id, "analysis", "architecture") - Запустить Architect:
launcher.launch("architect", repo, task_desc, task_id=task_id)
- Если текущая стадия
5. Обновить документацию
Файлы:
tasks/multi-agent/BRD.md— добавить описание стадии Analysis и QGtasks/multi-agent/STATUS.md— обновить таблицу этапов и roadmaptasks/multi-agent/DEV_TASK_ORCHESTRATOR_MVP.md— отметить выполненный пункт
6. (Опционально) Поддержка 00-business-request.md
Файл: src/webhooks/plane.py
Что сделать:
- При создании тикета автоматически создавать
00-business-request.mdиз описания issue + кастомных полей - Передавать путь к этому файлу в промпт Analyst'а
Файлы для изменения
| Файл | Изменения | Приоритет |
|---|---|---|
src/stages.py |
Добавить analysis стадию + QG |
High |
src/webhooks/plane.py |
Роутинг на analyst + обработка approve | High |
src/qg/checks.py |
check_analysis_approved() |
High |
src/agents/launcher.py |
(возможно) спец. обработка analyst | Medium |
tasks/multi-agent/BRD.md |
Документация Analysis | Medium |
tasks/multi-agent/STATUS.md |
Обновить статус | Low |
Ограничения
- НЕ менять порт 8500
- НЕ ломать существующий цикл (ET-002 и дальше должны продолжать работать)
- Analyst НЕ пишет код (только документы)
- Analyst всегда ждёт
:approved:перед закрытием подзадачи Analysis
Порядок выполнения
stages.py(добавить analysis)qg/checks.py(check_analysis_approved)plane.py(роутинг + approve handler)- Документация
- Тест: создать тестовый тикет в Plane → Analyst запускается → пишет BRD → Слава ставит :approved: → stage → architecture
Команды проверки после деплоя
# 1. Health
curl -s http://localhost:8500/health
# 2. Создать тестовый тикет в Plane (статус Analysis) → проверить, что в БД tasks появилась запись
docker exec orchestrator python -c "
import sqlite3
conn = sqlite3.connect('/app/data/orchestrator.db')
conn.row_factory = sqlite3.Row
r = conn.execute('SELECT * FROM tasks ORDER BY id DESC LIMIT 1').fetchone()
print(dict(r))
"
# 3. Проверить, что Analyst запустился (в agent_runs)
docker exec orchestrator python -c "
import sqlite3
conn = sqlite3.connect('/app/data/orchestrator.db')
conn.row_factory = sqlite3.Row
for r in conn.execute('SELECT * FROM agent_runs WHERE agent=\"analyst\" ORDER BY id DESC LIMIT 3').fetchall():
print(dict(r))
"
Результат
После выполнения этой задачи:
- Analyst становится полноценной первой стадией автоматического конвейера
- Создание тикета в Plane с описанием фичи → Analyst автоматически пишет BRD/ТЗ/AC/Test Plan
- Слава только отвечает на вопросы и ставит
:approved: - Дальше пайплайн идёт автоматически (architecture → development → review → testing → deploy)