# Bugfixes — 2026-05-21

## Контекст

Задача ET-005 (переключатель единиц измерения) застряла на переходе `development → review`.
В процессе диагностики и починки найдено и исправлено 5 багов в orchestrator.

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

### 1. CI status webhook: пустой `branches` в payload

**Файл:** `src/webhooks/gitea.py` (handle_ci_status)

**Проблема:** Gitea отправляет CI status webhook с `branches: []`. Функция делала ранний `return` — не могла определить branch и не продвигала задачу.

**Решение:** Fallback через `git branch -r --contains <sha>` — определяет ветку по SHA коммита. Ищет ветку `feature/*` в output.

### 2. git safe.directory в контейнере

**Файл:** Docker runtime (orchestrator container)

**Проблема:** `subprocess.run(["git", ...])` внутри контейнера падал с `fatal: detected dubious ownership in repository` — repo mount принадлежит другому user.

**Решение:** `git config --global --add safe.directory '*'` при старте контейнера. Убран кастомный `env={**os.environ, "HOME": "/home/slin"}` который ломал gitconfig.

### 3. X-Gitea-Event: pull_request_approved не роутился

**Файл:** `src/webhooks/gitea.py` (webhook router)

**Проблема:** Gitea отправляет event type `pull_request_approved` при approve review, но роутер обрабатывал только `pull_request`.

**Решение:** Расширен роутинг на `pull_request`, `pull_request_approved`, `pull_request_review_approved`.

### 4. review.state vs review.type — новый формат Gitea

**Файл:** `src/webhooks/gitea.py` (handle_pr)

**Проблема:** Gitea webhook отправляет `review.type = "pull_request_review_approved"` вместо `review.state = "APPROVED"`. Код искал только `review.state`.

**Решение:** Маппинг из `review.type` если `review.state` пустой: `"approved" in type → APPROVED`, `"request_changes"/"rejected" in type → REQUEST_CHANGES`.

### 5. Нет auto-advance после завершения agent

**Файл:** `src/agents/launcher.py`

**Проблема:** После завершения tester (exit_code=0) задача оставалась в `testing` — не было механизма автоматического продвижения. Для `development → review` триггер — CI status webhook, для `review → testing` — PR review webhook, но для `testing → deploy` внешнего триггера нет.

**Решение:** Добавлен метод `_try_advance_stage()` в `AgentLauncher`, вызывается из `_monitor_agent` после успешного завершения агента. Проверяет QG, продвигает stage, запускает следующего агента.

## Известные проблемы (не исправлены)

### dismiss_stale_approvals

Branch protection `dismiss_stale_approvals: true` на main ветке: tester пушит коммит после review approval → approval становится stale → merge блокируется.

**Workaround:** Re-approve через claude-bot после каждого push tester'а.

**Рекомендация:** Либо отключить `dismiss_stale_approvals`, либо добавить auto-re-approve в orchestrator после tester push.

## Результат

ET-005 прошла полный цикл: `analysis → architecture → development → review → testing → deploy → done`
