7.0 KiB
7.0 KiB
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из main2d392b6. - PR: #13 → main (admin/orchestrator#13).
- ORCH-7 проверено:
git log origin/main..origin/fix/taskmd-descriptionпоказывает 3 коммита (b91be74, 96c5e6b, a9cdb17).
Сделано
- Bug A — description в task_desc (.task.md)
- Bug B — name дотягивается из Plane API ОДНИМ GET выше построения slug
- Bug C — коммент analyst переписан под статус Approved + ссылки на реально существующие доки
- 3 новых теста + обновлены 3 устаревших мока существующих тестов
- 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 симв; финальный fallbackname="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(preferdescription_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 из конфига, не хардкод), ownersettings.gitea_owner(admin), repo из аргумента. URL ={gitea_url}/{owner}/{repo}/src/branch/{branch}/docs/work-items/{WID}/<file>,<a href>в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 → дотянут из мока → sluggpx-upload-feature, не untitled).tests/test_analyst_comment.py(новый, Bug C):test_analyst_comment_asks_approved_with_links(содержит 'Approved'+'Rejected', НЕ ':approved:', НЕ 'In Progress', ссылки<a href>на существующие доки, отсутствующий 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. НЕ деплоил, НЕ мержил.