Files
wiki/memory/2026-05-21.md
2026-05-22 13:50:01 +03:00

13 KiB
Raw Permalink Blame History

2026-05-21 — Мультиагентный пайплайн: первый полный автоматический прогон

🎉 MILESTONE: ET-002 прошёл полный автоматический цикл

Задача "Чекбокс POI в попапе рельефа" прошла весь пайплайн без ручного вмешательства в код:

analysis → architecture → development → review → testing → deploy → done

Хронология

  • 14:48 — Исправлен :ro mount → /repos теперь writable
  • 14:49 — Orchestrator пересобран, запущен Architect (run_id=4)
  • 14:54 — Architect завершён: ADR + infra-requirements, коммит af579f7
  • 14:55 — Stage: architecture → development, запущен Developer (run_id=5)
  • 15:51 — Developer закоммитил 8c17a4f feat(web): add POI visibility checkbox
  • 16:02 — CI green, stage: development → review, запущен Reviewer (run_id=6)
  • 16:13 — Reviewer вручную перезапущен (первый не стартовал после restart контейнера)
  • 16:17 — Reviewer завершён: APPROVED (0 P0/P1)
  • 16:22 — Исправлен QG check_review_approved (lookup PR по branch)
  • 16:24 — Stage: review → testing, запущен Tester (run_id=8)
  • 16:28 — Tester завершён: PASS (pytest 14/14, JS 7/7)
  • 16:30 — Stage: testing → deploy
  • 16:33 — PR #5 merged в main
  • 16:35 — Task 4: stage = done

Баги найденные и исправленные

  1. /repos:ro → убрал :ro
  2. check_review_approved не находил PR → добавлен lookup по branch + file-based fallback
  3. ⚠️ git не установлен в контейнере → агенты используют dulwich
  4. ⚠️ .git/objects owned by root → chown перед коммитами
  5. ⚠️ dismiss_stale_approvals ломает merge → временно отключал status check
  6. 🔴 task_id=NULL во всех agent_runs
  7. 🔴 Developer застрял на docker build 55 минут (frontend-only фича)

Что работает

  • Gitea webhooks → Orchestrator (push, status)
  • Plane webhooks → Orchestrator (:approved: comment → QG → advance)
  • Claude CLI запускается из контейнера (binary mount + HOME=/home/slin)
  • QG checks: filesystem (analysis, architecture, tests) + Gitea API (CI, PR reviews)
  • Stage machine: 8 стадий, автоматический переход при QG pass
  • Gitea Actions CI: lint + test + build (self-hosted runner)

Analyst

Проверила — уже полностью зарегистрирован:

  • agents.list[] (id=analyst, model=vibecode/claude-sonnet-4.6)
  • Telegram binding (account analyst)
  • Workspace /home/node/.openclaw/workspace-analyst/
  • Уже делал задачи (ET-002 артефакты)

Dev-агент: фикс критических багов (17:38-17:52)

Dev-агент (run 624ca711) выполнил все 5 фиксов:

  1. git уже был в Dockerfile
  2. GIT_AUTHOR_NAME/EMAIL = claude-bot в launcher.py
  3. task_id передаётся в launch() и записывается в БД
  4. Timeout watchdog (30 мин, kill -9)
  5. Auto-advance в gitea.py: CI green → review, PR approved → testing, back-to:dev при request_changes

Rebuild успешен: git v2.47.3 в контейнере, health OK.

Dev-агент: Plane sync (18:00-18:55)

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

  • Проект "Enduro Trails" (identifier: ET)
  • 1 issue: ET-1 "Добавить чекбокс POI" — status Todo
  • States: Backlog → Todo → In Progress → Done → Cancelled
  • Orchestrator пока НЕ пишет обратно в Plane (следующая фаза)

2026-05-21 — Мультиагентный пайплайн: первый полный автоматический прогон

🎉 MILESTONE: ET-002 прошёл полный автоматический цикл

Задача "Чекбокс POI в попапе рельефа" прошла весь пайплайн без ручного вмешательства в код:

analysis → architecture → development → review → testing → deploy → done

Хронология

  • 14:48 — Исправлен :ro mount → /repos теперь writable
  • 14:49 — Orchestrator пересобран, запущен Architect (run_id=4)
  • 14:54 — Architect завершён: ADR + infra-requirements, коммит af579f7
  • 14:55 — Stage: architecture → development, запущен Developer (run_id=5)
  • 15:51 — Developer закоммитил 8c17a4f feat(web): add POI visibility checkbox
  • 16:02 — CI green, stage: development → review, запущен Reviewer (run_id=6)
  • 16:13 — Reviewer вручную перезапущен (первый не стартовал после restart контейнера)
  • 16:17 — Reviewer завершён: APPROVED (0 P0/P1)
  • 16:22 — Исправлен QG check_review_approved (lookup PR по branch)
  • 16:24 — Stage: review → testing, запущен Tester (run_id=8)
  • 16:28 — Tester завершён: PASS (pytest 14/14, JS 7/7)
  • 16:30 — Stage: testing → deploy
  • 16:33 — PR #5 merged в main
  • 16:35 — Task 4: stage = done

Баги найденные и исправленные

  1. /repos:ro → убрал :ro
  2. check_review_approved не находил PR → добавлен lookup по branch + file-based fallback
  3. ⚠️ git не установлен в контейнере → агенты используют dulwich
  4. ⚠️ .git/objects owned by root → chown перед коммитами
  5. ⚠️ dismiss_stale_approvals ломает merge → временно отключал status check
  6. 🔴 task_id=NULL во всех agent_runs
  7. 🔴 Developer застрял на docker build 55 минут (frontend-only фича)

Что работает

  • Gitea webhooks → Orchestrator (push, status)
  • Plane webhooks → Orchestrator (:approved: comment → QG → advance)
  • Claude CLI запускается из контейнера (binary mount + HOME=/home/slin)
  • QG checks: filesystem (analysis, architecture, tests) + Gitea API (CI, PR reviews)
  • Stage machine: 8 стадий, автоматический переход при QG pass
  • Gitea Actions CI: lint + test + build (self-hosted runner)

Analyst

Проверила — уже полностью зарегистрирован:

  • agents.list[] (id=analyst, model=vibecode/claude-sonnet-4.6)
  • Telegram binding (account analyst)
  • Workspace /home/node/.openclaw/workspace-analyst/
  • Уже делал задачи (ET-002 артефакты)

Dev-агент: фикс критических багов (17:38-17:52)

Dev-агент (run 624ca711) выполнил все 5 фиксов:

  1. git уже был в Dockerfile
  2. GIT_AUTHOR_NAME/EMAIL = claude-bot в launcher.py
  3. task_id передаётся в launch() и записывается в БД
  4. Timeout watchdog (30 мин, kill -9)
  5. Auto-advance в gitea.py: CI green → review, PR approved → testing, back-to:dev при request_changes

Rebuild успешен: git v2.47.3 в контейнере, health OK.

Dev-агент: Plane sync (18:00-18:55)

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

  • Проект "Enduro Trails" (identifier: ET)
  • 1 issue: ET-1 "Добавить чекбокс POI" — status Todo
  • States: Backlog → Todo → In Progress → Done → Cancelled
  • Orchestrator пока НЕ пишет обратно в Plane (следующая фаза)

ET-005: Починка CI status webhook (18:55-19:55)

Проблема

CI status webhook от Gitea приходит с branches: [] в payload. handle_ci_status делала ранний return — не могла определить branch.

Решение (патч gitea.py)

  • Вместо раннего return при пустом branches — fallback через git branch -r --contains <sha>
  • Ищет ветку feature/* в output
  • Убран кастомный env={**os.environ, "HOME": "/home/slin"} — ломал gitconfig с safe.directory
  • Добавлен git config --global --add safe.directory '*' в контейнере

Результат

  • ET-005 продвинулась: developmentreview
  • Reviewer agent запущен (run_id=11)
  • Plane уведомлён (комментарий добавлен)

Баги исправленные

  1. branches: [] в payload → fallback через git branch -r --contains
  2. env={**os.environ, "HOME": "/home/slin"} ломал gitconfig → убран кастомный env
  3. safe.directory '*' нужен в контейнере (repo mount с другим owner)

Слава попросил запустить новую задачу для проверки конвейера (18:59)

  • Ожидаем завершения reviewer на ET-005, затем запуск новой задачи с нуля

ET-006: Полный автоматический цикл с review bounce (22:20 - 22 мая 06:45)

Задача

ET-006 — Загрузка и визуализация GPX-треков. Сложная фронтенд-фича (~2000 строк кода).

Хронология

  • 00:20 — Задача создана в Plane, webhook дошёл до orchestrator
  • 00:24 — Analyst запущен (вручную — баг: не запускался автоматически, пофиксила)
  • 00:33 — Analyst завершён, architecture запущен
  • 00:39 — Architect завершён, developer запущен
  • 01:02 — Developer завершён, CI green, reviewer запущен
  • 01:07 — Reviewer: REQUEST_CHANGES (P1: Math.min.apply RangeError на больших массивах)
  • 05:55 — Developer attempt 2 запущен (после фикса event routing)
  • 06:02 — Developer пофиксил P1 за 6 минут, CI green, reviewer v2 запущен
  • 06:05 — Reviewer v2: APPROVED
  • 06:20 — Tester запущен (Playwright e2e)
  • 06:45 — Tester завершён (25 мин), auto-advance testing → deploy
  • 10:35 — PR #7 merged, task → done

Баги orchestrator найденные и исправленные

  1. pull_request_rejected event type не роутился → добавлен в routing
  2. check_review_approved считал stale reviews → добавлен if review.get("stale"): continue
  3. Analyst не запускался при создании задачи → добавлен launcher.launch("analyst")
  4. ⚠️ Zombie processes после rebuild (monitor threads умирают)
  5. ⚠️ Plane sync 404 (неправильный issue ID маппинг)
  6. ⚠️ Stale reviews блокируют merge

Документация

  • docs/LESSONS_ET006.md — уроки и решения
  • docs/BUGFIXES_2026-05-21.md — багфиксы дня