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

55 lines
7.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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}/<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_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. НЕ деплоил, НЕ мержил.