Files
wiki/tasks/orchestrator/STATUS.md
2026-06-04 16:10:01 +03:00

21 KiB
Raw Permalink Blame History

Статус проекта: Мультиагентная разработка ПО

Дата обновления: 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_telegramok|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

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.

Улучшения для полной автономности

  1. Deploy stage — автоматический merge PR + deploy (сейчас ручной)
  2. Notifications в Telegram — отправлять Славе статус при смене stage
  3. Custom fields в Plane — qg_status, stage, tokens_spent
  4. Лейблы в Plane — stage:, back-to:, escalation:*
  5. Параллельные задачи — FIFO-очередь (F2-6 из BRD)

Доступ к mva154

Из OpenClaw контейнера:

/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 (выполнено)