auto-sync: 2026-06-04 01:50:01
This commit is contained in:
@@ -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.
|
||||
|
||||
@@ -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/<id>/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=<repo>/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 + ссылки на доки |
|
||||
|
||||
Reference in New Issue
Block a user