From 1864cdb5af2b801a1dc6106b88618776e933c28c Mon Sep 17 00:00:00 2001 From: Stream Date: Thu, 21 May 2026 22:00:01 +0300 Subject: [PATCH] auto-sync: 2026-05-21 22:00:01 --- memory/2026-05-21.md | 20 +++++-- tasks/multi-agent/STATUS.md | 106 +++++++++++++++++++++--------------- 2 files changed, 77 insertions(+), 49 deletions(-) diff --git a/memory/2026-05-21.md b/memory/2026-05-21.md index 2bdc7b2..491c083 100644 --- a/memory/2026-05-21.md +++ b/memory/2026-05-21.md @@ -63,13 +63,21 @@ Dev-агент (run `624ca711`) выполнил все 5 фиксов: Rebuild успешен: git v2.47.3 в контейнере, health OK. -## Dev-агент: Plane sync (18:00+) +## Dev-агент: Plane sync (18:00-18:55) -Запущен Dev-агент (run `bad29612`) на добавление обратной связи Orchestrator → Plane: -- Новый модуль `src/plane_sync.py` -- Обновление state issue при смене stage -- Комментарии в Plane при каждом переходе -- Интеграция в webhooks/plane.py и webhooks/gitea.py +Dev-агент (run `bad29612`) создал `src/plane_sync.py`, интегрировал в `webhooks/plane.py`. +Таймаутнулся на `gitea.py` — дозавершила вручную. + +Результат: +- ✅ `src/plane_sync.py` — модуль обратной связи (find_issue, update_state, add_comment) +- ✅ Интеграция в `webhooks/plane.py` — при advance stage → comment + state update +- ✅ Интеграция в `webhooks/gitea.py` — при CI green / PR approve → comment + state update +- ✅ Маппинг через `plane_issue_id` колонку в БД (primary lookup) +- ✅ Автосохранение `plane_issue_id` при `work_item.created` webhook +- ✅ Smoke test: ET-002 state → Done в Plane, тестовый комментарий добавлен + +Проблема найденная: `work_item_id` в Orchestrator (ET-002) ≠ `sequence_id` в Plane (1). +Решение: DB lookup по `plane_issue_id` (UUID), fallback на Plane API search. ### Plane diff --git a/tasks/multi-agent/STATUS.md b/tasks/multi-agent/STATUS.md index 35d9184..52e2b76 100644 --- a/tasks/multi-agent/STATUS.md +++ b/tasks/multi-agent/STATUS.md @@ -1,6 +1,6 @@ # Статус проекта: Мультиагентная разработка ПО -**Дата обновления:** 2026-05-21 16:35 UTC +**Дата обновления:** 2026-05-21 18:55 UTC **Ревьюер:** Стрим --- @@ -12,9 +12,9 @@ | **Фаза 0: Инфраструктура** | ✅ Завершена | Всё установлено и работает | | **Фаза 1: Ручной конвейер** | ✅ Завершена | ET-001 прошёл полный цикл | | **Фаза 2: Orchestrator MVP** | ✅ Завершена (21.05) | QG реальные, автозапуск Claude CLI, 27 тестов | -| **Фаза 3: Webhooks + интеграция** | ✅ Завершена (21.05) | Gitea webhooks, Plane webhooks (HMAC), review QG fix | +| **Фаза 3: Plane интеграция** | ✅ Завершена (21.05) | Webhooks + обратная связь (state sync, comments) | | **Фаза 4: Полный конвейер** | ✅ Первый прогон (21.05) | ET-002 прошёл полный автоматический цикл! | -| **Фаза 5: Оптимизация** | 🟡 Частично | Баги найдены, часть исправлена | +| **Фаза 5: Оптимизация** | 🟡 В работе | Баги исправлены, auto-advance добавлен | --- @@ -46,18 +46,20 @@ f1f4d5f docs(ET-002): BRD, ТЗ, AC, Test Plan --- -## Баги найденные при прогоне (21.05.2026) +## Баги и фиксы (21.05.2026) | # | Баг | Статус | Фикс | |---|-----|--------|------| -| 1 | `/repos` mounted as `:ro` — агенты не могут писать | ✅ Исправлен | Убрал `:ro` из docker-compose.yml | -| 2 | `check_review_approved` — "PR number not available" | ✅ Исправлен | Добавлен lookup PR по branch через Gitea API + fallback на file-based review | -| 3 | `git` не установлен в контейнере orchestrator | ⚠️ Workaround | Architect использует dulwich (pip), Developer — dulwich. Коммиты от root ломают permissions | -| 4 | `dismiss_stale_approvals` + duplicate CI statuses | ⚠️ Workaround | Временно отключил status check для merge, потом включил обратно | -| 5 | Launcher не привязывает `task_id` к agent_runs | 🔴 Не исправлен | Все runs имеют `task_id=NULL` | -| 6 | Orchestrator не автоматически продвигает stage после CI green | ⚠️ Частично | Нужен `:approved:` webhook для каждого перехода | -| 7 | `.git/objects` owned by root после коммитов агентов | ⚠️ Workaround | `chown -R slin:slin` вручную перед каждым коммитом | -| 8 | Developer застревает на `docker build` (~55 мин) | 🔴 Не исправлен | Для frontend-only фич docker build избыточен | +| 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 избыточен | --- @@ -69,7 +71,7 @@ f1f4d5f docs(ET-002): BRD, ТЗ, AC, Test Plan |-----------|-------|--------|------| | `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 (**unhealthy**) | 0.0.0.0:5558 | +| `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 | — | @@ -102,13 +104,14 @@ src/ ├── 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 -│ └── gitea.py # Gitea webhook handler (push, PR, CI status) +│ ├── 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 # 5 QG checks (filesystem + Gitea API) └── agents/ - └── launcher.py # Claude CLI launcher (subprocess.Popen) + └── launcher.py # Claude CLI launcher (subprocess.Popen + timeout watchdog) ``` ### Stage Machine @@ -119,11 +122,31 @@ created → analysis → architecture → development → review → testing → ↑ Agent: — ↑ Agent: arch ↑ Agent: dev ↑ Agent: reviewer ↑ Agent: tester ``` +### Auto-advance (добавлено 21.05) + +| Триггер | Действие | +|---------|----------| +| 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) + +| Событие | Действие в 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` для маппинга | + ### Данные в БД (на 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 @@ -136,7 +159,7 @@ services: network_mode: host volumes: - ./data:/app/data - - /home/slin/repos:/repos # ← БЕЗ :ro (исправлено 21.05) + - /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 @@ -185,15 +208,20 @@ services: | URL | `https://plane.mva154.duckdns.org` | | Workspace | `ag_proj` | | Проект | "Enduro Trails" (identifier: ET) | -| Issues | ET-1 (POI checkbox) — Todo | -| Webhook → Orchestrator | ✅ Через PostgreSQL (HMAC-SHA256) | +| 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) | -### Что НЕ сделано в Plane +### States в Plane -- ❌ Автоматическое обновление state из Orchestrator (F3-5, F3-6) -- ❌ Custom fields (qg_status, stage) -- ❌ Лейблы (stage:*, back-to:*, escalation:*) -- ❌ Шаблон Work Item +| ID | Name | Group | +|----|------|-------| +| `113b24f6-...` | Backlog | backlog | +| `2c7d3df3-...` | Todo | unstarted | +| `b873d9eb-...` | In Progress | started | +| `381a2833-...` | Done | completed | +| `b1cae7f9-...` | Cancelled | cancelled | --- @@ -208,32 +236,22 @@ services: | ET-001 | Исключить шлагбаумы и тротуары из OSRM | ✅ Done (ручной цикл) | | ET-002 | Чекбокс POI в попапе рельефа | ✅ Done (автоматический цикл!) | -### Git history (main после merge) - -``` -Merge PR #5: feat(ET-002) POI visibility checkbox in terrain popup -832099c docs: restructure phases -f561c3b fix: switchMapStyle loads style as JSON -fdc9836 Merge PR #4: restore UI phase 5.4 + ET-001 -``` - --- ## Следующие шаги (приоритет) -### Критические баги для фикса +### Оставшиеся баги -1. **Установить git в контейнер orchestrator** — добавить в Dockerfile -2. **Фикс permissions** — агенты должны коммитить от user `slin` (не root) -3. **Привязать task_id к agent_runs** — launcher должен передавать task_id -4. **Автоматический CI → stage advance** — без ручного `:approved:` webhook +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. -### Улучшения +### Улучшения для полной автономности -5. **Plane sync** — Orchestrator пишет обратно в Plane (state, comments) -6. **Timeout для агентов** — убивать если > 30 мин -7. **Skip docker build для frontend-only** — определять scope по diff -8. **Notifications** — отправлять статус в Telegram при смене stage +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) --- @@ -255,4 +273,6 @@ fdc9836 Merge PR #4: restore UI phase 5.4 + ET-001 | `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 (выполнено) |