# Статус проекта: Мультиагентная разработка ПО **Дата обновления:** 2026-06-04 10:35 UTC **Ревьюер:** Стрим --- ## 📌 Свежее (2026-06-04) — observability, живой ТГ-трекер, баги на боевом ET-013 | Работа | Статус | |--------|--------| | **PR #20** observability: токены (input+cache_read+cache_creation, `15.1M in`), merge-gate `current_stage==deploy`, Plane→Done (`set_issue_done`), артефакты от всех агентов | 🟢 смержен (`2801983d`), на проде | | **PR #21** живой Telegram-трекер B+ (одно editMessageText-сообщение, умные пинги только на алерты) | 🟢 смержен (`3e5c74ce`), на проде | | **PR #22** фикс трекера: дубли (`not modified`=успех, send только при `gone`) + `🔄 Review · попытка N` | 🟢 смержен (`b222d7af`), на проде | | **PR #23** фикс деплой-гейта (ложный FAILED, рассинхрон путей `14-deploy-log.md`; fallback на `origin/main`) | 🟢 смержен (`34894f46`), на проде | | **PR #24** фикс гейта тестов: `check_tests_passed` читал substring "PASS" вместо машинного вердикта → BLOCKED-задачи уезжали в Done | 🟢 смержен (`83f5020f`), на проде | | **ET-8 переоткрыта** (фича НЕ работает на проде — нет тайлов hillshade z8-z9) → Backlog | 🔴 в работе (нужна генерация тайлов) | | **Доска ET** (5 Done + ET-4 Cancelled + ET-8 Backlog + ET-9 Done) | 🟢 синхронизирована | **Детали:** `🐛 Известные баги` ниже + `memory/2026-06-04.md` + reports `dev-2026-06-04-*`. --- ## 🐛 Известные баги (живой трекер + деплой + гейт тестов, 2026-06-04) ### ✅ Баг C — гейт тестов пропускал BLOCKED (substring "PASS", ИСПРАВЛЕН PR #24) - **Симптом:** ET-8/ET-013 «по-прежнему мелко» на проде — недоделанная фича уехала в Done. - **Корень:** `check_tests_passed` (qg/checks.py:139) делал `if "PASS" in content`. Тестер выставил `verdict: BLOCKED` / `status: blocked` (провал P1 AC-19: нет hillshade z9), но в теле отчёта были слова «23 passed» / «✅ PASS» → substring нашёлся → True → deploy → Done. Подрывал автономность: любой BLOCKED-отчёт со словом PASS проезжал до прода. - **Фикс (PR #24, `83f5020f`):** `check_tests_passed` читает машинный `verdict:`/`status:` из frontmatter (зеркало check_reviewer_verdict / check_deploy_status). Набор токенов (вердикты тестера неединообразны по истории): negative (BLOCKED/FAILED/FAIL/REQUEST_CHANGES/REJECT/RED) — authoritative, перебивают positive (PASS/PASSED/READY-TO-DEPLOY/GREEN/APPROVED). 285 passed / 9 off-limits. ET-013 → False (BLOCKED), все 9 прошедших WI → True. ### ✅ Баг A — трекер плодит дубли сообщений (ИСПРАВЛЕН, PR #22) - **Симптом:** вместо одного редактируемого сообщения — новые на каждом цикле. На ET-013: 21 editMessageText / 7 sendMessage = 7 дублей. - **Корень:** `edit_telegram` (src/notifications.py) возвращал `False` на ЛЮБОМ 400, включая Telegram-ответ `"message is not modified"` (текст трекера не менялся). `update_task_tracker` трактовал False как «edit упал» → новое сообщение + перезапись tracker_message_id (старый трекер осиротевал, отставал). - **Фикс (PR #22, `b222d7af`):** `edit_telegram` → `ok|not_modified|gone|failed`. Новое сообщение ТОЛЬКО при `gone`. `render_task_tracker` показывает `🔄 Review · попытка N` на повторных циклах. 272 passed / 9 off-limits. ### ✅ Баг B — ложный FAILED деплоя (РАССИНХРОН ПУТЕЙ, ИСПРАВЛЕН PR #23) - **Симптом:** ET-013 РЕАЛЬНО задеплоен (тег v0.0.5, deploy-hook RC=0, healthcheck 200, фича живая), но QG завернул в FAILED → откат deploy→development. - **Корень:** deployer пишет `14-deploy-log.md` (deploy_status: SUCCESS) и мержит артефакты в **main** через отдельный PR (#27). А QG `check_deploy_status` (src/qg/checks.py ~284) читает этот файл через `_repo_path(repo, branch)` из **worktree ветки фичи**, где его нет → «not found» → ложный FAILED. Бьёт по КАЖДОМУ успешному деплою. - **Важно:** merge-gate из PR #20 (`current_stage==deploy`) СРАБОТАЛ ПРАВИЛЬНО (без него был бы фейк-done) — НЕ трогать. - **Фикс (PR #23, `34894f46`, на проде):** новые `_deploy_log_from_main` + `_parse_deploy_status` в qg/checks.py. Порядок поиска: worktree → `git fetch origin main` + `git show origin/main:.../14-deploy-log.md` на shared-клоне → not found. Любая git-ошибка → деградация (None, не исключение), таймауты 30s/15s. 277 passed / 9 off-limits. merge-gate gitea.py НЕ тронут. - **ET-013 (=Plane ET-8)** доведена до Done вручную (код реально на проде) + коммент с объяснением. --- ## 📌 Предыдущее (2026-06-03) — сессия багов входа/выхода analyst | Работа | Статус | |--------|--------| | **PR #12** status-only verdict model (вердикт по статусу, не комменту; фикс Баг 3 эхо-самоудар) | 🟢 смержен, на проде | | **PR #13** Баги A/B/C: `description`→`.task.md`, `name`→ветка, коммент analyst + ссылки | 🟢 смержен, боевой прогон чистый | | **PR #14** `gitea_public_url` — внешние кликабельные ссылки в комментах | 🟢 смержен, env прописан на проде | | **PR #15** Баг 4 (блокер): Approved-вердикт двигает analysis→architecture | 🟢 смержен, боевой прогон ✅ | | 🎉 Конвейер analysis→architecture end-to-end через живой Approved | 🟢 впервые пройден на ET-011 (#6, task 29) | **Дальше:** architect отработал (ADR-014/015 + infra-req) → дождаться финала + QG architecture → Development. Проверить Rejected-путь живьём. **Детали:** `tasks/orchestrator/ORCHESTRATOR_DOCS.md` → раздел «🐛 Баги входа/выхода analyst» + `memory/2026-06-03.md`. ### Предыдущая сессия (2026-06-02) - ORCH-6 multi-repo (PR #2), ORCH-1 очередь (PR #3), Plane-webhook включён с HMAC+project-filter — всё на проде. Подробности: `PROGRESS_2026-06-02.md`. --- ## Общая зрелость | Фаза (из 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 избыточен | ## Баги входа/выхода analyst (03.06.2026) — PR #12–#15 Цепочка из 4 багов, вскрытых при переходе на status-only verdict и боевом прогоне ET-011 (#6, task 29). Полный разбор: `ORCHESTRATOR_DOCS.md`. | # | PR | Баг | Статус | |---|----|----|--------| | Баг 3 | #12 | Эхо-самоудар: собственный коммент analyst сбивал стадию → status-only verdict model | ✅ Смержен | | Баг A | #13 | `description` из Plane не попадал в `.task.md` (пустышка) | ✅ Смержен | | Баг B | #13 | `name` не дотягивался → ветка `untitled` | ✅ Смержен | | Баг C | #13 | Устаревший коммент «Жду :approved:» + нет ссылок на доки | ✅ Смержен | | — | #14 | Ссылки в комменте на `localhost:3000` (не кликались) → `gitea_public_url` | ✅ Смержен + env | | **Баг 4** | #15 | **БЛОКЕР:** ручной Approved не двигал конвейер (task застревал в analysis) → развёл `check_analysis_approved` по `finished_agent` | ✅ Смержен, боевой прогон ✅ | **Baseline тестов:** 210 passed + 9 pre-existing failed (test_webhooks.py, HMAC/401 — off-limits). --- ## Инфраструктура на 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 "" ``` - Тип: `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 (выполнено) |