diff --git a/docs/work-items/ORCH-080/12-review.md b/docs/work-items/ORCH-080/12-review.md new file mode 100644 index 0000000..a13cc9a --- /dev/null +++ b/docs/work-items/ORCH-080/12-review.md @@ -0,0 +1,72 @@ +--- +type: review +work_item_id: ORCH-080 +verdict: APPROVED +version: 1 +--- + +# Review ORCH-080 + +## Summary +Задача убирает баннер Telegram link-preview («Plane — Modern project management»), +который разворачивался под кликабельной ссылкой `ORCH-NNN` в карточке трекера и +во всех notify/alert-сообщениях. Решение точно соответствует TRZ и ADR-001: +добавлен ключ `"disable_web_page_preview": True` в JSON-payload обоих +низкоуровневых примитивов `send_telegram` (`POST /sendMessage`) и `edit_telegram` +(`POST /editMessageText`) — единая точка для всех потребителей, без kill-switch, +без изменения контрактов. Изменение минимально (2 строки + комментарии), +аддитивно и обратимо. + +Проверены все четыре оси (ТЗ, ADR, качество кода, тесты) + документация. Findings +уровней P0/P1/P2 — нет. + +## Findings + +### P0 — Blocker +- нет + +### P1 — Must fix +- нет + +### P2 — Should fix +- нет + +## Соответствие ТЗ и AC +- TRZ §2.1/§2.2 — ключ добавлен в оба payload в точности как предписано. ✅ +- AC-1 — `disable_web_page_preview: True` в `sendMessage` payload (TC-01). ✅ +- AC-2 — то же в `editMessageText` payload (TC-02). ✅ +- AC-3 — баннер исчезает (ручная верификация на staging; косвенно покрыто AC-1/AC-2). ✅ +- AC-4 — `parse_mode: "HTML"` сохранён в обоих payload, ссылка кликабельна (TC-03); + `tests/test_notify_issue_links.py` зелёный. ✅ +- AC-5 — поля `chat_id/text/parse_mode/disable_notification` (send) и + `chat_id/message_id/text/parse_mode` (edit) сохранены; контракты возврата + (`message_id|None`, `EDIT_*`) не изменились (TC-04/TC-05). ✅ +- AC-6 — never-raise сохранён (TC-06); полный прогон `pytest tests/ -q` — **1058 passed**. ✅ +- AC-7 — документация обновлена в том же PR (см. ниже). ✅ + +## Соответствие ADR +ADR-001 (Accepted): правка на уровне примитива (а не каждого вызова), безусловно +без флага, top-level `disable_web_page_preview` вместо `link_preview_options`, +`parse_mode: HTML` сохранён, контракты и инвариант «одна карточка на задачу» не +тронуты. Реализация соответствует решению 1:1. Глобальные ADR не нарушены +(`STAGE_TRANSITIONS`, `QG_CHECKS`, схема БД — без изменений). ✅ + +## Качество кода +- Изменение минимальное, целевое; комментарии ссылаются на ORCH-080 и поясняют цель. +- `try/except` never-raise в обеих функциях не затронут; пути без кредов и контракты + возврата сохранены. +- Тесты содержательные: инспектируют реальный payload через мок `httpx` + (`call_args.kwargs["json"]`), покрывают флаг, регрессию `parse_mode`/полей, + контракты возврата и never-raise (TC-01..06). Нет тривиальных/пустых тестов. +- Security: ключ булев, новых поверхностей/секретов нет. + +## Документация +Изменён `src/` (поведение исходящих Telegram-запросов) → документация обновлена в +том же PR, как требует CLAUDE.md §2/§6: +- `CHANGELOG.md` — запись в `## [Unreleased]` (тип `fix:`). ✅ +- `CLAUDE.md` — раздел «Нотификации / Telegram live-tracker» дополнен пунктом + «Без link-preview (ORCH-080)». ✅ +- `docs/architecture/README.md` — компонент Notifications дополнен ремаркой ORCH-080. ✅ +- ADR `docs/work-items/ORCH-080/06-adr/ADR-001-disable-telegram-link-preview.md` заведён. ✅ + +Документация соответствует коду; расхождений нет.