auto-sync: 2026-06-03 23:30:01
This commit is contained in:
@@ -228,3 +228,32 @@ test_taskdesc_includes_description, test_name_fetched_when_payload_empty, test_a
|
||||
- HTML коммента `<p>...<ul>...</ul></p>` — формально невалидная вложенность (Plane/TipTap переваривает, ссылки рабочие). Косметика.
|
||||
- **#6 висит в In Review, ждёт Славу.** Approved → должна уехать в Architecture БЕЗ мелькания In Progress (PR #12, ещё не проверено живьём). Слава решит: сам в UI или мне симулировать.
|
||||
- Боевая ветка теперь `feature/ET-011-popup-enduro-trails` (slug исправлен).
|
||||
|
||||
---
|
||||
|
||||
## PR #14 — ссылки в комменте analyst: localhost → внешний публичный Gitea (03.06 ~20:50)
|
||||
|
||||
**Merge main = `b01643f`.** Ветка `fix/gitea-public-url` из main `dce9ac8` (после PR #13). Один коммит `ca63bc2` `feat(config): external gitea_public_url for clickable doc links`. Задеплоен.
|
||||
|
||||
### Проблема
|
||||
Ссылки на доки в комменте analyst строились от `settings.gitea_url` = `http://localhost:3000` (env `ORCH_GITEA_URL`) — это ВНУТРЕННИЙ URL для git-операций (clone/push из docker), из браузера Славы не кликается.
|
||||
|
||||
### Решение (НЕ менять gitea_url — он для git!)
|
||||
- `src/config.py`: новое поле `gitea_public_url: str = ""` (env `ORCH_GITEA_PUBLIC_URL`, префикс ORCH_, fallback на gitea_url).
|
||||
- `src/stage_engine.py` `_build_analyst_ready_comment` (~стр.299): `base = (getattr(settings,"gitea_public_url","") or settings.gitea_url).rstrip("/")`. Только эта строка.
|
||||
- `gitea_url` НЕ тронут — git-операции по-прежнему localhost.
|
||||
|
||||
### Env на проде (ставила Я, не Dev): `ORCH_GITEA_PUBLIC_URL=https://git.mva154.duckdns.org` дописан в `.env` (аккуратно, не затирая), проверен в контейнере.
|
||||
|
||||
### Тесты (мой прогон): **208 passed + 9 failed** (те же baseline pre-existing). test_analyst_comment_asks_approved_with_links расширен (public задан→ссылки от него) + новый test_analyst_comment_falls_back_to_gitea_url.
|
||||
|
||||
### ✅ БОЕВОЙ ПРОГОН (task 29, run 63, exit 0, 20530 out, $1.37): ссылки в комменте на `https://git.mva154.duckdns.org`, кликабельны, все 6 доков. Коммент правильный (Approved/Rejected). **#6 = In Review ДЕРЖИТСЯ.**
|
||||
|
||||
### ⚠️ Состояние на конец сессии:
|
||||
- **#6 висит в In Review, ждёт вердикта Славы** в Plane (ссылки рабочие — глянуть доки → Approved или Rejected+причина).
|
||||
- **НЕ проверено живьём:** переход Approved → Architecture без мелькания In Progress (PR #12). Слава решит сам в UI или симулировать.
|
||||
- Был сбой PGPASSWORD на UPDATE статуса при ручном переводе #6 — webhook всё равно прошёл (analyst стартанул). Если повторять ручной перевод статуса через psql — подставлять реальный `$PW`, не литерал.
|
||||
- HTML коммента `<p>...<ul>...</ul></p>` — формально невалидная вложенность (Plane переваривает, косметика).
|
||||
|
||||
### Хронология багов входа/выхода analyst (закрыто за сессию):
|
||||
PR #12 (status-only verdict, баг3 эхо-самоудар) → PR #13 (баги A description, B name, C коммент+ссылки) → PR #14 (ссылки на внешний домен). Все боевые прогоны чистые, #6 In Review стабилен.
|
||||
|
||||
63
tasks/orchestrator/DEV_TASK_APPROVED_ADVANCE.md
Normal file
63
tasks/orchestrator/DEV_TASK_APPROVED_ADVANCE.md
Normal file
@@ -0,0 +1,63 @@
|
||||
# DEV TASK — БАГ 4: Approved из analysis НЕ двигает конвейер на architecture
|
||||
|
||||
**Проект:** orchestrator | **Сервер:** slin@82.22.50.71 | **Репо:** /home/slin/repos/orchestrator | **Контейнер:** orchestrator (8500)
|
||||
**Ветка:** `fix/approved-advances-stage` из свежего main (`git checkout main && git pull && git checkout -b fix/approved-advances-stage`). main = `b01643f` (PR #14).
|
||||
|
||||
⚠️ **ГРАБЛЯ push (ORCH-7):** после push `git log origin/main..origin/fix/approved-advances-stage` ДОЛЖЕН показать коммит ДО отчёта «PR готов».
|
||||
ℹ️ Токен Gitea: `docker exec orchestrator printenv ORCH_GITEA_TOKEN`.
|
||||
|
||||
## Симптом (боевой, воспроизведён)
|
||||
Слава перевёл #6 (task 29) в статус **Approved** из analysis. Лог: `Task 29: Approved status -> advance from analysis` → сразу `200 OK`. **Но:** task 29 остался `stage=analysis`, нового job на architect НЕ создалось, статус в Plane не уехал в Architecture. Конвейер встал на первой стадии. **Это блокер — ручной Approved не продвигает.**
|
||||
|
||||
## Корень
|
||||
`src/stage_engine.py`, `advance_stage()` (~стр.191-197):
|
||||
```python
|
||||
if qg_name and qg_name in QG_CHECKS:
|
||||
if qg_name == "check_analysis_approved":
|
||||
_handle_analysis_approved_flow(task_id, current_stage, repo, work_item_id, branch, agent, result)
|
||||
return result # ← ВСЕГДА ранний return, блок Advance (стр.~228+) недостижим
|
||||
```
|
||||
`_handle_analysis_approved_flow` (стр.312) в начале:
|
||||
```python
|
||||
if not (agent == "analyst" and work_item_id):
|
||||
return # webhook Approved: agent=None → выходит, НИЧЕГО не делает
|
||||
```
|
||||
**Два пути через один гейт, оба упираются в ранний `return result`:**
|
||||
- **Launcher** (analyst закончил, `finished_agent="analyst"`) → ставит In Review + коммент. ✅ Правильно, НЕ ломать.
|
||||
- **Webhook Approved-вердикт** (`finished_agent=None`, зовётся из `_try_advance_stage` в plane.py) → `_handle_analysis_approved_flow` делает `return` (agent≠analyst) → блок **Advance** (`update_task_stage(next_stage)` + `enqueue_job(architect)`) НИКОГДА не достигается.
|
||||
|
||||
`finished_agent` УЖЕ различает пути (launcher='analyst', webhook=None) — фикс на этом и строим.
|
||||
|
||||
## Фикс — развести ветку check_analysis_approved по agent
|
||||
`src/stage_engine.py`, `advance_stage`, ветка `if qg_name == "check_analysis_approved":` (~стр.193):
|
||||
```python
|
||||
if qg_name == "check_analysis_approved":
|
||||
# Launcher path (analyst just finished): set In Review + ask for Approved.
|
||||
# This gate never advances on its own — a human Approved does that.
|
||||
if agent == "analyst":
|
||||
_handle_analysis_approved_flow(task_id, current_stage, repo, work_item_id, branch, agent, result)
|
||||
return result
|
||||
# Webhook Approved-verdict path (agent is None): the human approved -> the
|
||||
# analysis gate is satisfied. Skip the approval-flow and fall through to the
|
||||
# generic Advance block below (advance stage + enqueue next agent).
|
||||
# (do NOT return here)
|
||||
```
|
||||
Т.е. при `agent is None` (Approved-вердикт) — **НЕ** заходим в approved-flow и **НЕ** делаем ранний return, а проваливаемся в общий блок Advance (стр.~228): `update_task_stage(task_id, next_stage)` → `plane_notify_stage` → `enqueue_job(architect)`.
|
||||
|
||||
⚠️ **Проверь блок Advance:** `next_agent = get_agent_for_stage(current_stage)` (стр.~240) — для analysis вернёт `architect` (по `STAGES["analysis"]["agent"]`? сверь: в stages.py `"analysis": {"next":"architecture","agent":"architect",...}` — `get_agent_for_stage("analysis")` должно вернуть architect). Если вернёт analyst (повторный запуск!) — это вторая бага, останови и сообщи ДО фикса. По коду ORCH-4 fix комментарий «current_stage, not next» — значит agent берётся для СТАДИИ, которую покидаем; убедись что для analysis это architect, не analyst.
|
||||
|
||||
## Ограничения
|
||||
- 🚫 НЕ ломай launcher-путь (`agent="analyst"` → In Review + коммент остаётся как есть).
|
||||
- 🚫 НЕ трогай: остальные QG (check_ci_green/check_tests_local/check_review_approved), rollback-ветки, Rejected-логику, Needs Input, nginx/openclaw.json/.env/deploy/HMAC/очередь(кроме enqueue)/webhook URL Plane/PLANE_STATES/M-6/uniqueness-guard/status-only PR#12/PR#13/PR#14/conftest.py/gitea_public_url.
|
||||
- Conventional Commits, один коммит: `fix(stage): approved verdict advances analysis->architecture instead of re-running gate`.
|
||||
|
||||
## Тесты (контейнер)
|
||||
`IMG=$(docker inspect orchestrator --format '{{.Config.Image}}'); docker run --rm -v /home/slin/repos/orchestrator:/code -w /code --entrypoint python3 $IMG -m pytest tests/ -q`
|
||||
Новый `test_approved_verdict_advances_analysis_to_architecture`:
|
||||
- вызов `advance_stage(task_id, "analysis", repo, wid, branch, finished_agent=None)` (Approved-путь) → результат: `result.advanced is True`, `result.to_stage == "architecture"`, `result.enqueued_agent == "architect"` (мокни enqueue_job/update_task_stage/QG как в соседних тестах).
|
||||
- регресс-проверка: `advance_stage(..., finished_agent="analyst")` (launcher-путь) → по-прежнему In Review/коммент, НЕ advance (result.advanced НЕ True, _handle_analysis_approved_flow вызван).
|
||||
Baseline: **208 passed + 9 pre-existing failed** — не ломать pre-existing.
|
||||
|
||||
## Отчёт
|
||||
- НЕ деплоить, НЕ мержить (мерж + боевой прогон делает ассистент).
|
||||
- В отчёте: точные строки правки, подтверди что launcher-путь (agent=analyst) не сломан, что get_agent_for_stage("analysis")=architect (не analyst!), вывод нового+релевантных тестов. Если get_agent_for_stage вернул analyst — СТОП, сообщи. Один исполнитель, маленькая правка.
|
||||
Reference in New Issue
Block a user