14 KiB
Документация: Orchestrator Multi-Agent Pipeline
Статус: 2026-06-01 (актуально)
Архитектура
Plane (Work Items) → Webhook → Orchestrator → Claude CLI agents → Gitea → Deploy
Orchestrator — Python FastAPI приложение в Docker на mva154 (port 8500). Слушает webhooks от Plane и Gitea, управляет жизненным циклом задач.
Конвейер (Pipeline)
created → analysis → architecture → development → review → testing → deploy → done
| Stage | Agent | QG (вход) | Что делает |
|---|---|---|---|
| analysis | analyst | — | BRD, ТЗ, AC, Test Plan |
| architecture | architect | check_analysis_approved (:approved: от Славы) |
ADR, архитектурные решения |
| development | developer | check_architecture_done (файлы ADR есть) | Код + тесты + PR |
| review | reviewer | check_ci_green (Gitea CI status) | Code review → 12-review.md |
| testing | tester | check_reviewer_verdict (APPROVED в 12-review.md) | Прогон тестов → 13-test-report.md |
| deploy | deployer | check_tests_passed (PASS в 13-test-report.md) | Merge PR → tag → deploy → smoke |
| done | — | — | Задача завершена |
Агенты
Конфигурация (AGENT_CONFIGS)
| Agent | Task file | System prompt | Model |
|---|---|---|---|
| analyst | .task.md |
.openclaw/agents/analyst.md |
claude-sonnet-4-6 |
| architect | .task-arch.md |
.openclaw/agents/architect.md |
claude-sonnet-4-6 |
| developer | .task-dev.md |
.openclaw/agents/developer.md |
claude-sonnet-4-6 |
| reviewer | .task-review.md |
.openclaw/agents/reviewer.md |
claude-sonnet-4-6 |
| tester | .task-test.md |
.openclaw/agents/tester.md |
claude-sonnet-4-6 |
| deployer | .task-deploy.md |
.openclaw/agents/deployer.md |
claude-sonnet-4-6 |
Deployer (добавлен 2026-06-01)
Функции:
- Merge PR через Gitea API
- Создать semver tag (patch increment)
- Deploy (git pull main на сервере)
- Healthcheck (до 60 сек, 12 попыток)
- Smoke test (ключевые endpoints)
- Rollback к предыдущему тегу при fail
- Записать
14-deploy-log.md+ обновитьCHANGELOG.md
Запрещено: менять код, force push, деплоить без merge.
Quality Gates
| QG | Функция | Что проверяет |
|---|---|---|
| QG-0 | Валидация при создании Issue | title 5-80 chars, description ≥2 предложений |
| check_analysis_approved | :approved: в комментарии Plane от стейкхолдера |
Человеческое подтверждение ТЗ |
| check_architecture_done | Наличие ADR файлов в docs/work-items/<id>/06-adr/ |
Архитектура задокументирована |
| check_ci_green | Gitea commit status API | CI pipeline зелёный |
| check_reviewer_verdict | Парсинг 12-review.md → APPROVED/REQUEST_CHANGES |
Код прошёл ревью |
| check_tests_passed | Парсинг 13-test-report.md → PASS/FAIL |
Тесты пройдены |
Plane Integration (полная)
Статусы Issue
| Статус | ID | Когда | Что значит для Славы |
|---|---|---|---|
| Backlog | 113b24f6... |
Создан, ещё не взят | Ничего не происходит |
| Todo | 2c7d3df3... |
Прошёл QG-0, ждёт запуска | Скоро начнётся |
| In Progress | b873d9eb... |
Агент работает | Система работает, ждать |
| Needs Input | babf08a3... |
Analyst задал вопросы | Слава, ответь в комментарии |
| In Review | 38fb1f64... |
ТЗ готово, ждёт approve | Слава, прочитай и :approved: / :rejected: |
| Blocked | 6c4543f9... |
Ошибка / retry исчерпаны | Нужно ручное вмешательство |
| Done | 381a2833... |
Всё задеплоено | Готово |
| Cancelled | b1cae7f9... |
Отменена | — |
Переходы статусов
Backlog → [QG-0 pass] → In Progress (analyst запущен)
In Progress → [analyst questions] → Needs Input
Needs Input → [Слава ответил] → In Progress (analyst перезапущен)
In Progress → [analyst done] → In Review (ждёт :approved:)
In Review → [:approved:] → In Progress (architect запущен)
In Review → [:rejected:] → In Progress (analyst перезапущен с причиной)
In Progress → [все этапы до done] → Done
In Progress → [3 retry исчерпаны / deploy fail] → Blocked
Комментарии в Plane
Orchestrator автоматически пишет комментарии при:
- Каждом переходе stage (с ссылками на branch и PR)
- QG failure (что не прошло и почему)
- Запуске агента
- Вопросах analyst'а (текст вопросов)
- Ошибках (deploy fail, retry exhausted)
- Завершении задачи
Ссылки в комментариях
При переходах stage комментарий содержит:
- 📂 Branch: ссылка на ветку в Gitea
- 🔗 PR: ссылка на Pull Request (если есть, на этапах review/testing/deploy)
Webhook events
| Event | Действие |
|---|---|
work_item.created / issue.created |
QG-0 → create branch → init docs → launch analyst |
comment.created / issue_comment.created |
Проверка :approved: / :rejected: / ответ на вопросы |
QG-0: Валидация при создании Issue
При создании Issue в Plane, orchestrator проверяет:
- Title: 5-80 символов
- Description: ≥2 предложений
Если не проходит → Issue переходит в Blocked + комментарий с описанием что исправить.
Механизмы автономности
Auto-advance
После завершения агента (exit 0), _monitor_agent вызывает _try_advance_stage:
- Определяет текущий stage задачи
- Проверяет QG следующего stage
- Если QG green → advance stage → launch next agent
- Если QG red → stop (ждёт внешнего события)
Auto-PR
После developer push, _ensure_pr() автоматически создаёт PR в Gitea.
Auto-init
При создании Issue в Plane → webhook → QG-0 → branch → docs → analyst. Слава просто создаёт Issue — всё остальное автоматически.
Retry (developer)
При REQUEST_CHANGES от reviewer'а — developer перезапускается (до 3 раз).
Retry (tester fail)
При FAIL тестов — developer перезапускается для фикса (до 3 раз). После 3 неудач → Issue переходит в Blocked.
Analyst questions
Analyst может создать 01-questions.md → Issue переходит в Needs Input.
Слава отвечает комментарием → analyst перезапускается с ответами (до 3 раундов).
Notifications
Telegram уведомления на каждом переходе stage + при ошибках.
Сценарии работы
🟢 Позитивный (happy path)
- Слава создаёт Issue в Plane: "Добавить фильтр по высоте"
- QG-0 ✓ → branch
feature/ET-012-filter-altitude→ analyst запущен - Analyst пишет BRD/ТЗ/AC/TestPlan → Issue → In Review
- Слава читает, пишет
:approved:→ Issue → In Progress - Architect → ADR → auto-advance
- Developer → код + тесты → PR → auto-advance
- Reviewer → APPROVED → auto-advance
- Tester → PASS → auto-advance
- Deployer → merge → tag → deploy → smoke ✓ → Issue → Done
- Telegram: "🎉 ET-012: задача завершена!"
🟡 Analyst задаёт вопросы
- Analyst не понимает требования → создаёт
01-questions.md - Issue → Needs Input + Telegram: "❓ ET-012: Analyst задаёт вопросы"
- Слава отвечает комментарием в Plane
- Orchestrator ловит комментарий → Issue → In Progress → analyst перезапущен
- Analyst учитывает ответы → пишет ТЗ → Issue → In Review
- (Максимум 3 раунда вопросов, потом → Blocked)
🟡 Слава отклоняет ТЗ
- Issue в In Review, Слава пишет
:rejected: Не учтены мобильные устройства - Issue → In Progress → analyst перезапущен с причиной отклонения
- Analyst исправляет → Issue → In Review (повторно)
🔴 Tester находит баги
- Tester прогоняет тесты → FAIL в
13-test-report.md - Issue остаётся In Progress → developer перезапущен для фикса
- Developer фиксит → reviewer → tester (повторно)
- Если 3 попытки developer'а не помогли → Issue → Blocked
- Telegram: "🚨 ET-012: Tests still failing after 3 retries"
🔴 Deploy fail
- Deployer мержит PR, деплоит, smoke test FAIL
- Deployer откатывает к предыдущему тегу
- Issue → Blocked
- Telegram: "🚨 ET-012: Deploy failed! Rolled back."
🔴 Architect conflict
- Architect находит конфликт с ТЗ → создаёт
10-conflict.md - Issue → In Progress → analyst перезапущен с описанием конфликта
- Analyst пересматривает ТЗ → Issue → In Review (повторно)
Файловая структура
/home/slin/repos/orchestrator/
├── src/
│ ├── main.py # FastAPI app
│ ├── config.py # Settings (env vars)
│ ├── db.py # SQLite (tasks, agent_runs, events)
│ ├── stages.py # STAGE_TRANSITIONS
│ ├── notifications.py # Telegram notifications
│ ├── plane_sync.py # Plane API (states, comments, links)
│ ├── agents/
│ │ ├── launcher.py # AgentLauncher (launch, monitor, retry, advance)
│ │ └── __init__.py
│ ├── webhooks/
│ │ ├── gitea.py # Push, PR, CI status handlers
│ │ ├── plane.py # work_item.created, comment handlers
│ │ └── __init__.py
│ └── qg/
│ ├── checks.py # QG check functions
│ └── __init__.py
├── docker-compose.yml
├── Dockerfile
└── requirements.txt
Инфраструктура
- Host: mva154 (82.22.50.71)
- Container:
orchestrator(port 8500) - Gitea: localhost:3000 (в docker network)
- Plane: localhost:8091 (в docker network)
- Repos:
/home/slin/repos/orchestrator,/repos/enduro-trails(в контейнере) - DB: SQLite (
/app/data/orchestrator.db) - Logs:
/app/data/logs/(per-agent run logs)
Единственная точка ручного вмешательства
:approved: после analyst'а — Слава подтверждает ТЗ в Plane.
Всё остальное — полностью автономно:
- auto-init при создании Issue
- architect запускается автоматически после approve
- developer → после architecture done
- reviewer → после CI green
- tester → после review approved
- deployer → после tests passed
- done → после deploy success
- retry при ошибках (до 3 раз)
- rollback при deploy fail
Расхождения с Proposal v1
Полная таблица: tasks/multi-agent/PROPOSAL_VS_REALITY.md
Ключевые отличия от идеала:
- Designer не реализован (skip для не-UI задач)
- QG упрощены (проверка файлов, не lint-скрипты)
- Один environment (test), нет prod
- Нет budget tracking
- Все агенты на Sonnet (proposal: Architect/Reviewer на Opus)
- Нет Plane подзадач (7 subtasks) — один Issue, этапы в orchestrator DB
Changelog
| Дата | Изменение |
|---|---|
| 2026-05-31 | Fix: _monitor_agent PIPE streaming (race condition) |
| 2026-05-31 | Fix: check_reviewer_verdict вместо check_review_approved |
| 2026-05-31 | Add: _ensure_pr (auto-PR after developer push) |
| 2026-05-31 | Add: REQUEST_CHANGES retry logic (3 attempts) |
| 2026-06-01 | Add: deployer agent (merge → tag → deploy → smoke → rollback) |
| 2026-06-01 | Remove: _auto_merge_pr hardcode from _try_advance_stage |
| 2026-06-01 | Add: Plane states — Needs Input, In Review, Blocked |
| 2026-06-01 | Add: Analyst questions flow (01-questions.md → Needs Input → relaunch) |
| 2026-06-01 | Add: :rejected: handler с причиной + relaunch |
| 2026-06-01 | Add: Tester FAIL → developer retry (до 3 раз → Blocked) |
| 2026-06-01 | Add: Deploy FAIL → Blocked + rollback |
| 2026-06-01 | Add: Architect conflict (10-conflict.md → rollback to analysis) |
| 2026-06-01 | Add: QG-0 валидация при создании Issue |
| 2026-06-01 | Add: Ссылки в комментариях (branch + PR URLs) |
| 2026-06-01 | Add: Max 3 question rounds для analyst |