auto-sync: 2026-06-03 23:00:01

This commit is contained in:
Stream
2026-06-03 23:00:01 +03:00
parent d5259be89b
commit 51f4bee568
2 changed files with 79 additions and 0 deletions

View File

@@ -189,3 +189,30 @@ docs/work-items/ET-011/: 00-business-request.md, 01-brd.md, 02-trz.md, 03-accept
- **Косметика (предложен 2-й тикет Dev, Слава ещё не подтвердил):** (1) коммент analyst всё ещё пишет «Жду :approved:» — устаревшая формулировка, поправить на «переведите в Approved»; (2) добавить ссылки на артефакты прямо в коммент Plane (чтобы не лезть в Gitea руками).
- Ветка-slug всё ещё `untitled` (в тестовом webhook нет name; реальный Plane шлёт name — не критично).
- Tokenator: квота исчерпана (116k), ждать сброса (~1 число) или саппорт. OpenClaw не блокирует (фолбэк), Claude CLI агентов не касается.
---
## PR #13 — вход/выход analyst: 3 бага закрыты, боевой прогон чистый (03.06 ~20:30)
**Merge main = `dce9ac8`.** Ветка `fix/taskmd-description` из main `2d392b6` (после PR #12). Задеплоен (rebuild+recreate). 3 коммита на remote (ORCH-7 проверено): `b91be74`, `96c5e6b`, `a9cdb17`.
### Баг A (главный) — description дотягивался, но НЕ доходил до analyst
`src/webhooks/plane.py`, `start_pipeline` task_desc (~стр.512→522): собирался БЕЗ description (`...Stage: analysis\nTitle: {name}`), хотя description дотянут на ~401 (445 chars в логе). `.task.md` = 101 байт → analyst писал «business request пуст» (его заключение было ПРАВИЛЬНЫМ — ему дали пустышку). **Фикс:** добавлен `\n\nDescription:\n{description}` (финальная переменная после дотяжки, не payload). После фикса `.task.md` = 973 байта с полным ТЗ.
### Баг B — name=untitled
`start_pipeline` ~376: `name = data.get("name","untitled")` → на issue.updated Plane не шлёт name → untitled (ветка feature/ET-011-untitled, Title untitled). Тот же класс что баг1(description), но для name фикс не делали. **Фикс:** новая `fetch_issue_fields(issue_id, project_id) -> (name, description)` в plane_sync.py рядом с fetch_issue_description (его НЕ тронули, переиспользовали endpoint/токен). **Один GET** вместо двух. В start_pipeline name тянется ВЫШЕ построения slug/branch (~469). Пустой name → fallback untitled, не падает. После фикса ветка = `feature/ET-011-popup-enduro-trails`.
### Баг C — коммент analyst устарел + нет ссылок
`src/stage_engine.py`, ветка artifacts-ready→In Review (`_handle_analysis_approved_flow`). Новый `_build_analyst_ready_comment`: текст просит статус **Approved** (НЕ `:approved:`, НЕ In Progress — подтверждено Славой: одобрение=Approved). `<a href>`-ссылки в comment_html на реально существующие доки (os.path.isfile по worktree). База `settings.gitea_url` + `settings.gitea_owner`.
### Тесты (мой прогон сам): **207 passed + 9 failed** (те же 9 baseline pre-existing signature/401, regression 0, +3 новых).
test_taskdesc_includes_description, test_name_fetched_when_payload_empty, test_analyst_comment_asks_approved_with_links. Обновлены 3 мока в test_pipeline_start_bugs.py (fetch_issue_description→fetch_issue_fields). Коммиты: `fix(pipeline): pass issue description to analyst task file`, `fix(pipeline): fetch issue name from Plane API on status-trigger start`, `feat(plane): analyst comment asks for Approved status + links docs`.
### ✅ БОЕВОЙ ПРОГОН — всё чисто:
Почистил прошлый прогон, #6 в Backlog с реальным name → In Progress → analyst run 62 (exit 0, 26302 out, $1.60). Логи: `pulled name from Plane API ('Скачивание трека из popup на карте')`, `.task.md` 973 байта, BRD осмысленный («Пользователь видит публичные GPS-треки... возможности скачать нет...»), `comment.created no pipeline action`, `issue updated 38fb1f64 no pipeline action`, `analyst finished, requested Approved status`. **#6 = In Review ДЕРЖИТСЯ.**
### ⚠️ Хвост (для следующей сессии):
- **Ссылки в комменте идут на `localhost:3000`** (settings.gitea_url = внутренний), не на внешний `git.mva154.duckdns.org` → из браузера Славы не кликаются. Мелкий фикс: внешний домен. НЕ сделано.
- HTML коммента `<p>...<ul>...</ul></p>` — формально невалидная вложенность (Plane/TipTap переваривает, ссылки рабочие). Косметика.
- **#6 висит в In Review, ждёт Славу.** Approved → должна уехать в Architecture БЕЗ мелькания In Progress (PR #12, ещё не проверено живьём). Слава решит: сам в UI или мне симулировать.
- Боевая ветка теперь `feature/ET-011-popup-enduro-trails` (slug исправлен).

View File

@@ -0,0 +1,52 @@
# DEV TASK — ссылки в комменте analyst: localhost → внешний публичный Gitea URL
**Проект:** orchestrator | **Сервер:** slin@82.22.50.71 | **Репо:** /home/slin/repos/orchestrator | **Контейнер:** orchestrator (8500)
**Ветка:** `fix/gitea-public-url` из свежего main (`git checkout main && git pull && git checkout -b fix/gitea-public-url`). main = `dce9ac8` (PR #13).
⚠️ **ГРАБЛЯ push (ORCH-7):** после push `git log origin/main..origin/fix/gitea-public-url` ДОЛЖЕН показать коммиты ДО отчёта «PR готов».
Токен Gitea: `docker exec orchestrator printenv ORCH_GITEA_TOKEN`.
## Проблема
Ссылки на доки в комменте analyst (`_build_analyst_ready_comment` в `src/stage_engine.py`) строятся от `settings.gitea_url` = `http://localhost:3000` (env `ORCH_GITEA_URL`). Это **внутренний** URL для git-операций (clone/push из docker), из браузера Славы не кликается. Нужен внешний публичный домен.
## Решение — НЕ менять gitea_url (он для git-операций), добавить ОТДЕЛЬНУЮ настройку
1. **`src/config.py`** (рядом с `gitea_url`, ~стр.24): добавить поле
```python
gitea_public_url: str = "" # external URL for clickable links in comments; falls back to gitea_url
```
Pydantic-settings подхватит env `ORCH_GITEA_PUBLIC_URL` (тот же префикс ORCH_, что у gitea_url/gitea_token — проверь env_prefix в config.py).
2. **`src/stage_engine.py`**, `_build_analyst_ready_comment` (~стр.40): заменить
```python
base = settings.gitea_url.rstrip("/")
```
на
```python
base = (getattr(settings, "gitea_public_url", "") or settings.gitea_url).rstrip("/")
```
Только эту строку (источник base для href). НЕ трогать остальное.
3. **НЕ хардкодь домен в коде.** Дефолт поля = `""` (fallback на gitea_url). Реальное значение задаётся через env.
## Env на проде (это сделает АССИСТЕНТ при деплое, НЕ ты — но укажи в отчёте)
`ORCH_GITEA_PUBLIC_URL=https://git.mva154.duckdns.org` в docker-compose/env оркестратора. (Домен проверен живым: HTTP 200.)
## Ограничения
- 🚫 НЕ трогай: `gitea_url` (git-операции!), nginx/openclaw.json/.env-секреты/deploy/HMAC/очередь/webhook URL в БД Plane/PLANE_STATES/M-6/uniqueness-guard/status-only логику/conftest.py/fetch_issue_fields/fetch_issue_description.
- Conventional Commits, один коммит: `feat(config): external gitea_public_url for clickable doc links`.
## Тесты (контейнер)
`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_analyst_comment_asks_approved_with_links`: при заданном `gitea_public_url` ссылки строятся от него (не от gitea_url); при пустом — fallback на gitea_url. Можно через monkeypatch settings.
Baseline: **207 passed + 9 pre-existing failed** — не ломать pre-existing.
## Проверка (ассистент)
| # | Что | Критерий |
|---|-----|----------|
| 1 | fallback | пустой gitea_public_url → ссылки от gitea_url (как раньше) |
| 2 | внешний | gitea_public_url задан → ссылки от внешнего домена |
| 3 | git цел | git-операции (clone/push) по-прежнему через gitea_url localhost |
| 4 | тесты | baseline не сломан + тест на public_url passed |
| 5 | git | PR в main, remote содержит коммит |
## Отчёт
- НЕ деплоить, НЕ мержить (мерж + установку env на проде делает ассистент).
- В отчёте: точные строки правок, как назвал env-переменную, подтверди что gitea_url (git-операции) НЕ тронут, вывод теста. Один исполнитель, маленькая правка — не раздувай.