diff --git a/memory/2026-06-03.md b/memory/2026-06-03.md index a408996..1fbd480 100644 --- a/memory/2026-06-03.md +++ b/memory/2026-06-03.md @@ -346,3 +346,26 @@ PR #12 (status-only verdict, баг3 эхо-самоудар) → PR #13 (баг - HMAC webhook через curl/shell даёт 401 (подпись от raw body не сходится при shell-сериализации) — для боевых прогонов дёргать обработчики напрямую в python (docker exec orchestrator python3), а не через HTTP. ### Итог сессии 03.06: закрыто 6 багов (PR #12-#17), конвейер прошёл analysis→architecture→development end-to-end, дошёл до честного CI-гейта на качестве кода. + +--- + +## Баг 7 закрыт (03.06 ночь) — конвейер САМОВОССТАНАВЛИВАЕТСЯ на красном CI 🔥 + +### Баг 7 (PR #18, main a0621b9): красный CI на development не возвращал задачу developer'у +- **Дыра:** после бага 6 CI стал авторитетным гейтом, но handle_ci_status при failure делал ТОЛЬКО notify_qg_failure → конвейер вис, требовал ручного вмешательства. Слава прямо спросил «почему автономно не ушло на девелопера». +- **Корень:** retry developer'а был только на review request_changes (max 3x), на CI-failure ветки retry не было — побочка нашего же фикса бага 6 (достроили мост наполовину). +- **Фикс (по образцу review-retry):** src/webhooks/gitea.py CI-failure ветка ~стр.219 — после notify_qg_failure добавлен блок: retry_count = COUNT agent_runs developer; if < MAX_DEV_RETRIES(=3) → enqueue_job("developer", attempt N/3); else notify_error escalating. Отличия от review: задача УЖЕ в development (без update_task_stage), branch из переменной branch. Коммит `3a285de`. +- **Лимит:** общий MAX_DEV_RETRIES=3 по ВСЕМ agent_runs developer'а (review+CI вместе ≤3) — по требованию Славы «ограничить как на ревью». +- Тесты: 217 passed (215+2 pure-logic, вызов handle_ci_status напрямую с моками, не через TestClient → обход 401 HMAC baseline) + 10 baseline failed. + +### 🎯🔥 БОЕВОЙ прогон — САМОВОССТАНОВЛЕНИЕ РАБОТАЕТ +- Дёрнула CI-failure на ET-011 (task 29) → оркестратор АВТОНОМНО: увидел красный CI → check_ci_green failed → поставил developer'а в очередь (job 13) → запустил run_id=66 pid=45 (attempt 2/3). developer runs 1→2. +- Лог: `🚀 ET-011: developer запущен (run_id=66)`. Без единого ручного пинка. +- **developer run 66 пошёл чинить 10× E402 в src/api/main.py** (импорты не в шапке: shapely/typing/fastapi после кода на стр.20). Если починит → зелёный CI → development→review автономно. + +### Хвост на след. сессию: +- Следить за developer run 66: починит ли E402, перезапушит ли, станет ли CI зелёным, поедет ли конвейер в review. +- Если E402 — намеренный поздний импорт (после sys.path), developer может добавить noqa вместо перетасовки — оба варианта валидны. +- Лимит retry: после 3 попыток developer'а суммарно (review+CI) — эскалация Славе. + +### ИТОГ сессии 03.06: закрыто 7 БАГОВ (PR #12-#18). Конвейер: analysis→architecture→development end-to-end + честный CI-гейт + АВТОНОМНОЕ самовосстановление на красном CI с лимитом попыток. Боевая обкатка на ET-011. diff --git a/tasks/orchestrator/ORCHESTRATOR_DOCS.md b/tasks/orchestrator/ORCHESTRATOR_DOCS.md index 8ce685b..2e0e599 100644 --- a/tasks/orchestrator/ORCHESTRATOR_DOCS.md +++ b/tasks/orchestrator/ORCHESTRATOR_DOCS.md @@ -2,7 +2,7 @@ ## Статус: 2026-06-03 (актуально) -> **Свежее (03.06.2026):** переход на **status-only verdict model** (PR #12) — вердикт Славы теперь через **смену статуса** Issue (Approved/Rejected), а НЕ через коммент `:approved:`. Закрыты 4 бага входа/выхода analyst (PR #12–#15). Конвейер впервые прошёл analysis→architecture через живой Approved. Подробности — в разделах «Переходы статусов» и Changelog. +> **Свежее (03.06.2026):** переход на **status-only verdict model** (PR #12) — вердикт Славы теперь через **смену статуса** Issue (Approved/Rejected), а НЕ через коммент `:approved:`. Закрыты **7 багов** конвейера (PR #12–#18) при боевой обкатке на ET-011 (task 29). Конвейер впервые прошёл **analysis→architecture→development end-to-end** с одного Approved, дошёл до **честного CI-гейта** и получил **автономное самовосстановление** на красном CI (с лимитом попыток). Подробности — в разделах «Переходы статусов», «Механизмы автономности» и Changelog. --- @@ -27,8 +27,8 @@ created → analysis → architecture → development → review → testing → |-------|-------|-----------|------------| | analysis | analyst | — | BRD, ТЗ, AC, Test Plan | | architecture | architect | check_analysis_approved (`:approved:` от Славы) | ADR, архитектурные решения | -| development | developer | check_architecture_done (файлы ADR есть) | Код + тесты + PR | -| review | reviewer | check_ci_green (Gitea CI status) | Code review → 12-review.md | +| development | developer | check_architecture_done (файлы ADR есть) | Код + тесты + PR. **Выход гейтится `check_ci_green`** (PR #17): зелёный CI → review; красный CI → developer retry (PR #18, max 3) | +| review | reviewer | check_ci_green (Gitea CI status, выход development) | Code review → 12-review.md | | testing | tester | check_reviewer_verdict (APPROVED в 12-review.md) | Прогон тестов → 13-test-report.md | | deploy | deployer | check_tests_passed (PASS в 13-test-report.md) | Merge PR → tag → deploy → smoke | | done | — | — | Задача завершена | @@ -70,9 +70,10 @@ created → analysis → architecture → development → review → testing → | 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 зелёный | +| check_ci_green | Gitea commit status API | CI pipeline зелёный (гейт стадии **development**, PR #17) | | check_reviewer_verdict | Парсинг `12-review.md` → APPROVED/REQUEST_CHANGES | Код прошёл ревью | | check_tests_passed | Парсинг `13-test-report.md` → PASS/FAIL | Тесты пройдены | +| ~~check_tests_local~~ | ~~локальный pytest целевого репо~~ | **DEPRECATED (PR #17):** заменён `check_ci_green` на development. Остаётся в `QG_CHECKS` для совместимости, не wired ни к одной стадии | --- @@ -168,6 +169,15 @@ Orchestrator автоматически пишет комментарии при ### Retry (developer) При `REQUEST_CHANGES` от reviewer'а — developer перезапускается (до 3 раз). +Код: `src/webhooks/gitea.py` `handle_pr`, ветка `REQUEST_CHANGES`. + +### Retry (CI fail) — баг 7, PR #18 (03.06.2026) +При **красном Gitea CI** на стадии `development` конвейер не виснет, а **автономно возвращает задачу developer'у** на доработку — **симметрично** review-retry. +- Триггер: `handle_ci_status`, ветка `state == "failure" and current_stage == "development"`. +- Логика: `notify_qg_failure` (уведомить о провале) → если `retry_count < MAX_DEV_RETRIES` → `enqueue_job("developer", ..., "CI failed, fix and re-push (attempt N/3)")`; иначе → `notify_error` (escalate, ручное вмешательство). +- Задача УЖЕ в `development` → смены стадии нет (в отличие от review-retry, где был переход review→development). +- **Лимит общий:** `MAX_DEV_RETRIES = 3` считается по ВСЕМ `agent_runs` агента `developer` задачи → review-правки + CI-правки в сумме ≤ 3. После 3 попыток — эскалация. +- ✅ Проверено боевым прогоном на ET-011: красный CI → developer перезапущен (run 1→2, attempt 2/3) полностью автономно. ### Retry (tester fail) При FAIL тестов — developer перезапускается для фикса (до 3 раз). @@ -340,10 +350,29 @@ SSH ключ orchestrator'а: `/home/slin/.orchestrator-ssh/id_ed25519` (смо --- +## 🐛 Баги QG-гейта development — сессия 03.06.2026 (PR #16–#18) + +Продолжение боевой обкатки ET-011: конвейер дошёл до стадии `development`→`review` и вскрыл цепочку багов QG-гейта (спуск по слоям инфраструктуры: каждый фикс открывал следующий). Все подтверждены боевыми прогонами. + +| # | PR | Баг | Корень | Фикс | +|---|----|----|--------|------| +| **Баг 5** | **#16** | QG `check_tests_local` падал — `make` НЕТ в контейнере оркестратора | `check_tests_local` звал `["make","test"]`, но в контейнере только pytest, без make | прямой вызов `["python","-m","pytest","../../tests/","-v"]`, `cwd=/src/api` (1:1 с Makefile целью `test`). make в Dockerfile НЕ добавляли намеренно | +| **Баг 6** | **#17** | `check_tests_local` дублировал CI и гонял тесты enduro-trails в окружении оркестратора без зависимостей проекта (`ModuleNotFoundError: lxml/shapely/defusedxml`) | `check_tests_local` — легаси-затычка эпохи S-1 «Gitea CI не настроен → always false». CI теперь настроен (`.gitea/workflows/ci.yml`, гоняет в ПРАВИЛЬНОМ окружении с `pip install ".[dev]"`) → затычка устарела | QG стадии `development`: `check_tests_local` → `check_ci_green` (доверились CI). `check_tests_local` НЕ удалён — помечен DEPRECATED, остался в `QG_CHECKS`, не wired ни к одной стадии. CI-failure больше не подавляется → `notify_qg_failure` | +| **Баг 7** | **#18** | **ДЫРА:** красный CI на `development` НЕ возвращал задачу developer'у — конвейер вис, требовал ручного вмешательства | побочка фикса бага 6: CI стал авторитетным гейтом, но `handle_ci_status` при failure делал ТОЛЬКО `notify_qg_failure`. retry developer'а был только на review request_changes | добавлен retry developer'а на красный CI **симметрично** review: `retry_count < MAX_DEV_RETRIES(=3)` → `enqueue_job("developer", attempt N/3)`; иначе → escalate. Лимит **общий** (review+CI ≤ 3). Подробно — раздел «Retry (CI fail)» | + +**Итог:** после бага 7 конвейер **самовосстанавливается** на красном CI. Боевой прогон ET-011: красный CI (10× E402 — импорты не в шапке `src/api/main.py`) → developer автономно перезапущен (run 1→2, attempt 2/3). + +> **Важный принцип (из багов 5/6):** оркестратор **НЕ гоняет тесты целевых проектов в своём контейнере** — это делает Gitea CI в правильном окружении со всеми зависимостями. QG-гейт development доверяет CI-статусу (`check_ci_green`), а не локальному прогону. НЕ ставить lxml/shapely/defusedxml/make в Dockerfile оркестратора. + +--- + ## Changelog | Дата | Изменение | |------|-----------| +| 2026-06-03 | **PR #18** Fix Баг 7: красный CI на development автономно возвращает задачу developer'у (retry с общим лимитом 3, симметрично review) | +| 2026-06-03 | **PR #17** Fix Баг 6: QG development `check_tests_local`→`check_ci_green` (доверились CI, не гоняем чужие тесты в контейнере; `check_tests_local` DEPRECATED, CI-failure больше не подавляется) | +| 2026-06-03 | **PR #16** Fix Баг 5: `check_tests_local` зовёт pytest напрямую вместо `make` (make нет в контейнере) | | 2026-06-03 | **PR #15** Fix Баг 4: Approved-вердикт двигает analysis→architecture (развёд `check_analysis_approved` по `finished_agent`) | | 2026-06-03 | **PR #14** Add: `gitea_public_url` — внешний URL для кликабельных ссылок в комментах (git-операции на localhost не тронуты) | | 2026-06-03 | **PR #13** Fix Баги A/B/C: `description`→`.task.md`, `name`→ветка (не untitled), коммент analyst под status-only + ссылки на доки |