From 3de37e615e02fa9994582f3b2a1326ac04fa2a2f Mon Sep 17 00:00:00 2001 From: Stream Date: Mon, 1 Jun 2026 11:20:01 +0300 Subject: [PATCH] auto-sync: 2026-06-01 11:20:01 --- tasks/multi-agent/ORCHESTRATOR_DOCS.md | 151 ++++++++++++++++++++++- tasks/multi-agent/PROPOSAL_VS_REALITY.md | 103 +++++++++------- 2 files changed, 203 insertions(+), 51 deletions(-) diff --git a/tasks/multi-agent/ORCHESTRATOR_DOCS.md b/tasks/multi-agent/ORCHESTRATOR_DOCS.md index 2372d90..2f15579 100644 --- a/tasks/multi-agent/ORCHESTRATOR_DOCS.md +++ b/tasks/multi-agent/ORCHESTRATOR_DOCS.md @@ -65,6 +65,7 @@ created → analysis → architecture → development → review → testing → | QG | Функция | Что проверяет | |----|---------|---------------| +| QG-0 | Валидация при создании Issue | title 5-80 chars, description ≥2 предложений | | check_analysis_approved | `:approved:` в комментарии Plane от стейкхолдера | Человеческое подтверждение ТЗ | | check_architecture_done | Наличие ADR файлов в `docs/work-items//06-adr/` | Архитектура задокументирована | | check_ci_green | Gitea commit status API | CI pipeline зелёный | @@ -73,6 +74,67 @@ created → analysis → architecture → development → review → testing → --- +## Plane Integration (полная) + +### Статусы Issue + +| Статус | ID | Когда | Что значит для Славы | +|--------|-----|-------|---------------------| +| **Backlog** | `113b24f6...` | Создан, ещё не взят | Ничего не происходит | +| **Todo** | `2c7d3df3...` | Прошёл QG-0, ждёт запуска | Скоро начнётся | +| **In Progress** | `b873d9eb...` | Агент работает | Система работает, ждать | +| **Needs Input** | `babf08a3...` | Analyst задал вопросы | **Слава, ответь в комментарии** | +| **In Review** | `38fb1f64...` | ТЗ готово, ждёт approve | **Слава, прочитай и `:approved:` / `:rejected:`** | +| **Blocked** | `6c4543f9...` | Ошибка / retry исчерпаны | **Нужно ручное вмешательство** | +| **Done** | `381a2833...` | Всё задеплоено | Готово | +| **Cancelled** | `b1cae7f9...` | Отменена | — | + +### Переходы статусов + +``` +Backlog → [QG-0 pass] → In Progress (analyst запущен) +In Progress → [analyst questions] → Needs Input +Needs Input → [Слава ответил] → In Progress (analyst перезапущен) +In Progress → [analyst done] → In Review (ждёт :approved:) +In Review → [:approved:] → In Progress (architect запущен) +In Review → [:rejected:] → In Progress (analyst перезапущен с причиной) +In Progress → [все этапы до done] → Done +In Progress → [3 retry исчерпаны / deploy fail] → Blocked +``` + +### Комментарии в Plane + +Orchestrator автоматически пишет комментарии при: +- Каждом переходе stage (с ссылками на branch и PR) +- QG failure (что не прошло и почему) +- Запуске агента +- Вопросах analyst'а (текст вопросов) +- Ошибках (deploy fail, retry exhausted) +- Завершении задачи + +### Ссылки в комментариях + +При переходах stage комментарий содержит: +- 📂 Branch: ссылка на ветку в Gitea +- 🔗 PR: ссылка на Pull Request (если есть, на этапах review/testing/deploy) + +### Webhook events + +| Event | Действие | +|-------|----------| +| `work_item.created` / `issue.created` | QG-0 → create branch → init docs → launch analyst | +| `comment.created` / `issue_comment.created` | Проверка `:approved:` / `:rejected:` / ответ на вопросы | + +### QG-0: Валидация при создании Issue + +При создании Issue в Plane, orchestrator проверяет: +- Title: 5-80 символов +- Description: ≥2 предложений + +Если не проходит → Issue переходит в **Blocked** + комментарий с описанием что исправить. + +--- + ## Механизмы автономности ### Auto-advance @@ -85,14 +147,79 @@ created → analysis → architecture → development → review → testing → ### Auto-PR После developer push, `_ensure_pr()` автоматически создаёт PR в Gitea. +### Auto-init +При создании Issue в Plane → webhook → QG-0 → branch → docs → analyst. +Слава просто создаёт Issue — всё остальное автоматически. + ### Retry (developer) При `REQUEST_CHANGES` от reviewer'а — developer перезапускается (до 3 раз). +### Retry (tester fail) +При FAIL тестов — developer перезапускается для фикса (до 3 раз). +После 3 неудач → Issue переходит в **Blocked**. + +### Analyst questions +Analyst может создать `01-questions.md` → Issue переходит в **Needs Input**. +Слава отвечает комментарием → analyst перезапускается с ответами (до 3 раундов). + ### Notifications Telegram уведомления на каждом переходе stage + при ошибках. --- +## Сценарии работы + +### 🟢 Позитивный (happy path) + +1. Слава создаёт Issue в Plane: "Добавить фильтр по высоте" +2. QG-0 ✓ → branch `feature/ET-012-filter-altitude` → analyst запущен +3. Analyst пишет BRD/ТЗ/AC/TestPlan → Issue → **In Review** +4. Слава читает, пишет `:approved:` → Issue → **In Progress** +5. Architect → ADR → auto-advance +6. Developer → код + тесты → PR → auto-advance +7. Reviewer → APPROVED → auto-advance +8. Tester → PASS → auto-advance +9. Deployer → merge → tag → deploy → smoke ✓ → Issue → **Done** +10. Telegram: "🎉 ET-012: задача завершена!" + +### 🟡 Analyst задаёт вопросы + +1. Analyst не понимает требования → создаёт `01-questions.md` +2. Issue → **Needs Input** + Telegram: "❓ ET-012: Analyst задаёт вопросы" +3. Слава отвечает комментарием в Plane +4. Orchestrator ловит комментарий → Issue → **In Progress** → analyst перезапущен +5. Analyst учитывает ответы → пишет ТЗ → Issue → **In Review** +6. (Максимум 3 раунда вопросов, потом → **Blocked**) + +### 🟡 Слава отклоняет ТЗ + +1. Issue в **In Review**, Слава пишет `:rejected: Не учтены мобильные устройства` +2. Issue → **In Progress** → analyst перезапущен с причиной отклонения +3. Analyst исправляет → Issue → **In Review** (повторно) + +### 🔴 Tester находит баги + +1. Tester прогоняет тесты → FAIL в `13-test-report.md` +2. Issue остаётся **In Progress** → developer перезапущен для фикса +3. Developer фиксит → reviewer → tester (повторно) +4. Если 3 попытки developer'а не помогли → Issue → **Blocked** +5. Telegram: "🚨 ET-012: Tests still failing after 3 retries" + +### 🔴 Deploy fail + +1. Deployer мержит PR, деплоит, smoke test FAIL +2. Deployer откатывает к предыдущему тегу +3. Issue → **Blocked** +4. Telegram: "🚨 ET-012: Deploy failed! Rolled back." + +### 🔴 Architect conflict + +1. Architect находит конфликт с ТЗ → создаёт `10-conflict.md` +2. Issue → **In Progress** → analyst перезапущен с описанием конфликта +3. Analyst пересматривает ТЗ → Issue → **In Review** (повторно) + +--- + ## Файловая структура ``` @@ -100,16 +227,16 @@ Telegram уведомления на каждом переходе stage + пр ├── src/ │ ├── main.py # FastAPI app │ ├── config.py # Settings (env vars) -│ ├── db.py # SQLite (tasks, agent_runs) +│ ├── db.py # SQLite (tasks, agent_runs, events) │ ├── stages.py # STAGE_TRANSITIONS -│ ├── notifications.py # Telegram + Plane comments -│ ├── plane_sync.py # Plane API integration +│ ├── notifications.py # Telegram notifications +│ ├── plane_sync.py # Plane API (states, comments, links) │ ├── agents/ -│ │ ├── launcher.py # AgentLauncher (AGENT_CONFIGS, launch, monitor) +│ │ ├── launcher.py # AgentLauncher (launch, monitor, retry, advance) │ │ └── __init__.py │ ├── webhooks/ │ │ ├── gitea.py # Push, PR, CI status handlers -│ │ ├── plane.py # Comment handlers (:approved:) +│ │ ├── plane.py # work_item.created, comment handlers │ │ └── __init__.py │ └── qg/ │ ├── checks.py # QG check functions @@ -126,6 +253,7 @@ Telegram уведомления на каждом переходе stage + пр - **Host:** mva154 (82.22.50.71) - **Container:** `orchestrator` (port 8500) - **Gitea:** localhost:3000 (в docker network) +- **Plane:** localhost:8091 (в docker network) - **Repos:** `/home/slin/repos/orchestrator`, `/repos/enduro-trails` (в контейнере) - **DB:** SQLite (`/app/data/orchestrator.db`) - **Logs:** `/app/data/logs/` (per-agent run logs) @@ -137,12 +265,15 @@ Telegram уведомления на каждом переходе stage + пр **`:approved:` после analyst'а** — Слава подтверждает ТЗ в Plane. Всё остальное — полностью автономно: +- auto-init при создании Issue - architect запускается автоматически после approve - developer → после architecture done - reviewer → после CI green - tester → после review approved - deployer → после tests passed - done → после deploy success +- retry при ошибках (до 3 раз) +- rollback при deploy fail --- @@ -156,6 +287,7 @@ Telegram уведомления на каждом переходе stage + пр - Один environment (test), нет prod - Нет budget tracking - Все агенты на Sonnet (proposal: Architect/Reviewer на Opus) +- Нет Plane подзадач (7 subtasks) — один Issue, этапы в orchestrator DB --- @@ -169,3 +301,12 @@ Telegram уведомления на каждом переходе stage + пр | 2026-05-31 | Add: REQUEST_CHANGES retry logic (3 attempts) | | 2026-06-01 | Add: **deployer agent** (merge → tag → deploy → smoke → rollback) | | 2026-06-01 | Remove: `_auto_merge_pr` hardcode from `_try_advance_stage` | +| 2026-06-01 | Add: **Plane states** — Needs Input, In Review, Blocked | +| 2026-06-01 | Add: **Analyst questions flow** (01-questions.md → Needs Input → relaunch) | +| 2026-06-01 | Add: **:rejected: handler** с причиной + relaunch | +| 2026-06-01 | Add: **Tester FAIL → developer retry** (до 3 раз → Blocked) | +| 2026-06-01 | Add: **Deploy FAIL → Blocked** + rollback | +| 2026-06-01 | Add: **Architect conflict** (10-conflict.md → rollback to analysis) | +| 2026-06-01 | Add: **QG-0** валидация при создании Issue | +| 2026-06-01 | Add: **Ссылки в комментариях** (branch + PR URLs) | +| 2026-06-01 | Add: **Max 3 question rounds** для analyst | diff --git a/tasks/multi-agent/PROPOSAL_VS_REALITY.md b/tasks/multi-agent/PROPOSAL_VS_REALITY.md index 24e5eca..9803b58 100644 --- a/tasks/multi-agent/PROPOSAL_VS_REALITY.md +++ b/tasks/multi-agent/PROPOSAL_VS_REALITY.md @@ -1,63 +1,74 @@ # Сводная таблица расхождений: Proposal v1 vs Реализация -## Статус: 2026-06-01 +## Статус: 2026-06-01 (обновлено после полной интеграции Plane) -| # | Аспект | Proposal v1 | Реализация (факт) | Критичность | Что делать | -|---|--------|-------------|-------------------|-------------|------------| +| # | Аспект | Proposal v1 | Реализация (факт) | Критичность | Статус | +|---|--------|-------------|-------------------|-------------|--------| | **АГЕНТЫ** ||||| -| 1 | Deployer | Полноценный агент: merge → tag → deploy test → smoke → deploy prod → healthcheck 5 min → rollback | Хардкод `_auto_merge_pr()` в `_try_advance_stage`. `deployer.md` есть в репо, но не в `AGENT_CONFIGS` и `stages.py` | 🔴 HIGH | Добавить deployer в AGENT_CONFIGS + stages.py, убрать хардкод | -| 2 | Designer | Отдельный агент между Architect и Developer (макеты, states, a11y) | Не реализован. Этап пропускается | 🟡 MED | Пока skip (ui_affected=false для большинства задач). Добавить когда будет UI-heavy задача | -| 3 | Модели агентов | Analyst: Sonnet, Architect: Opus, Designer: Opus, Developer: Sonnet/GLM, Reviewer: Opus, Tester: Sonnet, Deployer: Sonnet | Все на `claude-sonnet-4-6` (из system prompt) | 🟡 MED | Поднять Architect и Reviewer на Opus (proposal обосновывает: ошибка архитектора/ревьюера дороже) | +| 1 | Deployer | Полноценный агент: merge → tag → deploy → smoke → rollback | ✅ Deployer в AGENT_CONFIGS + stages.py. Prompt: merge → tag → deploy → healthcheck → smoke → rollback | ✅ DONE | Реализовано 01.06 | +| 2 | Designer | Отдельный агент между Architect и Developer (макеты, states, a11y) | Не реализован. Этап пропускается | 🟢 LOW | Skip (ui_affected=false). Добавить при UI-heavy задаче | +| 3 | Модели агентов | Analyst: Sonnet, Architect: Opus, Developer: Sonnet/GLM, Reviewer: Opus, Tester: Sonnet | Все на `claude-sonnet-4-6` | 🟡 MED | TODO: Architect/Reviewer на Opus | | **QUALITY GATES** ||||| -| 4 | QG-0 (Inception→Analysis) | Валидация Work Item: title 5-80 chars, description ≥3 предложений, priority, project | Нет. Задача создаётся вручную в БД orchestrator'а | 🟡 MED | Реализовать webhook `work_item.created` → QG-0 → auto-init | -| 5 | QG-1 (Analysis→Architecture) | `lint-spec.sh` + `lint-test-plan.sh` + `req-coverage.py` + `:approved:` reaction | Только проверка файлов + `:approved:` в комментарии | 🟢 LOW | Добавить lint-скрипты (формальная валидация YAML/MD) | -| 6 | QG-2 (Architecture→Development) | `lint-adr.sh` + req-coverage (каждый REQ покрыт ADR) | Только `check_architecture_done` (файлы существуют) | 🟢 LOW | Добавить lint-adr | -| 7 | QG-4 (Development→Review) | CI: lint+type+unit+integration+build+coverage | `check_ci_green` через Gitea API (CI настроен) | ✅ OK | Работает | -| 8 | QG-5 (Review→Testing) | Gitea PR review APPROVED + 0 unresolved | `check_reviewer_verdict` — читает `12-review.md` | 🟡 MED | Proposal предполагает PR review через Forge API. Реализация — через файл. Оба подхода рабочие, но proposal точнее | -| 9 | QG-6 (Testing→Deploy) | CI на preview: e2e + visual + a11y + perf | `check_tests_passed` — наличие `13-test-report.md` с "PASS" | 🟡 MED | Нет Playwright/e2e. Tester прогоняет unit-тесты и пишет отчёт | -| 10 | QG-7 (Deploy test→prod) | smoke + healthcheck + user `:approved:` | Нет. Один merge в main = deploy | 🟡 MED | Deployer должен делать smoke после deploy | -| 11 | QG-final | uptime 10min + user `:final-approved:` | Нет | 🟢 LOW | Добавить в deployer | +| 4 | QG-0 (Inception→Analysis) | Валидация: title 5-80, description ≥3 предложений, priority | ✅ Валидация title 5-80, description ≥2 предложений. При fail → Blocked + комментарий | ✅ DONE | Реализовано 01.06 | +| 5 | QG-1 (Analysis→Architecture) | `lint-spec.sh` + `lint-test-plan.sh` + `:approved:` | Проверка файлов + `:approved:` + In Review статус | 🟢 LOW | Lint-скрипты — backlog | +| 6 | QG-2 (Architecture→Development) | `lint-adr.sh` + req-coverage | `check_architecture_done` (файлы существуют) + conflict detection | 🟢 LOW | Lint — backlog | +| 7 | QG-4 (Development→Review) | CI: lint+type+unit+integration+build+coverage | `check_ci_green` через Gitea API | ✅ OK | Работает | +| 8 | QG-5 (Review→Testing) | Gitea PR review APPROVED + 0 unresolved | `check_reviewer_verdict` — читает `12-review.md` | 🟢 LOW | Оба подхода рабочие | +| 9 | QG-6 (Testing→Deploy) | CI на preview: e2e + visual + a11y + perf | `check_tests_passed` — `13-test-report.md` с "PASS" | 🟡 MED | Нет Playwright/e2e | +| 10 | QG-7 (Deploy test→prod) | smoke + healthcheck + user `:approved:` | ✅ Deployer делает smoke + healthcheck. При fail → Blocked + rollback | ✅ DONE | Реализовано 01.06 | +| 11 | QG-final | uptime 10min + user `:final-approved:` | Нет | 🟢 LOW | Backlog | | **GIT WORKFLOW** ||||| -| 12 | Ветки | `feature/-` | `feature/ET-007-et-005` (используется plane sequence_id) | ✅ OK | Близко к proposal | -| 13 | PR creation | Developer открывает PR через Forge MCP | `_ensure_pr()` в monitor thread после developer push | ✅ OK | Работает (добавлено сегодня) | -| 14 | PR merge | Deployer мержит после QG-6 | `_auto_merge_pr()` хардкод | 🔴 HIGH | Перенести в deployer agent | -| 15 | Tags/semver | Deployer создаёт tag `vX.Y.Z` по conventional commits | Нет тегов | 🟡 MED | Добавить в deployer | +| 12 | Ветки | `feature/-` | `feature/ET-NNN-` | ✅ OK | Работает | +| 13 | PR creation | Developer открывает PR через Forge MCP | `_ensure_pr()` после developer push | ✅ OK | Работает | +| 14 | PR merge | Deployer мержит после QG-6 | ✅ Deployer agent мержит PR | ✅ DONE | Реализовано 01.06 | +| 15 | Tags/semver | Deployer создаёт tag `vX.Y.Z` | ✅ В deployer prompt (semver patch) | ✅ DONE | В prompt deployer'а | | 16 | Conventional commits | `feat(scope): описание` + `Refs: PROJ-NNN` | Частично (developer делает `feat(web): ...`) | 🟢 LOW | Добавить lint в CI | | **PLANE INTEGRATION** ||||| -| 17 | Подзадачи (7 subtasks) | Auto-create 7 подзадач при создании Feature | Нет. Одна задача, этапы в orchestrator DB | 🟡 MED | Proposal предполагает Plane как витрину. Можно добавить позже | -| 18 | Статусы подзадач | To Do → In Progress → Awaiting Approval → Done → Blocked | Только комментарии + issue state (Backlog/Todo/InProgress/Done) | 🟡 MED | Расширить plane_sync | -| 19 | Custom fields | `stage`, `agent_running`, `branch`, `pr_url` | Нет custom fields. Данные в orchestrator DB | 🟢 LOW | Nice-to-have | -| 20 | Webhook events | `work_item.created`, `comment.created`, `work_item.updated` | Только `issue_comment` (для `:approved:`) | 🟡 MED | Добавить `work_item.created` для auto-init | +| 17 | Подзадачи (7 subtasks) | Auto-create 7 подзадач при создании Feature | Нет. Одна задача, этапы через статусы + комментарии | 🟢 LOW | Backlog (статусы покрывают потребность) | +| 18 | Статусы | To Do → In Progress → Awaiting Approval → Done → Blocked | ✅ Backlog → Todo → In Progress → Needs Input → In Review → Blocked → Done | ✅ DONE | Реализовано 01.06 | +| 19 | Custom fields | `stage`, `agent_running`, `branch`, `pr_url` | Нет custom fields. Ссылки в комментариях | 🟢 LOW | Nice-to-have | +| 20 | Webhook events | `work_item.created`, `comment.created` | ✅ `work_item.created` (auto-init + QG-0) + `comment.created` (approve/reject/answer) | ✅ DONE | Реализовано 01.06 | +| 21 | Ссылки в комментариях | Branch URL, PR URL, артефакты | ✅ Branch + PR ссылки при переходах stage | ✅ DONE | Реализовано 01.06 | | **ORCHESTRATOR** ||||| -| 21 | Event journal (DB) | Postgres с полным журналом событий | SQLite с tasks + agent_runs | 🟢 LOW | SQLite достаточен для текущего масштаба | -| 22 | Idempotency | Повторный webhook → тот же результат | Частично (дубли комментариев возможны) | 🟡 MED | Добавить event dedup | -| 23 | Budget/kill-switch | `.openclaw/budget.yaml` с лимитами на агента | Только timeout watchdog | 🟡 MED | Добавить budget tracking | -| 24 | Retry/escalation | 3 retry developer, escalation в Plane | 3 retry developer (реализовано сегодня). Escalation — только Telegram | ✅ OK | Работает | +| 22 | Event journal (DB) | Postgres с полным журналом | SQLite с tasks + agent_runs + events | 🟢 LOW | SQLite достаточен | +| 23 | Idempotency | Повторный webhook → тот же результат | Частично (дубли комментариев возможны) | 🟡 MED | TODO: event dedup | +| 24 | Budget/kill-switch | `.openclaw/budget.yaml` | Только timeout watchdog (30 min) | 🟡 MED | TODO | +| 25 | Retry/escalation | 3 retry developer, escalation | ✅ 3 retry developer + tester fail → developer retry + Blocked при исчерпании | ✅ DONE | Реализовано 01.06 | +| 26 | Analyst questions | Analyst задаёт вопросы → ждёт ответа | ✅ 01-questions.md → Needs Input → relaunch (до 3 раундов) | ✅ DONE | Реализовано 01.06 | +| 27 | :rejected: с причиной | Откат + relaunch с контекстом | ✅ Парсинг причины + relaunch analyst/rollback | ✅ DONE | Реализовано 01.06 | | **DEPLOY** ||||| -| 25 | Environments | test + prod (два этапа) | Один merge в main. Нет отдельного test/prod | 🟡 MED | Deployer должен различать test/prod | -| 26 | Rollback | Deployer откатывает при failed smoke | Нет rollback | 🟡 MED | Добавить в deployer | -| 27 | CHANGELOG.md | Deployer обновляет при merge | Нет | 🟢 LOW | Добавить в deployer | +| 28 | Environments | test + prod (два этапа) | Один merge в main = deploy | 🟡 MED | TODO: test/prod split | +| 29 | Rollback | Deployer откатывает при failed smoke | ✅ Deploy fail → Blocked + rollback + notification | ✅ DONE | Реализовано 01.06 | +| 30 | CHANGELOG.md | Deployer обновляет при merge | В deployer prompt (инструкция есть) | ✅ DONE | В prompt | | **MONITORING** ||||| -| 28 | Telegram notifications | Детерминированные от скрипта | ✅ Реализовано (send_telegram в notifications.py) | ✅ OK | Работает | -| 29 | Plane comments | На каждом переходе + при ошибках | Частично (не все переходы) | 🟢 LOW | Расширить | -| 30 | Метрики (время/стоимость) | Дашборд: время на этап, стоимость, retry rate | Нет | 🟢 LOW | Добавить позже | +| 31 | Telegram notifications | На каждом переходе + ошибках | ✅ Реализовано | ✅ OK | Работает | +| 32 | Plane comments | На каждом переходе + ошибках + ссылки | ✅ Реализовано | ✅ DONE | Реализовано 01.06 | +| 33 | Метрики (время/стоимость) | Дашборд | Нет | 🟢 LOW | Backlog | --- -## Приоритеты реализации +## Итого -### 🔴 Немедленно (блокирует автономность) -1. **Deployer как агент** — убрать хардкод, добавить в AGENT_CONFIGS + stages.py +- **✅ DONE:** 18 из 33 пунктов (55%) +- **🟡 MED (TODO):** 6 пунктов +- **🟢 LOW (Backlog):** 9 пунктов -### 🟡 Следующая итерация (улучшает качество) -2. Модели: Architect/Reviewer на Opus -3. QG-0: auto-init при создании Work Item в Plane -4. Deployer: smoke test + rollback + tag + CHANGELOG -5. Budget tracking +### Оставшиеся TODO (🟡) -### 🟢 Backlog (nice-to-have) -6. Designer agent -7. Lint-скрипты для QG-1/QG-2 -8. Plane подзадачи (7 subtasks) -9. Метрики/дашборд -10. E2E тесты (Playwright) +| # | Что | Приоритет | +|---|-----|-----------| +| 3 | Architect/Reviewer на Opus | Следующая итерация | +| 9 | E2E тесты (Playwright) | Когда будет UI-heavy задача | +| 23 | Event dedup (idempotency) | Следующая итерация | +| 24 | Budget tracking | Следующая итерация | +| 28 | Test/prod environments | Когда будет prod | + +### Backlog (🟢) + +- Designer agent +- Lint-скрипты для QG +- Plane подзадачи (7 subtasks) +- Custom fields в Plane +- Метрики/дашборд +- QG-final (uptime 10min) +- Conventional commits lint