284 lines
12 KiB
Markdown
284 lines
12 KiB
Markdown
# Статус проекта: Мультиагентная разработка ПО
|
||
|
||
**Дата обновления:** 2026-05-31 16:45 UTC
|
||
**Ревьюер:** Стрим
|
||
|
||
---
|
||
|
||
## Общая зрелость
|
||
|
||
| Фаза (из BRD) | Статус | Комментарий |
|
||
|----------------|--------|-------------|
|
||
| **Фаза 0: Инфраструктура** | ✅ Завершена | Всё установлено и работает |
|
||
| **Фаза 1: Ручной конвейер** | ✅ Завершена | ET-001 прошёл полный цикл |
|
||
| **Фаза 2: Orchestrator MVP** | ✅ Завершена (21.05) | QG реальные, автозапуск Claude CLI, 27 тестов |
|
||
| **Фаза 3: Plane интеграция** | ✅ Завершена (21.05) | Webhooks + обратная связь (state sync, comments) |
|
||
| **Фаза 4: Полный конвейер** | ✅ Первый прогон (21.05) | ET-002 прошёл полный автоматический цикл! |
|
||
| **Фаза 5: Оптимизация** | 🟡 В работе | Analyst полностью интегрирован как первая стадия (31.05), 27 тестов green |
|
||
|
||
---
|
||
|
||
## 🎉 MILESTONE: Первый полный автоматический прогон (21.05.2026)
|
||
|
||
**ET-002 "Чекбокс POI в попапе рельефа"** прошёл весь пайплайн автоматически:
|
||
|
||
```
|
||
analysis → architecture → development → review → testing → deploy → done ✅
|
||
```
|
||
|
||
| Стадия | Агент | Результат | Время |
|
||
|--------|-------|-----------|-------|
|
||
| architecture | Architect (Claude CLI, Opus) | ADR + infra-requirements | ~5 мин |
|
||
| development | Developer (Claude CLI, Sonnet) | feat commit + тесты | ~55 мин (docker build) |
|
||
| review | Reviewer (Claude CLI, Opus) | APPROVED (0 P0/P1) | ~3 мин |
|
||
| testing | Tester (Claude CLI, Sonnet) | PASS (pytest 14/14, JS 7/7) | ~5 мин |
|
||
| deploy | Merge PR #5 → main | Merged | — |
|
||
|
||
**Коммиты на ветке:**
|
||
```
|
||
c36ee9d test(ET-002): test report PASS - all tests green, ready to deploy
|
||
a4a0aab docs(ET-002): code review APPROVED - no P0/P1 findings
|
||
8c17a4f feat(web): add POI visibility checkbox to terrain popup
|
||
af579f7 docs(ET-002): add ADR-0001 and infra requirements for POI toggle
|
||
73c9dc4 docs(ET-002): status → approved
|
||
f1f4d5f docs(ET-002): BRD, ТЗ, AC, Test Plan
|
||
```
|
||
|
||
---
|
||
|
||
## Баги и фиксы (21.05.2026)
|
||
|
||
| # | Баг | Статус | Фикс |
|
||
|---|-----|--------|------|
|
||
| 1 | `/repos` mounted as `:ro` | ✅ Исправлен | Убрал `:ro` из docker-compose.yml |
|
||
| 2 | `check_review_approved` — PR not found | ✅ Исправлен | Lookup PR по branch + file-based fallback |
|
||
| 3 | `git` не установлен в контейнере | ✅ Исправлен | Уже был в Dockerfile (git v2.47.3) |
|
||
| 4 | Коммиты от root ломают permissions | ✅ Исправлен | GIT_AUTHOR_NAME/EMAIL = claude-bot в launcher.py |
|
||
| 5 | `task_id=NULL` в agent_runs | ✅ Исправлен | task_id передаётся в launch() |
|
||
| 6 | Нет timeout для агентов | ✅ Исправлен | Watchdog 30 мин, kill -9 |
|
||
| 7 | Нет auto-advance после CI green | ✅ Исправлен | gitea.py: CI green → review, PR approved → testing |
|
||
| 8 | Orchestrator не пишет в Plane | ✅ Исправлен | plane_sync.py: state update + comments |
|
||
| 9 | `dismiss_stale_approvals` + duplicate CI statuses | ⚠️ Workaround | Временно отключал status check для merge |
|
||
| 10 | Developer застревает на `docker build` (~55 мин) | 🔴 Не исправлен | Для frontend-only фич docker build избыточен |
|
||
|
||
---
|
||
|
||
## Инфраструктура на mva154 (82.22.50.71)
|
||
|
||
### Контейнеры (docker ps на 21.05.2026)
|
||
|
||
| Контейнер | Образ | Статус | Порт |
|
||
|-----------|-------|--------|------|
|
||
| `orchestrator` | orchestrator-orchestrator (self-built) | Up | 127.0.0.1:8500 |
|
||
| `openclaw-gateway` | ghcr.io/openclaw/openclaw:latest | Up (healthy) | 127.0.0.1:18789 |
|
||
| `enduro-trails-app-1` | enduro-trails-app (self-built) | Up | 0.0.0.0:5558 |
|
||
| `gitea` | gitea/gitea:latest | Up | 127.0.0.1:3000, 0.0.0.0:2222 |
|
||
| `claude-cli-proxy` | eceasy/cli-proxy-api:latest | Up | 127.0.0.1:8317 |
|
||
| `xray` | ghcr.io/xtls/xray-core:latest | Up | — |
|
||
| `plane-*` (8 контейнеров) | makeplane/* | Up (healthy) | 0.0.0.0:8091, 0.0.0.0:8443 |
|
||
|
||
### Установленное ПО на хосте
|
||
|
||
| Компонент | Версия | Путь |
|
||
|-----------|--------|------|
|
||
| Claude Code CLI | 2.1.142 | `/usr/bin/claude` (+ mount в orchestrator) |
|
||
| Node.js | v24.14.0 | — |
|
||
| Docker + Compose | — | — |
|
||
| Nginx | — | reverse proxy |
|
||
| Gitea Actions Runner | `act_runner` | `/home/slin/act_runner` (online, self-hosted) |
|
||
|
||
---
|
||
|
||
## Orchestrator — детальный статус
|
||
|
||
**Репо:** `/home/slin/repos/orchestrator/`
|
||
**Контейнер:** `orchestrator` (порт 8500, network_mode: host)
|
||
**Конфиг:** `.env`
|
||
|
||
### Архитектура
|
||
|
||
```
|
||
src/
|
||
├── main.py # FastAPI app
|
||
├── config.py # Settings from env
|
||
├── db.py # SQLite connection
|
||
├── stages.py # Stage machine (8 stages)
|
||
├── notifications.py # Structured logging
|
||
├── plane_sync.py # ← NEW: Plane API sync (state + comments)
|
||
├── webhooks/
|
||
│ ├── plane.py # Plane webhook handler + QG orchestration + plane_sync calls
|
||
│ └── gitea.py # Gitea webhook handler (push, PR, CI status) + plane_sync calls
|
||
├── qg/
|
||
│ └── checks.py # 6 QG checks (filesystem + Gitea API + Plane API)
|
||
└── agents/
|
||
└── launcher.py # Claude CLI launcher (subprocess.Popen + timeout watchdog)
|
||
```
|
||
|
||
### Stage Machine
|
||
|
||
```
|
||
created → analysis → architecture → development → review → testing → deploy → done
|
||
↑ QG: files ↑ QG: ADR ↑ QG: CI green ↑ QG: PR approved ↑ QG: test report
|
||
↑ Agent: analyst↑ Agent: arch ↑ Agent: dev ↑ Agent: reviewer ↑ Agent: tester
|
||
```
|
||
|
||
### Auto-advance (добавлено 21.05, расширено 31.05)
|
||
|
||
| Триггер | Действие |
|
||
|---------|----------|
|
||
| **work_item.created в Plane** | **created → analysis, launch Analyst** |
|
||
| **:approved: comment + QG analysis** | **analysis → architecture, launch Architect** |
|
||
| Push с ADR файлами | architecture → development, launch Developer |
|
||
| CI status = success | development → review, launch Reviewer |
|
||
| PR review = approved | review → testing, launch Tester |
|
||
| PR review = request_changes | back-to development, relaunch Developer (max 3x) |
|
||
| Test report PASS | testing → deploy |
|
||
|
||
### Plane Sync (добавлено 21.05, расширено 31.05)
|
||
|
||
| Событие | Действие в Plane |
|
||
|---------|-----------------|
|
||
| Stage change | PATCH issue state (Todo/In Progress/Done) + comment |
|
||
| QG failure | Comment с причиной |
|
||
| Task done | State → Done + closing comment |
|
||
| Task created (webhook) | Сохраняет `plane_issue_id` для маппинга |
|
||
| **Analyst запущен** | **Comment: "🔍 Analyst запущен. BRD/ТЗ/AC/TestPlan в работе..."** |
|
||
| **Analyst завершил (exit 0)** | **Comment: "📋 BRD/ТЗ/AC/TestPlan готовы. Прошу :approved:"** |
|
||
|
||
### Данные в БД (на 21.05.2026)
|
||
|
||
- events: 40+
|
||
- tasks: 6 (ET-001..ET-004 + smoke tests)
|
||
- agent_runs: 8 (architect x4, developer x1, reviewer x1, tester x1)
|
||
- Таблица tasks: добавлена колонка `plane_issue_id` (UUID из Plane)
|
||
|
||
### Docker-compose.yml
|
||
|
||
```yaml
|
||
services:
|
||
orchestrator:
|
||
build: .
|
||
container_name: orchestrator
|
||
restart: unless-stopped
|
||
network_mode: host
|
||
volumes:
|
||
- ./data:/app/data
|
||
- /home/slin/repos:/repos # БЕЗ :ro
|
||
- /var/run/docker.sock:/var/run/docker.sock
|
||
- /usr/lib/node_modules/@anthropic-ai/claude-code:/opt/claude-code:ro
|
||
- /usr/bin/node:/usr/bin/node:ro
|
||
- /home/slin/.claude:/home/slin/.claude
|
||
- /home/slin/.claude.json:/home/slin/.claude.json:ro
|
||
env_file: .env
|
||
environment:
|
||
- ORCH_REPOS_DIR=/repos
|
||
- ORCH_HOST_REPOS_DIR=/home/slin/repos
|
||
group_add:
|
||
- "999"
|
||
```
|
||
|
||
---
|
||
|
||
## Analyst agent (OpenClaw) — статус
|
||
|
||
| Параметр | Значение |
|
||
|----------|----------|
|
||
| ID | `analyst` |
|
||
| Модель | `vibecode/claude-sonnet-4.6` |
|
||
| Workspace | `/home/node/.openclaw/workspace-analyst/` |
|
||
| Telegram binding | ✅ account `analyst` (отдельный бот) |
|
||
| Статус | ✅ **Полностью зарегистрирован и работает** |
|
||
| Orchestrator интеграция | ✅ **Полностью интегрирован** (31.05): автозапуск, QG, :approved: → architecture |
|
||
|
||
---
|
||
|
||
## Gitea — статус
|
||
|
||
| Параметр | Значение |
|
||
|----------|----------|
|
||
| URL | `https://git.mva154.duckdns.org` |
|
||
| Repos | `enduro-trails`, `orchestrator` |
|
||
| CI Runner | ✅ `mva154-runner` (online, self-hosted) |
|
||
| Branch protection | ✅ main: require 1 approval + CI green |
|
||
| Webhooks → Orchestrator | ✅ Работают (push, PR, status events) |
|
||
| Service accounts | `admin`, `claude-bot`, `stream` |
|
||
| claude-bot token | `38c6fa88...` (write:repository) |
|
||
|
||
---
|
||
|
||
## Plane — статус
|
||
|
||
| Параметр | Значение |
|
||
|----------|----------|
|
||
| URL | `https://plane.mva154.duckdns.org` |
|
||
| Workspace | `ag_proj` |
|
||
| Проект | "Enduro Trails" (identifier: ET) |
|
||
| Project ID | `7a79f0a9-5278-49cd-9007-9a338f238f9c` |
|
||
| Issues | ET-1 (POI checkbox) — **Done** ✅ |
|
||
| Webhook → Orchestrator | ✅ Через PostgreSQL trigger (HMAC-SHA256) |
|
||
| Orchestrator → Plane | ✅ State sync + comments (plane_sync.py) |
|
||
|
||
### States в Plane
|
||
|
||
| ID | Name | Group |
|
||
|----|------|-------|
|
||
| `113b24f6-...` | Backlog | backlog |
|
||
| `2c7d3df3-...` | Todo | unstarted |
|
||
| `b873d9eb-...` | In Progress | started |
|
||
| `381a2833-...` | Done | completed |
|
||
| `b1cae7f9-...` | Cancelled | cancelled |
|
||
|
||
---
|
||
|
||
## Репозиторий enduro-trails
|
||
|
||
**Ветки:** main (актуальная с ET-001 + ET-002 merged)
|
||
|
||
### Work Items
|
||
|
||
| ID | Название | Статус |
|
||
|----|----------|--------|
|
||
| ET-001 | Исключить шлагбаумы и тротуары из OSRM | ✅ Done (ручной цикл) |
|
||
| ET-002 | Чекбокс POI в попапе рельефа | ✅ Done (автоматический цикл!) |
|
||
|
||
---
|
||
|
||
## Следующие шаги (приоритет)
|
||
|
||
### Оставшиеся баги
|
||
|
||
1. **`dismiss_stale_approvals` + duplicate CI statuses** — Gitea создаёт duplicate pending statuses, блокирует merge. Нужно: либо отключить dismiss_stale_approvals, либо чистить stale statuses через API.
|
||
2. **Developer застревает на docker build** — для frontend-only фич нужен skip docker build или определение scope по git diff.
|
||
|
||
### Улучшения для полной автономности
|
||
|
||
3. **Deploy stage** — автоматический merge PR + deploy (сейчас ручной)
|
||
4. **Notifications в Telegram** — отправлять Славе статус при смене stage
|
||
5. **Custom fields в Plane** — qg_status, stage, tokens_spent
|
||
6. **Лейблы в Plane** — stage:*, back-to:*, escalation:*
|
||
7. **Параллельные задачи** — FIFO-очередь (F2-6 из BRD)
|
||
|
||
---
|
||
|
||
## Доступ к mva154
|
||
|
||
**Из OpenClaw контейнера:**
|
||
```bash
|
||
/home/node/.openclaw/skills/installer/scripts/ssh_exec.sh --host mva154 --cmd "<command>"
|
||
```
|
||
- Тип: `ssh-direct`, Хост: `82.22.50.71:22`, User: `slin`
|
||
|
||
---
|
||
|
||
## Документация проекта
|
||
|
||
| Файл | Описание |
|
||
|------|----------|
|
||
| `tasks/multi-agent/BRD.md` | Полный BRD с архитектурой, QG, roadmap |
|
||
| `tasks/multi-agent/BACKLOG.md` | Бэклог + решения по Analyst |
|
||
| `tasks/multi-agent/STATUS.md` | **Этот файл** — актуальный статус |
|
||
| `tasks/multi-agent/DEV_TASK_ORCHESTRATOR_QG.md` | ТЗ: QG + автозапуск (выполнено) |
|
||
| `tasks/multi-agent/DEV_TASK_ORCHESTRATOR_FIXES.md` | ТЗ: 5 критических фиксов (выполнено) |
|
||
| `tasks/multi-agent/DEV_TASK_PLANE_SYNC.md` | ТЗ: Plane sync (выполнено) |
|
||
| `tasks/multi-agent/DEV_TASK_WEBHOOKS.md` | ТЗ: Webhooks (выполнено) |
|