From 51f4bee56812ce8dcdfa50a7864148d13120e4e5 Mon Sep 17 00:00:00 2001 From: Stream Date: Wed, 3 Jun 2026 23:00:01 +0300 Subject: [PATCH] auto-sync: 2026-06-03 23:00:01 --- memory/2026-06-03.md | 27 ++++++++++ .../orchestrator/DEV_TASK_GITEA_PUBLIC_URL.md | 52 +++++++++++++++++++ 2 files changed, 79 insertions(+) create mode 100644 tasks/orchestrator/DEV_TASK_GITEA_PUBLIC_URL.md diff --git a/memory/2026-06-03.md b/memory/2026-06-03.md index 8e3703a..906ae6b 100644 --- a/memory/2026-06-03.md +++ b/memory/2026-06-03.md @@ -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). ``-ссылки в 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 коммента `

...

` — формально невалидная вложенность (Plane/TipTap переваривает, ссылки рабочие). Косметика. +- **#6 висит в In Review, ждёт Славу.** Approved → должна уехать в Architecture БЕЗ мелькания In Progress (PR #12, ещё не проверено живьём). Слава решит: сам в UI или мне симулировать. +- Боевая ветка теперь `feature/ET-011-popup-enduro-trails` (slug исправлен). diff --git a/tasks/orchestrator/DEV_TASK_GITEA_PUBLIC_URL.md b/tasks/orchestrator/DEV_TASK_GITEA_PUBLIC_URL.md new file mode 100644 index 0000000..04e6e41 --- /dev/null +++ b/tasks/orchestrator/DEV_TASK_GITEA_PUBLIC_URL.md @@ -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-операции) НЕ тронут, вывод теста. Один исполнитель, маленькая правка — не раздувай.