auto-sync: 2026-05-31 14:50:01
This commit is contained in:
165
tasks/multi-agent/DEV_TASK_ANALYST_IN_ORCHESTRATOR.md
Normal file
165
tasks/multi-agent/DEV_TASK_ANALYST_IN_ORCHESTRATOR.md
Normal file
@@ -0,0 +1,165 @@
|
||||
# DEV TASK: Analyst в Orchestrator (полноценная стадия Analysis)
|
||||
|
||||
**Статус:** Ready for dev
|
||||
**Проект:** 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`
|
||||
|
||||
**Пример логики:**
|
||||
```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/<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` и 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)
|
||||
Reference in New Issue
Block a user