From d5259be89b464d5e3e59b0670b8442d4fe65eb83 Mon Sep 17 00:00:00 2001 From: Stream Date: Wed, 3 Jun 2026 22:50:01 +0300 Subject: [PATCH] auto-sync: 2026-06-03 22:50:01 --- .../dev-2026-06-03-taskmd-description.md | 54 +++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 tasks/orchestrator/reports/dev-2026-06-03-taskmd-description.md diff --git a/tasks/orchestrator/reports/dev-2026-06-03-taskmd-description.md b/tasks/orchestrator/reports/dev-2026-06-03-taskmd-description.md new file mode 100644 index 0000000..2a17efb --- /dev/null +++ b/tasks/orchestrator/reports/dev-2026-06-03-taskmd-description.md @@ -0,0 +1,54 @@ +# Dev Report: taskmd-description (вход/выход конвейера analyst) +Дата: 2026-06-03 +Статус: DONE (PR открыт, НЕ мержен, НЕ задеплоен) + +## Задача +3 фикса, 1 PR: (A) description не доходит до analyst, (B) name=untitled, (C) коммент analyst устарел + нет ссылок на доки. + +## Ветка / PR +- Ветка: `fix/taskmd-description` из main `2d392b6`. +- PR: **#13** → main (https://git.mva154.duckdns.org/admin/orchestrator/pulls/13). +- ORCH-7 проверено: `git log origin/main..origin/fix/taskmd-description` показывает 3 коммита (b91be74, 96c5e6b, a9cdb17). + +## Сделано +- [x] Bug A — description в task_desc (.task.md) +- [x] Bug B — name дотягивается из Plane API ОДНИМ GET выше построения slug +- [x] Bug C — коммент analyst переписан под статус Approved + ссылки на реально существующие доки +- [x] 3 новых теста + обновлены 3 устаревших мока существующих тестов +- [x] full suite: 207 passed + 9 pre-existing failed (baseline 204 + 3 новых, pre-existing не сломаны) + +## Изменённые файлы и точные правки + +### `src/webhooks/plane.py` (start_pipeline) +- **Bug A (коммит b91be74):** task_desc ~стр.522-525 — добавлен `\n\nDescription:\n{description}`. + `description` здесь — финальная переменная ПОСЛЕ дотяжки (подтверждено: дотяжка на ~387-418 переопределяет `description` до этой точки). Это НЕ payload-версия. +- **Bug B (коммит 96c5e6b):** блок дотяжки ~стр.387-418 (бывший «BUG 1») переписан: вместо `fetch_issue_description` вызывается `fetch_issue_fields(plane_id, plane_project_id)` → `(name, description)`. Дотяжка name стоит ВЫШЕ построения slug/branch (~стр.469). Логика: `name_missing` (пусто/`untitled`/<3 симв) или `desc_missing` (<20) → один GET; description обновляется как раньше (≥ длины payload), name обновляется если дотянут ≥3 симв; финальный fallback `name="untitled"` если всё равно пусто (не падать). + +### `src/plane_sync.py` (коммит 96c5e6b) +- Добавлена `fetch_issue_fields(issue_id, project_id) -> tuple[str,str]` сразу после `fetch_issue_description`. **ОДИН GET** на тот же issue-detail endpoint, те же `PLANE_HEADERS`. Description-логика идентична `fetch_issue_description` (prefer `description_stripped`, fallback `_strip_html(description_html)`). `fetch_issue_description` НЕ тронут (переиспользуем, не ломаем — остаётся для других вызовов). +- **Один GET, не два** — выбран вариант ТЗ «расширь до fetch_issue_fields». + +### `src/stage_engine.py` (Bug C, коммит a9cdb17) +- В `_handle_analysis_approved_flow` (ветка artifacts ready → In Review) старый коммент «Прошу review и реакцию :approved:» заменён вызовом нового хелпера `_build_analyst_ready_comment(repo, work_item_id, branch)`. +- Хелпер: текст «✅ BRD/ТЗ/AC готовы. Для продвижения переведите задачу в статус Approved. Для отклонения — напишите причину комментом и переведите в Rejected.» (НЕ :approved:, НЕ In Progress). +- **Ссылки:** база `settings.gitea_url` (GITEA_ROOT_URL из конфига, не хардкод), owner `settings.gitea_owner` (admin), repo из аргумента. URL = `{gitea_url}/{owner}/{repo}/src/branch/{branch}/docs/work-items/{WID}/`, `` в `comment_html`. Перечисляются ТОЛЬКО файлы, реально лежащие в worktree (`os.path.isfile` по `get_worktree_path`): кандидаты 00-business-request/01-brd/02-trz/03-acceptance-criteria/04-test-plan.yaml/04b-ui-test-cases. Несуществующие не выдумываются. Правлена только analyst-ветка (готовность→In Review); комменты Needs Input / no-artifacts и другие агенты не тронуты. + +### Тесты +- `tests/test_taskmd_description.py` (новый, Bug A+B): `test_taskdesc_includes_description` (task_desc содержит тело description, не только Title), `test_name_fetched_when_payload_empty` (issue.updated без name → дотянут из мока → slug `gpx-upload-feature`, не untitled). +- `tests/test_analyst_comment.py` (новый, Bug C): `test_analyst_comment_asks_approved_with_links` (содержит 'Approved'+'Rejected', НЕ ':approved:', НЕ 'In Progress', ссылки `` на существующие доки, отсутствующий 04b НЕ перечислен). +- `tests/test_pipeline_start_bugs.py` (обновлено): 3 мока `fetch_issue_description` → `fetch_issue_fields` (возвращают tuple), т.к. start_pipeline теперь зовёт новую функцию. Поведение тестов не изменено, только цель мока. + +## Результат / прогон +- Релевантные: `test_taskmd_description.py test_analyst_comment.py test_pipeline_start_bugs.py test_status_trigger.py` → 12 passed. +- Full suite: **207 passed, 9 failed** (9 = pre-existing test_webhooks signature/401, не наши). +- AST/compile всех правленых файлов — OK. + +## Проблемы и решения +- Переход на `fetch_issue_fields` сломал 2 существующих passing-теста, которые мокали `fetch_issue_description` и проверяли `assert_called_once`. Решение: обновил цель мока на `fetch_issue_fields` (один GET сохранён, ТЗ «не дублируй GET» соблюдён). conftest.py не тронут. +- Bug C тест зависит от `_build_analyst_ready_comment` (появляется только в коммите 3) → новый тест-файл разделён: Bug A/B → коммит 2, Bug C → коммит 3, чтобы каждый коммит был независимо зелёным. + +## НЕ тронуто (ограничения соблюдены) +nginx/openclaw.json/.env/deploy/HMAC/verify_plane_signature/очередь/webhook URL в БД/per-agent authorship/PLANE_STATES UUID/M-6 derive/uniqueness-guard/fetch_issue_description/status-only PR#12/conftest.py. `.env.bak-1780472695` (чужой untracked) не трогал. + +## Следующий шаг +Ассистент: живая проверка + боевой прогон, затем мерж PR #13. НЕ деплоил, НЕ мержил.