# 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//` - 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` **Пример логики:** ```python 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//01-brd.md` - Наличие `docs/work-items//02-trz.md` - Наличие `docs/work-items//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` и QG `check_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 и QG - `tasks/multi-agent/STATUS.md` — обновить таблицу этапов и roadmap - `tasks/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 --- ## Порядок выполнения 1. `stages.py` (добавить analysis) 2. `qg/checks.py` (check_analysis_approved) 3. `plane.py` (роутинг + approve handler) 4. Документация 5. Тест: создать тестовый тикет в Plane → Analyst запускается → пишет BRD → Слава ставит :approved: → stage → architecture --- ## Команды проверки после деплоя ```bash # 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)