Files
wiki/tasks/orchestrator/reports/dev-2026-06-03-taskmd-description.md
2026-06-03 22:50:01 +03:00

7.0 KiB
Raw Permalink Blame History

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 (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 симв; финальный 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}/<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 → дотянут из мока → slug gpx-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_descriptionfetch_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. НЕ деплоил, НЕ мержил.