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

355 lines
21 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Статус проекта: Мультиагентная разработка ПО
**Дата обновления:** 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 "<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 (выполнено) |