5.0 KiB
5.0 KiB
Dev Report: Orchestrator Quality Gates + Auto-launch
Дата: 2026-05-21 Статус: DONE
Задача
Реализовать Quality Gates и автоматический запуск Claude CLI агентов в Orchestrator при наступлении событий (webhook от Plane/Gitea).
Сделано
-
Task 1: Исправить запуск Claude CLI (host vs container)
- Docker CLI установлен в контейнер
- docker.sock смонтирован для записи task-файлов
- Claude binary смонтирован напрямую (
/opt/claude-code/bin/claude.exe) .claudeи.claude.jsonсмонтированы для authnetwork_mode: hostдля доступа к Gitea/Plane через localhost- Проверено:
claude --print "say hello"работает из контейнера
-
Task 2: Реальные QG-проверки (
src/qg/checks.py)check_analysis_complete— проверяет 4 файла в docs/work-items/check_architecture_done— проверяет ADR или infra-requirementscheck_ci_green— Gitea API commit statuscheck_review_approved— Gitea API PR reviewscheck_tests_passed— наличие test-report.md с PASS
-
Task 3: Полная обработка Plane webhooks (
src/webhooks/plane.py)work_item.created→ генерация ID, создание task в БД, создание ветки в Gitea, создание initial docscomment.createdс:approved:→ QG check → advance stage → launch agentcomment.createdс:rejected:→ rollback stage
-
Task 4: Полная обработка Gitea webhooks (
src/webhooks/gitea.py)pushс ADR файлами при stage=architecture → advance to developmentstatussuccess при stage=development → advance to reviewpull_requestreviewed/approved → advance to testingpull_requestrequest_changes → back to development (max 3 retries)pull_requestclosed+merged → stage=done
-
Task 5: Stage machine + Notifications
src/stages.py— конечный автомат с transitions, agents, QG checkssrc/notifications.py— structured logging для stage changes, QG failures, errors
-
Task 6: Тесты (27 tests, all green)
tests/test_qg.py— 16 тестов для всех QG-функцийtests/test_webhooks.py— 11 тестов для webhook handlers
-
Task 7: Деплой + smoke test
- Container rebuilt and running
- Health check passes
- Webhook creates task + branch in Gitea
- QG correctly blocks advance when files missing
- QG passes and launches correct agent when files present
- Claude CLI produces output (13KB architect response)
Изменённые файлы
Dockerfile— добавлен Docker CLIdocker-compose.yml— network_mode: host, docker.sock, claude mountssrc/config.py— добавлены gitea_owner, default_repo, host_repos_dir, plane_project_idsrc/db.py— добавлены get_task_by_plane_id, get_task_by_repo_branch, update_task_stage, get_next_work_item_id, work_item_id columnsrc/main.py— добавлен logging configsrc/stages.py— НОВЫЙ: stage machinesrc/notifications.py— НОВЫЙ: structured loggingsrc/qg/checks.py— ПЕРЕПИСАН: реальные проверкиsrc/webhooks/plane.py— ПЕРЕПИСАН: полная обработкаsrc/webhooks/gitea.py— ПЕРЕПИСАН: полная обработкаsrc/agents/launcher.py— ПЕРЕПИСАН: запуск через mounted binary + docker run для task filestests/test_qg.py— НОВЫЙ: 16 тестовtests/test_webhooks.py— ПЕРЕПИСАН: 11 тестов
Результат
curl localhost:8500/health→{"status":"ok"}pytest tests/ -v→ 27 passed- Webhook
work_item.created→ task в БД + ветка в Gitea + initial docs :approved:при наличии файлов → stage advance + agent launch:approved:без файлов → QG failure logged, stage не меняется- Claude CLI запускается из контейнера, auth работает, output записывается
Проблемы и решения
- Claude CLI не в контейнере → mount binary + .claude dir напрямую
- Gitea недоступен из контейнера →
network_mode: host - OAuth token expired → mount .claude rw для auto-refresh
- DB schema mismatch → ALTER TABLE для work_item_id column
- Task file write (repos :ro) → docker run с stdin для записи
- Agent name bug →
get_agent_for_stage(current_stage)вместоnext_stage
Ограничения
- Repos mounted :ro — агенты не могут писать напрямую (пишут в stdout/log)
- Claude CLI auth зависит от refresh token — если истечёт, нужен ручной
claudeна хосте