auto-sync: 2026-06-03 22:50:01

This commit is contained in:
Stream
2026-06-03 22:50:01 +03:00
parent f9fdce7844
commit d5259be89b

View File

@@ -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}/<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. НЕ деплоил, НЕ мержил.